From 62108c2aad1bda662d4a33ee67fab1b84f54ef56 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:22:08 -0400 Subject: [PATCH 01/13] Update .test-env to use Cucumber specs from master (#645) Update .test-env to use Cucumber specs from master rather than the now deprecated V2. --- .test-env | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.test-env b/.test-env index a321a7f1..049289d7 100644 --- a/.test-env +++ b/.test-env @@ -1,6 +1,6 @@ # Configs for testing repo download: SDK_TESTING_URL="https://github.com/algorand/algorand-sdk-testing" -SDK_TESTING_BRANCH="V2" +SDK_TESTING_BRANCH="master" SDK_TESTING_HARNESS="test-harness" INSTALL_ONLY=0 From e1d070a340b9bd46d65874c200229277ba0d0519 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Jun 2024 14:34:54 -0400 Subject: [PATCH 02/13] Bump gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.0 (#605) Bumps gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.0. --- updated-dependencies: - dependency-name: gopkg.in/yaml.v3 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 7040cd37..2d4c5171 100644 --- a/go.mod +++ b/go.mod @@ -16,5 +16,5 @@ require ( require ( github.com/davecgh/go-spew v1.1.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c // indirect + gopkg.in/yaml.v3 v3.0.0 // indirect ) diff --git a/go.sum b/go.sum index e8b1fb2b..94519fbc 100644 --- a/go.sum +++ b/go.sum @@ -44,5 +44,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= +gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 3f771457a69a5b32552f8ba1acdf067c8b3bbd8f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 12 Jun 2024 11:18:44 -0400 Subject: [PATCH 03/13] build(deps): bump golang.org/x/crypto (#646) Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.0.0-20210921155107-089bfa567519 to 0.17.0. - [Commits](https://github.com/golang/crypto/commits/v0.17.0) --- updated-dependencies: - dependency-name: golang.org/x/crypto dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 2d4c5171..5d6b86ea 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/cucumber/godog v0.8.1 github.com/google/go-querystring v1.0.0 github.com/stretchr/testify v1.7.1 - golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 + golang.org/x/crypto v0.17.0 ) require ( diff --git a/go.sum b/go.sum index 94519fbc..fc55739b 100644 --- a/go.sum +++ b/go.sum @@ -18,8 +18,9 @@ github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMT github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/crypto v0.0.0-20210921155107-089bfa567519 h1:7I4JAnoQBe7ZtJcBaYHi5UtiO8tQHbUSXxL+pnGRANg= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= +golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= From a55d63f27569304696d4e49971e3342e0b6bed21 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Jun 2024 11:45:24 -0400 Subject: [PATCH 04/13] Regenerate code from specification file (#647) Co-authored-by: Algorand Generation Bot --- client/v2/common/models/simulate_request.go | 4 ++++ client/v2/common/models/simulate_transaction_result.go | 4 ++++ client/v2/common/models/simulation_eval_overrides.go | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/client/v2/common/models/simulate_request.go b/client/v2/common/models/simulate_request.go index ad26db77..72e58f7d 100644 --- a/client/v2/common/models/simulate_request.go +++ b/client/v2/common/models/simulate_request.go @@ -19,6 +19,10 @@ type SimulateRequest struct { // transaction group. ExtraOpcodeBudget uint64 `json:"extra-opcode-budget,omitempty"` + // FixSigners if true, signers for transactions that are missing signatures will be + // fixed during evaluation. + FixSigners bool `json:"fix-signers,omitempty"` + // Round if provided, specifies the round preceding the simulation. State changes // through this round will be used to run this simulation. Usually only the 4 most // recent rounds will be available (controlled by the node config value diff --git a/client/v2/common/models/simulate_transaction_result.go b/client/v2/common/models/simulate_transaction_result.go index b5034e9f..5914ec92 100644 --- a/client/v2/common/models/simulate_transaction_result.go +++ b/client/v2/common/models/simulate_transaction_result.go @@ -10,6 +10,10 @@ type SimulateTransactionResult struct { // inner app call trace in a recursive way. ExecTrace SimulationTransactionExecTrace `json:"exec-trace,omitempty"` + // FixedSigner the account that needed to sign this transaction when no signature + // was provided and the provided signer was incorrect. + FixedSigner string `json:"fixed-signer,omitempty"` + // LogicSigBudgetConsumed budget used during execution of a logic sig transaction. LogicSigBudgetConsumed uint64 `json:"logic-sig-budget-consumed,omitempty"` diff --git a/client/v2/common/models/simulation_eval_overrides.go b/client/v2/common/models/simulation_eval_overrides.go index 3a49df7f..ed99de82 100644 --- a/client/v2/common/models/simulation_eval_overrides.go +++ b/client/v2/common/models/simulation_eval_overrides.go @@ -16,6 +16,10 @@ type SimulationEvalOverrides struct { // simulation ExtraOpcodeBudget uint64 `json:"extra-opcode-budget,omitempty"` + // FixSigners if true, signers for transactions that are missing signatures will be + // fixed during evaluation. + FixSigners bool `json:"fix-signers,omitempty"` + // MaxLogCalls the maximum log calls one can make during simulation MaxLogCalls uint64 `json:"max-log-calls,omitempty"` From a6290d2d70d7c1c2f4b1e6ee78b8212af2ff0080 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Wed, 18 Sep 2024 12:07:09 -0400 Subject: [PATCH 05/13] Build: Update ubuntu image and remove unversioned golint download. (#658) * Update ubuntu image and remove unversioned golint download. * Remove CODEOWNERS. --- .circleci/config.yml | 3 +-- CODEOWNERS | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 CODEOWNERS diff --git a/.circleci/config.yml b/.circleci/config.yml index ebdc0f6d..dfe72e90 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -15,7 +15,7 @@ workflows: jobs: test: machine: - image: "ubuntu-2204:2022.04.2" + image: "ubuntu-2404:2024.05.1" parameters: go_version: type: string @@ -25,5 +25,4 @@ jobs: version: << parameters.go_version >> - run: | go version - go get -u golang.org/x/lint/golint make docker-test diff --git a/CODEOWNERS b/CODEOWNERS deleted file mode 100644 index 3c88c6e7..00000000 --- a/CODEOWNERS +++ /dev/null @@ -1,2 +0,0 @@ -.github/ @algorand/devops -.circleci/ @algorand/devops From 6c2ca934c4422284d24118818daff0103a4030fe Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 13:03:03 -0400 Subject: [PATCH 06/13] Regenerate code from specification file (#657) Co-authored-by: Algorand Generation Bot --- client/v2/indexer/lookupAccountByID.go | 6 ++++-- client/v2/indexer/searchForAccounts.go | 16 ++++------------ 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/client/v2/indexer/lookupAccountByID.go b/client/v2/indexer/lookupAccountByID.go index b29ca23f..d4272bdc 100644 --- a/client/v2/indexer/lookupAccountByID.go +++ b/client/v2/indexer/lookupAccountByID.go @@ -21,7 +21,8 @@ type LookupAccountByIDParams struct { // localstates. IncludeAll bool `url:"include-all,omitempty"` - // Round include results for the specified round. + // Round deprecated and disallowed. This parameter used to include results for a + // specified round. Requests with this parameter set are now rejected. Round uint64 `url:"round,omitempty"` } @@ -52,7 +53,8 @@ func (s *LookupAccountByID) IncludeAll(IncludeAll bool) *LookupAccountByID { return s } -// Round include results for the specified round. +// Round deprecated and disallowed. This parameter used to include results for a +// specified round. Requests with this parameter set are now rejected. func (s *LookupAccountByID) Round(Round uint64) *LookupAccountByID { s.p.Round = Round diff --git a/client/v2/indexer/searchForAccounts.go b/client/v2/indexer/searchForAccounts.go index 5d1edf5b..3652b49a 100644 --- a/client/v2/indexer/searchForAccounts.go +++ b/client/v2/indexer/searchForAccounts.go @@ -47,12 +47,8 @@ type SearchAccountsParams struct { // results. NextToken string `url:"next,omitempty"` - // Round include results for the specified round. For performance reasons, this - // parameter may be disabled on some configurations. Using application-id or - // asset-id filters will return both creator and opt-in accounts. Filtering by - // include-all will return creator and opt-in accounts for deleted assets and - // accounts. Non-opt-in managers are not included in the results when asset-id is - // used. + // Round deprecated and disallowed. This parameter used to include results for a + // specified round. Requests with this parameter set are now rejected. Round uint64 `url:"round,omitempty"` } @@ -136,12 +132,8 @@ func (s *SearchAccounts) NextToken(NextToken string) *SearchAccounts { return s } -// Round include results for the specified round. For performance reasons, this -// parameter may be disabled on some configurations. Using application-id or -// asset-id filters will return both creator and opt-in accounts. Filtering by -// include-all will return creator and opt-in accounts for deleted assets and -// accounts. Non-opt-in managers are not included in the results when asset-id is -// used. +// Round deprecated and disallowed. This parameter used to include results for a +// specified round. Requests with this parameter set are now rejected. func (s *SearchAccounts) Round(Round uint64) *SearchAccounts { s.p.Round = Round From 49e7904db946b3c7d4b466f4376ae56be0350bab Mon Sep 17 00:00:00 2001 From: Giulio Date: Thu, 7 Nov 2024 16:51:42 +0100 Subject: [PATCH 07/13] Add EnableLogicSigSizePooling to consensus vFuture (#659) --- protocol/config/consensus.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/protocol/config/consensus.go b/protocol/config/consensus.go index 6719f10f..9d4fb452 100644 --- a/protocol/config/consensus.go +++ b/protocol/config/consensus.go @@ -97,6 +97,10 @@ type ConsensusParams struct { // group. The total available is len(group) * LogicSigMaxCost) EnableLogicSigCostPooling bool + // EnableLogicSigSizePooling specifies LogicSig sizes are pooled across a + // group. The total available is len(group) * LogicSigMaxSize + EnableLogicSigSizePooling bool + // RewardUnit specifies the number of MicroAlgos corresponding to one reward // unit. // @@ -1423,6 +1427,8 @@ func initConsensusProtocols() { vFuture.LogicSigVersion = 11 // When moving this to a release, put a new higher LogicSigVersion here + vFuture.EnableLogicSigSizePooling = true + vFuture.Payouts.Enabled = true vFuture.Payouts.Percent = 75 vFuture.Payouts.GoOnlineFee = 2_000_000 // 2 algos From 874d2110dae4a5736f126448dc6e4c3d084f1c19 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 14 Nov 2024 12:04:14 -0500 Subject: [PATCH 08/13] Golang 1.23 support (#662) --- .circleci/config.yml | 4 +- .github/workflows/codegen.yml | 2 +- .github/workflows/create-release-pr.yml | 4 +- .github/workflows/pr-type-category.yml | 2 +- .github/workflows/reviewdog.yml | 12 ++--- .golangci.yml | 11 +++-- go.mod | 23 +++++---- go.sum | 64 ++++++++++++++++++++----- test/algodclientv2_test.go | 5 +- test/applications_integration_test.go | 2 +- test/applications_unit_test.go | 2 +- test/docker/Dockerfile | 2 +- test/indexer_unit_test.go | 5 +- test/responses_unit_test.go | 2 +- test/steps_test.go | 27 ++++++----- test/transactions_test.go | 2 +- 16 files changed, 112 insertions(+), 57 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index dfe72e90..8ea3d3f3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -1,7 +1,7 @@ version: 2.1 orbs: - go: circleci/go@1.11.0 + go: circleci/go@1.12.0 workflows: circleci_build_and_test: @@ -10,7 +10,7 @@ workflows: name: 'test_go_<< matrix.go_version >>' matrix: parameters: - go_version: ['1.21.10'] + go_version: ['1.23.3'] jobs: test: diff --git a/.github/workflows/codegen.yml b/.github/workflows/codegen.yml index 197fae69..12fe4328 100644 --- a/.github/workflows/codegen.yml +++ b/.github/workflows/codegen.yml @@ -10,7 +10,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out repository - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4 - name: Generate and PR uses: algorand/generator/.github/actions/sdk-codegen/@master with: diff --git a/.github/workflows/create-release-pr.yml b/.github/workflows/create-release-pr.yml index 3705b630..4547dfcf 100644 --- a/.github/workflows/create-release-pr.yml +++ b/.github/workflows/create-release-pr.yml @@ -43,7 +43,7 @@ jobs: fi - name: Checkout - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4 with: fetch-depth: 0 @@ -159,7 +159,7 @@ jobs: - name: Send Slack Message id: slack - uses: slackapi/slack-github-action@v1.24.0 + uses: slackapi/slack-github-action@v1.27.0 env: RELEASE_TAG: ${{ steps.set-release.outputs.release-tag }} SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }} diff --git a/.github/workflows/pr-type-category.yml b/.github/workflows/pr-type-category.yml index c33fce94..ed298332 100644 --- a/.github/workflows/pr-type-category.yml +++ b/.github/workflows/pr-type-category.yml @@ -10,7 +10,7 @@ jobs: name: Check PR Category and Type steps: - name: Checking for correct number of required github pr labels - uses: mheap/github-action-required-labels@v2 + uses: mheap/github-action-required-labels@v5 with: mode: exactly count: 1 diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index a595b8bf..671d90aa 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -6,23 +6,23 @@ jobs: runs-on: ubuntu-latest steps: - name: Check out code into the Go module directory - uses: actions/checkout@v3.5.3 + uses: actions/checkout@v4 with: fetch-depth: 0 # required for new-from-rev option in .golangci.yml - name: Install specific golang - uses: actions/setup-go@v4.0.1 + uses: actions/setup-go@v5 with: - go-version: '1.21.10' + go-version: '1.23.3' - name: Check format run: test -z `go fmt ./...` - name: Vet run: go vet ./... - name: reviewdog-golangci-lint - uses: reviewdog/action-golangci-lint@v2.6.1 + uses: reviewdog/action-golangci-lint@v2.6.2 with: - golangci_lint_version: "v1.58.0" + golangci_lint_version: "v1.62.0" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" - go_version: "1.21.10" + go_version: "1.23.3" reporter: "github-pr-review" tool_name: "Lint Errors" level: "error" diff --git a/.golangci.yml b/.golangci.yml index a62927aa..3a1fdf35 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,15 +1,12 @@ run: timeout: 5m tests: false - skip-dirs: - # Don't run linter on generated files - - client/v2 linters: disable-all: true enable: - errcheck - - exportloopref + - copyloopvar - gci - gofmt - gosimple @@ -66,7 +63,11 @@ issues: - Error return value of .((os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*print(f|ln)?|os\.(Un)?Setenv). is not checked # "EXC0005 staticcheck: Developers tend to write in C-style with an explicit 'break' in a 'switch', so it's ok to ignore" - ineffective break statement. Did you mean to break out of the outer loop - + + exclude-dirs: + # Don't run linter on generated files + - client/v2 + exclude-rules: # Test utilities and helpers may have code that look unused, but is being used in another file - path: test/helpers.go diff --git a/go.mod b/go.mod index 5d6b86ea..761b6001 100644 --- a/go.mod +++ b/go.mod @@ -1,20 +1,27 @@ module github.com/algorand/go-algorand-sdk/v2 -go 1.21 +go 1.23 -toolchain go1.21.10 +toolchain go1.23.3 require ( - github.com/algorand/avm-abi v0.1.1 + github.com/algorand/avm-abi v0.2.0 github.com/algorand/go-codec/codec v1.1.10 - github.com/cucumber/godog v0.8.1 - github.com/google/go-querystring v1.0.0 - github.com/stretchr/testify v1.7.1 - golang.org/x/crypto v0.17.0 + github.com/cucumber/godog v0.14.1 + github.com/google/go-querystring v1.1.0 + github.com/stretchr/testify v1.9.0 + golang.org/x/crypto v0.29.0 ) require ( + github.com/cucumber/gherkin/go/v26 v26.2.0 // indirect + github.com/cucumber/messages/go/v21 v21.0.1 // indirect github.com/davecgh/go-spew v1.1.1 // indirect + github.com/gofrs/uuid v4.3.1+incompatible // indirect + github.com/hashicorp/go-immutable-radix v1.3.1 // indirect + github.com/hashicorp/go-memdb v1.3.4 // indirect + github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - gopkg.in/yaml.v3 v3.0.0 // indirect + github.com/spf13/pflag v1.0.5 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/go.sum b/go.sum index fc55739b..61529467 100644 --- a/go.sum +++ b/go.sum @@ -1,26 +1,64 @@ -github.com/algorand/avm-abi v0.1.1 h1:dbyQKzXiyaEbzpmqXFB30yAhyqseBsyqXTyZbNbkh2Y= -github.com/algorand/avm-abi v0.1.1/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= +github.com/algorand/avm-abi v0.2.0 h1:bkjsG+BOEcxUcnGSALLosmltE0JZdg+ZisXKx0UDX2k= +github.com/algorand/avm-abi v0.2.0/go.mod h1:+CgwM46dithy850bpTeHh9MC99zpn2Snirb3QTl2O/g= github.com/algorand/go-codec/codec v1.1.10 h1:zmWYU1cp64jQVTOG8Tw8wa+k0VfwgXIPbnDfiVa+5QA= github.com/algorand/go-codec/codec v1.1.10/go.mod h1:YkEx5nmr/zuCeaDYOIhlDg92Lxju8tj2d2NrYqP7g7k= github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e h1:CHPYEbz71w8DqJ7DRIq+MXyCQsdibK08vdcQTY4ufas= github.com/chrismcguire/gobberish v0.0.0-20150821175641-1d8adb509a0e/go.mod h1:6Xhs0ZlsRjXLIiSMLKafbZxML/j30pg9Z1priLuha5s= -github.com/cucumber/godog v0.8.1 h1:lVb+X41I4YDreE+ibZ50bdXmySxgRviYFgKY6Aw4XE8= -github.com/cucumber/godog v0.8.1/go.mod h1:vSh3r/lM+psC1BPXvdkSEuNjmXfpVqrMGYAElF6hxnA= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cucumber/gherkin/go/v26 v26.2.0 h1:EgIjePLWiPeslwIWmNQ3XHcypPsWAHoMCz/YEBKP4GI= +github.com/cucumber/gherkin/go/v26 v26.2.0/go.mod h1:t2GAPnB8maCT4lkHL99BDCVNzCh1d7dBhCLt150Nr/0= +github.com/cucumber/godog v0.14.1 h1:HGZhcOyyfaKclHjJ+r/q93iaTJZLKYW6Tv3HkmUE6+M= +github.com/cucumber/godog v0.14.1/go.mod h1:FX3rzIDybWABU4kuIXLZ/qtqEe1Ac5RdXmqvACJOces= +github.com/cucumber/messages/go/v21 v21.0.1 h1:wzA0LxwjlWQYZd32VTlAVDTkW6inOFmSM+RuOwHZiMI= +github.com/cucumber/messages/go/v21 v21.0.1/go.mod h1:zheH/2HS9JLVFukdrsPWoPdmUtmYQAQPLk7w5vWsk5s= +github.com/cucumber/messages/go/v22 v22.0.0/go.mod h1:aZipXTKc0JnjCsXrJnuZpWhtay93k7Rn3Dee7iyPJjs= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/google/go-querystring v1.0.0 h1:Xkwi/a1rcvNg1PPYe5vI8GbeBY/jrVuDX5ASuANWTrk= -github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= +github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.3.1+incompatible h1:0/KbAdpx3UXAx1kEOWHJeOkpbgRFGHVgv+CFIY7dBJI= +github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/google/go-cmp v0.5.2 h1:X2ev0eStA3AbceY54o37/0PQ/UWqKEiiO2dKL5OPaFM= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= +github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= +github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= +github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-memdb v1.3.4 h1:XSL3NR682X/cVk2IeV0d70N4DZ9ljI885xAEU8IoK3c= +github.com/hashicorp/go-memdb v1.3.4/go.mod h1:uBTr1oQbtuMgd1SSGoR8YV27eT3sBHbYiNm53bMpgSg= +github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.2 h1:cfejS+Tpcp13yd5nYHWDI6qVCny6wyX2Mt5SGur2IGE= +github.com/hashicorp/go-uuid v1.0.2/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc= +github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.29.0 h1:L5SG1JTTXupVV3n6sUqMTeWbjAyfPwoda2DLX8J8FrQ= +golang.org/x/crypto v0.29.0/go.mod h1:+F4F4N5hv6v38hfeYwTdx20oUvLLc+QfrE9Ax9HtgRg= golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= @@ -42,9 +80,11 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.0 h1:hjy8E9ON/egN1tAYqKb61G10WtihqetD4sz2H+8nIeA= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/test/algodclientv2_test.go b/test/algodclientv2_test.go index 21b26eab..e49bc5e9 100644 --- a/test/algodclientv2_test.go +++ b/test/algodclientv2_test.go @@ -13,7 +13,7 @@ import ( "github.com/cucumber/godog" ) -func AlgodClientV2Context(s *godog.Suite) { +func AlgodClientV2Context(s *godog.ScenarioContext) { s.Step(`^mock http responses in "([^"]*)" loaded from "([^"]*)"$`, mockHttpResponsesInLoadedFrom) s.Step(`^expect error string to contain "([^"]*)"$`, expectErrorStringToContain) s.Step(`^we make any Pending Transaction Information call$`, weMakeAnyPendingTransactionInformationCall) @@ -66,8 +66,9 @@ func AlgodClientV2Context(s *godog.Suite) { s.Step(`^we make a TransactionGroupLedgerStateDeltaForRoundResponse call for round (\d+)$`, weMakeATransactionGroupLedgerStateDeltaForRoundResponseCallForRound) s.Step(`^we make a GetBlockTxids call against block number (\d+)$`, weMakeAGetBlockTxidsCallAgainstBlockNumber) - s.BeforeScenario(func(interface{}) { + s.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { globalErrForExamination = nil + return ctx, nil }) } diff --git a/test/applications_integration_test.go b/test/applications_integration_test.go index 9003f4a4..710830b5 100644 --- a/test/applications_integration_test.go +++ b/test/applications_integration_test.go @@ -969,7 +969,7 @@ func indexerSaysCurrentAppShouldHaveTheseBoxes(max int, next string, encodedBoxe } // @applications.verified and @applications.boxes -func ApplicationsContext(s *godog.Suite) { +func ApplicationsContext(s *godog.ScenarioContext) { s.Step(`^an algod v(\d+) client connected to "([^"]*)" port (\d+) with token "([^"]*)"$`, anAlgodVClientConnectedToPortWithToken) s.Step(`^I create a new transient account and fund it with (\d+) microalgos\.$`, iCreateANewTransientAccountAndFundItWithMicroalgos) s.Step(`^I build an application transaction with the transient account, the current application, suggested params, operation "([^"]*)", approval-program "([^"]*)", clear-program "([^"]*)", global-bytes (\d+), global-ints (\d+), local-bytes (\d+), local-ints (\d+), app-args "([^"]*)", foreign-apps "([^"]*)", foreign-assets "([^"]*)", app-accounts "([^"]*)", extra-pages (\d+), boxes "([^"]*)"$`, iBuildAnApplicationTransaction) diff --git a/test/applications_unit_test.go b/test/applications_unit_test.go index 6fd19d8c..5a56eff8 100644 --- a/test/applications_unit_test.go +++ b/test/applications_unit_test.go @@ -71,7 +71,7 @@ func weMakeALookupApplicationsCall(applicationID int) error { return nil } -func ApplicationsUnitContext(s *godog.Suite) { +func ApplicationsUnitContext(s *godog.ScenarioContext) { // @unit.transactions s.Step(`^fee field is in txn$`, feeFieldIsInTxn) s.Step(`^fee field not in txn$`, feeFieldNotInTxn) diff --git a/test/docker/Dockerfile b/test/docker/Dockerfile index 322707f0..0052bed4 100644 --- a/test/docker/Dockerfile +++ b/test/docker/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.21.10 +ARG GO_IMAGE=golang:1.23.3 FROM $GO_IMAGE # Copy SDK code into the container diff --git a/test/indexer_unit_test.go b/test/indexer_unit_test.go index 4e9f915e..ca678bae 100644 --- a/test/indexer_unit_test.go +++ b/test/indexer_unit_test.go @@ -10,7 +10,7 @@ import ( "github.com/cucumber/godog" ) -func IndexerUnitTestContext(s *godog.Suite) { +func IndexerUnitTestContext(s *godog.ScenarioContext) { s.Step(`^we make any LookupAssetBalances call$`, weMakeAnyLookupAssetBalancesCall) s.Step(`^the parsed LookupAssetBalances response should be valid on round (\d+), and contain an array of len (\d+) and element number (\d+) should have address "([^"]*)" amount (\d+) and frozen state "([^"]*)"$`, theParsedResponseShouldEqualTheMockResponse) s.Step(`^we make any LookupAssetTransactions call$`, weMakeAnyLookupAssetTransactionsCall) @@ -56,8 +56,9 @@ func IndexerUnitTestContext(s *godog.Suite) { s.Step(`^we make a Lookup Block call against round (\d+) and header "([^"]*)"$`, weMakeALookupBlockCallAgainstRoundAndHeader) s.Step(`^we make a LookupApplicationBoxByIDandName call with applicationID (\d+) with encoded box name "([^"]*)"$`, weMakeALookupApplicationBoxByIDandName) s.Step(`^we make a SearchForApplicationBoxes call with applicationID (\d+) with max (\d+) nextToken "([^"]*)"$`, weMakeASearchForApplicationBoxes) - s.BeforeScenario(func(interface{}) { + s.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { globalErrForExamination = nil + return ctx, nil }) } diff --git a/test/responses_unit_test.go b/test/responses_unit_test.go index ad299696..bd13b558 100644 --- a/test/responses_unit_test.go +++ b/test/responses_unit_test.go @@ -235,7 +235,7 @@ func theParsedResponseShouldEqualTheMockResponse() error { return VerifyResponse(baselinePath, responseJson) } -func ResponsesContext(s *godog.Suite) { +func ResponsesContext(s *godog.ScenarioContext) { s.Step(`^mock http responses in "([^"]*)" loaded from "([^"]*)" with status (\d+)\.$`, mockHttpResponsesInLoadedFromWithStatus) s.Step(`^we make any "([^"]*)" call to "([^"]*)"\.$`, weMakeAnyCallTo) s.Step(`^the parsed response should equal the mock response\.$`, theParsedResponseShouldEqualTheMockResponse) diff --git a/test/steps_test.go b/test/steps_test.go index bd5dbd80..484eff8f 100644 --- a/test/steps_test.go +++ b/test/steps_test.go @@ -206,15 +206,19 @@ func TestMain(m *testing.M) { flag.Parse() opt.Paths = flag.Args() - status := godog.RunWithOptions("godogs", func(s *godog.Suite) { - FeatureContext(s) - AlgodClientV2Context(s) - IndexerUnitTestContext(s) - TransactionsUnitContext(s) - ApplicationsContext(s) - ApplicationsUnitContext(s) - ResponsesContext(s) - }, opt) + status := godog.TestSuite{ + Name: "godogs", + ScenarioInitializer: func(s *godog.ScenarioContext) { + FeatureContext(s) + AlgodClientV2Context(s) + IndexerUnitTestContext(s) + TransactionsUnitContext(s) + ApplicationsContext(s) + ApplicationsUnitContext(s) + ResponsesContext(s) + }, + Options: &opt, + }.Run() if st := m.Run(); st > status { status = st @@ -222,7 +226,7 @@ func TestMain(m *testing.M) { os.Exit(status) } -func FeatureContext(s *godog.Suite) { +func FeatureContext(s *godog.ScenarioContext) { s.Step("I create a wallet", createWallet) s.Step("the wallet should exist", walletExist) s.Step("I get the wallet handle", getHandle) @@ -387,10 +391,11 @@ func FeatureContext(s *godog.Suite) { s.Step(`^I prepare the transaction without signatures for simulation$`, iPrepareTheTransactionWithoutSignaturesForSimulation) s.Step(`^the simulation should report a failure at group "([^"]*)", path "([^"]*)" with message "([^"]*)"$`, theSimulationShouldReportAFailureAtGroupPathWithMessage) - s.BeforeScenario(func(interface{}) { + s.Before(func(ctx context.Context, sc *godog.Scenario) (context.Context, error) { stxObj = types.SignedTxn{} abiMethods = nil kcl.RenewWalletHandle(handle) + return ctx, nil }) } diff --git a/test/transactions_test.go b/test/transactions_test.go index 8d8925ce..adcc2a7a 100644 --- a/test/transactions_test.go +++ b/test/transactions_test.go @@ -183,7 +183,7 @@ func buildLegacyAppCallTransaction( } -func TransactionsUnitContext(s *godog.Suite) { +func TransactionsUnitContext(s *godog.ScenarioContext) { // @unit.transactions s.Step(`^a signing account with address "([^"]*)" and mnemonic "([^"]*)"$`, aSigningAccountWithAddressAndMnemonic) s.Step(`^sign the transaction$`, signTheTransaction) From c204a61367165527d0c45e191db89fe0b4aa0ad5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 18 Dec 2024 12:26:24 -0500 Subject: [PATCH 09/13] Regenerate code from specification file (#670) Co-authored-by: Algorand Generation Bot --- client/v2/algod/algod.go | 4 +++ client/v2/algod/getBlockHeader.go | 32 +++++++++++++++++++ .../v2/common/models/block_header_response.go | 9 ++++++ 3 files changed, 45 insertions(+) create mode 100644 client/v2/algod/getBlockHeader.go create mode 100644 client/v2/common/models/block_header_response.go diff --git a/client/v2/algod/algod.go b/client/v2/algod/algod.go index cea84f2a..975b5098 100644 --- a/client/v2/algod/algod.go +++ b/client/v2/algod/algod.go @@ -106,6 +106,10 @@ func (c *Client) GetBlockHash(round uint64) *GetBlockHash { return &GetBlockHash{c: c, round: round} } +func (c *Client) GetBlockHeader(round uint64) *GetBlockHeader { + return &GetBlockHeader{c: c, round: round} +} + func (c *Client) GetTransactionProof(round uint64, txid string) *GetTransactionProof { return &GetTransactionProof{c: c, round: round, txid: txid} } diff --git a/client/v2/algod/getBlockHeader.go b/client/v2/algod/getBlockHeader.go new file mode 100644 index 00000000..d3c67e03 --- /dev/null +++ b/client/v2/algod/getBlockHeader.go @@ -0,0 +1,32 @@ +package algod + +import ( + "context" + "fmt" + + "github.com/algorand/go-algorand-sdk/v2/client/v2/common" + "github.com/algorand/go-algorand-sdk/v2/client/v2/common/models" +) + +// GetBlockHeaderParams contains all of the query parameters for url serialization. +type GetBlockHeaderParams struct { + + // Format configures whether the response object is JSON or MessagePack encoded. If + // not provided, defaults to JSON. + Format string `url:"format,omitempty"` +} + +// GetBlockHeader get the block header for the block on the given round. +type GetBlockHeader struct { + c *Client + + round uint64 + + p GetBlockHeaderParams +} + +// Do performs the HTTP request +func (s *GetBlockHeader) Do(ctx context.Context, headers ...*common.Header) (response models.BlockHeaderResponse, err error) { + err = s.c.get(ctx, &response, fmt.Sprintf("/v2/blocks/%s/header", common.EscapeParams(s.round)...), s.p, headers) + return +} diff --git a/client/v2/common/models/block_header_response.go b/client/v2/common/models/block_header_response.go new file mode 100644 index 00000000..ccccf3c1 --- /dev/null +++ b/client/v2/common/models/block_header_response.go @@ -0,0 +1,9 @@ +package models + +import "github.com/algorand/go-algorand-sdk/v2/types" + +// BlockHeaderResponse block header. +type BlockHeaderResponse struct { + // Blockheader block header data. + Blockheader types.Block `json:"blockHeader"` +} From 22ec6f5ce4e3957658a856a1706a73614836ead2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 19:17:36 -0500 Subject: [PATCH 10/13] Regenerate code from specification file (#671) Co-authored-by: Algorand Generation Bot --- client/v2/algod/accountInformation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/v2/algod/accountInformation.go b/client/v2/algod/accountInformation.go index 4096cded..5d321c5e 100644 --- a/client/v2/algod/accountInformation.go +++ b/client/v2/algod/accountInformation.go @@ -22,7 +22,7 @@ type AccountInformationParams struct { } // AccountInformation given a specific account public key, this call returns the -// accounts status, balance and spendable amounts +// account's status, balance and spendable amounts type AccountInformation struct { c *Client From 72370807aa70eb38e71f144e1545cbe863b6f9bc Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 19 Dec 2024 23:38:54 -0500 Subject: [PATCH 11/13] Incentives: Updates for new heartbeat transaction type and latest consensus v40 (#661) * Updates for new heartbeat transaction type support. * Sync heartbeat fields with go-algorand, make TxnHeartbeatFields explicit pointer type on Transaction. * Sync consensus version settings with go-algorand. --- protocol/config/consensus.go | 65 ++++++++++++++++++++++++------------ protocol/consensus.go | 7 +++- types/basics.go | 8 ++--- types/heartbeat.go | 27 +++++++++++++++ types/signature.go | 30 +++++++++++++++++ types/transaction.go | 5 +++ 6 files changed, 114 insertions(+), 28 deletions(-) create mode 100644 types/heartbeat.go diff --git a/protocol/config/consensus.go b/protocol/config/consensus.go index 9d4fb452..b7787457 100644 --- a/protocol/config/consensus.go +++ b/protocol/config/consensus.go @@ -94,7 +94,7 @@ type ConsensusParams struct { EnableAppCostPooling bool // EnableLogicSigCostPooling specifies LogicSig budgets are pooled across a - // group. The total available is len(group) * LogicSigMaxCost) + // group. The total available is len(group) * LogicSigMaxCost EnableLogicSigCostPooling bool // EnableLogicSigSizePooling specifies LogicSig sizes are pooled across a @@ -213,7 +213,7 @@ type ConsensusParams struct { // 0 for no support, otherwise highest version supported LogicSigVersion uint64 - // len(LogicSig.Logic) + len(LogicSig.Args[*]) must be less than this + // len(LogicSig.Logic) + len(LogicSig.Args[*]) must be less than this (unless pooling is enabled) LogicSigMaxSize uint64 // sum of estimated op cost must be less than this @@ -495,6 +495,10 @@ type ConsensusParams struct { // Version 7 includes state proof verification contexts EnableCatchpointsWithSPContexts bool + // EnableCatchpointsWithOnlineAccounts specifies when to enable version 8 catchpoints. + // Version 8 includes onlineaccounts and onlineroundparams amounts, for historical stake lookups. + EnableCatchpointsWithOnlineAccounts bool + // AppForbidLowResources enforces a rule that prevents apps from accessing // asas and apps below 256, in an effort to decrease the ambiguity of // opcodes that accept IDs or slot indexes. Simultaneously, the first ID @@ -525,6 +529,9 @@ type ConsensusParams struct { // occur, extra funds need to be put into the FeeSink. The bonus amount // decays exponentially. Bonus BonusPlan + + // Heartbeat support + Heartbeat bool } // ProposerPayoutRules puts several related consensus parameters in one place. The same @@ -584,7 +591,7 @@ type ProposerPayoutRules struct { // // BaseAmount: 0, DecayInterval: XXX // -// by using a zero baseAmount, the amount not affected. +// by using a zero baseAmount, the amount is not affected. // For a bigger change, we'd use a plan like: // // BaseRound: , BaseAmount: , DecayInterval: @@ -750,7 +757,7 @@ func checkSetAllocBounds(p ConsensusParams) { checkSetMax(p.MaxAppProgramLen, &MaxStateDeltaKeys) checkSetMax(p.MaxAppProgramLen, &MaxEvalDeltaAccounts) checkSetMax(p.MaxAppProgramLen, &MaxAppProgramLen) - checkSetMax(int(p.LogicSigMaxSize), &MaxLogicSigMaxSize) + checkSetMax((int(p.LogicSigMaxSize) * p.MaxTxGroupSize), &MaxLogicSigMaxSize) checkSetMax(p.MaxTxnNoteBytes, &MaxTxnNoteBytes) checkSetMax(p.MaxTxGroupSize, &MaxTxGroupSize) // MaxBytesKeyValueLen is max of MaxAppKeyLen and MaxAppBytesValueLen @@ -1420,28 +1427,44 @@ func initConsensusProtocols() { // but our current max is 150000 so using that : v38.ApprovedUpgrades[protocol.ConsensusV39] = 150000 - // ConsensusFuture is used to test features that are implemented - // but not yet released in a production protocol version. - vFuture := v39 - vFuture.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + v40 := v39 + v40.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} - vFuture.LogicSigVersion = 11 // When moving this to a release, put a new higher LogicSigVersion here + v40.LogicSigVersion = 11 - vFuture.EnableLogicSigSizePooling = true + v40.EnableLogicSigSizePooling = true - vFuture.Payouts.Enabled = true - vFuture.Payouts.Percent = 75 - vFuture.Payouts.GoOnlineFee = 2_000_000 // 2 algos - vFuture.Payouts.MinBalance = 30_000_000_000 // 30,000 algos - vFuture.Payouts.MaxBalance = 70_000_000_000_000 // 70M algos - vFuture.Payouts.MaxMarkAbsent = 32 - vFuture.Payouts.ChallengeInterval = 1000 - vFuture.Payouts.ChallengeGracePeriod = 200 - vFuture.Payouts.ChallengeBits = 5 + v40.Payouts.Enabled = true + v40.Payouts.Percent = 50 + v40.Payouts.GoOnlineFee = 2_000_000 // 2 algos + v40.Payouts.MinBalance = 30_000_000_000 // 30,000 algos + v40.Payouts.MaxBalance = 70_000_000_000_000 // 70M algos + v40.Payouts.MaxMarkAbsent = 32 + v40.Payouts.ChallengeInterval = 1000 + v40.Payouts.ChallengeGracePeriod = 200 + v40.Payouts.ChallengeBits = 5 - vFuture.Bonus.BaseAmount = 10_000_000 // 10 Algos + v40.Bonus.BaseAmount = 10_000_000 // 10 Algos // 2.9 sec rounds gives about 10.8M rounds per year. - vFuture.Bonus.DecayInterval = 250_000 // .99^(10.8/0.25) ~ .648. So 35% decay per year + v40.Bonus.DecayInterval = 1_000_000 // .99^(10.8M/1M) ~ .897. So ~10% decay per year + + v40.Heartbeat = true + + v40.EnableCatchpointsWithOnlineAccounts = true + + Consensus[protocol.ConsensusV40] = v40 + + // v39 can be upgraded to v40, with an update delay of 7d: + // 208000 = (7 * 24 * 60 * 60 / 2.9 ballpark round times) + // our current max is 250000 + v39.ApprovedUpgrades[protocol.ConsensusV40] = 208000 + + // ConsensusFuture is used to test features that are implemented + // but not yet released in a production protocol version. + vFuture := v40 + vFuture.ApprovedUpgrades = map[protocol.ConsensusVersion]uint64{} + + vFuture.LogicSigVersion = 12 // When moving this to a release, put a new higher LogicSigVersion here Consensus[protocol.ConsensusFuture] = vFuture diff --git a/protocol/consensus.go b/protocol/consensus.go index aad06796..6bfe21f1 100644 --- a/protocol/consensus.go +++ b/protocol/consensus.go @@ -201,6 +201,11 @@ const ConsensusV39 = ConsensusVersion( "https://github.com/algorandfoundation/specs/tree/925a46433742afb0b51bb939354bd907fa88bf95", ) +// ConsensusV40 enables consensus incentives and TEAL v11 featuring the mimc opcode +const ConsensusV40 = ConsensusVersion( + "https://github.com/algorandfoundation/specs/tree/236dcc18c9c507d794813ab768e467ea42d1b4d9", +) + // ConsensusFuture is a protocol that should not appear in any production // network, but is used to test features before they are released. const ConsensusFuture = ConsensusVersion( @@ -230,7 +235,7 @@ const ConsensusVAlpha5 = ConsensusVersion("alpha5") // ConsensusCurrentVersion is the latest version and should be used // when a specific version is not provided. -const ConsensusCurrentVersion = ConsensusV39 +const ConsensusCurrentVersion = ConsensusV40 // Error is used to indicate that an unsupported protocol has been detected. type Error ConsensusVersion diff --git a/types/basics.go b/types/basics.go index 2ac21430..0ac42023 100644 --- a/types/basics.go +++ b/types/basics.go @@ -30,6 +30,8 @@ const ( ApplicationCallTx TxType = "appl" // StateProofTx records a state proof StateProofTx TxType = "stpf" + // HeartbeatTx demonstrates the account is alive + HeartbeatTx TxType = "hb" ) const masterDerivationKeyLenBytes = 32 @@ -37,12 +39,6 @@ const masterDerivationKeyLenBytes = 32 // MaxTxGroupSize is max number of transactions in a single group const MaxTxGroupSize = 16 -// LogicSigMaxSize is a max TEAL program size (with args) -const LogicSigMaxSize = 1000 - -// LogicSigMaxCost is a max execution const of a TEAL program -const LogicSigMaxCost = 20000 - // KeyStoreRootSize is the size, in bytes, of keyreg verifier const KeyStoreRootSize = 64 diff --git a/types/heartbeat.go b/types/heartbeat.go new file mode 100644 index 00000000..82ef6d94 --- /dev/null +++ b/types/heartbeat.go @@ -0,0 +1,27 @@ +package types + +// HeartbeatTxnFields captures the fields used for an account to prove it is +// online (really, it proves that an entity with the account's part keys is able +// to submit transactions, so it should be able to propose/vote.) +type HeartbeatTxnFields struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + // HeartbeatAddress is the account this txn is proving onlineness for. + HbAddress Address `codec:"a"` + + // HbProof is a signature using HeartbeatAddress's partkey, thereby showing it is online. + HbProof HeartbeatProof `codec:"prf"` + + // The final three fields are included to allow early, concurrent check of + // the HbProof. + + // HbSeed must be the block seed for this transaction's firstValid + // block. It is the message that must be signed with HbAddress's part key. + HbSeed Seed `codec:"sd"` + + // HbVoteID must match the HbAddress account's current VoteID. + HbVoteID OneTimeSignatureVerifier `codec:"vid"` + + // HbKeyDilution must match HbAddress account's current KeyDilution. + HbKeyDilution uint64 `codec:"kd"` +} diff --git a/types/signature.go b/types/signature.go index 6af9f9a9..bfa64570 100644 --- a/types/signature.go +++ b/types/signature.go @@ -79,3 +79,33 @@ func (lsig LogicSig) Blank() bool { } return true } + +/* Classical signatures */ +type ed25519Signature [64]byte +type ed25519PublicKey [32]byte + +// A HeartbeatProof is functionally equivalent to a OneTimeSignature (see below), but it has +// been cleaned up for use as a transaction field in heartbeat transactions. +// +// A OneTimeSignature is a cryptographic signature that is produced a limited +// number of times and provides forward integrity. +// +// Specifically, a OneTimeSignature is generated from an ephemeral secret. After +// some number of messages is signed under a given OneTimeSignatureIdentifier +// identifier, the corresponding secret is deleted. This prevents the +// secret-holder from signing a contradictory message in the future in the event +// of a secret-key compromise. +type HeartbeatProof struct { + _struct struct{} `codec:",omitempty,omitemptyarray"` + + // Sig is a signature of msg under the key PK. + Sig ed25519Signature `codec:"s"` + PK ed25519PublicKey `codec:"p"` + + // PK2 is used to verify a two-level ephemeral signature. + PK2 ed25519PublicKey `codec:"p2"` + // PK1Sig is a signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) under the key PK2. + PK1Sig ed25519Signature `codec:"p1s"` + // PK2Sig is a signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the master key (OneTimeSignatureVerifier). + PK2Sig ed25519Signature `codec:"p2s"` +} diff --git a/types/transaction.go b/types/transaction.go index 68a9dbd9..189eb467 100644 --- a/types/transaction.go +++ b/types/transaction.go @@ -18,6 +18,11 @@ type Transaction struct { AssetFreezeTxnFields ApplicationFields StateProofTxnFields + + // By making HeartbeatTxnFields a pointer we save a ton of space of the + // Transaction object. Unlike other txn types, the fields will be + // embedded under a named field in the transaction encoding. + *HeartbeatTxnFields `codec:"hb"` } // SignedTxn wraps a transaction and a signature. The encoding of this struct From 6e3162c3bfd92cbd8758a4c7f186458c2775ebcc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 19:47:19 -0500 Subject: [PATCH 12/13] Regenerate code from specification file (#674) Co-authored-by: Algorand Generation Bot --- .../common/models/block_headers_response.go | 14 ++ client/v2/common/models/hb_proof_fields.go | 22 +++ client/v2/common/models/transaction.go | 6 + .../v2/common/models/transaction_heartbeat.go | 24 +++ client/v2/indexer/indexer.go | 4 + client/v2/indexer/searchForBlockHeaders.go | 147 ++++++++++++++++++ 6 files changed, 217 insertions(+) create mode 100644 client/v2/common/models/block_headers_response.go create mode 100644 client/v2/common/models/hb_proof_fields.go create mode 100644 client/v2/common/models/transaction_heartbeat.go create mode 100644 client/v2/indexer/searchForBlockHeaders.go diff --git a/client/v2/common/models/block_headers_response.go b/client/v2/common/models/block_headers_response.go new file mode 100644 index 00000000..cf95936d --- /dev/null +++ b/client/v2/common/models/block_headers_response.go @@ -0,0 +1,14 @@ +package models + +// BlockHeadersResponse +type BlockHeadersResponse struct { + // Blocks + Blocks []Block `json:"blocks"` + + // CurrentRound round at which the results were computed. + CurrentRound uint64 `json:"current-round"` + + // NextToken used for pagination, when making another request provide this token + // with the next parameter. + NextToken string `json:"next-token,omitempty"` +} diff --git a/client/v2/common/models/hb_proof_fields.go b/client/v2/common/models/hb_proof_fields.go new file mode 100644 index 00000000..ead2a91d --- /dev/null +++ b/client/v2/common/models/hb_proof_fields.go @@ -0,0 +1,22 @@ +package models + +// HbProofFields (hbprf) HbProof is a signature using HeartbeatAddress's partkey, +// thereby showing it is online. +type HbProofFields struct { + // HbPk (p) Public key of the heartbeat message. + HbPk []byte `json:"hb-pk,omitempty"` + + // HbPk1sig (p1s) Signature of OneTimeSignatureSubkeyOffsetID(PK, Batch, Offset) + // under the key PK2. + HbPk1sig []byte `json:"hb-pk1sig,omitempty"` + + // HbPk2 (p2) Key for new-style two-level ephemeral signature. + HbPk2 []byte `json:"hb-pk2,omitempty"` + + // HbPk2sig (p2s) Signature of OneTimeSignatureSubkeyBatchID(PK2, Batch) under the + // master key (OneTimeSignatureVerifier). + HbPk2sig []byte `json:"hb-pk2sig,omitempty"` + + // HbSig (s) Signature of the heartbeat message. + HbSig []byte `json:"hb-sig,omitempty"` +} diff --git a/client/v2/common/models/transaction.go b/client/v2/common/models/transaction.go index 99adadb4..a4faaf07 100644 --- a/client/v2/common/models/transaction.go +++ b/client/v2/common/models/transaction.go @@ -73,6 +73,11 @@ type Transaction struct { // the sha512/256 hash of the transactions in that group. Group []byte `json:"group,omitempty"` + // HeartbeatTransaction fields for a heartbeat transaction. + // Definition: + // data/transactions/heartbeat.go : HeartbeatTxnFields + HeartbeatTransaction TransactionHeartbeat `json:"heartbeat-transaction,omitempty"` + // Id transaction ID Id string `json:"id,omitempty"` @@ -148,5 +153,6 @@ type Transaction struct { // * (afrz) asset-freeze-transaction // * (appl) application-transaction // * (stpf) state-proof-transaction + // * (hb) heartbeat-transaction Type string `json:"tx-type,omitempty"` } diff --git a/client/v2/common/models/transaction_heartbeat.go b/client/v2/common/models/transaction_heartbeat.go new file mode 100644 index 00000000..abb9cd0a --- /dev/null +++ b/client/v2/common/models/transaction_heartbeat.go @@ -0,0 +1,24 @@ +package models + +// TransactionHeartbeat fields for a heartbeat transaction. +// Definition: +// data/transactions/heartbeat.go : HeartbeatTxnFields +type TransactionHeartbeat struct { + // HbAddress (hbad) HbAddress is the account this txn is proving onlineness for. + HbAddress string `json:"hb-address"` + + // HbKeyDilution (hbkd) HbKeyDilution must match HbAddress account's current + // KeyDilution. + HbKeyDilution uint64 `json:"hb-key-dilution"` + + // HbProof (hbprf) HbProof is a signature using HeartbeatAddress's partkey, thereby + // showing it is online. + HbProof HbProofFields `json:"hb-proof"` + + // HbSeed (hbsd) HbSeed must be the block seed for the this transaction's + // firstValid block. + HbSeed []byte `json:"hb-seed"` + + // HbVoteId (hbvid) HbVoteID must match the HbAddress account's current VoteID. + HbVoteId []byte `json:"hb-vote-id"` +} diff --git a/client/v2/indexer/indexer.go b/client/v2/indexer/indexer.go index d492a4a6..9e5df320 100644 --- a/client/v2/indexer/indexer.go +++ b/client/v2/indexer/indexer.go @@ -129,6 +129,10 @@ func (c *Client) LookupAssetTransactions(assetId uint64) *LookupAssetTransaction return &LookupAssetTransactions{c: c, assetId: assetId} } +func (c *Client) SearchForBlockHeaders() *SearchForBlockHeaders { + return &SearchForBlockHeaders{c: c} +} + func (c *Client) LookupBlock(roundNumber uint64) *LookupBlock { return &LookupBlock{c: c, roundNumber: roundNumber} } diff --git a/client/v2/indexer/searchForBlockHeaders.go b/client/v2/indexer/searchForBlockHeaders.go new file mode 100644 index 00000000..c2b6f140 --- /dev/null +++ b/client/v2/indexer/searchForBlockHeaders.go @@ -0,0 +1,147 @@ +package indexer + +import ( + "context" + "time" + + "github.com/algorand/go-algorand-sdk/v2/client/v2/common" + "github.com/algorand/go-algorand-sdk/v2/client/v2/common/models" +) + +// SearchForBlockHeadersParams contains all of the query parameters for url serialization. +type SearchForBlockHeadersParams struct { + + // Absent accounts marked as absent in the block header's participation updates. + // This parameter accepts a comma separated list of addresses. + Absent []string `url:"absent,omitempty,comma"` + + // AfterTime include results after the given time. Must be an RFC 3339 formatted + // string. + AfterTime string `url:"after-time,omitempty"` + + // BeforeTime include results before the given time. Must be an RFC 3339 formatted + // string. + BeforeTime string `url:"before-time,omitempty"` + + // Expired accounts marked as expired in the block header's participation updates. + // This parameter accepts a comma separated list of addresses. + Expired []string `url:"expired,omitempty,comma"` + + // Limit maximum number of results to return. There could be additional pages even + // if the limit is not reached. + Limit uint64 `url:"limit,omitempty"` + + // MaxRound include results at or before the specified max-round. + MaxRound uint64 `url:"max-round,omitempty"` + + // MinRound include results at or after the specified min-round. + MinRound uint64 `url:"min-round,omitempty"` + + // Next the next page of results. Use the next token provided by the previous + // results. + Next string `url:"next,omitempty"` + + // Proposers accounts marked as proposer in the block header's participation + // updates. This parameter accepts a comma separated list of addresses. + Proposers []string `url:"proposers,omitempty,comma"` +} + +// SearchForBlockHeaders search for block headers. Block headers are returned in +// ascending round order. Transactions are not included in the output. +type SearchForBlockHeaders struct { + c *Client + + p SearchForBlockHeadersParams +} + +// Absent accounts marked as absent in the block header's participation updates. +// This parameter accepts a comma separated list of addresses. +func (s *SearchForBlockHeaders) Absent(Absent []string) *SearchForBlockHeaders { + s.p.Absent = Absent + + return s +} + +// AfterTimeString include results after the given time. Must be an RFC 3339 +// formatted string. +func (s *SearchForBlockHeaders) AfterTimeString(AfterTime string) *SearchForBlockHeaders { + s.p.AfterTime = AfterTime + + return s +} + +// AfterTime include results after the given time. Must be an RFC 3339 formatted +// string. +func (s *SearchForBlockHeaders) AfterTime(AfterTime time.Time) *SearchForBlockHeaders { + AfterTimeStr := AfterTime.Format(time.RFC3339) + + return s.AfterTimeString(AfterTimeStr) +} + +// BeforeTimeString include results before the given time. Must be an RFC 3339 +// formatted string. +func (s *SearchForBlockHeaders) BeforeTimeString(BeforeTime string) *SearchForBlockHeaders { + s.p.BeforeTime = BeforeTime + + return s +} + +// BeforeTime include results before the given time. Must be an RFC 3339 formatted +// string. +func (s *SearchForBlockHeaders) BeforeTime(BeforeTime time.Time) *SearchForBlockHeaders { + BeforeTimeStr := BeforeTime.Format(time.RFC3339) + + return s.BeforeTimeString(BeforeTimeStr) +} + +// Expired accounts marked as expired in the block header's participation updates. +// This parameter accepts a comma separated list of addresses. +func (s *SearchForBlockHeaders) Expired(Expired []string) *SearchForBlockHeaders { + s.p.Expired = Expired + + return s +} + +// Limit maximum number of results to return. There could be additional pages even +// if the limit is not reached. +func (s *SearchForBlockHeaders) Limit(Limit uint64) *SearchForBlockHeaders { + s.p.Limit = Limit + + return s +} + +// MaxRound include results at or before the specified max-round. +func (s *SearchForBlockHeaders) MaxRound(MaxRound uint64) *SearchForBlockHeaders { + s.p.MaxRound = MaxRound + + return s +} + +// MinRound include results at or after the specified min-round. +func (s *SearchForBlockHeaders) MinRound(MinRound uint64) *SearchForBlockHeaders { + s.p.MinRound = MinRound + + return s +} + +// Next the next page of results. Use the next token provided by the previous +// results. +func (s *SearchForBlockHeaders) Next(Next string) *SearchForBlockHeaders { + s.p.Next = Next + + return s +} + +// Proposers accounts marked as proposer in the block header's participation +// updates. This parameter accepts a comma separated list of addresses. +func (s *SearchForBlockHeaders) Proposers(Proposers []string) *SearchForBlockHeaders { + s.p.Proposers = Proposers + + return s +} + +// Do performs the HTTP request +func (s *SearchForBlockHeaders) Do(ctx context.Context, headers ...*common.Header) (response models.BlockHeadersResponse, err error) { + err = s.c.get(ctx, &response, "/v2/block-headers", s.p, headers) + return +} From a601e497d8f6b8ea64b27ebd233944432efd6695 Mon Sep 17 00:00:00 2001 From: gmalouf Date: Fri, 20 Dec 2024 20:13:05 +0000 Subject: [PATCH 13/13] bump up version to v2.7.0 --- CHANGELOG.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2fce8c20..22743a0a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,28 @@ +# v2.7.0 + + + +## What's Changed +### New Features +* Build: Bump golang version to 1.23.3 by @gmalouf in https://github.com/algorand/go-algorand-sdk/pull/662 +### Enhancements +* Dependencies: Bump gopkg.in/yaml.v3 from 3.0.0-20200313102051-9f266ea9e77c to 3.0.0 by @dependabot in https://github.com/algorand/go-algorand-sdk/pull/605 +* Dependencies: build(deps): bump golang.org/x/crypto from 0.0.0-20210921155107-089bfa567519 to 0.17.0 by @dependabot in https://github.com/algorand/go-algorand-sdk/pull/646 +* Simulate: Support `FixSigners` option by @github-actions in https://github.com/algorand/go-algorand-sdk/pull/647 +* Build: Update ubuntu image and remove unversioned golint download. by @gmalouf in https://github.com/algorand/go-algorand-sdk/pull/658 +* API: Regenerate code with the latest specification file (619d56d8) by @github-actions in https://github.com/algorand/go-algorand-sdk/pull/657 +* protocol: Add EnableLogicSigSizePooling consensus variable by @giuliop in https://github.com/algorand/go-algorand-sdk/pull/659 +* Incentives: Updates for new heartbeat transaction type and latest consensus v40 by @gmalouf in https://github.com/algorand/go-algorand-sdk/pull/661 +### Other +* Regenerate code with the latest specification file (548ee6a8) by @github-actions in https://github.com/algorand/go-algorand-sdk/pull/670 +* Regenerate code with the latest specification file (38cee6a8) by @github-actions in https://github.com/algorand/go-algorand-sdk/pull/671 + +## New Contributors +* @dependabot made their first contribution in https://github.com/algorand/go-algorand-sdk/pull/605 +* @giuliop made their first contribution in https://github.com/algorand/go-algorand-sdk/pull/659 + +**Full Changelog**: https://github.com/algorand/go-algorand-sdk/compare/v2.6.0...v2.7.0 + # v2.6.0