diff --git a/c2uplc.cabal b/c2uplc.cabal index 5981d4e..181bd76 100644 --- a/c2uplc.cabal +++ b/c2uplc.cabal @@ -1,20 +1,20 @@ -cabal-version: 3.0 -name: c2uplc -version: 1.0.0 -synopsis: UPLC code generator for Covenant IR +cabal-version: 3.0 +name: c2uplc +version: 1.0.0 +synopsis: UPLC code generator for Covenant IR description: An executable converting valid Covenant IR serial forms into UPLC code. -homepage: https://github.com/mlabs-haskell/c2uplc -license: Apache-2.0 -license-file: LICENSE -author: Koz Ross, Sean Hunter -maintainer: koz@mlabs.city, sean@mlabs.city -bug-reports: https://github.com/mlabs-haskell/c2uplc/issues -copyright: (C) MLabs 2025 -category: Covenant -tested-with: ghc ==9.8.4 -build-type: Simple +homepage: https://github.com/mlabs-haskell/c2uplc +license: Apache-2.0 +license-file: LICENSE +author: Koz Ross, Sean Hunter +maintainer: koz@mlabs.city, sean@mlabs.city +bug-reports: https://github.com/mlabs-haskell/c2uplc/issues +copyright: (C) MLabs 2025 +category: Covenant +tested-with: GHC ==9.8.4 +build-type: Simple extra-source-files: CHANGELOG.md README.md @@ -22,16 +22,10 @@ extra-source-files: -- Common sections common lang ghc-options: - -Wall - -Wcompat - -Wredundant-bang-patterns - -Wredundant-strictness-flags - -Wmissing-deriving-strategies - -Woperator-whitespace - -Wambiguous-fields - -Wmisplaced-pragmas - -Wmissing-export-lists - -Wmissing-import-lists + -Wall -Wcompat -Wredundant-bang-patterns + -Wredundant-strictness-flags -Wmissing-deriving-strategies + -Woperator-whitespace -Wambiguous-fields -Wmisplaced-pragmas + -Wmissing-export-lists -Wmissing-import-lists default-extensions: BangPatterns @@ -65,37 +59,33 @@ common lang UndecidableInstances build-depends: - base >=4.19.0.0 && <5, - covenant ==1.3.0, + , base >=4.19.0.0 && <5 + , covenant ==1.3.0 - default-language: Haskell2010 + default-language: Haskell2010 common test-lang - import: lang - ghc-options: - -O2 - -threaded - -rtsopts - -with-rtsopts=-N - + import: lang + ghc-options: -O2 -threaded -rtsopts -with-rtsopts=-N build-depends: - QuickCheck ==2.15.0.1, - c2uplc, - containers >=0.6.8 && <0.8, - prettyprinter ==1.7.1, - tasty ==1.5.3, - tasty-expected-failure ==0.12.3, - tasty-hunit ==0.10.2, - tasty-quickcheck ==0.11.1, + , c2uplc + , containers >=0.6.8 && <0.8 + , prettyprinter ==1.7.1 + , QuickCheck ==2.15.0.1 + , tasty ==1.5.3 + , tasty-expected-failure ==0.12.3 + , tasty-hunit ==0.10.2 + , tasty-quickcheck ==0.11.1 -- Executable executable c2uplc - import: lang - main-is: Main.hs + import: lang + main-is: Main.hs hs-source-dirs: app -- Primary library library - import: lang - exposed-modules: Covenant.Codegen - hs-source-dirs: src + import: lang + exposed-modules: Covenant.CodeGen + hs-source-dirs: src + build-depends: plutus-core ==1.51.0.0 diff --git a/cabal.project b/cabal.project index 431c720..b523ec0 100644 --- a/cabal.project +++ b/cabal.project @@ -10,8 +10,8 @@ package c2uplc source-repository-package type: git location: https://github.com/mlabs-haskell/covenant - tag: aa296816ab093700cc00c7613d428e7a779050ce - --sha256: 0csgnxxa04510giglwvqj80gfyphf77mz75zr7jffa9f36sidmbs + tag: 0c941bc8ddd2c5b498a7b66f4fee36e69d826ea1 +--sha256: 0cfywnj8h01rz3pvb7w0rm3ydfa1jds9yqpms4h46ldrl964djfj -- Note (Koz, 15/08/2025): For the next person who needs to bump Plutus -- dependencies, this is the order of operations: @@ -56,13 +56,13 @@ allow-newer: , inline-r:bytestring , inline-r:containers , inline-r:primitive - -allow-newer: + , covenant:QuickCheck + , covenant:quickcheck-instances -- https://github.com/phadej/vec/issues/121 - ral:QuickCheck, - fin:QuickCheck, - bin:QuickCheck, + , ral:QuickCheck + , fin:QuickCheck + , bin:QuickCheck + -- https://github.com/IntersectMBO/plutus/pull/7236 + , turtle:optparse-applicative --- https://github.com/IntersectMBO/plutus/pull/7236 constraints: setup.optparse-applicative >=0.19.0.0 -allow-newer: turtle:optparse-applicative diff --git a/flake.nix b/flake.nix index 7e197d5..22c8a76 100644 --- a/flake.nix +++ b/flake.nix @@ -77,7 +77,6 @@ cabal = { }; haskell-language-server = { }; hlint = { }; - cabal-fmt = { }; fourmolu = { }; hspec-discover = { }; markdown-unlit = { }; diff --git a/src/Covenant/CodeGen.hs b/src/Covenant/CodeGen.hs index c1612ea..0af4c8a 100644 --- a/src/Covenant/CodeGen.hs +++ b/src/Covenant/CodeGen.hs @@ -1,2 +1,109 @@ -module Covenant.CodeGen where +module Covenant.CodeGen ( + oneArgFuncToPlutus, + twoArgFuncToPlutus, + threeArgFuncToPlutus, + sixArgFuncToPlutus, +) +where +import Covenant.Prim (OneArgFunc, SixArgFunc, ThreeArgFunc, TwoArgFunc) +import Covenant.Prim qualified as CBuiltins +import PlutusCore.Default.Builtins (DefaultFun) +import PlutusCore.Default.Builtins qualified as PBuiltins + +oneArgFuncToPlutus :: OneArgFunc -> DefaultFun +oneArgFuncToPlutus = \case + CBuiltins.LengthOfByteString -> PBuiltins.LengthOfByteString + CBuiltins.Sha2_256 -> PBuiltins.Sha2_256 + CBuiltins.Sha3_256 -> PBuiltins.Sha3_256 + CBuiltins.Blake2b_256 -> PBuiltins.Blake2b_256 + CBuiltins.EncodeUtf8 -> PBuiltins.EncodeUtf8 + CBuiltins.DecodeUtf8 -> PBuiltins.DecodeUtf8 + CBuiltins.FstPair -> PBuiltins.FstPair + CBuiltins.SndPair -> PBuiltins.SndPair + CBuiltins.HeadList -> PBuiltins.HeadList + CBuiltins.TailList -> PBuiltins.TailList + CBuiltins.NullList -> PBuiltins.NullList + CBuiltins.MapData -> PBuiltins.MapData + CBuiltins.ListData -> PBuiltins.ListData + CBuiltins.IData -> PBuiltins.IData + CBuiltins.BData -> PBuiltins.BData + CBuiltins.UnConstrData -> PBuiltins.UnConstrData + CBuiltins.UnMapData -> PBuiltins.UnMapData + CBuiltins.UnListData -> PBuiltins.UnListData + CBuiltins.UnIData -> PBuiltins.UnIData + CBuiltins.UnBData -> PBuiltins.UnBData + CBuiltins.SerialiseData -> PBuiltins.SerialiseData + CBuiltins.BLS12_381_G1_neg -> PBuiltins.Bls12_381_G1_neg + CBuiltins.BLS12_381_G1_compress -> PBuiltins.Bls12_381_G1_compress + CBuiltins.BLS12_381_G1_uncompress -> PBuiltins.Bls12_381_G1_uncompress + CBuiltins.BLS12_381_G2_neg -> PBuiltins.Bls12_381_G2_neg + CBuiltins.BLS12_381_G2_compress -> PBuiltins.Bls12_381_G2_compress + CBuiltins.BLS12_381_G2_uncompress -> PBuiltins.Bls12_381_G2_uncompress + CBuiltins.Keccak_256 -> PBuiltins.Keccak_256 + CBuiltins.Blake2b_224 -> PBuiltins.Blake2b_224 + CBuiltins.ComplementByteString -> PBuiltins.ComplementByteString + CBuiltins.CountSetBits -> PBuiltins.CountSetBits + CBuiltins.FindFirstSetBit -> PBuiltins.FindFirstSetBit + CBuiltins.Ripemd_160 -> PBuiltins.Ripemd_160 + +twoArgFuncToPlutus :: TwoArgFunc -> DefaultFun +twoArgFuncToPlutus = \case + CBuiltins.AddInteger -> PBuiltins.AddInteger + CBuiltins.SubtractInteger -> PBuiltins.SubtractInteger + CBuiltins.MultiplyInteger -> PBuiltins.MultiplyInteger + CBuiltins.DivideInteger -> PBuiltins.DivideInteger + CBuiltins.QuotientInteger -> PBuiltins.QuotientInteger + CBuiltins.RemainderInteger -> PBuiltins.RemainderInteger + CBuiltins.ModInteger -> PBuiltins.ModInteger + CBuiltins.EqualsInteger -> PBuiltins.EqualsInteger + CBuiltins.LessThanInteger -> PBuiltins.LessThanInteger + CBuiltins.LessThanEqualsInteger -> PBuiltins.LessThanEqualsInteger + CBuiltins.AppendByteString -> PBuiltins.AppendByteString + CBuiltins.ConsByteString -> PBuiltins.ConsByteString + CBuiltins.IndexByteString -> PBuiltins.IndexByteString + CBuiltins.EqualsByteString -> PBuiltins.EqualsByteString + CBuiltins.LessThanByteString -> PBuiltins.LessThanByteString + CBuiltins.LessThanEqualsByteString -> PBuiltins.LessThanEqualsByteString + CBuiltins.AppendString -> PBuiltins.AppendString + CBuiltins.EqualsString -> PBuiltins.EqualsString + CBuiltins.ChooseUnit -> PBuiltins.ChooseUnit + CBuiltins.Trace -> PBuiltins.Trace + CBuiltins.MkCons -> PBuiltins.MkCons + CBuiltins.ConstrData -> PBuiltins.ConstrData + CBuiltins.EqualsData -> PBuiltins.EqualsData + CBuiltins.MkPairData -> PBuiltins.MkPairData + CBuiltins.BLS12_381_G1_add -> PBuiltins.Bls12_381_G1_add + CBuiltins.BLS12_381_G1_equal -> PBuiltins.Bls12_381_G1_equal + CBuiltins.BLS12_381_G1_hashToGroup -> PBuiltins.Bls12_381_G1_hashToGroup + CBuiltins.BLS12_381_G1_scalarMul -> PBuiltins.Bls12_381_G1_scalarMul + CBuiltins.BLS12_381_G2_add -> PBuiltins.Bls12_381_G2_add + CBuiltins.BLS12_381_G2_equal -> PBuiltins.Bls12_381_G2_equal + CBuiltins.BLS12_381_G2_hashToGroup -> PBuiltins.Bls12_381_G2_hashToGroup + CBuiltins.BLS12_381_G2_scalarMul -> PBuiltins.Bls12_381_G2_scalarMul + CBuiltins.BLS12_381_millerLoop -> PBuiltins.Bls12_381_millerLoop + CBuiltins.BLS12_381_mulMlResult -> PBuiltins.Bls12_381_mulMlResult + CBuiltins.BLS12_381_finalVerify -> PBuiltins.Bls12_381_finalVerify + CBuiltins.ByteStringToInteger -> PBuiltins.ByteStringToInteger + CBuiltins.ReadBit -> PBuiltins.ReadBit + CBuiltins.ReplicateByte -> PBuiltins.ReplicateByte + CBuiltins.ShiftByteString -> PBuiltins.ShiftByteString + CBuiltins.RotateByteString -> PBuiltins.RotateByteString + +threeArgFuncToPlutus :: ThreeArgFunc -> DefaultFun +threeArgFuncToPlutus = \case + CBuiltins.VerifyEd25519Signature -> PBuiltins.VerifyEd25519Signature + CBuiltins.VerifyEcdsaSecp256k1Signature -> PBuiltins.VerifyEcdsaSecp256k1Signature + CBuiltins.VerifySchnorrSecp256k1Signature -> PBuiltins.VerifySchnorrSecp256k1Signature + CBuiltins.IfThenElse -> PBuiltins.IfThenElse + CBuiltins.ChooseList -> PBuiltins.ChooseList + CBuiltins.IntegerToByteString -> PBuiltins.IntegerToByteString + CBuiltins.AndByteString -> PBuiltins.AndByteString + CBuiltins.OrByteString -> PBuiltins.OrByteString + CBuiltins.XorByteString -> PBuiltins.XorByteString + CBuiltins.WriteBits -> PBuiltins.WriteBits + CBuiltins.ExpModInteger -> PBuiltins.ExpModInteger + +sixArgFuncToPlutus :: SixArgFunc -> DefaultFun +sixArgFuncToPlutus = \case + CBuiltins.ChooseData -> PBuiltins.ChooseData