summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Lee <64482439+algojohnlee@users.noreply.github.com>2024-01-24 11:04:54 -0500
committerGitHub <noreply@github.com>2024-01-24 11:04:54 -0500
commit7a0cd104d64a8fbd610ffb3da450eef87c476a70 (patch)
treeec340c1e8f29242e606dde42de9cbc9b7b017be4
parent9c4f70771de79de9681380088cbe317e3bd37f88 (diff)
parentce9177226ffe12a369773194ade5a95ea33f216e (diff)
Merge pull request #5919 from Algo-devops-service/relbeta3.22.0v3.22.0-betarel/beta
-rw-r--r--README.md2
-rw-r--r--SECURITY.md4
-rw-r--r--agreement/abstractions.go2
-rw-r--r--agreement/actions.go2
-rw-r--r--agreement/actor.go2
-rw-r--r--agreement/agreeInstall.go2
-rw-r--r--agreement/agreementtest/keyManager.go2
-rw-r--r--agreement/agreementtest/simulate.go2
-rw-r--r--agreement/agreementtest/simulate_test.go2
-rw-r--r--agreement/asyncVoteVerifier.go2
-rw-r--r--agreement/asyncVoteVerifier_test.go2
-rw-r--r--agreement/autopsy.go2
-rw-r--r--agreement/bundle.go2
-rw-r--r--agreement/bundle_test.go2
-rw-r--r--agreement/cadaver.go2
-rw-r--r--agreement/certificate.go2
-rw-r--r--agreement/certificate_test.go2
-rw-r--r--agreement/common_test.go2
-rw-r--r--agreement/coservice.go2
-rw-r--r--agreement/credentialArrivalHistory.go2
-rw-r--r--agreement/credentialArrivalHistory_test.go2
-rw-r--r--agreement/cryptoRequestContext.go2
-rw-r--r--agreement/cryptoRequestContext_test.go2
-rw-r--r--agreement/cryptoVerifier.go2
-rw-r--r--agreement/cryptoVerifier_test.go2
-rw-r--r--agreement/demux.go14
-rw-r--r--agreement/demux_test.go2
-rw-r--r--agreement/doc.go2
-rw-r--r--agreement/dynamicFilterTimeoutParams.go2
-rw-r--r--agreement/dynamicFilterTimeoutParams_test.go2
-rw-r--r--agreement/encoding_test.go2
-rw-r--r--agreement/errors.go2
-rw-r--r--agreement/events.go2
-rw-r--r--agreement/events_test.go2
-rw-r--r--agreement/fuzzer/bandwidthFilter_test.go2
-rw-r--r--agreement/fuzzer/catchupFilter_test.go2
-rw-r--r--agreement/fuzzer/clockedFilter_test.go2
-rw-r--r--agreement/fuzzer/dropMessageFilter_test.go2
-rw-r--r--agreement/fuzzer/duplicateMessageFilter_test.go2
-rw-r--r--agreement/fuzzer/filter_test.go2
-rw-r--r--agreement/fuzzer/fuzzer.go2
-rw-r--r--agreement/fuzzer/fuzzer_test.go9
-rw-r--r--agreement/fuzzer/ledger_test.go2
-rw-r--r--agreement/fuzzer/messageDecoderFilter_test.go2
-rw-r--r--agreement/fuzzer/messageDelayFilter_test.go2
-rw-r--r--agreement/fuzzer/messageDuplicationFilter_test.go2
-rw-r--r--agreement/fuzzer/messagePriorityQueue_test.go2
-rw-r--r--agreement/fuzzer/messageReflectionFilter_test.go2
-rw-r--r--agreement/fuzzer/messageRegossipFilter_test.go2
-rw-r--r--agreement/fuzzer/messageReorderingFilter_test.go2
-rw-r--r--agreement/fuzzer/networkFacade_test.go6
-rw-r--r--agreement/fuzzer/nodeCrashFilter_test.go2
-rw-r--r--agreement/fuzzer/nullFilter_test.go2
-rw-r--r--agreement/fuzzer/router_test.go2
-rw-r--r--agreement/fuzzer/schedulerFilter_test.go2
-rw-r--r--agreement/fuzzer/tests_test.go2
-rw-r--r--agreement/fuzzer/topologyFilter_test.go2
-rw-r--r--agreement/fuzzer/trafficStatisticsFilter_test.go2
-rw-r--r--agreement/fuzzer/validator_test.go8
-rw-r--r--agreement/fuzzer/voteFilter_test.go2
-rw-r--r--agreement/gossip/network.go2
-rw-r--r--agreement/gossip/networkFull_test.go2
-rw-r--r--agreement/gossip/network_test.go2
-rw-r--r--agreement/keyManager_test.go2
-rw-r--r--agreement/listener.go2
-rw-r--r--agreement/message.go2
-rw-r--r--agreement/message_test.go2
-rw-r--r--agreement/params.go2
-rw-r--r--agreement/persistence.go2
-rw-r--r--agreement/persistence_test.go2
-rw-r--r--agreement/player.go2
-rw-r--r--agreement/playerContract.go2
-rw-r--r--agreement/player_permutation_test.go2
-rw-r--r--agreement/player_test.go2
-rw-r--r--agreement/proposal.go2
-rw-r--r--agreement/proposalManager.go2
-rw-r--r--agreement/proposalManagerContract.go2
-rw-r--r--agreement/proposalManager_test.go2
-rw-r--r--agreement/proposalStore.go2
-rw-r--r--agreement/proposalStoreContract.go2
-rw-r--r--agreement/proposalStore_test.go2
-rw-r--r--agreement/proposalTable.go2
-rw-r--r--agreement/proposalTable_test.go2
-rw-r--r--agreement/proposalTracker.go2
-rw-r--r--agreement/proposalTrackerContract.go2
-rw-r--r--agreement/proposalTracker_test.go2
-rw-r--r--agreement/proposal_test.go2
-rw-r--r--agreement/pseudonode.go2
-rw-r--r--agreement/pseudonode_test.go2
-rw-r--r--agreement/router.go2
-rw-r--r--agreement/selector.go2
-rw-r--r--agreement/service.go8
-rw-r--r--agreement/service_test.go2
-rw-r--r--agreement/sort.go2
-rw-r--r--agreement/sort_test.go2
-rw-r--r--agreement/state_machine_test.go2
-rw-r--r--agreement/trace.go2
-rw-r--r--agreement/traceTime.go2
-rw-r--r--agreement/types.go2
-rw-r--r--agreement/vote.go2
-rw-r--r--agreement/voteAggregator.go2
-rw-r--r--agreement/voteAggregatorContract.go2
-rw-r--r--agreement/voteAggregator_test.go2
-rw-r--r--agreement/voteAuxiliary.go2
-rw-r--r--agreement/voteAuxiliaryContract.go2
-rw-r--r--agreement/voteAuxiliary_test.go2
-rw-r--r--agreement/voteTracker.go2
-rw-r--r--agreement/voteTrackerContract.go2
-rw-r--r--agreement/voteTracker_test.go2
-rw-r--r--agreement/vote_test.go2
-rw-r--r--catchup/catchpointService.go2
-rw-r--r--catchup/catchpointService_test.go2
-rw-r--r--catchup/fetcher_test.go2
-rw-r--r--catchup/ledgerFetcher.go2
-rw-r--r--catchup/ledgerFetcher_test.go2
-rw-r--r--catchup/peerSelector.go2
-rw-r--r--catchup/peerSelector_test.go2
-rw-r--r--catchup/pref_test.go2
-rw-r--r--catchup/service.go2
-rw-r--r--catchup/service_test.go2
-rw-r--r--catchup/universalFetcher.go2
-rw-r--r--catchup/universalFetcher_test.go2
-rw-r--r--cmd/algocfg/getCommand.go2
-rw-r--r--cmd/algocfg/getCommand_test.go2
-rw-r--r--cmd/algocfg/main.go2
-rw-r--r--cmd/algocfg/profileCommand.go17
-rw-r--r--cmd/algocfg/profileCommand_test.go13
-rw-r--r--cmd/algocfg/report.go2
-rw-r--r--cmd/algocfg/resetCommand.go2
-rw-r--r--cmd/algocfg/setCommand.go2
-rw-r--r--cmd/algod/main.go2
-rw-r--r--cmd/algod/main_test.go2
-rw-r--r--cmd/algofix/deadlock.go2
-rw-r--r--cmd/algofix/deadlock_test.go2
-rw-r--r--cmd/algoh/blockWatcher.go2
-rw-r--r--cmd/algoh/blockWatcher_test.go2
-rw-r--r--cmd/algoh/blockstats.go2
-rw-r--r--cmd/algoh/blockstats_test.go2
-rw-r--r--cmd/algoh/client.go2
-rw-r--r--cmd/algoh/deadman.go2
-rw-r--r--cmd/algoh/eventsender.go2
-rw-r--r--cmd/algoh/main.go2
-rw-r--r--cmd/algoh/mockClient.go2
-rw-r--r--cmd/algokey/common.go2
-rw-r--r--cmd/algokey/export.go2
-rw-r--r--cmd/algokey/generate.go2
-rw-r--r--cmd/algokey/import.go2
-rw-r--r--cmd/algokey/keyreg.go2
-rw-r--r--cmd/algokey/main.go2
-rw-r--r--cmd/algokey/multisig.go2
-rw-r--r--cmd/algokey/part.go2
-rw-r--r--cmd/algokey/sign.go2
-rw-r--r--cmd/algons/commands.go2
-rw-r--r--cmd/algons/dnsCmd.go2
-rw-r--r--cmd/algons/dnsaddrCmd.go2
-rw-r--r--cmd/algorelay/commands.go2
-rw-r--r--cmd/algorelay/eb/eb.go2
-rw-r--r--cmd/algorelay/relayCmd.go2
-rw-r--r--cmd/buildtools/commands.go2
-rw-r--r--cmd/buildtools/genesis.go2
-rw-r--r--cmd/catchpointdump/commands.go2
-rw-r--r--cmd/catchpointdump/database.go2
-rw-r--r--cmd/catchpointdump/file.go2
-rw-r--r--cmd/catchpointdump/net.go2
-rw-r--r--cmd/catchupsrv/download.go2
-rw-r--r--cmd/catchupsrv/download_test.go2
-rw-r--r--cmd/catchupsrv/main.go2
-rw-r--r--cmd/catchupsrv/tarblocks.go2
-rw-r--r--cmd/dbgen/main.go2
-rw-r--r--cmd/diagcfg/main.go2
-rw-r--r--cmd/diagcfg/messages.go2
-rw-r--r--cmd/diagcfg/metric.go2
-rw-r--r--cmd/diagcfg/telemetry.go2
-rw-r--r--cmd/dispenser/server.go2
-rw-r--r--cmd/genesis/newgenesis.go2
-rw-r--r--cmd/goal/account.go2
-rw-r--r--cmd/goal/accountsList.go2
-rw-r--r--cmd/goal/application.go2
-rw-r--r--cmd/goal/application_test.go2
-rw-r--r--cmd/goal/asset.go2
-rw-r--r--cmd/goal/box.go2
-rw-r--r--cmd/goal/clerk.go2
-rw-r--r--cmd/goal/clerk_test.go2
-rw-r--r--cmd/goal/commands.go2
-rw-r--r--cmd/goal/commands_test.go2
-rw-r--r--cmd/goal/common.go2
-rw-r--r--cmd/goal/completion.go2
-rw-r--r--cmd/goal/formatting.go2
-rw-r--r--cmd/goal/formatting_test.go2
-rw-r--r--cmd/goal/inspect.go2
-rw-r--r--cmd/goal/inspect_test.go2
-rw-r--r--cmd/goal/interact.go2
-rw-r--r--cmd/goal/kmd.go2
-rw-r--r--cmd/goal/ledger.go2
-rw-r--r--cmd/goal/logging.go2
-rw-r--r--cmd/goal/messages.go2
-rw-r--r--cmd/goal/multisig.go2
-rw-r--r--cmd/goal/network.go2
-rw-r--r--cmd/goal/node.go2
-rw-r--r--cmd/goal/node_test.go2
-rw-r--r--cmd/goal/tealsign.go2
-rw-r--r--cmd/goal/wallet.go2
-rw-r--r--cmd/incorporate/incorporate.go2
-rw-r--r--cmd/kmd/codes/codes.go2
-rw-r--r--cmd/kmd/main.go2
-rw-r--r--cmd/kmd/mlock_darwin.go2
-rw-r--r--cmd/kmd/mlock_linux.go2
-rw-r--r--cmd/kmd/mlock_windows.go2
-rw-r--r--cmd/loadgenerator/config.go2
-rw-r--r--cmd/loadgenerator/main.go2
-rw-r--r--cmd/msgpacktool/main.go2
-rw-r--r--cmd/netdummy/main.go2
-rw-r--r--cmd/netgoal/commands.go2
-rw-r--r--cmd/netgoal/generate.go2
-rw-r--r--cmd/netgoal/messages.go2
-rw-r--r--cmd/netgoal/network.go2
-rw-r--r--cmd/netgoal/recipe.go2
-rw-r--r--cmd/nodecfg/apply.go2
-rw-r--r--cmd/nodecfg/commands.go2
-rw-r--r--cmd/nodecfg/download.go2
-rw-r--r--cmd/nodecfg/get.go2
-rw-r--r--cmd/opdoc/opdoc.go4
-rw-r--r--cmd/opdoc/tmLanguage.go2
-rw-r--r--cmd/partitiontest_linter/linter.go2
-rw-r--r--cmd/partitiontest_linter/linter_test.go2
-rw-r--r--cmd/partitiontest_linter/plugin/plugin.go2
-rw-r--r--cmd/partitiontest_linter/testdata/linter_testdata_test.go2
-rw-r--r--cmd/pingpong/commands.go2
-rw-r--r--cmd/pingpong/runCmd.go2
-rw-r--r--cmd/pingpong/teal_programs.go2
-rwxr-xr-xcmd/tealdbg/bundle_home_html.sh2
-rw-r--r--cmd/tealdbg/cdt/proto.go2
-rw-r--r--cmd/tealdbg/cdtSession.go2
-rw-r--r--cmd/tealdbg/cdtSession_test.go2
-rw-r--r--cmd/tealdbg/cdtState.go2
-rw-r--r--cmd/tealdbg/cdtStateObjects.go2
-rw-r--r--cmd/tealdbg/cdtdbg.go2
-rw-r--r--cmd/tealdbg/cdtdbg_test.go2
-rw-r--r--cmd/tealdbg/debugger.go2
-rw-r--r--cmd/tealdbg/debugger_test.go2
-rw-r--r--cmd/tealdbg/dryrunRequest.go2
-rw-r--r--cmd/tealdbg/homepage.go2
-rw-r--r--cmd/tealdbg/local.go2
-rw-r--r--cmd/tealdbg/localLedger.go2
-rw-r--r--cmd/tealdbg/localLedger_test.go2
-rw-r--r--cmd/tealdbg/local_test.go2
-rw-r--r--cmd/tealdbg/main.go2
-rw-r--r--cmd/tealdbg/remote.go2
-rw-r--r--cmd/tealdbg/remote_test.go2
-rw-r--r--cmd/tealdbg/server.go2
-rw-r--r--cmd/tealdbg/server_test.go2
-rw-r--r--cmd/tealdbg/util.go2
-rw-r--r--cmd/tealdbg/webdbg.go2
-rw-r--r--cmd/tealdbg/webdbg_test.go2
-rw-r--r--cmd/updater/commands.go2
-rw-r--r--cmd/updater/sendCmd.go2
-rw-r--r--cmd/updater/toolsCmd.go2
-rw-r--r--cmd/updater/util.go2
-rw-r--r--cmd/updater/versionCmd.go2
-rw-r--r--cmd/updater/version_test.go2
-rw-r--r--cmd/util/cmd.go2
-rw-r--r--cmd/util/datadir/datadir.go2
-rw-r--r--cmd/util/datadir/messages.go2
-rw-r--r--cmd/util/datadir/report.go2
-rw-r--r--components/mocks/mockCatchpointCatchupAccessor.go2
-rw-r--r--components/mocks/mockNetwork.go2
-rw-r--r--components/mocks/mockParticipationRegistry.go2
-rw-r--r--config/buildvars.go2
-rw-r--r--config/config.go5
-rw-r--r--config/config_test.go49
-rw-r--r--config/consensus.go2
-rw-r--r--config/consensus_test.go2
-rw-r--r--config/defaultsGenerator/defaultsGenerator.go2
-rw-r--r--config/dnsbootstrap.go2
-rw-r--r--config/dnsbootstrap_test.go2
-rw-r--r--config/keyfile.go2
-rw-r--r--config/localTemplate.go2
-rw-r--r--config/local_defaults.go2
-rw-r--r--config/migrate.go2
-rw-r--r--config/version.go4
-rw-r--r--config/version_test.go2
-rw-r--r--crypto/batchverifier.go2
-rw-r--r--crypto/batchverifier_test.go2
-rw-r--r--crypto/crypto_test.go2
-rw-r--r--crypto/cryptoerror.go2
-rw-r--r--crypto/curve25519.go2
-rw-r--r--crypto/curve25519_test.go2
-rw-r--r--crypto/digest.go2
-rw-r--r--crypto/encoding_test.go2
-rw-r--r--crypto/falconWrapper.go2
-rw-r--r--crypto/falconWrapper_test.go2
-rw-r--r--crypto/hashes.go2
-rw-r--r--crypto/hashes_test.go2
-rw-r--r--crypto/memcpy_chk_windows.c2
-rw-r--r--crypto/merklearray/array.go2
-rw-r--r--crypto/merklearray/layer.go2
-rw-r--r--crypto/merklearray/merkle.go2
-rw-r--r--crypto/merklearray/merkle_test.go2
-rw-r--r--crypto/merklearray/partial.go2
-rw-r--r--crypto/merklearray/proof.go2
-rw-r--r--crypto/merklearray/proof_test.go2
-rw-r--r--crypto/merklearray/vectorCommitmentArray.go2
-rw-r--r--crypto/merklearray/vectorCommitmentArray_test.go2
-rw-r--r--crypto/merklearray/worker.go2
-rw-r--r--crypto/merklesignature/committablePublicKeys.go2
-rw-r--r--crypto/merklesignature/committablePublicKeys_test.go2
-rw-r--r--crypto/merklesignature/const.go2
-rw-r--r--crypto/merklesignature/kats_test.go2
-rw-r--r--crypto/merklesignature/keysBuilder.go2
-rw-r--r--crypto/merklesignature/keysBuilder_test.go2
-rw-r--r--crypto/merklesignature/merkleSignatureScheme.go2
-rw-r--r--crypto/merklesignature/merkleSignatureScheme_test.go2
-rw-r--r--crypto/merklesignature/persistentMerkleSignatureScheme.go2
-rw-r--r--crypto/merklesignature/persistentMerkleSignatureScheme_test.go2
-rw-r--r--crypto/merklesignature/posdivs.go2
-rw-r--r--crypto/merklesignature/posdivs_test.go2
-rw-r--r--crypto/merkletrie/bitset.go2
-rw-r--r--crypto/merkletrie/bitset_test.go2
-rw-r--r--crypto/merkletrie/cache.go2
-rw-r--r--crypto/merkletrie/cache_test.go2
-rw-r--r--crypto/merkletrie/committer.go2
-rw-r--r--crypto/merkletrie/committer_test.go2
-rw-r--r--crypto/merkletrie/node.go2
-rw-r--r--crypto/merkletrie/node_test.go2
-rw-r--r--crypto/merkletrie/trie.go2
-rw-r--r--crypto/merkletrie/trie_test.go2
-rw-r--r--crypto/multisig.go2
-rw-r--r--crypto/multisig_test.go2
-rw-r--r--crypto/onetimesig.go2
-rw-r--r--crypto/onetimesig_test.go2
-rw-r--r--crypto/passphrase/errors.go2
-rw-r--r--crypto/passphrase/passphrase.go2
-rw-r--r--crypto/passphrase/passphrase_test.go2
-rw-r--r--crypto/passphrase/wordlist.go2
-rw-r--r--crypto/rand.go2
-rw-r--r--crypto/rand_test.go2
-rw-r--r--crypto/stateproof/coinGenerator.go2
-rw-r--r--crypto/stateproof/coinGenerator_test.go2
-rw-r--r--crypto/stateproof/committableSignatureSlot.go2
-rw-r--r--crypto/stateproof/committableSignatureSlot_test.go2
-rw-r--r--crypto/stateproof/const.go2
-rw-r--r--crypto/stateproof/prover.go2
-rw-r--r--crypto/stateproof/prover_test.go2
-rw-r--r--crypto/stateproof/structs.go2
-rw-r--r--crypto/stateproof/verifier.go2
-rw-r--r--crypto/stateproof/verifier_test.go2
-rw-r--r--crypto/stateproof/weights.go2
-rw-r--r--crypto/stateproof/weights_test.go2
-rw-r--r--crypto/statetrie/nibbles/nibbles.go2
-rw-r--r--crypto/statetrie/nibbles/nibbles_test.go2
-rw-r--r--crypto/util.go2
-rw-r--r--crypto/util_test.go2
-rw-r--r--crypto/vrf.go2
-rw-r--r--crypto/vrf_test.go2
-rw-r--r--daemon/algod/api/client/encoding.go2
-rw-r--r--daemon/algod/api/client/restClient.go26
-rw-r--r--daemon/algod/api/server/common/handlers.go2
-rw-r--r--daemon/algod/api/server/common/metrics.go2
-rw-r--r--daemon/algod/api/server/common/responses.go2
-rw-r--r--daemon/algod/api/server/common/routes.go2
-rw-r--r--daemon/algod/api/server/common/test/handlers_test.go2
-rw-r--r--daemon/algod/api/server/common/test/helpers.go2
-rw-r--r--daemon/algod/api/server/lib/common.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/auth.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/auth_test.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/connectionLimiter.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/cors.go2
-rw-r--r--daemon/algod/api/server/lib/middlewares/logger.go2
-rw-r--r--daemon/algod/api/server/router.go2
-rw-r--r--daemon/algod/api/server/router_test.go2
-rw-r--r--daemon/algod/api/server/v1/handlers/errors.go2
-rw-r--r--daemon/algod/api/server/v1/handlers/handlers.go2
-rw-r--r--daemon/algod/api/server/v1/routes/routes.go2
-rw-r--r--daemon/algod/api/server/v2/account.go2
-rw-r--r--daemon/algod/api/server/v2/account_test.go2
-rw-r--r--daemon/algod/api/server/v2/dryrun.go9
-rw-r--r--daemon/algod/api/server/v2/dryrun_test.go44
-rw-r--r--daemon/algod/api/server/v2/errors.go2
-rw-r--r--daemon/algod/api/server/v2/handlers.go2
-rw-r--r--daemon/algod/api/server/v2/handlers_test.go2
-rw-r--r--daemon/algod/api/server/v2/test/handlers_resources_test.go2
-rw-r--r--daemon/algod/api/server/v2/test/handlers_test.go2
-rw-r--r--daemon/algod/api/server/v2/test/helpers.go2
-rw-r--r--daemon/algod/api/server/v2/utils.go10
-rw-r--r--daemon/algod/api/spec/common/model.go2
-rw-r--r--daemon/algod/api/spec/v2/model.go2
-rw-r--r--daemon/algod/api/swagger.go2
-rw-r--r--daemon/algod/deadlockLogger.go2
-rw-r--r--daemon/algod/deadlock_test.go2
-rw-r--r--daemon/algod/server.go2
-rw-r--r--daemon/algod/server_test.go2
-rw-r--r--daemon/kmd/api/api.go2
-rw-r--r--daemon/kmd/api/cors.go2
-rw-r--r--daemon/kmd/api/v1/auth.go2
-rw-r--r--daemon/kmd/api/v1/errors.go2
-rw-r--r--daemon/kmd/api/v1/handlers.go2
-rw-r--r--daemon/kmd/client/client.go2
-rw-r--r--daemon/kmd/client/requests.go2
-rw-r--r--daemon/kmd/client/wrappers.go2
-rw-r--r--daemon/kmd/config/config.go2
-rw-r--r--daemon/kmd/config/errors.go2
-rw-r--r--daemon/kmd/kmd.go2
-rw-r--r--daemon/kmd/lib/kmdapi/common.go2
-rw-r--r--daemon/kmd/lib/kmdapi/requests.go2
-rw-r--r--daemon/kmd/lib/kmdapi/responses.go2
-rw-r--r--daemon/kmd/server/errors.go2
-rw-r--r--daemon/kmd/server/server.go2
-rw-r--r--daemon/kmd/session/auth.go2
-rw-r--r--daemon/kmd/session/session.go2
-rw-r--r--daemon/kmd/wallet/driver/driver.go2
-rw-r--r--daemon/kmd/wallet/driver/ledger.go2
-rw-r--r--daemon/kmd/wallet/driver/ledger_errors.go2
-rw-r--r--daemon/kmd/wallet/driver/ledger_hid.go2
-rw-r--r--daemon/kmd/wallet/driver/sqlite.go2
-rw-r--r--daemon/kmd/wallet/driver/sqlite_crypto.go2
-rw-r--r--daemon/kmd/wallet/driver/sqlite_errors.go2
-rw-r--r--daemon/kmd/wallet/driver/util.go2
-rw-r--r--daemon/kmd/wallet/wallet.go2
-rw-r--r--data/account/account.go2
-rw-r--r--data/account/partInstall.go2
-rw-r--r--data/account/participation.go2
-rw-r--r--data/account/participationRegistry.go2
-rw-r--r--data/account/participationRegistryBench_test.go2
-rw-r--r--data/account/participationRegistry_test.go2
-rw-r--r--data/account/participation_test.go2
-rw-r--r--data/account/registeryDbOps.go2
-rw-r--r--data/account/rootInstall.go2
-rw-r--r--data/accountManager.go2
-rw-r--r--data/accountManager_test.go2
-rw-r--r--data/appRateLimiter.go2
-rw-r--r--data/appRateLimiter_test.go2
-rw-r--r--data/basics/address.go2
-rw-r--r--data/basics/address_test.go2
-rw-r--r--data/basics/fields_test.go2
-rw-r--r--data/basics/overflow.go2
-rw-r--r--data/basics/serr.go132
-rw-r--r--data/basics/serr_test.go135
-rw-r--r--data/basics/sort.go2
-rw-r--r--data/basics/stateProofParticipant.go2
-rw-r--r--data/basics/teal.go2
-rw-r--r--data/basics/teal_test.go2
-rw-r--r--data/basics/testing/userBalance.go2
-rw-r--r--data/basics/units.go2
-rw-r--r--data/basics/units_test.go2
-rw-r--r--data/basics/userBalance.go2
-rw-r--r--data/basics/userBalance_test.go2
-rw-r--r--data/bookkeeping/block.go2
-rw-r--r--data/bookkeeping/block_test.go2
-rw-r--r--data/bookkeeping/encoding_test.go2
-rw-r--r--data/bookkeeping/genesis.go2
-rw-r--r--data/bookkeeping/genesis_test.go2
-rw-r--r--data/bookkeeping/lightBlockHeader.go2
-rw-r--r--data/bookkeeping/lightBlockHeader_test.go2
-rw-r--r--data/bookkeeping/prettyprinting.go2
-rw-r--r--data/bookkeeping/txn_merkle.go2
-rw-r--r--data/bookkeeping/txn_merkle_test.go2
-rw-r--r--data/committee/committee.go2
-rw-r--r--data/committee/common_test.go2
-rw-r--r--data/committee/credential.go2
-rw-r--r--data/committee/credential_test.go2
-rw-r--r--data/committee/encoding_test.go2
-rw-r--r--data/common_test.go2
-rw-r--r--data/datatest/fabricateLedger.go2
-rw-r--r--data/datatest/impls.go2
-rw-r--r--data/hashable/message.go2
-rw-r--r--data/ledger.go2
-rw-r--r--data/ledger_test.go2
-rw-r--r--data/pools/errors.go2
-rw-r--r--data/pools/statusCache.go8
-rw-r--r--data/pools/transactionPool.go2
-rw-r--r--data/pools/transactionPool_test.go2
-rw-r--r--data/stateproofmsg/message.go2
-rw-r--r--data/transactions/application.go2
-rw-r--r--data/transactions/application_test.go2
-rw-r--r--data/transactions/asset.go2
-rw-r--r--data/transactions/common_test.go2
-rw-r--r--data/transactions/error.go2
-rw-r--r--data/transactions/json_test.go2
-rw-r--r--data/transactions/keyreg.go2
-rw-r--r--data/transactions/logic/README.md3
-rw-r--r--data/transactions/logic/TEAL_opcodes_v1.md24
-rw-r--r--data/transactions/logic/TEAL_opcodes_v10.md164
-rw-r--r--data/transactions/logic/TEAL_opcodes_v2.md54
-rw-r--r--data/transactions/logic/TEAL_opcodes_v3.md64
-rw-r--r--data/transactions/logic/TEAL_opcodes_v4.md74
-rw-r--r--data/transactions/logic/TEAL_opcodes_v5.md106
-rw-r--r--data/transactions/logic/TEAL_opcodes_v6.md118
-rw-r--r--data/transactions/logic/TEAL_opcodes_v7.md132
-rw-r--r--data/transactions/logic/TEAL_opcodes_v8.md152
-rw-r--r--data/transactions/logic/TEAL_opcodes_v9.md152
-rw-r--r--data/transactions/logic/assembler.go6
-rw-r--r--data/transactions/logic/assembler_test.go33
-rw-r--r--data/transactions/logic/backwardCompat_test.go2
-rw-r--r--data/transactions/logic/blackbox_test.go2
-rw-r--r--data/transactions/logic/box.go2
-rw-r--r--data/transactions/logic/box_test.go2
-rw-r--r--data/transactions/logic/crypto.go31
-rw-r--r--data/transactions/logic/crypto_test.go131
-rw-r--r--data/transactions/logic/debugger.go2
-rw-r--r--data/transactions/logic/debugger_eval_test.go2
-rw-r--r--data/transactions/logic/debugger_test.go2
-rw-r--r--data/transactions/logic/doc.go7
-rw-r--r--data/transactions/logic/doc_test.go2
-rw-r--r--data/transactions/logic/eval.go171
-rw-r--r--data/transactions/logic/evalAppTxn_test.go6
-rw-r--r--data/transactions/logic/evalBench_test.go2
-rw-r--r--data/transactions/logic/evalStateful_test.go229
-rw-r--r--data/transactions/logic/eval_test.go136
-rw-r--r--data/transactions/logic/export_test.go4
-rw-r--r--data/transactions/logic/fields.go2
-rw-r--r--data/transactions/logic/fields_test.go2
-rw-r--r--data/transactions/logic/frames.go2
-rw-r--r--data/transactions/logic/frames_test.go2
-rw-r--r--data/transactions/logic/jsonspec_test.go2
-rw-r--r--data/transactions/logic/langspec_v1.json29
-rw-r--r--data/transactions/logic/langspec_v10.json77
-rw-r--r--data/transactions/logic/langspec_v2.json45
-rw-r--r--data/transactions/logic/langspec_v3.json45
-rw-r--r--data/transactions/logic/langspec_v4.json51
-rw-r--r--data/transactions/logic/langspec_v5.json69
-rw-r--r--data/transactions/logic/langspec_v6.json73
-rw-r--r--data/transactions/logic/langspec_v7.json77
-rw-r--r--data/transactions/logic/langspec_v8.json77
-rw-r--r--data/transactions/logic/langspec_v9.json77
-rw-r--r--data/transactions/logic/ledger_test.go4
-rw-r--r--data/transactions/logic/mocktracer/scenarios.go2
-rw-r--r--data/transactions/logic/mocktracer/tracer.go2
-rw-r--r--data/transactions/logic/opcodeExplain.go2
-rw-r--r--data/transactions/logic/opcodes.go72
-rw-r--r--data/transactions/logic/opcodes_test.go2
-rw-r--r--data/transactions/logic/pairing.go2
-rw-r--r--data/transactions/logic/pairing_test.go2
-rw-r--r--data/transactions/logic/program.go2
-rw-r--r--data/transactions/logic/resources.go2
-rw-r--r--data/transactions/logic/resources_test.go4
-rw-r--r--data/transactions/logic/sourcemap.go2
-rw-r--r--data/transactions/logic/sourcemap_test.go2
-rw-r--r--data/transactions/logic/teal.tmLanguage.json2
-rw-r--r--data/transactions/logic/tracer.go2
-rw-r--r--data/transactions/logic/tracer_test.go2
-rw-r--r--data/transactions/logicsig.go2
-rw-r--r--data/transactions/payment.go2
-rw-r--r--data/transactions/payment_test.go2
-rw-r--r--data/transactions/payset.go2
-rw-r--r--data/transactions/payset_test.go2
-rw-r--r--data/transactions/perf_test.go2
-rw-r--r--data/transactions/signedtxn.go2
-rw-r--r--data/transactions/signedtxn_test.go2
-rw-r--r--data/transactions/sort.go2
-rw-r--r--data/transactions/stateproof.go2
-rw-r--r--data/transactions/teal.go2
-rw-r--r--data/transactions/teal_test.go2
-rw-r--r--data/transactions/testhelpers.go2
-rw-r--r--data/transactions/transaction.go2
-rw-r--r--data/transactions/transaction_test.go2
-rw-r--r--data/transactions/verify/artifact_test.go2
-rw-r--r--data/transactions/verify/txn.go2
-rw-r--r--data/transactions/verify/txnBatch.go2
-rw-r--r--data/transactions/verify/txnBatch_test.go2
-rw-r--r--data/transactions/verify/txn_test.go2
-rw-r--r--data/transactions/verify/verifiedTxnCache.go2
-rw-r--r--data/transactions/verify/verifiedTxnCache_test.go2
-rw-r--r--data/txDupCache.go2
-rw-r--r--data/txDupCache_test.go2
-rw-r--r--data/txHandler.go19
-rw-r--r--data/txHandler_test.go14
-rw-r--r--data/txntest/defi.go2
-rw-r--r--data/txntest/txn.go2
-rw-r--r--gen/generate.go2
-rw-r--r--gen/generate_test.go2
-rw-r--r--gen/walletData.go2
-rw-r--r--internal/rapidgen/rapidgenerators.go2
-rw-r--r--internal/rapidgen/tld.go2
-rw-r--r--ledger/acctdeltas.go2
-rw-r--r--ledger/acctdeltas_test.go2
-rw-r--r--ledger/acctonline.go2
-rw-r--r--ledger/acctonline_expired_test.go2
-rw-r--r--ledger/acctonline_test.go2
-rw-r--r--ledger/acctupdates.go2
-rw-r--r--ledger/acctupdates_test.go2
-rw-r--r--ledger/applications_test.go2
-rw-r--r--ledger/apply/application.go2
-rw-r--r--ledger/apply/application_test.go2
-rw-r--r--ledger/apply/apply.go2
-rw-r--r--ledger/apply/asset.go2
-rw-r--r--ledger/apply/asset_test.go2
-rw-r--r--ledger/apply/keyreg.go2
-rw-r--r--ledger/apply/keyreg_test.go2
-rw-r--r--ledger/apply/mockBalances_test.go2
-rw-r--r--ledger/apply/payment.go2
-rw-r--r--ledger/apply/payment_test.go2
-rw-r--r--ledger/apply/stateproof.go2
-rw-r--r--ledger/apply/stateproof_test.go2
-rw-r--r--ledger/apptxn_test.go2
-rw-r--r--ledger/archival_test.go2
-rw-r--r--ledger/blockqueue.go19
-rw-r--r--ledger/blockqueue_test.go117
-rw-r--r--ledger/boxtxn_test.go2
-rw-r--r--ledger/bulletin.go2
-rw-r--r--ledger/bulletin_test.go2
-rw-r--r--ledger/catchpointfileheader.go2
-rw-r--r--ledger/catchpointfilewriter.go2
-rw-r--r--ledger/catchpointfilewriter_test.go2
-rw-r--r--ledger/catchpointtracker.go17
-rw-r--r--ledger/catchpointtracker_test.go2
-rw-r--r--ledger/catchupaccessor.go2
-rw-r--r--ledger/catchupaccessor_test.go2
-rw-r--r--ledger/double_test.go2
-rw-r--r--ledger/encoded/recordsV5.go2
-rw-r--r--ledger/encoded/recordsV6.go2
-rw-r--r--ledger/encoded/recordsV6_test.go2
-rw-r--r--ledger/eval/appcow.go2
-rw-r--r--ledger/eval/appcow_test.go2
-rw-r--r--ledger/eval/applications.go2
-rw-r--r--ledger/eval/assetcow.go2
-rw-r--r--ledger/eval/cow.go2
-rw-r--r--ledger/eval/cow_creatables.go2
-rw-r--r--ledger/eval/cow_test.go2
-rw-r--r--ledger/eval/eval.go2
-rw-r--r--ledger/eval/eval_test.go2
-rw-r--r--ledger/eval/evalindexer.go2
-rw-r--r--ledger/eval/prefetcher/error.go2
-rw-r--r--ledger/eval/prefetcher/prefetcher.go2
-rw-r--r--ledger/eval/prefetcher/prefetcher_alignment_test.go2
-rw-r--r--ledger/eval/prefetcher/prefetcher_test.go2
-rw-r--r--ledger/eval/prefetcher/prefetcher_whitebox_test.go2
-rw-r--r--ledger/eval/txntracer.go2
-rw-r--r--ledger/eval/txntracer_test.go2
-rw-r--r--ledger/eval_simple_test.go2
-rw-r--r--ledger/evalbench_test.go2
-rw-r--r--ledger/evalindexer.go2
-rw-r--r--ledger/evalindexer_test.go2
-rw-r--r--ledger/fullblock_perf_test.go2
-rw-r--r--ledger/ledger.go17
-rw-r--r--ledger/ledger_perf_test.go2
-rw-r--r--ledger/ledger_test.go96
-rw-r--r--ledger/ledgercore/accountdata.go2
-rw-r--r--ledger/ledgercore/accountdata_test.go2
-rw-r--r--ledger/ledgercore/accountresource.go2
-rw-r--r--ledger/ledgercore/catchpointlabel.go2
-rw-r--r--ledger/ledgercore/catchpointlabel_test.go2
-rw-r--r--ledger/ledgercore/error.go2
-rw-r--r--ledger/ledgercore/misc.go2
-rw-r--r--ledger/ledgercore/onlineacct.go2
-rw-r--r--ledger/ledgercore/statedelta.go2
-rw-r--r--ledger/ledgercore/statedelta_test.go2
-rw-r--r--ledger/ledgercore/stateproofverification.go2
-rw-r--r--ledger/ledgercore/totals.go2
-rw-r--r--ledger/ledgercore/totals_test.go2
-rw-r--r--ledger/ledgercore/validatedBlock.go2
-rw-r--r--ledger/ledgercore/votersForRound.go2
-rw-r--r--ledger/lruaccts.go2
-rw-r--r--ledger/lruaccts_test.go2
-rw-r--r--ledger/lrukv.go2
-rw-r--r--ledger/lrukv_test.go2
-rw-r--r--ledger/lruonlineaccts.go2
-rw-r--r--ledger/lruonlineaccts_test.go2
-rw-r--r--ledger/lruresources.go2
-rw-r--r--ledger/lruresources_test.go2
-rw-r--r--ledger/metrics.go2
-rw-r--r--ledger/metrics_test.go2
-rw-r--r--ledger/notifier.go2
-rw-r--r--ledger/onlineaccountscache.go2
-rw-r--r--ledger/onlineaccountscache_test.go2
-rw-r--r--ledger/onlinetopheap.go2
-rw-r--r--ledger/onlinetopheap_test.go2
-rw-r--r--ledger/perf_test.go2
-rw-r--r--ledger/simple_test.go2
-rw-r--r--ledger/simulation/initialStates.go2
-rw-r--r--ledger/simulation/resources.go2
-rw-r--r--ledger/simulation/resources_test.go2
-rw-r--r--ledger/simulation/simulation_eval_test.go4
-rw-r--r--ledger/simulation/simulator.go2
-rw-r--r--ledger/simulation/simulator_test.go2
-rw-r--r--ledger/simulation/testing/utils.go2
-rw-r--r--ledger/simulation/trace.go2
-rw-r--r--ledger/simulation/tracer.go2
-rw-r--r--ledger/simulation/tracer_test.go2
-rw-r--r--ledger/spverificationtracker.go2
-rw-r--r--ledger/spverificationtracker_test.go2
-rw-r--r--ledger/store/blockdb/blockdb.go2
-rw-r--r--ledger/store/blockdb/blockdb_test.go2
-rw-r--r--ledger/store/testing/helpers.go2
-rw-r--r--ledger/store/trackerdb/catchpoint.go2
-rw-r--r--ledger/store/trackerdb/data.go2
-rw-r--r--ledger/store/trackerdb/data_test.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/accounts_reader.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/accounts_reader_ext.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/accounts_writer.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/accounts_writer_ext.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/dualdriver.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/online_accounts_reader.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/online_accounts_writer.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/stateproof_reader.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/stateproof_writer.go2
-rw-r--r--ledger/store/trackerdb/dualdriver/transaction_for_testing.go2
-rw-r--r--ledger/store/trackerdb/generickv/accounts_ext_reader.go2
-rw-r--r--ledger/store/trackerdb/generickv/accounts_ext_writer.go2
-rw-r--r--ledger/store/trackerdb/generickv/accounts_reader.go2
-rw-r--r--ledger/store/trackerdb/generickv/accounts_writer.go2
-rw-r--r--ledger/store/trackerdb/generickv/catchpoint.go2
-rw-r--r--ledger/store/trackerdb/generickv/init_accounts.go2
-rw-r--r--ledger/store/trackerdb/generickv/migrations.go2
-rw-r--r--ledger/store/trackerdb/generickv/onlineaccounts_reader.go2
-rw-r--r--ledger/store/trackerdb/generickv/onlineaccounts_writer.go2
-rw-r--r--ledger/store/trackerdb/generickv/reader.go2
-rw-r--r--ledger/store/trackerdb/generickv/schema.go2
-rw-r--r--ledger/store/trackerdb/generickv/stateproof_reader.go2
-rw-r--r--ledger/store/trackerdb/generickv/stateproof_writer.go2
-rw-r--r--ledger/store/trackerdb/generickv/writer.go2
-rw-r--r--ledger/store/trackerdb/hashing.go2
-rw-r--r--ledger/store/trackerdb/interface.go2
-rw-r--r--ledger/store/trackerdb/params.go2
-rw-r--r--ledger/store/trackerdb/pebbledbdriver/pebbledriver.go2
-rw-r--r--ledger/store/trackerdb/pebbledbdriver/pebbledriver_arm.go2
-rw-r--r--ledger/store/trackerdb/pebbledbdriver/testing.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/accountsV2.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/accountsV2_test.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/catchpoint.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/catchpointPendingHashesIter.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/catchpoint_test.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/encodedAccountsIter.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/kvsIter.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/merkle_committer.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/orderedAccountsIter.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/schema.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/schema_test.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/spVerificationAccessor.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/sql.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/sql_test.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/sqlitedriver.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/testing.go2
-rw-r--r--ledger/store/trackerdb/sqlitedriver/trackerdbV2.go2
-rw-r--r--ledger/store/trackerdb/store.go2
-rw-r--r--ledger/store/trackerdb/testdb/testdb.go2
-rw-r--r--ledger/store/trackerdb/testinterface.go2
-rw-r--r--ledger/store/trackerdb/testsuite/accounts_ext_kv_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/accounts_kv_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/dbsemantics_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/dual_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/migration_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/mockdb_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/onlineaccounts_kv_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/pebbledb_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/sqlitedb_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/stateproofs_kv_test.go2
-rw-r--r--ledger/store/trackerdb/testsuite/utils_test.go2
-rw-r--r--ledger/store/trackerdb/utils.go2
-rw-r--r--ledger/store/trackerdb/version.go2
-rw-r--r--ledger/testing/accountsTotals.go2
-rw-r--r--ledger/testing/consensusRange.go2
-rw-r--r--ledger/testing/consensusRange_test.go2
-rw-r--r--ledger/testing/initState.go2
-rw-r--r--ledger/testing/randomAccounts.go2
-rw-r--r--ledger/testing/randomAccounts_test.go2
-rw-r--r--ledger/testing/testGenesis.go2
-rw-r--r--ledger/testing/withAndWithoutCache.go2
-rw-r--r--ledger/tracker.go2
-rw-r--r--ledger/tracker_test.go2
-rw-r--r--ledger/trackerdb.go2
-rw-r--r--ledger/txnbench_test.go2
-rw-r--r--ledger/txtail.go52
-rw-r--r--ledger/txtail_test.go82
-rw-r--r--ledger/voters.go2
-rw-r--r--ledger/voters_test.go2
-rw-r--r--libgoal/accounts.go2
-rw-r--r--libgoal/error.go2
-rw-r--r--libgoal/libgoal.go2
-rw-r--r--libgoal/libgoal_test.go2
-rw-r--r--libgoal/lockedFile.go2
-rw-r--r--libgoal/lockedFileLinux.go2
-rw-r--r--libgoal/lockedFileUnix.go2
-rw-r--r--libgoal/lockedFileWindows.go2
-rw-r--r--libgoal/participation.go2
-rw-r--r--libgoal/participation/participation.go2
-rw-r--r--libgoal/participation/participation_test.go2
-rw-r--r--libgoal/system.go2
-rw-r--r--libgoal/teal.go2
-rw-r--r--libgoal/transactions.go2
-rw-r--r--libgoal/unencryptedWallet.go2
-rw-r--r--libgoal/walletHandles.go2
-rw-r--r--libgoal/wallets.go2
-rw-r--r--logging/collector.go2
-rw-r--r--logging/cyclicWriter.go2
-rw-r--r--logging/cyclicWriter_test.go2
-rw-r--r--logging/logBuffer.go2
-rw-r--r--logging/logBuffer_test.go2
-rw-r--r--logging/log_test.go2
-rw-r--r--logging/logspec/agreement.go2
-rw-r--r--logging/logspec/ledger.go2
-rw-r--r--logging/logspec/root.go2
-rw-r--r--logging/telemetry.go2
-rw-r--r--logging/telemetryCommon.go2
-rw-r--r--logging/telemetryConfig.go2
-rw-r--r--logging/telemetryConfig_test.go2
-rw-r--r--logging/telemetryFilteredHook.go2
-rw-r--r--logging/telemetry_test.go2
-rw-r--r--logging/telemetryhook.go2
-rw-r--r--logging/telemetryhook_test.go2
-rw-r--r--logging/telemetryspec/category.go2
-rw-r--r--logging/telemetryspec/event.go2
-rw-r--r--logging/telemetryspec/eventTiming.go2
-rw-r--r--logging/telemetryspec/metric.go2
-rw-r--r--logging/telemetryspec/metric_test.go2
-rw-r--r--logging/testingLogger.go2
-rw-r--r--logging/usage.go2
-rw-r--r--netdeploy/network.go12
-rw-r--r--netdeploy/networkTemplate.go5
-rw-r--r--netdeploy/networkTemplates_test.go2
-rw-r--r--netdeploy/network_test.go2
-rw-r--r--netdeploy/remote/bootstrappedNetwork.go2
-rw-r--r--netdeploy/remote/bootstrappedNetwork_test.go2
-rw-r--r--netdeploy/remote/buildConfig.go2
-rw-r--r--netdeploy/remote/deployedNetwork.go2
-rw-r--r--netdeploy/remote/deployedNetwork_test.go2
-rw-r--r--netdeploy/remote/hostConfig.go2
-rw-r--r--netdeploy/remote/hostTemplate.go2
-rw-r--r--netdeploy/remote/nodeConfig.go2
-rw-r--r--netdeploy/remote/nodeWalletData.go2
-rw-r--r--netdeploy/remote/nodecfg/nodeConfigurator.go2
-rw-r--r--netdeploy/remote/nodecfg/nodeDir.go2
-rw-r--r--netdeploy/remote/topology.go2
-rw-r--r--network/addr.go2
-rw-r--r--network/addr_test.go2
-rw-r--r--network/connPerfMon.go2
-rw-r--r--network/connPerfMon_test.go2
-rw-r--r--network/dialer.go2
-rw-r--r--network/gossipNode.go2
-rw-r--r--network/limited_reader_slurper.go2
-rw-r--r--network/limited_reader_slurper_test.go2
-rw-r--r--network/messageFilter.go16
-rw-r--r--network/messageFilter_test.go2
-rw-r--r--network/messagetracer/graphtrace.go2
-rw-r--r--network/messagetracer/interface.go2
-rw-r--r--network/msgCompressor.go2
-rw-r--r--network/msgCompressor_test.go2
-rw-r--r--network/msgOfInterest.go2
-rw-r--r--network/msgOfInterest_test.go2
-rw-r--r--network/multiplexer.go2
-rw-r--r--network/multiplexer_test.go2
-rw-r--r--network/netidentity.go2
-rw-r--r--network/netidentity_test.go2
-rw-r--r--network/netprio.go2
-rw-r--r--network/netprio_test.go2
-rw-r--r--network/p2p/dnsaddr/resolve.go2
-rw-r--r--network/p2p/dnsaddr/resolveController.go2
-rw-r--r--network/p2p/dnsaddr/resolveController_test.go2
-rw-r--r--network/p2p/dnsaddr/resolve_test.go2
-rw-r--r--network/p2p/p2p.go2
-rw-r--r--network/p2p/p2p_test.go2
-rw-r--r--network/p2p/peerID.go2
-rw-r--r--network/p2p/peerID_test.go2
-rw-r--r--network/p2p/peerstore/peerstore.go2
-rw-r--r--network/p2p/peerstore/peerstore_test.go2
-rw-r--r--network/p2p/peerstore/utils.go2
-rw-r--r--network/p2p/peerstore/utils_test.go2
-rw-r--r--network/p2p/pubsub.go2
-rw-r--r--network/p2p/streams.go2
-rw-r--r--network/p2pNetwork.go2
-rw-r--r--network/p2pNetwork_test.go2
-rw-r--r--network/p2pPeer.go2
-rw-r--r--network/peersheap.go2
-rw-r--r--network/phonebook.go2
-rw-r--r--network/phonebook_test.go2
-rw-r--r--network/rateLimitingTransport.go2
-rw-r--r--network/requestLogger.go2
-rw-r--r--network/requestLogger_test.go2
-rw-r--r--network/requestTracker.go2
-rw-r--r--network/requestTracker_test.go2
-rw-r--r--network/topics.go2
-rw-r--r--network/topics_test.go2
-rw-r--r--network/websocketProxy_test.go2
-rw-r--r--network/wsNetwork.go2
-rw-r--r--network/wsNetwork_test.go4
-rw-r--r--network/wsPeer.go2
-rw-r--r--network/wsPeer_test.go2
-rw-r--r--node/assemble_test.go2
-rw-r--r--node/error.go2
-rw-r--r--node/follower_node.go2
-rw-r--r--node/follower_node_test.go2
-rw-r--r--node/impls.go2
-rw-r--r--node/netprio.go2
-rw-r--r--node/netprio_test.go2
-rw-r--r--node/node.go24
-rw-r--r--node/node_test.go2
-rw-r--r--nodecontrol/LaggedStdIo.go2
-rw-r--r--nodecontrol/NodeController.go2
-rw-r--r--nodecontrol/algodControl.go2
-rw-r--r--nodecontrol/algodControl_test.go2
-rw-r--r--nodecontrol/kmdControl.go2
-rw-r--r--nodecontrol/kmdControl_common.go2
-rw-r--r--nodecontrol/kmdControl_windows.go2
-rw-r--r--nodecontrol/nodeControlErrors.go2
-rw-r--r--protocol/codec.go2
-rw-r--r--protocol/codec_test.go2
-rw-r--r--protocol/codec_tester.go2
-rw-r--r--protocol/consensus.go2
-rw-r--r--protocol/encodebench_test.go2
-rw-r--r--protocol/hash.go2
-rw-r--r--protocol/hash_test.go2
-rw-r--r--protocol/networks.go2
-rw-r--r--protocol/stateproof.go2
-rw-r--r--protocol/tags.go2
-rw-r--r--protocol/tags_test.go2
-rw-r--r--protocol/test/allocbound_slice.go2
-rw-r--r--protocol/transcode/core.go2
-rw-r--r--protocol/transcode/core_test.go2
-rw-r--r--protocol/txntype.go2
-rw-r--r--rpcs/blockService.go2
-rw-r--r--rpcs/blockService_test.go2
-rw-r--r--rpcs/httpTxSync.go2
-rw-r--r--rpcs/ledgerService.go2
-rw-r--r--rpcs/ledgerService_test.go2
-rw-r--r--rpcs/registrar.go2
-rw-r--r--rpcs/txService.go2
-rw-r--r--rpcs/txService_test.go2
-rw-r--r--rpcs/txSyncer.go2
-rw-r--r--rpcs/txSyncer_test.go2
-rwxr-xr-xscripts/check_license.sh66
-rwxr-xr-xscripts/release/mule/deploy/releases_page/generate_releases_page.py4
-rw-r--r--scripts/release/mule/deploy/releases_page/html.tpl16
-rw-r--r--shared/algoh/config.go2
-rw-r--r--shared/pingpong/accounts.go2
-rw-r--r--shared/pingpong/accounts_test.go2
-rw-r--r--shared/pingpong/config.go2
-rw-r--r--shared/pingpong/pingpong.go2
-rw-r--r--stateproof/abstractions.go2
-rw-r--r--stateproof/builder.go2
-rw-r--r--stateproof/db.go2
-rw-r--r--stateproof/db_test.go2
-rw-r--r--stateproof/recovery.go2
-rw-r--r--stateproof/signer.go2
-rw-r--r--stateproof/stateproofMessageGenerator.go2
-rw-r--r--stateproof/stateproofMessageGenerator_test.go2
-rw-r--r--stateproof/verify/stateproof.go2
-rw-r--r--stateproof/verify/stateproof_test.go2
-rw-r--r--stateproof/worker.go2
-rw-r--r--stateproof/worker_test.go2
-rw-r--r--test/commandandcontrol/cc_agent/component/agent.go2
-rw-r--r--test/commandandcontrol/cc_agent/component/agent_test.go2
-rw-r--r--test/commandandcontrol/cc_agent/component/pingPongComponent.go2
-rw-r--r--test/commandandcontrol/cc_agent/main.go2
-rw-r--r--test/commandandcontrol/cc_client/main.go2
-rw-r--r--test/commandandcontrol/cc_service/main.go2
-rw-r--r--test/commandandcontrol/lib/ccCommon.go2
-rw-r--r--test/e2e-go/cli/algod/cleanup_test.go2
-rw-r--r--test/e2e-go/cli/algod/expect/algod_expect_test.go2
-rw-r--r--test/e2e-go/cli/algod/stdstreams_test.go2
-rw-r--r--test/e2e-go/cli/algoh/expect/algoh_expect_test.go2
-rw-r--r--test/e2e-go/cli/goal/account_test.go2
-rw-r--r--test/e2e-go/cli/goal/clerk_test.go2
-rw-r--r--test/e2e-go/cli/goal/common_test.go2
-rw-r--r--test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp4
-rw-r--r--test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go2
-rwxr-xr-x[-rw-r--r--]test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp0
-rw-r--r--test/e2e-go/cli/goal/expect/goal_expect_test.go2
-rw-r--r--[-rwxr-xr-x]test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp0
-rw-r--r--[-rwxr-xr-x]test/e2e-go/cli/goal/expect/tealConsensusTest.exp0
-rw-r--r--test/e2e-go/cli/goal/node_cleanup_test.go2
-rw-r--r--test/e2e-go/cli/perf/libgoal_test.go2
-rw-r--r--test/e2e-go/cli/perf/payment_test.go2
-rw-r--r--test/e2e-go/cli/tealdbg/cdtmock/main.go2
-rw-r--r--test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go2
-rw-r--r--test/e2e-go/features/accountPerf/sixMillion_test.go2
-rw-r--r--test/e2e-go/features/catchup/basicCatchup_test.go2
-rw-r--r--test/e2e-go/features/catchup/catchpointCatchup_test.go21
-rw-r--r--test/e2e-go/features/catchup/stateproofsCatchup_test.go2
-rw-r--r--test/e2e-go/features/devmode/devmode_test.go2
-rw-r--r--test/e2e-go/features/followernode/syncDeltas_test.go2
-rw-r--r--test/e2e-go/features/followernode/syncRestart_test.go2
-rw-r--r--test/e2e-go/features/multisig/multisig_test.go2
-rw-r--r--test/e2e-go/features/p2p/p2p_basic_test.go2
-rw-r--r--test/e2e-go/features/participation/accountParticipationTransitions_test.go2
-rw-r--r--test/e2e-go/features/participation/deletePartKeys_test.go2
-rw-r--r--test/e2e-go/features/participation/onlineOfflineParticipation_test.go2
-rw-r--r--test/e2e-go/features/participation/overlappingParticipationKeys_test.go2
-rw-r--r--test/e2e-go/features/participation/participationExpiration_test.go2
-rw-r--r--test/e2e-go/features/participation/participationRewards_test.go2
-rw-r--r--test/e2e-go/features/partitionRecovery/partitionRecovery_test.go2
-rw-r--r--test/e2e-go/features/privatenet/privatenet_test.go2
-rw-r--r--test/e2e-go/features/stateproofs/stateproofs_test.go2
-rw-r--r--test/e2e-go/features/teal/compile_test.go2
-rw-r--r--test/e2e-go/features/transactions/accountv2_test.go2
-rw-r--r--test/e2e-go/features/transactions/app_pages_test.go2
-rw-r--r--test/e2e-go/features/transactions/application_test.go2
-rw-r--r--test/e2e-go/features/transactions/asset_test.go2
-rw-r--r--test/e2e-go/features/transactions/close_account_test.go2
-rw-r--r--test/e2e-go/features/transactions/group_test.go2
-rw-r--r--test/e2e-go/features/transactions/lease_test.go2
-rw-r--r--test/e2e-go/features/transactions/onlineStatusChange_test.go2
-rw-r--r--test/e2e-go/features/transactions/proof_test.go2
-rw-r--r--test/e2e-go/features/transactions/sendReceive_test.go2
-rw-r--r--test/e2e-go/globals/constants.go2
-rw-r--r--test/e2e-go/kmd/e2e_kmd_server_client_test.go2
-rw-r--r--test/e2e-go/kmd/e2e_kmd_sqlite_test.go2
-rw-r--r--test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go2
-rw-r--r--test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go2
-rw-r--r--test/e2e-go/kmd/e2e_kmd_wallet_test.go2
-rw-r--r--test/e2e-go/perf/basic_test.go2
-rw-r--r--test/e2e-go/restAPI/helpers.go2
-rw-r--r--test/e2e-go/restAPI/other/appsRestAPI_test.go16
-rw-r--r--test/e2e-go/restAPI/other/misc_test.go2
-rw-r--r--test/e2e-go/restAPI/restClient_test.go2
-rw-r--r--test/e2e-go/restAPI/simulate/simulateRestAPI_test.go2
-rw-r--r--test/e2e-go/restAPI/stateproof/stateproofRestAPI_test.go2
-rw-r--r--test/e2e-go/stress/transactions/createManyAndGoOnline_test.go2
-rw-r--r--test/e2e-go/upgrades/application_support_test.go2
-rw-r--r--test/e2e-go/upgrades/rekey_support_test.go2
-rw-r--r--test/e2e-go/upgrades/send_receive_upgrade_test.go2
-rw-r--r--test/e2e-go/upgrades/stateproof_participation_test.go2
-rw-r--r--test/framework/fixtures/baseFixture.go2
-rw-r--r--test/framework/fixtures/expectFixture.go2
-rw-r--r--test/framework/fixtures/fixture.go2
-rw-r--r--test/framework/fixtures/goalFixture.go2
-rw-r--r--test/framework/fixtures/kmdFixture.go2
-rw-r--r--test/framework/fixtures/libgoalFixture.go11
-rw-r--r--test/framework/fixtures/restClientFixture.go2
-rw-r--r--test/framework/fixtures/webProxyFixture.go2
-rw-r--r--test/heapwatch/block_history.py2
-rw-r--r--test/heapwatch/block_history_plot.py2
-rw-r--r--test/heapwatch/block_history_relays.py2
-rw-r--r--test/heapwatch/client_ram_report.py2
-rw-r--r--test/heapwatch/heapWatch.py2
-rw-r--r--test/heapwatch/metrics_delta.py2
-rw-r--r--test/heapwatch/nodeHostTarget.py2
-rw-r--r--test/heapwatch/runNodeHost.py2
-rw-r--r--test/linttest/lintissues.go2
-rw-r--r--test/netperf-go/puppeteer/main.go2
-rw-r--r--test/netperf-go/puppeteer/promMetricFetcher.go2
-rw-r--r--test/netperf-go/puppeteer/promMetricFetcher_test.go2
-rw-r--r--test/netperf-go/puppeteer/puppeteer.go2
-rw-r--r--test/netperf-go/puppeteer/puppeteer_test.go2
-rw-r--r--test/netperf-go/puppeteer/roundpoller.go2
-rw-r--r--test/partitiontest/filtering.go2
-rw-r--r--test/reflectionhelpers/helpers.go2
-rwxr-xr-xtest/scripts/e2e.sh7
-rwxr-xr-xtest/scripts/e2e_client_runner.py5
-rwxr-xr-xtest/scripts/e2e_subs/avm-failure-info.py78
-rwxr-xr-xtest/scripts/e2e_subs/example.py2
-rwxr-xr-xtest/scripts/e2e_subs/goal/goal.py15
-rwxr-xr-xtest/scripts/e2e_subs/min_balance.py2
-rwxr-xr-xtest/scripts/e2e_subs/shared-resources.py2
-rwxr-xr-xtest/testdata/deployednettemplates/generate-recipe/generate_network.py1
-rw-r--r--test/testdata/deployednettemplates/recipes/custom/configs/node.json2
-rw-r--r--tools/block-generator/core/commands.go2
-rw-r--r--tools/block-generator/generator/config.go2
-rw-r--r--tools/block-generator/generator/config_test.go2
-rw-r--r--tools/block-generator/generator/daemon.go2
-rw-r--r--tools/block-generator/generator/generate.go2
-rw-r--r--tools/block-generator/generator/generate_apps.go2
-rw-r--r--tools/block-generator/generator/generate_test.go2
-rw-r--r--tools/block-generator/generator/generator_ledger.go2
-rw-r--r--tools/block-generator/generator/generator_types.go2
-rw-r--r--tools/block-generator/generator/make_transactions.go2
-rw-r--r--tools/block-generator/generator/server.go2
-rw-r--r--tools/block-generator/generator/server_test.go2
-rw-r--r--tools/block-generator/generator/utils.go2
-rw-r--r--tools/block-generator/generator/utils_test.go2
-rw-r--r--tools/block-generator/main.go2
-rw-r--r--tools/block-generator/runner/metrics_collector.go2
-rw-r--r--tools/block-generator/runner/reporting_test.go2
-rw-r--r--tools/block-generator/runner/run.go2
-rw-r--r--tools/block-generator/runner/runner.go2
-rw-r--r--tools/block-generator/util/util.go2
-rw-r--r--tools/boxkey/convertBoxKey.go2
-rw-r--r--tools/debug/algodump/main.go2
-rw-r--r--tools/debug/carpenter/main.go2
-rw-r--r--tools/debug/chopper/main.go2
-rw-r--r--tools/debug/coroner/main.go2
-rw-r--r--tools/debug/determaccount/main.go2
-rw-r--r--tools/debug/dumpblocks/main.go2
-rw-r--r--tools/debug/genconsensusconfig/main.go2
-rw-r--r--tools/debug/logfilter/main.go2
-rw-r--r--tools/debug/logfilter/main_test.go2
-rw-r--r--tools/debug/transplanter/main.go2
-rw-r--r--tools/misc/convertAddress.go2
-rw-r--r--tools/network/bootstrap.go2
-rw-r--r--tools/network/bootstrap_test.go2
-rw-r--r--tools/network/cloudflare/cloudflare.go2
-rw-r--r--tools/network/cloudflare/createRecord.go2
-rw-r--r--tools/network/cloudflare/deleteRecord.go2
-rw-r--r--tools/network/cloudflare/helpers.go2
-rw-r--r--tools/network/cloudflare/listRecords.go2
-rw-r--r--tools/network/cloudflare/updateRecord.go2
-rw-r--r--tools/network/cloudflare/zones.go2
-rw-r--r--tools/network/dnssec/anchor.go2
-rw-r--r--tools/network/dnssec/anchor_test.go2
-rw-r--r--tools/network/dnssec/client.go2
-rw-r--r--tools/network/dnssec/client_test.go2
-rw-r--r--tools/network/dnssec/config.go2
-rw-r--r--tools/network/dnssec/config_test.go2
-rw-r--r--tools/network/dnssec/config_unix.go2
-rw-r--r--tools/network/dnssec/config_unix_test.go2
-rw-r--r--tools/network/dnssec/config_windows.go2
-rw-r--r--tools/network/dnssec/dialer.go2
-rw-r--r--tools/network/dnssec/dnssec_test.go2
-rw-r--r--tools/network/dnssec/relay-check/main.go2
-rw-r--r--tools/network/dnssec/resolver.go2
-rw-r--r--tools/network/dnssec/sort.go2
-rw-r--r--tools/network/dnssec/sort_test.go2
-rw-r--r--tools/network/dnssec/testHarness.go2
-rw-r--r--tools/network/dnssec/trustchain.go2
-rw-r--r--tools/network/dnssec/trustedchain_test.go2
-rw-r--r--tools/network/dnssec/trustedzone.go2
-rw-r--r--tools/network/dnssec/trustedzone_test.go2
-rw-r--r--tools/network/dnssec/util.go2
-rw-r--r--tools/network/dnssec/util_test.go2
-rw-r--r--tools/network/externalIP.go2
-rw-r--r--tools/network/resolveController.go2
-rw-r--r--tools/network/resolveController_test.go2
-rw-r--r--tools/network/resolver.go2
-rw-r--r--tools/network/resolver_test.go2
-rw-r--r--tools/network/telemetryURIUpdateService.go2
-rw-r--r--tools/network/telemetryURIUpdateService_test.go2
-rw-r--r--tools/teal/algotmpl/extract.go2
-rw-r--r--tools/teal/algotmpl/main.go2
-rw-r--r--tools/teal/dkey/dsign/main.go2
-rw-r--r--tools/teal/tealcut/main.go2
-rw-r--r--tools/x-repo-types/typeAnalyzer/main.go2
-rw-r--r--tools/x-repo-types/typeAnalyzer/main.tmpl2
-rw-r--r--tools/x-repo-types/typeAnalyzer/typeAnalyzer.go2
-rw-r--r--tools/x-repo-types/typeAnalyzer/typeAnalyzer_test.go2
-rw-r--r--tools/x-repo-types/xrt.go2
-rw-r--r--tools/x-repo-types/xrt_test.go2
-rw-r--r--util/cmdUtils.go2
-rw-r--r--util/codecs/json.go2
-rw-r--r--util/codecs/json_test.go2
-rw-r--r--util/condvar/timedwait.go2
-rw-r--r--util/condvar/timedwait_test.go2
-rw-r--r--util/db/dbpair.go2
-rw-r--r--util/db/dbutil.go2
-rw-r--r--util/db/dbutil_test.go2
-rw-r--r--util/db/fullfsync_darwin.go2
-rw-r--r--util/db/initialize.go2
-rw-r--r--util/db/initialize_test.go2
-rw-r--r--util/db/interfaces.go2
-rw-r--r--util/db/perf_test.go2
-rw-r--r--util/db/versioning.go2
-rw-r--r--util/db/versioning_test.go2
-rw-r--r--util/execpool/backlog.go2
-rw-r--r--util/execpool/pool.go2
-rw-r--r--util/execpool/stream.go2
-rw-r--r--util/execpool/stream_test.go2
-rw-r--r--util/io.go2
-rw-r--r--util/io_test.go2
-rw-r--r--util/list.go2
-rw-r--r--util/list_test.go2
-rw-r--r--util/metrics/counter.go2
-rw-r--r--util/metrics/counterCommon.go2
-rw-r--r--util/metrics/counter_test.go2
-rw-r--r--util/metrics/gauge.go2
-rw-r--r--util/metrics/gauge_test.go2
-rw-r--r--util/metrics/metrics.go2
-rw-r--r--util/metrics/metrics_test.go2
-rw-r--r--util/metrics/registry.go2
-rw-r--r--util/metrics/registryCommon.go2
-rw-r--r--util/metrics/registry_test.go2
-rw-r--r--util/metrics/reporter.go2
-rwxr-xr-xutil/metrics/reporter_test.go2
-rw-r--r--util/metrics/runtime.go2
-rw-r--r--util/metrics/runtime_test.go2
-rw-r--r--util/metrics/service.go2
-rw-r--r--util/metrics/serviceCommon.go2
-rw-r--r--util/metrics/tagcounter.go2
-rw-r--r--util/metrics/tagcounter_test.go2
-rw-r--r--util/process.go2
-rw-r--r--util/process_common.go2
-rw-r--r--util/process_windows.go2
-rw-r--r--util/rateLimit.go2
-rw-r--r--util/rateLimit_test.go2
-rw-r--r--util/s3/fileIterator.go2
-rw-r--r--util/s3/s3Helper.go2
-rw-r--r--util/s3/s3Helper_test.go2
-rw-r--r--util/set.go2
-rw-r--r--util/sleep.go2
-rw-r--r--util/sleep_linux.go2
-rw-r--r--util/sleep_linux_32.go2
-rw-r--r--util/sleep_linux_64.go2
-rw-r--r--util/tar/tar.go2
-rw-r--r--util/tar/untar.go2
-rw-r--r--util/tcpinfo.go2
-rw-r--r--util/tcpinfo_darwin.go2
-rw-r--r--util/tcpinfo_linux.go2
-rw-r--r--util/tcpinfo_noop.go2
-rw-r--r--util/timers/frozen.go2
-rw-r--r--util/timers/interface.go2
-rw-r--r--util/timers/monotonic.go2
-rw-r--r--util/timers/monotonic_test.go2
-rw-r--r--util/tokens/tokens.go2
-rw-r--r--util/util.go2
-rw-r--r--util/util_windows.go2
-rw-r--r--util/uuid/uuid.go2
-rw-r--r--util/uuid/uuid_test.go2
-rw-r--r--util/watchdogStreamReader.go2
1195 files changed, 3434 insertions, 2534 deletions
diff --git a/README.md b/README.md
index f1ebcecea..6925f0222 100644
--- a/README.md
+++ b/README.md
@@ -199,6 +199,6 @@ Provides utilities for the various components:
Please see the [COPYING_FAQ](COPYING_FAQ) for details about how to apply our license.
-Copyright (C) 2019-2023, Algorand Inc.
+Copyright (C) 2019-2024, Algorand Inc.
[developer site url]: https://developer.algorand.org/
diff --git a/SECURITY.md b/SECURITY.md
index 4438c3e9a..670e493ea 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -1,7 +1,7 @@
# Vulnerability Disclosures
-Algorand takes the security of the platform and of its users very seriously. We recognize the important role of external security researchers and developers in helping keep our community safe. As with most security reward programs, we ask that you use common sense when looking for security bugs. Vulnerabilities must be disclosed to us privately with reasonable time to respond, and avoid compromise of other users and accounts, or loss of funds that are not your own. We do not reward denial of service, spam, or social engineering vulnerabilities.
+Algorand takes the security of the platform and of its users very seriously. We recognize the important role of external security researchers and developers in helping keep our community safe. Vulnerabilities must be disclosed to us privately with reasonable time to respond, and avoid compromise of other users and accounts, or loss of funds that are not your own. We do not reward denial of service, spam, or social engineering vulnerabilities.
If you believe that you have found a security vulnerability you may disclose it here:
-https://immunefi.com/bounty/algorand/
+https://algorandtechnologies.com/contact/security/
diff --git a/agreement/abstractions.go b/agreement/abstractions.go
index 44aafa4fd..a22a3a052 100644
--- a/agreement/abstractions.go
+++ b/agreement/abstractions.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/actions.go b/agreement/actions.go
index ef2dd76c2..9a6fa7138 100644
--- a/agreement/actions.go
+++ b/agreement/actions.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/actor.go b/agreement/actor.go
index fa5e0892a..aeae4ce6b 100644
--- a/agreement/actor.go
+++ b/agreement/actor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/agreeInstall.go b/agreement/agreeInstall.go
index 28b1985b2..e07134d72 100644
--- a/agreement/agreeInstall.go
+++ b/agreement/agreeInstall.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/agreementtest/keyManager.go b/agreement/agreementtest/keyManager.go
index 6222cffb6..d17d72658 100644
--- a/agreement/agreementtest/keyManager.go
+++ b/agreement/agreementtest/keyManager.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/agreementtest/simulate.go b/agreement/agreementtest/simulate.go
index 408b44a29..da9c42bf0 100644
--- a/agreement/agreementtest/simulate.go
+++ b/agreement/agreementtest/simulate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/agreementtest/simulate_test.go b/agreement/agreementtest/simulate_test.go
index 53c42411e..a0afca4d4 100644
--- a/agreement/agreementtest/simulate_test.go
+++ b/agreement/agreementtest/simulate_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/asyncVoteVerifier.go b/agreement/asyncVoteVerifier.go
index e30c9c5b1..659f25663 100644
--- a/agreement/asyncVoteVerifier.go
+++ b/agreement/asyncVoteVerifier.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/asyncVoteVerifier_test.go b/agreement/asyncVoteVerifier_test.go
index e344d10b7..539574007 100644
--- a/agreement/asyncVoteVerifier_test.go
+++ b/agreement/asyncVoteVerifier_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/autopsy.go b/agreement/autopsy.go
index 30f41e13c..82df84473 100644
--- a/agreement/autopsy.go
+++ b/agreement/autopsy.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/bundle.go b/agreement/bundle.go
index a7670b53d..b84b86505 100644
--- a/agreement/bundle.go
+++ b/agreement/bundle.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/bundle_test.go b/agreement/bundle_test.go
index 7bbb42f2e..4038a9f48 100644
--- a/agreement/bundle_test.go
+++ b/agreement/bundle_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/cadaver.go b/agreement/cadaver.go
index 3b5c8a78c..843726220 100644
--- a/agreement/cadaver.go
+++ b/agreement/cadaver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/certificate.go b/agreement/certificate.go
index 6ce4b9e0a..818b16488 100644
--- a/agreement/certificate.go
+++ b/agreement/certificate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/certificate_test.go b/agreement/certificate_test.go
index 9ae2ebfa2..04f2f6cef 100644
--- a/agreement/certificate_test.go
+++ b/agreement/certificate_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/common_test.go b/agreement/common_test.go
index 0c11d9553..9ec85618e 100644
--- a/agreement/common_test.go
+++ b/agreement/common_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/coservice.go b/agreement/coservice.go
index 7fe4ab1f5..7def929c1 100644
--- a/agreement/coservice.go
+++ b/agreement/coservice.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/credentialArrivalHistory.go b/agreement/credentialArrivalHistory.go
index b4bc48c97..7b302cd89 100644
--- a/agreement/credentialArrivalHistory.go
+++ b/agreement/credentialArrivalHistory.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/credentialArrivalHistory_test.go b/agreement/credentialArrivalHistory_test.go
index 8626094dd..eb6cef639 100644
--- a/agreement/credentialArrivalHistory_test.go
+++ b/agreement/credentialArrivalHistory_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/cryptoRequestContext.go b/agreement/cryptoRequestContext.go
index a9c512a51..cd779db38 100644
--- a/agreement/cryptoRequestContext.go
+++ b/agreement/cryptoRequestContext.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/cryptoRequestContext_test.go b/agreement/cryptoRequestContext_test.go
index 44b279aee..f5c5db8f7 100644
--- a/agreement/cryptoRequestContext_test.go
+++ b/agreement/cryptoRequestContext_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/cryptoVerifier.go b/agreement/cryptoVerifier.go
index 70609a634..df7e9694c 100644
--- a/agreement/cryptoVerifier.go
+++ b/agreement/cryptoVerifier.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/cryptoVerifier_test.go b/agreement/cryptoVerifier_test.go
index 880702b8d..5a7e19ccf 100644
--- a/agreement/cryptoVerifier_test.go
+++ b/agreement/cryptoVerifier_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/demux.go b/agreement/demux.go
index 7f888dc97..33e15e6cf 100644
--- a/agreement/demux.go
+++ b/agreement/demux.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -19,6 +19,7 @@ package agreement
import (
"context"
"fmt"
+ "io"
"github.com/algorand/go-algorand/config"
"github.com/algorand/go-algorand/logging"
@@ -361,6 +362,17 @@ func (d *demux) next(s *Service, deadline Deadline, fastDeadline Deadline, curre
return
}
+// dumpQueues dumps the current state of the demux queues to the given writer.
+func (d *demux) dumpQueues(w io.Writer) {
+ fmt.Fprintf(w, "rawVotes: %d\n", len(d.rawVotes))
+ fmt.Fprintf(w, "rawProposals: %d\n", len(d.rawProposals))
+ fmt.Fprintf(w, "rawBundles: %d\n", len(d.rawBundles))
+
+ fmt.Fprintf(w, "cryptoVerifiedVotes: %d\n", len(d.crypto.VerifiedVotes()))
+ fmt.Fprintf(w, "cryptoVerified ProposalPayloadTag: %d\n", len(d.crypto.Verified(protocol.ProposalPayloadTag)))
+ fmt.Fprintf(w, "cryptoVerified VoteBundleTag: %d\n", len(d.crypto.Verified(protocol.VoteBundleTag)))
+}
+
// setupCompoundMessage processes compound messages: distinct messages which are delivered together
func setupCompoundMessage(l LedgerReader, m message) (res externalEvent) {
compound := m.CompoundMessage
diff --git a/agreement/demux_test.go b/agreement/demux_test.go
index c6aee6619..e644ce76b 100644
--- a/agreement/demux_test.go
+++ b/agreement/demux_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/doc.go b/agreement/doc.go
index fbf3ee433..12a6bacd1 100644
--- a/agreement/doc.go
+++ b/agreement/doc.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/dynamicFilterTimeoutParams.go b/agreement/dynamicFilterTimeoutParams.go
index 8b02bf082..be4febd6b 100644
--- a/agreement/dynamicFilterTimeoutParams.go
+++ b/agreement/dynamicFilterTimeoutParams.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/dynamicFilterTimeoutParams_test.go b/agreement/dynamicFilterTimeoutParams_test.go
index 7d03de7de..1e84642fa 100644
--- a/agreement/dynamicFilterTimeoutParams_test.go
+++ b/agreement/dynamicFilterTimeoutParams_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/encoding_test.go b/agreement/encoding_test.go
index 7554ec446..0f198cca4 100644
--- a/agreement/encoding_test.go
+++ b/agreement/encoding_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/errors.go b/agreement/errors.go
index e0929b63e..9d4189056 100644
--- a/agreement/errors.go
+++ b/agreement/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/events.go b/agreement/events.go
index afcfa3052..f8d8eca47 100644
--- a/agreement/events.go
+++ b/agreement/events.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/events_test.go b/agreement/events_test.go
index c558f0067..87a494d02 100644
--- a/agreement/events_test.go
+++ b/agreement/events_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/bandwidthFilter_test.go b/agreement/fuzzer/bandwidthFilter_test.go
index 93b958f18..c527976ed 100644
--- a/agreement/fuzzer/bandwidthFilter_test.go
+++ b/agreement/fuzzer/bandwidthFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/catchupFilter_test.go b/agreement/fuzzer/catchupFilter_test.go
index 2ef23d44b..79089b5ea 100644
--- a/agreement/fuzzer/catchupFilter_test.go
+++ b/agreement/fuzzer/catchupFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/clockedFilter_test.go b/agreement/fuzzer/clockedFilter_test.go
index ee4884acd..9ff93be65 100644
--- a/agreement/fuzzer/clockedFilter_test.go
+++ b/agreement/fuzzer/clockedFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/dropMessageFilter_test.go b/agreement/fuzzer/dropMessageFilter_test.go
index 976a1d448..1151a5b54 100644
--- a/agreement/fuzzer/dropMessageFilter_test.go
+++ b/agreement/fuzzer/dropMessageFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/duplicateMessageFilter_test.go b/agreement/fuzzer/duplicateMessageFilter_test.go
index 80a4f9b45..109981040 100644
--- a/agreement/fuzzer/duplicateMessageFilter_test.go
+++ b/agreement/fuzzer/duplicateMessageFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/filter_test.go b/agreement/fuzzer/filter_test.go
index b4b0b7972..643980238 100644
--- a/agreement/fuzzer/filter_test.go
+++ b/agreement/fuzzer/filter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/fuzzer.go b/agreement/fuzzer/fuzzer.go
index 847810f45..a5eb67ce5 100644
--- a/agreement/fuzzer/fuzzer.go
+++ b/agreement/fuzzer/fuzzer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/fuzzer_test.go b/agreement/fuzzer/fuzzer_test.go
index e505faa19..eea4a0354 100644
--- a/agreement/fuzzer/fuzzer_test.go
+++ b/agreement/fuzzer/fuzzer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -261,6 +261,13 @@ func (n *Fuzzer) Start() {
}
}
+// DumpQueues dumps the queues of all the nodes.
+func (n *Fuzzer) DumpQueues() {
+ for _, f := range n.agreements {
+ f.DumpDemuxQueues(os.Stderr)
+ }
+}
+
func (n *Fuzzer) InvokeFiltersShutdown(preshutdown bool) {
for _, facade := range n.facades {
dsFilter := facade.GetDownstreamFilter()
diff --git a/agreement/fuzzer/ledger_test.go b/agreement/fuzzer/ledger_test.go
index a62caee4d..00ba13229 100644
--- a/agreement/fuzzer/ledger_test.go
+++ b/agreement/fuzzer/ledger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageDecoderFilter_test.go b/agreement/fuzzer/messageDecoderFilter_test.go
index 03b0af15d..0482bedea 100644
--- a/agreement/fuzzer/messageDecoderFilter_test.go
+++ b/agreement/fuzzer/messageDecoderFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageDelayFilter_test.go b/agreement/fuzzer/messageDelayFilter_test.go
index 02636b50a..be65409d1 100644
--- a/agreement/fuzzer/messageDelayFilter_test.go
+++ b/agreement/fuzzer/messageDelayFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageDuplicationFilter_test.go b/agreement/fuzzer/messageDuplicationFilter_test.go
index 4a7d4e88c..2be51b3d7 100644
--- a/agreement/fuzzer/messageDuplicationFilter_test.go
+++ b/agreement/fuzzer/messageDuplicationFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messagePriorityQueue_test.go b/agreement/fuzzer/messagePriorityQueue_test.go
index 8638cb48b..d05332144 100644
--- a/agreement/fuzzer/messagePriorityQueue_test.go
+++ b/agreement/fuzzer/messagePriorityQueue_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageReflectionFilter_test.go b/agreement/fuzzer/messageReflectionFilter_test.go
index 73aeae5b1..4ec6f8601 100644
--- a/agreement/fuzzer/messageReflectionFilter_test.go
+++ b/agreement/fuzzer/messageReflectionFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageRegossipFilter_test.go b/agreement/fuzzer/messageRegossipFilter_test.go
index 264de6e64..eef389749 100644
--- a/agreement/fuzzer/messageRegossipFilter_test.go
+++ b/agreement/fuzzer/messageRegossipFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/messageReorderingFilter_test.go b/agreement/fuzzer/messageReorderingFilter_test.go
index 23049deae..e17f12acd 100644
--- a/agreement/fuzzer/messageReorderingFilter_test.go
+++ b/agreement/fuzzer/messageReorderingFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/networkFacade_test.go b/agreement/fuzzer/networkFacade_test.go
index d18f8251d..131361e3e 100644
--- a/agreement/fuzzer/networkFacade_test.go
+++ b/agreement/fuzzer/networkFacade_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -122,7 +122,7 @@ func (n *NetworkFacade) DumpQueues() {
}
n.eventsQueuesMu.Unlock()
queues += "----------------------\n"
- fmt.Printf(queues)
+ fmt.Print(queues)
}
func (n *NetworkFacade) WaitForEventsQueue(cleared bool) {
@@ -151,7 +151,7 @@ func (n *NetworkFacade) WaitForEventsQueue(cleared bool) {
n.DumpQueues()
//panic("Waiting for event processing for 0 took too long")
pprof.Lookup("goroutine").WriteTo(os.Stdout, 1)
- os.Exit(1)
+ panic(fmt.Sprintf("maxWait %d sec exceeded", maxEventQueueWait/time.Second))
}
}
diff --git a/agreement/fuzzer/nodeCrashFilter_test.go b/agreement/fuzzer/nodeCrashFilter_test.go
index ef31ca4d8..0f77bc95c 100644
--- a/agreement/fuzzer/nodeCrashFilter_test.go
+++ b/agreement/fuzzer/nodeCrashFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/nullFilter_test.go b/agreement/fuzzer/nullFilter_test.go
index e6ee528e1..ee312d744 100644
--- a/agreement/fuzzer/nullFilter_test.go
+++ b/agreement/fuzzer/nullFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/router_test.go b/agreement/fuzzer/router_test.go
index 74e39c1ec..576ac4a3d 100644
--- a/agreement/fuzzer/router_test.go
+++ b/agreement/fuzzer/router_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/schedulerFilter_test.go b/agreement/fuzzer/schedulerFilter_test.go
index d6e00e773..f6d84fee6 100644
--- a/agreement/fuzzer/schedulerFilter_test.go
+++ b/agreement/fuzzer/schedulerFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/tests_test.go b/agreement/fuzzer/tests_test.go
index fa48979a3..45583822c 100644
--- a/agreement/fuzzer/tests_test.go
+++ b/agreement/fuzzer/tests_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/topologyFilter_test.go b/agreement/fuzzer/topologyFilter_test.go
index db62ff604..57389cc93 100644
--- a/agreement/fuzzer/topologyFilter_test.go
+++ b/agreement/fuzzer/topologyFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/trafficStatisticsFilter_test.go b/agreement/fuzzer/trafficStatisticsFilter_test.go
index 72cad0fc6..61c31ef56 100644
--- a/agreement/fuzzer/trafficStatisticsFilter_test.go
+++ b/agreement/fuzzer/trafficStatisticsFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/fuzzer/validator_test.go b/agreement/fuzzer/validator_test.go
index 87425a099..92ac38545 100644
--- a/agreement/fuzzer/validator_test.go
+++ b/agreement/fuzzer/validator_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -47,6 +47,12 @@ func (v *Validator) Go(netConfig *FuzzerConfig) {
network := MakeFuzzer(*netConfig)
require.NotNil(v.tb, network)
+ defer func() {
+ if r := recover(); r != nil {
+ network.DumpQueues()
+ }
+ }()
+
network.Start()
//_, runRes := network.Run(v.config.NetworkRunDuration /*time.Millisecond*5000*/, time.Millisecond*3000, time.Second)
_, v.runResult = network.Run(v.config.NetworkRunTicks, v.config.NetworkRecoverTicks, 100)
diff --git a/agreement/fuzzer/voteFilter_test.go b/agreement/fuzzer/voteFilter_test.go
index 655708758..c61affcb0 100644
--- a/agreement/fuzzer/voteFilter_test.go
+++ b/agreement/fuzzer/voteFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/gossip/network.go b/agreement/gossip/network.go
index 334188277..644bb10d7 100644
--- a/agreement/gossip/network.go
+++ b/agreement/gossip/network.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/gossip/networkFull_test.go b/agreement/gossip/networkFull_test.go
index 784baa8c0..6507a6cb8 100644
--- a/agreement/gossip/networkFull_test.go
+++ b/agreement/gossip/networkFull_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/gossip/network_test.go b/agreement/gossip/network_test.go
index 8584dc8d2..c168b77cc 100644
--- a/agreement/gossip/network_test.go
+++ b/agreement/gossip/network_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/keyManager_test.go b/agreement/keyManager_test.go
index 106431c91..f9337e26d 100644
--- a/agreement/keyManager_test.go
+++ b/agreement/keyManager_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/listener.go b/agreement/listener.go
index 22ec28585..99e2e3e6b 100644
--- a/agreement/listener.go
+++ b/agreement/listener.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/message.go b/agreement/message.go
index 1486dd98e..49782f4c9 100644
--- a/agreement/message.go
+++ b/agreement/message.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/message_test.go b/agreement/message_test.go
index fb0558fc1..49056c498 100644
--- a/agreement/message_test.go
+++ b/agreement/message_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/params.go b/agreement/params.go
index de90d2913..a4f290aa1 100644
--- a/agreement/params.go
+++ b/agreement/params.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/persistence.go b/agreement/persistence.go
index b8510e446..ffb5db8cf 100644
--- a/agreement/persistence.go
+++ b/agreement/persistence.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/persistence_test.go b/agreement/persistence_test.go
index a3cc99755..b039ed7e9 100644
--- a/agreement/persistence_test.go
+++ b/agreement/persistence_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/player.go b/agreement/player.go
index 4e7ec685e..c86c46547 100644
--- a/agreement/player.go
+++ b/agreement/player.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/playerContract.go b/agreement/playerContract.go
index cfc574fef..45a2b3dee 100644
--- a/agreement/playerContract.go
+++ b/agreement/playerContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/player_permutation_test.go b/agreement/player_permutation_test.go
index 2c598ff77..e41195d1f 100644
--- a/agreement/player_permutation_test.go
+++ b/agreement/player_permutation_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/player_test.go b/agreement/player_test.go
index a60c9f44c..227415693 100644
--- a/agreement/player_test.go
+++ b/agreement/player_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposal.go b/agreement/proposal.go
index bf021f2cf..ac29970b1 100644
--- a/agreement/proposal.go
+++ b/agreement/proposal.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalManager.go b/agreement/proposalManager.go
index 71bea3df5..6ec8d2e1b 100644
--- a/agreement/proposalManager.go
+++ b/agreement/proposalManager.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalManagerContract.go b/agreement/proposalManagerContract.go
index df1593848..6f6adf888 100644
--- a/agreement/proposalManagerContract.go
+++ b/agreement/proposalManagerContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalManager_test.go b/agreement/proposalManager_test.go
index 48481bd73..bc5b98409 100644
--- a/agreement/proposalManager_test.go
+++ b/agreement/proposalManager_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalStore.go b/agreement/proposalStore.go
index fdfecac5f..d7c4c48f9 100644
--- a/agreement/proposalStore.go
+++ b/agreement/proposalStore.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalStoreContract.go b/agreement/proposalStoreContract.go
index b1d0192ac..25279de14 100644
--- a/agreement/proposalStoreContract.go
+++ b/agreement/proposalStoreContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalStore_test.go b/agreement/proposalStore_test.go
index 46f9cd38d..2ce8c2375 100644
--- a/agreement/proposalStore_test.go
+++ b/agreement/proposalStore_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalTable.go b/agreement/proposalTable.go
index a5a5ff2eb..665959418 100644
--- a/agreement/proposalTable.go
+++ b/agreement/proposalTable.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalTable_test.go b/agreement/proposalTable_test.go
index 2cb5e9f38..329ef0918 100644
--- a/agreement/proposalTable_test.go
+++ b/agreement/proposalTable_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalTracker.go b/agreement/proposalTracker.go
index de89f8e3e..0a9dce9d8 100644
--- a/agreement/proposalTracker.go
+++ b/agreement/proposalTracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalTrackerContract.go b/agreement/proposalTrackerContract.go
index a6fa2ffc3..0fbcaadab 100644
--- a/agreement/proposalTrackerContract.go
+++ b/agreement/proposalTrackerContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposalTracker_test.go b/agreement/proposalTracker_test.go
index 164e9db40..885933df1 100644
--- a/agreement/proposalTracker_test.go
+++ b/agreement/proposalTracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/proposal_test.go b/agreement/proposal_test.go
index 3102a08a8..98cb17707 100644
--- a/agreement/proposal_test.go
+++ b/agreement/proposal_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/pseudonode.go b/agreement/pseudonode.go
index 78f6674d7..e0bfb326b 100644
--- a/agreement/pseudonode.go
+++ b/agreement/pseudonode.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/pseudonode_test.go b/agreement/pseudonode_test.go
index a60a1e5ef..ee83061ba 100644
--- a/agreement/pseudonode_test.go
+++ b/agreement/pseudonode_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/router.go b/agreement/router.go
index 86b9a1877..fa7e8dd63 100644
--- a/agreement/router.go
+++ b/agreement/router.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/selector.go b/agreement/selector.go
index ba90be3b8..76f9d5a31 100644
--- a/agreement/selector.go
+++ b/agreement/selector.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/service.go b/agreement/service.go
index 433a17d5c..d8ec84b92 100644
--- a/agreement/service.go
+++ b/agreement/service.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -19,6 +19,7 @@ package agreement
//go:generate dbgen -i agree.sql -p agreement -n agree -o agreeInstall.go -h ../scripts/LICENSE_HEADER
import (
"context"
+ "io"
"time"
"github.com/algorand/go-algorand/config"
@@ -178,6 +179,11 @@ func (s *Service) Shutdown() {
s.persistenceLoop.Quit()
}
+// DumpDemuxQueues dumps the demux queues to the given writer.
+func (s *Service) DumpDemuxQueues(w io.Writer) {
+ s.demux.dumpQueues(w)
+}
+
// demuxLoop repeatedly executes pending actions and then requests the next event from the Service.demux.
func (s *Service) demuxLoop(ctx context.Context, input chan<- externalEvent, output <-chan []action, ready <-chan externalDemuxSignals) {
for a := range output {
diff --git a/agreement/service_test.go b/agreement/service_test.go
index 0a7ef55f9..5cc05901e 100644
--- a/agreement/service_test.go
+++ b/agreement/service_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/sort.go b/agreement/sort.go
index 12a078074..e9455336c 100644
--- a/agreement/sort.go
+++ b/agreement/sort.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/sort_test.go b/agreement/sort_test.go
index be2b968dd..ef7c6ab7e 100644
--- a/agreement/sort_test.go
+++ b/agreement/sort_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/state_machine_test.go b/agreement/state_machine_test.go
index 6946a051e..ee2926c20 100644
--- a/agreement/state_machine_test.go
+++ b/agreement/state_machine_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/trace.go b/agreement/trace.go
index d5aeb3d9d..2409d103f 100644
--- a/agreement/trace.go
+++ b/agreement/trace.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/traceTime.go b/agreement/traceTime.go
index d397a66fb..ed38abe55 100644
--- a/agreement/traceTime.go
+++ b/agreement/traceTime.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/types.go b/agreement/types.go
index 000f03e1e..a2ca872bb 100644
--- a/agreement/types.go
+++ b/agreement/types.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/vote.go b/agreement/vote.go
index bed20fe88..5dad87c85 100644
--- a/agreement/vote.go
+++ b/agreement/vote.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAggregator.go b/agreement/voteAggregator.go
index b031ac9fa..c5b711a6e 100644
--- a/agreement/voteAggregator.go
+++ b/agreement/voteAggregator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAggregatorContract.go b/agreement/voteAggregatorContract.go
index 5ebdb5692..73eb9c83c 100644
--- a/agreement/voteAggregatorContract.go
+++ b/agreement/voteAggregatorContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAggregator_test.go b/agreement/voteAggregator_test.go
index 554426ecb..2a1eee17a 100644
--- a/agreement/voteAggregator_test.go
+++ b/agreement/voteAggregator_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAuxiliary.go b/agreement/voteAuxiliary.go
index fa8bfd36b..c1c9402cb 100644
--- a/agreement/voteAuxiliary.go
+++ b/agreement/voteAuxiliary.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAuxiliaryContract.go b/agreement/voteAuxiliaryContract.go
index ada331a6e..c8c00810b 100644
--- a/agreement/voteAuxiliaryContract.go
+++ b/agreement/voteAuxiliaryContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteAuxiliary_test.go b/agreement/voteAuxiliary_test.go
index c20fecc62..852aa30d8 100644
--- a/agreement/voteAuxiliary_test.go
+++ b/agreement/voteAuxiliary_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteTracker.go b/agreement/voteTracker.go
index f1250566a..6b0f9453c 100644
--- a/agreement/voteTracker.go
+++ b/agreement/voteTracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteTrackerContract.go b/agreement/voteTrackerContract.go
index 31470caa4..ef1e6c671 100644
--- a/agreement/voteTrackerContract.go
+++ b/agreement/voteTrackerContract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/voteTracker_test.go b/agreement/voteTracker_test.go
index 75359fa34..3ed1454d7 100644
--- a/agreement/voteTracker_test.go
+++ b/agreement/voteTracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/agreement/vote_test.go b/agreement/vote_test.go
index 22b1049be..e5da1842e 100644
--- a/agreement/vote_test.go
+++ b/agreement/vote_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/catchpointService.go b/catchup/catchpointService.go
index a0a22c5e3..f71a4209a 100644
--- a/catchup/catchpointService.go
+++ b/catchup/catchpointService.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/catchpointService_test.go b/catchup/catchpointService_test.go
index 34f1adf0f..39cef9f2b 100644
--- a/catchup/catchpointService_test.go
+++ b/catchup/catchpointService_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/fetcher_test.go b/catchup/fetcher_test.go
index 983de0147..dab8da468 100644
--- a/catchup/fetcher_test.go
+++ b/catchup/fetcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/ledgerFetcher.go b/catchup/ledgerFetcher.go
index 43a039a09..2f87b5d57 100644
--- a/catchup/ledgerFetcher.go
+++ b/catchup/ledgerFetcher.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/ledgerFetcher_test.go b/catchup/ledgerFetcher_test.go
index f5039e991..6bbde3212 100644
--- a/catchup/ledgerFetcher_test.go
+++ b/catchup/ledgerFetcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/peerSelector.go b/catchup/peerSelector.go
index e9f256e1b..4ceda8d42 100644
--- a/catchup/peerSelector.go
+++ b/catchup/peerSelector.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/peerSelector_test.go b/catchup/peerSelector_test.go
index 680b65cf3..2a907934a 100644
--- a/catchup/peerSelector_test.go
+++ b/catchup/peerSelector_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/pref_test.go b/catchup/pref_test.go
index be3f67f47..38b2a9d16 100644
--- a/catchup/pref_test.go
+++ b/catchup/pref_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/service.go b/catchup/service.go
index 01ff1678e..1093f851a 100644
--- a/catchup/service.go
+++ b/catchup/service.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/service_test.go b/catchup/service_test.go
index c712fab5a..c5b8cfcca 100644
--- a/catchup/service_test.go
+++ b/catchup/service_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/universalFetcher.go b/catchup/universalFetcher.go
index 6d9fcce8d..926c85bb4 100644
--- a/catchup/universalFetcher.go
+++ b/catchup/universalFetcher.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/catchup/universalFetcher_test.go b/catchup/universalFetcher_test.go
index c8dcbd984..59c5d69b7 100644
--- a/catchup/universalFetcher_test.go
+++ b/catchup/universalFetcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/getCommand.go b/cmd/algocfg/getCommand.go
index 016de6cd3..095417793 100644
--- a/cmd/algocfg/getCommand.go
+++ b/cmd/algocfg/getCommand.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/getCommand_test.go b/cmd/algocfg/getCommand_test.go
index ad1525b7d..52587f7f9 100644
--- a/cmd/algocfg/getCommand_test.go
+++ b/cmd/algocfg/getCommand_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/main.go b/cmd/algocfg/main.go
index 9fe71879e..94e81256c 100644
--- a/cmd/algocfg/main.go
+++ b/cmd/algocfg/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/profileCommand.go b/cmd/algocfg/profileCommand.go
index 0a368fc97..4cd9bf5c9 100644
--- a/cmd/algocfg/profileCommand.go
+++ b/cmd/algocfg/profileCommand.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -69,10 +69,24 @@ var (
relay = configUpdater{
description: "Relay consensus messages across the network and support catchup.",
updateFunc: func(cfg config.Local) config.Local {
+ cfg.MaxBlockHistoryLookback = 22000 // Enough to support 2 catchpoints with some wiggle room for nodes to catch up from the older one
+ cfg.CatchpointFileHistoryLength = 3
+ cfg.CatchpointTracking = 2
+ cfg.EnableLedgerService = true
+ cfg.EnableBlockService = true
+ cfg.NetAddress = ":4160"
+ return cfg
+ },
+ }
+
+ archival = configUpdater{
+ description: "Store the full chain history and support catchup.",
+ updateFunc: func(cfg config.Local) config.Local {
cfg.Archival = true
cfg.EnableLedgerService = true
cfg.EnableBlockService = true
cfg.NetAddress = ":4160"
+ cfg.EnableGossipService = false
return cfg
},
}
@@ -82,6 +96,7 @@ var (
"participation": participation,
"conduit": conduit,
"relay": relay,
+ "archival": archival,
"development": development,
}
diff --git a/cmd/algocfg/profileCommand_test.go b/cmd/algocfg/profileCommand_test.go
index dd905fd85..d8bf71553 100644
--- a/cmd/algocfg/profileCommand_test.go
+++ b/cmd/algocfg/profileCommand_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -51,4 +51,15 @@ func Test_getConfigForArg(t *testing.T) {
require.NoError(t, err)
require.True(t, cfg.DisableAPIAuth)
})
+
+ t.Run("valid config test archival node", func(t *testing.T) {
+ t.Parallel()
+ cfg, err := getConfigForArg("archival")
+ require.NoError(t, err)
+ require.True(t, cfg.Archival)
+ require.True(t, cfg.EnableLedgerService)
+ require.True(t, cfg.EnableBlockService)
+ require.Equal(t, ":4160", cfg.NetAddress)
+ require.False(t, cfg.EnableGossipService)
+ })
}
diff --git a/cmd/algocfg/report.go b/cmd/algocfg/report.go
index a688a04ed..27ce95ffc 100644
--- a/cmd/algocfg/report.go
+++ b/cmd/algocfg/report.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/resetCommand.go b/cmd/algocfg/resetCommand.go
index 2ec8c55aa..079b2e164 100644
--- a/cmd/algocfg/resetCommand.go
+++ b/cmd/algocfg/resetCommand.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algocfg/setCommand.go b/cmd/algocfg/setCommand.go
index 58f7ee796..704237b41 100644
--- a/cmd/algocfg/setCommand.go
+++ b/cmd/algocfg/setCommand.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algod/main.go b/cmd/algod/main.go
index 5450ff5b6..603f543b8 100644
--- a/cmd/algod/main.go
+++ b/cmd/algod/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algod/main_test.go b/cmd/algod/main_test.go
index e2a37a8f8..917f2d038 100644
--- a/cmd/algod/main_test.go
+++ b/cmd/algod/main_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algofix/deadlock.go b/cmd/algofix/deadlock.go
index c6a975764..1255e3802 100644
--- a/cmd/algofix/deadlock.go
+++ b/cmd/algofix/deadlock.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algofix/deadlock_test.go b/cmd/algofix/deadlock_test.go
index 7d23edb7f..66fcce29d 100644
--- a/cmd/algofix/deadlock_test.go
+++ b/cmd/algofix/deadlock_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/blockWatcher.go b/cmd/algoh/blockWatcher.go
index bcfb519a8..d45609182 100644
--- a/cmd/algoh/blockWatcher.go
+++ b/cmd/algoh/blockWatcher.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/blockWatcher_test.go b/cmd/algoh/blockWatcher_test.go
index 79086d097..3daa916dd 100644
--- a/cmd/algoh/blockWatcher_test.go
+++ b/cmd/algoh/blockWatcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/blockstats.go b/cmd/algoh/blockstats.go
index fd54bdff4..a91536dbe 100644
--- a/cmd/algoh/blockstats.go
+++ b/cmd/algoh/blockstats.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/blockstats_test.go b/cmd/algoh/blockstats_test.go
index abd3e7eea..a2ac99ec8 100644
--- a/cmd/algoh/blockstats_test.go
+++ b/cmd/algoh/blockstats_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/client.go b/cmd/algoh/client.go
index a0a12194d..20924f939 100644
--- a/cmd/algoh/client.go
+++ b/cmd/algoh/client.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/deadman.go b/cmd/algoh/deadman.go
index 6b0e0e1bf..ffd4d556b 100644
--- a/cmd/algoh/deadman.go
+++ b/cmd/algoh/deadman.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/eventsender.go b/cmd/algoh/eventsender.go
index 678dd203a..111b94a2a 100644
--- a/cmd/algoh/eventsender.go
+++ b/cmd/algoh/eventsender.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/main.go b/cmd/algoh/main.go
index c57c28ba9..71ebb368c 100644
--- a/cmd/algoh/main.go
+++ b/cmd/algoh/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algoh/mockClient.go b/cmd/algoh/mockClient.go
index 45e081e1e..5370e78d8 100644
--- a/cmd/algoh/mockClient.go
+++ b/cmd/algoh/mockClient.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/common.go b/cmd/algokey/common.go
index 71b58498c..8fc5867db 100644
--- a/cmd/algokey/common.go
+++ b/cmd/algokey/common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/export.go b/cmd/algokey/export.go
index 2966eabd1..39fcf9440 100644
--- a/cmd/algokey/export.go
+++ b/cmd/algokey/export.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/generate.go b/cmd/algokey/generate.go
index 4d4273585..6382fa3a0 100644
--- a/cmd/algokey/generate.go
+++ b/cmd/algokey/generate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/import.go b/cmd/algokey/import.go
index 34f90ca2e..53f40d02d 100644
--- a/cmd/algokey/import.go
+++ b/cmd/algokey/import.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/keyreg.go b/cmd/algokey/keyreg.go
index 439366442..43b072f4d 100644
--- a/cmd/algokey/keyreg.go
+++ b/cmd/algokey/keyreg.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/main.go b/cmd/algokey/main.go
index c04b73a3c..2c0aa1644 100644
--- a/cmd/algokey/main.go
+++ b/cmd/algokey/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/multisig.go b/cmd/algokey/multisig.go
index ef51d5dac..543735b5d 100644
--- a/cmd/algokey/multisig.go
+++ b/cmd/algokey/multisig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/part.go b/cmd/algokey/part.go
index 76148ae1f..cd49f73af 100644
--- a/cmd/algokey/part.go
+++ b/cmd/algokey/part.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algokey/sign.go b/cmd/algokey/sign.go
index 3d8bf6dbc..04b6c3bee 100644
--- a/cmd/algokey/sign.go
+++ b/cmd/algokey/sign.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algons/commands.go b/cmd/algons/commands.go
index 3e010951d..a1d17029d 100644
--- a/cmd/algons/commands.go
+++ b/cmd/algons/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algons/dnsCmd.go b/cmd/algons/dnsCmd.go
index 97b3b5f33..da402c332 100644
--- a/cmd/algons/dnsCmd.go
+++ b/cmd/algons/dnsCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algons/dnsaddrCmd.go b/cmd/algons/dnsaddrCmd.go
index 1d9189082..c8fb1ac52 100644
--- a/cmd/algons/dnsaddrCmd.go
+++ b/cmd/algons/dnsaddrCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algorelay/commands.go b/cmd/algorelay/commands.go
index 8199c742c..99c5c8087 100644
--- a/cmd/algorelay/commands.go
+++ b/cmd/algorelay/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algorelay/eb/eb.go b/cmd/algorelay/eb/eb.go
index c03ef85b1..348d72950 100644
--- a/cmd/algorelay/eb/eb.go
+++ b/cmd/algorelay/eb/eb.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/algorelay/relayCmd.go b/cmd/algorelay/relayCmd.go
index d658daa81..073147e4f 100644
--- a/cmd/algorelay/relayCmd.go
+++ b/cmd/algorelay/relayCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/buildtools/commands.go b/cmd/buildtools/commands.go
index 92a73124c..0920d05ab 100644
--- a/cmd/buildtools/commands.go
+++ b/cmd/buildtools/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/buildtools/genesis.go b/cmd/buildtools/genesis.go
index 19712d423..853a08489 100644
--- a/cmd/buildtools/genesis.go
+++ b/cmd/buildtools/genesis.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchpointdump/commands.go b/cmd/catchpointdump/commands.go
index 82deb897f..f9dae4018 100644
--- a/cmd/catchpointdump/commands.go
+++ b/cmd/catchpointdump/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchpointdump/database.go b/cmd/catchpointdump/database.go
index 7706bcd3d..31f18cc86 100644
--- a/cmd/catchpointdump/database.go
+++ b/cmd/catchpointdump/database.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchpointdump/file.go b/cmd/catchpointdump/file.go
index 2e3580b76..f0f7c7bff 100644
--- a/cmd/catchpointdump/file.go
+++ b/cmd/catchpointdump/file.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchpointdump/net.go b/cmd/catchpointdump/net.go
index 77c28870f..2de40c3c2 100644
--- a/cmd/catchpointdump/net.go
+++ b/cmd/catchpointdump/net.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchupsrv/download.go b/cmd/catchupsrv/download.go
index 160605fe5..80c1cc679 100644
--- a/cmd/catchupsrv/download.go
+++ b/cmd/catchupsrv/download.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchupsrv/download_test.go b/cmd/catchupsrv/download_test.go
index 975f32165..18ff84104 100644
--- a/cmd/catchupsrv/download_test.go
+++ b/cmd/catchupsrv/download_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchupsrv/main.go b/cmd/catchupsrv/main.go
index f89c69ad0..91fa4b070 100644
--- a/cmd/catchupsrv/main.go
+++ b/cmd/catchupsrv/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/catchupsrv/tarblocks.go b/cmd/catchupsrv/tarblocks.go
index d5957d5a2..c1498fec0 100644
--- a/cmd/catchupsrv/tarblocks.go
+++ b/cmd/catchupsrv/tarblocks.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/dbgen/main.go b/cmd/dbgen/main.go
index 0bcc3e93c..3c486ba22 100644
--- a/cmd/dbgen/main.go
+++ b/cmd/dbgen/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/diagcfg/main.go b/cmd/diagcfg/main.go
index 6953daf78..fc81c6791 100644
--- a/cmd/diagcfg/main.go
+++ b/cmd/diagcfg/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/diagcfg/messages.go b/cmd/diagcfg/messages.go
index 45acf2e3d..75174fc69 100644
--- a/cmd/diagcfg/messages.go
+++ b/cmd/diagcfg/messages.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/diagcfg/metric.go b/cmd/diagcfg/metric.go
index d5c44189a..4e802ba72 100644
--- a/cmd/diagcfg/metric.go
+++ b/cmd/diagcfg/metric.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/diagcfg/telemetry.go b/cmd/diagcfg/telemetry.go
index fac9bb46f..a4aece54f 100644
--- a/cmd/diagcfg/telemetry.go
+++ b/cmd/diagcfg/telemetry.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/dispenser/server.go b/cmd/dispenser/server.go
index 064d9f58e..5501a69b7 100644
--- a/cmd/dispenser/server.go
+++ b/cmd/dispenser/server.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/genesis/newgenesis.go b/cmd/genesis/newgenesis.go
index 25d5f92d8..bce6ca3dd 100644
--- a/cmd/genesis/newgenesis.go
+++ b/cmd/genesis/newgenesis.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/account.go b/cmd/goal/account.go
index 60b8ce72d..9fe230f67 100644
--- a/cmd/goal/account.go
+++ b/cmd/goal/account.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/accountsList.go b/cmd/goal/accountsList.go
index 390d3b2b0..5e4a2e6fa 100644
--- a/cmd/goal/accountsList.go
+++ b/cmd/goal/accountsList.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/application.go b/cmd/goal/application.go
index 2aebe89de..922540b72 100644
--- a/cmd/goal/application.go
+++ b/cmd/goal/application.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/application_test.go b/cmd/goal/application_test.go
index d037f77bd..1950337fd 100644
--- a/cmd/goal/application_test.go
+++ b/cmd/goal/application_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/asset.go b/cmd/goal/asset.go
index 64c2d4c56..d67e4f4ac 100644
--- a/cmd/goal/asset.go
+++ b/cmd/goal/asset.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/box.go b/cmd/goal/box.go
index 4fd6495fa..c32b63126 100644
--- a/cmd/goal/box.go
+++ b/cmd/goal/box.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/clerk.go b/cmd/goal/clerk.go
index 40b93a7f9..a69ed5be9 100644
--- a/cmd/goal/clerk.go
+++ b/cmd/goal/clerk.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/clerk_test.go b/cmd/goal/clerk_test.go
index ab63e699e..2efc67f3a 100644
--- a/cmd/goal/clerk_test.go
+++ b/cmd/goal/clerk_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/commands.go b/cmd/goal/commands.go
index a12f08b2e..3ba9891d7 100644
--- a/cmd/goal/commands.go
+++ b/cmd/goal/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/commands_test.go b/cmd/goal/commands_test.go
index 8f5d02510..986ade271 100644
--- a/cmd/goal/commands_test.go
+++ b/cmd/goal/commands_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/common.go b/cmd/goal/common.go
index 3c4189dbf..0a8637f98 100644
--- a/cmd/goal/common.go
+++ b/cmd/goal/common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/completion.go b/cmd/goal/completion.go
index 418b1c857..0a49f69b4 100644
--- a/cmd/goal/completion.go
+++ b/cmd/goal/completion.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/formatting.go b/cmd/goal/formatting.go
index 9eebf3fbb..32484412f 100644
--- a/cmd/goal/formatting.go
+++ b/cmd/goal/formatting.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/formatting_test.go b/cmd/goal/formatting_test.go
index 29d27483a..1247cddf1 100644
--- a/cmd/goal/formatting_test.go
+++ b/cmd/goal/formatting_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/inspect.go b/cmd/goal/inspect.go
index 9f8c078d1..7f57e26f0 100644
--- a/cmd/goal/inspect.go
+++ b/cmd/goal/inspect.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/inspect_test.go b/cmd/goal/inspect_test.go
index 9a153bebb..7feb1ed03 100644
--- a/cmd/goal/inspect_test.go
+++ b/cmd/goal/inspect_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/interact.go b/cmd/goal/interact.go
index ca79daf0d..e2f0226e9 100644
--- a/cmd/goal/interact.go
+++ b/cmd/goal/interact.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/kmd.go b/cmd/goal/kmd.go
index 517d975fa..4076cc8ac 100644
--- a/cmd/goal/kmd.go
+++ b/cmd/goal/kmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/ledger.go b/cmd/goal/ledger.go
index 84a92352f..586b28b07 100644
--- a/cmd/goal/ledger.go
+++ b/cmd/goal/ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/logging.go b/cmd/goal/logging.go
index 68c0a696c..c1894cef5 100644
--- a/cmd/goal/logging.go
+++ b/cmd/goal/logging.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/messages.go b/cmd/goal/messages.go
index bcb7b3fd5..1bc78ce30 100644
--- a/cmd/goal/messages.go
+++ b/cmd/goal/messages.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/multisig.go b/cmd/goal/multisig.go
index 88b9a4563..a1e9b6049 100644
--- a/cmd/goal/multisig.go
+++ b/cmd/goal/multisig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/network.go b/cmd/goal/network.go
index a63bb13f5..a0d8cf424 100644
--- a/cmd/goal/network.go
+++ b/cmd/goal/network.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/node.go b/cmd/goal/node.go
index 1258001ed..17de96a81 100644
--- a/cmd/goal/node.go
+++ b/cmd/goal/node.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/node_test.go b/cmd/goal/node_test.go
index e34568202..bdbcf31b5 100644
--- a/cmd/goal/node_test.go
+++ b/cmd/goal/node_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/tealsign.go b/cmd/goal/tealsign.go
index 45fbd3a98..9cad30a9f 100644
--- a/cmd/goal/tealsign.go
+++ b/cmd/goal/tealsign.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/goal/wallet.go b/cmd/goal/wallet.go
index 0b55c18f1..e95aea62a 100644
--- a/cmd/goal/wallet.go
+++ b/cmd/goal/wallet.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/incorporate/incorporate.go b/cmd/incorporate/incorporate.go
index 97d4b44d6..b9f7dd55b 100644
--- a/cmd/incorporate/incorporate.go
+++ b/cmd/incorporate/incorporate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/kmd/codes/codes.go b/cmd/kmd/codes/codes.go
index ecfe57352..e49c456f0 100644
--- a/cmd/kmd/codes/codes.go
+++ b/cmd/kmd/codes/codes.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/kmd/main.go b/cmd/kmd/main.go
index 92bfe62ac..711ee7514 100644
--- a/cmd/kmd/main.go
+++ b/cmd/kmd/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/kmd/mlock_darwin.go b/cmd/kmd/mlock_darwin.go
index 5e6e75ccc..cc9d7fde6 100644
--- a/cmd/kmd/mlock_darwin.go
+++ b/cmd/kmd/mlock_darwin.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/kmd/mlock_linux.go b/cmd/kmd/mlock_linux.go
index c650ec15c..04e6b4232 100644
--- a/cmd/kmd/mlock_linux.go
+++ b/cmd/kmd/mlock_linux.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/kmd/mlock_windows.go b/cmd/kmd/mlock_windows.go
index 20db381e2..29f9b1477 100644
--- a/cmd/kmd/mlock_windows.go
+++ b/cmd/kmd/mlock_windows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/loadgenerator/config.go b/cmd/loadgenerator/config.go
index 5ffb86fd7..f31296f35 100644
--- a/cmd/loadgenerator/config.go
+++ b/cmd/loadgenerator/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/loadgenerator/main.go b/cmd/loadgenerator/main.go
index 9b4bb6105..6b8288769 100644
--- a/cmd/loadgenerator/main.go
+++ b/cmd/loadgenerator/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/msgpacktool/main.go b/cmd/msgpacktool/main.go
index b6e359a0d..80ae61995 100644
--- a/cmd/msgpacktool/main.go
+++ b/cmd/msgpacktool/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netdummy/main.go b/cmd/netdummy/main.go
index cdc85e416..ef8737368 100644
--- a/cmd/netdummy/main.go
+++ b/cmd/netdummy/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netgoal/commands.go b/cmd/netgoal/commands.go
index 6fba6f8fa..ebdf40413 100644
--- a/cmd/netgoal/commands.go
+++ b/cmd/netgoal/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netgoal/generate.go b/cmd/netgoal/generate.go
index 4757cdc6a..882cd0f9d 100644
--- a/cmd/netgoal/generate.go
+++ b/cmd/netgoal/generate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netgoal/messages.go b/cmd/netgoal/messages.go
index a575c4735..f75c639b9 100644
--- a/cmd/netgoal/messages.go
+++ b/cmd/netgoal/messages.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netgoal/network.go b/cmd/netgoal/network.go
index 6fa6b317d..69fecbac2 100644
--- a/cmd/netgoal/network.go
+++ b/cmd/netgoal/network.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/netgoal/recipe.go b/cmd/netgoal/recipe.go
index c1356b73f..0606a253a 100644
--- a/cmd/netgoal/recipe.go
+++ b/cmd/netgoal/recipe.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/nodecfg/apply.go b/cmd/nodecfg/apply.go
index 689476537..49d812ead 100644
--- a/cmd/nodecfg/apply.go
+++ b/cmd/nodecfg/apply.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/nodecfg/commands.go b/cmd/nodecfg/commands.go
index ef6b90818..8e492d73f 100644
--- a/cmd/nodecfg/commands.go
+++ b/cmd/nodecfg/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/nodecfg/download.go b/cmd/nodecfg/download.go
index fd59e0dff..1be8fc4d7 100644
--- a/cmd/nodecfg/download.go
+++ b/cmd/nodecfg/download.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/nodecfg/get.go b/cmd/nodecfg/get.go
index 6ca11c736..d21f84c06 100644
--- a/cmd/nodecfg/get.go
+++ b/cmd/nodecfg/get.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/opdoc/opdoc.go b/cmd/opdoc/opdoc.go
index aaa55c5d2..a6e77504b 100644
--- a/cmd/opdoc/opdoc.go
+++ b/cmd/opdoc/opdoc.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -47,7 +47,7 @@ func opImmediateNoteSyntaxMarkdown(name string, oids []logic.OpImmediateDetails)
argDocs[idx] = fmt.Sprintf("%s: %s", oid.Name, argNote)
}
- return fmt.Sprintf("`%s %s` ∋ %s", name, strings.Join(argNames, " "), strings.Join(argDocs, ", "))
+ return fmt.Sprintf("`%s %s` where %s", name, strings.Join(argNames, " "), strings.Join(argDocs, ", "))
}
func opImmediateNoteEncoding(opcode byte, oids []logic.OpImmediateDetails) string {
diff --git a/cmd/opdoc/tmLanguage.go b/cmd/opdoc/tmLanguage.go
index 63c558ea3..fce638859 100644
--- a/cmd/opdoc/tmLanguage.go
+++ b/cmd/opdoc/tmLanguage.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/partitiontest_linter/linter.go b/cmd/partitiontest_linter/linter.go
index 50c1298a0..7a000e5ab 100644
--- a/cmd/partitiontest_linter/linter.go
+++ b/cmd/partitiontest_linter/linter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/partitiontest_linter/linter_test.go b/cmd/partitiontest_linter/linter_test.go
index 26a3e85be..a586c9d0b 100644
--- a/cmd/partitiontest_linter/linter_test.go
+++ b/cmd/partitiontest_linter/linter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/partitiontest_linter/plugin/plugin.go b/cmd/partitiontest_linter/plugin/plugin.go
index ee229371f..9a895ce90 100644
--- a/cmd/partitiontest_linter/plugin/plugin.go
+++ b/cmd/partitiontest_linter/plugin/plugin.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/partitiontest_linter/testdata/linter_testdata_test.go b/cmd/partitiontest_linter/testdata/linter_testdata_test.go
index d84cb837c..308f7f180 100644
--- a/cmd/partitiontest_linter/testdata/linter_testdata_test.go
+++ b/cmd/partitiontest_linter/testdata/linter_testdata_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/pingpong/commands.go b/cmd/pingpong/commands.go
index 7e78eedb0..fb44d8b07 100644
--- a/cmd/pingpong/commands.go
+++ b/cmd/pingpong/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/pingpong/runCmd.go b/cmd/pingpong/runCmd.go
index d141be260..a29a233c8 100644
--- a/cmd/pingpong/runCmd.go
+++ b/cmd/pingpong/runCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/pingpong/teal_programs.go b/cmd/pingpong/teal_programs.go
index 150877188..cd54fc1ec 100644
--- a/cmd/pingpong/teal_programs.go
+++ b/cmd/pingpong/teal_programs.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/bundle_home_html.sh b/cmd/tealdbg/bundle_home_html.sh
index 8c83a4aaa..eff5acd41 100755
--- a/cmd/tealdbg/bundle_home_html.sh
+++ b/cmd/tealdbg/bundle_home_html.sh
@@ -3,7 +3,7 @@
THISDIR=$(dirname $0)
cat <<EOM | gofmt > $THISDIR/homepage.go
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdt/proto.go b/cmd/tealdbg/cdt/proto.go
index dd28fcd82..f15a45d25 100644
--- a/cmd/tealdbg/cdt/proto.go
+++ b/cmd/tealdbg/cdt/proto.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtSession.go b/cmd/tealdbg/cdtSession.go
index 5d0bdd08b..ad4e879e7 100644
--- a/cmd/tealdbg/cdtSession.go
+++ b/cmd/tealdbg/cdtSession.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtSession_test.go b/cmd/tealdbg/cdtSession_test.go
index 186e0d7df..6c755511c 100644
--- a/cmd/tealdbg/cdtSession_test.go
+++ b/cmd/tealdbg/cdtSession_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtState.go b/cmd/tealdbg/cdtState.go
index 2ee335a21..65d3e4fb1 100644
--- a/cmd/tealdbg/cdtState.go
+++ b/cmd/tealdbg/cdtState.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtStateObjects.go b/cmd/tealdbg/cdtStateObjects.go
index 377492d23..d32915672 100644
--- a/cmd/tealdbg/cdtStateObjects.go
+++ b/cmd/tealdbg/cdtStateObjects.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtdbg.go b/cmd/tealdbg/cdtdbg.go
index 45de17d3e..470aec2a5 100644
--- a/cmd/tealdbg/cdtdbg.go
+++ b/cmd/tealdbg/cdtdbg.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/cdtdbg_test.go b/cmd/tealdbg/cdtdbg_test.go
index 0ef838f95..a8c11cc3f 100644
--- a/cmd/tealdbg/cdtdbg_test.go
+++ b/cmd/tealdbg/cdtdbg_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/debugger.go b/cmd/tealdbg/debugger.go
index 86674a45d..0f70e0814 100644
--- a/cmd/tealdbg/debugger.go
+++ b/cmd/tealdbg/debugger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/debugger_test.go b/cmd/tealdbg/debugger_test.go
index 6b6d39e69..9a03362ab 100644
--- a/cmd/tealdbg/debugger_test.go
+++ b/cmd/tealdbg/debugger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/dryrunRequest.go b/cmd/tealdbg/dryrunRequest.go
index 5f13aa6cf..958b43f87 100644
--- a/cmd/tealdbg/dryrunRequest.go
+++ b/cmd/tealdbg/dryrunRequest.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/homepage.go b/cmd/tealdbg/homepage.go
index 7e77ed291..f0c6a9bb4 100644
--- a/cmd/tealdbg/homepage.go
+++ b/cmd/tealdbg/homepage.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/local.go b/cmd/tealdbg/local.go
index 61050348e..6f61fb2da 100644
--- a/cmd/tealdbg/local.go
+++ b/cmd/tealdbg/local.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/localLedger.go b/cmd/tealdbg/localLedger.go
index fc7655173..d97c8df70 100644
--- a/cmd/tealdbg/localLedger.go
+++ b/cmd/tealdbg/localLedger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/localLedger_test.go b/cmd/tealdbg/localLedger_test.go
index 38258c54d..79423c834 100644
--- a/cmd/tealdbg/localLedger_test.go
+++ b/cmd/tealdbg/localLedger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/local_test.go b/cmd/tealdbg/local_test.go
index d0f6a3c2c..c290b6714 100644
--- a/cmd/tealdbg/local_test.go
+++ b/cmd/tealdbg/local_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/main.go b/cmd/tealdbg/main.go
index 461ed0d03..313f4da05 100644
--- a/cmd/tealdbg/main.go
+++ b/cmd/tealdbg/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/remote.go b/cmd/tealdbg/remote.go
index 0656e418d..b845c2d3a 100644
--- a/cmd/tealdbg/remote.go
+++ b/cmd/tealdbg/remote.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/remote_test.go b/cmd/tealdbg/remote_test.go
index bf76e9c0d..99b4b67c0 100644
--- a/cmd/tealdbg/remote_test.go
+++ b/cmd/tealdbg/remote_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/server.go b/cmd/tealdbg/server.go
index 695cb030d..ec457443b 100644
--- a/cmd/tealdbg/server.go
+++ b/cmd/tealdbg/server.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/server_test.go b/cmd/tealdbg/server_test.go
index f9cc023a1..492ebfab7 100644
--- a/cmd/tealdbg/server_test.go
+++ b/cmd/tealdbg/server_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/util.go b/cmd/tealdbg/util.go
index 971a08223..fe4fcd05d 100644
--- a/cmd/tealdbg/util.go
+++ b/cmd/tealdbg/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/webdbg.go b/cmd/tealdbg/webdbg.go
index d237d70af..2012127c6 100644
--- a/cmd/tealdbg/webdbg.go
+++ b/cmd/tealdbg/webdbg.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/tealdbg/webdbg_test.go b/cmd/tealdbg/webdbg_test.go
index 40ddd41f8..36962ba8d 100644
--- a/cmd/tealdbg/webdbg_test.go
+++ b/cmd/tealdbg/webdbg_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/commands.go b/cmd/updater/commands.go
index cc152ff5d..335a149ca 100644
--- a/cmd/updater/commands.go
+++ b/cmd/updater/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/sendCmd.go b/cmd/updater/sendCmd.go
index d194d8ca9..116340d93 100644
--- a/cmd/updater/sendCmd.go
+++ b/cmd/updater/sendCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/toolsCmd.go b/cmd/updater/toolsCmd.go
index 4ebaa8b4a..1a44f6805 100644
--- a/cmd/updater/toolsCmd.go
+++ b/cmd/updater/toolsCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/util.go b/cmd/updater/util.go
index 14fa62cf5..d33c2ce1e 100644
--- a/cmd/updater/util.go
+++ b/cmd/updater/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/versionCmd.go b/cmd/updater/versionCmd.go
index 35713f9b3..374fd982a 100644
--- a/cmd/updater/versionCmd.go
+++ b/cmd/updater/versionCmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/updater/version_test.go b/cmd/updater/version_test.go
index e46bd2f3e..6f5418e30 100644
--- a/cmd/updater/version_test.go
+++ b/cmd/updater/version_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/util/cmd.go b/cmd/util/cmd.go
index 3b8b1c884..780aa685b 100644
--- a/cmd/util/cmd.go
+++ b/cmd/util/cmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/util/datadir/datadir.go b/cmd/util/datadir/datadir.go
index 20ba92b8e..41928b97e 100644
--- a/cmd/util/datadir/datadir.go
+++ b/cmd/util/datadir/datadir.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/util/datadir/messages.go b/cmd/util/datadir/messages.go
index 0ef5e6a49..e70965e89 100644
--- a/cmd/util/datadir/messages.go
+++ b/cmd/util/datadir/messages.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/cmd/util/datadir/report.go b/cmd/util/datadir/report.go
index c75aa4924..d5e2e9814 100644
--- a/cmd/util/datadir/report.go
+++ b/cmd/util/datadir/report.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/components/mocks/mockCatchpointCatchupAccessor.go b/components/mocks/mockCatchpointCatchupAccessor.go
index d095b703a..edf794674 100644
--- a/components/mocks/mockCatchpointCatchupAccessor.go
+++ b/components/mocks/mockCatchpointCatchupAccessor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/components/mocks/mockNetwork.go b/components/mocks/mockNetwork.go
index 8c8eb113f..25486cb05 100644
--- a/components/mocks/mockNetwork.go
+++ b/components/mocks/mockNetwork.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/components/mocks/mockParticipationRegistry.go b/components/mocks/mockParticipationRegistry.go
index 6af12ef1d..525c8b1cd 100644
--- a/components/mocks/mockParticipationRegistry.go
+++ b/components/mocks/mockParticipationRegistry.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/buildvars.go b/config/buildvars.go
index af0bfe523..011d27b64 100644
--- a/config/buildvars.go
+++ b/config/buildvars.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/config.go b/config/config.go
index ad363f364..a8beb0580 100644
--- a/config/config.go
+++ b/config/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -145,10 +145,7 @@ func mergeConfigFromFile(configpath string, source Local) (Local, error) {
err = loadConfig(f, &source)
- // For now, all relays (listening for incoming connections) are also Archival
- // We can change this logic in the future, but it's currently the sanest default.
if source.NetAddress != "" {
- source.Archival = true
source.EnableLedgerService = true
source.EnableBlockService = true
diff --git a/config/config_test.go b/config/config_test.go
index ef58bffb9..432c0f928 100644
--- a/config/config_test.go
+++ b/config/config_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -112,7 +112,8 @@ func TestLocal_MergeConfig(t *testing.T) {
c2, err := mergeConfigFromDir(tempDir, defaultConfig)
require.NoError(t, err)
- require.Equal(t, defaultConfig.Archival || c1.NetAddress != "", c2.Archival)
+ require.Equal(t, defaultConfig.EnableLedgerService || c1.NetAddress != "", c2.EnableLedgerService)
+ require.Equal(t, defaultConfig.EnableBlockService || c1.NetAddress != "", c2.EnableBlockService)
require.Equal(t, defaultConfig.IncomingConnectionsLimit, c2.IncomingConnectionsLimit)
require.Equal(t, defaultConfig.BaseLoggerDebugLevel, c2.BaseLoggerDebugLevel)
@@ -165,50 +166,6 @@ func TestLoadPhonebookMissing(t *testing.T) {
require.True(t, os.IsNotExist(err))
}
-func TestArchivalIfRelay(t *testing.T) {
- partitiontest.PartitionTest(t)
- t.Parallel()
-
- testArchivalIfRelay(t, true)
-}
-
-func TestArchivalIfNotRelay(t *testing.T) {
- partitiontest.PartitionTest(t)
- t.Parallel()
-
- testArchivalIfRelay(t, false)
-}
-
-func testArchivalIfRelay(t *testing.T, relay bool) {
- tempDir := t.TempDir()
-
- c1 := struct {
- NetAddress string
- }{}
- if relay {
- c1.NetAddress = ":1234"
- }
-
- // write our reduced version of the Local struct
- fileToMerge := filepath.Join(tempDir, ConfigFilename)
- f, err := os.OpenFile(fileToMerge, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, 0600)
- if err == nil {
- enc := json.NewEncoder(f)
- err = enc.Encode(c1)
- f.Close()
- }
- require.NoError(t, err)
- require.False(t, defaultConfig.Archival, "Default should be non-archival")
-
- c2, err := mergeConfigFromDir(tempDir, defaultConfig)
- require.NoError(t, err)
- if relay {
- require.True(t, c2.Archival, "Relay should be archival")
- } else {
- require.False(t, c2.Archival, "Non-relay should still be non-archival")
- }
-}
-
func TestLocal_ConfigExampleIsCorrect(t *testing.T) {
partitiontest.PartitionTest(t)
diff --git a/config/consensus.go b/config/consensus.go
index a1baa9204..fc08e2990 100644
--- a/config/consensus.go
+++ b/config/consensus.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/consensus_test.go b/config/consensus_test.go
index 98b5e874c..d7fbed408 100644
--- a/config/consensus_test.go
+++ b/config/consensus_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/defaultsGenerator/defaultsGenerator.go b/config/defaultsGenerator/defaultsGenerator.go
index d497ea9f2..9afe0d01b 100644
--- a/config/defaultsGenerator/defaultsGenerator.go
+++ b/config/defaultsGenerator/defaultsGenerator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/dnsbootstrap.go b/config/dnsbootstrap.go
index 2f45d2dd8..3b027df9c 100644
--- a/config/dnsbootstrap.go
+++ b/config/dnsbootstrap.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/dnsbootstrap_test.go b/config/dnsbootstrap_test.go
index 431d321d0..ccf0f9023 100644
--- a/config/dnsbootstrap_test.go
+++ b/config/dnsbootstrap_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/keyfile.go b/config/keyfile.go
index 0f158e1fd..4e29b7433 100644
--- a/config/keyfile.go
+++ b/config/keyfile.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/localTemplate.go b/config/localTemplate.go
index 25c6edab0..c6e1ba0a2 100644
--- a/config/localTemplate.go
+++ b/config/localTemplate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/local_defaults.go b/config/local_defaults.go
index 3df773a76..791e6e222 100644
--- a/config/local_defaults.go
+++ b/config/local_defaults.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/migrate.go b/config/migrate.go
index ae9e2a9a1..8a7240774 100644
--- a/config/migrate.go
+++ b/config/migrate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/config/version.go b/config/version.go
index f7e656d40..272cff9f9 100644
--- a/config/version.go
+++ b/config/version.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -33,7 +33,7 @@ const VersionMajor = 3
// VersionMinor is the Minor semantic version number (x.#.z) - changed when backwards-compatible features are introduced.
// Not enforced until after initial public release (x > 0).
-const VersionMinor = 21
+const VersionMinor = 22
// Version is the type holding our full version information.
type Version struct {
diff --git a/config/version_test.go b/config/version_test.go
index 1a37cf185..8b1d8c17b 100644
--- a/config/version_test.go
+++ b/config/version_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/batchverifier.go b/crypto/batchverifier.go
index af7a677ac..0281e86e8 100644
--- a/crypto/batchverifier.go
+++ b/crypto/batchverifier.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/batchverifier_test.go b/crypto/batchverifier_test.go
index c572503ff..2b8fcec0e 100644
--- a/crypto/batchverifier_test.go
+++ b/crypto/batchverifier_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/crypto_test.go b/crypto/crypto_test.go
index f0e8b1d0e..ee3a23d58 100644
--- a/crypto/crypto_test.go
+++ b/crypto/crypto_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/cryptoerror.go b/crypto/cryptoerror.go
index 3282f8d4a..b635f1ea8 100644
--- a/crypto/cryptoerror.go
+++ b/crypto/cryptoerror.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/curve25519.go b/crypto/curve25519.go
index a8637399d..0961ed626 100644
--- a/crypto/curve25519.go
+++ b/crypto/curve25519.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/curve25519_test.go b/crypto/curve25519_test.go
index acd152cba..fac0bd6ab 100644
--- a/crypto/curve25519_test.go
+++ b/crypto/curve25519_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/digest.go b/crypto/digest.go
index d6f3c2777..967fa68ab 100644
--- a/crypto/digest.go
+++ b/crypto/digest.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/encoding_test.go b/crypto/encoding_test.go
index 527a56d2c..0093b6c58 100644
--- a/crypto/encoding_test.go
+++ b/crypto/encoding_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/falconWrapper.go b/crypto/falconWrapper.go
index 0a2c000b9..493021042 100644
--- a/crypto/falconWrapper.go
+++ b/crypto/falconWrapper.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/falconWrapper_test.go b/crypto/falconWrapper_test.go
index 45adb124a..cb251c7d8 100644
--- a/crypto/falconWrapper_test.go
+++ b/crypto/falconWrapper_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/hashes.go b/crypto/hashes.go
index 04db757f3..3e232ed27 100644
--- a/crypto/hashes.go
+++ b/crypto/hashes.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/hashes_test.go b/crypto/hashes_test.go
index 9f8b57fe3..2988f9ca1 100644
--- a/crypto/hashes_test.go
+++ b/crypto/hashes_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/memcpy_chk_windows.c b/crypto/memcpy_chk_windows.c
index d79118cdf..3cff6c7da 100644
--- a/crypto/memcpy_chk_windows.c
+++ b/crypto/memcpy_chk_windows.c
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/array.go b/crypto/merklearray/array.go
index 4e04b5338..2e1eccb39 100644
--- a/crypto/merklearray/array.go
+++ b/crypto/merklearray/array.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/layer.go b/crypto/merklearray/layer.go
index 88eed6ffe..bed28ccf5 100644
--- a/crypto/merklearray/layer.go
+++ b/crypto/merklearray/layer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/merkle.go b/crypto/merklearray/merkle.go
index 203d92110..e540586b5 100644
--- a/crypto/merklearray/merkle.go
+++ b/crypto/merklearray/merkle.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/merkle_test.go b/crypto/merklearray/merkle_test.go
index 0d392dcef..f62d6c282 100644
--- a/crypto/merklearray/merkle_test.go
+++ b/crypto/merklearray/merkle_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/partial.go b/crypto/merklearray/partial.go
index b1aa07c52..baebf4538 100644
--- a/crypto/merklearray/partial.go
+++ b/crypto/merklearray/partial.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/proof.go b/crypto/merklearray/proof.go
index 3455baa08..8caa057bd 100644
--- a/crypto/merklearray/proof.go
+++ b/crypto/merklearray/proof.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/proof_test.go b/crypto/merklearray/proof_test.go
index a16037155..7ef7ae044 100644
--- a/crypto/merklearray/proof_test.go
+++ b/crypto/merklearray/proof_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/vectorCommitmentArray.go b/crypto/merklearray/vectorCommitmentArray.go
index c11e295ae..6745aca60 100644
--- a/crypto/merklearray/vectorCommitmentArray.go
+++ b/crypto/merklearray/vectorCommitmentArray.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/vectorCommitmentArray_test.go b/crypto/merklearray/vectorCommitmentArray_test.go
index e3887880d..24b1d32e9 100644
--- a/crypto/merklearray/vectorCommitmentArray_test.go
+++ b/crypto/merklearray/vectorCommitmentArray_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklearray/worker.go b/crypto/merklearray/worker.go
index b6d273e37..2c3344067 100644
--- a/crypto/merklearray/worker.go
+++ b/crypto/merklearray/worker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/committablePublicKeys.go b/crypto/merklesignature/committablePublicKeys.go
index fd4a9f26a..a636b3f02 100644
--- a/crypto/merklesignature/committablePublicKeys.go
+++ b/crypto/merklesignature/committablePublicKeys.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/committablePublicKeys_test.go b/crypto/merklesignature/committablePublicKeys_test.go
index 08108b302..68463bf8e 100644
--- a/crypto/merklesignature/committablePublicKeys_test.go
+++ b/crypto/merklesignature/committablePublicKeys_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/const.go b/crypto/merklesignature/const.go
index 52d98390f..40817d421 100644
--- a/crypto/merklesignature/const.go
+++ b/crypto/merklesignature/const.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/kats_test.go b/crypto/merklesignature/kats_test.go
index 610cdbab9..64b3e8c53 100644
--- a/crypto/merklesignature/kats_test.go
+++ b/crypto/merklesignature/kats_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/keysBuilder.go b/crypto/merklesignature/keysBuilder.go
index 50498b519..68ee76ae3 100644
--- a/crypto/merklesignature/keysBuilder.go
+++ b/crypto/merklesignature/keysBuilder.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/keysBuilder_test.go b/crypto/merklesignature/keysBuilder_test.go
index 24f426e70..01dd082fd 100644
--- a/crypto/merklesignature/keysBuilder_test.go
+++ b/crypto/merklesignature/keysBuilder_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/merkleSignatureScheme.go b/crypto/merklesignature/merkleSignatureScheme.go
index f11ecb920..61724af4e 100644
--- a/crypto/merklesignature/merkleSignatureScheme.go
+++ b/crypto/merklesignature/merkleSignatureScheme.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/merkleSignatureScheme_test.go b/crypto/merklesignature/merkleSignatureScheme_test.go
index b2c82d42d..5abd9b77c 100644
--- a/crypto/merklesignature/merkleSignatureScheme_test.go
+++ b/crypto/merklesignature/merkleSignatureScheme_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/persistentMerkleSignatureScheme.go b/crypto/merklesignature/persistentMerkleSignatureScheme.go
index a5e114a46..66f1dd055 100644
--- a/crypto/merklesignature/persistentMerkleSignatureScheme.go
+++ b/crypto/merklesignature/persistentMerkleSignatureScheme.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/persistentMerkleSignatureScheme_test.go b/crypto/merklesignature/persistentMerkleSignatureScheme_test.go
index 5885f1cf6..adc22833f 100644
--- a/crypto/merklesignature/persistentMerkleSignatureScheme_test.go
+++ b/crypto/merklesignature/persistentMerkleSignatureScheme_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/posdivs.go b/crypto/merklesignature/posdivs.go
index ac152234f..09b798c78 100644
--- a/crypto/merklesignature/posdivs.go
+++ b/crypto/merklesignature/posdivs.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merklesignature/posdivs_test.go b/crypto/merklesignature/posdivs_test.go
index 394c31870..68f4b77ab 100644
--- a/crypto/merklesignature/posdivs_test.go
+++ b/crypto/merklesignature/posdivs_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/bitset.go b/crypto/merkletrie/bitset.go
index 3007372ab..f764137a9 100644
--- a/crypto/merkletrie/bitset.go
+++ b/crypto/merkletrie/bitset.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/bitset_test.go b/crypto/merkletrie/bitset_test.go
index 2fa5a35f9..315b27c95 100644
--- a/crypto/merkletrie/bitset_test.go
+++ b/crypto/merkletrie/bitset_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/cache.go b/crypto/merkletrie/cache.go
index 453e51645..d4d60b2c3 100644
--- a/crypto/merkletrie/cache.go
+++ b/crypto/merkletrie/cache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/cache_test.go b/crypto/merkletrie/cache_test.go
index 5967f0114..ac08ea442 100644
--- a/crypto/merkletrie/cache_test.go
+++ b/crypto/merkletrie/cache_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/committer.go b/crypto/merkletrie/committer.go
index 305ce1f66..66dd2c65c 100644
--- a/crypto/merkletrie/committer.go
+++ b/crypto/merkletrie/committer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/committer_test.go b/crypto/merkletrie/committer_test.go
index 317261f72..3dc6c39d2 100644
--- a/crypto/merkletrie/committer_test.go
+++ b/crypto/merkletrie/committer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/node.go b/crypto/merkletrie/node.go
index 972ef0e1e..f63d2b12a 100644
--- a/crypto/merkletrie/node.go
+++ b/crypto/merkletrie/node.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/node_test.go b/crypto/merkletrie/node_test.go
index 893fbc86b..c9fc2e46f 100644
--- a/crypto/merkletrie/node_test.go
+++ b/crypto/merkletrie/node_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/trie.go b/crypto/merkletrie/trie.go
index 39051699f..6bb2a5185 100644
--- a/crypto/merkletrie/trie.go
+++ b/crypto/merkletrie/trie.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/merkletrie/trie_test.go b/crypto/merkletrie/trie_test.go
index f71545962..7b15d5534 100644
--- a/crypto/merkletrie/trie_test.go
+++ b/crypto/merkletrie/trie_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/multisig.go b/crypto/multisig.go
index 92e711d9e..d5529c149 100644
--- a/crypto/multisig.go
+++ b/crypto/multisig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/multisig_test.go b/crypto/multisig_test.go
index 2f630f7fc..614889c5a 100644
--- a/crypto/multisig_test.go
+++ b/crypto/multisig_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/onetimesig.go b/crypto/onetimesig.go
index a2db211a7..d9c94da86 100644
--- a/crypto/onetimesig.go
+++ b/crypto/onetimesig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/onetimesig_test.go b/crypto/onetimesig_test.go
index 143bb5c16..ca7b641ea 100644
--- a/crypto/onetimesig_test.go
+++ b/crypto/onetimesig_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/passphrase/errors.go b/crypto/passphrase/errors.go
index 0a50d59c4..84918ce39 100644
--- a/crypto/passphrase/errors.go
+++ b/crypto/passphrase/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/passphrase/passphrase.go b/crypto/passphrase/passphrase.go
index 0f0d09d34..6c1364229 100644
--- a/crypto/passphrase/passphrase.go
+++ b/crypto/passphrase/passphrase.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/passphrase/passphrase_test.go b/crypto/passphrase/passphrase_test.go
index 543ed5fd7..882411650 100644
--- a/crypto/passphrase/passphrase_test.go
+++ b/crypto/passphrase/passphrase_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/passphrase/wordlist.go b/crypto/passphrase/wordlist.go
index 670a72b3d..d2b786f41 100644
--- a/crypto/passphrase/wordlist.go
+++ b/crypto/passphrase/wordlist.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/rand.go b/crypto/rand.go
index 99f22e145..e74b62f9d 100644
--- a/crypto/rand.go
+++ b/crypto/rand.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/rand_test.go b/crypto/rand_test.go
index 129f83171..49d431c8e 100644
--- a/crypto/rand_test.go
+++ b/crypto/rand_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/coinGenerator.go b/crypto/stateproof/coinGenerator.go
index eb73e10f8..eb256336d 100644
--- a/crypto/stateproof/coinGenerator.go
+++ b/crypto/stateproof/coinGenerator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/coinGenerator_test.go b/crypto/stateproof/coinGenerator_test.go
index d15091f6d..cf4b326ea 100644
--- a/crypto/stateproof/coinGenerator_test.go
+++ b/crypto/stateproof/coinGenerator_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/committableSignatureSlot.go b/crypto/stateproof/committableSignatureSlot.go
index 2c296e75f..c53df6960 100644
--- a/crypto/stateproof/committableSignatureSlot.go
+++ b/crypto/stateproof/committableSignatureSlot.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/committableSignatureSlot_test.go b/crypto/stateproof/committableSignatureSlot_test.go
index b2519cea6..5723df5aa 100644
--- a/crypto/stateproof/committableSignatureSlot_test.go
+++ b/crypto/stateproof/committableSignatureSlot_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/const.go b/crypto/stateproof/const.go
index eefe0d1a9..35c6134e9 100644
--- a/crypto/stateproof/const.go
+++ b/crypto/stateproof/const.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/prover.go b/crypto/stateproof/prover.go
index f3a8a43bc..45d9e27aa 100644
--- a/crypto/stateproof/prover.go
+++ b/crypto/stateproof/prover.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/prover_test.go b/crypto/stateproof/prover_test.go
index b9680de3a..42a0daa5e 100644
--- a/crypto/stateproof/prover_test.go
+++ b/crypto/stateproof/prover_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/structs.go b/crypto/stateproof/structs.go
index 39e5e0f2f..f82edbd6c 100644
--- a/crypto/stateproof/structs.go
+++ b/crypto/stateproof/structs.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/verifier.go b/crypto/stateproof/verifier.go
index 67d83068f..0f36f95a5 100644
--- a/crypto/stateproof/verifier.go
+++ b/crypto/stateproof/verifier.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/verifier_test.go b/crypto/stateproof/verifier_test.go
index 23a5fac3a..352a53202 100644
--- a/crypto/stateproof/verifier_test.go
+++ b/crypto/stateproof/verifier_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/weights.go b/crypto/stateproof/weights.go
index 43a22affd..874222f49 100644
--- a/crypto/stateproof/weights.go
+++ b/crypto/stateproof/weights.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/stateproof/weights_test.go b/crypto/stateproof/weights_test.go
index bf1fd2f64..718382563 100644
--- a/crypto/stateproof/weights_test.go
+++ b/crypto/stateproof/weights_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/statetrie/nibbles/nibbles.go b/crypto/statetrie/nibbles/nibbles.go
index 8a8409b6b..d2f95678f 100644
--- a/crypto/statetrie/nibbles/nibbles.go
+++ b/crypto/statetrie/nibbles/nibbles.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/statetrie/nibbles/nibbles_test.go b/crypto/statetrie/nibbles/nibbles_test.go
index c088f1dd8..7b355c038 100644
--- a/crypto/statetrie/nibbles/nibbles_test.go
+++ b/crypto/statetrie/nibbles/nibbles_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/util.go b/crypto/util.go
index 078d52c0c..8d167dfc8 100644
--- a/crypto/util.go
+++ b/crypto/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/util_test.go b/crypto/util_test.go
index 2e0828bcc..01941511b 100644
--- a/crypto/util_test.go
+++ b/crypto/util_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/vrf.go b/crypto/vrf.go
index 948a84ddc..3c7422589 100644
--- a/crypto/vrf.go
+++ b/crypto/vrf.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/crypto/vrf_test.go b/crypto/vrf_test.go
index 22b3e7527..7acc79173 100644
--- a/crypto/vrf_test.go
+++ b/crypto/vrf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/client/encoding.go b/daemon/algod/api/client/encoding.go
index 365fb7d50..b78ca306f 100644
--- a/daemon/algod/api/client/encoding.go
+++ b/daemon/algod/api/client/encoding.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/client/restClient.go b/daemon/algod/api/client/restClient.go
index 6be81c35f..f6494fa38 100644
--- a/daemon/algod/api/client/restClient.go
+++ b/daemon/algod/api/client/restClient.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -72,6 +72,7 @@ type HTTPError struct {
StatusCode int
Status string
ErrorString string
+ Data map[string]any
}
// Error formats an error string.
@@ -120,24 +121,11 @@ func extractError(resp *http.Response) error {
decodeErr := json.Unmarshal(errorBuf, &errorJSON)
var errorString string
+ var data map[string]any
if decodeErr == nil {
- if errorJSON.Data == nil {
- // There's no additional data, so let's just use the message
- errorString = errorJSON.Message
- } else {
- // There's additional data, so let's re-encode the JSON response to show everything.
- // We do this because the original response is likely encoded with escapeHTML=true, but
- // since this isn't a webpage that extra encoding is not preferred.
- var buffer strings.Builder
- enc := json.NewEncoder(&buffer)
- enc.SetEscapeHTML(false)
- encErr := enc.Encode(errorJSON)
- if encErr != nil {
- // This really shouldn't happen, but if it does let's default to errorBuff
- errorString = string(errorBuf)
- } else {
- errorString = buffer.String()
- }
+ errorString = errorJSON.Message
+ if errorJSON.Data != nil {
+ data = *errorJSON.Data
}
} else {
errorString = string(errorBuf)
@@ -149,7 +137,7 @@ func extractError(resp *http.Response) error {
return unauthorizedRequestError{errorString, apiToken, resp.Request.URL.String()}
}
- return HTTPError{StatusCode: resp.StatusCode, Status: resp.Status, ErrorString: errorString}
+ return HTTPError{StatusCode: resp.StatusCode, Status: resp.Status, ErrorString: errorString, Data: data}
}
// stripTransaction gets a transaction of the form "tx-XXXXXXXX" and truncates the "tx-" part, if it starts with "tx-"
diff --git a/daemon/algod/api/server/common/handlers.go b/daemon/algod/api/server/common/handlers.go
index 938d3ee10..308017e98 100644
--- a/daemon/algod/api/server/common/handlers.go
+++ b/daemon/algod/api/server/common/handlers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/common/metrics.go b/daemon/algod/api/server/common/metrics.go
index 18e6b8027..a3ef24bc8 100644
--- a/daemon/algod/api/server/common/metrics.go
+++ b/daemon/algod/api/server/common/metrics.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/common/responses.go b/daemon/algod/api/server/common/responses.go
index b775d2040..0b3a4cd3f 100644
--- a/daemon/algod/api/server/common/responses.go
+++ b/daemon/algod/api/server/common/responses.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/common/routes.go b/daemon/algod/api/server/common/routes.go
index 1a78fe00a..237179d71 100644
--- a/daemon/algod/api/server/common/routes.go
+++ b/daemon/algod/api/server/common/routes.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/common/test/handlers_test.go b/daemon/algod/api/server/common/test/handlers_test.go
index c602b5bde..a928b4e83 100644
--- a/daemon/algod/api/server/common/test/handlers_test.go
+++ b/daemon/algod/api/server/common/test/handlers_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/common/test/helpers.go b/daemon/algod/api/server/common/test/helpers.go
index 27d534ad5..638bb8136 100644
--- a/daemon/algod/api/server/common/test/helpers.go
+++ b/daemon/algod/api/server/common/test/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/common.go b/daemon/algod/api/server/lib/common.go
index e44e624c1..c3461b25f 100644
--- a/daemon/algod/api/server/lib/common.go
+++ b/daemon/algod/api/server/lib/common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/auth.go b/daemon/algod/api/server/lib/middlewares/auth.go
index d7cc336cf..06a757341 100644
--- a/daemon/algod/api/server/lib/middlewares/auth.go
+++ b/daemon/algod/api/server/lib/middlewares/auth.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/auth_test.go b/daemon/algod/api/server/lib/middlewares/auth_test.go
index 4bdfa7b85..75b75bca8 100644
--- a/daemon/algod/api/server/lib/middlewares/auth_test.go
+++ b/daemon/algod/api/server/lib/middlewares/auth_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/connectionLimiter.go b/daemon/algod/api/server/lib/middlewares/connectionLimiter.go
index 21e6c0bd1..0d5d32959 100644
--- a/daemon/algod/api/server/lib/middlewares/connectionLimiter.go
+++ b/daemon/algod/api/server/lib/middlewares/connectionLimiter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go b/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go
index b3e5ea06a..88ebc39b9 100644
--- a/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go
+++ b/daemon/algod/api/server/lib/middlewares/connectionLimiter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/cors.go b/daemon/algod/api/server/lib/middlewares/cors.go
index 049184aad..89e88dabb 100644
--- a/daemon/algod/api/server/lib/middlewares/cors.go
+++ b/daemon/algod/api/server/lib/middlewares/cors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/lib/middlewares/logger.go b/daemon/algod/api/server/lib/middlewares/logger.go
index 5ede3aa49..7c3084b2b 100644
--- a/daemon/algod/api/server/lib/middlewares/logger.go
+++ b/daemon/algod/api/server/lib/middlewares/logger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/router.go b/daemon/algod/api/server/router.go
index e380cb026..cd0899c17 100644
--- a/daemon/algod/api/server/router.go
+++ b/daemon/algod/api/server/router.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/router_test.go b/daemon/algod/api/server/router_test.go
index 37fc3be74..0819309aa 100644
--- a/daemon/algod/api/server/router_test.go
+++ b/daemon/algod/api/server/router_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v1/handlers/errors.go b/daemon/algod/api/server/v1/handlers/errors.go
index 09720c78e..d61f6bd79 100644
--- a/daemon/algod/api/server/v1/handlers/errors.go
+++ b/daemon/algod/api/server/v1/handlers/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v1/handlers/handlers.go b/daemon/algod/api/server/v1/handlers/handlers.go
index f5b914687..f7e1ac4cc 100644
--- a/daemon/algod/api/server/v1/handlers/handlers.go
+++ b/daemon/algod/api/server/v1/handlers/handlers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v1/routes/routes.go b/daemon/algod/api/server/v1/routes/routes.go
index dc163454e..88ed20ea1 100644
--- a/daemon/algod/api/server/v1/routes/routes.go
+++ b/daemon/algod/api/server/v1/routes/routes.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/account.go b/daemon/algod/api/server/v2/account.go
index 31483d63b..addb81b43 100644
--- a/daemon/algod/api/server/v2/account.go
+++ b/daemon/algod/api/server/v2/account.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/account_test.go b/daemon/algod/api/server/v2/account_test.go
index ac1abd3b9..cd3c67499 100644
--- a/daemon/algod/api/server/v2/account_test.go
+++ b/daemon/algod/api/server/v2/account_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/dryrun.go b/daemon/algod/api/server/v2/dryrun.go
index acf5fc94b..9c3355cd1 100644
--- a/daemon/algod/api/server/v2/dryrun.go
+++ b/daemon/algod/api/server/v2/dryrun.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -89,7 +89,12 @@ func (dr *DryrunRequest) ExpandSources() error {
for i, s := range dr.Sources {
ops, err := logic.AssembleString(s.Source)
if err != nil {
- return fmt.Errorf("dryrun Source[%d]: %v", i, err)
+ if len(ops.Errors) <= 1 {
+ return fmt.Errorf("dryrun Source[%d]: %w", i, err)
+ }
+ var sb strings.Builder
+ ops.ReportMultipleErrors("", &sb)
+ return fmt.Errorf("dryrun Source[%d]: %d errors\n%s", i, len(ops.Errors), sb.String())
}
switch s.FieldName {
case "lsig":
diff --git a/daemon/algod/api/server/v2/dryrun_test.go b/daemon/algod/api/server/v2/dryrun_test.go
index 99e060118..93177e488 100644
--- a/daemon/algod/api/server/v2/dryrun_test.go
+++ b/daemon/algod/api/server/v2/dryrun_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -132,6 +132,48 @@ func logResponse(t *testing.T, response *model.DryrunResponse) {
var dryrunProtoVersion protocol.ConsensusVersion = protocol.ConsensusFuture
var dryrunMakeLedgerProto protocol.ConsensusVersion = "dryrunMakeLedgerProto"
+func TestDryrunSources(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ goodSource := model.DryrunSource{
+ AppIndex: 1007,
+ FieldName: "approv",
+ Source: `#pragma version 10
+int 1`,
+ }
+ badSource := model.DryrunSource{
+ AppIndex: 1007,
+ FieldName: "approv",
+ Source: `#pragma version 10
+int 1
+pop
+fake_opcode
+int not_an_int`,
+ }
+
+ dr := DryrunRequest{
+ Sources: []model.DryrunSource{
+ goodSource,
+ },
+ Apps: []model.Application{
+ {
+ Id: 1007,
+ },
+ },
+ }
+ var response model.DryrunResponse
+
+ doDryrunRequest(&dr, &response)
+ require.Empty(t, response.Error)
+
+ dr.Sources[0] = badSource
+ doDryrunRequest(&dr, &response)
+ require.Contains(t, response.Error, "dryrun Source[0]: 2 errors")
+ require.Contains(t, response.Error, "4: unknown opcode: fake_opcode")
+ require.Contains(t, response.Error, "5:4: unable to parse \"not_an_int\" as integer")
+}
+
func TestDryrunLogicSig(t *testing.T) {
partitiontest.PartitionTest(t)
// {"txns":[{"lsig":{"l":"AiABASI="},"txn":{}}]}
diff --git a/daemon/algod/api/server/v2/errors.go b/daemon/algod/api/server/v2/errors.go
index d85ac7c0b..ff1bcbaa0 100644
--- a/daemon/algod/api/server/v2/errors.go
+++ b/daemon/algod/api/server/v2/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/handlers.go b/daemon/algod/api/server/v2/handlers.go
index 0282594f4..69201ca84 100644
--- a/daemon/algod/api/server/v2/handlers.go
+++ b/daemon/algod/api/server/v2/handlers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/handlers_test.go b/daemon/algod/api/server/v2/handlers_test.go
index a0a50dddb..148c5de62 100644
--- a/daemon/algod/api/server/v2/handlers_test.go
+++ b/daemon/algod/api/server/v2/handlers_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/test/handlers_resources_test.go b/daemon/algod/api/server/v2/test/handlers_resources_test.go
index adf187053..8260e54ff 100644
--- a/daemon/algod/api/server/v2/test/handlers_resources_test.go
+++ b/daemon/algod/api/server/v2/test/handlers_resources_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/test/handlers_test.go b/daemon/algod/api/server/v2/test/handlers_test.go
index aa5a7492b..53ef65256 100644
--- a/daemon/algod/api/server/v2/test/handlers_test.go
+++ b/daemon/algod/api/server/v2/test/handlers_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/test/helpers.go b/daemon/algod/api/server/v2/test/helpers.go
index e2b52fc7c..400906d29 100644
--- a/daemon/algod/api/server/v2/test/helpers.go
+++ b/daemon/algod/api/server/v2/test/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/server/v2/utils.go b/daemon/algod/api/server/v2/utils.go
index b82212a19..ee306a62b 100644
--- a/daemon/algod/api/server/v2/utils.go
+++ b/daemon/algod/api/server/v2/utils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -18,6 +18,7 @@ package v2
import (
"encoding/base64"
+ "errors"
"fmt"
"net/http"
"strings"
@@ -44,7 +45,12 @@ import (
// returnError logs an internal message while returning the encoded response.
func returnError(ctx echo.Context, code int, internal error, external string, logger logging.Logger) error {
logger.Info(internal)
- return ctx.JSON(code, model.ErrorResponse{Message: external})
+ var data *map[string]any
+ var se *basics.SError
+ if errors.As(internal, &se) {
+ data = &se.Attrs
+ }
+ return ctx.JSON(code, model.ErrorResponse{Message: external, Data: data})
}
func badRequest(ctx echo.Context, internal error, external string, log logging.Logger) error {
diff --git a/daemon/algod/api/spec/common/model.go b/daemon/algod/api/spec/common/model.go
index 4b4d4eae7..016af9a88 100644
--- a/daemon/algod/api/spec/common/model.go
+++ b/daemon/algod/api/spec/common/model.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/spec/v2/model.go b/daemon/algod/api/spec/v2/model.go
index 845bc7c22..b8b01a240 100644
--- a/daemon/algod/api/spec/v2/model.go
+++ b/daemon/algod/api/spec/v2/model.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/api/swagger.go b/daemon/algod/api/swagger.go
index 5402e802e..601271fa5 100644
--- a/daemon/algod/api/swagger.go
+++ b/daemon/algod/api/swagger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/deadlockLogger.go b/daemon/algod/deadlockLogger.go
index 923db611f..8498a3c41 100644
--- a/daemon/algod/deadlockLogger.go
+++ b/daemon/algod/deadlockLogger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/deadlock_test.go b/daemon/algod/deadlock_test.go
index 83cc11859..2e3b356c4 100644
--- a/daemon/algod/deadlock_test.go
+++ b/daemon/algod/deadlock_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/server.go b/daemon/algod/server.go
index 1b40e98bf..57e1b443f 100644
--- a/daemon/algod/server.go
+++ b/daemon/algod/server.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/algod/server_test.go b/daemon/algod/server_test.go
index bb8ec350e..459297ebd 100644
--- a/daemon/algod/server_test.go
+++ b/daemon/algod/server_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/api/api.go b/daemon/kmd/api/api.go
index 90c374482..084b6f882 100644
--- a/daemon/kmd/api/api.go
+++ b/daemon/kmd/api/api.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/api/cors.go b/daemon/kmd/api/cors.go
index 96c00b7ce..6ff8e3845 100644
--- a/daemon/kmd/api/cors.go
+++ b/daemon/kmd/api/cors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/api/v1/auth.go b/daemon/kmd/api/v1/auth.go
index eb28cb990..997d4326e 100644
--- a/daemon/kmd/api/v1/auth.go
+++ b/daemon/kmd/api/v1/auth.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/api/v1/errors.go b/daemon/kmd/api/v1/errors.go
index 493551f64..762053438 100644
--- a/daemon/kmd/api/v1/errors.go
+++ b/daemon/kmd/api/v1/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/api/v1/handlers.go b/daemon/kmd/api/v1/handlers.go
index f585cb274..466daab4c 100644
--- a/daemon/kmd/api/v1/handlers.go
+++ b/daemon/kmd/api/v1/handlers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/client/client.go b/daemon/kmd/client/client.go
index 339d970f6..8d819557e 100644
--- a/daemon/kmd/client/client.go
+++ b/daemon/kmd/client/client.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/client/requests.go b/daemon/kmd/client/requests.go
index dbd6cf69a..1bf13f755 100644
--- a/daemon/kmd/client/requests.go
+++ b/daemon/kmd/client/requests.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/client/wrappers.go b/daemon/kmd/client/wrappers.go
index cb490c791..a7b5613af 100644
--- a/daemon/kmd/client/wrappers.go
+++ b/daemon/kmd/client/wrappers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/config/config.go b/daemon/kmd/config/config.go
index 3192c7a9a..5dce6ba66 100644
--- a/daemon/kmd/config/config.go
+++ b/daemon/kmd/config/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/config/errors.go b/daemon/kmd/config/errors.go
index 510725b09..cd6197c4e 100644
--- a/daemon/kmd/config/errors.go
+++ b/daemon/kmd/config/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/kmd.go b/daemon/kmd/kmd.go
index e0890c09b..3d3ce3c92 100644
--- a/daemon/kmd/kmd.go
+++ b/daemon/kmd/kmd.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/lib/kmdapi/common.go b/daemon/kmd/lib/kmdapi/common.go
index d3b05a115..f1a5a624c 100644
--- a/daemon/kmd/lib/kmdapi/common.go
+++ b/daemon/kmd/lib/kmdapi/common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/lib/kmdapi/requests.go b/daemon/kmd/lib/kmdapi/requests.go
index c2d323c78..445e88df1 100644
--- a/daemon/kmd/lib/kmdapi/requests.go
+++ b/daemon/kmd/lib/kmdapi/requests.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/lib/kmdapi/responses.go b/daemon/kmd/lib/kmdapi/responses.go
index 4d233e9cb..783953795 100644
--- a/daemon/kmd/lib/kmdapi/responses.go
+++ b/daemon/kmd/lib/kmdapi/responses.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/server/errors.go b/daemon/kmd/server/errors.go
index 9aac3feeb..3b0f70dda 100644
--- a/daemon/kmd/server/errors.go
+++ b/daemon/kmd/server/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/server/server.go b/daemon/kmd/server/server.go
index 021079194..712583d47 100644
--- a/daemon/kmd/server/server.go
+++ b/daemon/kmd/server/server.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/session/auth.go b/daemon/kmd/session/auth.go
index 29aa5acc2..57955a611 100644
--- a/daemon/kmd/session/auth.go
+++ b/daemon/kmd/session/auth.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/session/session.go b/daemon/kmd/session/session.go
index 6aac936d9..6ecdcf826 100644
--- a/daemon/kmd/session/session.go
+++ b/daemon/kmd/session/session.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/driver.go b/daemon/kmd/wallet/driver/driver.go
index 9f1bb0c7f..f22f4680b 100644
--- a/daemon/kmd/wallet/driver/driver.go
+++ b/daemon/kmd/wallet/driver/driver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/ledger.go b/daemon/kmd/wallet/driver/ledger.go
index e26abe11d..fbe5367ba 100644
--- a/daemon/kmd/wallet/driver/ledger.go
+++ b/daemon/kmd/wallet/driver/ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/ledger_errors.go b/daemon/kmd/wallet/driver/ledger_errors.go
index 0fd881108..036b2df2c 100644
--- a/daemon/kmd/wallet/driver/ledger_errors.go
+++ b/daemon/kmd/wallet/driver/ledger_errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/ledger_hid.go b/daemon/kmd/wallet/driver/ledger_hid.go
index 36140f918..5a958f4a0 100644
--- a/daemon/kmd/wallet/driver/ledger_hid.go
+++ b/daemon/kmd/wallet/driver/ledger_hid.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/sqlite.go b/daemon/kmd/wallet/driver/sqlite.go
index 46992734d..d17e9dace 100644
--- a/daemon/kmd/wallet/driver/sqlite.go
+++ b/daemon/kmd/wallet/driver/sqlite.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/sqlite_crypto.go b/daemon/kmd/wallet/driver/sqlite_crypto.go
index 2749f2683..8c77a9f84 100644
--- a/daemon/kmd/wallet/driver/sqlite_crypto.go
+++ b/daemon/kmd/wallet/driver/sqlite_crypto.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/sqlite_errors.go b/daemon/kmd/wallet/driver/sqlite_errors.go
index 39e122a4e..a07fce2d8 100644
--- a/daemon/kmd/wallet/driver/sqlite_errors.go
+++ b/daemon/kmd/wallet/driver/sqlite_errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/driver/util.go b/daemon/kmd/wallet/driver/util.go
index 7319ae444..533b8860c 100644
--- a/daemon/kmd/wallet/driver/util.go
+++ b/daemon/kmd/wallet/driver/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/daemon/kmd/wallet/wallet.go b/daemon/kmd/wallet/wallet.go
index d4b6b5b1a..a5b0fc0f7 100644
--- a/daemon/kmd/wallet/wallet.go
+++ b/daemon/kmd/wallet/wallet.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/account.go b/data/account/account.go
index 9c0d978c8..0693d8afa 100644
--- a/data/account/account.go
+++ b/data/account/account.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/partInstall.go b/data/account/partInstall.go
index 0b1087278..0be175c79 100644
--- a/data/account/partInstall.go
+++ b/data/account/partInstall.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/participation.go b/data/account/participation.go
index 9493f21f0..a4dcf04b7 100644
--- a/data/account/participation.go
+++ b/data/account/participation.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/participationRegistry.go b/data/account/participationRegistry.go
index 3add9ec5b..0752bc73f 100644
--- a/data/account/participationRegistry.go
+++ b/data/account/participationRegistry.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/participationRegistryBench_test.go b/data/account/participationRegistryBench_test.go
index 4c6f1098c..70790ae74 100644
--- a/data/account/participationRegistryBench_test.go
+++ b/data/account/participationRegistryBench_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/participationRegistry_test.go b/data/account/participationRegistry_test.go
index e0328bb7f..8cc5a4f11 100644
--- a/data/account/participationRegistry_test.go
+++ b/data/account/participationRegistry_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/participation_test.go b/data/account/participation_test.go
index ccf300122..41e1a2bf3 100644
--- a/data/account/participation_test.go
+++ b/data/account/participation_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/registeryDbOps.go b/data/account/registeryDbOps.go
index ad5174c1c..62bd5772a 100644
--- a/data/account/registeryDbOps.go
+++ b/data/account/registeryDbOps.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/account/rootInstall.go b/data/account/rootInstall.go
index 50f1c6e97..b070b8d9b 100644
--- a/data/account/rootInstall.go
+++ b/data/account/rootInstall.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/accountManager.go b/data/accountManager.go
index 063ab4d1b..8e10cb35c 100644
--- a/data/accountManager.go
+++ b/data/accountManager.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/accountManager_test.go b/data/accountManager_test.go
index 3d580a5f2..7a1fb2836 100644
--- a/data/accountManager_test.go
+++ b/data/accountManager_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/appRateLimiter.go b/data/appRateLimiter.go
index b7684409a..1f4472e68 100644
--- a/data/appRateLimiter.go
+++ b/data/appRateLimiter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/appRateLimiter_test.go b/data/appRateLimiter_test.go
index 2da9fddfa..f5e63dfb3 100644
--- a/data/appRateLimiter_test.go
+++ b/data/appRateLimiter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/address.go b/data/basics/address.go
index 6e2249f4f..10aeb821e 100644
--- a/data/basics/address.go
+++ b/data/basics/address.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/address_test.go b/data/basics/address_test.go
index 264b90a56..129b45309 100644
--- a/data/basics/address_test.go
+++ b/data/basics/address_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/fields_test.go b/data/basics/fields_test.go
index 4baacdb16..a5a73edf7 100644
--- a/data/basics/fields_test.go
+++ b/data/basics/fields_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/overflow.go b/data/basics/overflow.go
index d119ba3a9..9f90577ec 100644
--- a/data/basics/overflow.go
+++ b/data/basics/overflow.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/serr.go b/data/basics/serr.go
new file mode 100644
index 000000000..229d800d7
--- /dev/null
+++ b/data/basics/serr.go
@@ -0,0 +1,132 @@
+// Copyright (C) 2019-2024 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see <https://www.gnu.org/licenses/>.
+
+package basics
+
+import (
+ "errors"
+ "strings"
+
+ "golang.org/x/exp/slog"
+)
+
+// SError is a structured error object. It contains a message and an arbitrary
+// set of attributes. If the message contains "%A", it will be replaced by the
+// attributes (in no guaranteed order), when SError() is called.
+//
+//msgp:ignore SError
+type SError struct {
+ Msg string
+ Attrs map[string]any
+ Wrapped error
+}
+
+// New creates a new structured error object using the supplied message and
+// attributes. If the message contains "%A", it will be replaced by the
+// attributes when Error() is called.
+func New(msg string, pairs ...any) *SError {
+ attrs := make(map[string]any, len(pairs)/2)
+ for i := 0; i < len(pairs); i += 2 {
+ attrs[pairs[i].(string)] = pairs[i+1]
+ }
+ return &SError{Msg: msg, Attrs: attrs}
+}
+
+// Error returns either the exact supplied message, or the serialized attributes if
+// the supplied message was blank, or substituted for %A.
+func (e *SError) Error() string {
+ if e.Msg == "" {
+ return e.AttributesAsString()
+ }
+ // imperfect because we replace \%A as well
+ if strings.Contains(e.Msg, "%A") {
+ return strings.Replace(e.Msg, "%A", e.AttributesAsString(), -1)
+ }
+ return e.Msg
+}
+
+// AttributesAsString returns the attributes the same way that slog serializes
+// attributes to text in a log message, in no guaranteed order.
+func (e *SError) AttributesAsString() string {
+ var buf strings.Builder
+ args := make([]any, 0, 2*len(e.Attrs))
+ for key, val := range e.Attrs {
+ args = append(args, key)
+ args = append(args, val)
+ }
+ l := slog.New(slog.NewTextHandler(&buf, nil))
+ l.Info("", args...)
+ return strings.TrimSuffix(strings.SplitN(buf.String(), " ", 4)[3], "\n")
+}
+
+// Annotate adds additional attributes to an existing error, even if the error
+// is deep in the error chain. If the supplied error is nil, nil is returned so
+// that callers can annotate errors without checking if they are non-nil. If
+// the error is not a structured error, it is wrapped in one using its existing
+// message and the new attributes. Just like append() for slices, callers should
+// re-assign, like this `err = serr.Annotate(err, "x", 100)`
+func Annotate(err error, pairs ...any) error {
+ if err == nil {
+ return nil
+ }
+ var serr *SError
+ if ok := errors.As(err, &serr); ok {
+ for i := 0; i < len(pairs); i += 2 {
+ serr.Attrs[pairs[i].(string)] = pairs[i+1]
+ }
+ return err
+ }
+ // Since we don't have a structured error, we wrap the existing error in one.
+ serr = New(err.Error(), pairs...)
+ serr.Wrapped = err
+ return serr
+}
+
+// Wrap is used to "demote" an existing error to a field in a new structured
+// error. The wrapped error message is added as $field-msg, and if the error is
+// structured, the attributes are added under $field-attrs.
+func Wrap(err error, msg string, field string, pairs ...any) error {
+ serr := New(msg, field+"-msg", err.Error())
+ for i := 0; i < len(pairs); i += 2 {
+ serr.Attrs[pairs[i].(string)] = pairs[i+1]
+ }
+ serr.Wrapped = err
+
+ var inner *SError
+ if ok := errors.As(err, &inner); ok {
+ attributes := make(map[string]any, len(inner.Attrs))
+ for key, val := range inner.Attrs {
+ attributes[key] = val
+ }
+ serr.Attrs[field+"-attrs"] = attributes
+ }
+
+ return serr
+}
+
+// Unwrap returns the inner error, if it exists.
+func (e *SError) Unwrap() error {
+ return e.Wrapped
+}
+
+// Attributes returns the attributes of a structured error, or nil/empty.
+func Attributes(err error) map[string]any {
+ var se *SError
+ if errors.As(err, &se) {
+ return se.Attrs
+ }
+ return nil
+}
diff --git a/data/basics/serr_test.go b/data/basics/serr_test.go
new file mode 100644
index 000000000..4df6e2048
--- /dev/null
+++ b/data/basics/serr_test.go
@@ -0,0 +1,135 @@
+// Copyright (C) 2019-2024 Algorand, Inc.
+// This file is part of go-algorand
+//
+// go-algorand is free software: you can redistribute it and/or modify
+// it under the terms of the GNU Affero General Public License as
+// published by the Free Software Foundation, either version 3 of the
+// License, or (at your option) any later version.
+//
+// go-algorand is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU Affero General Public License for more details.
+//
+// You should have received a copy of the GNU Affero General Public License
+// along with go-algorand. If not, see <https://www.gnu.org/licenses/>.
+
+package basics
+
+import (
+ "errors"
+ "fmt"
+ "testing"
+
+ "github.com/algorand/go-algorand/test/partitiontest"
+ "github.com/stretchr/testify/assert"
+)
+
+func TestNew(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ err := New("test")
+ assert.Equal(t, "test", err.Error())
+}
+
+func TestNewWithPairs(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ err := New("test", "a", 7, "b", []byte{3, 4})
+ assert.Equal(t, "test", err.Error())
+ assert.Equal(t, 7, err.Attrs["a"])
+ assert.Equal(t, []byte{3, 4}, err.Attrs["b"])
+
+ err.Msg = ""
+ assert.ErrorContains(t, err, `a=7`)
+ assert.ErrorContains(t, err, `b="\x03\x04"`)
+
+ err.Msg = "check it: %A"
+ assert.ErrorContains(t, err, ` a=7`)
+ assert.ErrorContains(t, err, ` b="\x03\x04"`)
+ assert.Equal(t, `check it: `, err.Error()[:10])
+
+}
+
+func TestAnnotate(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ err := New("test", "a", 7, "b", []byte{3, 4})
+ assert.Equal(t, 7, err.Attrs["a"])
+ assert.Equal(t, nil, err.Attrs["c"])
+ Annotate(err, "c", true, "a", false)
+ assert.Equal(t, true, err.Attrs["c"])
+ assert.Equal(t, false, err.Attrs["a"])
+}
+
+func attribute(err error, name string) any {
+ var serr *SError
+ if ok := errors.As(err, &serr); ok {
+ return serr.Attrs[name]
+ }
+ return nil
+}
+
+func TestAnnotateUnstructured(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ err := errors.New("hello")
+ err = Annotate(err, "c", true, "a", false)
+ assert.Equal(t, true, attribute(err, "c"))
+}
+
+func TestReannotateEmbedded(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ var err error
+ err = New("test", "a", 7, "b", []byte{3, 4})
+ err = fmt.Errorf("embed the above here %w", err)
+ assert.Equal(t, 7, attribute(err, "a"))
+ assert.Equal(t, nil, attribute(err, "c"))
+ Annotate(err, "c", true, "a", false)
+ assert.Equal(t, true, attribute(err, "c"))
+ assert.Equal(t, false, attribute(err, "a"))
+ // "b" is still visible. It would not be is we had _wrapped_ the fmt.Error
+ assert.Equal(t, []byte{3, 4}, attribute(err, "b"))
+}
+
+func TestWrapBare(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ var err error
+ err = errors.New("inner thingy")
+ err = Wrap(err, "outer stuff", "xxx")
+ assert.Equal(t, "inner thingy", attribute(err, "xxx-msg"))
+ assert.Equal(t, nil, attribute(err, "xxx-attrs"))
+}
+
+func TestWrapStructured(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ var err error
+ err = New("test", "a", 7, "b", []byte{3, 4})
+ err = Wrap(err, "outer stuff", "yyy")
+ assert.Equal(t, "test", attribute(err, "yyy-msg"))
+ assert.NotNil(t, attribute(err, "yyy-attrs"))
+
+ // these are deeper now, not here
+ assert.Equal(t, nil, attribute(err, "a"))
+ assert.Equal(t, nil, attribute(err, "b"))
+
+ // here they are
+ attrs := attribute(err, "yyy-attrs").(map[string]any)
+ assert.Equal(t, 7, attrs["a"])
+ assert.Equal(t, []byte{3, 4}, attrs["b"])
+
+ // deeper, with a new attribute
+ err = Wrap(err, "further out", "again", "name", "jj")
+ assert.Nil(t, attribute(err, "yyy-msg"))
+ assert.Equal(t, "outer stuff", attribute(err, "again-msg"))
+}
diff --git a/data/basics/sort.go b/data/basics/sort.go
index aa4986304..6e3614f38 100644
--- a/data/basics/sort.go
+++ b/data/basics/sort.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/stateProofParticipant.go b/data/basics/stateProofParticipant.go
index 63f7849f8..2fa560793 100644
--- a/data/basics/stateProofParticipant.go
+++ b/data/basics/stateProofParticipant.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/teal.go b/data/basics/teal.go
index 412de5902..f3156ae4b 100644
--- a/data/basics/teal.go
+++ b/data/basics/teal.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/teal_test.go b/data/basics/teal_test.go
index 6703faeec..f1f8e4e0b 100644
--- a/data/basics/teal_test.go
+++ b/data/basics/teal_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/testing/userBalance.go b/data/basics/testing/userBalance.go
index 13efdf5d5..dd0ebfde5 100644
--- a/data/basics/testing/userBalance.go
+++ b/data/basics/testing/userBalance.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/units.go b/data/basics/units.go
index c1b8f413b..af8743ee4 100644
--- a/data/basics/units.go
+++ b/data/basics/units.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/units_test.go b/data/basics/units_test.go
index c674270be..3d80b2332 100644
--- a/data/basics/units_test.go
+++ b/data/basics/units_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/userBalance.go b/data/basics/userBalance.go
index e87517f28..398147bb6 100644
--- a/data/basics/userBalance.go
+++ b/data/basics/userBalance.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/basics/userBalance_test.go b/data/basics/userBalance_test.go
index 912c75aed..da094329f 100644
--- a/data/basics/userBalance_test.go
+++ b/data/basics/userBalance_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/block.go b/data/bookkeeping/block.go
index 39842aa75..d67621b34 100644
--- a/data/bookkeeping/block.go
+++ b/data/bookkeeping/block.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/block_test.go b/data/bookkeeping/block_test.go
index a4cc3d638..73cce6d7d 100644
--- a/data/bookkeeping/block_test.go
+++ b/data/bookkeeping/block_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/encoding_test.go b/data/bookkeeping/encoding_test.go
index 95ccfbbca..69326437b 100644
--- a/data/bookkeeping/encoding_test.go
+++ b/data/bookkeeping/encoding_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/genesis.go b/data/bookkeeping/genesis.go
index a6e8eb6e5..8220d5232 100644
--- a/data/bookkeeping/genesis.go
+++ b/data/bookkeeping/genesis.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/genesis_test.go b/data/bookkeeping/genesis_test.go
index 393e38922..360e0a938 100644
--- a/data/bookkeeping/genesis_test.go
+++ b/data/bookkeeping/genesis_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/lightBlockHeader.go b/data/bookkeeping/lightBlockHeader.go
index 90edea3ba..e9b0a111a 100644
--- a/data/bookkeeping/lightBlockHeader.go
+++ b/data/bookkeeping/lightBlockHeader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/lightBlockHeader_test.go b/data/bookkeeping/lightBlockHeader_test.go
index 50d561c47..e61d03f6b 100644
--- a/data/bookkeeping/lightBlockHeader_test.go
+++ b/data/bookkeeping/lightBlockHeader_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/prettyprinting.go b/data/bookkeeping/prettyprinting.go
index 96c259a81..7721c1f47 100644
--- a/data/bookkeeping/prettyprinting.go
+++ b/data/bookkeeping/prettyprinting.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/txn_merkle.go b/data/bookkeeping/txn_merkle.go
index 7ab84d029..4aeec79f7 100644
--- a/data/bookkeeping/txn_merkle.go
+++ b/data/bookkeeping/txn_merkle.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/bookkeeping/txn_merkle_test.go b/data/bookkeeping/txn_merkle_test.go
index 22df9025a..57d7fbc39 100644
--- a/data/bookkeeping/txn_merkle_test.go
+++ b/data/bookkeeping/txn_merkle_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/committee/committee.go b/data/committee/committee.go
index 93703367e..1432e3202 100644
--- a/data/committee/committee.go
+++ b/data/committee/committee.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/committee/common_test.go b/data/committee/common_test.go
index 26a110a9c..1f7e7bd37 100644
--- a/data/committee/common_test.go
+++ b/data/committee/common_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/committee/credential.go b/data/committee/credential.go
index 6c6aac794..79b22abad 100644
--- a/data/committee/credential.go
+++ b/data/committee/credential.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/committee/credential_test.go b/data/committee/credential_test.go
index 22dfcff83..da2be625c 100644
--- a/data/committee/credential_test.go
+++ b/data/committee/credential_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/committee/encoding_test.go b/data/committee/encoding_test.go
index be1a5ad9e..1feaf1688 100644
--- a/data/committee/encoding_test.go
+++ b/data/committee/encoding_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/common_test.go b/data/common_test.go
index 0ba58ad8d..6079f4a22 100644
--- a/data/common_test.go
+++ b/data/common_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/datatest/fabricateLedger.go b/data/datatest/fabricateLedger.go
index 8bd1c3f25..9ad7bed4f 100644
--- a/data/datatest/fabricateLedger.go
+++ b/data/datatest/fabricateLedger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/datatest/impls.go b/data/datatest/impls.go
index fefcb054d..7c9462d40 100644
--- a/data/datatest/impls.go
+++ b/data/datatest/impls.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/hashable/message.go b/data/hashable/message.go
index bfa032633..fc8ae5e41 100644
--- a/data/hashable/message.go
+++ b/data/hashable/message.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/ledger.go b/data/ledger.go
index 141fae6cf..fa3b95837 100644
--- a/data/ledger.go
+++ b/data/ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/ledger_test.go b/data/ledger_test.go
index 452bdba15..caa866575 100644
--- a/data/ledger_test.go
+++ b/data/ledger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/pools/errors.go b/data/pools/errors.go
index 819678b2c..5ce1a056e 100644
--- a/data/pools/errors.go
+++ b/data/pools/errors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/pools/statusCache.go b/data/pools/statusCache.go
index 0b8d96741..c8977e3fc 100644
--- a/data/pools/statusCache.go
+++ b/data/pools/statusCache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -52,7 +52,7 @@ func (sc *statusCache) check(txid transactions.Txid) (tx transactions.SignedTxn,
func (sc *statusCache) put(tx transactions.SignedTxn, txErr string) {
if len(sc.cur) >= sc.sz {
sc.prev = sc.cur
- sc.cur = map[transactions.Txid]statusCacheEntry{}
+ sc.cur = make(map[transactions.Txid]statusCacheEntry, sc.sz)
}
sc.cur[tx.ID()] = statusCacheEntry{
@@ -62,6 +62,6 @@ func (sc *statusCache) put(tx transactions.SignedTxn, txErr string) {
}
func (sc *statusCache) reset() {
- sc.cur = map[transactions.Txid]statusCacheEntry{}
- sc.prev = map[transactions.Txid]statusCacheEntry{}
+ sc.cur = make(map[transactions.Txid]statusCacheEntry, sc.sz)
+ sc.prev = nil
}
diff --git a/data/pools/transactionPool.go b/data/pools/transactionPool.go
index 47deae4d3..2eb787eaf 100644
--- a/data/pools/transactionPool.go
+++ b/data/pools/transactionPool.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/pools/transactionPool_test.go b/data/pools/transactionPool_test.go
index f03eadf7d..4229b0510 100644
--- a/data/pools/transactionPool_test.go
+++ b/data/pools/transactionPool_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/stateproofmsg/message.go b/data/stateproofmsg/message.go
index 5f1c2e343..d87c5fc0e 100644
--- a/data/stateproofmsg/message.go
+++ b/data/stateproofmsg/message.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/application.go b/data/transactions/application.go
index db7037700..48a5788c0 100644
--- a/data/transactions/application.go
+++ b/data/transactions/application.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/application_test.go b/data/transactions/application_test.go
index a0a839b13..2b5965a88 100644
--- a/data/transactions/application_test.go
+++ b/data/transactions/application_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/asset.go b/data/transactions/asset.go
index c15ec3db9..9a7cd7ecf 100644
--- a/data/transactions/asset.go
+++ b/data/transactions/asset.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/common_test.go b/data/transactions/common_test.go
index 9ad00816a..388a1db5e 100644
--- a/data/transactions/common_test.go
+++ b/data/transactions/common_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/error.go b/data/transactions/error.go
index c81af7a77..3012946d4 100644
--- a/data/transactions/error.go
+++ b/data/transactions/error.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/json_test.go b/data/transactions/json_test.go
index 1e5474e54..13462b48d 100644
--- a/data/transactions/json_test.go
+++ b/data/transactions/json_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/keyreg.go b/data/transactions/keyreg.go
index 6e917ca11..b966f5c29 100644
--- a/data/transactions/keyreg.go
+++ b/data/transactions/keyreg.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/README.md b/data/transactions/logic/README.md
index a38ba1462..e1c5cfe21 100644
--- a/data/transactions/logic/README.md
+++ b/data/transactions/logic/README.md
@@ -52,9 +52,6 @@ assembly time to do type checking and to provide more informative error messages
| Name | Bound | AVM Type |
| ---- | ---- | -------- |
-| [32]byte | len(x) == 32 | []byte |
-| [64]byte | len(x) == 64 | []byte |
-| [80]byte | len(x) == 80 | []byte |
| []byte | len(x) <= 4096 | []byte |
| address | len(x) == 32 | []byte |
| any | | any |
diff --git a/data/transactions/logic/TEAL_opcodes_v1.md b/data/transactions/logic/TEAL_opcodes_v1.md
index d98190643..35bcca925 100644
--- a/data/transactions/logic/TEAL_opcodes_v1.md
+++ b/data/transactions/logic/TEAL_opcodes_v1.md
@@ -133,7 +133,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -182,7 +182,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -191,7 +191,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -222,7 +222,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -231,7 +231,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -262,7 +262,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -298,7 +298,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -336,7 +336,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -356,7 +356,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -365,21 +365,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
diff --git a/data/transactions/logic/TEAL_opcodes_v10.md b/data/transactions/logic/TEAL_opcodes_v10.md
index 81d742fbd..b90801521 100644
--- a/data/transactions/logic/TEAL_opcodes_v10.md
+++ b/data/transactions/logic/TEAL_opcodes_v10.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700; Secp256r1=2500
- Availability: v5
@@ -62,9 +62,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650; Secp256r1=2400
- Availability: v5
@@ -73,9 +73,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -175,7 +175,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -241,7 +241,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -250,7 +250,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -281,7 +281,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -290,7 +290,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -321,7 +321,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -357,7 +357,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -433,7 +433,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -466,7 +466,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -475,21 +475,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -512,7 +512,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -520,7 +520,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -530,7 +530,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -538,7 +538,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -549,7 +549,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -560,7 +560,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -595,7 +595,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -606,7 +606,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -616,7 +616,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -640,7 +640,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## bury
-- Syntax: `bury N` ∋ N: depth
+- Syntax: `bury N` where N: depth
- Bytecode: 0x45 {uint8}
- Stack: ..., A &rarr; ...
- replace the Nth value from the top of the stack with A. bury 0 fails.
@@ -648,7 +648,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## popn
-- Syntax: `popn N` ∋ N: stack depth
+- Syntax: `popn N` where N: stack depth
- Bytecode: 0x46 {uint8}
- Stack: ..., [N items] &rarr; ...
- remove N values from the top of the stack
@@ -656,7 +656,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dupn
-- Syntax: `dupn N` ∋ N: copy count
+- Syntax: `dupn N` where N: copy count
- Bytecode: 0x47 {uint8}
- Stack: ..., A &rarr; ..., A, [N copies of A]
- duplicate A, N times
@@ -683,7 +683,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -705,7 +705,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -713,7 +713,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -730,7 +730,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -777,7 +777,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -813,7 +813,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## replace2
-- Syntax: `replace2 S` ∋ S: start position
+- Syntax: `replace2 S` where S: start position
- Bytecode: 0x5c {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- Copy of A with the bytes starting at S replaced by the bytes of B. Fails if S+len(B) exceeds len(A)<br />`replace2` can be called using `replace` with 1 immediate.
@@ -828,7 +828,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## base64_decode
-- Syntax: `base64_decode E` ∋ E: [base64](#field-group-base64)
+- Syntax: `base64_decode E` where E: [base64](#field-group-base64)
- Bytecode: 0x5e {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- decode A which was base64-encoded using _encoding_ E. Fail if A is not base64 encoded with encoding E
@@ -851,7 +851,7 @@ Encodings
## json_ref
-- Syntax: `json_ref R` ∋ R: [json_ref](#field-group-json_ref)
+- Syntax: `json_ref R` where R: [json_ref](#field-group-json_ref)
- Bytecode: 0x5f {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., any
- key B's value, of type R, from a [valid](jsonspec.md) utf-8 encoded json object A
@@ -896,7 +896,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -906,7 +906,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -916,7 +916,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -926,7 +926,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -936,7 +936,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -946,7 +946,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -954,7 +954,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -966,7 +966,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -977,7 +977,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -998,7 +998,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -1029,7 +1029,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -1057,7 +1057,7 @@ params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag
## acct_params_get
-- Syntax: `acct_params_get F` ∋ F: [acct_params](#field-group-acct_params)
+- Syntax: `acct_params_get F` where F: [acct_params](#field-group-acct_params)
- Bytecode: 0x73 {uint8}
- Stack: ..., A &rarr; ..., X: any, Y: bool
- X is field F from account A. Y is 1 if A owns positive algos, else 0
@@ -1096,7 +1096,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -1106,7 +1106,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -1116,7 +1116,7 @@ pushint args are not added to the intcblock during assembly processes
## pushbytess
-- Syntax: `pushbytess BYTES ...` ∋ BYTES ...: a list of byte constants
+- Syntax: `pushbytess BYTES ...` where BYTES ...: a list of byte constants
- Bytecode: 0x82 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ..., [N items]
- push sequences of immediate byte arrays to stack (first byte array being deepest)
@@ -1126,7 +1126,7 @@ pushbytess args are not added to the bytecblock during assembly processes
## pushints
-- Syntax: `pushints UINT ...` ∋ UINT ...: a list of int constants
+- Syntax: `pushints UINT ...` where UINT ...: a list of int constants
- Bytecode: 0x83 {varuint count, [varuint ...]}
- Stack: ... &rarr; ..., [N items]
- push sequence of immediate uints to stack in the order they appear (first uint being deepest)
@@ -1144,7 +1144,7 @@ pushints args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1163,7 +1163,7 @@ If the current frame was prepared by `proto A R`, `retsub` will remove the 'A' a
## proto
-- Syntax: `proto A R` ∋ A: number of arguments, R: number of return values
+- Syntax: `proto A R` where A: number of arguments, R: number of return values
- Bytecode: 0x8a {uint8}, {uint8}
- Stack: ... &rarr; ...
- Prepare top call frame for a retsub that will assume A args and R return values.
@@ -1173,7 +1173,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_dig
-- Syntax: `frame_dig I` ∋ I: frame slot
+- Syntax: `frame_dig I` where I: frame slot
- Bytecode: 0x8b {int8}
- Stack: ... &rarr; ..., any
- Nth (signed) value from the frame pointer.
@@ -1181,7 +1181,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_bury
-- Syntax: `frame_bury I` ∋ I: frame slot
+- Syntax: `frame_bury I` where I: frame slot
- Bytecode: 0x8c {int8}
- Stack: ..., A &rarr; ...
- replace the Nth (signed) value from the frame pointer in the stack with A
@@ -1189,7 +1189,7 @@ Fails unless the last instruction executed was a `callsub`.
## switch
-- Syntax: `switch TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `switch TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8d {varuint count, [int16 (big-endian) ...]}
- Stack: ..., A: uint64 &rarr; ...
- branch to the Ath label. Continue at following instruction if index A exceeds the number of labels.
@@ -1197,7 +1197,7 @@ Fails unless the last instruction executed was a `callsub`.
## match
-- Syntax: `match TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `match TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8e {varuint count, [int16 (big-endian) ...]}
- Stack: ..., [A1, A2, ..., AN], B &rarr; ...
- given match cases from A[1] to A[N], branch to the Ith label where A[I] = B. Continue to the following instruction if no matches are found.
@@ -1254,7 +1254,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## bsqrt
- Bytecode: 0x96
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint &rarr; ..., bigint
- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers
- **Cost**: 40
- Availability: v6
@@ -1271,7 +1271,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## sha3_256
- Bytecode: 0x98
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: []byte &rarr; ..., [32]byte
- SHA3_256 hash of value A, yields [32]byte
- **Cost**: 130
- Availability: v7
@@ -1353,7 +1353,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1419,7 +1419,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1440,7 +1440,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1449,7 +1449,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1468,7 +1468,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxn
-- Syntax: `gitxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gitxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0xb7 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the last inner group submitted
@@ -1477,7 +1477,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxna
-- Syntax: `gitxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gitxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0xb8 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the last inner group submitted
@@ -1548,7 +1548,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1556,7 +1556,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1564,7 +1564,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
@@ -1588,7 +1588,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## itxnas
-- Syntax: `itxnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `itxnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc5 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the last inner transaction
@@ -1597,7 +1597,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gitxnas
-- Syntax: `gitxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gitxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc6 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the last inner group submitted
@@ -1606,9 +1606,9 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## vrf_verify
-- Syntax: `vrf_verify S` ∋ S: [vrf_verify](#field-group-vrf_verify)
+- Syntax: `vrf_verify S` where S: [vrf_verify](#field-group-vrf_verify)
- Bytecode: 0xd0 {uint8}
-- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: []byte, Y: bool
+- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: [64]byte, Y: bool
- Verify the proof B of message A against pubkey C. Returns vrf output and verification flag.
- **Cost**: 5700
- Availability: v7
@@ -1626,7 +1626,7 @@ Standards
## block
-- Syntax: `block F` ∋ F: [block](#field-group-block)
+- Syntax: `block F` where F: [block](#field-group-block)
- Bytecode: 0xd1 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of block A. Fail unless A falls between txn.LastValid-1002 and txn.FirstValid (exclusive)
@@ -1662,7 +1662,7 @@ Boxes are of constant length. If C < len(D), then len(D)-C bytes will be removed
## ec_add
-- Syntax: `ec_add G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_add G` where G: [EC](#field-group-ec)
- Bytecode: 0xe0 {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- for curve points A and B, return the curve point A + B
@@ -1694,7 +1694,7 @@ Does _not_ check if A and B are in the main prime-order subgroup.
## ec_scalar_mul
-- Syntax: `ec_scalar_mul G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_scalar_mul G` where G: [EC](#field-group-ec)
- Bytecode: 0xe1 {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- for curve point A and scalar B, return the curve point BA, the point A multiplied by the scalar B.
@@ -1705,7 +1705,7 @@ A is a curve point encoded and checked as described in `ec_add`. Scalar B is int
## ec_pairing_check
-- Syntax: `ec_pairing_check G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_pairing_check G` where G: [EC](#field-group-ec)
- Bytecode: 0xe2 {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., bool
- 1 if the product of the pairing of each point in A with its respective point in B is equal to the identity element of the target group Gt, else 0
@@ -1716,7 +1716,7 @@ A and B are concatenated points, encoded and checked as described in `ec_add`. A
## ec_multi_scalar_mul
-- Syntax: `ec_multi_scalar_mul G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_multi_scalar_mul G` where G: [EC](#field-group-ec)
- Bytecode: 0xe3 {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- for curve points A and scalars B, return curve point B0A0 + B1A1 + B2A2 + ... + BnAn
@@ -1728,7 +1728,7 @@ The name `ec_multi_scalar_mul` was chosen to reflect common usage, but a more co
## ec_subgroup_check
-- Syntax: `ec_subgroup_check G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_subgroup_check G` where G: [EC](#field-group-ec)
- Bytecode: 0xe4 {uint8}
- Stack: ..., A: []byte &rarr; ..., bool
- 1 if A is in the main prime-order subgroup of G (including the point at infinity) else 0. Program fails if A is not in G at all.
@@ -1737,7 +1737,7 @@ The name `ec_multi_scalar_mul` was chosen to reflect common usage, but a more co
## ec_map_to
-- Syntax: `ec_map_to G` ∋ G: [EC](#field-group-ec)
+- Syntax: `ec_map_to G` where G: [EC](#field-group-ec)
- Bytecode: 0xe5 {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- maps field element A to group G
diff --git a/data/transactions/logic/TEAL_opcodes_v2.md b/data/transactions/logic/TEAL_opcodes_v2.md
index 180f899be..84d21cb74 100644
--- a/data/transactions/logic/TEAL_opcodes_v2.md
+++ b/data/transactions/logic/TEAL_opcodes_v2.md
@@ -133,7 +133,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -189,7 +189,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -198,7 +198,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -229,7 +229,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -238,7 +238,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -269,7 +269,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -305,7 +305,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -365,7 +365,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -389,7 +389,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -398,21 +398,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -430,7 +430,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -438,7 +438,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -449,7 +449,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -459,7 +459,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -504,7 +504,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -540,7 +540,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A: uint64, B: []byte &rarr; ..., any
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -550,7 +550,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A: uint64, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -560,7 +560,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -570,7 +570,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -580,7 +580,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A: uint64, B: []byte, C &rarr; ...
+- Stack: ..., A: uint64, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -590,7 +590,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -598,7 +598,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A: uint64, B: []byte &rarr; ...
+- Stack: ..., A: uint64, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -610,7 +610,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -621,7 +621,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -642,7 +642,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
diff --git a/data/transactions/logic/TEAL_opcodes_v3.md b/data/transactions/logic/TEAL_opcodes_v3.md
index 9915f6102..b9b21b141 100644
--- a/data/transactions/logic/TEAL_opcodes_v3.md
+++ b/data/transactions/logic/TEAL_opcodes_v3.md
@@ -133,7 +133,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -189,7 +189,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -198,7 +198,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -229,7 +229,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -238,7 +238,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -269,7 +269,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -305,7 +305,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -371,7 +371,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -396,7 +396,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -405,21 +405,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -439,7 +439,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -447,7 +447,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -457,7 +457,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -465,7 +465,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -476,7 +476,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -486,7 +486,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -529,7 +529,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -560,7 +560,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -628,7 +628,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A: uint64, B: []byte &rarr; ..., any
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -638,7 +638,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A: uint64, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -648,7 +648,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -658,7 +658,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -668,7 +668,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A: uint64, B: []byte, C &rarr; ...
+- Stack: ..., A: uint64, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -678,7 +678,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -686,7 +686,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A: uint64, B: []byte &rarr; ...
+- Stack: ..., A: uint64, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -698,7 +698,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -709,7 +709,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -730,7 +730,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -770,7 +770,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -780,7 +780,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
diff --git a/data/transactions/logic/TEAL_opcodes_v4.md b/data/transactions/logic/TEAL_opcodes_v4.md
index 3da0bcba0..2fb554bed 100644
--- a/data/transactions/logic/TEAL_opcodes_v4.md
+++ b/data/transactions/logic/TEAL_opcodes_v4.md
@@ -133,7 +133,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -199,7 +199,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -208,7 +208,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -239,7 +239,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -248,7 +248,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -279,7 +279,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -315,7 +315,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -382,7 +382,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -407,7 +407,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -416,21 +416,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -450,7 +450,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -458,7 +458,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -468,7 +468,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -476,7 +476,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -487,7 +487,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -498,7 +498,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -519,7 +519,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -530,7 +530,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -540,7 +540,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -583,7 +583,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -614,7 +614,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -682,7 +682,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -692,7 +692,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -702,7 +702,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -712,7 +712,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -722,7 +722,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -732,7 +732,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -740,7 +740,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -752,7 +752,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -763,7 +763,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -784,7 +784,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -824,7 +824,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -834,7 +834,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -844,7 +844,7 @@ pushint args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -984,7 +984,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
diff --git a/data/transactions/logic/TEAL_opcodes_v5.md b/data/transactions/logic/TEAL_opcodes_v5.md
index 584e8bc1f..92f52f59a 100644
--- a/data/transactions/logic/TEAL_opcodes_v5.md
+++ b/data/transactions/logic/TEAL_opcodes_v5.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700
- Availability: v5
@@ -61,9 +61,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650
- Availability: v5
@@ -72,9 +72,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -174,7 +174,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -240,7 +240,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -249,7 +249,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -280,7 +280,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -289,7 +289,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -320,7 +320,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -356,7 +356,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -427,7 +427,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -454,7 +454,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -463,21 +463,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -498,7 +498,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -506,7 +506,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -516,7 +516,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -524,7 +524,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -535,7 +535,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -546,7 +546,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -581,7 +581,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -592,7 +592,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -602,7 +602,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -645,7 +645,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -667,7 +667,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -675,7 +675,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -692,7 +692,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -739,7 +739,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -796,7 +796,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -806,7 +806,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -816,7 +816,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -826,7 +826,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -836,7 +836,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -846,7 +846,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -854,7 +854,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -866,7 +866,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -877,7 +877,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -898,7 +898,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -929,7 +929,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -967,7 +967,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -977,7 +977,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -987,7 +987,7 @@ pushint args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1127,7 +1127,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1193,7 +1193,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1214,7 +1214,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1223,7 +1223,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1232,7 +1232,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1240,7 +1240,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1248,7 +1248,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
diff --git a/data/transactions/logic/TEAL_opcodes_v6.md b/data/transactions/logic/TEAL_opcodes_v6.md
index eab29a84c..bacca46d4 100644
--- a/data/transactions/logic/TEAL_opcodes_v6.md
+++ b/data/transactions/logic/TEAL_opcodes_v6.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700
- Availability: v5
@@ -61,9 +61,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650
- Availability: v5
@@ -72,9 +72,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -174,7 +174,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -240,7 +240,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -249,7 +249,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -280,7 +280,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -289,7 +289,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -320,7 +320,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -356,7 +356,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -429,7 +429,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -459,7 +459,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -468,21 +468,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -503,7 +503,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -511,7 +511,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -521,7 +521,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -529,7 +529,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -540,7 +540,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -551,7 +551,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -586,7 +586,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -597,7 +597,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -607,7 +607,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -650,7 +650,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -672,7 +672,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -680,7 +680,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -697,7 +697,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -744,7 +744,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -801,7 +801,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -811,7 +811,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -821,7 +821,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -831,7 +831,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -841,7 +841,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -851,7 +851,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -859,7 +859,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -871,7 +871,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -882,7 +882,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -903,7 +903,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -934,7 +934,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -962,7 +962,7 @@ params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag
## acct_params_get
-- Syntax: `acct_params_get F` ∋ F: [acct_params](#field-group-acct_params)
+- Syntax: `acct_params_get F` where F: [acct_params](#field-group-acct_params)
- Bytecode: 0x73 {uint8}
- Stack: ..., A &rarr; ..., X: any, Y: bool
- X is field F from account A. Y is 1 if A owns positive algos, else 0
@@ -992,7 +992,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -1002,7 +1002,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -1012,7 +1012,7 @@ pushint args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1078,7 +1078,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## bsqrt
- Bytecode: 0x96
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint &rarr; ..., bigint
- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers
- **Cost**: 40
- Availability: v6
@@ -1169,7 +1169,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1235,7 +1235,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1256,7 +1256,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1265,7 +1265,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1284,7 +1284,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxn
-- Syntax: `gitxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gitxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0xb7 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the last inner group submitted
@@ -1293,7 +1293,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxna
-- Syntax: `gitxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gitxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0xb8 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the last inner group submitted
@@ -1302,7 +1302,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1310,7 +1310,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1318,7 +1318,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
@@ -1342,7 +1342,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxnas
-- Syntax: `itxnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `itxnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc5 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the last inner transaction
@@ -1351,7 +1351,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxnas
-- Syntax: `gitxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gitxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc6 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the last inner group submitted
diff --git a/data/transactions/logic/TEAL_opcodes_v7.md b/data/transactions/logic/TEAL_opcodes_v7.md
index 5eb79e38f..3a0c678b0 100644
--- a/data/transactions/logic/TEAL_opcodes_v7.md
+++ b/data/transactions/logic/TEAL_opcodes_v7.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700; Secp256r1=2500
- Availability: v5
@@ -62,9 +62,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650; Secp256r1=2400
- Availability: v5
@@ -73,9 +73,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -175,7 +175,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -241,7 +241,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -250,7 +250,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -281,7 +281,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -290,7 +290,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -321,7 +321,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -357,7 +357,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -433,7 +433,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -463,7 +463,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -472,21 +472,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -509,7 +509,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -517,7 +517,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -527,7 +527,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -535,7 +535,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -546,7 +546,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -557,7 +557,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -592,7 +592,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -603,7 +603,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -613,7 +613,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -656,7 +656,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -678,7 +678,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -686,7 +686,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -703,7 +703,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -750,7 +750,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -786,7 +786,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## replace2
-- Syntax: `replace2 S` ∋ S: start position
+- Syntax: `replace2 S` where S: start position
- Bytecode: 0x5c {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- Copy of A with the bytes starting at S replaced by the bytes of B. Fails if S+len(B) exceeds len(A)<br />`replace2` can be called using `replace` with 1 immediate.
@@ -801,7 +801,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## base64_decode
-- Syntax: `base64_decode E` ∋ E: [base64](#field-group-base64)
+- Syntax: `base64_decode E` where E: [base64](#field-group-base64)
- Bytecode: 0x5e {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- decode A which was base64-encoded using _encoding_ E. Fail if A is not base64 encoded with encoding E
@@ -824,7 +824,7 @@ Encodings
## json_ref
-- Syntax: `json_ref R` ∋ R: [json_ref](#field-group-json_ref)
+- Syntax: `json_ref R` where R: [json_ref](#field-group-json_ref)
- Bytecode: 0x5f {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., any
- key B's value, of type R, from a [valid](jsonspec.md) utf-8 encoded json object A
@@ -869,7 +869,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -879,7 +879,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -889,7 +889,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -899,7 +899,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -909,7 +909,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -919,7 +919,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -927,7 +927,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -939,7 +939,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -950,7 +950,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -971,7 +971,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -1002,7 +1002,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -1030,7 +1030,7 @@ params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag
## acct_params_get
-- Syntax: `acct_params_get F` ∋ F: [acct_params](#field-group-acct_params)
+- Syntax: `acct_params_get F` where F: [acct_params](#field-group-acct_params)
- Bytecode: 0x73 {uint8}
- Stack: ..., A &rarr; ..., X: any, Y: bool
- X is field F from account A. Y is 1 if A owns positive algos, else 0
@@ -1060,7 +1060,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -1070,7 +1070,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -1088,7 +1088,7 @@ pushint args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1154,7 +1154,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## bsqrt
- Bytecode: 0x96
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint &rarr; ..., bigint
- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers
- **Cost**: 40
- Availability: v6
@@ -1171,7 +1171,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## sha3_256
- Bytecode: 0x98
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: []byte &rarr; ..., [32]byte
- SHA3_256 hash of value A, yields [32]byte
- **Cost**: 130
- Availability: v7
@@ -1253,7 +1253,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1319,7 +1319,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1340,7 +1340,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1349,7 +1349,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1368,7 +1368,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxn
-- Syntax: `gitxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gitxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0xb7 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the last inner group submitted
@@ -1377,7 +1377,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxna
-- Syntax: `gitxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gitxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0xb8 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the last inner group submitted
@@ -1386,7 +1386,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1394,7 +1394,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1402,7 +1402,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
@@ -1426,7 +1426,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxnas
-- Syntax: `itxnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `itxnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc5 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the last inner transaction
@@ -1435,7 +1435,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxnas
-- Syntax: `gitxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gitxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc6 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the last inner group submitted
@@ -1444,9 +1444,9 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## vrf_verify
-- Syntax: `vrf_verify S` ∋ S: [vrf_verify](#field-group-vrf_verify)
+- Syntax: `vrf_verify S` where S: [vrf_verify](#field-group-vrf_verify)
- Bytecode: 0xd0 {uint8}
-- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: []byte, Y: bool
+- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: [64]byte, Y: bool
- Verify the proof B of message A against pubkey C. Returns vrf output and verification flag.
- **Cost**: 5700
- Availability: v7
@@ -1464,7 +1464,7 @@ Standards
## block
-- Syntax: `block F` ∋ F: [block](#field-group-block)
+- Syntax: `block F` where F: [block](#field-group-block)
- Bytecode: 0xd1 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of block A. Fail unless A falls between txn.LastValid-1002 and txn.FirstValid (exclusive)
diff --git a/data/transactions/logic/TEAL_opcodes_v8.md b/data/transactions/logic/TEAL_opcodes_v8.md
index 71d756a1d..f06e087e5 100644
--- a/data/transactions/logic/TEAL_opcodes_v8.md
+++ b/data/transactions/logic/TEAL_opcodes_v8.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700; Secp256r1=2500
- Availability: v5
@@ -62,9 +62,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650; Secp256r1=2400
- Availability: v5
@@ -73,9 +73,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -175,7 +175,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -241,7 +241,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -250,7 +250,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -281,7 +281,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -290,7 +290,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -321,7 +321,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -357,7 +357,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -433,7 +433,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -463,7 +463,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -472,21 +472,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -509,7 +509,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -517,7 +517,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -527,7 +527,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -535,7 +535,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -546,7 +546,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -557,7 +557,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -592,7 +592,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -603,7 +603,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -613,7 +613,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -637,7 +637,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## bury
-- Syntax: `bury N` ∋ N: depth
+- Syntax: `bury N` where N: depth
- Bytecode: 0x45 {uint8}
- Stack: ..., A &rarr; ...
- replace the Nth value from the top of the stack with A. bury 0 fails.
@@ -645,7 +645,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## popn
-- Syntax: `popn N` ∋ N: stack depth
+- Syntax: `popn N` where N: stack depth
- Bytecode: 0x46 {uint8}
- Stack: ..., [N items] &rarr; ...
- remove N values from the top of the stack
@@ -653,7 +653,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dupn
-- Syntax: `dupn N` ∋ N: copy count
+- Syntax: `dupn N` where N: copy count
- Bytecode: 0x47 {uint8}
- Stack: ..., A &rarr; ..., A, [N copies of A]
- duplicate A, N times
@@ -680,7 +680,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -702,7 +702,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -710,7 +710,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -727,7 +727,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -774,7 +774,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -810,7 +810,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## replace2
-- Syntax: `replace2 S` ∋ S: start position
+- Syntax: `replace2 S` where S: start position
- Bytecode: 0x5c {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- Copy of A with the bytes starting at S replaced by the bytes of B. Fails if S+len(B) exceeds len(A)<br />`replace2` can be called using `replace` with 1 immediate.
@@ -825,7 +825,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## base64_decode
-- Syntax: `base64_decode E` ∋ E: [base64](#field-group-base64)
+- Syntax: `base64_decode E` where E: [base64](#field-group-base64)
- Bytecode: 0x5e {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- decode A which was base64-encoded using _encoding_ E. Fail if A is not base64 encoded with encoding E
@@ -848,7 +848,7 @@ Encodings
## json_ref
-- Syntax: `json_ref R` ∋ R: [json_ref](#field-group-json_ref)
+- Syntax: `json_ref R` where R: [json_ref](#field-group-json_ref)
- Bytecode: 0x5f {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., any
- key B's value, of type R, from a [valid](jsonspec.md) utf-8 encoded json object A
@@ -893,7 +893,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -903,7 +903,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -913,7 +913,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -923,7 +923,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -933,7 +933,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -943,7 +943,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -951,7 +951,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -963,7 +963,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -974,7 +974,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -995,7 +995,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -1026,7 +1026,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -1054,7 +1054,7 @@ params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag
## acct_params_get
-- Syntax: `acct_params_get F` ∋ F: [acct_params](#field-group-acct_params)
+- Syntax: `acct_params_get F` where F: [acct_params](#field-group-acct_params)
- Bytecode: 0x73 {uint8}
- Stack: ..., A &rarr; ..., X: any, Y: bool
- X is field F from account A. Y is 1 if A owns positive algos, else 0
@@ -1093,7 +1093,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -1103,7 +1103,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -1113,7 +1113,7 @@ pushint args are not added to the intcblock during assembly processes
## pushbytess
-- Syntax: `pushbytess BYTES ...` ∋ BYTES ...: a list of byte constants
+- Syntax: `pushbytess BYTES ...` where BYTES ...: a list of byte constants
- Bytecode: 0x82 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ..., [N items]
- push sequences of immediate byte arrays to stack (first byte array being deepest)
@@ -1123,7 +1123,7 @@ pushbytess args are not added to the bytecblock during assembly processes
## pushints
-- Syntax: `pushints UINT ...` ∋ UINT ...: a list of int constants
+- Syntax: `pushints UINT ...` where UINT ...: a list of int constants
- Bytecode: 0x83 {varuint count, [varuint ...]}
- Stack: ... &rarr; ..., [N items]
- push sequence of immediate uints to stack in the order they appear (first uint being deepest)
@@ -1141,7 +1141,7 @@ pushints args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1160,7 +1160,7 @@ If the current frame was prepared by `proto A R`, `retsub` will remove the 'A' a
## proto
-- Syntax: `proto A R` ∋ A: number of arguments, R: number of return values
+- Syntax: `proto A R` where A: number of arguments, R: number of return values
- Bytecode: 0x8a {uint8}, {uint8}
- Stack: ... &rarr; ...
- Prepare top call frame for a retsub that will assume A args and R return values.
@@ -1170,7 +1170,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_dig
-- Syntax: `frame_dig I` ∋ I: frame slot
+- Syntax: `frame_dig I` where I: frame slot
- Bytecode: 0x8b {int8}
- Stack: ... &rarr; ..., any
- Nth (signed) value from the frame pointer.
@@ -1178,7 +1178,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_bury
-- Syntax: `frame_bury I` ∋ I: frame slot
+- Syntax: `frame_bury I` where I: frame slot
- Bytecode: 0x8c {int8}
- Stack: ..., A &rarr; ...
- replace the Nth (signed) value from the frame pointer in the stack with A
@@ -1186,7 +1186,7 @@ Fails unless the last instruction executed was a `callsub`.
## switch
-- Syntax: `switch TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `switch TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8d {varuint count, [int16 (big-endian) ...]}
- Stack: ..., A: uint64 &rarr; ...
- branch to the Ath label. Continue at following instruction if index A exceeds the number of labels.
@@ -1194,7 +1194,7 @@ Fails unless the last instruction executed was a `callsub`.
## match
-- Syntax: `match TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `match TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8e {varuint count, [int16 (big-endian) ...]}
- Stack: ..., [A1, A2, ..., AN], B &rarr; ...
- given match cases from A[1] to A[N], branch to the Ith label where A[I] = B. Continue to the following instruction if no matches are found.
@@ -1251,7 +1251,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## bsqrt
- Bytecode: 0x96
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint &rarr; ..., bigint
- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers
- **Cost**: 40
- Availability: v6
@@ -1268,7 +1268,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## sha3_256
- Bytecode: 0x98
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: []byte &rarr; ..., [32]byte
- SHA3_256 hash of value A, yields [32]byte
- **Cost**: 130
- Availability: v7
@@ -1350,7 +1350,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1416,7 +1416,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1437,7 +1437,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1446,7 +1446,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1465,7 +1465,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxn
-- Syntax: `gitxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gitxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0xb7 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the last inner group submitted
@@ -1474,7 +1474,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxna
-- Syntax: `gitxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gitxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0xb8 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the last inner group submitted
@@ -1545,7 +1545,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1553,7 +1553,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1561,7 +1561,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
@@ -1585,7 +1585,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## itxnas
-- Syntax: `itxnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `itxnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc5 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the last inner transaction
@@ -1594,7 +1594,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gitxnas
-- Syntax: `gitxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gitxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc6 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the last inner group submitted
@@ -1603,9 +1603,9 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## vrf_verify
-- Syntax: `vrf_verify S` ∋ S: [vrf_verify](#field-group-vrf_verify)
+- Syntax: `vrf_verify S` where S: [vrf_verify](#field-group-vrf_verify)
- Bytecode: 0xd0 {uint8}
-- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: []byte, Y: bool
+- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: [64]byte, Y: bool
- Verify the proof B of message A against pubkey C. Returns vrf output and verification flag.
- **Cost**: 5700
- Availability: v7
@@ -1623,7 +1623,7 @@ Standards
## block
-- Syntax: `block F` ∋ F: [block](#field-group-block)
+- Syntax: `block F` where F: [block](#field-group-block)
- Bytecode: 0xd1 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of block A. Fail unless A falls between txn.LastValid-1002 and txn.FirstValid (exclusive)
diff --git a/data/transactions/logic/TEAL_opcodes_v9.md b/data/transactions/logic/TEAL_opcodes_v9.md
index f2ff33059..e14f4d7d7 100644
--- a/data/transactions/logic/TEAL_opcodes_v9.md
+++ b/data/transactions/logic/TEAL_opcodes_v9.md
@@ -41,9 +41,9 @@ The 32 byte public key is the last element on the stack, preceded by the 64 byte
## ecdsa_verify
-- Syntax: `ecdsa_verify V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_verify V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x05 {uint8}
-- Stack: ..., A: [32]byte, B: []byte, C: []byte, D: []byte, E: []byte &rarr; ..., bool
+- Stack: ..., A: [32]byte, B: [32]byte, C: [32]byte, D: [32]byte, E: [32]byte &rarr; ..., bool
- for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}
- **Cost**: Secp256k1=1700; Secp256r1=2500
- Availability: v5
@@ -62,9 +62,9 @@ The 32 byte Y-component of a public key is the last element on the stack, preced
## ecdsa_pk_decompress
-- Syntax: `ecdsa_pk_decompress V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_decompress V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x06 {uint8}
-- Stack: ..., A: []byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [33]byte &rarr; ..., X: [32]byte, Y: [32]byte
- decompress pubkey A into components X, Y
- **Cost**: Secp256k1=650; Secp256r1=2400
- Availability: v5
@@ -73,9 +73,9 @@ The 33 byte public key in a compressed form to be decompressed into X and Y (top
## ecdsa_pk_recover
-- Syntax: `ecdsa_pk_recover V` ∋ V: [ECDSA](#field-group-ecdsa)
+- Syntax: `ecdsa_pk_recover V` where V: [ECDSA](#field-group-ecdsa)
- Bytecode: 0x07 {uint8}
-- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: []byte, Y: []byte
+- Stack: ..., A: [32]byte, B: uint64, C: [32]byte, D: [32]byte &rarr; ..., X: [32]byte, Y: [32]byte
- for (data A, recovery id B, signature C, D) recover a public key
- **Cost**: 2000
- Availability: v5
@@ -175,7 +175,7 @@ Overflow is an error condition which halts execution and fails the transaction.
## itob
- Bytecode: 0x16
-- Stack: ..., A: uint64 &rarr; ..., []byte
+- Stack: ..., A: uint64 &rarr; ..., [8]byte
- converts uint64 A to big-endian byte array, always of length 8
## btoi
@@ -241,7 +241,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intcblock
-- Syntax: `intcblock UINT ...` ∋ UINT ...: a block of int constant values
+- Syntax: `intcblock UINT ...` where UINT ...: a block of int constant values
- Bytecode: 0x20 {varuint count, [varuint ...]}
- Stack: ... &rarr; ...
- prepare block of uint64 constants for use by intc
@@ -250,7 +250,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## intc
-- Syntax: `intc I` ∋ I: an index in the intcblock
+- Syntax: `intc I` where I: an index in the intcblock
- Bytecode: 0x21 {uint8}
- Stack: ... &rarr; ..., uint64
- Ith constant from intcblock
@@ -281,7 +281,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytecblock
-- Syntax: `bytecblock BYTES ...` ∋ BYTES ...: a block of byte constant values
+- Syntax: `bytecblock BYTES ...` where BYTES ...: a block of byte constant values
- Bytecode: 0x26 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ...
- prepare block of byte-array constants for use by bytec
@@ -290,7 +290,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## bytec
-- Syntax: `bytec I` ∋ I: an index in the bytecblock
+- Syntax: `bytec I` where I: an index in the bytecblock
- Bytecode: 0x27 {uint8}
- Stack: ... &rarr; ..., []byte
- Ith constant from bytecblock
@@ -321,7 +321,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## arg
-- Syntax: `arg N` ∋ N: an arg index
+- Syntax: `arg N` where N: an arg index
- Bytecode: 0x2c {uint8}
- Stack: ... &rarr; ..., []byte
- Nth LogicSig argument
@@ -357,7 +357,7 @@ The notation J,K indicates that two uint64 values J and K are interpreted as a u
## txn
-- Syntax: `txn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `txn F` where F: [txn](#field-group-txn)
- Bytecode: 0x31 {uint8}
- Stack: ... &rarr; ..., any
- field F of current transaction
@@ -433,7 +433,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## global
-- Syntax: `global F` ∋ F: [global](#field-group-global)
+- Syntax: `global F` where F: [global](#field-group-global)
- Bytecode: 0x32 {uint8}
- Stack: ... &rarr; ..., any
- global field F
@@ -463,7 +463,7 @@ Fields
## gtxn
-- Syntax: `gtxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gtxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0x33 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the current group
@@ -472,21 +472,21 @@ for notes on transaction fields available, see `txn`. If this transaction is _i_
## load
-- Syntax: `load I` ∋ I: position in scratch space to load from
+- Syntax: `load I` where I: position in scratch space to load from
- Bytecode: 0x34 {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value. All scratch spaces are 0 at program start.
## store
-- Syntax: `store I` ∋ I: position in scratch space to store to
+- Syntax: `store I` where I: position in scratch space to store to
- Bytecode: 0x35 {uint8}
- Stack: ..., A &rarr; ...
- store A to the Ith scratch space
## txna
-- Syntax: `txna F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `txna F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x36 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the current transaction<br />`txna` can be called using `txn` with 2 immediates.
@@ -509,7 +509,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxna
-- Syntax: `gtxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x37 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the current group<br />`gtxna` can be called using `gtxn` with 3 immediates.
@@ -517,7 +517,7 @@ Fields (see [transaction reference](https://developer.algorand.org/docs/referenc
## gtxns
-- Syntax: `gtxns F` ∋ F: [txn](#field-group-txn)
+- Syntax: `gtxns F` where F: [txn](#field-group-txn)
- Bytecode: 0x38 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of the Ath transaction in the current group
@@ -527,7 +527,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gtxnsa
-- Syntax: `gtxnsa F I` ∋ F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gtxnsa F I` where F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0x39 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith value of the array field F from the Ath transaction in the current group<br />`gtxnsa` can be called using `gtxns` with 2 immediates.
@@ -535,7 +535,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gload
-- Syntax: `gload T I` ∋ T: transaction group index, I: position in scratch space to load from
+- Syntax: `gload T I` where T: transaction group index, I: position in scratch space to load from
- Bytecode: 0x3a {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith scratch space value of the Tth transaction in the current group
@@ -546,7 +546,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gloads
-- Syntax: `gloads I` ∋ I: position in scratch space to load from
+- Syntax: `gloads I` where I: position in scratch space to load from
- Bytecode: 0x3b {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ith scratch space value of the Ath transaction in the current group
@@ -557,7 +557,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## gaid
-- Syntax: `gaid T` ∋ T: transaction group index
+- Syntax: `gaid T` where T: transaction group index
- Bytecode: 0x3c {uint8}
- Stack: ... &rarr; ..., uint64
- ID of the asset or application created in the Tth transaction of the current group
@@ -592,7 +592,7 @@ for notes on transaction fields available, see `txn`. If top of stack is _i_, `g
## bnz
-- Syntax: `bnz TARGET` ∋ TARGET: branch offset
+- Syntax: `bnz TARGET` where TARGET: branch offset
- Bytecode: 0x40 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is not zero
@@ -603,7 +603,7 @@ At v2 it became allowed to branch to the end of the program exactly after the la
## bz
-- Syntax: `bz TARGET` ∋ TARGET: branch offset
+- Syntax: `bz TARGET` where TARGET: branch offset
- Bytecode: 0x41 {int16 (big-endian)}
- Stack: ..., A: uint64 &rarr; ...
- branch to TARGET if value A is zero
@@ -613,7 +613,7 @@ See `bnz` for details on how branches work. `bz` inverts the behavior of `bnz`.
## b
-- Syntax: `b TARGET` ∋ TARGET: branch offset
+- Syntax: `b TARGET` where TARGET: branch offset
- Bytecode: 0x42 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET
@@ -637,7 +637,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## bury
-- Syntax: `bury N` ∋ N: depth
+- Syntax: `bury N` where N: depth
- Bytecode: 0x45 {uint8}
- Stack: ..., A &rarr; ...
- replace the Nth value from the top of the stack with A. bury 0 fails.
@@ -645,7 +645,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## popn
-- Syntax: `popn N` ∋ N: stack depth
+- Syntax: `popn N` where N: stack depth
- Bytecode: 0x46 {uint8}
- Stack: ..., [N items] &rarr; ...
- remove N values from the top of the stack
@@ -653,7 +653,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dupn
-- Syntax: `dupn N` ∋ N: copy count
+- Syntax: `dupn N` where N: copy count
- Bytecode: 0x47 {uint8}
- Stack: ..., A &rarr; ..., A, [N copies of A]
- duplicate A, N times
@@ -680,7 +680,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## dig
-- Syntax: `dig N` ∋ N: depth
+- Syntax: `dig N` where N: depth
- Bytecode: 0x4b {uint8}
- Stack: ..., A, [N items] &rarr; ..., A, [N items], A
- Nth value from the top of the stack. dig 0 is equivalent to dup
@@ -702,7 +702,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## cover
-- Syntax: `cover N` ∋ N: depth
+- Syntax: `cover N` where N: depth
- Bytecode: 0x4e {uint8}
- Stack: ..., [N items], A &rarr; ..., A, [N items]
- remove top of stack, and place it deeper in the stack such that N elements are above it. Fails if stack depth <= N.
@@ -710,7 +710,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## uncover
-- Syntax: `uncover N` ∋ N: depth
+- Syntax: `uncover N` where N: depth
- Bytecode: 0x4f {uint8}
- Stack: ..., A, [N items] &rarr; ..., [N items], A
- remove the value at depth N in the stack and shift above items down so the Nth deep value is on top of the stack. Fails if stack depth <= N.
@@ -727,7 +727,7 @@ See `bnz` for details on how branches work. `b` always jumps to the offset.
## substring
-- Syntax: `substring S E` ∋ S: start position, E: end position
+- Syntax: `substring S E` where S: start position, E: end position
- Bytecode: 0x51 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including E. If E < S, or either is larger than the array length, the program fails
@@ -774,7 +774,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## extract
-- Syntax: `extract S L` ∋ S: start position, L: length
+- Syntax: `extract S L` where S: start position, L: length
- Bytecode: 0x57 {uint8}, {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- A range of bytes from A starting at S up to but not including S+L. If L is 0, then extract to the end of the string. If S or S+L is larger than the array length, the program fails
@@ -810,7 +810,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## replace2
-- Syntax: `replace2 S` ∋ S: start position
+- Syntax: `replace2 S` where S: start position
- Bytecode: 0x5c {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
- Copy of A with the bytes starting at S replaced by the bytes of B. Fails if S+len(B) exceeds len(A)<br />`replace2` can be called using `replace` with 1 immediate.
@@ -825,7 +825,7 @@ When A is a uint64, index 0 is the least significant bit. Setting bit 3 to 1 on
## base64_decode
-- Syntax: `base64_decode E` ∋ E: [base64](#field-group-base64)
+- Syntax: `base64_decode E` where E: [base64](#field-group-base64)
- Bytecode: 0x5e {uint8}
- Stack: ..., A: []byte &rarr; ..., []byte
- decode A which was base64-encoded using _encoding_ E. Fail if A is not base64 encoded with encoding E
@@ -848,7 +848,7 @@ Encodings
## json_ref
-- Syntax: `json_ref R` ∋ R: [json_ref](#field-group-json_ref)
+- Syntax: `json_ref R` where R: [json_ref](#field-group-json_ref)
- Bytecode: 0x5f {uint8}
- Stack: ..., A: []byte, B: []byte &rarr; ..., any
- key B's value, of type R, from a [valid](jsonspec.md) utf-8 encoded json object A
@@ -893,7 +893,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_local_get
- Bytecode: 0x62
-- Stack: ..., A, B: []byte &rarr; ..., any
+- Stack: ..., A, B: stateKey &rarr; ..., any
- local state of the key B in the current application in account A
- Availability: v2
- Mode: Application
@@ -903,7 +903,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_get_ex
- Bytecode: 0x63
-- Stack: ..., A, B: uint64, C: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A, B: uint64, C: stateKey &rarr; ..., X: any, Y: bool
- X is the local state of application B, key C in account A. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -913,7 +913,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## app_global_get
- Bytecode: 0x64
-- Stack: ..., A: []byte &rarr; ..., any
+- Stack: ..., A: stateKey &rarr; ..., any
- global state of the key A in the current application
- Availability: v2
- Mode: Application
@@ -923,7 +923,7 @@ params: state key. Return: value. The value is zero (of type uint64) if the key
## app_global_get_ex
- Bytecode: 0x65
-- Stack: ..., A: uint64, B: []byte &rarr; ..., X: any, Y: bool
+- Stack: ..., A: uint64, B: stateKey &rarr; ..., X: any, Y: bool
- X is the global state of application A, key B. Y is 1 if key existed, else 0
- Availability: v2
- Mode: Application
@@ -933,7 +933,7 @@ params: Txn.ForeignApps offset (or, since v4, an _available_ application id), st
## app_local_put
- Bytecode: 0x66
-- Stack: ..., A, B: []byte, C &rarr; ...
+- Stack: ..., A, B: stateKey, C &rarr; ...
- write C to key B in account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -943,7 +943,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_global_put
- Bytecode: 0x67
-- Stack: ..., A: []byte, B &rarr; ...
+- Stack: ..., A: stateKey, B &rarr; ...
- write B to key A in the global state of the current application
- Availability: v2
- Mode: Application
@@ -951,7 +951,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), stat
## app_local_del
- Bytecode: 0x68
-- Stack: ..., A, B: []byte &rarr; ...
+- Stack: ..., A, B: stateKey &rarr; ...
- delete key B from account A's local state of the current application
- Availability: v2
- Mode: Application
@@ -963,7 +963,7 @@ Deleting a key which is already absent has no effect on the application local st
## app_global_del
- Bytecode: 0x69
-- Stack: ..., A: []byte &rarr; ...
+- Stack: ..., A: stateKey &rarr; ...
- delete key A from the global state of the current application
- Availability: v2
- Mode: Application
@@ -974,7 +974,7 @@ Deleting a key which is already absent has no effect on the application global s
## asset_holding_get
-- Syntax: `asset_holding_get F` ∋ F: [asset_holding](#field-group-asset_holding)
+- Syntax: `asset_holding_get F` where F: [asset_holding](#field-group-asset_holding)
- Bytecode: 0x70 {uint8}
- Stack: ..., A, B: uint64 &rarr; ..., X: any, Y: bool
- X is field F from account A's holding of asset B. Y is 1 if A is opted into B, else 0
@@ -995,7 +995,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or
## asset_params_get
-- Syntax: `asset_params_get F` ∋ F: [asset_params](#field-group-asset_params)
+- Syntax: `asset_params_get F` where F: [asset_params](#field-group-asset_params)
- Bytecode: 0x71 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from asset A. Y is 1 if A exists, else 0
@@ -1026,7 +1026,7 @@ params: Txn.ForeignAssets offset (or, since v4, an _available_ asset id. Return:
## app_params_get
-- Syntax: `app_params_get F` ∋ F: [app_params](#field-group-app_params)
+- Syntax: `app_params_get F` where F: [app_params](#field-group-app_params)
- Bytecode: 0x72 {uint8}
- Stack: ..., A: uint64 &rarr; ..., X: any, Y: bool
- X is field F from app A. Y is 1 if A exists, else 0
@@ -1054,7 +1054,7 @@ params: Txn.ForeignApps offset or an _available_ app id. Return: did_exist flag
## acct_params_get
-- Syntax: `acct_params_get F` ∋ F: [acct_params](#field-group-acct_params)
+- Syntax: `acct_params_get F` where F: [acct_params](#field-group-acct_params)
- Bytecode: 0x73 {uint8}
- Stack: ..., A &rarr; ..., X: any, Y: bool
- X is field F from account A. Y is 1 if A owns positive algos, else 0
@@ -1093,7 +1093,7 @@ params: Txn.Accounts offset (or, since v4, an _available_ account address), _ava
## pushbytes
-- Syntax: `pushbytes BYTES` ∋ BYTES: a byte constant
+- Syntax: `pushbytes BYTES` where BYTES: a byte constant
- Bytecode: 0x80 {varuint length, bytes}
- Stack: ... &rarr; ..., []byte
- immediate BYTES
@@ -1103,7 +1103,7 @@ pushbytes args are not added to the bytecblock during assembly processes
## pushint
-- Syntax: `pushint UINT` ∋ UINT: an int constant
+- Syntax: `pushint UINT` where UINT: an int constant
- Bytecode: 0x81 {varuint}
- Stack: ... &rarr; ..., uint64
- immediate UINT
@@ -1113,7 +1113,7 @@ pushint args are not added to the intcblock during assembly processes
## pushbytess
-- Syntax: `pushbytess BYTES ...` ∋ BYTES ...: a list of byte constants
+- Syntax: `pushbytess BYTES ...` where BYTES ...: a list of byte constants
- Bytecode: 0x82 {varuint count, [varuint length, bytes ...]}
- Stack: ... &rarr; ..., [N items]
- push sequences of immediate byte arrays to stack (first byte array being deepest)
@@ -1123,7 +1123,7 @@ pushbytess args are not added to the bytecblock during assembly processes
## pushints
-- Syntax: `pushints UINT ...` ∋ UINT ...: a list of int constants
+- Syntax: `pushints UINT ...` where UINT ...: a list of int constants
- Bytecode: 0x83 {varuint count, [varuint ...]}
- Stack: ... &rarr; ..., [N items]
- push sequence of immediate uints to stack in the order they appear (first uint being deepest)
@@ -1141,7 +1141,7 @@ pushints args are not added to the intcblock during assembly processes
## callsub
-- Syntax: `callsub TARGET` ∋ TARGET: branch offset
+- Syntax: `callsub TARGET` where TARGET: branch offset
- Bytecode: 0x88 {int16 (big-endian)}
- Stack: ... &rarr; ...
- branch unconditionally to TARGET, saving the next instruction on the call stack
@@ -1160,7 +1160,7 @@ If the current frame was prepared by `proto A R`, `retsub` will remove the 'A' a
## proto
-- Syntax: `proto A R` ∋ A: number of arguments, R: number of return values
+- Syntax: `proto A R` where A: number of arguments, R: number of return values
- Bytecode: 0x8a {uint8}, {uint8}
- Stack: ... &rarr; ...
- Prepare top call frame for a retsub that will assume A args and R return values.
@@ -1170,7 +1170,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_dig
-- Syntax: `frame_dig I` ∋ I: frame slot
+- Syntax: `frame_dig I` where I: frame slot
- Bytecode: 0x8b {int8}
- Stack: ... &rarr; ..., any
- Nth (signed) value from the frame pointer.
@@ -1178,7 +1178,7 @@ Fails unless the last instruction executed was a `callsub`.
## frame_bury
-- Syntax: `frame_bury I` ∋ I: frame slot
+- Syntax: `frame_bury I` where I: frame slot
- Bytecode: 0x8c {int8}
- Stack: ..., A &rarr; ...
- replace the Nth (signed) value from the frame pointer in the stack with A
@@ -1186,7 +1186,7 @@ Fails unless the last instruction executed was a `callsub`.
## switch
-- Syntax: `switch TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `switch TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8d {varuint count, [int16 (big-endian) ...]}
- Stack: ..., A: uint64 &rarr; ...
- branch to the Ath label. Continue at following instruction if index A exceeds the number of labels.
@@ -1194,7 +1194,7 @@ Fails unless the last instruction executed was a `callsub`.
## match
-- Syntax: `match TARGET ...` ∋ TARGET ...: list of labels
+- Syntax: `match TARGET ...` where TARGET ...: list of labels
- Bytecode: 0x8e {varuint count, [int16 (big-endian) ...]}
- Stack: ..., [A1, A2, ..., AN], B &rarr; ...
- given match cases from A[1] to A[N], branch to the Ith label where A[I] = B. Continue to the following instruction if no matches are found.
@@ -1251,7 +1251,7 @@ bitlen interprets arrays as big-endian integers, unlike setbit/getbit
## bsqrt
- Bytecode: 0x96
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint &rarr; ..., bigint
- The largest integer I such that I^2 <= A. A and I are interpreted as big-endian unsigned integers
- **Cost**: 40
- Availability: v6
@@ -1268,7 +1268,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## sha3_256
- Bytecode: 0x98
-- Stack: ..., A: []byte &rarr; ..., []byte
+- Stack: ..., A: []byte &rarr; ..., [32]byte
- SHA3_256 hash of value A, yields [32]byte
- **Cost**: 130
- Availability: v7
@@ -1350,7 +1350,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## b%
- Bytecode: 0xaa
-- Stack: ..., A: []byte, B: []byte &rarr; ..., []byte
+- Stack: ..., A: bigint, B: bigint &rarr; ..., bigint
- A modulo B. A and B are interpreted as big-endian unsigned integers. Fail if B is zero.
- **Cost**: 20
- Availability: v4
@@ -1416,7 +1416,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn_field
-- Syntax: `itxn_field F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn_field F` where F: [txn](#field-group-txn)
- Bytecode: 0xb2 {uint8}
- Stack: ..., A &rarr; ...
- set field F of the current inner transaction to A
@@ -1437,7 +1437,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxn
-- Syntax: `itxn F` ∋ F: [txn](#field-group-txn)
+- Syntax: `itxn F` where F: [txn](#field-group-txn)
- Bytecode: 0xb4 {uint8}
- Stack: ... &rarr; ..., any
- field F of the last inner transaction
@@ -1446,7 +1446,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## itxna
-- Syntax: `itxna F I` ∋ F: [txna](#field-group-txna), I: a transaction field array index
+- Syntax: `itxna F I` where F: [txna](#field-group-txna), I: a transaction field array index
- Bytecode: 0xb5 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F of the last inner transaction
@@ -1465,7 +1465,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxn
-- Syntax: `gitxn T F` ∋ T: transaction group index, F: [txn](#field-group-txn)
+- Syntax: `gitxn T F` where T: transaction group index, F: [txn](#field-group-txn)
- Bytecode: 0xb7 {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- field F of the Tth transaction in the last inner group submitted
@@ -1474,7 +1474,7 @@ The notation A,B indicates that A and B are interpreted as a uint128 value, with
## gitxna
-- Syntax: `gitxna T F I` ∋ T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
+- Syntax: `gitxna T F I` where T: transaction group index, F: [txna](#field-group-txna), I: transaction field array index
- Bytecode: 0xb8 {uint8}, {uint8}, {uint8}
- Stack: ... &rarr; ..., any
- Ith value of the array field F from the Tth transaction in the last inner group submitted
@@ -1545,7 +1545,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## txnas
-- Syntax: `txnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `txnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc0 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the current transaction
@@ -1553,7 +1553,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnas
-- Syntax: `gtxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gtxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc1 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the current group
@@ -1561,7 +1561,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gtxnsas
-- Syntax: `gtxnsas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `gtxnsas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc2 {uint8}
- Stack: ..., A: uint64, B: uint64 &rarr; ..., any
- Bth value of the array field F from the Ath transaction in the current group
@@ -1585,7 +1585,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## itxnas
-- Syntax: `itxnas F` ∋ F: [txna](#field-group-txna)
+- Syntax: `itxnas F` where F: [txna](#field-group-txna)
- Bytecode: 0xc5 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F of the last inner transaction
@@ -1594,7 +1594,7 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## gitxnas
-- Syntax: `gitxnas T F` ∋ T: transaction group index, F: [txna](#field-group-txna)
+- Syntax: `gitxnas T F` where T: transaction group index, F: [txna](#field-group-txna)
- Bytecode: 0xc6 {uint8}, {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- Ath value of the array field F from the Tth transaction in the last inner group submitted
@@ -1603,9 +1603,9 @@ For boxes that exceed 4,096 bytes, consider `box_create`, `box_extract`, and `bo
## vrf_verify
-- Syntax: `vrf_verify S` ∋ S: [vrf_verify](#field-group-vrf_verify)
+- Syntax: `vrf_verify S` where S: [vrf_verify](#field-group-vrf_verify)
- Bytecode: 0xd0 {uint8}
-- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: []byte, Y: bool
+- Stack: ..., A: []byte, B: [80]byte, C: [32]byte &rarr; ..., X: [64]byte, Y: bool
- Verify the proof B of message A against pubkey C. Returns vrf output and verification flag.
- **Cost**: 5700
- Availability: v7
@@ -1623,7 +1623,7 @@ Standards
## block
-- Syntax: `block F` ∋ F: [block](#field-group-block)
+- Syntax: `block F` where F: [block](#field-group-block)
- Bytecode: 0xd1 {uint8}
- Stack: ..., A: uint64 &rarr; ..., any
- field F of block A. Fail unless A falls between txn.LastValid-1002 and txn.FirstValid (exclusive)
diff --git a/data/transactions/logic/assembler.go b/data/transactions/logic/assembler.go
index e8011fd81..a707e23f6 100644
--- a/data/transactions/logic/assembler.go
+++ b/data/transactions/logic/assembler.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -1481,7 +1481,7 @@ func typeStores(pgm *ProgramKnowledge, args []token) (StackTypes, StackTypes, er
// If the index of the scratch slot is a const
// we can modify only that scratch slots type
if top >= 1 {
- if idx, isConst := pgm.stack[top-1].constant(); isConst {
+ if idx, isConst := pgm.stack[top-1].constInt(); isConst {
pgm.scratchSpace[idx] = pgm.stack[top]
return nil, nil, nil
}
@@ -1524,7 +1524,7 @@ func typeLoads(pgm *ProgramKnowledge, args []token) (StackTypes, StackTypes, err
return nil, nil, nil
}
- if val, isConst := pgm.stack[top].constant(); isConst {
+ if val, isConst := pgm.stack[top].constInt(); isConst {
return nil, StackTypes{pgm.scratchSpace[val]}, nil
}
diff --git a/data/transactions/logic/assembler_test.go b/data/transactions/logic/assembler_test.go
index c45c0af77..3f609fd7e 100644
--- a/data/transactions/logic/assembler_test.go
+++ b/data/transactions/logic/assembler_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -427,6 +427,13 @@ match_label1:
pushbytess "1" "2" "1"
`
+const stateProofNonsense = `
+pushbytes 0x0123456789abcd
+sumhash512
+dup; dup
+falcon_verify
+`
+
const v8Nonsense = v7Nonsense + switchNonsense + frameNonsense + matchNonsense + boxNonsense
const v9Nonsense = v8Nonsense
@@ -438,7 +445,7 @@ const spliceNonsence = `
const v10Nonsense = v9Nonsense + pairingNonsense + spliceNonsence
-const v11Nonsense = v10Nonsense
+const v11Nonsense = v10Nonsense + stateProofNonsense
const v6Compiled = "2004010002b7a60c26050242420c68656c6c6f20776f726c6421070123456789abcd208dae2087fbba51304eb02b91f656948397a7946390e8cb70fc9ea4d95f92251d047465737400320032013202320380021234292929292b0431003101310231043105310731083109310a310b310c310d310e310f3111311231133114311533000033000133000233000433000533000733000833000933000a33000b33000c33000d33000e33000f3300113300123300133300143300152d2e01022581f8acd19181cf959a1281f8acd19181cf951a81f8acd19181cf1581f8acd191810f082209240a220b230c240d250e230f2310231123122313231418191a1b1c28171615400003290349483403350222231d4a484848482b50512a632223524100034200004322602261222704634848222862482864286548482228246628226723286828692322700048482371004848361c0037001a0031183119311b311d311e311f312023221e312131223123312431253126312731283129312a312b312c312d312e312f447825225314225427042455220824564c4d4b0222382124391c0081e80780046a6f686e2281d00f23241f880003420001892224902291922494249593a0a1a2a3a4a5a6a7a8a9aaabacadae24af3a00003b003c003d816472064e014f012a57000823810858235b235a2359b03139330039b1b200b322c01a23c1001a2323c21a23c3233e233f8120af06002a494905002a49490700b400b53a03b6b7043cb8033a0c2349c42a9631007300810881088120978101c53a8101c6003a"
@@ -460,7 +467,9 @@ const spliceCompiled = "d2d3"
const v10Compiled = v9Compiled + pairingCompiled + spliceCompiled
-const V11Compiled = v10Compiled
+const stateProofCompiled = "80070123456789abcd86494985"
+
+const V11Compiled = v10Compiled + stateProofCompiled
var nonsense = map[uint64]string{
1: v1Nonsense,
@@ -541,7 +550,7 @@ func TestAssemble(t *testing.T) {
}
}
-var experiments = []uint64{}
+var experiments = []uint64{spOpcodesVersion}
// TestExperimental forces a conscious choice to promote "experimental" opcode
// groups. This will fail when we increment vFuture's LogicSigVersion. If we had
@@ -2955,6 +2964,22 @@ done:
`, LogicVersion, exp(5, "concat arg 1 wanted type []byte..."))
}
+func TestTypeTrackingRegression(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+ testProg(t, `
+callsub end // wipes out initial program knowledge, makes scratch "any"
+label1:
+ load 1
+ byte 0x01
+ stores // we had a bug in which the "any" seemed constant
+ load 0
+ load 0
+ +
+end:
+`, LogicVersion)
+}
+
func TestMergeProtos(t *testing.T) {
partitiontest.PartitionTest(t)
t.Parallel()
diff --git a/data/transactions/logic/backwardCompat_test.go b/data/transactions/logic/backwardCompat_test.go
index 0ae1ba319..fb11bc0b6 100644
--- a/data/transactions/logic/backwardCompat_test.go
+++ b/data/transactions/logic/backwardCompat_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/blackbox_test.go b/data/transactions/logic/blackbox_test.go
index 55e7bde4f..cdcf971a0 100644
--- a/data/transactions/logic/blackbox_test.go
+++ b/data/transactions/logic/blackbox_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/box.go b/data/transactions/logic/box.go
index 4938f95aa..09d2f6501 100644
--- a/data/transactions/logic/box.go
+++ b/data/transactions/logic/box.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/box_test.go b/data/transactions/logic/box_test.go
index 664962744..61609d5a9 100644
--- a/data/transactions/logic/box_test.go
+++ b/data/transactions/logic/box_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/crypto.go b/data/transactions/logic/crypto.go
index 43fe4d50d..c5c39b654 100644
--- a/data/transactions/logic/crypto.go
+++ b/data/transactions/logic/crypto.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -28,6 +28,7 @@ import (
"github.com/algorand/go-algorand/crypto"
"github.com/algorand/go-algorand/crypto/secp256k1"
"github.com/algorand/go-algorand/protocol"
+ "github.com/algorand/go-sumhash"
"golang.org/x/crypto/sha3"
)
@@ -70,6 +71,34 @@ func opSHA512_256(cx *EvalContext) error {
return nil
}
+// Sumhash512 corresponds to the hash used in State Proofs
+func opSumhash512(cx *EvalContext) error {
+ last := len(cx.Stack) - 1
+ h := sumhash.New512(nil)
+ h.Write(cx.Stack[last].Bytes)
+ cx.Stack[last].Bytes = h.Sum(nil)
+ return nil
+}
+
+func opFalconVerify(cx *EvalContext) error {
+ last := len(cx.Stack) - 1 // index of PK
+ prev := last - 1 // index of signature
+ pprev := prev - 1 // index of data
+
+ var fv crypto.FalconVerifier
+ if len(cx.Stack[last].Bytes) != len(fv.PublicKey) {
+ return fmt.Errorf("invalid public key size %d != %d", len(cx.Stack[last].Bytes), len(fv.PublicKey))
+ }
+ copy(fv.PublicKey[:], cx.Stack[last].Bytes)
+
+ sig := crypto.FalconSignature(cx.Stack[prev].Bytes)
+
+ err := fv.VerifyBytes(cx.Stack[pprev].Bytes, sig)
+ cx.Stack[pprev] = boolToSV(err == nil)
+ cx.Stack = cx.Stack[:prev]
+ return nil
+}
+
// Msg is data meant to be signed and then verified with the
// ed25519verify opcode.
type Msg struct {
diff --git a/data/transactions/logic/crypto_test.go b/data/transactions/logic/crypto_test.go
index 7c0dc5f58..5aad23028 100644
--- a/data/transactions/logic/crypto_test.go
+++ b/data/transactions/logic/crypto_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -55,6 +55,31 @@ byte 0xc195eca25a6f4c82bfba0287082ddb0d602ae9230f9cf1f1a40b68f8e2c41567
testAccepts(t, progText, 1)
}
+func TestSumhash(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ /* tests extracted from test vector in go-algorand/sumhash */
+ testVectors := []struct{ in, out string }{
+ {
+ "",
+ "591591c93181f8f90054d138d6fa85b63eeeb416e6fd201e8375ba05d3cb55391047b9b64e534042562cc61944930c0075f906f16710cdade381ee9dd47d10a0",
+ },
+ {
+ "a",
+ "ea067eb25622c633f5ead70ab83f1d1d76a7def8d140a587cb29068b63cb6407107aceecfdffa92579ed43db1eaa5bbeb4781223a6e07dd5b5a12d5e8bde82c6",
+ },
+ {
+ "I think, therefore I am. – Rene Descartes.",
+ "2d4583cdb18710898c78ec6d696a86cc2a8b941bb4d512f9d46d96816d95cbe3f867c9b8bd31964406c847791f5669d60b603c9c4d69dadcb87578e613b60b7a",
+ },
+ }
+
+ for _, v := range testVectors {
+ testAccepts(t, fmt.Sprintf(`byte "%s"; sumhash512; byte 0x%s; ==`, v.in, v.out), 11)
+ }
+}
+
func TestSHA3_256(t *testing.T) {
partitiontest.PartitionTest(t)
t.Parallel()
@@ -170,6 +195,14 @@ byte 0x13e49a19378bbfa8d55ac81a35b87d7bae456c79fcf04a78803d8eb45b253fab
byte 0xa2d237cd897ca70787abf04d2155c6dc2fbe26fd642e0472cd75c13dc919ef1a
ecdsa_verify Secp256r1
assert`, "int 1"},
+ {"falcon_verify", "", `
+byte 0x62fdfc072182654f163f5f0f9a621d729566c74d0aa413bf009c9800418c19cd // msg
+// public key
+byte 0xba00a5222fbaa5e2a1a61f708198a4dbc3de94b60d925042d9fa5a299ebb4be27156b1d86a174df4939342f11b776dffb8a0e874714f23318ca9acb823e9aeb14a926ed5cf76e736faa0b22e4bdedf7910decd19329f353b926ae4b404653dbc6db1885c010052b94675d4cc209ef2cf3cfe910c4ef51b6af16d8c7ab6651e57934ab19c89f771058f389ad80474740c529d59a3ea9ab9db228415fb9315dee23e8c7229398c4b0a2b7c5d6eff6e7d8cf1a776ae37f6272082796c0b2a0af637f7ce8fa7f1675dfbd1766543cbf3f19544d635298ea1fafe96ad1bb06fcc6ae9ff9c34acacb88653555c37f2ad6c4eb408478b0d2b6269841243f29b18fa8e0d5050f4f93878e53aac466dc4eb5a7194cb2213c26a2b8c7ccea06f89af26ae85315454da1b15952be639bb94fe3e99236291c4a1edfbe9faf8f32589bf47eb536b28e2cfbdea799d9cf4c88ef85ae45d451e1ab3431c247b796cbf12e63b737cc4894ad7a204f680a449cbbd2e86deca1069b3592977bd8ac7c5b5e1c1b436cde65177b6e82b2e666117a8e37b58122d1a31307ca112311e665b32c68bd42531b4e6bc79957d3d865f6470b8213db8175e5c7115f4ad520a4711b12d9004e661346c4da4cb3e95954ac58e075a320b862a6a317e0988d8fc376fb14562773b9d35d5a44ba951d866a3a06ac93a55e1a26fa91718db49a53e78d9e61d6120dfadd2b4929579ac56ccaac0f8e704826b55b4ca6d8020e42a6e62b5e41708e2e6848cd047385fa1df4f51733df35dbee25c96c4176eae332ca4df31c695fff8be31b4be62e63c3e049483c89384fb1d802e58db5514a59eb96e527b202d0cf45dc760fa0439afbc661868b9408e67254c8cf7c689c50d2f29bccd59c71ea7b6dd368de68669fdf889ac1f8cd390ea17894dd0538ff6e7c740bbf03b4fe32ad66c483c823548eea84f85826da44016bd8cdf2315b07a96a9737ebc7cb244547be3f759bdf50b467552c58333ed7e61cde799346bccc29d5d377d9d5364c369ffd88a83f90a699b3622184436b518e9196524ac9b55385b39ec099d9c18386e06b9dcad2499ddb9673cb87c652209ee60511c9249f1b7ab2b948b5e8b9115c218d5b793d65b96e2fc9e2c6c40ba63791bb89d7d96c33536ad7e6668a85e52ec7e1450a69f25766deeaeb41bcd249394b8ab65a286312db461c363cebe431c4dd5fd3b6bb5d26ae2c597799f400abb3ba160522e2e6da5ebd170a45c9ce80b135a5b330656aab26399bcacd857a7f237dfd2b14ecbfbcaabc7291ba78fe19ac2ecf005b66bb9771bf64f090269a2341967e79702733dc617b469ac12123faeb4c70d6fffac25f9fcd7dbd12ca363985b9bd845e939e6caf328e2bf8e53725bae94fbe30bfdbbc21e584ba72d7badbc2a0915c9faf9c69ad3703cf99a16399b38df157be8ec3a78f20d24b2131f9c25b3c1da70fc6c0c7aa9e9da3108368ca6211dcfa4988b1ace3c28b15b0559224570fbe3cde364734c7a66a0525c1d41e26788cd1c8a3888f344c9385804364f8430ca7d22338cc941917da3dc47a00aae13e3e972af49940c8fa179574694e369a3d5e67db6c91bf843151ca0fff512d9c322c690063ae9bd671815e9d03b3a841952ce04683509e415b8d5aebfcdbd6bd55efbffb2463cf2b96ccb8650a6cee732c8d4ce6409b9a747317866759553f1c5bcc392c98d14a034ccaaa6df5723bb88c38e80
+// sig
+byte 0x0a85ea3bb342a95a3941a4c2280c686729c76bc164092c0e203388460c556273e6f0a92640650c37e9d5b08fbd8d6bcca940acac9964e64a9e78bd28086b52898812264985e19c3d26318be2ec8852ca2ae2380746428cd08124cf792790d127d3dad09fe891cbadefef36269ae7d584b77ec428d794a6c3b7555956db00314d14a0aa14936830c8622623916639743b218243344224472240cfd158819190ede108394063c3df9c474eb16aa750e48663515d8229d3849670e30891142b632a6a282d915273a5f219d65ebe6b9e6c88170ac62c16a44895a950bfec82819221dab1358861bf0aa6b6342477016d50502a298840ddc42b3ade784b643c63c5e47993ada37dfdc0d56a1c7e4690b5a1d6485900b84f0b61425383b14d4b7ccc0abe8284a47a6f22050838b0482ad8ad389151c25e790ad670d5530f9b3dc518bb0a410f64346a74dc824238026daaa4ad97518d93670a48cf8f86ece593d23ab3a0d601d49a975db291f0d76263551e9f0b8a1b42396a27d9a122210330c692d5545d67c808b50560fc3d4933fa70c463513d7183e8aa091f34dd4426272620fe4b357deea710c687bb7a475d0ed0a40a26ae8f2a357e7a8fa5d5434050c1a36beaa7a90ee4db213a126db8151f2f4bbb4889d4e42bbd19f62dd7285def148071fb7f4f16b28c1d145d2e621fee275161a3d5b9319e7a59527c3d5c2838ef503e4166f2c22118b22bf80e8a1fc1bbbba00f231d2b1a8d3e592bdcc5fd40a2ecebb5ad27a51e7867715b54185a3e62951a5d808d80c31a59e6a3ca53a51eadc34c76dfd6aac22a6e805163b5e9ac8090869a9cd1e2972af7192bcd1da39c30f423ebc86d1976e8f52052262521d3b8ae7eb99d0ad623d811bac636f447e7dc9dcef6f52befd95861f1917116517b0e9b56a85967ab701ff8f1d4de443efce1b2a3d85b592df7a8c87814e8981575ef4e72757c5afa6bec4358e2f29966ad2830e4782f9a293351dfcaac1d0ca30ec1b5fd08a40a6e82938427a68641b96252a85443141c081982ba4d3c8ab05a1a545ea49c23ee07643ec5f013c2676db09cb834ef61817e615ad19c5829216026e5635dc13cad5ffb8bc267bf58d4ebbf100c3045e250c02c10772e96c580db049c80fdd3188e19ad893d16ac100052c557378416929319c9c262c21b768e6058a09b4e4800ae624c892117ec71504a283f558c623a212d048d5d401b00448b18ac25e1c99ab35d91f78badebcd651e86f3465ef99a0afa1721d2153e4a7b51d22b344a8dd102e7411abfe4bd5b8e2d62015edc08fc461fa90cfa666a9a42a0a86e11d6988913ba0259096cb846a1fd311c4cb693c4e3e1ed2ab57e2a5e0bd4616a79e22b28caa6d10dd09225e44bbdbfa1b7b23887055a90918220252777d5a620351cb013cc28346fc69d348165a39d03243a84a9c9bcd4d557a8e9607256baab893a0a5644520686be935e9ead84501f743a489a431cf10b8c27d3901c87b8771ce65e3130a7fe6ad62b709c23bbef1381b1ed49222f487db16af3c9d6779c01c986ea9f823be017fb8bce8e00f2b32840d54e8f656139a4c492257ee8743a8c5f51450c0366655e2b02d27619d07e556001430b04454891247813c8bc31bdee926d039a5038bfca8dc35e57789950442ad7ab3cfc031a8354bd9c462a37052d0b62066bcee0c292b890a71f4ea65895a7d837283404842c59f08414b20ec1b4fda6cc0c4d62216e8ead74ba90196168bc449a2050b442181ea57b915581bc387ed412e4cd5970fd0fb83c94fbbf960d05ffe6d0a26171c249809604a0b2b411e2d6622145c936e31258baf2b7d3c413a9a1d67bc4026d01b47a10b6c5b87f6a36ba1cedd681ca55b9c042bf9afcfcb636040793e08158dd877c49c16658f819129e26237427a1d80b941fbabb4abd4f1da0b6d428a59fbc450620eeb1651849e5972fb12e6dc8092a9fda70206a48d9dc2645641a147626350cf45b1a7d57724fcab0a594df7c023928a3c7a2fc3c9d33e9af10ae5ed282c475a611671d20d90752f2a28db48b7e5d9184212432fa948fbc885f866c93a0b7f510329aea4d53ecf9482f42974beaf289086afdb4797aa129d10639948f46a805ea4000cf1554505f4bd9d775d5894da115f5840913d5070c860b3a623eb261f5f928a31cbcec17c4274b5d1b28fdb231cc8f606c9dc324db5c12f97518fd03466541f7881762c25d711976c6d4f9271d29fa51dc263f650a32010343a51e7dab344e2f6d768864072ddb5df58486434998a280aad94886ea7a11132184e6274d4cd59a5deabf8a4dbbe29e9c234a52d3972608d0a3ea92a78e08531bb938384444246be5bc594ed4d06168e870924e8913f8242bd35f7c9d5ee238cb6db17496047acce0183f2d10a4cf2bbc8e39daf44e630393a0473b8983863b1998c17026ff35ec32a8058fd603ec369b80a94cb7b555cb469f6468de3909b21293b8d0a53a5c813d218d7c630f4d47bb1eb88253e6e1af721ba8a4453e
+falcon_verify
+assert`, "int 1"},
{"vrf_verify", "", `byte 0x72
byte 0xae5b66bdf04b4c010bfe32b2fc126ead2107b697634f6f7337b9bff8785ee111200095ece87dde4dbe87343f6df3b107d91798c8a7eb1245d3bb9c5aafb093358c13e6ae1111a55717e895fd15f99f07
byte 0x3d4017c3e843895a92b70aa74d1b7ebc9c982ccf2ec4968cc0cd55f12af4660c
@@ -264,6 +297,52 @@ func TestEd25519VerifyBare(t *testing.T) {
}
}
+func TestFalconVerify(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ var s crypto.FalconSeed
+ fs, err := crypto.GenerateFalconSigner(s)
+ require.NoError(t, err)
+
+ msg := "62fdfc072182654f163f5f0f9a621d729566c74d0aa413bf009c9800418c19cd"
+ data, err := hex.DecodeString(msg)
+ require.NoError(t, err)
+
+ yes := testProg(t, fmt.Sprintf(`arg 0; arg 1; byte 0x%s; falcon_verify`,
+ hex.EncodeToString(fs.PublicKey[:])), 11)
+ require.NoError(t, err)
+ no := testProg(t, fmt.Sprintf(`arg 0; arg 1; byte 0x%s; falcon_verify; !`,
+ hex.EncodeToString(fs.PublicKey[:])), 11)
+ require.NoError(t, err)
+
+ for v := uint64(11); v <= AssemblerMaxVersion; v++ {
+ t.Run(fmt.Sprintf("v=%d", v), func(t *testing.T) {
+ yes.Program[0] = byte(v)
+ sig, err := fs.SignBytes(data)
+ require.NoError(t, err)
+
+ var txn transactions.SignedTxn
+ txn.Lsig.Args = [][]byte{data[:], sig[:]}
+ testLogicBytes(t, yes.Program, defaultSigParams(txn))
+ testLogicBytes(t, no.Program, defaultSigParams(txn), "REJECT")
+
+ // short sig will fail
+ txn.Lsig.Args[1] = sig[1:]
+ testLogicBytes(t, yes.Program, defaultSigParams(txn), "REJECT")
+ testLogicBytes(t, no.Program, defaultSigParams(txn))
+
+ // flip a bit and it should not pass
+ msg1 := "52fdfc072182654f163f5f0f9a621d729566c74d0aa413bf009c9800418c19cd"
+ data1, err := hex.DecodeString(msg1)
+ require.NoError(t, err)
+ txn.Lsig.Args = [][]byte{data1, sig[:]}
+ testLogicBytes(t, yes.Program, defaultSigParams(txn), "REJECT")
+ testLogicBytes(t, no.Program, defaultSigParams(txn))
+ })
+ }
+}
+
func keyToByte(tb testing.TB, b *big.Int) []byte {
k := make([]byte, 32)
require.NotPanics(tb, func() {
@@ -352,7 +431,7 @@ byte 0x%s
if test.pass {
testAccepts(t, src, 5)
} else {
- testPanics(t, src, 5)
+ testPanics(t, notrack(src), 5)
}
})
}
@@ -394,7 +473,10 @@ byte 0x%s
}
// coverage for pk length check
- testPanics(t, `int 31; bzero; byte 0x; byte 0x; byte 0x; byte 0x; ecdsa_verify Secp256k1`, 5, "must be 32")
+ testPanics(t, notrack(`int 31; bzero; byte 0x; byte 0x; byte 0x; byte 0x; ecdsa_verify Secp256k1`), 5, "must be 32")
+
+ // we did not implement arg length checks for x,y & r,s, so we must simply fail to verify, not panic
+ testAccepts(t, notrack(`int 32; bzero; byte 0x; byte 0x; byte 0x; byte 0x; ecdsa_verify Secp256k1; !`), 5)
// ecdsa recover tests
source = `
@@ -504,7 +586,7 @@ byte 0x%s
if test.pass {
testAccepts(t, src, fidoVersion)
} else {
- testPanics(t, src, fidoVersion)
+ testPanics(t, notrack(src), fidoVersion)
}
})
}
@@ -606,11 +688,8 @@ func TestEcdsaCostVariation(t *testing.T) {
// Doesn't matter if the actual verify returns true or false. Just confirm the cost depends on curve.
source := `
-global ZeroAddress // need 32 bytes
-byte "signature r"
-byte "signature s"
-byte "PK x"
-byte "PK y"
+global ZeroAddress // need 32 bytes for all 5 args
+dup; dup; dup; dup;
ecdsa_verify Secp256k1
!
assert
@@ -621,11 +700,8 @@ int ` + fmt.Sprintf("%d", testLogicBudget-1700-8) + `
testAccepts(t, source, 6) // Secp256k1 was 5, but OpcodeBudget is 6
source = `
-global ZeroAddress // need 32 bytes
-byte "signature r"
-byte "signature s"
-byte "PK x"
-byte "PK y"
+global ZeroAddress // need 32 bytes for all 5 args
+dup; dup; dup; dup
ecdsa_verify Secp256r1
!
assert
@@ -636,26 +712,13 @@ int ` + fmt.Sprintf("%d", testLogicBudget-2500-8) + `
testAccepts(t, source, fidoVersion)
}
-func BenchmarkHash(b *testing.B) {
- for _, hash := range []string{"sha256", "keccak256", "sha512_256"} {
- b.Run(hash+"-0w", func(b *testing.B) { // hash 0 bytes
- benchmarkOperation(b, "", "byte 0x; "+hash+"; pop", "int 1")
- })
- b.Run(hash+"-32", func(b *testing.B) { // hash 32 bytes
- benchmarkOperation(b, "int 32; bzero", hash, "pop; int 1")
- })
- b.Run(hash+"-128", func(b *testing.B) { // hash 128 bytes
- benchmarkOperation(b, "int 32; bzero",
- "dup; concat; dup; concat;"+hash, "pop; int 1")
- })
- b.Run(hash+"-512", func(b *testing.B) { // hash 512 bytes
- benchmarkOperation(b, "int 32; bzero",
- "dup; concat; dup; concat; dup; concat; dup; concat;"+hash, "pop; int 1")
- })
- b.Run(hash+"-4096", func(b *testing.B) { // hash 4k bytes
- benchmarkOperation(b, "int 32; bzero",
- "dup; concat; dup; concat; dup; concat; dup; concat; dup; concat; dup; concat; dup; concat;"+hash, "pop; int 1")
- })
+func BenchmarkHashes(b *testing.B) {
+ for _, hash := range []string{"sha256", "keccak256" /* skip, same as keccak "sha3_256", */, "sha512_256", "sumhash512"} {
+ for _, size := range []int{0, 32, 128, 512, 1024, 4096} {
+ b.Run(hash+"-"+strconv.Itoa(size), func(b *testing.B) {
+ benchmarkOperation(b, "", fmt.Sprintf("int %d; bzero; %s; pop", size, hash), "int 1")
+ })
+ }
}
}
diff --git a/data/transactions/logic/debugger.go b/data/transactions/logic/debugger.go
index e11b41b8a..04478ba25 100644
--- a/data/transactions/logic/debugger.go
+++ b/data/transactions/logic/debugger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/debugger_eval_test.go b/data/transactions/logic/debugger_eval_test.go
index d99452f10..b252e7f1a 100644
--- a/data/transactions/logic/debugger_eval_test.go
+++ b/data/transactions/logic/debugger_eval_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/debugger_test.go b/data/transactions/logic/debugger_test.go
index 283bcaa6d..bd0f356d0 100644
--- a/data/transactions/logic/debugger_test.go
+++ b/data/transactions/logic/debugger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/doc.go b/data/transactions/logic/doc.go
index bfecb01a6..fde870a9d 100644
--- a/data/transactions/logic/doc.go
+++ b/data/transactions/logic/doc.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -38,6 +38,9 @@ var opDescByName = map[string]OpDesc{
"sha512_256": {"SHA512_256 hash of value A, yields [32]byte", "", nil},
"sha3_256": {"SHA3_256 hash of value A, yields [32]byte", "", nil},
+ "sumhash512": {"sumhash512 of value A, yields [64]byte", "", nil},
+ "falcon_verify": {"for (data A, compressed-format signature B, pubkey C) verify the signature of data against the pubkey", "", nil},
+
"ed25519verify": {"for (data A, signature B, pubkey C) verify the signature of (\"ProgData\" || program_hash || data) against the pubkey => {0 or 1}", "The 32 byte public key is the last element on the stack, preceded by the 64 byte signature at the second-to-last element on the stack, preceded by the data which was signed at the third-to-last element on the stack.", nil},
"ed25519verify_bare": {"for (data A, signature B, pubkey C) verify the signature of the data against the pubkey => {0 or 1}", "", nil},
"ecdsa_verify": {"for (data A, signature B, C and pubkey D, E) verify the signature of the data against the pubkey => {0 or 1}", "The 32 byte Y-component of a public key is the last element on the stack, preceded by X-component of a pubkey, preceded by S and R components of a signature, preceded by the data that is fifth element on the stack. All values are big-endian encoded. The signed data must be 32 bytes long, and signatures in lower-S form are only accepted.", []string{"curve index"}},
@@ -349,7 +352,7 @@ var OpGroups = map[string][]string{
"Byte Array Manipulation": {"getbit", "setbit", "getbyte", "setbyte", "concat", "len", "substring", "substring3", "extract", "extract3", "extract_uint16", "extract_uint32", "extract_uint64", "replace2", "replace3", "base64_decode", "json_ref"},
"Byte Array Arithmetic": {"b+", "b-", "b/", "b*", "b<", "b>", "b<=", "b>=", "b==", "b!=", "b%", "bsqrt"},
"Byte Array Logic": {"b|", "b&", "b^", "b~"},
- "Cryptography": {"sha256", "keccak256", "sha512_256", "sha3_256", "ed25519verify", "ed25519verify_bare", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "vrf_verify", "ec_add", "ec_scalar_mul", "ec_pairing_check", "ec_multi_scalar_mul", "ec_subgroup_check", "ec_map_to"},
+ "Cryptography": {"sha256", "keccak256", "sha512_256", "sha3_256", "sumhash512", "falcon_verify", "ed25519verify", "ed25519verify_bare", "ecdsa_verify", "ecdsa_pk_recover", "ecdsa_pk_decompress", "vrf_verify", "ec_add", "ec_scalar_mul", "ec_pairing_check", "ec_multi_scalar_mul", "ec_subgroup_check", "ec_map_to"},
"Loading Values": {"intcblock", "intc", "intc_0", "intc_1", "intc_2", "intc_3", "pushint", "pushints", "bytecblock", "bytec", "bytec_0", "bytec_1", "bytec_2", "bytec_3", "pushbytes", "pushbytess", "bzero", "arg", "arg_0", "arg_1", "arg_2", "arg_3", "args", "txn", "gtxn", "txna", "txnas", "gtxna", "gtxnas", "gtxns", "gtxnsa", "gtxnsas", "global", "load", "loads", "store", "stores", "gload", "gloads", "gloadss", "gaid", "gaids"},
"Flow Control": {"err", "bnz", "bz", "b", "return", "pop", "popn", "dup", "dup2", "dupn", "dig", "bury", "cover", "uncover", "frame_dig", "frame_bury", "swap", "select", "assert", "callsub", "proto", "retsub", "switch", "match"},
"State Access": {"balance", "min_balance", "app_opted_in", "app_local_get", "app_local_get_ex", "app_global_get", "app_global_get_ex", "app_local_put", "app_global_put", "app_local_del", "app_global_del", "asset_holding_get", "asset_params_get", "app_params_get", "acct_params_get", "log", "block"},
diff --git a/data/transactions/logic/doc_test.go b/data/transactions/logic/doc_test.go
index 9c9dad4ec..21bfd156c 100644
--- a/data/transactions/logic/doc_test.go
+++ b/data/transactions/logic/doc_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go
index 836b8cb85..210d7a316 100644
--- a/data/transactions/logic/eval.go
+++ b/data/transactions/logic/eval.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -28,6 +28,7 @@ import (
"math/big"
"math/bits"
"runtime"
+ "strconv"
"strings"
"golang.org/x/exp/slices"
@@ -66,6 +67,11 @@ var maxAppCallDepth = 8
// maxStackDepth should not change unless controlled by an AVM version change
const maxStackDepth = 1000
+// maxTxGroupSize is the same as config.MaxTxGroupSize, but is a constant so
+// that we can declare an array of this size. A unit test confirms that they
+// match.
+const maxTxGroupSize = 16
+
// stackValue is the type for the operand stack.
// Each stackValue is either a valid []byte value or a uint64 value.
// If (.Bytes != nil) the stackValue is a []byte value, otherwise uint64 value.
@@ -102,6 +108,17 @@ func (sv stackValue) String() string {
return fmt.Sprintf("%d 0x%x", sv.Uint, sv.Uint)
}
+func (sv stackValue) asAny() any {
+ if sv.Bytes != nil {
+ return sv.Bytes
+ }
+ return sv.Uint
+}
+
+func (sv stackValue) isEmpty() bool {
+ return sv.Bytes == nil && sv.Uint == 0
+}
+
func (sv stackValue) address() (addr basics.Address, err error) {
if len(sv.Bytes) != len(addr) {
return basics.Address{}, errors.New("not an address")
@@ -301,7 +318,7 @@ type EvalParams struct {
TxnGroup []transactions.SignedTxnWithAD
- pastScratch []*scratchSpace
+ pastScratch [maxTxGroupSize]*scratchSpace
logger logging.Logger
@@ -457,7 +474,6 @@ func NewAppEvalParams(txgroup []transactions.SignedTxnWithAD, proto *config.Cons
TxnGroup: copyWithClearAD(txgroup),
Proto: proto,
Specials: specials,
- pastScratch: make([]*scratchSpace, len(txgroup)),
minAvmVersion: computeMinAvmVersion(txgroup),
FeeCredit: credit,
PooledApplicationBudget: pooledApplicationBudget,
@@ -525,7 +541,6 @@ func NewInnerEvalParams(txg []transactions.SignedTxnWithAD, caller *EvalContext)
Proto: caller.Proto,
Trace: caller.Trace,
TxnGroup: txg,
- pastScratch: make([]*scratchSpace, len(txg)),
logger: caller.logger,
SigLedger: caller.SigLedger,
Ledger: caller.Ledger,
@@ -784,7 +799,7 @@ var (
// AllStackTypes is a map of all the stack types we recognize
// so that we can iterate over them in doc prep
// and use them for opcode proto shorthand
- AllStackTypes = map[rune]StackType{
+ AllStackTypes = map[byte]StackType{
'a': StackAny,
'b': StackBytes,
'i': StackUint64,
@@ -792,9 +807,6 @@ var (
'A': StackAddress,
'I': StackBigInt,
'T': StackBoolean,
- '3': StackBytes32,
- '6': StackBytes64,
- '8': StackBytes80,
'M': StackMethodSelector,
'K': StackStateKey,
'N': StackBoxName,
@@ -879,11 +891,11 @@ func (st StackType) widened() StackType {
}
}
-func (st StackType) constant() (uint64, bool) {
- if st.Bound[0] == st.Bound[1] {
- return st.Bound[0], true
+func (st StackType) constInt() (uint64, bool) {
+ if st.AVMType != avmUint64 || st.Bound[0] != st.Bound[1] {
+ return 0, false
}
- return 0, false
+ return st.Bound[0], true
}
// overlaps checks if there is enough overlap
@@ -932,13 +944,31 @@ func parseStackTypes(spec string) StackTypes {
if spec == "" {
return nil
}
- types := make(StackTypes, len(spec))
- for i, letter := range spec {
+ types := make(StackTypes, 0, len(spec))
+ for i := 0; i < len(spec); i++ {
+ letter := spec[i]
+ if letter == '{' {
+ if types[len(types)-1] != StackBytes {
+ panic("{ after non-bytes " + spec)
+ }
+ end := strings.IndexByte(spec[i:], '}')
+ if end == -1 {
+ panic("No } after b{ " + spec)
+ }
+ size, err := strconv.Atoi(spec[i+1 : i+end])
+ if err != nil {
+ panic("b{} does not contain a number " + spec)
+ }
+ // replace the generic type with the constrained type
+ types[len(types)-1] = NewStackType(avmBytes, static(uint64(size)), fmt.Sprintf("[%d]byte", size))
+ i += end
+ continue
+ }
st, ok := AllStackTypes[letter]
if !ok {
panic(spec)
}
- types[i] = st
+ types = append(types, st)
}
return types
}
@@ -968,10 +998,9 @@ var errTooManyArgs = errors.New("LogicSig has too many arguments")
// EvalError indicates AVM evaluation failure
type EvalError struct {
- Err error
- details string
- groupIndex int
- logicsig bool
+ Err error
+ details string
+ logicsig bool
}
// Error satisfies builtin interface `error`
@@ -992,6 +1021,78 @@ func (err EvalError) Unwrap() error {
return err.Err
}
+func (cx *EvalContext) evalError(err error) error {
+ pc, det := cx.pcDetails()
+ details := fmt.Sprintf("pc=%d, opcodes=%s", pc, det)
+
+ err = basics.Annotate(err,
+ "pc", pc,
+ "group-index", cx.groupIndex,
+ "eval-states", cx.evalStates())
+ if cx.runMode == ModeApp {
+ details = fmt.Sprintf("app=%d, %s", cx.appID, details)
+ err = basics.Annotate(err, "app-index", cx.appID)
+ }
+
+ return EvalError{err, details, cx.runMode == ModeSig}
+}
+
+type evalState struct {
+ Scratch []any `json:"scratch,omitempty"`
+ Stack []any `json:"stack,omitempty"`
+ Logs [][]byte `json:"logs,omitempty"`
+}
+
+func (cx *EvalContext) evalStates() []evalState {
+ states := make([]evalState, cx.groupIndex+1)
+ for i := 0; i <= cx.groupIndex; i++ {
+ var scratch []stackValue
+ if cx.pastScratch[i] != nil {
+ scratch = (*cx.pastScratch[i])[:]
+ }
+ lastNonZero := -1
+ scratchAsAny := make([]any, len(scratch))
+ for s, sv := range scratch {
+ if !sv.isEmpty() {
+ lastNonZero = s
+ }
+ scratchAsAny[s] = sv.asAny()
+ }
+ if lastNonZero == -1 {
+ scratchAsAny = nil
+ } else {
+ scratchAsAny = scratchAsAny[:lastNonZero+1]
+ }
+
+ // Only the current program's stack is still available. So perhaps it
+ // should be located outside of the evalState, with the PC.
+ var stack []any
+ if cx.groupIndex == i {
+ stack = convertSlice(cx.Stack, func(sv stackValue) any {
+ return sv.asAny()
+ })
+ }
+
+ states[i] = evalState{
+ Scratch: scratchAsAny,
+ Stack: stack,
+ Logs: convertSlice(cx.TxnGroup[i].EvalDelta.Logs, func(s string) []byte { return []byte(s) }),
+ }
+ }
+ return states
+}
+
+func convertSlice[X any, Y any](input []X, fn func(X) Y) []Y {
+ if input == nil {
+ return nil
+ }
+ output := make([]Y, len(input))
+ for i := range input {
+ output[i] = fn(input[i])
+ }
+ return output
+}
+
// EvalContract executes stateful program as the gi'th transaction in params
func EvalContract(program []byte, gi int, aid basics.AppIndex, params *EvalParams) (bool, *EvalContext, error) {
if params.Ledger == nil {
@@ -1013,6 +1114,10 @@ func EvalContract(program []byte, gi int, aid basics.AppIndex, params *EvalParam
txn: &params.TxnGroup[gi],
appID: aid,
}
+ // Save scratch for `gload`. We used to copy, but cx.scratch is quite large,
+ // about 8k, and caused measurable CPU and memory demands. Of course, these
+ // should never be changed by later transactions.
+ cx.pastScratch[cx.groupIndex] = &cx.Scratch
if cx.Proto.IsolateClearState && cx.txn.Txn.OnCompletion == transactions.ClearStateOC {
if cx.PooledApplicationBudget != nil && *cx.PooledApplicationBudget < cx.Proto.MaxAppProgramCost {
@@ -1070,7 +1175,13 @@ func EvalContract(program []byte, gi int, aid basics.AppIndex, params *EvalParam
if used > cx.ioBudget {
err = fmt.Errorf("box read budget (%d) exceeded", cx.ioBudget)
if !cx.Proto.EnableBareBudgetError {
- err = EvalError{err, "", gi, false}
+ // We return an EvalError here because we used to do
+ // that. It is wrong, and means that there could be a
+ // ClearState call in an old block that failed on read
+ // quota, but we allowed to execute anyway. If testnet and
+ // mainnet have no such transactions, we can remove
+ // EnableBareBudgetError and this code.
+ err = EvalError{err, "", false}
}
return false, nil, err
}
@@ -1084,20 +1195,13 @@ func EvalContract(program []byte, gi int, aid basics.AppIndex, params *EvalParam
}
pass, err := eval(program, &cx)
if err != nil {
- pc, det := cx.pcDetails()
- details := fmt.Sprintf("pc=%d, opcodes=%s", pc, det)
- err = EvalError{err, details, gi, false}
+ err = cx.evalError(err)
}
if cx.Trace != nil && cx.caller != nil {
fmt.Fprintf(cx.Trace, "--- exit %d accept=%t\n", aid, pass)
}
- // Save scratch for `gload`. We used to copy, but cx.scratch is quite large,
- // about 8k, and caused measurable CPU and memory demands. Of course, these
- // should never be changed by later transactions.
- cx.pastScratch[cx.groupIndex] = &cx.Scratch
-
return pass, &cx, err
}
@@ -1123,12 +1227,15 @@ func EvalSignatureFull(gi int, params *EvalParams) (bool, *EvalContext, error) {
groupIndex: gi,
txn: &params.TxnGroup[gi],
}
+ // Save scratch. `gload*` opcodes are not currently allowed in ModeSig
+ // (though it seems we could allow them, with access to LogicSig scratch
+ // values). But error returns and potentially debug code might like to
+ // return them.
+ cx.pastScratch[cx.groupIndex] = &cx.Scratch
pass, err := eval(cx.txn.Lsig.Logic, &cx)
if err != nil {
- pc, det := cx.pcDetails()
- details := fmt.Sprintf("pc=%d, opcodes=%s", pc, det)
- err = EvalError{err, details, gi, true}
+ err = cx.evalError(err)
}
return pass, &cx, err
@@ -5539,7 +5646,7 @@ func opItxnSubmit(cx *EvalContext) (err error) {
}
if err != nil {
- return err
+ return basics.Wrap(err, fmt.Sprintf("inner tx %d failed: %s", i, err.Error()), "inner")
}
// This is mostly a no-op, because Perform does its work "in-place", but
diff --git a/data/transactions/logic/evalAppTxn_test.go b/data/transactions/logic/evalAppTxn_test.go
index 4682732fb..9a6d0ebc4 100644
--- a/data/transactions/logic/evalAppTxn_test.go
+++ b/data/transactions/logic/evalAppTxn_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -2006,7 +2006,7 @@ int 1
ledger.NewApp(parentTx.Receiver, parentAppID, basics.AppParams{})
ledger.NewAccount(parentAppID.Address(), 50_000)
- parentEd := TestApp(t, parentSource, ep)
+ parentEd, _ := TestApp(t, parentSource, ep)
require.Len(t, parentEd.Logs, 2)
require.Len(t, parentEd.InnerTxns, 2)
@@ -2334,7 +2334,7 @@ int 1
ledger.NewApp(parentTx.Receiver, parentAppID, basics.AppParams{})
ledger.NewAccount(parentAppID.Address(), 50_000)
- parentEd := TestApp(t, parentSource, ep)
+ parentEd, _ := TestApp(t, parentSource, ep)
require.Len(t, parentEd.Logs, 2)
require.Len(t, parentEd.InnerTxns, 2)
diff --git a/data/transactions/logic/evalBench_test.go b/data/transactions/logic/evalBench_test.go
index b9f61f0fa..c9c748833 100644
--- a/data/transactions/logic/evalBench_test.go
+++ b/data/transactions/logic/evalBench_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/evalStateful_test.go b/data/transactions/logic/evalStateful_test.go
index d25851be0..91ad91d1f 100644
--- a/data/transactions/logic/evalStateful_test.go
+++ b/data/transactions/logic/evalStateful_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -422,7 +422,7 @@ func TestBalance(t *testing.T) {
}
func testApps(t *testing.T, programs []string, txgroup []transactions.SignedTxn, opt protoOpt, ledger *Ledger,
- expected ...expect) *EvalParams {
+ expected ...expect) (*EvalParams, error) {
t.Helper()
proto := makeTestProto(opt)
codes := make([][]byte, len(programs))
@@ -447,11 +447,10 @@ func testApps(t *testing.T, programs []string, txgroup []transactions.SignedTxn,
ledger.Reset()
ep.Ledger = ledger
ep.SigLedger = ledger
- testAppsBytes(t, codes, ep, expected...)
- return ep
+ return ep, testAppsBytes(t, codes, ep, expected...)
}
-func testAppsBytes(t *testing.T, programs [][]byte, ep *EvalParams, expected ...expect) {
+func testAppsBytes(t *testing.T, programs [][]byte, ep *EvalParams, expected ...expect) error {
t.Helper()
require.LessOrEqual(t, len(programs), len(ep.TxnGroup))
for i := range ep.TxnGroup {
@@ -465,20 +464,21 @@ func testAppsBytes(t *testing.T, programs [][]byte, ep *EvalParams, expected ...
appID = basics.AppIndex(888)
}
if len(expected) > 0 && expected[0].l == i {
- testAppFull(t, program, i, appID, ep, expected[0].s)
- break // Stop after first failure
- } else {
- testAppFull(t, program, i, appID, ep)
+ // Stop after first failure
+ _, err := testAppFull(t, program, i, appID, ep, expected[0].s)
+ return err
}
+ testAppFull(t, program, i, appID, ep)
} else {
if len(expected) > 0 && expected[0].l == i {
require.Failf(t, "testAppsBytes used incorrectly.", "No error can happen in txn %d. Not an app.", i)
}
}
}
+ return nil
}
-func testApp(t *testing.T, program string, ep *EvalParams, problems ...string) transactions.EvalDelta {
+func testApp(t *testing.T, program string, ep *EvalParams, problems ...string) (transactions.EvalDelta, error) {
t.Helper()
if ep == nil {
ep = defaultAppParamsWithVersion(LogicVersion)
@@ -487,7 +487,7 @@ func testApp(t *testing.T, program string, ep *EvalParams, problems ...string) t
return testAppBytes(t, ops.Program, ep, problems...)
}
-func testAppBytes(t *testing.T, program []byte, ep *EvalParams, problems ...string) transactions.EvalDelta {
+func testAppBytes(t *testing.T, program []byte, ep *EvalParams, problems ...string) (transactions.EvalDelta, error) {
t.Helper()
if ep == nil {
ep = defaultAppParamsWithVersion(LogicVersion)
@@ -505,7 +505,7 @@ func testAppBytes(t *testing.T, program []byte, ep *EvalParams, problems ...stri
// ep.reset() is in testAppBytes, not here. This means that ADs in the ep are
// not cleared, so repeated use of a single ep is probably not a good idea
// unless you are *intending* to see how ep is modified as you go.
-func testAppFull(t *testing.T, program []byte, gi int, aid basics.AppIndex, ep *EvalParams, problems ...string) transactions.EvalDelta {
+func testAppFull(t *testing.T, program []byte, gi int, aid basics.AppIndex, ep *EvalParams, problems ...string) (transactions.EvalDelta, error) {
t.Helper()
var checkProblem string
@@ -545,7 +545,7 @@ func testAppFull(t *testing.T, program []byte, gi int, aid basics.AppIndex, ep *
if evalProblem == "" {
require.NoError(t, err, "Eval\n%sExpected: PASS", ep.Trace)
require.True(t, pass, "Eval\n%sExpected: PASS", ep.Trace)
- return delta
+ return delta, nil
}
// There is an evalProblem to check. REJECT is special and only means that
@@ -555,7 +555,7 @@ func testAppFull(t *testing.T, program []byte, gi int, aid basics.AppIndex, ep *
} else {
require.ErrorContains(t, err, evalProblem, "Wrong error in EvalContract %v", ep.Trace)
}
- return delta
+ return delta, err
}
// testLogicRange allows for running tests against a range of avm
@@ -819,6 +819,122 @@ int 0
testApp(t, text, now)
}
+// TestAppErrorDetails confirms that the error returned from app failures
+// has the right structured information.
+func TestAppErrorDetails(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ badsource := notrack(`
+byte 0x04040004; log // log
+int 5; store 10 // store an int
+byte 0x01020300; store 15 // store a bytes
+
+int 100; byte 0x0201; == // types mismatch so this will fail
+`)
+ _, err := testApp(t, badsource, nil, "cannot compare")
+ attrs := basics.Attributes(err)
+ zeros := [256]int{}
+ scratch := convertSlice(zeros[:], func(i int) any { return uint64(i) })
+ scratch[10] = uint64(5)
+ scratch[15] = []byte{0x01, 0x02, 0x03, 0x00}
+ require.Equal(t, map[string]any{
+ "pc": 26,
+ "group-index": 0,
+ "app-index": basics.AppIndex(888),
+ "eval-states": []evalState{
+ {
+ Logs: [][]byte{{0x04, 0x04, 0x00, 0x04}},
+ Stack: []any{uint64(100), []byte{02, 01}},
+ Scratch: scratch[:16],
+ },
+ },
+ }, attrs)
+
+ goodsource := `
+byte 0x04040104; log // log
+byte 0x04040204; log // log
+
+int 4; store 2 // store an int
+byte "jj"; store 3 // store a bytes
+int 1
+`
+ gscratch := convertSlice(zeros[:], func(i int) any { return uint64(i) })
+ gscratch[2] = uint64(4)
+ gscratch[3] = []byte("jj")
+
+ _, err = testApps(t, []string{goodsource, badsource}, nil, nil, nil, exp(1, "cannot compare"))
+ attrs = basics.Attributes(err)
+ require.Equal(t, map[string]any{
+ "pc": 26,
+ "group-index": 1,
+ "app-index": basics.AppIndex(888),
+ "eval-states": []evalState{
+ {
+ Logs: [][]byte{
+ {0x04, 0x04, 0x01, 0x04},
+ {0x04, 0x04, 0x02, 0x04},
+ },
+ Scratch: gscratch[:4],
+ },
+ {
+ Logs: [][]byte{{0x04, 0x04, 0x00, 0x04}},
+ Stack: []any{uint64(100), []byte{02, 01}},
+ Scratch: scratch[:16],
+ },
+ },
+ }, attrs)
+
+ _, _, ledger := makeSampleEnv()
+ ledger.NewAccount(appAddr(888), 100_000)
+ bad := testProg(t, badsource, 5)
+ innerFailSource := `
+int 777
+itxn_begin
+int appl; itxn_field TypeEnum
+byte 0x` + hex.EncodeToString(bad.Program) + ` // run the bad program by trying to create it
+itxn_field ApprovalProgram
+
+byte 0x05
+itxn_field ClearStateProgram
+
+itxn_submit
+`
+ _, err = testApps(t, []string{goodsource, innerFailSource}, nil, nil, ledger, exp(1, "inner tx 0 failed"))
+ attrs = basics.Attributes(err)
+ require.Equal(t, map[string]any{
+ "pc": 45,
+ "group-index": 1,
+ "app-index": basics.AppIndex(888),
+ "eval-states": []evalState{
+ {
+ Logs: [][]byte{
+ {0x04, 0x04, 0x01, 0x04},
+ {0x04, 0x04, 0x02, 0x04},
+ },
+ Scratch: gscratch[:4],
+ },
+ {
+ Stack: []any{uint64(777)},
+ },
+ },
+ "inner-msg": "logic eval error: cannot compare (uint64 to []byte). Details: app=5000, pc=26, opcodes=pushint 100; pushbytes 0x0201 // 0x0201; ==",
+ "inner-attrs": map[string]any{
+ "pc": 26,
+ "group-index": 0,
+ "app-index": basics.AppIndex(firstTestID),
+ "eval-states": []evalState{
+ {
+ Logs: [][]byte{{0x04, 0x04, 0x00, 0x04}},
+ Stack: []any{uint64(100), []byte{02, 01}},
+ Scratch: scratch[:16],
+ },
+ },
+ },
+ }, attrs)
+
+}
+
func TestAppReadGlobalState(t *testing.T) {
partitiontest.PartitionTest(t)
t.Parallel()
@@ -1493,7 +1609,7 @@ func TestGlobalNonDelete(t *testing.T) {
testLogicRange(t, 2, 0, func(t *testing.T, ep *EvalParams, txn *transactions.Transaction, ledger *Ledger) {
source := `byte "none"; app_global_del; int 1`
ledger.NewApp(txn.Sender, 888, makeApp(0, 0, 1, 0))
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
})
@@ -1509,7 +1625,7 @@ func TestLocalNonDelete(t *testing.T) {
ledger.NewAccount(txn.Sender, 100000)
ledger.NewApp(txn.Sender, 888, makeApp(0, 0, 1, 0))
ledger.NewLocals(txn.Sender, 888)
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
})
@@ -1660,7 +1776,7 @@ int 0x77
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Len(t, delta.LocalDeltas, 1)
@@ -1698,7 +1814,7 @@ int 0x77
algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77}
ledger.NewLocal(txn.Sender, 100, "ALGO", algoValue)
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
@@ -1730,7 +1846,7 @@ exist2:
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
@@ -1748,7 +1864,7 @@ int 1
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Len(t, delta.LocalDeltas, 1)
require.Len(t, delta.LocalDeltas[0], 1)
@@ -1778,7 +1894,7 @@ int 0x78
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Len(t, delta.LocalDeltas, 1)
require.Len(t, delta.LocalDeltas[0], 1)
@@ -1806,7 +1922,7 @@ app_local_put
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Len(t, delta.LocalDeltas, 1)
require.Len(t, delta.LocalDeltas[0], 1)
@@ -1844,7 +1960,7 @@ int 1
source = strings.ReplaceAll(source, "txn Sender", "int 0")
source = strings.ReplaceAll(source, "txn Accounts 1", "int 1")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Len(t, delta.LocalDeltas, 2)
require.Len(t, delta.LocalDeltas[0], 2)
@@ -1875,12 +1991,12 @@ func TestAppLocalGlobalErrorCases(t *testing.T) {
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
sender = "int 0;"
}
- testApp(t, fmt.Sprintf(`byte "%v"; int 1;`+g+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen+1)), ep, "key too long")
+ testApp(t, notrack(fmt.Sprintf(`byte "%v"; int 1;`+g+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen+1))), ep, "key too long")
testApp(t, fmt.Sprintf(`byte "%v"; int 1;`+g+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen)), ep)
ledger.NewLocals(tx.Sender, 888)
- testApp(t, fmt.Sprintf(sender+`byte "%v"; int 1;`+l+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen+1)), ep, "key too long")
+ testApp(t, notrack(fmt.Sprintf(sender+`byte "%v"; int 1;`+l+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen+1))), ep, "key too long")
testApp(t, fmt.Sprintf(sender+`byte "%v"; int 1;`+l+`int 1`, strings.Repeat("v", ep.Proto.MaxAppKeyLen)), ep)
@@ -1934,7 +2050,7 @@ int 0x77
ledger.Reset()
- delta := testAppBytes(t, ops.Program, ep)
+ delta, _ := testAppBytes(t, ops.Program, ep)
require.Empty(t, delta.LocalDeltas)
}
})
@@ -2023,7 +2139,7 @@ int 0x77
}
source = strings.ReplaceAll(source, "THISAPP", "int 100")
}
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 2)
require.Empty(t, delta.LocalDeltas)
@@ -2052,7 +2168,7 @@ int 0x77
algoValue := basics.TealValue{Type: basics.TealUintType, Uint: 0x77}
ledger.NewGlobal(100, "ALGO", algoValue)
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
@@ -2076,7 +2192,7 @@ int 0x77
ledger.NoGlobal(100, "ALGOA")
ledger.NewGlobal(100, "ALGO", algoValue)
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
@@ -2116,7 +2232,7 @@ byte "ALGO"
ledger.NoGlobal(100, "ALGOA")
ledger.NewGlobal(100, "ALGO", algoValue)
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 2)
require.Empty(t, delta.LocalDeltas)
@@ -2172,7 +2288,7 @@ byte "myval"
ledger.NewAccount(txn.Sender, 1)
ledger.NewApp(txn.Sender, 100, basics.AppParams{})
- delta := testApp(t, source, ep, "no app 101")
+ delta, _ := testApp(t, source, ep, "no app 101")
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
@@ -2181,7 +2297,7 @@ byte "myval"
algoValue := basics.TealValue{Type: basics.TealBytesType, Bytes: "myval"}
ledger.NewGlobal(101, "mykey", algoValue)
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Empty(t, delta.GlobalDelta)
require.Empty(t, delta.LocalDeltas)
})
@@ -2214,7 +2330,7 @@ int 7
ledger.NewAccount(txn.Sender, 1)
ledger.NewApp(txn.Sender, 100, basics.AppParams{})
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Empty(t, delta.LocalDeltas)
})
}
@@ -2256,7 +2372,7 @@ int 1
txn.ApplicationID = 100
ledger.NewApp(txn.Sender, 100, basics.AppParams{})
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 2)
require.Empty(t, delta.LocalDeltas)
@@ -2287,7 +2403,7 @@ app_global_get_ex
source = strings.ReplaceAll(source, "THISAPP", "int 100")
}
txn.ForeignApps = []basics.AppIndex{txn.ApplicationID}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 1)
vd := delta.GlobalDelta["ALGO"]
require.Equal(t, basics.DeleteAction, vd.Action)
@@ -2312,7 +2428,7 @@ byte "ALGOA"
int 0x78
app_global_put
`
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 1)
vd = delta.GlobalDelta["ALGOA"]
require.Equal(t, basics.SetUintAction, vd.Action)
@@ -2334,7 +2450,7 @@ int 0x78
app_global_put
int 1
`
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 1)
vd = delta.GlobalDelta["ALGO"]
require.Equal(t, basics.SetUintAction, vd.Action)
@@ -2357,7 +2473,7 @@ byte "ALGO"
app_global_del
int 1
`
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 1)
vd = delta.GlobalDelta["ALGO"]
require.Equal(t, basics.DeleteAction, vd.Action)
@@ -2380,7 +2496,7 @@ byte "ALGOA"
app_global_del
int 1
`
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, delta.GlobalDelta, 1)
require.Len(t, delta.LocalDeltas, 0)
})
@@ -2433,7 +2549,7 @@ int 1
ep.Trace = &strings.Builder{}
- delta := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 2, len(delta.LocalDeltas))
ledger.Reset()
@@ -2442,7 +2558,7 @@ int 1
// test that app_local_put and _app_local_del can use byte addresses
withBytes := strings.ReplaceAll(source, "int 0 // sender", "txn Sender")
withBytes = strings.ReplaceAll(withBytes, "int 1 // other", "txn Accounts 1")
- delta := testApp(t, withBytes, ep)
+ delta, _ := testApp(t, withBytes, ep)
// But won't even compile in old teal
testProg(t, withBytes, directRefEnabledVersion-1,
exp(4, "app_local_put arg 0 wanted..."), exp(11, "app_local_del arg 0 wanted..."))
@@ -2473,7 +2589,7 @@ app_local_get_ex
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 1, len(delta.LocalDeltas))
vd := delta.LocalDeltas[0]["ALGO"]
@@ -2504,7 +2620,7 @@ app_local_put
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 1, len(delta.LocalDeltas))
vd = delta.LocalDeltas[0]["ALGOA"]
@@ -2531,7 +2647,7 @@ int 1
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 1, len(delta.LocalDeltas))
vd = delta.LocalDeltas[0]["ALGO"]
@@ -2561,7 +2677,7 @@ int 1
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 1, len(delta.LocalDeltas))
vd = delta.LocalDeltas[0]["ALGO"]
@@ -2591,7 +2707,7 @@ int 1
if ep.Proto.LogicSigVersion < directRefEnabledVersion {
source = strings.ReplaceAll(source, "txn Sender", "int 0")
}
- delta = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Equal(t, 0, len(delta.GlobalDelta))
require.Equal(t, 1, len(delta.LocalDeltas))
require.Equal(t, 1, len(delta.LocalDeltas[0]))
@@ -3098,6 +3214,7 @@ func TestReturnTypes(t *testing.T) {
"err": true,
"return": true,
+ // panics unless the pk is proper
"ecdsa_pk_decompress": true,
"frame_dig": true, // would need a "proto" subroutine
@@ -3326,7 +3443,7 @@ func TestLog(t *testing.T) {
//track expected number of logs in cx.EvalDelta.Logs
for i, s := range testCases {
- delta := testApp(t, s.source, ep)
+ delta, _ := testApp(t, s.source, ep)
require.Len(t, delta.Logs, s.loglen)
if i == len(testCases)-1 {
require.Equal(t, strings.Repeat("a", maxLogSize), delta.Logs[0])
@@ -3651,7 +3768,7 @@ int 43
app_local_put
int 1
`
- ed := testApp(t, source, ep)
+ delta, _ := testApp(t, source, ep)
require.Len(t, tx.Accounts, 1) // Sender + 1 tx.Accounts means LocalDelta index should be 2
require.Equal(t, map[uint64]basics.StateDelta{
1: {
@@ -3666,8 +3783,8 @@ int 1
Uint: 42,
},
},
- }, ed.LocalDeltas)
- require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, ed.SharedAccts)
+ }, delta.LocalDeltas)
+ require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, delta.SharedAccts)
/* Confirm it worked. */
source = `
@@ -3693,7 +3810,7 @@ int 7
app_local_put
int 1
`
- ed = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, tx.Accounts, 1) // Sender + 1 tx.Accounts means LocalDelta index should be 2
require.Equal(t, map[uint64]basics.StateDelta{
1: {
@@ -3707,8 +3824,8 @@ int 1
Action: basics.DeleteAction,
},
},
- }, ed.LocalDeltas)
- require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, ed.SharedAccts)
+ }, delta.LocalDeltas)
+ require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, delta.SharedAccts)
// Now, repeat the "put" test with multiple keys, to ensure only one
// address is added to SharedAccts and we'll modify the Sender too, to
@@ -3732,7 +3849,7 @@ int 21
app_local_put
int 1
`
- ed = testApp(t, source, ep)
+ delta, _ = testApp(t, source, ep)
require.Len(t, tx.Accounts, 1) // Sender + 1 tx.Accounts means LocalDelta index should be 2
require.Equal(t, map[uint64]basics.StateDelta{
0: {
@@ -3751,9 +3868,9 @@ int 1
Uint: 21,
},
},
- }, ed.LocalDeltas)
+ }, delta.LocalDeltas)
- require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, ed.SharedAccts)
+ require.Equal(t, []basics.Address{tx.ApplicationID.Address()}, delta.SharedAccts)
})
}
diff --git a/data/transactions/logic/eval_test.go b/data/transactions/logic/eval_test.go
index 05e578601..3ede2c134 100644
--- a/data/transactions/logic/eval_test.go
+++ b/data/transactions/logic/eval_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -217,7 +217,7 @@ func (ep *EvalParams) reset() {
inners := ep.Proto.MaxTxGroupSize * ep.Proto.MaxInnerTransactions
ep.pooledAllowedInners = &inners
}
- ep.pastScratch = make([]*scratchSpace, len(ep.TxnGroup))
+ ep.pastScratch = [maxTxGroupSize]*scratchSpace{}
for i := range ep.TxnGroup {
ep.TxnGroup[i].ApplyData = transactions.ApplyData{}
}
@@ -2182,7 +2182,7 @@ func testLogicBytes(t *testing.T, program []byte, ep *EvalParams, problems ...st
}
// testLogicFull is the lowest-level so it does not create an ep or reset it.
-func testLogicFull(t *testing.T, program []byte, gi int, ep *EvalParams, problems ...string) {
+func testLogicFull(t *testing.T, program []byte, gi int, ep *EvalParams, problems ...string) error {
t.Helper()
var checkProblem string
@@ -2217,7 +2217,7 @@ func testLogicFull(t *testing.T, program []byte, gi int, ep *EvalParams, problem
if evalProblem == "" {
require.NoError(t, err, "Eval\n%sExpected: PASS", ep.Trace)
assert.True(t, pass, "Eval\n%sExpected: PASS", ep.Trace)
- return
+ return nil
}
// There is an evalProblem to check. REJECT is special and only means that
@@ -2227,9 +2227,10 @@ func testLogicFull(t *testing.T, program []byte, gi int, ep *EvalParams, problem
} else {
require.ErrorContains(t, err, evalProblem, "Wrong error in EvalSignature %v", ep.Trace)
}
+ return err
}
-func testLogics(t *testing.T, programs []string, txgroup []transactions.SignedTxn, opt protoOpt, expected ...expect) *EvalParams {
+func testLogics(t *testing.T, programs []string, txgroup []transactions.SignedTxn, opt protoOpt, expected ...expect) error {
t.Helper()
proto := makeTestProto(opt)
@@ -2248,10 +2249,14 @@ func testLogics(t *testing.T, programs []string, txgroup []transactions.SignedTx
ep := NewSigEvalParams(txgroup, proto, &NoHeaderLedger{})
for i, program := range programs {
if program != "" {
+ if len(expected) > 0 && expected[0].l == i {
+ // Stop after first failure
+ return testLogicFull(t, txgroup[i].Lsig.Logic, i, ep, expected[0].s)
+ }
testLogicFull(t, txgroup[i].Lsig.Logic, i, ep)
}
}
- return ep
+ return nil
}
func TestTxna(t *testing.T) {
@@ -2571,12 +2576,11 @@ substring3
len`, 2)
// fails at runtime
- err := testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 4
int 0xFFFFFFFFFFFFFFFE
substring3
-len`, 2)
- require.Contains(t, err.Error(), "substring range beyond length of string")
+len`, 2, "substring range beyond length of string")
}
func TestSubstringRange(t *testing.T) {
@@ -2629,44 +2633,37 @@ func TestExtractFlop(t *testing.T) {
len`, 5, exp(4, "extract3 expects 0 immediate arguments"))
// fails at runtime
- err := testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
extract 1 8
- len`, 5)
- require.Contains(t, err.Error(), "extraction end 9")
+ len`, 5, "extraction end 9")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
extract 9 0
- len`, 5)
- require.Contains(t, err.Error(), "extraction start 9")
+ len`, 5, "extraction start 9")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 4
int 0xFFFFFFFFFFFFFFFE
extract3
- len`, 5)
- require.Contains(t, err.Error(), "extraction end exceeds uint64")
+ len`, 5, "extraction end exceeds uint64")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 100
int 2
extract3
- len`, 5)
- require.Contains(t, err.Error(), "extraction start 100")
+ len`, 5, "extraction start 100")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 55
- extract_uint16`, 5)
- require.Contains(t, err.Error(), "extraction start 55")
+ extract_uint16`, 5, "extraction start 55")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 9
- extract_uint32`, 5)
- require.Contains(t, err.Error(), "extraction start 9")
+ extract_uint32`, 5, "extraction start 9")
- err = testPanics(t, `byte 0xf000000000000000
+ testPanics(t, `byte 0xf000000000000000
int 1
- extract_uint64`, 5)
- require.Contains(t, err.Error(), "extraction end 9")
+ extract_uint64`, 5, "extraction end 9")
}
func TestReplace(t *testing.T) {
@@ -2752,8 +2749,8 @@ loads
func TestLoadStore2(t *testing.T) {
partitiontest.PartitionTest(t)
-
t.Parallel()
+
progText := `int 2
int 3
byte 0xaa
@@ -2768,6 +2765,61 @@ int 5
testAccepts(t, progText, 1)
}
+// TestLogicErrorDetails confirms that the error returned from logicsig failures
+// has the right structured information.
+func TestLogicErrorDetails(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ badsource := notrack(`
+int 5; store 10 // store an int
+byte 0x01020300; store 15 // store a bytes
+
+int 100; byte 0x0201; == // types mismatch so this will fail
+`)
+ err := testPanics(t, badsource, 1, "cannot compare")
+ attrs := basics.Attributes(err)
+ zeros := [256]int{}
+ scratch := convertSlice(zeros[:], func(i int) any { return uint64(i) })
+ scratch[10] = uint64(5)
+ scratch[15] = []byte{0x01, 0x02, 0x03, 0x00}
+ require.Equal(t, map[string]any{
+ "pc": 19,
+ "group-index": 0,
+ "eval-states": []evalState{
+ {
+ Stack: []any{uint64(100), []byte{02, 01}},
+ Scratch: scratch[:16],
+ },
+ },
+ }, attrs)
+
+ goodsource := `
+int 4; store 2 // store an int
+byte "jj"; store 3 // store a bytes
+int 1
+`
+ gscratch := convertSlice(zeros[:], func(i int) any { return uint64(i) })
+ gscratch[2] = uint64(4)
+ gscratch[3] = []byte("jj")
+
+ err = testLogics(t, []string{goodsource, badsource}, nil, nil, exp(1, "cannot compare"))
+ attrs = basics.Attributes(err)
+ require.Equal(t, map[string]any{
+ "pc": 19,
+ "group-index": 1,
+ "eval-states": []evalState{
+ {
+ Scratch: gscratch[:4],
+ },
+ {
+ Stack: []any{uint64(100), []byte{02, 01}},
+ Scratch: scratch[:16],
+ },
+ },
+ }, attrs)
+}
+
func TestGload(t *testing.T) {
partitiontest.PartitionTest(t)
t.Parallel()
@@ -4563,7 +4615,11 @@ func testEvaluation(t *testing.T, program string, introduced uint64, tester eval
require.True(t, ok)
isNotPanic(t, err) // Never want a Go level panic.
if err != nil {
- // Use wisely. This could probably return any of the concurrent runs' errors.
+ // Use `outer` wisely. It could return any of the concurrent runs' errors.
+ var se *basics.SError
+ require.ErrorAs(t, err, &se)
+ var ee EvalError
+ require.ErrorAs(t, err, &ee)
outer = err
}
})
@@ -5042,8 +5098,8 @@ func TestBytesMath(t *testing.T) {
testAccepts(t, "byte 0xffffff; bsqrt; len; int 2; ==; return", 6)
// 64 byte long inputs are accepted, even if they produce longer outputs
testAccepts(t, fmt.Sprintf("byte 0x%s; bsqrt; len; int 32; ==", effs), 6)
- // 65 byte inputs are not ok.
- testPanics(t, fmt.Sprintf("byte 0x%s00; bsqrt; pop; int 1", effs), 6)
+ // 65 byte inputs are not ok (no track allows assembly)
+ testPanics(t, notrack(fmt.Sprintf("byte 0x%s00; bsqrt; pop; int 1", effs)), 6)
}
func TestBytesCompare(t *testing.T) {
@@ -5278,9 +5334,7 @@ By Herman Melville`, "",
if LogicVersion < fidoVersion {
testProg(t, source, AssemblerMaxVersion, exp(0, "unknown opcode..."))
} else {
- err := testPanics(t, source, fidoVersion)
- require.Error(t, err)
- require.Contains(t, err.Error(), tc.error)
+ testPanics(t, source, fidoVersion, tc.error)
}
}
}
@@ -6122,9 +6176,17 @@ int 1
func TestNoHeaderLedger(t *testing.T) {
partitiontest.PartitionTest(t)
+ t.Parallel()
nhl := NoHeaderLedger{}
_, err := nhl.BlockHdr(1)
require.Error(t, err)
require.Equal(t, err, fmt.Errorf("no block header access"))
}
+
+func TestMaxTxGroup(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ require.Equal(t, config.MaxTxGroupSize, maxTxGroupSize)
+}
diff --git a/data/transactions/logic/export_test.go b/data/transactions/logic/export_test.go
index 34ae9d945..ed250acd8 100644
--- a/data/transactions/logic/export_test.go
+++ b/data/transactions/logic/export_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -60,7 +60,7 @@ var WithPanicOpcode = withPanicOpcode
// TryApps exports "testApps" while accepting a simple uint64. Annoying, we
// can't export call this "TestApps" because it looks like a Test function with
// the wrong signature. But we can get that effect with the alias below.
-func TryApps(t *testing.T, programs []string, txgroup []transactions.SignedTxn, ver uint64, ledger *Ledger, expected ...expect) *EvalParams {
+func TryApps(t *testing.T, programs []string, txgroup []transactions.SignedTxn, ver uint64, ledger *Ledger, expected ...expect) (*EvalParams, error) {
return testApps(t, programs, txgroup, protoVer(ver), ledger, expected...)
}
diff --git a/data/transactions/logic/fields.go b/data/transactions/logic/fields.go
index 060516d65..a2f971f7b 100644
--- a/data/transactions/logic/fields.go
+++ b/data/transactions/logic/fields.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/fields_test.go b/data/transactions/logic/fields_test.go
index 2fd432956..7cec0b936 100644
--- a/data/transactions/logic/fields_test.go
+++ b/data/transactions/logic/fields_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/frames.go b/data/transactions/logic/frames.go
index 07a8bf665..25fe68d29 100644
--- a/data/transactions/logic/frames.go
+++ b/data/transactions/logic/frames.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/frames_test.go b/data/transactions/logic/frames_test.go
index 63ff1c21c..80ce57544 100644
--- a/data/transactions/logic/frames_test.go
+++ b/data/transactions/logic/frames_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/jsonspec_test.go b/data/transactions/logic/jsonspec_test.go
index a2bfcfff2..87a445138 100644
--- a/data/transactions/logic/jsonspec_test.go
+++ b/data/transactions/logic/jsonspec_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/langspec_v1.json b/data/transactions/logic/langspec_v1.json
index 6839e4092..5fd347507 100644
--- a/data/transactions/logic/langspec_v1.json
+++ b/data/transactions/logic/langspec_v1.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -463,7 +436,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
diff --git a/data/transactions/logic/langspec_v10.json b/data/transactions/logic/langspec_v10.json
index d971b2715..f59103f0f 100644
--- a/data/transactions/logic/langspec_v10.json
+++ b/data/transactions/logic/langspec_v10.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -241,11 +214,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -278,8 +251,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -562,7 +535,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2594,7 +2567,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2614,7 +2587,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2633,7 +2606,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2652,7 +2625,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2672,7 +2645,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2688,7 +2661,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2704,7 +2677,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2719,7 +2692,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -3292,10 +3265,10 @@
"Opcode": 150,
"Name": "bsqrt",
"Args": [
- "[]byte"
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "40",
@@ -3332,7 +3305,7 @@
"[]byte"
],
"Returns": [
- "[]byte"
+ "[32]byte"
],
"Size": 1,
"DocCost": "130",
@@ -3526,11 +3499,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
@@ -4590,7 +4563,7 @@
"[32]byte"
],
"Returns": [
- "[]byte",
+ "[64]byte",
"bool"
],
"Size": 2,
diff --git a/data/transactions/logic/langspec_v2.json b/data/transactions/logic/langspec_v2.json
index a832f8664..24f9ad97f 100644
--- a/data/transactions/logic/langspec_v2.json
+++ b/data/transactions/logic/langspec_v2.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -463,7 +436,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -1533,7 +1506,7 @@
"Name": "app_local_get",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -1553,7 +1526,7 @@
"Args": [
"uint64",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -1572,7 +1545,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -1591,7 +1564,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -1611,7 +1584,7 @@
"Name": "app_local_put",
"Args": [
"uint64",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -1627,7 +1600,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -1643,7 +1616,7 @@
"Name": "app_local_del",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -1658,7 +1631,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
diff --git a/data/transactions/logic/langspec_v3.json b/data/transactions/logic/langspec_v3.json
index f1566b528..085084359 100644
--- a/data/transactions/logic/langspec_v3.json
+++ b/data/transactions/logic/langspec_v3.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -463,7 +436,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -1910,7 +1883,7 @@
"Name": "app_local_get",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -1930,7 +1903,7 @@
"Args": [
"uint64",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -1949,7 +1922,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -1968,7 +1941,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -1988,7 +1961,7 @@
"Name": "app_local_put",
"Args": [
"uint64",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2004,7 +1977,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2020,7 +1993,7 @@
"Name": "app_local_del",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2035,7 +2008,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
diff --git a/data/transactions/logic/langspec_v4.json b/data/transactions/logic/langspec_v4.json
index 49591c10f..ddbf65187 100644
--- a/data/transactions/logic/langspec_v4.json
+++ b/data/transactions/logic/langspec_v4.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -463,7 +436,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2032,7 +2005,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2052,7 +2025,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2071,7 +2044,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2090,7 +2063,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2110,7 +2083,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2126,7 +2099,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2142,7 +2115,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2157,7 +2130,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2642,11 +2615,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
diff --git a/data/transactions/logic/langspec_v5.json b/data/transactions/logic/langspec_v5.json
index ccde5509f..2cca3941d 100644
--- a/data/transactions/logic/langspec_v5.json
+++ b/data/transactions/logic/langspec_v5.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -240,11 +213,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -276,8 +249,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -559,7 +532,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2350,7 +2323,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2370,7 +2343,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2389,7 +2362,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2408,7 +2381,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2428,7 +2401,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2444,7 +2417,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2460,7 +2433,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2475,7 +2448,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -3011,11 +2984,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
diff --git a/data/transactions/logic/langspec_v6.json b/data/transactions/logic/langspec_v6.json
index 72e1d9c64..6795706db 100644
--- a/data/transactions/logic/langspec_v6.json
+++ b/data/transactions/logic/langspec_v6.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -240,11 +213,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -276,8 +249,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -559,7 +532,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2368,7 +2341,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2388,7 +2361,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2407,7 +2380,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2426,7 +2399,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2446,7 +2419,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2462,7 +2435,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2478,7 +2451,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2493,7 +2466,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2885,10 +2858,10 @@
"Opcode": 150,
"Name": "bsqrt",
"Args": [
- "[]byte"
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "40",
@@ -3102,11 +3075,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
diff --git a/data/transactions/logic/langspec_v7.json b/data/transactions/logic/langspec_v7.json
index 7229ee534..a7b4df95b 100644
--- a/data/transactions/logic/langspec_v7.json
+++ b/data/transactions/logic/langspec_v7.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -241,11 +214,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -278,8 +251,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -562,7 +535,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2528,7 +2501,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2548,7 +2521,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2567,7 +2540,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2586,7 +2559,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2606,7 +2579,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2622,7 +2595,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2638,7 +2611,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2653,7 +2626,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -3064,10 +3037,10 @@
"Opcode": 150,
"Name": "bsqrt",
"Args": [
- "[]byte"
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "40",
@@ -3104,7 +3077,7 @@
"[]byte"
],
"Returns": [
- "[]byte"
+ "[32]byte"
],
"Size": 1,
"DocCost": "130",
@@ -3298,11 +3271,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
@@ -4238,7 +4211,7 @@
"[32]byte"
],
"Returns": [
- "[]byte",
+ "[64]byte",
"bool"
],
"Size": 2,
diff --git a/data/transactions/logic/langspec_v8.json b/data/transactions/logic/langspec_v8.json
index 2f1576864..186f9cdfe 100644
--- a/data/transactions/logic/langspec_v8.json
+++ b/data/transactions/logic/langspec_v8.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -241,11 +214,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -278,8 +251,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -562,7 +535,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2588,7 +2561,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2608,7 +2581,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2627,7 +2600,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2646,7 +2619,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2666,7 +2639,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2682,7 +2655,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2698,7 +2671,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2713,7 +2686,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -3286,10 +3259,10 @@
"Opcode": 150,
"Name": "bsqrt",
"Args": [
- "[]byte"
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "40",
@@ -3326,7 +3299,7 @@
"[]byte"
],
"Returns": [
- "[]byte"
+ "[32]byte"
],
"Size": 1,
"DocCost": "130",
@@ -3520,11 +3493,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
@@ -4584,7 +4557,7 @@
"[32]byte"
],
"Returns": [
- "[]byte",
+ "[64]byte",
"bool"
],
"Size": 2,
diff --git a/data/transactions/logic/langspec_v9.json b/data/transactions/logic/langspec_v9.json
index 3ec2d39af..cab0aa6d9 100644
--- a/data/transactions/logic/langspec_v9.json
+++ b/data/transactions/logic/langspec_v9.json
@@ -3,33 +3,6 @@
"LogicSigVersion": 10,
"NamedTypes": [
{
- "Name": "[32]byte",
- "Abbreviation": "3",
- "Bound": [
- 32,
- 32
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[64]byte",
- "Abbreviation": "6",
- "Bound": [
- 64,
- 64
- ],
- "AVMType": "[]byte"
- },
- {
- "Name": "[80]byte",
- "Abbreviation": "8",
- "Bound": [
- 80,
- 80
- ],
- "AVMType": "[]byte"
- },
- {
"Name": "[]byte",
"Abbreviation": "b",
"Bound": [
@@ -208,10 +181,10 @@
"Name": "ecdsa_verify",
"Args": [
"[32]byte",
- "[]byte",
- "[]byte",
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte",
+ "[32]byte",
+ "[32]byte"
],
"Returns": [
"bool"
@@ -241,11 +214,11 @@
"Opcode": 6,
"Name": "ecdsa_pk_decompress",
"Args": [
- "[]byte"
+ "[33]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -278,8 +251,8 @@
"[32]byte"
],
"Returns": [
- "[]byte",
- "[]byte"
+ "[32]byte",
+ "[32]byte"
],
"Size": 2,
"ArgEnum": [
@@ -562,7 +535,7 @@
"uint64"
],
"Returns": [
- "[]byte"
+ "[8]byte"
],
"Size": 1,
"DocCost": "1",
@@ -2588,7 +2561,7 @@
"Name": "app_local_get",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2608,7 +2581,7 @@
"Args": [
"any",
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2627,7 +2600,7 @@
"Opcode": 100,
"Name": "app_global_get",
"Args": [
- "[]byte"
+ "stateKey"
],
"Returns": [
"any"
@@ -2646,7 +2619,7 @@
"Name": "app_global_get_ex",
"Args": [
"uint64",
- "[]byte"
+ "stateKey"
],
"Returns": [
"any",
@@ -2666,7 +2639,7 @@
"Name": "app_local_put",
"Args": [
"any",
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2682,7 +2655,7 @@
"Opcode": 103,
"Name": "app_global_put",
"Args": [
- "[]byte",
+ "stateKey",
"any"
],
"Size": 1,
@@ -2698,7 +2671,7 @@
"Name": "app_local_del",
"Args": [
"any",
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -2713,7 +2686,7 @@
"Opcode": 105,
"Name": "app_global_del",
"Args": [
- "[]byte"
+ "stateKey"
],
"Size": 1,
"DocCost": "1",
@@ -3286,10 +3259,10 @@
"Opcode": 150,
"Name": "bsqrt",
"Args": [
- "[]byte"
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "40",
@@ -3326,7 +3299,7 @@
"[]byte"
],
"Returns": [
- "[]byte"
+ "[32]byte"
],
"Size": 1,
"DocCost": "130",
@@ -3520,11 +3493,11 @@
"Opcode": 170,
"Name": "b%",
"Args": [
- "[]byte",
- "[]byte"
+ "bigint",
+ "bigint"
],
"Returns": [
- "[]byte"
+ "bigint"
],
"Size": 1,
"DocCost": "20",
@@ -4584,7 +4557,7 @@
"[32]byte"
],
"Returns": [
- "[]byte",
+ "[64]byte",
"bool"
],
"Size": 2,
diff --git a/data/transactions/logic/ledger_test.go b/data/transactions/logic/ledger_test.go
index a575c493d..0254a4467 100644
--- a/data/transactions/logic/ledger_test.go
+++ b/data/transactions/logic/ledger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -625,7 +625,7 @@ func (l *Ledger) move(from basics.Address, to basics.Address, amount uint64) err
tbr = newBalanceRecord(to, 0)
}
if fbr.balance < amount {
- return fmt.Errorf("insufficient balance")
+ return fmt.Errorf("insufficient balance in %v. %d < %d", from, fbr.balance, amount)
}
fbr.balance -= amount
tbr.balance += amount
diff --git a/data/transactions/logic/mocktracer/scenarios.go b/data/transactions/logic/mocktracer/scenarios.go
index e67907ea4..09a6a3a2d 100644
--- a/data/transactions/logic/mocktracer/scenarios.go
+++ b/data/transactions/logic/mocktracer/scenarios.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/mocktracer/tracer.go b/data/transactions/logic/mocktracer/tracer.go
index f40faf1be..8ac31cb3a 100644
--- a/data/transactions/logic/mocktracer/tracer.go
+++ b/data/transactions/logic/mocktracer/tracer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/opcodeExplain.go b/data/transactions/logic/opcodeExplain.go
index 3643ade21..28f4f798b 100644
--- a/data/transactions/logic/opcodeExplain.go
+++ b/data/transactions/logic/opcodeExplain.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/opcodes.go b/data/transactions/logic/opcodes.go
index 1f595dfb7..b8ecd76ca 100644
--- a/data/transactions/logic/opcodes.go
+++ b/data/transactions/logic/opcodes.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -77,6 +77,8 @@ const sharedResourcesVersion = 9 // apps can access resources from other transac
const pairingVersion = 10 // bn256 opcodes. will add bls12-381, and unify the available opcodes.
const spliceVersion = 10 // box splicing/resizing
+const spOpcodesVersion = 11 // falcon_verify, sumhash512
+
// Unlimited Global Storage opcodes
const boxVersion = 8 // box_*
@@ -486,34 +488,34 @@ func (spec *OpSpec) deadens() bool {
// assembly-time, with ops.returns()
var OpSpecs = []OpSpec{
{0x00, "err", opErr, proto(":x"), 1, detDefault()},
- {0x01, "sha256", opSHA256, proto("b:3"), 1, costly(7)},
- {0x02, "keccak256", opKeccak256, proto("b:3"), 1, costly(26)},
- {0x03, "sha512_256", opSHA512_256, proto("b:3"), 1, costly(9)},
+ {0x01, "sha256", opSHA256, proto("b:b{32}"), 1, costly(7)},
+ {0x02, "keccak256", opKeccak256, proto("b:b{32}"), 1, costly(26)},
+ {0x03, "sha512_256", opSHA512_256, proto("b:b{32}"), 1, costly(9)},
// Cost of these opcodes increases in AVM version 2 based on measured
// performance. Should be able to run max hashes during stateful TEAL
// and achieve reasonable TPS. Same opcode for different versions
// is OK.
- {0x01, "sha256", opSHA256, proto("b:3"), 2, costly(35)},
- {0x02, "keccak256", opKeccak256, proto("b:3"), 2, costly(130)},
- {0x03, "sha512_256", opSHA512_256, proto("b:3"), 2, costly(45)},
+ {0x01, "sha256", opSHA256, proto("b:b{32}"), 2, costly(35)},
+ {0x02, "keccak256", opKeccak256, proto("b:b{32}"), 2, costly(130)},
+ {0x03, "sha512_256", opSHA512_256, proto("b:b{32}"), 2, costly(45)},
/*
Tabling these changes until we offer unlimited global storage as there
is currently a useful pattern that requires hashes on long slices to
creating logicsigs in apps.
- {0x01, "sha256", opSHA256, proto("b:b"), unlimitedStorage, costByLength(12, 6, 8)},
- {0x02, "keccak256", opKeccak256, proto("b:b"), unlimitedStorage, costByLength(58, 4, 8)},
- {0x03, "sha512_256", opSHA512_256, proto("b:b"), 7, unlimitedStorage, costByLength(17, 5, 8)},
+ {0x01, "sha256", opSHA256, proto("b:b{32}"), ?, costByLength(...)},
+ {0x02, "keccak256", opKeccak256, proto("b:b{32}"), ?, costByLength(...)},
+ {0x03, "sha512_256", opSHA512_256, proto("b:b{32}"), ?, costByLength(...)},
*/
- {0x04, "ed25519verify", opEd25519Verify, proto("b63:T"), 1, costly(1900).only(ModeSig)},
- {0x04, "ed25519verify", opEd25519Verify, proto("b63:T"), 5, costly(1900)},
+ {0x04, "ed25519verify", opEd25519Verify, proto("bb{64}b{32}:T"), 1, costly(1900).only(ModeSig)},
+ {0x04, "ed25519verify", opEd25519Verify, proto("bb{64}b{32}:T"), 5, costly(1900)},
- {0x05, "ecdsa_verify", opEcdsaVerify, proto("3bbbb:T"), 5, costByField("v", &EcdsaCurves, ecdsaVerifyCosts)},
- {0x06, "ecdsa_pk_decompress", opEcdsaPkDecompress, proto("b:bb"), 5, costByField("v", &EcdsaCurves, ecdsaDecompressCosts)},
- {0x07, "ecdsa_pk_recover", opEcdsaPkRecover, proto("3i33:bb"), 5, field("v", &EcdsaCurves).costs(2000)},
+ {0x05, "ecdsa_verify", opEcdsaVerify, proto("b{32}b{32}b{32}b{32}b{32}:T"), 5, costByField("v", &EcdsaCurves, ecdsaVerifyCosts)},
+ {0x06, "ecdsa_pk_decompress", opEcdsaPkDecompress, proto("b{33}:b{32}b{32}"), 5, costByField("v", &EcdsaCurves, ecdsaDecompressCosts)},
+ {0x07, "ecdsa_pk_recover", opEcdsaPkRecover, proto("b{32}ib{32}b{32}:b{32}b{32}"), 5, field("v", &EcdsaCurves).costs(2000)},
{0x08, "+", opPlus, proto("ii:i"), 1, detDefault()},
{0x09, "-", opMinus, proto("ii:i"), 1, detDefault()},
@@ -529,7 +531,7 @@ var OpSpecs = []OpSpec{
{0x13, "!=", opNeq, proto("aa:T"), 1, typed(typeEquals)},
{0x14, "!", opNot, proto("i:i"), 1, detDefault()},
{0x15, "len", opLen, proto("b:i"), 1, detDefault()},
- {0x16, "itob", opItob, proto("i:b"), 1, detDefault()},
+ {0x16, "itob", opItob, proto("i:b{8}"), 1, detDefault()},
{0x17, "btoi", opBtoi, proto("b:i"), 1, detDefault()},
{0x18, "%", opModulo, proto("ii:i"), 1, detDefault()},
{0x19, "|", opBitOr, proto("ii:i"), 1, detDefault()},
@@ -619,18 +621,18 @@ var OpSpecs = []OpSpec{
{0x60, "balance", opBalance, proto("a:i"), directRefEnabledVersion, only(ModeApp)},
{0x61, "app_opted_in", opAppOptedIn, proto("ii:T"), 2, only(ModeApp)},
{0x61, "app_opted_in", opAppOptedIn, proto("ai:T"), directRefEnabledVersion, only(ModeApp)},
- {0x62, "app_local_get", opAppLocalGet, proto("ib:a").appStateExplain(opAppLocalGetStateChange), 2, only(ModeApp)},
- {0x62, "app_local_get", opAppLocalGet, proto("ab:a").appStateExplain(opAppLocalGetStateChange), directRefEnabledVersion, only(ModeApp)},
- {0x63, "app_local_get_ex", opAppLocalGetEx, proto("iib:aT").appStateExplain(opAppLocalGetExStateChange), 2, only(ModeApp)},
- {0x63, "app_local_get_ex", opAppLocalGetEx, proto("aib:aT").appStateExplain(opAppLocalGetExStateChange), directRefEnabledVersion, only(ModeApp)},
- {0x64, "app_global_get", opAppGlobalGet, proto("b:a").appStateExplain(opAppGlobalGetStateChange), 2, only(ModeApp)},
- {0x65, "app_global_get_ex", opAppGlobalGetEx, proto("ib:aT").appStateExplain(opAppGlobalGetExStateChange), 2, only(ModeApp)},
- {0x66, "app_local_put", opAppLocalPut, proto("iba:").appStateExplain(opAppLocalPutStateChange), 2, only(ModeApp)},
- {0x66, "app_local_put", opAppLocalPut, proto("aba:").appStateExplain(opAppLocalPutStateChange), directRefEnabledVersion, only(ModeApp)},
- {0x67, "app_global_put", opAppGlobalPut, proto("ba:").appStateExplain(opAppGlobalPutStateChange), 2, only(ModeApp)},
- {0x68, "app_local_del", opAppLocalDel, proto("ib:").appStateExplain(opAppLocalDelStateChange), 2, only(ModeApp)},
- {0x68, "app_local_del", opAppLocalDel, proto("ab:").appStateExplain(opAppLocalDelStateChange), directRefEnabledVersion, only(ModeApp)},
- {0x69, "app_global_del", opAppGlobalDel, proto("b:").appStateExplain(opAppGlobalDelStateChange), 2, only(ModeApp)},
+ {0x62, "app_local_get", opAppLocalGet, proto("iK:a").appStateExplain(opAppLocalGetStateChange), 2, only(ModeApp)},
+ {0x62, "app_local_get", opAppLocalGet, proto("aK:a").appStateExplain(opAppLocalGetStateChange), directRefEnabledVersion, only(ModeApp)},
+ {0x63, "app_local_get_ex", opAppLocalGetEx, proto("iiK:aT").appStateExplain(opAppLocalGetExStateChange), 2, only(ModeApp)},
+ {0x63, "app_local_get_ex", opAppLocalGetEx, proto("aiK:aT").appStateExplain(opAppLocalGetExStateChange), directRefEnabledVersion, only(ModeApp)},
+ {0x64, "app_global_get", opAppGlobalGet, proto("K:a").appStateExplain(opAppGlobalGetStateChange), 2, only(ModeApp)},
+ {0x65, "app_global_get_ex", opAppGlobalGetEx, proto("iK:aT").appStateExplain(opAppGlobalGetExStateChange), 2, only(ModeApp)},
+ {0x66, "app_local_put", opAppLocalPut, proto("iKa:").appStateExplain(opAppLocalPutStateChange), 2, only(ModeApp)},
+ {0x66, "app_local_put", opAppLocalPut, proto("aKa:").appStateExplain(opAppLocalPutStateChange), directRefEnabledVersion, only(ModeApp)},
+ {0x67, "app_global_put", opAppGlobalPut, proto("Ka:").appStateExplain(opAppGlobalPutStateChange), 2, only(ModeApp)},
+ {0x68, "app_local_del", opAppLocalDel, proto("iK:").appStateExplain(opAppLocalDelStateChange), 2, only(ModeApp)},
+ {0x68, "app_local_del", opAppLocalDel, proto("aK:").appStateExplain(opAppLocalDelStateChange), directRefEnabledVersion, only(ModeApp)},
+ {0x69, "app_global_del", opAppGlobalDel, proto("K:").appStateExplain(opAppGlobalDelStateChange), 2, only(ModeApp)},
{0x70, "asset_holding_get", opAssetHoldingGet, proto("ii:aT"), 2, field("f", &AssetHoldingFields).only(ModeApp)},
{0x70, "asset_holding_get", opAssetHoldingGet, proto("ai:aT"), directRefEnabledVersion, field("f", &AssetHoldingFields).only(ModeApp)},
{0x71, "asset_params_get", opAssetParamsGet, proto("i:aT"), 2, field("f", &AssetParamsFields).only(ModeApp)},
@@ -646,7 +648,9 @@ var OpSpecs = []OpSpec{
{0x82, "pushbytess", opPushBytess, proto(":", "", "[N items]").stackExplain(opPushBytessStackChange), 8, constants(asmPushBytess, checkByteImmArgs, "bytes ...", immBytess).typed(typePushBytess).trust()},
{0x83, "pushints", opPushInts, proto(":", "", "[N items]").stackExplain(opPushIntsStackChange), 8, constants(asmPushInts, checkIntImmArgs, "uint ...", immInts).typed(typePushInts).trust()},
- {0x84, "ed25519verify_bare", opEd25519VerifyBare, proto("b63:T"), 7, costly(1900)},
+ {0x84, "ed25519verify_bare", opEd25519VerifyBare, proto("bb{64}b{32}:T"), 7, costly(1900)},
+ {0x85, "falcon_verify", opFalconVerify, proto("bb{1232}b{1793}:T"), spOpcodesVersion, costly(1700)}, // dynamic for internal hash?
+ {0x86, "sumhash512", opSumhash512, proto("b:b{64}"), spOpcodesVersion, costByLength(150, 7, 4, 0)},
// "Function oriented"
{0x88, "callsub", opCallSub, proto(":"), 4, detBranch()},
@@ -665,11 +669,11 @@ var OpSpecs = []OpSpec{
{0x93, "bitlen", opBitLen, proto("a:i"), 4, detDefault()},
{0x94, "exp", opExp, proto("ii:i"), 4, detDefault()},
{0x95, "expw", opExpw, proto("ii:ii"), 4, costly(10)},
- {0x96, "bsqrt", opBytesSqrt, proto("b:b"), 6, costly(40)},
+ {0x96, "bsqrt", opBytesSqrt, proto("I:I"), 6, costly(40)},
{0x97, "divw", opDivw, proto("iii:i"), 6, detDefault()},
- {0x98, "sha3_256", opSHA3_256, proto("b:b"), 7, costly(130)},
+ {0x98, "sha3_256", opSHA3_256, proto("b:b{32}"), 7, costly(130)},
/* Will end up following keccak256 -
- {0x98, "sha3_256", opSHA3_256, proto("b:b"), unlimitedStorage, costByLength(58, 4, 8)},},
+ {0x98, "sha3_256", opSHA3_256, proto("b:b{32}"), ?, costByLength(...)},},
*/
// Byteslice math.
@@ -683,7 +687,7 @@ var OpSpecs = []OpSpec{
{0xa7, "b>=", opBytesGe, proto("II:T"), 4, detDefault()},
{0xa8, "b==", opBytesEq, proto("II:T"), 4, detDefault()},
{0xa9, "b!=", opBytesNeq, proto("II:T"), 4, detDefault()},
- {0xaa, "b%", opBytesModulo, proto("bb:b"), 4, costly(20)},
+ {0xaa, "b%", opBytesModulo, proto("II:I"), 4, costly(20)},
{0xab, "b|", opBytesBitOr, proto("bb:b"), 4, costly(6)},
{0xac, "b&", opBytesBitAnd, proto("bb:b"), 4, costly(6)},
{0xad, "b^", opBytesBitXor, proto("bb:b"), 4, costly(6)},
@@ -720,7 +724,7 @@ var OpSpecs = []OpSpec{
{0xc6, "gitxnas", opGitxnas, proto("i:a"), 6, immediates("t", "f").field("f", &TxnArrayFields).only(ModeApp)},
// randomness support
- {0xd0, "vrf_verify", opVrfVerify, proto("b83:bT"), randomnessVersion, field("s", &VrfStandards).costs(5700)},
+ {0xd0, "vrf_verify", opVrfVerify, proto("bb{80}b{32}:b{64}T"), randomnessVersion, field("s", &VrfStandards).costs(5700)},
{0xd1, "block", opBlock, proto("i:a"), randomnessVersion, field("f", &BlockFields)},
{0xd2, "box_splice", opBoxSplice, proto("Niib:").appStateExplain(opBoxSpliceStateChange), spliceVersion, only(ModeApp)},
{0xd3, "box_resize", opBoxResize, proto("Ni:").appStateExplain(opBoxResizeStateChange), spliceVersion, only(ModeApp)},
diff --git a/data/transactions/logic/opcodes_test.go b/data/transactions/logic/opcodes_test.go
index df69bbf70..57a2d5eb7 100644
--- a/data/transactions/logic/opcodes_test.go
+++ b/data/transactions/logic/opcodes_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/pairing.go b/data/transactions/logic/pairing.go
index fa47e061d..fc61996e6 100644
--- a/data/transactions/logic/pairing.go
+++ b/data/transactions/logic/pairing.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/pairing_test.go b/data/transactions/logic/pairing_test.go
index 914e30300..d7b4a87e2 100644
--- a/data/transactions/logic/pairing_test.go
+++ b/data/transactions/logic/pairing_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/program.go b/data/transactions/logic/program.go
index 85195b904..dba9af446 100644
--- a/data/transactions/logic/program.go
+++ b/data/transactions/logic/program.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/resources.go b/data/transactions/logic/resources.go
index c407af704..8c713da67 100644
--- a/data/transactions/logic/resources.go
+++ b/data/transactions/logic/resources.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/resources_test.go b/data/transactions/logic/resources_test.go
index b796a8c4c..6458e081a 100644
--- a/data/transactions/logic/resources_test.go
+++ b/data/transactions/logic/resources_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -141,7 +141,7 @@ func TestAppSharing(t *testing.T) {
TestApps(t, sources, txntest.Group(&appl0, &appl1), 9, ledger,
Exp(1, "account "+appl0.Sender.String()+" is not opted into 901"))
ledger.NewLocals(appl0.Sender, 901) // opt in
- ep := TestApps(t, sources, txntest.Group(&appl0, &appl1), 9, ledger)
+ ep, _ := TestApps(t, sources, txntest.Group(&appl0, &appl1), 9, ledger)
require.Len(t, ep.TxnGroup, 2)
ed := ep.TxnGroup[1].ApplyData.EvalDelta
require.Equal(t, map[uint64]basics.StateDelta{
diff --git a/data/transactions/logic/sourcemap.go b/data/transactions/logic/sourcemap.go
index fb12f50f6..4f5d2ab45 100644
--- a/data/transactions/logic/sourcemap.go
+++ b/data/transactions/logic/sourcemap.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/sourcemap_test.go b/data/transactions/logic/sourcemap_test.go
index f5c345531..ba7be2974 100644
--- a/data/transactions/logic/sourcemap_test.go
+++ b/data/transactions/logic/sourcemap_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/teal.tmLanguage.json b/data/transactions/logic/teal.tmLanguage.json
index e414922e8..915957f7f 100644
--- a/data/transactions/logic/teal.tmLanguage.json
+++ b/data/transactions/logic/teal.tmLanguage.json
@@ -76,7 +76,7 @@
},
{
"name": "keyword.operator.teal",
- "match": "^(\\!|\\!\\=|%|\u0026|\u0026\u0026|\\*|\\+|\\-|/|\\\u003c|\\\u003c\\=|\\=\\=|\\\u003e|\\\u003e\\=|\\^|addw|bitlen|btoi|divmodw|divw|exp|expw|itob|mulw|shl|shr|sqrt|\\||\\|\\||\\~|b\\!\\=|b%|b\\*|b\\+|b\\-|b/|b\\\u003c|b\\\u003c\\=|b\\=\\=|b\\\u003e|b\\\u003e\\=|bsqrt|b\u0026|b\\^|b\\||b\\~|base64_decode|concat|extract|extract3|extract_uint16|extract_uint32|extract_uint64|getbit|getbyte|json_ref|len|replace2|replace3|setbit|setbyte|substring|substring3|ec_add|ec_map_to|ec_multi_scalar_mul|ec_pairing_check|ec_scalar_mul|ec_subgroup_check|ecdsa_pk_decompress|ecdsa_pk_recover|ecdsa_verify|ed25519verify|ed25519verify_bare|keccak256|sha256|sha3_256|sha512_256|vrf_verify|gitxn|gitxna|gitxnas|itxn|itxn_begin|itxn_field|itxn_next|itxn_submit|itxna|itxnas)\\b"
+ "match": "^(\\!|\\!\\=|%|\u0026|\u0026\u0026|\\*|\\+|\\-|/|\\\u003c|\\\u003c\\=|\\=\\=|\\\u003e|\\\u003e\\=|\\^|addw|bitlen|btoi|divmodw|divw|exp|expw|itob|mulw|shl|shr|sqrt|\\||\\|\\||\\~|b\\!\\=|b%|b\\*|b\\+|b\\-|b/|b\\\u003c|b\\\u003c\\=|b\\=\\=|b\\\u003e|b\\\u003e\\=|bsqrt|b\u0026|b\\^|b\\||b\\~|base64_decode|concat|extract|extract3|extract_uint16|extract_uint32|extract_uint64|getbit|getbyte|json_ref|len|replace2|replace3|setbit|setbyte|substring|substring3|ec_add|ec_map_to|ec_multi_scalar_mul|ec_pairing_check|ec_scalar_mul|ec_subgroup_check|ecdsa_pk_decompress|ecdsa_pk_recover|ecdsa_verify|ed25519verify|ed25519verify_bare|falcon_verify|keccak256|sha256|sha3_256|sha512_256|sumhash512|vrf_verify|gitxn|gitxna|gitxnas|itxn|itxn_begin|itxn_field|itxn_next|itxn_submit|itxna|itxnas)\\b"
}
]
},
diff --git a/data/transactions/logic/tracer.go b/data/transactions/logic/tracer.go
index 37603c794..c8996f316 100644
--- a/data/transactions/logic/tracer.go
+++ b/data/transactions/logic/tracer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logic/tracer_test.go b/data/transactions/logic/tracer_test.go
index 323447464..8e806e21d 100644
--- a/data/transactions/logic/tracer_test.go
+++ b/data/transactions/logic/tracer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/logicsig.go b/data/transactions/logicsig.go
index e2869a89b..31a14ea1d 100644
--- a/data/transactions/logicsig.go
+++ b/data/transactions/logicsig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/payment.go b/data/transactions/payment.go
index fee9c395e..62eafdb1e 100644
--- a/data/transactions/payment.go
+++ b/data/transactions/payment.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/payment_test.go b/data/transactions/payment_test.go
index 5d3f83cba..e2583c429 100644
--- a/data/transactions/payment_test.go
+++ b/data/transactions/payment_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/payset.go b/data/transactions/payset.go
index f005c6b4d..7d7088590 100644
--- a/data/transactions/payset.go
+++ b/data/transactions/payset.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/payset_test.go b/data/transactions/payset_test.go
index 63d3afc42..231e8efca 100644
--- a/data/transactions/payset_test.go
+++ b/data/transactions/payset_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/perf_test.go b/data/transactions/perf_test.go
index cda1ea5be..9bcc83c0b 100644
--- a/data/transactions/perf_test.go
+++ b/data/transactions/perf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/signedtxn.go b/data/transactions/signedtxn.go
index 30d0e90e1..5a10829f0 100644
--- a/data/transactions/signedtxn.go
+++ b/data/transactions/signedtxn.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/signedtxn_test.go b/data/transactions/signedtxn_test.go
index d292e6689..f6862f2f4 100644
--- a/data/transactions/signedtxn_test.go
+++ b/data/transactions/signedtxn_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/sort.go b/data/transactions/sort.go
index d86d6e293..d8b341999 100644
--- a/data/transactions/sort.go
+++ b/data/transactions/sort.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/stateproof.go b/data/transactions/stateproof.go
index 89b14de75..7d2452685 100644
--- a/data/transactions/stateproof.go
+++ b/data/transactions/stateproof.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/teal.go b/data/transactions/teal.go
index 85a162854..bdb68b525 100644
--- a/data/transactions/teal.go
+++ b/data/transactions/teal.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/teal_test.go b/data/transactions/teal_test.go
index 52ec80e68..92dbe0330 100644
--- a/data/transactions/teal_test.go
+++ b/data/transactions/teal_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/testhelpers.go b/data/transactions/testhelpers.go
index 99baadb1a..349e28cca 100644
--- a/data/transactions/testhelpers.go
+++ b/data/transactions/testhelpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go
index 725f9d7ec..b0bb7c413 100644
--- a/data/transactions/transaction.go
+++ b/data/transactions/transaction.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/transaction_test.go b/data/transactions/transaction_test.go
index 0f3cf1825..e3a25619b 100644
--- a/data/transactions/transaction_test.go
+++ b/data/transactions/transaction_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/artifact_test.go b/data/transactions/verify/artifact_test.go
index 1fa3d6b2d..8e1cfcf68 100644
--- a/data/transactions/verify/artifact_test.go
+++ b/data/transactions/verify/artifact_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/txn.go b/data/transactions/verify/txn.go
index 3d42694bb..640189cc5 100644
--- a/data/transactions/verify/txn.go
+++ b/data/transactions/verify/txn.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/txnBatch.go b/data/transactions/verify/txnBatch.go
index 6a45944ed..4b309f694 100644
--- a/data/transactions/verify/txnBatch.go
+++ b/data/transactions/verify/txnBatch.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/txnBatch_test.go b/data/transactions/verify/txnBatch_test.go
index a7ee2df04..45693f58a 100644
--- a/data/transactions/verify/txnBatch_test.go
+++ b/data/transactions/verify/txnBatch_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/txn_test.go b/data/transactions/verify/txn_test.go
index 1e7793248..282a03109 100644
--- a/data/transactions/verify/txn_test.go
+++ b/data/transactions/verify/txn_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/verifiedTxnCache.go b/data/transactions/verify/verifiedTxnCache.go
index 184ed273e..cb73a4371 100644
--- a/data/transactions/verify/verifiedTxnCache.go
+++ b/data/transactions/verify/verifiedTxnCache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/transactions/verify/verifiedTxnCache_test.go b/data/transactions/verify/verifiedTxnCache_test.go
index 880780f94..d27510fe6 100644
--- a/data/transactions/verify/verifiedTxnCache_test.go
+++ b/data/transactions/verify/verifiedTxnCache_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/txDupCache.go b/data/txDupCache.go
index 96a426dc7..ff0e04a86 100644
--- a/data/txDupCache.go
+++ b/data/txDupCache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/txDupCache_test.go b/data/txDupCache_test.go
index 13a36b19d..0458a3b76 100644
--- a/data/txDupCache_test.go
+++ b/data/txDupCache_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/txHandler.go b/data/txHandler.go
index 4689a497b..3d20e95ac 100644
--- a/data/txHandler.go
+++ b/data/txHandler.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -131,6 +131,7 @@ type TxHandler struct {
streamVerifierDropped chan *verify.UnverifiedTxnSigJob
erl *util.ElasticRateLimiter
appLimiter *appRateLimiter
+ appLimiterBacklogThreshold int
}
// TxHandlerOpts is TxHandler configuration options
@@ -203,6 +204,8 @@ func MakeTxHandler(opts TxHandlerOpts) (*TxHandler, error) {
uint64(opts.Config.TxBacklogAppTxPerSecondRate),
time.Duration(opts.Config.TxBacklogServiceRateWindowSeconds)*time.Second,
)
+ // set appLimiter triggering threshold at 50% of the base backlog size
+ handler.appLimiterBacklogThreshold = int(float64(opts.Config.TxBacklogSize) * float64(opts.Config.TxBacklogRateLimitingCongestionPct) / 100)
}
}
@@ -596,9 +599,8 @@ func (handler *TxHandler) processIncomingTxn(rawmsg network.IncomingMessage) net
var err error
var capguard *util.ErlCapacityGuard
- var congested bool
if handler.erl != nil {
- congested = float64(cap(handler.backlogQueue))*handler.backlogCongestionThreshold < float64(len(handler.backlogQueue))
+ congestedERL := float64(cap(handler.backlogQueue))*handler.backlogCongestionThreshold < float64(len(handler.backlogQueue))
// consume a capacity unit
// if the elastic rate limiter cannot vend a capacity, the error it returns
// is sufficient to indicate that we should enable Congestion Control, because
@@ -611,7 +613,7 @@ func (handler *TxHandler) processIncomingTxn(rawmsg network.IncomingMessage) net
return network.OutgoingMessage{Action: network.Ignore}
}
// if the backlog Queue has 50% of its buffer back, turn congestion control off
- if !congested {
+ if !congestedERL {
handler.erl.DisableCongestionControl()
}
}
@@ -661,9 +663,12 @@ func (handler *TxHandler) processIncomingTxn(rawmsg network.IncomingMessage) net
}
// rate limit per application in a group. Limiting any app in a group drops the entire message.
- if handler.appLimiter != nil && congested && handler.appLimiter.shouldDrop(unverifiedTxGroup, rawmsg.Sender.(network.IPAddressable).RoutingAddr()) {
- transactionMessagesAppLimiterDrop.Inc(nil)
- return network.OutgoingMessage{Action: network.Ignore}
+ if handler.appLimiter != nil {
+ congestedARL := len(handler.backlogQueue) > handler.appLimiterBacklogThreshold
+ if congestedARL && handler.appLimiter.shouldDrop(unverifiedTxGroup, rawmsg.Sender.(network.IPAddressable).RoutingAddr()) {
+ transactionMessagesAppLimiterDrop.Inc(nil)
+ return network.OutgoingMessage{Action: network.Ignore}
+ }
}
select {
diff --git a/data/txHandler_test.go b/data/txHandler_test.go
index 894fef9d4..3f567554b 100644
--- a/data/txHandler_test.go
+++ b/data/txHandler_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -2522,9 +2522,7 @@ func TestTxHandlerAppRateLimiterERLEnabled(t *testing.T) {
cfg.TxBacklogAppTxRateLimiterMaxSize = 100
cfg.TxBacklogServiceRateWindowSeconds = 1
cfg.TxBacklogAppTxPerSecondRate = 3
- cfg.TxBacklogReservedCapacityPerPeer = 2
- cfg.TxBacklogSize = 1
- cfg.IncomingConnectionsLimit = 1
+ cfg.TxBacklogSize = 3
ledger, err := LoadLedger(log, ledgerName, inMem, protocol.ConsensusCurrentVersion, bookkeeping.GenesisBalances{}, genesisID, genesisHash, nil, cfg)
require.NoError(t, err)
defer ledger.Close()
@@ -2585,7 +2583,9 @@ func TestTxHandlerAppRateLimiterERLEnabled(t *testing.T) {
sender := mockSender{}
// submit and ensure it is accepted
- congested := float64(cap(handler.backlogQueue))*0.5 < float64(len(handler.backlogQueue))
+ pct := float64(cfg.TxBacklogRateLimitingCongestionPct) / 100
+ limit := int(float64(cfg.TxBacklogSize) * pct)
+ congested := len(handler.backlogQueue) > limit
require.False(t, congested)
action := handler.processIncomingTxn(network.IncomingMessage{Data: blob, Sender: sender})
@@ -2593,7 +2593,7 @@ func TestTxHandlerAppRateLimiterERLEnabled(t *testing.T) {
require.Equal(t, 1, len(handler.backlogQueue))
// repeat the same txn, we are still not congested
- congested = float64(cap(handler.backlogQueue))*0.5 < float64(len(handler.backlogQueue))
+ congested = len(handler.backlogQueue) > limit
require.False(t, congested)
signedTx = tx.Sign(keypair())
@@ -2603,7 +2603,7 @@ func TestTxHandlerAppRateLimiterERLEnabled(t *testing.T) {
require.Equal(t, 2, len(handler.backlogQueue))
require.Equal(t, 0, handler.appLimiter.len()) // no rate limiting yet
- congested = float64(cap(handler.backlogQueue))*0.5 < float64(len(handler.backlogQueue))
+ congested = len(handler.backlogQueue) > limit
require.True(t, congested)
// submit it again and the app rate limiter should kick in
diff --git a/data/txntest/defi.go b/data/txntest/defi.go
index 635393a67..fedadd00d 100644
--- a/data/txntest/defi.go
+++ b/data/txntest/defi.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/data/txntest/txn.go b/data/txntest/txn.go
index 5815aacc6..515c9df45 100644
--- a/data/txntest/txn.go
+++ b/data/txntest/txn.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/gen/generate.go b/gen/generate.go
index 5fb1c0126..a5f6e4680 100644
--- a/gen/generate.go
+++ b/gen/generate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/gen/generate_test.go b/gen/generate_test.go
index e154e7c44..d4c2ab152 100644
--- a/gen/generate_test.go
+++ b/gen/generate_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/gen/walletData.go b/gen/walletData.go
index 9823c03b5..2c8f678ce 100644
--- a/gen/walletData.go
+++ b/gen/walletData.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/internal/rapidgen/rapidgenerators.go b/internal/rapidgen/rapidgenerators.go
index 37b9b6988..ba454d6d2 100644
--- a/internal/rapidgen/rapidgenerators.go
+++ b/internal/rapidgen/rapidgenerators.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/internal/rapidgen/tld.go b/internal/rapidgen/tld.go
index e6e3e8963..7d93ead42 100644
--- a/internal/rapidgen/tld.go
+++ b/internal/rapidgen/tld.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctdeltas.go b/ledger/acctdeltas.go
index 42d5d93b2..d6bb91881 100644
--- a/ledger/acctdeltas.go
+++ b/ledger/acctdeltas.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctdeltas_test.go b/ledger/acctdeltas_test.go
index bf4bd6e39..ec00269db 100644
--- a/ledger/acctdeltas_test.go
+++ b/ledger/acctdeltas_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctonline.go b/ledger/acctonline.go
index e2760ee0a..cdccc9a9e 100644
--- a/ledger/acctonline.go
+++ b/ledger/acctonline.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctonline_expired_test.go b/ledger/acctonline_expired_test.go
index bfc72fa98..ac7986a78 100644
--- a/ledger/acctonline_expired_test.go
+++ b/ledger/acctonline_expired_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctonline_test.go b/ledger/acctonline_test.go
index 2897e87ff..5a2b2ca1a 100644
--- a/ledger/acctonline_test.go
+++ b/ledger/acctonline_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctupdates.go b/ledger/acctupdates.go
index ca9cd55f7..e9c969671 100644
--- a/ledger/acctupdates.go
+++ b/ledger/acctupdates.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/acctupdates_test.go b/ledger/acctupdates_test.go
index 1f3ca086a..1cf080d15 100644
--- a/ledger/acctupdates_test.go
+++ b/ledger/acctupdates_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/applications_test.go b/ledger/applications_test.go
index d89f03a67..315cfd2c4 100644
--- a/ledger/applications_test.go
+++ b/ledger/applications_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/application.go b/ledger/apply/application.go
index c87368dfe..33ae9545f 100644
--- a/ledger/apply/application.go
+++ b/ledger/apply/application.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/application_test.go b/ledger/apply/application_test.go
index 5d829a386..dfc298bf8 100644
--- a/ledger/apply/application_test.go
+++ b/ledger/apply/application_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/apply.go b/ledger/apply/apply.go
index 2be394b8f..dfa61b263 100644
--- a/ledger/apply/apply.go
+++ b/ledger/apply/apply.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/asset.go b/ledger/apply/asset.go
index f0701d28e..186b82ad4 100644
--- a/ledger/apply/asset.go
+++ b/ledger/apply/asset.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/asset_test.go b/ledger/apply/asset_test.go
index 802c692c8..eddc15757 100644
--- a/ledger/apply/asset_test.go
+++ b/ledger/apply/asset_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/keyreg.go b/ledger/apply/keyreg.go
index 206ff31bf..4fe0f0a32 100644
--- a/ledger/apply/keyreg.go
+++ b/ledger/apply/keyreg.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/keyreg_test.go b/ledger/apply/keyreg_test.go
index 7589b9fb1..e64beea4b 100644
--- a/ledger/apply/keyreg_test.go
+++ b/ledger/apply/keyreg_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/mockBalances_test.go b/ledger/apply/mockBalances_test.go
index 3d441b03c..43af5fa11 100644
--- a/ledger/apply/mockBalances_test.go
+++ b/ledger/apply/mockBalances_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/payment.go b/ledger/apply/payment.go
index ad8f128e9..8483bae92 100644
--- a/ledger/apply/payment.go
+++ b/ledger/apply/payment.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/payment_test.go b/ledger/apply/payment_test.go
index db82869e2..d377211a1 100644
--- a/ledger/apply/payment_test.go
+++ b/ledger/apply/payment_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/stateproof.go b/ledger/apply/stateproof.go
index 2901f4e85..70db26e88 100644
--- a/ledger/apply/stateproof.go
+++ b/ledger/apply/stateproof.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apply/stateproof_test.go b/ledger/apply/stateproof_test.go
index 155a4eef5..be774d2e4 100644
--- a/ledger/apply/stateproof_test.go
+++ b/ledger/apply/stateproof_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/apptxn_test.go b/ledger/apptxn_test.go
index 982c9f01b..167d22f2d 100644
--- a/ledger/apptxn_test.go
+++ b/ledger/apptxn_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/archival_test.go b/ledger/archival_test.go
index 9b361b703..96477708f 100644
--- a/ledger/archival_test.go
+++ b/ledger/archival_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/blockqueue.go b/ledger/blockqueue.go
index a72c1d8cb..7c1728101 100644
--- a/ledger/blockqueue.go
+++ b/ledger/blockqueue.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -111,6 +111,8 @@ func (bq *blockQueue) stop() {
}
}
+const maxDeletionBatchSize = 10_000
+
func (bq *blockQueue) syncer() {
bq.mu.Lock()
for {
@@ -164,6 +166,21 @@ func (bq *blockQueue) syncer() {
bq.mu.Unlock()
minToSave := bq.l.notifyCommit(committed)
+ var earliest basics.Round
+ err = bq.l.blockDBs.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ var err0 error
+ earliest, err0 = blockdb.BlockEarliest(tx)
+ if err0 != nil {
+ bq.l.log.Warnf("blockQueue.syncer: BlockEarliest(): %v", err0)
+ }
+ return err0
+ })
+ if err == nil {
+ if basics.SubSaturate(minToSave, earliest) > maxDeletionBatchSize {
+ minToSave = basics.AddSaturate(earliest, maxDeletionBatchSize)
+ }
+ }
+
bfstart := time.Now()
ledgerSyncBlockforgetCount.Inc(nil)
err = bq.l.blockDBs.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
diff --git a/ledger/blockqueue_test.go b/ledger/blockqueue_test.go
index 2d702cfb9..e74fbc0b3 100644
--- a/ledger/blockqueue_test.go
+++ b/ledger/blockqueue_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -17,9 +17,12 @@
package ledger
import (
+ "context"
+ "database/sql"
"errors"
"fmt"
"testing"
+ "time"
"github.com/stretchr/testify/require"
@@ -29,10 +32,12 @@ import (
"github.com/algorand/go-algorand/data/basics"
"github.com/algorand/go-algorand/data/bookkeeping"
"github.com/algorand/go-algorand/ledger/ledgercore"
+ "github.com/algorand/go-algorand/ledger/store/blockdb"
ledgertesting "github.com/algorand/go-algorand/ledger/testing"
"github.com/algorand/go-algorand/logging"
"github.com/algorand/go-algorand/protocol"
"github.com/algorand/go-algorand/test/partitiontest"
+ "github.com/algorand/go-algorand/util/db"
)
func randomBlock(r basics.Round) blockEntry {
@@ -128,3 +133,113 @@ func TestGetEncodedBlockCert(t *testing.T) {
expectedErr := &ledgercore.ErrNoEntry{}
require.True(t, errors.As(err, expectedErr))
}
+
+// it is not great to use trackers here but at the moment there is no abstraction for the ledger
+type uptoTracker struct {
+ emptyTracker
+}
+
+// committedUpTo in the emptyTracker just stores the committed round.
+func (t *uptoTracker) committedUpTo(committedRnd basics.Round) (minRound, lookback basics.Round) {
+ return 5_000, basics.Round(0)
+}
+
+// TestBlockQueueSyncerDeletion ensures that the block queue syncer deletes no more than maxDeletionBatchSize blocks at time
+func TestBlockQueueSyncerDeletion(t *testing.T) {
+ partitiontest.PartitionTest(t)
+ t.Parallel()
+
+ tests := []struct {
+ name string
+ expectedEarliest basics.Round
+ tracker ledgerTracker
+ }{
+ {"max_batch", maxDeletionBatchSize, nil}, // no trackers, max deletion
+ {"5k_tracker", 5_000, &uptoTracker{}}, // tracker sets minToSave to 5k
+ }
+
+ for _, test := range tests {
+ t.Run(test.name, func(t *testing.T) {
+
+ const dbMem = true
+ blockDBs, err := db.OpenPair(t.Name()+".block.sqlite", dbMem)
+ require.NoError(t, err)
+
+ log := logging.TestingLog(t)
+ err = blockDBs.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ return initBlocksDB(tx, log, []bookkeeping.Block{}, false)
+ })
+ require.NoError(t, err)
+
+ // add 15k blocks
+ const maxBlocks = maxDeletionBatchSize + maxDeletionBatchSize/2 // 15_000
+ err = blockDBs.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ for i := 0; i < maxBlocks; i++ {
+ err0 := blockdb.BlockPut(
+ tx,
+ bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{Round: basics.Round(i)}},
+ agreement.Certificate{})
+ if err0 != nil {
+ return err0
+ }
+ }
+ return nil
+ })
+ require.NoError(t, err)
+
+ var earliest, latest basics.Round
+ err = blockDBs.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ var err0 error
+ earliest, err0 = blockdb.BlockEarliest(tx)
+ if err0 != nil {
+ return err0
+ }
+ latest, err0 = blockdb.BlockLatest(tx)
+ return err0
+ })
+ require.NoError(t, err)
+ require.Equal(t, basics.Round(0), earliest)
+ require.Equal(t, basics.Round(maxBlocks-1), latest)
+
+ // trigger deletion and ensure no more than 10k blocks gone
+ //make a minimal ledger for blockqueue
+
+ l := &Ledger{
+ log: log,
+ blockDBs: blockDBs,
+ }
+ if test.tracker != nil {
+ l.trackers.trackers = append(l.trackers.trackers, test.tracker)
+ }
+ blockq, _ := newBlockQueue(l)
+ err = blockq.start()
+ require.NoError(t, err)
+
+ // add a block. Eventually the syncer will called on an empty ledger
+ // forcing deleting all 15_000 rounds. The deletion scoping should limit it to 10_000 rounds instead
+ err = blockq.putBlock(bookkeeping.Block{BlockHeader: bookkeeping.BlockHeader{Round: maxBlocks}}, agreement.Certificate{})
+ require.NoError(t, err)
+
+ require.Eventually(t, func() bool {
+ var latest basics.Round
+ err = blockDBs.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ var err0 error
+ latest, err0 = blockdb.BlockLatest(tx)
+ return err0
+ })
+ require.NoError(t, err)
+ return latest == maxBlocks
+ }, 1*time.Second, 10*time.Millisecond)
+
+ blockq.stop()
+
+ err = blockDBs.Rdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
+ var err0 error
+ earliest, err0 = blockdb.BlockEarliest(tx)
+ return err0
+ })
+ require.NoError(t, err)
+ require.Equal(t, test.expectedEarliest, earliest)
+ })
+ }
+}
diff --git a/ledger/boxtxn_test.go b/ledger/boxtxn_test.go
index 3a66583d8..7f42beb14 100644
--- a/ledger/boxtxn_test.go
+++ b/ledger/boxtxn_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/bulletin.go b/ledger/bulletin.go
index 5dc2b99aa..0b3f08a6b 100644
--- a/ledger/bulletin.go
+++ b/ledger/bulletin.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/bulletin_test.go b/ledger/bulletin_test.go
index 88d378447..69bc2525d 100644
--- a/ledger/bulletin_test.go
+++ b/ledger/bulletin_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchpointfileheader.go b/ledger/catchpointfileheader.go
index 21cd6dbd5..f076f7267 100644
--- a/ledger/catchpointfileheader.go
+++ b/ledger/catchpointfileheader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchpointfilewriter.go b/ledger/catchpointfilewriter.go
index 140223c3f..cd58606a2 100644
--- a/ledger/catchpointfilewriter.go
+++ b/ledger/catchpointfilewriter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchpointfilewriter_test.go b/ledger/catchpointfilewriter_test.go
index f378f633a..71a0737fb 100644
--- a/ledger/catchpointfilewriter_test.go
+++ b/ledger/catchpointfilewriter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchpointtracker.go b/ledger/catchpointtracker.go
index 32216fcb2..b50a0d2d1 100644
--- a/ledger/catchpointtracker.go
+++ b/ledger/catchpointtracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -151,8 +151,8 @@ type catchpointTracker struct {
// catchpoint files even before the protocol upgrade took place.
forceCatchpointFileWriting bool
- // catchpointsMu protects roundDigest, reenableCatchpointsRound, cachedDBRound and
- // `lastCatchpointLabel`.
+ // catchpointsMu protects roundDigest, reenableCatchpointsRound, cachedDBRound,
+ // lastCatchpointLabel and balancesTrie.
catchpointsMu deadlock.RWMutex
// cachedDBRound is always exactly tracker DB round (and therefore, accountsRound()),
@@ -555,16 +555,19 @@ func (ct *catchpointTracker) commitRound(ctx context.Context, tx trackerdb.Trans
}
var trie *merkletrie.Trie
+ ct.catchpointsMu.Lock()
if ct.balancesTrie == nil {
trie, err = merkletrie.MakeTrie(mc, trackerdb.TrieMemoryConfig)
if err != nil {
ct.log.Warnf("unable to create merkle trie during committedUpTo: %v", err)
+ ct.catchpointsMu.Unlock()
return err
}
ct.balancesTrie = trie
} else {
ct.balancesTrie.SetCommitter(mc)
}
+ ct.catchpointsMu.Unlock()
treeTargetRound = dbRound + basics.Round(offset)
}
@@ -610,6 +613,7 @@ func (ct *catchpointTracker) commitRound(ctx context.Context, tx trackerdb.Trans
}
func (ct *catchpointTracker) postCommit(ctx context.Context, dcc *deferredCommitContext) {
+ ct.catchpointsMu.Lock()
if ct.balancesTrie != nil {
_, err := ct.balancesTrie.Evict(false)
if err != nil {
@@ -617,7 +621,6 @@ func (ct *catchpointTracker) postCommit(ctx context.Context, dcc *deferredCommit
}
}
- ct.catchpointsMu.Lock()
ct.roundDigest = ct.roundDigest[dcc.offset:]
ct.consensusVersion = ct.consensusVersion[dcc.offset:]
ct.cachedDBRound = dcc.newBase()
@@ -986,7 +989,9 @@ func (ct *catchpointTracker) handleCommitError(dcc *deferredCommitContext) {
// Specifically, modifications to the trie happen through accountsUpdateBalances,
// which happens before commit to disk. Errors in this tracker, subsequent trackers, or the commit to disk may cause the trie cache to be incorrect,
// affecting the perceived root on subsequent rounds
+ ct.catchpointsMu.Lock()
ct.balancesTrie = nil
+ ct.catchpointsMu.Unlock()
ct.cancelWrite(dcc)
}
@@ -1276,9 +1281,11 @@ func (ct *catchpointTracker) recordFirstStageInfo(ctx context.Context, tx tracke
if err != nil {
return err
}
+ ct.catchpointsMu.Lock()
if ct.balancesTrie == nil {
trie, trieErr := merkletrie.MakeTrie(mc, trackerdb.TrieMemoryConfig)
if trieErr != nil {
+ ct.catchpointsMu.Unlock()
return trieErr
}
ct.balancesTrie = trie
@@ -1288,8 +1295,10 @@ func (ct *catchpointTracker) recordFirstStageInfo(ctx context.Context, tx tracke
trieBalancesHash, err := ct.balancesTrie.RootHash()
if err != nil {
+ ct.catchpointsMu.Unlock()
return err
}
+ ct.catchpointsMu.Unlock()
cw, err := tx.MakeCatchpointWriter()
if err != nil {
diff --git a/ledger/catchpointtracker_test.go b/ledger/catchpointtracker_test.go
index a3a450933..60f7366c7 100644
--- a/ledger/catchpointtracker_test.go
+++ b/ledger/catchpointtracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchupaccessor.go b/ledger/catchupaccessor.go
index 3661c6005..315fa6b00 100644
--- a/ledger/catchupaccessor.go
+++ b/ledger/catchupaccessor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/catchupaccessor_test.go b/ledger/catchupaccessor_test.go
index 63b0fa242..37f27c679 100644
--- a/ledger/catchupaccessor_test.go
+++ b/ledger/catchupaccessor_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/double_test.go b/ledger/double_test.go
index 16d38e768..c08212e37 100644
--- a/ledger/double_test.go
+++ b/ledger/double_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/encoded/recordsV5.go b/ledger/encoded/recordsV5.go
index 9af95207c..86f137397 100644
--- a/ledger/encoded/recordsV5.go
+++ b/ledger/encoded/recordsV5.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/encoded/recordsV6.go b/ledger/encoded/recordsV6.go
index 6d0616c80..520f6f2b8 100644
--- a/ledger/encoded/recordsV6.go
+++ b/ledger/encoded/recordsV6.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/encoded/recordsV6_test.go b/ledger/encoded/recordsV6_test.go
index 9e5dd1438..84c43e6c8 100644
--- a/ledger/encoded/recordsV6_test.go
+++ b/ledger/encoded/recordsV6_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/appcow.go b/ledger/eval/appcow.go
index 14815e8e2..ff1c0cc23 100644
--- a/ledger/eval/appcow.go
+++ b/ledger/eval/appcow.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/appcow_test.go b/ledger/eval/appcow_test.go
index a4c8d22c6..60ab1df25 100644
--- a/ledger/eval/appcow_test.go
+++ b/ledger/eval/appcow_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/applications.go b/ledger/eval/applications.go
index 5419bc952..8be898e05 100644
--- a/ledger/eval/applications.go
+++ b/ledger/eval/applications.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/assetcow.go b/ledger/eval/assetcow.go
index 50b710675..6e498d70b 100644
--- a/ledger/eval/assetcow.go
+++ b/ledger/eval/assetcow.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/cow.go b/ledger/eval/cow.go
index f3e6b3d04..269ce570f 100644
--- a/ledger/eval/cow.go
+++ b/ledger/eval/cow.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/cow_creatables.go b/ledger/eval/cow_creatables.go
index 3159d230b..00d90ab5b 100644
--- a/ledger/eval/cow_creatables.go
+++ b/ledger/eval/cow_creatables.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/cow_test.go b/ledger/eval/cow_test.go
index 5e1253adc..06d600d58 100644
--- a/ledger/eval/cow_test.go
+++ b/ledger/eval/cow_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/eval.go b/ledger/eval/eval.go
index 714e6bddf..de1304988 100644
--- a/ledger/eval/eval.go
+++ b/ledger/eval/eval.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/eval_test.go b/ledger/eval/eval_test.go
index cb6bf0878..7884a7f89 100644
--- a/ledger/eval/eval_test.go
+++ b/ledger/eval/eval_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/evalindexer.go b/ledger/eval/evalindexer.go
index af3a5546c..f1185df6f 100644
--- a/ledger/eval/evalindexer.go
+++ b/ledger/eval/evalindexer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/prefetcher/error.go b/ledger/eval/prefetcher/error.go
index 77c1cb999..9c6b8edaf 100644
--- a/ledger/eval/prefetcher/error.go
+++ b/ledger/eval/prefetcher/error.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/prefetcher/prefetcher.go b/ledger/eval/prefetcher/prefetcher.go
index 2187fa1b5..487d37052 100644
--- a/ledger/eval/prefetcher/prefetcher.go
+++ b/ledger/eval/prefetcher/prefetcher.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/prefetcher/prefetcher_alignment_test.go b/ledger/eval/prefetcher/prefetcher_alignment_test.go
index 81ce168d4..57f4c5d92 100644
--- a/ledger/eval/prefetcher/prefetcher_alignment_test.go
+++ b/ledger/eval/prefetcher/prefetcher_alignment_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/prefetcher/prefetcher_test.go b/ledger/eval/prefetcher/prefetcher_test.go
index 2eff5f344..1ec96ad3f 100644
--- a/ledger/eval/prefetcher/prefetcher_test.go
+++ b/ledger/eval/prefetcher/prefetcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/prefetcher/prefetcher_whitebox_test.go b/ledger/eval/prefetcher/prefetcher_whitebox_test.go
index 6a8738b48..13dfceed8 100644
--- a/ledger/eval/prefetcher/prefetcher_whitebox_test.go
+++ b/ledger/eval/prefetcher/prefetcher_whitebox_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/txntracer.go b/ledger/eval/txntracer.go
index f4c6277c7..8736a1fdb 100644
--- a/ledger/eval/txntracer.go
+++ b/ledger/eval/txntracer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval/txntracer_test.go b/ledger/eval/txntracer_test.go
index 4711709c6..6875c99c3 100644
--- a/ledger/eval/txntracer_test.go
+++ b/ledger/eval/txntracer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/eval_simple_test.go b/ledger/eval_simple_test.go
index 606ee4931..7354b4a56 100644
--- a/ledger/eval_simple_test.go
+++ b/ledger/eval_simple_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/evalbench_test.go b/ledger/evalbench_test.go
index b0c3b6780..371cdad87 100644
--- a/ledger/evalbench_test.go
+++ b/ledger/evalbench_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/evalindexer.go b/ledger/evalindexer.go
index 1caa7d8ef..f83dbb980 100644
--- a/ledger/evalindexer.go
+++ b/ledger/evalindexer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/evalindexer_test.go b/ledger/evalindexer_test.go
index 8209bb928..c85d5f027 100644
--- a/ledger/evalindexer_test.go
+++ b/ledger/evalindexer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/fullblock_perf_test.go b/ledger/fullblock_perf_test.go
index cad634a5a..c45963cb1 100644
--- a/ledger/fullblock_perf_test.go
+++ b/ledger/fullblock_perf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledger.go b/ledger/ledger.go
index 458ce3d53..fa1be1a76 100644
--- a/ledger/ledger.go
+++ b/ledger/ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -173,7 +173,7 @@ func OpenLedger[T string | DirsAndPrefix](
start := time.Now()
ledgerInitblocksdbCount.Inc(nil)
err = l.blockDBs.Wdb.Atomic(func(ctx context.Context, tx *sql.Tx) error {
- return initBlocksDB(tx, l, []bookkeeping.Block{genesisInitState.Block}, cfg.Archival)
+ return initBlocksDB(tx, l.log, []bookkeeping.Block{genesisInitState.Block}, cfg.Archival)
})
ledgerInitblocksdbMicros.AddMicrosecondsSince(start, nil)
if err != nil {
@@ -364,7 +364,7 @@ func (l *Ledger) setSynchronousMode(ctx context.Context, synchronousMode db.Sync
// initBlocksDB performs DB initialization:
// - creates and populates it with genesis blocks
// - ensures DB is in good shape for archival mode and resets it if not
-func initBlocksDB(tx *sql.Tx, l *Ledger, initBlocks []bookkeeping.Block, isArchival bool) (err error) {
+func initBlocksDB(tx *sql.Tx, log logging.Logger, initBlocks []bookkeeping.Block, isArchival bool) (err error) {
err = blockdb.BlockInit(tx, initBlocks)
if err != nil {
err = fmt.Errorf("initBlocksDB.blockInit %v", err)
@@ -382,7 +382,7 @@ func initBlocksDB(tx *sql.Tx, l *Ledger, initBlocks []bookkeeping.Block, isArchi
// Detect possible problem - archival node needs all block but have only subsequence of them
// So reset the DB and init it again
if earliest != basics.Round(0) {
- l.log.Warnf("resetting blocks DB (earliest block is %v)", earliest)
+ log.Warnf("resetting blocks DB (earliest block is %v)", earliest)
err := blockdb.BlockResetDB(tx)
if err != nil {
err = fmt.Errorf("initBlocksDB.blockResetDB %v", err)
@@ -657,6 +657,15 @@ func (l *Ledger) CheckDup(currentProto config.ConsensusParams, current basics.Ro
return l.txTail.checkDup(currentProto, current, firstValid, lastValid, txid, txl)
}
+// CheckConfirmedTail checks if a transaction txid happens to have LastValid greater than the current round at the time of calling and has been already committed to the ledger.
+// If both conditions are met it returns true.
+// This function could be used as filter to check if a transaction is committed to the ledger, and no extra checks needed if it says true.
+//
+// Note, this cannot be used to check if transaction happened or not in past MaxTxnLife rounds.
+func (l *Ledger) CheckConfirmedTail(txid transactions.Txid) (basics.Round, bool) {
+ return l.txTail.checkConfirmed(txid)
+}
+
// Latest returns the latest known block round added to the ledger.
func (l *Ledger) Latest() basics.Round {
return l.blockQ.latest()
diff --git a/ledger/ledger_perf_test.go b/ledger/ledger_perf_test.go
index ba76df5e7..f160838ab 100644
--- a/ledger/ledger_perf_test.go
+++ b/ledger/ledger_perf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledger_test.go b/ledger/ledger_test.go
index 19bb6a079..ab5bc293a 100644
--- a/ledger/ledger_test.go
+++ b/ledger/ledger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -27,7 +27,6 @@ import (
"runtime"
"sort"
"testing"
- "time"
"github.com/stretchr/testify/require"
"golang.org/x/exp/slices"
@@ -1443,30 +1442,43 @@ func benchLedgerCache(b *testing.B, startRound basics.Round) {
}
}
-func triggerTrackerFlush(t *testing.T, l *Ledger, genesisInitState ledgercore.InitState) {
+// triggerTrackerFlush is based in the commit flow but executed it in a single (this) goroutine.
+func triggerTrackerFlush(t *testing.T, l *Ledger) {
l.trackers.mu.Lock()
- initialDbRound := l.trackers.dbRound
- currentDbRound := initialDbRound
- l.trackers.lastFlushTime = time.Time{}
+ dbRound := l.trackers.dbRound
l.trackers.mu.Unlock()
- const timeout = 3 * time.Second
- started := time.Now()
+ rnd := l.Latest()
+ minBlock := rnd
+ maxLookback := basics.Round(0)
+ for _, lt := range l.trackers.trackers {
+ retainRound, lookback := lt.committedUpTo(rnd)
+ if retainRound < minBlock {
+ minBlock = retainRound
+ }
+ if lookback > maxLookback {
+ maxLookback = lookback
+ }
+ }
- // We can't truly wait for scheduleCommit to take place, which means without waiting using sleeps
- // we might beat scheduleCommit's addition to accountsWriting, making our wait on it continue immediately.
- // The solution is to continue to add blocks and wait for the advancement of l.trackers.dbRound,
- // which is a side effect of postCommit's success.
- for currentDbRound == initialDbRound {
- time.Sleep(50 * time.Microsecond)
- require.True(t, time.Since(started) < timeout)
- addEmptyValidatedBlock(t, l, genesisInitState.Accounts)
- l.WaitForCommit(l.Latest())
- l.trackers.mu.RLock()
- currentDbRound = l.trackers.dbRound
- l.trackers.mu.RUnlock()
+ dcc := &deferredCommitContext{
+ deferredCommitRange: deferredCommitRange{
+ lookback: maxLookback,
+ },
+ }
+
+ l.trackers.mu.RLock()
+ cdr := l.trackers.produceCommittingTask(rnd, dbRound, &dcc.deferredCommitRange)
+ if cdr != nil {
+ dcc.deferredCommitRange = *cdr
+ } else {
+ dcc = nil
+ }
+ l.trackers.mu.RUnlock()
+ if dcc != nil {
+ l.trackers.accountsWriting.Add(1)
+ l.trackers.commitRound(dcc)
}
- l.trackers.waitAccountsWriting()
}
func testLedgerReload(t *testing.T, cfg config.Local) {
@@ -1646,7 +1658,7 @@ func TestLedgerVerifiesOldStateProofs(t *testing.T) {
backlogPool := execpool.MakeBacklog(nil, 0, execpool.LowPriority, nil)
defer backlogPool.Shutdown()
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
l.WaitForCommit(l.Latest())
blk := createBlkWithStateproof(t, maxBlocks, proto, genesisInitState, l, accounts)
_, err = l.Validate(context.Background(), blk, backlogPool)
@@ -1656,7 +1668,7 @@ func TestLedgerVerifiesOldStateProofs(t *testing.T) {
addDummyBlock(t, addresses, proto, l, initKeys, genesisInitState)
}
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
addDummyBlock(t, addresses, proto, l, initKeys, genesisInitState)
l.WaitForCommit(l.Latest())
// At this point the block queue go-routine will start removing block . However, it might not complete the task
@@ -2767,11 +2779,11 @@ func verifyVotersContent(t *testing.T, expected map[basics.Round]*ledgercore.Vot
func triggerDeleteVoters(t *testing.T, l *Ledger, genesisInitState ledgercore.InitState) {
// We make the ledger flush tracker data to allow votersTracker to advance lowestRound
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
// We add another block to make the block queue query the voter's tracker lowest round again, which allows it to forget
// rounds based on the new lowest round.
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
}
func testVotersReloadFromDisk(t *testing.T, cfg config.Local) {
@@ -2796,7 +2808,7 @@ func testVotersReloadFromDisk(t *testing.T, cfg config.Local) {
// at this point the database should contain the voter for round 256 but the voters for round 512 should be in deltas
l.WaitForCommit(l.Latest())
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
vtSnapshot := l.acctsOnline.voters.votersForRoundCache
// ensuring no tree was evicted.
@@ -2865,11 +2877,13 @@ func testVotersReloadFromDiskAfterOneStateProofCommitted(t *testing.T, cfg confi
}
triggerDeleteVoters(t, l, genesisInitState)
+ l.acctsOnline.voters.votersMu.Lock()
vtSnapshot := l.acctsOnline.voters.votersForRoundCache
// verifying that the tree for round 512 is still in the cache, but the tree for round 256 is evicted.
require.Contains(t, vtSnapshot, basics.Round(496))
require.NotContains(t, vtSnapshot, basics.Round(240))
+ l.acctsOnline.voters.votersMu.Unlock()
err = l.reloadLedger()
require.NoError(t, err)
@@ -3028,7 +3042,7 @@ func TestLedgerSPVerificationTracker(t *testing.T) {
}
l.WaitForCommit(l.Latest())
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
verifyStateProofVerificationTracking(t, &l.spVerification, basics.Round(firstStateProofContextTargetRound),
numOfStateProofs-1, proto.StateProofInterval, true, trackerDB)
@@ -3037,7 +3051,7 @@ func TestLedgerSPVerificationTracker(t *testing.T) {
1, proto.StateProofInterval, true, trackerMemory)
l.WaitForCommit(l.Latest())
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
verifyStateProofVerificationTracking(t, &l.spVerification, basics.Round(firstStateProofContextTargetRound),
numOfStateProofs, proto.StateProofInterval, true, spverDBLoc)
@@ -3063,7 +3077,7 @@ func TestLedgerSPVerificationTracker(t *testing.T) {
}
l.WaitForCommit(blk.BlockHeader.Round)
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
verifyStateProofVerificationTracking(t, &l.spVerification, basics.Round(firstStateProofContextTargetRound),
1, proto.StateProofInterval, false, spverDBLoc)
@@ -3101,16 +3115,7 @@ func TestLedgerReloadStateProofVerificationTracker(t *testing.T) {
// trigger trackers flush
// first ensure the block is committed into blockdb
l.WaitForCommit(l.Latest())
- // wait for any pending tracker flushes
- l.trackers.waitAccountsWriting()
- // force flush as needed
- if l.LatestTrackerCommitted() < l.Latest()+basics.Round(cfg.MaxAcctLookback) {
- l.trackers.mu.Lock()
- l.trackers.lastFlushTime = time.Time{}
- l.trackers.mu.Unlock()
- l.notifyCommit(l.Latest())
- l.trackers.waitAccountsWriting()
- }
+ triggerTrackerFlush(t, l)
verifyStateProofVerificationTracking(t, &l.spVerification, basics.Round(firstStateProofContextTargetRound),
numOfStateProofs-1, proto.StateProofInterval, true, trackerDB)
@@ -3167,7 +3172,7 @@ func TestLedgerCatchpointSPVerificationTracker(t *testing.T) {
// Feeding blocks until we can know for sure we have at least one catchpoint written.
blk = feedBlocksUntilRound(t, l, blk, basics.Round(cfg.CatchpointInterval*2))
l.WaitForCommit(basics.Round(cfg.CatchpointInterval * 2))
- triggerTrackerFlush(t, l, genesisInitState)
+ triggerTrackerFlush(t, l)
numTrackedDataFirstCatchpoint := (cfg.CatchpointInterval - proto.MaxBalLookback) / proto.StateProofInterval
@@ -3244,16 +3249,7 @@ func TestLedgerSPTrackerAfterReplay(t *testing.T) {
// first ensure the block is committed into blockdb
l.WaitForCommit(l.Latest())
- // wait for any pending tracker flushes
- l.trackers.waitAccountsWriting()
- // force flush as needed
- if l.LatestTrackerCommitted() < l.Latest()+basics.Round(cfg.MaxAcctLookback) {
- l.trackers.mu.Lock()
- l.trackers.lastFlushTime = time.Time{}
- l.trackers.mu.Unlock()
- l.notifyCommit(spblk.BlockHeader.Round)
- l.trackers.waitAccountsWriting()
- }
+ triggerTrackerFlush(t, l)
err = l.reloadLedger()
a.NoError(err)
diff --git a/ledger/ledgercore/accountdata.go b/ledger/ledgercore/accountdata.go
index 69e2c543e..3685d1690 100644
--- a/ledger/ledgercore/accountdata.go
+++ b/ledger/ledgercore/accountdata.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/accountdata_test.go b/ledger/ledgercore/accountdata_test.go
index 76eb82d0d..fd345eff6 100644
--- a/ledger/ledgercore/accountdata_test.go
+++ b/ledger/ledgercore/accountdata_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/accountresource.go b/ledger/ledgercore/accountresource.go
index 4d22ec0dc..e1b13e71d 100644
--- a/ledger/ledgercore/accountresource.go
+++ b/ledger/ledgercore/accountresource.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/catchpointlabel.go b/ledger/ledgercore/catchpointlabel.go
index 6ed5cfd27..b80a0bc1e 100644
--- a/ledger/ledgercore/catchpointlabel.go
+++ b/ledger/ledgercore/catchpointlabel.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/catchpointlabel_test.go b/ledger/ledgercore/catchpointlabel_test.go
index d2b0ad41f..d5c8a9b0e 100644
--- a/ledger/ledgercore/catchpointlabel_test.go
+++ b/ledger/ledgercore/catchpointlabel_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/error.go b/ledger/ledgercore/error.go
index f5d347d6f..e2084584b 100644
--- a/ledger/ledgercore/error.go
+++ b/ledger/ledgercore/error.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/misc.go b/ledger/ledgercore/misc.go
index 86fc2c3ff..c0e72da43 100644
--- a/ledger/ledgercore/misc.go
+++ b/ledger/ledgercore/misc.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/onlineacct.go b/ledger/ledgercore/onlineacct.go
index 690ebcfe5..8a6b771aa 100644
--- a/ledger/ledgercore/onlineacct.go
+++ b/ledger/ledgercore/onlineacct.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/statedelta.go b/ledger/ledgercore/statedelta.go
index a730af251..b735d391f 100644
--- a/ledger/ledgercore/statedelta.go
+++ b/ledger/ledgercore/statedelta.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/statedelta_test.go b/ledger/ledgercore/statedelta_test.go
index 2e683a410..1e2efabe0 100644
--- a/ledger/ledgercore/statedelta_test.go
+++ b/ledger/ledgercore/statedelta_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/stateproofverification.go b/ledger/ledgercore/stateproofverification.go
index 0220185a2..19d1134f7 100644
--- a/ledger/ledgercore/stateproofverification.go
+++ b/ledger/ledgercore/stateproofverification.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/totals.go b/ledger/ledgercore/totals.go
index 904cac911..22708586b 100644
--- a/ledger/ledgercore/totals.go
+++ b/ledger/ledgercore/totals.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/totals_test.go b/ledger/ledgercore/totals_test.go
index 66f4e09ac..b9353ba6b 100644
--- a/ledger/ledgercore/totals_test.go
+++ b/ledger/ledgercore/totals_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/validatedBlock.go b/ledger/ledgercore/validatedBlock.go
index 84d09e2a9..541a3a54f 100644
--- a/ledger/ledgercore/validatedBlock.go
+++ b/ledger/ledgercore/validatedBlock.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/ledgercore/votersForRound.go b/ledger/ledgercore/votersForRound.go
index 4cce400bc..7ab103dcd 100644
--- a/ledger/ledgercore/votersForRound.go
+++ b/ledger/ledgercore/votersForRound.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruaccts.go b/ledger/lruaccts.go
index 7d3b60145..6b127c060 100644
--- a/ledger/lruaccts.go
+++ b/ledger/lruaccts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruaccts_test.go b/ledger/lruaccts_test.go
index 84674fc62..4ddca0d4d 100644
--- a/ledger/lruaccts_test.go
+++ b/ledger/lruaccts_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lrukv.go b/ledger/lrukv.go
index ef283faec..cc64c6f66 100644
--- a/ledger/lrukv.go
+++ b/ledger/lrukv.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lrukv_test.go b/ledger/lrukv_test.go
index 35345091b..70b49cef0 100644
--- a/ledger/lrukv_test.go
+++ b/ledger/lrukv_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruonlineaccts.go b/ledger/lruonlineaccts.go
index 297fb0332..e96eb9212 100644
--- a/ledger/lruonlineaccts.go
+++ b/ledger/lruonlineaccts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruonlineaccts_test.go b/ledger/lruonlineaccts_test.go
index ae1a8a773..0f3bc8171 100644
--- a/ledger/lruonlineaccts_test.go
+++ b/ledger/lruonlineaccts_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruresources.go b/ledger/lruresources.go
index 6a0367b7a..58d66d360 100644
--- a/ledger/lruresources.go
+++ b/ledger/lruresources.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/lruresources_test.go b/ledger/lruresources_test.go
index b678ea742..6d3193883 100644
--- a/ledger/lruresources_test.go
+++ b/ledger/lruresources_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/metrics.go b/ledger/metrics.go
index 017960d90..7a56d58d5 100644
--- a/ledger/metrics.go
+++ b/ledger/metrics.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/metrics_test.go b/ledger/metrics_test.go
index bca0b6bcc..3f9eed305 100644
--- a/ledger/metrics_test.go
+++ b/ledger/metrics_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/notifier.go b/ledger/notifier.go
index c9ea45e41..aabf62d08 100644
--- a/ledger/notifier.go
+++ b/ledger/notifier.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/onlineaccountscache.go b/ledger/onlineaccountscache.go
index 8340d2d4d..e6145a4e4 100644
--- a/ledger/onlineaccountscache.go
+++ b/ledger/onlineaccountscache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/onlineaccountscache_test.go b/ledger/onlineaccountscache_test.go
index 0d4de85fc..b64d18aab 100644
--- a/ledger/onlineaccountscache_test.go
+++ b/ledger/onlineaccountscache_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/onlinetopheap.go b/ledger/onlinetopheap.go
index 6d3ba155d..412f36154 100644
--- a/ledger/onlinetopheap.go
+++ b/ledger/onlinetopheap.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/onlinetopheap_test.go b/ledger/onlinetopheap_test.go
index 10a068aa9..69fbd5da3 100644
--- a/ledger/onlinetopheap_test.go
+++ b/ledger/onlinetopheap_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/perf_test.go b/ledger/perf_test.go
index 68e9ab76c..ffeb82cf0 100644
--- a/ledger/perf_test.go
+++ b/ledger/perf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simple_test.go b/ledger/simple_test.go
index 1f4c61290..10b87f937 100644
--- a/ledger/simple_test.go
+++ b/ledger/simple_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/initialStates.go b/ledger/simulation/initialStates.go
index e374719cc..079a38fa6 100644
--- a/ledger/simulation/initialStates.go
+++ b/ledger/simulation/initialStates.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/resources.go b/ledger/simulation/resources.go
index ff4d90727..3b4546cd2 100644
--- a/ledger/simulation/resources.go
+++ b/ledger/simulation/resources.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/resources_test.go b/ledger/simulation/resources_test.go
index 8afcadfa6..b154031f5 100644
--- a/ledger/simulation/resources_test.go
+++ b/ledger/simulation/resources_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/simulation_eval_test.go b/ledger/simulation/simulation_eval_test.go
index 7d2bf8380..41482e72e 100644
--- a/ledger/simulation/simulation_eval_test.go
+++ b/ledger/simulation/simulation_eval_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -6813,7 +6813,7 @@ int 1`,
input: simulation.Request{
TxnGroups: [][]transactions.SignedTxn{txgroup},
},
- expectedError: "logic eval error: this transaction should be issued by the manager",
+ expectedError: "this transaction should be issued by the manager",
expected: simulation.Result{
Version: simulation.ResultLatestVersion,
LastRound: env.TxnInfo.LatestRound(),
diff --git a/ledger/simulation/simulator.go b/ledger/simulation/simulator.go
index be9f29556..0a33e5f12 100644
--- a/ledger/simulation/simulator.go
+++ b/ledger/simulation/simulator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/simulator_test.go b/ledger/simulation/simulator_test.go
index 5c9d2ad8e..95cafe12e 100644
--- a/ledger/simulation/simulator_test.go
+++ b/ledger/simulation/simulator_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/testing/utils.go b/ledger/simulation/testing/utils.go
index d14105810..ae43fe72f 100644
--- a/ledger/simulation/testing/utils.go
+++ b/ledger/simulation/testing/utils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/trace.go b/ledger/simulation/trace.go
index 99ac9b416..09d51f319 100644
--- a/ledger/simulation/trace.go
+++ b/ledger/simulation/trace.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/tracer.go b/ledger/simulation/tracer.go
index e590250c9..b867cf6aa 100644
--- a/ledger/simulation/tracer.go
+++ b/ledger/simulation/tracer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/simulation/tracer_test.go b/ledger/simulation/tracer_test.go
index 190739e73..b62f52fef 100644
--- a/ledger/simulation/tracer_test.go
+++ b/ledger/simulation/tracer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/spverificationtracker.go b/ledger/spverificationtracker.go
index c34825a9c..b43036898 100644
--- a/ledger/spverificationtracker.go
+++ b/ledger/spverificationtracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/spverificationtracker_test.go b/ledger/spverificationtracker_test.go
index 47d85bab3..7bba5eac8 100644
--- a/ledger/spverificationtracker_test.go
+++ b/ledger/spverificationtracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/blockdb/blockdb.go b/ledger/store/blockdb/blockdb.go
index bbd11d6c1..9b0c80dce 100644
--- a/ledger/store/blockdb/blockdb.go
+++ b/ledger/store/blockdb/blockdb.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/blockdb/blockdb_test.go b/ledger/store/blockdb/blockdb_test.go
index 858e561e4..149c1a3dd 100644
--- a/ledger/store/blockdb/blockdb_test.go
+++ b/ledger/store/blockdb/blockdb_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/testing/helpers.go b/ledger/store/testing/helpers.go
index b9e41ee28..e03b09b85 100644
--- a/ledger/store/testing/helpers.go
+++ b/ledger/store/testing/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/catchpoint.go b/ledger/store/trackerdb/catchpoint.go
index 7c67155d4..ad6c9a236 100644
--- a/ledger/store/trackerdb/catchpoint.go
+++ b/ledger/store/trackerdb/catchpoint.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/data.go b/ledger/store/trackerdb/data.go
index 264c05582..fc243b2b9 100644
--- a/ledger/store/trackerdb/data.go
+++ b/ledger/store/trackerdb/data.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/data_test.go b/ledger/store/trackerdb/data_test.go
index fe253304f..e329a84e7 100644
--- a/ledger/store/trackerdb/data_test.go
+++ b/ledger/store/trackerdb/data_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/accounts_reader.go b/ledger/store/trackerdb/dualdriver/accounts_reader.go
index 1ceb8a5a2..b39aadd7c 100644
--- a/ledger/store/trackerdb/dualdriver/accounts_reader.go
+++ b/ledger/store/trackerdb/dualdriver/accounts_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/accounts_reader_ext.go b/ledger/store/trackerdb/dualdriver/accounts_reader_ext.go
index 4fd389185..6f241d3e5 100644
--- a/ledger/store/trackerdb/dualdriver/accounts_reader_ext.go
+++ b/ledger/store/trackerdb/dualdriver/accounts_reader_ext.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/accounts_writer.go b/ledger/store/trackerdb/dualdriver/accounts_writer.go
index 318ccd36c..586ce9697 100644
--- a/ledger/store/trackerdb/dualdriver/accounts_writer.go
+++ b/ledger/store/trackerdb/dualdriver/accounts_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/accounts_writer_ext.go b/ledger/store/trackerdb/dualdriver/accounts_writer_ext.go
index 27b74381f..b30e2fd79 100644
--- a/ledger/store/trackerdb/dualdriver/accounts_writer_ext.go
+++ b/ledger/store/trackerdb/dualdriver/accounts_writer_ext.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/dualdriver.go b/ledger/store/trackerdb/dualdriver/dualdriver.go
index 505a100bb..c7763dace 100644
--- a/ledger/store/trackerdb/dualdriver/dualdriver.go
+++ b/ledger/store/trackerdb/dualdriver/dualdriver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/online_accounts_reader.go b/ledger/store/trackerdb/dualdriver/online_accounts_reader.go
index 60fec84dd..f67689c02 100644
--- a/ledger/store/trackerdb/dualdriver/online_accounts_reader.go
+++ b/ledger/store/trackerdb/dualdriver/online_accounts_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/online_accounts_writer.go b/ledger/store/trackerdb/dualdriver/online_accounts_writer.go
index 823ed54ee..97a03062f 100644
--- a/ledger/store/trackerdb/dualdriver/online_accounts_writer.go
+++ b/ledger/store/trackerdb/dualdriver/online_accounts_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/stateproof_reader.go b/ledger/store/trackerdb/dualdriver/stateproof_reader.go
index 1ed61b4eb..cdb4093bb 100644
--- a/ledger/store/trackerdb/dualdriver/stateproof_reader.go
+++ b/ledger/store/trackerdb/dualdriver/stateproof_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/stateproof_writer.go b/ledger/store/trackerdb/dualdriver/stateproof_writer.go
index 208ce3cbd..25ca52da3 100644
--- a/ledger/store/trackerdb/dualdriver/stateproof_writer.go
+++ b/ledger/store/trackerdb/dualdriver/stateproof_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/dualdriver/transaction_for_testing.go b/ledger/store/trackerdb/dualdriver/transaction_for_testing.go
index 18ba888a5..a6946e790 100644
--- a/ledger/store/trackerdb/dualdriver/transaction_for_testing.go
+++ b/ledger/store/trackerdb/dualdriver/transaction_for_testing.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/accounts_ext_reader.go b/ledger/store/trackerdb/generickv/accounts_ext_reader.go
index 132149da6..af2730a51 100644
--- a/ledger/store/trackerdb/generickv/accounts_ext_reader.go
+++ b/ledger/store/trackerdb/generickv/accounts_ext_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/accounts_ext_writer.go b/ledger/store/trackerdb/generickv/accounts_ext_writer.go
index c135f73c5..b50a5363f 100644
--- a/ledger/store/trackerdb/generickv/accounts_ext_writer.go
+++ b/ledger/store/trackerdb/generickv/accounts_ext_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/accounts_reader.go b/ledger/store/trackerdb/generickv/accounts_reader.go
index 7cbdc93f1..063b5a35f 100644
--- a/ledger/store/trackerdb/generickv/accounts_reader.go
+++ b/ledger/store/trackerdb/generickv/accounts_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/accounts_writer.go b/ledger/store/trackerdb/generickv/accounts_writer.go
index 42530e768..590ba4fcf 100644
--- a/ledger/store/trackerdb/generickv/accounts_writer.go
+++ b/ledger/store/trackerdb/generickv/accounts_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/catchpoint.go b/ledger/store/trackerdb/generickv/catchpoint.go
index 99c8a7d95..8a21bb545 100644
--- a/ledger/store/trackerdb/generickv/catchpoint.go
+++ b/ledger/store/trackerdb/generickv/catchpoint.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/init_accounts.go b/ledger/store/trackerdb/generickv/init_accounts.go
index af587af10..39f6f2524 100644
--- a/ledger/store/trackerdb/generickv/init_accounts.go
+++ b/ledger/store/trackerdb/generickv/init_accounts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/migrations.go b/ledger/store/trackerdb/generickv/migrations.go
index e3d04ba5c..c2a0d0f20 100644
--- a/ledger/store/trackerdb/generickv/migrations.go
+++ b/ledger/store/trackerdb/generickv/migrations.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/onlineaccounts_reader.go b/ledger/store/trackerdb/generickv/onlineaccounts_reader.go
index 573bf478f..0b72cbc5d 100644
--- a/ledger/store/trackerdb/generickv/onlineaccounts_reader.go
+++ b/ledger/store/trackerdb/generickv/onlineaccounts_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/onlineaccounts_writer.go b/ledger/store/trackerdb/generickv/onlineaccounts_writer.go
index 054d75e87..83a194022 100644
--- a/ledger/store/trackerdb/generickv/onlineaccounts_writer.go
+++ b/ledger/store/trackerdb/generickv/onlineaccounts_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/reader.go b/ledger/store/trackerdb/generickv/reader.go
index 1532f2fca..454a4eb9d 100644
--- a/ledger/store/trackerdb/generickv/reader.go
+++ b/ledger/store/trackerdb/generickv/reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/schema.go b/ledger/store/trackerdb/generickv/schema.go
index 0c3abf894..47168a128 100644
--- a/ledger/store/trackerdb/generickv/schema.go
+++ b/ledger/store/trackerdb/generickv/schema.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/stateproof_reader.go b/ledger/store/trackerdb/generickv/stateproof_reader.go
index 18bce01c4..5cd96c44e 100644
--- a/ledger/store/trackerdb/generickv/stateproof_reader.go
+++ b/ledger/store/trackerdb/generickv/stateproof_reader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/stateproof_writer.go b/ledger/store/trackerdb/generickv/stateproof_writer.go
index 9aa714518..8ef45b1b7 100644
--- a/ledger/store/trackerdb/generickv/stateproof_writer.go
+++ b/ledger/store/trackerdb/generickv/stateproof_writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/generickv/writer.go b/ledger/store/trackerdb/generickv/writer.go
index c5d8dcfc0..8975c97c6 100644
--- a/ledger/store/trackerdb/generickv/writer.go
+++ b/ledger/store/trackerdb/generickv/writer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/hashing.go b/ledger/store/trackerdb/hashing.go
index 7a866087c..4a0122436 100644
--- a/ledger/store/trackerdb/hashing.go
+++ b/ledger/store/trackerdb/hashing.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/interface.go b/ledger/store/trackerdb/interface.go
index 62203e595..8d88f0d42 100644
--- a/ledger/store/trackerdb/interface.go
+++ b/ledger/store/trackerdb/interface.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/params.go b/ledger/store/trackerdb/params.go
index 64d5be931..276bf19bd 100644
--- a/ledger/store/trackerdb/params.go
+++ b/ledger/store/trackerdb/params.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/pebbledbdriver/pebbledriver.go b/ledger/store/trackerdb/pebbledbdriver/pebbledriver.go
index 514dc0ee5..7d1b39401 100644
--- a/ledger/store/trackerdb/pebbledbdriver/pebbledriver.go
+++ b/ledger/store/trackerdb/pebbledbdriver/pebbledriver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/pebbledbdriver/pebbledriver_arm.go b/ledger/store/trackerdb/pebbledbdriver/pebbledriver_arm.go
index cd17555ae..205ab07e6 100644
--- a/ledger/store/trackerdb/pebbledbdriver/pebbledriver_arm.go
+++ b/ledger/store/trackerdb/pebbledbdriver/pebbledriver_arm.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/pebbledbdriver/testing.go b/ledger/store/trackerdb/pebbledbdriver/testing.go
index 2724eb01f..c433b4df8 100644
--- a/ledger/store/trackerdb/pebbledbdriver/testing.go
+++ b/ledger/store/trackerdb/pebbledbdriver/testing.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/accountsV2.go b/ledger/store/trackerdb/sqlitedriver/accountsV2.go
index ec48265fa..bb20285d9 100644
--- a/ledger/store/trackerdb/sqlitedriver/accountsV2.go
+++ b/ledger/store/trackerdb/sqlitedriver/accountsV2.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/accountsV2_test.go b/ledger/store/trackerdb/sqlitedriver/accountsV2_test.go
index 1e4a2217f..4aa508e9b 100644
--- a/ledger/store/trackerdb/sqlitedriver/accountsV2_test.go
+++ b/ledger/store/trackerdb/sqlitedriver/accountsV2_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/catchpoint.go b/ledger/store/trackerdb/sqlitedriver/catchpoint.go
index ef63b7a7f..cdda10978 100644
--- a/ledger/store/trackerdb/sqlitedriver/catchpoint.go
+++ b/ledger/store/trackerdb/sqlitedriver/catchpoint.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/catchpointPendingHashesIter.go b/ledger/store/trackerdb/sqlitedriver/catchpointPendingHashesIter.go
index 611c67c87..2fdf13eb0 100644
--- a/ledger/store/trackerdb/sqlitedriver/catchpointPendingHashesIter.go
+++ b/ledger/store/trackerdb/sqlitedriver/catchpointPendingHashesIter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/catchpoint_test.go b/ledger/store/trackerdb/sqlitedriver/catchpoint_test.go
index e2c57c0f0..72af28e39 100644
--- a/ledger/store/trackerdb/sqlitedriver/catchpoint_test.go
+++ b/ledger/store/trackerdb/sqlitedriver/catchpoint_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/encodedAccountsIter.go b/ledger/store/trackerdb/sqlitedriver/encodedAccountsIter.go
index 6dc3b6722..7d2829d3e 100644
--- a/ledger/store/trackerdb/sqlitedriver/encodedAccountsIter.go
+++ b/ledger/store/trackerdb/sqlitedriver/encodedAccountsIter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/kvsIter.go b/ledger/store/trackerdb/sqlitedriver/kvsIter.go
index 3beb6ae0d..4ae08962a 100644
--- a/ledger/store/trackerdb/sqlitedriver/kvsIter.go
+++ b/ledger/store/trackerdb/sqlitedriver/kvsIter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/merkle_committer.go b/ledger/store/trackerdb/sqlitedriver/merkle_committer.go
index 052dfdac9..25425d08e 100644
--- a/ledger/store/trackerdb/sqlitedriver/merkle_committer.go
+++ b/ledger/store/trackerdb/sqlitedriver/merkle_committer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/orderedAccountsIter.go b/ledger/store/trackerdb/sqlitedriver/orderedAccountsIter.go
index 275200113..4b021e5ae 100644
--- a/ledger/store/trackerdb/sqlitedriver/orderedAccountsIter.go
+++ b/ledger/store/trackerdb/sqlitedriver/orderedAccountsIter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/schema.go b/ledger/store/trackerdb/sqlitedriver/schema.go
index ea6f57786..369ff264e 100644
--- a/ledger/store/trackerdb/sqlitedriver/schema.go
+++ b/ledger/store/trackerdb/sqlitedriver/schema.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/schema_test.go b/ledger/store/trackerdb/sqlitedriver/schema_test.go
index 581082447..e7aee0b2a 100644
--- a/ledger/store/trackerdb/sqlitedriver/schema_test.go
+++ b/ledger/store/trackerdb/sqlitedriver/schema_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/spVerificationAccessor.go b/ledger/store/trackerdb/sqlitedriver/spVerificationAccessor.go
index 0354a3c83..b5eb3f0cc 100644
--- a/ledger/store/trackerdb/sqlitedriver/spVerificationAccessor.go
+++ b/ledger/store/trackerdb/sqlitedriver/spVerificationAccessor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/sql.go b/ledger/store/trackerdb/sqlitedriver/sql.go
index 0621dc175..634c7f54e 100644
--- a/ledger/store/trackerdb/sqlitedriver/sql.go
+++ b/ledger/store/trackerdb/sqlitedriver/sql.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/sql_test.go b/ledger/store/trackerdb/sqlitedriver/sql_test.go
index 65e4782b5..86333b96c 100644
--- a/ledger/store/trackerdb/sqlitedriver/sql_test.go
+++ b/ledger/store/trackerdb/sqlitedriver/sql_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/sqlitedriver.go b/ledger/store/trackerdb/sqlitedriver/sqlitedriver.go
index 02c290be2..07459fa0c 100644
--- a/ledger/store/trackerdb/sqlitedriver/sqlitedriver.go
+++ b/ledger/store/trackerdb/sqlitedriver/sqlitedriver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/testing.go b/ledger/store/trackerdb/sqlitedriver/testing.go
index 4fed5e472..49736a681 100644
--- a/ledger/store/trackerdb/sqlitedriver/testing.go
+++ b/ledger/store/trackerdb/sqlitedriver/testing.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/sqlitedriver/trackerdbV2.go b/ledger/store/trackerdb/sqlitedriver/trackerdbV2.go
index 0f59a5ce5..db1416b52 100644
--- a/ledger/store/trackerdb/sqlitedriver/trackerdbV2.go
+++ b/ledger/store/trackerdb/sqlitedriver/trackerdbV2.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/store.go b/ledger/store/trackerdb/store.go
index 4140f5be1..735550ed9 100644
--- a/ledger/store/trackerdb/store.go
+++ b/ledger/store/trackerdb/store.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testdb/testdb.go b/ledger/store/trackerdb/testdb/testdb.go
index d5b524ade..05acf777c 100644
--- a/ledger/store/trackerdb/testdb/testdb.go
+++ b/ledger/store/trackerdb/testdb/testdb.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testinterface.go b/ledger/store/trackerdb/testinterface.go
index a406375a2..a67cc79e4 100644
--- a/ledger/store/trackerdb/testinterface.go
+++ b/ledger/store/trackerdb/testinterface.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/accounts_ext_kv_test.go b/ledger/store/trackerdb/testsuite/accounts_ext_kv_test.go
index aebabd781..227a80d5f 100644
--- a/ledger/store/trackerdb/testsuite/accounts_ext_kv_test.go
+++ b/ledger/store/trackerdb/testsuite/accounts_ext_kv_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/accounts_kv_test.go b/ledger/store/trackerdb/testsuite/accounts_kv_test.go
index 1ca7b742a..115e95890 100644
--- a/ledger/store/trackerdb/testsuite/accounts_kv_test.go
+++ b/ledger/store/trackerdb/testsuite/accounts_kv_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/dbsemantics_test.go b/ledger/store/trackerdb/testsuite/dbsemantics_test.go
index b155b918a..5c711ffb5 100644
--- a/ledger/store/trackerdb/testsuite/dbsemantics_test.go
+++ b/ledger/store/trackerdb/testsuite/dbsemantics_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/dual_test.go b/ledger/store/trackerdb/testsuite/dual_test.go
index 1b1cc61ec..a8fe7e4b3 100644
--- a/ledger/store/trackerdb/testsuite/dual_test.go
+++ b/ledger/store/trackerdb/testsuite/dual_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/migration_test.go b/ledger/store/trackerdb/testsuite/migration_test.go
index 10d9c7473..d6b14ebdb 100644
--- a/ledger/store/trackerdb/testsuite/migration_test.go
+++ b/ledger/store/trackerdb/testsuite/migration_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/mockdb_test.go b/ledger/store/trackerdb/testsuite/mockdb_test.go
index cc9397f2b..8d1ac0ea8 100644
--- a/ledger/store/trackerdb/testsuite/mockdb_test.go
+++ b/ledger/store/trackerdb/testsuite/mockdb_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/onlineaccounts_kv_test.go b/ledger/store/trackerdb/testsuite/onlineaccounts_kv_test.go
index f4064658c..f71f4ae1d 100644
--- a/ledger/store/trackerdb/testsuite/onlineaccounts_kv_test.go
+++ b/ledger/store/trackerdb/testsuite/onlineaccounts_kv_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/pebbledb_test.go b/ledger/store/trackerdb/testsuite/pebbledb_test.go
index 56f614b7e..eecb1d555 100644
--- a/ledger/store/trackerdb/testsuite/pebbledb_test.go
+++ b/ledger/store/trackerdb/testsuite/pebbledb_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/sqlitedb_test.go b/ledger/store/trackerdb/testsuite/sqlitedb_test.go
index c4a3d1a7b..5a0d942ab 100644
--- a/ledger/store/trackerdb/testsuite/sqlitedb_test.go
+++ b/ledger/store/trackerdb/testsuite/sqlitedb_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/stateproofs_kv_test.go b/ledger/store/trackerdb/testsuite/stateproofs_kv_test.go
index bc4214173..e9341a653 100644
--- a/ledger/store/trackerdb/testsuite/stateproofs_kv_test.go
+++ b/ledger/store/trackerdb/testsuite/stateproofs_kv_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/testsuite/utils_test.go b/ledger/store/trackerdb/testsuite/utils_test.go
index 7862155d0..826402a35 100644
--- a/ledger/store/trackerdb/testsuite/utils_test.go
+++ b/ledger/store/trackerdb/testsuite/utils_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/utils.go b/ledger/store/trackerdb/utils.go
index 0d9e8b4d8..96c562a56 100644
--- a/ledger/store/trackerdb/utils.go
+++ b/ledger/store/trackerdb/utils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/store/trackerdb/version.go b/ledger/store/trackerdb/version.go
index e619d2dd5..bf81dce82 100644
--- a/ledger/store/trackerdb/version.go
+++ b/ledger/store/trackerdb/version.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/accountsTotals.go b/ledger/testing/accountsTotals.go
index 48109cc84..686889c4d 100644
--- a/ledger/testing/accountsTotals.go
+++ b/ledger/testing/accountsTotals.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/consensusRange.go b/ledger/testing/consensusRange.go
index 97693bbe2..199a462af 100644
--- a/ledger/testing/consensusRange.go
+++ b/ledger/testing/consensusRange.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/consensusRange_test.go b/ledger/testing/consensusRange_test.go
index f1a9c179e..9b270e3bf 100644
--- a/ledger/testing/consensusRange_test.go
+++ b/ledger/testing/consensusRange_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/initState.go b/ledger/testing/initState.go
index 374c1d6c4..a58a7c8f2 100644
--- a/ledger/testing/initState.go
+++ b/ledger/testing/initState.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/randomAccounts.go b/ledger/testing/randomAccounts.go
index fd4f3b415..2d5f79c82 100644
--- a/ledger/testing/randomAccounts.go
+++ b/ledger/testing/randomAccounts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/randomAccounts_test.go b/ledger/testing/randomAccounts_test.go
index 0829c4340..9f69321aa 100644
--- a/ledger/testing/randomAccounts_test.go
+++ b/ledger/testing/randomAccounts_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/testGenesis.go b/ledger/testing/testGenesis.go
index 98a41d06d..a2d469dcf 100644
--- a/ledger/testing/testGenesis.go
+++ b/ledger/testing/testGenesis.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/testing/withAndWithoutCache.go b/ledger/testing/withAndWithoutCache.go
index 0bb1e7509..a59d296c6 100644
--- a/ledger/testing/withAndWithoutCache.go
+++ b/ledger/testing/withAndWithoutCache.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/tracker.go b/ledger/tracker.go
index 37fa6adf5..6d976a976 100644
--- a/ledger/tracker.go
+++ b/ledger/tracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/tracker_test.go b/ledger/tracker_test.go
index d16fb925c..1c8a99ff4 100644
--- a/ledger/tracker_test.go
+++ b/ledger/tracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/trackerdb.go b/ledger/trackerdb.go
index bf2307581..581eae6f7 100644
--- a/ledger/trackerdb.go
+++ b/ledger/trackerdb.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/txnbench_test.go b/ledger/txnbench_test.go
index f2b4b8aa4..9cd910f96 100644
--- a/ledger/txnbench_test.go
+++ b/ledger/txnbench_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/txtail.go b/ledger/txtail.go
index 6f05b47f9..129fbb398 100644
--- a/ledger/txtail.go
+++ b/ledger/txtail.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -80,7 +80,9 @@ type txTail struct {
// lastValid, recent, lowWaterMark, roundTailHashes, roundTailSerializedDeltas and blockHeaderData.
tailMu deadlock.RWMutex
- lastValid map[basics.Round]map[transactions.Txid]struct{} // map tx.LastValid -> tx confirmed set
+ // lastValid allows looking up all of the transactions that expire in a given round.
+ // The map for an expiration round gives the round the transaction was originally confirmed, so it can be found for the /pending endpoint.
+ lastValid map[basics.Round]map[transactions.Txid]uint16 // map tx.LastValid -> tx confirmed map: txid -> (last valid - confirmed) delta
// duplicate detection queries with LastValid before
// lowWaterMark are not guaranteed to succeed
@@ -115,14 +117,18 @@ func (t *txTail) loadFromDisk(l ledgerForTracker, dbRound basics.Round) error {
}
t.lowWaterMark = l.Latest()
- t.lastValid = make(map[basics.Round]map[transactions.Txid]struct{})
+ t.lastValid = make(map[basics.Round]map[transactions.Txid]uint16)
t.recent = make(map[basics.Round]roundLeases)
// the lastValid is a temporary map used during the execution of
// loadFromDisk, allowing us to construct the lastValid maps in their
// optimal size. This would ensure that upon startup, we don't preallocate
// more memory than we truly need.
- lastValid := make(map[basics.Round][]transactions.Txid)
+ type lastValidEntry struct {
+ rnd basics.Round
+ txid transactions.Txid
+ }
+ lastValid := make(map[basics.Round][]lastValidEntry)
// the roundTailHashes and blockHeaderData need a single element to start with
// in order to allow lookups on zero offsets when they are empty (new database)
@@ -153,16 +159,16 @@ func (t *txTail) loadFromDisk(l ledgerForTracker, dbRound basics.Round) error {
list := lastValid[txTailRound.LastValid[i]]
// if the list reached capacity, resize.
if len(list) == cap(list) {
- var newList []transactions.Txid
+ var newList []lastValidEntry
if cap(list) == 0 {
- newList = make([]transactions.Txid, 0, initialLastValidArrayLen)
+ newList = make([]lastValidEntry, 0, initialLastValidArrayLen)
} else {
- newList = make([]transactions.Txid, len(list), len(list)*2)
+ newList = make([]lastValidEntry, len(list), len(list)*2)
}
copy(newList[:], list[:])
list = newList
}
- list = append(list, txTailRound.TxnIDs[i])
+ list = append(list, lastValidEntry{txTailRound.Hdr.Round, txTailRound.TxnIDs[i]})
lastValid[txTailRound.LastValid[i]] = list
}
}
@@ -173,11 +179,15 @@ func (t *txTail) loadFromDisk(l ledgerForTracker, dbRound basics.Round) error {
// add all the entries in roundsLastValids to their corresponding map entry in t.lastValid
for lastValid, list := range lastValid {
- lastValueMap := make(map[transactions.Txid]struct{}, len(list))
- for _, id := range list {
- lastValueMap[id] = struct{}{}
+ lastValidMap := make(map[transactions.Txid]uint16, len(list))
+ for _, entry := range list {
+ if lastValid < entry.rnd {
+ return fmt.Errorf("txTail: invalid lastValid %d / rnd %d for txid %s", lastValid, entry.rnd, entry.txid)
+ }
+ deltaR := uint16(lastValid - entry.rnd)
+ lastValidMap[entry.txid] = deltaR
}
- t.lastValid[lastValid] = lastValueMap
+ t.lastValid[lastValid] = lastValidMap
}
if enableTxTailHashes {
@@ -210,9 +220,10 @@ func (t *txTail) newBlock(blk bookkeeping.Block, delta ledgercore.StateDelta) {
for txid, txnInc := range delta.Txids {
if _, ok := t.lastValid[txnInc.LastValid]; !ok {
- t.lastValid[txnInc.LastValid] = make(map[transactions.Txid]struct{})
+ t.lastValid[txnInc.LastValid] = make(map[transactions.Txid]uint16)
}
- t.lastValid[txnInc.LastValid][txid] = struct{}{}
+ deltaR := uint16(txnInc.LastValid - blk.BlockHeader.Round)
+ t.lastValid[txnInc.LastValid][txid] = deltaR
tail.TxnIDs[txnInc.Intra] = txid
tail.LastValid[txnInc.Intra] = txnInc.LastValid
@@ -381,6 +392,19 @@ func (t *txTail) checkDup(proto config.ConsensusParams, current basics.Round, fi
return nil
}
+// checkConfirmed test to see if the given transaction id already exists.
+func (t *txTail) checkConfirmed(txid transactions.Txid) (basics.Round, bool) {
+ t.tailMu.RLock()
+ defer t.tailMu.RUnlock()
+
+ for lastValidRound, lastValid := range t.lastValid {
+ if deltaR, confirmed := lastValid[txid]; confirmed {
+ return lastValidRound - basics.Round(deltaR), true
+ }
+ }
+ return 0, false
+}
+
func (t *txTail) recentTailHash(offset uint64, retainSize uint64) (crypto.Digest, error) {
// prepare a buffer to hash.
buffer := make([]byte, (retainSize)*crypto.DigestSize)
diff --git a/ledger/txtail_test.go b/ledger/txtail_test.go
index ed75b591c..8eb9d4990 100644
--- a/ledger/txtail_test.go
+++ b/ledger/txtail_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -112,13 +112,15 @@ func TestTxTailCheckdup(t *testing.T) {
type txTailTestLedger struct {
Ledger
protoVersion protocol.ConsensusVersion
+ blocks map[basics.Round]bookkeeping.Block
}
const testTxTailValidityRange = 200
const testTxTailTxnPerRound = 150
+const testTxTailExtraRounds = 10
func (t *txTailTestLedger) Latest() basics.Round {
- return basics.Round(config.Consensus[t.protoVersion].MaxTxnLife + 10)
+ return basics.Round(config.Consensus[t.protoVersion].MaxTxnLife + testTxTailExtraRounds)
}
func (t *txTailTestLedger) BlockHdr(r basics.Round) (bookkeeping.BlockHeader, error) {
@@ -130,6 +132,10 @@ func (t *txTailTestLedger) BlockHdr(r basics.Round) (bookkeeping.BlockHeader, er
}
func (t *txTailTestLedger) Block(r basics.Round) (bookkeeping.Block, error) {
+ if bkl, found := t.blocks[r]; found {
+ return bkl, nil
+ }
+
blk := bookkeeping.Block{
BlockHeader: bookkeeping.BlockHeader{
UpgradeState: bookkeeping.UpgradeState{
@@ -142,6 +148,10 @@ func (t *txTailTestLedger) Block(r basics.Round) (bookkeeping.Block, error) {
for i := range blk.Payset {
blk.Payset[i] = makeTxTailTestTransaction(r, i)
}
+ if t.blocks == nil {
+ t.blocks = make(map[basics.Round]bookkeeping.Block)
+ }
+ t.blocks[r] = blk
return blk, nil
}
@@ -330,6 +340,74 @@ func TestTxTailDeltaTracking(t *testing.T) {
}
}
+func TestTxTailCheckConfirmed(t *testing.T) {
+ partitiontest.PartitionTest(t)
+
+ var ledger txTailTestLedger
+ txtail := txTail{}
+ protoVersion := protocol.ConsensusCurrentVersion
+ proto := config.Consensus[protoVersion]
+ require.NoError(t, ledger.initialize(t, protoVersion))
+ require.NoError(t, txtail.loadFromDisk(&ledger, ledger.Latest()))
+
+ // ensure block retrieval from txTailTestLedger works
+ startRound := ledger.Latest() - basics.Round(proto.MaxTxnLife) + 1
+ b1, err := ledger.Block(startRound)
+ require.NoError(t, err)
+ b2, err := ledger.Block(startRound)
+ require.NoError(t, err)
+ require.Equal(t, b1, b2)
+
+ // check all txids in blocks are in txTail as well
+ // note, txtail does not store txids for transactions with lastValid < ledger.Latest()
+ for i := ledger.Latest() - testTxTailValidityRange + 1; i < ledger.Latest(); i++ {
+ blk, err := ledger.Block(i)
+ require.NoError(t, err)
+ for _, txn := range blk.Payset {
+ confirmedAt, found := txtail.checkConfirmed(txn.Txn.ID())
+ require.True(t, found, "failed to find txn at round %d (startRound=%d, latest=%d)", i, startRound, ledger.Latest())
+ require.Equal(t, basics.Round(i), confirmedAt)
+ }
+ }
+
+ rnd := ledger.Latest() + 1
+ lv := basics.Round(rnd + 50)
+ blk := bookkeeping.Block{
+ BlockHeader: bookkeeping.BlockHeader{
+ Round: rnd,
+ TimeStamp: int64(rnd << 10),
+ UpgradeState: bookkeeping.UpgradeState{
+ CurrentProtocol: protoVersion,
+ },
+ },
+ Payset: make(transactions.Payset, 1),
+ }
+ sender := &basics.Address{}
+ sender[0] = byte(rnd)
+ sender[1] = byte(rnd >> 8)
+ sender[2] = byte(rnd >> 16)
+ blk.Payset[0].Txn.Sender = *sender
+ blk.Payset[0].Txn.FirstValid = rnd
+ blk.Payset[0].Txn.LastValid = lv
+ deltas := ledgercore.MakeStateDelta(&blk.BlockHeader, 0, 0, 0)
+ deltas.Txids[blk.Payset[0].Txn.ID()] = ledgercore.IncludedTransactions{
+ LastValid: lv,
+ Intra: 0,
+ }
+ deltas.AddTxLease(ledgercore.Txlease{Sender: blk.Payset[0].Txn.Sender, Lease: blk.Payset[0].Txn.Lease}, basics.Round(rnd+50))
+
+ txtail.newBlock(blk, deltas)
+ txtail.committedUpTo(basics.Round(rnd))
+
+ confirmedAt, found := txtail.checkConfirmed(blk.Payset[0].Txn.ID())
+ require.True(t, found)
+ require.Equal(t, basics.Round(rnd), confirmedAt)
+
+ confirmedAt, found = txtail.checkConfirmed(transactions.Txid{})
+ require.False(t, found)
+ require.Equal(t, basics.Round(0), confirmedAt)
+}
+
// BenchmarkTxTailBlockHeaderCache adds 2M random blocks by calling
// newBlock and postCommit on txTail tracker, and reports memory allocations
func BenchmarkTxTailBlockHeaderCache(b *testing.B) {
diff --git a/ledger/voters.go b/ledger/voters.go
index d5645ede6..63e0722a6 100644
--- a/ledger/voters.go
+++ b/ledger/voters.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/ledger/voters_test.go b/ledger/voters_test.go
index 0ec6d2baa..a4913c499 100644
--- a/ledger/voters_test.go
+++ b/ledger/voters_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/accounts.go b/libgoal/accounts.go
index f9e223e69..34bbf304c 100644
--- a/libgoal/accounts.go
+++ b/libgoal/accounts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/error.go b/libgoal/error.go
index ca1801692..f5b9c3d76 100644
--- a/libgoal/error.go
+++ b/libgoal/error.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/libgoal.go b/libgoal/libgoal.go
index ad9858238..75ddea8ab 100644
--- a/libgoal/libgoal.go
+++ b/libgoal/libgoal.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/libgoal_test.go b/libgoal/libgoal_test.go
index b2e5d2205..ec531b8e7 100644
--- a/libgoal/libgoal_test.go
+++ b/libgoal/libgoal_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/lockedFile.go b/libgoal/lockedFile.go
index 6b09db8e3..4678cf623 100644
--- a/libgoal/lockedFile.go
+++ b/libgoal/lockedFile.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/lockedFileLinux.go b/libgoal/lockedFileLinux.go
index eb90377f1..4e26f2c5a 100644
--- a/libgoal/lockedFileLinux.go
+++ b/libgoal/lockedFileLinux.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/lockedFileUnix.go b/libgoal/lockedFileUnix.go
index 0d2b50e62..1113e942a 100644
--- a/libgoal/lockedFileUnix.go
+++ b/libgoal/lockedFileUnix.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/lockedFileWindows.go b/libgoal/lockedFileWindows.go
index 337943a5c..6e29fe6fa 100644
--- a/libgoal/lockedFileWindows.go
+++ b/libgoal/lockedFileWindows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/participation.go b/libgoal/participation.go
index 302af5df9..73e953396 100644
--- a/libgoal/participation.go
+++ b/libgoal/participation.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/participation/participation.go b/libgoal/participation/participation.go
index 2d1a30e8c..cf0b618b9 100644
--- a/libgoal/participation/participation.go
+++ b/libgoal/participation/participation.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/participation/participation_test.go b/libgoal/participation/participation_test.go
index 69565a780..ff6976b98 100644
--- a/libgoal/participation/participation_test.go
+++ b/libgoal/participation/participation_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/system.go b/libgoal/system.go
index a72214dfb..86157044d 100644
--- a/libgoal/system.go
+++ b/libgoal/system.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/teal.go b/libgoal/teal.go
index 26fcbaa63..01266437c 100644
--- a/libgoal/teal.go
+++ b/libgoal/teal.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/transactions.go b/libgoal/transactions.go
index 97ac2be99..f4cf38ed5 100644
--- a/libgoal/transactions.go
+++ b/libgoal/transactions.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/unencryptedWallet.go b/libgoal/unencryptedWallet.go
index 35b74d754..c050b03a3 100644
--- a/libgoal/unencryptedWallet.go
+++ b/libgoal/unencryptedWallet.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/walletHandles.go b/libgoal/walletHandles.go
index 302d46595..5405f667d 100644
--- a/libgoal/walletHandles.go
+++ b/libgoal/walletHandles.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/libgoal/wallets.go b/libgoal/wallets.go
index 3e0f12d54..e175d62f7 100644
--- a/libgoal/wallets.go
+++ b/libgoal/wallets.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/collector.go b/logging/collector.go
index 39203964c..c79cba361 100644
--- a/logging/collector.go
+++ b/logging/collector.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/cyclicWriter.go b/logging/cyclicWriter.go
index d6166a82a..d15782c93 100644
--- a/logging/cyclicWriter.go
+++ b/logging/cyclicWriter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/cyclicWriter_test.go b/logging/cyclicWriter_test.go
index d52b826bd..1d5de4bb1 100644
--- a/logging/cyclicWriter_test.go
+++ b/logging/cyclicWriter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/logBuffer.go b/logging/logBuffer.go
index 26b1045f2..9ccc95847 100644
--- a/logging/logBuffer.go
+++ b/logging/logBuffer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/logBuffer_test.go b/logging/logBuffer_test.go
index 04a87f3f6..d3c9689e7 100644
--- a/logging/logBuffer_test.go
+++ b/logging/logBuffer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/log_test.go b/logging/log_test.go
index e16d62d73..ac35412cb 100644
--- a/logging/log_test.go
+++ b/logging/log_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/logspec/agreement.go b/logging/logspec/agreement.go
index c5df1948b..cb5d978af 100644
--- a/logging/logspec/agreement.go
+++ b/logging/logspec/agreement.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/logspec/ledger.go b/logging/logspec/ledger.go
index 541917209..d04b2087f 100644
--- a/logging/logspec/ledger.go
+++ b/logging/logspec/ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/logspec/root.go b/logging/logspec/root.go
index 1aa069130..a089c650d 100644
--- a/logging/logspec/root.go
+++ b/logging/logspec/root.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetry.go b/logging/telemetry.go
index 7daa47192..2ea5c0236 100644
--- a/logging/telemetry.go
+++ b/logging/telemetry.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryCommon.go b/logging/telemetryCommon.go
index 41a13d949..fb2163a9e 100644
--- a/logging/telemetryCommon.go
+++ b/logging/telemetryCommon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryConfig.go b/logging/telemetryConfig.go
index 6962bb97b..af715b382 100644
--- a/logging/telemetryConfig.go
+++ b/logging/telemetryConfig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryConfig_test.go b/logging/telemetryConfig_test.go
index 8a61ba41c..31faf9ece 100644
--- a/logging/telemetryConfig_test.go
+++ b/logging/telemetryConfig_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryFilteredHook.go b/logging/telemetryFilteredHook.go
index c92557783..74e05634e 100644
--- a/logging/telemetryFilteredHook.go
+++ b/logging/telemetryFilteredHook.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetry_test.go b/logging/telemetry_test.go
index 1d1b9f8d4..bf4d780e3 100644
--- a/logging/telemetry_test.go
+++ b/logging/telemetry_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryhook.go b/logging/telemetryhook.go
index 077f1d14d..c166c5efc 100644
--- a/logging/telemetryhook.go
+++ b/logging/telemetryhook.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryhook_test.go b/logging/telemetryhook_test.go
index 43bc1acf4..31ccdc48c 100644
--- a/logging/telemetryhook_test.go
+++ b/logging/telemetryhook_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryspec/category.go b/logging/telemetryspec/category.go
index 44077c722..80de66c67 100644
--- a/logging/telemetryspec/category.go
+++ b/logging/telemetryspec/category.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryspec/event.go b/logging/telemetryspec/event.go
index 1617b0339..3f17c1bf8 100644
--- a/logging/telemetryspec/event.go
+++ b/logging/telemetryspec/event.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryspec/eventTiming.go b/logging/telemetryspec/eventTiming.go
index be6f80328..2eef89a86 100644
--- a/logging/telemetryspec/eventTiming.go
+++ b/logging/telemetryspec/eventTiming.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryspec/metric.go b/logging/telemetryspec/metric.go
index e2c43cf0a..8ab269a2c 100644
--- a/logging/telemetryspec/metric.go
+++ b/logging/telemetryspec/metric.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/telemetryspec/metric_test.go b/logging/telemetryspec/metric_test.go
index 85693bdba..d2ce4e933 100644
--- a/logging/telemetryspec/metric_test.go
+++ b/logging/telemetryspec/metric_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/testingLogger.go b/logging/testingLogger.go
index 0f53e6225..80424adb4 100644
--- a/logging/testingLogger.go
+++ b/logging/testingLogger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/logging/usage.go b/logging/usage.go
index 2a668ceb7..798a46981 100644
--- a/logging/usage.go
+++ b/logging/usage.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/network.go b/netdeploy/network.go
index 4e86bd831..d5e4f522e 100644
--- a/netdeploy/network.go
+++ b/netdeploy/network.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -169,6 +169,16 @@ func (n Network) PrimaryDataDir() string {
panic(fmt.Errorf("neither relay directories nor node directories are defined for the network"))
}
+// RelayDataDirs returns an array of relay data directories (not the nodes)
+func (n Network) RelayDataDirs() []string {
+ var directories []string
+ for _, dir := range n.cfg.RelayDirs {
+ directories = append(directories, n.getNodeFullPath(dir))
+ }
+ sort.Strings(directories)
+ return directories
+}
+
// NodeDataDirs returns an array of node data directories (not the relays)
func (n Network) NodeDataDirs() []string {
var directories []string
diff --git a/netdeploy/networkTemplate.go b/netdeploy/networkTemplate.go
index 43bb9d816..d8c30d66e 100644
--- a/netdeploy/networkTemplate.go
+++ b/netdeploy/networkTemplate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -321,6 +321,9 @@ func createConfigFile(node remote.NodeConfigGoal, configFile string, numNodes in
if node.IsRelay {
// Have relays listen on any localhost port
cfg.NetAddress = "127.0.0.1:0"
+
+ cfg.Archival = false // make it explicit non-archival
+ cfg.MaxBlockHistoryLookback = 20000 // to save blocks beyond MaxTxnLife=13
} else {
// Non-relays should not open incoming connections
cfg.IncomingConnectionsLimit = 0
diff --git a/netdeploy/networkTemplates_test.go b/netdeploy/networkTemplates_test.go
index 80f2c2a43..69fca3544 100644
--- a/netdeploy/networkTemplates_test.go
+++ b/netdeploy/networkTemplates_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/network_test.go b/netdeploy/network_test.go
index cf3ea427c..e18217b78 100644
--- a/netdeploy/network_test.go
+++ b/netdeploy/network_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/bootstrappedNetwork.go b/netdeploy/remote/bootstrappedNetwork.go
index bd1d3e744..b0814a369 100644
--- a/netdeploy/remote/bootstrappedNetwork.go
+++ b/netdeploy/remote/bootstrappedNetwork.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/bootstrappedNetwork_test.go b/netdeploy/remote/bootstrappedNetwork_test.go
index 45cb4162c..c84c4f657 100644
--- a/netdeploy/remote/bootstrappedNetwork_test.go
+++ b/netdeploy/remote/bootstrappedNetwork_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/buildConfig.go b/netdeploy/remote/buildConfig.go
index b7e39d688..2fdce2efc 100644
--- a/netdeploy/remote/buildConfig.go
+++ b/netdeploy/remote/buildConfig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/deployedNetwork.go b/netdeploy/remote/deployedNetwork.go
index 16d562a55..729409fe9 100644
--- a/netdeploy/remote/deployedNetwork.go
+++ b/netdeploy/remote/deployedNetwork.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/deployedNetwork_test.go b/netdeploy/remote/deployedNetwork_test.go
index f6ac76b3e..66240ee6a 100644
--- a/netdeploy/remote/deployedNetwork_test.go
+++ b/netdeploy/remote/deployedNetwork_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/hostConfig.go b/netdeploy/remote/hostConfig.go
index 34af36ef4..1cbbd66c4 100644
--- a/netdeploy/remote/hostConfig.go
+++ b/netdeploy/remote/hostConfig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/hostTemplate.go b/netdeploy/remote/hostTemplate.go
index 530c80b32..b1118b734 100644
--- a/netdeploy/remote/hostTemplate.go
+++ b/netdeploy/remote/hostTemplate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/nodeConfig.go b/netdeploy/remote/nodeConfig.go
index 191f43473..2c6e0e423 100644
--- a/netdeploy/remote/nodeConfig.go
+++ b/netdeploy/remote/nodeConfig.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/nodeWalletData.go b/netdeploy/remote/nodeWalletData.go
index 87ca8d41c..8be7edb99 100644
--- a/netdeploy/remote/nodeWalletData.go
+++ b/netdeploy/remote/nodeWalletData.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/nodecfg/nodeConfigurator.go b/netdeploy/remote/nodecfg/nodeConfigurator.go
index c398e8c44..5ab43d5ff 100644
--- a/netdeploy/remote/nodecfg/nodeConfigurator.go
+++ b/netdeploy/remote/nodecfg/nodeConfigurator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/nodecfg/nodeDir.go b/netdeploy/remote/nodecfg/nodeDir.go
index 8d17f01d5..9bd13343c 100644
--- a/netdeploy/remote/nodecfg/nodeDir.go
+++ b/netdeploy/remote/nodecfg/nodeDir.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/netdeploy/remote/topology.go b/netdeploy/remote/topology.go
index 1f0b6d736..eebfa3e50 100644
--- a/netdeploy/remote/topology.go
+++ b/netdeploy/remote/topology.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/addr.go b/network/addr.go
index f97010b4c..1e2b04a44 100644
--- a/network/addr.go
+++ b/network/addr.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/addr_test.go b/network/addr_test.go
index 676341014..377fe72a9 100644
--- a/network/addr_test.go
+++ b/network/addr_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/connPerfMon.go b/network/connPerfMon.go
index d254aa127..90dacfe71 100644
--- a/network/connPerfMon.go
+++ b/network/connPerfMon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/connPerfMon_test.go b/network/connPerfMon_test.go
index a8398b0f3..b2f24f121 100644
--- a/network/connPerfMon_test.go
+++ b/network/connPerfMon_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/dialer.go b/network/dialer.go
index 0dc3619d4..3aa59f493 100644
--- a/network/dialer.go
+++ b/network/dialer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/gossipNode.go b/network/gossipNode.go
index 7ae667170..7a916fda3 100644
--- a/network/gossipNode.go
+++ b/network/gossipNode.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/limited_reader_slurper.go b/network/limited_reader_slurper.go
index 568b165e5..a1ba90a5d 100644
--- a/network/limited_reader_slurper.go
+++ b/network/limited_reader_slurper.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/limited_reader_slurper_test.go b/network/limited_reader_slurper_test.go
index bcd6eddec..45b3fc727 100644
--- a/network/limited_reader_slurper_test.go
+++ b/network/limited_reader_slurper_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/messageFilter.go b/network/messageFilter.go
index b42651f46..b098eddf7 100644
--- a/network/messageFilter.go
+++ b/network/messageFilter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -26,7 +26,7 @@ import (
// IncomingMessage represents a message arriving from some peer in our p2p network
type messageFilter struct {
deadlock.Mutex
- buckets []map[crypto.Digest]bool
+ buckets []map[crypto.Digest]struct{}
maxBucketSize int
currentTopBucket int
nonce [16]byte
@@ -34,14 +34,12 @@ type messageFilter struct {
func makeMessageFilter(bucketsCount, maxBucketSize int) *messageFilter {
mf := &messageFilter{
- buckets: make([]map[crypto.Digest]bool, bucketsCount),
+ buckets: make([]map[crypto.Digest]struct{}, bucketsCount),
maxBucketSize: maxBucketSize,
currentTopBucket: 0,
}
- for i := range mf.buckets {
- mf.buckets[i] = make(map[crypto.Digest]bool)
- }
crypto.RandBytes(mf.nonce[:])
+ mf.buckets[mf.currentTopBucket] = make(map[crypto.Digest]struct{}, mf.maxBucketSize)
return mf
}
@@ -69,19 +67,19 @@ func (f *messageFilter) CheckDigest(msgHash crypto.Digest, add bool, promote boo
if !has {
// we don't have this entry. add it.
- f.buckets[f.currentTopBucket][msgHash] = true
+ f.buckets[f.currentTopBucket][msgHash] = struct{}{}
} else {
// we already have it.
// do we need to promote it ?
if promote && f.currentTopBucket != idx {
delete(f.buckets[idx], msgHash)
- f.buckets[f.currentTopBucket][msgHash] = true
+ f.buckets[f.currentTopBucket][msgHash] = struct{}{}
}
}
// check to see if the current bucket reached capacity.
if len(f.buckets[f.currentTopBucket]) >= f.maxBucketSize {
f.currentTopBucket = (f.currentTopBucket + len(f.buckets) - 1) % len(f.buckets)
- f.buckets[f.currentTopBucket] = make(map[crypto.Digest]bool)
+ f.buckets[f.currentTopBucket] = make(map[crypto.Digest]struct{}, f.maxBucketSize)
}
return has
diff --git a/network/messageFilter_test.go b/network/messageFilter_test.go
index 1df0e2c00..93d3dfe6f 100644
--- a/network/messageFilter_test.go
+++ b/network/messageFilter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/messagetracer/graphtrace.go b/network/messagetracer/graphtrace.go
index 5438c7834..e0390febe 100644
--- a/network/messagetracer/graphtrace.go
+++ b/network/messagetracer/graphtrace.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/messagetracer/interface.go b/network/messagetracer/interface.go
index e684cc179..798d954a7 100644
--- a/network/messagetracer/interface.go
+++ b/network/messagetracer/interface.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/msgCompressor.go b/network/msgCompressor.go
index 28f835832..831b509ae 100644
--- a/network/msgCompressor.go
+++ b/network/msgCompressor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/msgCompressor_test.go b/network/msgCompressor_test.go
index 5e3b927f9..3b08b5fc0 100644
--- a/network/msgCompressor_test.go
+++ b/network/msgCompressor_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/msgOfInterest.go b/network/msgOfInterest.go
index eb08155ba..727405c8a 100644
--- a/network/msgOfInterest.go
+++ b/network/msgOfInterest.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/msgOfInterest_test.go b/network/msgOfInterest_test.go
index c8c8dfda3..ef13c6c0c 100644
--- a/network/msgOfInterest_test.go
+++ b/network/msgOfInterest_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/multiplexer.go b/network/multiplexer.go
index ddcf1845d..0e97d63f2 100644
--- a/network/multiplexer.go
+++ b/network/multiplexer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/multiplexer_test.go b/network/multiplexer_test.go
index c9d17dacb..d31f8451a 100644
--- a/network/multiplexer_test.go
+++ b/network/multiplexer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/netidentity.go b/network/netidentity.go
index 940ea0a63..1474739bd 100644
--- a/network/netidentity.go
+++ b/network/netidentity.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/netidentity_test.go b/network/netidentity_test.go
index 9222da460..965006922 100644
--- a/network/netidentity_test.go
+++ b/network/netidentity_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/netprio.go b/network/netprio.go
index 5cb122c11..5d91dad8d 100644
--- a/network/netprio.go
+++ b/network/netprio.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/netprio_test.go b/network/netprio_test.go
index 4fc920e8c..5de45a607 100644
--- a/network/netprio_test.go
+++ b/network/netprio_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/dnsaddr/resolve.go b/network/p2p/dnsaddr/resolve.go
index 0e21a5704..176d62f94 100644
--- a/network/p2p/dnsaddr/resolve.go
+++ b/network/p2p/dnsaddr/resolve.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/dnsaddr/resolveController.go b/network/p2p/dnsaddr/resolveController.go
index 7fb920ecb..73a46243d 100644
--- a/network/p2p/dnsaddr/resolveController.go
+++ b/network/p2p/dnsaddr/resolveController.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/dnsaddr/resolveController_test.go b/network/p2p/dnsaddr/resolveController_test.go
index c097240ac..5dd3c40a9 100644
--- a/network/p2p/dnsaddr/resolveController_test.go
+++ b/network/p2p/dnsaddr/resolveController_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/dnsaddr/resolve_test.go b/network/p2p/dnsaddr/resolve_test.go
index 2834a2a5e..937e4db18 100644
--- a/network/p2p/dnsaddr/resolve_test.go
+++ b/network/p2p/dnsaddr/resolve_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/p2p.go b/network/p2p/p2p.go
index 94643fc61..cd84f1c69 100644
--- a/network/p2p/p2p.go
+++ b/network/p2p/p2p.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/p2p_test.go b/network/p2p/p2p_test.go
index 5095e0d4b..558131fe4 100644
--- a/network/p2p/p2p_test.go
+++ b/network/p2p/p2p_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerID.go b/network/p2p/peerID.go
index 4d808b05e..f31d29ffb 100644
--- a/network/p2p/peerID.go
+++ b/network/p2p/peerID.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerID_test.go b/network/p2p/peerID_test.go
index a3ce5c444..9d7729d59 100644
--- a/network/p2p/peerID_test.go
+++ b/network/p2p/peerID_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerstore/peerstore.go b/network/p2p/peerstore/peerstore.go
index 63a88966f..fa572c591 100644
--- a/network/p2p/peerstore/peerstore.go
+++ b/network/p2p/peerstore/peerstore.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerstore/peerstore_test.go b/network/p2p/peerstore/peerstore_test.go
index 4263564c3..b4aa241ba 100644
--- a/network/p2p/peerstore/peerstore_test.go
+++ b/network/p2p/peerstore/peerstore_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerstore/utils.go b/network/p2p/peerstore/utils.go
index b96fc1c8e..02c6b2d8e 100644
--- a/network/p2p/peerstore/utils.go
+++ b/network/p2p/peerstore/utils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/peerstore/utils_test.go b/network/p2p/peerstore/utils_test.go
index c8927d27e..9f20b0f75 100644
--- a/network/p2p/peerstore/utils_test.go
+++ b/network/p2p/peerstore/utils_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/pubsub.go b/network/p2p/pubsub.go
index 220320d72..372c9249c 100644
--- a/network/p2p/pubsub.go
+++ b/network/p2p/pubsub.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2p/streams.go b/network/p2p/streams.go
index b6fad35d9..4a7a2d8e0 100644
--- a/network/p2p/streams.go
+++ b/network/p2p/streams.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2pNetwork.go b/network/p2pNetwork.go
index 71188b256..c5422af84 100644
--- a/network/p2pNetwork.go
+++ b/network/p2pNetwork.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2pNetwork_test.go b/network/p2pNetwork_test.go
index 3b6d12759..c67ef5b1f 100644
--- a/network/p2pNetwork_test.go
+++ b/network/p2pNetwork_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/p2pPeer.go b/network/p2pPeer.go
index 343459d24..a5065f01b 100644
--- a/network/p2pPeer.go
+++ b/network/p2pPeer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/peersheap.go b/network/peersheap.go
index 03224b0ea..35a6fa478 100644
--- a/network/peersheap.go
+++ b/network/peersheap.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/phonebook.go b/network/phonebook.go
index cf189eb6a..3f196e060 100644
--- a/network/phonebook.go
+++ b/network/phonebook.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/phonebook_test.go b/network/phonebook_test.go
index 4fdad53c4..36365c591 100644
--- a/network/phonebook_test.go
+++ b/network/phonebook_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/rateLimitingTransport.go b/network/rateLimitingTransport.go
index a3fd332cb..461a468da 100644
--- a/network/rateLimitingTransport.go
+++ b/network/rateLimitingTransport.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/requestLogger.go b/network/requestLogger.go
index 562abd9f5..80488cbe9 100644
--- a/network/requestLogger.go
+++ b/network/requestLogger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/requestLogger_test.go b/network/requestLogger_test.go
index a17d054e4..cb1d7b963 100644
--- a/network/requestLogger_test.go
+++ b/network/requestLogger_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/requestTracker.go b/network/requestTracker.go
index 63fd4a72b..c88d4e5cf 100644
--- a/network/requestTracker.go
+++ b/network/requestTracker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/requestTracker_test.go b/network/requestTracker_test.go
index 65349987e..0a8c934c5 100644
--- a/network/requestTracker_test.go
+++ b/network/requestTracker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/topics.go b/network/topics.go
index 5cb037073..679075c83 100644
--- a/network/topics.go
+++ b/network/topics.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/topics_test.go b/network/topics_test.go
index b01ede7ff..65f96b6a1 100644
--- a/network/topics_test.go
+++ b/network/topics_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/websocketProxy_test.go b/network/websocketProxy_test.go
index e0888c544..73298ccd6 100644
--- a/network/websocketProxy_test.go
+++ b/network/websocketProxy_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/wsNetwork.go b/network/wsNetwork.go
index d316fcd81..9ce5f331a 100644
--- a/network/wsNetwork.go
+++ b/network/wsNetwork.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/wsNetwork_test.go b/network/wsNetwork_test.go
index f8eeeb71f..b7cd873bc 100644
--- a/network/wsNetwork_test.go
+++ b/network/wsNetwork_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -2567,8 +2567,8 @@ func TestSlowPeerDisconnection(t *testing.T) {
GenesisID: genesisID,
NetworkID: config.Devtestnet,
}
- wn.broadcaster.slowWritingPeerMonitorInterval = time.Millisecond * 50
wn.setup()
+ wn.broadcaster.slowWritingPeerMonitorInterval = time.Millisecond * 50
wn.eventualReadyDelay = time.Second
wn.messagesOfInterest = nil // clear this before starting the network so that we won't be sending a MOI upon connection.
diff --git a/network/wsPeer.go b/network/wsPeer.go
index 7cbdbeaeb..adf211f59 100644
--- a/network/wsPeer.go
+++ b/network/wsPeer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/network/wsPeer_test.go b/network/wsPeer_test.go
index 91cd3cb37..d1f32302a 100644
--- a/network/wsPeer_test.go
+++ b/network/wsPeer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/assemble_test.go b/node/assemble_test.go
index 8b0a8afae..6954d9940 100644
--- a/node/assemble_test.go
+++ b/node/assemble_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/error.go b/node/error.go
index f3c3e05ea..ea4ad8357 100644
--- a/node/error.go
+++ b/node/error.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/follower_node.go b/node/follower_node.go
index c61c37957..277c48a24 100644
--- a/node/follower_node.go
+++ b/node/follower_node.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/follower_node_test.go b/node/follower_node_test.go
index b6402a9b5..cd82ea4e3 100644
--- a/node/follower_node_test.go
+++ b/node/follower_node_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/impls.go b/node/impls.go
index a33bc6e73..b7ee54fab 100644
--- a/node/impls.go
+++ b/node/impls.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/netprio.go b/node/netprio.go
index 79a669056..f3ac6a488 100644
--- a/node/netprio.go
+++ b/node/netprio.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/netprio_test.go b/node/netprio_test.go
index 489099e5c..bf34fff10 100644
--- a/node/netprio_test.go
+++ b/node/netprio_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/node/node.go b/node/node.go
index e1f79907c..f59bd67da 100644
--- a/node/node.go
+++ b/node/node.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -653,6 +653,25 @@ func (node *AlgorandFullNode) GetPendingTransaction(txID transactions.Txid) (res
// Keep looking in the ledger.
}
+ // quick check for confirmed transactions with LastValid in future
+ // this supposed to cover most of the cases where REST checks for the most recent txns
+ if r, confirmed := node.ledger.CheckConfirmedTail(txID); confirmed {
+ tx, foundBlk, err := node.ledger.LookupTxid(txID, r)
+ if err == nil && foundBlk {
+ return TxnWithStatus{
+ Txn: tx.SignedTxn,
+ ConfirmedRound: r,
+ ApplyData: tx.ApplyData,
+ }, true
+ }
+ }
+ // if found in the pool and not in the tail then return without looking into blocks
+ // because the check appears to be too early
+ if found {
+ return res, found
+ }
+
+ // fallback to blocks lookup
var maxLife basics.Round
latest := node.ledger.Latest()
proto, err := node.ledger.ConsensusParams(latest)
@@ -688,6 +707,7 @@ func (node *AlgorandFullNode) GetPendingTransaction(txID transactions.Txid) (res
if err != nil || !found {
continue
}
+
return TxnWithStatus{
Txn: tx.SignedTxn,
ConfirmedRound: r,
@@ -696,7 +716,7 @@ func (node *AlgorandFullNode) GetPendingTransaction(txID transactions.Txid) (res
}
// Return whatever we found in the pool (if anything).
- return
+ return res, found
}
// Status returns a StatusReport structure reporting our status as Active and with our ledger's LastRound
diff --git a/node/node_test.go b/node/node_test.go
index 55cbae936..dabb7958a 100644
--- a/node/node_test.go
+++ b/node/node_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/LaggedStdIo.go b/nodecontrol/LaggedStdIo.go
index 1638dd118..c46efb92d 100644
--- a/nodecontrol/LaggedStdIo.go
+++ b/nodecontrol/LaggedStdIo.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/NodeController.go b/nodecontrol/NodeController.go
index e9ce178b8..3535c2127 100644
--- a/nodecontrol/NodeController.go
+++ b/nodecontrol/NodeController.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/algodControl.go b/nodecontrol/algodControl.go
index 3702e2116..74137a72e 100644
--- a/nodecontrol/algodControl.go
+++ b/nodecontrol/algodControl.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/algodControl_test.go b/nodecontrol/algodControl_test.go
index d81d24d9e..af6e48bfb 100644
--- a/nodecontrol/algodControl_test.go
+++ b/nodecontrol/algodControl_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/kmdControl.go b/nodecontrol/kmdControl.go
index 3c8936783..4dfb3eb74 100644
--- a/nodecontrol/kmdControl.go
+++ b/nodecontrol/kmdControl.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/kmdControl_common.go b/nodecontrol/kmdControl_common.go
index 9e4d96fea..c26a5085d 100644
--- a/nodecontrol/kmdControl_common.go
+++ b/nodecontrol/kmdControl_common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/kmdControl_windows.go b/nodecontrol/kmdControl_windows.go
index 2273295e0..39e37a44e 100644
--- a/nodecontrol/kmdControl_windows.go
+++ b/nodecontrol/kmdControl_windows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/nodecontrol/nodeControlErrors.go b/nodecontrol/nodeControlErrors.go
index 8502b252d..ba214534b 100644
--- a/nodecontrol/nodeControlErrors.go
+++ b/nodecontrol/nodeControlErrors.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/codec.go b/protocol/codec.go
index 62abaedad..97dbccbc9 100644
--- a/protocol/codec.go
+++ b/protocol/codec.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/codec_test.go b/protocol/codec_test.go
index d11a47a90..72ac537b2 100644
--- a/protocol/codec_test.go
+++ b/protocol/codec_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/codec_tester.go b/protocol/codec_tester.go
index 49cae937b..63a6aaf0a 100644
--- a/protocol/codec_tester.go
+++ b/protocol/codec_tester.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/consensus.go b/protocol/consensus.go
index 928ba4b6f..51c023ec2 100644
--- a/protocol/consensus.go
+++ b/protocol/consensus.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/encodebench_test.go b/protocol/encodebench_test.go
index 32267a5d4..b0f26c161 100644
--- a/protocol/encodebench_test.go
+++ b/protocol/encodebench_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/hash.go b/protocol/hash.go
index 434deaf8c..906afb2c3 100644
--- a/protocol/hash.go
+++ b/protocol/hash.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/hash_test.go b/protocol/hash_test.go
index b3885d18c..12eca20cb 100644
--- a/protocol/hash_test.go
+++ b/protocol/hash_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/networks.go b/protocol/networks.go
index a6e3b13d1..b43f939d8 100644
--- a/protocol/networks.go
+++ b/protocol/networks.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/stateproof.go b/protocol/stateproof.go
index 1e55ef652..7bb1a60fb 100644
--- a/protocol/stateproof.go
+++ b/protocol/stateproof.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/tags.go b/protocol/tags.go
index a9eb2a6bb..e98045467 100644
--- a/protocol/tags.go
+++ b/protocol/tags.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/tags_test.go b/protocol/tags_test.go
index 7cf0bea93..137bf4e3f 100644
--- a/protocol/tags_test.go
+++ b/protocol/tags_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/test/allocbound_slice.go b/protocol/test/allocbound_slice.go
index 1d792d568..b9f696e3c 100644
--- a/protocol/test/allocbound_slice.go
+++ b/protocol/test/allocbound_slice.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/transcode/core.go b/protocol/transcode/core.go
index eaf6d00e0..db97e3daa 100644
--- a/protocol/transcode/core.go
+++ b/protocol/transcode/core.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/transcode/core_test.go b/protocol/transcode/core_test.go
index 34afe8f54..55c05d461 100644
--- a/protocol/transcode/core_test.go
+++ b/protocol/transcode/core_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/protocol/txntype.go b/protocol/txntype.go
index 0728898f1..76cb2dc40 100644
--- a/protocol/txntype.go
+++ b/protocol/txntype.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/blockService.go b/rpcs/blockService.go
index 2d4a4b822..7245eb188 100644
--- a/rpcs/blockService.go
+++ b/rpcs/blockService.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/blockService_test.go b/rpcs/blockService_test.go
index 832b59c55..e77fc7aa0 100644
--- a/rpcs/blockService_test.go
+++ b/rpcs/blockService_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/httpTxSync.go b/rpcs/httpTxSync.go
index 6f42eeaac..43258337c 100644
--- a/rpcs/httpTxSync.go
+++ b/rpcs/httpTxSync.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/ledgerService.go b/rpcs/ledgerService.go
index a3ff63e90..b3742bb98 100644
--- a/rpcs/ledgerService.go
+++ b/rpcs/ledgerService.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/ledgerService_test.go b/rpcs/ledgerService_test.go
index 1285795d4..1cc52fc9c 100644
--- a/rpcs/ledgerService_test.go
+++ b/rpcs/ledgerService_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/registrar.go b/rpcs/registrar.go
index f11919329..f488aebf2 100644
--- a/rpcs/registrar.go
+++ b/rpcs/registrar.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/txService.go b/rpcs/txService.go
index 3083e2d33..e9eb5d7aa 100644
--- a/rpcs/txService.go
+++ b/rpcs/txService.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/txService_test.go b/rpcs/txService_test.go
index 8ef49e45a..1e7a5036e 100644
--- a/rpcs/txService_test.go
+++ b/rpcs/txService_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/txSyncer.go b/rpcs/txSyncer.go
index c724417ea..1d7fc2c02 100644
--- a/rpcs/txSyncer.go
+++ b/rpcs/txSyncer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/rpcs/txSyncer_test.go b/rpcs/txSyncer_test.go
index 43e85f452..1c3f07187 100644
--- a/rpcs/txSyncer_test.go
+++ b/rpcs/txSyncer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/scripts/check_license.sh b/scripts/check_license.sh
index 51f83d7d4..f61e93396 100755
--- a/scripts/check_license.sh
+++ b/scripts/check_license.sh
@@ -3,8 +3,22 @@
PROJECT_ROOT=$(git rev-parse --show-toplevel)
LICENSE_LOCATION="$PROJECT_ROOT"/scripts/LICENSE_HEADER
NUMLINES=$(< "$LICENSE_LOCATION" wc -l | tr -d ' ')
-LICENSE=$(sed "s/{DATE_Y}/$(date +"%Y")/" "$LICENSE_LOCATION")
+CURRENT_YEAR=$(date +"%Y")
+LICENSE=$(sed "s/{DATE_Y}/$CURRENT_YEAR/" "$LICENSE_LOCATION")
VERSIONED_GO_FILES=$(git ls-tree --full-tree --name-only -r HEAD | grep "\.go$")
+EXTRA_FILES=(
+ cmd/tealdbg/bundle_home_html.sh
+ crypto/memcpy_chk_windows.c
+ tools/x-repo-types/typeAnalyzer/main.tmpl
+ test/heapwatch/block_history.py
+ test/heapwatch/block_history_plot.py
+ test/heapwatch/metrics_delta.py
+ test/heapwatch/nodeHostTarget.py
+ test/heapwatch/client_ram_report.py
+ test/heapwatch/runNodeHost.py
+ test/heapwatch/block_history_relays.py
+ test/heapwatch/heapWatch.py
+)
EXCLUDE=(
"Code generated by"
"David Lazar"
@@ -16,6 +30,7 @@ EXCLUDE=(
)
FILTER=$(IFS="|" ; echo "${EXCLUDE[*]}")
INPLACE=false
+UPDATE=false
VERBOSE=false
MOD_COUNT=0
RETURN_VALUE=0
@@ -27,6 +42,7 @@ usage() {
echo
echo "Args:"
echo "-i Edit in-place."
+ echo "-u Update license to current year."
echo "-v Verbose, same as doing \`head -n ${NUMLINES:-15}\` on each file."
echo
}
@@ -39,6 +55,9 @@ while [ "$1" != "" ]; do
-i)
INPLACE=true
;;
+ -u)
+ UPDATE=true
+ ;;
-v) VERBOSE=true
;;
-h)
@@ -62,7 +81,11 @@ for FILE in $VERSIONED_GO_FILES; do
RETURN_VALUE=1
if ! $VERBOSE; then
- if $INPLACE; then
+ if $UPDATE; then
+ sed -i.orig s/Copyright\ \(C\)\ 2019-....\ Algorand,\ Inc\./Copyright\ \(C\)\ 2019-$CURRENT_YEAR\ Algorand,\ Inc./ "$PROJECT_ROOT/$FILE" && \
+ rm "$PROJECT_ROOT/$FILE".orig
+ ((MOD_COUNT++))
+ elif $INPLACE; then
cat <(echo -e "$LICENSE\n") "$PROJECT_ROOT/$FILE" > "$PROJECT_ROOT/$FILE".1 &&
mv "$PROJECT_ROOT/$FILE"{.1,}
((MOD_COUNT++))
@@ -77,17 +100,48 @@ for FILE in $VERSIONED_GO_FILES; do
fi
done
+# non-go files that include a license header
+for FILE in "${EXTRA_FILES[@]}"; do
+ if ! grep -qs "Copyright (C) 2019-$CURRENT_YEAR Algorand, Inc." "$PROJECT_ROOT/$FILE"; then
+ RETURN_VALUE=1
+ if ! $VERBOSE; then
+ if $UPDATE; then
+ sed -i.orig s/Copyright\ \(C\)\ 2019-....\ Algorand,\ Inc\./Copyright\ \(C\)\ 2019-$CURRENT_YEAR\ Algorand,\ Inc./ "$PROJECT_ROOT/$FILE" && \
+ rm "$PROJECT_ROOT/$FILE".orig
+ ((MOD_COUNT++))
+ fi
+ # It's dangerous to do inplace updates of non-go files, because their format might be different
+ echo "$FILE"
+ else
+ echo -e "\n${RED_FG}$FILE${END_FG_COLOR}"
+ <"$PROJECT_ROOT/$FILE" head -n "$NUMLINES"
+ echo
+ fi
+ fi
+done
+
# check the README.md file.
-READMECOPYRIGHT="Copyright (C) 2019-$(date +"%Y"), Algorand Inc."
+READMECOPYRIGHT="Copyright (C) 2019-$CURRENT_YEAR, Algorand Inc."
if [ "$(<README.md grep -c "${READMECOPYRIGHT}" | tr -d ' ')" = "0" ]; then
RETURN_VALUE=1
- echo "README.md file need to have its license date range updated."
+ if ! $VERBOSE; then
+ if $UPDATE; then
+ sed -i.orig s/Copyright\ \(C\)\ 2019-....,\ Algorand\ Inc\./Copyright\ \(C\)\ 2019-$CURRENT_YEAR,\ Algorand\ Inc./ README.md &&
+ rm README.md.orig
+ ((MOD_COUNT++))
+ fi
+ echo "README.md"
+ else
+ echo -e "\n${RED_FG}README.md${END_FG_COLOR}"
+ grep 'Copyright (C) 2019' README.md
+ echo
+ fi
fi
if [ $RETURN_VALUE -ne 0 ]; then
echo -e "\n${RED_FG}FAILED LICENSE CHECK.${END_FG_COLOR}"
- if [ $INPLACE == "false" ]; then
- echo -e "Use 'check_license.sh -i' to fix."
+ if [ $INPLACE == "false" ] && [ $UPDATE == "false" ]; then
+ echo -e "Use 'check_license -i' to install to new files, 'check_license.sh -u' to update year."
else
echo "Modified $MOD_COUNT file(s)."
fi
diff --git a/scripts/release/mule/deploy/releases_page/generate_releases_page.py b/scripts/release/mule/deploy/releases_page/generate_releases_page.py
index 07d7ce70a..d0b580cd7 100755
--- a/scripts/release/mule/deploy/releases_page/generate_releases_page.py
+++ b/scripts/release/mule/deploy/releases_page/generate_releases_page.py
@@ -24,7 +24,7 @@ html_tpl = "html.tpl"
# Nit: should be styles_file
styles_url = "releases_page.css"
# May want to call these channels instead
-tokens = ["stable", "beta", "indexer"]
+tokens = ["stable", "beta"]
def get_stage_release_set(response):
@@ -201,7 +201,7 @@ def main():
channels = {}
# Should use tokens array instead
- for channel in ["stable", "beta", "indexer"]:
+ for channel in ["stable", "beta"]:
# Fetch contents of e.g. s3://algorand-dev-deb-repo/releases/beta/
# Note: MaxKeys will limit to last 100 releases, which is more than
# enough. Consider dropping this to 2.
diff --git a/scripts/release/mule/deploy/releases_page/html.tpl b/scripts/release/mule/deploy/releases_page/html.tpl
index 3c8f78bc9..d51ba241d 100644
--- a/scripts/release/mule/deploy/releases_page/html.tpl
+++ b/scripts/release/mule/deploy/releases_page/html.tpl
@@ -13,6 +13,15 @@
<p>The public key for verifying RPMs is <a href="https://releases.algorand.com/rpm/rpm_algorand.pub">https://releases.algorand.com/rpm/rpm_algorand.pub</a></p>
<p>The public key for verifying binaries out of our CI builds is <a href="https://releases.algorand.com/dev_ci_build.pub">https://releases.algorand.com/dev_ci_build.pub</a></p>
+<h2>Indexer/Conduit</h2>
+
+Use the CI Build key above to verify these binaries.
+
+<ul>
+<li><a href="https://github.com/algorand/conduit/releases/latest">Latest Conduit Release</a></li>
+<li><a href="https://github.com/algorand/indexer/releases/latest">Latest Indexer Release</a></li>
+</ul>
+
<hr>
<section id="algod">
@@ -30,13 +39,6 @@
<hr>
-<section id="indexer">
-<h1>Indexer releases</h1>
-<table><tr><th>File</th><th>Bytes</th><th>GPG Signature</th></tr>
-{indexer}
-</table>
-</section>
-
</body>
</html>
diff --git a/shared/algoh/config.go b/shared/algoh/config.go
index a4cec444d..12e815dfa 100644
--- a/shared/algoh/config.go
+++ b/shared/algoh/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/shared/pingpong/accounts.go b/shared/pingpong/accounts.go
index 3c34469f3..99eb4b25b 100644
--- a/shared/pingpong/accounts.go
+++ b/shared/pingpong/accounts.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/shared/pingpong/accounts_test.go b/shared/pingpong/accounts_test.go
index 08def8994..2b2fa4cad 100644
--- a/shared/pingpong/accounts_test.go
+++ b/shared/pingpong/accounts_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/shared/pingpong/config.go b/shared/pingpong/config.go
index 6d3057e9b..5b4042dee 100644
--- a/shared/pingpong/config.go
+++ b/shared/pingpong/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/shared/pingpong/pingpong.go b/shared/pingpong/pingpong.go
index 95aeac039..412d59c54 100644
--- a/shared/pingpong/pingpong.go
+++ b/shared/pingpong/pingpong.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/abstractions.go b/stateproof/abstractions.go
index 67f473188..5832fed87 100644
--- a/stateproof/abstractions.go
+++ b/stateproof/abstractions.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/builder.go b/stateproof/builder.go
index 13f4aa5b9..317e81360 100644
--- a/stateproof/builder.go
+++ b/stateproof/builder.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/db.go b/stateproof/db.go
index 46618a1f7..e89942280 100644
--- a/stateproof/db.go
+++ b/stateproof/db.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/db_test.go b/stateproof/db_test.go
index 5fc136554..d497b9240 100644
--- a/stateproof/db_test.go
+++ b/stateproof/db_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/recovery.go b/stateproof/recovery.go
index 6bd20337f..3585e3ab1 100644
--- a/stateproof/recovery.go
+++ b/stateproof/recovery.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/signer.go b/stateproof/signer.go
index 99c715fb9..117839b35 100644
--- a/stateproof/signer.go
+++ b/stateproof/signer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/stateproofMessageGenerator.go b/stateproof/stateproofMessageGenerator.go
index c51d76719..cadca13c2 100644
--- a/stateproof/stateproofMessageGenerator.go
+++ b/stateproof/stateproofMessageGenerator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/stateproofMessageGenerator_test.go b/stateproof/stateproofMessageGenerator_test.go
index a990143b0..a9db6da2d 100644
--- a/stateproof/stateproofMessageGenerator_test.go
+++ b/stateproof/stateproofMessageGenerator_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/verify/stateproof.go b/stateproof/verify/stateproof.go
index 3caaabac8..50ea86a84 100644
--- a/stateproof/verify/stateproof.go
+++ b/stateproof/verify/stateproof.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/verify/stateproof_test.go b/stateproof/verify/stateproof_test.go
index b092bad8f..b82ef0b2b 100644
--- a/stateproof/verify/stateproof_test.go
+++ b/stateproof/verify/stateproof_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/worker.go b/stateproof/worker.go
index e9aa84f85..e73a06d13 100644
--- a/stateproof/worker.go
+++ b/stateproof/worker.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/stateproof/worker_test.go b/stateproof/worker_test.go
index 68a19dcd2..8521cac93 100644
--- a/stateproof/worker_test.go
+++ b/stateproof/worker_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_agent/component/agent.go b/test/commandandcontrol/cc_agent/component/agent.go
index 4f01065b6..1a4e738b0 100644
--- a/test/commandandcontrol/cc_agent/component/agent.go
+++ b/test/commandandcontrol/cc_agent/component/agent.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_agent/component/agent_test.go b/test/commandandcontrol/cc_agent/component/agent_test.go
index b819ab83c..b827241e5 100644
--- a/test/commandandcontrol/cc_agent/component/agent_test.go
+++ b/test/commandandcontrol/cc_agent/component/agent_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_agent/component/pingPongComponent.go b/test/commandandcontrol/cc_agent/component/pingPongComponent.go
index ffc61fa5d..70e3980b6 100644
--- a/test/commandandcontrol/cc_agent/component/pingPongComponent.go
+++ b/test/commandandcontrol/cc_agent/component/pingPongComponent.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_agent/main.go b/test/commandandcontrol/cc_agent/main.go
index 5adcfa562..db8e52943 100644
--- a/test/commandandcontrol/cc_agent/main.go
+++ b/test/commandandcontrol/cc_agent/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_client/main.go b/test/commandandcontrol/cc_client/main.go
index 6b64117b0..674b79521 100644
--- a/test/commandandcontrol/cc_client/main.go
+++ b/test/commandandcontrol/cc_client/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/cc_service/main.go b/test/commandandcontrol/cc_service/main.go
index fa39f9229..b0d58f721 100644
--- a/test/commandandcontrol/cc_service/main.go
+++ b/test/commandandcontrol/cc_service/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/commandandcontrol/lib/ccCommon.go b/test/commandandcontrol/lib/ccCommon.go
index 36cff09ec..a733aefc5 100644
--- a/test/commandandcontrol/lib/ccCommon.go
+++ b/test/commandandcontrol/lib/ccCommon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/algod/cleanup_test.go b/test/e2e-go/cli/algod/cleanup_test.go
index 9e690b45a..20ec8aeb7 100644
--- a/test/e2e-go/cli/algod/cleanup_test.go
+++ b/test/e2e-go/cli/algod/cleanup_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/algod/expect/algod_expect_test.go b/test/e2e-go/cli/algod/expect/algod_expect_test.go
index 25850d059..482d6ddec 100644
--- a/test/e2e-go/cli/algod/expect/algod_expect_test.go
+++ b/test/e2e-go/cli/algod/expect/algod_expect_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/algod/stdstreams_test.go b/test/e2e-go/cli/algod/stdstreams_test.go
index f2a412752..3d1e7e189 100644
--- a/test/e2e-go/cli/algod/stdstreams_test.go
+++ b/test/e2e-go/cli/algod/stdstreams_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/algoh/expect/algoh_expect_test.go b/test/e2e-go/cli/algoh/expect/algoh_expect_test.go
index 8a94200a6..873708b66 100644
--- a/test/e2e-go/cli/algoh/expect/algoh_expect_test.go
+++ b/test/e2e-go/cli/algoh/expect/algoh_expect_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/account_test.go b/test/e2e-go/cli/goal/account_test.go
index fe05ccddb..f26cf7e11 100644
--- a/test/e2e-go/cli/goal/account_test.go
+++ b/test/e2e-go/cli/goal/account_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/clerk_test.go b/test/e2e-go/cli/goal/clerk_test.go
index 165c65e9f..ff0247421 100644
--- a/test/e2e-go/cli/goal/clerk_test.go
+++ b/test/e2e-go/cli/goal/clerk_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/common_test.go b/test/e2e-go/cli/goal/common_test.go
index a233d8737..a6d86944b 100644
--- a/test/e2e-go/cli/goal/common_test.go
+++ b/test/e2e-go/cli/goal/common_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp b/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
index 0a3b8ea48..7ba924f99 100644
--- a/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
+++ b/test/e2e-go/cli/goal/expect/catchpointCatchupTest.exp
@@ -6,7 +6,7 @@ log_user 1
#
# The goal of the test is to demonstrate the catchpoint catchup functionality using the goal command line interface.
# It does that by deploying a single relay, which advances until it generates a catchpoint.
-# Once it does, another node is started, and instructred to catchup using the catchpoint from the first relay.
+# Once it does, another node is started, and instructed to catchup using the catchpoint from the first relay.
# To make sure that the second node won't be using the "regular" catchup, we tunnel all the communication between the two using a proxy.
# The proxy is responsible to filter out block number 2. This would prevent the "regular" catchup from working,
# and would be a good test ground for the catchpoint catchup.
@@ -64,7 +64,7 @@ if { [catch {
::AlgorandGoal::CreateNetwork $NETWORK_NAME $NETWORK_TEMPLATE $TEST_ALGO_DIR $TEST_ROOT_DIR
# Update the Primary Node configuration
- exec -- cat "$TEST_ROOT_DIR/Primary/config.json" | jq {. |= . + {"MaxAcctLookback": 2, "CatchpointInterval": 4,"EnableRequestLogger":true}} > $TEST_ROOT_DIR/Primary/config.json.new
+ exec -- cat "$TEST_ROOT_DIR/Primary/config.json" | jq {. |= . + {"MaxAcctLookback": 2, "CatchpointInterval": 4,"EnableRequestLogger":true,"Archival":true}} > $TEST_ROOT_DIR/Primary/config.json.new
exec rm $TEST_ROOT_DIR/Primary/config.json
exec mv $TEST_ROOT_DIR/Primary/config.json.new $TEST_ROOT_DIR/Primary/config.json
diff --git a/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go b/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go
index 6b4ac0f31..6b3a2282f 100644
--- a/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go
+++ b/test/e2e-go/cli/goal/expect/catchpointCatchupWebProxy/webproxy.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp b/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
index 6146fa172..6146fa172 100644..100755
--- a/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
+++ b/test/e2e-go/cli/goal/expect/goalAppAccountAddressTest.exp
diff --git a/test/e2e-go/cli/goal/expect/goal_expect_test.go b/test/e2e-go/cli/goal/expect/goal_expect_test.go
index b90dd17d4..f6d1be462 100644
--- a/test/e2e-go/cli/goal/expect/goal_expect_test.go
+++ b/test/e2e-go/cli/goal/expect/goal_expect_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp b/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp
index 0051d65cc..0051d65cc 100755..100644
--- a/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp
+++ b/test/e2e-go/cli/goal/expect/statefulTealCreateAppTest.exp
diff --git a/test/e2e-go/cli/goal/expect/tealConsensusTest.exp b/test/e2e-go/cli/goal/expect/tealConsensusTest.exp
index cd2b81cfd..cd2b81cfd 100755..100644
--- a/test/e2e-go/cli/goal/expect/tealConsensusTest.exp
+++ b/test/e2e-go/cli/goal/expect/tealConsensusTest.exp
diff --git a/test/e2e-go/cli/goal/node_cleanup_test.go b/test/e2e-go/cli/goal/node_cleanup_test.go
index ae70c8960..a472d575c 100644
--- a/test/e2e-go/cli/goal/node_cleanup_test.go
+++ b/test/e2e-go/cli/goal/node_cleanup_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/perf/libgoal_test.go b/test/e2e-go/cli/perf/libgoal_test.go
index a3e7581c6..6843189e0 100644
--- a/test/e2e-go/cli/perf/libgoal_test.go
+++ b/test/e2e-go/cli/perf/libgoal_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/perf/payment_test.go b/test/e2e-go/cli/perf/payment_test.go
index fc60e16b8..8c875e0d5 100644
--- a/test/e2e-go/cli/perf/payment_test.go
+++ b/test/e2e-go/cli/perf/payment_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/tealdbg/cdtmock/main.go b/test/e2e-go/cli/tealdbg/cdtmock/main.go
index 6d1292e4b..4aee6e4b1 100644
--- a/test/e2e-go/cli/tealdbg/cdtmock/main.go
+++ b/test/e2e-go/cli/tealdbg/cdtmock/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go
index aedf8a2d9..9ebfdec6f 100644
--- a/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go
+++ b/test/e2e-go/cli/tealdbg/expect/tealdbg_expect_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/accountPerf/sixMillion_test.go b/test/e2e-go/features/accountPerf/sixMillion_test.go
index 7548b259b..946d1b24b 100644
--- a/test/e2e-go/features/accountPerf/sixMillion_test.go
+++ b/test/e2e-go/features/accountPerf/sixMillion_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/catchup/basicCatchup_test.go b/test/e2e-go/features/catchup/basicCatchup_test.go
index f6a009dc1..2e3ac8794 100644
--- a/test/e2e-go/features/catchup/basicCatchup_test.go
+++ b/test/e2e-go/features/catchup/basicCatchup_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/catchup/catchpointCatchup_test.go b/test/e2e-go/features/catchup/catchpointCatchup_test.go
index eb8345130..7d731e9e9 100644
--- a/test/e2e-go/features/catchup/catchpointCatchup_test.go
+++ b/test/e2e-go/features/catchup/catchpointCatchup_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -126,6 +126,10 @@ func configureCatchpointGeneration(a *require.Assertions, nodeController *nodeco
a.NoError(err)
cfg.CatchpointInterval = basicTestCatchpointInterval
+ cfg.Archival = false // make it explicit non-archival
+ cfg.MaxBlockHistoryLookback = 20000 // to save blocks beyond MaxTxnLife=13
+ cfg.CatchpointTracking = 2 // to enable catchpoints on non-archival nodes
+ cfg.CatchpointFileHistoryLength = 30 // to store more than 2 default catchpoints
cfg.MaxAcctLookback = 2
err = cfg.SaveToDisk(nodeController.GetDataDir())
a.NoError(err)
@@ -383,7 +387,6 @@ func TestCatchpointLabelGeneration(t *testing.T) {
expectLabels bool
}{
{4, true, true},
- {4, false, true},
{0, true, false},
}
@@ -506,8 +509,11 @@ func TestNodeTxHandlerRestart(t *testing.T) {
a.NoError(err)
const catchpointInterval = 16
cfg.CatchpointInterval = catchpointInterval
- cfg.CatchpointTracking = 2
- cfg.TxSyncIntervalSeconds = 200000 // disable txSync
+ cfg.Archival = false // make it explicit non-archival
+ cfg.MaxBlockHistoryLookback = 20000 // to save blocks beyond MaxTxnLife=13
+ cfg.CatchpointTracking = 2 // to enable catchpoints on non-archival nodes
+ cfg.CatchpointFileHistoryLength = 30 // to store more than 2 default catchpoints
+ cfg.TxSyncIntervalSeconds = 200000 // disable txSync
cfg.SaveToDisk(relayNode.GetDataDir())
fixture.Start()
@@ -612,8 +618,11 @@ func TestReadyEndpoint(t *testing.T) {
a.NoError(err)
const catchpointInterval = 16
cfg.CatchpointInterval = catchpointInterval
- cfg.CatchpointTracking = 2
- cfg.TxSyncIntervalSeconds = 200000 // disable txSync
+ cfg.Archival = false // make it explicit non-archival
+ cfg.MaxBlockHistoryLookback = 20000 // to save blocks beyond MaxTxnLife=13
+ cfg.CatchpointTracking = 2 // to enable catchpoints on non-archival nodes
+ cfg.CatchpointFileHistoryLength = 30 // to store more than 2 default catchpoints
+ cfg.TxSyncIntervalSeconds = 200000 // disable txSync
cfg.SaveToDisk(relayNode.GetDataDir())
fixture.Start()
diff --git a/test/e2e-go/features/catchup/stateproofsCatchup_test.go b/test/e2e-go/features/catchup/stateproofsCatchup_test.go
index 4d3140c8d..9de6bf385 100644
--- a/test/e2e-go/features/catchup/stateproofsCatchup_test.go
+++ b/test/e2e-go/features/catchup/stateproofsCatchup_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/devmode/devmode_test.go b/test/e2e-go/features/devmode/devmode_test.go
index 5c2545a33..c2303085c 100644
--- a/test/e2e-go/features/devmode/devmode_test.go
+++ b/test/e2e-go/features/devmode/devmode_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/followernode/syncDeltas_test.go b/test/e2e-go/features/followernode/syncDeltas_test.go
index bd3d8e0d8..b404a2a5e 100644
--- a/test/e2e-go/features/followernode/syncDeltas_test.go
+++ b/test/e2e-go/features/followernode/syncDeltas_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/followernode/syncRestart_test.go b/test/e2e-go/features/followernode/syncRestart_test.go
index 9bdd686f4..589bb7b53 100644
--- a/test/e2e-go/features/followernode/syncRestart_test.go
+++ b/test/e2e-go/features/followernode/syncRestart_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/multisig/multisig_test.go b/test/e2e-go/features/multisig/multisig_test.go
index 3452b1b50..6d7b1c616 100644
--- a/test/e2e-go/features/multisig/multisig_test.go
+++ b/test/e2e-go/features/multisig/multisig_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/p2p/p2p_basic_test.go b/test/e2e-go/features/p2p/p2p_basic_test.go
index 726a77cfe..6f3e8aae4 100644
--- a/test/e2e-go/features/p2p/p2p_basic_test.go
+++ b/test/e2e-go/features/p2p/p2p_basic_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/accountParticipationTransitions_test.go b/test/e2e-go/features/participation/accountParticipationTransitions_test.go
index 6752af841..1e5339f13 100644
--- a/test/e2e-go/features/participation/accountParticipationTransitions_test.go
+++ b/test/e2e-go/features/participation/accountParticipationTransitions_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/deletePartKeys_test.go b/test/e2e-go/features/participation/deletePartKeys_test.go
index c72925dba..aba68a0ce 100644
--- a/test/e2e-go/features/participation/deletePartKeys_test.go
+++ b/test/e2e-go/features/participation/deletePartKeys_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/onlineOfflineParticipation_test.go b/test/e2e-go/features/participation/onlineOfflineParticipation_test.go
index 18c985c20..38f2e4bc3 100644
--- a/test/e2e-go/features/participation/onlineOfflineParticipation_test.go
+++ b/test/e2e-go/features/participation/onlineOfflineParticipation_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/overlappingParticipationKeys_test.go b/test/e2e-go/features/participation/overlappingParticipationKeys_test.go
index b6df5b441..60f3471b7 100644
--- a/test/e2e-go/features/participation/overlappingParticipationKeys_test.go
+++ b/test/e2e-go/features/participation/overlappingParticipationKeys_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/participationExpiration_test.go b/test/e2e-go/features/participation/participationExpiration_test.go
index 3bb915ab0..5cb4f941d 100644
--- a/test/e2e-go/features/participation/participationExpiration_test.go
+++ b/test/e2e-go/features/participation/participationExpiration_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/participation/participationRewards_test.go b/test/e2e-go/features/participation/participationRewards_test.go
index a9c81f6a4..8c0fb64a8 100644
--- a/test/e2e-go/features/participation/participationRewards_test.go
+++ b/test/e2e-go/features/participation/participationRewards_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go b/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go
index 3f16be7f6..284146864 100644
--- a/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go
+++ b/test/e2e-go/features/partitionRecovery/partitionRecovery_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/privatenet/privatenet_test.go b/test/e2e-go/features/privatenet/privatenet_test.go
index 312abed61..34c4119cc 100644
--- a/test/e2e-go/features/privatenet/privatenet_test.go
+++ b/test/e2e-go/features/privatenet/privatenet_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/stateproofs/stateproofs_test.go b/test/e2e-go/features/stateproofs/stateproofs_test.go
index 287553acf..85d7d5e12 100644
--- a/test/e2e-go/features/stateproofs/stateproofs_test.go
+++ b/test/e2e-go/features/stateproofs/stateproofs_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/teal/compile_test.go b/test/e2e-go/features/teal/compile_test.go
index da1538112..31a3c078e 100644
--- a/test/e2e-go/features/teal/compile_test.go
+++ b/test/e2e-go/features/teal/compile_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/accountv2_test.go b/test/e2e-go/features/transactions/accountv2_test.go
index fc6a82888..fb255fa9c 100644
--- a/test/e2e-go/features/transactions/accountv2_test.go
+++ b/test/e2e-go/features/transactions/accountv2_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/app_pages_test.go b/test/e2e-go/features/transactions/app_pages_test.go
index f9ce0878a..710c00fc7 100644
--- a/test/e2e-go/features/transactions/app_pages_test.go
+++ b/test/e2e-go/features/transactions/app_pages_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/application_test.go b/test/e2e-go/features/transactions/application_test.go
index a93794bb2..bbe5abf2d 100644
--- a/test/e2e-go/features/transactions/application_test.go
+++ b/test/e2e-go/features/transactions/application_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/asset_test.go b/test/e2e-go/features/transactions/asset_test.go
index 2b38e7d51..82e949d0b 100644
--- a/test/e2e-go/features/transactions/asset_test.go
+++ b/test/e2e-go/features/transactions/asset_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/close_account_test.go b/test/e2e-go/features/transactions/close_account_test.go
index 3426ea957..a0f42a40d 100644
--- a/test/e2e-go/features/transactions/close_account_test.go
+++ b/test/e2e-go/features/transactions/close_account_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/group_test.go b/test/e2e-go/features/transactions/group_test.go
index 1d8341f42..117689f26 100644
--- a/test/e2e-go/features/transactions/group_test.go
+++ b/test/e2e-go/features/transactions/group_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/lease_test.go b/test/e2e-go/features/transactions/lease_test.go
index 093ec2273..47328369e 100644
--- a/test/e2e-go/features/transactions/lease_test.go
+++ b/test/e2e-go/features/transactions/lease_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/onlineStatusChange_test.go b/test/e2e-go/features/transactions/onlineStatusChange_test.go
index 7a9e6b346..04a5144f2 100644
--- a/test/e2e-go/features/transactions/onlineStatusChange_test.go
+++ b/test/e2e-go/features/transactions/onlineStatusChange_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/proof_test.go b/test/e2e-go/features/transactions/proof_test.go
index f7d8141d7..6588174f3 100644
--- a/test/e2e-go/features/transactions/proof_test.go
+++ b/test/e2e-go/features/transactions/proof_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/features/transactions/sendReceive_test.go b/test/e2e-go/features/transactions/sendReceive_test.go
index 1a261a844..9d909beed 100644
--- a/test/e2e-go/features/transactions/sendReceive_test.go
+++ b/test/e2e-go/features/transactions/sendReceive_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/globals/constants.go b/test/e2e-go/globals/constants.go
index b289379a1..fd43a105d 100644
--- a/test/e2e-go/globals/constants.go
+++ b/test/e2e-go/globals/constants.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/kmd/e2e_kmd_server_client_test.go b/test/e2e-go/kmd/e2e_kmd_server_client_test.go
index 7d7977a0b..601b3b5ac 100644
--- a/test/e2e-go/kmd/e2e_kmd_server_client_test.go
+++ b/test/e2e-go/kmd/e2e_kmd_server_client_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/kmd/e2e_kmd_sqlite_test.go b/test/e2e-go/kmd/e2e_kmd_sqlite_test.go
index d8290ae5e..441ab2032 100644
--- a/test/e2e-go/kmd/e2e_kmd_sqlite_test.go
+++ b/test/e2e-go/kmd/e2e_kmd_sqlite_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go
index c5dd733e0..3555b49ce 100644
--- a/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go
+++ b/test/e2e-go/kmd/e2e_kmd_wallet_keyops_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go
index 8995b70c7..d4367bbdc 100644
--- a/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go
+++ b/test/e2e-go/kmd/e2e_kmd_wallet_multisig_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/kmd/e2e_kmd_wallet_test.go b/test/e2e-go/kmd/e2e_kmd_wallet_test.go
index 558c4ff30..f3e5b87a2 100644
--- a/test/e2e-go/kmd/e2e_kmd_wallet_test.go
+++ b/test/e2e-go/kmd/e2e_kmd_wallet_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/perf/basic_test.go b/test/e2e-go/perf/basic_test.go
index be8a4c819..8509c4000 100644
--- a/test/e2e-go/perf/basic_test.go
+++ b/test/e2e-go/perf/basic_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/restAPI/helpers.go b/test/e2e-go/restAPI/helpers.go
index 3e85020e9..688ac373e 100644
--- a/test/e2e-go/restAPI/helpers.go
+++ b/test/e2e-go/restAPI/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/restAPI/other/appsRestAPI_test.go b/test/e2e-go/restAPI/other/appsRestAPI_test.go
index 8abe6a4db..c4a4986ed 100644
--- a/test/e2e-go/restAPI/other/appsRestAPI_test.go
+++ b/test/e2e-go/restAPI/other/appsRestAPI_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -31,7 +31,6 @@ import (
"github.com/algorand/go-algorand/data/basics"
"github.com/algorand/go-algorand/data/transactions"
"github.com/algorand/go-algorand/data/transactions/logic"
- "github.com/algorand/go-algorand/protocol"
"github.com/algorand/go-algorand/test/framework/fixtures"
"github.com/algorand/go-algorand/test/partitiontest"
"github.com/stretchr/testify/require"
@@ -319,15 +318,12 @@ end:
e := err.(client.HTTPError)
a.Equal(400, e.StatusCode)
- var er *model.ErrorResponse
- err = protocol.DecodeJSON([]byte(e.ErrorString), &er)
- a.NoError(err)
- a.Equal("Result limit exceeded", er.Message)
- a.Equal(uint64(100000), ((*er.Data)["max-api-box-per-application"]).(uint64))
- a.Equal(requestedMax, ((*er.Data)["max"]).(uint64))
- a.Equal(expectedCount, ((*er.Data)["total-boxes"]).(uint64))
+ a.Equal("Result limit exceeded", e.ErrorString)
+ a.EqualValues(100000, e.Data["max-api-box-per-application"])
+ a.EqualValues(requestedMax, e.Data["max"])
+ a.EqualValues(expectedCount, e.Data["total-boxes"])
- a.Len(*er.Data, 3, fmt.Sprintf("error response (%v) contains unverified fields. Extend test for new fields.", *er.Data))
+ a.Len(e.Data, 3, fmt.Sprintf("error response (%v) contains unverified fields. Extend test for new fields.", e.Data))
}
// `assertBoxCount` sanity checks that the REST API respects `expectedCount` through different queries against app ID = `createdAppID`.
diff --git a/test/e2e-go/restAPI/other/misc_test.go b/test/e2e-go/restAPI/other/misc_test.go
index b77a84452..3f9da07c4 100644
--- a/test/e2e-go/restAPI/other/misc_test.go
+++ b/test/e2e-go/restAPI/other/misc_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/restAPI/restClient_test.go b/test/e2e-go/restAPI/restClient_test.go
index 65292563d..8f3298170 100644
--- a/test/e2e-go/restAPI/restClient_test.go
+++ b/test/e2e-go/restAPI/restClient_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/restAPI/simulate/simulateRestAPI_test.go b/test/e2e-go/restAPI/simulate/simulateRestAPI_test.go
index 9f4b66d57..a30ce06b4 100644
--- a/test/e2e-go/restAPI/simulate/simulateRestAPI_test.go
+++ b/test/e2e-go/restAPI/simulate/simulateRestAPI_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/restAPI/stateproof/stateproofRestAPI_test.go b/test/e2e-go/restAPI/stateproof/stateproofRestAPI_test.go
index 497d12864..f539bf3a3 100644
--- a/test/e2e-go/restAPI/stateproof/stateproofRestAPI_test.go
+++ b/test/e2e-go/restAPI/stateproof/stateproofRestAPI_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go
index a7e5c9755..57f273574 100644
--- a/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go
+++ b/test/e2e-go/stress/transactions/createManyAndGoOnline_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/upgrades/application_support_test.go b/test/e2e-go/upgrades/application_support_test.go
index 8746545d0..49635a43a 100644
--- a/test/e2e-go/upgrades/application_support_test.go
+++ b/test/e2e-go/upgrades/application_support_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/upgrades/rekey_support_test.go b/test/e2e-go/upgrades/rekey_support_test.go
index 4c7878bfa..30226c795 100644
--- a/test/e2e-go/upgrades/rekey_support_test.go
+++ b/test/e2e-go/upgrades/rekey_support_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/upgrades/send_receive_upgrade_test.go b/test/e2e-go/upgrades/send_receive_upgrade_test.go
index b6b413423..f9e0746cb 100644
--- a/test/e2e-go/upgrades/send_receive_upgrade_test.go
+++ b/test/e2e-go/upgrades/send_receive_upgrade_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/e2e-go/upgrades/stateproof_participation_test.go b/test/e2e-go/upgrades/stateproof_participation_test.go
index 8823d7c76..5c6a6ab94 100644
--- a/test/e2e-go/upgrades/stateproof_participation_test.go
+++ b/test/e2e-go/upgrades/stateproof_participation_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/baseFixture.go b/test/framework/fixtures/baseFixture.go
index 918fa6d7d..4701508e8 100644
--- a/test/framework/fixtures/baseFixture.go
+++ b/test/framework/fixtures/baseFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/expectFixture.go b/test/framework/fixtures/expectFixture.go
index 50206bda1..92d2daed8 100644
--- a/test/framework/fixtures/expectFixture.go
+++ b/test/framework/fixtures/expectFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/fixture.go b/test/framework/fixtures/fixture.go
index 4ccba1acc..a307534d3 100644
--- a/test/framework/fixtures/fixture.go
+++ b/test/framework/fixtures/fixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/goalFixture.go b/test/framework/fixtures/goalFixture.go
index 69e43e784..15e2fafa7 100644
--- a/test/framework/fixtures/goalFixture.go
+++ b/test/framework/fixtures/goalFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/kmdFixture.go b/test/framework/fixtures/kmdFixture.go
index 21c70dd31..7e747bb91 100644
--- a/test/framework/fixtures/kmdFixture.go
+++ b/test/framework/fixtures/kmdFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/libgoalFixture.go b/test/framework/fixtures/libgoalFixture.go
index 3b54f9f7a..474c90218 100644
--- a/test/framework/fixtures/libgoalFixture.go
+++ b/test/framework/fixtures/libgoalFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
@@ -317,7 +317,9 @@ func (f *LibGoalFixture) ShutdownImpl(preserveData bool) {
f.NC.StopKMD()
if preserveData {
f.network.Stop(f.binDir)
- f.dumpLogs(filepath.Join(f.PrimaryDataDir(), "node.log"))
+ for _, relayDir := range f.RelayDataDirs() {
+ f.dumpLogs(filepath.Join(relayDir, "node.log"))
+ }
for _, nodeDir := range f.NodeDataDirs() {
f.dumpLogs(filepath.Join(nodeDir, "node.log"))
}
@@ -365,6 +367,11 @@ func (f *LibGoalFixture) PrimaryDataDir() string {
return f.network.PrimaryDataDir()
}
+// RelayDataDirs returns the relays data directories for the network (including the primary relay)
+func (f *LibGoalFixture) RelayDataDirs() []string {
+ return f.network.RelayDataDirs()
+}
+
// NodeDataDirs returns the (non-Primary) data directories for the network
func (f *LibGoalFixture) NodeDataDirs() []string {
return f.network.NodeDataDirs()
diff --git a/test/framework/fixtures/restClientFixture.go b/test/framework/fixtures/restClientFixture.go
index e0151630a..40e12c408 100644
--- a/test/framework/fixtures/restClientFixture.go
+++ b/test/framework/fixtures/restClientFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/framework/fixtures/webProxyFixture.go b/test/framework/fixtures/webProxyFixture.go
index c04887580..87bf95f0f 100644
--- a/test/framework/fixtures/webProxyFixture.go
+++ b/test/framework/fixtures/webProxyFixture.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/block_history.py b/test/heapwatch/block_history.py
index c7fa3ce6f..665cd6c74 100644
--- a/test/heapwatch/block_history.py
+++ b/test/heapwatch/block_history.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/block_history_plot.py b/test/heapwatch/block_history_plot.py
index 03f5a4522..7de45e21b 100644
--- a/test/heapwatch/block_history_plot.py
+++ b/test/heapwatch/block_history_plot.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/block_history_relays.py b/test/heapwatch/block_history_relays.py
index ebf310587..fd60a3dfe 100644
--- a/test/heapwatch/block_history_relays.py
+++ b/test/heapwatch/block_history_relays.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/client_ram_report.py b/test/heapwatch/client_ram_report.py
index 7833ababa..97a117163 100644
--- a/test/heapwatch/client_ram_report.py
+++ b/test/heapwatch/client_ram_report.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/heapWatch.py b/test/heapwatch/heapWatch.py
index 68af9cd3b..e62cc7ab8 100644
--- a/test/heapwatch/heapWatch.py
+++ b/test/heapwatch/heapWatch.py
@@ -1,6 +1,6 @@
#!/usr/bin/python3
#
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/metrics_delta.py b/test/heapwatch/metrics_delta.py
index 420130df9..50b1e9e2e 100644
--- a/test/heapwatch/metrics_delta.py
+++ b/test/heapwatch/metrics_delta.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/nodeHostTarget.py b/test/heapwatch/nodeHostTarget.py
index ccab46ba1..1b617c9d2 100644
--- a/test/heapwatch/nodeHostTarget.py
+++ b/test/heapwatch/nodeHostTarget.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/heapwatch/runNodeHost.py b/test/heapwatch/runNodeHost.py
index be2ce61be..5625ec61b 100644
--- a/test/heapwatch/runNodeHost.py
+++ b/test/heapwatch/runNodeHost.py
@@ -1,5 +1,5 @@
#!/usr/bin/python3
-# Copyright (C) 2019-2023 Algorand, Inc.
+# Copyright (C) 2019-2024 Algorand, Inc.
# This file is part of go-algorand
#
# go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/linttest/lintissues.go b/test/linttest/lintissues.go
index cdfdbf422..5f21543d9 100644
--- a/test/linttest/lintissues.go
+++ b/test/linttest/lintissues.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/main.go b/test/netperf-go/puppeteer/main.go
index fbebeb705..691dd663b 100644
--- a/test/netperf-go/puppeteer/main.go
+++ b/test/netperf-go/puppeteer/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/promMetricFetcher.go b/test/netperf-go/puppeteer/promMetricFetcher.go
index ea24008fa..cd268d0db 100644
--- a/test/netperf-go/puppeteer/promMetricFetcher.go
+++ b/test/netperf-go/puppeteer/promMetricFetcher.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/promMetricFetcher_test.go b/test/netperf-go/puppeteer/promMetricFetcher_test.go
index 200a9af25..ee95922b2 100644
--- a/test/netperf-go/puppeteer/promMetricFetcher_test.go
+++ b/test/netperf-go/puppeteer/promMetricFetcher_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/puppeteer.go b/test/netperf-go/puppeteer/puppeteer.go
index 260c65967..c31774291 100644
--- a/test/netperf-go/puppeteer/puppeteer.go
+++ b/test/netperf-go/puppeteer/puppeteer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/puppeteer_test.go b/test/netperf-go/puppeteer/puppeteer_test.go
index e20275143..b86b1cd1a 100644
--- a/test/netperf-go/puppeteer/puppeteer_test.go
+++ b/test/netperf-go/puppeteer/puppeteer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/netperf-go/puppeteer/roundpoller.go b/test/netperf-go/puppeteer/roundpoller.go
index 2ce501a2a..63156ff89 100644
--- a/test/netperf-go/puppeteer/roundpoller.go
+++ b/test/netperf-go/puppeteer/roundpoller.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/partitiontest/filtering.go b/test/partitiontest/filtering.go
index 19820f601..de738ed71 100644
--- a/test/partitiontest/filtering.go
+++ b/test/partitiontest/filtering.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/reflectionhelpers/helpers.go b/test/reflectionhelpers/helpers.go
index 6d228b061..de11d3c9e 100644
--- a/test/reflectionhelpers/helpers.go
+++ b/test/reflectionhelpers/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/test/scripts/e2e.sh b/test/scripts/e2e.sh
index 760c3170a..a3b2c756f 100755
--- a/test/scripts/e2e.sh
+++ b/test/scripts/e2e.sh
@@ -125,9 +125,10 @@ if [ -z "$E2E_TEST_FILTER" ] || [ "$E2E_TEST_FILTER" == "SCRIPTS" ]; then
. "${TEMPDIR}/ve/bin/activate"
"${TEMPDIR}/ve/bin/pip3" install --upgrade pip
- # Pin a version of our python SDK's so that breaking changes don't spuriously break our tests.
- # Please update as necessary.
- "${TEMPDIR}/ve/bin/pip3" install py-algorand-sdk==1.17.0
+ # Pin major version of our python SDK's so that breaking changes
+ # don't spuriously break our tests. If a minor version breaks our
+ # tests, we ought to find out.
+ "${TEMPDIR}/ve/bin/pip3" install 'py-algorand-sdk==2.*'
# Enable remote debugging:
"${TEMPDIR}/ve/bin/pip3" install --upgrade debugpy
diff --git a/test/scripts/e2e_client_runner.py b/test/scripts/e2e_client_runner.py
index 7b425ef92..3d5888696 100755
--- a/test/scripts/e2e_client_runner.py
+++ b/test/scripts/e2e_client_runner.py
@@ -114,11 +114,12 @@ def _script_thread_inner(runset, scriptname, timeout):
params = algod.suggested_params()
round = params.first
max_init_wait_rounds = 5
- txn = algosdk.transaction.PaymentTxn(sender=maxpubaddr, fee=params.min_fee, first=round, last=round+max_init_wait_rounds, gh=params.gh, receiver=addr, amt=1000000000000, flat_fee=True)
+ params.last = params.first + max_init_wait_rounds
+ txn = algosdk.transaction.PaymentTxn(maxpubaddr, params, addr, 1_000_000_000_000)
stxn = kmd.sign_transaction(pubw, '', txn)
txid = algod.send_transaction(stxn)
ptxinfo = None
- for i in range(max_init_wait_rounds):
+ for _ in range(max_init_wait_rounds):
txinfo = algod.pending_transaction_info(txid)
if txinfo.get('round'):
break
diff --git a/test/scripts/e2e_subs/avm-failure-info.py b/test/scripts/e2e_subs/avm-failure-info.py
new file mode 100755
index 000000000..5f2adfab4
--- /dev/null
+++ b/test/scripts/e2e_subs/avm-failure-info.py
@@ -0,0 +1,78 @@
+#!/usr/bin/env python
+
+import os
+import json
+import subprocess
+import sys
+from goal import Goal
+
+from datetime import datetime
+
+stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+print(f"{os.path.basename(sys.argv[0])} start {stamp}")
+
+goal = Goal(sys.argv[1], autosend=True)
+
+joe = goal.new_account()
+
+txinfo, err = goal.pay(goal.account, joe, amt=500_000)
+assert not err, err
+
+teal = """
+#pragma version 6
+ byte 0x1a00011afb // be sure to test non-ascii logs
+ byte 0x2a00012afc // be sure to test non-ascii logs
+ log
+ log
+ int 42
+ byte 0x4a01004afa // be sure to test non-ascii stack
+ int 7
+ store 10
+ byte 0x4a00014afe // be sure to test non-ascii scratch
+ store 12
+ int 1
+ int 2
+ - // Fail!
+end:
+ int 1
+"""
+
+tx = goal.app_create(joe, goal.assemble(teal), send=False)
+command = goal.curl_command(tx)
+response = subprocess.check_output(command, shell=True)
+j = json.loads(response)
+print(j)
+assert j['data']['pc'] == 45
+assert j['data']['group-index'] == 0
+assert j['data']['app-index'] > 1000
+assert j['data']['eval-states'][0]['scratch'][10] == 7
+assert j['data']['eval-states'][0]['scratch'][12] == 'SgABSv4='
+assert j['data']['eval-states'][0]['stack'] == [42, 'SgEASvo=', 1, 2]
+assert j['data']['eval-states'][0]['logs'] == ['KgABKvw=', 'GgABGvs=']
+
+# Test some omit-empty behavior. That `scratch` simply doesn't appear,
+# and that `logs` does appear, even if the only log entry is an empty
+# message.
+teal = """
+#pragma version 6
+ byte 0x; log // Log (only) an empty msg
+ int 1
+ int 2
+ - // Fail!
+end:
+ int 1
+"""
+
+tx = goal.app_create(joe, goal.assemble(teal), send=False)
+command = goal.curl_command(tx)
+response = subprocess.check_output(command, shell=True)
+j = json.loads(response)
+print(j)
+
+assert j['data']['group-index'] == 0
+assert 'scratch' not in j['data']['eval-states'][0]
+assert j['data']['eval-states'][0]['logs'] == ['']
+assert j['data']['pc'] == 10
+
+stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
+print(f"{os.path.basename(sys.argv[0])} OK {stamp}")
diff --git a/test/scripts/e2e_subs/example.py b/test/scripts/e2e_subs/example.py
index 4852ac9d7..9e4e97097 100755
--- a/test/scripts/e2e_subs/example.py
+++ b/test/scripts/e2e_subs/example.py
@@ -4,7 +4,7 @@ import os
import sys
from goal import Goal
-import algosdk.future.transaction as txn
+import algosdk.transaction as txn
from datetime import datetime
stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
diff --git a/test/scripts/e2e_subs/goal/goal.py b/test/scripts/e2e_subs/goal/goal.py
index d36241fd7..5d0dd7db0 100755
--- a/test/scripts/e2e_subs/goal/goal.py
+++ b/test/scripts/e2e_subs/goal/goal.py
@@ -6,7 +6,7 @@ import os
import subprocess
import algosdk
-import algosdk.future.transaction as txn
+import algosdk.transaction as txn
import algosdk.encoding as enc
@@ -158,6 +158,19 @@ class Goal:
except algosdk.error.AlgodHTTPError as e:
return (None, e)
+ def send_details(self, tx):
+ stx = self.sign(tx)
+ headers = {"Content-Type": "application/x-binary",
+ "X-Algo-API-Token": self.algod.algod_token,
+ }
+ url = self.algod.algod_address + "/v2/transactions"
+ return (url, headers, enc.msgpack_encode(stx))
+
+ def curl_command(self, tx):
+ (url, headers, b64data) = self.send_details(tx)
+ H = " ".join(['-H "' + k + ':' + v + '"' for k,v in headers.items()])
+ return f"echo {b64data} | base64 -d | curl -s {url} {H} --data-binary @-"
+
def send_group(self, txns, confirm=True):
# Need unsigned transactions to calculate the group This pulls
# out the unsigned tx if tx is sigged, logicsigged or
diff --git a/test/scripts/e2e_subs/min_balance.py b/test/scripts/e2e_subs/min_balance.py
index b7376fd37..dfeacbe3b 100755
--- a/test/scripts/e2e_subs/min_balance.py
+++ b/test/scripts/e2e_subs/min_balance.py
@@ -5,8 +5,6 @@ from datetime import datetime
from pathlib import PurePath
import sys
-import algosdk.future.transaction as txn
-
from goal import Goal
# Set INTERACTIVE True if you want to run a remote debugger interactively on the given PORT
diff --git a/test/scripts/e2e_subs/shared-resources.py b/test/scripts/e2e_subs/shared-resources.py
index b5a93f96c..2df56f789 100755
--- a/test/scripts/e2e_subs/shared-resources.py
+++ b/test/scripts/e2e_subs/shared-resources.py
@@ -3,7 +3,7 @@
import os
import sys
import algosdk.encoding as enc
-import algosdk.future.transaction as txn
+import algosdk.transaction as txn
from goal import Goal
from datetime import datetime
diff --git a/test/testdata/deployednettemplates/generate-recipe/generate_network.py b/test/testdata/deployednettemplates/generate-recipe/generate_network.py
index 0a92aed20..254172aa4 100755
--- a/test/testdata/deployednettemplates/generate-recipe/generate_network.py
+++ b/test/testdata/deployednettemplates/generate-recipe/generate_network.py
@@ -70,6 +70,7 @@ def build_net(template_path, netgoal_params):
def build_genesis(template_path, netgoal_params, template_dict):
args = [
'-t', 'genesis',
+ '--last-part-key-round', str(100_000),
'-o', f"{template_path}/generated/genesis.json"
]
args.extend(netgoal_params)
diff --git a/test/testdata/deployednettemplates/recipes/custom/configs/node.json b/test/testdata/deployednettemplates/recipes/custom/configs/node.json
index 547f38e19..4afe82a04 100644
--- a/test/testdata/deployednettemplates/recipes/custom/configs/node.json
+++ b/test/testdata/deployednettemplates/recipes/custom/configs/node.json
@@ -19,7 +19,7 @@
"EnableMetrics": true,
"MetricsURI": "{{MetricsURI}}",
"ConfigJSONOverride": "{ \"TxPoolExponentialIncreaseFactor\": 1, \"DNSBootstrapID\": \"<network>.algodev.network\", \"DeadlockDetection\": -1, \"PeerPingPeriodSeconds\": 30, \"EnableAgreementReporting\": true, \"EnableAgreementTimeMetrics\": true, \"EnableAssembleStats\": true, \"EnableProcessBlockStats\": true, \"BaseLoggerDebugLevel\": 4, \"EnableProfiler\": true, \"EnableRuntimeMetrics\": true, \"CadaverSizeTarget\": 0 }",
- "FractionApply": 0.01
+ "FractionApply": 0.1
}
]
}
diff --git a/tools/block-generator/core/commands.go b/tools/block-generator/core/commands.go
index af64c8a5d..cf4396324 100644
--- a/tools/block-generator/core/commands.go
+++ b/tools/block-generator/core/commands.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/config.go b/tools/block-generator/generator/config.go
index 912696f11..55097b9ee 100644
--- a/tools/block-generator/generator/config.go
+++ b/tools/block-generator/generator/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/config_test.go b/tools/block-generator/generator/config_test.go
index a595ad6d6..634ea3497 100644
--- a/tools/block-generator/generator/config_test.go
+++ b/tools/block-generator/generator/config_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/daemon.go b/tools/block-generator/generator/daemon.go
index 0a1371a1b..8284fa559 100644
--- a/tools/block-generator/generator/daemon.go
+++ b/tools/block-generator/generator/daemon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/generate.go b/tools/block-generator/generator/generate.go
index 44c544487..45cf6775c 100644
--- a/tools/block-generator/generator/generate.go
+++ b/tools/block-generator/generator/generate.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/generate_apps.go b/tools/block-generator/generator/generate_apps.go
index 8edd28da5..972cf1e8a 100644
--- a/tools/block-generator/generator/generate_apps.go
+++ b/tools/block-generator/generator/generate_apps.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/generate_test.go b/tools/block-generator/generator/generate_test.go
index 1ce40b0f1..2c210ec4e 100644
--- a/tools/block-generator/generator/generate_test.go
+++ b/tools/block-generator/generator/generate_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/generator_ledger.go b/tools/block-generator/generator/generator_ledger.go
index dabad6ac2..f841b574f 100644
--- a/tools/block-generator/generator/generator_ledger.go
+++ b/tools/block-generator/generator/generator_ledger.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/generator_types.go b/tools/block-generator/generator/generator_types.go
index 622ddaf96..6cebf7686 100644
--- a/tools/block-generator/generator/generator_types.go
+++ b/tools/block-generator/generator/generator_types.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/make_transactions.go b/tools/block-generator/generator/make_transactions.go
index 6caffe25b..558dfd956 100644
--- a/tools/block-generator/generator/make_transactions.go
+++ b/tools/block-generator/generator/make_transactions.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/server.go b/tools/block-generator/generator/server.go
index 5b170c504..8bd4c5139 100644
--- a/tools/block-generator/generator/server.go
+++ b/tools/block-generator/generator/server.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/server_test.go b/tools/block-generator/generator/server_test.go
index a885181dd..d4b1c8f55 100644
--- a/tools/block-generator/generator/server_test.go
+++ b/tools/block-generator/generator/server_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/utils.go b/tools/block-generator/generator/utils.go
index 5f048a025..17cd5a865 100644
--- a/tools/block-generator/generator/utils.go
+++ b/tools/block-generator/generator/utils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/generator/utils_test.go b/tools/block-generator/generator/utils_test.go
index fb69a43fe..295672669 100644
--- a/tools/block-generator/generator/utils_test.go
+++ b/tools/block-generator/generator/utils_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/main.go b/tools/block-generator/main.go
index 6525bc4a6..6b5bee80a 100644
--- a/tools/block-generator/main.go
+++ b/tools/block-generator/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/runner/metrics_collector.go b/tools/block-generator/runner/metrics_collector.go
index 394bf32cb..f74a41f11 100644
--- a/tools/block-generator/runner/metrics_collector.go
+++ b/tools/block-generator/runner/metrics_collector.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/runner/reporting_test.go b/tools/block-generator/runner/reporting_test.go
index 56d73b17a..cebf6ea54 100644
--- a/tools/block-generator/runner/reporting_test.go
+++ b/tools/block-generator/runner/reporting_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/runner/run.go b/tools/block-generator/runner/run.go
index f2e1c1fc1..af5c9fe7b 100644
--- a/tools/block-generator/runner/run.go
+++ b/tools/block-generator/runner/run.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/runner/runner.go b/tools/block-generator/runner/runner.go
index 4c11fde59..c077415c7 100644
--- a/tools/block-generator/runner/runner.go
+++ b/tools/block-generator/runner/runner.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/block-generator/util/util.go b/tools/block-generator/util/util.go
index ccaafab84..0c4e3bdf4 100644
--- a/tools/block-generator/util/util.go
+++ b/tools/block-generator/util/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/boxkey/convertBoxKey.go b/tools/boxkey/convertBoxKey.go
index 0d77d2f84..5b87007a5 100644
--- a/tools/boxkey/convertBoxKey.go
+++ b/tools/boxkey/convertBoxKey.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/algodump/main.go b/tools/debug/algodump/main.go
index 429cec9f9..4899fb0c7 100644
--- a/tools/debug/algodump/main.go
+++ b/tools/debug/algodump/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/carpenter/main.go b/tools/debug/carpenter/main.go
index 57e90a810..96ca5296a 100644
--- a/tools/debug/carpenter/main.go
+++ b/tools/debug/carpenter/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/chopper/main.go b/tools/debug/chopper/main.go
index 5e70292f0..a09172c08 100644
--- a/tools/debug/chopper/main.go
+++ b/tools/debug/chopper/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/coroner/main.go b/tools/debug/coroner/main.go
index 1ea04537d..c8670b7b1 100644
--- a/tools/debug/coroner/main.go
+++ b/tools/debug/coroner/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/determaccount/main.go b/tools/debug/determaccount/main.go
index 2c3c16d65..3eec1f860 100644
--- a/tools/debug/determaccount/main.go
+++ b/tools/debug/determaccount/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/dumpblocks/main.go b/tools/debug/dumpblocks/main.go
index 663945d83..31a50631d 100644
--- a/tools/debug/dumpblocks/main.go
+++ b/tools/debug/dumpblocks/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/genconsensusconfig/main.go b/tools/debug/genconsensusconfig/main.go
index edef949d3..2de3f4e8f 100644
--- a/tools/debug/genconsensusconfig/main.go
+++ b/tools/debug/genconsensusconfig/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/logfilter/main.go b/tools/debug/logfilter/main.go
index 11878ea47..25bf6feae 100644
--- a/tools/debug/logfilter/main.go
+++ b/tools/debug/logfilter/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/logfilter/main_test.go b/tools/debug/logfilter/main_test.go
index 6b6902d62..77d14beb5 100644
--- a/tools/debug/logfilter/main_test.go
+++ b/tools/debug/logfilter/main_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/debug/transplanter/main.go b/tools/debug/transplanter/main.go
index 1ee2a9c84..0d2880412 100644
--- a/tools/debug/transplanter/main.go
+++ b/tools/debug/transplanter/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/misc/convertAddress.go b/tools/misc/convertAddress.go
index 801c26106..126afbe58 100644
--- a/tools/misc/convertAddress.go
+++ b/tools/misc/convertAddress.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/bootstrap.go b/tools/network/bootstrap.go
index 7558100a6..f04c67528 100644
--- a/tools/network/bootstrap.go
+++ b/tools/network/bootstrap.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/bootstrap_test.go b/tools/network/bootstrap_test.go
index 69ed39b2d..155615c70 100644
--- a/tools/network/bootstrap_test.go
+++ b/tools/network/bootstrap_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/cloudflare.go b/tools/network/cloudflare/cloudflare.go
index 84f62f653..a71e20b76 100644
--- a/tools/network/cloudflare/cloudflare.go
+++ b/tools/network/cloudflare/cloudflare.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/createRecord.go b/tools/network/cloudflare/createRecord.go
index a41dcbccc..efaa84057 100644
--- a/tools/network/cloudflare/createRecord.go
+++ b/tools/network/cloudflare/createRecord.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/deleteRecord.go b/tools/network/cloudflare/deleteRecord.go
index 864a223df..a59ab75b9 100644
--- a/tools/network/cloudflare/deleteRecord.go
+++ b/tools/network/cloudflare/deleteRecord.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/helpers.go b/tools/network/cloudflare/helpers.go
index e330d9330..cc5563837 100644
--- a/tools/network/cloudflare/helpers.go
+++ b/tools/network/cloudflare/helpers.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/listRecords.go b/tools/network/cloudflare/listRecords.go
index 34efc71d5..e676b3e42 100644
--- a/tools/network/cloudflare/listRecords.go
+++ b/tools/network/cloudflare/listRecords.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/updateRecord.go b/tools/network/cloudflare/updateRecord.go
index 7add2d05b..269c48f11 100644
--- a/tools/network/cloudflare/updateRecord.go
+++ b/tools/network/cloudflare/updateRecord.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/cloudflare/zones.go b/tools/network/cloudflare/zones.go
index c9a54a6df..8721ef1a7 100644
--- a/tools/network/cloudflare/zones.go
+++ b/tools/network/cloudflare/zones.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/anchor.go b/tools/network/dnssec/anchor.go
index 18d259aca..a3f8c0b19 100644
--- a/tools/network/dnssec/anchor.go
+++ b/tools/network/dnssec/anchor.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/anchor_test.go b/tools/network/dnssec/anchor_test.go
index dbd7396e0..6b574db8d 100644
--- a/tools/network/dnssec/anchor_test.go
+++ b/tools/network/dnssec/anchor_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/client.go b/tools/network/dnssec/client.go
index 79cd79a9c..71880db09 100644
--- a/tools/network/dnssec/client.go
+++ b/tools/network/dnssec/client.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/client_test.go b/tools/network/dnssec/client_test.go
index 7c2eede7d..f52008d44 100644
--- a/tools/network/dnssec/client_test.go
+++ b/tools/network/dnssec/client_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/config.go b/tools/network/dnssec/config.go
index a5c9bbbfe..6919e5618 100644
--- a/tools/network/dnssec/config.go
+++ b/tools/network/dnssec/config.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/config_test.go b/tools/network/dnssec/config_test.go
index 8ad1ae511..a84d30bb1 100644
--- a/tools/network/dnssec/config_test.go
+++ b/tools/network/dnssec/config_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/config_unix.go b/tools/network/dnssec/config_unix.go
index 74b3cb0f9..72c917872 100644
--- a/tools/network/dnssec/config_unix.go
+++ b/tools/network/dnssec/config_unix.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/config_unix_test.go b/tools/network/dnssec/config_unix_test.go
index 07a6a584b..5a840257d 100644
--- a/tools/network/dnssec/config_unix_test.go
+++ b/tools/network/dnssec/config_unix_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/config_windows.go b/tools/network/dnssec/config_windows.go
index 318f8f7a4..5772d10b1 100644
--- a/tools/network/dnssec/config_windows.go
+++ b/tools/network/dnssec/config_windows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/dialer.go b/tools/network/dnssec/dialer.go
index b80277afd..48896efcd 100644
--- a/tools/network/dnssec/dialer.go
+++ b/tools/network/dnssec/dialer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/dnssec_test.go b/tools/network/dnssec/dnssec_test.go
index 86c723918..c9d558944 100644
--- a/tools/network/dnssec/dnssec_test.go
+++ b/tools/network/dnssec/dnssec_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/relay-check/main.go b/tools/network/dnssec/relay-check/main.go
index f82211e09..47b5cd21f 100644
--- a/tools/network/dnssec/relay-check/main.go
+++ b/tools/network/dnssec/relay-check/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/resolver.go b/tools/network/dnssec/resolver.go
index 8900616f1..e4f5b9575 100644
--- a/tools/network/dnssec/resolver.go
+++ b/tools/network/dnssec/resolver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/sort.go b/tools/network/dnssec/sort.go
index 2c8de2653..5dcbeb94d 100644
--- a/tools/network/dnssec/sort.go
+++ b/tools/network/dnssec/sort.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/sort_test.go b/tools/network/dnssec/sort_test.go
index f84ed118d..9cf91cc99 100644
--- a/tools/network/dnssec/sort_test.go
+++ b/tools/network/dnssec/sort_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/testHarness.go b/tools/network/dnssec/testHarness.go
index 0f4c7f416..c261547dd 100644
--- a/tools/network/dnssec/testHarness.go
+++ b/tools/network/dnssec/testHarness.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/trustchain.go b/tools/network/dnssec/trustchain.go
index 15f69aea1..38d4731e8 100644
--- a/tools/network/dnssec/trustchain.go
+++ b/tools/network/dnssec/trustchain.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/trustedchain_test.go b/tools/network/dnssec/trustedchain_test.go
index 6310e22ab..16c8711a1 100644
--- a/tools/network/dnssec/trustedchain_test.go
+++ b/tools/network/dnssec/trustedchain_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/trustedzone.go b/tools/network/dnssec/trustedzone.go
index a71385503..44c8cb925 100644
--- a/tools/network/dnssec/trustedzone.go
+++ b/tools/network/dnssec/trustedzone.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/trustedzone_test.go b/tools/network/dnssec/trustedzone_test.go
index 877a68741..a32d004b8 100644
--- a/tools/network/dnssec/trustedzone_test.go
+++ b/tools/network/dnssec/trustedzone_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/util.go b/tools/network/dnssec/util.go
index 48f5c9448..020a645fe 100644
--- a/tools/network/dnssec/util.go
+++ b/tools/network/dnssec/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/dnssec/util_test.go b/tools/network/dnssec/util_test.go
index 2a77ad1c0..07b643b79 100644
--- a/tools/network/dnssec/util_test.go
+++ b/tools/network/dnssec/util_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/externalIP.go b/tools/network/externalIP.go
index 121c43df3..8f8ab4f3f 100644
--- a/tools/network/externalIP.go
+++ b/tools/network/externalIP.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/resolveController.go b/tools/network/resolveController.go
index b9b75fb7b..0bd7dea79 100644
--- a/tools/network/resolveController.go
+++ b/tools/network/resolveController.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/resolveController_test.go b/tools/network/resolveController_test.go
index db8a80573..bdfd1ffc4 100644
--- a/tools/network/resolveController_test.go
+++ b/tools/network/resolveController_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/resolver.go b/tools/network/resolver.go
index b823b17b2..ae9d123f2 100644
--- a/tools/network/resolver.go
+++ b/tools/network/resolver.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/resolver_test.go b/tools/network/resolver_test.go
index 6efe1bea4..d8efd59d4 100644
--- a/tools/network/resolver_test.go
+++ b/tools/network/resolver_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/telemetryURIUpdateService.go b/tools/network/telemetryURIUpdateService.go
index c6a573557..66dd87dd0 100644
--- a/tools/network/telemetryURIUpdateService.go
+++ b/tools/network/telemetryURIUpdateService.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/network/telemetryURIUpdateService_test.go b/tools/network/telemetryURIUpdateService_test.go
index 1014d28df..751290720 100644
--- a/tools/network/telemetryURIUpdateService_test.go
+++ b/tools/network/telemetryURIUpdateService_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/teal/algotmpl/extract.go b/tools/teal/algotmpl/extract.go
index f542d6bce..70a7825a5 100644
--- a/tools/teal/algotmpl/extract.go
+++ b/tools/teal/algotmpl/extract.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/teal/algotmpl/main.go b/tools/teal/algotmpl/main.go
index 824ab7ee9..34760ac05 100644
--- a/tools/teal/algotmpl/main.go
+++ b/tools/teal/algotmpl/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/teal/dkey/dsign/main.go b/tools/teal/dkey/dsign/main.go
index 5a4e2adfc..4e7cc1927 100644
--- a/tools/teal/dkey/dsign/main.go
+++ b/tools/teal/dkey/dsign/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/teal/tealcut/main.go b/tools/teal/tealcut/main.go
index 494392564..61857d9ef 100644
--- a/tools/teal/tealcut/main.go
+++ b/tools/teal/tealcut/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/typeAnalyzer/main.go b/tools/x-repo-types/typeAnalyzer/main.go
index f5225a54a..54c48a5f0 100644
--- a/tools/x-repo-types/typeAnalyzer/main.go
+++ b/tools/x-repo-types/typeAnalyzer/main.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/typeAnalyzer/main.tmpl b/tools/x-repo-types/typeAnalyzer/main.tmpl
index 37ec0699b..c7310ab25 100644
--- a/tools/x-repo-types/typeAnalyzer/main.tmpl
+++ b/tools/x-repo-types/typeAnalyzer/main.tmpl
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/typeAnalyzer/typeAnalyzer.go b/tools/x-repo-types/typeAnalyzer/typeAnalyzer.go
index 7aef6bde5..cde389482 100644
--- a/tools/x-repo-types/typeAnalyzer/typeAnalyzer.go
+++ b/tools/x-repo-types/typeAnalyzer/typeAnalyzer.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/typeAnalyzer/typeAnalyzer_test.go b/tools/x-repo-types/typeAnalyzer/typeAnalyzer_test.go
index 632a38b52..b09f62d7c 100644
--- a/tools/x-repo-types/typeAnalyzer/typeAnalyzer_test.go
+++ b/tools/x-repo-types/typeAnalyzer/typeAnalyzer_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/xrt.go b/tools/x-repo-types/xrt.go
index 016f50ff3..8ea8a9f15 100644
--- a/tools/x-repo-types/xrt.go
+++ b/tools/x-repo-types/xrt.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/tools/x-repo-types/xrt_test.go b/tools/x-repo-types/xrt_test.go
index 4360b432d..240e8a6ec 100644
--- a/tools/x-repo-types/xrt_test.go
+++ b/tools/x-repo-types/xrt_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/cmdUtils.go b/util/cmdUtils.go
index 1382be178..9b69cfe69 100644
--- a/util/cmdUtils.go
+++ b/util/cmdUtils.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/codecs/json.go b/util/codecs/json.go
index 8c2cebf08..5a248c9a7 100644
--- a/util/codecs/json.go
+++ b/util/codecs/json.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/codecs/json_test.go b/util/codecs/json_test.go
index 6bd4d53cd..18745c7f6 100644
--- a/util/codecs/json_test.go
+++ b/util/codecs/json_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/condvar/timedwait.go b/util/condvar/timedwait.go
index 7b275bfb3..b4d584973 100644
--- a/util/condvar/timedwait.go
+++ b/util/condvar/timedwait.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/condvar/timedwait_test.go b/util/condvar/timedwait_test.go
index fa7deef21..ba3e48c9a 100644
--- a/util/condvar/timedwait_test.go
+++ b/util/condvar/timedwait_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/dbpair.go b/util/db/dbpair.go
index 0fa382063..c5df75f5d 100644
--- a/util/db/dbpair.go
+++ b/util/db/dbpair.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/dbutil.go b/util/db/dbutil.go
index c896c5377..a6e524464 100644
--- a/util/db/dbutil.go
+++ b/util/db/dbutil.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/dbutil_test.go b/util/db/dbutil_test.go
index c35beccb2..e092a5048 100644
--- a/util/db/dbutil_test.go
+++ b/util/db/dbutil_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/fullfsync_darwin.go b/util/db/fullfsync_darwin.go
index 3261e7864..2eff12f3f 100644
--- a/util/db/fullfsync_darwin.go
+++ b/util/db/fullfsync_darwin.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/initialize.go b/util/db/initialize.go
index fc11bc1aa..f9f328b0a 100644
--- a/util/db/initialize.go
+++ b/util/db/initialize.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/initialize_test.go b/util/db/initialize_test.go
index c0c8774b1..c0588d9cb 100644
--- a/util/db/initialize_test.go
+++ b/util/db/initialize_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/interfaces.go b/util/db/interfaces.go
index 938edc103..5634b7a68 100644
--- a/util/db/interfaces.go
+++ b/util/db/interfaces.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/perf_test.go b/util/db/perf_test.go
index 5740ce2d4..c76f002fe 100644
--- a/util/db/perf_test.go
+++ b/util/db/perf_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/versioning.go b/util/db/versioning.go
index 6104fe6b9..51e28520f 100644
--- a/util/db/versioning.go
+++ b/util/db/versioning.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/db/versioning_test.go b/util/db/versioning_test.go
index 74f048e30..86634d429 100644
--- a/util/db/versioning_test.go
+++ b/util/db/versioning_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/execpool/backlog.go b/util/execpool/backlog.go
index 9e95ebe65..44728d1d9 100644
--- a/util/execpool/backlog.go
+++ b/util/execpool/backlog.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/execpool/pool.go b/util/execpool/pool.go
index d44657206..caa7353ac 100644
--- a/util/execpool/pool.go
+++ b/util/execpool/pool.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/execpool/stream.go b/util/execpool/stream.go
index 1ac61cb27..29ec4613f 100644
--- a/util/execpool/stream.go
+++ b/util/execpool/stream.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/execpool/stream_test.go b/util/execpool/stream_test.go
index a6f3b17da..8f40175fd 100644
--- a/util/execpool/stream_test.go
+++ b/util/execpool/stream_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/io.go b/util/io.go
index 1ab09b3b6..f8290aec4 100644
--- a/util/io.go
+++ b/util/io.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/io_test.go b/util/io_test.go
index 591905113..6f9f6dcfd 100644
--- a/util/io_test.go
+++ b/util/io_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/list.go b/util/list.go
index be52459f7..16e5a3816 100644
--- a/util/list.go
+++ b/util/list.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/list_test.go b/util/list_test.go
index 4b87bef74..972cc28cb 100644
--- a/util/list_test.go
+++ b/util/list_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/counter.go b/util/metrics/counter.go
index db0c6e686..59b1bb274 100644
--- a/util/metrics/counter.go
+++ b/util/metrics/counter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/counterCommon.go b/util/metrics/counterCommon.go
index dc187b3b4..2ce546867 100644
--- a/util/metrics/counterCommon.go
+++ b/util/metrics/counterCommon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/counter_test.go b/util/metrics/counter_test.go
index 343f1f5fa..1e1fa2e16 100644
--- a/util/metrics/counter_test.go
+++ b/util/metrics/counter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/gauge.go b/util/metrics/gauge.go
index 593be0e9d..6b43075ef 100644
--- a/util/metrics/gauge.go
+++ b/util/metrics/gauge.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/gauge_test.go b/util/metrics/gauge_test.go
index afa0bbd59..098d20193 100644
--- a/util/metrics/gauge_test.go
+++ b/util/metrics/gauge_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/metrics.go b/util/metrics/metrics.go
index cebece25f..eb867729c 100644
--- a/util/metrics/metrics.go
+++ b/util/metrics/metrics.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/metrics_test.go b/util/metrics/metrics_test.go
index 84cd4292f..9b38f12fb 100644
--- a/util/metrics/metrics_test.go
+++ b/util/metrics/metrics_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/registry.go b/util/metrics/registry.go
index 2f727aaab..43078bb4c 100644
--- a/util/metrics/registry.go
+++ b/util/metrics/registry.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/registryCommon.go b/util/metrics/registryCommon.go
index 848ddc836..742fae8dd 100644
--- a/util/metrics/registryCommon.go
+++ b/util/metrics/registryCommon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/registry_test.go b/util/metrics/registry_test.go
index 17328f1cb..6072b1847 100644
--- a/util/metrics/registry_test.go
+++ b/util/metrics/registry_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/reporter.go b/util/metrics/reporter.go
index 19aef0c36..20d2ea53e 100644
--- a/util/metrics/reporter.go
+++ b/util/metrics/reporter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/reporter_test.go b/util/metrics/reporter_test.go
index 4c522a9b2..34c394562 100755
--- a/util/metrics/reporter_test.go
+++ b/util/metrics/reporter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/runtime.go b/util/metrics/runtime.go
index 29d33e781..4624abb25 100644
--- a/util/metrics/runtime.go
+++ b/util/metrics/runtime.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/runtime_test.go b/util/metrics/runtime_test.go
index 32908670d..f62a471f6 100644
--- a/util/metrics/runtime_test.go
+++ b/util/metrics/runtime_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/service.go b/util/metrics/service.go
index 5b1e39527..e579fd01a 100644
--- a/util/metrics/service.go
+++ b/util/metrics/service.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/serviceCommon.go b/util/metrics/serviceCommon.go
index 947e9c440..64e7696ce 100644
--- a/util/metrics/serviceCommon.go
+++ b/util/metrics/serviceCommon.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/tagcounter.go b/util/metrics/tagcounter.go
index ff3b8a732..c2b5fcb9b 100644
--- a/util/metrics/tagcounter.go
+++ b/util/metrics/tagcounter.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/metrics/tagcounter_test.go b/util/metrics/tagcounter_test.go
index 8c5991e19..ec6ab0905 100644
--- a/util/metrics/tagcounter_test.go
+++ b/util/metrics/tagcounter_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/process.go b/util/process.go
index 6a6d17d4a..e7ce85ed9 100644
--- a/util/process.go
+++ b/util/process.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/process_common.go b/util/process_common.go
index 03af826b0..4e7490567 100644
--- a/util/process_common.go
+++ b/util/process_common.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/process_windows.go b/util/process_windows.go
index 263b997f5..14470ce50 100644
--- a/util/process_windows.go
+++ b/util/process_windows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/rateLimit.go b/util/rateLimit.go
index c62264c32..8db976347 100644
--- a/util/rateLimit.go
+++ b/util/rateLimit.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/rateLimit_test.go b/util/rateLimit_test.go
index fd7a03140..2794c9a40 100644
--- a/util/rateLimit_test.go
+++ b/util/rateLimit_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/s3/fileIterator.go b/util/s3/fileIterator.go
index b4f4ea82d..137af1741 100644
--- a/util/s3/fileIterator.go
+++ b/util/s3/fileIterator.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/s3/s3Helper.go b/util/s3/s3Helper.go
index 9fc6f0691..efad67d92 100644
--- a/util/s3/s3Helper.go
+++ b/util/s3/s3Helper.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/s3/s3Helper_test.go b/util/s3/s3Helper_test.go
index 8ba636c2a..3f7eeb5fb 100644
--- a/util/s3/s3Helper_test.go
+++ b/util/s3/s3Helper_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/set.go b/util/set.go
index a23f543dd..6851299c4 100644
--- a/util/set.go
+++ b/util/set.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/sleep.go b/util/sleep.go
index 3ad397bf0..bfd67b9d2 100644
--- a/util/sleep.go
+++ b/util/sleep.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/sleep_linux.go b/util/sleep_linux.go
index 1540fce73..a36840f18 100644
--- a/util/sleep_linux.go
+++ b/util/sleep_linux.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/sleep_linux_32.go b/util/sleep_linux_32.go
index 249134932..135ddecf7 100644
--- a/util/sleep_linux_32.go
+++ b/util/sleep_linux_32.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/sleep_linux_64.go b/util/sleep_linux_64.go
index cb6a7574c..1c56a5d81 100644
--- a/util/sleep_linux_64.go
+++ b/util/sleep_linux_64.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tar/tar.go b/util/tar/tar.go
index 2ffc78c1b..6b2640bab 100644
--- a/util/tar/tar.go
+++ b/util/tar/tar.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tar/untar.go b/util/tar/untar.go
index fcbccc755..1cad1beb5 100644
--- a/util/tar/untar.go
+++ b/util/tar/untar.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tcpinfo.go b/util/tcpinfo.go
index c387bba33..2ac429a1a 100644
--- a/util/tcpinfo.go
+++ b/util/tcpinfo.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tcpinfo_darwin.go b/util/tcpinfo_darwin.go
index ecb06ab66..50846e626 100644
--- a/util/tcpinfo_darwin.go
+++ b/util/tcpinfo_darwin.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tcpinfo_linux.go b/util/tcpinfo_linux.go
index 69fca11f9..a528a79b3 100644
--- a/util/tcpinfo_linux.go
+++ b/util/tcpinfo_linux.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tcpinfo_noop.go b/util/tcpinfo_noop.go
index 7eecba758..2e2641c3b 100644
--- a/util/tcpinfo_noop.go
+++ b/util/tcpinfo_noop.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/timers/frozen.go b/util/timers/frozen.go
index f4400c3a8..a8cf0636f 100644
--- a/util/timers/frozen.go
+++ b/util/timers/frozen.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/timers/interface.go b/util/timers/interface.go
index d217437e9..8340d3d9d 100644
--- a/util/timers/interface.go
+++ b/util/timers/interface.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/timers/monotonic.go b/util/timers/monotonic.go
index 96207f395..9cf49e6ae 100644
--- a/util/timers/monotonic.go
+++ b/util/timers/monotonic.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/timers/monotonic_test.go b/util/timers/monotonic_test.go
index 912f1b842..1b661019e 100644
--- a/util/timers/monotonic_test.go
+++ b/util/timers/monotonic_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/tokens/tokens.go b/util/tokens/tokens.go
index 1064a5863..8c7de3415 100644
--- a/util/tokens/tokens.go
+++ b/util/tokens/tokens.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/util.go b/util/util.go
index f3699188c..572dcab2c 100644
--- a/util/util.go
+++ b/util/util.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/util_windows.go b/util/util_windows.go
index b485f8e25..a2a3bc3d1 100644
--- a/util/util_windows.go
+++ b/util/util_windows.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/uuid/uuid.go b/util/uuid/uuid.go
index e159ecf46..84ce59c5c 100644
--- a/util/uuid/uuid.go
+++ b/util/uuid/uuid.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/uuid/uuid_test.go b/util/uuid/uuid_test.go
index 17914af3c..cdea4ca48 100644
--- a/util/uuid/uuid_test.go
+++ b/util/uuid/uuid_test.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify
diff --git a/util/watchdogStreamReader.go b/util/watchdogStreamReader.go
index a54ca376b..d5605571d 100644
--- a/util/watchdogStreamReader.go
+++ b/util/watchdogStreamReader.go
@@ -1,4 +1,4 @@
-// Copyright (C) 2019-2023 Algorand, Inc.
+// Copyright (C) 2019-2024 Algorand, Inc.
// This file is part of go-algorand
//
// go-algorand is free software: you can redistribute it and/or modify