From ba44695c0b5c6a33a0e1e0a2198450a56152e26f Mon Sep 17 00:00:00 2001 From: Daniel Sainati Date: Wed, 24 Jan 2024 15:08:35 -0500 Subject: [PATCH 1/3] add config option for legacy --- cmd/emulator/start/start.go | 126 ++++++++++++++++++------------------ emulator/blockchain.go | 15 ++++- go.mod | 4 +- go.sum | 4 ++ server/server.go | 9 +++ server/server_test.go | 15 +++++ 6 files changed, 106 insertions(+), 67 deletions(-) diff --git a/cmd/emulator/start/start.go b/cmd/emulator/start/start.go index d14d7dc0..7a4aef9a 100644 --- a/cmd/emulator/start/start.go +++ b/cmd/emulator/start/start.go @@ -39,41 +39,42 @@ import ( ) type Config struct { - Port int `default:"3569" flag:"port,p" info:"port to run RPC server"` - DebuggerPort int `default:"2345" flag:"debugger-port" info:"port to run the Debugger (Debug Adapter Protocol)"` - RestPort int `default:"8888" flag:"rest-port" info:"port to run the REST API"` - AdminPort int `default:"8080" flag:"admin-port" info:"port to run the admin API"` - Verbose bool `default:"false" flag:"verbose,v" info:"enable verbose logging"` - LogFormat string `default:"text" flag:"log-format" info:"logging output format. Valid values (text, JSON)"` - BlockTime time.Duration `flag:"block-time,b" info:"time between sealed blocks, e.g. '300ms', '-1.5h' or '2h45m'. Valid units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'"` - ServicePrivateKey string `flag:"service-priv-key" info:"service account private key"` - ServicePublicKey string `flag:"service-pub-key" info:"service account public key"` - ServiceKeySigAlgo string `default:"ECDSA_P256" flag:"service-sig-algo" info:"service account key signature algorithm"` - ServiceKeyHashAlgo string `default:"SHA3_256" flag:"service-hash-algo" info:"service account key hash algorithm"` - Init bool `default:"false" flag:"init" info:"whether to initialize a new account profile"` - GRPCDebug bool `default:"false" flag:"grpc-debug" info:"enable gRPC server reflection for debugging with grpc_cli"` - RESTDebug bool `default:"false" flag:"rest-debug" info:"enable REST API debugging output"` - Persist bool `default:"false" flag:"persist" info:"enable persistent storage"` - Snapshot bool `default:"false" flag:"snapshot" info:"enable snapshots for emulator"` - DBPath string `default:"./flowdb" flag:"dbpath" info:"path to database directory"` - SimpleAddresses bool `default:"false" flag:"simple-addresses" info:"use sequential addresses starting with 0x01"` - TokenSupply string `default:"1000000000.0" flag:"token-supply" info:"initial FLOW token supply"` - TransactionExpiry int `default:"10" flag:"transaction-expiry" info:"transaction expiry, measured in blocks"` - StorageLimitEnabled bool `default:"true" flag:"storage-limit" info:"enable account storage limit"` - StorageMBPerFLOW string `flag:"storage-per-flow" info:"the MB amount of storage capacity an account has per 1 FLOW token it has. e.g. '100.0'. The default is taken from the current version of flow-go"` - MinimumAccountBalance string `flag:"min-account-balance" info:"The minimum account balance of an account. This is also the cost of creating one account. e.g. '0.001'. The default is taken from the current version of flow-go"` - TransactionFeesEnabled bool `default:"false" flag:"transaction-fees" info:"enable transaction fees"` - TransactionMaxGasLimit int `default:"9999" flag:"transaction-max-gas-limit" info:"maximum gas limit for transactions"` - ScriptGasLimit int `default:"100000" flag:"script-gas-limit" info:"gas limit for scripts"` - Contracts bool `default:"false" flag:"contracts" info:"deploy common contracts when emulator starts"` - ContractRemovalEnabled bool `default:"true" flag:"contract-removal" info:"allow removal of already deployed contracts, used for updating during development"` - SkipTxValidation bool `default:"false" flag:"skip-tx-validation" info:"skip verification of transaction signatures and sequence numbers"` - Host string `default:"" flag:"host" info:"host to listen on for emulator GRPC/REST/Admin servers (default: all interfaces)"` - ChainID string `default:"emulator" flag:"chain-id" info:"chain to emulate for address generation. Valid values are: 'emulator', 'testnet', 'mainnet'"` - RedisURL string `default:"" flag:"redis-url" info:"redis-server URL for persisting redis storage backend ( redis://[[username:]password@]host[:port][/database] ) "` - SqliteURL string `default:"" flag:"sqlite-url" info:"sqlite db URL for persisting sqlite storage backend "` - CoverageReportingEnabled bool `default:"false" flag:"coverage-reporting" info:"enable Cadence code coverage reporting"` - EVMEnabled bool `default:"false" flag:"evm-enabled" info:"enable EVM support"` + Port int `default:"3569" flag:"port,p" info:"port to run RPC server"` + DebuggerPort int `default:"2345" flag:"debugger-port" info:"port to run the Debugger (Debug Adapter Protocol)"` + RestPort int `default:"8888" flag:"rest-port" info:"port to run the REST API"` + AdminPort int `default:"8080" flag:"admin-port" info:"port to run the admin API"` + Verbose bool `default:"false" flag:"verbose,v" info:"enable verbose logging"` + LogFormat string `default:"text" flag:"log-format" info:"logging output format. Valid values (text, JSON)"` + BlockTime time.Duration `flag:"block-time,b" info:"time between sealed blocks, e.g. '300ms', '-1.5h' or '2h45m'. Valid units are 'ns', 'us' (or 'µs'), 'ms', 's', 'm', 'h'"` + ServicePrivateKey string `flag:"service-priv-key" info:"service account private key"` + ServicePublicKey string `flag:"service-pub-key" info:"service account public key"` + ServiceKeySigAlgo string `default:"ECDSA_P256" flag:"service-sig-algo" info:"service account key signature algorithm"` + ServiceKeyHashAlgo string `default:"SHA3_256" flag:"service-hash-algo" info:"service account key hash algorithm"` + Init bool `default:"false" flag:"init" info:"whether to initialize a new account profile"` + GRPCDebug bool `default:"false" flag:"grpc-debug" info:"enable gRPC server reflection for debugging with grpc_cli"` + RESTDebug bool `default:"false" flag:"rest-debug" info:"enable REST API debugging output"` + Persist bool `default:"false" flag:"persist" info:"enable persistent storage"` + Snapshot bool `default:"false" flag:"snapshot" info:"enable snapshots for emulator"` + DBPath string `default:"./flowdb" flag:"dbpath" info:"path to database directory"` + SimpleAddresses bool `default:"false" flag:"simple-addresses" info:"use sequential addresses starting with 0x01"` + TokenSupply string `default:"1000000000.0" flag:"token-supply" info:"initial FLOW token supply"` + TransactionExpiry int `default:"10" flag:"transaction-expiry" info:"transaction expiry, measured in blocks"` + StorageLimitEnabled bool `default:"true" flag:"storage-limit" info:"enable account storage limit"` + StorageMBPerFLOW string `flag:"storage-per-flow" info:"the MB amount of storage capacity an account has per 1 FLOW token it has. e.g. '100.0'. The default is taken from the current version of flow-go"` + MinimumAccountBalance string `flag:"min-account-balance" info:"The minimum account balance of an account. This is also the cost of creating one account. e.g. '0.001'. The default is taken from the current version of flow-go"` + TransactionFeesEnabled bool `default:"false" flag:"transaction-fees" info:"enable transaction fees"` + TransactionMaxGasLimit int `default:"9999" flag:"transaction-max-gas-limit" info:"maximum gas limit for transactions"` + ScriptGasLimit int `default:"100000" flag:"script-gas-limit" info:"gas limit for scripts"` + Contracts bool `default:"false" flag:"contracts" info:"deploy common contracts when emulator starts"` + ContractRemovalEnabled bool `default:"true" flag:"contract-removal" info:"allow removal of already deployed contracts, used for updating during development"` + SkipTxValidation bool `default:"false" flag:"skip-tx-validation" info:"skip verification of transaction signatures and sequence numbers"` + Host string `default:"" flag:"host" info:"host to listen on for emulator GRPC/REST/Admin servers (default: all interfaces)"` + ChainID string `default:"emulator" flag:"chain-id" info:"chain to emulate for address generation. Valid values are: 'emulator', 'testnet', 'mainnet'"` + RedisURL string `default:"" flag:"redis-url" info:"redis-server URL for persisting redis storage backend ( redis://[[username:]password@]host[:port][/database] ) "` + SqliteURL string `default:"" flag:"sqlite-url" info:"sqlite db URL for persisting sqlite storage backend "` + CoverageReportingEnabled bool `default:"false" flag:"coverage-reporting" info:"enable Cadence code coverage reporting"` + LegacyContractUpgradeEnabled bool `default:"false" flag:"legacy-upgrade" info:"enable Cadence legacy contract upgrade"` + EVMEnabled bool `default:"false" flag:"evm-enabled" info:"enable EVM support"` // todo temporarily disabled until remote register endpoint is re-enabled // StartBlockHeight uint64 `default:"0" flag:"start-block-height" info:"block height to start the emulator at. only valid when forking Mainnet or Testnet"` } @@ -174,33 +175,34 @@ func Cmd(getServiceKey serviceKeyFunc) *cobra.Command { RESTPort: conf.RestPort, RESTDebug: conf.RESTDebug, // TODO: allow headers to be parsed from environment - HTTPHeaders: nil, - BlockTime: conf.BlockTime, - ServicePublicKey: servicePublicKey, - ServicePrivateKey: servicePrivateKey, - ServiceKeySigAlgo: serviceKeySigAlgo, - ServiceKeyHashAlgo: serviceKeyHashAlgo, - Persist: conf.Persist, - Snapshot: conf.Snapshot, - DBPath: conf.DBPath, - GenesisTokenSupply: parseCadenceUFix64(conf.TokenSupply, "token-supply"), - TransactionMaxGasLimit: uint64(conf.TransactionMaxGasLimit), - ScriptGasLimit: uint64(conf.ScriptGasLimit), - TransactionExpiry: uint(conf.TransactionExpiry), - StorageLimitEnabled: conf.StorageLimitEnabled, - StorageMBPerFLOW: storageMBPerFLOW, - MinimumStorageReservation: minimumStorageReservation, - TransactionFeesEnabled: conf.TransactionFeesEnabled, - WithContracts: conf.Contracts, - SkipTransactionValidation: conf.SkipTxValidation, - SimpleAddressesEnabled: conf.SimpleAddresses, - Host: conf.Host, - ChainID: flowChainID, - RedisURL: conf.RedisURL, - ContractRemovalEnabled: conf.ContractRemovalEnabled, - SqliteURL: conf.SqliteURL, - CoverageReportingEnabled: conf.CoverageReportingEnabled, - EVMEnabled: conf.EVMEnabled, + HTTPHeaders: nil, + BlockTime: conf.BlockTime, + ServicePublicKey: servicePublicKey, + ServicePrivateKey: servicePrivateKey, + ServiceKeySigAlgo: serviceKeySigAlgo, + ServiceKeyHashAlgo: serviceKeyHashAlgo, + Persist: conf.Persist, + Snapshot: conf.Snapshot, + DBPath: conf.DBPath, + GenesisTokenSupply: parseCadenceUFix64(conf.TokenSupply, "token-supply"), + TransactionMaxGasLimit: uint64(conf.TransactionMaxGasLimit), + ScriptGasLimit: uint64(conf.ScriptGasLimit), + TransactionExpiry: uint(conf.TransactionExpiry), + StorageLimitEnabled: conf.StorageLimitEnabled, + StorageMBPerFLOW: storageMBPerFLOW, + MinimumStorageReservation: minimumStorageReservation, + TransactionFeesEnabled: conf.TransactionFeesEnabled, + WithContracts: conf.Contracts, + SkipTransactionValidation: conf.SkipTxValidation, + SimpleAddressesEnabled: conf.SimpleAddresses, + Host: conf.Host, + ChainID: flowChainID, + RedisURL: conf.RedisURL, + ContractRemovalEnabled: conf.ContractRemovalEnabled, + SqliteURL: conf.SqliteURL, + CoverageReportingEnabled: conf.CoverageReportingEnabled, + LegacyContractUpgradeEnabled: conf.LegacyContractUpgradeEnabled, + EVMEnabled: conf.EVMEnabled, // todo temporarily disabled until remote register endpoint is re-enabled // StartBlockHeight: conf.StartBlockHeight, } diff --git a/emulator/blockchain.go b/emulator/blockchain.go index ebe4b871..e5ec53ef 100644 --- a/emulator/blockchain.go +++ b/emulator/blockchain.go @@ -176,6 +176,13 @@ func WithSimpleAddresses() Option { } } +// WithLegacyUpgradeEnabled enables parsing of old contracts for legacy upgrade purposes +func WithLegacyUpgradeEnabled() Option { + return func(c *config) { + c.LegacyContractUpgradeEnabled = true + } +} + // WithGenesisTokenSupply sets the genesis token supply. func WithGenesisTokenSupply(supply cadence.UFix64) Option { return func(c *config) { @@ -358,6 +365,7 @@ type config struct { StorageLimitEnabled bool TransactionFeesEnabled bool ContractRemovalEnabled bool + LegacyContractUpgradeEnabled bool EVMEnabled bool MinimumStorageReservation cadence.UFix64 StorageMBPerFLOW cadence.UFix64 @@ -579,9 +587,10 @@ func configureFVM(blockchain *Blockchain, conf config, blocks *blocks) (*fvm.Vir cadenceLogger := conf.Logger.Hook(CadenceHook{MainLogger: &conf.ServerLogger}).Level(zerolog.DebugLevel) runtimeConfig := runtime.Config{ - Debugger: blockchain.debugger, - AttachmentsEnabled: true, - CoverageReport: conf.CoverageReport, + Debugger: blockchain.debugger, + AttachmentsEnabled: true, + LegacyContractUpgradeEnabled: conf.LegacyContractUpgradeEnabled, + CoverageReport: conf.CoverageReport, } coverageReportedRuntime := &CoverageReportedRuntime{ Runtime: runtime.NewInterpreterRuntime(runtimeConfig), diff --git a/go.mod b/go.mod index 56bc04bd..0b373f45 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/onflow/cadence v1.0.0-preview.2 + github.com/onflow/cadence v1.0.0-preview.2.0.20240124194125-f961da190b4a github.com/onflow/flow-core-contracts/lib/go/templates v0.15.1-0.20231204202154-f8dfacb39d86 github.com/onflow/flow-go v0.32.4-0.20240118151654-63651b6f96cc github.com/onflow/flow-go-sdk v0.44.0-stable-cadence.2 @@ -26,7 +26,7 @@ require ( github.com/rs/zerolog v1.29.0 github.com/spf13/cobra v1.8.0 github.com/stretchr/testify v1.8.4 - golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df + golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc google.golang.org/grpc v1.59.0 ) diff --git a/go.sum b/go.sum index 9160c826..dc7ef2e5 100644 --- a/go.sum +++ b/go.sum @@ -1366,6 +1366,8 @@ github.com/onflow/atree v0.6.1-0.20230711151834-86040b30171f/go.mod h1:xvP61FoOs github.com/onflow/cadence v0.39.13-stable-cadence/go.mod h1:SxT8/IEkS1drFj2ofUEK9S6KyJ5GQbrm0LX4EFCp/7Q= github.com/onflow/cadence v1.0.0-preview.2 h1:EYJiaYHU35AilrvbrfWhYO3thTCeWBX3aHyy5RPeEag= github.com/onflow/cadence v1.0.0-preview.2/go.mod h1:JmTHN1dOmN5330TkvSC8P50RcteXegxQS5+Aw2zr7+I= +github.com/onflow/cadence v1.0.0-preview.2.0.20240124194125-f961da190b4a h1:tzC8XYLN4T3f1uBjZVwi69n4VIXMq5j2moYGknLSYzs= +github.com/onflow/cadence v1.0.0-preview.2.0.20240124194125-f961da190b4a/go.mod h1:odXGZZ/wGNA5mwT8bC9v8u8EXACHllB2ABSZK65TGL8= github.com/onflow/crypto v0.25.0 h1:BeWbLsh3ZD13Ej+Uky6kg1PL1ZIVBDVX+2MVBNwqddg= github.com/onflow/flow-core-contracts/lib/go/contracts v0.15.1-0.20231212203043-37cbe453d425 h1:zvLHFxySeg61/dgp/IbvaN+k4BXPuAhBOslrPQjrX9Q= github.com/onflow/flow-core-contracts/lib/go/contracts v0.15.1-0.20231212203043-37cbe453d425/go.mod h1:N+1bEs/159Efg75hSQIkb90FVinxUMxL/6mA3I6dXtQ= @@ -1766,6 +1768,8 @@ golang.org/x/exp v0.0.0-20221110155412-d0897a79cd37/go.mod h1:CxIveKay+FTh1D0yPZ golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc h1:ao2WRsKSzW6KuUY9IWPwWahcHCgR0s52IfwutMfEbdM= +golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= diff --git a/server/server.go b/server/server.go index 30bf20e0..30b711cb 100644 --- a/server/server.go +++ b/server/server.go @@ -136,6 +136,8 @@ type Config struct { SqliteURL string // CoverageReportingEnabled enables/disables Cadence code coverage reporting. CoverageReportingEnabled bool + // LegacyUpgradeEnabled enables/disables Cadence legacy contracts upgrades + LegacyContractUpgradeEnabled bool // StartBlockHeight is the height at which to start the emulator. StartBlockHeight uint64 } @@ -407,6 +409,13 @@ func configureBlockchain(logger *zerolog.Logger, conf *Config, store storage.Sto ) } + if conf.LegacyContractUpgradeEnabled { + options = append( + options, + emulator.WithLegacyUpgradeEnabled(), + ) + } + emulatedBlockchain, err := emulator.New(options...) if err != nil { return nil, err diff --git a/server/server_test.go b/server/server_test.go index d9d1d54b..62f9603b 100644 --- a/server/server_test.go +++ b/server/server_test.go @@ -24,6 +24,7 @@ import ( "os" "testing" + "github.com/onflow/flow-emulator/emulator" "github.com/rs/zerolog" "github.com/stretchr/testify/require" ) @@ -79,6 +80,20 @@ func TestPersistenceWithSnapshotFlag(t *testing.T) { require.True(t, os.IsNotExist(err), "DB should not exist") } +func TestLegacyUpgradeFlag(t *testing.T) { + logger := zerolog.Nop() + + conf := &Config{LegacyContractUpgradeEnabled: true} + server := NewEmulatorServer(&logger, conf) + defer server.Stop() + + require.NotNil(t, server) + require.True(t, server.config.LegacyContractUpgradeEnabled) + require.IsType(t, &emulator.Blockchain{}, server.Emulator) + // require.True(t, server.Emulator().) + +} + func TestExecuteScript(t *testing.T) { logger := zerolog.Nop() From 34b5fadde00dfcd4340d5a26e477aa371b15375c Mon Sep 17 00:00:00 2001 From: Daniel Sainati Date: Thu, 25 Jan 2024 12:15:09 -0500 Subject: [PATCH 2/3] update readme --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index fe312bc8..027dc97e 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,8 @@ and if you plan to run the emulator with Docker you must use the environment var | `--start-block-height` | `FLOW_STARTBLOCKHEIGHT` | `0` | Start block height to use when starting the network using 'testnet' or 'mainnet' as the chain-id | | `--evm-enabled` | `FLOW_EVMENABLED` | `false` | Enable evm support | +| `--legacy-upgrade` | `FLOW_LEGACYUPGRADE` | `false` | Enable upgrading of legacy contracts | + ## Running the emulator with the Flow CLI The emulator is bundled with the [Flow CLI](https://docs.onflow.org/flow-cli), a command-line interface for working with Flow. From c1a2f4c6da5c52635c8aa3e10bbb2082a4be6e5c Mon Sep 17 00:00:00 2001 From: Daniel Sainati Date: Fri, 26 Jan 2024 12:16:16 -0500 Subject: [PATCH 3/3] update to M4 Cadence --- go.mod | 2 +- go.sum | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/go.mod b/go.mod index 68f4f49c..8c24b330 100644 --- a/go.mod +++ b/go.mod @@ -13,7 +13,7 @@ require ( github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/improbable-eng/grpc-web v0.15.0 github.com/logrusorgru/aurora v2.0.3+incompatible - github.com/onflow/cadence v1.0.0-preview.2.0.20240124204828-3adb0330b148 + github.com/onflow/cadence v1.0.0-M4 github.com/onflow/crypto v0.25.0 github.com/onflow/flow-core-contracts/lib/go/templates v0.15.1-0.20240125214229-b7a95136dd0d github.com/onflow/flow-go v0.33.2-0.20240126002816-f0770a716d61 diff --git a/go.sum b/go.sum index 9ea49d9c..b9b1f440 100644 --- a/go.sum +++ b/go.sum @@ -1973,10 +1973,9 @@ github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= github.com/onflow/atree v0.6.1-0.20230711151834-86040b30171f h1:Z8/PgTqOgOg02MTRpTBYO2k16FE6z4wEOtaC2WBR9Xo= github.com/onflow/atree v0.6.1-0.20230711151834-86040b30171f/go.mod h1:xvP61FoOs95K7IYdIYRnNcYQGf4nbF/uuJ0tHf4DRuM= -github.com/onflow/cadence v1.0.0-M3 h1:bSydJise9pU4aALloUKv/EWmDLITRlbBpuG8OPBydZM= github.com/onflow/cadence v1.0.0-M3/go.mod h1:odXGZZ/wGNA5mwT8bC9v8u8EXACHllB2ABSZK65TGL8= -github.com/onflow/cadence v1.0.0-preview.2.0.20240124204828-3adb0330b148 h1:v1UFNLJXZinLQOLHgecrKAFaPB7zF92WZNxhtTfQlNM= -github.com/onflow/cadence v1.0.0-preview.2.0.20240124204828-3adb0330b148/go.mod h1:odXGZZ/wGNA5mwT8bC9v8u8EXACHllB2ABSZK65TGL8= +github.com/onflow/cadence v1.0.0-M4 h1:/nt3j7vpYDxuI0ghIgAJrb2R01ijvJYZLAkKt+zbpTY= +github.com/onflow/cadence v1.0.0-M4/go.mod h1:odXGZZ/wGNA5mwT8bC9v8u8EXACHllB2ABSZK65TGL8= github.com/onflow/crypto v0.25.0 h1:BeWbLsh3ZD13Ej+Uky6kg1PL1ZIVBDVX+2MVBNwqddg= github.com/onflow/crypto v0.25.0/go.mod h1:C8FbaX0x8y+FxWjbkHy0Q4EASCDR9bSPWZqlpCLYyVI= github.com/onflow/flow-core-contracts/lib/go/contracts v0.15.1-0.20240125214229-b7a95136dd0d h1:Afcfk/9jAQZ1v5PLGdP68FG/0yPPM60fn9Eq8ChBGS0=