From 11360b48f1dcdab23b2d7367762785febf562cac Mon Sep 17 00:00:00 2001 From: Ian Pun Date: Thu, 1 Feb 2024 11:36:06 -0800 Subject: [PATCH] remove unused packages --- .gitignore | 34 - .golangci.yml | 14 - .idea/.gitignore | 8 + .idea/flow-cli.iml | 9 + .idea/modules.xml | 8 + .idea/vcs.xml | 6 + .idea/watcherTasks.xml | 53 + .vscode/settings.json | 5 + flowkit/CHANGELOG.md => CHANGELOG.md | 0 CODEOWNERS | 1 - CODE_OF_CONDUCT.md | 127 -- CONTRIBUTING.md | 428 ----- LICENSE | 202 --- Makefile | 116 -- NOTICE | 4 - README.md | 92 +- SECURITY.md | 12 - {flowkit/accounts => accounts}/account.go | 0 .../accounts => accounts}/account_test.go | 0 {flowkit/accounts => accounts}/keys.go | 0 {flowkit/accounts => accounts}/keys_test.go | 0 {flowkit/arguments => arguments}/arguments.go | 0 .../arguments => arguments}/arguments_test.go | 0 build/build.go | 61 - check-headers.sh | 8 - cli-banner.svg | 30 - cli.gif | Bin 2214743 -> 0 bytes .../cmd => cmd}/flow-schema/flow-schema.go | 0 cmd/flow/main.go | 163 -- {flowkit/config => config}/account.go | 0 {flowkit/config => config}/account_test.go | 0 {flowkit/config => config}/config.go | 0 {flowkit/config => config}/config_test.go | 0 {flowkit/config => config}/contract.go | 0 {flowkit/config => config}/contract_test.go | 0 {flowkit/config => config}/dependency.go | 0 {flowkit/config => config}/dependency_test.go | 0 {flowkit/config => config}/deployment.go | 0 {flowkit/config => config}/deployment_test.go | 0 {flowkit/config => config}/emulator.go | 0 {flowkit/config => config}/emulator_test.go | 0 {flowkit/config => config}/json/account.go | 0 .../config => config}/json/account_test.go | 0 {flowkit/config => config}/json/config.go | 0 .../config => config}/json/config_test.go | 0 {flowkit/config => config}/json/contract.go | 0 .../config => config}/json/contract_test.go | 0 {flowkit/config => config}/json/dependency.go | 0 .../config => config}/json/dependency_test.go | 0 {flowkit/config => config}/json/deploy.go | 0 .../config => config}/json/deploy_test.go | 0 {flowkit/config => config}/json/emulator.go | 0 .../config => config}/json/emulator_test.go | 0 {flowkit/config => config}/json/network.go | 0 .../config => config}/json/network_test.go | 0 {flowkit/config => config}/json/schema.go | 0 {flowkit/config => config}/loader.go | 0 {flowkit/config => config}/loader_test.go | 0 {flowkit/config => config}/network.go | 0 {flowkit/config => config}/network_test.go | 0 {flowkit/config => config}/processor.go | 0 {flowkit/config => config}/processor_test.go | 0 coverage.txt | 1136 +++++++++++++ docs/README.md | 3 - docs/account-add-contract.md | 3 - docs/account-remove-contract.md | 3 - docs/account-staking-info.md | 3 - docs/account-update-contract.md | 3 - docs/build-transactions.md | 3 - docs/complex-transactions.md | 3 - docs/configuration.md | 3 - docs/create-accounts.md | 3 - docs/data-collection.md | 3 - docs/decode-keys.md | 3 - docs/decode-transactions.md | 3 - docs/deploy-project-contracts.md | 3 - docs/derive-keys.md | 3 - docs/developer-updates/release-notes-v17.md | 3 - docs/developer-updates/release-notes-v18.md | 3 - docs/developer-updates/release-notes-v19.md | 3 - docs/developer-updates/release-notes-v21.md | 3 - docs/developer-updates/release-notes-v24.md | 3 - docs/developer-updates/release-notes-v26.md | 3 - docs/developer-updates/release-notes-v28.md | 3 - docs/emulator-snapshot.md | 3 - docs/execute-scripts.md | 3 - docs/generate-keys.md | 3 - docs/get-accounts.md | 3 - docs/get-blocks.md | 3 - docs/get-collections.md | 3 - docs/get-events.md | 3 - docs/get-status.md | 3 - docs/get-transactions.md | 3 - docs/index.md | 3 - docs/initialize-configuration.md | 3 - docs/install.md | 3 - docs/manage-configuration.md | 3 - docs/project-app.md | 3 - docs/project-contracts.md | 3 - docs/run-tests.md | 3 - docs/security.md | 3 - docs/send-signed-transactions.md | 3 - docs/send-transactions.md | 3 - docs/sign-transaction.md | 3 - docs/signature-generate.md | 3 - docs/signature-verify.md | 3 - docs/snapshot-save.md | 3 - docs/start-emulator.md | 3 - docs/super-commands.md | 3 - docs/template.md | 3 - docs/tools.md | 3 - flowkit/events.go => events.go | 0 flowkit/events_test.go => events_test.go | 0 flowkit/flowkit.go => flowkit.go | 0 flowkit/README.md | 16 - flowkit/go.mod | 207 --- flowkit/go.sum | 1475 ----------------- flowkit/flowkit_test.go => flowkit_test.go | 0 {flowkit/gateway => gateway}/emulator.go | 0 {flowkit/gateway => gateway}/gateway.go | 0 {flowkit/gateway => gateway}/grpc.go | 0 {flowkit/gateway => gateway}/mocks/Gateway.go | 0 .../gateway => gateway}/mocks/gateway_mock.go | 0 go.mod | 151 +- go.sum | 573 +------ install.ps1 | 85 - install.sh | 119 -- internal/accounts/accounts.go | 151 -- internal/accounts/accounts_test.go | 314 ---- internal/accounts/contract-add.go | 140 -- internal/accounts/contract-remove.go | 108 -- internal/accounts/contract-update.go | 38 - internal/accounts/create-interactive.go | 293 ---- internal/accounts/create.go | 173 -- internal/accounts/fund.go | 79 - internal/accounts/get.go | 71 - internal/accounts/staking-info.go | 271 --- internal/blocks/blocks.go | 128 -- internal/blocks/blocks_test.go | 100 -- internal/blocks/get.go | 101 -- internal/cadence/cadence.go | 47 - .../cadence/languageserver/languageserver.go | 57 - internal/collections/collections.go | 74 - internal/collections/collections_test.go | 48 - internal/collections/get.go | 66 - internal/command/command.go | 363 ---- internal/command/global_flags.go | 146 -- internal/command/global_flags_test.go | 60 - internal/command/result.go | 172 -- internal/command/template.go | 52 - internal/config/add-account.go | 167 -- internal/config/add-contract.go | 145 -- internal/config/add-deployment.go | 110 -- internal/config/add-network.go | 111 -- internal/config/add.go | 38 - internal/config/config.go | 55 - internal/config/init.go | 134 -- internal/config/remove-account.go | 72 - internal/config/remove-contract.go | 72 - internal/config/remove-deployment.go | 74 - internal/config/remove-network.go | 72 - internal/config/remove.go | 38 - internal/dependencymanager/add.go | 75 - internal/dependencymanager/dependencies.go | 36 - .../dependencymanager/dependencyinstaller.go | 309 ---- .../dependencyinstaller_test.go | 131 -- internal/dependencymanager/install.go | 68 - internal/emulator/snapshot.go | 253 --- internal/emulator/start.go | 119 -- internal/events/events.go | 153 -- internal/events/events_test.go | 112 -- internal/events/get.go | 113 -- internal/keys/decode.go | 139 -- internal/keys/derive.go | 68 - internal/keys/generate.go | 89 - internal/keys/keys.go | 127 -- internal/keys/keys_test.go | 150 -- internal/project/deploy.go | 229 --- internal/project/project.go | 34 - internal/project/project_test.go | 78 - internal/quick/deploy.go | 37 - internal/quick/init.go | 39 - internal/quick/run.go | 69 - internal/scripts/execute.go | 107 -- internal/scripts/scripts.go | 67 - internal/scripts/scripts_test.go | 68 - internal/settings/cmd.go | 33 - internal/settings/defaults.go | 61 - internal/settings/metrics.go | 57 - internal/settings/settings.go | 132 -- internal/signatures/generate.go | 129 -- internal/signatures/signatures.go | 35 - internal/signatures/signatures_test.go | 87 - internal/signatures/verify.go | 141 -- internal/snapshot/save.go | 76 - internal/snapshot/snapshot.go | 52 - internal/status/status.go | 123 -- internal/super/dev.go | 109 -- internal/super/files.go | 246 --- internal/super/files_test.go | 63 - internal/super/flix.go | 298 ---- internal/super/flix_test.go | 232 --- internal/super/generate.go | 204 --- internal/super/generate_test.go | 192 --- internal/super/output.go | 161 -- internal/super/project.go | 347 ---- internal/super/setup.go | 256 --- internal/test/test.go | 377 ----- internal/test/test_test.go | 695 -------- internal/tools/flowser.go | 130 -- internal/tools/wallet.go | 86 - internal/transactions/build.go | 152 -- internal/transactions/decode.go | 72 - internal/transactions/get.go | 73 - internal/transactions/send-signed.go | 90 - internal/transactions/send.go | 161 -- internal/transactions/sign.go | 180 -- internal/transactions/transactions.go | 218 --- internal/transactions/transactions_test.go | 532 ------ internal/util/prompt.go | 768 --------- internal/util/test.go | 46 - internal/util/util.go | 113 -- internal/version/version.go | 48 - {flowkit/mocks => mocks}/Services.go | 0 {flowkit/mocks => mocks}/services_mock.go | 0 {flowkit/output => output}/colors.go | 0 {flowkit/output => output}/emoji.go | 0 {flowkit/output => output}/logger.go | 0 {flowkit/output => output}/spinner.go | 0 {flowkit/project => project}/contract.go | 0 {flowkit/project => project}/contract_test.go | 0 {flowkit/project => project}/deployment.go | 0 .../project => project}/deployment_test.go | 0 {flowkit/project => project}/imports.go | 0 {flowkit/project => project}/imports_test.go | 0 {flowkit/project => project}/program.go | 0 {flowkit/project => project}/program_test.go | 0 scaffolds.json | 79 - flowkit/schema.json => schema.json | 0 flowkit/services.go => services.go | 0 flowkit/state.go => state.go | 0 flowkit/state_test.go => state_test.go | 0 {flowkit/tests => tests}/resources.go | 0 {flowkit/tests => tests}/testnet_test.go | 0 .../transaction.go | 0 .../transaction_test.go | 0 version.txt | 1 - 247 files changed, 1375 insertions(+), 17577 deletions(-) delete mode 100644 .gitignore delete mode 100644 .golangci.yml create mode 100644 .idea/.gitignore create mode 100644 .idea/flow-cli.iml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 .idea/watcherTasks.xml create mode 100644 .vscode/settings.json rename flowkit/CHANGELOG.md => CHANGELOG.md (100%) delete mode 100644 CODEOWNERS delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 CONTRIBUTING.md delete mode 100644 LICENSE delete mode 100644 Makefile delete mode 100644 NOTICE delete mode 100644 SECURITY.md rename {flowkit/accounts => accounts}/account.go (100%) rename {flowkit/accounts => accounts}/account_test.go (100%) rename {flowkit/accounts => accounts}/keys.go (100%) rename {flowkit/accounts => accounts}/keys_test.go (100%) rename {flowkit/arguments => arguments}/arguments.go (100%) rename {flowkit/arguments => arguments}/arguments_test.go (100%) delete mode 100644 build/build.go delete mode 100755 check-headers.sh delete mode 100644 cli-banner.svg delete mode 100644 cli.gif rename {flowkit/cmd => cmd}/flow-schema/flow-schema.go (100%) delete mode 100644 cmd/flow/main.go rename {flowkit/config => config}/account.go (100%) rename {flowkit/config => config}/account_test.go (100%) rename {flowkit/config => config}/config.go (100%) rename {flowkit/config => config}/config_test.go (100%) rename {flowkit/config => config}/contract.go (100%) rename {flowkit/config => config}/contract_test.go (100%) rename {flowkit/config => config}/dependency.go (100%) rename {flowkit/config => config}/dependency_test.go (100%) rename {flowkit/config => config}/deployment.go (100%) rename {flowkit/config => config}/deployment_test.go (100%) rename {flowkit/config => config}/emulator.go (100%) rename {flowkit/config => config}/emulator_test.go (100%) rename {flowkit/config => config}/json/account.go (100%) rename {flowkit/config => config}/json/account_test.go (100%) rename {flowkit/config => config}/json/config.go (100%) rename {flowkit/config => config}/json/config_test.go (100%) rename {flowkit/config => config}/json/contract.go (100%) rename {flowkit/config => config}/json/contract_test.go (100%) rename {flowkit/config => config}/json/dependency.go (100%) rename {flowkit/config => config}/json/dependency_test.go (100%) rename {flowkit/config => config}/json/deploy.go (100%) rename {flowkit/config => config}/json/deploy_test.go (100%) rename {flowkit/config => config}/json/emulator.go (100%) rename {flowkit/config => config}/json/emulator_test.go (100%) rename {flowkit/config => config}/json/network.go (100%) rename {flowkit/config => config}/json/network_test.go (100%) rename {flowkit/config => config}/json/schema.go (100%) rename {flowkit/config => config}/loader.go (100%) rename {flowkit/config => config}/loader_test.go (100%) rename {flowkit/config => config}/network.go (100%) rename {flowkit/config => config}/network_test.go (100%) rename {flowkit/config => config}/processor.go (100%) rename {flowkit/config => config}/processor_test.go (100%) create mode 100644 coverage.txt delete mode 100644 docs/README.md delete mode 100644 docs/account-add-contract.md delete mode 100644 docs/account-remove-contract.md delete mode 100644 docs/account-staking-info.md delete mode 100644 docs/account-update-contract.md delete mode 100644 docs/build-transactions.md delete mode 100644 docs/complex-transactions.md delete mode 100644 docs/configuration.md delete mode 100644 docs/create-accounts.md delete mode 100644 docs/data-collection.md delete mode 100644 docs/decode-keys.md delete mode 100644 docs/decode-transactions.md delete mode 100644 docs/deploy-project-contracts.md delete mode 100644 docs/derive-keys.md delete mode 100644 docs/developer-updates/release-notes-v17.md delete mode 100644 docs/developer-updates/release-notes-v18.md delete mode 100644 docs/developer-updates/release-notes-v19.md delete mode 100644 docs/developer-updates/release-notes-v21.md delete mode 100644 docs/developer-updates/release-notes-v24.md delete mode 100644 docs/developer-updates/release-notes-v26.md delete mode 100644 docs/developer-updates/release-notes-v28.md delete mode 100644 docs/emulator-snapshot.md delete mode 100644 docs/execute-scripts.md delete mode 100644 docs/generate-keys.md delete mode 100644 docs/get-accounts.md delete mode 100644 docs/get-blocks.md delete mode 100644 docs/get-collections.md delete mode 100644 docs/get-events.md delete mode 100644 docs/get-status.md delete mode 100644 docs/get-transactions.md delete mode 100644 docs/index.md delete mode 100644 docs/initialize-configuration.md delete mode 100644 docs/install.md delete mode 100644 docs/manage-configuration.md delete mode 100644 docs/project-app.md delete mode 100644 docs/project-contracts.md delete mode 100644 docs/run-tests.md delete mode 100644 docs/security.md delete mode 100644 docs/send-signed-transactions.md delete mode 100644 docs/send-transactions.md delete mode 100644 docs/sign-transaction.md delete mode 100644 docs/signature-generate.md delete mode 100644 docs/signature-verify.md delete mode 100644 docs/snapshot-save.md delete mode 100644 docs/start-emulator.md delete mode 100644 docs/super-commands.md delete mode 100644 docs/template.md delete mode 100644 docs/tools.md rename flowkit/events.go => events.go (100%) rename flowkit/events_test.go => events_test.go (100%) rename flowkit/flowkit.go => flowkit.go (100%) delete mode 100644 flowkit/README.md delete mode 100644 flowkit/go.mod delete mode 100644 flowkit/go.sum rename flowkit/flowkit_test.go => flowkit_test.go (100%) rename {flowkit/gateway => gateway}/emulator.go (100%) rename {flowkit/gateway => gateway}/gateway.go (100%) rename {flowkit/gateway => gateway}/grpc.go (100%) rename {flowkit/gateway => gateway}/mocks/Gateway.go (100%) rename {flowkit/gateway => gateway}/mocks/gateway_mock.go (100%) delete mode 100644 install.ps1 delete mode 100755 install.sh delete mode 100644 internal/accounts/accounts.go delete mode 100644 internal/accounts/accounts_test.go delete mode 100644 internal/accounts/contract-add.go delete mode 100644 internal/accounts/contract-remove.go delete mode 100644 internal/accounts/contract-update.go delete mode 100644 internal/accounts/create-interactive.go delete mode 100644 internal/accounts/create.go delete mode 100644 internal/accounts/fund.go delete mode 100644 internal/accounts/get.go delete mode 100644 internal/accounts/staking-info.go delete mode 100644 internal/blocks/blocks.go delete mode 100644 internal/blocks/blocks_test.go delete mode 100644 internal/blocks/get.go delete mode 100644 internal/cadence/cadence.go delete mode 100644 internal/cadence/languageserver/languageserver.go delete mode 100644 internal/collections/collections.go delete mode 100644 internal/collections/collections_test.go delete mode 100644 internal/collections/get.go delete mode 100644 internal/command/command.go delete mode 100644 internal/command/global_flags.go delete mode 100644 internal/command/global_flags_test.go delete mode 100644 internal/command/result.go delete mode 100644 internal/command/template.go delete mode 100644 internal/config/add-account.go delete mode 100644 internal/config/add-contract.go delete mode 100644 internal/config/add-deployment.go delete mode 100644 internal/config/add-network.go delete mode 100644 internal/config/add.go delete mode 100644 internal/config/config.go delete mode 100644 internal/config/init.go delete mode 100644 internal/config/remove-account.go delete mode 100644 internal/config/remove-contract.go delete mode 100644 internal/config/remove-deployment.go delete mode 100644 internal/config/remove-network.go delete mode 100644 internal/config/remove.go delete mode 100644 internal/dependencymanager/add.go delete mode 100644 internal/dependencymanager/dependencies.go delete mode 100644 internal/dependencymanager/dependencyinstaller.go delete mode 100644 internal/dependencymanager/dependencyinstaller_test.go delete mode 100644 internal/dependencymanager/install.go delete mode 100644 internal/emulator/snapshot.go delete mode 100644 internal/emulator/start.go delete mode 100644 internal/events/events.go delete mode 100644 internal/events/events_test.go delete mode 100644 internal/events/get.go delete mode 100644 internal/keys/decode.go delete mode 100644 internal/keys/derive.go delete mode 100644 internal/keys/generate.go delete mode 100644 internal/keys/keys.go delete mode 100644 internal/keys/keys_test.go delete mode 100644 internal/project/deploy.go delete mode 100644 internal/project/project.go delete mode 100644 internal/project/project_test.go delete mode 100644 internal/quick/deploy.go delete mode 100644 internal/quick/init.go delete mode 100644 internal/quick/run.go delete mode 100644 internal/scripts/execute.go delete mode 100644 internal/scripts/scripts.go delete mode 100644 internal/scripts/scripts_test.go delete mode 100644 internal/settings/cmd.go delete mode 100644 internal/settings/defaults.go delete mode 100644 internal/settings/metrics.go delete mode 100644 internal/settings/settings.go delete mode 100644 internal/signatures/generate.go delete mode 100644 internal/signatures/signatures.go delete mode 100644 internal/signatures/signatures_test.go delete mode 100644 internal/signatures/verify.go delete mode 100644 internal/snapshot/save.go delete mode 100644 internal/snapshot/snapshot.go delete mode 100644 internal/status/status.go delete mode 100644 internal/super/dev.go delete mode 100644 internal/super/files.go delete mode 100644 internal/super/files_test.go delete mode 100644 internal/super/flix.go delete mode 100644 internal/super/flix_test.go delete mode 100644 internal/super/generate.go delete mode 100644 internal/super/generate_test.go delete mode 100644 internal/super/output.go delete mode 100644 internal/super/project.go delete mode 100644 internal/super/setup.go delete mode 100644 internal/test/test.go delete mode 100644 internal/test/test_test.go delete mode 100644 internal/tools/flowser.go delete mode 100644 internal/tools/wallet.go delete mode 100644 internal/transactions/build.go delete mode 100644 internal/transactions/decode.go delete mode 100644 internal/transactions/get.go delete mode 100644 internal/transactions/send-signed.go delete mode 100644 internal/transactions/send.go delete mode 100644 internal/transactions/sign.go delete mode 100644 internal/transactions/transactions.go delete mode 100644 internal/transactions/transactions_test.go delete mode 100644 internal/util/prompt.go delete mode 100644 internal/util/test.go delete mode 100644 internal/util/util.go delete mode 100644 internal/version/version.go rename {flowkit/mocks => mocks}/Services.go (100%) rename {flowkit/mocks => mocks}/services_mock.go (100%) rename {flowkit/output => output}/colors.go (100%) rename {flowkit/output => output}/emoji.go (100%) rename {flowkit/output => output}/logger.go (100%) rename {flowkit/output => output}/spinner.go (100%) rename {flowkit/project => project}/contract.go (100%) rename {flowkit/project => project}/contract_test.go (100%) rename {flowkit/project => project}/deployment.go (100%) rename {flowkit/project => project}/deployment_test.go (100%) rename {flowkit/project => project}/imports.go (100%) rename {flowkit/project => project}/imports_test.go (100%) rename {flowkit/project => project}/program.go (100%) rename {flowkit/project => project}/program_test.go (100%) delete mode 100644 scaffolds.json rename flowkit/schema.json => schema.json (100%) rename flowkit/services.go => services.go (100%) rename flowkit/state.go => state.go (100%) rename flowkit/state_test.go => state_test.go (100%) rename {flowkit/tests => tests}/resources.go (100%) rename {flowkit/tests => tests}/testnet_test.go (100%) rename {flowkit/transactions => transactions}/transaction.go (100%) rename {flowkit/transactions => transactions}/transaction_test.go (100%) delete mode 100644 version.txt diff --git a/.gitignore b/.gitignore deleted file mode 100644 index b8403f505..000000000 --- a/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Coverage artifacts -coverage.zip -coverage.txt -cover.json -cover-summary -index.html - -# Binaries -/cmd/flow/flow* - -.DS_Store - -# Ignore flow json config -flow.json -flow*.json -!tests/flow.json - -# IDE related files -.idea -.vscode -git - -# Ignore built CLI -main -*.pkey - -# Local development file generation folder -imports \ No newline at end of file diff --git a/.golangci.yml b/.golangci.yml deleted file mode 100644 index d66a23e3d..000000000 --- a/.golangci.yml +++ /dev/null @@ -1,14 +0,0 @@ -linters: - disable-all: true - enable: - - govet - - errcheck - - varcheck - - ineffassign - - typecheck - - misspell - - goimports -linters-settings: - goimports: - # put imports beginning with prefix after 3rd-party package - local-prefixes: github.com/onflow/flow-cli diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 000000000..13566b81b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/flow-cli.iml b/.idea/flow-cli.iml new file mode 100644 index 000000000..5e764c4f0 --- /dev/null +++ b/.idea/flow-cli.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 000000000..92cb55c47 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 000000000..35eb1ddfb --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/watcherTasks.xml b/.idea/watcherTasks.xml new file mode 100644 index 000000000..683a68c19 --- /dev/null +++ b/.idea/watcherTasks.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..70ed6d75c --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "go.formatTool": "goimports", + "go.formatFlags": ["-local", "github.com/onflow/flow-cli"], + "editor.formatOnSave": true +} diff --git a/flowkit/CHANGELOG.md b/CHANGELOG.md similarity index 100% rename from flowkit/CHANGELOG.md rename to CHANGELOG.md diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 1e9736a37..000000000 --- a/CODEOWNERS +++ /dev/null @@ -1 +0,0 @@ -* @Kay-Zee @janezpodhostnik @sideninja @chasefleming @nvdtf @bluesign @bjartek @jribbink @ianthpun \ No newline at end of file diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 467d696b6..000000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,127 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -We as members, contributors, and leaders pledge to make participation in our -community a harassment-free experience for everyone, regardless of age, body -size, visible or invisible disability, ethnicity, sex characteristics, gender -identity and expression, level of experience, education, socio-economic status, -nationality, personal appearance, race, religion, or sexual identity -and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, -diverse, inclusive, and healthy community. - -## Our Standards - -Examples of behavior that contributes to a positive environment for our -community include: - -* Demonstrating empathy and kindness toward other people -* Being respectful of differing opinions, viewpoints, and experiences -* Giving and gracefully accepting constructive feedback -* Accepting responsibility and apologizing to those affected by our mistakes, - and learning from the experience -* Focusing on what is best not just for us as individuals, but for the - overall community - -Examples of unacceptable behavior include: - -* The use of sexualized language or imagery, and sexual attention or - advances of any kind -* Trolling, insulting or derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or email - address, without their explicit permission -* Other conduct which could reasonably be considered inappropriate in a - professional setting - -## Enforcement Responsibilities - -Community leaders are responsible for clarifying and enforcing our standards of -acceptable behavior and will take appropriate and fair corrective action in -response to any behavior that they deem inappropriate, threatening, offensive, -or harmful. - -Community leaders have the right and responsibility to remove, edit, or reject -comments, commits, code, wiki edits, issues, and other contributions that are -not aligned to this Code of Conduct, and will communicate reasons for moderation -decisions when appropriate. - -## Scope - -This Code of Conduct applies within all community spaces, and also applies when -an individual is officially representing the community in public spaces. -Examples of representing our community include using an official e-mail address, -posting via an official social media account, or acting as an appointed -representative at an online or offline event. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported to the community leaders responsible for enforcement at . -All complaints will be reviewed and investigated promptly and fairly. - -All community leaders are obligated to respect the privacy and security of the -reporter of any incident. - -## Enforcement Guidelines - -Community leaders will follow these Community Impact Guidelines in determining -the consequences for any action they deem in violation of this Code of Conduct: - -### 1. Correction - -**Community Impact**: Use of inappropriate language or other behavior deemed -unprofessional or unwelcome in the community. - -**Consequence**: A private, written warning from community leaders, providing -clarity around the nature of the violation and an explanation of why the -behavior was inappropriate. A public apology may be requested. - -### 2. Warning - -**Community Impact**: A violation through a single incident or series -of actions. - -**Consequence**: A warning with consequences for continued behavior. No -interaction with the people involved, including unsolicited interaction with -those enforcing the Code of Conduct, for a specified period of time. This -includes avoiding interactions in community spaces as well as external channels -like social media. Violating these terms may lead to a temporary or -permanent ban. - -### 3. Temporary Ban - -**Community Impact**: A serious violation of community standards, including -sustained inappropriate behavior. - -**Consequence**: A temporary ban from any sort of interaction or public -communication with the community for a specified period of time. No public or -private interaction with the people involved, including unsolicited interaction -with those enforcing the Code of Conduct, is allowed during this period. -Violating these terms may lead to a permanent ban. - -### 4. Permanent Ban - -**Community Impact**: Demonstrating a pattern of violation of community -standards, including sustained inappropriate behavior, harassment of an -individual, or aggression toward or disparagement of classes of individuals. - -**Consequence**: A permanent ban from any sort of public interaction within -the community. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], -version 2.0, available at -https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. - -Community Impact Guidelines were inspired by [Mozilla's code of conduct -enforcement ladder](https://github.com/mozilla/diversity). - -[homepage]: https://www.contributor-covenant.org - -For answers to common questions about this code of conduct, see the FAQ at -https://www.contributor-covenant.org/faq. Translations are available at -https://www.contributor-covenant.org/translations. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index ce3a5da7c..000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,428 +0,0 @@ -# Contributing to the Flow CLI - -The following is a set of guidelines for contributing to the Flow CLI. -These are mostly guidelines, not rules. -Use your best judgment, and feel free to propose changes to this document in a pull request. - -## Table Of Contents - -[Getting Started](#getting-started) - -[How Can I Contribute?](#how-can-i-contribute) - -- [Reporting Bugs](#reporting-bugs) -- [Suggesting Enhancements](#suggesting-enhancements) -- [Your First Code Contribution](#your-first-code-contribution) -- [Pull Requests](#pull-requests) - -[Styleguides](#styleguides) - -- [Git Commit Messages](#git-commit-messages) -- [Go Styleguide](#go-styleguide) - -[Additional Notes](#additional-notes) - -## Getting Started - -Install the necessary dependencies: - -``` -go get ./... -``` - -Generate mocks: -``` -go generate -``` - -To run the repo: - -``` -go run cmd/flow/main.go -``` - -## How Can I Contribute? - -### Reporting Bugs - -#### Before Submitting A Bug Report - -- **Search existing issues** to see if the problem has already been reported. - If it has **and the issue is still open**, add a comment to the existing issue instead of opening a new one. - -#### How Do I Submit A (Good) Bug Report? - -Explain the problem and include additional details to help maintainers reproduce the problem: - -- **Use a clear and descriptive title** for the issue to identify the problem. -- **Describe the exact steps which reproduce the problem** in as many details as possible. - When listing steps, **don't just say what you did, but explain how you did it**. -- **Provide specific examples to demonstrate the steps**. - Include links to files or GitHub projects, or copy/pasteable snippets, which you use in those examples. - If you're providing snippets in the issue, - use [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). -- **Describe the behavior you observed after following the steps** and point out what exactly is the problem with that behavior. -- **Explain which behavior you expected to see instead and why.** -- **Include error messages and stack traces** which show the output / crash and clearly demonstrate the problem. - -Provide more context by answering these questions: - -- **Can you reliably reproduce the issue?** If not, provide details about how often the problem happens - and under which conditions it normally happens. - -Include details about your configuration and environment: - -- **What is the version of the CLI you're using**? -- **What's the name and version of the Operating System you're using**? - -### Suggesting Enhancements - -#### Before Submitting An Enhancement Suggestion - -- **Perform a cursory search** to see if the enhancement has already been suggested. - If it has, add a comment to the existing issue instead of opening a new one. - -#### How Do I Submit A (Good) Enhancement Suggestion? - -Enhancement suggestions are tracked as [GitHub issues](https://guides.github.com/features/issues/). -Create an issue and provide the following information: - -- **Use a clear and descriptive title** for the issue to identify the suggestion. -- **Provide a step-by-step description of the suggested enhancement** in as many details as possible. -- **Provide specific examples to demonstrate the steps**. - Include copy/pasteable snippets which you use in those examples, - as [Markdown code blocks](https://help.github.com/articles/markdown-basics/#multiple-lines). -- **Describe the current behavior** and **explain which behavior you expected to see instead** and why. -- **Explain why this enhancement would be useful** to CLI users. - -### Your First Code Contribution - -Unsure where to begin contributing to the Flow CLI? -You can start by looking through these `good-first-issue` and `help-wanted` issues: - -- [Good first issues](https://github.com/onflow/flow-cli/labels/good%20first%20issue): - issues which should only require a few lines of code, and a test or two. -- [Help wanted issues](https://github.com/onflow/flow-cli/labels/help%20wanted): - issues which should be a bit more involved than `good-first-issue` issues. - -Both issue lists are sorted by total number of comments. -While not perfect, number of comments is a reasonable proxy for impact a given change will have. - -### Pull Requests - -The process described here has several goals: - -- Maintain code quality -- Fix problems that are important to users -- Engage the community in working toward the best possible UX -- Enable a sustainable system for the CLI's maintainers to review contributions - -Please follow the [styleguides](#styleguides) to have your contribution considered by the maintainers. -Reviewer(s) may ask you to complete additional design work, tests, -or other changes before your pull request can be ultimately accepted. - -## Styleguides - -Before contributing, make sure to examine the project to get familiar with the patterns and style already being used. - -### Git Commit Messages - -- Use the present tense ("Add feature" not "Added feature") -- Use the imperative mood ("Move cursor to..." not "Moves cursor to...") -- Limit the first line to 72 characters or less -- Reference issues and pull requests liberally after the first line - -### Go Styleguide - -The majority of this project is written Go. - -We try to follow the coding guidelines from the Go community. - -- Code should be formatted using `gofmt` -- Code should pass the linter: `make lint` -- Code should follow the guidelines covered in - [Effective Go](http://golang.org/doc/effective_go.html) - and [Go Code Review Comments](https://github.com/golang/go/wiki/CodeReviewComments) -- Code should be commented -- Code should pass all tests: `make test` - -## Releasing - -Releasing is automated by Github actions. Release action is triggered by creating a release on Github and publishing it. - -You can also release manually although this is not recommended: -- Tag a new release and push it -- Build the binaries: `make versioned-binaries` -- Test built binaries locally -- Upload the binaries: `make publish` -- Update the Homebrew formula: e.g. `brew bump-formula-pr flow-cli --version=0.12.3` - -To make the new version the default version that is installed - -- Change `version.txt` and commit it - -## Adding a scaffold -You can add your own scaffold by creating a GitHub repository containing the scaffold content and then making a PR -to update the `scaffolds.json` in the Flow CLI repository. You need to add an entry to the list -with the bellow content. - -```json -{ - "name": "name of the scaffold", - "repo": "HTTP URL to the repository containing the scaffold", - "commit": "Hash of the (latest) commit in your scaffold repository", - "branch": "scaffold repository branch", - "description": "user friendly description of the scaffold (what it contains, why it is used...)" -} -``` - - -# CLI Guidelines -This is a design guideline used for the development of the Flow CLI. The purpose of this guideline is to achieve consistency across new features and allow composability of commands that build the fundamentals of great CLI design. - -> Whatever software you’re building, you can be absolutely certain that people will -> use it in ways you didn’t anticipate. Your software will become a part in a larger system -> — your only choice is over whether it will be a well-behaved part. - [Clig](https://clig.dev/) - - -# Human Interaction - -Our interaction with the CLI is done by executing CLI commands and passing arguments -and flags which need to be consistent. Consistency will allow interactions to -be predictable and will with time feel natural even without resorting to reading instructions. - -## Commands -Be consistent across commands and subcommands. In case we define a subcommand we -should use `noun verb` pattern. **Don’t have ambiguous or similarly-named commands.** -Naming and language should be the same as used in the rest of Flow's documentation. -Use only lowercase letters, and dashes if you really need to. Keep it short. -Users will be typing it all the time. - -``` -flow accounts -``` - -## Flags -Flags are **named parameters**, denoted with either a hyphen, and a -single-letter name (`-r`) or a double hyphen and a multiple-letter -name (`--recursive`). The longer version is preferred for better readability -and simpler learning experience in the beginning but after a while users will -probably start using the shorter version. - -Every flag should have a shorter version and they should be both presented in the help. -Every flag that can have a default value should have a default value -so users don’t have to specify all of them when not needed. - -Support flags following a value delimited by a space or -equal (=) sign (ex: `--username test` or `--username=test`) - -``` -flow accounts get --filter "address" -``` - -Use common naming for default falgs such as: - -`--log`: Logging level. - -`--output`: Output format (JSON, inline etc...). - -`-h, --help`: Help. This should only mean help. See the help section. - -`--version`: Version. - - -## Arguments -Arguments, or args, are positional parameters to a command. -There should be as few arguments as possible, because it is hard for users to remember the sequence of arguments. - -Because they are relying on position, flags should be used where more than one argument would be required. - -Arguments should be one word verbs following general naming guideline. -**Prefer flags to arguments**. - -Use an argument for the value that command requires in order to run. - -``` -flow accounts get
-``` - -## Robustness -CLI should feel robust. Long operation should also provide output as they are processing. -**Responsivness is more important than speed.** - -Warn before you make a non-additive change. Eventually, you’ll find that you can’t -avoid breaking an interface. Before you do, forewarn your users in the program itself: -when they pass the flag you’re looking to deprecate, tell them it’s going to change soon. -Make sure there’s a way they can modify their usage today to make it -future-proof, and tell them how to do it. - -# Computer Interaction - -The CLI will respond to execution of commands by providing some output. -Output should with the same reasons as input be consistent and predictable, -even further it should follow some industry standards and thus allow great strength -of CLI use: composability. Output should be served in the right dosage. We shouldn't -output lines and lines of data because we will shadow the important part the same -way we shouldn't let the CLI command run in background not providing any output for -minutes as it is working because the user will start to doubt if the command is broken. -It's important to get this balance right. - -## Interaction -Commands must be stateless and idempotent, meaning they can be run without relying on external state. -If we have some external state, like the configuration, each command must include an option to -define it on the fly, but it must also work without it by first relying on the externally -saved state in the configuration, and if not found, relying on a default value. -When relying on a default value results in an error, there should be an explanation for the user that a configuration should be created. - -We try to use default values first to get that “works like magic” feeling. - -Never require a prompt for user input. Always offer a flag to provide that input. -However, if a user doesn't provide required input we can offer a prompt as an alternative. - - -## Output - -“Expect the output of every program to become the input to another, as yet unknown, program.” — Doug McIlroy - -Output should use **stdout**. Output of commands should be presented in a clear formatted way for -users to easily scan it, but it must also be compatible with `grep` command often used in -command chaining. Output should also be possible in json by using `--output json` flag. - -Default command response should be to the stdout and not saved to a file. Anytime we want -the output to be saved to a file we should explicitly specify so by using `--save filename.txt` -flag and providing the path. - -Result output should include only information that is commonly used and relevant, -don't use too much of user screen drowning what’s truly important, -instead provide a way to include that data when the user requests by having include, exclude flags. - -``` -Address 179b6b1cb6755e31 -Balance 0 -Keys 2 - -Key 0 Public Key c8a2a318b9099cc6c872a0ec3dcd9f59d17837e4ffd6cd8a1f913ddfa769559605e1ad6ad603ebb511f5a6c8125f863abc2e9c600216edaa07104a0fe320dba7 - Weight 1000 - Signature Algorithm ECDSA_P256 - Hash Algorithm SHA3_256 - -Code - pub contract Foo { - pub var bar: String - - init() { - self.bar = "Hello, World!" - } - } -``` - -``` -{"Address":"179b6b1cb6755e31","Balance":0,"Code":"CnB1YiBjb250cmFjdCBGb28gewoJcHViIHZhciBiYXI6IFN0cmluZwoKCWluaXQoKSB7CgkJc2VsZi5iYXIgPSAiSGVsbG8sIFdvcmxkISIKCX0KfQo=","Keys":[{"Index":0,"PublicKey":{},"SigAlgo":2,"HashAlgo":3,"Weight":1000,"SequenceNumber":0,"Revoked":false}],"Contracts":null} -``` - -## Error -Error should be human-readable, avoid printing out stack trace. It should give some -pointers as to what could have gone wrong and how to fix it. -Maybe try involving an example. However allow `--log debug` flag for complete error info -with stack. Error messages should be sent to `stderr` - -``` -❌ Error while dialing dial tcp 127.0.0.1:3569: connect: connection refused" -🙏 Make sure your emulator is running or connection address is correct. -``` - -## Saving -Saving output to files should be optional and never a default action unless it is -clear from the command name the output will be saved and that is -required for later use (example: `flow init`). Output can be piped in files, and -our CLI should resort to that for default saving. If there is a specific format -that needs to be saved or converted to we should be able to display that format as -well hence again allowing us to pipe it to files. - -## Help -Main help screen must contain a list of all commands with their own description, -it must also include examples for commands. Help screen should include link to the documentation website. - -Commands should have a description that is not too long (less than 100 characters). -Help should be outputed if command is ran without any arguments. Help outline should be: - -```Description: - - -Usage: - - -Examples: - An optional section of example(s) on how to run the command. - -Commands: - - - - - … - -Flags: - -- - - -- - - … -``` - -## Progress -Show progress for longer running commands visually. Visual feedback on longer -running commands is important so users don’t get confused if command is running -or the CLI is hang up resulting in user quitting. - -``` -Loading 0x1fd892083b3e2a4c...⠼ -``` - -## Feedback -Commands should provide feedback if there is no result to be presented. -If a command completes an operation that has no result to be shown it -should write out that command was executed. This is meant to assure the user -of the completion of the command. -If user is executing a destructive command they should be asked for approval -but this command should allow passing confirmation with a flag `--yes`. - -``` -💾 result saved to: account.txt -``` - -## Exit -CLI should return zero status unless it is shut down because of an error. -This will allow chaining of commands and interfacing with other cli. If a -command is long running then provide description how to exit it (e.g. "Press Ctrl+C to stop"). -``` -exit status 1 -``` - -## Colors -Base color should be white with yellow reserved for warnings and red for errors. -Blue color can be used to accent some commands but it shouldn’t be -used too much as it will confuse the user. - - -## Inspiration and Reference -https://clig.dev/ - -https://blog.developer.atlassian.com/10-design-principles-for-delightful-clis/ - -https://devcenter.heroku.com/articles/cli-style-guide - -https://eng.localytics.com/exploring-cli-best-practices/ - - - - - - - - - - -## Additional Notes - -Thank you for your interest in contributing to the Flow CLI! diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 57bc88a15..000000000 --- a/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/Makefile b/Makefile deleted file mode 100644 index 73e549e27..000000000 --- a/Makefile +++ /dev/null @@ -1,116 +0,0 @@ -# The short Git commit hash -SHORT_COMMIT := $(shell git rev-parse --short HEAD) -# The Git commit hash -COMMIT := $(shell git rev-parse HEAD) -# The tag of the current commit, otherwise empty -VERSION := $(shell git describe --tags --abbrev=0 --exact-match 2>/dev/null) -# Name of the cover profile -COVER_PROFILE := coverage.txt -# Disable go sum database lookup for private repos -GOPRIVATE := github.com/dapperlabs/* -# Ensure go bin path is in path (Especially for CI) -GOPATH ?= $(HOME)/go -PATH := $(PATH):$(GOPATH)/bin -# OS -UNAME := $(shell uname) - -MIXPANEL_PROJECT_TOKEN := 3fae49de272be1ceb8cf34119f747073 -ACCOUNT_TOKEN := lilico:sF60s3wughJBmNh2 - -BINARY ?= ./cmd/flow/flow - -.PHONY: binary -binary: $(BINARY) - -.PHONY: install-tools -install-tools: - cd ${GOPATH}; \ - mkdir -p ${GOPATH}; \ - GO111MODULE=on go install github.com/axw/gocov/gocov@latest; \ - GO111MODULE=on go install github.com/matm/gocov-html/cmd/gocov-html@latest; \ - GO111MODULE=on go install github.com/sanderhahn/gozip/cmd/gozip@latest; \ - GO111MODULE=on go install github.com/vektra/mockery/v2@v2.38.0; - -.PHONY: test -test: - GO111MODULE=on go test -coverprofile=$(COVER_PROFILE) $(if $(JSON_OUTPUT),-json,) ./... - cd flowkit; GO111MODULE=on go test -coverprofile=$(COVER_PROFILE) $(if $(JSON_OUTPUT),-json,) ./... - -.PHONY: test-e2e-emulator -test-e2e-emulator: - flow -f tests/flow.json emulator start - -.PHONY: coverage -coverage: -ifeq ($(COVER), true) - # file has to be called index.html - gocov convert $(COVER_PROFILE) > cover.json - ./cover-summary.sh - gocov-html cover.json > index.html - # coverage.zip will automatically be picked up by teamcity - gozip -c coverage.zip index.html -endif - -.PHONY: ci -ci: install-tools generate test coverage - -$(BINARY): - GO111MODULE=on go build \ - -trimpath \ - -ldflags \ - "-X github.com/onflow/flow-cli/build.commit=$(COMMIT) -X github.com/onflow/flow-cli/build.semver=$(VERSION) -X github.com/onflow/flow-cli/flowkit/util.MIXPANEL_PROJECT_TOKEN=${MIXPANEL_PROJECT_TOKEN} -X github.com/onflow/flow-cli/internal/accounts.accountToken=${ACCOUNT_TOKEN}"\ - -o $(BINARY) ./cmd/flow - -.PHONY: versioned-binaries -versioned-binaries: generate - $(MAKE) OS=linux ARCH=amd64 ARCHNAME=x86_64 versioned-binary - $(MAKE) OS=linux ARCH=arm64 versioned-binary - $(MAKE) OS=darwin ARCH=amd64 ARCHNAME=x86_64 versioned-binary - $(MAKE) OS=darwin ARCH=arm64 versioned-binary - $(MAKE) OS=windows ARCH=amd64 ARCHNAME=x86_64 versioned-binary - -.PHONY: versioned-binary -versioned-binary: - GOOS=$(OS) GOARCH=$(ARCH) $(MAKE) BINARY=./cmd/flow/flow-$(or ${ARCHNAME},${ARCHNAME},${ARCH})-$(OS)-$(VERSION) binary - -.PHONY: publish -publish: - gsutil -m cp cmd/flow/flow-*-$(VERSION) gs://flow-cli - -.PHONY: clean -clean: - rm ./cmd/flow/flow* - -.PHONY: install-linter -install-linter: - curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b ${GOPATH}/bin v1.47.2 - -.PHONY: lint -lint: generate - golangci-lint run -v ./... - -.PHONY: fix-lint -fix-lint: - golangci-lint run -v --fix ./... - -.PHONY: check-headers -check-headers: - @./check-headers.sh - -.PHONY: check-schema -check-schema: - cd flowkit && go run ./cmd/flow-schema/flow-schema.go --verify=true ./schema.json - -.PHONY: check-tidy -check-tidy: - go mod tidy - cd flowkit; go mod tidy - -.PHONY: generate-schema -generate-schema: - cd flowkit && go run ./cmd/flow-schema/flow-schema.go ./schema.json - -.PHONY: generate -generate: install-tools - cd flowkit; \ - go generate ./... diff --git a/NOTICE b/NOTICE deleted file mode 100644 index 6b0b28ebd..000000000 --- a/NOTICE +++ /dev/null @@ -1,4 +0,0 @@ -Flow CLI -Copyright 2019 Dapper Labs, Inc. - -This product includes software developed at Dapper Labs, Inc. (https://www.dapperlabs.com/). diff --git a/README.md b/README.md index 7ad666453..dc8ed2f0a 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,16 @@ -
-

- - Logo - +## Flowkit Package Design +Flowkit is a core package used by the CLI commands. It features APIs for interacting with the Flow network +in the context of flow.json configuration values. Flowkit is defined by the [interface here](services.go). -

- Flow CLI brings Flow to your terminal. Easily interact with the network and build your dapps. -
- Read the docs» -
-
- Report Bug - · - Contribute - · - Read Guidelines -

-

-
-
+Flowkit contains multiple subpackages, the most important ones are: +- **config**: parsing and storing of flow.json values, as well as validation, +- **gateway**: implementation of Flow AN methods, uses emulator as well as Go SDK to communicate with ANs, +- **project**: stateful operations on top of flow.json, which allows resolving imports in contracts used in deployments -## Installation +It is important we define clear boundaries between flowkit and other CLI packages. If we are in doubt where certain +methods should be implemented we must ask ourselves if the method provides value for any other consumers of the +pacakge or only provides utility for CLI usage, if it's only providing utility for CLI then it should be added inside +the internal package, instead of flowkit. If in doubt better to add things to internal package and then move to flowkit +if such need is identified. -To install the Flow CLI, follow the [installation instructions](https://developers.flow.com/tools/flow-cli/install) on the Flow documentation website. -## Documentation - -You can find the CLI documentation on the [CLI documentation website](https://developers.flow.com/tools/flow-cli). - -## Features -The Flow CLI is a command line tool that allows you to interact with the Flow blockchain. -Read about supported commands in the [CLI documentation website](https://developers.flow.com/tools/flow-cli). - -``` -Usage: - flow [command] - -👋 Welcome Flow developer! - If you are starting a new flow project try running 'flow setup '. - -🔥 Super Commands - dev Build your Flow project - flix Execute FLIX template with a given id, name, or local filename - generate Generate new boilerplate files - setup Start a new Flow project - -📦 Flow Entities - accounts Create and retrieve accounts and deploy contracts - blocks Retrieve blocks - collections Retrieve collections - events Retrieve events - -💬 Flow Interactions - scripts Execute Cadence scripts - transactions Build, sign, send and retrieve transactions - -🔨 Flow Tools - cadence Execute Cadence code - dev-wallet Run a development wallet - emulator Run Flow network for development - flowser Run Flowser project explorer - test Run Cadence tests - -🏄 Flow Project - deploy Deploy all project contracts - init Initialize a new configuration - project Manage your Cadence project - run Start emulator and deploy all project contracts - -🔒 Flow Security - keys Generate and decode Flow keys - signatures Signature verification and creation - -``` - -The Flow CLI includes several commands to interact with Flow networks, such as querying account information, or sending transactions. It also includes the [Flow Emulator](https://developers.flow.com/tools/emulator). - - -![Alt Text](./cli.gif) - -## Contributing - -Read [contributing](./CONTRIBUTING.md) document. diff --git a/SECURITY.md b/SECURITY.md deleted file mode 100644 index fb39955f7..000000000 --- a/SECURITY.md +++ /dev/null @@ -1,12 +0,0 @@ - -# Responsible Disclosure Policy - -Flow was built from the ground up with security in mind. Our code, infrastructure, and development methodology helps us keep our users safe. - -We really appreciate the community's help. Responsible disclosure of vulnerabilities helps to maintain the security and privacy of everyone. - -If you care about making a difference, please follow the guidelines below. - -# **Guidelines For Responsible Disclosure** - -We ask that all researchers adhere to these guidelines [here](https://docs.onflow.org/bounties/responsible-disclosure/) diff --git a/flowkit/accounts/account.go b/accounts/account.go similarity index 100% rename from flowkit/accounts/account.go rename to accounts/account.go diff --git a/flowkit/accounts/account_test.go b/accounts/account_test.go similarity index 100% rename from flowkit/accounts/account_test.go rename to accounts/account_test.go diff --git a/flowkit/accounts/keys.go b/accounts/keys.go similarity index 100% rename from flowkit/accounts/keys.go rename to accounts/keys.go diff --git a/flowkit/accounts/keys_test.go b/accounts/keys_test.go similarity index 100% rename from flowkit/accounts/keys_test.go rename to accounts/keys_test.go diff --git a/flowkit/arguments/arguments.go b/arguments/arguments.go similarity index 100% rename from flowkit/arguments/arguments.go rename to arguments/arguments.go diff --git a/flowkit/arguments/arguments_test.go b/arguments/arguments_test.go similarity index 100% rename from flowkit/arguments/arguments_test.go rename to arguments/arguments_test.go diff --git a/build/build.go b/build/build.go deleted file mode 100644 index a29f20da7..000000000 --- a/build/build.go +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Package build contains information about the build that injected at build-time. -// -// To use this package, simply import it in your program, then add build -// arguments like the following: -// -// go build -ldflags "-X github.com/onflow/flow-go/version.semver=v1.0.0" -package build - -// Default value for build-time-injected version strings. -const undefined = "undefined" - -// The following variables are injected at build-time using ldflags. -var ( - semver string - commit string -) - -// Semver returns the semantic version of this build. -func Semver() string { - return semver -} - -// Commit returns the commit at which this build was created. -func Commit() string { - return commit -} - -// IsDefined determines whether a version string is defined. Inputs should -// have been produced from this package. -func IsDefined(v string) bool { - return v != undefined -} - -// If any of the build-time-injected variables are empty at initialization, -// mark them as undefined. -func init() { - if len(semver) == 0 { - semver = undefined - } - if len(commit) == 0 { - commit = undefined - } -} diff --git a/check-headers.sh b/check-headers.sh deleted file mode 100755 index 1fa733940..000000000 --- a/check-headers.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/sh - -files=$(find . -name \*.go -type f -print0 | xargs -0 grep -L -E '(Licensed under the Apache License)|(Code generated (from|by))') -if [ -n "$files" ]; then - echo "Missing license header in:" - echo "$files" - exit 1 -fi \ No newline at end of file diff --git a/cli-banner.svg b/cli-banner.svg deleted file mode 100644 index 0660b8b8c..000000000 --- a/cli-banner.svg +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/cli.gif b/cli.gif deleted file mode 100644 index 75e7673a6682bc2738aed8b740f3e558a7c03e6c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2214743 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

XheWI{ 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

    i1leMq(_ zaR)zyl}Bnrh;d_qd>q(x+|C47q(+zvMRLZgsG2q48qR6|qTlx0yx>0&__6f`3& zLot-V*P*~PAv?LK8Hfl*4Lpd7%9^w(6gX*$DI!8%QjbhaLBd1CgRn-)Qn|KCiR4hc zbcjX>7!{b(!#8>gY6QH3xRVqKyh^+a!-0Tsbf{OH$2v2;Yb>qgK$CKLLes0Wa6GcYz!*WKVGY-S4SO&H2H6tkn6bdjA{fD^%D_fP zNsYbai@f*@0c;J@z$d@R2bKAdwO|Pm!3@pd47iXBy08nt6imd_hkcNT!^9raJWRrz z49irR6ln}YDT>of&DsOaxu}cipgYezi~pGbkFtNuy%C8)AbfFCn)s^OQx4lB4R1Bqhp3SuryKEFxuyNWnBCosDv-6IgN+ z<#0whVU#G@iiN9_J6Y1EII8{>691DbQ=9-3RDq>@Av;4slr-(QG1ZMm3DbGu(l`O6 zEM3lTQ9Mi`LoJCzq`Rv%T}mOHt4tX^F*zzY-4`5$04c3gA-R(+&7*UW6Hcj=DWTFf zp%+b+Dn

    J=N5~*bFXp5;wh5Fntt3MH5s7lqOkJGL%(SEtypr6HM*W)gTl(MVB?H z)fL23slZY?ozn-{yjx`n!-3U>c-B_EFR4INWi1jXZB!(snyCnM{m}Bs*QrQXis+ho-Pfc6QhKcj2EiGg zaaW7L*QXiRtXWucGq8+lwEu@7SiT@vk-?dY^_g~M2#vKFhOJj1MOc|RSdMiWoSB-A zJ(+)1Sd+CGd!2}v;VF(O*<~DAj)7ShT346Z*{14OZw1<*722UC+M+euqea@JRobOx z+NO2dr-j<6mD;JL+N!nMtHs)^)!MD)+OGB5uLaw%72B~TTgQF=LXg z8r*~EtuvYlHc5vr>k!jelBRfo`&-=572VO@t@Q#&HIlb`a5jvY++1ym%WJie8@ZDs z5qLN|JtW=S)!p579sh7VltGb<`2*aHv0FF#5=~pb_G^dtn-gUPnfl<}=#}2-4V~{g zw}JRXCnR18I)LLvmP~AllvoFJ=?UsJ-}6P^$PtRrz@DSz$L(DR#3MXpaZZP@hx}-V zGNGaL<=_7GU%PoopIHpJaito4zZvhYi!N>o#;0wlJD(REw zfmAt_TQPYGbl4JuE5BWPaK(NtVh>RxD5EWIYyT>K&`V za4H~`2mmNX%u?7Nx~7y+I}K3>0n-P1u;mD>h}ViMuOkaowus*{tPHHWVCFrcvN~Wk z&qpZ=1ViS-GBjc?tYnU6XCCEh9$m;?uyaY(=+V@taI#7%ipqtQ%gq%yc_SiZ2aPCCNQX{nif(AsdT5K5Xlv%^#7*7RHP3#SzET5#Mw&K%0DvcX-9bSX3LDS> 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 diff --git a/flowkit/cmd/flow-schema/flow-schema.go b/cmd/flow-schema/flow-schema.go similarity index 100% rename from flowkit/cmd/flow-schema/flow-schema.go rename to cmd/flow-schema/flow-schema.go diff --git a/cmd/flow/main.go b/cmd/flow/main.go deleted file mode 100644 index 79fd78961..000000000 --- a/cmd/flow/main.go +++ /dev/null @@ -1,163 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -// Package main implements the entry point for the Flow CLI. -package main - -import ( - "fmt" - "os" - "strings" - - "github.com/onflow/flow-cli/internal/dependencymanager" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/accounts" - "github.com/onflow/flow-cli/internal/blocks" - "github.com/onflow/flow-cli/internal/cadence" - "github.com/onflow/flow-cli/internal/collections" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/config" - "github.com/onflow/flow-cli/internal/emulator" - "github.com/onflow/flow-cli/internal/events" - "github.com/onflow/flow-cli/internal/keys" - "github.com/onflow/flow-cli/internal/project" - "github.com/onflow/flow-cli/internal/quick" - "github.com/onflow/flow-cli/internal/scripts" - "github.com/onflow/flow-cli/internal/settings" - "github.com/onflow/flow-cli/internal/signatures" - "github.com/onflow/flow-cli/internal/snapshot" - "github.com/onflow/flow-cli/internal/status" - "github.com/onflow/flow-cli/internal/super" - "github.com/onflow/flow-cli/internal/test" - "github.com/onflow/flow-cli/internal/tools" - "github.com/onflow/flow-cli/internal/transactions" - "github.com/onflow/flow-cli/internal/util" - "github.com/onflow/flow-cli/internal/version" -) - -func main() { - var cmd = &cobra.Command{ - Use: "flow", - TraverseChildren: true, - // Messaging for Cadence 1.0 upgrade - PersistentPreRun: func(cmd *cobra.Command, args []string) { - outputFlag, _ := cmd.Flags().GetString("output") - // If output is set to json, do not append any message - if outputFlag != "json" { - - width := 80 - url := "https://developers.flow.com/build/cadence-migration-guide" - - // Function to center text within a given width - centerText := func(text string, width int) string { - space := (width - len(text)) / 2 - if space < 0 { - space = 0 - } - return fmt.Sprintf("%s%s%s", strings.Repeat(" ", space), text, strings.Repeat(" ", space)) - } - - fmt.Fprintln(os.Stderr, strings.Repeat("+", width)) - fmt.Fprintln(os.Stderr, centerText("⚠ Upgrade to Cadence 1.0", width)) - fmt.Fprintln(os.Stderr, centerText("The Crescendo network upgrade, including Cadence 1.0, is coming soon.", width)) - fmt.Fprintln(os.Stderr, centerText("You may need to update your existing contracts to support this change.", width)) - fmt.Fprintln(os.Stderr, centerText("Please visit our migration guide here:", width)) - fmt.Fprintln(os.Stderr, centerText(url, width)) - fmt.Fprintln(os.Stderr, strings.Repeat("+", width)) - - } - }, - } - - // quick commands - quick.InitCommand.AddToParent(cmd) - quick.DeployCommand.AddToParent(cmd) - quick.RunCommand.AddToParent(cmd) - - // single commands - status.Command.AddToParent(cmd) - tools.DevWallet.AddToParent(cmd) - tools.Flowser.AddToParent(cmd) - test.TestCommand.AddToParent(cmd) - - // super commands - super.SetupCommand.AddToParent(cmd) - super.DevCommand.AddToParent(cmd) - - // structured commands - cmd.AddCommand(settings.Cmd) - cmd.AddCommand(cadence.Cmd) - cmd.AddCommand(version.Cmd) - cmd.AddCommand(emulator.Cmd) - cmd.AddCommand(accounts.Cmd) - cmd.AddCommand(scripts.Cmd) - cmd.AddCommand(transactions.Cmd) - cmd.AddCommand(keys.Cmd) - cmd.AddCommand(events.Cmd) - cmd.AddCommand(blocks.Cmd) - cmd.AddCommand(collections.Cmd) - cmd.AddCommand(project.Cmd) - cmd.AddCommand(config.Cmd) - cmd.AddCommand(signatures.Cmd) - cmd.AddCommand(snapshot.Cmd) - cmd.AddCommand(super.FlixCmd) - cmd.AddCommand(super.GenerateCommand) - cmd.AddCommand(dependencymanager.Cmd) - - command.InitFlags(cmd) - cmd.AddGroup(&cobra.Group{ - ID: "super", - Title: "🔥 Super Commands", - }) - cmd.AddGroup(&cobra.Group{ - ID: "resources", - Title: "📦 Flow Entities", - }) - cmd.AddGroup(&cobra.Group{ - ID: "interactions", - Title: "💬 Flow Interactions", - }) - cmd.AddGroup(&cobra.Group{ - ID: "tools", - Title: "🔨 Flow Tools", - }) - cmd.AddGroup(&cobra.Group{ - ID: "project", - Title: "🏄 Flow Project", - }) - cmd.AddGroup(&cobra.Group{ - ID: "security", - Title: "🔒 Flow Security", - }) - cmd.AddGroup(&cobra.Group{ - ID: "manager", - Title: "🔗 Dependency Manager", - }) - - cmd.SetUsageTemplate(command.UsageTemplate) - - if err := cmd.Execute(); err != nil { - util.Exit(1, err.Error()) - } - - if status := *test.TestCommand.Status; status > 0 { - os.Exit(int(status)) - } -} diff --git a/flowkit/config/account.go b/config/account.go similarity index 100% rename from flowkit/config/account.go rename to config/account.go diff --git a/flowkit/config/account_test.go b/config/account_test.go similarity index 100% rename from flowkit/config/account_test.go rename to config/account_test.go diff --git a/flowkit/config/config.go b/config/config.go similarity index 100% rename from flowkit/config/config.go rename to config/config.go diff --git a/flowkit/config/config_test.go b/config/config_test.go similarity index 100% rename from flowkit/config/config_test.go rename to config/config_test.go diff --git a/flowkit/config/contract.go b/config/contract.go similarity index 100% rename from flowkit/config/contract.go rename to config/contract.go diff --git a/flowkit/config/contract_test.go b/config/contract_test.go similarity index 100% rename from flowkit/config/contract_test.go rename to config/contract_test.go diff --git a/flowkit/config/dependency.go b/config/dependency.go similarity index 100% rename from flowkit/config/dependency.go rename to config/dependency.go diff --git a/flowkit/config/dependency_test.go b/config/dependency_test.go similarity index 100% rename from flowkit/config/dependency_test.go rename to config/dependency_test.go diff --git a/flowkit/config/deployment.go b/config/deployment.go similarity index 100% rename from flowkit/config/deployment.go rename to config/deployment.go diff --git a/flowkit/config/deployment_test.go b/config/deployment_test.go similarity index 100% rename from flowkit/config/deployment_test.go rename to config/deployment_test.go diff --git a/flowkit/config/emulator.go b/config/emulator.go similarity index 100% rename from flowkit/config/emulator.go rename to config/emulator.go diff --git a/flowkit/config/emulator_test.go b/config/emulator_test.go similarity index 100% rename from flowkit/config/emulator_test.go rename to config/emulator_test.go diff --git a/flowkit/config/json/account.go b/config/json/account.go similarity index 100% rename from flowkit/config/json/account.go rename to config/json/account.go diff --git a/flowkit/config/json/account_test.go b/config/json/account_test.go similarity index 100% rename from flowkit/config/json/account_test.go rename to config/json/account_test.go diff --git a/flowkit/config/json/config.go b/config/json/config.go similarity index 100% rename from flowkit/config/json/config.go rename to config/json/config.go diff --git a/flowkit/config/json/config_test.go b/config/json/config_test.go similarity index 100% rename from flowkit/config/json/config_test.go rename to config/json/config_test.go diff --git a/flowkit/config/json/contract.go b/config/json/contract.go similarity index 100% rename from flowkit/config/json/contract.go rename to config/json/contract.go diff --git a/flowkit/config/json/contract_test.go b/config/json/contract_test.go similarity index 100% rename from flowkit/config/json/contract_test.go rename to config/json/contract_test.go diff --git a/flowkit/config/json/dependency.go b/config/json/dependency.go similarity index 100% rename from flowkit/config/json/dependency.go rename to config/json/dependency.go diff --git a/flowkit/config/json/dependency_test.go b/config/json/dependency_test.go similarity index 100% rename from flowkit/config/json/dependency_test.go rename to config/json/dependency_test.go diff --git a/flowkit/config/json/deploy.go b/config/json/deploy.go similarity index 100% rename from flowkit/config/json/deploy.go rename to config/json/deploy.go diff --git a/flowkit/config/json/deploy_test.go b/config/json/deploy_test.go similarity index 100% rename from flowkit/config/json/deploy_test.go rename to config/json/deploy_test.go diff --git a/flowkit/config/json/emulator.go b/config/json/emulator.go similarity index 100% rename from flowkit/config/json/emulator.go rename to config/json/emulator.go diff --git a/flowkit/config/json/emulator_test.go b/config/json/emulator_test.go similarity index 100% rename from flowkit/config/json/emulator_test.go rename to config/json/emulator_test.go diff --git a/flowkit/config/json/network.go b/config/json/network.go similarity index 100% rename from flowkit/config/json/network.go rename to config/json/network.go diff --git a/flowkit/config/json/network_test.go b/config/json/network_test.go similarity index 100% rename from flowkit/config/json/network_test.go rename to config/json/network_test.go diff --git a/flowkit/config/json/schema.go b/config/json/schema.go similarity index 100% rename from flowkit/config/json/schema.go rename to config/json/schema.go diff --git a/flowkit/config/loader.go b/config/loader.go similarity index 100% rename from flowkit/config/loader.go rename to config/loader.go diff --git a/flowkit/config/loader_test.go b/config/loader_test.go similarity index 100% rename from flowkit/config/loader_test.go rename to config/loader_test.go diff --git a/flowkit/config/network.go b/config/network.go similarity index 100% rename from flowkit/config/network.go rename to config/network.go diff --git a/flowkit/config/network_test.go b/config/network_test.go similarity index 100% rename from flowkit/config/network_test.go rename to config/network_test.go diff --git a/flowkit/config/processor.go b/config/processor.go similarity index 100% rename from flowkit/config/processor.go rename to config/processor.go diff --git a/flowkit/config/processor_test.go b/config/processor_test.go similarity index 100% rename from flowkit/config/processor_test.go rename to config/processor_test.go diff --git a/coverage.txt b/coverage.txt new file mode 100644 index 000000000..dd4c5a821 --- /dev/null +++ b/coverage.txt @@ -0,0 +1,1136 @@ +mode: set +github.com/onflow/flow-cli/flowkit/config/json/account.go:45.61,47.26 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:47.26,49.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:51.2,51.53 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:51.53,53.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:55.2,55.40 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:59.92,67.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:67.16,69.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:70.2,70.20 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:70.20,73.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:75.2,79.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:79.16,81.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:82.2,85.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:85.16,87.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:88.2,88.27 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:88.27,90.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:92.2,93.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:93.16,95.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:97.2,101.8 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:106.80,108.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:108.16,110.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:112.2,112.34 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:112.34,114.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:116.2,117.21 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:117.21,119.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:121.2,122.23 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:122.23,124.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:125.2,125.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:125.29,127.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:129.2,132.8 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:136.96,138.25 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:138.25,140.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:142.2,142.49 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:142.49,144.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:146.2,147.26 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:147.26,149.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:151.2,151.45 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:151.45,153.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:155.2,156.46 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:156.46,158.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:161.2,162.81 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:162.81,163.14 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:163.14,164.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:166.3,166.10 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:166.10,168.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:169.3,169.13 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:172.2,173.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:173.16,175.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:177.2,184.20 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:185.25,186.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:186.29,188.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:190.3,191.17 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:191.17,193.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:194.3,194.21 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:194.21,197.4 2 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:199.3,203.17 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:203.17,205.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:207.3,207.24 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:208.27,209.27 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:209.27,211.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:212.3,214.31 3 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:214.31,216.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:218.31,219.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:219.29,221.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:222.3,222.36 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:224.26,225.27 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:225.27,227.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:228.3,228.52 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:231.2,235.8 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:239.68,242.32 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:242.32,245.29 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:245.29,247.18 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:247.18,249.5 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:250.9,252.18 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:252.18,254.5 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:257.3,257.40 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:260.2,260.22 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:264.69,267.29 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:267.29,268.24 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:268.24,270.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:270.9,272.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:275.2,275.21 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:278.61,280.21 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:280.21,282.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:284.2,289.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:292.63,299.2 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:301.67,306.20 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:306.20,308.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:310.2,310.42 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:310.42,312.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:314.2,314.44 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:314.44,316.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:318.2,318.18 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:319.25,321.20 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:321.20,323.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:324.27,326.50 2 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:327.31,328.42 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:329.26,330.56 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:333.2,333.20 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:390.49,393.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:393.16,395.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:397.2,397.24 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:397.24,398.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:399.15,400.34 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:401.11,402.36 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:406.2,406.27 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:407.14,408.27 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:409.10,410.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:414.49,417.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:417.16,419.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/account.go:421.2,421.16 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:422.20,425.20 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:427.26,433.4 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:435.28,443.72 4 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:445.22,448.24 3 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:451.2,451.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:454.48,455.35 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:455.35,457.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:459.2,459.33 1 1 +github.com/onflow/flow-cli/flowkit/config/json/account.go:462.50,485.2 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:37.66,39.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:39.16,41.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:43.2,44.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:44.16,46.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:48.2,49.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:49.16,51.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:53.2,54.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:54.16,56.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:58.2,59.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:59.16,61.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:63.2,71.18 2 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:74.62,82.2 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:89.39,93.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:93.16,95.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:97.2,97.22 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:97.22,99.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:101.2,101.14 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:108.26,110.2 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:113.65,116.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:116.16,118.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:120.2,120.18 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:124.66,126.26 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:126.26,128.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:130.2,132.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:132.16,134.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/config.go:136.2,136.37 1 1 +github.com/onflow/flow-cli/flowkit/config/json/config.go:140.56,142.2 1 0 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:35.70,38.33 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:38.33,39.21 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:39.21,46.4 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:46.9,51.51 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:51.51,53.37 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:53.37,55.6 1 0 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:57.5,57.43 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:59.4,59.43 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:63.2,63.23 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:67.73,70.30 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:70.30,72.21 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:72.21,76.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:76.9,79.36 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:79.36,81.5 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:83.4,88.5 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:92.2,92.22 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:107.54,113.16 4 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:113.16,116.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:119.2,120.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:120.16,123.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:123.8,125.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:127.2,127.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:130.53,131.20 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:131.20,133.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:133.8,135.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/contract.go:138.55,152.2 1 0 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:35.74,38.38 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:38.38,41.47 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:41.47,48.39 3 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:48.39,49.30 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:49.30,57.6 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:57.11,59.49 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:59.49,61.21 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:61.21,63.8 1 0 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:65.7,66.21 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:66.21,68.8 1 0 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:70.7,70.38 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:73.6,79.7 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:83.4,84.45 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:88.2,88.25 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:92.87,95.38 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:95.38,98.33 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:98.33,99.24 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:99.24,103.5 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:103.10,105.32 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:105.32,106.29 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:107.18,111.9 1 0 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:112.14,116.9 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:120.5,125.7 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:129.3,129.42 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:129.42,131.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:131.9,135.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:139.2,139.20 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:154.52,159.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:159.16,162.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:165.2,167.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:167.16,169.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:169.8,171.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:173.2,173.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:176.51,177.20 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:177.20,179.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:179.8,181.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/deploy.go:184.53,198.2 1 0 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:30.70,33.25 2 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:33.25,34.35 1 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:34.35,36.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:38.3,44.42 2 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:47.2,47.23 1 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:51.73,54.30 2 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:54.30,55.34 1 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:55.34,56.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:58.3,61.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/emulator.go:64.2,64.22 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:36.68,39.32 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:39.32,40.52 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:40.52,42.18 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:42.18,44.5 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:46.4,50.6 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:51.9,51.33 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:51.33,56.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:56.9,58.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:61.2,61.22 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:65.69,68.29 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:68.29,69.18 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:69.18,71.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:71.9,73.4 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:76.2,76.21 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:79.65,85.2 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:87.67,94.2 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:110.53,113.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:113.16,116.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:119.2,121.16 3 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:121.16,124.3 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:126.2,126.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:129.52,130.35 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:130.35,132.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:134.2,134.33 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:138.45,140.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:140.16,142.3 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:144.2,145.16 2 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:145.16,147.3 1 0 +github.com/onflow/flow-cli/flowkit/config/json/network.go:149.2,149.12 1 1 +github.com/onflow/flow-cli/flowkit/config/json/network.go:152.54,169.2 1 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:25.42,32.47 3 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:32.47,33.35 1 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:33.35,36.4 2 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:37.3,37.18 1 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:37.18,39.4 1 0 +github.com/onflow/flow-cli/flowkit/config/json/schema.go:41.2,43.15 2 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:40.57,42.2 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:44.63,46.16 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:46.16,48.3 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:49.2,49.12 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:55.54,60.16 4 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:60.16,62.3 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:64.2,65.26 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:65.26,67.3 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:68.2,68.25 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:75.108,87.32 8 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:87.32,88.47 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:88.47,90.4 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:93.2,94.38 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:94.38,95.53 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:95.53,97.4 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:100.2,101.32 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:101.32,103.36 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:103.36,104.71 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:104.71,106.5 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:110.2,110.26 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:110.26,112.3 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:114.2,114.37 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:114.37,116.3 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:118.2,119.16 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:119.16,121.3 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:123.2,123.42 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:123.42,127.34 3 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:127.34,128.48 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:128.48,130.5 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:131.9,131.55 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:131.55,132.48 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:132.48,134.5 1 0 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:137.3,138.17 2 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:138.17,144.4 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:146.3,146.41 1 1 +github.com/onflow/flow-cli/flowkit/arguments/arguments.go:148.2,148.24 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:39.56,41.44 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:41.44,43.17 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:43.17,45.4 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:46.3,46.36 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:49.2,49.22 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:52.50,55.35 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:55.35,57.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:59.2,59.21 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:62.59,64.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:64.16,66.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:68.2,72.8 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:75.47,77.24 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:77.24,79.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:81.2,85.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:88.109,91.16 3 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:91.16,93.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:95.2,96.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:96.16,98.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:100.2,104.8 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:111.46,113.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:113.16,115.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:117.2,117.20 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:117.20,119.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/account.go:121.2,121.25 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:121.25,122.23 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:122.23,124.4 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:127.2,127.12 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:130.36,132.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:134.37,136.25 2 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:136.25,138.3 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:139.2,139.17 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:143.69,144.19 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:144.19,145.30 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:145.30,147.4 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:150.2,150.96 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:154.57,155.19 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:155.19,156.24 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:156.24,158.4 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:161.2,161.90 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:165.50,166.25 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:166.25,167.31 1 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:167.31,170.4 2 1 +github.com/onflow/flow-cli/flowkit/accounts/account.go:173.2,173.27 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:74.67,75.29 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:76.25,77.42 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:78.27,79.44 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:80.31,81.42 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:82.26,83.43 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:86.2,86.71 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:96.67,103.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:105.41,107.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:109.55,110.51 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:110.51,112.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:113.2,113.18 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:116.51,117.47 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:117.47,119.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:120.2,120.19 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:123.31,125.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:127.36,129.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:138.47,146.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:148.69,150.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:150.16,152.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:154.2,158.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:158.16,160.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:162.2,162.30 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:165.35,167.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:169.59,171.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:176.55,178.29 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:178.29,180.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:182.2,183.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:183.16,185.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:187.2,188.20 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:188.20,192.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:194.2,197.16 3 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:197.16,199.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:201.2,208.12 5 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:211.59,213.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:213.16,215.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:217.2,225.8 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:238.11,248.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:250.70,255.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:257.69,259.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:261.59,263.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:265.47,273.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:275.35,277.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:277.16,279.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:281.2,281.12 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:284.41,286.2 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:289.72,294.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:304.12,314.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:325.70,327.16 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:327.16,329.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:331.2,331.53 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:334.60,335.25 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:335.25,337.17 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:337.17,339.4 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:340.3,341.17 2 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:341.17,343.4 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:344.3,344.22 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:346.2,346.27 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:349.48,356.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:366.61,377.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:379.71,381.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:381.16,383.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:385.2,385.54 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:388.61,389.25 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:389.25,391.17 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:391.17,393.4 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:395.2,395.27 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:398.49,408.2 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:410.37,412.40 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:412.40,414.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:416.2,417.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:417.16,419.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:421.2,423.36 3 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:423.36,425.3 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:426.2,427.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:427.16,429.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:431.2,431.35 1 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:431.35,434.17 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:434.17,436.4 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:438.2,439.16 2 1 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:439.16,441.3 1 0 +github.com/onflow/flow-cli/flowkit/accounts/keys.go:442.2,442.12 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:57.62,64.2 1 0 +github.com/onflow/flow-cli/flowkit/config/account.go:66.39,71.2 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:74.58,75.29 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:75.29,76.27 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:76.27,78.4 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:81.2,81.86 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:85.62,86.37 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:86.37,87.35 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:87.35,90.4 2 1 +github.com/onflow/flow-cli/flowkit/config/account.go:93.2,93.26 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:97.40,98.29 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:98.29,99.27 1 1 +github.com/onflow/flow-cli/flowkit/config/account.go:99.27,101.4 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:53.35,54.34 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:54.34,55.37 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:55.37,57.41 2 1 +github.com/onflow/flow-cli/flowkit/config/config.go:57.41,59.5 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:63.2,63.33 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:63.33,64.65 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:64.65,66.4 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:69.2,69.34 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:69.34,70.57 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:70.57,72.4 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:74.3,74.35 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:74.35,75.58 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:75.58,77.5 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:80.3,80.57 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:80.57,82.4 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:85.2,85.12 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:89.24,94.2 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:100.41,102.2 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:105.26,107.16 2 1 +github.com/onflow/flow-cli/flowkit/config/config.go:107.16,109.3 1 0 +github.com/onflow/flow-cli/flowkit/config/config.go:111.2,111.51 1 1 +github.com/onflow/flow-cli/flowkit/config/config.go:115.30,120.2 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:43.52,44.27 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:44.27,45.31 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:45.31,47.4 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:50.2,50.12 1 0 +github.com/onflow/flow-cli/flowkit/config/contract.go:53.61,54.27 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:54.27,55.31 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:55.31,57.4 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:59.2,62.4 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:68.37,70.2 1 0 +github.com/onflow/flow-cli/flowkit/config/contract.go:73.60,74.30 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:74.30,75.28 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:75.28,77.4 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:80.2,80.60 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:84.52,85.38 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:85.38,86.45 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:86.45,89.4 2 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:92.2,92.27 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:96.47,97.42 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:97.42,99.3 1 0 +github.com/onflow/flow-cli/flowkit/config/contract.go:101.2,101.30 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:101.30,102.28 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:102.28,104.4 1 1 +github.com/onflow/flow-cli/flowkit/config/contract.go:107.2,107.12 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:42.63,43.32 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:43.32,44.30 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:44.30,46.4 1 0 +github.com/onflow/flow-cli/flowkit/config/deployment.go:49.2,49.45 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:53.58,54.39 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:54.39,55.36 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:55.36,57.4 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:64.41,66.2 1 0 +github.com/onflow/flow-cli/flowkit/config/deployment.go:69.61,72.28 2 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:72.28,73.32 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:73.32,75.4 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:78.2,78.20 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:82.87,83.28 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:83.28,84.61 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:84.61,86.4 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:89.2,89.12 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:93.58,94.40 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:94.40,96.53 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:96.53,99.4 2 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:102.2,102.29 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:106.68,108.23 2 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:108.23,114.3 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:116.2,116.32 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:116.32,117.69 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:117.69,119.4 1 1 +github.com/onflow/flow-cli/flowkit/config/deployment.go:122.2,122.12 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:40.41,41.24 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:41.24,42.38 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:42.38,44.4 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:47.2,47.12 1 0 +github.com/onflow/flow-cli/flowkit/config/emulator.go:51.65,52.38 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:52.38,53.36 1 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:53.36,56.4 2 1 +github.com/onflow/flow-cli/flowkit/config/emulator.go:59.2,59.27 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:32.31,34.24 2 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:34.24,36.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:37.2,37.22 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:56.58,57.28 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:57.28,58.39 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:58.39,60.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:63.2,63.12 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:74.51,78.2 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:81.49,83.2 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:86.56,91.25 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:91.25,93.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:95.2,96.16 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:96.16,98.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:100.2,101.16 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:101.16,103.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:105.2,105.12 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:108.63,112.16 3 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:112.16,114.3 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:116.2,117.16 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:117.16,119.3 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:121.2,122.25 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:122.25,124.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:126.2,126.47 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:133.56,136.26 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:136.26,138.17 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:138.17,140.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:141.3,141.39 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:141.39,143.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:145.3,146.17 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:146.17,148.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:148.9,150.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:153.2,154.33 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:154.33,156.17 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:156.17,158.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:160.3,160.22 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:160.22,162.12 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:165.3,165.34 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:169.2,169.21 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:169.21,171.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:173.2,173.32 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:177.57,179.2 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:182.65,185.16 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:185.16,187.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:189.2,189.22 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:193.64,195.40 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:195.40,197.3 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:198.2,198.40 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:198.40,200.3 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:201.2,201.42 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:201.42,203.3 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:204.2,204.46 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:204.46,206.3 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:210.56,213.16 2 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:213.16,214.25 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:214.25,216.4 1 1 +github.com/onflow/flow-cli/flowkit/config/loader.go:218.3,218.18 1 0 +github.com/onflow/flow-cli/flowkit/config/loader.go:221.2,221.17 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:61.58,62.29 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:62.29,63.27 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:63.27,65.4 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:68.2,68.82 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:72.49,73.37 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:73.37,74.43 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:74.43,77.4 2 1 +github.com/onflow/flow-cli/flowkit/config/network.go:80.2,80.26 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:84.46,86.16 2 1 +github.com/onflow/flow-cli/flowkit/config/network.go:86.16,88.3 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:90.2,90.29 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:90.29,91.27 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:91.27,93.4 1 1 +github.com/onflow/flow-cli/flowkit/config/network.go:96.2,96.12 1 1 +github.com/onflow/flow-cli/flowkit/config/processor.go:27.47,38.16 4 1 +github.com/onflow/flow-cli/flowkit/config/processor.go:38.16,40.3 1 1 +github.com/onflow/flow-cli/flowkit/config/processor.go:42.2,43.16 2 1 +github.com/onflow/flow-cli/flowkit/config/processor.go:43.16,45.3 1 0 +github.com/onflow/flow-cli/flowkit/config/processor.go:47.2,47.17 1 1 +github.com/onflow/flow-cli/flowkit/project/contract.go:43.13,52.2 1 1 +github.com/onflow/flow-cli/flowkit/project/contract.go:54.34,56.2 1 1 +github.com/onflow/flow-cli/flowkit/project/contract.go:58.41,60.2 1 1 +github.com/onflow/flow-cli/flowkit/project/contract.go:62.38,64.2 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:37.37,39.2 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:41.78,43.2 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:59.89,66.37 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:66.37,68.17 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:68.17,70.4 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:73.2,73.24 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:76.52,78.16 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:78.16,80.3 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:82.2,93.12 5 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:101.50,102.24 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:102.24,104.3 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:106.2,107.16 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:107.16,109.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:111.2,112.16 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:112.16,114.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:116.2,117.27 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:117.27,119.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:121.2,121.23 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:125.44,127.32 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:127.32,128.40 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:128.40,130.4 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:131.3,131.22 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:134.2,134.14 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:138.48,139.39 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:139.39,140.55 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:140.55,144.14 3 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:144.14,146.13 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:149.4,150.20 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:150.20,152.13 2 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:156.4,156.50 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:156.50,157.13 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:159.4,159.48 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:159.48,160.13 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:163.4,167.5 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:171.2,171.12 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:181.84,184.30 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:184.30,186.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:188.2,188.30 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:188.30,189.38 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:189.38,191.4 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:194.2,195.16 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:195.16,196.32 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:197.25,198.75 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:199.11,200.19 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:204.2,204.38 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:207.71,210.26 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:210.26,212.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:214.2,214.18 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:217.61,220.26 2 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:220.26,222.3 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:224.2,224.18 1 1 +github.com/onflow/flow-cli/flowkit/project/deployment.go:233.56,236.33 2 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:236.33,238.34 2 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:238.34,240.4 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:242.3,242.37 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:245.2,245.15 1 0 +github.com/onflow/flow-cli/flowkit/project/deployment.go:248.44,253.2 1 0 +github.com/onflow/flow-cli/flowkit/project/imports.go:39.88,44.2 1 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:46.70,50.30 3 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:50.30,54.13 3 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:54.13,56.12 2 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:59.3,60.19 2 0 +github.com/onflow/flow-cli/flowkit/project/imports.go:60.19,62.12 2 0 +github.com/onflow/flow-cli/flowkit/project/imports.go:65.3,65.89 1 0 +github.com/onflow/flow-cli/flowkit/project/imports.go:68.2,68.21 1 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:72.68,74.39 2 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:74.39,78.3 2 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:80.2,80.40 1 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:80.40,82.3 1 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:84.2,84.24 1 1 +github.com/onflow/flow-cli/flowkit/project/imports.go:87.57,89.2 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:38.87,40.16 2 1 +github.com/onflow/flow-cli/flowkit/project/program.go:40.16,42.3 1 0 +github.com/onflow/flow-cli/flowkit/project/program.go:44.2,49.8 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:56.38,59.70 2 1 +github.com/onflow/flow-cli/flowkit/project/program.go:59.70,62.21 2 1 +github.com/onflow/flow-cli/flowkit/project/program.go:62.21,64.4 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:67.2,67.16 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:70.37,72.2 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:74.66,87.2 9 1 +github.com/onflow/flow-cli/flowkit/project/program.go:89.37,91.2 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:93.33,95.2 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:97.42,99.91 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:99.91,101.3 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:103.2,103.76 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:103.76,104.73 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:104.73,106.4 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:109.2,109.76 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:109.76,110.73 1 0 +github.com/onflow/flow-cli/flowkit/project/program.go:110.73,112.4 1 0 +github.com/onflow/flow-cli/flowkit/project/program.go:115.2,115.60 1 1 +github.com/onflow/flow-cli/flowkit/project/program.go:118.28,120.16 2 1 +github.com/onflow/flow-cli/flowkit/project/program.go:120.16,122.3 1 0 +github.com/onflow/flow-cli/flowkit/project/program.go:124.2,124.27 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:37.25,41.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:44.59,46.16 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:46.16,48.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:50.2,51.16 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:51.16,53.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:55.2,59.16 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:63.107,73.2 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:81.25,86.2 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:89.92,94.2 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:102.25,120.27 5 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:120.27,123.3 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:127.2,128.27 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:128.27,131.3 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:133.2,139.16 6 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:139.16,141.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:142.2,144.15 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:152.25,154.16 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:154.16,156.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:157.2,157.42 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:160.100,164.16 3 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:164.16,166.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:167.2,170.16 3 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:181.50,183.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:186.48,188.2 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:191.59,193.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:195.84,198.2 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:201.66,202.24 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:202.24,204.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:206.2,207.16 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:207.16,209.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:211.2,211.37 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:211.37,219.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:221.2,222.12 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:226.56,230.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:233.70,234.37 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:234.37,235.19 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:235.19,237.4 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:240.2,240.14 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:244.79,245.36 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:245.36,247.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:249.2,258.12 4 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:262.67,265.2 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:268.73,271.2 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:274.66,277.2 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:280.64,281.27 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:281.27,283.17 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:283.17,285.4 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:288.2,288.12 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:292.60,294.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:297.88,299.16 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:299.16,301.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:304.2,305.28 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:305.28,307.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:309.2,311.36 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:311.36,313.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:313.8,319.3 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:321.2,321.44 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:321.44,327.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:329.2,329.41 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:329.41,331.3 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:333.2,333.15 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:337.52,340.16 3 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:340.16,342.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:344.2,344.28 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:344.28,346.17 2 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:346.17,348.4 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:349.8,351.17 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:351.17,353.4 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:356.2,356.15 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:360.49,362.2 1 1 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:366.63,372.2 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:384.53,386.34 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:386.34,388.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:390.2,394.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:398.53,401.51 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:401.51,402.28 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:402.28,403.37 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:403.37,405.5 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:407.3,407.31 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:410.2,411.37 2 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:411.37,413.3 1 0 +github.com/onflow/flow-cli/flowkit/transactions/transaction.go:414.2,416.13 2 0 +github.com/onflow/flow-cli/flowkit/events.go:31.44,32.56 1 1 +github.com/onflow/flow-cli/flowkit/events.go:32.56,35.3 2 1 +github.com/onflow/flow-cli/flowkit/events.go:37.2,37.12 1 0 +github.com/onflow/flow-cli/flowkit/events.go:42.63,44.34 2 1 +github.com/onflow/flow-cli/flowkit/events.go:44.34,46.3 1 1 +github.com/onflow/flow-cli/flowkit/events.go:48.2,48.15 1 1 +github.com/onflow/flow-cli/flowkit/events.go:51.39,54.57 2 1 +github.com/onflow/flow-cli/flowkit/events.go:54.57,56.3 1 1 +github.com/onflow/flow-cli/flowkit/events.go:57.2,58.44 2 1 +github.com/onflow/flow-cli/flowkit/events.go:58.44,60.3 1 1 +github.com/onflow/flow-cli/flowkit/events.go:62.2,65.3 1 1 +github.com/onflow/flow-cli/flowkit/events.go:68.56,70.27 2 1 +github.com/onflow/flow-cli/flowkit/events.go:70.27,71.45 1 1 +github.com/onflow/flow-cli/flowkit/events.go:71.45,73.4 1 1 +github.com/onflow/flow-cli/flowkit/events.go:76.2,76.18 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:67.54,68.23 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:68.23,70.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:71.2,71.63 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:71.63,73.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:74.2,74.51 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:74.51,76.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:78.2,78.110 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:105.12,107.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:116.44,118.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:120.45,122.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:124.51,126.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:128.43,129.20 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:129.20,131.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:132.2,132.21 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:135.32,137.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:140.94,142.2 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:152.43,154.25 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:154.25,155.20 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:155.20,157.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:159.3,167.17 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:167.17,169.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:171.3,171.36 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:174.2,175.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:175.16,177.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:179.2,180.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:180.16,182.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:184.2,189.16 5 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:189.16,191.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:193.2,197.16 4 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:197.16,199.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:201.2,201.25 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:201.25,203.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:205.2,207.33 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:207.33,209.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:211.2,212.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:212.16,214.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:216.2,216.34 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:223.38,225.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:225.16,227.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:229.2,230.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:230.16,232.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:234.2,235.69 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:235.69,237.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:239.2,240.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:240.16,242.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:244.2,244.16 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:251.65,252.48 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:252.48,254.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:267.34,269.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:269.16,271.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:273.2,274.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:274.16,276.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:278.2,278.26 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:278.26,280.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:280.17,282.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:284.3,290.17 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:290.17,292.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:295.2,296.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:296.16,298.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:300.2,306.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:306.16,308.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:310.2,315.16 4 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:315.16,317.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:318.2,321.32 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:321.32,323.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:325.2,326.31 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:326.31,328.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:330.2,330.30 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:330.30,332.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:332.17,334.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:337.2,338.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:338.16,340.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:343.2,344.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:344.16,346.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:348.2,348.12 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:348.12,350.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:350.8,352.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:355.2,356.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:356.16,358.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:359.2,359.22 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:359.22,361.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:363.2,368.14 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:368.14,370.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:370.8,377.3 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:380.2,380.54 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:380.54,385.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:387.2,387.41 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:397.28,400.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:400.16,402.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:404.2,405.55 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:405.55,411.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:413.2,414.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:414.16,416.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:418.2,419.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:419.16,421.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:423.2,429.16 4 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:429.16,431.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:433.2,434.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:434.16,436.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:437.2,437.36 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:437.36,439.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:441.2,443.25 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:447.86,450.18 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:450.18,452.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:452.8,452.28 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:452.28,454.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:454.8,456.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:458.2,458.16 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:458.16,460.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:462.2,462.18 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:462.18,464.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:466.2,466.19 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:470.98,472.2 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:486.31,487.29 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:487.29,489.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:491.2,491.19 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:491.19,496.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:498.2,505.36 5 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:505.36,507.13 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:507.13,510.4 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:515.2,515.12 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:515.12,518.3 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:520.2,520.12 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:520.12,522.33 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:522.33,524.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:527.2,528.35 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:528.35,529.29 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:529.29,531.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:533.3,533.61 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:536.2,536.26 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:539.102,540.25 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:540.25,542.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:542.17,544.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:545.3,545.49 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:559.26,561.31 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:561.31,564.37 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:564.37,566.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:567.3,567.32 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:567.32,573.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:574.3,574.39 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:576.2,576.16 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:584.30,587.21 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:587.21,590.17 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:590.17,592.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:595.2,596.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:596.16,598.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:600.2,600.24 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:610.38,612.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:612.16,614.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:615.2,616.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:616.16,618.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:620.2,620.38 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:620.38,622.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:624.2,627.16 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:627.16,629.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:631.2,631.27 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:639.30,640.38 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:640.38,642.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:644.2,646.66 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:653.30,655.20 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:655.20,657.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:659.2,659.26 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:659.26,661.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:663.2,664.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:664.16,666.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:668.2,669.34 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:669.34,671.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:671.8,671.46 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:671.46,673.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:675.2,676.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:676.16,678.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:680.2,680.25 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:680.25,683.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:683.17,685.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:687.2,688.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:688.16,690.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:691.2,691.24 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:699.106,701.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:701.16,703.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:705.2,706.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:706.16,708.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:710.2,711.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:711.16,713.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:715.2,716.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:716.16,718.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:720.2,728.34 4 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:728.34,730.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:730.17,732.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:734.3,740.52 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:740.52,746.12 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:747.9,747.24 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:747.24,749.12 2 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:752.3,758.5 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:761.2,761.34 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:761.34,763.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:765.2,766.20 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:773.89,774.24 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:774.24,776.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:777.2,777.61 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:780.63,782.2 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:784.49,786.32 2 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:786.32,788.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:789.2,789.12 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:803.109,805.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:805.16,807.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:809.2,810.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:810.16,812.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:814.2,814.26 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:814.26,816.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:816.17,818.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:820.3,825.19 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:825.19,827.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:828.3,828.39 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:828.39,830.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:831.3,831.28 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:831.28,833.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:835.3,836.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:836.17,838.4 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:841.2,841.18 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:841.18,843.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:843.8,843.37 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:843.37,845.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:845.8,847.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:855.55,860.16 4 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:860.16,862.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:864.2,864.14 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:864.14,867.3 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:869.2,870.24 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:876.59,878.16 2 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:878.16,880.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:882.2,883.16 2 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:883.16,885.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:886.2,886.23 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:898.38,900.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:900.16,902.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:904.2,905.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:905.16,907.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:909.2,910.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:910.16,912.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:914.2,920.16 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:920.16,922.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:924.2,924.26 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:924.26,925.39 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:925.39,927.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:928.3,928.28 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:928.28,930.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:932.3,933.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:933.17,935.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:937.3,943.17 3 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:943.17,945.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:948.2,948.74 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:948.74,950.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:952.2,952.74 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:952.74,954.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:956.2,957.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:957.16,959.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:961.2,961.16 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:971.38,973.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:973.16,975.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:977.2,978.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:978.16,980.3 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:982.2,982.18 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:991.55,993.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:993.16,995.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:997.2,998.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:998.16,1000.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:1002.2,1002.25 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1012.55,1020.16 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1020.16,1022.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:1024.2,1024.44 1 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1024.44,1026.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1026.17,1028.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:1030.3,1031.17 2 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1031.17,1033.4 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:1036.2,1041.16 5 1 +github.com/onflow/flow-cli/flowkit/flowkit.go:1041.16,1043.3 1 0 +github.com/onflow/flow-cli/flowkit/flowkit.go:1045.2,1051.25 5 1 +github.com/onflow/flow-cli/flowkit/state.go:52.45,54.2 1 0 +github.com/onflow/flow-cli/flowkit/state.go:57.57,59.2 1 0 +github.com/onflow/flow-cli/flowkit/state.go:62.37,64.2 1 1 +github.com/onflow/flow-cli/flowkit/state.go:67.50,69.52 1 1 +github.com/onflow/flow-cli/flowkit/state.go:69.52,71.3 1 1 +github.com/onflow/flow-cli/flowkit/state.go:73.2,73.33 1 1 +github.com/onflow/flow-cli/flowkit/state.go:73.33,75.17 2 1 +github.com/onflow/flow-cli/flowkit/state.go:75.17,77.4 1 1 +github.com/onflow/flow-cli/flowkit/state.go:77.9,79.4 1 1 +github.com/onflow/flow-cli/flowkit/state.go:82.2,82.25 1 1 +github.com/onflow/flow-cli/flowkit/state.go:86.41,90.16 3 1 +github.com/onflow/flow-cli/flowkit/state.go:90.16,92.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:94.2,94.12 1 1 +github.com/onflow/flow-cli/flowkit/state.go:98.45,100.2 1 1 +github.com/onflow/flow-cli/flowkit/state.go:103.51,105.2 1 1 +github.com/onflow/flow-cli/flowkit/state.go:108.47,110.2 1 1 +github.com/onflow/flow-cli/flowkit/state.go:113.47,115.2 1 1 +github.com/onflow/flow-cli/flowkit/state.go:118.41,120.2 1 0 +github.com/onflow/flow-cli/flowkit/state.go:123.69,125.21 2 1 +github.com/onflow/flow-cli/flowkit/state.go:125.21,127.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:129.2,129.51 1 1 +github.com/onflow/flow-cli/flowkit/state.go:133.62,136.2 2 1 +github.com/onflow/flow-cli/flowkit/state.go:142.99,146.68 2 1 +github.com/onflow/flow-cli/flowkit/state.go:146.68,148.17 2 1 +github.com/onflow/flow-cli/flowkit/state.go:148.17,150.4 1 0 +github.com/onflow/flow-cli/flowkit/state.go:153.3,153.55 1 1 +github.com/onflow/flow-cli/flowkit/state.go:153.55,155.18 2 1 +github.com/onflow/flow-cli/flowkit/state.go:155.18,157.5 1 0 +github.com/onflow/flow-cli/flowkit/state.go:159.4,162.46 2 1 +github.com/onflow/flow-cli/flowkit/state.go:162.46,167.5 1 0 +github.com/onflow/flow-cli/flowkit/state.go:169.4,170.18 2 1 +github.com/onflow/flow-cli/flowkit/state.go:170.18,172.5 1 0 +github.com/onflow/flow-cli/flowkit/state.go:174.4,183.43 2 1 +github.com/onflow/flow-cli/flowkit/state.go:187.2,187.23 1 1 +github.com/onflow/flow-cli/flowkit/state.go:191.79,195.38 3 1 +github.com/onflow/flow-cli/flowkit/state.go:195.38,196.80 1 1 +github.com/onflow/flow-cli/flowkit/state.go:196.80,197.60 1 1 +github.com/onflow/flow-cli/flowkit/state.go:197.60,199.5 1 0 +github.com/onflow/flow-cli/flowkit/state.go:200.4,200.29 1 1 +github.com/onflow/flow-cli/flowkit/state.go:200.29,202.5 1 1 +github.com/onflow/flow-cli/flowkit/state.go:205.2,205.14 1 1 +github.com/onflow/flow-cli/flowkit/state.go:209.83,213.44 2 1 +github.com/onflow/flow-cli/flowkit/state.go:213.44,214.78 1 1 +github.com/onflow/flow-cli/flowkit/state.go:214.78,218.4 3 1 +github.com/onflow/flow-cli/flowkit/state.go:221.2,221.16 1 1 +github.com/onflow/flow-cli/flowkit/state.go:225.80,231.16 4 1 +github.com/onflow/flow-cli/flowkit/state.go:231.16,233.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:235.2,236.44 2 1 +github.com/onflow/flow-cli/flowkit/state.go:236.44,238.3 1 1 +github.com/onflow/flow-cli/flowkit/state.go:239.2,240.16 2 1 +github.com/onflow/flow-cli/flowkit/state.go:240.16,242.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:244.2,244.18 1 1 +github.com/onflow/flow-cli/flowkit/state.go:252.19,254.16 2 1 +github.com/onflow/flow-cli/flowkit/state.go:254.16,256.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:258.2,266.8 3 1 +github.com/onflow/flow-cli/flowkit/state.go:274.19,276.16 2 1 +github.com/onflow/flow-cli/flowkit/state.go:276.16,278.3 1 0 +github.com/onflow/flow-cli/flowkit/state.go:280.2,285.8 1 1 +github.com/onflow/flow-cli/flowkit/tests/resources.go:524.45,527.30 2 1 +github.com/onflow/flow-cli/flowkit/tests/resources.go:527.30,529.3 1 1 +github.com/onflow/flow-cli/flowkit/tests/resources.go:531.2,531.40 1 1 +github.com/onflow/flow-cli/flowkit/tests/resources.go:534.35,537.32 3 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:537.32,539.3 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:540.2,540.16 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:543.37,545.25 2 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:545.25,551.3 2 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:552.2,552.17 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:555.45,558.32 3 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:558.32,560.3 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:561.2,561.17 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:564.41,566.25 2 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:566.25,568.3 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:569.2,569.18 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:578.58,582.2 3 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:584.41,586.2 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:588.29,590.2 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:592.39,594.2 1 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:596.102,616.2 4 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:618.72,624.2 4 0 +github.com/onflow/flow-cli/flowkit/tests/resources.go:626.75,645.2 2 0 diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index 90a7a1f5c..000000000 --- a/docs/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/README.md diff --git a/docs/account-add-contract.md b/docs/account-add-contract.md deleted file mode 100644 index 8b872296a..000000000 --- a/docs/account-add-contract.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/account-add-contract.md diff --git a/docs/account-remove-contract.md b/docs/account-remove-contract.md deleted file mode 100644 index 3d23036fe..000000000 --- a/docs/account-remove-contract.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/account-remove-contract.md diff --git a/docs/account-staking-info.md b/docs/account-staking-info.md deleted file mode 100644 index 1cb98beb0..000000000 --- a/docs/account-staking-info.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/account-staking-info.md diff --git a/docs/account-update-contract.md b/docs/account-update-contract.md deleted file mode 100644 index 8e740464a..000000000 --- a/docs/account-update-contract.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/account-update-contract.md diff --git a/docs/build-transactions.md b/docs/build-transactions.md deleted file mode 100644 index 9eb81c58e..000000000 --- a/docs/build-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/build-transactions.md diff --git a/docs/complex-transactions.md b/docs/complex-transactions.md deleted file mode 100644 index 7deaea349..000000000 --- a/docs/complex-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/complex-transactions.md diff --git a/docs/configuration.md b/docs/configuration.md deleted file mode 100644 index c5de596d3..000000000 --- a/docs/configuration.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/configuration.md diff --git a/docs/create-accounts.md b/docs/create-accounts.md deleted file mode 100644 index 81128380a..000000000 --- a/docs/create-accounts.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/create-accounts.md diff --git a/docs/data-collection.md b/docs/data-collection.md deleted file mode 100644 index e8a0c8c3a..000000000 --- a/docs/data-collection.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/data-collection.md diff --git a/docs/decode-keys.md b/docs/decode-keys.md deleted file mode 100644 index 2df4973b6..000000000 --- a/docs/decode-keys.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/decode-keys.md diff --git a/docs/decode-transactions.md b/docs/decode-transactions.md deleted file mode 100644 index cc47b4afe..000000000 --- a/docs/decode-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/decode-transactions.md diff --git a/docs/deploy-project-contracts.md b/docs/deploy-project-contracts.md deleted file mode 100644 index e322985a3..000000000 --- a/docs/deploy-project-contracts.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/deploy-project-contracts.md diff --git a/docs/derive-keys.md b/docs/derive-keys.md deleted file mode 100644 index 1568ef04a..000000000 --- a/docs/derive-keys.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/derive-keys.md diff --git a/docs/developer-updates/release-notes-v17.md b/docs/developer-updates/release-notes-v17.md deleted file mode 100644 index ac1a7aef0..000000000 --- a/docs/developer-updates/release-notes-v17.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v17.md diff --git a/docs/developer-updates/release-notes-v18.md b/docs/developer-updates/release-notes-v18.md deleted file mode 100644 index d5cd1daa1..000000000 --- a/docs/developer-updates/release-notes-v18.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v18.md diff --git a/docs/developer-updates/release-notes-v19.md b/docs/developer-updates/release-notes-v19.md deleted file mode 100644 index 0245fa12e..000000000 --- a/docs/developer-updates/release-notes-v19.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v19.md diff --git a/docs/developer-updates/release-notes-v21.md b/docs/developer-updates/release-notes-v21.md deleted file mode 100644 index fcf6ef08b..000000000 --- a/docs/developer-updates/release-notes-v21.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v21.md diff --git a/docs/developer-updates/release-notes-v24.md b/docs/developer-updates/release-notes-v24.md deleted file mode 100644 index e30c506f3..000000000 --- a/docs/developer-updates/release-notes-v24.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v24.md diff --git a/docs/developer-updates/release-notes-v26.md b/docs/developer-updates/release-notes-v26.md deleted file mode 100644 index aac2f54ba..000000000 --- a/docs/developer-updates/release-notes-v26.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v26.md diff --git a/docs/developer-updates/release-notes-v28.md b/docs/developer-updates/release-notes-v28.md deleted file mode 100644 index e5616550a..000000000 --- a/docs/developer-updates/release-notes-v28.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/developer-updates/release-notes-v28.md diff --git a/docs/emulator-snapshot.md b/docs/emulator-snapshot.md deleted file mode 100644 index a4e01f4f7..000000000 --- a/docs/emulator-snapshot.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/emulator-snapshot.md diff --git a/docs/execute-scripts.md b/docs/execute-scripts.md deleted file mode 100644 index cbb527f9c..000000000 --- a/docs/execute-scripts.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/execute-scripts.md diff --git a/docs/generate-keys.md b/docs/generate-keys.md deleted file mode 100644 index 1f3e71aae..000000000 --- a/docs/generate-keys.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/generate-keys.md diff --git a/docs/get-accounts.md b/docs/get-accounts.md deleted file mode 100644 index d46e48c7c..000000000 --- a/docs/get-accounts.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-accounts.md diff --git a/docs/get-blocks.md b/docs/get-blocks.md deleted file mode 100644 index fb9cb8309..000000000 --- a/docs/get-blocks.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-blocks.md diff --git a/docs/get-collections.md b/docs/get-collections.md deleted file mode 100644 index 5935b4186..000000000 --- a/docs/get-collections.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-collections.md diff --git a/docs/get-events.md b/docs/get-events.md deleted file mode 100644 index 2e87d6f24..000000000 --- a/docs/get-events.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-events.md diff --git a/docs/get-status.md b/docs/get-status.md deleted file mode 100644 index 9ee3304d3..000000000 --- a/docs/get-status.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-status.md diff --git a/docs/get-transactions.md b/docs/get-transactions.md deleted file mode 100644 index 899def186..000000000 --- a/docs/get-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/get-transactions.md diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index cfecc8176..000000000 --- a/docs/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/index.md diff --git a/docs/initialize-configuration.md b/docs/initialize-configuration.md deleted file mode 100644 index 5df654c3a..000000000 --- a/docs/initialize-configuration.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/initialize-configuration.md diff --git a/docs/install.md b/docs/install.md deleted file mode 100644 index 221030e60..000000000 --- a/docs/install.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/install.md diff --git a/docs/manage-configuration.md b/docs/manage-configuration.md deleted file mode 100644 index 18ebddd24..000000000 --- a/docs/manage-configuration.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/manage-configuration.md diff --git a/docs/project-app.md b/docs/project-app.md deleted file mode 100644 index 19b6ed1f0..000000000 --- a/docs/project-app.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/project-app.md diff --git a/docs/project-contracts.md b/docs/project-contracts.md deleted file mode 100644 index 15fcbaded..000000000 --- a/docs/project-contracts.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/project-contracts.md diff --git a/docs/run-tests.md b/docs/run-tests.md deleted file mode 100644 index 2ef50b80f..000000000 --- a/docs/run-tests.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/run-tests.md diff --git a/docs/security.md b/docs/security.md deleted file mode 100644 index b3afded34..000000000 --- a/docs/security.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/security.md diff --git a/docs/send-signed-transactions.md b/docs/send-signed-transactions.md deleted file mode 100644 index 8c3491b81..000000000 --- a/docs/send-signed-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/send-signed-transactions.md diff --git a/docs/send-transactions.md b/docs/send-transactions.md deleted file mode 100644 index c61f6a165..000000000 --- a/docs/send-transactions.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/send-transactions.md diff --git a/docs/sign-transaction.md b/docs/sign-transaction.md deleted file mode 100644 index 63962c949..000000000 --- a/docs/sign-transaction.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/sign-transaction.md diff --git a/docs/signature-generate.md b/docs/signature-generate.md deleted file mode 100644 index a697a18fd..000000000 --- a/docs/signature-generate.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/signature-generate.md diff --git a/docs/signature-verify.md b/docs/signature-verify.md deleted file mode 100644 index 2ca135056..000000000 --- a/docs/signature-verify.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/signature-verify.md diff --git a/docs/snapshot-save.md b/docs/snapshot-save.md deleted file mode 100644 index 30b61c8dd..000000000 --- a/docs/snapshot-save.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/snapshot-save.md diff --git a/docs/start-emulator.md b/docs/start-emulator.md deleted file mode 100644 index 0fd2bffc3..000000000 --- a/docs/start-emulator.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/start-emulator.md diff --git a/docs/super-commands.md b/docs/super-commands.md deleted file mode 100644 index 8274462c5..000000000 --- a/docs/super-commands.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/super-commands.md diff --git a/docs/template.md b/docs/template.md deleted file mode 100644 index 9f50fdb9b..000000000 --- a/docs/template.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/template.md diff --git a/docs/tools.md b/docs/tools.md deleted file mode 100644 index 5a37105c0..000000000 --- a/docs/tools.md +++ /dev/null @@ -1,3 +0,0 @@ -# This document has been moved to a new location: - -https://github.com/onflow/docs/tree/main/docs/tooling/flow-cli/tools.md diff --git a/flowkit/events.go b/events.go similarity index 100% rename from flowkit/events.go rename to events.go diff --git a/flowkit/events_test.go b/events_test.go similarity index 100% rename from flowkit/events_test.go rename to events_test.go diff --git a/flowkit/flowkit.go b/flowkit.go similarity index 100% rename from flowkit/flowkit.go rename to flowkit.go diff --git a/flowkit/README.md b/flowkit/README.md deleted file mode 100644 index dc8ed2f0a..000000000 --- a/flowkit/README.md +++ /dev/null @@ -1,16 +0,0 @@ -## Flowkit Package Design -Flowkit is a core package used by the CLI commands. It features APIs for interacting with the Flow network -in the context of flow.json configuration values. Flowkit is defined by the [interface here](services.go). - -Flowkit contains multiple subpackages, the most important ones are: -- **config**: parsing and storing of flow.json values, as well as validation, -- **gateway**: implementation of Flow AN methods, uses emulator as well as Go SDK to communicate with ANs, -- **project**: stateful operations on top of flow.json, which allows resolving imports in contracts used in deployments - -It is important we define clear boundaries between flowkit and other CLI packages. If we are in doubt where certain -methods should be implemented we must ask ourselves if the method provides value for any other consumers of the -pacakge or only provides utility for CLI usage, if it's only providing utility for CLI then it should be added inside -the internal package, instead of flowkit. If in doubt better to add things to internal package and then move to flowkit -if such need is identified. - - diff --git a/flowkit/go.mod b/flowkit/go.mod deleted file mode 100644 index 859ef77d2..000000000 --- a/flowkit/go.mod +++ /dev/null @@ -1,207 +0,0 @@ -module github.com/onflow/flow-cli/flowkit - -go 1.20 - -require ( - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 - github.com/ethereum/go-ethereum v1.12.0 - github.com/gosuri/uilive v0.0.4 - github.com/invopop/jsonschema v0.7.0 - github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12 - github.com/onflow/cadence v0.42.6 - github.com/onflow/flow-emulator v0.59.0 - github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c - github.com/onflow/flow-go-sdk v0.41.17 - github.com/onflow/flow-go/crypto v0.24.9 - github.com/pkg/errors v0.9.1 - github.com/rs/zerolog v1.29.0 - github.com/spf13/afero v1.9.4 - github.com/stretchr/testify v1.8.4 - github.com/thoas/go-funk v0.9.2 - github.com/tyler-smith/go-bip39 v1.1.0 - golang.org/x/exp v0.0.0-20230321023759-10a507213a29 - gonum.org/v1/gonum v0.13.0 - google.golang.org/grpc v1.59.0 -) - -require ( - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.1 // indirect - cloud.google.com/go/kms v1.15.0 // indirect - github.com/DataDog/zstd v1.5.2 // indirect - github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect - github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect - github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect - github.com/VictoriaMetrics/fastcache v1.6.0 // indirect - github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect - github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect - github.com/cespare/xxhash v1.1.0 // indirect - github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e // indirect - github.com/cockroachdb/errors v1.9.1 // indirect - github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect - github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect - github.com/cockroachdb/redact v1.1.3 // indirect - github.com/coreos/go-semver v0.3.0 // indirect - github.com/davecgh/go-spew v1.1.1 // indirect - github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect - github.com/deckarep/golang-set/v2 v2.1.0 // indirect - github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/dgraph-io/badger/v2 v2.2007.4 // indirect - github.com/dgraph-io/ristretto v0.1.0 // indirect - github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect - github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect - github.com/dustin/go-humanize v1.0.1 // indirect - github.com/ef-ds/deque v1.0.4 // indirect - github.com/fsnotify/fsnotify v1.6.0 // indirect - github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c // indirect - github.com/fxamacker/circlehash v0.3.0 // indirect - github.com/getsentry/sentry-go v0.18.0 // indirect - github.com/glebarez/go-sqlite v1.21.1 // indirect - github.com/go-logr/logr v1.2.4 // indirect - github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect - github.com/go-redis/redis/v8 v8.11.5 // indirect - github.com/go-stack/stack v1.8.1 // indirect - github.com/gofrs/flock v0.8.1 // indirect - github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.1.2 // indirect - github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect - github.com/golang/protobuf v1.5.3 // indirect - github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/s2a-go v0.1.4 // indirect - github.com/google/uuid v1.3.1 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect - github.com/googleapis/gax-go/v2 v2.11.0 // indirect - github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect - github.com/hashicorp/errwrap v1.1.0 // indirect - github.com/hashicorp/go-multierror v1.1.1 // indirect - github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d // indirect - github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect - github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect - github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect - github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/ipfs/bbloom v0.0.4 // indirect - github.com/ipfs/go-block-format v0.1.2 // indirect - github.com/ipfs/go-cid v0.4.1 // indirect - github.com/ipfs/go-datastore v0.6.0 // indirect - github.com/ipfs/go-ipfs-blockstore v1.3.0 // indirect - github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect - github.com/ipfs/go-ipfs-util v0.0.2 // indirect - github.com/ipfs/go-ipld-format v0.5.0 // indirect - github.com/ipfs/go-log v1.0.5 // indirect - github.com/ipfs/go-log/v2 v2.5.1 // indirect - github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect - github.com/jbenet/goprocess v0.1.4 // indirect - github.com/k0kubun/pp/v3 v3.2.0 // indirect - github.com/kevinburke/go-bindata v3.23.0+incompatible // indirect - github.com/klauspost/compress v1.16.5 // indirect - github.com/klauspost/cpuid/v2 v2.2.5 // indirect - github.com/kr/pretty v0.3.1 // indirect - github.com/kr/text v0.2.0 // indirect - github.com/libp2p/go-buffer-pool v0.1.0 // indirect - github.com/libp2p/go-libp2p v0.28.1 // indirect - github.com/logrusorgru/aurora v2.0.3+incompatible // indirect - github.com/logrusorgru/aurora/v4 v4.0.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect - github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.19 // indirect - github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect - github.com/minio/sha256-simd v1.0.1 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect - github.com/mr-tron/base58 v1.2.0 // indirect - github.com/multiformats/go-base32 v0.1.0 // indirect - github.com/multiformats/go-base36 v0.2.0 // indirect - github.com/multiformats/go-multiaddr v0.9.0 // indirect - github.com/multiformats/go-multibase v0.2.0 // indirect - github.com/multiformats/go-multicodec v0.9.0 // indirect - github.com/multiformats/go-multihash v0.2.3 // indirect - github.com/multiformats/go-multistream v0.4.1 // indirect - github.com/multiformats/go-varint v0.0.7 // indirect - github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/onflow/atree v0.6.0 // indirect - github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f // indirect - github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f // indirect - github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13 // indirect - github.com/onflow/flow-nft/lib/go/contracts v1.1.0 // indirect - github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231124194313-106cc495def6 // indirect - github.com/onflow/nft-storefront/lib/go/contracts v0.0.0-20221222181731-14b90207cead // indirect - github.com/onflow/sdks v0.5.0 // indirect - github.com/opentracing/opentracing-go v1.2.0 // indirect - github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pelletier/go-toml/v2 v2.0.6 // indirect - github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/prometheus/client_golang v1.16.0 // indirect - github.com/prometheus/client_model v0.4.0 // indirect - github.com/prometheus/common v0.42.0 // indirect - github.com/prometheus/procfs v0.10.1 // indirect - github.com/psiemens/graceland v1.0.0 // indirect - github.com/psiemens/sconfig v0.1.0 // indirect - github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect - github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect - github.com/sethvargo/go-retry v0.2.3 // indirect - github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/slok/go-http-metrics v0.10.0 // indirect - github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/jwalterweatherman v1.1.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect - github.com/spf13/viper v1.15.0 // indirect - github.com/stretchr/objx v0.5.0 // indirect - github.com/subosito/gotenv v1.4.2 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect - github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect - github.com/tklauser/go-sysconf v0.3.9 // indirect - github.com/tklauser/numcpus v0.3.0 // indirect - github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d // indirect - github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect - github.com/vmihailenco/msgpack/v4 v4.3.11 // indirect - github.com/vmihailenco/tagparser v0.1.1 // indirect - github.com/x448/float16 v0.8.4 // indirect - github.com/zeebo/blake3 v0.2.3 // indirect - go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/otel v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 // indirect - go.opentelemetry.io/otel/metric v1.16.0 // indirect - go.opentelemetry.io/otel/sdk v1.16.0 // indirect - go.opentelemetry.io/otel/trace v1.16.0 // indirect - go.opentelemetry.io/proto/otlp v0.19.0 // indirect - go.uber.org/atomic v1.11.0 // indirect - go.uber.org/multierr v1.11.0 // indirect - go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.12.0 // indirect - golang.org/x/net v0.14.0 // indirect - golang.org/x/oauth2 v0.11.0 // indirect - golang.org/x/sync v0.3.0 // indirect - golang.org/x/sys v0.11.0 // indirect - golang.org/x/text v0.12.0 // indirect - golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect - google.golang.org/api v0.126.0 // indirect - google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect - google.golang.org/protobuf v1.31.0 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect - launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect - lukechampine.com/blake3 v1.2.1 // indirect - modernc.org/libc v1.22.3 // indirect - modernc.org/mathutil v1.5.0 // indirect - modernc.org/memory v1.5.0 // indirect - modernc.org/sqlite v1.21.1 // indirect -) diff --git a/flowkit/go.sum b/flowkit/go.sum deleted file mode 100644 index 263187cd6..000000000 --- a/flowkit/go.sum +++ /dev/null @@ -1,1475 +0,0 @@ -cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= -cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU= -cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY= -cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc= -cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0= -cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To= -cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4= -cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M= -cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc= -cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk= -cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= -cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= -cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI= -cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk= -cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY= -cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= -cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= -cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= -cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY= -cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM= -cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= -cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= -cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= -cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= -cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= -cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= -cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= -cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= -cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= -cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= -cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= -cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= -cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= -cloud.google.com/go/kms v1.0.0/go.mod h1:nhUehi+w7zht2XrUfvTRNpxrfayBHqP4lu2NSywui/0= -cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= -cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= -cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= -cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= -cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= -cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU= -cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw= -cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos= -cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= -cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= -cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= -github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= -github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= -github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= -github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= -github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= -github.com/Azure/go-autorest/autorest/adal v0.8.0/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc= -github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= -github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g= -github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= -github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= -github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= -github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= -github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= -github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0/go.mod h1:HKQPgSJmdK8hdoAbKUUWajkHyHo4RaU5rMdUywE7VMo= -github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= -github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= -github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e h1:ahyvB3q25YnZWly5Gq1ekg6jcmWaGj/vG/MhF4aisoc= -github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUqhHd//musdITWjFvNTHn90WG9bMLBEPQZ17Cmlpw= -github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= -github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= -github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= -github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= -github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= -github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= -github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE= -github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= -github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= -github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= -github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= -github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= -github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= -github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= -github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= -github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= -github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= -github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= -github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= -github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= -github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= -github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= -github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= -github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= -github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= -github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= -github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= -github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= -github.com/bytecodealliance/wasmtime-go v0.22.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= -github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= -github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= -github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= -github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= -github.com/cespare/xxhash/v2 v2.0.1-0.20190104013014-3767db7a7e18/go.mod h1:HD5P3vAIAh+Y2GAxg0PrPN1P8WkepXGpjbUPDHJqqKM= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= -github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= -github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= -github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= -github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= -github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= -github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= -github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= -github.com/cockroachdb/errors v1.9.1/go.mod h1:2sxOtL2WIc096WSZqZ5h8fa17rdDq9HZOZLBCor4mBk= -github.com/cockroachdb/logtags v0.0.0-20211118104740-dabe8e521a4f/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b h1:r6VH0faHjZeQy818SGhaone5OnYfxFR/+AzdY3sf5aE= -github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b/go.mod h1:Vz9DsVWQQhf3vs21MhPMZpMGSht7O/2vFW2xusFUVOs= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM/P5NAw0e2Rf1FGvzDau1h54MKvx8G7w= -github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= -github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= -github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= -github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= -github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= -github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= -github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= -github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= -github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= -github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= -github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= -github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= -github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgraph-io/ristretto v0.1.0 h1:Jv3CGQHp9OjuMBSne1485aDpUkTKEcUqF+jm/LuerPI= -github.com/dgraph-io/ristretto v0.1.0/go.mod h1:fux0lOrBhrVCJd3lcTHsIJhq1T2rokOu6v9Vcb3Q9ug= -github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= -github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= -github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= -github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= -github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= -github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= -github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= -github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= -github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= -github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= -github.com/ethereum/go-ethereum v1.9.9/go.mod h1:a9TqabFudpDu1nucId+k9S8R9whYaHnGBLKFouA5EAo= -github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2zljOa0= -github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= -github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= -github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= -github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/fxamacker/cbor/v2 v2.2.1-0.20210927235116-3d6d5d1de29b/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= -github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c h1:5tm/Wbs9d9r+qZaUFXk59CWDD0+77PBqDREffYkyi5c= -github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c/go.mod h1:TA1xS00nchWmaBnEIxPSE5oHLuJBAVvqrtAnWBwBCVo= -github.com/fxamacker/circlehash v0.1.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/fxamacker/circlehash v0.3.0 h1:XKdvTtIJV9t7DDUtsf0RIpC1OcxZtPbmgIH7ekx28WA= -github.com/fxamacker/circlehash v0.3.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= -github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= -github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= -github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY= -github.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= -github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= -github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= -github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= -github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= -github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= -github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AEU963A2AYjv4d1V5eVL1CQbEJq6aCNHDDjibzu8= -github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= -github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= -github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= -github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= -github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= -github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= -github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= -github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= -github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= -github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= -github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= -github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= -github.com/gogo/status v1.1.0/go.mod h1:BFv9nrluPLmrS0EmGVvLaPNmRosr9KapBYd5/hpY1WM= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= -github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= -github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= -github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= -github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= -github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= -github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y= -github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= -github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= -github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= -github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= -github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2-0.20190517061210-b285ee9cfc6c/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= -github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= -github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk= -github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= -github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= -github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= -github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= -github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= -github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= -github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= -github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= -github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= -github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= -github.com/gomodule/redigo v1.7.1-0.20190724094224-574c33c3df38/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= -github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= -github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= -github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= -github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= -github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= -github.com/google/martian/v3 v3.2.1/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= -github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= -github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= -github.com/google/pprof v0.0.0-20201023163331-3e6fc7fc9c4c/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201203190320-1bf35d6f28c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20201218002935-b9804c9f04c2/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210601050228-01bbb1931b22/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= -github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= -github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= -github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= -github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= -github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= -github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= -github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= -github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gosuri/uilive v0.0.4 h1:hUEBpQDj8D8jXgtCdBu7sWsy5sbW/5GhuO8KBwJ2jyY= -github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tfZ74VI= -github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= -github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= -github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d h1:dg1dEPuWpEqDnvIw251EVy4zlP8gWbsGj4BsUKCRpYs= -github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= -github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5twqnfBdU= -github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= -github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= -github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= -github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= -github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA= -github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= -github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= -github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= -github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= -github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= -github.com/ipfs/boxo v0.10.0 h1:tdDAxq8jrsbRkYoF+5Rcqyeb91hgWe2hp7iLu7ORZLY= -github.com/ipfs/go-block-format v0.1.2 h1:GAjkfhVx1f4YTODS6Esrj1wt2HhrtwTnhEr+DyPUaJo= -github.com/ipfs/go-block-format v0.1.2/go.mod h1:mACVcrxarQKstUU3Yf/RdwbC4DzPV6++rO2a3d+a/KE= -github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= -github.com/ipfs/go-cid v0.4.1 h1:A/T3qGvxi4kpKWWcPC/PgbvDA2bjVLO7n4UeVwnbs/s= -github.com/ipfs/go-cid v0.4.1/go.mod h1:uQHwDeX4c6CtyrFwdqyhpNcxVewur1M7l7fNU7LKwZk= -github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= -github.com/ipfs/go-datastore v0.6.0 h1:JKyz+Gvz1QEZw0LsX1IBn+JFCJQH4SJVFtM4uWU0Myk= -github.com/ipfs/go-datastore v0.6.0/go.mod h1:rt5M3nNbSO/8q1t4LNkLyUwRs8HupMeN/8O4Vn9YAT8= -github.com/ipfs/go-detect-race v0.0.1 h1:qX/xay2W3E4Q1U7d9lNs1sU9nvguX0a7319XbyQ6cOk= -github.com/ipfs/go-detect-race v0.0.1/go.mod h1:8BNT7shDZPo99Q74BpGMK+4D8Mn4j46UU0LZ723meps= -github.com/ipfs/go-ipfs-blockstore v1.3.0 h1:m2EXaWgwTzAfsmt5UdJ7Is6l4gJcaM/A12XwJyvYvMM= -github.com/ipfs/go-ipfs-blockstore v1.3.0/go.mod h1:KgtZyc9fq+P2xJUiCAzbRdhhqJHvsw8u2Dlqy2MyRTE= -github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= -github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= -github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= -github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= -github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= -github.com/ipfs/go-ipld-format v0.5.0 h1:WyEle9K96MSrvr47zZHKKcDxJ/vlpET6PSiQsAFO+Ds= -github.com/ipfs/go-ipld-format v0.5.0/go.mod h1:ImdZqJQaEouMjCvqCe0ORUS+uoBmf7Hf+EO/jh+nk3M= -github.com/ipfs/go-log v1.0.5 h1:2dOuUCB1Z7uoczMWgAyDck5JLb72zHzrMnGnCNNbvY8= -github.com/ipfs/go-log v1.0.5/go.mod h1:j0b8ZoR+7+R99LD9jZ6+AJsrzkPbSXbZfGakb5JPtIo= -github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= -github.com/ipfs/go-log/v2 v2.5.1 h1:1XdUzF7048prq4aBjDQQ4SL5RxftpRGdXhNRwKSAlcY= -github.com/ipfs/go-log/v2 v2.5.1/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= -github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= -github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= -github.com/iris-contrib/blackfriday v2.0.0+incompatible/go.mod h1:UzZ2bDEoaSGPbkg6SAB4att1aAwTmVIx/5gCVqeyUdI= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3/go.mod h1:H/geBymxJhShH5kecoiOCSssPX7QWYH7UaeZTSWddIk= -github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0GqwkjqxNd0u65g= -github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= -github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= -github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= -github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= -github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= -github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= -github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= -github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= -github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= -github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= -github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= -github.com/k0kubun/pp/v3 v3.2.0 h1:h33hNTZ9nVFNP3u2Fsgz8JXiF5JINoZfFq4SvKJwNcs= -github.com/k0kubun/pp/v3 v3.2.0/go.mod h1:ODtJQbQcIRfAD3N+theGCV1m/CBxweERz2dapdz1EwA= -github.com/karalabe/usb v0.0.0-20190919080040-51dc0efba356/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= -github.com/kataras/golog v0.0.10/go.mod h1:yJ8YKCmyL+nWjERB90Qwn+bdyBZsaQwU3bTVFgkFIp8= -github.com/kataras/iris/v12 v12.1.8/go.mod h1:LMYy4VlP67TQ3Zgriz8RE2h2kMZV2SgMYbq3UhfoFmE= -github.com/kataras/neffos v0.0.14/go.mod h1:8lqADm8PnbeFfL7CLXh1WHw53dG27MC3pgi2R1rmoTE= -github.com/kataras/pio v0.0.2/go.mod h1:hAoW0t9UmXi4R5Oyq5Z4irTbaTsOemSrDGUtaTl7Dro= -github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubcGyk0Bz8= -github.com/kevinburke/go-bindata v3.22.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= -github.com/kevinburke/go-bindata v3.23.0+incompatible h1:rqNOXZlqrYhMVVAsQx8wuc+LaA73YcfbQ407wAykyS8= -github.com/kevinburke/go-bindata v3.23.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= -github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= -github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= -github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= -github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= -github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= -github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= -github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= -github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuObKfj5c0PQa7c= -github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= -github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= -github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= -github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= -github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= -github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= -github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= -github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= -github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= -github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= -github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-libp2p v0.28.1 h1:YurK+ZAI6cKfASLJBVFkpVBdl3wGhFi6fusOt725ii8= -github.com/libp2p/go-libp2p v0.28.1/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk= -github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= -github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= -github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= -github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12 h1:qFV7dBLhw5z4hka5gjtIzg1Kq9ie8t8P7Cy0uIxRyAQ= -github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12/go.mod h1:QIsK6U93yCP6TnGsShCv5wl4gcz/mpCHl+aToBsl5Sc= -github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczGlG91VSDkswnjF5A8= -github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= -github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA= -github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ= -github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= -github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.11/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= -github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= -github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= -github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= -github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= -github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= -github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= -github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= -github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= -github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= -github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= -github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= -github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= -github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= -github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= -github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= -github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= -github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= -github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= -github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/mr-tron/base58 v1.2.0 h1:T/HDJBh4ZCPbU39/+c3rRvE0uKBQlU27+QI8LJ4t64o= -github.com/mr-tron/base58 v1.2.0/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= -github.com/multiformats/go-base32 v0.0.3/go.mod h1:pLiuGC8y0QR3Ue4Zug5UzK9LjgbkL8NSQj0zQ5Nz/AA= -github.com/multiformats/go-base32 v0.1.0 h1:pVx9xoSPqEIQG8o+UbAe7DNi51oej1NtK+aGkbLYxPE= -github.com/multiformats/go-base32 v0.1.0/go.mod h1:Kj3tFY6zNr+ABYMqeUNeGvkIC/UYgtWibDcT0rExnbI= -github.com/multiformats/go-base36 v0.2.0 h1:lFsAbNOGeKtuKozrtBsAkSVhv1p9D0/qedU9rQyccr0= -github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a1UV0xHgWc0hkp4= -github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= -github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= -github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= -github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= -github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= -github.com/multiformats/go-multicodec v0.9.0 h1:pb/dlPnzee/Sxv/j4PmkDRxCOi3hXTz3IbPKOXWJkmg= -github.com/multiformats/go-multicodec v0.9.0/go.mod h1:L3QTQvMIaVBkXOXXtVmYE+LI16i14xuaojr/H7Ai54k= -github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= -github.com/multiformats/go-multihash v0.2.3 h1:7Lyc8XfX/IY2jWb/gI7JP+o7JEq9hOa7BFvVU9RSh+U= -github.com/multiformats/go-multihash v0.2.3/go.mod h1:dXgKXCXjBzdscBLk9JkjINiEsCKRVch90MdaGiKsvSM= -github.com/multiformats/go-multistream v0.4.1 h1:rFy0Iiyn3YT0asivDUIR05leAdwZq3de4741sbiSdfo= -github.com/multiformats/go-multistream v0.4.1/go.mod h1:Mz5eykRVAjJWckE2U78c6xqdtyNUEhKSM0Lwar2p77Q= -github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXSrVKRY101jdMZYE= -github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= -github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= -github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= -github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= -github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= -github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= -github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= -github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= -github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= -github.com/onflow/atree v0.1.0-beta1.0.20211027184039-559ee654ece9/go.mod h1:+6x071HgCF/0v5hQcaE5qqjc2UqN5gCU8h5Mk6uqpOg= -github.com/onflow/atree v0.6.0 h1:j7nQ2r8npznx4NX39zPpBYHmdy45f4xwoi+dm37Jk7c= -github.com/onflow/atree v0.6.0/go.mod h1:gBHU0M05qCbv9NN0kijLWMgC47gHVNBIp4KmsVFi0tc= -github.com/onflow/cadence v0.20.1/go.mod h1:7mzUvPZUIJztIbr9eTvs+fQjWWHTF8veC+yk4ihcNIA= -github.com/onflow/cadence v0.42.6 h1:VtI0EpKrdbfqITRMsvyZC4dhgcW1x1LNUQuEpdMDzus= -github.com/onflow/cadence v0.42.6/go.mod h1:raU8va8QRyTa/eUbhej4mbyW2ETePfSaywoo36MddgE= -github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f h1:S8yIZw9LFXfYD1V5H9BiixihHw3GrXVPrmfplSzYaww= -github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f/go.mod h1:jM6GMAL+m0hjusUgiYDNrixPQ6b9s8xjoJQoEu5bHQI= -github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f h1:Ep+Mpo2miWMe4pjPGIaEvEzshRep30dvNgxqk+//FrQ= -github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f/go.mod h1:ZeLxwaBkzuSInESGjL8/IPZWezF+YOYsYbMrZlhN+q4= -github.com/onflow/flow-emulator v0.59.0 h1:KIfm9/+x62KqcZDjqE35fkuvVuY506OZ917xNtb3U6E= -github.com/onflow/flow-emulator v0.59.0/go.mod h1:Js1KKaXrui2yKKkXAlKTqmByRySis6/FH+vkGA6Kqu0= -github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13 h1:B4ll7e3j+MqTJv2122Enq3RtDNzmIGRu9xjV7fo7un0= -github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13/go.mod h1:kTMFIySzEJJeupk+7EmXs0EJ6CBWY/MV9fv9iYQk+RU= -github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c h1:75LED6hmarR0uazKZG8nkqqDlUiqz6NdzkdQQiGjvlI= -github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c/go.mod h1:YJDAoDjbY4OWBj44XV+Qe+dIwn+hlywUDL5xclOOLbw= -github.com/onflow/flow-go-sdk v0.24.0/go.mod h1:IoptMLPyFXWvyd9yYA6/4EmSeeozl6nJoIv4FaEMg74= -github.com/onflow/flow-go-sdk v0.41.17 h1:HpNn3j2fqLGA6H3HGfAuh2A+TsPBv8gWO3kvK9Hvtic= -github.com/onflow/flow-go-sdk v0.41.17/go.mod h1:ZIj2XBI9R0QiKzbI6iPwOeqyIy/M4+atczoMOEWdKYw= -github.com/onflow/flow-go/crypto v0.21.3/go.mod h1:vI6V4CY3R6c4JKBxdcRiR/AnjBfL8OSD97bJc60cLuQ= -github.com/onflow/flow-go/crypto v0.24.9 h1:0EQp+kSZYJepMIiSypfJVe7tzsPcb6UXOdOtsTCDhBs= -github.com/onflow/flow-go/crypto v0.24.9/go.mod h1:fqCzkIBBMRRkciVrvW21rECKq1oD7Q6u+bCI78lfNX0= -github.com/onflow/flow-nft/lib/go/contracts v1.1.0 h1:rhUDeD27jhLwOqQKI/23008CYfnqXErrJvc4EFRP2a0= -github.com/onflow/flow-nft/lib/go/contracts v1.1.0/go.mod h1:YsvzYng4htDgRB9sa9jxdwoTuuhjK8WYWXTyLkIigZY= -github.com/onflow/flow/protobuf/go/flow v0.2.2/go.mod h1:gQxYqCfkI8lpnKsmIjwtN2mV/N2PIwc1I+RUK4HPIc8= -github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231124194313-106cc495def6 h1:KMN+OEVaw7KAgxL3p8ux7CMuyTvacAlYTbasOqowh4M= -github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231124194313-106cc495def6/go.mod h1:NA2pX2nw8zuaxfKphhKsk00kWLwfd+tv8mS23YXO4Sk= -github.com/onflow/nft-storefront/lib/go/contracts v0.0.0-20221222181731-14b90207cead h1:2j1Unqs76Z1b95Gu4C3Y28hzNUHBix7wL490e61SMSw= -github.com/onflow/nft-storefront/lib/go/contracts v0.0.0-20221222181731-14b90207cead/go.mod h1:E3ScfQb5XcWJCIAdtIeEnr5i5l2y60GT0BTXeIHseWg= -github.com/onflow/sdks v0.5.0 h1:2HCRibwqDaQ1c9oUApnkZtEAhWiNY2GTpRD5+ftdkN8= -github.com/onflow/sdks v0.5.0/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= -github.com/onflow/wal v0.0.0-20230529184820-bc9f8244608d h1:gAEqYPn3DS83rHIKEpsajnppVD1+zwuYPFyeDVFaQvg= -github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= -github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= -github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= -github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= -github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= -github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= -github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= -github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= -github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= -github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= -github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= -github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= -github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= -github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= -github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= -github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= -github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= -github.com/psiemens/graceland v1.0.0 h1:L580AVV4Q2XLcPpmvxJRH9UpEAYr/eu2jBKmMglhvM8= -github.com/psiemens/graceland v1.0.0/go.mod h1:1Tof+vt1LbmcZFE0lzgdwMN0QBymAChG3FRgDx8XisU= -github.com/psiemens/sconfig v0.1.0 h1:xfWqW+TRpih7mXZIqKYTmpRhlZLQ1kbxV8EjllPv76s= -github.com/psiemens/sconfig v0.1.0/go.mod h1:+MLKqdledP/8G3rOBpknbLh0IclCf4WneJUtS26JB2U= -github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= -github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.4 h1:8TfxU8dW6PdqD27gjM8MVNuicgxIjxpm4K7x4jp8sis= -github.com/rivo/uniseg v0.4.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= -github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= -github.com/robertkrimen/otto v0.0.0-20170205013659-6a77b7cbc37d/go.mod h1:xvqspoSXJTIpemEonrMDFq6XzwHYYgToXWj5eRX1OtY= -github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= -github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= -github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= -github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= -github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/schollz/progressbar/v3 v3.8.3/go.mod h1:pWnVCjSBZsT2X3nx9HfRdnCDrpbevliMeoEVhStwHko= -github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= -github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sethvargo/go-retry v0.2.3 h1:oYlgvIvsju3jNbottWABtbnoLC+GDtLdBHxKWxQm/iU= -github.com/sethvargo/go-retry v0.2.3/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= -github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= -github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= -github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/slok/go-http-metrics v0.10.0 h1:rh0LaYEKza5eaYRGDXujKrOln57nHBi4TtVhmNEpbgM= -github.com/slok/go-http-metrics v0.10.0/go.mod h1:lFqdaS4kWMfUKCSukjC47PdCeTk+hXDUVm8kLHRqJ38= -github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= -github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= -github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= -github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.9.4 h1:Sd43wM1IWz/s1aVXdOBkjJvuP8UdyqioeE4AmM0QsBs= -github.com/spf13/afero v1.9.4/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= -github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= -github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= -github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= -github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= -github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= -github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= -github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= -github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -github.com/stretchr/testify v0.0.0-20170601210322-f6abca593680/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= -github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.4/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= -github.com/supranational/blst v0.3.11-0.20230406105308-e9dfc5ee724b h1:u49mjRnygnB34h8OKbnNJFVUtWSKIKb1KukdV8bILUM= -github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= -github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= -github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c h1:HelZ2kAFadG0La9d+4htN4HzQ68Bm2iM9qKMSMES6xg= -github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c/go.mod h1:JlzghshsemAMDGZLytTFY8C1JQxQPhnatWqNwUXjggo= -github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk= -github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= -github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= -github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= -github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= -github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d h1:5JInRQbk5UBX8JfUvKh2oYTLMVwj3p6n+wapDDm7hko= -github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d/go.mod h1:Nlx5Y115XQvNcIdIy7dZXaNSUpzwBSge4/Ivk93/Yog= -github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:sJ5fKU0s6JVwZjjcUEX2zFOnvq0ASQ2K9Zr6cf67kNs= -github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= -github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= -github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= -github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= -github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBnvPM1Su9w= -github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= -github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= -github.com/vmihailenco/msgpack v4.0.4+incompatible h1:dSLoQfGFAo3F6OoNhwUmLwVgaUXK79GlxNBwueZn0xI= -github.com/vmihailenco/msgpack v4.0.4+incompatible/go.mod h1:fy3FlTQTDXWkZ7Bh6AcGMlsjHatGryHQYUTf1ShIgkk= -github.com/vmihailenco/msgpack/v4 v4.3.11 h1:Q47CePddpNGNhk4GCnAx9DDtASi2rasatE0cd26cZoE= -github.com/vmihailenco/msgpack/v4 v4.3.11/go.mod h1:gborTTJjAo/GWTqqRjrLCn9pgNN+NXzzngzBKDPIqw4= -github.com/vmihailenco/tagparser v0.1.1 h1:quXMXlA39OCbd2wAdTsGDlK9RkOk6Wuw+x37wVyIuWY= -github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgqMEUPoW2WPyhdI= -github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= -github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= -github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= -github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= -github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= -github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= -github.com/yalp/jsonpath v0.0.0-20180802001716-5cc68e5049a0/go.mod h1:/LWChgwKmvncFJFHJ7Gvn9wZArjbV5/FppcK2fKk/tI= -github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg= -github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM= -github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc= -github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= -github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/zeebo/assert v1.1.0/go.mod h1:Pq9JiuJQpG8JLJdtkwrJESF0Foym2/D9XMU5ciN/wJ0= -github.com/zeebo/assert v1.3.0 h1:g7C04CbJuIDKNPFHmsk4hwZDO5O+kntRxzaUoNXj+IQ= -github.com/zeebo/blake3 v0.2.0/go.mod h1:G9pM4qQwjRzF1/v7+vabMj/c5mWpGZ2Wzo3Eb4z0pb4= -github.com/zeebo/blake3 v0.2.3 h1:TFoLXsjeXqRNFxSbk35Dk4YtszE/MQQGK10BH4ptoTg= -github.com/zeebo/blake3 v0.2.3/go.mod h1:mjJjZpnsyIVtVgTOSpJ9vmRE4wgDeyt2HU3qXvvKCaQ= -github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= -github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= -go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= -go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= -go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= -go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= -go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= -go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/otel v1.16.0 h1:Z7GVAX/UkAXPKsy94IU+i6thsQS4nb7LviLpnaNeW8s= -go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeHrT/bx4= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0 h1:t4ZwRPU+emrcvM2e9DHd0Fsf0JTPVcbfa/BhTDF03d0= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.16.0/go.mod h1:vLarbg68dH2Wa77g71zmKQqlQ8+8Rq3GRG31uc0WcWI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0 h1:cbsD4cUcviQGXdw8+bo5x2wazq10SKz8hEbtCRPcU78= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.16.0/go.mod h1:JgXSGah17croqhJfhByOLVY719k1emAXC8MVhCIJlRs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0 h1:ap+y8RXX3Mu9apKVtOkM6WSFESLM8K3wNQyOU8sWHcc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.14.0/go.mod h1:5w41DY6S9gZrbjuq6Y+753e96WfPha5IcsOSZTtullM= -go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= -go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= -go.opentelemetry.io/otel/sdk v1.16.0 h1:Z1Ok1YsijYL0CSJpHt4cS3wDDh7p572grzNrBMiMWgE= -go.opentelemetry.io/otel/sdk v1.16.0/go.mod h1:tMsIuKXuuIWPBAOrH+eHtvhTL+SntFtXF9QD68aP6p4= -go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= -go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= -go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= -go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= -go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= -go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= -go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= -go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= -go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= -go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= -go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= -golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= -golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= -golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= -golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek= -golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY= -golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= -golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= -golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= -golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= -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= -golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= -golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= -golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= -golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= -golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= -golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= -golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= -golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200813134508-3edf25e44fcc/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= -golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201031054903-ff519b6c9102/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201209123823-ac852fbbde11/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20201224014010-6772e930b67b/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= -golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= -golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= -golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= -golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= -golang.org/x/oauth2 v0.0.0-20200902213428-5d25da1a8d43/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201109201403-9fd604954f58/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20201208152858-08078c50e5b5/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210218202405-ba52d332ba99/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= -golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= -golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= -golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201014080544-cc95f250f6bc/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603125802-9665404d3644/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210910150752-751e447fb3d0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= -golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= -golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= -golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= -golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= -golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190327201419-c70d86f8b7cf/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw= -golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= -golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200828161849-5deb26317202/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= -golang.org/x/tools v0.0.0-20200904185747-39188db58858/go.mod h1:Cj7w3i3Rnn0Xh82ur9kSqwfTHTeVxaDqrfMjpcNT6bE= -golang.org/x/tools v0.0.0-20201110124207-079ba7bd75cd/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201201161351-ac6f37ff4c2a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20201208233053-a543418bbed2/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= -golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= -golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= -golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= -golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= -gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= -gonum.org/v1/gonum v0.6.1/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= -gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= -gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= -gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= -gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= -google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= -google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI= -google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE= -google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= -google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= -google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.35.0/go.mod h1:/XrVsuzM0rZmrsbjJutiuftIzeuTQcEeaYcSk/mQ1dg= -google.golang.org/api v0.36.0/go.mod h1:+z5ficQTmoYpPn8LCUNVpK5I7hwkpjbcgqA7I34qYtE= -google.golang.org/api v0.40.0/go.mod h1:fYKFpnQN0DsDSKRVRcQSDQNtqWPfM9i+zNPxepjRCQ8= -google.golang.org/api v0.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= -google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= -google.golang.org/api v0.47.0/go.mod h1:Wbvgpq1HddcWVtzsVLyfLp8lDg6AA241LmgIL59tHXo= -google.golang.org/api v0.48.0/go.mod h1:71Pr1vy+TAZRPkPs/xlCf5SsU8WjuAWv1Pfjbtukyy4= -google.golang.org/api v0.50.0/go.mod h1:4bNT5pAuq5ji4SRZm+5QIkjny9JAyVD/3gaSihNefaw= -google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00sOU= -google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= -google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= -google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= -google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= -google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= -google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= -google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= -google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= -google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= -google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA= -google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= -google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= -google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20200904004341-0bd0a958aa1d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201109203340-2640f1f9cdfb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= -google.golang.org/genproto v0.0.0-20210513213006-bf773b8c8384/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= -google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210604141403-392c879c8b08/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210608205507-b6d2f5bf0d7d/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= -google.golang.org/genproto v0.0.0-20210624195500-8bfb893ecb84/go.mod h1:SzzZ/N+nwJDaO1kznhnlzqS8ocJICar6hYhVyhi++24= -google.golang.org/genproto v0.0.0-20210713002101-d411969a0d9a/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210716133855-ce7ef5c701ea/go.mod h1:AxrInvYm1dci+enl5hChSFPOmmUF1+uAa/UsgNRWd7k= -google.golang.org/genproto v0.0.0-20210728212813-7823e685a01f/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210805201207-89edb61ffb67/go.mod h1:ob2IJxKrgPT52GcgX759i1sleT07tiKowYBGbczaW48= -google.golang.org/genproto v0.0.0-20210813162853-db860fec028c/go.mod h1:cFeNkxwySK631ADgubI+/XFU/xp8FD5KIVV4rj8UC5w= -google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211007155348-82e027067bd4/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= -google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= -google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= -google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= -google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= -google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= -google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60= -google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= -google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= -google.golang.org/grpc v1.35.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= -google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= -google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= -google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= -google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= -google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= -google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= -google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= -google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= -google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= -google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= -google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= -google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= -google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= -google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= -google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= -google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= -gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce/go.mod h1:yeKp02qBN3iKW1OzL3MGk2IdtZzaj7SFntXj72NppTA= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= -gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20190213234257-ec84240a7772/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= -gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= -gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb78= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= -gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= -gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= -gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= -gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= -gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= -honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= -launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= -lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= -lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= -modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= -modernc.org/libc v1.22.3/go.mod h1:MQrloYP209xa2zHome2a8HLiLm6k0UT8CoHpV74tOFw= -modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= -modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E= -modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= -modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= -modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= -modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= -pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= -pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= -rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= -rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= -rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= -rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= diff --git a/flowkit/flowkit_test.go b/flowkit_test.go similarity index 100% rename from flowkit/flowkit_test.go rename to flowkit_test.go diff --git a/flowkit/gateway/emulator.go b/gateway/emulator.go similarity index 100% rename from flowkit/gateway/emulator.go rename to gateway/emulator.go diff --git a/flowkit/gateway/gateway.go b/gateway/gateway.go similarity index 100% rename from flowkit/gateway/gateway.go rename to gateway/gateway.go diff --git a/flowkit/gateway/grpc.go b/gateway/grpc.go similarity index 100% rename from flowkit/gateway/grpc.go rename to gateway/grpc.go diff --git a/flowkit/gateway/mocks/Gateway.go b/gateway/mocks/Gateway.go similarity index 100% rename from flowkit/gateway/mocks/Gateway.go rename to gateway/mocks/Gateway.go diff --git a/flowkit/gateway/mocks/gateway_mock.go b/gateway/mocks/gateway_mock.go similarity index 100% rename from flowkit/gateway/mocks/gateway_mock.go rename to gateway/mocks/gateway_mock.go diff --git a/go.mod b/go.mod index d1991a187..859ef77d2 100644 --- a/go.mod +++ b/go.mod @@ -1,112 +1,82 @@ -module github.com/onflow/flow-cli +module github.com/onflow/flow-cli/flowkit go 1.20 require ( - github.com/dukex/mixpanel v1.0.1 - github.com/getsentry/sentry-go v0.26.0 - github.com/go-git/go-git/v5 v5.11.0 + github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 + github.com/ethereum/go-ethereum v1.12.0 github.com/gosuri/uilive v0.0.4 - github.com/manifoldco/promptui v0.9.0 + github.com/invopop/jsonschema v0.7.0 + github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12 github.com/onflow/cadence v0.42.6 - github.com/onflow/cadence-tools/languageserver v0.33.3 - github.com/onflow/cadence-tools/test v0.14.5 - github.com/onflow/fcl-dev-wallet v0.7.4 - github.com/onflow/flixkit-go v1.1.1 - github.com/onflow/flow-cli/flowkit v1.11.0 - github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f github.com/onflow/flow-emulator v0.59.0 + github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c github.com/onflow/flow-go-sdk v0.41.17 - github.com/onflowser/flowser/v3 v3.1.3 - github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c + github.com/onflow/flow-go/crypto v0.24.9 github.com/pkg/errors v0.9.1 - github.com/psiemens/sconfig v0.1.0 - github.com/radovskyb/watcher v1.0.7 - github.com/sergi/go-diff v1.3.1 - github.com/spf13/afero v1.10.0 - github.com/spf13/cobra v1.8.0 - github.com/spf13/viper v1.16.0 + github.com/rs/zerolog v1.29.0 + github.com/spf13/afero v1.9.4 github.com/stretchr/testify v1.8.4 + github.com/thoas/go-funk v0.9.2 + github.com/tyler-smith/go-bip39 v1.1.0 golang.org/x/exp v0.0.0-20230321023759-10a507213a29 - google.golang.org/grpc v1.61.0 + gonum.org/v1/gonum v0.13.0 + google.golang.org/grpc v1.59.0 ) require ( - cloud.google.com/go/compute v1.23.3 // indirect + cloud.google.com/go/compute v1.23.0 // indirect cloud.google.com/go/compute/metadata v0.2.3 // indirect - cloud.google.com/go/iam v1.1.5 // indirect - cloud.google.com/go/kms v1.15.5 // indirect - dario.cat/mergo v1.0.0 // indirect + cloud.google.com/go/iam v1.1.1 // indirect + cloud.google.com/go/kms v1.15.0 // indirect github.com/DataDog/zstd v1.5.2 // indirect github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e // indirect github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec // indirect - github.com/Microsoft/go-winio v0.6.1 // indirect - github.com/OneOfOne/xxhash v1.2.8 // indirect - github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 // indirect github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 // indirect github.com/VictoriaMetrics/fastcache v1.6.0 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.10.0 // indirect + github.com/bits-and-blooms/bitset v1.7.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect - github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 // indirect - github.com/c-bata/go-prompt v0.2.6 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e // indirect - github.com/cloudflare/circl v1.3.3 // indirect + github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e // indirect github.com/cockroachdb/errors v1.9.1 // indirect github.com/cockroachdb/logtags v0.0.0-20230118201751-21c54148d20b // indirect github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 // indirect github.com/cockroachdb/redact v1.1.3 // indirect github.com/coreos/go-semver v0.3.0 // indirect - github.com/cyphar/filepath-securejoin v0.2.4 // indirect - github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c // indirect github.com/deckarep/golang-set/v2 v2.1.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect - github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f // indirect github.com/dgraph-io/badger/v2 v2.2007.4 // indirect github.com/dgraph-io/ristretto v0.1.0 // indirect github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ef-ds/deque v1.0.4 // indirect - github.com/emirpasic/gods v1.18.1 // indirect - github.com/ethereum/go-ethereum v1.12.0 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c // indirect github.com/fxamacker/circlehash v0.3.0 // indirect + github.com/getsentry/sentry-go v0.18.0 // indirect github.com/glebarez/go-sqlite v1.21.1 // indirect - github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect - github.com/go-git/go-billy/v5 v5.5.0 // indirect - github.com/go-kit/kit v0.12.0 // indirect - github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect github.com/go-redis/redis/v8 v8.11.5 // indirect github.com/go-stack/stack v1.8.1 // indirect - github.com/gobwas/ws v1.3.0 // indirect github.com/gofrs/flock v0.8.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect github.com/golang/glog v1.1.2 // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/golang/protobuf v1.5.3 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect - github.com/google/go-dap v0.11.0 // indirect - github.com/google/go-github v17.0.0+incompatible // indirect - github.com/google/go-querystring v1.1.0 // indirect - github.com/google/s2a-go v0.1.7 // indirect - github.com/google/uuid v1.4.0 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect - github.com/googleapis/gax-go/v2 v2.12.0 // indirect - github.com/gorilla/mux v1.8.1 // indirect + github.com/google/s2a-go v0.1.4 // indirect + github.com/google/uuid v1.3.1 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect + github.com/googleapis/gax-go/v2 v2.11.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.2 // indirect - github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2 // indirect - github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -116,9 +86,7 @@ require ( github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c // indirect github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 // indirect - github.com/improbable-eng/grpc-web v0.15.0 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/invopop/jsonschema v0.7.0 // indirect github.com/ipfs/bbloom v0.0.4 // indirect github.com/ipfs/go-block-format v0.1.2 // indirect github.com/ipfs/go-cid v0.4.1 // indirect @@ -130,29 +98,22 @@ require ( github.com/ipfs/go-log v1.0.5 // indirect github.com/ipfs/go-log/v2 v2.5.1 // indirect github.com/ipfs/go-metrics-interface v0.0.1 // indirect - github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/jbenet/go-temp-err-catcher v0.1.0 // indirect github.com/jbenet/goprocess v0.1.4 // indirect - github.com/joho/godotenv v1.4.0 // indirect github.com/k0kubun/pp/v3 v3.2.0 // indirect github.com/kevinburke/go-bindata v3.23.0+incompatible // indirect - github.com/kevinburke/ssh_config v1.2.0 // indirect github.com/klauspost/compress v1.16.5 // indirect github.com/klauspost/cpuid/v2 v2.2.5 // indirect github.com/kr/pretty v0.3.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/libp2p/go-libp2p v0.28.1 // indirect - github.com/libp2p/go-libp2p-pubsub v0.9.3 // indirect - github.com/libp2p/go-msgio v0.3.0 // indirect - github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12 // indirect github.com/logrusorgru/aurora v2.0.3+incompatible // indirect github.com/logrusorgru/aurora/v4 v4.0.0 // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mattn/go-runewidth v0.0.14 // indirect - github.com/mattn/go-tty v0.0.4 // indirect github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect github.com/minio/sha256-simd v1.0.1 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -167,57 +128,47 @@ require ( github.com/multiformats/go-varint v0.0.7 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect github.com/onflow/atree v0.6.0 // indirect - github.com/onflow/cadence-tools/lint v0.14.1 // indirect github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f // indirect + github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f // indirect github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13 // indirect - github.com/onflow/flow-go v0.32.4-0.20231211231711-1aba0828ca33 // indirect - github.com/onflow/flow-go/crypto v0.25.0 // indirect github.com/onflow/flow-nft/lib/go/contracts v1.1.0 // indirect github.com/onflow/flow/protobuf/go/flow v0.3.2-0.20231124194313-106cc495def6 // indirect github.com/onflow/nft-storefront/lib/go/contracts v0.0.0-20221222181731-14b90207cead // indirect github.com/onflow/sdks v0.5.0 // indirect - github.com/onflow/wal v0.0.0-20230529184820-bc9f8244608d // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 // indirect - github.com/pelletier/go-toml/v2 v2.0.8 // indirect + github.com/pelletier/go-toml/v2 v2.0.6 // indirect github.com/pierrec/lz4 v2.6.1+incompatible // indirect - github.com/pjbgf/sha1cd v0.3.0 // indirect - github.com/pkg/term v1.2.0-beta.2 // indirect - github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/client_golang v1.16.0 // indirect github.com/prometheus/client_model v0.4.0 // indirect github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.10.1 // indirect github.com/psiemens/graceland v1.0.0 // indirect + github.com/psiemens/sconfig v0.1.0 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.4 // indirect - github.com/rogpeppe/go-internal v1.11.0 // indirect - github.com/rs/cors v1.8.0 // indirect - github.com/rs/zerolog v1.29.0 // indirect + github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/sethvargo/go-retry v0.2.3 // indirect github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect - github.com/skeema/knownhosts v1.2.1 // indirect github.com/slok/go-http-metrics v0.10.0 // indirect - github.com/sourcegraph/jsonrpc2 v0.1.0 // indirect github.com/spaolacci/murmur3 v1.1.0 // indirect - github.com/spf13/cast v1.5.1 // indirect + github.com/spf13/cast v1.5.0 // indirect + github.com/spf13/cobra v1.8.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect - github.com/stoewer/go-strcase v1.3.0 // indirect + github.com/spf13/viper v1.15.0 // indirect github.com/stretchr/objx v0.5.0 // indirect github.com/subosito/gotenv v1.4.2 // indirect github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 // indirect github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c // indirect - github.com/tidwall/pretty v1.2.1 // indirect github.com/tklauser/go-sysconf v0.3.9 // indirect github.com/tklauser/numcpus v0.3.0 // indirect github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d // indirect - github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/vmihailenco/msgpack v4.0.4+incompatible // indirect github.com/vmihailenco/msgpack/v4 v4.3.11 // indirect github.com/vmihailenco/tagparser v0.1.1 // indirect github.com/x448/float16 v0.8.4 // indirect - github.com/xanzy/ssh-agent v0.3.3 // indirect github.com/zeebo/blake3 v0.2.3 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/otel v1.16.0 // indirect @@ -231,36 +182,26 @@ require ( go.uber.org/atomic v1.11.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.16.0 // indirect - golang.org/x/mod v0.13.0 // indirect - golang.org/x/net v0.19.0 // indirect - golang.org/x/oauth2 v0.14.0 // indirect - golang.org/x/sync v0.5.0 // indirect - golang.org/x/sys v0.15.0 // indirect - golang.org/x/text v0.14.0 // indirect - golang.org/x/time v0.3.0 // indirect - golang.org/x/tools v0.14.0 // indirect - golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect - gonum.org/v1/gonum v0.13.0 // indirect - google.golang.org/api v0.149.0 // indirect - google.golang.org/appengine v1.6.8 // indirect - google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sync v0.3.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 // indirect + google.golang.org/api v0.126.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect google.golang.org/protobuf v1.31.0 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect - gopkg.in/warnings.v0 v0.1.2 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + launchpad.net/gocheck v0.0.0-20140225173054-000000000087 // indirect lukechampine.com/blake3 v1.2.1 // indirect modernc.org/libc v1.22.3 // indirect modernc.org/mathutil v1.5.0 // indirect modernc.org/memory v1.5.0 // indirect modernc.org/sqlite v1.21.1 // indirect - nhooyr.io/websocket v1.8.7 // indirect ) - -replace github.com/onflow/flow-cli/flowkit => ./flowkit - -// this is a woraround for the flow-go/crypto cross compliation issue -replace github.com/onflow/flow-go/crypto => github.com/onflow/flow-go/crypto v0.24.9 diff --git a/go.sum b/go.sum index be177c5c1..263187cd6 100644 --- a/go.sum +++ b/go.sum @@ -27,24 +27,24 @@ cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aD cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= -cloud.google.com/go v0.110.10 h1:LXy9GEO+timppncPIAZoOj3l58LIU9k+kn48AN7IO3Y= +cloud.google.com/go v0.110.7 h1:rJyC7nWRg2jWGZ4wSJ5nY65GTdYJkg0cd/uXb+ACI6o= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= -cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= -cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= -cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iam v1.1.1 h1:lW7fzj15aVIXYHREOqjRBV9PsH0Z6u8Y46a1YGvQP4Y= +cloud.google.com/go/iam v1.1.1/go.mod h1:A5avdyVL2tCppe4unb0951eI9jreack+RJ0/d+KUZOU= cloud.google.com/go/kms v1.0.0/go.mod h1:nhUehi+w7zht2XrUfvTRNpxrfayBHqP4lu2NSywui/0= -cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= -cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/kms v1.15.0 h1:xYl5WEaSekKYN5gGRyhjvZKM22GVBBCzegGNVPy+aIs= +cloud.google.com/go/kms v1.15.0/go.mod h1:c9J991h5DTl+kg7gi3MYomh12YEENGrf48ee/N/2CDM= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -55,9 +55,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo= -cloud.google.com/go/storage v1.30.1 h1:uOdMxAs8HExqBlnLtnQyP0YkvbiDpdGShGKtx6U/oNM= -dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk= -dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU= github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9/go.mod h1:bOvUY6CB00SOBii9/FifXqc0awNKxLFCL/+pkDPuyl8= github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= @@ -84,56 +81,25 @@ github.com/FactomProject/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:kGUq github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec h1:1Qb69mGp/UtRPn422BH4/Y4Q3SLUrD9KHuDkm8iodFc= github.com/FactomProject/btcutilecc v0.0.0-20130527213604-d3a63a5752ec/go.mod h1:CD8UlnlLDiqb36L110uqiP2iSflVjx9g/3U9hCI4q2U= github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY= -github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= -github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow= -github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/OneOfOne/xxhash v1.2.5 h1:zl/OfRA6nftbBK9qTohYBJ5xvw6C/oNKizR7cZGl3cI= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/OneOfOne/xxhash v1.2.8 h1:31czK/TI9sNkxIKfaUfGlU47BAxQ0ztGgd9vPyqimf8= -github.com/OneOfOne/xxhash v1.2.8/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371 h1:kkhsdkhsCvIsutKu5zLMgWtgh9YxGCNAw8Ad8hjwfYg= -github.com/ProtonMail/go-crypto v0.0.0-20230828082145-3c4c8a2d2371/go.mod h1:EjAoLdwvbIOoOQr3ihjnSoLZRtE8azugULFRteWMNc0= github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398/go.mod h1:a1uqRtAwp2Xwc6WNPJEufxJ7fx3npB4UV/JOLmbu5I0= -github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= -github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6 h1:fLjPD/aNc3UIOA6tDi6QXUemppXK3P9BI7mr2hd6gx8= github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg= github.com/VictoriaMetrics/fastcache v1.5.3/go.mod h1:+jv9Ckb+za/P1ZRg/sulP5Ni1v49daAVERr0H3CuscE= github.com/VictoriaMetrics/fastcache v1.6.0 h1:C/3Oi3EiBCqufydp1neRZkqcwmEiuRT9c3fqvvgKm5o= github.com/VictoriaMetrics/fastcache v1.6.0/go.mod h1:0qHz5QP0GMX4pfmMA/zt5RgfNuXJrTP0zS7DqpHGGTw= -github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= -github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/ajg/form v1.5.1/go.mod h1:uL1WgH+h2mgNtvBq0339dVnzXdBETtL2LeUXaIv25UY= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= -github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= -github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= -github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= -github.com/apache/thrift v0.13.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= github.com/aristanetworks/goarista v0.0.0-20170210015632-ea17b1a17847/go.mod h1:D/tb0zPVXnP7fmsLZjtdUhSsumbK/ij54UXjjVgMGxQ= -github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= -github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= -github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= -github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a/go.mod h1:DAHtR1m6lCRdSC2Tm3DSWRPvIPr6xNKyeHdqDQSQT+A= -github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQwij/eHl5CU= -github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= -github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= -github.com/aws/aws-sdk-go-v2 v1.17.7 h1:CLSjnhJSTSogvqUGhIC6LqFKATMRexcxLZ0i/Nzk9Eg= -github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.5.1 h1:VGkV9KmhGqOQWnHyi4gLG98kE6OecT42fdrCGFWxJsc= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.3.0 h1:gceOysEWNNwLd6cki65IMBZ4WAM0MwgBQq2n7kejoT8= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.25 h1:5LHn8JQ0qvjD9L9JhMtylnkcw7j05GDZqM9Oin6hpr0= -github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.7.0 h1:HWsM0YQWX76V6MOp07YuTYacm8k7h69ObJuw7Nck+og= -github.com/aws/aws-sdk-go-v2/service/s3 v1.15.0 h1:nPLfLPfglacc29Y949sDxpr3X/blaY40s3B85WT2yZU= -github.com/aws/smithy-go v1.13.5 h1:hgz0X/DX0dGqTYpGALqXJoRKRj5oQ7150i5FdTePzO8= github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible/go.mod h1:osfaiScAUVup+UC9Nfq76eWqDhXlp+4UYaA8uhTBO6g= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/benbjohnson/clock v1.3.5 h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o= @@ -141,23 +107,23 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= -github.com/bits-and-blooms/bitset v1.10.0 h1:ePXTeiPEazB5+opbv5fr8umg2R/1NlzgDsyepwsSr88= -github.com/bits-and-blooms/bitset v1.10.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= +github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/btcsuite/btcd v0.0.0-20171128150713-2e60448ffcc6/go.mod h1:Dmm/EzmjnCiweXmzRIAiUWCInVmPgjkzgv5k4tVyXiQ= +github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3 h1:SDlJ7bAm4ewvrmZtR0DaiYbQGdKPeaaIm7bM+qRhFeU= -github.com/btcsuite/btcd/chaincfg/chainhash v1.0.3/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/bwesterb/go-ristretto v1.2.3/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2 h1:KdUfX2zKommPRa+PD0sWZUyXe9w277ABlgELO7H04IM= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.2/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f/go.mod h1:TdznJufoqS23FtqVCzL0ZqgP5MqXbb4fg/WgDys70nA= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d/go.mod h1:+5NJ2+qvTyV9exUAL/rxXi3DcLg2Ts+ymUAY5y4NvMg= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd/go.mod h1:HHNXQzUsZCxOoE+CPiyCTO6x34Zs86zZUiwtpXoGdtg= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd/go.mod h1:F+uVaaLLH7j4eDXPRvw78tMflu7Ie2bzYOH4Y8rRKBY= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723/go.mod h1:8woku9dyThutzjeg+3xrA5iCpBRH8XEEg3lh6TiUghc= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792/go.mod h1:ghJtEyQwv5/p4Mg4C0fgbePVuGr935/5ddU9Z3TmDRY= +github.com/btcsuite/winsvc v1.0.0/go.mod h1:jsenWakMcC0zFBFurPLEAyrnc/teJEM1O46fmI40EZs= github.com/bytecodealliance/wasmtime-go v0.22.0/go.mod h1:q320gUxqyI8yB+ZqRuaJOEnGkAnHh6WtJjMaT2CW4wI= github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw= -github.com/c-bata/go-prompt v0.2.6 h1:POP+nrHE+DfLYx370bedwNhsqmpCUynWPxuHi0C5vZI= -github.com/c-bata/go-prompt v0.2.6/go.mod h1:/LMAke8wD2FsNu9EXNdHxNLbd9MedkPnCdfpU9wwHfY= -github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= -github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= -github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= @@ -169,18 +135,13 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= -github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= -github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= -github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/clbanning/x2j v0.0.0-20191024224557-825249438eec/go.mod h1:jMjuTZXRI4dUb/I5gc9Hdhagfvm9+RyrPryS/auMzxE= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/circl v1.3.3 h1:fE/Qz0QdIGqeWfnwq0RE0R7MI51s0M2E4Ga9kq5AEMs= -github.com/cloudflare/circl v1.3.3/go.mod h1:5XYMA4rFBvNIrhs50XuiBJ15vF2pZn4nnUKZrLbUZFA= github.com/cloudflare/cloudflare-go v0.10.2-0.20190916151808-a80f83b9add9/go.mod h1:1MxXX1Ux4x6mqPmjkUgTP1CdXIBXKX7T+Jk9Gxrmx+U= github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e h1:0XBUw73chJ1VYSsfvcPvVT7auykAJce9FpRr10L6Qhw= +github.com/cmars/basen v0.0.0-20150613233007-fe3947df716e/go.mod h1:P13beTBKr5Q18lJe1rIoLUqjM+CB1zYrRg44ZqGuQSA= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= @@ -189,7 +150,6 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa/go.mod h1:zn76sxSg3SzpJ0PPJaLDCu+Bu0Lg3sKTORVIj19EIF8= github.com/cockroachdb/datadriven v1.0.2/go.mod h1:a9RdTaap04u637JoCzcUoIcDmvwSUtcUFtT/C3kJlTU= github.com/cockroachdb/datadriven v1.0.3-0.20230801171734-e384cf455877 h1:1MLK4YpFtIEo3ZtMA5C795Wtv5VuUnrXX7mQG+aHg6o= github.com/cockroachdb/errors v1.9.1 h1:yFVvsI0VxmRShfawbt/laCIDy/mtTqqnvoNgiy5bEV8= @@ -201,45 +161,32 @@ github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06 h1:T+Np/xtzIjYM github.com/cockroachdb/pebble v0.0.0-20230906160148-46873a6a7a06/go.mod h1:bynZ3gvVyhlvjLI7PT6dmZ7g76xzJ7HpxfjgkzCGz6s= github.com/cockroachdb/redact v1.1.3 h1:AKZds10rFSIj7qADf0g46UixK8NNLwWTNdCIGS5wfSQ= github.com/cockroachdb/redact v1.1.3/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg= -github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd/go.mod h1:sE/e/2PUdi/liOCUjSTXgM1o87ZssimdTWN964YiIeI= github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0/go.mod h1:4Zcjuz89kmFXt9morQgcfYZAYZ5n8WHjt81YYWIwtTM= -github.com/containerd/cgroups v1.1.0 h1:v8rEWFl6EoqHB+swVNjVoCJE8o3jX7e8nqBGPLaDFBM= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= -github.com/coreos/go-systemd v0.0.0-20180511133405-39ca1b05acc7/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e h1:Wf6HqHfScWJN9/ZjdUKyjop4mf3Qdd+1TvvltAvM3m8= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.3.3-0.20220203105225-a9a7ef127534/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= -github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= -github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= -github.com/cyphar/filepath-securejoin v0.2.4 h1:Ugdm7cg7i6ZK6x3xDF1oEu1nfkyfH53EtKeQYTC3kyg= -github.com/cyphar/filepath-securejoin v0.2.4/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= +github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= -github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c h1:pFUpOrbxDR6AkioZ1ySsx5yxlDQZ8stG2b88gTPxgJU= github.com/davidlazar/go-crypto v0.0.0-20200604182044-b73af7476f6c/go.mod h1:6UhI8N9EjYm1c2odKpFpAYeR8dsBeM7PtzQhRgxRr9U= github.com/deckarep/golang-set v0.0.0-20180603214616-504e848d77ea/go.mod h1:93vsz/8Wt4joVM7c2AVqh+YRMiUSc14yDtF28KmMOgQ= github.com/deckarep/golang-set/v2 v2.1.0 h1:g47V4Or+DUdzbs8FxCCmgb6VYd+ptPAngjM6dtGktsI= github.com/deckarep/golang-set/v2 v2.1.0/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4= -github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f h1:U5y3Y5UE0w7amNe7Z5G/twsBW0KEalRQXZzf8ufSh9I= -github.com/desertbit/timer v0.0.0-20180107155436-c41aec40b27f/go.mod h1:xH/i4TFMt8koVQZ6WFms69WAsDWr2XsYL3Hkl7jkoLE= github.com/dgraph-io/badger v1.6.0/go.mod h1:zwt7syl517jmP8s94KqSxTlM6IMsdhYy6psNgSztDR4= github.com/dgraph-io/badger/v2 v2.2007.4 h1:TRWBQg8UrlUhaFdco01nO2uXwzKS7zd+HVdwV/GHc4o= github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= @@ -253,27 +200,14 @@ github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/r github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/docker/docker v1.4.2-0.20180625184442-8e610b2b55bf/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= -github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= -github.com/dukex/mixpanel v1.0.1 h1:IQ3qBjtgltF044jU9+i6MubdDdpc8PKpK9yvfawRgeE= -github.com/dukex/mixpanel v1.0.1/go.mod h1:080BDsRRMzAxViWT3OjlQaMW9nhaIEXDHHtGeDK60b8= -github.com/dustin/go-humanize v0.0.0-20171111073723-bb3d318650d4/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= -github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= -github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= github.com/edsrzf/mmap-go v0.0.0-20160512033002-935e0e8a636c/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= -github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/ef-ds/deque v1.0.4 h1:iFAZNmveMT9WERAkqLJ+oaABF9AcVQ5AjXem/hroniI= github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385/go.mod h1:0vRUJqYpeSZifjYj7uP3BG/gKcuzL9xWVV/Y+cK33KM= github.com/elastic/gosigar v0.8.1-0.20180330100440-37f05ff46ffa/go.mod h1:cdorVVzy1fhmEqmtgqkoE3bYtCfSCkVyjTyCIo22xvs= -github.com/elastic/gosigar v0.14.2 h1:Dg80n8cr90OZ7x+bAax/QjoW/XqTI11RmA79ZwIm9/4= -github.com/elazarl/goproxy v0.0.0-20230808193330-2592e75ae04a h1:mATvB/9r/3gvcejNsXKSkQ6lcIaNec2nyfOdlTBR2lU= -github.com/emirpasic/gods v1.18.1 h1:FXtiHYKDGKCW2KzwZKx0iC0PQmdlorYgdFG9jPXJ1Bc= -github.com/emirpasic/gods v1.18.1/go.mod h1:8tpGGwCnJ5H4r6BWwaV6OrWmMoPhUl5jm/FMNAnJvWQ= -github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= @@ -289,15 +223,10 @@ github.com/ethereum/go-ethereum v1.12.0 h1:bdnhLPtqETd4m3mS8BGMNvBTf36bO5bx/hxE2 github.com/ethereum/go-ethereum v1.12.0/go.mod h1:/oo2X/dZLJjf2mJ6YT9wcWxa4nNJDBKDBU6sFIpx1Gs= github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072/go.mod h1:duJ4Jxv5lDcvg4QuQr0oowTf7dz4/CR8NtyCooz9HL8= github.com/fatih/color v1.3.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= -github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fjl/memsize v0.0.0-20180418122429-ca190fb6ffbc/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= -github.com/francoispqt/gojay v1.2.13 h1:d2m3sFjloqoIUQU3TsHBgj6qg/BVGlTBeHDUmyJnXKk= -github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= -github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY= +github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= @@ -308,50 +237,28 @@ github.com/fxamacker/cbor/v2 v2.4.1-0.20230228173756-c0c9f774e40c/go.mod h1:TA1x github.com/fxamacker/circlehash v0.1.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= github.com/fxamacker/circlehash v0.3.0 h1:XKdvTtIJV9t7DDUtsf0RIpC1OcxZtPbmgIH7ekx28WA= github.com/fxamacker/circlehash v0.3.0/go.mod h1:3aq3OfVvsWtkWMb6A1owjOQFA+TLsD5FgJflnaQwtMM= -github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= -github.com/gammazero/deque v0.1.0 h1:f9LnNmq66VDeuAlSAapemq/U7hJ2jpIWa4c09q8Dlik= -github.com/gammazero/workerpool v1.1.2 h1:vuioDQbgrz4HoaCi2q1HLlOXdpbap5AET7xu5/qj87g= github.com/gavv/httpexpect v2.0.0+incompatible/go.mod h1:x+9tiU1YnrOvnB725RkpoLv1M62hOWzwo5OXotisrKc= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getsentry/sentry-go v0.12.0/go.mod h1:NSap0JBYWzHND8oMbyi0+XZhUalc1TBdRL1M71JZW2c= -github.com/getsentry/sentry-go v0.26.0 h1:IX3++sF6/4B5JcevhdZfdKIHfyvMmAq/UnqcyT2H6mA= -github.com/getsentry/sentry-go v0.26.0/go.mod h1:lc76E2QywIyW8WuBnwl8Lc4bkmQH4+w1gwTf25trprY= +github.com/getsentry/sentry-go v0.18.0 h1:MtBW5H9QgdcJabtZcuJG80BMOwaBpkRDZkxRkNC1sN0= +github.com/getsentry/sentry-go v0.18.0/go.mod h1:Kgon4Mby+FJ7ZWHFUAZgVaIa8sxHtnRJRLTXZr51aKQ= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/3rZdM= -github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= -github.com/gin-gonic/gin v1.6.3/go.mod h1:75u5sXoLsGZoRN5Sgbi1eraJ4GU3++wFwWzhwvtwp4M= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= github.com/glebarez/go-sqlite v1.21.1 h1:7MZyUPh2XTrHS7xNEHQbrhfMZuPSzhkm2A1qgg0y5NY= github.com/glebarez/go-sqlite v1.21.1/go.mod h1:ISs8MF6yk5cL4n/43rSOmVMGJJjHYr7L2MbZZ5Q4E2E= -github.com/gliderlabs/ssh v0.3.5 h1:OcaySEmAQJgyYcArR+gGGTHCyE7nvhEMTlYY+Dp8CpY= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 h1:+zs/tPmkDkHx3U66DAb0lQFJrpS6731Oaa12ikc+DiI= -github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376/go.mod h1:an3vInlBmSxCcxctByoQdvwPiA7DTK7jaaFDBTtu0ic= -github.com/go-git/go-billy/v5 v5.5.0 h1:yEY4yhzCDuMGSv83oGxiBotRzhwhNr8VZyphhiu+mTU= -github.com/go-git/go-billy/v5 v5.5.0/go.mod h1:hmexnoNsr2SJU1Ju67OaNz5ASJY3+sHgFRpCtpDCKow= -github.com/go-git/go-git-fixtures/v4 v4.3.2-0.20231010084843-55a94097c399 h1:eMje31YglSBqCdIqdhKBW8lokaMrL3uTkpGYlE2OOT4= -github.com/go-git/go-git/v5 v5.11.0 h1:XIZc1p+8YzypNr34itUfSvYJcv+eYdTnTvOZ2vD3cA4= -github.com/go-git/go-git/v5 v5.11.0/go.mod h1:6GFcX2P3NM7FPBfpePbpLd21XxsgdAt+lKqXmCUiUCY= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8= github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= -github.com/go-kit/kit v0.10.0/go.mod h1:xUsJbQ/Fp4kEt7AFgCuvyX4a71u8h9jB8tj/ORgOZ7o= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= -github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= -github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= -github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= -github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -361,39 +268,19 @@ github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab/go.mod h1:/P9AE github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8= github.com/go-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= -github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= -github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= -github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8= -github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= -github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= -github.com/go-playground/universal-translator v0.17.0/go.mod h1:UkSxE5sNxxRwHyU+Scu5vgOQjsIJAF8j9muTVoKLVtA= -github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= -github.com/go-playground/validator/v10 v10.2.0/go.mod h1:uOYAAleCW8F/7oMFd6aG0GOhaH6EGOAJShg8Id5JGkI= -github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI= github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo= -github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-test/deep v1.0.5/go.mod h1:QV8Hv/iy04NyLBxAdO9njL0iVPN1S4d/A3NVv1V36o8= github.com/gobwas/httphead v0.0.0-20180130184737-2c6c146eadee/go.mod h1:L0fX3K22YWvt/FAX9NnzrNzcI4wNYi9Yku4O0LKYflo= -github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= -github.com/gobwas/httphead v0.1.0/go.mod h1:O/RXo79gxV8G+RqlR/otEwx4Q36zl9rqC5u12GKvMCM= github.com/gobwas/pool v0.2.0/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= -github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= -github.com/gobwas/pool v0.2.1/go.mod h1:q8bcK0KcYlCgd9e7WYLm9LpyS+YeLd8JVDW6WezmKEw= github.com/gobwas/ws v1.0.2/go.mod h1:szmBTxLgaFppYjEmNtny/v3w89xOydFnnZMcgRRu/EM= -github.com/gobwas/ws v1.3.0 h1:sbeU3Y4Qzlb+MOzIe6mQGf7QR4Hkv6ZD0qhGkBFL2O0= -github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= -github.com/goccy/go-json v0.9.11 h1:/pAaQDLHEoCq/5FFmSKBswWmK6H0e8g4159Kc/X/nqk= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= -github.com/gogo/googleapis v1.1.0/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= @@ -407,7 +294,6 @@ github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfU github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4= github.com/golang/glog v1.1.2 h1:DVjP2PbBOzHyzA+dn3WhHIq4NdVu3Q+pvivFICf/7fo= github.com/golang/glog v1.1.2/go.mod h1:zR+okUeTbrL6EL3xHUDxZuEtGv04p5shwip1+mL/rLQ= -github.com/golang/groupcache v0.0.0-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -444,7 +330,6 @@ github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= -github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -465,16 +350,9 @@ github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-dap v0.11.0 h1:SpAZJL41rOOvd85PuLCCLE1dteTQOyKNnn0H3DBHywo= -github.com/google/go-dap v0.11.0/go.mod h1:HAeyoSd2WIfTfg+0GRXcFrb+RnojAtGNh+k+XTIxJDE= -github.com/google/go-github v17.0.0+incompatible h1:N0LgJ1j65A7kfXrZnUDaYCs/Sf4rEjNlfyDHW9dolSY= -github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+umXrS52loVEgC2AApnigrVQ= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= -github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= -github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= -github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= github.com/google/martian/v3 v3.1.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -496,29 +374,22 @@ github.com/google/pprof v0.0.0-20210609004039-a478d1d731e9/go.mod h1:kpwsk12EmLe github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= github.com/google/pprof v0.0.0-20230602150820-91b7bce49751 h1:hR7/MlvK23p6+lIw9SN1TigNLn9ZnF3W4SYRKq2gAHs= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= -github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= -github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4= -github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= -github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= +github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= +github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= -github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= -github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= +github.com/googleapis/gax-go/v2 v2.11.0 h1:9V9PWXEsWnPpQhu/PeQIkS4eGzMlTLGgt80cUUI8Ki4= +github.com/googleapis/gax-go/v2 v2.11.0/go.mod h1:DxmR61SGKkGLa2xigwuZIQpkCI2S5iydzRfb3peWZJI= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= -github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= -github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.1 h1:TuBL49tXwgrFYWhqrNgrUNEY92u81SPhu7sTdzQEiWY= -github.com/gorilla/mux v1.8.1/go.mod h1:AKf9I4AEqPTmMytcMc0KkNouC66V3BtZ4qD5fmWSiMQ= -github.com/gorilla/websocket v0.0.0-20170926233335-4201258b820c/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1-0.20190629185528-ae1634f6a989/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/gorilla/websocket v1.4.1/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -528,39 +399,18 @@ github.com/gosuri/uilive v0.0.4 h1:hUEBpQDj8D8jXgtCdBu7sWsy5sbW/5GhuO8KBwJ2jyY= github.com/gosuri/uilive v0.0.4/go.mod h1:V/epo5LjjlDE5RJUcqx8dbw+zc93y5Ya3yg8tfZ74VI= github.com/graph-gophers/graphql-go v0.0.0-20191115155744-f33e81362277/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.1-0.20190118093823-f849b5445de4/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/go-grpc-middleware v1.2.2/go.mod h1:EaizFBKfUKtMIF5iaDEhniwNedqGo9FuLFzppDr3uwI= -github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.2 h1:uxUHSMwWDJ/9jVPHNumRC8WZOi3hrBL22ObVOoLg4ww= -github.com/grpc-ecosystem/go-grpc-middleware/providers/zerolog/v2 v2.0.0-rc.2/go.mod h1:BL7w7qd2l/j9jgY6WMhYutfOFQc0I8RTVwtjpnAMoTM= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-20200501113911-9a95f0fdbfea/go.mod h1:GugMBs30ZSAkckqXEAIEGyYdDH6EgqowG8ppA3Zt+AY= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2 h1:1aeRCnE2CkKYqyzBu0+B2lgTcZPc3ea2lGpijeHbI1c= -github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.2/go.mod h1:GhphxcdlaRyAuBSvo6rV71BvQcvB/vuX8ugCyybuS2k= -github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway v1.9.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.7.0/go.mod h1:hgWBS7lorOAVIJEQMi4ZsPv9hVvWI6+ch50m39Pf2Ks= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= -github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= -github.com/hashicorp/consul/sdk v0.3.0/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= -github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= -github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= -github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= -github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= -github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= -github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= -github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= -github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= -github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= github.com/hashicorp/golang-lru v0.0.0-20160813221303-0a025b7e63ad/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= @@ -570,19 +420,11 @@ github.com/hashicorp/golang-lru/v2 v2.0.2 h1:Dwmkdr5Nc/oBiXgJS3CDHNhJtIHkuZ3DZF5 github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= -github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= -github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= -github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= -github.com/hexops/autogold/v2 v2.2.1 h1:JPUXuZQGkcQMv7eeDXuNMovjfoRYaa0yVcm+F3voaGY= -github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/valast v1.4.4 h1:rETyycw+/L2ZVJHHNxEBgh8KUn+87WugH9MxcEv9PGs= github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c h1:DZfsyhDK1hnSS5lH8l+JggqzEleHteTYfutAiVlSUM8= github.com/holiman/uint256 v1.2.2-0.20230321075855-87b91420868c/go.mod h1:SC8Ryt4n+UBbPbIBKaG9zbbDlp4jOru9xFZmPzLUTxw= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= -github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmKTg= github.com/huin/goupnp v0.0.0-20161224104101-679507af18f3/go.mod h1:MZ2ZmwcBpvOoJ22IJsc7va19ZwoheaBk43rKg12SKag= github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91/go.mod h1:qEIFzExnS6016fRpRfxrExeVn2gbClQA99gQhnIcdhE= github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0 h1:i462o439ZjprVSFSZLZxcsoAe592sZB1rci2Z8j4wdk= @@ -590,13 +432,10 @@ github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= -github.com/improbable-eng/grpc-web v0.15.0 h1:BN+7z6uNXZ1tQGcNAuaU1YjsLTApzkjt2tzCixLaUPQ= -github.com/improbable-eng/grpc-web v0.15.0/go.mod h1:1sy9HKV4Jt9aEs9JSnkWlRJPuPtwNr0l57L4f878wP8= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/influxdata/influxdb v1.2.3-0.20180221223340-01288bdb0883/go.mod h1:qZna6X/4elxqT3yI9iZYdZrWWdeFOOprn86kgg4+IzY= -github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/invopop/jsonschema v0.7.0 h1:2vgQcBz1n256N+FpX3Jq7Y17AjYt46Ig3zIWyy770So= github.com/invopop/jsonschema v0.7.0/go.mod h1:O9uiLokuu0+MGFlyiaqtWxwqJm41/+8Nj0lD7A36YH0= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= @@ -635,30 +474,20 @@ github.com/iris-contrib/pongo2 v0.0.1/go.mod h1:Ssh+00+3GAZqSQb30AvBRNxBx7rf0Gqw github.com/iris-contrib/schema v0.0.1/go.mod h1:urYA3uvUNG1TIIjOSCzHr9/LmbQo8LrOcOqfqxa4hXw= github.com/jackpal/go-nat-pmp v1.0.2-0.20160603034137-1fa385a6f458/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jbenet/go-cienv v0.1.0/go.mod h1:TqNnHUmJgXau0nCzC7kXWeotg3J9W34CUv5Djy1+FlA= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= -github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jbenet/go-temp-err-catcher v0.1.0 h1:zpb3ZH6wIE8Shj2sKS+khgRvf7T7RABoLk/+KKHggpk= github.com/jbenet/go-temp-err-catcher v0.1.0/go.mod h1:0kJRvmDZXNMIiJirNPEYfhpPwbGVtZVWC34vc5WLsDk= github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0o= github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= -github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= -github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= -github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= +github.com/jrick/logrotate v1.0.0/go.mod h1:LNinyqDIJnpAur+b8yyulnQw/wDuN1+BYKlTRt3OuAQ= github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.1.1-0.20170430222011-975b5c4c7c21/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= -github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k= github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= @@ -673,15 +502,12 @@ github.com/kataras/sitemap v0.0.5/go.mod h1:KY2eugMKiPwsJgx7+U103YZehfvNGOXURubc github.com/kevinburke/go-bindata v3.22.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= github.com/kevinburke/go-bindata v3.23.0+incompatible h1:rqNOXZlqrYhMVVAsQx8wuc+LaA73YcfbQ407wAykyS8= github.com/kevinburke/go-bindata v3.23.0+incompatible/go.mod h1:/pEEZ72flUW2p0yi30bslSp9YqD9pysLxunQDdb2CPM= -github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= -github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23/go.mod h1:J+Gs4SYgM6CZQHDETBtE9HaSEkGmuNXF86RwHhHUvq4= github.com/klauspost/compress v1.8.2/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.9.7/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= -github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.7/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= github.com/klauspost/compress v1.12.3/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.16.5 h1:IFV2oUNUzZaz+XyusxpLzpzS8Pt5rh0Z16For/djlyI= github.com/klauspost/compress v1.16.5/go.mod h1:ntbaceVETuRiXiv4DpjP66DpAtAGkEQskQzEyD//IeE= @@ -690,7 +516,6 @@ github.com/klauspost/cpuid/v2 v2.0.12/go.mod h1:g2LTdtYhdyuGPqyWyv7qRAmj1WBqxuOb github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= @@ -707,27 +532,16 @@ github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+ github.com/labstack/echo/v4 v4.5.0/go.mod h1:czIriw4a0C1dFun+ObrXp7ok03xON0N1awStJ6ArI7Y= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= -github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII= -github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/libp2p/go-cidranger v1.1.0 h1:ewPN8EZ0dd1LSnrtuwd4709PXVcITVeuwbag38yPW7c= -github.com/libp2p/go-flow-metrics v0.1.0 h1:0iPhMI8PskQwzh57jB9WxIuIOQ0r+15PChFGkx3Q3WM= github.com/libp2p/go-libp2p v0.28.1 h1:YurK+ZAI6cKfASLJBVFkpVBdl3wGhFi6fusOt725ii8= github.com/libp2p/go-libp2p v0.28.1/go.mod h1:s3Xabc9LSwOcnv9UD4nORnXKTsWkPMkIMB/JIGXVnzk= github.com/libp2p/go-libp2p-asn-util v0.3.0 h1:gMDcMyYiZKkocGXDQ5nsUQyquC9+H+iLEQHwOCZ7s8s= github.com/libp2p/go-libp2p-kbucket v0.6.3 h1:p507271wWzpy2f1XxPzCQG9NiN6R6lHL9GiSErbQQo0= github.com/libp2p/go-libp2p-pubsub v0.9.3 h1:ihcz9oIBMaCK9kcx+yHWm3mLAFBMAUsM4ux42aikDxo= -github.com/libp2p/go-libp2p-pubsub v0.9.3/go.mod h1:RYA7aM9jIic5VV47WXu4GkcRxRhrdElWf8xtyli+Dzc= -github.com/libp2p/go-libp2p-testing v0.12.0 h1:EPvBb4kKMWO29qP4mZGyhVzUyR25dvfUIK5WDu6iPUA= github.com/libp2p/go-msgio v0.3.0 h1:mf3Z8B1xcFN314sWX+2vOTShIE0Mmn2TXn3YCUQGNj0= -github.com/libp2p/go-msgio v0.3.0/go.mod h1:nyRM819GmVaF9LX3l03RMh10QdOroF++NBbxAb0mmDM= -github.com/libp2p/go-netroute v0.2.1 h1:V8kVrpD8GK0Riv15/7VN6RbUQ3URNZVosw7H2v9tksU= -github.com/libp2p/go-reuseport v0.3.0 h1:iiZslO5byUYZEg9iCwJGf5h+sf1Agmqx2V2FDjPyvUw= github.com/libp2p/go-yamux/v4 v4.0.0 h1:+Y80dV2Yx/kv7Y7JKu0LECyVdMXm1VUoko+VQ9rBfZQ= -github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= -github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12 h1:qFV7dBLhw5z4hka5gjtIzg1Kq9ie8t8P7Cy0uIxRyAQ= github.com/lmars/go-slip10 v0.0.0-20190606092855-400ba44fee12/go.mod h1:QIsK6U93yCP6TnGsShCv5wl4gcz/mpCHl+aToBsl5Sc= github.com/logrusorgru/aurora v0.0.0-20200102142835-e9ef32dff381/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= @@ -735,14 +549,9 @@ github.com/logrusorgru/aurora v2.0.3+incompatible h1:tOpm7WcpBTn4fjmVfgpQq0EfczG github.com/logrusorgru/aurora v2.0.3+incompatible/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4= github.com/logrusorgru/aurora/v4 v4.0.0 h1:sRjfPpun/63iADiSvGGjgA1cAYegEWMPCJdUpJYn9JA= github.com/logrusorgru/aurora/v4 v4.0.0/go.mod h1:lP0iIa2nrnT/qoFXcOZSrZQpJ1o6n2CUf/hyHi2Q4ZQ= -github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0QoUACkjt2znoq26NVQ= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= -github.com/manifoldco/promptui v0.9.0 h1:3V4HzJk1TtXW1MTZMP7mdlwbBpIinw3HztaIlYthEiA= -github.com/manifoldco/promptui v0.9.0/go.mod h1:ka04sppxSGFAtxX0qhlYQjISsg9mR4GWtQEhdbn6Pgg= -github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= -github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.0/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -754,8 +563,6 @@ github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxec github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= -github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= -github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.5-0.20180830101745-3fb116b82035/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= @@ -764,52 +571,37 @@ github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcME github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0= -github.com/mattn/go-tty v0.0.4 h1:NVikla9X8MN0SQAqCYzpGyXv0jY7MNl3HOWD2dkle7E= -github.com/mattn/go-tty v0.0.4/go.mod h1:u5GGXBtZU6RQoKV8gY5W6UhMudbR5vXnUe7j3pxse28= github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= github.com/mediocregopher/radix/v3 v3.4.2/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.2/go.mod h1:iVP4YcDBq+n/5fb23BhYFvIMq/leAFZyRl6bYmGDlGc= -github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.54 h1:5jon9mWcb0sFJGpnI99tOMhCPyJ+RPVz5b63MQG0VWI= -github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b h1:z78hV3sbSMAUoyUMM0I83AUIT6Hu17AWfgjzIbtrYFc= -github.com/mikioh/tcpopt v0.0.0-20190314235656-172688c1accc h1:PTfri+PuQmWDqERdnNMiD9ZejrlswWrCpBEZgWOiTrc= github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1/go.mod h1:pD8RvIylQ358TN4wwqatJ8rNavkEINozVn9DtGI3dfQ= github.com/minio/sha256-simd v0.1.1-0.20190913151208-6de447530771/go.mod h1:B5e1o+1/KgNmWrSQK08Y6Z1Vb5pwIktudl0J58iy0KM= github.com/minio/sha256-simd v1.0.1 h1:6kaan5IFmwTNynnKKpDHe6FWHohJOHhCPchzK49dzMM= github.com/minio/sha256-simd v1.0.1/go.mod h1:Pz6AKMiUdngCLpeTL/RJY1M9rUuPMYujV5xJjtbRSN8= -github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= -github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= -github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= -github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= -github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/moul/http2curl v1.0.0/go.mod h1:8UbvGypXm98wA/IqH45anm5Y2Z6ep6O31QGOAZ3H0fQ= github.com/mr-tron/base58 v1.1.0/go.mod h1:xcD2VGqlgYjBdcBLw+TuYLr8afG+Hj8g2eTVqeSzSU8= github.com/mr-tron/base58 v1.1.3/go.mod h1:BinMc/sQntlIE1frQmRFPUoPA1Zkr8VRgBdjWI2mNwc= @@ -823,7 +615,6 @@ github.com/multiformats/go-base36 v0.2.0/go.mod h1:qvnKE++v+2MWCfePClUEjE78Z7P2a github.com/multiformats/go-multiaddr v0.9.0 h1:3h4V1LHIk5w4hJHekMKWALPXErDfz/sggzwC/NcqbDQ= github.com/multiformats/go-multiaddr v0.9.0/go.mod h1:mI67Lb1EeTOYb8GQfL/7wpIZwc46ElrvzhYnoJOmTT0= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= -github.com/multiformats/go-multiaddr-fmt v0.1.0 h1:WLEFClPycPkp4fnIzoFoV9FVd49/eQsuaL3/CWe167E= github.com/multiformats/go-multibase v0.0.1/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/gviWFaSteVbWT51qgs= github.com/multiformats/go-multibase v0.2.0 h1:isdYCVLvksgWlMW9OZRYJEa9pZETFivncJHmHnnd87g= github.com/multiformats/go-multibase v0.2.0/go.mod h1:bFBZX4lKCA/2lyOFSAoKH5SS6oPyjtnzK/XTFDPkNuk= @@ -838,25 +629,15 @@ github.com/multiformats/go-varint v0.0.5/go.mod h1:3Ls8CIEsrijN6+B7PbrXRPxHRPuXS github.com/multiformats/go-varint v0.0.7 h1:sWSGR+f/eu5ABZA2ZpYKBILXTTs9JWpdEM/nEGOHFS8= github.com/multiformats/go-varint v0.0.7/go.mod h1:r8PUYw/fD/SjBCiKOoDlGF6QawOELpZAu9eioSos/OU= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= -github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= -github.com/mwitkow/grpc-proxy v0.0.0-20181017164139-0f1106ef9c76/go.mod h1:x5OoJHDHqxHS801UIuhqGl6QdSAEJvtausosHSdazIo= github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= -github.com/nats-io/jwt v0.3.2/go.mod h1:/euKqTS1ZD+zzjYrY7pseZrTtWQSjujC7xjPc8wL6eU= -github.com/nats-io/nats-server/v2 v2.1.2/go.mod h1:Afk+wRZqkMQs/p45uXdrVLuab3gwv3Z8C4HTBu8GD/k= github.com/nats-io/nats.go v1.9.1/go.mod h1:ZjDU1L/7fJ09jvUSRVBR2e7+RnLiiIQyqyzEE/Zbp4w= github.com/nats-io/nkeys v0.1.0/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= -github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxziKVo7w= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= -github.com/nightlyone/lockfile v1.0.0 h1:RHep2cFKK4PonZJDdEl4GmkabuhbsRMgk/k3uAmxBiA= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= -github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= -github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= -github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.1/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.2-0.20190409134802-7e037d187b0c/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= @@ -867,16 +648,6 @@ github.com/onflow/atree v0.6.0/go.mod h1:gBHU0M05qCbv9NN0kijLWMgC47gHVNBIp4KmsVF github.com/onflow/cadence v0.20.1/go.mod h1:7mzUvPZUIJztIbr9eTvs+fQjWWHTF8veC+yk4ihcNIA= github.com/onflow/cadence v0.42.6 h1:VtI0EpKrdbfqITRMsvyZC4dhgcW1x1LNUQuEpdMDzus= github.com/onflow/cadence v0.42.6/go.mod h1:raU8va8QRyTa/eUbhej4mbyW2ETePfSaywoo36MddgE= -github.com/onflow/cadence-tools/languageserver v0.33.3 h1:o6f2kPxsgSruH+HT8CakcZlm43QX5WtIuW6XVh/R5DM= -github.com/onflow/cadence-tools/languageserver v0.33.3/go.mod h1:rUy3zxWWZl+KYAyzhAcnrYNI8ZDKI242RFK8Q9w+90M= -github.com/onflow/cadence-tools/lint v0.14.1 h1:Qkw8+q+ALfB62W7KWHMFh+90gTfJ+NoFulYETMCTkcI= -github.com/onflow/cadence-tools/lint v0.14.1/go.mod h1:w1xfiiPpZ35v/F+2+MF/Rily7LcIgE0dm/FMW1vQkpc= -github.com/onflow/cadence-tools/test v0.14.5 h1:u1kYkotKdwKEf9c3h65mI3VMevBkHY+7WsOiOLamjzU= -github.com/onflow/cadence-tools/test v0.14.5/go.mod h1:ix09Bb3GQ/fZMNpSR8E+vSFItGF54fzP9gFxU7AsOIw= -github.com/onflow/fcl-dev-wallet v0.7.4 h1:vI6t3U0AO88R/Iitn5KsnniSpbN9Lqsqwvi9EJT4C0k= -github.com/onflow/fcl-dev-wallet v0.7.4/go.mod h1:kc42jkiuoPJmxMRFjfbRO9XvnR/3XLheaOerxVMDTiw= -github.com/onflow/flixkit-go v1.1.1 h1:ARgLsfWxc3LjgUHUAELildY5lxJ6kA4gVfAS2+ZRaCE= -github.com/onflow/flixkit-go v1.1.1/go.mod h1:XkbRPv6drM8uQpvdKgZ5stShtOlOMiQ6Fy86D0EsW5U= github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f h1:S8yIZw9LFXfYD1V5H9BiixihHw3GrXVPrmfplSzYaww= github.com/onflow/flow-core-contracts/lib/go/contracts v1.2.4-0.20231016154253-a00dbf7c061f/go.mod h1:jM6GMAL+m0hjusUgiYDNrixPQ6b9s8xjoJQoEu5bHQI= github.com/onflow/flow-core-contracts/lib/go/templates v1.2.4-0.20231016154253-a00dbf7c061f h1:Ep+Mpo2miWMe4pjPGIaEvEzshRep30dvNgxqk+//FrQ= @@ -885,11 +656,12 @@ github.com/onflow/flow-emulator v0.59.0 h1:KIfm9/+x62KqcZDjqE35fkuvVuY506OZ917xN github.com/onflow/flow-emulator v0.59.0/go.mod h1:Js1KKaXrui2yKKkXAlKTqmByRySis6/FH+vkGA6Kqu0= github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13 h1:B4ll7e3j+MqTJv2122Enq3RtDNzmIGRu9xjV7fo7un0= github.com/onflow/flow-ft/lib/go/contracts v0.7.1-0.20230711213910-baad011d2b13/go.mod h1:kTMFIySzEJJeupk+7EmXs0EJ6CBWY/MV9fv9iYQk+RU= -github.com/onflow/flow-go v0.32.4-0.20231211231711-1aba0828ca33 h1:QCUFvIlE4Y7OMp3ZqXMCOw7emLV0jBMcC5BSoNX375Q= -github.com/onflow/flow-go v0.32.4-0.20231211231711-1aba0828ca33/go.mod h1:+MttssV2daiKbbTOLDfeTWU1affMjC+1mcR3fnqWtGM= +github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c h1:75LED6hmarR0uazKZG8nkqqDlUiqz6NdzkdQQiGjvlI= +github.com/onflow/flow-go v0.32.4-0.20231130134727-3c01c7f8966c/go.mod h1:YJDAoDjbY4OWBj44XV+Qe+dIwn+hlywUDL5xclOOLbw= github.com/onflow/flow-go-sdk v0.24.0/go.mod h1:IoptMLPyFXWvyd9yYA6/4EmSeeozl6nJoIv4FaEMg74= github.com/onflow/flow-go-sdk v0.41.17 h1:HpNn3j2fqLGA6H3HGfAuh2A+TsPBv8gWO3kvK9Hvtic= github.com/onflow/flow-go-sdk v0.41.17/go.mod h1:ZIj2XBI9R0QiKzbI6iPwOeqyIy/M4+atczoMOEWdKYw= +github.com/onflow/flow-go/crypto v0.21.3/go.mod h1:vI6V4CY3R6c4JKBxdcRiR/AnjBfL8OSD97bJc60cLuQ= github.com/onflow/flow-go/crypto v0.24.9 h1:0EQp+kSZYJepMIiSypfJVe7tzsPcb6UXOdOtsTCDhBs= github.com/onflow/flow-go/crypto v0.24.9/go.mod h1:fqCzkIBBMRRkciVrvW21rECKq1oD7Q6u+bCI78lfNX0= github.com/onflow/flow-nft/lib/go/contracts v1.1.0 h1:rhUDeD27jhLwOqQKI/23008CYfnqXErrJvc4EFRP2a0= @@ -902,99 +674,54 @@ github.com/onflow/nft-storefront/lib/go/contracts v0.0.0-20221222181731-14b90207 github.com/onflow/sdks v0.5.0 h1:2HCRibwqDaQ1c9oUApnkZtEAhWiNY2GTpRD5+ftdkN8= github.com/onflow/sdks v0.5.0/go.mod h1:F0dj0EyHC55kknLkeD10js4mo14yTdMotnWMslPirrU= github.com/onflow/wal v0.0.0-20230529184820-bc9f8244608d h1:gAEqYPn3DS83rHIKEpsajnppVD1+zwuYPFyeDVFaQvg= -github.com/onflow/wal v0.0.0-20230529184820-bc9f8244608d/go.mod h1:iMC8gkLqu4nkbkAla5HkSBb+FGyQOZiWz3DYm2wSXCk= -github.com/onflowser/flowser/v3 v3.1.3 h1:Y8HyQRwhroCWGcV2UPBD+GZDLHTzu2GjdaBoIEn6YAU= -github.com/onflowser/flowser/v3 v3.1.3/go.mod h1:3UZqdIyKVh+wXOhz9p2YrVl+ZvxohxhAmdM68dDKYPE= github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= -github.com/onsi/ginkgo/v2 v2.9.7 h1:06xGQy5www2oN160RtEZoTvnP2sPhEfePYmCDc2szss= github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= -github.com/onsi/gomega v1.27.10 h1:naR28SdDFlqrG6kScpT8VWpu1xWY5nJRCF3XaYyBjhI= -github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= -github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492/go.mod h1:Ngi6UdF0k5OKD5t5wlmGhe/EDKPoUM3BXZSSfIuJbis= -github.com/opentracing/basictracer-go v1.0.0/go.mod h1:QfBfYuafItcjQuMwinw9GhYKwFXS9KnPs5lxoYwgW74= -github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= -github.com/openzipkin-contrib/zipkin-go-opentracing v0.4.5/go.mod h1:/wsWhb9smxSfWAKL3wpBW7V8scJMt8N8gnaMCS9E/cA= -github.com/openzipkin/zipkin-go v0.1.6/go.mod h1:QgAqvLzwWbR/WpD4A3cGpPtJrZXNIiJc5AZX7/PBEpw= -github.com/openzipkin/zipkin-go v0.2.1/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/openzipkin/zipkin-go v0.2.2/go.mod h1:NaW6tEwdmWMaCDZzg8sh+IBNOxHMPnhQw8ySjnjRyN4= -github.com/pact-foundation/pact-go v1.0.4/go.mod h1:uExwJY4kCzNPcHRj+hCR/HBbOOIwwtUjcrb0b5/5kLM= -github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58/go.mod h1:DXv8WO4yhMYhSNPKjeNKa5WY9YCIEBRbNzFFPJbWO6Y= github.com/pborman/uuid v0.0.0-20170112150404-1b00554d8222/go.mod h1:VyrYX9gd7irzKovcSS6BIIEwPRkP2Wm2m9ufcdFSJ34= -github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k= github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= -github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ= -github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4= -github.com/performancecopilot/speed v3.0.0+incompatible/go.mod h1:/CLtqpZ5gBg1M9iaPbIdPPGyKcA8hKdoy6hAWba7Yac= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= -github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= -github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pierrec/lz4 v2.6.1+incompatible h1:9UY3+iC23yxF0UfGaYrGplQ+79Rg+h/q9FV9ix19jjM= github.com/pierrec/lz4 v2.6.1+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= github.com/pingcap/errors v0.11.4 h1:lFuQV/oaUMGcD2tqt+01ROSmJs75VG1ToEOkZIZ4nE4= github.com/pingcap/errors v0.11.4/go.mod h1:Oi8TUi2kEtXXLMJk9l1cGmz20kV3TaQ0usTwv5KuLY8= -github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= -github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= -github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= -github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= github.com/pkg/sftp v1.13.1/go.mod h1:3HaPG6Dq1ILlpPZRO0HVMrsydcdLt6HRDccSgb87qRg= github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= -github.com/pkg/term v1.2.0-beta.2 h1:L3y/h2jkuBVFdWiJvNfYfKmzcCnILw7mJWm2JQuMppw= -github.com/pkg/term v1.2.0-beta.2/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= -github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= -github.com/prometheus/client_golang v0.9.3-0.20190127221311-3c4408c8b829/go.mod h1:p2iRAGwDERtqlqzRXnrOVns+ignqQo//hLXqYxZYVNs= github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso= -github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= -github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= -github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8= github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/client_model v0.0.0-20190115171406-56726106282f/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.1.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.2.0/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY= github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU= github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.2.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.7.0/go.mod h1:DjGbpBbp5NYNiECxcL/VnbXCCaQpKd3tt26CguLLsqA= -github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= -github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/common v0.42.0/go.mod h1:xBwqVerjNdUDjgODMpudtOMwlOwf2SaTr1yjz4b7Zbc= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190117184657-bf6a532e95b1/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.8/go.mod h1:7Qr8sr6344vo1JqZ6HhLceV9o3AJ1Ff+GxbHq6oeK9A= -github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= -github.com/prometheus/procfs v0.3.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.10.1 h1:kYK1Va/YMlutzCGazswoHKo//tZVlFpKYh+PymziUAg= github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/tsdb v0.6.2-0.20190402121629-4f204dcbc150/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= @@ -1003,13 +730,6 @@ github.com/psiemens/graceland v1.0.0 h1:L580AVV4Q2XLcPpmvxJRH9UpEAYr/eu2jBKmMglh github.com/psiemens/graceland v1.0.0/go.mod h1:1Tof+vt1LbmcZFE0lzgdwMN0QBymAChG3FRgDx8XisU= github.com/psiemens/sconfig v0.1.0 h1:xfWqW+TRpih7mXZIqKYTmpRhlZLQ1kbxV8EjllPv76s= github.com/psiemens/sconfig v0.1.0/go.mod h1:+MLKqdledP/8G3rOBpknbLh0IclCf4WneJUtS26JB2U= -github.com/quic-go/qtls-go1-19 v0.3.2 h1:tFxjCFcTQzK+oMxG6Zcvp4Dq8dx4yD3dDiIiyc86Z5U= -github.com/quic-go/qtls-go1-20 v0.2.2 h1:WLOPx6OY/hxtTxKV1Zrq20FtXtDEkeY00CGQm8GEa3E= -github.com/quic-go/quic-go v0.33.0 h1:ItNoTDN/Fm/zBlq769lLJc8ECe9gYaW40veHCCco7y0= -github.com/radovskyb/watcher v1.0.7 h1:AYePLih6dpmS32vlHfhCeli8127LzkIgwJGcwwe8tUE= -github.com/radovskyb/watcher v1.0.7/go.mod h1:78okwvY5wPdzcb1UYnip1pvrZNIVEIh/Cm+ZuvsUYIg= -github.com/raulk/go-watchdog v1.3.0 h1:oUmdlHxdkXRJlwfG0O9omj8ukerm8MEQavSiDTEtBsk= -github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE= github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= @@ -1023,32 +743,21 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= +github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= -github.com/rogpeppe/go-internal v1.11.0/go.mod h1:ddIwULY96R17DhadqLgMfk9H9tvdUzkipdSkR5nkCZA= github.com/rs/cors v0.0.0-20160617231935-a62a804a8a00/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= -github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= -github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xhandler v0.0.0-20160618193221-ed27b6fd6521/go.mod h1:RvLn4FgxWubrpZHtQLnOf6EwhN2hEMusxZOhcW9H3UQ= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.4.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.19.0/go.mod h1:IzD0RJ65iWH0w97OQQebJEvTZYvsCUm9WVLWBQrJRjo= github.com/rs/zerolog v1.29.0 h1:Zes4hju04hjbvkVkOhdl2HpZa+0PmVwigmo8XoORE5w= github.com/rs/zerolog v1.29.0/go.mod h1:NILgTygv/Uej1ra5XxGf82ZFSLk58MFGAUS2o6usyD0= github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= -github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= github.com/schollz/progressbar/v3 v3.8.3/go.mod h1:pWnVCjSBZsT2X3nx9HfRdnCDrpbevliMeoEVhStwHko= github.com/schollz/progressbar/v3 v3.13.1 h1:o8rySDYiQ59Mwzy2FELeHY5ZARXZTVJC7iHD6PEFUiE= -github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= -github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8= -github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I= github.com/sethvargo/go-retry v0.2.3 h1:oYlgvIvsju3jNbottWABtbnoLC+GDtLdBHxKWxQm/iU= github.com/sethvargo/go-retry v0.2.3/go.mod h1:1afjQuvh7s4gflMObvjLPaWgluLLyhA1wmVZ6KLpICw= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible h1:Bn1aCHHRnjv4Bl16T8rcaFjYSrGrIZvpiGO6P3Q4GpU= @@ -1056,52 +765,38 @@ github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= -github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= -github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= -github.com/skeema/knownhosts v1.2.1 h1:SHWdIUa82uGZz+F+47k8SY4QhhI291cXCpopT1lK2AQ= -github.com/skeema/knownhosts v1.2.1/go.mod h1:xYbVRSPxqBZFrdmDyMmsOs+uX1UZC3nTN3ThzgDxUwo= github.com/slok/go-http-metrics v0.10.0 h1:rh0LaYEKza5eaYRGDXujKrOln57nHBi4TtVhmNEpbgM= github.com/slok/go-http-metrics v0.10.0/go.mod h1:lFqdaS4kWMfUKCSukjC47PdCeTk+hXDUVm8kLHRqJ38= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= -github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= -github.com/sourcegraph/jsonrpc2 v0.1.0 h1:ohJHjZ+PcaLxDUjqk2NC3tIGsVa5bXThe1ZheSXOjuk= -github.com/sourcegraph/jsonrpc2 v0.1.0/go.mod h1:ZafdZgk/axhT1cvZAPOhw+95nz2I/Ra5qMlU4gTRwIo= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.0.1-0.20190317074736-539464a789e9/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/afero v1.10.0/go.mod h1:UBogFpq8E9Hx+xc5CNTTEpTnuHVmXDwZcZcE1eb/UhQ= +github.com/spf13/afero v1.9.4 h1:Sd43wM1IWz/s1aVXdOBkjJvuP8UdyqioeE4AmM0QsBs= +github.com/spf13/afero v1.9.4/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= -github.com/spf13/cast v1.5.1 h1:R+kOtfhWQE6TVQzY+4D7wJLBgkdVasCEFxSUBYBYIlA= -github.com/spf13/cast v1.5.1/go.mod h1:b9PdjNptOpzXr7Rq1q9gJML/2cdGQAo69NKzQ10KN48= -github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= +github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= -github.com/spf13/pflag v1.0.1/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.16.0 h1:rGGH0XDZhdUOryiDWjmIvUSWpbNqisK8Wk0Vyefw8hc= -github.com/spf13/viper v1.16.0/go.mod h1:yg78JgCJcbrQOvV9YLXgkLaZqUidkY9K+Dd1FofRzQg= +github.com/spf13/viper v1.15.0 h1:js3yy885G8xwJa6iOISGFwd+qlUo5AvyXb7CiihdtiU= +github.com/spf13/viper v1.15.0/go.mod h1:fFcTBJxvhhzSJiZy8n+PeW6t8l+KeT/uTARa0jHOQLA= github.com/status-im/keycard-go v0.0.0-20190316090335-8537d3370df4/go.mod h1:RZLeN1LMWmRsyYjvAu+I6Dm9QmlDaIIt+Y+4Kd7Tp+Q= github.com/steakknife/bloomfilter v0.0.0-20180922174646-6819c0d2a570/go.mod h1:8OR4w3TdeIHIh1g6EMY5p0gVNOovcWC+1vpc7naMuAw= github.com/steakknife/hamming v0.0.0-20180906055917-c99c65617cd3/go.mod h1:hpGUWaI9xL8pRQCTXQgocU38Qw1g0Us7n5PxxTwTCYU= -github.com/stoewer/go-strcase v1.3.0 h1:g0eASXYtp+yvN9fK8sH94oCIk0fau9uV1/ZdJ0AVEzs= -github.com/stoewer/go-strcase v1.3.0/go.mod h1:fAH5hQ5pehh+j3nZfvwdk2RgEgQjAoM8wodgtPmh1xo= -github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= -github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= @@ -1118,12 +813,11 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.3/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= github.com/subosito/gotenv v1.4.2 h1:X1TuBLAMDFbaTAChgCBLu3DU3UPyELpnF2jjJ2cz/S8= github.com/subosito/gotenv v1.4.2/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.10/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.4/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/supranational/blst v0.3.11-0.20230406105308-e9dfc5ee724b h1:u49mjRnygnB34h8OKbnNJFVUtWSKIKb1KukdV8bILUM= github.com/syndtr/goleveldb v1.0.1-0.20190923125748-758128399b1d/go.mod h1:9OrXJhf154huy1nPWmuSrkgjPUtUNhA+Zmy+6AESzuA= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= @@ -1131,13 +825,11 @@ github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45 github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c h1:HelZ2kAFadG0La9d+4htN4HzQ68Bm2iM9qKMSMES6xg= github.com/texttheater/golang-levenshtein/levenshtein v0.0.0-20200805054039-cae8b0eaed6c/go.mod h1:JlzghshsemAMDGZLytTFY8C1JQxQPhnatWqNwUXjggo= github.com/thoas/go-funk v0.9.2 h1:oKlNYv0AY5nyf9g+/GhMgS/UO2ces0QRdPKwkhY3VCk= -github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= -github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= +github.com/thoas/go-funk v0.9.2/go.mod h1:+IWnUfUmFO1+WVYQWQtIJHeRRdaIyyYglZN7xzUPe4Q= github.com/tklauser/go-sysconf v0.3.9 h1:JeUVdAOWhhxVcU6Eqr/ATFHgXk/mmiItdKeJPev3vTo= github.com/tklauser/go-sysconf v0.3.9/go.mod h1:11DU/5sG7UexIrp/O6g35hrWzu0JxlwQ3LSFUzyeuhs= github.com/tklauser/numcpus v0.3.0 h1:ILuRUQBtssgnxw0XXIjKUC56fgnOrFoQQ/4+DeU2biQ= github.com/tklauser/numcpus v0.3.0/go.mod h1:yFGUr7TUHQRAhyqBcEg0Ge34zDBAsIvJJcyE6boqnA8= -github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d h1:5JInRQbk5UBX8JfUvKh2oYTLMVwj3p6n+wapDDm7hko= github.com/turbolent/prettier v0.0.0-20220320183459-661cc755135d/go.mod h1:Nlx5Y115XQvNcIdIy7dZXaNSUpzwBSge4/Ivk93/Yog= @@ -1145,12 +837,9 @@ github.com/tyler-smith/go-bip39 v1.0.1-0.20181017060643-dbb3b84ba2ef/go.mod h1:s github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= -github.com/ugorji/go/codec v1.2.7 h1:YPXUKf7fYbp/y8xloBqZOw2qaVggbfwMlI8WM3wZUJ0= -github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -1167,8 +856,6 @@ github.com/vmihailenco/tagparser v0.1.1/go.mod h1:OeAg3pn3UbLjkWt+rN9oFYB6u/cQgq github.com/wsddn/go-ecdh v0.0.0-20161211032359-48726bab9208/go.mod h1:IotVbo4F+mw0EzQ08zFqg7pK3FebNXpaMsRy2RT+Ees= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= -github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= -github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= @@ -1193,10 +880,6 @@ github.com/zeebo/pcg v1.0.0/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l github.com/zeebo/pcg v1.0.1 h1:lyqfGeWiv4ahac6ttHs+I5hwtH/+1mrhlCtVNQM2kHo= github.com/zeebo/pcg v1.0.1/go.mod h1:09F0S9iiKrwn9rlI5yjLkmrug154/YRW6KnnXVDM/l4= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.3/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/etcd v0.0.0-20191023171146-3cf2f69b5738/go.mod h1:dnLIgRNXwCJa5e+c6mIZCrds/GIG4ncV9HhK5PX7jPg= -go.opencensus.io v0.20.1/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= -go.opencensus.io v0.20.2/go.mod h1:6WKK9ahsWS3RSO+PY9ZHZUfv2irvY6gN279GOPZjmmk= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -1223,9 +906,7 @@ go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLk go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.opentelemetry.io/proto/otlp v0.19.0 h1:IVN6GR+mhC4s5yfcTbmzHYODqvWAp3ZedA2SJPI1Nnw= go.opentelemetry.io/proto/otlp v0.19.0/go.mod h1:H7XAot3MsfNsj7EXtrA2q5xSNQ10UqI405h3+duxN4U= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE= @@ -1234,21 +915,19 @@ go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ= go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20170613210332-850760c427c5/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20170930174604-9419663f5a44/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -1257,18 +936,17 @@ golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20191227163750-53104e6ec876/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200117160349-530e935923ad/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220622213112-05595931fe9d/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.3.1-0.20221117191849-2c476679df9a/go.mod h1:hebNnKkNXi2UzZN1eVRvBB7co0a+JxK6XbPiWVs/3J4= -golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.16.0 h1:mMMrFzRSCF0GvB7Ne27XVtVAaXLrPmgPC7/v0tkwHaY= -golang.org/x/crypto v0.16.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220314234659-1baeb1ce4c0b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1282,7 +960,6 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20200331195152-e8c3332aa8e5/go.mod h1:4M0jN8W1tt0AVLNr8HDosyJCDCDuyL9N9+3m7wDWgKw= golang.org/x/exp v0.0.0-20230321023759-10a507213a29 h1:ooxPy7fPvB4kwsA2h+iBNHkAbp/4JxTSwCmvdjEYmug= golang.org/x/exp v0.0.0-20230321023759-10a507213a29/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= @@ -1312,18 +989,13 @@ golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= -golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY= -golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190327091125-710a502c58a2/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= @@ -1332,11 +1004,9 @@ golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= @@ -1345,7 +1015,6 @@ golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLL golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= -golang.org/x/net v0.0.0-20200421231249-e086a090c8fd/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= @@ -1365,15 +1034,11 @@ golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211008194852-3b03d305991f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= -golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= -golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= -golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c= -golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -1390,8 +1055,8 @@ golang.org/x/oauth2 v0.0.0-20210628180205-a41e5a781914/go.mod h1:KelEdhl1UZF7XfJ golang.org/x/oauth2 v0.0.0-20210805134026-6f1e6394065a/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20211104180415-d3ed0bb246c8/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= -golang.org/x/oauth2 v0.14.0 h1:P0Vrf/2538nmC0H+pEQ3MNFRRnVR7RlqyVw+bvm26z0= -golang.org/x/oauth2 v0.14.0/go.mod h1:lAtNWgaWfL4cm7j2OV8TxGi9Qb7ECORx8DktCY74OwM= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1404,17 +1069,13 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE= -golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E= +golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -1429,18 +1090,15 @@ golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190712062909-fae7ac547cb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1450,15 +1108,12 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200602225109-6fdc65e7d980/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200814200057-3d37ad5750ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200905004654-be1d3432aa8f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1470,7 +1125,6 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20201201145000-ef89a241ccb3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210104204734-6f8348627aad/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210225134936-a50acf3fe073/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1488,7 +1142,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816074244-15123e1e1f71/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -1498,24 +1151,17 @@ golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220209214540-3681064d5158/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= -golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= -golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.15.0 h1:y/Oo/a/q3IXu26lQgl04j/gjuBDOBlx7X6Om1j2CPW4= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1526,21 +1172,14 @@ golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= -golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= -golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20180828015842-6cd1fcedba52/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -1558,7 +1197,6 @@ golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgw golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20190828213141-aed303cbaa74/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -1571,7 +1209,6 @@ golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= @@ -1606,22 +1243,19 @@ golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= -golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= -golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc= -golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg= +golang.org/x/tools v0.10.0 h1:tvDr/iQoUqNdohiYm0LmmKcBk+q86lb9EprIUFhHHGg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= -golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2 h1:H2TDz8ibqkAF6YGhCdN3jS9O0/s90v0rJh3X/OLHEUk= +golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.6.1/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.13.0 h1:a0T3bh+7fhRyqeNbiC3qVHYmkiQgit3wnNan/2c0HMM= gonum.org/v1/gonum v0.13.0/go.mod h1:/WPYRckkfWrhWefxyYTfrTtQR0KH4iyHNuzxqXAKyAU= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= -google.golang.org/api v0.3.1/go.mod h1:6wY9I6uQWHQ8EM57III9mq/AjF+i8G65rmVagqKMtkk= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= @@ -1652,25 +1286,22 @@ google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqiv google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= -google.golang.org/api v0.149.0 h1:b2CqT6kG+zqJIVKRQ3ELJVLN1PwHZ6DJ3dW8yl82rgY= -google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= -google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0= google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= -google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= -google.golang.org/genproto v0.0.0-20190530194941-fb225487d101/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8= @@ -1687,7 +1318,6 @@ google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= @@ -1703,7 +1333,6 @@ google.golang.org/genproto v0.0.0-20201201144952-b05cb90ed32e/go.mod h1:FWY/as6D google.golang.org/genproto v0.0.0-20201210142538-e3217bee35cc/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20201214200347-8c77b98c765d/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210108203827-ffc7fda8c3d7/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20210126160654-44e461bb6506/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210226172003-ab064af71705/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= @@ -1730,23 +1359,18 @@ google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ6 google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211007155348-82e027067bd4/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/genproto v0.0.0-20211118181313-81c1377c94b1/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17 h1:wpZ8pe2x1Q3f2KyT5f8oP/fa9rHAKgFPr/HZdNuS+PQ= -google.golang.org/genproto v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:J7XzRzVy1+IPwWHZUzoD0IccYZIrXILAQpc+Qy9CMhY= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231030173426-d783a09b4405 h1:o4S3HvTUEXgRsNSUQsALDVog0O9F/U1JJlHmmUN8Uas= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17 h1:Jyp0Hsi0bmHXG6k9eATXoYtjd6e2UzZ1SCn/wIupY14= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:oQ5rr10WTTMvP4A36n8JpR1OrO1BEiV4f78CneXZxkA= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d h1:VBu5YqKPv6XiJ199exd8Br+Aetz+o08F+PLMnwJQHAY= +google.golang.org/genproto v0.0.0-20230822172742-b8732ec3820d/go.mod h1:yZTlhN0tQnXo3h00fuXNCxJdLdIdnVFVBaRJ5LWBbw4= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1:DoPTO70H+bcDXcd39vOqb2viZxgqeBeSGtZ55yZU4/Q= +google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= +google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.17.0/go.mod h1:6QZJwpn2B+Zp71q/5VxRsJ6NXXVCE5NRUHRo+f3cWCs= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= -google.golang.org/grpc v1.20.0/go.mod h1:chYK+tFQF0nDUGJgXMSgLCQk3phJEuONr2DCgLDdAQM= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= -google.golang.org/grpc v1.22.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= -google.golang.org/grpc v1.23.1/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= @@ -1756,7 +1380,6 @@ google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3Iji google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.1/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.32.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc= google.golang.org/grpc v1.34.0/go.mod h1:WotjhfgOW/POjDeRt8vscBtXq+2VjORFy659qA51WJ8= @@ -1770,8 +1393,9 @@ google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnD google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.42.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= -google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0= -google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= +google.golang.org/grpc v1.59.0 h1:Z5Iec2pjwb+LEOqzpB2MR12/eKFhDPhuqW91O+4bwUk= +google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= @@ -1793,13 +1417,10 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= -gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= -gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= gopkg.in/ini.v1 v1.51.1/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= @@ -1812,18 +1433,14 @@ gopkg.in/sourcemap.v1 v1.0.5/go.mod h1:2RlvNNSMglmRrcvhfuzp4hQHwOtjxlbjX7UPY/GXb gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= -gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= -gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20191120175047-4206685974f2/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= @@ -1831,7 +1448,6 @@ gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gotest.tools v2.2.0+incompatible h1:VsBPFP1AI068pPrMxtb/S8Zkgf9xEmTLJjfM+P5UIEo= gotest.tools v2.2.0+incompatible/go.mod h1:DsYFclhRJ6vuDpmuTbkuFWG+y2sxOXAzmJt81HFBacw= -honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= @@ -1840,6 +1456,7 @@ honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k= launchpad.net/gocheck v0.0.0-20140225173054-000000000087 h1:Izowp2XBH6Ya6rv+hqbceQyw/gSGoXfH/UPoTGduL54= +launchpad.net/gocheck v0.0.0-20140225173054-000000000087/go.mod h1:hj7XX3B/0A+80Vse0e+BUHsHMTEhd0O4cpUHr/e/BUM= lukechampine.com/blake3 v1.2.1 h1:YuqqRuaqsGV71BV/nm9xlI0MKUv4QC54jQnBChWbGnI= lukechampine.com/blake3 v1.2.1/go.mod h1:0OFRp7fBtAylGVCO40o87sbupkyIGgbpv1+M1k1LM6k= modernc.org/libc v1.22.3 h1:D/g6O5ftAfavceqlLOFwaZuA5KYafKwmr30A6iSqoyY= @@ -1850,15 +1467,9 @@ modernc.org/memory v1.5.0 h1:N+/8c5rE6EqugZwHii4IFsaJ7MUhoWX07J5tC/iI5Ds= modernc.org/memory v1.5.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU= modernc.org/sqlite v1.21.1 h1:GyDFqNnESLOhwwDRaHGdp2jKLDzpyT/rNLglX3ZkMSU= modernc.org/sqlite v1.21.1/go.mod h1:XwQ0wZPIh1iKb5mkvCJ3szzbhk+tykC8ZWqTRTgYRwI= -mvdan.cc/gofumpt v0.5.0 h1:0EQ+Z56k8tXjj/6TQD25BFNKQXpCvT0rnansIc7Ug5E= -nhooyr.io/websocket v1.8.6/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= -nhooyr.io/websocket v1.8.7/go.mod h1:B70DZP8IakI65RVQ51MsWP/8jndNma26DVA/nFSCgW0= pgregory.net/rapid v0.4.7 h1:MTNRktPuv5FNqOO151TM9mDTa+XHcX6ypYeISDVD14g= pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= -sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0/go.mod h1:hI742Nqp5OhwiqlzhgfbWU4mW4yO10fP+LoT9WOswdU= diff --git a/install.ps1 b/install.ps1 deleted file mode 100644 index 0e13ed48a..000000000 --- a/install.ps1 +++ /dev/null @@ -1,85 +0,0 @@ -<# -.Synopsis - Install the Flow CLI on Windows. -.DESCRIPTION - By default, the latest release will be installed. - If '-Version' is specified, then the given version is installed. -.Parameter Directory - The destination path to install to. -.Parameter Version - The version to install. -.Parameter AddToPath - Add the absolute destination path to the 'User' scope environment variable 'Path'. -.Parameter GitHubToken - Optional GitHub token to use to prevent rate limiting. -.EXAMPLE - Install the current version - .\install.ps1 -.EXAMPLE - Install version v0.5.2 - .\install.ps1 -Version v0.5.2 -.EXAMPLE - Invoke-Expression "& { $(Invoke-RestMethod 'https://storage.googleapis.com/flow-cli/install.ps1') }" -#> -param ( - [string] $version="", - [string] $directory = "$env:APPDATA\Flow", - [bool] $addToPath = $true, - [string] $githubToken = "" -) - -Set-StrictMode -Version 3.0 - -# Enable support for ANSI escape sequences -Set-ItemProperty HKCU:\Console VirtualTerminalLevel -Type DWORD 1 - -$ErrorActionPreference = "Stop" - -$repo = "onflow/flow-cli" -$versionURL = "https://api.github.com/repos/$repo/releases/latest" -$assetsURL = "https://github.com/$repo/releases/download" - -# Add the GitHub token to the web request headers if it was provided -$webRequestOptions = if ($githubToken) { - @{ 'Headers' = @{ 'Authorization' = "Bearer $githubToken" } } -} else { - @{} -} - -if (!$version) { - $q = (Invoke-WebRequest -Uri "$versionURL" -UseBasicParsing @webRequestOptions) | ConvertFrom-Json - $version = $q.tag_name -} - -Write-Output("Installing version {0} ..." -f $version) - -New-Item -ItemType Directory -Force -Path $directory | Out-Null - -$progressPreference = 'silentlyContinue' - -Invoke-WebRequest -Uri "$assetsURL/$version/flow-cli-$version-windows-amd64.zip" -UseBasicParsing -OutFile "$directory\flow.zip" @webRequestOptions - -Expand-Archive -Path "$directory\flow.zip" -DestinationPath "$directory" -Force - -try { - Stop-Process -Name flow -Force - Start-Sleep -Seconds 1 -} -catch {} - -Move-Item -Path "$directory\flow-cli.exe" -Destination "$directory\flow.exe" -Force - -# Check if the directory is already in the PATH -$existingPaths = [Environment]::GetEnvironmentVariable("PATH", [System.EnvironmentVariableTarget]::User).Split(';') - -if ($addToPath -and $existingPaths -notcontains $directory) { - Write-Output "Adding to PATH ..." - $processPath = [System.Environment]::GetEnvironmentVariable('PATH', [System.EnvironmentVariableTarget]::Process) + ";$directory" - $userPath = [System.Environment]::GetEnvironmentVariable('PATH', [System.EnvironmentVariableTarget]::User) + ";$directory" - [System.Environment]::SetEnvironmentVariable("PATH", $processPath, [System.EnvironmentVariableTarget]::Process) - [System.Environment]::SetEnvironmentVariable("PATH", $userPath, [System.EnvironmentVariableTarget]::User) -} - -Write-Output "Done." - -Start-Sleep -Seconds 1 \ No newline at end of file diff --git a/install.sh b/install.sh deleted file mode 100755 index a2da2bfe6..000000000 --- a/install.sh +++ /dev/null @@ -1,119 +0,0 @@ -#!/bin/sh - -# Exit as soon as any command fails -set -e - -REPO="onflow/flow-cli" -ASSETS_URL="https://github.com/$REPO/releases/download/" -# The version to download, set by get_version (defaults to args[1]) -VERSION="$1" -# The architecture string, set by get_architecture -ARCH="" - -# Optional environment variable for Github API token -# If GITHUB_TOKEN is set, use it in the curl requests to avoid rate limiting -github_token_header="" -if [ -n "$GITHUB_TOKEN" ]; then - github_token_header="Authorization: Bearer $GITHUB_TOKEN" -fi - -# Get the architecture (CPU, OS) of the current system as a string. -# Only MacOS/x86_64/ARM64 and Linux/x86_64/ARM64 architectures are supported. -get_architecture() { - _ostype="$(uname -s)" - _cputype="$(uname -m)" - _targetpath="" - if [ "$_ostype" = Darwin ] && [ "$_cputype" = i386 ]; then - if sysctl hw.optional.x86_64 | grep -q ': 1'; then - _cputype=x86_64 - fi - fi - case "$_ostype" in - Linux) - _ostype=linux - _targetpath=$HOME/.local/bin - ;; - Darwin) - _ostype=darwin - _targetpath=/usr/local/bin - ;; - *) - echo "unrecognized OS type: $_ostype" - return 1 - ;; - esac - case "$_cputype" in - x86_64 | x86-64 | x64 | amd64) - _cputype=amd64 - ;; - arm64 | aarch64) - _cputype=arm64 - ;; - *) - echo "unknown CPU type: $_cputype" - return 1 - ;; - esac - _arch="${_ostype}-${_cputype}" - ARCH="${_arch}" - TARGET_PATH="${_targetpath}" -} - -# Get the latest version from remote if none specified in args. -get_version() { - if [ -z "$VERSION" ] - then - VERSION="" - if [ -n "$github_token_header" ] - then - VERSION=$(curl -H "$github_token_header" -s "https://api.github.com/repos/$REPO/releases/latest" | grep -E 'tag_name' | cut -d '"' -f 4) - else - VERSION=$(curl -s "https://api.github.com/repos/$REPO/releases/latest" | grep -E 'tag_name' | cut -d '"' -f 4) - fi - - if [ -z "$VERSION" ] && [ -n "$github_token_header" ] - then - echo "Failed to get latest version from Github API, is your GITHUB_TOKEN valid? Trying without authentication..." - github_token_header="" - get_version - fi - fi -} - -# Determine the system architecure, download the appropriate binary, and -# install it in `/usr/local/bin` on macOS and `~/.local/bin` on Linux -# with executable permission. -main() { - - get_architecture || exit 1 - get_version || exit 1 - - echo "Downloading version $VERSION ..." - - tmpfile=$(mktemp 2>/dev/null || mktemp -t flow) - url="$ASSETS_URL$VERSION/flow-cli-$VERSION-$ARCH.tar.gz" - if [ -n "$github_token_header" ] - then - curl -H "$github_token_header" -L --progress-bar "$url" -o $tmpfile - else - curl -L --progress-bar "$url" -o $tmpfile - fi - - # Ensure we don't receive a not found error as response. - if grep -q "Not Found" $tmpfile - then - echo "Version $VERSION could not be found" - exit 1 - fi - - [ -d $TARGET_PATH ] || mkdir -p $TARGET_PATH - - tar -xf $tmpfile -C $TARGET_PATH - mv $TARGET_PATH/flow-cli $TARGET_PATH/flow - chmod +x $TARGET_PATH/flow - - echo "Successfully installed the Flow CLI to $TARGET_PATH." - echo "Make sure $TARGET_PATH is in your \$PATH environment variable." -} - -main diff --git a/internal/accounts/accounts.go b/internal/accounts/accounts.go deleted file mode 100644 index a88a25071..000000000 --- a/internal/accounts/accounts.go +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "bytes" - "fmt" - - "github.com/onflow/cadence" - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "accounts", - Short: "Create and retrieve accounts and deploy contracts", - TraverseChildren: true, - GroupID: "resources", -} - -func testnetFaucetURL(address flow.Address) string { - return fmt.Sprintf("https://testnet-faucet.onflow.org/fund-account?address=%s", address) -} - -func init() { - addContractCommand.AddToParent(Cmd) - removeCommand.AddToParent(Cmd) - updateCommand.AddToParent(Cmd) - createCommand.AddToParent(Cmd) - stakingCommand.AddToParent(Cmd) - getCommand.AddToParent(Cmd) - fundCommand.AddToParent(Cmd) -} - -// accountResult represent result from all account commands. -type accountResult struct { - *flow.Account - include []string -} - -func (r *accountResult) JSON() any { - result := make(map[string]any) - result["address"] = r.Address - result["balance"] = cadence.UFix64(r.Balance).String() - - keys := make([]string, 0) - for _, key := range r.Keys { - keys = append(keys, fmt.Sprintf("%x", key.PublicKey.Encode())) - } - - result["keys"] = keys - - contracts := make([]string, 0, len(r.Contracts)) - for name := range r.Contracts { - contracts = append(contracts, name) - } - - result["contracts"] = contracts - - if command.ContainsFlag(r.include, "contracts") { - c := make(map[string]string) - for name, code := range r.Contracts { - c[name] = string(code) - } - result["code"] = c - } - - return result -} - -func (r *accountResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - if r.Address.IsValid(flow.Testnet) { - _, _ = fmt.Fprintf( - writer, - "If you would like to fund the account with 1000 FLOW tokens for testing,"+ - " visit %s\n\n", - testnetFaucetURL(r.Address), - ) - } - - _, _ = fmt.Fprintf(writer, "Address\t 0x%s\n", r.Address) - _, _ = fmt.Fprintf(writer, "Balance\t %s\n", cadence.UFix64(r.Balance)) - - _, _ = fmt.Fprintf(writer, "Keys\t %d\n", len(r.Keys)) - - for i, key := range r.Keys { - _, _ = fmt.Fprintf(writer, "\nKey %d\tPublic Key\t %x\n", i, key.PublicKey.Encode()) - _, _ = fmt.Fprintf(writer, "\tWeight\t %d\n", key.Weight) - _, _ = fmt.Fprintf(writer, "\tSignature Algorithm\t %s\n", key.SigAlgo) - _, _ = fmt.Fprintf(writer, "\tHash Algorithm\t %s\n", key.HashAlgo) - _, _ = fmt.Fprintf(writer, "\tRevoked \t %t\n", key.Revoked) - _, _ = fmt.Fprintf(writer, "\tSequence Number \t %d\n", key.SequenceNumber) - _, _ = fmt.Fprintf(writer, "\tIndex \t %d\n", key.Index) - _, _ = fmt.Fprintf(writer, "\n") - - // only show up to 3 keys and then show label to expand more info - if i == 3 && !command.ContainsFlag(r.include, "keys") { - _, _ = fmt.Fprint(writer, "...keys minimized, use --include keys flag if you want to view all\n\n") - break - } - } - - _, _ = fmt.Fprintf(writer, "Contracts Deployed: %d\n", len(r.Contracts)) - for name := range r.Contracts { - _, _ = fmt.Fprintf(writer, "Contract: '%s'\n", name) - } - - if command.ContainsFlag(r.include, "contracts") { - for name, code := range r.Contracts { - _, _ = fmt.Fprintf(writer, "Contracts '%s':\n", name) - _, _ = fmt.Fprintln(writer, string(code)) - } - } else { - _, _ = fmt.Fprint(writer, "\n\nContracts (hidden, use --include contracts)") - } - - _ = writer.Flush() - - return b.String() -} - -func (r *accountResult) Oneliner() string { - keys := make([]string, 0, len(r.Keys)) - for _, key := range r.Keys { - keys = append(keys, key.PublicKey.String()) - } - - return fmt.Sprintf("Address: 0x%s, Balance: %s, Public Keys: %s", r.Address, cadence.UFix64(r.Balance), keys) -} diff --git a/internal/accounts/accounts_test.go b/internal/accounts/accounts_test.go deleted file mode 100644 index c6db069dd..000000000 --- a/internal/accounts/accounts_test.go +++ /dev/null @@ -1,314 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "fmt" - "strings" - "testing" - - "github.com/onflow/flow-cli/flowkit/accounts" - - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_DeployContract(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{tests.ContractSimpleWithArgs.Filename, "1"} - - srv.AddContract.Run(func(args mock.Arguments) { - script := args.Get(2).(flowkit.Script) - assert.Equal(t, tests.ContractSimpleWithArgs.Filename, script.Location) - assert.Len(t, script.Args, 1) - assert.Equal(t, inArgs[1], script.Args[0].String()) - }) - - result, err := deployContract(false, &addContractFlags)( - inArgs, - command.GlobalFlags{}, - util.NoLogger, - srv.Mock, - state, - ) - - require.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Success JSON arg", func(t *testing.T) { - srv.AddContract.Run(func(args mock.Arguments) { - script := args.Get(2).(flowkit.Script) - assert.Equal(t, tests.ContractSimpleWithArgs.Filename, script.Location) - assert.Len(t, script.Args, 1) - assert.Equal(t, "1", script.Args[0].String()) - }) - - addContractFlags.ArgsJSON = `[{"type": "UInt64", "value": "1"}]` - args := []string{tests.ContractSimpleWithArgs.Filename} - result, err := deployContract(false, &addContractFlags)( - args, - command.GlobalFlags{}, - util.NoLogger, - srv.Mock, - state, - ) - - require.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail non-existing file", func(t *testing.T) { - args := []string{"non-existing"} - result, err := deployContract(false, &addContractFlags)( - args, - command.GlobalFlags{}, - util.NoLogger, - srv.Mock, - state, - ) - - assert.Nil(t, result) - assert.EqualError(t, err, "error loading contract file: open non-existing: file does not exist") - }) - - t.Run("Fail invalid-json", func(t *testing.T) { - args := []string{tests.ContractA.Filename} - addContractFlags.ArgsJSON = "invalid" - result, err := deployContract(false, &addContractFlags)( - args, - command.GlobalFlags{}, - util.NoLogger, - srv.Mock, - state, - ) - - assert.Nil(t, result) - assert.EqualError(t, err, "error parsing transaction arguments: invalid character 'i' looking for beginning of value") - }) - - t.Run("Fail invalid signer", func(t *testing.T) { - args := []string{tests.ContractA.Filename} - addContractFlags.Signer = "invalid" - result, err := deployContract(false, &addContractFlags)( - args, - command.GlobalFlags{}, - util.NoLogger, - srv.Mock, - state, - ) - - assert.Nil(t, result) - assert.EqualError(t, err, "could not find account with name invalid in the configuration") - }) - -} - -func Test_RemoveContract(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"test"} - - srv.RemoveContract.Run(func(args mock.Arguments) { - acc := args.Get(1).(*accounts.Account) - assert.Equal(t, "emulator-account", acc.Name) - assert.Equal(t, inArgs[0], args.Get(2).(string)) - }) - - result, err := removeContract(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail non-existing account", func(t *testing.T) { - inArgs := []string{"test"} - flagsRemove.Signer = "invalid" - - _, err := removeContract(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "could not find account with name invalid in the configuration") - }) -} - -func Test_Create(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - pkey := "014d91eb68b5fddeca118821e74f70b48d9582c8546d8a2ae9d6835cdb7d1d008624945f55c4b409c628b63a89a54570ed028e8e68a1fe0c98ef08d7f488037b" - createFlags.Keys = []string{pkey} - - srv.CreateAccount.Run(func(args mock.Arguments) { - acc := args.Get(1).(*accounts.Account) - keys := args.Get(2).([]accounts.PublicKey) - assert.Equal(t, "emulator-account", acc.Name) - assert.Len(t, keys, 1) - assert.Equal(t, fmt.Sprintf("0x%s", pkey), keys[0].Public.String()) - assert.Equal(t, crypto.ECDSA_P256, keys[0].SigAlgo) - assert.Equal(t, crypto.SHA3_256, keys[0].HashAlgo) - }) - - result, err := create([]string{}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - require.NoError(t, err) - require.NotNil(t, result) - }) - - t.Run("Success multiple keys", func(t *testing.T) { - pkey1 := "014d91eb68b5fddeca118821e74f70b48d9582c8546d8a2ae9d6835cdb7d1d008624945f55c4b409c628b63a89a54570ed028e8e68a1fe0c98ef08d7f488037b" - pkey2 := "c4bcde70e3c29cdc472ce7be46e219ca42f0ed2174369b3ba693c5655ed03f7027c571ba3881ed4b480fba41760572bcc167a8dbcf4e6ed952dcce831f82fc92" - createFlags.Keys = []string{pkey1, pkey2} - createFlags.SigAlgo = []string{"ECDSA_P256", "ECDSA_secp256k1"} - createFlags.HashAlgo = []string{"SHA3_256", "SHA2_256"} - createFlags.Weights = []int{500, 500} - - srv.CreateAccount.Run(func(args mock.Arguments) { - acc := args.Get(1).(*accounts.Account) - keys := args.Get(2).([]accounts.PublicKey) - assert.Equal(t, "emulator-account", acc.Name) - assert.Len(t, keys, 2) - - assert.Equal(t, fmt.Sprintf("0x%s", pkey1), keys[0].Public.String()) - assert.Equal(t, crypto.ECDSA_P256, keys[0].SigAlgo) - assert.Equal(t, crypto.SHA3_256, keys[0].HashAlgo) - assert.Equal(t, 500, keys[0].Weight) - - assert.Equal(t, fmt.Sprintf("0x%s", pkey2), keys[1].Public.String()) - assert.Equal(t, crypto.ECDSA_secp256k1, keys[1].SigAlgo) - assert.Equal(t, 500, keys[1].Weight) - }) - - result, err := create([]string{}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - require.NoError(t, err) - require.NotNil(t, result) - }) - - t.Run("Fail not enough weights", func(t *testing.T) { - pkey1 := "014d91eb68b5fddeca118821e74f70b48d9582c8546d8a2ae9d6835cdb7d1d008624945f55c4b409c628b63a89a54570ed028e8e68a1fe0c98ef08d7f488037b" - pkey2 := "c4bcde70e3c29cdc472ce7be46e219ca42f0ed2174369b3ba693c5655ed03f7027c571ba3881ed4b480fba41760572bcc167a8dbcf4e6ed952dcce831f82fc92" - createFlags.Keys = []string{pkey1, pkey2} - createFlags.SigAlgo = []string{"ECDSA_P256", "ECDSA_secp256k1"} - createFlags.HashAlgo = []string{"SHA3_256", "SHA2_256"} - createFlags.Weights = []int{1000} - - result, err := create([]string{}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - require.EqualError(t, err, "must provide a key weight for each key provided, keys provided: 2, weights provided: 1") - require.Nil(t, result) - }) - - t.Run("Fail miss match algos", func(t *testing.T) { - pkey1 := "014d91eb68b5fddeca118821e74f70b48d9582c8546d8a2ae9d6835cdb7d1d008624945f55c4b409c628b63a89a54570ed028e8e68a1fe0c98ef08d7f488037b" - createFlags.Keys = []string{pkey1} - createFlags.SigAlgo = []string{"ECDSA_P256", "ECDSA_secp256k1"} - createFlags.HashAlgo = []string{"SHA3_256"} - createFlags.Weights = []int{1000} - - result, err := create([]string{}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - require.EqualError(t, err, "must provide a signature and hash algorithm for every key provided to --key: 1 keys, 2 signature algo, 1 hash algo") - require.Nil(t, result) - }) - - t.Run("Fail parse keys", func(t *testing.T) { - _, err := parsePublicKeys([]string{"invalid"}, []crypto.SignatureAlgorithm{crypto.ECDSA_P256}) - assert.EqualError(t, err, "failed decoding public key: invalid with error: encoding/hex: invalid byte: U+0069 'i'") - }) - - t.Run("Fail parse hash", func(t *testing.T) { - _, err := parseHashingAlgorithms([]string{"invalid"}) - assert.EqualError(t, err, "invalid hash algorithm: invalid") - }) - - t.Run("Fail parse signature algorithm", func(t *testing.T) { - _, err := parseSignatureAlgorithms([]string{"invalid"}) - assert.EqualError(t, err, "invalid signature algorithm: invalid") - }) -} - -func Test_Get(t *testing.T) { - srv, _, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"0x01"} - - srv.GetAccount.Run(func(args mock.Arguments) { - addr := args.Get(1).(flow.Address) - assert.Equal(t, "0000000000000001", addr.String()) - srv.GetAccount.Return(tests.NewAccountWithAddress(inArgs[0]), nil) - }) - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, nil, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) -} - -func Test_Result(t *testing.T) { - pkey, _ := crypto.DecodePublicKeyHex(crypto.ECDSA_P256, "a60b9c10a39070806d37d8f0e6be081e7af2d18cd92ee1bd850d10c994d61d538d2693eebe8faa94fea59ee579ea65a70ed897b05126e508e74f55b8669eec6b") - account := &flow.Account{ - Address: flow.HexToAddress("0x01"), - Balance: uint64(1), - Keys: []*flow.AccountKey{{ - Index: 0, - PublicKey: pkey, - SigAlgo: crypto.ECDSA_P256, - HashAlgo: crypto.SHA3_256, - Weight: 1000, - SequenceNumber: 0, - Revoked: false, - }}, - Contracts: nil, - } - result := accountResult{Account: account} - - assert.Equal(t, strings.TrimPrefix(` -Address 0x0000000000000001 -Balance 0.00000001 -Keys 1 - -Key 0 Public Key a60b9c10a39070806d37d8f0e6be081e7af2d18cd92ee1bd850d10c994d61d538d2693eebe8faa94fea59ee579ea65a70ed897b05126e508e74f55b8669eec6b - Weight 1000 - Signature Algorithm ECDSA_P256 - Hash Algorithm SHA3_256 - Revoked false - Sequence Number 0 - Index 0 - -Contracts Deployed: 0 - - -Contracts (hidden, use --include contracts)`, "\n"), result.String()) - - assert.Equal(t, map[string]any{ - "address": flow.Address{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1}, - "balance": "0.00000001", - "contracts": []string{}, - "keys": []string{ - "a60b9c10a39070806d37d8f0e6be081e7af2d18cd92ee1bd850d10c994d61d538d2693eebe8faa94fea59ee579ea65a70ed897b05126e508e74f55b8669eec6b", - }, - }, result.JSON()) - -} diff --git a/internal/accounts/contract-add.go b/internal/accounts/contract-add.go deleted file mode 100644 index 084b91716..000000000 --- a/internal/accounts/contract-add.go +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "context" - "fmt" - - "github.com/onflow/flow-cli/internal/util" - - "github.com/onflow/cadence" - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/arguments" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type deployContractFlags struct { - ArgsJSON string `default:"" flag:"args-json" info:"arguments in JSON-Cadence format"` - Signer string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"` - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: contracts."` - ShowDiff bool `default:"false" flag:"show-diff" info:"Shows diff between existing and new contracts on update"` -} - -var addContractFlags = deployContractFlags{} - -var addContractCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "add-contract ", - Short: "Deploy a new contract to an account", - Example: `flow accounts add-contract ./FungibleToken.cdc helloArg`, - Args: cobra.MinimumNArgs(1), - }, - Flags: &addContractFlags, - RunS: deployContract(false, &addContractFlags), -} - -func deployContract(update bool, flags *deployContractFlags) command.RunWithState { - return func( - args []string, - globalFlags command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, - ) (command.Result, error) { - filename := args[0] - - code, err := state.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading contract file: %w", err) - } - - to, err := state.Accounts().ByName(flags.Signer) - if err != nil { - return nil, err - } - - var contractArgs []cadence.Value - if flags.ArgsJSON != "" { - contractArgs, err = arguments.ParseJSON(flags.ArgsJSON) - } else if len(args) > 1 { - contractArgs, err = arguments.ParseWithoutType(args[1:], code, filename) - } - - if err != nil { - return nil, fmt.Errorf("error parsing transaction arguments: %w", err) - } - - deployFunc := flowkit.UpdateExistingContract(update) - if updateContractFlags.ShowDiff { - deployFunc = util.ShowContractDiffPrompt(logger) - } - - txID, _, err := flow.AddContract( - context.Background(), - to, - flowkit.Script{ - Code: code, - Args: contractArgs, - Location: filename, - }, - deployFunc, - ) - - if err != nil { - if txID != flowsdk.EmptyID { - logger.Info(fmt.Sprintf( - "Failed to %s contract on the account '%s' with transaction ID: %s", - map[bool]string{true: "updated", false: "created"}[update], - to.Address, - txID.String(), - )) - } - - return nil, err - } - - err = state.SaveDefault() - - if err != nil { - return nil, err - } - - logger.Info(fmt.Sprintf( - "Contract %s on the account '%s' with transaction ID %s.", - map[bool]string{true: "updated", false: "created"}[update], - to.Address, - txID.String(), - )) - - account, err := flow.GetAccount(context.Background(), to.Address) - if err != nil { - return nil, err - } - - return &accountResult{ - Account: account, - include: flags.Include, - }, nil - } -} diff --git a/internal/accounts/contract-remove.go b/internal/accounts/contract-remove.go deleted file mode 100644 index a6839febd..000000000 --- a/internal/accounts/contract-remove.go +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/util" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsRemoveContract struct { - Signer string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"` - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: contracts."` - Network string `default:"" flag:"network" info:"Network name from configuration to use"` -} - -var flagsRemove = flagsRemoveContract{} - -var removeCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "remove-contract ", - Short: "Remove a contract deployed to an account", - Example: `flow accounts remove-contract FungibleToken`, - Args: cobra.ExactArgs(1), - }, - Flags: &flagsRemove, - RunS: removeContract, -} - -func removeContract( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - contractName := args[0] - - from, err := state.Accounts().ByName(flagsRemove.Signer) - if err != nil { - return nil, err - } - - id, err := flow.RemoveContract(context.Background(), from, contractName) - if err != nil { - return nil, err - } - - removeFromState := util.RemoveContractFromFlowJSONPrompt(contractName) - - if removeFromState { - // If a network flag is provided, remove from that networks deployments - // Otherwise, remove from all deployments - if flagsRemove.Network != "" { - state.Deployments().ByAccountAndNetwork(from.Name, flagsRemove.Network).RemoveContract(contractName) - } else { - for i := range state.Deployments().All() { - if state.Deployments().All()[i].Account == from.Name { - state.Deployments().All()[i].RemoveContract(contractName) - } - } - } - - err = state.SaveDefault() - if err != nil { - return nil, err - } - } - - logger.Info(fmt.Sprintf( - "Contract %s removed from account %s with transaction ID: %s.", - contractName, - from.Address, - id.String(), - )) - - account, err := flow.GetAccount(context.Background(), from.Address) - if err != nil { - return nil, err - } - return &accountResult{ - Account: account, - include: flagsRemove.Include, - }, nil -} diff --git a/internal/accounts/contract-update.go b/internal/accounts/contract-update.go deleted file mode 100644 index 3dee382a0..000000000 --- a/internal/accounts/contract-update.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" -) - -var updateContractFlags = deployContractFlags{} - -var updateCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "update-contract ", - Short: "Update a contract deployed to an account", - Example: `flow accounts update-contract ./FungibleToken.cdc helloArg`, - Args: cobra.MinimumNArgs(1), - }, - Flags: &updateContractFlags, - RunS: deployContract(true, &updateContractFlags), -} diff --git a/internal/accounts/create-interactive.go b/internal/accounts/create-interactive.go deleted file mode 100644 index 3d8aa2b2b..000000000 --- a/internal/accounts/create-interactive.go +++ /dev/null @@ -1,293 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "bytes" - "context" - "crypto/tls" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "strings" - "time" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/status" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/accounts" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/gateway" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/util" -) - -// createInteractive is used when user calls a default account create command without any provided values. -// -// This process takes the user through couple of steps with prompts asking for them to provide name and network, -// and it then uses account creation APIs to automatically create the account on the network as well as save it. -func createInteractive(state *flowkit.State) (*accountResult, error) { - log := output.NewStdoutLogger(output.InfoLog) - name := util.AccountNamePrompt(state.Accounts().Names()) - networkName, selectedNetwork := util.CreateAccountNetworkPrompt() - privateFile := accounts.PrivateKeyFile(name) - - // create new gateway based on chosen network - gw, err := gateway.NewGrpcGateway(selectedNetwork) - if err != nil { - return nil, err - } - flow := flowkit.NewFlowkit(state, selectedNetwork, gw, output.NewStdoutLogger(output.NoneLog)) - - key, err := flow.GenerateKey(context.Background(), defaultSignAlgo, "") - if err != nil { - return nil, err - } - - log.StartProgress(fmt.Sprintf("Creating account %s on %s...", name, networkName)) - defer log.StopProgress() - - var account *accounts.Account - if selectedNetwork == config.EmulatorNetwork { - account, err = createEmulatorAccount(state, flow, name, key) - log.StopProgress() - log.Info(output.Italic("\nPlease note that the newly-created account will only be available while you keep the emulator service running. If you restart the emulator service, all accounts will be reset. If you want to persist accounts between restarts, please use the '--persist' flag when starting the flow emulator.\n")) - } else { - account, err = createNetworkAccount(state, flow, name, key, privateFile, selectedNetwork) - log.StopProgress() - } - if err != nil { - return nil, err - } - - log.Info(fmt.Sprintf( - "%s New account created with address %s and name %s on %s network.\n", - output.SuccessEmoji(), - output.Bold(fmt.Sprintf("0x%s", account.Address.String())), - output.Bold(name), - output.Bold(networkName)), - ) - - state.Accounts().AddOrUpdate(account) - err = state.SaveDefault() - if err != nil { - return nil, err - } - - items := []string{ - "Here’s a summary of all the actions that were taken", - fmt.Sprintf("Added the new account to %s.", output.Bold("flow.json")), - } - if selectedNetwork != config.EmulatorNetwork { - items = append(items, - fmt.Sprintf("Saved the private key to %s.", output.Bold(privateFile)), - fmt.Sprintf("Added %s to %s.", output.Bold(privateFile), output.Bold(".gitignore")), - ) - } - outputList(log, items, false) - - return &accountResult{ - Account: &flowsdk.Account{ - Address: account.Address, - Balance: 0, - Keys: []*flowsdk.AccountKey{flowsdk.NewAccountKey().FromPrivateKey(key)}, - }, - include: nil, - }, nil -} - -// createNetworkAccount using the account creation API and return the newly created account address. -func createNetworkAccount( - state *flowkit.State, - flow flowkit.Services, - name string, - key crypto.PrivateKey, - privateFile string, - network config.Network, -) (*accounts.Account, error) { - networkAccount := &lilicoAccount{ - PublicKey: strings.TrimPrefix(key.PublicKey().String(), "0x"), - } - - id, err := networkAccount.create(network.Name) - if err != nil { - return nil, err - } - - result, err := getAccountCreationResult(flow, id) - if err != nil { - return nil, err - } - - events := flowkit.EventsFromTransaction(result) - address := events.GetCreatedAddresses() - if len(address) == 0 { - return nil, fmt.Errorf("account creation error") - } - - err = util.AddToGitIgnore(privateFile, state.ReaderWriter()) - if err != nil { - return nil, err - } - - err = state.ReaderWriter().WriteFile(privateFile, []byte(key.String()), os.FileMode(0644)) - if err != nil { - return nil, fmt.Errorf("failed saving private key: %w", err) - } - - return &accounts.Account{ - Name: name, - Address: *address[0], - Key: accounts.NewFileKey(privateFile, 0, defaultSignAlgo, defaultHashAlgo, state.ReaderWriter()), - }, nil -} - -func createEmulatorAccount( - state *flowkit.State, - flow flowkit.Services, - name string, - key crypto.PrivateKey, -) (*accounts.Account, error) { - signer, err := state.EmulatorServiceAccount() - if err != nil { - return nil, err - } - - networkAccount, _, err := flow.CreateAccount( - context.Background(), - signer, - []accounts.PublicKey{{ - Public: key.PublicKey(), - Weight: flowsdk.AccountKeyWeightThreshold, - SigAlgo: defaultSignAlgo, - HashAlgo: defaultHashAlgo, - }}, - ) - if err != nil { - return nil, err - } - - return &accounts.Account{ - Name: name, - Address: networkAccount.Address, - Key: accounts.NewHexKeyFromPrivateKey(0, defaultHashAlgo, key), - }, nil -} - -func getAccountCreationResult(flow flowkit.Services, id flowsdk.Identifier) (*flowsdk.TransactionResult, error) { - _, result, err := flow.GetTransactionByID(context.Background(), id, true) - if err != nil { - if status.Code(err) == codes.NotFound { // if transaction not yet propagated, wait for it - time.Sleep(1 * time.Second) - return getAccountCreationResult(flow, id) - } - return nil, err - } - - return result, nil -} - -// lilicoAccount contains all the data needed for interaction with lilico account creation API. -type lilicoAccount struct { - PublicKey string `json:"publicKey"` - SignatureAlgorithm string `json:"signatureAlgorithm"` - HashAlgorithm string `json:"hashAlgorithm"` - Weight int `json:"weight"` -} - -type lilicoResponse struct { - Data struct { - TxId string `json:"txId"` - } `json:"data"` -} - -var accountToken = "" - -const defaultHashAlgo = crypto.SHA3_256 - -const defaultSignAlgo = crypto.ECDSA_P256 - -// create a new account using the lilico API and parsing the response, returning account creation transaction ID. -func (l *lilicoAccount) create(network string) (flowsdk.Identifier, error) { - // fix to the defaults as we don't support other values - l.HashAlgorithm = defaultHashAlgo.String() - l.SignatureAlgorithm = defaultSignAlgo.String() - l.Weight = flowsdk.AccountKeyWeightThreshold - - data, err := json.Marshal(l) - if err != nil { - return flowsdk.EmptyID, err - } - - apiNetwork := "" - if network == config.TestnetNetwork.Name { - apiNetwork = "/testnet" - } - - request, err := http.NewRequest( - http.MethodPost, - fmt.Sprintf("https://openapi.lilico.org/v1/address%s", apiNetwork), - bytes.NewReader(data), - ) - if err != nil { - return flowsdk.EmptyID, fmt.Errorf("could not create an account: %w", err) - } - - request.Header.Add("Content-Type", "application/json; charset=UTF-8") - request.Header.Add("Authorization", accountToken) - - client := &http.Client{ - Transport: &http.Transport{ - TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // lilico api doesn't yet have a valid cert, todo reevaluate - }, - } - res, err := client.Do(request) - if err != nil { - return flowsdk.EmptyID, fmt.Errorf("could not create an account: %w", err) - } - defer res.Body.Close() - - body, _ := io.ReadAll(res.Body) - var lilicoRes lilicoResponse - - err = json.Unmarshal(body, &lilicoRes) - if err != nil { - return flowsdk.EmptyID, fmt.Errorf("could not create an account: %w", err) - } - return flowsdk.HexToID(lilicoRes.Data.TxId), nil -} - -// outputList helper for printing lists -func outputList(log *output.StdoutLogger, items []string, numbered bool) { - log.Info(fmt.Sprintf("%s:", items[0])) - items = items[1:] - for n, item := range items { - sep := " -" - if numbered { - sep = fmt.Sprintf(" %d.", n+1) - } - log.Info(fmt.Sprintf("%s %s", sep, item)) - } - log.Info("") -} diff --git a/internal/accounts/create.go b/internal/accounts/create.go deleted file mode 100644 index 436321fad..000000000 --- a/internal/accounts/create.go +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "context" - "fmt" - "strings" - - "github.com/onflow/flow-cli/flowkit/accounts" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsCreate struct { - Signer string `default:"emulator-account" flag:"signer" info:"Account name from configuration used to sign the transaction"` - Keys []string `flag:"key" info:"Public keys to attach to account"` - Weights []int `default:"1000" flag:"key-weight" info:"Weight for the key"` - SigAlgo []string `default:"ECDSA_P256" flag:"sig-algo" info:"Signature algorithm used to generate the keys"` - HashAlgo []string `default:"SHA3_256" flag:"hash-algo" info:"Hash used for the digest"` - Include []string `default:"" flag:"include" info:"Fields to include in the output"` -} - -var createFlags = flagsCreate{} - -var createCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "create", - Short: "Create a new account on network", - Example: `flow accounts create --key d651f1931a2...8745`, - }, - Flags: &createFlags, - RunS: create, -} - -func create( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - if len(createFlags.Keys) == 0 { // if user doesn't provide any flags go into interactive mode - return createInteractive(state) - } else { - return createManual(state, flow) - } -} - -func createManual( - state *flowkit.State, - flow flowkit.Services, -) (*accountResult, error) { - sigsFlag := createFlags.SigAlgo - hashFlag := createFlags.HashAlgo - keysFlag := createFlags.Keys - weightFlag := createFlags.Weights - - signer, err := state.Accounts().ByName(createFlags.Signer) - if err != nil { - return nil, err - } - - if len(sigsFlag) == 1 && len(hashFlag) == 1 { - // Fill up depending on size of key input - if len(createFlags.Keys) > 1 { - for i := 1; i < len(createFlags.Keys); i++ { - sigsFlag = append(sigsFlag, sigsFlag[0]) - hashFlag = append(hashFlag, hashFlag[0]) - } - } - } else if len(keysFlag) != len(sigsFlag) || len(sigsFlag) != len(hashFlag) { // double check matching array lengths on inputs - return nil, fmt.Errorf("must provide a signature and hash algorithm for every key provided to --key: %d keys, %d signature algo, %d hash algo", len(keysFlag), len(sigsFlag), len(hashFlag)) - } - - if len(keysFlag) != len(weightFlag) { - return nil, fmt.Errorf("must provide a key weight for each key provided, keys provided: %d, weights provided: %d", len(keysFlag), len(weightFlag)) - } - - sigAlgos, err := parseSignatureAlgorithms(sigsFlag) - if err != nil { - return nil, err - } - - hashAlgos, err := parseHashingAlgorithms(hashFlag) - if err != nil { - return nil, err - } - - pubKeys, err := parsePublicKeys(keysFlag, sigAlgos) - if err != nil { - return nil, err - } - - keys := make([]accounts.PublicKey, len(pubKeys)) - for i, key := range pubKeys { - keys[i] = accounts.PublicKey{ - Public: key, Weight: weightFlag[i], SigAlgo: sigAlgos[i], HashAlgo: hashAlgos[i], - } - } - - account, _, err := flow.CreateAccount( - context.Background(), - signer, - keys, - ) - if err != nil { - return nil, err - } - - return &accountResult{ - Account: account, - include: createFlags.Include, - }, nil -} - -func parseHashingAlgorithms(algorithms []string) ([]crypto.HashAlgorithm, error) { - hashAlgos := make([]crypto.HashAlgorithm, 0, len(algorithms)) - for _, hashAlgoStr := range algorithms { - hashAlgo := crypto.StringToHashAlgorithm(hashAlgoStr) - if hashAlgo == crypto.UnknownHashAlgorithm { - return nil, fmt.Errorf("invalid hash algorithm: %s", hashAlgoStr) - } - hashAlgos = append(hashAlgos, hashAlgo) - } - return hashAlgos, nil -} - -func parseSignatureAlgorithms(algorithms []string) ([]crypto.SignatureAlgorithm, error) { - sigAlgos := make([]crypto.SignatureAlgorithm, 0, len(algorithms)) - for _, sigAlgoStr := range algorithms { - sigAlgo := crypto.StringToSignatureAlgorithm(sigAlgoStr) - if sigAlgo == crypto.UnknownSignatureAlgorithm { - return nil, fmt.Errorf("invalid signature algorithm: %s", sigAlgoStr) - } - sigAlgos = append(sigAlgos, sigAlgo) - } - return sigAlgos, nil -} - -func parsePublicKeys(publicKeys []string, sigAlgorithms []crypto.SignatureAlgorithm) ([]crypto.PublicKey, error) { - pubKeys := make([]crypto.PublicKey, 0, len(createFlags.Keys)) - for i, k := range publicKeys { - k = strings.TrimPrefix(k, "0x") // clear possible prefix - key, err := crypto.DecodePublicKeyHex(sigAlgorithms[i], k) - if err != nil { - return nil, fmt.Errorf("failed decoding public key: %s with error: %w", k, err) - } - pubKeys = append(pubKeys, key) - } - return pubKeys, nil -} diff --git a/internal/accounts/fund.go b/internal/accounts/fund.go deleted file mode 100644 index 4f161a20c..000000000 --- a/internal/accounts/fund.go +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "fmt" - "time" - - flowsdk "github.com/onflow/flow-go-sdk" - - "github.com/pkg/browser" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsFund struct { - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: contracts."` -} - -var fundFlags = flagsFund{} - -var fundCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "fund

    ", - Short: "Funds an account by address through the Testnet Faucet", - Example: "flow accounts fund 8e94eaa81771313a", - Args: cobra.ExactArgs(1), - }, - Flags: &fundFlags, - Run: fund, -} - -func fund( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - address := flowsdk.HexToAddress(args[0]) - if !address.IsValid(flowsdk.Testnet) { - return nil, fmt.Errorf("unsupported address %s, faucet can only work for valid Testnet addresses", address.String()) - } - - logger.Info( - fmt.Sprintf( - "Opening the Testnet faucet to fund 0x%s on your native browser."+ - "\n\nIf there is an issue, please use this link instead: %s", - address.String(), - testnetFaucetURL(address), - )) - // wait for the user to read the message - time.Sleep(5 * time.Second) - - if err := browser.OpenURL(testnetFaucetURL(address)); err != nil { - return nil, err - } - - return nil, nil -} diff --git a/internal/accounts/get.go b/internal/accounts/get.go deleted file mode 100644 index 9c9c5b8cd..000000000 --- a/internal/accounts/get.go +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "context" - "fmt" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsGet struct { - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: contracts."` -} - -var getFlags = flagsGet{} - -var getCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "get
    ", - Short: "Gets an account by address", - Example: "flow accounts get f8d6e0586b0a20c7", - Args: cobra.ExactArgs(1), - }, - Flags: &getFlags, - Run: get, -} - -func get( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - address := flowsdk.HexToAddress(args[0]) - - logger.StartProgress(fmt.Sprintf("Loading account %s...", address)) - defer logger.StopProgress() - - account, err := flow.GetAccount(context.Background(), address) - if err != nil { - return nil, err - } - - return &accountResult{ - Account: account, - include: getFlags.Include, - }, nil -} diff --git a/internal/accounts/staking-info.go b/internal/accounts/staking-info.go deleted file mode 100644 index 4ef3013ba..000000000 --- a/internal/accounts/staking-info.go +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package accounts - -import ( - "bytes" - "context" - "fmt" - - "github.com/onflow/cadence" - tmpl "github.com/onflow/flow-core-contracts/lib/go/templates" - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsStakingInfo struct{} - -var stakingFlags = flagsStakingInfo{} - -var stakingCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "staking-info
    ", - Short: "Get account staking info", - Example: "flow accounts staking-info f8d6e0586b0a20c7", - Args: cobra.ExactArgs(1), - }, - Flags: &stakingFlags, - Run: stakingInfo, -} - -func stakingInfo( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - address := flowsdk.HexToAddress(args[0]) - - logger.StartProgress(fmt.Sprintf("Fetching info for %s...", address.String())) - defer logger.StopProgress() - - cadenceAddress := []cadence.Value{cadence.NewAddress(address)} - - chain, err := util.GetAddressNetwork(address) - if err != nil { - return nil, fmt.Errorf("failed to determine network from address, check the address and network") - } - - if chain == flowsdk.Emulator { - return nil, fmt.Errorf("emulator chain not supported") - } - - env := envFromNetwork(chain) - - stakingInfoScript := tmpl.GenerateCollectionGetAllNodeInfoScript(env) - delegationInfoScript := tmpl.GenerateCollectionGetAllDelegatorInfoScript(env) - - stakingValue, err := flow.ExecuteScript( - context.Background(), - flowkit.Script{Code: stakingInfoScript, Args: cadenceAddress}, - flowkit.LatestScriptQuery, - ) - if err != nil { - return nil, fmt.Errorf("error getting staking info: %s", err.Error()) - } - - delegationValue, err := flow.ExecuteScript( - context.Background(), - flowkit.Script{Code: delegationInfoScript, Args: cadenceAddress}, - flowkit.LatestScriptQuery, - ) - if err != nil { - return nil, fmt.Errorf("error getting delegation info: %s", err.Error()) - } - - // get staking infos and delegation infos - staking, err := newStakingInfoFromValue(stakingValue) - if err != nil { - return nil, fmt.Errorf("error parsing staking info: %s", err.Error()) - } - delegation, err := newStakingInfoFromValue(delegationValue) - if err != nil { - return nil, fmt.Errorf("error parsing delegation info: %s", err.Error()) - } - - // get a set of node ids from all staking infos - nodeStakes := make(map[string]cadence.Value) - for _, stakingInfo := range staking { - nodeID, ok := stakingInfo["id"] - if ok { - nodeStakes[nodeIDToString(nodeID)] = nil - } - } - totalCommitmentScript := tmpl.GenerateGetTotalCommitmentBalanceScript(env) - - // foreach node id, get the node total stake - for nodeID := range nodeStakes { - stake, err := flow.ExecuteScript( - context.Background(), - flowkit.Script{ - Code: totalCommitmentScript, - Args: []cadence.Value{cadence.String(nodeID)}, - }, - flowkit.LatestScriptQuery, - ) - if err != nil { - return nil, fmt.Errorf("error getting total stake for node: %s", err.Error()) - } - - nodeStakes[nodeID] = stake - } - - // foreach staking info, add the node total stake - for _, stakingInfo := range staking { - nodeID, ok := stakingInfo["id"] - if ok { - stakingInfo["nodeTotalStake"] = nodeStakes[nodeIDToString(nodeID)].(cadence.UFix64) - } - } - - logger.StopProgress() - - return &stakingResult{staking, delegation}, nil -} - -func envFromNetwork(network flowsdk.ChainID) tmpl.Environment { - if network == flowsdk.Mainnet { - return tmpl.Environment{ - IDTableAddress: "8624b52f9ddcd04a", - FungibleTokenAddress: "f233dcee88fe0abe", - FlowTokenAddress: "1654653399040a61", - LockedTokensAddress: "8d0e87b65159ae63", - StakingProxyAddress: "62430cf28c26d095", - } - } - - if network == flowsdk.Testnet { - return tmpl.Environment{ - IDTableAddress: "9eca2b38b18b5dfe", - FungibleTokenAddress: "9a0766d93b6608b7", - FlowTokenAddress: "7e60df042a9c0868", - LockedTokensAddress: "95e019a17d0e23d7", - StakingProxyAddress: "7aad92e5a0715d21", - } - } - - return tmpl.Environment{} -} - -func nodeIDToString(value any) string { - return value.(cadence.String).ToGoValue().(string) -} - -func newStakingInfoFromValue(value cadence.Value) ([]map[string]any, error) { - stakingInfo := make([]map[string]any, 0) - arrayValue, ok := value.(cadence.Array) - if !ok { - return stakingInfo, fmt.Errorf("staking info must be a cadence array") - } - - if len(arrayValue.Values) == 0 { - return stakingInfo, nil - } - - for _, v := range arrayValue.Values { - vs, ok := v.(cadence.Struct) - if !ok { - return stakingInfo, fmt.Errorf("staking info must be a cadence array of structs") - } - - keys := make([]string, 0) - values := make(map[string]any) - for _, field := range vs.StructType.Fields { - keys = append(keys, field.Identifier) - } - for j, value := range vs.Fields { - values[keys[j]] = value - } - stakingInfo = append(stakingInfo, values) - } - - return stakingInfo, nil -} - -type stakingResult struct { - staking []map[string]any // stake as FlowIDTableStaking.NodeInfo - delegation []map[string]any // delegation as FlowIDTableStaking.DelegatorInfo -} - -func (r *stakingResult) JSON() any { - result := make(map[string]any) - result["staking"] = r.staking - result["delegation"] = r.delegation - - return result -} - -func (r *stakingResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - if len(r.staking) != 0 { - _, _ = fmt.Fprintf(writer, "Account staking info:\n") - - for _, stakingInfo := range r.staking { - _, _ = fmt.Fprintf(writer, "\tID: \t %v\n", stakingInfo["id"]) - _, _ = fmt.Fprintf(writer, "\tInitial Weight: \t %v\n", stakingInfo["initialWeight"]) - _, _ = fmt.Fprintf(writer, "\tNetworking Address: \t %v\n", stakingInfo["networkingAddress"]) - _, _ = fmt.Fprintf(writer, "\tNetworking Key: \t %v\n", stakingInfo["networkingKey"]) - _, _ = fmt.Fprintf(writer, "\tRole: \t %v\n", stakingInfo["role"]) - _, _ = fmt.Fprintf(writer, "\tStaking Key: \t %v\n", stakingInfo["stakingKey"]) - _, _ = fmt.Fprintf(writer, "\tTokens Committed: \t %v\n", stakingInfo["tokensCommitted"]) - _, _ = fmt.Fprintf(writer, "\tTokens To Unstake: \t %v\n", stakingInfo["tokensRequestedToUnstake"]) - _, _ = fmt.Fprintf(writer, "\tTokens Rewarded: \t %v\n", stakingInfo["tokensRewarded"]) - _, _ = fmt.Fprintf(writer, "\tTokens Staked: \t %v\n", stakingInfo["tokensStaked"]) - _, _ = fmt.Fprintf(writer, "\tTokens Unstaked: \t %v\n", stakingInfo["tokensUnstaked"]) - _, _ = fmt.Fprintf(writer, "\tTokens Unstaking: \t %v\n", stakingInfo["tokensUnstaking"]) - _, _ = fmt.Fprintf(writer, "\tNode Total Stake (including delegators): \t %v\n", stakingInfo["nodeTotalStake"]) - _, _ = fmt.Fprintf(writer, "\n") - } - } else { - _, _ = fmt.Fprintf(writer, "Account has no stakes.\n") - } - - if len(r.delegation) != 0 { - _, _ = fmt.Fprintf(writer, "\nAccount delegation info:\n") - - for _, delegationStakingInfo := range r.delegation { - _, _ = fmt.Fprintf(writer, "\tID: \t %v\n", delegationStakingInfo["id"]) - _, _ = fmt.Fprintf(writer, "\tNode ID: \t %v\n", delegationStakingInfo["nodeID"]) - _, _ = fmt.Fprintf(writer, "\tTokens Committed: \t %v\n", delegationStakingInfo["tokensCommitted"]) - _, _ = fmt.Fprintf(writer, "\tTokens To Unstake: \t %v\n", delegationStakingInfo["tokensRequestedToUnstake"]) - _, _ = fmt.Fprintf(writer, "\tTokens Rewarded: \t %v\n", delegationStakingInfo["tokensRewarded"]) - _, _ = fmt.Fprintf(writer, "\tTokens Staked: \t %v\n", delegationStakingInfo["tokensStaked"]) - _, _ = fmt.Fprintf(writer, "\tTokens Unstaked: \t %v\n", delegationStakingInfo["tokensUnstaked"]) - _, _ = fmt.Fprintf(writer, "\tTokens Unstaking: \t %v\n", delegationStakingInfo["tokensUnstaking"]) - _, _ = fmt.Fprintf(writer, "\n") - } - } else { - _, _ = fmt.Fprintf(writer, "Account has no delegations.\n") - } - - writer.Flush() - return b.String() -} - -func (r *stakingResult) Oneliner() string { - return "" -} diff --git a/internal/blocks/blocks.go b/internal/blocks/blocks.go deleted file mode 100644 index c38cb6a0d..000000000 --- a/internal/blocks/blocks.go +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package blocks - -import ( - "bytes" - "fmt" - - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/events" - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "blocks", - Short: "Retrieve blocks", - TraverseChildren: true, - GroupID: "resources", -} - -func init() { - getCommand.AddToParent(Cmd) -} - -type blockResult struct { - block *flow.Block - events []flow.BlockEvents - collections []*flow.Collection - included []string -} - -func (r *blockResult) JSON() any { - result := make(map[string]any) - result["blockId"] = r.block.ID.String() - result["parentId"] = r.block.ParentID.String() - result["height"] = r.block.Height - result["totalSeals"] = len(r.block.Seals) - result["totalCollections"] = len(r.block.CollectionGuarantees) - - collections := make([]any, 0, len(r.block.CollectionGuarantees)) - for i, guarantee := range r.block.CollectionGuarantees { - collection := make(map[string]any) - collection["id"] = guarantee.CollectionID.String() - - if command.ContainsFlag(r.included, "transactions") { - txs := make([]string, 0) - for _, tx := range r.collections[i].TransactionIDs { - txs = append(txs, tx.String()) - } - collection["transactions"] = txs - } - - collections = append(collections, collection) - } - - result["collection"] = collections - return result -} - -func blockStatusToString(code flow.BlockStatus) string { - switch code { - case 1: - return "Finalized" - case 2: - return "Sealed" - default: - return "Unknown" - } -} - -func (r *blockResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Block ID\t%s\n", r.block.ID) - _, _ = fmt.Fprintf(writer, "Parent ID\t%s\n", r.block.ParentID) - _, _ = fmt.Fprintf(writer, "Proposal Timestamp\t%s\n", r.block.Timestamp) - _, _ = fmt.Fprintf(writer, "Proposal Timestamp Unix\t%d\n", r.block.Timestamp.Unix()) - _, _ = fmt.Fprintf(writer, "Height\t%v\n", r.block.Height) - _, _ = fmt.Fprintf(writer, "Status\t%s\n", blockStatusToString(r.block.Status)) - - _, _ = fmt.Fprintf(writer, "Total Seals\t%v\n", len(r.block.Seals)) - - _, _ = fmt.Fprintf(writer, "Total Collections\t%v\n", len(r.block.CollectionGuarantees)) - - for i, guarantee := range r.block.CollectionGuarantees { - _, _ = fmt.Fprintf(writer, " Collection %d:\t%s\n", i, guarantee.CollectionID) - - if command.ContainsFlag(r.included, "transactions") { - for x, tx := range r.collections[i].TransactionIDs { - _, _ = fmt.Fprintf(writer, " Transaction %d: %s\n", x, tx) - } - } - } - - if len(r.events) > 0 { - _, _ = fmt.Fprintf(writer, "\n") - - e := events.EventResult{BlockEvents: r.events} - _, _ = fmt.Fprintf(writer, "%s", e.String()) - } - - _ = writer.Flush() - return b.String() -} - -func (r *blockResult) Oneliner() string { - return r.block.ID.String() -} diff --git a/internal/blocks/blocks_test.go b/internal/blocks/blocks_test.go deleted file mode 100644 index 04f6dd12d..000000000 --- a/internal/blocks/blocks_test.go +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package blocks - -import ( - "strings" - "testing" - - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_GetBlock(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"100"} - blockFlags.Events = "A.foo" - blockFlags.Include = []string{"transactions"} - - srv.GetEvents.Run(func(args mock.Arguments) { - assert.Equal(t, "A.foo", args.Get(1).([]string)[0]) - assert.Equal(t, uint64(100), args.Get(2).(uint64)) - assert.Equal(t, uint64(100), args.Get(3).(uint64)) - }).Return(nil, nil) - - srv.GetCollection.Return(nil, nil) - - returnBlock := tests.NewBlock() - returnBlock.Height = uint64(100) - - srv.GetBlock.Run(func(args mock.Arguments) { - assert.Equal(t, uint64(100), args.Get(1).(flowkit.BlockQuery).Height) - }).Return(returnBlock, nil) - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NotNil(t, result) - assert.NoError(t, err) - }) -} - -func Test_Result(t *testing.T) { - result := blockResult{ - block: tests.NewBlock(), - collections: []*flow.Collection{tests.NewCollection()}, - } - - assert.Equal(t, strings.TrimPrefix(` -Block ID 0202020202020202020202020202020202020202020202020202020202020202 -Parent ID 0303030303030303030303030303030303030303030303030303030303030303 -Proposal Timestamp 2020-06-04 16:43:21 +0000 UTC -Proposal Timestamp Unix 1591289001 -Height 1 -Status Unknown -Total Seals 1 -Total Collections 3 - Collection 0: 0202020202020202020202020202020202020202020202020202020202020202 - Collection 1: 0303030303030303030303030303030303030303030303030303030303030303 - Collection 2: 0404040404040404040404040404040404040404040404040404040404040404 -`, "\n"), result.String()) - - assert.Equal( - t, - map[string]any{ - "blockId": "0202020202020202020202020202020202020202020202020202020202020202", - "collection": []any{ - map[string]any{"id": "0202020202020202020202020202020202020202020202020202020202020202"}, - map[string]any{"id": "0303030303030303030303030303030303030303030303030303030303030303"}, - map[string]any{"id": "0404040404040404040404040404040404040404040404040404040404040404"}, - }, - "height": uint64(1), - "parentId": "0303030303030303030303030303030303030303030303030303030303030303", - "totalCollections": 3, - "totalSeals": 1, - }, - result.JSON(), - ) -} diff --git a/internal/blocks/get.go b/internal/blocks/get.go deleted file mode 100644 index de384fd27..000000000 --- a/internal/blocks/get.go +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package blocks - -import ( - "context" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsBlocks struct { - Events string `default:"" flag:"events" info:"List events of this type for the block"` - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: transactions."` -} - -var blockFlags = flagsBlocks{} - -var getCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "get ", - Short: "Get block info", - Example: "flow blocks get latest --network testnet", - Args: cobra.ExactArgs(1), - }, - Flags: &blockFlags, - Run: get, -} - -func get( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - - query, err := flowkit.NewBlockQuery(args[0]) - if err != nil { - return nil, err - } - - logger.StartProgress("Fetching Block...") - defer logger.StopProgress() - block, err := flow.GetBlock(context.Background(), query) - if err != nil { - return nil, err - } - - var events []flowsdk.BlockEvents - if blockFlags.Events != "" { - events, err = flow.GetEvents( - context.Background(), - []string{blockFlags.Events}, - block.Height, - block.Height, - nil, - ) - if err != nil { - return nil, err - } - } - - collections := make([]*flowsdk.Collection, 0) - if command.ContainsFlag(blockFlags.Include, "transactions") { - for _, guarantee := range block.CollectionGuarantees { - collection, err := flow.GetCollection(context.Background(), guarantee.CollectionID) - if err != nil { - return nil, err - } - collections = append(collections, collection) - } - } - - return &blockResult{ - block: block, - events: events, - collections: collections, - included: blockFlags.Include, - }, nil -} diff --git a/internal/cadence/cadence.go b/internal/cadence/cadence.go deleted file mode 100644 index 2c83aa094..000000000 --- a/internal/cadence/cadence.go +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package cadence - -import ( - "github.com/onflow/cadence/runtime/cmd/execute" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/cadence/languageserver" -) - -var Cmd = &cobra.Command{ - Use: "cadence", - Short: "Execute Cadence code", - GroupID: "tools", - Run: func(cmd *cobra.Command, args []string) { - if len(args) > 0 { - execute.Execute(args, nil) - } else { - repl, err := execute.NewConsoleREPL() - if err != nil { - panic(err) - } - repl.Run() - } - }, -} - -func init() { - Cmd.AddCommand(languageserver.Cmd) -} diff --git a/internal/cadence/languageserver/languageserver.go b/internal/cadence/languageserver/languageserver.go deleted file mode 100644 index 9d29cdf17..000000000 --- a/internal/cadence/languageserver/languageserver.go +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package languageserver - -import ( - "log" - - "github.com/onflow/cadence-tools/languageserver" - "github.com/psiemens/sconfig" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/util" -) - -type config struct { - EnableFlowClient bool `default:"true" flag:"enable-flow-client" info:"Enable Flow client functionality"` -} - -var conf config - -var Cmd = &cobra.Command{ - Use: "language-server", - Short: "Start the Cadence language server", - Run: func(cmd *cobra.Command, args []string) { - languageserver.RunWithStdio(conf.EnableFlowClient) - }, -} - -func init() { - initConfig() -} - -func initConfig() { - err := sconfig.New(&conf). - FromEnvironment(util.EnvPrefix). - BindFlags(Cmd.PersistentFlags()). - Parse() - if err != nil { - log.Fatal(err) - } -} diff --git a/internal/collections/collections.go b/internal/collections/collections.go deleted file mode 100644 index 5da71b523..000000000 --- a/internal/collections/collections.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package collections - -import ( - "bytes" - "fmt" - "strings" - - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "collections", - Short: "Retrieve collections", - TraverseChildren: true, - GroupID: "resources", -} - -func init() { - getCommand.AddToParent(Cmd) -} - -type collectionResult struct { - *flow.Collection -} - -func (c *collectionResult) JSON() any { - txIDs := make([]string, 0) - - for _, tx := range c.Collection.TransactionIDs { - txIDs = append(txIDs, tx.String()) - } - - return txIDs -} - -func (c *collectionResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Collection ID %s:\n", c.Collection.ID()) - - for _, tx := range c.Collection.TransactionIDs { - _, _ = fmt.Fprintf(writer, "%s\n", tx.String()) - } - - _ = writer.Flush() - - return b.String() -} - -func (c *collectionResult) Oneliner() string { - return strings.Join(c.JSON().([]string), ",") -} diff --git a/internal/collections/collections_test.go b/internal/collections/collections_test.go deleted file mode 100644 index 68e7be02e..000000000 --- a/internal/collections/collections_test.go +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package collections - -import ( - "testing" - - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - "github.com/stretchr/testify/require" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_Get(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{util.TestID.String()} - - srv.GetCollection.Run(func(args mock.Arguments) { - id := args.Get(1).(flow.Identifier) - assert.Equal(t, inArgs[0], id.String()) - }) - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - require.NoError(t, err) - require.NotNil(t, result) - }) -} diff --git a/internal/collections/get.go b/internal/collections/get.go deleted file mode 100644 index 72370444a..000000000 --- a/internal/collections/get.go +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package collections - -import ( - "context" - "fmt" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsCollections struct{} - -var collectionFlags = flagsCollections{} - -var getCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "get ", - Short: "Get collection info", - Example: "flow collections get 270d...9c31e", - Args: cobra.ExactArgs(1), - }, - Flags: &collectionFlags, - Run: get, -} - -func get( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - id := flowsdk.HexToID(args[0]) - - logger.StartProgress(fmt.Sprintf("Loading collection %s", id)) - defer logger.StopProgress() - - collection, err := flow.GetCollection(context.Background(), id) - if err != nil { - return nil, err - } - - return &collectionResult{collection}, nil -} diff --git a/internal/command/command.go b/internal/command/command.go deleted file mode 100644 index f1dcd81ca..000000000 --- a/internal/command/command.go +++ /dev/null @@ -1,363 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package command - -import ( - "crypto/sha256" - "encoding/base64" - "errors" - "fmt" - "io" - "net/http" - "os" - "os/user" - "runtime" - "runtime/debug" - "strings" - "sync" - "time" - - "github.com/dukex/mixpanel" - "github.com/getsentry/sentry-go" - "github.com/spf13/afero" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/build" - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/gateway" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/settings" - "github.com/onflow/flow-cli/internal/util" -) - -// run the command with arguments. -type run func( - args []string, - globalFlags GlobalFlags, - logger output.Logger, - readerWriter flowkit.ReaderWriter, - flow flowkit.Services, -) (Result, error) - -// RunWithState runs the command with arguments and state. -type RunWithState func( - args []string, - globalFlags GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (Result, error) - -type Command struct { - Cmd *cobra.Command - Flags any - Run run - RunS RunWithState - Status *int -} - -const ( - formatText = "text" - formatInline = "inline" - formatJSON = "json" -) - -const ( - logLevelDebug = "debug" - logLevelInfo = "info" - logLevelError = "error" - logLevelNone = "none" -) - -// AddToParent add new command to main parent cmd -// and initializes all necessary things as well as take care of errors and output -// here we can do all boilerplate code that is else copied in each command and make sure -// we have one place to handle all errors and ensure commands have consistent results. -func (c Command) AddToParent(parent *cobra.Command) { - // initialize crash reporting for the CLI - initCrashReporting() - - c.Cmd.Run = func(cmd *cobra.Command, args []string) { - if !isDevelopment() { // only report crashes in production - defer sentry.Flush(2 * time.Second) - defer sentry.Recover() - } - - // initialize file loader used in commands - loader := &afero.Afero{Fs: afero.NewOsFs()} - - // if we receive a config error that isn't missing config we should handle it - state, confErr := flowkit.Load(Flags.ConfigPaths, loader) - if !errors.Is(confErr, config.ErrDoesNotExist) { - handleError("Config Error", confErr) - } - - network, err := resolveHost(state, Flags.Host, Flags.HostNetworkKey, Flags.Network) - handleError("Host Error", err) - - clientGateway, err := createGateway(*network) - handleError("Gateway Error", err) - - logger := createLogger(Flags.Log, Flags.Format) - - // initialize services - flow := flowkit.NewFlowkit(state, *network, clientGateway, logger) - - // skip version check if flag is set - if !Flags.SkipVersionCheck { - checkVersion(logger) - } - - // record command usage - wg := sync.WaitGroup{} - go UsageMetrics(c.Cmd, &wg) - - // run command based on requirements for state - var result Result - if c.Run != nil { - result, err = c.Run(args, Flags, logger, loader, flow) - } else if c.RunS != nil { - if confErr != nil { - handleError("Config Error", confErr) - } - - result, err = c.RunS(args, Flags, logger, flow, state) - } else { - panic("command implementation needs to provide run functionality") - } - - handleError("Command Error", err) - - // Do not print a result if none is provided. - // - // This is useful for interactive commands that do not - // require a printed summary (e.g. flow accounts create). - if result == nil { - return - } - - // format output result - formattedResult, err := formatResult(result, Flags.Filter, Flags.Format) - handleError("Result", err) - - // output result - err = outputResult(formattedResult, Flags.Save, Flags.Format, Flags.Filter) - handleError("Output Error", err) - - wg.Wait() - } - - bindFlags(c) - parent.AddCommand(c.Cmd) -} - -// createGateway creates a gateway to be used, defaults to grpc but can support others. -func createGateway(network config.Network) (gateway.Gateway, error) { - // create secure grpc client if hostNetworkKey provided - if network.Key != "" { - return gateway.NewSecureGrpcGateway(network) - } - - return gateway.NewGrpcGateway(network) -} - -// resolveHost from the flags provided. -// -// Resolve the network host in the following order: -// 1. if host flag is provided resolve to that host -// 2. if conf is initialized return host by network flag -// 3. if conf is not initialized and network flag is provided resolve to coded value for that network -// 4. default to emulator network -func resolveHost(state *flowkit.State, hostFlag, networkKeyFlag, networkFlag string) (*config.Network, error) { - // host flag has the highest priority - if hostFlag != "" { - // if network-key was provided validate it - if networkKeyFlag != "" { - err := util.ValidateECDSAP256Pub(networkKeyFlag) - if err != nil { - return nil, fmt.Errorf("invalid network key %s: %w", networkKeyFlag, err) - } - } - - if state != nil { - _, err := state.Networks().ByName(networkFlag) - if err != nil { - return nil, fmt.Errorf("network with name %s does not exist in configuration", networkFlag) - } - } else { - networkFlag = "custom" - } - - return &config.Network{Name: networkFlag, Host: hostFlag, Key: networkKeyFlag}, nil - } - - // network flag with project initialized is next - if state != nil { - stateNetwork, err := state.Networks().ByName(networkFlag) - if err != nil { - return nil, fmt.Errorf("network with name %s does not exist in configuration", networkFlag) - } - - return stateNetwork, nil - } - - networks := config.DefaultNetworks - network, err := networks.ByName(networkFlag) - if err != nil { - return nil, fmt.Errorf("invalid network with name %s", networkFlag) - } - - return network, nil -} - -// create logger utility. -func createLogger(logFlag string, formatFlag string) output.Logger { - // disable logging if we user want a specific format like JSON - // (more common they will not want also to have logs) - if formatFlag != formatText { - logFlag = logLevelNone - } - - var logLevel int - - switch logFlag { - case logLevelDebug: - logLevel = output.DebugLog - case logLevelError: - logLevel = output.ErrorLog - case logLevelNone: - logLevel = output.NoneLog - default: - logLevel = output.InfoLog - } - - return output.NewStdoutLogger(logLevel) -} - -// checkVersion fetches latest version and compares it to local. -func checkVersion(logger output.Logger) { - resp, err := http.Get("https://raw.githubusercontent.com/onflow/flow-cli/master/version.txt") - if err != nil || resp.StatusCode >= 400 { - return - } - - defer func(Body io.ReadCloser) { - err := Body.Close() - if err != nil { - logger.Error("error closing request") - } - }(resp.Body) - - body, _ := io.ReadAll(resp.Body) - latestVersion := strings.TrimSpace(string(body)) - - currentVersion := build.Semver() - if isDevelopment() { - return // avoid warning in local development - } - - if currentVersion != latestVersion { - logger.Info(fmt.Sprintf( - "\n%s Version warning: a new version of Flow CLI is available (%s).\n"+ - " Read the installation guide for upgrade instructions: https://docs.onflow.org/flow-cli/install\n", - output.WarningEmoji(), - strings.ReplaceAll(latestVersion, "\n", ""), - )) - } -} - -func isDevelopment() bool { - return build.Semver() == "undefined" -} - -// initCrashReporting set-ups sentry as crash reporting tool, it also sets listener for panics -// and asks before sending the error for a permission to do so from the user. -func initCrashReporting() { - currentVersion := build.Semver() - sentrySyncTransport := sentry.NewHTTPSyncTransport() - sentrySyncTransport.Timeout = time.Second * 3 - - err := sentry.Init(sentry.ClientOptions{ - Dsn: "https://f4e84ec91b1645779765bbe249b42311@o114654.ingest.sentry.io/6178538", - Environment: "Prod", - Release: currentVersion, - AttachStacktrace: true, - Transport: sentrySyncTransport, - BeforeSend: func(event *sentry.Event, hint *sentry.EventHint) *sentry.Event { - // ask for crash report permission - fmt.Printf("\n%s Crash detected! %s\n\n", output.ErrorEmoji(), event.Message) - - if util.ReportCrash() { - return event - } else { - fmt.Printf("\nPlease help us improve the Flow CLI by opening an issue on https://github.com/onflow/flow-cli/issues, \nand pasting the output as well as a description of the actions you took that resulted in this crash.\n\n") - fmt.Println(hint.RecoveredException) - fmt.Println(event.Threads, event.Fingerprint) - fmt.Println(event.Contexts) - fmt.Println(string(debug.Stack())) - } - - return nil - }, - }) - if err != nil { - _, _ = fmt.Fprintln(os.Stderr, err) // safest output method at this point - } -} - -// The token is injected at build-time using ldflags -var mixpanelToken = "" - -func UsageMetrics(command *cobra.Command, wg *sync.WaitGroup) { - if !settings.MetricsEnabled() || mixpanelToken == "" { - return - } - wg.Add(1) - client := mixpanel.New(mixpanelToken, "") - - // calculates a user ID that doesn't leak any personal information - usr, _ := user.Current() // ignore err, just use empty string - hash := sha256.Sum256([]byte(fmt.Sprintf("%s%s", usr.Username, usr.Uid))) - userID := base64.StdEncoding.EncodeToString(hash[:]) - - _ = client.Track(userID, "cli-command", &mixpanel.Event{ - IP: "0", // do not track IPs - Properties: map[string]any{ - "command": command.CommandPath(), - "version": build.Semver(), - "os": runtime.GOOS, - }, - }) - wg.Done() -} - -// GlobalFlags contains all global flags definitions. -type GlobalFlags struct { - Filter string - Format string - Save string - Host string - HostNetworkKey string - Log string - Network string - Yes bool - ConfigPaths []string - SkipVersionCheck bool -} diff --git a/internal/command/global_flags.go b/internal/command/global_flags.go deleted file mode 100644 index 33ecc0a9f..000000000 --- a/internal/command/global_flags.go +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package command - -import ( - "fmt" - "os" - - "github.com/psiemens/sconfig" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/internal/util" -) - -// Flags initialized to default values. -var Flags = GlobalFlags{ - Filter: "", - Format: formatText, - Save: "", - Host: "", - HostNetworkKey: "", - Network: config.EmulatorNetwork.Name, - Log: logLevelInfo, - Yes: false, - ConfigPaths: config.DefaultPaths(), - SkipVersionCheck: false, -} - -// InitFlags init all the global persistent flags. -func InitFlags(cmd *cobra.Command) { - cmd.PersistentFlags().StringVarP( - &Flags.Filter, - "filter", - "x", - Flags.Filter, - "Filter result values by property name", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Format, - "format", - "", - Flags.Format, - "Format result values", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Host, - "host", - "", - Flags.Host, - "Flow Access API host address", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.HostNetworkKey, - "network-key", - "", - Flags.HostNetworkKey, - "Flow Access API host network key for secure client connections", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Format, - "output", - "o", - Flags.Format, - "Output format, options: \"text\", \"json\", \"inline\"", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Save, - "save", - "s", - Flags.Save, - "Save result to a filename", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Log, - "log", - "l", - Flags.Log, - "Log level, options: \"debug\", \"info\", \"error\", \"none\"", - ) - - cmd.PersistentFlags().StringSliceVarP( - &Flags.ConfigPaths, - "config-path", - "f", - Flags.ConfigPaths, - "Path to flow configuration file", - ) - - cmd.PersistentFlags().StringVarP( - &Flags.Network, - "network", - "n", - Flags.Network, - "Network from configuration file", - ) - - cmd.PersistentFlags().BoolVarP( - &Flags.Yes, - "yes", - "y", - Flags.Yes, - "Approve any prompts", - ) - - cmd.PersistentFlags().BoolVarP( - &Flags.SkipVersionCheck, - "skip-version-check", - "", - Flags.SkipVersionCheck, - "Skip version check during start up", - ) -} - -// bindFlags bind all the flags needed. -func bindFlags(command Command) { - err := sconfig.New(command.Flags). - FromEnvironment(util.EnvPrefix). - BindFlags(command.Cmd.PersistentFlags()). - Parse() - if err != nil { - fmt.Fprintln(os.Stderr, err) - } -} diff --git a/internal/command/global_flags_test.go b/internal/command/global_flags_test.go deleted file mode 100644 index f57c568eb..000000000 --- a/internal/command/global_flags_test.go +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package command_test - -import ( - "fmt" - "strconv" - "strings" - "testing" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" -) - -func TestInitFlags(t *testing.T) { - cmd := &cobra.Command{} - command.InitFlags(cmd) - - flags := []struct { - name string - expected string - }{ - {"filter", command.Flags.Filter}, - {"format", command.Flags.Format}, - {"save", command.Flags.Save}, - {"host", command.Flags.Host}, - {"network-key", command.Flags.HostNetworkKey}, - {"network", command.Flags.Network}, - {"log", command.Flags.Log}, - {"yes", strconv.FormatBool(command.Flags.Yes)}, - {"config-path", fmt.Sprintf("[%s]", strings.Join(command.Flags.ConfigPaths, ","))}, - {"skip-version-check", strconv.FormatBool(command.Flags.SkipVersionCheck)}, - } - - for _, flag := range flags { - f := cmd.PersistentFlags().Lookup(flag.name) - if f == nil { - t.Errorf("Flag %s was not initialized", flag.name) - } else if f.DefValue != flag.expected { - t.Errorf("Flag %s was not initialized with correct default value. Value: %s, Expected: %s", flag.name, f.Value.String(), flag.expected) - } - } -} diff --git a/internal/command/result.go b/internal/command/result.go deleted file mode 100644 index ed9be9266..000000000 --- a/internal/command/result.go +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package command - -import ( - "encoding/json" - "errors" - "fmt" - "os" - "path/filepath" - "strings" - - "github.com/onflow/flow-go-sdk/access/grpc" - "github.com/spf13/afero" - "golang.org/x/exp/maps" - - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" -) - -// Result interface describes all the formats for the result output. -type Result interface { - // String will output the result in human readable output. - String() string - // Oneliner will output the result in "grep-able" format. - Oneliner() string - // JSON will output the result in JSON format - JSON() any -} - -// ContainsFlag checks if output flag is present for the provided field. -func ContainsFlag(flags []string, field string) bool { - for _, n := range flags { - if strings.ToLower(n) == field { - return true - } - } - - return false -} - -// formatResult formats a result for printing. -func formatResult(result Result, filterFlag string, formatFlag string) (string, error) { - if result == nil { - return "", fmt.Errorf("missing result") - } - - if filterFlag != "" { - value, err := filterResultValue(result, filterFlag) - if err != nil { - return "", err - } - - return fmt.Sprintf("%v", value), nil - } - - switch strings.ToLower(formatFlag) { - case formatJSON: - jsonRes, _ := json.Marshal(result.JSON()) - return string(jsonRes), nil - case formatInline: - return result.Oneliner(), nil - default: - return result.String(), nil - } -} - -// outputResult to selected media. -func outputResult(result string, saveFlag string, formatFlag string, filterFlag string) error { - if saveFlag != "" { - af := afero.Afero{ - Fs: afero.NewOsFs(), - } - - // create directory if doesn't exist - dir := filepath.Dir(saveFlag) - err := af.MkdirAll(dir, 0644) - if err != nil { - return err - } - - fmt.Printf("%s result saved to: %s \n", output.SaveEmoji(), saveFlag) - return af.WriteFile(saveFlag, []byte(result), 0644) - } - - if formatFlag == formatInline || filterFlag != "" { - _, _ = fmt.Fprintf(os.Stdout, "%s", result) - } else { // default normal output - _, _ = fmt.Fprintf(os.Stdout, "\n%s\n\n", result) - } - return nil -} - -// filterResultValue returns a value by its name filtered from other result values. -func filterResultValue(result Result, filter string) (any, error) { - res, ok := result.JSON().(map[string]any) - if !ok { - return "", fmt.Errorf("not possible to filter by the value") - } - - value := res[filter] - if value == nil { - value = res[strings.ToLower(filter)] - } - if value == nil { - return nil, fmt.Errorf("value for filter: '%s' doesn't exists, possible values to filter by: %s", filter, maps.Keys(res)) - } - - return value, nil -} - -// handleError handle errors returned from command execution, try to understand why error happens and offer help to the user. -func handleError(description string, err error) { - if err == nil { - return - } - - // TODO(sideninja): refactor this to better handle errors not by string matching - // handle rpc error - switch t := err.(type) { - case *grpc.RPCError: - _, _ = fmt.Fprintf(os.Stderr, "%s Grpc Error: %s \n", output.ErrorEmoji(), t.GRPCStatus().Err().Error()) - default: - if errors.Is(err, config.ErrOutdatedFormat) { - _, _ = fmt.Fprintf(os.Stderr, "%s Config Error: %s \n", output.ErrorEmoji(), err.Error()) - _, _ = fmt.Fprintf(os.Stderr, "%s Please reset configuration using: 'flow init --reset'. Read more about new configuration here: https://github.com/onflow/flow-cli/releases/tag/v0.17.0", output.TryEmoji()) - } else if errors.Is(err, config.ErrDoesNotExist) { - _, _ = fmt.Fprintf(os.Stderr, "%s Config Error: %s \n", output.ErrorEmoji(), err.Error()) - _, _ = fmt.Fprintf(os.Stderr, "%s Please create configuration using: flow init", output.TryEmoji()) - } else if strings.Contains(err.Error(), "transport:") { - _, _ = fmt.Fprintf(os.Stderr, "%s %s \n", output.ErrorEmoji(), strings.Split(err.Error(), "transport:")[1]) - _, _ = fmt.Fprintf(os.Stderr, "%s Make sure your emulator is running or connection address is correct.", output.TryEmoji()) - } else if strings.Contains(err.Error(), "NotFound desc =") { - _, _ = fmt.Fprintf(os.Stderr, "%s Not Found:%s \n", output.ErrorEmoji(), strings.Split(err.Error(), "NotFound desc =")[1]) - } else if strings.Contains(err.Error(), "code = InvalidArgument desc = ") { - desc := strings.Split(err.Error(), "code = InvalidArgument desc = ") - _, _ = fmt.Fprintf(os.Stderr, "%s Invalid argument: %s \n", output.ErrorEmoji(), desc[len(desc)-1]) - if strings.Contains(err.Error(), "is invalid for chain") { - _, _ = fmt.Fprintf(os.Stderr, "%s Check you are connecting to the correct network or account address you use is correct.", output.TryEmoji()) - } else { - _, _ = fmt.Fprintf(os.Stderr, "%s Check your argument and flags value, you can use --help.", output.TryEmoji()) - } - } else if strings.Contains(err.Error(), "invalid signature:") { - _, _ = fmt.Fprintf(os.Stderr, "%s Invalid signature: %s \n", output.ErrorEmoji(), strings.Split(err.Error(), "invalid signature:")[1]) - _, _ = fmt.Fprintf(os.Stderr, "%s Check the signer private key is provided or is in the correct format. If running emulator, make sure it's using the same configuration as this command.", output.TryEmoji()) - } else if strings.Contains(err.Error(), "signature could not be verified using public key with") { - _, _ = fmt.Fprintf(os.Stderr, "%s %s: %s \n", output.ErrorEmoji(), description, err) - _, _ = fmt.Fprintf(os.Stderr, "%s If you are running emulator locally make sure that the emulator was started with the same config as used in this command. \nTry restarting the emulator.", output.TryEmoji()) - } else { - _, _ = fmt.Fprintf(os.Stderr, "%s %s: %s", output.ErrorEmoji(), description, err) - } - } - - fmt.Println() - os.Exit(1) -} diff --git a/internal/command/template.go b/internal/command/template.go deleted file mode 100644 index 87cfa62dd..000000000 --- a/internal/command/template.go +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package command - -var UsageTemplate = `Usage:{{if .Runnable}} - {{.UseLine}}{{end}}{{if .HasAvailableSubCommands}} - {{.CommandPath}} [command]{{end}}{{if gt (len .Aliases) 0}} - -Aliases: - {{.NameAndAliases}}{{end}}{{if .HasExample}} - -Examples: -{{.Example}}{{end}} -{{if .HasAvailableSubCommands}}{{if (eq .Name "flow")}} -👋 Welcome Flow developer! - If you are starting a new flow project use our super commands, start by running 'flow setup'. {{end}}{{end}}{{if .HasAvailableSubCommands}}{{$cmds := .Commands}}{{if eq (len .Groups) 0}} -Available Commands:{{range $cmds}}{{if (or .IsAvailableCommand (eq .Name "help"))}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{else}}{{range $group := .Groups}} - -{{.Title}}{{range $cmds}}{{if (and (eq .GroupID $group.ID) (or .IsAvailableCommand (eq .Name "help")))}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{if not .AllChildCommandsHaveGroup}} - -Additional Commands:{{range $cmds}}{{if (and (eq .GroupID "") (or .IsAvailableCommand (eq .Name "help")))}} - {{rpad .Name .NamePadding }} {{.Short}}{{end}}{{end}}{{end}}{{end}}{{end}}{{if .HasAvailableLocalFlags}} - -Flags: -{{.LocalFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasAvailableInheritedFlags}} - -Global Flags: -{{.InheritedFlags.FlagUsages | trimTrailingWhitespaces}}{{end}}{{if .HasHelpSubCommands}} - -Additional help topics:{{range .Commands}}{{if .IsAdditionalHelpTopicCommand}} - {{rpad .CommandPath .CommandPathPadding}} {{.Short}}{{end}}{{end}}{{end}}{{if .HasAvailableSubCommands}} - -Use "{{.CommandPath}} [command] --help" for more information about a command.{{end}} -` diff --git a/internal/config/add-account.go b/internal/config/add-account.go deleted file mode 100644 index c3255292c..000000000 --- a/internal/config/add-account.go +++ /dev/null @@ -1,167 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "fmt" - "strconv" - - "github.com/onflow/flow-cli/flowkit/accounts" - - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsAddAccount struct { - Name string `flag:"name" info:"Name for the account"` - Address string `flag:"address" info:"Account address"` - KeyIndex string `default:"0" flag:"key-index" info:"Account key index"` - SigAlgo string `default:"ECDSA_P256" flag:"sig-algo" info:"Signature algorithm of this account key"` - HashAlgo string `default:"SHA3_256" flag:"hash-algo" info:"Hash algorithm to pair with this account key"` - Key string `flag:"private-key" info:"Account private key"` -} - -var addAccountFlags = flagsAddAccount{} - -var addAccountCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "account", - Short: "Add account to configuration", - Example: "flow config add account", - Args: cobra.NoArgs, - }, - Flags: &addAccountFlags, - RunS: addAccount, -} - -func addAccount( - _ []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - raw, flagsProvided, err := flagsToAccountData(addAccountFlags) - if err != nil { - return nil, err - } - - if !flagsProvided { - raw = util.NewAccountPrompt() - } - - key, err := parseKey(raw.Key, raw.SigAlgo) - if err != nil { - return nil, err - } - - index, err := parseKeyIndex(raw.KeyIndex) - if err != nil { - return nil, err - } - - accountKey := config.AccountKey{ - Type: config.KeyTypeHex, - Index: index, - SigAlgo: crypto.StringToSignatureAlgorithm(raw.SigAlgo), - HashAlgo: crypto.StringToHashAlgorithm(raw.HashAlgo), - PrivateKey: key, - } - - account := &config.Account{ - Name: raw.Name, - Address: flow.HexToAddress(raw.Address), - Key: accountKey, - } - - hexKey := accounts.NewHexKeyFromPrivateKey(account.Key.Index, account.Key.HashAlgo, account.Key.PrivateKey) - state.Accounts().AddOrUpdate(&accounts.Account{ - Name: account.Name, - Address: account.Address, - Key: hexKey, - }) - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: fmt.Sprintf("Account %s added to the configuration", raw.Name), - }, nil - -} - -func parseKey(key string, sigAlgo string) (crypto.PrivateKey, error) { - privateKey, err := crypto.DecodePrivateKeyHex( - crypto.StringToSignatureAlgorithm(sigAlgo), - key, - ) - if err != nil { - return nil, err - } - - return privateKey, nil -} - -func parseKeyIndex(value string) (int, error) { - v, err := strconv.Atoi(value) - if err != nil { - return 0, fmt.Errorf("invalid index, must be a number") - } - if v < 0 { - return 0, fmt.Errorf("invalid index, must be positive") - } - - return v, nil -} - -func flagsToAccountData(flags flagsAddAccount) (*util.AccountData, bool, error) { - if flags.Name == "" && flags.Address == "" && flags.Key == "" { - return nil, false, nil - } - - if flags.Name == "" { - return nil, true, fmt.Errorf("name must be provided") - } else if flags.Address == "" { - return nil, true, fmt.Errorf("address must be provided") - } else if flags.Key == "" { - return nil, true, fmt.Errorf("key must be provided") - } - - if flow.HexToAddress(flags.Address) == flow.EmptyAddress { - return nil, true, fmt.Errorf("invalid address") - } - - return &util.AccountData{ - Name: flags.Name, - Address: flags.Address, - SigAlgo: flags.SigAlgo, - HashAlgo: flags.HashAlgo, - Key: flags.Key, - KeyIndex: flags.KeyIndex, - }, true, nil -} diff --git a/internal/config/add-contract.go b/internal/config/add-contract.go deleted file mode 100644 index 2191a7ac2..000000000 --- a/internal/config/add-contract.go +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "fmt" - - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsAddContract struct { - Name string `flag:"name" info:"Name of the contract"` - Filename string `flag:"filename" info:"Filename of the contract source"` - EmulatorAlias string `flag:"emulator-alias" info:"Address for the emulator alias"` - TestnetAlias string `flag:"testnet-alias" info:"Address for the testnet alias"` - MainnetAlias string `flag:"mainnet-alias" info:"Address for the mainnet alias"` -} - -var addContractFlags = flagsAddContract{} - -var addContractCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "contract", - Short: "Add contract to configuration", - Example: "flow config add contract", - Args: cobra.NoArgs, - }, - Flags: &addContractFlags, - RunS: addContract, -} - -func addContract( - _ []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - raw, flagsProvided, err := flagsToContractData(addContractFlags) - if err != nil { - return nil, err - } - - if !flagsProvided { - raw = util.NewContractPrompt() - } - - contract := config.Contract{ - Name: raw.Name, - Location: raw.Source, - } - - if raw.Emulator != "" { - contract.Aliases.Add( - config.EmulatorNetwork.Name, - flow.HexToAddress(raw.Emulator), - ) - } - - if raw.Mainnet != "" { - contract.Aliases.Add( - config.MainnetNetwork.Name, - flow.HexToAddress(raw.Mainnet), - ) - } - - if raw.Testnet != "" { - contract.Aliases.Add( - config.TestnetNetwork.Name, - flow.HexToAddress(raw.Testnet), - ) - } - - state.Contracts().AddOrUpdate(contract) - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: fmt.Sprintf("Contract %s added to the configuration", raw.Name), - }, nil -} - -func flagsToContractData(flags flagsAddContract) (*util.ContractData, bool, error) { - if flags.Name == "" && flags.Filename == "" { - return nil, false, nil - } - - if flags.Name == "" { - return nil, true, fmt.Errorf("name must be provided") - } - - if flags.Filename == "" { - return nil, true, fmt.Errorf("contract file name must be provided") - } - - if !config.Exists(flags.Filename) { - return nil, true, fmt.Errorf("contract file doesn't exist: %s", flags.Filename) - } - - if flags.EmulatorAlias != "" && flow.HexToAddress(flags.EmulatorAlias) == flow.EmptyAddress { - return nil, true, fmt.Errorf("invalid emulator alias address") - } - - if flags.TestnetAlias != "" && flow.HexToAddress(flags.TestnetAlias) == flow.EmptyAddress { - return nil, true, fmt.Errorf("invalid testnet alias address") - } - - if flags.MainnetAlias != "" && flow.HexToAddress(flags.MainnetAlias) == flow.EmptyAddress { - return nil, true, fmt.Errorf("invalid mainnnet alias address") - } - - return &util.ContractData{ - Name: flags.Name, - Source: flags.Filename, - Emulator: flags.EmulatorAlias, - Testnet: flags.TestnetAlias, - Mainnet: flags.MainnetAlias, - }, true, nil -} diff --git a/internal/config/add-deployment.go b/internal/config/add-deployment.go deleted file mode 100644 index b642dc7a5..000000000 --- a/internal/config/add-deployment.go +++ /dev/null @@ -1,110 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsAddDeployment struct { - Network string `flag:"network" info:"Network name used for deployment"` - Account string `flag:"account" info:"Account name used for deployment"` - Contracts []string `flag:"contract" info:"Name of the contract to be deployed"` -} - -var addDeploymentFlags = flagsAddDeployment{} - -var addDeploymentCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "deployment", - Short: "Add deployment to configuration", - Example: "flow config add deployment", - Args: cobra.NoArgs, - }, - Flags: &addDeploymentFlags, - RunS: addDeployment, -} - -func addDeployment( - _ []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - raw, flagsProvided, err := flagsToDeploymentData(addDeploymentFlags) - if err != nil { - return nil, err - } - - if !flagsProvided { - raw = util.NewDeploymentPrompt(*state.Networks(), state.Config().Accounts, *state.Contracts()) - } - - deployment := state.Deployments().ByAccountAndNetwork(raw.Account, raw.Network) - if deployment == nil { - // add deployment if non-existing - state.Deployments().AddOrUpdate(config.Deployment{ - Network: raw.Network, - Account: raw.Account, - }) - deployment = state.Deployments().ByAccountAndNetwork(raw.Account, raw.Network) - } - - for _, c := range raw.Contracts { - deployment.AddContract(config.ContractDeployment{Name: c}) - } - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: "Deployment added to the configuration.\nYou can deploy using 'flow project deploy' command", - }, nil -} - -func flagsToDeploymentData(flags flagsAddDeployment) (*util.DeploymentData, bool, error) { - if flags.Network == "" && flags.Account == "" && len(flags.Contracts) == 0 { - return nil, false, nil - } - - if flags.Network == "" { - return nil, true, fmt.Errorf("network name must be provided") - } else if flags.Account == "" { - return nil, true, fmt.Errorf("account name must be provided") - } else if len(flags.Contracts) == 0 { - return nil, true, fmt.Errorf("at least one contract name must be provided") - } - - return &util.DeploymentData{ - Network: flags.Network, - Account: flags.Account, - Contracts: flags.Contracts, - }, true, nil -} diff --git a/internal/config/add-network.go b/internal/config/add-network.go deleted file mode 100644 index 832ee1d7e..000000000 --- a/internal/config/add-network.go +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "fmt" - "net/url" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsAddNetwork struct { - Name string `flag:"name" info:"Network name"` - Host string `flag:"host" info:"Flow Access API host address"` - Key string `flag:"network-key" info:"Flow Access API host network key for secure client connections"` -} - -var addNetworkFlags = flagsAddNetwork{} - -var addNetworkCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "network", - Short: "Add network to configuration", - Example: "flow config add network", - Args: cobra.NoArgs, - }, - Flags: &addNetworkFlags, - RunS: addNetwork, -} - -func addNetwork( - _ []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - raw, flagsProvided, err := flagsToNetworkData(addNetworkFlags) - if err != nil { - return nil, err - } - - if !flagsProvided { - raw = util.NewNetworkPrompt() - } - - state.Networks().AddOrUpdate(config.Network{ - Name: raw["name"], - Host: raw["host"], - Key: raw["key"], - }) - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: fmt.Sprintf("Network %s added to the configuration", raw["name"]), - }, nil -} - -func flagsToNetworkData(flags flagsAddNetwork) (map[string]string, bool, error) { - if flags.Name == "" && flags.Host == "" { - return nil, false, nil - } - - if flags.Name == "" { - return nil, true, fmt.Errorf("name must be provided") - } else if flags.Host == "" { - return nil, true, fmt.Errorf("host must be provided") - } - - _, err := url.ParseRequestURI(flags.Host) - if err != nil { - return nil, true, err - } - - err = util.ValidateECDSAP256Pub(flags.Key) - if err != nil { - return nil, true, fmt.Errorf("invalid network-key provided") - } - - return map[string]string{ - "name": flags.Name, - "host": flags.Host, - "key": flags.Key, - }, true, nil -} diff --git a/internal/config/add.go b/internal/config/add.go deleted file mode 100644 index 3a28666ce..000000000 --- a/internal/config/add.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" -) - -var addCmd = &cobra.Command{ - Use: "add ", - Short: "Add resource to configuration", - Example: "flow config add account", - Args: cobra.ExactArgs(1), - TraverseChildren: true, -} - -func init() { - addAccountCommand.AddToParent(addCmd) - addContractCommand.AddToParent(addCmd) - addDeploymentCommand.AddToParent(addCmd) - addNetworkCommand.AddToParent(addCmd) -} diff --git a/internal/config/config.go b/internal/config/config.go deleted file mode 100644 index 3689ca348..000000000 --- a/internal/config/config.go +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "config", - Short: "Utilities to manage configuration", - TraverseChildren: true, -} - -func init() { - initCommand.AddToParent(Cmd) - Cmd.AddCommand(addCmd) - Cmd.AddCommand(removeCmd) -} - -type result struct { - result string -} - -func (r *result) JSON() any { - return nil -} - -func (r *result) String() string { - if r.result != "" { - return r.result - } - - return "" -} - -func (r *result) Oneliner() string { - return "" -} diff --git a/internal/config/init.go b/internal/config/init.go deleted file mode 100644 index c726004fe..000000000 --- a/internal/config/init.go +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "bytes" - "fmt" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsInit struct { - ServicePrivateKey string `flag:"service-private-key" info:"Service account private 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"` - Reset bool `default:"false" flag:"reset" info:"Reset configuration file"` - Global bool `default:"false" flag:"global" info:"Initialize global user configuration"` -} - -var InitFlag = flagsInit{} - -var initCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "init", - Short: "Initialize a new configuration", - }, - Flags: &InitFlag, - Run: Initialise, -} - -func Initialise( - _ []string, - _ command.GlobalFlags, - logger output.Logger, - readerWriter flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - logger.Info("⚠️Notice: for starting a new project prefer using 'flow setup'.") - - sigAlgo := crypto.StringToSignatureAlgorithm(InitFlag.ServiceKeySigAlgo) - if sigAlgo == crypto.UnknownSignatureAlgorithm { - return nil, fmt.Errorf("invalid signature algorithm: %s", InitFlag.ServiceKeySigAlgo) - } - - hashAlgo := crypto.StringToHashAlgorithm(InitFlag.ServiceKeyHashAlgo) - if hashAlgo == crypto.UnknownHashAlgorithm { - return nil, fmt.Errorf("invalid hash algorithm: %s", InitFlag.ServiceKeyHashAlgo) - } - - state, err := flowkit.Init(readerWriter, sigAlgo, hashAlgo) - if err != nil { - return nil, err - } - - if InitFlag.ServicePrivateKey != "" { - privateKey, err := crypto.DecodePrivateKeyHex(sigAlgo, InitFlag.ServicePrivateKey) - if err != nil { - return nil, fmt.Errorf("invalid private key: %w", err) - } - - state.SetEmulatorKey(privateKey) - } - - path := config.DefaultPath - if InitFlag.Global { - path = config.GlobalPath() - } - - if config.Exists(path) && !InitFlag.Reset { - return nil, fmt.Errorf( - "configuration already exists at: %s, if you want to reset configuration use the reset flag", - path, - ) - } - - err = state.Save(path) - if err != nil { - return nil, err - } - - return &initResult{State: state}, nil -} - -type initResult struct { - *flowkit.State -} - -func (r *initResult) JSON() any { - return r -} - -func (r *initResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - account, _ := r.State.EmulatorServiceAccount() - - _, _ = fmt.Fprintf(writer, "Configuration initialized\n") - _, _ = fmt.Fprintf(writer, "Service account: %s\n\n", output.Bold("0x"+account.Address.String())) - _, _ = fmt.Fprintf(writer, - "Start emulator by running: %s \nReset configuration using: %s\n", - output.Bold("'flow emulator'"), - output.Bold("'flow init --reset'"), - ) - - _ = writer.Flush() - return b.String() -} - -func (r *initResult) Oneliner() string { - return "" -} diff --git a/internal/config/remove-account.go b/internal/config/remove-account.go deleted file mode 100644 index a2b42f36b..000000000 --- a/internal/config/remove-account.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsRemoveAccount struct{} - -var removeAccountFlags = flagsRemoveAccount{} - -var removeAccountCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "account ", - Short: "Remove account from configuration", - Example: "flow config remove account Foo", - Args: cobra.MaximumNArgs(1), - }, - Flags: &removeAccountFlags, - RunS: removeAccount, -} - -func removeAccount( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - name := "" - if len(args) == 1 { - name = args[0] - } else { - name = util.RemoveAccountPrompt(state.Config().Accounts) - } - - err := state.Accounts().Remove(name) - if err != nil { - return nil, err - } - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: "account removed", - }, nil -} diff --git a/internal/config/remove-contract.go b/internal/config/remove-contract.go deleted file mode 100644 index fd7236566..000000000 --- a/internal/config/remove-contract.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsRemoveContract struct{} - -var removeContractFlags = flagsRemoveContract{} - -var removeContractCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "contract ", - Short: "Remove contract from configuration", - Example: "flow config remove contract Foo", - Args: cobra.MaximumNArgs(1), - }, - Flags: &removeContractFlags, - RunS: removeContract, -} - -func removeContract( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - name := "" - if len(args) == 1 { - name = args[0] - } else { - name = util.RemoveContractPrompt(*state.Contracts()) - } - - err := state.Contracts().Remove(name) - if err != nil { - return nil, err - } - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: "contract removed", - }, nil -} diff --git a/internal/config/remove-deployment.go b/internal/config/remove-deployment.go deleted file mode 100644 index 6a8c0daf1..000000000 --- a/internal/config/remove-deployment.go +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsRemoveDeployment struct{} - -var removeDeploymentFlags = flagsRemoveDeployment{} - -var removeDeploymentCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "deployment ", - Short: "Remove deployment from configuration", - Example: "flow config remove deployment Foo testnet", - Args: cobra.MaximumNArgs(2), - }, - Flags: &removeDeploymentFlags, - RunS: removeDeployment, -} - -func removeDeployment( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - account := "" - network := "" - if len(args) == 2 { - account = args[0] - network = args[1] - } else { - account, network = util.RemoveDeploymentPrompt(*state.Deployments()) - } - - err := state.Deployments().Remove(account, network) - if err != nil { - return nil, err - } - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: "deployment removed", - }, nil -} diff --git a/internal/config/remove-network.go b/internal/config/remove-network.go deleted file mode 100644 index 48f2d956f..000000000 --- a/internal/config/remove-network.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsRemoveNetwork struct{} - -var removeNetworkFlags = flagsRemoveNetwork{} - -var removeNetworkCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "network ", - Short: "Remove network from configuration", - Example: "flow config remove network Foo", - Args: cobra.MaximumNArgs(1), - }, - Flags: &removeNetworkFlags, - RunS: removeNetwork, -} - -func removeNetwork( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - name := "" - if len(args) == 1 { - name = args[0] - } else { - name = util.RemoveNetworkPrompt(*state.Networks()) - } - - err := state.Networks().Remove(name) - if err != nil { - return nil, err - } - - err = state.SaveEdited(globalFlags.ConfigPaths) - if err != nil { - return nil, err - } - - return &result{ - result: "network removed", - }, nil -} diff --git a/internal/config/remove.go b/internal/config/remove.go deleted file mode 100644 index 771438c07..000000000 --- a/internal/config/remove.go +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package config - -import ( - "github.com/spf13/cobra" -) - -var removeCmd = &cobra.Command{ - Use: "remove ", - Short: "Remove resource from configuration", - Example: "flow config remove account", - Args: cobra.ExactArgs(1), - TraverseChildren: true, -} - -func init() { - removeAccountCommand.AddToParent(removeCmd) - removeContractCommand.AddToParent(removeCmd) - removeDeploymentCommand.AddToParent(removeCmd) - removeNetworkCommand.AddToParent(removeCmd) -} diff --git a/internal/dependencymanager/add.go b/internal/dependencymanager/add.go deleted file mode 100644 index 72eaedb7e..000000000 --- a/internal/dependencymanager/add.go +++ /dev/null @@ -1,75 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package dependencymanager - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type addFlagsCollection struct { - name string `default:"" flag:"name" info:"Name of the dependency"` -} - -var addFlags = addFlagsCollection{} - -var addCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "add ", - Short: "Add a single contract and its dependencies.", - Example: "flow dependencies add testnet://0afe396ebc8eee65.FlowToken", - Args: cobra.ExactArgs(1), - }, - Flags: &addFlags, - RunS: add, -} - -func add( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - logger.Info(fmt.Sprintf("🔄 Installing dependencies for %s...", args[0])) - - dep := args[0] - - installer, err := NewDependencyInstaller(logger, state) - if err != nil { - logger.Error(fmt.Sprintf("Error: %v", err)) - return nil, err - } - - if err := installer.Add(dep, addFlags.name); err != nil { - logger.Error(fmt.Sprintf("Error: %v", err)) - return nil, err - } - - logger.Info("✅ Dependency installation complete. Check your flow.json") - logger.Info("Ensure you add any required dependencies to your 'deployments' section. This can be done using the 'flow config add deployment' command.") - logger.Info("Note: Core contracts do not need to be added to deployments. For reference, see this URL: https://github.com/onflow/flow-core-contracts") - - return nil, nil -} diff --git a/internal/dependencymanager/dependencies.go b/internal/dependencymanager/dependencies.go deleted file mode 100644 index 7175b7e9b..000000000 --- a/internal/dependencymanager/dependencies.go +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package dependencymanager - -import ( - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "dependencies", - Short: "Manage contracts and dependencies", - TraverseChildren: true, - GroupID: "manager", - Aliases: []string{"deps"}, -} - -func init() { - addCommand.AddToParent(Cmd) - installCommand.AddToParent(Cmd) -} diff --git a/internal/dependencymanager/dependencyinstaller.go b/internal/dependencymanager/dependencyinstaller.go deleted file mode 100644 index 0be79d74b..000000000 --- a/internal/dependencymanager/dependencyinstaller.go +++ /dev/null @@ -1,309 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package dependencymanager - -import ( - "crypto/sha256" - "encoding/hex" - "fmt" - "os" - "path/filepath" - "sync" - - "github.com/onflow/flow-cli/internal/util" - - "github.com/onflow/flow-cli/flowkit/gateway" - - "github.com/onflow/flow-cli/flowkit/project" - - flowsdk "github.com/onflow/flow-go-sdk" - - "github.com/onflow/flow-cli/flowkit/config" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" -) - -type DependencyInstaller struct { - Gateways map[string]gateway.Gateway - Logger output.Logger - State *flowkit.State - Mutex sync.Mutex -} - -// NewDependencyInstaller creates a new instance of DependencyInstaller -func NewDependencyInstaller(logger output.Logger, state *flowkit.State) (*DependencyInstaller, error) { - emulatorGateway, err := gateway.NewGrpcGateway(config.EmulatorNetwork) - if err != nil { - return nil, fmt.Errorf("error creating emulator gateway: %v", err) - } - - testnetGateway, err := gateway.NewGrpcGateway(config.TestnetNetwork) - if err != nil { - return nil, fmt.Errorf("error creating testnet gateway: %v", err) - } - - mainnetGateway, err := gateway.NewGrpcGateway(config.MainnetNetwork) - if err != nil { - return nil, fmt.Errorf("error creating mainnet gateway: %v", err) - } - - gateways := map[string]gateway.Gateway{ - config.EmulatorNetwork.Name: emulatorGateway, - config.TestnetNetwork.Name: testnetGateway, - config.MainnetNetwork.Name: mainnetGateway, - } - - return &DependencyInstaller{ - Gateways: gateways, - Logger: logger, - State: state, - }, nil -} - -// Install processes all the dependencies in the state and installs them and any dependencies they have -func (di *DependencyInstaller) Install() error { - for _, dependency := range *di.State.Dependencies() { - if err := di.processDependency(dependency); err != nil { - di.Logger.Error(fmt.Sprintf("Error processing dependency: %v", err)) - return err - } - } - return nil -} - -// Add processes a single dependency and installs it and any dependencies it has, as well as adding it to the state -func (di *DependencyInstaller) Add(depSource, customName string) error { - depNetwork, depAddress, depContractName, err := config.ParseSourceString(depSource) - if err != nil { - return fmt.Errorf("error parsing source: %w", err) - } - - name := depContractName - - if customName != "" { - name = customName - } - - dep := config.Dependency{ - Name: name, - Source: config.Source{ - NetworkName: depNetwork, - Address: flowsdk.HexToAddress(depAddress), - ContractName: depContractName, - }, - } - - if err := di.processDependency(dep); err != nil { - return fmt.Errorf("error processing dependency: %w", err) - } - - return nil -} - -func (di *DependencyInstaller) processDependency(dependency config.Dependency) error { - depAddress := flowsdk.HexToAddress(dependency.Source.Address.String()) - return di.fetchDependencies(dependency.Source.NetworkName, depAddress, dependency.Name, dependency.Source.ContractName) -} - -func (di *DependencyInstaller) fetchDependencies(networkName string, address flowsdk.Address, assignedName, contractName string) error { - account, err := di.Gateways[networkName].GetAccount(address) - if err != nil { - return fmt.Errorf("failed to get account: %w", err) - } - if account == nil { - return fmt.Errorf("account is nil for address: %s", address) - } - - if account.Contracts == nil { - return fmt.Errorf("contracts are nil for account: %s", address) - } - - var wg sync.WaitGroup - errCh := make(chan error, len(account.Contracts)) - - // Create a max number of goroutines so that we don't rate limit the access node - maxGoroutines := 5 - semaphore := make(chan struct{}, maxGoroutines) - - found := false - - for _, contract := range account.Contracts { - program, err := project.NewProgram(contract, nil, "") - if err != nil { - return fmt.Errorf("failed to parse program: %w", err) - } - - parsedContractName, err := program.Name() - if err != nil { - return fmt.Errorf("failed to parse contract name: %w", err) - } - - if parsedContractName == contractName { - found = true - - if err := di.handleFoundContract(networkName, address.String(), assignedName, parsedContractName, program); err != nil { - return fmt.Errorf("failed to handle found contract: %w", err) - } - - if program.HasAddressImports() { - imports := program.AddressImportDeclarations() - for _, imp := range imports { - wg.Add(1) - go func(importAddress flowsdk.Address, contractName string) { - semaphore <- struct{}{} - defer func() { - <-semaphore - wg.Done() - }() - err := di.fetchDependencies(networkName, importAddress, contractName, contractName) - if err != nil { - errCh <- err - } - }(flowsdk.HexToAddress(imp.Location.String()), imp.Identifiers[0].String()) - } - } - } - } - - if !found { - errMsg := fmt.Sprintf("contract %s not found for account %s on network %s", contractName, address, networkName) - di.Logger.Error(errMsg) - } - - wg.Wait() - close(errCh) - close(semaphore) - - for err := range errCh { - if err != nil { - return err - } - } - - return nil -} - -func (di *DependencyInstaller) contractFileExists(address, contractName string) bool { - fileName := fmt.Sprintf("%s.cdc", contractName) - path := filepath.Join("imports", address, fileName) - - _, err := di.State.ReaderWriter().Stat(path) - - return err == nil -} - -func (di *DependencyInstaller) createContractFile(address, contractName, data string) error { - fileName := fmt.Sprintf("%s.cdc", contractName) - path := filepath.Join("imports", address, fileName) - dir := filepath.Dir(path) - - if err := di.State.ReaderWriter().MkdirAll(dir, 0755); err != nil { - return fmt.Errorf("error creating directories: %w", err) - } - - if err := di.State.ReaderWriter().WriteFile(path, []byte(data), 0644); err != nil { - return fmt.Errorf("error writing file: %w", err) - } - - return nil -} - -func (di *DependencyInstaller) handleFileSystem(contractAddr, contractName, contractData, networkName string) error { - di.Mutex.Lock() - defer di.Mutex.Unlock() - - if !di.contractFileExists(contractAddr, contractName) { - if err := di.createContractFile(contractAddr, contractName, contractData); err != nil { - return fmt.Errorf("failed to create contract file: %w", err) - } - - di.Logger.Info(fmt.Sprintf("Dependency Manager: %s from %s on %s installed", contractName, contractAddr, networkName)) - } - - return nil -} - -func (di *DependencyInstaller) handleFoundContract(networkName, contractAddr, assignedName, contractName string, program *project.Program) error { - hash := sha256.New() - hash.Write(program.CodeWithUnprocessedImports()) - originalContractDataHash := hex.EncodeToString(hash.Sum(nil)) - - program.ConvertAddressImports() - contractData := string(program.CodeWithUnprocessedImports()) - - dependency := di.State.Dependencies().ByName(assignedName) - - // If a dependency by this name already exists and its remote source network or address does not match, then give option to stop or continue - if dependency != nil && (dependency.Source.NetworkName != networkName || dependency.Source.Address.String() != contractAddr) { - di.Logger.Info(fmt.Sprintf("🚫 A dependency named %s already exists with a different remote source. Please fix the conflict and retry.", assignedName)) - os.Exit(0) - return nil - } - - // Check if remote source version is different from local version - // If it is, ask if they want to update - // If no hash, ignore - if dependency != nil && dependency.Hash != "" && dependency.Hash != originalContractDataHash { - msg := fmt.Sprintf("The latest version of %s is different from the one you have locally. Do you want to update it?", contractName) - if !util.GenericBoolPrompt(msg) { - return nil - } - } - - err := di.handleFileSystem(contractAddr, contractName, contractData, networkName) - if err != nil { - return fmt.Errorf("error handling file system: %w", err) - } - - err = di.updateState(networkName, contractAddr, assignedName, contractName, originalContractDataHash) - if err != nil { - di.Logger.Error(fmt.Sprintf("Error updating state: %v", err)) - return err - } - - return nil -} - -func (di *DependencyInstaller) updateState(networkName, contractAddress, assignedName, contractName, contractHash string) error { - dep := config.Dependency{ - Name: assignedName, - Source: config.Source{ - NetworkName: networkName, - Address: flowsdk.HexToAddress(contractAddress), - ContractName: contractName, - }, - Hash: contractHash, - } - - isNewDep := di.State.Dependencies().ByName(dep.Name) == nil - - di.State.Dependencies().AddOrUpdate(dep) - di.State.Contracts().AddDependencyAsContract(dep, networkName) - err := di.State.SaveDefault() - if err != nil { - return err - } - - if isNewDep { - di.Logger.Info(fmt.Sprintf("Dependency Manager: %s added to flow.json", dep.Name)) - } - - return nil -} diff --git a/internal/dependencymanager/dependencyinstaller_test.go b/internal/dependencymanager/dependencyinstaller_test.go deleted file mode 100644 index 9a7e1ac59..000000000 --- a/internal/dependencymanager/dependencyinstaller_test.go +++ /dev/null @@ -1,131 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package dependencymanager - -import ( - "fmt" - "testing" - - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/gateway" - "github.com/onflow/flow-cli/flowkit/gateway/mocks" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/util" -) - -func TestDependencyInstallerInstall(t *testing.T) { - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - serviceAcc, _ := state.EmulatorServiceAccount() - serviceAddress := serviceAcc.Address - - dep := config.Dependency{ - Name: "Hello", - Source: config.Source{ - NetworkName: "emulator", - Address: serviceAddress, - ContractName: "Hello", - }, - } - - state.Dependencies().AddOrUpdate(dep) - - t.Run("Success", func(t *testing.T) { - gw := mocks.DefaultMockGateway() - - gw.GetAccount.Run(func(args mock.Arguments) { - addr := args.Get(0).(flow.Address) - assert.Equal(t, addr.String(), serviceAcc.Address.String()) - acc := tests.NewAccountWithAddress(addr.String()) - acc.Contracts = map[string][]byte{ - tests.ContractHelloString.Name: tests.ContractHelloString.Source, - } - - gw.GetAccount.Return(acc, nil) - }) - - di := &DependencyInstaller{ - Gateways: map[string]gateway.Gateway{ - config.EmulatorNetwork.Name: gw.Mock, - config.TestnetNetwork.Name: gw.Mock, - config.MainnetNetwork.Name: gw.Mock, - }, - Logger: logger, - State: state, - } - - err := di.Install() - assert.NoError(t, err, "Failed to install dependencies") - - filePath := fmt.Sprintf("imports/%s/%s.cdc", serviceAddress.String(), tests.ContractHelloString.Name) - fileContent, err := state.ReaderWriter().ReadFile(filePath) - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, fileContent) - }) -} - -func TestDependencyInstallerAdd(t *testing.T) { - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - serviceAcc, _ := state.EmulatorServiceAccount() - serviceAddress := serviceAcc.Address - - t.Run("Success", func(t *testing.T) { - gw := mocks.DefaultMockGateway() - - gw.GetAccount.Run(func(args mock.Arguments) { - addr := args.Get(0).(flow.Address) - assert.Equal(t, addr.String(), serviceAcc.Address.String()) - acc := tests.NewAccountWithAddress(addr.String()) - acc.Contracts = map[string][]byte{ - tests.ContractHelloString.Name: tests.ContractHelloString.Source, - } - - gw.GetAccount.Return(acc, nil) - }) - - di := &DependencyInstaller{ - Gateways: map[string]gateway.Gateway{ - config.EmulatorNetwork.Name: gw.Mock, - config.TestnetNetwork.Name: gw.Mock, - config.MainnetNetwork.Name: gw.Mock, - }, - Logger: logger, - State: state, - } - - sourceStr := fmt.Sprintf("emulator://%s.%s", serviceAddress.String(), tests.ContractHelloString.Name) - err := di.Add(sourceStr, "") - assert.NoError(t, err, "Failed to install dependencies") - - filePath := fmt.Sprintf("imports/%s/%s.cdc", serviceAddress.String(), tests.ContractHelloString.Name) - fileContent, err := state.ReaderWriter().ReadFile(filePath) - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, fileContent) - }) -} diff --git a/internal/dependencymanager/install.go b/internal/dependencymanager/install.go deleted file mode 100644 index cd16effb9..000000000 --- a/internal/dependencymanager/install.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package dependencymanager - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type installFlagsCollection struct{} - -var installFlags = installFlagsCollection{} - -var installCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "install", - Short: "Install contract and dependencies.", - Example: "flow dependencies install", - }, - Flags: &installFlags, - RunS: install, -} - -func install( - _ []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - logger.Info("🔄 Installing dependencies from flow.json...") - - installer, err := NewDependencyInstaller(logger, state) - if err != nil { - logger.Error(fmt.Sprintf("Error: %v", err)) - return nil, err - } - - if err := installer.Install(); err != nil { - logger.Error(fmt.Sprintf("Error: %v", err)) - return nil, err - } - - logger.Info("✅ Dependency installation complete. Check your flow.json") - - return nil, nil -} diff --git a/internal/emulator/snapshot.go b/internal/emulator/snapshot.go deleted file mode 100644 index 5855e403d..000000000 --- a/internal/emulator/snapshot.go +++ /dev/null @@ -1,253 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package emulator - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "strings" - - "github.com/spf13/cobra" - "golang.org/x/exp/slices" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type SnapshotFlag struct{} - -var snapshotFlag = SnapshotFlag{} - -var SnapshotCmd = &command.Command{ - Cmd: &cobra.Command{ - Use: "snapshot [snapshotName]", - Short: "Create/Load/List emulator snapshots", - Example: "flow emulator snapshot create testSnapshot", - Args: cobra.RangeArgs(1, 2), - }, - Flags: &snapshotFlag, - Run: snapshot, -} - -type snapshotList struct { - Snapshots []string -} - -func (s *snapshotList) JSON() any { - return s.Snapshots -} - -func (s *snapshotList) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - _, _ = fmt.Fprintf(writer, "Snapshots:\n") - for _, snapshotName := range s.Snapshots { - _, _ = fmt.Fprintf(writer, "\t%s\n", snapshotName) - } - _ = writer.Flush() - return b.String() -} - -func (s *snapshotList) Oneliner() string { - return strings.Join(s.Snapshots, ",") -} - -type snapShotResult struct { - Name string `json:"context"` - BlockID string `json:"blockId"` - Height uint64 `json:"height"` - Result string `json:"result,omitempty"` -} - -func (r *snapShotResult) JSON() any { - result := make(map[string]any) - result["name"] = r.Name - result["blockID"] = r.BlockID - result["height"] = r.Height - if r.Result != "" { - result["result"] = r.Result - } - - return result -} - -func (r *snapShotResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - if r.Result != "" { - _, _ = fmt.Fprintf(writer, "%s\n", r.Result) - } - _, _ = fmt.Fprintf(writer, "Name\t%s\n", r.Name) - _, _ = fmt.Fprintf(writer, "Block ID\t%s\n", r.BlockID) - _, _ = fmt.Fprintf(writer, "Height\t%d", r.Height) - - _ = writer.Flush() - return b.String() -} - -func (r *snapShotResult) Oneliner() string { - return fmt.Sprintf("%s : %s (%d) %s", r.Name, r.BlockID, r.Height, r.Result) -} - -const snapshotEndpoint = "http://localhost:8080/emulator/snapshots" - -func makeRequest(r *http.Request, v any) error { - resp, err := http.DefaultClient.Do(r) - if err != nil { - return fmt.Errorf("emulator snapshot request error: %w", err) - } - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("emulator snapshot request error: status_code=%d", resp.StatusCode) - } - - body, err := io.ReadAll(resp.Body) - if err != nil { - return err - } - - err = json.Unmarshal(body, v) - if err != nil { - return err - } - - return nil -} - -func requestListSnapshots() (*http.Request, error) { - request, err := http.NewRequest("GET", snapshotEndpoint, nil) - if err != nil { - return nil, err - } - return request, nil -} - -func requestCreateSnapshot(name string) (*http.Request, error) { - requestBody := bytes.NewBufferString(fmt.Sprintf("name=%s", name)) - request, err := http.NewRequest("POST", snapshotEndpoint, requestBody) - request.Header.Add("Content-Type", "application/x-www-form-urlencoded") - if err != nil { - return nil, err - } - return request, nil -} - -func requestLoadSnapshot(name string) (*http.Request, error) { - request, err := http.NewRequest("PUT", fmt.Sprintf("%s/%s", snapshotEndpoint, name), nil) - if err != nil { - return nil, err - } - return request, nil -} - -func listSnapshot() (result []string, err error) { - req, err := requestListSnapshots() - if err != nil { - return []string{}, err - } - - err = makeRequest(req, &result) - if err != nil { - return []string{}, err - } - - return result, nil -} - -type snapshotCommand string - -const ( - snapshotCommandList snapshotCommand = "list" - snapshotCommandCreate snapshotCommand = "create" - snapshotCommandLoad snapshotCommand = "load" -) - -func snapshot( - args []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - - subCommand := args[0] - - snapshots, err := listSnapshot() - if err != nil { - return nil, err - } - - switch snapshotCommand(subCommand) { - case snapshotCommandList: - return &snapshotList{Snapshots: snapshots}, nil - - case snapshotCommandCreate: - if len(args) < 2 { - return nil, fmt.Errorf("snapshot create command requires name argument") - } - name := args[1] - exists := slices.Contains(snapshots, name) - if exists { - return nil, fmt.Errorf("snapshot '%s' already exists", name) - } - - var result snapShotResult - req, err := requestCreateSnapshot(name) - if err != nil { - return nil, err - } - err = makeRequest(req, &result) - if err != nil { - return nil, err - } - result.Result = "Snapshot created" - return &result, nil - - case snapshotCommandLoad: - if len(args) < 2 { - return nil, fmt.Errorf("snapshot load command requires name argument") - } - name := args[1] - exists := slices.Contains(snapshots, name) - if !exists { - return nil, fmt.Errorf("snapshot '%s' does not exist", name) - } - - var result snapShotResult - req, err := requestLoadSnapshot(name) - if err != nil { - return nil, err - } - err = makeRequest(req, &result) - if err != nil { - return nil, err - } - result.Result = "Snapshot loaded" - return &result, nil - - default: - return nil, fmt.Errorf("invalid snapshot command: valid commands are: 'list', 'create', 'load'") - } - -} diff --git a/internal/emulator/start.go b/internal/emulator/start.go deleted file mode 100644 index d0661b088..000000000 --- a/internal/emulator/start.go +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package emulator - -import ( - "errors" - "fmt" - "os" - "sync" - - "github.com/onflow/flow-emulator/cmd/emulator/start" - "github.com/onflow/flow-emulator/emulator" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/afero" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd *cobra.Command - -func configuredServiceKey( - init bool, - sigAlgo crypto.SignatureAlgorithm, - hashAlgo crypto.HashAlgorithm, -) ( - crypto.PrivateKey, - crypto.SignatureAlgorithm, - crypto.HashAlgorithm, -) { - var state *flowkit.State - var err error - loader := &afero.Afero{Fs: afero.NewOsFs()} - command.UsageMetrics(Cmd, &sync.WaitGroup{}) - - if init { - if sigAlgo == crypto.UnknownSignatureAlgorithm { - sigAlgo = emulator.DefaultServiceKeySigAlgo - } - - if hashAlgo == crypto.UnknownHashAlgorithm { - hashAlgo = emulator.DefaultServiceKeyHashAlgo - } - - state, err = flowkit.Init(loader, sigAlgo, hashAlgo) - if err != nil { - exitf(1, err.Error()) - } else { - err = state.SaveDefault() - if err != nil { - exitf(1, err.Error()) - } - } - } else { - state, err = flowkit.Load(command.Flags.ConfigPaths, loader) - if err != nil { - if errors.Is(err, config.ErrDoesNotExist) { - exitf(1, "🙏 Configuration is missing, initialize it with: 'flow init' and then rerun this command.") - } else { - exitf(1, err.Error()) - } - } - } - - serviceAccount, err := state.EmulatorServiceAccount() - if err != nil { - util.Exit(1, err.Error()) - } - - privateKey, err := serviceAccount.Key.PrivateKey() - if err != nil { - util.Exit(1, "Only hexadecimal keys can be used as the emulator service account key.") - } - - err = serviceAccount.Key.Validate() - if err != nil { - util.Exit( - 1, - fmt.Sprintf("invalid private key in %s emulator configuration, %s", - serviceAccount.Name, - err.Error(), - ), - ) - } - - return *privateKey, serviceAccount.Key.SigAlgo(), serviceAccount.Key.HashAlgo() -} - -func init() { - Cmd = start.Cmd(configuredServiceKey) - Cmd.Use = "emulator" - Cmd.Short = "Run Flow network for development" - Cmd.GroupID = "tools" - SnapshotCmd.AddToParent(Cmd) -} - -func exitf(code int, msg string, args ...any) { - fmt.Printf(msg+"\n", args...) - os.Exit(code) -} diff --git a/internal/events/events.go b/internal/events/events.go deleted file mode 100644 index 83ab34d3a..000000000 --- a/internal/events/events.go +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package events - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - - "github.com/onflow/cadence" - jsoncdc "github.com/onflow/cadence/encoding/json" - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "events", - Short: "Retrieve events", - TraverseChildren: true, - GroupID: "resources", -} - -func init() { - getCommand.AddToParent(Cmd) -} - -type EventResult struct { - BlockEvents []flow.BlockEvents - Events []flow.Event -} - -func (e *EventResult) JSON() any { - result := make([]any, 0) - - for _, blockEvent := range e.BlockEvents { - if len(blockEvent.Events) > 0 { - for _, event := range blockEvent.Events { - result = append(result, map[string]any{ - "blockID": blockEvent.Height, - "index": event.EventIndex, - "type": event.Type, - "transactionId": event.TransactionID.String(), - "values": json.RawMessage( - jsoncdc.MustEncode(event.Value), - ), - }) - } - } - } - - return result -} - -func (e *EventResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - for _, blockEvent := range e.BlockEvents { - if len(blockEvent.Events) > 0 { - _, _ = fmt.Fprintf(writer, "Events Block #%v:", blockEvent.Height) - eventsString(writer, blockEvent.Events) - _, _ = fmt.Fprintf(writer, "\n") - } - } - - // if we have events passed directly and not in relation to block - eventsString(writer, e.Events) - - _ = writer.Flush() - return b.String() -} - -func (e *EventResult) Oneliner() string { - result := "" - for _, blockEvent := range e.BlockEvents { - if len(blockEvent.Events) > 0 { - result += fmt.Sprintf("Events Block #%v: [", blockEvent.Height) - for _, event := range blockEvent.Events { - result += fmt.Sprintf( - "Index: %v, Type: %v, TxID: %s, Value: %v", - event.EventIndex, event.Type, event.TransactionID, event.Value, - ) - } - result += "] " - } - } - - return result -} - -func eventsString(writer io.Writer, events []flow.Event) { - for _, event := range events { - eventString(writer, event) - } -} - -func eventString(writer io.Writer, event flow.Event) { - _, _ = fmt.Fprintf(writer, "\n Index\t%d\n", event.EventIndex) - _, _ = fmt.Fprintf(writer, " Type\t%s\n", event.Type) - _, _ = fmt.Fprintf(writer, " Tx ID\t%s\n", event.TransactionID) - _, _ = fmt.Fprintf(writer, " Values\n") - - for i, field := range event.Value.EventType.Fields { - value := event.Value.Fields[i] - printField(writer, field, value) - } -} - -func printValues(writer io.Writer, fieldIdentifier, typedId, valueString string) { - _, _ = fmt.Fprintf(writer, "\t\t- %s (%s): %s \n", fieldIdentifier, typedId, valueString) -} - -func printField(writer io.Writer, field cadence.Field, value cadence.Value) { - v := value.String() - var typeId string - - defer func() { - if err := recover(); err != nil { - printValues(writer, field.Identifier, "?", v) - } - }() - - if field.Type != nil { - //TODO: onflow/cadence issue #1672 - //currently getting ID for cadence array will cause panic - typeId = field.Type.ID() - } - - if typeId == "" { // exception for not known typeId workaround for cadence arrays - v = fmt.Sprintf("%s\n\t\thex: %x", v, v) - typeId = "?" - } - printValues(writer, field.Identifier, typeId, v) -} diff --git a/internal/events/events_test.go b/internal/events/events_test.go deleted file mode 100644 index 02c6fa7d4..000000000 --- a/internal/events/events_test.go +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package events - -import ( - "encoding/json" - "strings" - "testing" - - "github.com/onflow/cadence" - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_Get(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"test.event"} - eventsFlags.Start = 10 - eventsFlags.End = 20 - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Success not passed start end", func(t *testing.T) { - inArgs := []string{"test.event"} - eventsFlags.Start = 0 - eventsFlags.End = 0 - - srv.GetBlock.Run(func(args mock.Arguments) { - query := args.Get(1).(flowkit.BlockQuery) - assert.True(t, query.Latest) - }).Return(tests.NewBlock(), nil) - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail invalid range", func(t *testing.T) { - inArgs := []string{"test.event"} - eventsFlags.Start = 20 - eventsFlags.End = 0 - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "please provide either both start and end for range or only last flag") - assert.Nil(t, result) - }) - -} - -func Test_Result(t *testing.T) { - block := tests.NewBlock() - event := EventResult{ - BlockEvents: []flow.BlockEvents{{ - BlockID: block.ID, - Height: block.Height, - BlockTimestamp: block.Timestamp, - Events: []flow.Event{ - *tests.NewEvent( - 0, - "A.foo", - []cadence.Field{{Type: cadence.StringType{}, Identifier: "bar"}}, - []cadence.Value{cadence.NewInt(1)}, - ), - }, - }}, - } - - assert.Equal(t, strings.TrimPrefix(` -Events Block #1: - Index 0 - Type A.foo - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - -`, "\n"), event.String()) - - assert.Equal(t, []any{map[string]any{ - "blockID": uint64(1), - "index": 0, - "transactionId": "0000000000000000000000000000000000000000000000000000000000000000", - "type": "A.foo", - "values": json.RawMessage{0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x41, 0x2e, 0x66, 0x6f, 0x6f, 0x22, 0x2c, 0x22, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x7b, 0x22, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x3a, 0x22, 0x31, 0x22, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x49, 0x6e, 0x74, 0x22, 0x7d, 0x2c, 0x22, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3a, 0x22, 0x62, 0x61, 0x72, 0x22, 0x7d, 0x5d, 0x7d, 0x2c, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x7d, 0xa}, - }}, event.JSON()) -} diff --git a/internal/events/get.go b/internal/events/get.go deleted file mode 100644 index f6f0a6bcc..000000000 --- a/internal/events/get.go +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package events - -import ( - "context" - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsEvents struct { - Start uint64 `flag:"start" info:"Start block height"` - End uint64 `flag:"end" info:"End block height"` - Last uint64 `default:"10" flag:"last" info:"Fetch number of blocks relative to the last block. Ignored if the start flag is set. Used as a default if no flags are provided"` - Workers int `default:"10" flag:"workers" info:"Number of workers to use when fetching events in parallel"` - Batch uint64 `default:"25" flag:"batch" info:"Number of blocks each worker will fetch"` -} - -var eventsFlags = flagsEvents{} - -var getCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "get ", - Short: "Get events in a block range", - Args: cobra.MinimumNArgs(1), - Example: `#fetch events from the latest 10 blocks is the default behavior -flow events get A.1654653399040a61.FlowToken.TokensDeposited - -#specify manual start and stop blocks -flow events get A.1654653399040a61.FlowToken.TokensDeposited --start 11559500 --end 11559600 - -#in order to get and event from the 20 latest blocks on a network run -flow events get A.1654653399040a61.FlowToken.TokensDeposited --last 20 --network mainnet - -#if you want to fetch multiple event types that is done by sending in more events. Even fetching will be done in parallel. -flow events get A.1654653399040a61.FlowToken.TokensDeposited A.1654653399040a61.FlowToken.TokensWithdrawn - `, - }, - Flags: &eventsFlags, - Run: get, -} - -func get( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - var err error - start := eventsFlags.Start - end := eventsFlags.End - last := eventsFlags.Last - - // handle if not passing start and end - if start == 0 && end == 0 { - latest, err := flow.GetBlock( - context.Background(), - flowkit.BlockQuery{Latest: true}, - ) - if err != nil { - return nil, err - } - end = latest.Height - - start = end - last - if end < last { - start = 0 - } - } else if start == 0 || end == 0 { - return nil, fmt.Errorf("please provide either both start and end for range or only last flag") - } - - logger.StartProgress("Fetching events...") - defer logger.StopProgress() - - events, err := flow.GetEvents( - context.Background(), - args, - start, - end, - &flowkit.EventWorker{ - Count: eventsFlags.Workers, - BlocksPerWorker: eventsFlags.Batch, - }, - ) - if err != nil { - return nil, err - } - - return &EventResult{BlockEvents: events}, nil -} diff --git a/internal/keys/decode.go b/internal/keys/decode.go deleted file mode 100644 index 98057289a..000000000 --- a/internal/keys/decode.go +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package keys - -import ( - "encoding/hex" - "fmt" - "strings" - - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsDecode struct { - SigAlgo string `default:"ECDSA_P256" flag:"sig-algo" info:"Signature algorithm"` - FromFile string `default:"" flag:"from-file" info:"Load key from file"` -} - -var decodeFlags = flagsDecode{} - -var decodeCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "decode ", - Short: "Decode an encoded public key", - Args: cobra.RangeArgs(1, 2), - ValidArgs: []string{"rlp", "pem"}, - Example: "flow keys decode rlp f847b8408...2402038203e8", - }, - Flags: &decodeFlags, - Run: decode, -} - -func decode( - args []string, - _ command.GlobalFlags, - _ output.Logger, - reader flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - encoding := args[0] - fromFile := decodeFlags.FromFile - - var encoded string - if len(args) > 1 { - encoded = args[1] - } - - /* TODO(sideninja) from file flag should be remove and should be replaced with $(echo file) - but cobra has an issue with parsing pem content as it recognize it as flag due to ---- characters */ - if encoded != "" && fromFile != "" { - return nil, fmt.Errorf("can not pass both command argument and from file flag") - } - if encoded == "" && fromFile == "" { - return nil, fmt.Errorf("provide argument for encoded key or use from file flag") - } - - if fromFile != "" { - e, err := reader.ReadFile(fromFile) - if err != nil { - return nil, err - } - encoded = strings.TrimSpace(string(e)) - } - - var accountKey *flow.AccountKey - var err error - switch strings.ToLower(encoding) { - case "pem": - sigAlgo := crypto.StringToSignatureAlgorithm(decodeFlags.SigAlgo) - if sigAlgo == crypto.UnknownSignatureAlgorithm { - return nil, fmt.Errorf("invalid signature algorithm: %s", decodeFlags.SigAlgo) - } - - accountKey, err = decodePEM(encoded, sigAlgo) - case "rlp": - accountKey, err = decodeRLP(encoded) - default: - return nil, fmt.Errorf("encoding type not supported. Valid encoding: RLP and PEM") - } - - if err != nil { - return nil, err - } - - return &keyResult{ - publicKey: accountKey.PublicKey, - sigAlgo: accountKey.SigAlgo, - hashAlgo: accountKey.HashAlgo, - weight: accountKey.Weight, - }, err -} - -func decodePEM(pubKey string, sigAlgo crypto.SignatureAlgorithm) (*flow.AccountKey, error) { - pk, err := crypto.DecodePublicKeyPEM(sigAlgo, pubKey) - if err != nil { - return nil, err - } - - return &flow.AccountKey{ - PublicKey: pk, - SigAlgo: sigAlgo, - Weight: -1, - }, nil -} - -func decodeRLP(pubKey string) (*flow.AccountKey, error) { - publicKeyBytes, err := hex.DecodeString(pubKey) - if err != nil { - return nil, fmt.Errorf("failed to decode public key: %w", err) - } - - accountKey, err := flow.DecodeAccountKey(publicKeyBytes) - if err != nil { - return nil, fmt.Errorf("failed to decode: %w", err) - } - - return accountKey, nil -} diff --git a/internal/keys/derive.go b/internal/keys/derive.go deleted file mode 100644 index 453be91cd..000000000 --- a/internal/keys/derive.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package keys - -import ( - "fmt" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsDerive struct { - KeySigAlgo string `default:"ECDSA_P256" flag:"sig-algo" info:"Signature algorithm"` -} - -var deriveFlags = flagsDerive{} - -var deriveCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "derive ", - Short: "Derive public key from a private key", - Args: cobra.ExactArgs(1), - Example: "flow keys derive 4247b8408...2402038203e8", - }, - Flags: &deriveFlags, - Run: derive, -} - -func derive( - args []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - - sigAlgo := crypto.StringToSignatureAlgorithm(deriveFlags.KeySigAlgo) - if sigAlgo == crypto.UnknownSignatureAlgorithm { - return nil, fmt.Errorf("invalid signature algorithm: %s", deriveFlags.KeySigAlgo) - } - - parsedPrivateKey, err := crypto.DecodePrivateKeyHex(sigAlgo, args[0]) - if err != nil { - return nil, fmt.Errorf("failed to decode private key: %w", err) - } - - return &keyResult{privateKey: parsedPrivateKey, publicKey: parsedPrivateKey.PublicKey()}, nil -} diff --git a/internal/keys/generate.go b/internal/keys/generate.go deleted file mode 100644 index fd5078a61..000000000 --- a/internal/keys/generate.go +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package keys - -import ( - "context" - "fmt" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsGenerate struct { - Mnemonic string `flag:"mnemonic" info:"Mnemonic seed to use"` - DerivationPath string `default:"m/44'/539'/0'/0/0" flag:"derivationPath" info:"Derivation path"` - KeySigAlgo string `default:"ECDSA_P256" flag:"sig-algo" info:"Signature algorithm"` -} - -var generateFlags = flagsGenerate{} - -var generateCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "generate", - Short: "Generate a new key-pair", - Example: "flow keys generate", - }, - Flags: &generateFlags, - Run: generate, -} - -func generate( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - sigAlgo := crypto.StringToSignatureAlgorithm(generateFlags.KeySigAlgo) - if sigAlgo == crypto.UnknownSignatureAlgorithm { - return nil, fmt.Errorf("invalid signature algorithm: %s", generateFlags.KeySigAlgo) - } - - var err error - mnemonic := generateFlags.Mnemonic - if mnemonic == "" { - _, mnemonic, err = flow.GenerateMnemonicKey(context.Background(), sigAlgo, generateFlags.DerivationPath) - if err != nil { - return nil, err - } - } - - privateKey, err := flow.DerivePrivateKeyFromMnemonic( - context.Background(), - mnemonic, - sigAlgo, - generateFlags.DerivationPath, - ) - if err != nil { - return nil, err - } - - return &keyResult{ - privateKey: privateKey, - publicKey: privateKey.PublicKey(), - sigAlgo: sigAlgo, - mnemonic: mnemonic, - derivationPath: generateFlags.DerivationPath, - }, nil -} diff --git a/internal/keys/keys.go b/internal/keys/keys.go deleted file mode 100644 index 9ef0114ff..000000000 --- a/internal/keys/keys.go +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package keys - -import ( - "bytes" - "encoding/hex" - "fmt" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "keys", - Short: "Generate and decode Flow keys", - TraverseChildren: true, - GroupID: "security", -} - -func init() { - generateCommand.AddToParent(Cmd) - decodeCommand.AddToParent(Cmd) - deriveCommand.AddToParent(Cmd) -} - -type keyResult struct { - privateKey crypto.PrivateKey - publicKey crypto.PublicKey - sigAlgo crypto.SignatureAlgorithm - hashAlgo crypto.HashAlgorithm - weight int - mnemonic string - derivationPath string -} - -func (k *keyResult) JSON() any { - result := make(map[string]any) - result["public"] = hex.EncodeToString(k.privateKey.PublicKey().Encode()) - - if k.privateKey != nil { - result["private"] = hex.EncodeToString(k.privateKey.Encode()) - } - - if k.mnemonic != "" { - result["mnemonic"] = k.mnemonic - } - - if k.derivationPath != "" { - result["derivationPath"] = k.derivationPath - } - - return result -} - -func (k *keyResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - if k.privateKey != nil { - _, _ = fmt.Fprintf(writer, "%s Store private key safely and don't share with anyone! \n", output.StopEmoji()) - _, _ = fmt.Fprintf(writer, "Private Key \t %x \n", k.privateKey.Encode()) - } - - _, _ = fmt.Fprintf(writer, "Public Key \t %x \n", k.publicKey.Encode()) - - if k.mnemonic != "" { - _, _ = fmt.Fprintf(writer, "Mnemonic \t %s \n", k.mnemonic) - } - - if k.derivationPath != "" { - _, _ = fmt.Fprintf(writer, "Derivation Path \t %s \n", k.derivationPath) - } - - if k.sigAlgo != crypto.UnknownSignatureAlgorithm { - _, _ = fmt.Fprintf(writer, "Signature Algorithm \t %s\n", k.sigAlgo) - } - - if k.hashAlgo != crypto.UnknownHashAlgorithm { - _, _ = fmt.Fprintf(writer, "Hash Algorithm \t %s\n", k.hashAlgo) - } - - if k.weight > 0 { - _, _ = fmt.Fprintf(writer, "Weight \t %d\n", k.weight) - } - - _ = writer.Flush() - - return b.String() -} - -func (k *keyResult) Oneliner() string { - result := fmt.Sprintf("Public Key: %x, ", k.publicKey.Encode()) - - if k.privateKey != nil { - result += fmt.Sprintf("Private Key: %x, ", k.privateKey.Encode()) - } - - if k.mnemonic != "" { - result += fmt.Sprintf("Mnemonic: %s, ", k.mnemonic) - } - - if k.derivationPath != "" { - result += fmt.Sprintf("Derivation Path: %s", k.derivationPath) - } - - return result -} diff --git a/internal/keys/keys_test.go b/internal/keys/keys_test.go deleted file mode 100644 index a6ccc0a3d..000000000 --- a/internal/keys/keys_test.go +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package keys - -import ( - "testing" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/stretchr/testify/assert" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_DecodeKeys(t *testing.T) { - t.Run("Decode RLP Key", func(t *testing.T) { - t.Parallel() - dkey, err := decodeRLP("f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8") - - assert.NoError(t, err) - assert.Equal(t, dkey.PublicKey.String(), "0x84d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db24") - assert.Equal(t, dkey.SigAlgo.String(), "ECDSA_P256") - }) - - t.Run("Decode RLP Key Invalid", func(t *testing.T) { - t.Parallel() - - _, err := decodeRLP("aaa") - assert.EqualError(t, err, "failed to decode public key: encoding/hex: odd length hex string") - }) - - t.Run("Decode PEM Key", func(t *testing.T) { - t.Parallel() - - dkey, err := decodePEM("-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1HmzzcntvdsZXLErNRYa3oJrAypk\nvdQGLMh/s7p+ccnPZG/yOZC7RTLKRcRFx+kIzvJ4ssRhU2ADmmZgo2apXw==\n-----END PUBLIC KEY-----", crypto.ECDSA_P256) - - assert.NoError(t, err) - assert.Equal(t, dkey.PublicKey.String(), "0xd479b3cdc9edbddb195cb12b35161ade826b032a64bdd4062cc87fb3ba7e71c9cf646ff23990bb4532ca45c445c7e908cef278b2c4615360039a6660a366a95f") - assert.Equal(t, dkey.SigAlgo.String(), "ECDSA_P256") - }) - - t.Run("Decode PEM Key Invalid", func(t *testing.T) { - t.Parallel() - - _, err := decodePEM("nope", crypto.ECDSA_P256) - assert.EqualError(t, err, "crypto: failed to parse PEM string, not all bytes in PEM key were decoded: 6e6f7065") - }) - - srv, _, rw := util.TestMocks(t) - t.Run("Success", func(t *testing.T) { - inArgsTests := [][]string{ - {"rlp", "f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8"}, - {"pem", "-----BEGIN PUBLIC KEY-----\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE1HmzzcntvdsZXLErNRYa3oJrAypk\nvdQGLMh/s7p+ccnPZG/yOZC7RTLKRcRFx+kIzvJ4ssRhU2ADmmZgo2apXw==\n-----END PUBLIC KEY-----"}, - } - - for _, inArgs := range inArgsTests { - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - } - }) - - t.Run("Success from file", func(t *testing.T) { - inArgs := []string{"rlp"} - _ = rw.WriteFile("test", []byte("f847b84084d716c14b051ad6b001624f738f5d302636e6b07cc75e4530af7776a4368a2b586dbefc0564ee28384c2696f178cbed52e62811bcc9ecb59568c996d342db2402038203e8"), 0677) - decodeFlags.FromFile = "test" - - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - decodeFlags.FromFile = "" // reset to default - }) - - t.Run("Fail invalid args", func(t *testing.T) { - inArgs := []string{"invalid", "invalid"} - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "encoding type not supported. Valid encoding: RLP and PEM") - assert.Nil(t, result) - }) - - t.Run("Fail invalid args", func(t *testing.T) { - inArgs := []string{"", ""} - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "provide argument for encoded key or use from file flag") - assert.Nil(t, result) - }) - - t.Run("Fail invalid flags", func(t *testing.T) { - inArgs := []string{"rlp", "some public key"} - decodeFlags.FromFile = "from file" - - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "can not pass both command argument and from file flag") - assert.Nil(t, result) - }) -} - -func Test_DeriveKeys(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"cf3178b20a73846dc8bf6255c79be47178b0744dd8244bcff099e449a9700d7f"} - result, err := derive(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail invalid key", func(t *testing.T) { - inArgs := []string{"invalid"} - - result, err := derive(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "failed to decode private key: encoding/hex: invalid byte: U+0069 'i'") - assert.Nil(t, result) - }) - - t.Run("Fail invalid signature algorithm", func(t *testing.T) { - inArgs := []string{"cf3178b20a73846dc8bf6255c79be47178b0744dd8244bcff099e449a9700d7f"} - deriveFlags.KeySigAlgo = "invalid" - - result, err := derive(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "invalid signature algorithm: invalid") - assert.Nil(t, result) - }) -} - -func Test_Generate(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Fail invalid signature algorithm", func(t *testing.T) { - generateFlags.KeySigAlgo = "invalid" - _, err := generate([]string{}, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "invalid signature algorithm: invalid") - }) -} diff --git a/internal/project/deploy.go b/internal/project/deploy.go deleted file mode 100644 index e545a6210..000000000 --- a/internal/project/deploy.go +++ /dev/null @@ -1,229 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package project - -import ( - "context" - "errors" - "fmt" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - "golang.org/x/exp/slices" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/project" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsDeploy struct { - Update bool `flag:"update" default:"false" info:"use update flag to update existing contracts"` - ShowDiff bool `flag:"show-diff" default:"false" info:"use show-diff flag to show diff between existing and new contracts on update"` -} - -var deployFlags = flagsDeploy{} - -var DeployCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "deploy", - Short: "Deploy Cadence contracts", - Example: "flow project deploy --network testnet", - }, - Flags: &deployFlags, - RunS: deploy, -} - -func deploy( - _ []string, - global command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - - if flow.Network() == config.MainnetNetwork { // if using mainnet check for standard contract usage - err := checkForStandardContractUsageOnMainnet(state, logger, global.Yes) - if err != nil { - return nil, err - } - } - - deployFunc := flowkit.UpdateExistingContract(deployFlags.Update) - if deployFlags.ShowDiff { - deployFunc = util.ShowContractDiffPrompt(logger) - } - - c, err := flow.DeployProject(context.Background(), deployFunc) - if err != nil { - var projectErr *flowkit.ProjectDeploymentError - if errors.As(err, &projectErr) { - for name, err := range projectErr.Contracts() { - logger.Info(fmt.Sprintf( - "%s Failed to deploy contract %s: %s", - output.ErrorEmoji(), - name, - err.Error(), - )) - } - return nil, fmt.Errorf("failed deploying all contracts") - } - return nil, err - } - - return &deployResult{c}, nil -} - -type deployResult struct { - contracts []*project.Contract -} - -func (r *deployResult) JSON() any { - result := make(map[string]any) - - for _, contract := range r.contracts { - result[contract.Name] = contract.AccountAddress.String() - } - - return result -} - -func (r *deployResult) String() string { - return "" -} - -func (r *deployResult) Oneliner() string { - return "" -} - -// checkForStandardContractUsageOnMainnet checks if any contract defined to be used on mainnet -// are referencing standard contract and if so warn the use that they should use the already -// deployed contracts as an alias on mainnet instead of deploying their own copy. -func checkForStandardContractUsageOnMainnet(state *flowkit.State, logger output.Logger, replace bool) error { - mainnetContracts := map[string]standardContract{ - "FungibleToken": { - name: "FungibleToken", - address: flowsdk.HexToAddress("0xf233dcee88fe0abe"), - infoLink: "https://developers.flow.com/flow/core-contracts/fungible-token", - }, - "FlowToken": { - name: "FlowToken", - address: flowsdk.HexToAddress("0x1654653399040a61"), - infoLink: "https://developers.flow.com/flow/core-contracts/flow-token", - }, - "FlowFees": { - name: "FlowFees", - address: flowsdk.HexToAddress("0xf919ee77447b7497"), - infoLink: "https://developers.flow.com/flow/core-contracts/flow-fees", - }, - "FlowServiceAccount": { - name: "FlowServiceAccount", - address: flowsdk.HexToAddress("0xe467b9dd11fa00df"), - infoLink: "https://developers.flow.com/flow/core-contracts/service-account", - }, - "FlowStorageFees": { - name: "FlowStorageFees", - address: flowsdk.HexToAddress("0xe467b9dd11fa00df"), - infoLink: "https://developers.flow.com/flow/core-contracts/service-account", - }, - "FlowIDTableStaking": { - name: "FlowIDTableStaking", - address: flowsdk.HexToAddress("0x8624b52f9ddcd04a"), - infoLink: "https://developers.flow.com/flow/core-contracts/staking-contract-reference", - }, - "FlowEpoch": { - name: "FlowEpoch", - address: flowsdk.HexToAddress("0x8624b52f9ddcd04a"), - infoLink: "https://developers.flow.com/flow/core-contracts/epoch-contract-reference", - }, - "FlowClusterQC": { - name: "FlowClusterQC", - address: flowsdk.HexToAddress("0x8624b52f9ddcd04a"), - infoLink: "https://developers.flow.com/flow/core-contracts/epoch-contract-reference", - }, - "FlowDKG": { - name: "FlowDKG", - address: flowsdk.HexToAddress("0x8624b52f9ddcd04a"), - infoLink: "https://developers.flow.com/flow/core-contracts/epoch-contract-reference", - }, - "NonFungibleToken": { - name: "NonFungibleToken", - address: flowsdk.HexToAddress("0x1d7e57aa55817448"), - infoLink: "https://developers.flow.com/flow/core-contracts/non-fungible-token", - }, - "MetadataViews": { - name: "MetadataViews", - address: flowsdk.HexToAddress("0x1d7e57aa55817448"), - infoLink: "https://developers.flow.com/flow/core-contracts/nft-metadata", - }, - } - - contracts, err := state.DeploymentContractsByNetwork(config.MainnetNetwork) - if err != nil { - return err - } - - for _, contract := range contracts { - standardContract, ok := mainnetContracts[contract.Name] - if !ok { - continue - } - - logger.Info(fmt.Sprintf("It seems like you are trying to deploy %s to Mainnet \n", contract.Name)) - logger.Info(fmt.Sprintf("It is a standard contract already deployed at address 0x%s \n", standardContract.address.String())) - logger.Info(fmt.Sprintf("You can read more about it here: %s \n", standardContract.infoLink)) - - if replace || util.WantToUseMainnetVersionPrompt() { - err := replaceContractWithAlias(state, standardContract) - if err != nil { - return err - } - } - } - return nil -} - -type standardContract struct { - name string - address flowsdk.Address - infoLink string -} - -func replaceContractWithAlias(state *flowkit.State, standardContract standardContract) error { - contract, err := state.Config().Contracts.ByName(standardContract.name) - if err != nil { - return err - } - contract.Aliases.Add(config.MainnetNetwork.Name, standardContract.address) // replace contract with an alias - - for di, d := range state.Config().Deployments.ByNetwork(config.MainnetNetwork.Name) { - for ci, c := range d.Contracts { - if c.Name == standardContract.name { - state.Config().Deployments[di].Contracts = slices.Delete(state.Config().Deployments[di].Contracts, ci, ci+1) - if len(state.Config().Deployments[di].Contracts) == 0 { - _ = state.Config().Deployments.Remove(d.Account, d.Network) - } - break - } - } - } - return nil -} diff --git a/internal/project/project.go b/internal/project/project.go deleted file mode 100644 index 5b26ec473..000000000 --- a/internal/project/project.go +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package project - -import ( - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "project", - Short: "Manage your Cadence project", - TraverseChildren: true, - GroupID: "project", -} - -func init() { - DeployCommand.AddToParent(Cmd) -} diff --git a/internal/project/project_test.go b/internal/project/project_test.go deleted file mode 100644 index e61a76ee0..000000000 --- a/internal/project/project_test.go +++ /dev/null @@ -1,78 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package project - -import ( - "testing" - - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/accounts" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_ProjectDeploy(t *testing.T) { - srv, state, rw := util.TestMocks(t) - - t.Run("Fail contract errors", func(t *testing.T) { - srv.DeployProject.Return(nil, &flowkit.ProjectDeploymentError{}) - _, err := deploy([]string{}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "failed deploying all contracts") - }) - - t.Run("Success replace standard contracts", func(t *testing.T) { - const ft = "FungibleToken" - const acc = "mainnet-account" - state.Contracts().AddOrUpdate(config.Contract{ - Name: ft, - Location: "./ft.cdc", - }) - _ = rw.WriteFile("./ft.cdc", []byte("test"), 0677) // mock the file - state.Accounts().AddOrUpdate(&accounts.Account{Name: acc, Address: flow.HexToAddress("0x01")}) - - state.Deployments().AddOrUpdate(config.Deployment{ - Network: config.MainnetNetwork.Name, - Account: acc, - Contracts: []config.ContractDeployment{{Name: ft}}, - }) - - state.Deployments().AddOrUpdate(config.Deployment{ - Network: config.EmulatorNetwork.Name, - Account: config.DefaultEmulator.ServiceAccount, - Contracts: []config.ContractDeployment{{Name: ft}}, - }) - - err := checkForStandardContractUsageOnMainnet(state, util.NoLogger, true) - require.NoError(t, err) - - assert.Len(t, state.Deployments().ByNetwork(config.MainnetNetwork.Name), 0) // should remove it - assert.Len(t, state.Deployments().ByNetwork(config.EmulatorNetwork.Name), 1) // should not remove it - c, err := state.Contracts().ByName(ft) - assert.NoError(t, err) - assert.NotNil(t, c.Aliases) - - assert.Equal(t, "f233dcee88fe0abe", c.Aliases.ByNetwork(config.MainnetNetwork.Name).Address.String()) - }) - -} diff --git a/internal/quick/deploy.go b/internal/quick/deploy.go deleted file mode 100644 index 128047cc3..000000000 --- a/internal/quick/deploy.go +++ /dev/null @@ -1,37 +0,0 @@ -/* -* Flow CLI -* -* Copyright 2019 Dapper Labs, Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - */ - -package quick - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/project" -) - -var DeployCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "deploy", - Short: "Deploy all project contracts", - Example: "flow deploy", - GroupID: "project", - }, - Flags: project.DeployCommand.Flags, - RunS: project.DeployCommand.RunS, -} diff --git a/internal/quick/init.go b/internal/quick/init.go deleted file mode 100644 index 4f9c3df52..000000000 --- a/internal/quick/init.go +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package quick - -import ( - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/config" -) - -// TODO(sideninja) workaround - init needed to be copied in order to work else there is flag duplicate error - -var InitCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "init", - Short: "Initialize a new configuration", - Example: "flow project init", - GroupID: "project", - }, - Flags: &config.InitFlag, - Run: config.Initialise, // TODO(sideninja) workaround - init needed to be copied in order to work else there is flag duplicate error -} diff --git a/internal/quick/run.go b/internal/quick/run.go deleted file mode 100644 index 3954ebd8a..000000000 --- a/internal/quick/run.go +++ /dev/null @@ -1,69 +0,0 @@ -/* -* Flow CLI -* -* Copyright 2019 Dapper Labs, Inc. -* -* Licensed under the Apache License, Version 2.0 (the "License"); -* you may not use this file except in compliance with the License. -* You may obtain a copy of the License at -* -* http://www.apache.org/licenses/LICENSE-2.0 -* -* Unless required by applicable law or agreed to in writing, software -* distributed under the License is distributed on an "AS IS" BASIS, -* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -* See the License for the specific language governing permissions and -* limitations under the License. - */ - -package quick - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsRun struct { -} - -var runFlags = flagsRun{} - -// RunCommand This command will act as an alias for running the emulator and deploying the contracts -var RunCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "run", - Short: "Start emulator and deploy all project contracts", - Example: "flow run", - GroupID: "project", - }, - Flags: &runFlags, - Run: func( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.ReaderWriter, - _ flowkit.Services, - ) (command.Result, error) { - fmt.Println("⚠️Deprecation notice: Use 'flow dev' command.") - return &runResult{}, nil - }, -} - -type runResult struct{} - -func (r *runResult) JSON() any { - return nil -} - -func (r *runResult) String() string { - return "" -} - -func (r *runResult) Oneliner() string { - return "" -} diff --git a/internal/scripts/execute.go b/internal/scripts/execute.go deleted file mode 100644 index 050518951..000000000 --- a/internal/scripts/execute.go +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package scripts - -import ( - "context" - "fmt" - - "github.com/onflow/cadence" - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/arguments" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type Flags struct { - ArgsJSON string `default:"" flag:"args-json" info:"arguments in JSON-Cadence format"` - BlockID string `default:"" flag:"block-id" info:"block ID to execute the script at"` - BlockHeight uint64 `default:"" flag:"block-height" info:"block height to execute the script at"` -} - -var flags = Flags{} - -var executeCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "execute [ ...]", - Short: "Execute a script", - Example: `flow scripts execute script.cdc "Meow" "Woof"`, - Args: cobra.MinimumNArgs(1), - }, - Flags: &flags, - Run: execute, -} - -func execute( - args []string, - _ command.GlobalFlags, - _ output.Logger, - readerWriter flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - filename := args[0] - - code, err := readerWriter.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading script file: %w", err) - } - - return SendScript(code, args[1:], filename, flow, flags) -} - -func SendScript(code []byte, argsArr []string, location string, flow flowkit.Services, scriptFlags Flags) (command.Result, error) { - var cadenceArgs []cadence.Value - var err error - if scriptFlags.ArgsJSON != "" { - cadenceArgs, err = arguments.ParseJSON(scriptFlags.ArgsJSON) - } else { - cadenceArgs, err = arguments.ParseWithoutType(argsArr, code, location) - } - - if err != nil { - return nil, fmt.Errorf("error parsing script arguments: %w", err) - } - - query := flowkit.ScriptQuery{} - if scriptFlags.BlockHeight != 0 { - query.Height = scriptFlags.BlockHeight - } else if scriptFlags.BlockID != "" { - query.ID = flowsdk.HexToID(scriptFlags.BlockID) - } else { - query.Latest = true - } - - value, err := flow.ExecuteScript( - context.Background(), - flowkit.Script{ - Code: code, - Args: cadenceArgs, - Location: location, - }, - query, - ) - if err != nil { - return nil, err - } - - return &scriptResult{value}, nil -} diff --git a/internal/scripts/scripts.go b/internal/scripts/scripts.go deleted file mode 100644 index b074d28e0..000000000 --- a/internal/scripts/scripts.go +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package scripts - -import ( - "bytes" - "encoding/json" - "fmt" - - "github.com/onflow/cadence" - jsoncdc "github.com/onflow/cadence/encoding/json" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "scripts", - Short: "Execute Cadence scripts", - TraverseChildren: true, - GroupID: "interactions", -} - -func init() { - executeCommand.AddToParent(Cmd) -} - -type scriptResult struct { - cadence.Value -} - -func (r *scriptResult) JSON() any { - return json.RawMessage( - jsoncdc.MustEncode(r.Value), - ) -} - -func (r *scriptResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Result: %s\n", r.Value) - - _ = writer.Flush() - - return b.String() -} - -func (r *scriptResult) Oneliner() string { - return r.Value.String() -} diff --git a/internal/scripts/scripts_test.go b/internal/scripts/scripts_test.go deleted file mode 100644 index baa191f3d..000000000 --- a/internal/scripts/scripts_test.go +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package scripts - -import ( - "fmt" - "testing" - - "github.com/onflow/cadence" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_Execute(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{tests.ScriptArgString.Filename, "foo"} - - srv.ExecuteScript.Run(func(args mock.Arguments) { - script := args.Get(1).(flowkit.Script) - assert.Equal(t, fmt.Sprintf("\"%s\"", inArgs[1]), script.Args[0].String()) - assert.Equal(t, tests.ScriptArgString.Filename, script.Location) - }).Return(cadence.NewInt(1), nil) - - result, err := execute(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NotNil(t, result) - assert.NoError(t, err) - }) - - t.Run("Fail non-existing file", func(t *testing.T) { - inArgs := []string{"non-existing"} - result, err := execute(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.Nil(t, result) - assert.EqualError(t, err, "error loading script file: open non-existing: file does not exist") - }) - - t.Run("Fail parsing invalid JSON args", func(t *testing.T) { - inArgs := []string{tests.TestScriptSimple.Filename} - flags.ArgsJSON = "invalid" - - result, err := execute(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.Nil(t, result) - assert.EqualError(t, err, "error parsing script arguments: invalid character 'i' looking for beginning of value") - }) - -} diff --git a/internal/settings/cmd.go b/internal/settings/cmd.go deleted file mode 100644 index bccc4b04a..000000000 --- a/internal/settings/cmd.go +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package settings - -import ( - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "settings", - Short: "Manage persisted global settings", - TraverseChildren: true, -} - -func init() { - Cmd.AddCommand(metricsSettings) -} diff --git a/internal/settings/defaults.go b/internal/settings/defaults.go deleted file mode 100644 index d361e66ae..000000000 --- a/internal/settings/defaults.go +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package settings - -import ( - "fmt" - "os/user" - "runtime" -) - -const ( - metricsEnabled = "MetricsEnabled" - flowserPath = "FlowserPath" -) - -// defaults holds the default values for global settings -var defaults = map[string]any{ - metricsEnabled: true, - flowserPath: getDefaultInstallDir(), -} - -const ( - Darwin = "darwin" - Windows = "windows" - Linux = "linux" -) - -// getDefaultInstallDir returns default installation directory based on the OS. -func getDefaultInstallDir() string { - switch runtime.GOOS { - case Darwin: - return "/Applications" - case Windows: - // https://superuser.com/questions/1327037/what-choices-do-i-have-about-where-to-install-software-on-windows-10 - usr, _ := user.Current() // safe to ignore cache errors - return fmt.Sprintf(`%s\AppData\Local\Programs`, usr.HomeDir) - case Linux: - // https://unix.stackexchange.com/questions/127076/into-which-directory-should-i-install-programs-in-linux - usr, _ := user.Current() // safe to ignore cache errors - // Use path in users home folder to not require sudo permissions for installation - return fmt.Sprintf(`%s/.local/bin`, usr.HomeDir) - default: - return "" - } -} diff --git a/internal/settings/metrics.go b/internal/settings/metrics.go deleted file mode 100644 index 81b77c913..000000000 --- a/internal/settings/metrics.go +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package settings - -import ( - "fmt" - - "github.com/pkg/errors" - "github.com/spf13/cobra" -) - -const enable = "enable" - -const disable = "disable" - -var metricsSettings = &cobra.Command{ - Use: "metrics", - Short: "Configure command usage metrics settings", - Example: "flow settings metrics disable \nflow settings metrics enable", - Args: cobra.MatchAll(cobra.ExactArgs(1), cobra.OnlyValidArgs), - ValidArgs: []string{enable, disable}, - RunE: handleMetricsSettings, -} - -// handleMetricsSettings sets global settings for metrics -func handleMetricsSettings( - _ *cobra.Command, - args []string, -) error { - enabled := args[0] == enable - if err := Set(metricsEnabled, enabled); err != nil { - return errors.Wrap(err, "failed to update metrics settings") - } - - fmt.Println(fmt.Sprintf( - "Command usage tracking is %sd. Settings were updated in %s \n", - args[0], - FileName())) - - return nil -} diff --git a/internal/settings/settings.go b/internal/settings/settings.go deleted file mode 100644 index d611123ac..000000000 --- a/internal/settings/settings.go +++ /dev/null @@ -1,132 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package settings - -import ( - "errors" - "fmt" - "os" - "path/filepath" - - "github.com/spf13/viper" -) - -const settingsFile = "flow-cli.settings" - -const settingsDir = "flow-cli" - -const settingsType = "yaml" - -// viperLoaded only load settings file once -var viperLoaded = false - -func init() { - viper.SetConfigName(settingsFile) - viper.SetConfigType(settingsType) - viper.AddConfigPath(FileDir()) -} - -func FileName() string { - return fmt.Sprintf("%s.%s", settingsFile, settingsType) -} - -func FileDir() string { - dir, err := os.UserConfigDir() - if err != nil { - dir = "." - } - return filepath.Join(dir, settingsDir) -} - -// Set updates settings file with new value for provided key -func Set(key string, val any) error { - if err := loadViper(); err != nil { - return err - } - - viper.Set(key, val) - if err := viper.WriteConfig(); err != nil { - return err - } - - return nil -} - -// loadViper loads the global settings file -func loadViper() error { - if viperLoaded { - return nil - } - viperLoaded = true - - if err := createSettingsDir(); err != nil { - return err - } - - err := viper.MergeConfigMap(defaults) - if err != nil { - return err - } - - // Load settings file - if err := viper.MergeInConfig(); err != nil { - switch err.(type) { - case viper.ConfigFileNotFoundError: - // Create settings file for the first time - if err = viper.SafeWriteConfig(); err != nil { - return err - } - default: - return err - } - } - - return nil -} - -// createSettingsDir creates settings dir if it doesn't exist -func createSettingsDir() error { - if _, err := os.Stat(FileDir()); errors.Is(err, os.ErrNotExist) { - err = os.Mkdir(FileDir(), os.ModePerm) - if err != nil { - return err - } - } - return nil -} - -// GetFlowserPath gets set Flowser install path with sensible default. -func GetFlowserPath() (string, error) { - if err := loadViper(); err != nil { - return "", err - } - return viper.GetString(flowserPath), nil -} - -func SetFlowserPath(path string) error { - return Set(flowserPath, path) -} - -// MetricsEnabled checks whether metric tracking is enabled. -func MetricsEnabled() bool { - if err := loadViper(); err != nil { - return true - } - return viper.GetBool(metricsEnabled) -} diff --git a/internal/signatures/generate.go b/internal/signatures/generate.go deleted file mode 100644 index 4d4fefb0c..000000000 --- a/internal/signatures/generate.go +++ /dev/null @@ -1,129 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package signatures - -import ( - "bytes" - "context" - "fmt" - - "github.com/onflow/flow-cli/flowkit/accounts" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsGenerate struct { - Signer string `default:"emulator-account" flag:"signer" info:"name of the account used to sign"` -} - -var generateFlags = flagsGenerate{} - -var generateCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "generate ", - Short: "Generate the message signature", - Example: "flow signatures generate 'The quick brown fox jumps over the lazy dog' --signer alice", - Args: cobra.ExactArgs(1), - }, - Flags: &generateFlags, - RunS: sign, -} - -func sign( - args []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - message := []byte(args[0]) - accountName := generateFlags.Signer - acc, err := state.Accounts().ByName(accountName) - if err != nil { - return nil, err - } - - s, err := acc.Key.Signer(context.Background()) - if err != nil { - return nil, err - } - - signed, err := s.Sign(message) - if err != nil { - return nil, err - } - - return &signatureResult{ - result: string(signed), - message: string(message), - key: acc.Key, - }, nil -} - -type signatureResult struct { - result string - message string - key accounts.Key -} - -func (s *signatureResult) pubKey() string { - pkey, err := s.key.PrivateKey() - if err == nil { - return (*pkey).PublicKey().String() - } - - return "ERR" -} - -func (s *signatureResult) JSON() any { - return map[string]string{ - "signature": fmt.Sprintf("%x", s.result), - "message": s.message, - "hashAlgo": s.key.HashAlgo().String(), - "sigAlgo": s.key.SigAlgo().String(), - "pubKey": s.pubKey(), - } -} - -func (s *signatureResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Signature \t %x\n", s.result) - _, _ = fmt.Fprintf(writer, "Message \t %s\n", s.message) - _, _ = fmt.Fprintf(writer, "Public Key \t %s\n", s.pubKey()) - _, _ = fmt.Fprintf(writer, "Hash Algorithm \t %s\n", s.key.HashAlgo()) - _, _ = fmt.Fprintf(writer, "Signature Algorithm \t %s\n", s.key.SigAlgo()) - - _ = writer.Flush() - return b.String() -} - -func (s *signatureResult) Oneliner() string { - - return fmt.Sprintf( - "signature: %x, message: %s, hashAlgo: %s, sigAlgo: %s, pubKey: %s", - s.result, s.message, s.key.HashAlgo(), s.key.SigAlgo(), s.pubKey(), - ) -} diff --git a/internal/signatures/signatures.go b/internal/signatures/signatures.go deleted file mode 100644 index 6776c39a6..000000000 --- a/internal/signatures/signatures.go +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package signatures - -import ( - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "signatures", - Short: "Signature verification and creation", - TraverseChildren: true, - GroupID: "security", -} - -func init() { - generateCommand.AddToParent(Cmd) - verifyCommand.AddToParent(Cmd) -} diff --git a/internal/signatures/signatures_test.go b/internal/signatures/signatures_test.go deleted file mode 100644 index 8c79bd052..000000000 --- a/internal/signatures/signatures_test.go +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package signatures - -import ( - "testing" - - "github.com/stretchr/testify/assert" - - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_Verify(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{ - "test signature", - "f80f6007dbe6795bcf343e5586d40d0ba26a6c1d7edda5653cbdb377c9c20034cdbf899bb20fa2388d4993f6c88b5c97cbe05963d6d9799e6868902c2c14bc22", - "0xab70e9e341a38861fd7f9fb1cda4c560465cfeb3ce4abcd2be552550c85ebbef9a2a9cac731c6bfa73b10c701c93038f0c18253487d4962d3bc6d5291f9c5eae", - } - - result, err := verify(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Invalid signature", func(t *testing.T) { - inArgsTests := []struct { - args []string - err string - }{{ - args: []string{"invalid", "invalid"}, - err: "invalid message signature: encoding/hex: invalid byte: U+0069 'i'", - }, { - args: []string{"invalid", "0xaaaa", "invalid"}, - err: "invalid public key: encoding/hex: invalid byte: U+0069 'i'", - }, { - args: []string{"invalid", "0xaaaa", "0x1234"}, - err: "invalid public key: input has incorrect ECDSA_P256 key size, got 2, expects 64", - }} - - for _, test := range inArgsTests { - result, err := verify(test.args, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, test.err) - assert.Nil(t, result) - } - }) - -} - -func Test_Sign(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"test message"} - - result, err := sign(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail unknown signer", func(t *testing.T) { - inArgs := []string{"test message"} - generateFlags.Signer = "invalid" - result, err := sign(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "could not find account with name invalid in the configuration") - assert.Nil(t, result) - }) -} diff --git a/internal/signatures/verify.go b/internal/signatures/verify.go deleted file mode 100644 index 841346ccf..000000000 --- a/internal/signatures/verify.go +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package signatures - -import ( - "bytes" - "encoding/hex" - "fmt" - "strings" - - "github.com/onflow/flow-go-sdk/crypto" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsVerify struct { - SigAlgo string `flag:"sig-algo" default:"ECDSA_P256" info:"Signature algorithm used to create the public key"` - HashAlgo string `flag:"hash-algo" default:"SHA3_256" info:"Hashing algorithm used to create signature"` -} - -var verifyFlags = flagsVerify{} - -var verifyCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "verify ", - Short: "Verify the signature", - Example: "flow signatures verify 'The quick brown fox jumps over the lazy dog' 99fa...25b af3...52d", - Args: cobra.ExactArgs(3), - }, - Flags: &verifyFlags, - RunS: verify, -} - -func verify( - args []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - _ *flowkit.State, -) (command.Result, error) { - message := []byte(args[0]) - - sig, err := hex.DecodeString(strings.ReplaceAll(args[1], "0x", "")) - if err != nil { - return nil, fmt.Errorf("invalid message signature: %w", err) - } - - key, err := hex.DecodeString(strings.ReplaceAll(args[2], "0x", "")) - if err != nil { - return nil, fmt.Errorf("invalid public key: %w", err) - } - - sigAlgo := crypto.StringToSignatureAlgorithm(verifyFlags.SigAlgo) - hashAlgo := crypto.StringToHashAlgorithm(verifyFlags.HashAlgo) - - pkey, err := crypto.DecodePublicKey(sigAlgo, key) - if err != nil { - return nil, fmt.Errorf("invalid public key: %w", err) - } - - hasher, err := crypto.NewHasher(hashAlgo) - if err != nil { - return nil, err - } - - valid, err := pkey.Verify(sig, message, hasher) - if err != nil { - return nil, err - } - - return &verificationResult{ - valid: valid, - message: message, - signature: sig, - hashAlgo: hashAlgo, - sigAlgo: sigAlgo, - pubKey: key, - }, nil -} - -type verificationResult struct { - valid bool - message []byte - signature []byte - pubKey []byte - sigAlgo crypto.SignatureAlgorithm - hashAlgo crypto.HashAlgorithm -} - -func (s *verificationResult) JSON() any { - return map[string]any{ - "valid": fmt.Sprintf("%v", s.valid), - "message": string(s.message), - "signature": string(s.signature), - "hashAlgo": s.hashAlgo.String(), - "sigAlgo": s.sigAlgo.String(), - "pubKey": fmt.Sprintf("%x", s.pubKey), - } -} - -func (s *verificationResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Valid \t %v\n", s.valid) - _, _ = fmt.Fprintf(writer, "Message \t %s\n", s.message) - _, _ = fmt.Fprintf(writer, "Signature \t %x\n", s.signature) - _, _ = fmt.Fprintf(writer, "Public Key \t %x\n", s.pubKey) - _, _ = fmt.Fprintf(writer, "Hash Algorithm \t %s\n", s.hashAlgo) - _, _ = fmt.Fprintf(writer, "Signature Algorithm \t %s\n", s.sigAlgo) - - _ = writer.Flush() - return b.String() -} - -func (s *verificationResult) Oneliner() string { - return fmt.Sprintf( - "valid: %v, message: %s, signature: %x, sigAlgo: %s, hashAlgo: %s, pubKey: %x", - s.valid, s.message, s.signature, s.sigAlgo, s.hashAlgo, s.pubKey, - ) -} diff --git a/internal/snapshot/save.go b/internal/snapshot/save.go deleted file mode 100644 index 3007b80ca..000000000 --- a/internal/snapshot/save.go +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package snapshot - -import ( - "fmt" - "path/filepath" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -var saveCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "save", - Short: "Get the latest finalized protocol snapshot", - Example: "flow snapshot save /tmp/snapshot.json", - Args: cobra.ExactArgs(1), - }, - Flags: &struct{}{}, - Run: save, -} - -func save( - args []string, - _ command.GlobalFlags, - logger output.Logger, - writer flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - fileName := args[0] - - logger.StartProgress("Downloading protocol snapshot...") - defer logger.StopProgress() - if !flow.Gateway().SecureConnection() { - logger.Info(fmt.Sprintf("%s warning: using insecure client connection to download snapshot, you should use a secure network configuration...", output.WarningEmoji())) - } - - snapshotBytes, err := flow.Gateway().GetLatestProtocolStateSnapshot() - if err != nil { - return nil, fmt.Errorf("failed to get latest finalized protocol snapshot from gateway: %w", err) - } - - logger.StopProgress() - - outputPath, err := filepath.Abs(fileName) - if err != nil { - return nil, fmt.Errorf("failed to get absolute output path for protocol snapshot") - } - - err = writer.WriteFile(outputPath, snapshotBytes, 0644) - if err != nil { - return nil, fmt.Errorf("failed to write protocol snapshot file to %s: %w", outputPath, err) - } - - return &saveResult{OutputPath: outputPath}, nil -} diff --git a/internal/snapshot/snapshot.go b/internal/snapshot/snapshot.go deleted file mode 100644 index 32ea84e8c..000000000 --- a/internal/snapshot/snapshot.go +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package snapshot - -import ( - "fmt" - - "github.com/spf13/cobra" -) - -var Cmd = &cobra.Command{ - Use: "snapshot", - Short: "Retrieve the protocol state snapshot", - TraverseChildren: true, -} - -func init() { - saveCommand.AddToParent(Cmd) -} - -// saveResult represents the result of the snapshot save command. -type saveResult struct { - OutputPath string -} - -func (r *saveResult) JSON() any { - return map[string]string{"path": r.OutputPath} -} - -func (r *saveResult) String() string { - return fmt.Sprintf("snapshot saved: %s", r.OutputPath) -} - -func (r *saveResult) Oneliner() string { - return fmt.Sprintf("snapshot saved: %s", r.OutputPath) -} diff --git a/internal/status/status.go b/internal/status/status.go deleted file mode 100644 index 60f6c6608..000000000 --- a/internal/status/status.go +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package status - -import ( - "bytes" - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsStatus struct { -} - -var statusFlags = flagsStatus{} - -var Command = &command.Command{ - Cmd: &cobra.Command{ - Use: "status", - Short: "Display the status of the Flow network", - }, - Flags: &statusFlags, - RunS: status, -} - -func status( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - flow flowkit.Services, - _ *flowkit.State, -) (command.Result, error) { - err := flow.Ping() - - return &result{ - network: flow.Network().Name, - accessNode: flow.Network().Host, - err: err, - }, nil -} - -type result struct { - network string - accessNode string - err error -} - -// getStatus returns string representation for Flow network status. -func (r *result) getStatus() string { - if r.err == nil { - return "ONLINE" - } - - return "OFFLINE" -} - -// getColoredStatus returns colored string representation for Flow network status. -func (r *result) getColoredStatus() string { - if r.err == nil { - return output.Green(r.getStatus()) - } - - return output.Red(output.Red(r.getStatus())) -} - -// getIcon returns emoji icon representing Flow network status. -func (r *result) getIcon() string { - if r.err == nil { - return output.GoEmoji() - } - - return output.StopEmoji() -} - -// String converts result to a string. -func (r *result) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - _, _ = fmt.Fprintf(writer, "Status:\t %s %s\n", r.getIcon(), r.getColoredStatus()) - _, _ = fmt.Fprintf(writer, "Network:\t %s\n", r.network) - _, _ = fmt.Fprintf(writer, "Access Node:\t %s\n", r.accessNode) - - _ = writer.Flush() - return b.String() -} - -// JSON converts result to a JSON. -func (r *result) JSON() any { - result := make(map[string]string) - - result["network"] = r.network - result["accessNode"] = r.accessNode - result["status"] = r.getStatus() - - return result -} - -// Oneliner returns result as one liner grep friendly. -func (r *result) Oneliner() string { - return r.getStatus() -} diff --git a/internal/super/dev.go b/internal/super/dev.go deleted file mode 100644 index 29ab1f068..000000000 --- a/internal/super/dev.go +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "errors" - "fmt" - "os" - "strings" - - "github.com/onflow/cadence/runtime/parser" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsDev struct{} - -var devFlags = flagsDev{} - -var DevCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "dev", - Short: "Build your Flow project", - Args: cobra.ExactArgs(0), - Example: "flow dev", - GroupID: "super", - }, - Flags: &devFlags, - RunS: dev, -} - -func dev( - _ []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - dir, err := os.Getwd() - if err != nil { - return nil, err - } - - err = flow.Ping() - if err != nil { - logger.Error("Error connecting to emulator. Make sure you started an emulator using 'flow emulator' command.") - logger.Info(fmt.Sprintf("%s This tool requires emulator to function. Emulator needs to be run inside the project root folder where the configuration file ('flow.json') exists.\n\n", output.TryEmoji())) - return nil, nil - } - - service, err := state.EmulatorServiceAccount() - if err != nil { - return nil, err - } - - flow.SetLogger(output.NewStdoutLogger(output.NoneLog)) - - project, err := newProject( - *service, - flow, - state, - newProjectFiles(dir), - ) - if err != nil { - fmt.Printf("%s Failed to run the command, please make sure you ran 'flow setup' command first and that you are running this command inside the project ROOT folder.\n\n", output.TryEmoji()) - return nil, err - } - - err = project.startup() - if err != nil { - if strings.Contains(err.Error(), "does not have a valid signature") { - fmt.Printf("%s Failed to run the command, please make sure you started the emulator inside the project ROOT folder by running 'flow emulator'.\n\n", output.TryEmoji()) - return nil, nil - } - - var parseErr parser.Error - if errors.As(err, &parseErr) { - fmt.Println(err) // we just print the error but keep watching files for changes, since they might fix the issue - } else { - return nil, err - } - } - - err = project.watch() - if err != nil { - return nil, err - } - - return nil, nil -} diff --git a/internal/super/files.go b/internal/super/files.go deleted file mode 100644 index d1388bfa2..000000000 --- a/internal/super/files.go +++ /dev/null @@ -1,246 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "fmt" - "io/fs" - "os" - "path/filepath" - "time" - - "github.com/pkg/errors" - "github.com/radovskyb/watcher" - - "github.com/onflow/flow-cli/flowkit/config" -) - -const ( - cadenceDir = "cadence" - contractDir = "contracts" - scriptDir = "scripts" - transactionDir = "transactions" - cadenceExt = ".cdc" - created = 1 - removed = 2 - changed = 3 - renamed = 4 -) - -type accountChange struct { - status int - name string -} - -type contractChange struct { - status int - path string - oldPath string - account string -} - -func newProjectFiles(projectPath string) *projectFiles { - return &projectFiles{ - cadencePath: filepath.Join(projectPath, cadenceDir), - watcher: watcher.New(), - } -} - -type projectFiles struct { - cadencePath string - watcher *watcher.Watcher -} - -// exist checks if current directory contains all project files required. -func (f *projectFiles) exist() error { - if _, err := os.Stat(f.cadencePath); errors.Is(err, os.ErrNotExist) { - if _, err := os.Stat(contractDir); errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("required cadence folder or contract folder does not exist") - } else if err == nil { - f.cadencePath = "" // in case there's no cadence folder we just use contracts folder directly - } - } - if _, err := os.Stat(config.DefaultPath); errors.Is(err, os.ErrNotExist) { - return fmt.Errorf("required project configuration ('flow.json') does not exist") - } - - return nil -} - -// contracts returns a list of contracts in project. -func (f *projectFiles) contracts() ([]string, error) { - return f.getCadenceFilepaths(contractDir) -} - -// contracts returns a map of deployments in project, mapping account name to all contracts saved to that account. -func (f *projectFiles) deployments() (map[string][]string, error) { - deployments := make(map[string][]string) - - contracts, err := f.contracts() - if err != nil { - return nil, errors.Wrap(err, "failed to get contracts in deployment") - } - - for _, file := range contracts { - accName, _ := accountFromPath(file) - deployments[accName] = append(deployments[accName], file) - } - - return deployments, nil -} - -// contracts returns a list of scripts in project. -func (f *projectFiles) scripts() ([]string, error) { - return f.getCadenceFilepaths(scriptDir) -} - -// contracts returns a list of transactions in project. -func (f *projectFiles) transactions() ([]string, error) { - return f.getCadenceFilepaths(transactionDir) -} - -// watch for file changes in the contract folder and signal any changes through channel. -// -// This function returns two channels, accountChange which reports any changes on the accounts folders and -// contractChange which reports any changes to the contract files. -func (f *projectFiles) watch() (<-chan accountChange, <-chan contractChange, error) { - err := f.watcher.AddRecursive(filepath.Join(f.cadencePath, contractDir)) - if err != nil { - return nil, nil, errors.Wrap(err, "add recursive files failed") - } - - go func() { - err = f.watcher.Start(500 * time.Millisecond) - if err != nil { - panic(err) - } - }() - - accounts := make(chan accountChange) - contracts := make(chan contractChange) - - go func() { - status := map[watcher.Op]int{ - watcher.Create: created, - watcher.Remove: removed, - watcher.Write: changed, - watcher.Rename: renamed, - } - - for { - select { - case event := <-f.watcher.Event: - rel, err := f.relProjectPath(event.Path) - if err != nil { // skip if failed - continue - } - - name, containsAccount := accountFromPath(rel) - if event.IsDir() && containsAccount { - // TODO(sideninja) handle moving of files - accounts <- accountChange{ - status: status[event.Op], - name: name, - } - continue - } - - if filepath.Ext(rel) != cadenceExt { // skip any non cadence files - continue - } - - oldPath := "" - if event.Op == watcher.Rename { // add relative path in case of rename - oldPath, err = f.relProjectPath(event.OldPath) - if err != nil { - continue - } - } - - contracts <- contractChange{ - status: status[event.Op], - path: rel, - oldPath: oldPath, - account: name, - } - case <-f.watcher.Closed: - close(contracts) - close(accounts) - return - } - } - }() - - return accounts, contracts, nil -} - -// getFilePaths returns a list of only Cadence files that are inside the provided directory. -func (f *projectFiles) getCadenceFilepaths(dir string) ([]string, error) { - dir = filepath.Join(f.cadencePath, dir) - paths := make([]string, 0) - err := filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { - if path == dir || d.IsDir() || filepath.Ext(path) != cadenceExt { // we only want to get .cdc files in the dir - return nil - } - - rel, err := f.relProjectPath(path) - if err != nil { - return err - } - - paths = append(paths, rel) - return nil - }) - if err != nil { - return nil, err - } - - return paths, nil -} - -// relProjectPath gets a filepath relative to the project directory including the base cadence directory. -// eg. a path /Users/Mike/Dev/project/cadence/contracts/foo.cdc will become cadence/contracts/foo.cdc -func (f *projectFiles) relProjectPath(file string) (string, error) { - rel, err := filepath.Rel(filepath.Dir(f.cadencePath), file) - if err != nil { - return "", errors.Wrap(err, "failed getting project relative path") - } - return rel, nil -} - -// accountFromPath returns the account name from provided path if possible, otherwise returns empty and false. -// -// Account name can be extracted from path when the contract folder contains another folder, that in our syntax indicates account name. -func accountFromPath(path string) (string, bool) { - // extract account from path if file path is provided e.g.: cadence/contracts/[alice]/foo.cdc - subAccPattern := filepath.Clean(fmt.Sprintf("%s/%s/*/*%s", cadenceDir, contractDir, cadenceExt)) - if match, _ := filepath.Match(subAccPattern, path); match { - return filepath.Base(filepath.Dir(path)), true - } - // extract account from path if dir path is provided e.g.: cadence/contracts/[alice] - subAccPattern = filepath.Clean(fmt.Sprintf("%s/%s/*", cadenceDir, contractDir)) - if match, _ := filepath.Match(subAccPattern, path); match { - if filepath.Ext(path) != "" { // might be a file - return "", false - } - return filepath.Base(path), true - } - - return "", false -} diff --git a/internal/super/files_test.go b/internal/super/files_test.go deleted file mode 100644 index 9f9888017..000000000 --- a/internal/super/files_test.go +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "fmt" - "path/filepath" - "testing" - - "github.com/stretchr/testify/assert" -) - -func Test_AccountFromPath(t *testing.T) { - paths := [][]string{ // first is path, second is account name - {"cadence/contracts/alice/foo.cdc", "alice"}, - {"cadence/contracts/alice", "alice"}, - {"cadence/contracts/alice/boo/foo.cdc", ""}, - {"cadence/contracts/foo.cdc", ""}, - {"cadence/contracts/foo/bar/goo/foo", ""}, - } - - for i, test := range paths { - name, ok := accountFromPath(filepath.FromSlash(test[0])) - assert.Equal(t, test[1] != "", ok) // if we don't provide a name we mean it shouldn't be returned - assert.Equal(t, test[1], name, fmt.Sprintf("failed test %d", i)) - } -} - -func Test_RelativeProjectPath(t *testing.T) { - cdcDir := "/Users/Mike/Dev/my-project/cadence" - paths := [][]string{ - {filepath.Join(cdcDir, "/contracts/foo.cdc"), "cadence/contracts/foo.cdc"}, - {filepath.Join(cdcDir, "/contracts/alice/foo.cdc"), "cadence/contracts/alice/foo.cdc"}, - {filepath.Join(cdcDir, "/scripts/bar.cdc"), "cadence/scripts/bar.cdc"}, - {filepath.Join(cdcDir, "/bar.cdc"), "cadence/bar.cdc"}, - } - - f := &projectFiles{ - cadencePath: cdcDir, - } - - for i, test := range paths { - rel, err := f.relProjectPath(filepath.FromSlash(test[0])) - assert.NoError(t, err) - assert.Equal(t, filepath.FromSlash(test[1]), rel, fmt.Sprintf("test %d failed", i)) - } -} diff --git a/internal/super/flix.go b/internal/super/flix.go deleted file mode 100644 index 418b2d126..000000000 --- a/internal/super/flix.go +++ /dev/null @@ -1,298 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "context" - "fmt" - "os" - - "github.com/onflow/flixkit-go/flixkit" - - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/scripts" - "github.com/onflow/flow-cli/internal/transactions" -) - -type flixFlags struct { - ArgsJSON string `default:"" flag:"args-json" info:"arguments in JSON-Cadence format"` - BlockID string `default:"" flag:"block-id" info:"block ID to execute the script at"` - BlockHeight uint64 `default:"" flag:"block-height" info:"block height to execute the script at"` - Signer string `default:"" flag:"signer" info:"Account name from configuration used to sign the transaction as proposer, payer and suthorizer"` - Proposer string `default:"" flag:"proposer" info:"Account name from configuration used as proposer"` - Payer string `default:"" flag:"payer" info:"Account name from configuration used as payer"` - Authorizers []string `default:"" flag:"authorizer" info:"Name of a single or multiple comma-separated accounts used as authorizers from configuration"` - Include []string `default:"" flag:"include" info:"Fields to include in the output"` - Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"` - GasLimit uint64 `default:"1000" flag:"gas-limit" info:"transaction gas limit"` - PreFill string `default:"" flag:"pre-fill" info:"template path to pre fill the FLIX"` - Lang string `default:"js" flag:"lang" info:"language to generate the template for"` -} - -type flixResult struct { - flixQuery string - result string -} - -var flags = flixFlags{} -var FlixCmd = &cobra.Command{ - Use: "flix", - Short: "execute, generate, package", - TraverseChildren: true, - GroupID: "tools", -} - -var executeCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "execute ", - Short: "execute FLIX template with a given id, name, local filename, or url", - Example: "flow flix execute transfer-flow 1 0x123456789", - Args: cobra.MinimumNArgs(1), - }, - Flags: &flags, - RunS: executeCmd, -} - -var packageCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "package --lang ", - Short: "package file for FLIX template fcl-js is default", - Example: "flow flix package multiply.template.json --lang js", - Args: cobra.MinimumNArgs(1), - }, - Flags: &flags, - RunS: packageCmd, -} - -var generateCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "generate ", - Short: "generate FLIX json template given local Cadence filename", - Example: "flow flix generate multiply.cdc", - Args: cobra.MinimumNArgs(1), - }, - Flags: &flags, - RunS: generateCmd, -} - -func init() { - executeCommand.AddToParent(FlixCmd) - packageCommand.AddToParent(FlixCmd) - generateCommand.AddToParent(FlixCmd) -} - -func executeCmd( - args []string, - flags command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - flixService := flixkit.NewFlixService(&flixkit.FlixServiceConfig{ - FileReader: state, - }) - return executeFlixCmd(args, flags, logger, flow, state, flixService) -} - -func executeFlixCmd( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, - flixService flixkit.FlixService, -) (result command.Result, err error) { - flixQuery := args[0] - ctx := context.Background() - cadenceWithImportsReplaced, err := flixService.GetTemplateAndReplaceImports(ctx, flixQuery, flow.Network().Name) - if err != nil { - logger.Error("could not replace imports") - return nil, err - } - - if cadenceWithImportsReplaced.IsScript { - scriptsFlags := scripts.Flags{ - ArgsJSON: flags.ArgsJSON, - BlockID: flags.BlockID, - BlockHeight: flags.BlockHeight, - } - return scripts.SendScript([]byte(cadenceWithImportsReplaced.Cadence), args[1:], "", flow, scriptsFlags) - } - - transactionFlags := transactions.Flags{ - ArgsJSON: flags.ArgsJSON, - Signer: flags.Signer, - Proposer: flags.Proposer, - Payer: flags.Payer, - Authorizers: flags.Authorizers, - Include: flags.Include, - Exclude: flags.Exclude, - GasLimit: flags.GasLimit, - } - return transactions.SendTransaction([]byte(cadenceWithImportsReplaced.Cadence), args[1:], "", flow, state, transactionFlags) -} - -func packageCmd( - args []string, - gFlags command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - flixService := flixkit.NewFlixService(&flixkit.FlixServiceConfig{ - FileReader: state, - }) - - return packageFlixCmd(args, gFlags, logger, flow, state, flixService, flags) -} - -func packageFlixCmd( - args []string, - gFlags command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, - flixService flixkit.FlixService, - flags flixFlags, -) (result command.Result, err error) { - flixQuery := args[0] - ctx := context.Background() - out, err := flixService.GetTemplateAndCreateBinding(ctx, flixQuery, flags.Lang, gFlags.Save) - if err != nil { - return nil, err - } - - return &flixResult{ - flixQuery: flixQuery, - result: out, - }, err -} - -func generateCmd( - args []string, - gFlags command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - flixService := flixkit.NewFlixService(&flixkit.FlixServiceConfig{ - FileReader: state, - Logger: logger, - }) - - return generateFlixCmd(args, gFlags, logger, flow, state, flixService, flags) -} - -func generateFlixCmd( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, - flixService flixkit.FlixService, - flags flixFlags, -) (result command.Result, err error) { - cadenceFile := args[0] - depContracts := getDeployedContracts(state) - if cadenceFile == "" { - return nil, fmt.Errorf("no cadence code found") - } - - code, err := state.ReadFile(cadenceFile) - if err != nil { - return nil, fmt.Errorf("could not read cadence file %s: %w", cadenceFile, err) - } - - if err != nil { - return nil, fmt.Errorf("could not create flix generator %w", err) - } - - ctx := context.Background() - prettyJSON, err := flixService.CreateTemplate(ctx, depContracts, string(code), flags.PreFill) - if err != nil { - return nil, fmt.Errorf("could not generate flix %w", err) - } - - return &flixResult{ - flixQuery: cadenceFile, - result: prettyJSON, - }, err - -} - -func (fr *flixResult) JSON() any { - result := make(map[string]any) - result["flixQuery"] = fr.flixQuery - result["result"] = fr.result - return result -} - -func (fr *flixResult) String() string { - return fr.result -} - -func (fr *flixResult) Oneliner() string { - return fr.result -} - -func getDeployedContracts(state *flowkit.State) flixkit.ContractInfos { - allContracts := make(flixkit.ContractInfos) - depNetworks := make([]string, 0) - // get all configured networks in flow.json - for _, n := range *state.Networks() { - depNetworks = append(depNetworks, n.Name) - } - - // get all deployed and alias contracts for configured networks - for _, network := range depNetworks { - contracts, err := state.DeploymentContractsByNetwork(config.Network{Name: network}) - if err != nil { - continue - } - for _, c := range contracts { - if _, ok := allContracts[c.Name]; !ok { - allContracts[c.Name] = make(flixkit.NetworkAddressMap) - } - allContracts[c.Name][network] = c.AccountAddress.Hex() - } - locAliases := state.AliasesForNetwork(config.Network{Name: network}) - for name, addr := range locAliases { - address := flow.BytesToAddress([]byte(addr)) - if isPath(name) { - continue - } - if _, ok := allContracts[name]; !ok { - allContracts[name] = make(flixkit.NetworkAddressMap) - } - allContracts[name][network] = address.Hex() - } - } - return allContracts -} - -func isPath(path string) bool { - _, err := os.Stat(path) - return err == nil -} diff --git a/internal/super/flix_test.go b/internal/super/flix_test.go deleted file mode 100644 index be6d33692..000000000 --- a/internal/super/flix_test.go +++ /dev/null @@ -1,232 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2024 Flow Foundation, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "context" - "testing" - - "github.com/spf13/afero" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flixkit-go/flixkit" - "github.com/onflow/flow-go-sdk/crypto" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/mocks" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type MockFlixService struct { - mock.Mock -} - -var TEMPLATE_STR = "{ \"f_type\": \"IniteractionTemplate\", \"f_version\": \"1.1.0\", \"id\": \"0ea\",}" - -func (m *MockFlixService) GetTemplate(ctx context.Context, templateName string) (string, string, error) { - args := m.Called(ctx, templateName) - return TEMPLATE_STR, args.String(0), args.Error(1) -} - -var CADENCE_SCRIPT = "pub fun main() {\n log(\"Hello, World!\")\n}" - -func (m *MockFlixService) GetTemplateAndReplaceImports(ctx context.Context, templateName string, network string) (*flixkit.FlowInteractionTemplateExecution, error) { - result := &flixkit.FlowInteractionTemplateExecution{ - Network: "emulator", - IsTransaciton: false, - IsScript: true, - Cadence: CADENCE_SCRIPT, - } - return result, nil -} - -func (m *MockFlixService) CreateTemplate(ctx context.Context, contractInfos flixkit.ContractInfos, code string, preFill string) (string, error) { - args := m.Called(ctx, contractInfos, code, preFill) - return TEMPLATE_STR, args.Error(1) -} - -var JS_CODE = "export async function request() { const info = await fcl.query({ template: flixTemplate }); return info; }" - -func (m *MockFlixService) GetTemplateAndCreateBinding(ctx context.Context, templateName string, lang string, destFile string) (string, error) { - args := m.Called(ctx, templateName, lang, destFile) - return JS_CODE, args.Error(1) -} - -func Test_ExecuteFlixScript(t *testing.T) { - ctx := context.Background() - logger := output.NewStdoutLogger(output.NoneLog) - srv, state, _ := util.TestMocks(t) - mockFlixService := new(MockFlixService) - testCadenceScript := "pub fun main() {\n log(\"Hello, World!\")\n}" - mockFlixService.On("GetTemplateAndReplaceImports", ctx, "templateName", "emulator").Return(&flixkit.FlowInteractionTemplateExecution{ - Network: "emulator", - IsTransaciton: false, - IsScript: true, - Cadence: testCadenceScript, - }, nil) - - // Set up a mock return value for the Network method - mockNetwork := config.Network{ - Name: "emulator", - Host: "localhost:3569", - } - srv.Network.Run(func(args mock.Arguments) {}).Return(mockNetwork, nil) - srv.ExecuteScript.Run(func(args mock.Arguments) { - script := args.Get(1).(flowkit.Script) - assert.Equal(t, testCadenceScript, string(script.Code)) - }).Return(nil, nil) - - result, err := executeFlixCmd([]string{"transfer-token"}, command.GlobalFlags{}, logger, srv.Mock, state, mockFlixService) - assert.NoError(t, err) - assert.NotNil(t, result) -} - -func Test_ExecuteFlixTransaction(t *testing.T) { - ctx := context.Background() - logger := output.NewStdoutLogger(output.NoneLog) - srv, state, _ := util.TestMocks(t) - mockFlixService := new(MockFlixService) - testCadenceTx := "transaction { prepare(signer: AuthAccount) { /* prepare logic */ } execute { log(\"Hello, Cadence!\") } }" - mockFlixService.On("GetTemplateAndReplaceImports", ctx, "templateName", "emulator").Return(&flixkit.FlowInteractionTemplateExecution{ - Network: "emulator", - IsTransaciton: false, - IsScript: true, - Cadence: testCadenceTx, - }, nil) - - // Set up a mock return value for the Network method - mockNetwork := config.Network{ - Name: "emulator", - Host: "localhost:3569", - } - srv.Network.Run(func(args mock.Arguments) {}).Return(mockNetwork, nil) - srv.SendTransaction.Run(func(args mock.Arguments) { - script := args.Get(2).(flowkit.Script) - assert.Equal(t, testCadenceTx, string(script.Code)) - }).Return(nil, nil) - - result, err := executeFlixCmd([]string{"transfer-token"}, command.GlobalFlags{}, logger, srv.Mock, state, mockFlixService) - assert.NoError(t, err) - assert.NotNil(t, result) -} - -func Test_PackageFlix(t *testing.T) { - ctx := context.Background() - logger := output.NewStdoutLogger(output.NoneLog) - srv, state, _ := util.TestMocks(t) - mockFlixService := new(MockFlixService) - templateName := "templateName" - mockFlixService.On("GetTemplateAndCreateBinding", ctx, templateName, "js", "").Return(JS_CODE, nil) - - result, err := packageFlixCmd([]string{templateName}, command.GlobalFlags{}, logger, srv.Mock, state, mockFlixService, flixFlags{Lang: "js"}) - assert.NoError(t, err) - assert.NotNil(t, result) - assert.Equal(t, JS_CODE, result.String()) -} -func Test_GenerateFlix(t *testing.T) { - srv := mocks.DefaultMockServices() - cadenceFile := "cadence.cdc" - cadenceCode := "pub fun main() {\n log(\"Hello, World!\")\n}" - - mockFlixService := new(MockFlixService) - - configJson := []byte(`{ - "contracts": {}, - "accounts": { - "emulator-account": { - "address": "f8d6e0586b0a20c7", - "key": "dd72967fd2bd75234ae9037dd4694c1f00baad63a10c35172bf65fbb8ad74b47" - } - }, - "networks": { - "emulator": "127.0.0.1.3569" - }, - "deployments": { - } - }`) - - af := afero.Afero{Fs: afero.NewMemMapFs()} - err := afero.WriteFile(af.Fs, "flow.json", configJson, 0644) - assert.NoError(t, err) - err = afero.WriteFile(af.Fs, cadenceFile, []byte(cadenceCode), 0644) - assert.NoError(t, err) - err = afero.WriteFile(af.Fs, tests.ContractHelloString.Filename, []byte(tests.ContractHelloString.Source), 0644) - assert.NoError(t, err) - paths := []string{"flow.json"} - state, err := flowkit.Load(paths, af) - assert.NotNil(t, state) - assert.NoError(t, err) - d := config.Deployment{ - Network: "emulator", - Account: "emulator-account", - Contracts: []config.ContractDeployment{{ - Name: tests.ContractHelloString.Name, - Args: nil, - }}, - } - state.Deployments().AddOrUpdate(d) - c := config.Contract{ - Name: tests.ContractHelloString.Name, - Location: tests.ContractHelloString.Filename, - } - state.Contracts().AddOrUpdate(c) - - contracts, err := state.DeploymentContractsByNetwork(config.Network{Name: "emulator"}) - assert.NoError(t, err) - assert.Equal(t, 1, len(contracts)) - - logger := output.NewStdoutLogger(output.NoneLog) - contractInfos := make(flixkit.ContractInfos) - contractInfos[tests.ContractHelloString.Name] = make(flixkit.NetworkAddressMap) - contractInfos[tests.ContractHelloString.Name]["emulator"] = "f8d6e0586b0a20c7" - - ctx := context.Background() - mockFlixService.On("CreateTemplate", ctx, contractInfos, cadenceCode, "").Return(TEMPLATE_STR, nil) - - result, err := generateFlixCmd([]string{cadenceFile}, command.GlobalFlags{}, logger, srv.Mock, state, mockFlixService, flixFlags{}) - assert.NoError(t, err) - assert.NotNil(t, result) - assert.Equal(t, TEMPLATE_STR, result.String()) -} - -func Test_GenerateFlixPrefill(t *testing.T) { - logger := output.NewStdoutLogger(output.NoneLog) - srv := mocks.DefaultMockServices() - templateName := "templateName" - cadenceFile := "cadence.cdc" - - var mockFS = afero.NewMemMapFs() - var rw = afero.Afero{Fs: mockFS} - err := rw.WriteFile(cadenceFile, []byte(CADENCE_SCRIPT), 0644) - assert.NoError(t, err) - state, _ := flowkit.Init(rw, crypto.ECDSA_P256, crypto.SHA3_256) - - mockFlixService := new(MockFlixService) - ctx := context.Background() - mockFlixService.On("CreateTemplate", ctx, flixkit.ContractInfos{}, CADENCE_SCRIPT, templateName).Return(TEMPLATE_STR, nil) - - result, err := generateFlixCmd([]string{cadenceFile}, command.GlobalFlags{}, logger, srv.Mock, state, mockFlixService, flixFlags{PreFill: templateName}) - assert.NoError(t, err) - assert.NotNil(t, result) -} diff --git a/internal/super/generate.go b/internal/super/generate.go deleted file mode 100644 index bd8041ff9..000000000 --- a/internal/super/generate.go +++ /dev/null @@ -1,204 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "fmt" - "path/filepath" - "strings" - - "github.com/onflow/flow-cli/flowkit/config" - - "github.com/onflow/flow-cli/flowkit" - - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - - "github.com/spf13/cobra" -) - -type generateFlagsDef struct { - Directory string `default:"" flag:"dir" info:"Directory to generate files in"` -} - -var generateFlags = generateFlagsDef{} - -var GenerateCommand = &cobra.Command{ - Use: "generate", - Short: "Generate template files for common Cadence code", - GroupID: "super", - Aliases: []string{"g"}, -} - -var GenerateContractCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "contract ", - Short: "Generate Cadence smart contract template", - Example: "flow generate contract HelloWorld", - Args: cobra.ExactArgs(1), - }, - Flags: &generateFlags, - RunS: generateContract, -} - -var GenerateTransactionCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "transaction ", - Short: "Generate a Cadence transaction template", - Example: "flow generate transaction SomeTransaction", - Args: cobra.ExactArgs(1), - }, - Flags: &generateFlags, - RunS: generateTransaction, -} - -var GenerateScriptCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "script ", - Short: "Generate a Cadence script template", - Example: "flow generate script SomeScript", - Args: cobra.ExactArgs(1), - }, - Flags: &generateFlags, - RunS: generateScript, -} - -func init() { - GenerateContractCommand.AddToParent(GenerateCommand) - GenerateTransactionCommand.AddToParent(GenerateCommand) - GenerateScriptCommand.AddToParent(GenerateCommand) -} - -func generateContract( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - return generateNew(args, "contract", logger, state) -} - -func generateTransaction( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - return generateNew(args, "transaction", logger, state) -} - -func generateScript( - args []string, - _ command.GlobalFlags, - logger output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - return generateNew(args, "script", logger, state) -} - -func generateNew( - args []string, - templateType string, - logger output.Logger, - state *flowkit.State, -) (result command.Result, err error) { - if len(args) < 1 { - return nil, fmt.Errorf("invalid number of arguments") - } - - name := args[0] - var filename string - - // Don't add .cdc extension if it's already there - if strings.HasSuffix(name, ".cdc") { - filename = name - } else { - filename = fmt.Sprintf("%s.cdc", name) - } - - var fileToWrite string - var basePath string - - if generateFlags.Directory != "" { - basePath = generateFlags.Directory - } else { - switch templateType { - case "contract": - basePath = "cadence/contracts" - case "script": - basePath = "cadence/scripts" - case "transaction": - basePath = "cadence/transactions" - default: - return nil, fmt.Errorf("invalid template type: %s", templateType) - } - } - - switch templateType { - case "contract": - fileToWrite = fmt.Sprintf(` -access(all) contract %s { - init() {} -}`, name) - case "script": - fileToWrite = `access(all) fun main() { - // Script details here -}` - case "transaction": - fileToWrite = `transaction() { - prepare(account:AuthAccount) {} - - execute {} -}` - default: - return nil, fmt.Errorf("invalid template type: %s", templateType) - } - - filenameWithBasePath := filepath.Join(basePath, filename) - - // Check file existence - if _, err := state.ReaderWriter().ReadFile(filenameWithBasePath); err == nil { - return nil, fmt.Errorf("file already exists: %s", filenameWithBasePath) - } - - // Ensure the directory exists - if err := state.ReaderWriter().MkdirAll(basePath, 0755); err != nil { - return nil, fmt.Errorf("error creating directories: %w", err) - } - - err = state.ReaderWriter().WriteFile(filenameWithBasePath, []byte(fileToWrite), 0644) - if err != nil { - return nil, fmt.Errorf("error writing file: %w", err) - } - - logger.Info(fmt.Sprintf("Generated new %s: %s at %s", templateType, name, filenameWithBasePath)) - - if templateType == "contract" { - state.Contracts().AddOrUpdate(config.Contract{Name: name, Location: filenameWithBasePath}) - err = state.SaveDefault() - if err != nil { - return nil, fmt.Errorf("error saving to flow.json: %w", err) - } - } - - return nil, err -} diff --git a/internal/super/generate_test.go b/internal/super/generate_test.go deleted file mode 100644 index 84d56a298..000000000 --- a/internal/super/generate_test.go +++ /dev/null @@ -1,192 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "os" - "testing" - - "github.com/onflow/flow-cli/internal/util" - - "github.com/stretchr/testify/assert" - - "github.com/onflow/flow-cli/flowkit/output" -) - -func TestGenerateNewContract(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - // Test contract generation - _, err = generateNew([]string{"TestContract"}, "contract", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - fileContent, err := state.ReaderWriter().ReadFile("cadence/contracts/TestContract.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, fileContent) - - // Check content is correct - expectedContent := ` -access(all) contract TestContract { - init() {} -}` - assert.Equal(t, expectedContent, string(fileContent)) - - // Test file already exists scenario - _, err = generateNew([]string{"TestContract"}, "contract", logger, state) - assert.Error(t, err) - assert.Equal(t, "file already exists: cadence/contracts/TestContract.cdc", err.Error()) -} - -func TestGenerateNewContractFileAlreadyExists(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - // Test contract generation - _, err = generateNew([]string{"TestContract"}, "contract", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - //// Check if the file exists in the correct directory - content, err := state.ReaderWriter().ReadFile("cadence/contracts/TestContract.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, content) - - // Test file already exists scenario - _, err = generateNew([]string{"TestContract"}, "contract", logger, state) - assert.Error(t, err) - assert.Equal(t, "file already exists: cadence/contracts/TestContract.cdc", err.Error()) -} - -func TestGenerateNewContractWithFileExtension(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - _, err = generateNew([]string{"TestContract.cdc"}, "contract", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - // Check file exists - content, err := state.ReaderWriter().ReadFile("cadence/contracts/TestContract.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, content) -} - -func TestGenerateNewScript(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - _, err = generateNew([]string{"TestScript"}, "script", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - content, err := state.ReaderWriter().ReadFile("cadence/scripts/TestScript.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, content) - - expectedContent := `access(all) fun main() { - // Script details here -}` - assert.Equal(t, expectedContent, string(content)) -} - -func TestGenerateNewTransaction(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - _, err = generateNew([]string{"TestTransaction"}, "transaction", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - content, err := state.ReaderWriter().ReadFile("cadence/transactions/TestTransaction.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, content) - - expectedContent := `transaction() { - prepare(account:AuthAccount) {} - - execute {} -}` - assert.Equal(t, expectedContent, string(content)) -} - -func TestGenerateNewWithDirFlag(t *testing.T) { - dir, err := os.MkdirTemp("", "test") - assert.NoError(t, err, "Failed to create temp dir") - defer os.RemoveAll(dir) - - if err := os.Chdir(dir); err != nil { - t.Fatalf("Failed to change directory: %v", err) - } - - logger := output.NewStdoutLogger(output.NoneLog) - _, state, _ := util.TestMocks(t) - - // Set a custom directory - generateFlags.Directory = "customDir" - - _, err = generateNew([]string{"TestContract"}, "contract", logger, state) - assert.NoError(t, err, "Failed to generate contract") - - content, err := state.ReaderWriter().ReadFile("customDir/TestContract.cdc") - assert.NoError(t, err, "Failed to read generated file") - assert.NotNil(t, content) - - expectedContent := ` -access(all) contract TestContract { - init() {} -}` - assert.Equal(t, expectedContent, string(content)) -} diff --git a/internal/super/output.go b/internal/super/output.go deleted file mode 100644 index 064a84d34..000000000 --- a/internal/super/output.go +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "bytes" - "errors" - "fmt" - "math/rand" - "os" - sysExec "os/exec" - "regexp" - "strings" - "time" - - "golang.org/x/exp/maps" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - flowkitProject "github.com/onflow/flow-cli/flowkit/project" -) - -func printDeployment(deployed []*flowkitProject.Contract, err error, contractPathNames map[string]string) { - clearScreen() - fmt.Println(helpBanner()) - - if err != nil { - fmt.Println(errorBanner()) - fmt.Println(failureDeployment(err, contractPathNames)) - return - } - - fmt.Println(okBanner()) - fmt.Println(successfulDeployment(deployed)) -} - -func successfulDeployment(deployed []*flowkitProject.Contract) string { - var out bytes.Buffer - okFaces := []string{"😎", "🤩", "🤠", "🤖", "🤡", "👽", "👾", "🥸", "🧐", "👻", "💩", "🤓", "🥳", "🤑", "😍", "👿"} - - // build map of grouped contracts by account for easier output - deployOut := make(map[string][]string) - for _, deploy := range deployed { - key := fmt.Sprintf("%s 0x%s", deploy.AccountName, deploy.AccountAddress.String()) - if deployOut[key] == nil { - deployOut[key] = make([]string, 0) - } - deployOut[key] = append( - deployOut[key], - fmt.Sprintf(" |- %s %s", output.Bold(output.Magenta(deploy.Name)), output.Italic(deploy.Location())), - ) - } - - for account, contracts := range deployOut { - out.WriteString(fmt.Sprintf("\n%s %s\n", okFaces[rand.Intn(len(okFaces))], output.Bold(account))) - for _, contract := range contracts { - out.WriteString(fmt.Sprintf("%s\n", contract)) - } - } - - return out.String() -} - -func failureDeployment(err error, contractPathNames map[string]string) string { - var out bytes.Buffer - - // handle emulator not allowing overwriting contracts - if strings.Contains(err.Error(), "cannot overwrite existing contract with name") { - out.WriteString(output.ErrorEmoji() + output.Red(" Cannot overwrite existing contract, that means you are running the emulator without the --contract-removal flag.\n")) - out.WriteString(output.TryEmoji() + " Please restart the emulator with the --contract-removal flag present as we are required to continuously update contracts as you work.") - } - - // handle import path errors with helpful message - importRegex := regexp.MustCompile(`import from (\w*) could not be found: (\w*), make sure import path is correct`) - if importRegex.MatchString(err.Error()) { - found := importRegex.FindAllStringSubmatch(err.Error(), -1) - contractName := found[0][1] - importName := found[0][2] - contractPath := "" - for p, n := range contractPathNames { - if contractName == n { - contractPath = p - } - } - - out.WriteString(output.ErrorEmoji() + output.Red( - fmt.Sprintf(" Error deploying your project. Import 'import %s' found in %s (%s) could not be resolved.\n", importName, contractName, contractPath), - )) - out.WriteString(fmt.Sprintf( - "Only valid project imports are: %s. If you want to import a contract outside your project you need to import it by specifying an address of already deployed contract, or by first transferring the contract file inside the project and then importing.\n", - strings.Join(maps.Values(contractPathNames), ", "), - )) - return out.String() - } - - // handle cadence runtime errors - var deployErr *flowkit.ProjectDeploymentError - if errors.As(err, &deployErr) { - out.WriteString(output.ErrorEmoji() + " Error deploying your project. Runtime error encountered which means your code is incorrect, check details bellow. \n\n") - - for name, err := range deployErr.Contracts() { - out.WriteString(output.Bold(fmt.Sprintf("%s Errors:\n", name))) - - if strings.Contains(err.Error(), "invalid argument count, too few arguments") { - out.WriteString(output.Red( - "Deploying a contract failed because it requires initialization arguments. We currently don't support passing initialization arguments, so we suggest you hardcode the initialization arguments in the init function to be used during development.\n\n", - )) - continue - } - - // remove transaction error as it confuses developer, the only important part is the actual code - removeDeployOuput := regexp.MustCompile(`(?s)(failed to deploy.*contracts\.add[^\n]*\n[^\n]*\n\nerror: )`) - out.WriteString(output.Red(removeDeployOuput.ReplaceAllString(err.Error(), ""))) - } - return out.String() - } - - return err.Error() -} - -func helpBanner() string { - var out bytes.Buffer - out.WriteString(output.Italic("The development environment will watch your Cadence files and automatically keep your project updated on the emulator.\n")) - out.WriteString(output.Italic("Please add your contracts in the contracts folder. Read more about it here: https://developers.flow.com/tools/flow-cli/super-commands\n")) - out.WriteString(output.Italic("Be aware that resources stored in accounts might no longer be valid after contract code changes.\n\n")) - return out.String() -} - -func okBanner() string { - return output.Bold( - fmt.Sprintf("%s Project synced [%s]\n", output.Green("OK"), time.Now().Format("15:04:05")), - ) -} - -func errorBanner() string { - return output.Bold( - fmt.Sprintf("%s Project error [%s]\n", output.Red("ERR"), time.Now().Format("15:04:05")), - ) -} - -func clearScreen() { - cmd := sysExec.Command("clear") - cmd.Stdout = os.Stdout - _ = cmd.Run() -} diff --git a/internal/super/project.go b/internal/super/project.go deleted file mode 100644 index d8729fd51..000000000 --- a/internal/super/project.go +++ /dev/null @@ -1,347 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "context" - - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/pkg/errors" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/accounts" - "github.com/onflow/flow-cli/flowkit/config" - flowkitProject "github.com/onflow/flow-cli/flowkit/project" - "github.com/onflow/flow-cli/internal/util" -) - -var emulator = config.EmulatorNetwork.Name - -const defaultAccount = "default" - -func newProject( - serviceAccount accounts.Account, - flow flowkit.Services, - state *flowkit.State, - files *projectFiles, -) (*project, error) { - proj := &project{ - service: &serviceAccount, - flow: flow, - state: state, - projectFiles: files, - pathNameLookup: make(map[string]string), - } - - if err := proj.projectFiles.exist(); err != nil { - return nil, err - } - - return proj, nil -} - -type project struct { - service *accounts.Account - flow flowkit.Services - state *flowkit.State - projectFiles *projectFiles - pathNameLookup map[string]string -} - -// startup cleans the state and then rebuilds it from the current folder state. -func (p *project) startup() error { - deployments, err := p.projectFiles.deployments() - if err != nil { - return err - } - - p.cleanState() - err = p.addAccount(defaultAccount) - if err != nil { - return err - } - - for accName, contracts := range deployments { - if accName == "" { // default to emulator account - accName = defaultAccount - } - - err := p.addAccount(accName) - if err != nil { - return err - } - - p.state.Deployments().AddOrUpdate(config.Deployment{ - Network: emulator, - Account: accName, - }) - for _, path := range contracts { - err := p.addContract(path, accName) - if err != nil { - return err - } - } - } - - p.deploy() - - return p.state.SaveDefault() -} - -// deploys all the contracts found in the state configuration. -func (p *project) deploy() { - deployed, err := p.flow.DeployProject(context.Background(), flowkit.UpdateExistingContract(true)) - printDeployment(deployed, err, p.pathNameLookup) -} - -// cleanState of existing contracts, deployments and non-service accounts as we will build it again. -func (p *project) cleanState() { - contracts := make(config.Contracts, len(*p.state.Contracts())) - copy(contracts, *p.state.Contracts()) // we need to make a copy otherwise when we remove order shifts - for _, c := range contracts { - if c.IsAliased() { - continue // don't remove aliased contracts - } - - _ = p.state.Contracts().Remove(c.Name) - } - - accs := make([]accounts.Account, len(*p.state.Accounts())) - copy(accs, *p.state.Accounts()) // we need to make a copy otherwise when we remove order shifts - for _, a := range accs { - chain, err := util.GetAddressNetwork(a.Address) - if err != nil || chain != flow.Emulator { - continue // don't remove non-emulator accounts - } - - if a.Name == config.DefaultEmulator.ServiceAccount { - continue - } - - // If account is not in state.Deployments, don't remove it since it's a user created account - // Otherwise, let it be regenerated by "flow dev" command - if p.state.Deployments().ByAccountAndNetwork(a.Name, emulator) == nil { - continue - } - - _ = p.state.Deployments().Remove(a.Name, emulator) - _ = p.state.Accounts().Remove(a.Name) - } -} - -// watch project files and update the state accordingly. -func (p *project) watch() error { - accountChanges, contractChanges, err := p.projectFiles.watch() - if err != nil { - return errors.Wrap(err, "error watching files") - } - - for { - select { - case account := <-accountChanges: - if account.status == created { - err = p.addAccount(account.name) - } - if account.status == removed { - err = p.removeAccount(account.name) - } - if err != nil { - return errors.Wrap(err, "failed updating accounts") - } - case contract := <-contractChanges: - if contract.account == "" { - contract.account = defaultAccount - } - - switch contract.status { - case created: - _ = p.addContract(contract.path, contract.account) - case changed: - // Remove contract before updating - // This is so one can develop without having to restart the emulator when hitting contract upgrade issues - // See: https://developers.flow.com/cadence/language/contract-updatability - err = p.removeContract(contract.path, contract.account) - if err != nil { - return err - } - _ = p.addContract(contract.path, contract.account) - case renamed: - p.renameContract(contract.oldPath, contract.path) - case removed: - // TODO(sideninja) what if contract contains invalid code and then we want to remove it - err = p.removeContract(contract.path, contract.account) - if err != nil { - return err - } - } - - p.deploy() - } - - err = p.state.SaveDefault() - if err != nil { - return errors.Wrap(err, "failed saving configuration") - } - } -} - -// addAccount to the state and create it on the network. -func (p *project) addAccount(name string) error { - privateKey, err := p.service.Key.PrivateKey() - if err != nil { - return err - } - - pubKey := (*privateKey).PublicKey() - - // create the account on the network and set the address - flowAcc, _, err := p.flow.CreateAccount( - context.Background(), - p.service, - []accounts.PublicKey{{ - Public: pubKey, - Weight: flow.AccountKeyWeightThreshold, - SigAlgo: crypto.ECDSA_P256, - HashAlgo: crypto.SHA3_256, - }}, - ) - if err != nil { - return err - } - - p.state.Accounts().AddOrUpdate(&accounts.Account{ - Name: name, - Address: flowAcc.Address, - Key: accounts.NewHexKeyFromPrivateKey(0, crypto.SHA3_256, *privateKey), - }) - p.state.Deployments().AddOrUpdate(config.Deployment{ // init empty deployment - Network: emulator, - Account: name, - }) - return nil -} - -func (p *project) removeAccount(name string) error { - _ = p.state.Deployments().Remove(name, emulator) - return p.state.Accounts().Remove(name) -} - -// contractName extracts contract name from the source code. -func (p *project) contractName(path string) (string, error) { - if name, ok := p.pathNameLookup[path]; ok { - return name, nil - } - - // TODO(sideninja) add a warning if the name of the file is not matching the name of the contract - content, err := p.state.ReadFile(path) - if err != nil { - return "", errors.Wrap(err, "could not load contract to get the name") - } - - program, err := flowkitProject.NewProgram(content, nil, path) - if err != nil { - return "", err - } - - name, err := program.Name() - if err != nil { - return "", err - } - - p.pathNameLookup[path] = name - - return name, nil -} - -// addContract to the state configuration as a contract and as a deployment. -func (p *project) addContract( - path string, - account string, -) error { - name, err := p.contractName(path) - if err != nil { - return err - } - - contract := config.Contract{ - Name: name, - Location: path, - } - - existing, _ := p.state.Contracts().ByName(name) - if existing != nil { // make sure alises are persisted even if location changes - contract.Aliases = existing.Aliases - } - - if contract.Aliases.ByNetwork(emulator) == nil { // only add if not existing emulator alias - p.state.Deployments(). - ByAccountAndNetwork(account, emulator). - AddContract(config.ContractDeployment{ - Name: contract.Name, - }) - } - - p.state.Contracts().AddOrUpdate(contract) - return nil -} - -// removeContract from state configuration. -func (p *project) removeContract( - path string, - accountName string, -) error { - name, err := p.contractName(path) - if err != nil { - return errors.Wrap(err, "failed to remove contract") - } - - if accountName == "" { - accountName = defaultAccount - } - - if p.state.Deployments().ByAccountAndNetwork(accountName, emulator) != nil { - p.state.Deployments(). - ByAccountAndNetwork(accountName, emulator). - RemoveContract(name) // we might delete account first - _ = p.state.Contracts().Remove(name) - - acc, err := p.state.Accounts().ByName(accountName) - if err != nil { - return err - } - - _, err = p.flow.RemoveContract(context.Background(), acc, name) - if err != nil { - return err - } - } - - return nil -} - -// renameContract and update the location in the state -func (p *project) renameContract(oldLocation string, newLocation string) { - for _, c := range *p.state.Contracts() { - if c.Location == oldLocation { - c.Location = newLocation - p.state.Contracts().AddOrUpdate(c) - } - } -} diff --git a/internal/super/setup.go b/internal/super/setup.go deleted file mode 100644 index fd25a1841..000000000 --- a/internal/super/setup.go +++ /dev/null @@ -1,256 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package super - -import ( - "bytes" - "encoding/json" - "fmt" - "io" - "net/http" - "os" - "path/filepath" - "time" - - "github.com/go-git/go-git/v5" - "github.com/go-git/go-git/v5/plumbing" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsSetup struct { - Scaffold bool `default:"" flag:"scaffold" info:"Interactively select a provided scaffold for project creation"` - ScaffoldID int `default:"" flag:"scaffold-id" info:"Use provided scaffold ID for project creation"` -} - -var setupFlags = flagsSetup{} - -var SetupCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "setup ", - Short: "Start a new Flow project", - Example: "flow setup my-project", - Args: cobra.ExactArgs(1), - GroupID: "super", - }, - Flags: &setupFlags, - Run: create, -} - -const scaffoldListURL = "https://raw.githubusercontent.com/onflow/flow-cli/master/scaffolds.json" - -type scaffold struct { - Repo string `json:"repo"` - Branch string `json:"branch"` - Name string `json:"name"` - Description string `json:"description"` - Commit string `json:"commit"` - Folder string `json:"folder"` - Type string `json:"type"` -} - -func create( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - targetDir, err := getTargetDirectory(args[0]) - if err != nil { - return nil, err - } - - scaffolds, err := getScaffolds() - if err != nil { - return nil, err - } - - // default to first scaffold - basic scaffold - pickedScaffold := scaffolds[0] - - if setupFlags.ScaffoldID != 0 { - if setupFlags.ScaffoldID > len(scaffolds) { - return nil, fmt.Errorf("scaffold with id %d does not exist", setupFlags.ScaffoldID) - } - pickedScaffold = scaffolds[setupFlags.ScaffoldID-1] - } - - if setupFlags.Scaffold { - scaffoldItems := make([]util.ScaffoldItem, 0) - for i, s := range scaffolds { - scaffoldItems = append( - scaffoldItems, - util.ScaffoldItem{ - Index: i, - Title: fmt.Sprintf("%s - %s", output.Bold(s.Name), s.Description), - Category: s.Type, - }, - ) - } - - selected := util.ScaffoldPrompt(logger, scaffoldItems) - pickedScaffold = scaffolds[selected] - } - - logger.StartProgress(fmt.Sprintf("Creating your project %s", targetDir)) - defer logger.StopProgress() - err = cloneScaffold(targetDir, pickedScaffold) - if err != nil { - return nil, fmt.Errorf("failed creating scaffold %w", err) - } - - return &setupResult{targetDir: targetDir}, nil -} - -func getTargetDirectory(directory string) (string, error) { - pwd, err := os.Getwd() - if err != nil { - return "", err - } - - target := filepath.Join(pwd, directory) - info, err := os.Stat(target) - if !os.IsNotExist(err) { - if !info.IsDir() { - return "", fmt.Errorf("%s is a file", target) - } - - file, err := os.Open(target) - if err != nil { - return "", err - } - defer file.Close() - - _, err = file.Readdirnames(1) - if err != io.EOF { - return "", fmt.Errorf("directory is not empty: %s", target) - } - } - return target, nil -} - -func getScaffolds() ([]scaffold, error) { - httpClient := http.Client{ - Timeout: time.Second * 5, - } - - req, err := http.NewRequest(http.MethodGet, scaffoldListURL, nil) - if err != nil { - return nil, fmt.Errorf("failed creating request for scaffold list: %w", err) - } - - res, err := httpClient.Do(req) - if err != nil { - return nil, fmt.Errorf("failed requesting scaffold list: %w", err) - } - if res.Body != nil { - defer res.Body.Close() - } - - body, err := io.ReadAll(res.Body) - if err != nil { - return nil, fmt.Errorf("failed reading scaffold list response: %w", err) - } - - var all []scaffold - err = json.Unmarshal(body, &all) - if err != nil { - return nil, fmt.Errorf("failed parsing scaffold list response: %w", err) - } - - valid := make([]scaffold, 0) - for _, s := range all { - if s.Repo != "" && s.Description != "" && s.Name != "" && s.Commit != "" { - valid = append(valid, s) - } - } - - return valid, nil -} - -func cloneScaffold(targetDir string, conf scaffold) error { - repo, err := git.PlainClone(targetDir, false, &git.CloneOptions{ - URL: conf.Repo, - }) - if err != nil { - return fmt.Errorf("could not download the scaffold: %w", err) - } - - worktree, _ := repo.Worktree() - err = worktree.Checkout(&git.CheckoutOptions{ - Hash: plumbing.NewHash(conf.Commit), - Force: true, - }) - if err != nil { - return fmt.Errorf("could not find the scaffold version") - } - - // if we defined a folder remove everything else - if conf.Folder != "" { - err = os.Rename( - filepath.Join(targetDir, conf.Folder), - filepath.Join(targetDir, "../scaffold-temp"), - ) - if err != nil { - return err - } - - if err = os.RemoveAll(targetDir); err != nil { - return err - } - - if err = os.Rename(filepath.Join(targetDir, "../scaffold-temp"), targetDir); err != nil { - return err - } - } - - return os.RemoveAll(filepath.Join(targetDir, ".git")) -} - -type setupResult struct { - targetDir string -} - -func (s *setupResult) String() string { - wd, _ := os.Getwd() - relDir, _ := filepath.Rel(wd, s.targetDir) - out := bytes.Buffer{} - - out.WriteString(fmt.Sprintf("%s Congrats! your project was created.\n\n", output.SuccessEmoji())) - out.WriteString("Start development by following these steps:\n") - out.WriteString(fmt.Sprintf("1. '%s' to change to your new project,\n", output.Bold(fmt.Sprintf("cd %s", relDir)))) - out.WriteString(fmt.Sprintf("2. '%s' or run Flowser to start the emulator,\n", output.Bold("flow emulator"))) - out.WriteString(fmt.Sprintf("3. '%s' to start developing.\n\n", output.Bold("flow dev"))) - out.WriteString(fmt.Sprintf("You should also read README.md to learn more about the development process!\n")) - - return out.String() -} - -func (s *setupResult) Oneliner() string { - return fmt.Sprintf("Project created inside %s", s.targetDir) -} - -func (s *setupResult) JSON() any { - return nil -} diff --git a/internal/test/test.go b/internal/test/test.go deleted file mode 100644 index 84d96cb6c..000000000 --- a/internal/test/test.go +++ /dev/null @@ -1,377 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2022 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package test - -import ( - "bytes" - "encoding/json" - "fmt" - "math/rand" - "os" - "path/filepath" - "strings" - - cdcTests "github.com/onflow/cadence-tools/test" - "github.com/onflow/cadence/runtime" - "github.com/onflow/cadence/runtime/common" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -// The key where meta information for a test report in JSON -// format can be found. -const TestReportMetaKey = "meta" - -// The key where coverage meta information for a test report -// in JSON format can be found. -const TestReportCoverageKey = "coverage" - -// The key where seed meta information for a test report -// in JSON format can be found. -const TestReportSeedKey = "seed" - -// Import statements with a path that contain this substring, -// are considered to be helper/utility scripts for test files. -const helperScriptSubstr = "_helper" - -// When the value of flagsTests.CoverCode equals "contracts", -// scripts and transactions are excluded from coverage report. -const contractsCoverCode = "contracts" - -type flagsTests struct { - Cover bool `default:"false" flag:"cover" info:"Use the cover flag to calculate coverage report"` - CoverProfile string `default:"coverage.json" flag:"coverprofile" info:"Filename to write the calculated coverage report. Supported extensions are .json and .lcov"` - CoverCode string `default:"all" flag:"covercode" info:"Use the covercode flag to calculate coverage report only for certain types of code. Available values are \"all\" & \"contracts\""` - Random bool `default:"false" flag:"random" info:"Use the random flag to execute test cases randomly"` - Seed int64 `default:"0" flag:"seed" info:"Use the seed flag to manipulate random execution of test cases"` - Name string `default:"" flag:"name" info:"Use the name flag to run only tests that match the given name"` -} - -var testFlags = flagsTests{} - -var status = 0 - -var TestCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "test ", - Short: "Run Cadence tests", - Example: `flow test script.cdc`, - Args: cobra.MinimumNArgs(1), - GroupID: "tools", - }, - Flags: &testFlags, - RunS: run, - Status: &status, -} - -func run( - args []string, - _ command.GlobalFlags, - logger output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - if !testFlags.Cover && testFlags.CoverProfile != "coverage.json" { - return nil, fmt.Errorf("the '--coverprofile' flag requires the '--cover' flag") - } - if testFlags.Random && testFlags.Seed > 0 { - fmt.Printf( - "%s Both '--seed' and '--random' flags are used. Hence, the '--random' flag will be ignored.\n", - output.WarningEmoji(), - ) - } - - testFiles := make(map[string][]byte, 0) - for _, filename := range args { - code, err := state.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading script file: %w", err) - } - - testFiles[filename] = code - } - - result, err := testCode(testFiles, state, testFlags) - if err != nil { - return nil, err - } - - if result.CoverageReport != nil { - var file []byte - var err error - - ext := filepath.Ext(testFlags.CoverProfile) - if ext == ".json" { - file, err = json.MarshalIndent(result.CoverageReport, "", " ") - } else if ext == ".lcov" { - file, err = result.CoverageReport.MarshalLCOV() - } else { - return nil, fmt.Errorf("given format: %v, only .json and .lcov are supported", ext) - } - - if err != nil { - return nil, fmt.Errorf("error serializing coverage report: %w", err) - } - - err = os.WriteFile(testFlags.CoverProfile, file, 0644) - if err != nil { - return nil, fmt.Errorf("error writing coverage report file: %w", err) - } - } - - return result, nil -} - -func testCode( - testFiles map[string][]byte, - state *flowkit.State, - flags flagsTests, -) (*result, error) { - runner := cdcTests.NewTestRunner() - - var coverageReport *runtime.CoverageReport - if flags.Cover { - coverageReport = state.CreateCoverageReport("testing") - if flags.CoverCode == contractsCoverCode { - coverageReport.WithLocationFilter( - func(location common.Location) bool { - _, addressLoc := location.(common.AddressLocation) - // We only allow inspection of AddressLocation, - // since scripts and transactions cannot be - // attributed to their source files anyway. - return addressLoc - }, - ) - } - runner = runner.WithCoverageReport(coverageReport) - } - - var seed int64 - if flags.Seed > 0 { - seed = flags.Seed - runner = runner.WithRandomSeed(seed) - } else if flags.Random { - seed = int64(rand.Intn(150000)) - runner = runner.WithRandomSeed(seed) - } - - contractsConfig := *state.Contracts() - contracts := make(map[string]common.Address, len(contractsConfig)) - for _, contract := range contractsConfig { - alias := contract.Aliases.ByNetwork("testing") - if alias != nil { - contracts[contract.Name] = common.Address(alias.Address) - } - } - - testResults := make(map[string]cdcTests.Results, 0) - for scriptPath, code := range testFiles { - runner := runner. - WithImportResolver(importResolver(scriptPath, state)). - WithFileResolver(fileResolver(scriptPath, state)). - WithContracts(contracts) - - if flags.Name != "" { - testFunctions, err := runner.GetTests(string(code)) - if err != nil { - return nil, err - } - - for _, testFunction := range testFunctions { - if testFunction != flags.Name { - continue - } - - result, err := runner.RunTest(string(code), flags.Name) - if err != nil { - return nil, err - } - testResults[scriptPath] = []cdcTests.Result{*result} - } - } else { - results, err := runner.RunTests(string(code)) - if err != nil { - return nil, err - } - testResults[scriptPath] = results - } - - for _, result := range testResults[scriptPath] { - if result.Error != nil { - status = 1 - break - } - } - } - - return &result{ - Results: testResults, - CoverageReport: coverageReport, - RandomSeed: seed, - }, nil -} - -func importResolver(scriptPath string, state *flowkit.State) cdcTests.ImportResolver { - contracts := make(map[string]config.Contract, 0) - for _, contract := range *state.Contracts() { - contracts[contract.Name] = contract - } - - return func(location common.Location) (string, error) { - contract := config.Contract{} - - switch location := location.(type) { - case common.AddressLocation: - contract = contracts[location.Name] - - case common.StringLocation: - relativePath := location.String() - - if strings.Contains(relativePath, helperScriptSubstr) { - importedScriptFilePath := absolutePath(scriptPath, relativePath) - scriptCode, err := state.ReadFile(importedScriptFilePath) - if err != nil { - return "", nil - } - return string(scriptCode), nil - } - - contract = contracts[relativePath] - } - - if contract.Location == "" { - return "", fmt.Errorf( - "cannot find contract with location '%s' in configuration", - location, - ) - } - - contractCode, err := state.ReadFile(contract.Location) - if err != nil { - return "", err - } - - return string(contractCode), nil - } -} - -func fileResolver(scriptPath string, state *flowkit.State) cdcTests.FileResolver { - return func(path string) (string, error) { - importFilePath := absolutePath(scriptPath, path) - - content, err := state.ReadFile(importFilePath) - if err != nil { - return "", err - } - - return string(content), nil - } -} - -func absolutePath(basePath, filePath string) string { - if filepath.IsAbs(filePath) { - return filePath - } - - return filepath.Join(filepath.Dir(basePath), filePath) -} - -type result struct { - Results map[string]cdcTests.Results - CoverageReport *runtime.CoverageReport - RandomSeed int64 -} - -var _ command.Result = &result{} - -func (r *result) JSON() any { - results := make(map[string]map[string]string, len(r.Results)) - - for testFile, testResult := range r.Results { - testFileResults := make(map[string]string, len(testResult)) - for _, result := range testResult { - var status string - if result.Error == nil { - status = "PASS" - } else { - status = fmt.Sprintf("FAIL: %s", result.Error.Error()) - } - testFileResults[result.TestName] = status - } - results[testFile] = testFileResults - } - - meta := map[string]string{} - if r.CoverageReport != nil { - meta[TestReportCoverageKey] = r.CoverageReport.Percentage() - } - if r.RandomSeed > 0 { - meta[TestReportSeedKey] = fmt.Sprint(r.RandomSeed) - } - results[TestReportMetaKey] = meta - - return results -} - -func (r *result) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - - for scriptPath, testResult := range r.Results { - _, _ = fmt.Fprint(writer, cdcTests.PrettyPrintResults(testResult, scriptPath)) - } - if r.CoverageReport != nil { - _, _ = fmt.Fprint(writer, r.CoverageReport.String()) - } - if r.RandomSeed > 0 { - _, _ = fmt.Fprintf(writer, "\nSeed: %d", r.RandomSeed) - } - - _ = writer.Flush() - - return b.String() -} - -func (r *result) Oneliner() string { - var builder strings.Builder - - if len(r.Results) == 0 { - builder.WriteString("No tests found") - return builder.String() - } - - for scriptPath, testResult := range r.Results { - builder.WriteString(cdcTests.PrettyPrintResults(testResult, scriptPath)) - } - if r.CoverageReport != nil { - builder.WriteString(r.CoverageReport.String()) - builder.WriteString("\n") - } - if r.RandomSeed > 0 { - builder.WriteString(fmt.Sprintf("Seed: %d", r.RandomSeed)) - builder.WriteString("\n") - } - - return builder.String() -} diff --git a/internal/test/test_test.go b/internal/test/test_test.go deleted file mode 100644 index 0f61be418..000000000 --- a/internal/test/test_test.go +++ /dev/null @@ -1,695 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2022 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package test - -import ( - "encoding/json" - "fmt" - "os" - "testing" - - "github.com/onflow/cadence/runtime/common" - "github.com/onflow/cadence/runtime/stdlib" - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" - - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/internal/util" -) - -func TestExecutingTests(t *testing.T) { - t.Parallel() - - aliases := config.Aliases{{ - Network: "testing", - Address: flow.HexToAddress("0x0000000000000007"), - }} - - t.Run("simple", func(t *testing.T) { - t.Parallel() - - _, state, _ := util.TestMocks(t) - - script := tests.TestScriptSimple - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - }) - - t.Run("simple failing", func(t *testing.T) { - t.Parallel() - - _, state, _ := util.TestMocks(t) - - script := tests.TestScriptSimpleFailing - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - - err = result.Results[script.Filename][0].Error - require.Error(t, err) - assert.ErrorAs(t, err, &stdlib.AssertionError{}) - }) - - t.Run("with import", func(t *testing.T) { - t.Parallel() - - _, state, _ := util.TestMocks(t) - - c := config.Contract{ - Name: tests.ContractHelloString.Name, - Location: tests.ContractHelloString.Filename, - Aliases: aliases, - } - state.Contracts().AddOrUpdate(c) - - // Execute script - script := tests.TestScriptWithImport - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - }) - - t.Run("with relative imports", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - readerWriter := state.ReaderWriter() - _ = readerWriter.WriteFile( - "../contracts/contractHello.cdc", - tests.ContractHelloString.Source, - os.ModeTemporary, - ) - _ = readerWriter.WriteFile( - "../contracts/FooContract.cdc", - tests.ContractFooCoverage.Source, - os.ModeTemporary, - ) - - contractHello := config.Contract{ - Name: tests.ContractHelloString.Name, - Location: tests.ContractHelloString.Filename, - Aliases: aliases, - } - state.Contracts().AddOrUpdate(contractHello) - contractFoo := config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - } - state.Contracts().AddOrUpdate(contractFoo) - - // Execute script - script := tests.TestScriptWithRelativeImports - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - }) - - t.Run("with helper script import", func(t *testing.T) { - t.Parallel() - - _, state, _ := util.TestMocks(t) - - // Execute script - script := tests.TestScriptWithHelperImport - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - }) - - t.Run("with missing contract in config", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - // Execute script - script := tests.TestScriptWithMissingContract - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - _, err := testCode(testFiles, state, flagsTests{}) - - require.Error(t, err) - assert.ErrorContains( - t, - err, - "cannot find contract with location 'ApprovalVoting' in configuration", - ) - }) - - t.Run("with missing testing alias in config", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - c := config.Contract{ - Name: tests.ContractHelloString.Name, - Location: tests.ContractHelloString.Filename, - Aliases: config.Aliases{{ - Network: "emulator", - Address: flow.HexToAddress("0x0000000000000007"), - }}, - } - state.Contracts().AddOrUpdate(c) - - // Execute script - script := tests.TestScriptWithImport - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - _, err := testCode(testFiles, state, flagsTests{}) - - require.Error(t, err) - assert.ErrorContains( - t, - err, - "could not find the address of contract: Hello", - ) - }) - - t.Run("without testing alias for common contracts", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - c := config.Contract{ - Name: tests.ContractHelloString.Name, - Location: tests.ContractHelloString.Filename, - Aliases: aliases, - } - state.Contracts().AddOrUpdate(c) - // fungibleToken has no `testing` alias, but it is not - // actually deployed/used, so there is no errror. - fungibleToken := config.Contract{ - Name: "FungibleToken", - Location: "cadence/contracts/FungibleToken.cdc", - } - state.Contracts().AddOrUpdate(fungibleToken) - - // Execute script - script := tests.TestScriptWithImport - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - _, err := testCode(testFiles, state, flagsTests{}) - - assert.NoError(t, err) - }) - - t.Run("with file read", func(t *testing.T) { - t.Parallel() - - _, state, rw := util.TestMocks(t) - - _ = rw.WriteFile( - tests.SomeFile.Filename, - tests.SomeFile.Source, - os.ModeTemporary, - ) - - // Execute script - script := tests.TestScriptWithFileRead - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - result, err := testCode(testFiles, state, flagsTests{}) - - require.NoError(t, err) - require.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - }) - - t.Run("with code coverage", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - state.Contracts().AddOrUpdate(config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - }) - - // Execute script - script := tests.TestScriptWithCoverage - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Cover: true, - } - result, err := testCode(testFiles, state, flags) - - require.NoError(t, err) - require.Len(t, result.Results[script.Filename], 2) - for _, result := range result.Results[script.Filename] { - assert.NoError(t, result.Error) - } - - coverageReport := result.CoverageReport - location := common.AddressLocation{ - Name: "FooContract", - Address: common.Address{0, 0, 0, 0, 0, 0, 0, 7}, - } - coverage := coverageReport.Coverage[location] - - assert.Equal(t, []int{}, coverage.MissedLines()) - assert.Equal(t, 15, coverage.Statements) - assert.Equal(t, "100.0%", coverage.Percentage()) - assert.EqualValues( - t, - map[int]int{ - 6: 1, 14: 1, 18: 10, 19: 1, 20: 9, 21: 1, 22: 8, 23: 1, - 24: 7, 25: 1, 26: 6, 27: 1, 30: 5, 31: 4, 34: 1, - }, - coverage.LineHits, - ) - - assert.True(t, coverageReport.TotalLocations() > 1) - assert.ElementsMatch( - t, - []string{ - "s.7465737400000000000000000000000000000000000000000000000000000000", - "I.Crypto", - "I.Test", - "A.0000000000000001.NodeVersionBeacon", - "A.0000000000000001.FlowServiceAccount", - "A.0000000000000002.FungibleToken", - "A.0000000000000001.FlowClusterQC", - "A.0000000000000001.FlowDKG", - "A.0000000000000002.FungibleTokenMetadataViews", - "A.0000000000000001.NFTStorefrontV2", - "A.0000000000000001.FlowIDTableStaking", - "A.0000000000000001.LockedTokens", - "A.0000000000000001.ExampleNFT", - "A.0000000000000001.NFTStorefront", - "A.0000000000000001.FlowStakingCollection", - "A.0000000000000001.StakingProxy", - "A.0000000000000003.FlowToken", - "A.0000000000000001.FlowEpoch", - "A.0000000000000001.FlowStorageFees", - "A.0000000000000004.FlowFees", - "A.0000000000000001.MetadataViews", - "A.0000000000000001.NonFungibleToken", - "A.0000000000000001.ViewResolver", - "A.0000000000000001.RandomBeaconHistory", - "I.BlockchainHelpers", - }, - coverageReport.ExcludedLocationIDs(), - ) - assert.Equal( - t, - "Coverage: 91.8% of statements", - coverageReport.String(), - ) - assert.Contains( - t, - result.String(), - "Coverage: 91.8% of statements", - ) - - lcovReport, _ := coverageReport.MarshalLCOV() - assert.Contains(t, string(lcovReport), "TN:\nSF:FooContract.cdc\n") - - jsonReport, _ := coverageReport.MarshalJSON() - assert.Contains(t, string(jsonReport), `{"coverage":{"FooContract.cdc":{`) - }) - - t.Run("with code coverage for contracts only", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - state.Contracts().AddOrUpdate(config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - }) - - // Execute script - script := tests.TestScriptWithCoverage - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Cover: true, - CoverCode: contractsCoverCode, - } - result, err := testCode(testFiles, state, flags) - - require.NoError(t, err) - require.Len(t, result.Results[script.Filename], 2) - for _, result := range result.Results[script.Filename] { - assert.NoError(t, result.Error) - } - - coverageReport := result.CoverageReport - location := common.AddressLocation{ - Name: "FooContract", - Address: common.Address{0, 0, 0, 0, 0, 0, 0, 7}, - } - coverage := coverageReport.Coverage[location] - - assert.Equal(t, []int{}, coverage.MissedLines()) - assert.Equal(t, 15, coverage.Statements) - assert.Equal(t, "100.0%", coverage.Percentage()) - assert.EqualValues( - t, - map[int]int{ - 6: 1, 14: 1, 18: 10, 19: 1, 20: 9, 21: 1, 22: 8, 23: 1, - 24: 7, 25: 1, 26: 6, 27: 1, 30: 5, 31: 4, 34: 1, - }, - coverage.LineHits, - ) - - assert.Equal(t, 1, coverageReport.TotalLocations()) - assert.ElementsMatch( - t, - []string{ - "s.7465737400000000000000000000000000000000000000000000000000000000", - "I.Crypto", - "I.Test", - "A.0000000000000001.NodeVersionBeacon", - "A.0000000000000001.FlowServiceAccount", - "A.0000000000000002.FungibleToken", - "A.0000000000000001.FlowClusterQC", - "A.0000000000000001.FlowDKG", - "A.0000000000000002.FungibleTokenMetadataViews", - "A.0000000000000001.NFTStorefrontV2", - "A.0000000000000001.FlowIDTableStaking", - "A.0000000000000001.LockedTokens", - "A.0000000000000001.ExampleNFT", - "A.0000000000000001.NFTStorefront", - "A.0000000000000001.FlowStakingCollection", - "A.0000000000000001.StakingProxy", - "A.0000000000000003.FlowToken", - "A.0000000000000001.FlowEpoch", - "A.0000000000000001.FlowStorageFees", - "A.0000000000000004.FlowFees", - "A.0000000000000001.MetadataViews", - "A.0000000000000001.NonFungibleToken", - "A.0000000000000001.ViewResolver", - "A.0000000000000001.RandomBeaconHistory", - "I.BlockchainHelpers", - }, - coverageReport.ExcludedLocationIDs(), - ) - assert.Equal( - t, - "Coverage: 100.0% of statements", - coverageReport.String(), - ) - assert.Contains( - t, - result.String(), - "Coverage: 100.0% of statements", - ) - - lcovReport, _ := coverageReport.MarshalLCOV() - assert.Contains(t, string(lcovReport), "TN:\nSF:FooContract.cdc\n") - - jsonReport, _ := coverageReport.MarshalJSON() - assert.Contains(t, string(jsonReport), `{"coverage":{"FooContract.cdc":{`) - }) - - t.Run("with random test case execution", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - state.Contracts().AddOrUpdate(config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - }) - - // Execute script - script := tests.TestScriptWithCoverage - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Random: true, - } - result, err := testCode(testFiles, state, flags) - - require.NoError(t, err) - require.Len(t, result.Results[script.Filename], 2) - for _, result := range result.Results[script.Filename] { - assert.NoError(t, result.Error) - } - - assert.Contains( - t, - result.String(), - fmt.Sprintf("Seed: %d", result.RandomSeed), - ) - }) - - t.Run("with input seed for test case execution", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - state.Contracts().AddOrUpdate(config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - }) - - // Execute script - script := tests.TestScriptWithCoverage - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Seed: 1521, - } - result, err := testCode(testFiles, state, flags) - - require.NoError(t, err) - require.Len(t, result.Results[script.Filename], 2) - for _, result := range result.Results[script.Filename] { - assert.NoError(t, result.Error) - } - - assert.Contains( - t, - result.String(), - fmt.Sprintf("Seed: %d", flags.Seed), - ) - - // Note that `testGetIntegerTrait` is the first test case, - // but it gets executed after `testAddSpecialNumber`, due - // to random test execution. - expected := `Test results: "testScriptWithCoverage.cdc" -- PASS: testAddSpecialNumber -- PASS: testGetIntegerTrait -Seed: 1521 -` - assert.Equal( - t, - expected, - result.Oneliner(), - ) - }) - - t.Run("with JSON output", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - state.Contracts().AddOrUpdate(config.Contract{ - Name: tests.ContractFooCoverage.Name, - Location: tests.ContractFooCoverage.Filename, - Aliases: aliases, - }) - - // Execute script - script := tests.TestScriptWithCoverage - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Seed: 1521, - Cover: true, - CoverCode: contractsCoverCode, - } - result, err := testCode(testFiles, state, flags) - - require.NoError(t, err) - require.Len(t, result.Results[script.Filename], 2) - for _, result := range result.Results[script.Filename] { - assert.NoError(t, result.Error) - } - - output, err := json.Marshal(result.JSON()) - require.NoError(t, err) - - expected := ` - { - "meta": { - "coverage": "100.0%", - "seed": "1521" - }, - "testScriptWithCoverage.cdc": { - "testGetIntegerTrait": "PASS", - "testAddSpecialNumber": "PASS" - } - } - ` - - assert.JSONEq( - t, - expected, - string(output), - ) - }) - - t.Run("run specific test case by name", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - // Execute script - script := tests.TestScriptSimple - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Name: "testSimple", - } - - result, err := testCode(testFiles, state, flags) - - assert.NoError(t, err) - assert.Len(t, result.Results, 1) - assert.NoError(t, result.Results[script.Filename][0].Error) - - expected := "Test results: \"./testScriptSimple.cdc\"\n- PASS: testSimple\n" - assert.Equal( - t, - expected, - result.Oneliner(), - ) - }) - - t.Run("run specific test case by name multiple files", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - scriptPassing := tests.TestScriptSimple - scriptFailing := tests.TestScriptSimpleFailing - - // Execute script - testFiles := map[string][]byte{ - scriptPassing.Filename: scriptPassing.Source, - scriptFailing.Filename: scriptFailing.Source, - } - flags := flagsTests{ - Name: "testSimple", - } - - result, err := testCode(testFiles, state, flags) - - assert.NoError(t, err) - assert.Len(t, result.Results, 2) - assert.NoError(t, result.Results[scriptPassing.Filename][0].Error) - assert.Error(t, result.Results[scriptFailing.Filename][0].Error) - assert.ErrorAs(t, result.Results[scriptFailing.Filename][0].Error, &stdlib.AssertionError{}) - - assert.Contains( - t, - result.Oneliner(), - "Test results: \"./testScriptSimple.cdc\"\n- PASS: testSimple", - ) - assert.Contains( - t, - result.Oneliner(), - "Test results: \"./testScriptSimpleFailing.cdc\"\n- FAIL: "+ - "testSimple\n\t\tExecution failed:\n\t\t\terror: assertion failed\n"+ - "\t\t\t --> 7465737400000000000000000000000000000000000000000000000000000000:5:12", - ) - }) - - t.Run("run specific test case by name will do nothing if not found", func(t *testing.T) { - t.Parallel() - - // Setup - _, state, _ := util.TestMocks(t) - - // Execute script - script := tests.TestScriptSimple - testFiles := map[string][]byte{ - script.Filename: script.Source, - } - flags := flagsTests{ - Name: "doesNotExist", - } - - result, err := testCode(testFiles, state, flags) - - assert.NoError(t, err) - assert.Len(t, result.Results, 0) - assert.Equal( - t, - "No tests found", - result.Oneliner(), - ) - }) -} diff --git a/internal/tools/flowser.go b/internal/tools/flowser.go deleted file mode 100644 index 5257bb8d6..000000000 --- a/internal/tools/flowser.go +++ /dev/null @@ -1,130 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package tools - -import ( - "fmt" - "os" - "runtime" - - "github.com/onflowser/flowser/v3/pkg/flowser" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/settings" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsFlowser struct{} - -var flowserFlags = flagsWallet{} - -var Flowser = &command.Command{ - Cmd: &cobra.Command{ - Use: "flowser", - Short: "Run Flowser project explorer", - Example: "flow flowser", - Args: cobra.ExactArgs(0), - GroupID: "tools", - }, - Flags: &flowserFlags, - Run: runFlowser, -} - -func runFlowser( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - reader flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - flowser := flowser.New() - - installPath, err := settings.GetFlowserPath() - if err != nil { - return nil, fmt.Errorf("failure reading setting: %w", err) - } - - if !flowser.Installed(installPath) { - installPath, err = installFlowser(flowser, installPath) - if err != nil { - return nil, err - } - } - - projectPath, err := os.Getwd() - if err != nil { - return nil, err - } - - // check if current directory is existing flow project if not then don't pass project path to Flowser, so user can choose a project - _, err = reader.ReadFile(config.DefaultPath) - if os.IsNotExist(err) { - projectPath = "" - } - - fmt.Printf("%s Starting up Flowser, please wait...\n", output.SuccessEmoji()) - err = flowser.Run(installPath, projectPath) - if err != nil { - return nil, err - } - - return nil, nil -} - -func installFlowser(flowser *flowser.App, installPath string) (string, error) { - fmt.Println("It looks like Flowser is not yet installed on your system.") - installChoice := util.InstallPrompt() - if installChoice == util.CancelInstall { - return "", fmt.Errorf("user denied install") - } - - // if user says it already installed it we only ask for path and return it - if installChoice == util.AlreadyInstalled { - installPath = util.InstallPathPrompt(installPath) - _ = settings.SetFlowserPath(installPath) - return installPath, nil - } - - // MacOS apps must always be installed inside Application folder - if runtime.GOOS != settings.Darwin { - installPath = util.InstallPathPrompt(installPath) - _ = settings.SetFlowserPath(installPath) - } - - logger := output.NewStdoutLogger(output.InfoLog) - logger.StartProgress(fmt.Sprintf("%s Installing Flowser, this may take few minutes, please wait ", output.TryEmoji())) - defer logger.StopProgress() - - // create all folders if they don't exist, does nothing if they exist - err := os.MkdirAll(installPath, os.ModePerm) - if err != nil { - return "", err - } - - err = flowser.Install(installPath) - if err != nil { - return "", fmt.Errorf("could not install Flowser: %w", err) - } - - return installPath, nil -} diff --git a/internal/tools/wallet.go b/internal/tools/wallet.go deleted file mode 100644 index 97a0762c7..000000000 --- a/internal/tools/wallet.go +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package tools - -import ( - "fmt" - "strings" - - devWallet "github.com/onflow/fcl-dev-wallet/go/wallet" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsWallet struct { - Port uint `default:"8701" flag:"port" info:"Dev wallet port to listen on"` - Host string `default:"http://localhost:8888" flag:"emulator-host" info:"Host for access node connection"` -} - -var walletFlags = flagsWallet{} - -var DevWallet = &command.Command{ - Cmd: &cobra.Command{ - Use: "dev-wallet", - Short: "Run a development wallet", - Example: "flow dev-wallet", - Args: cobra.ExactArgs(0), - GroupID: "tools", - }, - Flags: &walletFlags, - RunS: wallet, -} - -func wallet( - _ []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - service, err := state.EmulatorServiceAccount() - if err != nil { - return nil, err - } - - privateKey, err := service.Key.PrivateKey() - if err != nil { - return nil, err - } - - conf := devWallet.FlowConfig{ - Address: fmt.Sprintf("0x%s", service.Address.String()), - PrivateKey: strings.TrimPrefix((*privateKey).String(), "0x"), - PublicKey: strings.TrimPrefix((*privateKey).PublicKey().String(), "0x"), - AccessNode: walletFlags.Host, - } - - srv, err := devWallet.NewHTTPServer(walletFlags.Port, &conf) - if err != nil { - return nil, err - } - - fmt.Printf("%s Starting dev wallet server on port %d\n", output.SuccessEmoji(), walletFlags.Port) - fmt.Printf("%s Make sure the emulator is running\n", output.WarningEmoji()) - - srv.Start() - return nil, nil -} diff --git a/internal/transactions/build.go b/internal/transactions/build.go deleted file mode 100644 index 8ca2cf5a0..000000000 --- a/internal/transactions/build.go +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "context" - "fmt" - - "github.com/onflow/cadence" - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/arguments" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/transactions" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsBuild struct { - ArgsJSON string `default:"" flag:"args-json" info:"arguments in JSON-Cadence format"` - Proposer string `default:"emulator-account" flag:"proposer" info:"transaction proposer"` - ProposerKeyIndex int `default:"0" flag:"proposer-key-index" info:"proposer key index"` - Payer string `default:"emulator-account" flag:"payer" info:"transaction payer"` - Authorizer []string `default:"emulator-account" flag:"authorizer" info:"transaction authorizer"` - GasLimit uint64 `default:"1000" flag:"gas-limit" info:"transaction gas limit"` -} - -var buildFlags = flagsBuild{} - -var buildCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "build [ ...]", - Short: "Build an unsigned transaction", - Example: `flow transactions build ./transaction.cdc "Hello" --proposer alice --authorizer alice --payer bob`, - Args: cobra.MinimumNArgs(1), - }, - Flags: &buildFlags, - RunS: build, -} - -func build( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - proposer, err := getAddress(buildFlags.Proposer, state) - if err != nil { - return nil, err - } - - // get all authorizers - var authorizers []flowsdk.Address - for _, auth := range buildFlags.Authorizer { - addr, err := getAddress(auth, state) - if err != nil { - return nil, err - } - authorizers = append(authorizers, addr) - } - - payer, err := getAddress(buildFlags.Payer, state) - if err != nil { - return nil, err - } - - filename := args[0] - code, err := state.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading transaction file: %w", err) - } - - var transactionArgs []cadence.Value - if buildFlags.ArgsJSON != "" { - transactionArgs, err = arguments.ParseJSON(buildFlags.ArgsJSON) - } else { - transactionArgs, err = arguments.ParseWithoutType(args[1:], code, filename) - } - if err != nil { - return nil, fmt.Errorf("error parsing transaction arguments: %w", err) - } - - tx, err := flow.BuildTransaction( - context.Background(), - transactions.AddressesRoles{ - Proposer: proposer, - Authorizers: authorizers, - Payer: payer, - }, - buildFlags.ProposerKeyIndex, - flowkit.Script{ - Code: code, - Args: transactionArgs, - Location: filename, - }, - buildFlags.GasLimit, - ) - if err != nil { - return nil, err - } - - if !globalFlags.Yes && !util.ApproveTransactionForBuildingPrompt(tx.FlowTransaction()) { - return nil, fmt.Errorf("transaction was not approved") - } - - return &transactionResult{ - tx: tx.FlowTransaction(), - include: []string{"code", "payload", "signatures"}, - }, nil -} - -func getAddress(address string, state *flowkit.State) (flowsdk.Address, error) { - addr, valid := parseAddress(address) - if valid { - return addr, nil - } - - // if address is not valid then try using the string as an account name. - acc, err := state.Accounts().ByName(address) - if err != nil { - return flowsdk.EmptyAddress, err - } - return acc.Address, nil -} - -func parseAddress(value string) (flowsdk.Address, bool) { - address := flowsdk.HexToAddress(value) - - // valid on any chain - return address, address.IsValid(flowsdk.Mainnet) || - address.IsValid(flowsdk.Testnet) || - address.IsValid(flowsdk.Emulator) -} diff --git a/internal/transactions/decode.go b/internal/transactions/decode.go deleted file mode 100644 index fa809bf16..000000000 --- a/internal/transactions/decode.go +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "fmt" - - "github.com/onflow/flow-cli/flowkit/transactions" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsDecode struct { - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: signatures, code, payload."` -} - -var decodeFlags = flagsDecode{} - -var decodeCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "decode ", - Short: "Decode a transaction", - Example: "flow transactions decode ./transaction.rlp", - Args: cobra.ExactArgs(1), - }, - Flags: &decodeFlags, - Run: decode, -} - -func decode( - args []string, - _ command.GlobalFlags, - _ output.Logger, - reader flowkit.ReaderWriter, - _ flowkit.Services, -) (command.Result, error) { - filename := args[0] - payload, err := reader.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("failed to read transaction from %s: %v", filename, err) - } - - tx, err := transactions.NewFromPayload(payload) - if err != nil { - return nil, err - } - - return &transactionResult{ - tx: tx.FlowTransaction(), - include: decodeFlags.Include, - }, nil -} diff --git a/internal/transactions/get.go b/internal/transactions/get.go deleted file mode 100644 index d2379fc00..000000000 --- a/internal/transactions/get.go +++ /dev/null @@ -1,73 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "context" - "strings" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" -) - -type flagsGet struct { - Sealed bool `default:"true" flag:"sealed" info:"Wait for a sealed result"` - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: signatures, code, payload, fee-events."` - Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output. Valid values: events."` -} - -var getFlags = flagsGet{} - -var getCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "get ", - Aliases: []string{"status"}, - Short: "Get the transaction by ID", - Example: "flow transactions get 07a8...b433", - Args: cobra.ExactArgs(1), - }, - Flags: &getFlags, - Run: get, -} - -func get( - args []string, - _ command.GlobalFlags, - _ output.Logger, - _ flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - id := flowsdk.HexToID(strings.TrimPrefix(args[0], "0x")) - - tx, result, err := flow.GetTransactionByID(context.Background(), id, getFlags.Sealed) - if err != nil { - return nil, err - } - - return &transactionResult{ - result: result, - tx: tx, - include: getFlags.Include, - exclude: getFlags.Exclude, - }, nil -} diff --git a/internal/transactions/send-signed.go b/internal/transactions/send-signed.go deleted file mode 100644 index d39d84612..000000000 --- a/internal/transactions/send-signed.go +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "context" - "fmt" - - "github.com/onflow/flow-cli/flowkit/transactions" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsSendSigned struct { - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: signatures, code, payload."` - Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"` -} - -var sendSignedFlags = flagsSendSigned{} - -var sendSignedCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "send-signed ", - Short: "Send signed transaction", - Args: cobra.ExactArgs(1), - Example: `flow transactions send-signed signed.rlp`, - }, - Flags: &sendSignedFlags, - Run: sendSigned, -} - -func sendSigned( - args []string, - globalFlags command.GlobalFlags, - logger output.Logger, - reader flowkit.ReaderWriter, - flow flowkit.Services, -) (command.Result, error) { - filename := args[0] - - code, err := reader.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading transaction payload: %w", err) - } - - tx, err := transactions.NewFromPayload(code) - if err != nil { - return nil, err - } - - if !globalFlags.Yes && !util.ApproveTransactionForSendingPrompt(tx.FlowTransaction()) { - return nil, fmt.Errorf("transaction was not approved for sending") - } - - logger.StartProgress(fmt.Sprintf("Sending transaction with ID: %s", tx.FlowTransaction().ID())) - defer logger.StopProgress() - - sentTx, result, err := flow.SendSignedTransaction(context.Background(), tx) - if err != nil { - return nil, err - } - - return &transactionResult{ - result: result, - tx: sentTx, - include: sendSignedFlags.Include, - exclude: sendSignedFlags.Exclude, - }, nil -} diff --git a/internal/transactions/send.go b/internal/transactions/send.go deleted file mode 100644 index ac18309c7..000000000 --- a/internal/transactions/send.go +++ /dev/null @@ -1,161 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "context" - "fmt" - - "github.com/onflow/cadence" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/accounts" - "github.com/onflow/flow-cli/flowkit/arguments" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/transactions" - "github.com/onflow/flow-cli/internal/command" -) - -type Flags struct { - ArgsJSON string `default:"" flag:"args-json" info:"arguments in JSON-Cadence format"` - Signer string `default:"" flag:"signer" info:"Account name from configuration used to sign the transaction as proposer, payer and suthorizer"` - Proposer string `default:"" flag:"proposer" info:"Account name from configuration used as proposer"` - Payer string `default:"" flag:"payer" info:"Account name from configuration used as payer"` - Authorizers []string `default:"" flag:"authorizer" info:"Name of a single or multiple comma-separated accounts used as authorizers from configuration"` - Include []string `default:"" flag:"include" info:"Fields to include in the output"` - Exclude []string `default:"" flag:"exclude" info:"Fields to exclude from the output (events)"` - GasLimit uint64 `default:"1000" flag:"gas-limit" info:"transaction gas limit"` -} - -var flags = Flags{} - -var sendCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "send [ ...]", - Short: "Send a transaction", - Args: cobra.MinimumNArgs(1), - Example: `flow transactions send tx.cdc "Hello world"`, - }, - Flags: &flags, - RunS: send, -} - -func send( - args []string, - _ command.GlobalFlags, - _ output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (result command.Result, err error) { - filename := args[0] - - code, err := state.ReadFile(filename) - if err != nil { - return nil, fmt.Errorf("error loading transaction file: %w", err) - } - - return SendTransaction(code, args[1:], filename, flow, state, flags) -} - -func SendTransaction(code []byte, args []string, location string, flow flowkit.Services, state *flowkit.State, sendFlags Flags) (result command.Result, err error) { - proposerName := sendFlags.Proposer - var proposer *accounts.Account - if proposerName != "" { - proposer, err = state.Accounts().ByName(proposerName) - if err != nil { - return nil, fmt.Errorf("proposer account: [%s] doesn't exists in configuration", proposerName) - } - } - - payerName := sendFlags.Payer - var payer *accounts.Account - if payerName != "" { - payer, err = state.Accounts().ByName(payerName) - if err != nil { - return nil, fmt.Errorf("payer account: [%s] doesn't exists in configuration", payerName) - } - } - - var authorizers []accounts.Account - for _, authorizerName := range sendFlags.Authorizers { - authorizer, err := state.Accounts().ByName(authorizerName) - if err != nil { - return nil, fmt.Errorf("authorizer account: [%s] doesn't exists in configuration", authorizerName) - } - authorizers = append(authorizers, *authorizer) - } - - signerName := sendFlags.Signer - - if signerName == "" { - if proposer == nil && payer == nil && len(authorizers) == 0 { - signerName = state.Config().Emulators.Default().ServiceAccount - } else { - if proposer == nil || payer == nil { - return nil, fmt.Errorf("proposer/payer flags are required when signer flag is not used") - } - } - } - - if signerName != "" { - if proposer != nil || payer != nil || len(authorizers) > 0 { - return nil, fmt.Errorf("signer flag cannot be combined with payer/proposer/authorizer flags") - } - signer, err := state.Accounts().ByName(signerName) - if err != nil { - return nil, fmt.Errorf("signer account: [%s] doesn't exists in configuration", signerName) - } - proposer = signer - payer = signer - authorizers = append(authorizers, *signer) - } - - var transactionArgs []cadence.Value - if sendFlags.ArgsJSON != "" { - transactionArgs, err = arguments.ParseJSON(sendFlags.ArgsJSON) - } else { - transactionArgs, err = arguments.ParseWithoutType(args, code, location) - } - if err != nil { - return nil, fmt.Errorf("error parsing transaction arguments: %w", err) - } - - tx, txResult, err := flow.SendTransaction( - context.Background(), - transactions.AccountRoles{ - Proposer: *proposer, - Authorizers: authorizers, - Payer: *payer, - }, - flowkit.Script{Code: code, Args: transactionArgs, Location: location}, - sendFlags.GasLimit, - ) - - if err != nil { - return nil, err - } - - return &transactionResult{ - result: txResult, - tx: tx, - include: sendFlags.Include, - exclude: sendFlags.Exclude, - }, nil -} diff --git a/internal/transactions/sign.go b/internal/transactions/sign.go deleted file mode 100644 index bf3c25e99..000000000 --- a/internal/transactions/sign.go +++ /dev/null @@ -1,180 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "bytes" - "context" - "encoding/hex" - "fmt" - "io" - "net/http" - "sort" - - "github.com/onflow/flow-cli/flowkit/transactions" - - "github.com/onflow/flow-cli/flowkit/accounts" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -type flagsSign struct { - Signer []string `default:"emulator-account" flag:"signer" info:"name of a single or multiple comma-separated accounts used to sign"` - Include []string `default:"" flag:"include" info:"Fields to include in the output. Valid values: signatures, code, payload."` - FromRemoteUrl string `default:"" flag:"from-remote-url" info:"server URL where RLP can be fetched, signed RLP will be posted back to remote URL."` -} - -var signFlags = flagsSign{} - -var signCommand = &command.Command{ - Cmd: &cobra.Command{ - Use: "sign [ | --from-remote-url ]", - Short: "Sign built transaction", - Example: "flow transactions sign ./built.rlp --signer alice", - Args: cobra.MaximumNArgs(1), - }, - Flags: &signFlags, - RunS: sign, -} - -func sign( - args []string, - globalFlags command.GlobalFlags, - _ output.Logger, - flow flowkit.Services, - state *flowkit.State, -) (command.Result, error) { - var payload []byte - var err error - var filenameOrUrl string - - if signFlags.FromRemoteUrl != "" && len(args) > 0 { - return nil, fmt.Errorf("only use one, filename argument or --from-remote-url ") - } - - if signFlags.FromRemoteUrl != "" { - if globalFlags.Yes { - return nil, fmt.Errorf("--yes is not supported with this flag") - } - filenameOrUrl = signFlags.FromRemoteUrl - payload, err = getRLPTransaction(filenameOrUrl) - } else { - if len(args) == 0 { - return nil, fmt.Errorf("filename argument is required") - } - filenameOrUrl = args[0] - payload, err = state.ReadFile(filenameOrUrl) - } - - if err != nil { - return nil, fmt.Errorf("failed to read partial transaction from %s: %v", filenameOrUrl, err) - } - - var signed *transactions.Transaction - var signers []*accounts.Account - tx, err := transactions.NewFromPayload(payload) - if err != nil { - return nil, err - } - - // validate all signers - for _, signerName := range signFlags.Signer { - signer, err := state.Accounts().ByName(signerName) - if err != nil { - return nil, fmt.Errorf("signer account: [%s] doesn't exists in configuration", signerName) - } - signers = append(signers, signer) - } - - //payer signs last - sort.SliceStable(signers, func(i, j int) bool { - return signers[i].Address.String() != tx.FlowTransaction().Payer.Hex() - }) - - for _, signer := range signers { - if !globalFlags.Yes && !util.ApproveTransactionForSigningPrompt(tx.FlowTransaction()) { - return nil, fmt.Errorf("transaction was not approved for signing") - } - - signed, err = flow.SignTransactionPayload(context.Background(), signer, payload) - if err != nil { - return nil, err - } - - payload = []byte(hex.EncodeToString(signed.FlowTransaction().Encode())) - } - - if signFlags.FromRemoteUrl != "" { - tx := signed.FlowTransaction() - err = postRLPTransaction(filenameOrUrl, tx) - - if err != nil { - return nil, err - } - fmt.Printf("%s Signed RLP Posted successfully\n", output.SuccessEmoji()) - } - - return &transactionResult{ - tx: signed.FlowTransaction(), - include: signFlags.Include, - }, nil -} - -// getRLPTransaction payload from a remote server. -func getRLPTransaction(rlpUrl string) ([]byte, error) { - client := http.Client{ - CheckRedirect: func(r *http.Request, via []*http.Request) error { - r.URL.Opaque = r.URL.Path - return nil - }, - } - resp, err := client.Get(rlpUrl) - if err != nil { - return nil, err - } - defer resp.Body.Close() - - if resp.StatusCode != http.StatusOK { - return nil, fmt.Errorf("error downloading RLP identifier") - } - - return io.ReadAll(resp.Body) -} - -// postRLPTransaction signed payload to a remote server. -func postRLPTransaction(rlpUrl string, tx *flowsdk.Transaction) error { - signedRlp := hex.EncodeToString(tx.Encode()) - resp, err := http.Post(rlpUrl, "application/text", bytes.NewBufferString(signedRlp)) - - if err != nil { - return err - } - - if resp.StatusCode != http.StatusOK { - return fmt.Errorf("error posting signed RLP") - } - - return nil -} diff --git a/internal/transactions/transactions.go b/internal/transactions/transactions.go deleted file mode 100644 index ed9f0e3cc..000000000 --- a/internal/transactions/transactions.go +++ /dev/null @@ -1,218 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" - - "github.com/onflow/flow-go-sdk" - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/events" - "github.com/onflow/flow-cli/internal/util" -) - -var Cmd = &cobra.Command{ - Use: "transactions", - Short: "Build, sign, send and retrieve transactions", - TraverseChildren: true, - GroupID: "interactions", -} - -func init() { - getCommand.AddToParent(Cmd) - sendCommand.AddToParent(Cmd) - signCommand.AddToParent(Cmd) - buildCommand.AddToParent(Cmd) - sendSignedCommand.AddToParent(Cmd) - decodeCommand.AddToParent(Cmd) -} - -type transactionResult struct { - result *flow.TransactionResult - tx *flow.Transaction - include []string - exclude []string -} - -func (r *transactionResult) JSON() any { - result := make(map[string]any) - result["id"] = r.tx.ID().String() - result["payload"] = fmt.Sprintf("%x", r.tx.Encode()) - result["authorizers"] = fmt.Sprintf("%s", r.tx.Authorizers) - result["payer"] = r.tx.Payer.String() - - if r.result != nil { - result["block_id"] = r.result.BlockID.String() - result["block_height"] = r.result.BlockHeight - result["status"] = r.result.Status.String() - - txEvents := make([]any, 0, len(r.result.Events)) - for _, event := range r.result.Events { - txEvents = append(txEvents, map[string]any{ - "index": event.EventIndex, - "type": event.Type, - "values": json.RawMessage( - event.Payload, - ), - }) - } - result["events"] = txEvents - - if r.result.Error != nil { - result["error"] = r.result.Error.Error() - } - } - - return result -} - -func (r *transactionResult) String() string { - var b bytes.Buffer - writer := util.CreateTabWriter(&b) - const feeEventsCountAppended = 3 - const feeDeductedEvent = "FeesDeducted" - - if r.result != nil { - _, _ = fmt.Fprintf(writer, "Block ID\t%s\n", r.result.BlockID) - _, _ = fmt.Fprintf(writer, "Block Height\t%d\n", r.result.BlockHeight) - if r.result.Error != nil { - _, _ = fmt.Fprintf(writer, "%s Transaction Error \n%s\n\n\n", output.ErrorEmoji(), r.result.Error.Error()) - } - - statusBadge := "" - if r.result.Status == flow.TransactionStatusSealed { - statusBadge = output.OkEmoji() - } - _, _ = fmt.Fprintf(writer, "Status\t%s %s\n", statusBadge, r.result.Status) - } - - _, _ = fmt.Fprintf(writer, "ID\t%s\n", r.tx.ID()) - _, _ = fmt.Fprintf(writer, "Payer\t%s\n", r.tx.Payer.Hex()) - _, _ = fmt.Fprintf(writer, "Authorizers\t%s\n", r.tx.Authorizers) - - _, _ = fmt.Fprintf(writer, - "\nProposal Key:\t\n Address\t%s\n Index\t%v\n Sequence\t%v\n", - r.tx.ProposalKey.Address, r.tx.ProposalKey.KeyIndex, r.tx.ProposalKey.SequenceNumber, - ) - - if len(r.tx.PayloadSignatures) == 0 { - _, _ = fmt.Fprintf(writer, "\nNo Payload Signatures\n") - } - - if len(r.tx.EnvelopeSignatures) == 0 { - _, _ = fmt.Fprintf(writer, "\nNo Envelope Signatures\n") - } - - for i, e := range r.tx.PayloadSignatures { - if command.ContainsFlag(r.include, "signatures") { - _, _ = fmt.Fprintf(writer, "\nPayload Signature %v:\n", i) - _, _ = fmt.Fprintf(writer, " Address\t%s\n", e.Address) - _, _ = fmt.Fprintf(writer, " Signature\t%x\n", e.Signature) - _, _ = fmt.Fprintf(writer, " Key Index\t%d\n", e.KeyIndex) - } else { - _, _ = fmt.Fprintf(writer, "\nPayload Signature %v: %s", i, e.Address) - } - } - - for i, e := range r.tx.EnvelopeSignatures { - if command.ContainsFlag(r.include, "signatures") { - _, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v:\n", i) - _, _ = fmt.Fprintf(writer, " Address\t%s\n", e.Address) - _, _ = fmt.Fprintf(writer, " Signature\t%x\n", e.Signature) - _, _ = fmt.Fprintf(writer, " Key Index\t%d\n", e.KeyIndex) - } else { - _, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v: %s", i, e.Address) - } - } - - if !command.ContainsFlag(r.include, "signatures") { - _, _ = fmt.Fprintf(writer, "\nSignatures (minimized, use --include signatures)") - } - - if r.result != nil && !command.ContainsFlag(r.exclude, "events") { - e := events.EventResult{ - Events: r.result.Events, - } - - if r.result != nil && e.Events != nil && !command.ContainsFlag(r.include, "fee-events") { - for _, event := range e.Events { - if strings.Contains(event.Type, feeDeductedEvent) { - // if fee event are present remove them - e.Events = e.Events[:len(e.Events)-feeEventsCountAppended] - break - } - } - } - - eventsOutput := e.String() - if eventsOutput == "" { - eventsOutput = "None" - } - - _, _ = fmt.Fprintf(writer, "\n\nEvents:\t %s\n", eventsOutput) - } - - if r.tx.Script != nil { - if command.ContainsFlag(r.include, "code") { - if len(r.tx.Arguments) == 0 { - _, _ = fmt.Fprintf(writer, "\n\nArguments\tNo arguments\n") - } else { - _, _ = fmt.Fprintf(writer, "\n\nArguments (%d):\n", len(r.tx.Arguments)) - for i, argument := range r.tx.Arguments { - _, _ = fmt.Fprintf(writer, " - Argument %d: %s\n", i, argument) - } - } - - _, _ = fmt.Fprintf(writer, "\nCode\n\n%s\n", r.tx.Script) - } else { - _, _ = fmt.Fprint(writer, "\n\nCode (hidden, use --include code)") - } - } - - if command.ContainsFlag(r.include, "payload") { - _, _ = fmt.Fprintf(writer, "\n\nPayload:\n%x", r.tx.Encode()) - } else { - _, _ = fmt.Fprint(writer, "\n\nPayload (hidden, use --include payload)") - } - - if !command.ContainsFlag(r.include, "fee-events") && !command.ContainsFlag(r.exclude, "events") { - _, _ = fmt.Fprint(writer, "\n\nFee Events (hidden, use --include fee-events)") - } - - _ = writer.Flush() - return b.String() -} - -func (r *transactionResult) Oneliner() string { - result := fmt.Sprintf( - "ID: %s, Payer: %s, Authorizer: %s", - r.tx.ID(), r.tx.Payer, r.tx.Authorizers) - - if r.result != nil { - result += fmt.Sprintf(", Status: %s, Events: %s", r.result.Status, r.result.Events) - } - - return result -} diff --git a/internal/transactions/transactions_test.go b/internal/transactions/transactions_test.go deleted file mode 100644 index e4dcd3c84..000000000 --- a/internal/transactions/transactions_test.go +++ /dev/null @@ -1,532 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package transactions - -import ( - "encoding/json" - "fmt" - "strings" - "testing" - - "github.com/onflow/cadence" - "github.com/onflow/flow-go-sdk" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/accounts" - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/tests" - "github.com/onflow/flow-cli/flowkit/transactions" - "github.com/onflow/flow-cli/internal/command" - "github.com/onflow/flow-cli/internal/util" -) - -func Test_Build(t *testing.T) { - const serviceAccountAddress = "f8d6e0586b0a20c7" - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{tests.TransactionSimple.Filename} - - srv.BuildTransaction.Run(func(args mock.Arguments) { - roles := args.Get(1).(transactions.AddressesRoles) - assert.Equal(t, serviceAccountAddress, roles.Payer.String()) - assert.Equal(t, serviceAccountAddress, roles.Proposer.String()) - assert.Equal(t, serviceAccountAddress, roles.Authorizers[0].String()) - assert.Equal(t, 0, args.Get(2).(int)) - script := args.Get(3).(flowkit.Script) - assert.Equal(t, tests.TransactionSimple.Filename, script.Location) - }).Return(transactions.New(), nil) - - result, err := build(inArgs, command.GlobalFlags{Yes: true}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail not approved", func(t *testing.T) { - inArgs := []string{tests.TransactionSimple.Filename} - srv.BuildTransaction.Return(transactions.New(), nil) - - result, err := build(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "transaction was not approved") - assert.Nil(t, result) - }) - - t.Run("Fail parsing JSON", func(t *testing.T) { - inArgs := []string{tests.TransactionArgString.Filename} - srv.BuildTransaction.Return(transactions.New(), nil) - buildFlags.ArgsJSON = `invalid` - - result, err := build(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "error parsing transaction arguments: invalid character 'i' looking for beginning of value") - assert.Nil(t, result) - buildFlags.ArgsJSON = "" - }) - - t.Run("Fail invalid file", func(t *testing.T) { - inArgs := []string{"invalid"} - srv.BuildTransaction.Return(transactions.New(), nil) - result, err := build(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "error loading transaction file: open invalid: file does not exist") - assert.Nil(t, result) - }) -} - -func Test_Decode(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"test"} - payload := []byte("f8aaf8a6b8617472616e73616374696f6e2829207b0a097072657061726528617574686f72697a65723a20417574684163636f756e7429207b7d0a0965786563757465207b0a09096c65742078203d20310a090970616e696328227465737422290a097d0a7d0ac0a003d40910037d575d52831647b39814f445bc8cc7ba8653286c0eb1473778c34f8203e888f8d6e0586b0a20c7808088f8d6e0586b0a20c7c988f8d6e0586b0a20c7c0c0") - _ = rw.WriteFile(inArgs[0], payload, 0677) - - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail decode", func(t *testing.T) { - inArgs := []string{"test"} - _ = rw.WriteFile(inArgs[0], []byte("invalid"), 0677) - - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "failed to decode partial transaction from invalid: encoding/hex: invalid byte: U+0069 'i'") - assert.Nil(t, result) - }) - - t.Run("Fail to read file", func(t *testing.T) { - inArgs := []string{"invalid"} - result, err := decode(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "failed to read transaction from invalid: open invalid: file does not exist") - assert.Nil(t, result) - }) -} - -func Test_Get(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"0x01"} - - srv.GetTransactionByID.Run(func(args mock.Arguments) { - id := args.Get(1).(flow.Identifier) - assert.Equal(t, "0100000000000000000000000000000000000000000000000000000000000000", id.String()) - }).Return(nil, nil, nil) - - result, err := get(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) -} - -func Test_Send(t *testing.T) { - srv, state, _ := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - const gas = uint64(1000) - flags.GasLimit = gas - inArgs := []string{tests.TransactionArgString.Filename, "test"} - - srv.SendTransaction.Run(func(args mock.Arguments) { - roles := args.Get(1).(transactions.AccountRoles) - acc := config.DefaultEmulator.ServiceAccount - assert.Equal(t, acc, roles.Payer.Name) - assert.Equal(t, acc, roles.Proposer.Name) - assert.Equal(t, acc, roles.Authorizers[0].Name) - script := args.Get(2).(flowkit.Script) - assert.Equal(t, tests.TransactionArgString.Filename, script.Location) - assert.Equal(t, args.Get(3).(uint64), gas) - }).Return(nil, nil, nil) - - result, err := send(inArgs, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail non-existing account", func(t *testing.T) { - flags.Proposer = "invalid" - _, err := send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "proposer account: [invalid] doesn't exists in configuration") - flags.Proposer = "" // reset - - flags.Payer = "invalid" - _, err = send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "payer account: [invalid] doesn't exists in configuration") - flags.Payer = "" // reset - - flags.Authorizers = []string{"invalid"} - _, err = send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "authorizer account: [invalid] doesn't exists in configuration") - flags.Authorizers = nil // reset - - flags.Signer = "invalid" - _, err = send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "signer account: [invalid] doesn't exists in configuration") - flags.Signer = "" // reset - }) - - t.Run("Fail signer and payer flag", func(t *testing.T) { - flags.Proposer = config.DefaultEmulator.ServiceAccount - flags.Signer = config.DefaultEmulator.ServiceAccount - _, err := send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "signer flag cannot be combined with payer/proposer/authorizer flags") - flags.Signer = "" // reset - }) - - t.Run("Fail signer not used and payer flag not set", func(t *testing.T) { - flags.Payer = "" - flags.Proposer = config.DefaultEmulator.ServiceAccount - _, err := send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "proposer/payer flags are required when signer flag is not used") - flags.Signer = "" // reset - }) - - t.Run("Fail signer not used and proposer flag not set", func(t *testing.T) { - flags.Proposer = "" - flags.Payer = config.DefaultEmulator.ServiceAccount - _, err := send([]string{""}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "proposer/payer flags are required when signer flag is not used") - flags.Signer = "" // reset - }) - - t.Run("Fail loading transaction file", func(t *testing.T) { - flags.Proposer = config.DefaultEmulator.ServiceAccount - flags.Payer = config.DefaultEmulator.ServiceAccount - _, err := send([]string{"invalid"}, command.GlobalFlags{}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "error loading transaction file: open invalid: file does not exist") - }) -} - -func Test_SendSigned(t *testing.T) { - srv, _, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"test"} - payload := []byte("f8aaf8a6b8617472616e73616374696f6e2829207b0a097072657061726528617574686f72697a65723a20417574684163636f756e7429207b7d0a0965786563757465207b0a09096c65742078203d20310a090970616e696328227465737422290a097d0a7d0ac0a003d40910037d575d52831647b39814f445bc8cc7ba8653286c0eb1473778c34f8203e888f8d6e0586b0a20c7808088f8d6e0586b0a20c7c988f8d6e0586b0a20c7c0c0") - _ = rw.WriteFile(inArgs[0], payload, 0677) - - srv.SendSignedTransaction.Run(func(args mock.Arguments) { - tx := args.Get(1).(*transactions.Transaction) - assert.Equal(t, "f8d6e0586b0a20c7", tx.FlowTransaction().Payer.String()) - assert.Equal(t, "f8d6e0586b0a20c7", tx.FlowTransaction().Authorizers[0].String()) - assert.Equal(t, "f8d6e0586b0a20c7", tx.FlowTransaction().ProposalKey.Address.String()) - }).Return(nil, nil, nil) - - result, err := sendSigned(inArgs, command.GlobalFlags{Yes: true}, util.NoLogger, rw, srv.Mock) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail loading transaction", func(t *testing.T) { - inArgs := []string{"invalid"} - _, err := sendSigned(inArgs, command.GlobalFlags{Yes: true}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "error loading transaction payload: open invalid: file does not exist") - }) - - t.Run("Fail not approved", func(t *testing.T) { - inArgs := []string{"test"} - payload := []byte("f8aaf8a6b8617472616e73616374696f6e2829207b0a097072657061726528617574686f72697a65723a20417574684163636f756e7429207b7d0a0965786563757465207b0a09096c65742078203d20310a090970616e696328227465737422290a097d0a7d0ac0a003d40910037d575d52831647b39814f445bc8cc7ba8653286c0eb1473778c34f8203e888f8d6e0586b0a20c7808088f8d6e0586b0a20c7c988f8d6e0586b0a20c7c0c0") - _ = rw.WriteFile(inArgs[0], payload, 0677) - _, err := sendSigned(inArgs, command.GlobalFlags{}, util.NoLogger, rw, srv.Mock) - assert.EqualError(t, err, "transaction was not approved for sending") - }) -} - -func Test_Sign(t *testing.T) { - srv, state, rw := util.TestMocks(t) - - t.Run("Success", func(t *testing.T) { - inArgs := []string{"t1.rlp"} - built := []byte("f884f880b83b7472616e73616374696f6e2829207b0a0909097072657061726528617574686f72697a65723a20417574684163636f756e7429207b7d0a09097d0ac0a003d40910037d575d52831647b39814f445bc8cc7ba8653286c0eb1473778c34f8203e888f8d6e0586b0a20c7808088f8d6e0586b0a20c7c988f8d6e0586b0a20c7c0c0") - _ = rw.WriteFile(inArgs[0], built, 0677) - - srv.SignTransactionPayload.Run(func(args mock.Arguments) { - assert.Equal(t, "emulator-account", args.Get(1).(*accounts.Account).Name) - assert.Equal(t, built, args.Get(2).([]byte)) - }).Return(transactions.New(), nil) - - result, err := sign(inArgs, command.GlobalFlags{Yes: true}, util.NoLogger, srv.Mock, state) - assert.NoError(t, err) - assert.NotNil(t, result) - }) - - t.Run("Fail filename arg required", func(t *testing.T) { - _, err := sign([]string{}, command.GlobalFlags{Yes: true}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "filename argument is required") - }) - - t.Run("Fail only use filename", func(t *testing.T) { - signFlags.FromRemoteUrl = "foo" - _, err := sign([]string{"test"}, command.GlobalFlags{Yes: true}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "only use one, filename argument or --from-remote-url ") - signFlags.FromRemoteUrl = "" - }) - - t.Run("Fail invalid signer", func(t *testing.T) { - inArgs := []string{"t1.rlp"} - built := []byte("f884f880b83b7472616e73616374696f6e2829207b0a0909097072657061726528617574686f72697a65723a20417574684163636f756e7429207b7d0a09097d0ac0a003d40910037d575d52831647b39814f445bc8cc7ba8653286c0eb1473778c34f8203e888f8d6e0586b0a20c7808088f8d6e0586b0a20c7c988f8d6e0586b0a20c7c0c0") - _ = rw.WriteFile(inArgs[0], built, 0677) - signFlags.Signer = []string{"invalid"} - _, err := sign(inArgs, command.GlobalFlags{Yes: true}, util.NoLogger, srv.Mock, state) - assert.EqualError(t, err, "signer account: [invalid] doesn't exists in configuration") - signFlags.Signer = []string{} - }) -} - -func Test_Result(t *testing.T) { - tx := &flow.Transaction{ - Script: []byte(`transaction {}`), - ReferenceBlockID: flow.HexToID("6cde7f812897d22ee7633b82b059070be24faccdc47997bc0f765420e6e28bb6"), - GasLimit: flow.DefaultTransactionGasLimit, - ProposalKey: flow.ProposalKey{ - Address: flow.HexToAddress("0x01"), - KeyIndex: 0, - SequenceNumber: 1, - }, - Payer: flow.HexToAddress("0x02"), - PayloadSignatures: []flow.TransactionSignature{{ - Address: flow.HexToAddress("0x01"), - SignerIndex: 0, - KeyIndex: 0, - Signature: []byte("6cde7f812897d22ee7633b82b059070be24faccdc47997bc0f765420e6e28bb6"), - }}, - EnvelopeSignatures: []flow.TransactionSignature{{ - Address: flow.HexToAddress("0x01"), - SignerIndex: 0, - KeyIndex: 0, - Signature: []byte("6cde7f812897d22ee7633b82b059070be24faccdc47997bc0f765420e6e28bb6"), - }}, - } - - event := tests.NewEvent( - 0, - "A.foo", - []cadence.Field{{Type: cadence.StringType{}, Identifier: "bar"}}, - []cadence.Value{cadence.NewInt(1)}, - ) - event.Payload = []byte("mock_payload") - - withdrawEvent := tests.NewEvent( - 1, - "A.1654653399040a61.FlowToken.TokensWithdrawn", - []cadence.Field{{Type: cadence.StringType{}, Identifier: "bar"}}, - []cadence.Value{cadence.NewInt(1)}, - ) - depositEvent := tests.NewEvent( - 2, - "A.1654653399040a61.FlowToken.TokensDeposited", - []cadence.Field{{Type: cadence.StringType{}, Identifier: "bar"}}, - []cadence.Value{cadence.NewInt(1)}, - ) - feeEvent := tests.NewEvent( - 3, - "A.f919ee77447b7497.FlowFees.FeesDeducted", - []cadence.Field{{Type: cadence.StringType{}, Identifier: "bar"}}, - []cadence.Value{cadence.NewInt(1)}, - ) - txResult := &flow.TransactionResult{ - Status: flow.TransactionStatusSealed, - Error: nil, - Events: []flow.Event{*event}, - BlockID: flow.HexToID("7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537"), - BlockHeight: 1, - } - - txResultFeeEvents := &flow.TransactionResult{ - Status: flow.TransactionStatusSealed, - Error: nil, - Events: []flow.Event{*event, *withdrawEvent, *depositEvent, *feeEvent}, - BlockID: flow.HexToID("7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537"), - BlockHeight: 1, - } - t.Run("Success with no result", func(t *testing.T) { - result := transactionResult{tx: tx} - - assert.Equal(t, strings.TrimPrefix(` -ID e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f -Payer 0000000000000002 -Authorizers [] - -Proposal Key: - Address 0000000000000001 - Index 0 - Sequence 1 - -Payload Signature 0: 0000000000000001 -Envelope Signature 0: 0000000000000001 -Signatures (minimized, use --include signatures) - -Code (hidden, use --include code) - -Payload (hidden, use --include payload) - -Fee Events (hidden, use --include fee-events)`, "\n"), result.String()) - - assert.Equal(t, map[string]any{ - "authorizers": "[]", - "id": "e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f", - "payer": "0000000000000002", - "payload": "f8dbf8498e7472616e73616374696f6e207b7dc0a06cde7f812897d22ee7633b82b059070be24faccdc47997bc0f765420e6e28bb682270f8800000000000000018001880000000000000002c0f846f8448080b84036636465376638313238393764323265653736333362383262303539303730626532346661636364633437393937626330663736353432306536653238626236f846f8448080b84036636465376638313238393764323265653736333362383262303539303730626532346661636364633437393937626330663736353432306536653238626236", - }, result.JSON()) - }) - - t.Run("Success with result", func(t *testing.T) { - result := transactionResult{tx: tx, result: txResult} - - expectedString := strings.TrimPrefix(fmt.Sprintf(` -Block ID 7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537 -Block Height 1 -Status %s SEALED -ID e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f -Payer 0000000000000002 -Authorizers [] - -Proposal Key: - Address 0000000000000001 - Index 0 - Sequence 1 - -Payload Signature 0: 0000000000000001 -Envelope Signature 0: 0000000000000001 -Signatures (minimized, use --include signatures) - -Events: - Index 0 - Type A.foo - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - - -Code (hidden, use --include code) - -Payload (hidden, use --include payload) - -Fee Events (hidden, use --include fee-events)`, output.OkEmoji()), "\n") - - assert.Equal(t, expectedString, result.String()) - - assert.Equal(t, map[string]any{ - "authorizers": "[]", - "block_height": uint64(1), - "block_id": "7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537", - "events": []any{ - map[string]any{ - "index": 0, - "type": "A.foo", - "values": json.RawMessage{0x6d, 0x6f, 0x63, 0x6b, 0x5f, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64}, - }, - }, - "id": "e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f", - "payer": "0000000000000002", - "payload": "f8dbf8498e7472616e73616374696f6e207b7dc0a06cde7f812897d22ee7633b82b059070be24faccdc47997bc0f765420e6e28bb682270f8800000000000000018001880000000000000002c0f846f8448080b84036636465376638313238393764323265653736333362383262303539303730626532346661636364633437393937626330663736353432306536653238626236f846f8448080b84036636465376638313238393764323265653736333362383262303539303730626532346661636364633437393937626330663736353432306536653238626236", - "status": "SEALED", - }, result.JSON()) - }) - - t.Run("Result without fee events", func(t *testing.T) { - result := transactionResult{tx: tx, result: txResultFeeEvents} - - assert.Equal(t, strings.TrimPrefix(` -Block ID 7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537 -Block Height 1 -Status ✅ SEALED -ID e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f -Payer 0000000000000002 -Authorizers [] - -Proposal Key: - Address 0000000000000001 - Index 0 - Sequence 1 - -Payload Signature 0: 0000000000000001 -Envelope Signature 0: 0000000000000001 -Signatures (minimized, use --include signatures) - -Events: - Index 0 - Type A.foo - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - - -Code (hidden, use --include code) - -Payload (hidden, use --include payload) - -Fee Events (hidden, use --include fee-events)`, "\n"), result.String()) - }) - t.Run("Result with fee events", func(t *testing.T) { - result := transactionResult{tx: tx, result: txResultFeeEvents, include: []string{"fee-events"}} - - assert.Equal(t, strings.TrimPrefix(` -Block ID 7aa74143741c1c3b837d389fcffa7a5e251b67b4ffef6d6887b40cd9c803f537 -Block Height 1 -Status ✅ SEALED -ID e913d1f3e431c7df49c99845bea9ebff9db11bbf25d507b9ad0fad45652d515f -Payer 0000000000000002 -Authorizers [] - -Proposal Key: - Address 0000000000000001 - Index 0 - Sequence 1 - -Payload Signature 0: 0000000000000001 -Envelope Signature 0: 0000000000000001 -Signatures (minimized, use --include signatures) - -Events: - Index 0 - Type A.foo - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - Index 1 - Type A.1654653399040a61.FlowToken.TokensWithdrawn - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - Index 2 - Type A.1654653399040a61.FlowToken.TokensDeposited - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - Index 3 - Type A.f919ee77447b7497.FlowFees.FeesDeducted - Tx ID 0000000000000000000000000000000000000000000000000000000000000000 - Values - - bar (String): 1 - - - -Code (hidden, use --include code) - -Payload (hidden, use --include payload)`, "\n"), result.String()) - }) -} diff --git a/internal/util/prompt.go b/internal/util/prompt.go deleted file mode 100644 index 392aa8d34..000000000 --- a/internal/util/prompt.go +++ /dev/null @@ -1,768 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package util - -import ( - "fmt" - "os" - "path/filepath" - "strconv" - "strings" - - "github.com/gosuri/uilive" - "github.com/manifoldco/promptui" - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/sergi/go-diff/diffmatchpatch" - "golang.org/x/exp/maps" - "golang.org/x/exp/slices" - - "github.com/onflow/flow-cli/flowkit/config" - "github.com/onflow/flow-cli/flowkit/output" -) - -func ApproveTransactionForSigningPrompt(transaction *flow.Transaction) bool { - return ApproveTransactionPrompt(transaction, "⚠️ Do you want to SIGN this transaction?") -} - -func ApproveTransactionForBuildingPrompt(transaction *flow.Transaction) bool { - return ApproveTransactionPrompt(transaction, "⚠️ Do you want to BUILD this transaction?") -} - -func ApproveTransactionForSendingPrompt(transaction *flow.Transaction) bool { - return ApproveTransactionPrompt(transaction, "⚠️ Do you want to SEND this transaction?") -} - -func ApproveTransactionPrompt(tx *flow.Transaction, promptMsg string) bool { - writer := uilive.New() - - _, _ = fmt.Fprintf(writer, "\n") - _, _ = fmt.Fprintf(writer, "ID\t%s\n", tx.ID()) - _, _ = fmt.Fprintf(writer, "Payer\t%s\n", tx.Payer.Hex()) - _, _ = fmt.Fprintf(writer, "Authorizers\t%s\n", tx.Authorizers) - - _, _ = fmt.Fprintf(writer, - "\nProposal Key:\t\n Address\t%s\n Index\t%v\n Sequence\t%v\n", - tx.ProposalKey.Address, tx.ProposalKey.KeyIndex, tx.ProposalKey.SequenceNumber, - ) - - if len(tx.PayloadSignatures) == 0 { - _, _ = fmt.Fprintf(writer, "\nNo Payload Signatures\n") - } - - if len(tx.EnvelopeSignatures) == 0 { - _, _ = fmt.Fprintf(writer, "\nNo Envelope Signatures\n") - } - - for i, e := range tx.PayloadSignatures { - _, _ = fmt.Fprintf(writer, "\nPayload Signature %v:\n", i) - _, _ = fmt.Fprintf(writer, " Address\t%s\n", e.Address) - _, _ = fmt.Fprintf(writer, " Signature\t%x\n", e.Signature) - _, _ = fmt.Fprintf(writer, " Key Index\t%d\n", e.KeyIndex) - } - - for i, e := range tx.EnvelopeSignatures { - _, _ = fmt.Fprintf(writer, "\nEnvelope Signature %v:\n", i) - _, _ = fmt.Fprintf(writer, " Address\t%s\n", e.Address) - _, _ = fmt.Fprintf(writer, " Signature\t%x\n", e.Signature) - _, _ = fmt.Fprintf(writer, " Key Index\t%d\n", e.KeyIndex) - } - - if tx.Script != nil { - if len(tx.Arguments) == 0 { - _, _ = fmt.Fprintf(writer, "\n\nArguments\tNo arguments\n") - } else { - _, _ = fmt.Fprintf(writer, "\n\nArguments (%d):\n", len(tx.Arguments)) - for i, argument := range tx.Arguments { - _, _ = fmt.Fprintf(writer, " - Argument %d: %s\n", i, argument) - } - } - - _, _ = fmt.Fprintf(writer, "\nCode\n\n%s\n", tx.Script) - } - - _, _ = fmt.Fprintf(writer, "\n\n") - _ = writer.Flush() - - prompt := promptui.Select{ - Label: promptMsg, - Items: []string{"No", "Yes"}, - } - - _, result, _ := prompt.Run() - - _, _ = fmt.Fprintf(writer, "\r\r") - _ = writer.Flush() - - return result == "Yes" -} - -func AutocompletionPrompt() (string, string) { - prompt := promptui.Select{ - Label: "❓ Select your shell (you can run 'echo $SHELL' to find out)", - Items: []string{"bash", "zsh", "powershell"}, - } - - _, shell, _ := prompt.Run() - curOs := "" - - switch shell { - case "bash": - prompt := promptui.Select{ - Label: "❓ Select operation system", - Items: []string{"MacOS", "Linux"}, - } - _, curOs, _ = prompt.Run() - case "powershell": - fmt.Printf(`PowerShell Installation Guide: -PS> flow config setup-completions powershell | Out-String | Invoke-Expression - -# To load completions for every new session, run: -PS> flow config setup-completions powershell > flow.ps1 -# and source this file from your PowerShell profile. -`) - } - - return shell, curOs -} - -func NamePrompt() string { - namePrompt := promptui.Prompt{ - Label: "Enter name", - Validate: func(s string) error { - if len(s) < 1 { - return fmt.Errorf("invalid name") - } - return nil - }, - } - - name, err := namePrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return name -} - -func AccountNamePrompt(accountNames []string) string { - namePrompt := promptui.Prompt{ - Label: "Enter an account name", - Validate: func(s string) error { - if slices.Contains(accountNames, s) { - return fmt.Errorf("name already exists") - } - if len(s) < 1 { - return fmt.Errorf("invalid name") - } - return nil - }, - } - - name, err := namePrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return name -} - -func secureNetworkKeyPrompt() string { - networkKeyPrompt := promptui.Prompt{ - Label: "Enter a valid host network key or leave blank", - Validate: func(s string) error { - if s == "" { - return nil - } - - return ValidateECDSAP256Pub(s) - }, - } - networkKey, err := networkKeyPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return networkKey -} - -func addressPrompt() string { - addressPrompt := promptui.Prompt{ - Label: "Enter address", - Validate: func(s string) error { - if flow.HexToAddress(s) == flow.EmptyAddress { - return fmt.Errorf("invalid address") - } - return nil - }, - } - - address, err := addressPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return address -} - -func contractPrompt(contractNames []string) string { - contractPrompt := promptui.Select{ - Label: "Choose contract you wish to deploy", - Items: contractNames, - } - _, contractName, err := contractPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return contractName -} - -func addAnotherContractToDeploymentPrompt() bool { - addContractPrompt := promptui.Select{ - Label: "Do you wish to add another contract for deployment?", - Items: []string{"No", "Yes"}, - } - _, addMore, err := addContractPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return addMore == "Yes" -} - -// ShowContractDiffPrompt shows a diff between the new contract and the existing contract -// and asks the user if they wish to continue with the deployment -// returns true if the user wishes to continue with the deployment and false otherwise -func ShowContractDiffPrompt(logger output.Logger) func([]byte, []byte) bool { - return func(newContract []byte, existingContract []byte) bool { - dmp := diffmatchpatch.New() - diffs := dmp.DiffMain(string(newContract), string(existingContract), false) - diffString := dmp.DiffPrettyText(diffs) - logger.Info(diffString) - - deployPrompt := promptui.Prompt{ - Label: "Do you wish to deploy this contract?", - IsConfirm: true, - } - - deploy, err := deployPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return strings.ToLower(deploy) == "y" - } -} - -type AccountData struct { - Name string - Address string - SigAlgo string - HashAlgo string - Key string - KeyIndex string -} - -func NewAccountPrompt() *AccountData { - var err error - account := &AccountData{ - Name: NamePrompt(), - Address: addressPrompt(), - } - - sigAlgoPrompt := promptui.Select{ - Label: "Choose signature algorithm", - Items: []string{"ECDSA_P256", "ECDSA_secp256k1"}, - } - _, account.SigAlgo, err = sigAlgoPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - hashAlgoPrompt := promptui.Select{ - Label: "Choose hashing algorithm", - Items: []string{"SHA3_256", "SHA2_256"}, - } - _, account.HashAlgo, err = hashAlgoPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - keyPrompt := promptui.Prompt{ - Label: "Enter private key", - Validate: func(s string) error { - _, err := crypto.DecodePrivateKeyHex(crypto.StringToSignatureAlgorithm(account.SigAlgo), s) - return err - }, - } - account.Key, err = keyPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - keyIndexPrompt := promptui.Prompt{ - Label: "Enter key index (Default: 0)", - Default: "0", - Validate: func(s string) error { - v, err := strconv.Atoi(s) - if err != nil { - return fmt.Errorf("invalid index, must be a number") - } - if v < 0 { - return fmt.Errorf("invalid index, must be positive") - } - return nil - }, - } - - account.KeyIndex, err = keyIndexPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return account -} - -type ContractData struct { - Name string - Source string - Emulator string - Testnet string - Mainnet string -} - -func NewContractPrompt() *ContractData { - contract := &ContractData{ - Name: NamePrompt(), - } - var err error - - sourcePrompt := promptui.Prompt{ - Label: "Enter contract file location", - Validate: func(s string) error { - if !config.Exists(s) { - return fmt.Errorf("contract file doesn't exist: %s", s) - } - - return nil - }, - } - contract.Source, err = sourcePrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - emulatorAliasPrompt := promptui.Prompt{ - Label: "Enter emulator alias, if exists", - Validate: func(s string) error { - if s != "" && flow.HexToAddress(s) == flow.EmptyAddress { - return fmt.Errorf("invalid alias address") - } - - return nil - }, - } - contract.Emulator, _ = emulatorAliasPrompt.Run() - - testnetAliasPrompt := promptui.Prompt{ - Label: "Enter testnet alias, if exists", - Validate: func(s string) error { - if s != "" && flow.HexToAddress(s) == flow.EmptyAddress { - return fmt.Errorf("invalid testnet address") - } - - return nil - }, - } - contract.Testnet, _ = testnetAliasPrompt.Run() - - mainnetAliasPrompt := promptui.Prompt{ - Label: "Enter mainnet alias, if exists", - Validate: func(s string) error { - if s != "" && flow.HexToAddress(s) == flow.EmptyAddress { - return fmt.Errorf("invalid mainnet address") - } - - return nil - }, - } - contract.Mainnet, _ = mainnetAliasPrompt.Run() - - return contract -} - -func NewNetworkPrompt() map[string]string { - networkData := make(map[string]string) - var err error - - networkData["name"] = NamePrompt() - - hostPrompt := promptui.Prompt{ - Label: "Enter host location", - Validate: func(s string) error { - return nil - }, - } - networkData["host"], err = hostPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - networkData["key"] = secureNetworkKeyPrompt() - - return networkData -} - -type DeploymentData struct { - Network string - Account string - Contracts []string -} - -func NewDeploymentPrompt( - networks config.Networks, - accounts config.Accounts, - contracts config.Contracts, -) *DeploymentData { - deploymentData := &DeploymentData{} - var err error - - networkNames := make([]string, 0) - for _, network := range networks { - networkNames = append(networkNames, network.Name) - } - - networkPrompt := promptui.Select{ - Label: "Choose network for deployment", - Items: networkNames, - } - _, deploymentData.Network, err = networkPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - accountNames := make([]string, 0) - for _, account := range accounts { - accountNames = append(accountNames, account.Name) - } - - accountPrompt := promptui.Select{ - Label: "Choose an account to deploy to", - Items: accountNames, - } - _, deploymentData.Account, err = accountPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - contractNames := make([]string, 0) - for _, contract := range contracts { - contractNames = append(contractNames, contract.Name) - } - - deploymentData.Contracts = make([]string, 0) - - contractName := contractPrompt(contractNames) - deploymentData.Contracts = append(deploymentData.Contracts, contractName) - contractNames = removeFromStringArray(contractNames, contractName) - - for addAnotherContractToDeploymentPrompt() { - contractName := contractPrompt(contractNames) - deploymentData.Contracts = append(deploymentData.Contracts, contractName) - contractNames = removeFromStringArray(contractNames, contractName) - - if len(contractNames) == 0 { - break - } - } - - return deploymentData -} - -func RemoveAccountPrompt(accounts config.Accounts) string { - accountNames := make([]string, 0) - - for _, account := range accounts { - accountNames = append(accountNames, account.Name) - } - - namePrompt := promptui.Select{ - Label: "Choose an account name you wish to remove", - Items: accountNames, - } - - _, name, err := namePrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return name -} - -func RemoveDeploymentPrompt(deployments config.Deployments) (account string, network string) { - deploymentNames := make([]string, 0) - - for _, deployment := range deployments { - contractNames := make([]string, 0) - for _, c := range deployment.Contracts { - contractNames = append(contractNames, c.Name) - } - - deploymentNames = append( - deploymentNames, - fmt.Sprintf( - "Account: %s, Network: %s, Contracts: %s", - deployment.Account, - deployment.Network, - contractNames, - ), - ) - } - - deployPrompt := promptui.Select{ - Label: "Choose deployment you wish to remove", - Items: deploymentNames, - } - - index, _, err := deployPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return deployments[index].Account, deployments[index].Network -} - -func RemoveContractPrompt(contracts config.Contracts) string { - contractNames := make([]string, 0) - - for _, contract := range contracts { - contractNames = append(contractNames, contract.Name) - } - - contractPrompt := promptui.Select{ - Label: "Choose contract you wish to remove", - Items: contractNames, - } - - _, name, err := contractPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return name -} - -func RemoveContractFromFlowJSONPrompt(contractName string) bool { - prompt := promptui.Select{ - Label: fmt.Sprintf("Do you want to remove %s from your flow.json deployments?", contractName), - Items: []string{"Yes", "No"}, - } - chosen, _, _ := prompt.Run() - - return chosen == 0 -} - -func RemoveNetworkPrompt(networks config.Networks) string { - networkNames := make([]string, 0) - - for _, network := range networks { - networkNames = append(networkNames, network.Name) - } - - networkPrompt := promptui.Select{ - Label: "Choose network you wish to remove", - Items: networkNames, - } - - _, name, err := networkPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return name -} - -func ReportCrash() bool { - prompt := promptui.Select{ - Label: "🙏 Please report the crash so we can improve the CLI. Do you want to report it?", - Items: []string{"Yes, report the crash", "No"}, - } - chosen, _, _ := prompt.Run() - - return chosen == 0 -} - -func CreateAccountNetworkPrompt() (string, config.Network) { - networkMap := map[string]config.Network{ - "Emulator": config.EmulatorNetwork, - "Testnet": config.TestnetNetwork, - "Mainnet": config.MainnetNetwork, - } - - networkPrompt := promptui.Select{ - Label: "Choose a network", - Items: maps.Keys(networkMap), - } - - _, selectedNetwork, err := networkPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - fmt.Println("") - - return selectedNetwork, networkMap[selectedNetwork] -} - -func WantToUseMainnetVersionPrompt() bool { - useMainnetVersionPrompt := promptui.Select{ - Label: "Do you wish to use Mainnet version instead? (y/n)", - Items: []string{"Yes", "No"}, - } - _, useMainnetVersion, err := useMainnetVersionPrompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return useMainnetVersion == "Yes" -} - -const CancelInstall = 1 - -const AlreadyInstalled = 2 - -func InstallPrompt() int { - prompt := promptui.Select{ - Label: "Do you wish to install it", - Items: []string{"Yes", "No", "I've already installed it"}, - } - index, _, err := prompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return index -} - -func InstallPathPrompt(defaultPath string) string { - prompt := promptui.Prompt{ - Label: "Install path", - Default: defaultPath, - Validate: func(s string) error { - if _, err := os.Stat(s); err == nil { - return nil - } - - // Attempt to create it - var d []byte - if err := os.WriteFile(s, d, 0644); err == nil { - os.Remove(s) // And delete it - return nil - } - - return fmt.Errorf("path is invalid") - }, - } - - install, err := prompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - - return filepath.Clean(install) -} - -type ScaffoldItem struct { - Index int - Title string - Category string - assignedIndex int -} - -func ScaffoldPrompt(logger output.Logger, scaffoldItems []ScaffoldItem) int { - const ( - general = "" - mobile = "mobile" - web = "web" - unity = "unity" - ) - outputType := map[string]string{ - general: "🔨 General Scaffolds", - mobile: "📱 Mobile Scaffolds", - web: "💻 Web Scaffolds", - unity: "🏀 Unity Scaffolds", - } - - index := 0 - outputCategory := func(category string, items []ScaffoldItem) { - logger.Info(output.Bold(output.Magenta(outputType[category]))) - for i := range items { - if items[i].Category == category { - index++ - logger.Info(fmt.Sprintf(" [%d] %s", index, items[i].Title)) - items[i].assignedIndex = index - } - } - logger.Info("") - } - - outputCategory(general, scaffoldItems) - outputCategory(web, scaffoldItems) - outputCategory(mobile, scaffoldItems) - outputCategory(unity, scaffoldItems) - - prompt := promptui.Prompt{ - Label: "Enter the scaffold number", - Validate: func(s string) error { - n, err := strconv.Atoi(s) - if err != nil { - return fmt.Errorf("input must be a number") - } - - if n < 0 && n > len(scaffoldItems) { - return fmt.Errorf("not a valid number") - } - return nil - }, - } - - input, err := prompt.Run() - if err == promptui.ErrInterrupt { - os.Exit(-1) - } - num, _ := strconv.Atoi(input) - - for _, item := range scaffoldItems { - if item.assignedIndex == num { - return item.Index - } - } - - return 0 -} - -func GenericBoolPrompt(msg string) bool { - prompt := promptui.Select{ - Label: msg, - Items: []string{"Yes", "No"}, - } - _, result, _ := prompt.Run() - - return result == "Yes" -} diff --git a/internal/util/test.go b/internal/util/test.go deleted file mode 100644 index 17e408c6b..000000000 --- a/internal/util/test.go +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package util - -import ( - "testing" - - "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - "github.com/stretchr/testify/require" - - "github.com/onflow/flow-cli/flowkit" - "github.com/onflow/flow-cli/flowkit/mocks" - "github.com/onflow/flow-cli/flowkit/output" - "github.com/onflow/flow-cli/flowkit/tests" -) - -var NoLogger = output.NewStdoutLogger(output.NoneLog) - -var TestID = flow.HexToID("24993fc99f81641c45c0afa307e683b4f08d407d90041aa9439f487acb33d633") - -// TestMocks creates mock flowkit services, an empty state and a mock reader writer -func TestMocks(t *testing.T) (*mocks.MockServices, *flowkit.State, flowkit.ReaderWriter) { - services := mocks.DefaultMockServices() - rw, _ := tests.ReaderWriter() - state, err := flowkit.Init(rw, crypto.ECDSA_P256, crypto.SHA3_256) - require.NoError(t, err) - - return services, state, rw -} diff --git a/internal/util/util.go b/internal/util/util.go deleted file mode 100644 index f928ded19..000000000 --- a/internal/util/util.go +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package util - -import ( - "bytes" - "encoding/hex" - "fmt" - "os" - "path/filepath" - "strings" - "text/tabwriter" - - flowsdk "github.com/onflow/flow-go-sdk" - "github.com/onflow/flow-go-sdk/crypto" - - "github.com/onflow/flow-cli/flowkit" -) - -const EnvPrefix = "FLOW" - -func Exit(code int, msg string) { - fmt.Fprintln(os.Stderr, msg) - os.Exit(code) -} - -// AddToGitIgnore adds a new line to the .gitignore if one doesn't exist it creates it. -func AddToGitIgnore(filename string, loader flowkit.ReaderWriter) error { - currentWd, err := os.Getwd() - if err != nil { - return err - } - gitIgnorePath := filepath.Join(currentWd, ".gitignore") - gitIgnoreFiles := "" - filePermissions := os.FileMode(0644) - - fileStat, err := os.Stat(gitIgnorePath) - if !os.IsNotExist(err) { // if gitignore exists - gitIgnoreFilesRaw, err := loader.ReadFile(gitIgnorePath) - if err != nil { - return err - } - gitIgnoreFiles = string(gitIgnoreFilesRaw) - filePermissions = fileStat.Mode().Perm() - } - return loader.WriteFile( - gitIgnorePath, - []byte(fmt.Sprintf("%s\n%s", gitIgnoreFiles, filename)), - filePermissions, - ) -} - -// GetAddressNetwork returns the chain ID for an address. -func GetAddressNetwork(address flowsdk.Address) (flowsdk.ChainID, error) { - networks := []flowsdk.ChainID{ - flowsdk.Mainnet, - flowsdk.Testnet, - flowsdk.Emulator, - } - for _, net := range networks { - if address.IsValid(net) { - return net, nil - } - } - - return "", fmt.Errorf("address not valid for any known chain: %s", address) -} - -func CreateTabWriter(b *bytes.Buffer) *tabwriter.Writer { - return tabwriter.NewWriter(b, 0, 8, 1, '\t', tabwriter.AlignRight) -} - -// ValidateECDSAP256Pub attempt to decode the hex string representation of a ECDSA P256 public key -func ValidateECDSAP256Pub(key string) error { - b, err := hex.DecodeString(strings.TrimPrefix(key, "0x")) - if err != nil { - return fmt.Errorf("failed to decode public key hex string: %w", err) - } - - _, err = crypto.DecodePublicKey(crypto.ECDSA_P256, b) - if err != nil { - return fmt.Errorf("failed to decode public key: %w", err) - } - - return nil -} - -func removeFromStringArray(s []string, el string) []string { - for i, v := range s { - if v == el { - s = append(s[:i], s[i+1:]...) - break - } - } - - return s -} diff --git a/internal/version/version.go b/internal/version/version.go deleted file mode 100644 index aab468f92..000000000 --- a/internal/version/version.go +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Flow CLI - * - * Copyright 2019 Dapper Labs, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package version - -import ( - "fmt" - - "github.com/spf13/cobra" - - "github.com/onflow/flow-cli/build" -) - -var Cmd = &cobra.Command{ - Use: "version", - Short: "View version and commit information", - Run: func(cmd *cobra.Command, args []string) { - semver := build.Semver() - commit := build.Commit() - - // Print version/commit strings if they are known - if build.IsDefined(semver) { - fmt.Printf("Version: %s\n", semver) - } - if build.IsDefined(commit) { - fmt.Printf("Commit: %s\n", commit) - } - // If no version info is known print a message to indicate this. - if !build.IsDefined(semver) && !build.IsDefined(commit) { - fmt.Printf("Version information unknown!\n") - } - }, -} diff --git a/flowkit/mocks/Services.go b/mocks/Services.go similarity index 100% rename from flowkit/mocks/Services.go rename to mocks/Services.go diff --git a/flowkit/mocks/services_mock.go b/mocks/services_mock.go similarity index 100% rename from flowkit/mocks/services_mock.go rename to mocks/services_mock.go diff --git a/flowkit/output/colors.go b/output/colors.go similarity index 100% rename from flowkit/output/colors.go rename to output/colors.go diff --git a/flowkit/output/emoji.go b/output/emoji.go similarity index 100% rename from flowkit/output/emoji.go rename to output/emoji.go diff --git a/flowkit/output/logger.go b/output/logger.go similarity index 100% rename from flowkit/output/logger.go rename to output/logger.go diff --git a/flowkit/output/spinner.go b/output/spinner.go similarity index 100% rename from flowkit/output/spinner.go rename to output/spinner.go diff --git a/flowkit/project/contract.go b/project/contract.go similarity index 100% rename from flowkit/project/contract.go rename to project/contract.go diff --git a/flowkit/project/contract_test.go b/project/contract_test.go similarity index 100% rename from flowkit/project/contract_test.go rename to project/contract_test.go diff --git a/flowkit/project/deployment.go b/project/deployment.go similarity index 100% rename from flowkit/project/deployment.go rename to project/deployment.go diff --git a/flowkit/project/deployment_test.go b/project/deployment_test.go similarity index 100% rename from flowkit/project/deployment_test.go rename to project/deployment_test.go diff --git a/flowkit/project/imports.go b/project/imports.go similarity index 100% rename from flowkit/project/imports.go rename to project/imports.go diff --git a/flowkit/project/imports_test.go b/project/imports_test.go similarity index 100% rename from flowkit/project/imports_test.go rename to project/imports_test.go diff --git a/flowkit/project/program.go b/project/program.go similarity index 100% rename from flowkit/project/program.go rename to project/program.go diff --git a/flowkit/project/program_test.go b/project/program_test.go similarity index 100% rename from flowkit/project/program_test.go rename to project/program_test.go diff --git a/scaffolds.json b/scaffolds.json deleted file mode 100644 index 6803d2b0e..000000000 --- a/scaffolds.json +++ /dev/null @@ -1,79 +0,0 @@ -[ - { - "name": "Empty Cadence Project", - "repo": "https://github.com/sideninja/flow-empty-scaffold", - "description": "Empty project containing only basic folder structure and flow.json configuration.", - "commit": "2ba41348c54c60ccc4e7c3a2d46deead17aab2e6" - }, - { - "name": "Simple Cadence Project", - "repo": "https://github.com/sideninja/flow-basic-scaffold.git", - "description": "Scaffold contains required folder structure as well as some example Cadence code.", - "commit": "5ea01c5f49a855bd0e91333bcae561d52a0de5ec" - }, - { - "name": "Cadence NFT Project", - "repo": "https://github.com/nvdtf/flow-nft-scaffold.git", - "description": "Scaffold contains the ExampleNFT sample NFT contract.", - "commit": "624ffd71bd2f86faf954d251f69d346ddff1446a" - }, - { - "name": "Hybrid Custody Project", - "repo": "https://github.com/onflow/hybrid-custody-scaffold", - "description": "Starter for exploring & implementing Hybrid Custody.", - "commit": "1e76638c7b1e37124b8222ccad3cc9dbe84731d5" - }, - { - "name": "FCL Web Dapp", - "repo": "https://github.com/chasefleming/fcl-next-scaffold.git", - "description": "Simple TypeScript web application using next.js, FCL, and Cadence.", - "commit": "3a5d4f87eef72cebf45f1c48c51c2b786b28f7b6", - "type": "web" - }, - { - "name": "Simple Unity", - "repo": "https://github.com/onflow/UnityFlowSDK.git", - "description": "Simple example demonstrating how to interact with the Flow network using Unity SDK.", - "commit": "d01a4b14a98383c18b4d57e87624cb8dba6d0946", - "folder": "Samples~/FlowControlQuickstartCodeSample", - "type": "unity" - }, - { - "name": "Mobile Unity Game", - "repo": "https://github.com/onflow/UnityFlowSDK.git", - "description": "Example words game built on Flow using the Unity SDK.", - "commit": "d01a4b14a98383c18b4d57e87624cb8dba6d0946", - "folder": "Samples~/FlowWords", - "type": "unity" - }, - { - "name": "Swift iOS simple example", - "repo": "https://github.com/Outblock/fcl-swift", - "description": "iOS example demonstrating usage of FCL and Flow interactions.", - "commit": "393783732f0eef171469b8239683536df73b7450", - "folder": "Example/FCLDemo", - "type": "mobile" - }, - { - "name": "Android simple example", - "repo": "https://github.com/Outblock/fcl-android", - "description": "Android example demonstrating usage of FCL and Flow interactions.", - "commit": "5c68d818e9bccf22409feb9759021e090c055e48", - "folder": "example", - "type": "mobile" - }, - { - "name": "FCL React Native Mobile Dapp", - "repo": "https://github.com/jribbink/fcl-react-native-scaffold", - "description": "React Native (Expo) mobile dapp example demonstrating FCL and Flow interactions.", - "commit": "b5c4b3c98d5733a23c0e93b269bb3383a1af2639", - "type": "mobile" - }, - { - "name": "FCL PWA", - "repo": "https://github.com/bshahid331/flow-pwa-scaffold", - "description": "Walletless Mobile PWA App demonstrating FCL and Flow interactions.", - "commit": "6796427a02b67340447a9c83dc8bdc2b3b06a8c8", - "type": "web" - } -] diff --git a/flowkit/schema.json b/schema.json similarity index 100% rename from flowkit/schema.json rename to schema.json diff --git a/flowkit/services.go b/services.go similarity index 100% rename from flowkit/services.go rename to services.go diff --git a/flowkit/state.go b/state.go similarity index 100% rename from flowkit/state.go rename to state.go diff --git a/flowkit/state_test.go b/state_test.go similarity index 100% rename from flowkit/state_test.go rename to state_test.go diff --git a/flowkit/tests/resources.go b/tests/resources.go similarity index 100% rename from flowkit/tests/resources.go rename to tests/resources.go diff --git a/flowkit/tests/testnet_test.go b/tests/testnet_test.go similarity index 100% rename from flowkit/tests/testnet_test.go rename to tests/testnet_test.go diff --git a/flowkit/transactions/transaction.go b/transactions/transaction.go similarity index 100% rename from flowkit/transactions/transaction.go rename to transactions/transaction.go diff --git a/flowkit/transactions/transaction_test.go b/transactions/transaction_test.go similarity index 100% rename from flowkit/transactions/transaction_test.go rename to transactions/transaction_test.go diff --git a/version.txt b/version.txt deleted file mode 100644 index 13a15bd96..000000000 --- a/version.txt +++ /dev/null @@ -1 +0,0 @@ -v1.12.0 \ No newline at end of file