From 8835d0fd76235575eb50e6654ff24e191ecfadf0 Mon Sep 17 00:00:00 2001 From: Gary <982483+gmalouf@users.noreply.github.com> Date: Thu, 7 Mar 2024 14:30:55 -0500 Subject: [PATCH 01/26] Bump golang version to 1.20.14. (#1597) --- .circleci/config.yml | 4 ++-- .github/workflows/reviewdog.yml | 4 ++-- e2e_tests/docker/indexer/Dockerfile | 2 +- monitoring/Dockerfile-indexer | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 1d7d9df7d..b336cd1ce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,7 +18,7 @@ workflows: name: test_with_go_<< matrix.go_version >> matrix: &go-version-matrix parameters: - go_version: ["1.20.5"] + go_version: ["1.20.14"] circleci_build_and_test_nightly: triggers: @@ -33,7 +33,7 @@ workflows: context: lamprey-secrets matrix: &go-version-matrix parameters: - go_version: ["1.20.5"] + go_version: ["1.20.14"] - indexer_vs_algod_nightly: name: nightly_test_indexer_vs_algod context: lamprey-secrets diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index e2ca4df35..ed9b2ae76 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -15,7 +15,7 @@ jobs: - name: Install specific golang uses: actions/setup-go@v4.0.1 with: - go-version: '1.20.5' + go-version: '1.20.14' - name: reviewdog-golangci-lint uses: reviewdog/action-golangci-lint@v2.3.1 with: @@ -38,7 +38,7 @@ jobs: - name: Install specific golang uses: actions/setup-go@v4.0.1 with: - go-version: '1.20.5' + go-version: '1.20.14' - name: Add bin to PATH run: | echo "$GITHUB_WORKSPACE/bin" >> $GITHUB_PATH diff --git a/e2e_tests/docker/indexer/Dockerfile b/e2e_tests/docker/indexer/Dockerfile index 20c36e441..9179c899e 100644 --- a/e2e_tests/docker/indexer/Dockerfile +++ b/e2e_tests/docker/indexer/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.20.5 +ARG GO_IMAGE=golang:1.20.14 FROM $GO_IMAGE ARG CHANNEL=stable diff --git a/monitoring/Dockerfile-indexer b/monitoring/Dockerfile-indexer index 99c18954c..80d0ab15d 100644 --- a/monitoring/Dockerfile-indexer +++ b/monitoring/Dockerfile-indexer @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.20.5 +ARG GO_VERSION=1.20.14 FROM golang:$GO_VERSION ENV DEBIAN_FRONTEND noninteractive From 4a8a6ebb7a98e0a8c942caaaa09dd5a3bbae4a80 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:48:27 -0400 Subject: [PATCH 02/26] build(deps): bump gitpython from 3.1.26 to 3.1.41 in /misc (#1594) Bumps [gitpython](https://github.com/gitpython-developers/GitPython) from 3.1.26 to 3.1.41. - [Release notes](https://github.com/gitpython-developers/GitPython/releases) - [Changelog](https://github.com/gitpython-developers/GitPython/blob/main/CHANGES) - [Commits](https://github.com/gitpython-developers/GitPython/compare/3.1.26...3.1.41) --- updated-dependencies: - dependency-name: gitpython dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- misc/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements.txt b/misc/requirements.txt index 17a85e7a1..2081d4e9a 100644 --- a/misc/requirements.txt +++ b/misc/requirements.txt @@ -3,6 +3,6 @@ markdown2 >=2.3.9,<3 msgpack >=1,<2 py-algorand-sdk >=1.3.0,<2 pytest==6.2.5 -GitPython==3.1.26 +GitPython==3.1.41 PyYAML==6.0 requests==2.28.2 \ No newline at end of file From 93c5ea347986d88e73c12a79dbd548819b9fae11 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 14:59:25 -0400 Subject: [PATCH 03/26] build(deps): bump github.com/docker/docker (#1601) Bumps [github.com/docker/docker](https://github.com/docker/docker) from 24.0.7+incompatible to 24.0.9+incompatible. - [Release notes](https://github.com/docker/docker/releases) - [Commits](https://github.com/docker/docker/compare/v24.0.7...v24.0.9) --- updated-dependencies: - dependency-name: github.com/docker/docker 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 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 78abd7e92..fb396b20d 100644 --- a/go.mod +++ b/go.mod @@ -35,7 +35,7 @@ require ( github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect github.com/docker/distribution v2.8.0+incompatible // indirect - github.com/docker/docker v24.0.7+incompatible // indirect + github.com/docker/docker v24.0.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect github.com/fsnotify/fsnotify v1.5.1 // indirect diff --git a/go.sum b/go.sum index 6d72371b5..5915140f9 100644 --- a/go.sum +++ b/go.sum @@ -148,8 +148,8 @@ github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker v24.0.7+incompatible h1:Wo6l37AuwP3JaMnZa226lzVXGA3F9Ig1seQen0cKYlM= -github.com/docker/docker v24.0.7+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= +github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= github.com/docker/go-connections v0.4.0/go.mod h1:Gbd7IOopHjR8Iph03tsViu4nIes5XhDvyHbTtUxmeec= github.com/docker/go-units v0.4.0 h1:3uh0PgVws3nIA0Q+MwDC8yjEPf9zjRfZZWXZYDct3Tw= From 8c60a578b3eca792ca868ad8595c8c9a2595585d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:02:39 -0400 Subject: [PATCH 04/26] build(deps): bump google.golang.org/protobuf from 1.28.1 to 1.33.0 (#1599) Bumps google.golang.org/protobuf from 1.28.1 to 1.33.0. --- updated-dependencies: - dependency-name: google.golang.org/protobuf 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 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fb396b20d..bd080a620 100644 --- a/go.mod +++ b/go.mod @@ -91,7 +91,7 @@ require ( golang.org/x/sys v0.15.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect - google.golang.org/protobuf v1.28.1 // indirect + google.golang.org/protobuf v1.33.0 // indirect gopkg.in/ini.v1 v1.66.2 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect ) diff --git a/go.sum b/go.sum index 5915140f9..97ebd364b 100644 --- a/go.sum +++ b/go.sum @@ -1192,8 +1192,8 @@ google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlba google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= -google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= -google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= From 4e90200b5f75c7558db40856e3024d1569fda969 Mon Sep 17 00:00:00 2001 From: chris erway Date: Thu, 21 Mar 2024 15:21:20 -0400 Subject: [PATCH 05/26] update for algorand/go-algorand#5757 and algorand/go-algorand-sdk#617 --- idb/postgres/internal/encoding/encoding.go | 28 +++++++++++++++------- idb/postgres/internal/encoding/types.go | 26 ++++++++++---------- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/idb/postgres/internal/encoding/encoding.go b/idb/postgres/internal/encoding/encoding.go index 2e89066d7..e4715f81a 100644 --- a/idb/postgres/internal/encoding/encoding.go +++ b/idb/postgres/internal/encoding/encoding.go @@ -94,13 +94,17 @@ func unconvertExpiredAccounts(accounts []AlgodEncodedAddress) []sdk.Address { func convertBlockHeader(header sdk.BlockHeader) blockHeader { return blockHeader{ BlockHeader: header, + ProposerOverride: AlgodEncodedAddress(header.Proposer), ExpiredParticipationAccountsOverride: convertExpiredAccounts(header.ExpiredParticipationAccounts), + AbsentParticipationAccountsOverride: convertExpiredAccounts(header.AbsentParticipationAccounts), } } func unconvertBlockHeader(header blockHeader) sdk.BlockHeader { res := header.BlockHeader + res.Proposer = sdk.Address(header.ProposerOverride) res.ExpiredParticipationAccounts = unconvertExpiredAccounts(header.ExpiredParticipationAccountsOverride) + res.AbsentParticipationAccounts = unconvertExpiredAccounts(header.AbsentParticipationAccountsOverride) return res } @@ -359,6 +363,7 @@ func unconvertTrimmedAccountData(ad trimmedAccountData) sdk.AccountData { RewardsBase: ad.RewardsBase, RewardedMicroAlgos: sdk.MicroAlgos(ad.RewardedMicroAlgos), AuthAddr: ad.AuthAddr, + IncentiveEligible: ad.IncentiveEligible, TotalAppSchema: ad.TotalAppSchema, TotalExtraAppPages: ad.TotalExtraAppPages, TotalAppParams: ad.TotalAppParams, @@ -367,6 +372,8 @@ func unconvertTrimmedAccountData(ad trimmedAccountData) sdk.AccountData { TotalAssets: ad.TotalAssets, TotalBoxes: ad.TotalBoxes, TotalBoxBytes: ad.TotalBoxBytes, + LastProposed: ad.LastProposed, + LastHeartbeat: ad.LastHeartbeat, }, VotingData: sdk.VotingData{ VoteID: ad.VoteID, @@ -648,6 +655,7 @@ func convertTrimmedLcAccountData(ad sdk.AccountData) baseAccountData { return baseAccountData{ Status: ad.Status, AuthAddr: ad.AuthAddr, + IncentiveEligible: ad.IncentiveEligible, TotalAppSchema: ad.TotalAppSchema, TotalExtraAppPages: ad.TotalExtraAppPages, TotalAssetParams: ad.TotalAssetParams, @@ -656,14 +664,15 @@ func convertTrimmedLcAccountData(ad sdk.AccountData) baseAccountData { TotalAppLocalStates: ad.TotalAppLocalStates, TotalBoxes: ad.TotalBoxes, TotalBoxBytes: ad.TotalBoxBytes, - baseOnlineAccountData: baseOnlineAccountData{ - VoteID: ad.VoteID, - SelectionID: ad.SelectionID, - StateProofID: ad.StateProofID, - VoteFirstValid: ad.VoteFirstValid, - VoteLastValid: ad.VoteLastValid, - VoteKeyDilution: ad.VoteKeyDilution, - }, + LastProposed: ad.LastProposed, + LastHeartbeat: ad.LastHeartbeat, + + VoteID: ad.VoteID, + SelectionID: ad.SelectionID, + StateProofID: ad.StateProofID, + VoteFirstValid: ad.VoteFirstValid, + VoteLastValid: ad.VoteLastValid, + VoteKeyDilution: ad.VoteKeyDilution, } } @@ -672,6 +681,7 @@ func unconvertTrimmedLcAccountData(ba baseAccountData) sdk.AccountData { AccountBaseData: sdk.AccountBaseData{ Status: ba.Status, AuthAddr: ba.AuthAddr, + IncentiveEligible: ba.IncentiveEligible, TotalAppSchema: ba.TotalAppSchema, TotalExtraAppPages: ba.TotalExtraAppPages, TotalAppParams: ba.TotalAppParams, @@ -680,6 +690,8 @@ func unconvertTrimmedLcAccountData(ba baseAccountData) sdk.AccountData { TotalAssets: ba.TotalAssets, TotalBoxes: ba.TotalBoxes, TotalBoxBytes: ba.TotalBoxBytes, + LastProposed: ba.LastProposed, + LastHeartbeat: ba.LastHeartbeat, }, VotingData: sdk.VotingData{ VoteID: ba.VoteID, diff --git a/idb/postgres/internal/encoding/types.go b/idb/postgres/internal/encoding/types.go index 00b403b5c..de7f86868 100644 --- a/idb/postgres/internal/encoding/types.go +++ b/idb/postgres/internal/encoding/types.go @@ -9,7 +9,11 @@ type AlgodEncodedAddress sdk.Address type blockHeader struct { sdk.BlockHeader + // these "override" fields are used to encode these arrays of addresses as + // human-readable strings, instead of base64. + ProposerOverride AlgodEncodedAddress `codec:"prp"` ExpiredParticipationAccountsOverride []AlgodEncodedAddress `codec:"partupdrmv"` + AbsentParticipationAccountsOverride []AlgodEncodedAddress `codec:"partupdabs"` } type assetParams struct { @@ -87,22 +91,12 @@ type appParams struct { GlobalStateOverride tealKeyValue `codec:"gs"` } -type baseOnlineAccountData struct { - _struct struct{} `codec:",omitempty,omitemptyarray"` - - VoteID sdk.OneTimeSignatureVerifier `codec:"vote"` - SelectionID sdk.VRFVerifier `codec:"sel"` - StateProofID sdk.Commitment `codec:"stprf"` - VoteFirstValid sdk.Round `codec:"voteFst"` - VoteLastValid sdk.Round `codec:"voteLst"` - VoteKeyDilution uint64 `codec:"voteKD"` -} - type baseAccountData struct { _struct struct{} `codec:",omitempty,omitemptyarray"` Status sdk.Status `codec:"onl"` AuthAddr sdk.Address `codec:"spend"` + IncentiveEligible bool `codec:"ie"` TotalAppSchema sdk.StateSchema `codec:"tsch"` TotalExtraAppPages uint32 `codec:"teap"` TotalAssetParams uint64 `codec:"tasp"` @@ -112,5 +106,13 @@ type baseAccountData struct { TotalBoxes uint64 `codec:"tbx"` TotalBoxBytes uint64 `codec:"tbxb"` - baseOnlineAccountData + LastProposed sdk.Round `codec:"lpr"` + LastHeartbeat sdk.Round `codec:"lhb"` + + VoteID sdk.OneTimeSignatureVerifier `codec:"vote"` + SelectionID sdk.VRFVerifier `codec:"sel"` + StateProofID sdk.Commitment `codec:"stprf"` + VoteFirstValid sdk.Round `codec:"voteFst"` + VoteLastValid sdk.Round `codec:"voteLst"` + VoteKeyDilution uint64 `codec:"voteKD"` } From 1c239d37e58123c223fb5cf0859aad6883204fc1 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 21 Mar 2024 15:30:09 -0400 Subject: [PATCH 06/26] build(deps): bump github.com/jackc/pgx/v4 from 4.13.0 to 4.18.2 (#1598) Bumps [github.com/jackc/pgx/v4](https://github.com/jackc/pgx) from 4.13.0 to 4.18.2. - [Changelog](https://github.com/jackc/pgx/blob/v4.18.2/CHANGELOG.md) - [Commits](https://github.com/jackc/pgx/compare/v4.13.0...v4.18.2) --- updated-dependencies: - dependency-name: github.com/jackc/pgx/v4 dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- go.mod | 18 +++++++++--------- go.sum | 33 ++++++++++++++++++--------------- 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/go.mod b/go.mod index bd080a620..747bae7aa 100644 --- a/go.mod +++ b/go.mod @@ -9,9 +9,9 @@ require ( github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 github.com/getkin/kin-openapi v0.107.0 - github.com/jackc/pgconn v1.10.0 + github.com/jackc/pgconn v1.14.3 github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451 - github.com/jackc/pgx/v4 v4.13.0 + github.com/jackc/pgx/v4 v4.18.2 github.com/jarcoal/httpmock v1.2.0 github.com/labstack/echo-contrib v0.11.0 github.com/labstack/echo/v4 v4.9.1 @@ -51,10 +51,10 @@ require ( github.com/jackc/chunkreader/v2 v2.0.1 // indirect github.com/jackc/pgio v1.0.0 // indirect github.com/jackc/pgpassfile v1.0.0 // indirect - github.com/jackc/pgproto3/v2 v2.1.1 // indirect - github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b // indirect - github.com/jackc/pgtype v1.8.1 // indirect - github.com/jackc/puddle v1.1.3 // indirect + github.com/jackc/pgproto3/v2 v2.3.3 // indirect + github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a // indirect + github.com/jackc/pgtype v1.14.0 // indirect + github.com/jackc/puddle v1.3.0 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/kr/pretty v0.3.0 // indirect github.com/labstack/gommon v0.4.0 // indirect @@ -85,10 +85,10 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.7.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.17.0 // indirect - golang.org/x/net v0.10.0 // indirect + golang.org/x/crypto v0.20.0 // indirect + golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.15.0 // indirect + golang.org/x/sys v0.17.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/go.sum b/go.sum index 97ebd364b..e2847d6ce 100644 --- a/go.sum +++ b/go.sum @@ -363,8 +363,8 @@ github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsU github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.10.0 h1:4EYhlDVEMsJ30nNj0mmgwIUXoq7e9sMJrVC2ED6QlCU= -github.com/jackc/pgconn v1.10.0/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= +github.com/jackc/pgconn v1.14.3 h1:bVoTr12EGANZz66nZPkMInAV/KHD2TxH9npjXXgiB3w= +github.com/jackc/pgconn v1.14.3/go.mod h1:RZbme4uasqzybK2RK5c65VsHxoyaml09lx3tXOcO/VM= github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451 h1:WAvSpGf7MsFuzAtK4Vk7R4EVe+liW4x83r4oWu0WHKw= github.com/jackc/pgerrcode v0.0.0-20201024163028-a0d42d470451/go.mod h1:a/s9Lp5W7n/DD0VrVoyJ00FbP2ytTPDVOivvn2bMlds= github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= @@ -381,26 +381,29 @@ github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1 h1:7PQ/4gLoqnl87ZxL7xjO0DR5gYuviDCZxQJsUlFW1eI= github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= +github.com/jackc/pgproto3/v2 v2.3.3 h1:1HLSx5H+tXR9pW3in3zaztoEwQYRC9SQaYUHjTSUOag= +github.com/jackc/pgproto3/v2 v2.3.3/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a h1:bbPeKD0xmW/Y25WS6cokEszi5g+S0QxI/d45PkRi7Nk= +github.com/jackc/pgservicefile v0.0.0-20221227161230-091c0ba34f0a/go.mod h1:5TJZWKEWniPve33vlWYSoGYefn3gLQRzjfDlhSJ9ZKM= github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.8.1 h1:9k0IXtdJXHJbyAWQgbWr1lU+MEhPXZz6RIXxfR5oxXs= -github.com/jackc/pgtype v1.8.1/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= +github.com/jackc/pgtype v1.14.0 h1:y+xUdabmyMkJLyApYuPj38mW+aAIqCe5uuBB51rH3Vw= +github.com/jackc/pgtype v1.14.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.13.0 h1:JCjhT5vmhMAf/YwBHLvrBn4OGdIQBiFG6ym8Zmdx570= -github.com/jackc/pgx/v4 v4.13.0/go.mod h1:9P4X524sErlaxj0XSGZk7s+LD0eOyu1ZDUrrpznYDF0= +github.com/jackc/pgx/v4 v4.18.2 h1:xVpYkNR5pk5bMCZGfClbO962UIqVABcAGt7ha1s/FeU= +github.com/jackc/pgx/v4 v4.18.2/go.mod h1:Ey4Oru5tH5sB6tV7hDmfWFahwF15Eb7DNXlRKx2CkVw= github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3 h1:JnPg/5Q9xVJGfjsO5CPUOjnJps1JaRUm8I9FXVCFK94= github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= +github.com/jackc/puddle v1.3.0 h1:eHK/5clGOatcjX3oWGBO/MpxpbHzSwud5EWTSCI+MX0= +github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jarcoal/httpmock v1.2.0 h1:gSvTxxFR/MEMfsGrvRbdfpRUMBStovlSRLw0Ep1bwwc= github.com/jarcoal/httpmock v1.2.0/go.mod h1:oCoTsnAz4+UoOUIf5lJOWV2QQIW5UoeUI6aM2YnWAZk= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= @@ -742,8 +745,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k= -golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= +golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= +golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -832,8 +835,8 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.10.0 h1:X2//UzNDwYmtCLn7To6G58Wr6f5ahEAQgKNzv9Y951M= -golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= @@ -944,8 +947,8 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= +golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= From 09bdb698ff1f1a8ad4095c6a5f6530ba1dd83714 Mon Sep 17 00:00:00 2001 From: Gary <982483+gmalouf@users.noreply.github.com> Date: Thu, 21 Mar 2024 16:28:59 -0400 Subject: [PATCH 07/26] Dependency bumps. (#1603) --- e2e_tests/pyproject.toml | 2 +- go.mod | 7 ++++--- go.sum | 14 ++++++++------ misc/requirements.txt | 2 +- 4 files changed, 14 insertions(+), 11 deletions(-) diff --git a/e2e_tests/pyproject.toml b/e2e_tests/pyproject.toml index 3d6317065..6c82482a8 100644 --- a/e2e_tests/pyproject.toml +++ b/e2e_tests/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "py-algorand-sdk==1.17.0", "pytest==6.2.5", "PyYAML==6.0", - "setuptools ==65.3.0", + "setuptools ==65.5.1", ] diff --git a/go.mod b/go.mod index 747bae7aa..73a74334a 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,8 @@ require ( github.com/beorn7/perks v1.0.1 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.1 // indirect - github.com/docker/distribution v2.8.0+incompatible // indirect + github.com/distribution/reference v0.5.0 // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect github.com/docker/docker v24.0.9+incompatible // indirect github.com/docker/go-connections v0.4.0 // indirect github.com/docker/go-units v0.4.0 // indirect @@ -85,10 +86,10 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/multierr v1.7.0 // indirect go.uber.org/zap v1.24.0 // indirect - golang.org/x/crypto v0.20.0 // indirect + golang.org/x/crypto v0.21.0 // indirect golang.org/x/net v0.21.0 // indirect golang.org/x/sync v0.1.0 // indirect - golang.org/x/sys v0.17.0 // indirect + golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect golang.org/x/time v0.0.0-20220411224347-583f2d630306 // indirect google.golang.org/protobuf v1.33.0 // indirect diff --git a/go.sum b/go.sum index e2847d6ce..ee03d8ade 100644 --- a/go.sum +++ b/go.sum @@ -146,8 +146,10 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSs 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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= -github.com/docker/distribution v2.8.0+incompatible h1:l9EaZDICImO1ngI+uTifW+ZYvvz7fKISBAKpg+MbWbY= -github.com/docker/distribution v2.8.0+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= +github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v24.0.9+incompatible h1:HPGzNmwfLZWdxHqK9/II92pyi1EpYKsAqcl4G0Of9v0= github.com/docker/docker v24.0.9+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/go-connections v0.4.0 h1:El9xVISelRB7BuFusrZozjnkIM5YnzCViNKohAFqRJQ= @@ -745,8 +747,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.20.0 h1:jmAMJJZXr5KiCw05dfYK9QnqaqKLYXijU23lsEdcQqg= -golang.org/x/crypto v0.20.0/go.mod h1:Xwo95rrVNIoSMx9wa1JroENMToLWn3RNVrTBpLHgZPQ= +golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA= +golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -947,8 +949,8 @@ golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211103235746-7861aae1554b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.17.0 h1:25cE3gD+tdBA7lp7QfhuV+rJiE9YXTcS3VG1SqssI/Y= -golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4= +golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= diff --git a/misc/requirements.txt b/misc/requirements.txt index 2081d4e9a..e631e80b1 100644 --- a/misc/requirements.txt +++ b/misc/requirements.txt @@ -5,4 +5,4 @@ py-algorand-sdk >=1.3.0,<2 pytest==6.2.5 GitPython==3.1.41 PyYAML==6.0 -requests==2.28.2 \ No newline at end of file +requests==2.31.0 \ No newline at end of file From 2de794e601043588e94e180fe1846e81fccf18b2 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Wed, 24 Apr 2024 13:03:20 -0400 Subject: [PATCH 08/26] Return new fields in REST omitEmpty the new account fields --- Makefile | 10 - api/generated/common/routes.go | 361 ++++++++++++++------------- api/generated/common/types.go | 106 +++++--- api/generated/v2/routes.go | 443 +++++++++++++++++---------------- api/generated/v2/types.go | 106 +++++--- api/handlers.go | 18 +- api/indexer.oas2.json | 130 ++++++---- api/indexer.oas3.yml | 119 ++++++--- go.mod | 2 +- go.sum | 4 +- idb/postgres/postgres.go | 47 ++-- 11 files changed, 735 insertions(+), 611 deletions(-) diff --git a/Makefile b/Makefile index 8abbcc396..6a46da177 100644 --- a/Makefile +++ b/Makefile @@ -1,14 +1,4 @@ -SRCPATH := $(shell pwd) -OS_TYPE ?= $(shell $(SRCPATH)/mule/scripts/ostype.sh) -ARCH ?= $(shell $(SRCPATH)/mule/scripts/archtype.sh) -ifeq ($(OS_TYPE), darwin) -ifeq ($(ARCH), arm64) -export CPATH=/opt/homebrew/include -export LIBRARY_PATH=/opt/homebrew/lib -endif -endif export GOPATH := $(shell go env GOPATH) -GOPATH1 := $(firstword $(subst :, ,$(GOPATH))) GOLDFLAGS += -X github.com/algorand/indexer/v3/version.Hash=$(shell git log -n 1 --pretty="%H") GOLDFLAGS += -X github.com/algorand/indexer/v3/version.CompileTime=$(shell date -u +%Y-%m-%dT%H:%M:%S%z) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index e52e02a5b..5c1233eca 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,185 +72,188 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "75avVqCzHoP5/wEAAP//Z01abaXfAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index ff5b7169a..8877540cf 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -74,40 +74,40 @@ type Account struct { // Address the account public key Address string `json:"address"` - // Amount \[algo\] total number of MicroAlgos in the account + // Amount total number of MicroAlgos in the account Amount uint64 `json:"amount"` // AmountWithoutPendingRewards specifies the amount of MicroAlgos in the account, without the pending rewards. AmountWithoutPendingRewards uint64 `json:"amount-without-pending-rewards"` - // AppsLocalState \[appl\] applications local data stored in this account. + // AppsLocalState application local data stored in this account. // // Note the raw object uses `map[int] -> AppLocalState` for this type. AppsLocalState *[]ApplicationLocalState `json:"apps-local-state,omitempty"` - // AppsTotalExtraPages \[teap\] the sum of all extra application program pages for this account. + // AppsTotalExtraPages the sum of all extra application program pages for this account. AppsTotalExtraPages *uint64 `json:"apps-total-extra-pages,omitempty"` // AppsTotalSchema Specifies maximums on the number of each type that may be stored. AppsTotalSchema *ApplicationStateSchema `json:"apps-total-schema,omitempty"` - // Assets \[asset\] assets held by this account. + // Assets assets held by this account. // // Note the raw object uses `map[int] -> AssetHolding` for this type. Assets *[]AssetHolding `json:"assets,omitempty"` - // AuthAddr \[spend\] the address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field. + // AuthAddr The address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field. AuthAddr *string `json:"auth-addr,omitempty"` // ClosedAtRound Round during which this account was most recently closed. ClosedAtRound *uint64 `json:"closed-at-round,omitempty"` - // CreatedApps \[appp\] parameters of applications created by this account including app global data. + // CreatedApps parameters of applications created by this account including app global data. // // Note: the raw account uses `map[int] -> AppParams` for this type. CreatedApps *[]Application `json:"created-apps,omitempty"` - // CreatedAssets \[apar\] parameters of assets created by this account. + // CreatedAssets parameters of assets created by this account. // // Note: the raw account uses `map[int] -> Asset` for this type. CreatedAssets *[]Asset `json:"created-assets,omitempty"` @@ -118,29 +118,38 @@ type Account struct { // Deleted Whether or not this account is currently closed. Deleted *bool `json:"deleted,omitempty"` + // IncentiveEligible can the account receive block incentives if its balance is in range at proposal time. + IncentiveEligible *bool `json:"incentive-eligible,omitempty"` + + // LastHeartbeat The round in which this account last went online, or explicitly renewed their online status. + LastHeartbeat *uint64 `json:"last-heartbeat,omitempty"` + + // LastProposed The round in which this account last proposed the block. + LastProposed *uint64 `json:"last-proposed,omitempty"` + // Participation AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` // PendingRewards amount of MicroAlgos of pending rewards in this account. PendingRewards uint64 `json:"pending-rewards"` - // RewardBase \[ebase\] used as part of the rewards computation. Only applicable to accounts which are participating. + // RewardBase used as part of the rewards computation. Only applicable to accounts which are participating. RewardBase *uint64 `json:"reward-base,omitempty"` - // Rewards \[ern\] total rewards of MicroAlgos the account has received, including pending rewards. + // Rewards total rewards of MicroAlgos the account has received, including pending rewards. Rewards uint64 `json:"rewards"` // Round The round for which this information is relevant. Round uint64 `json:"round"` - // SigType Indicates what type of signature is used by this account, must be one of: + // SigType the type of signature used by this account, must be one of: // * sig // * msig // * lsig // * or null if unknown SigType *AccountSigType `json:"sig-type,omitempty"` - // Status \[onl\] delegation status of the account's MicroAlgos + // Status voting status of the account's MicroAlgos // * Offline - indicates that the associated account is delegated. // * Online - indicates that the associated account used as part of the delegation pool. // * NotParticipating - indicates that the associated account is neither a delegator nor a delegate. @@ -165,7 +174,7 @@ type Account struct { TotalCreatedAssets uint64 `json:"total-created-assets"` } -// AccountSigType Indicates what type of signature is used by this account, must be one of: +// AccountSigType the type of signature used by this account, must be one of: // * sig // * msig // * lsig @@ -174,22 +183,22 @@ type AccountSigType string // AccountParticipation AccountParticipation describes the parameters used by this account in consensus protocol. type AccountParticipation struct { - // SelectionParticipationKey \[sel\] Selection public key (if any) currently registered for this round. + // SelectionParticipationKey Selection public key (if any) currently registered for this round. SelectionParticipationKey []byte `json:"selection-participation-key"` - // StateProofKey \[stprf\] Root of the state proof key (if any) + // StateProofKey Root of the state proof key (if any) StateProofKey *[]byte `json:"state-proof-key,omitempty"` - // VoteFirstValid \[voteFst\] First round for which this participation is valid. + // VoteFirstValid First round for which this participation is valid. VoteFirstValid uint64 `json:"vote-first-valid"` - // VoteKeyDilution \[voteKD\] Number of subkeys in each batch of participation keys. + // VoteKeyDilution Number of subkeys in each batch of participation keys. VoteKeyDilution uint64 `json:"vote-key-dilution"` - // VoteLastValid \[voteLst\] Last round for which this participation is valid. + // VoteLastValid Last round for which this participation is valid. VoteLastValid uint64 `json:"vote-last-valid"` - // VoteParticipationKey \[vote\] root participation public key (if any) currently registered for this round. + // VoteParticipationKey root participation public key (if any) currently registered for this round. VoteParticipationKey []byte `json:"vote-participation-key"` } @@ -212,7 +221,7 @@ type Application struct { // DeletedAtRound Round when this application was deleted. DeletedAtRound *uint64 `json:"deleted-at-round,omitempty"` - // Id \[appidx\] application index. + // Id application index. Id uint64 `json:"id"` // Params Stores the global information associated with an application. @@ -242,7 +251,7 @@ type ApplicationLocalState struct { // ApplicationLogData Stores the global information associated with an application. type ApplicationLogData struct { - // Logs \[lg\] Logs for the application being executed by the transaction. + // Logs Logs for the application being executed by the transaction. Logs [][]byte `json:"logs"` // Txid Transaction ID @@ -251,16 +260,16 @@ type ApplicationLogData struct { // ApplicationParams Stores the global information associated with an application. type ApplicationParams struct { - // ApprovalProgram \[approv\] approval program. + // ApprovalProgram approval program. ApprovalProgram []byte `json:"approval-program"` - // ClearStateProgram \[clearp\] approval program. + // ClearStateProgram clear state program. ClearStateProgram []byte `json:"clear-state-program"` // Creator The address that created this application. This is the address where the parameters and global state for this application can be found. Creator *string `json:"creator,omitempty"` - // ExtraProgramPages \[epp\] the amount of extra program pages available to this app. + // ExtraProgramPages the number of extra program pages available to this app. ExtraProgramPages *uint64 `json:"extra-program-pages,omitempty"` // GlobalState Represents a key-value store for use in an application. @@ -275,10 +284,10 @@ type ApplicationParams struct { // ApplicationStateSchema Specifies maximums on the number of each type that may be stored. type ApplicationStateSchema struct { - // NumByteSlice \[nbs\] num of byte slices. + // NumByteSlice number of byte slices. NumByteSlice uint64 `json:"num-byte-slice"` - // NumUint \[nui\] num of uints. + // NumUint number of uints. NumUint uint64 `json:"num-uint"` } @@ -310,7 +319,7 @@ type Asset struct { // Definition: // data/basics/userBalance.go : AssetHolding type AssetHolding struct { - // Amount \[a\] number of units held. + // Amount number of units held. Amount uint64 `json:"amount"` // AssetId Asset ID of the holding. @@ -319,7 +328,7 @@ type AssetHolding struct { // Deleted Whether or not the asset holding is currently deleted from its account. Deleted *bool `json:"deleted,omitempty"` - // IsFrozen \[f\] whether or not the holding is frozen. + // IsFrozen whether or not the holding is frozen. IsFrozen bool `json:"is-frozen"` // OptedInAtRound Round during which the account opted into this asset holding. @@ -336,46 +345,46 @@ type AssetHolding struct { // Definition: // data/transactions/asset.go : AssetParams type AssetParams struct { - // Clawback \[c\] Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. + // Clawback Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. Clawback *string `json:"clawback,omitempty"` // Creator The address that created this asset. This is the address where the parameters for this asset can be found, and also the address where unwanted asset units can be sent in the worst case. Creator string `json:"creator"` - // Decimals \[dc\] The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). + // Decimals The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). Decimals uint64 `json:"decimals"` - // DefaultFrozen \[df\] Whether holdings of this asset are frozen by default. + // DefaultFrozen Whether holdings of this asset are frozen by default. DefaultFrozen *bool `json:"default-frozen,omitempty"` - // Freeze \[f\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. + // Freeze Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. Freeze *string `json:"freeze,omitempty"` - // Manager \[m\] Address of account used to manage the keys of this asset and to destroy it. + // Manager Address of account used to manage the keys of this asset and to destroy it. Manager *string `json:"manager,omitempty"` - // MetadataHash \[am\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application. + // MetadataHash A commitment to some unspecified asset metadata. The format of this metadata is up to the application. MetadataHash *[]byte `json:"metadata-hash,omitempty"` - // Name \[an\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. + // Name Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. Name *string `json:"name,omitempty"` // NameB64 Base64 encoded name of this asset, as supplied by the creator. NameB64 *[]byte `json:"name-b64,omitempty"` - // Reserve \[r\] Address of account holding reserve (non-minted) units of this asset. + // Reserve Address of account holding reserve (non-minted) units of this asset. Reserve *string `json:"reserve,omitempty"` - // Total \[t\] The total number of units of this asset. + // Total The total number of units of this asset. Total uint64 `json:"total"` - // UnitName \[un\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. + // UnitName Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. UnitName *string `json:"unit-name,omitempty"` // UnitNameB64 Base64 encoded name of a unit of this asset, as supplied by the creator. UnitNameB64 *[]byte `json:"unit-name-b64,omitempty"` - // Url \[au\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. + // Url URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. Url *string `json:"url,omitempty"` // UrlB64 Base64 encoded URL where more information about the asset can be retrieved. @@ -387,6 +396,12 @@ type AssetParams struct { // Definition: // data/bookkeeping/block.go : Block type Block struct { + // Bonus the potential bonus payout for this block. + Bonus *uint64 `json:"bonus,omitempty"` + + // FeesCollected the sum of all fees paid by transactions in this block. + FeesCollected *uint64 `json:"fees-collected,omitempty"` + // GenesisHash \[gh\] hash to which this block belongs. GenesisHash []byte `json:"genesis-hash"` @@ -399,6 +414,12 @@ type Block struct { // PreviousBlockHash \[prev\] Previous block hash. PreviousBlockHash []byte `json:"previous-block-hash"` + // Proposer the proposer of this block. + Proposer *string `json:"proposer,omitempty"` + + // ProposerPayout the actual amount transferred to the proposer from the fee sink. + ProposerPayout *uint64 `json:"proposer-payout,omitempty"` + // Rewards Fields relating to rewards, Rewards *BlockRewards `json:"rewards,omitempty"` @@ -607,6 +628,9 @@ type OnCompletion string // ParticipationUpdates Participation account data that needs to be checked/acted on by the network. type ParticipationUpdates struct { + // AbsentParticipationAccounts \[partupabs\] a list of online accounts that need to be suspended. + AbsentParticipationAccounts *[]string `json:"absent-participation-accounts,omitempty"` + // ExpiredParticipationAccounts \[partupdrmv\] a list of online accounts that needs to be converted to offline since their participation key expired. ExpiredParticipationAccounts *[]string `json:"expired-participation-accounts,omitempty"` } @@ -718,13 +742,13 @@ type TealKeyValueStore = []TealKeyValue // TealValue Represents a TEAL value. type TealValue struct { - // Bytes \[tb\] bytes value. + // Bytes bytes value. Bytes string `json:"bytes"` - // Type \[tt\] value type. Value `1` refers to **bytes**, value `2` refers to **uint** + // Type type of the value. Value `1` refers to **bytes**, value `2` refers to **uint** Type uint64 `json:"type"` - // Uint \[ui\] uint value. + // Uint uint value. Uint uint64 `json:"uint"` } diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 007399b14..6ffd25359 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1212,226 +1212,229 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", + "X9HFgqnMzowwPzl5PPn0/wIAAP//csXxQ8d9AQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index de3320b07..3b73be557 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -162,40 +162,40 @@ type Account struct { // Address the account public key Address string `json:"address"` - // Amount \[algo\] total number of MicroAlgos in the account + // Amount total number of MicroAlgos in the account Amount uint64 `json:"amount"` // AmountWithoutPendingRewards specifies the amount of MicroAlgos in the account, without the pending rewards. AmountWithoutPendingRewards uint64 `json:"amount-without-pending-rewards"` - // AppsLocalState \[appl\] applications local data stored in this account. + // AppsLocalState application local data stored in this account. // // Note the raw object uses `map[int] -> AppLocalState` for this type. AppsLocalState *[]ApplicationLocalState `json:"apps-local-state,omitempty"` - // AppsTotalExtraPages \[teap\] the sum of all extra application program pages for this account. + // AppsTotalExtraPages the sum of all extra application program pages for this account. AppsTotalExtraPages *uint64 `json:"apps-total-extra-pages,omitempty"` // AppsTotalSchema Specifies maximums on the number of each type that may be stored. AppsTotalSchema *ApplicationStateSchema `json:"apps-total-schema,omitempty"` - // Assets \[asset\] assets held by this account. + // Assets assets held by this account. // // Note the raw object uses `map[int] -> AssetHolding` for this type. Assets *[]AssetHolding `json:"assets,omitempty"` - // AuthAddr \[spend\] the address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field. + // AuthAddr The address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field. AuthAddr *string `json:"auth-addr,omitempty"` // ClosedAtRound Round during which this account was most recently closed. ClosedAtRound *uint64 `json:"closed-at-round,omitempty"` - // CreatedApps \[appp\] parameters of applications created by this account including app global data. + // CreatedApps parameters of applications created by this account including app global data. // // Note: the raw account uses `map[int] -> AppParams` for this type. CreatedApps *[]Application `json:"created-apps,omitempty"` - // CreatedAssets \[apar\] parameters of assets created by this account. + // CreatedAssets parameters of assets created by this account. // // Note: the raw account uses `map[int] -> Asset` for this type. CreatedAssets *[]Asset `json:"created-assets,omitempty"` @@ -206,29 +206,38 @@ type Account struct { // Deleted Whether or not this account is currently closed. Deleted *bool `json:"deleted,omitempty"` + // IncentiveEligible can the account receive block incentives if its balance is in range at proposal time. + IncentiveEligible *bool `json:"incentive-eligible,omitempty"` + + // LastHeartbeat The round in which this account last went online, or explicitly renewed their online status. + LastHeartbeat *uint64 `json:"last-heartbeat,omitempty"` + + // LastProposed The round in which this account last proposed the block. + LastProposed *uint64 `json:"last-proposed,omitempty"` + // Participation AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` // PendingRewards amount of MicroAlgos of pending rewards in this account. PendingRewards uint64 `json:"pending-rewards"` - // RewardBase \[ebase\] used as part of the rewards computation. Only applicable to accounts which are participating. + // RewardBase used as part of the rewards computation. Only applicable to accounts which are participating. RewardBase *uint64 `json:"reward-base,omitempty"` - // Rewards \[ern\] total rewards of MicroAlgos the account has received, including pending rewards. + // Rewards total rewards of MicroAlgos the account has received, including pending rewards. Rewards uint64 `json:"rewards"` // Round The round for which this information is relevant. Round uint64 `json:"round"` - // SigType Indicates what type of signature is used by this account, must be one of: + // SigType the type of signature used by this account, must be one of: // * sig // * msig // * lsig // * or null if unknown SigType *AccountSigType `json:"sig-type,omitempty"` - // Status \[onl\] delegation status of the account's MicroAlgos + // Status voting status of the account's MicroAlgos // * Offline - indicates that the associated account is delegated. // * Online - indicates that the associated account used as part of the delegation pool. // * NotParticipating - indicates that the associated account is neither a delegator nor a delegate. @@ -253,7 +262,7 @@ type Account struct { TotalCreatedAssets uint64 `json:"total-created-assets"` } -// AccountSigType Indicates what type of signature is used by this account, must be one of: +// AccountSigType the type of signature used by this account, must be one of: // * sig // * msig // * lsig @@ -262,22 +271,22 @@ type AccountSigType string // AccountParticipation AccountParticipation describes the parameters used by this account in consensus protocol. type AccountParticipation struct { - // SelectionParticipationKey \[sel\] Selection public key (if any) currently registered for this round. + // SelectionParticipationKey Selection public key (if any) currently registered for this round. SelectionParticipationKey []byte `json:"selection-participation-key"` - // StateProofKey \[stprf\] Root of the state proof key (if any) + // StateProofKey Root of the state proof key (if any) StateProofKey *[]byte `json:"state-proof-key,omitempty"` - // VoteFirstValid \[voteFst\] First round for which this participation is valid. + // VoteFirstValid First round for which this participation is valid. VoteFirstValid uint64 `json:"vote-first-valid"` - // VoteKeyDilution \[voteKD\] Number of subkeys in each batch of participation keys. + // VoteKeyDilution Number of subkeys in each batch of participation keys. VoteKeyDilution uint64 `json:"vote-key-dilution"` - // VoteLastValid \[voteLst\] Last round for which this participation is valid. + // VoteLastValid Last round for which this participation is valid. VoteLastValid uint64 `json:"vote-last-valid"` - // VoteParticipationKey \[vote\] root participation public key (if any) currently registered for this round. + // VoteParticipationKey root participation public key (if any) currently registered for this round. VoteParticipationKey []byte `json:"vote-participation-key"` } @@ -300,7 +309,7 @@ type Application struct { // DeletedAtRound Round when this application was deleted. DeletedAtRound *uint64 `json:"deleted-at-round,omitempty"` - // Id \[appidx\] application index. + // Id application index. Id uint64 `json:"id"` // Params Stores the global information associated with an application. @@ -330,7 +339,7 @@ type ApplicationLocalState struct { // ApplicationLogData Stores the global information associated with an application. type ApplicationLogData struct { - // Logs \[lg\] Logs for the application being executed by the transaction. + // Logs Logs for the application being executed by the transaction. Logs [][]byte `json:"logs"` // Txid Transaction ID @@ -339,16 +348,16 @@ type ApplicationLogData struct { // ApplicationParams Stores the global information associated with an application. type ApplicationParams struct { - // ApprovalProgram \[approv\] approval program. + // ApprovalProgram approval program. ApprovalProgram []byte `json:"approval-program"` - // ClearStateProgram \[clearp\] approval program. + // ClearStateProgram clear state program. ClearStateProgram []byte `json:"clear-state-program"` // Creator The address that created this application. This is the address where the parameters and global state for this application can be found. Creator *string `json:"creator,omitempty"` - // ExtraProgramPages \[epp\] the amount of extra program pages available to this app. + // ExtraProgramPages the number of extra program pages available to this app. ExtraProgramPages *uint64 `json:"extra-program-pages,omitempty"` // GlobalState Represents a key-value store for use in an application. @@ -363,10 +372,10 @@ type ApplicationParams struct { // ApplicationStateSchema Specifies maximums on the number of each type that may be stored. type ApplicationStateSchema struct { - // NumByteSlice \[nbs\] num of byte slices. + // NumByteSlice number of byte slices. NumByteSlice uint64 `json:"num-byte-slice"` - // NumUint \[nui\] num of uints. + // NumUint number of uints. NumUint uint64 `json:"num-uint"` } @@ -398,7 +407,7 @@ type Asset struct { // Definition: // data/basics/userBalance.go : AssetHolding type AssetHolding struct { - // Amount \[a\] number of units held. + // Amount number of units held. Amount uint64 `json:"amount"` // AssetId Asset ID of the holding. @@ -407,7 +416,7 @@ type AssetHolding struct { // Deleted Whether or not the asset holding is currently deleted from its account. Deleted *bool `json:"deleted,omitempty"` - // IsFrozen \[f\] whether or not the holding is frozen. + // IsFrozen whether or not the holding is frozen. IsFrozen bool `json:"is-frozen"` // OptedInAtRound Round during which the account opted into this asset holding. @@ -424,46 +433,46 @@ type AssetHolding struct { // Definition: // data/transactions/asset.go : AssetParams type AssetParams struct { - // Clawback \[c\] Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. + // Clawback Address of account used to clawback holdings of this asset. If empty, clawback is not permitted. Clawback *string `json:"clawback,omitempty"` // Creator The address that created this asset. This is the address where the parameters for this asset can be found, and also the address where unwanted asset units can be sent in the worst case. Creator string `json:"creator"` - // Decimals \[dc\] The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). + // Decimals The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive). Decimals uint64 `json:"decimals"` - // DefaultFrozen \[df\] Whether holdings of this asset are frozen by default. + // DefaultFrozen Whether holdings of this asset are frozen by default. DefaultFrozen *bool `json:"default-frozen,omitempty"` - // Freeze \[f\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. + // Freeze Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. Freeze *string `json:"freeze,omitempty"` - // Manager \[m\] Address of account used to manage the keys of this asset and to destroy it. + // Manager Address of account used to manage the keys of this asset and to destroy it. Manager *string `json:"manager,omitempty"` - // MetadataHash \[am\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application. + // MetadataHash A commitment to some unspecified asset metadata. The format of this metadata is up to the application. MetadataHash *[]byte `json:"metadata-hash,omitempty"` - // Name \[an\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. + // Name Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters. Name *string `json:"name,omitempty"` // NameB64 Base64 encoded name of this asset, as supplied by the creator. NameB64 *[]byte `json:"name-b64,omitempty"` - // Reserve \[r\] Address of account holding reserve (non-minted) units of this asset. + // Reserve Address of account holding reserve (non-minted) units of this asset. Reserve *string `json:"reserve,omitempty"` - // Total \[t\] The total number of units of this asset. + // Total The total number of units of this asset. Total uint64 `json:"total"` - // UnitName \[un\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. + // UnitName Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters. UnitName *string `json:"unit-name,omitempty"` // UnitNameB64 Base64 encoded name of a unit of this asset, as supplied by the creator. UnitNameB64 *[]byte `json:"unit-name-b64,omitempty"` - // Url \[au\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. + // Url URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters. Url *string `json:"url,omitempty"` // UrlB64 Base64 encoded URL where more information about the asset can be retrieved. @@ -475,6 +484,12 @@ type AssetParams struct { // Definition: // data/bookkeeping/block.go : Block type Block struct { + // Bonus the potential bonus payout for this block. + Bonus *uint64 `json:"bonus,omitempty"` + + // FeesCollected the sum of all fees paid by transactions in this block. + FeesCollected *uint64 `json:"fees-collected,omitempty"` + // GenesisHash \[gh\] hash to which this block belongs. GenesisHash []byte `json:"genesis-hash"` @@ -487,6 +502,12 @@ type Block struct { // PreviousBlockHash \[prev\] Previous block hash. PreviousBlockHash []byte `json:"previous-block-hash"` + // Proposer the proposer of this block. + Proposer *string `json:"proposer,omitempty"` + + // ProposerPayout the actual amount transferred to the proposer from the fee sink. + ProposerPayout *uint64 `json:"proposer-payout,omitempty"` + // Rewards Fields relating to rewards, Rewards *BlockRewards `json:"rewards,omitempty"` @@ -695,6 +716,9 @@ type OnCompletion string // ParticipationUpdates Participation account data that needs to be checked/acted on by the network. type ParticipationUpdates struct { + // AbsentParticipationAccounts \[partupabs\] a list of online accounts that need to be suspended. + AbsentParticipationAccounts *[]string `json:"absent-participation-accounts,omitempty"` + // ExpiredParticipationAccounts \[partupdrmv\] a list of online accounts that needs to be converted to offline since their participation key expired. ExpiredParticipationAccounts *[]string `json:"expired-participation-accounts,omitempty"` } @@ -806,13 +830,13 @@ type TealKeyValueStore = []TealKeyValue // TealValue Represents a TEAL value. type TealValue struct { - // Bytes \[tb\] bytes value. + // Bytes bytes value. Bytes string `json:"bytes"` - // Type \[tt\] value type. Value `1` refers to **bytes**, value `2` refers to **uint** + // Type type of the value. Value `1` refers to **bytes**, value `2` refers to **uint** Type uint64 `json:"type"` - // Uint \[ui\] uint value. + // Uint uint value. Uint uint64 `json:"uint"` } diff --git a/api/handlers.go b/api/handlers.go index 0b2000c7d..f325e4bf4 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -1308,16 +1308,22 @@ func (si *ServerImplementation) fetchBlock(ctx context.Context, round uint64, op UpgradePropose: strPtr(string(blockHeader.UpgradePropose)), } - var partUpdates *generated.ParticipationUpdates + var partUpdates *generated.ParticipationUpdates = &generated.ParticipationUpdates{} if len(blockHeader.ExpiredParticipationAccounts) > 0 { addrs := make([]string, len(blockHeader.ExpiredParticipationAccounts)) for i := 0; i < len(addrs); i++ { addrs[i] = blockHeader.ExpiredParticipationAccounts[i].String() } - partUpdates = &generated.ParticipationUpdates{ - ExpiredParticipationAccounts: strArrayPtr(addrs), + partUpdates.ExpiredParticipationAccounts = strArrayPtr(addrs) + } + if len(blockHeader.AbsentParticipationAccounts) > 0 { + addrs := make([]string, len(blockHeader.AbsentParticipationAccounts)) + for i := 0; i < len(addrs); i++ { + addrs[i] = blockHeader.AbsentParticipationAccounts[i].String() } - } else { + partUpdates.AbsentParticipationAccounts = strArrayPtr(addrs) + } + if *partUpdates == (generated.ParticipationUpdates{}) { partUpdates = nil } @@ -1342,10 +1348,14 @@ func (si *ServerImplementation) fetchBlock(ctx context.Context, round uint64, op } ret = generated.Block{ + Bonus: uint64PtrOrNil(uint64(blockHeader.Bonus)), + FeesCollected: uint64PtrOrNil(uint64(blockHeader.FeesCollected)), GenesisHash: blockHeader.GenesisHash[:], GenesisId: blockHeader.GenesisID, ParticipationUpdates: partUpdates, PreviousBlockHash: blockHeader.Branch[:], + Proposer: addrPtr(blockHeader.Proposer), + ProposerPayout: uint64PtrOrNil(uint64(blockHeader.ProposerPayout)), Rewards: &rewards, Round: uint64(blockHeader.Round), Seed: blockHeader.Seed[:], diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 119bf122f..5cab4503c 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1041,7 +1041,7 @@ "type": "string" }, "amount": { - "description": "\\[algo\\] total number of MicroAlgos in the account", + "description": "total number of MicroAlgos in the account", "type": "integer" }, "amount-without-pending-rewards": { @@ -1049,36 +1049,36 @@ "type": "integer" }, "apps-local-state": { - "description": "\\[appl\\] applications local data stored in this account.\n\nNote the raw object uses `map[int] -\u003e AppLocalState` for this type.", + "description": "application local data stored in this account.\n\nNote the raw object uses `map[int] -\u003e AppLocalState` for this type.", "type": "array", "items": { "$ref": "#/definitions/ApplicationLocalState" } }, "apps-total-schema": { - "description": "\\[tsch\\] stores the sum of all of the local schemas and global schemas in this account.\n\nNote: the raw account uses `StateSchema` for this type.", + "description": "the sum of all of the local schemas and global schemas in this account.\n\nNote: the raw account uses `StateSchema` for this type.", "$ref": "#/definitions/ApplicationStateSchema" }, "apps-total-extra-pages": { - "description": "\\[teap\\] the sum of all extra application program pages for this account.", + "description": "the sum of all extra application program pages for this account.", "type": "integer" }, "assets": { - "description": "\\[asset\\] assets held by this account.\n\nNote the raw object uses `map[int] -\u003e AssetHolding` for this type.", + "description": "assets held by this account.\n\nNote the raw object uses `map[int] -\u003e AssetHolding` for this type.", "type": "array", "items": { "$ref": "#/definitions/AssetHolding" } }, "created-apps": { - "description": "\\[appp\\] parameters of applications created by this account including app global data.\n\nNote: the raw account uses `map[int] -\u003e AppParams` for this type.", + "description": "parameters of applications created by this account including app global data.\n\nNote: the raw account uses `map[int] -\u003e AppParams` for this type.", "type": "array", "items": { "$ref": "#/definitions/Application" } }, "created-assets": { - "description": "\\[apar\\] parameters of assets created by this account.\n\nNote: the raw account uses `map[int] -\u003e Asset` for this type.", + "description": "parameters of assets created by this account.\n\nNote: the raw account uses `map[int] -\u003e Asset` for this type.", "type": "array", "items": { "$ref": "#/definitions/Asset" @@ -1087,16 +1087,20 @@ "participation": { "$ref": "#/definitions/AccountParticipation" }, + "incentive-eligible": { + "description": "can the account receive block incentives if its balance is in range at proposal time.", + "type": "boolean" + }, "pending-rewards": { "description": "amount of MicroAlgos of pending rewards in this account.", "type": "integer" }, "reward-base": { - "description": "\\[ebase\\] used as part of the rewards computation. Only applicable to accounts which are participating.", + "description": "used as part of the rewards computation. Only applicable to accounts which are participating.", "type": "integer" }, "rewards": { - "description": "\\[ern\\] total rewards of MicroAlgos the account has received, including pending rewards.", + "description": "total rewards of MicroAlgos the account has received, including pending rewards.", "type": "integer" }, "round": { @@ -1104,11 +1108,11 @@ "type": "integer" }, "status": { - "description": "\\[onl\\] delegation status of the account's MicroAlgos\n* Offline - indicates that the associated account is delegated.\n* Online - indicates that the associated account used as part of the delegation pool.\n* NotParticipating - indicates that the associated account is neither a delegator nor a delegate.", + "description": "voting status of the account's MicroAlgos\n* Offline - indicates that the associated account is delegated.\n* Online - indicates that the associated account used as part of the delegation pool.\n* NotParticipating - indicates that the associated account is neither a delegator nor a delegate.", "type": "string" }, "sig-type": { - "description": "Indicates what type of signature is used by this account, must be one of:\n* sig\n* msig\n* lsig\n* or null if unknown", + "description": "the type of signature used by this account, must be one of:\n* sig\n* msig\n* lsig\n* or null if unknown", "type": "string", "enum": [ "sig", @@ -1141,10 +1145,18 @@ "type": "integer" }, "auth-addr": { - "description": "\\[spend\\] the address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field.", + "description": "The address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field.", "type": "string", "x-algorand-format": "Address" }, + "last-proposed": { + "description": "The round in which this account last proposed the block.", + "type": "integer" + }, + "last-heartbeat": { + "description": "The round in which this account last went online, or explicitly renewed their online status.", + "type": "integer" + }, "deleted": { "description": "Whether or not this account is currently closed.", "type": "boolean" @@ -1173,29 +1185,29 @@ ], "properties": { "selection-participation-key": { - "description": "\\[sel\\] Selection public key (if any) currently registered for this round.", + "description": "Selection public key (if any) currently registered for this round.", "type": "string", "format": "byte" }, "vote-first-valid": { - "description": "\\[voteFst\\] First round for which this participation is valid.", + "description": "First round for which this participation is valid.", "type": "integer" }, "vote-key-dilution": { - "description": "\\[voteKD\\] Number of subkeys in each batch of participation keys.", + "description": "Number of subkeys in each batch of participation keys.", "type": "integer" }, "vote-last-valid": { - "description": "\\[voteLst\\] Last round for which this participation is valid.", + "description": "Last round for which this participation is valid.", "type": "integer" }, "vote-participation-key": { - "description": "\\[vote\\] root participation public key (if any) currently registered for this round.", + "description": "root participation public key (if any) currently registered for this round.", "type": "string", "format": "byte" }, "state-proof-key": { - "description": "\\[stprf\\] Root of the state proof key (if any)", + "description": "Root of the state proof key (if any)", "type": "string", "format": "byte" } @@ -1210,11 +1222,11 @@ ], "properties": { "num-uint": { - "description": "\\[nui\\] num of uints.", + "description": "number of uints.", "type": "integer" }, "num-byte-slice": { - "description": "\\[nbs\\] num of byte slices.", + "description": "number of byte slices.", "type": "integer" } } @@ -1246,11 +1258,11 @@ "x-algorand-format": "uint64" }, "schema": { - "description": "\\[hsch\\] schema.", + "description": "schema.", "$ref": "#/definitions/ApplicationStateSchema" }, "key-value": { - "description": "\\[tkv\\] storage.", + "description": "storage.", "$ref": "#/definitions/TealKeyValueStore" } } @@ -1288,15 +1300,15 @@ ], "properties": { "type": { - "description": "\\[tt\\] value type. Value `1` refers to **bytes**, value `2` refers to **uint**", + "description": "type of the value. Value `1` refers to **bytes**, value `2` refers to **uint**", "type": "integer" }, "bytes": { - "description": "\\[tb\\] bytes value.", + "description": "bytes value.", "type": "string" }, "uint": { - "description": "\\[ui\\] uint value.", + "description": "uint value.", "type": "integer", "x-algorand-format": "uint64" } @@ -1311,7 +1323,7 @@ ], "properties": { "id": { - "description": "\\[appidx\\] application index.", + "description": "application index.", "type": "integer" }, "deleted": { @@ -1329,7 +1341,7 @@ "x-algorand-format": "uint64" }, "params": { - "description": "\\[appparams\\] application parameters.", + "description": "application parameters.", "$ref": "#/definitions/ApplicationParams" } } @@ -1348,31 +1360,31 @@ "x-algorand-format": "Address" }, "approval-program": { - "description": "\\[approv\\] approval program.", + "description": "approval program.", "type": "string", "format": "byte", "x-algorand-format": "TEALProgram" }, "clear-state-program": { - "description": "\\[clearp\\] approval program.", + "description": "clear state program.", "type": "string", "format": "byte", "x-algorand-format": "TEALProgram" }, "local-state-schema": { - "description": "[\\lsch\\] local schema", + "description": "local schema", "$ref": "#/definitions/ApplicationStateSchema" }, "global-state-schema": { - "description": "[\\gsch\\] global schema", + "description": "global schema", "$ref": "#/definitions/ApplicationStateSchema" }, "global-state": { - "description": "[\\gs\\] global schema", + "description": "global state", "$ref": "#/definitions/TealKeyValueStore" }, "extra-program-pages": { - "description": "\\[epp\\] the amount of extra program pages available to this app.", + "description": "the number of extra program pages available to this app.", "type": "integer" } } @@ -1390,7 +1402,7 @@ "type": "string" }, "logs": { - "description": "\\[lg\\] Logs for the application being executed by the transaction.", + "description": "Logs for the application being executed by the transaction.", "type": "array", "items": { "type": "string", @@ -1440,7 +1452,7 @@ ], "properties": { "amount": { - "description": "\\[a\\] number of units held.", + "description": "number of units held.", "type": "integer", "x-algorand-format": "uint64" }, @@ -1449,7 +1461,7 @@ "type": "integer" }, "is-frozen": { - "description": "\\[f\\] whether or not the holding is frozen.", + "description": "whether or not the holding is frozen.", "type": "boolean" }, "deleted": { @@ -1478,7 +1490,7 @@ ], "properties": { "clawback": { - "description": "\\[c\\] Address of account used to clawback holdings of this asset. If empty, clawback is not permitted.", + "description": "Address of account used to clawback holdings of this asset. If empty, clawback is not permitted.", "type": "string" }, "creator": { @@ -1486,30 +1498,30 @@ "type": "string" }, "decimals": { - "description": "\\[dc\\] The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive).", + "description": "The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive).", "type": "integer", "maximum": 19, "minimum": 0 }, "default-frozen": { - "description": "\\[df\\] Whether holdings of this asset are frozen by default.", + "description": "Whether holdings of this asset are frozen by default.", "type": "boolean" }, "freeze": { - "description": "\\[f\\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", + "description": "Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", "type": "string" }, "manager": { - "description": "\\[m\\] Address of account used to manage the keys of this asset and to destroy it.", + "description": "Address of account used to manage the keys of this asset and to destroy it.", "type": "string" }, "metadata-hash": { - "description": "\\[am\\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application.", + "description": "A commitment to some unspecified asset metadata. The format of this metadata is up to the application.", "type": "string", "format": "byte" }, "name": { - "description": "\\[an\\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", + "description": "Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", "type": "string" }, "name-b64": { @@ -1518,16 +1530,16 @@ "format": "byte" }, "reserve": { - "description": "\\[r\\] Address of account holding reserve (non-minted) units of this asset.", + "description": "Address of account holding reserve (non-minted) units of this asset.", "type": "string" }, "total": { - "description": "\\[t\\] The total number of units of this asset.", + "description": "The total number of units of this asset.", "type": "integer", "x-algorand-format": "uint64" }, "unit-name": { - "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", + "description": "Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", "type": "string" }, "unit-name-b64": { @@ -1536,7 +1548,7 @@ "format": "byte" }, "url": { - "description": "\\[au\\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", + "description": "URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", "type": "string" }, "url-b64": { @@ -1560,6 +1572,23 @@ "genesis-hash" ], "properties": { + "proposer": { + "description": "the proposer of this block.", + "type": "string", + "x-algorand-format": "Address" + }, + "fees-collected": { + "description": "the sum of all fees paid by transactions in this block.", + "type": "integer" + }, + "bonus": { + "description": "the potential bonus payout for this block.", + "type": "integer" + }, + "proposer-payout": { + "description": "the actual amount transferred to the proposer from the fee sink.", + "type": "integer" + }, "genesis-hash": { "description": "\\[gh\\] hash to which this block belongs.", "type": "string", @@ -1849,6 +1878,13 @@ "items": { "type": "string" } + }, + "absent-participation-accounts": { + "description": "\\[partupabs\\] a list of online accounts that need to be suspended.", + "type": "array", + "items": { + "type": "string" + } } } }, diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 40c65560b..95377909f 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -694,7 +694,7 @@ "type": "string" }, "amount": { - "description": "\\[algo\\] total number of MicroAlgos in the account", + "description": "total number of MicroAlgos in the account", "type": "integer" }, "amount-without-pending-rewards": { @@ -702,28 +702,28 @@ "type": "integer" }, "apps-local-state": { - "description": "\\[appl\\] applications local data stored in this account.\n\nNote the raw object uses `map[int] -> AppLocalState` for this type.", + "description": "application local data stored in this account.\n\nNote the raw object uses `map[int] -> AppLocalState` for this type.", "items": { "$ref": "#/components/schemas/ApplicationLocalState" }, "type": "array" }, "apps-total-extra-pages": { - "description": "\\[teap\\] the sum of all extra application program pages for this account.", + "description": "the sum of all extra application program pages for this account.", "type": "integer" }, "apps-total-schema": { "$ref": "#/components/schemas/ApplicationStateSchema" }, "assets": { - "description": "\\[asset\\] assets held by this account.\n\nNote the raw object uses `map[int] -> AssetHolding` for this type.", + "description": "assets held by this account.\n\nNote the raw object uses `map[int] -> AssetHolding` for this type.", "items": { "$ref": "#/components/schemas/AssetHolding" }, "type": "array" }, "auth-addr": { - "description": "\\[spend\\] the address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field.", + "description": "The address against which signing should be checked. If empty, the address of the current account is used. This field can be updated in any transaction by setting the RekeyTo field.", "type": "string", "x-algorand-format": "Address" }, @@ -733,14 +733,14 @@ "x-algorand-format": "uint64" }, "created-apps": { - "description": "\\[appp\\] parameters of applications created by this account including app global data.\n\nNote: the raw account uses `map[int] -> AppParams` for this type.", + "description": "parameters of applications created by this account including app global data.\n\nNote: the raw account uses `map[int] -> AppParams` for this type.", "items": { "$ref": "#/components/schemas/Application" }, "type": "array" }, "created-assets": { - "description": "\\[apar\\] parameters of assets created by this account.\n\nNote: the raw account uses `map[int] -> Asset` for this type.", + "description": "parameters of assets created by this account.\n\nNote: the raw account uses `map[int] -> Asset` for this type.", "items": { "$ref": "#/components/schemas/Asset" }, @@ -755,6 +755,18 @@ "description": "Whether or not this account is currently closed.", "type": "boolean" }, + "incentive-eligible": { + "description": "can the account receive block incentives if its balance is in range at proposal time.", + "type": "boolean" + }, + "last-heartbeat": { + "description": "The round in which this account last went online, or explicitly renewed their online status.", + "type": "integer" + }, + "last-proposed": { + "description": "The round in which this account last proposed the block.", + "type": "integer" + }, "participation": { "$ref": "#/components/schemas/AccountParticipation" }, @@ -763,11 +775,11 @@ "type": "integer" }, "reward-base": { - "description": "\\[ebase\\] used as part of the rewards computation. Only applicable to accounts which are participating.", + "description": "used as part of the rewards computation. Only applicable to accounts which are participating.", "type": "integer" }, "rewards": { - "description": "\\[ern\\] total rewards of MicroAlgos the account has received, including pending rewards.", + "description": "total rewards of MicroAlgos the account has received, including pending rewards.", "type": "integer" }, "round": { @@ -775,7 +787,7 @@ "type": "integer" }, "sig-type": { - "description": "Indicates what type of signature is used by this account, must be one of:\n* sig\n* msig\n* lsig\n* or null if unknown", + "description": "the type of signature used by this account, must be one of:\n* sig\n* msig\n* lsig\n* or null if unknown", "enum": [ "sig", "msig", @@ -784,7 +796,7 @@ "type": "string" }, "status": { - "description": "\\[onl\\] delegation status of the account's MicroAlgos\n* Offline - indicates that the associated account is delegated.\n* Online - indicates that the associated account used as part of the delegation pool.\n* NotParticipating - indicates that the associated account is neither a delegator nor a delegate.", + "description": "voting status of the account's MicroAlgos\n* Offline - indicates that the associated account is delegated.\n* Online - indicates that the associated account used as part of the delegation pool.\n* NotParticipating - indicates that the associated account is neither a delegator nor a delegate.", "type": "string" }, "total-apps-opted-in": { @@ -833,31 +845,31 @@ "description": "AccountParticipation describes the parameters used by this account in consensus protocol.", "properties": { "selection-participation-key": { - "description": "\\[sel\\] Selection public key (if any) currently registered for this round.", + "description": "Selection public key (if any) currently registered for this round.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, "state-proof-key": { - "description": "\\[stprf\\] Root of the state proof key (if any)", + "description": "Root of the state proof key (if any)", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, "vote-first-valid": { - "description": "\\[voteFst\\] First round for which this participation is valid.", + "description": "First round for which this participation is valid.", "type": "integer" }, "vote-key-dilution": { - "description": "\\[voteKD\\] Number of subkeys in each batch of participation keys.", + "description": "Number of subkeys in each batch of participation keys.", "type": "integer" }, "vote-last-valid": { - "description": "\\[voteLst\\] Last round for which this participation is valid.", + "description": "Last round for which this participation is valid.", "type": "integer" }, "vote-participation-key": { - "description": "\\[vote\\] root participation public key (if any) currently registered for this round.", + "description": "root participation public key (if any) currently registered for this round.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" @@ -906,7 +918,7 @@ "x-algorand-format": "uint64" }, "id": { - "description": "\\[appidx\\] application index.", + "description": "application index.", "type": "integer" }, "params": { @@ -957,7 +969,7 @@ "description": "Stores the global information associated with an application.", "properties": { "logs": { - "description": "\\[lg\\] Logs for the application being executed by the transaction.", + "description": "Logs for the application being executed by the transaction.", "items": { "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", @@ -980,14 +992,14 @@ "description": "Stores the global information associated with an application.", "properties": { "approval-program": { - "description": "\\[approv\\] approval program.", + "description": "approval program.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", "x-algorand-format": "TEALProgram" }, "clear-state-program": { - "description": "\\[clearp\\] approval program.", + "description": "clear state program.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string", @@ -999,7 +1011,7 @@ "x-algorand-format": "Address" }, "extra-program-pages": { - "description": "\\[epp\\] the amount of extra program pages available to this app.", + "description": "the number of extra program pages available to this app.", "type": "integer" }, "global-state": { @@ -1022,11 +1034,11 @@ "description": "Specifies maximums on the number of each type that may be stored.", "properties": { "num-byte-slice": { - "description": "\\[nbs\\] num of byte slices.", + "description": "number of byte slices.", "type": "integer" }, "num-uint": { - "description": "\\[nui\\] num of uints.", + "description": "number of uints.", "type": "integer" } }, @@ -1071,7 +1083,7 @@ "description": "Describes an asset held by an account.\n\nDefinition:\ndata/basics/userBalance.go : AssetHolding", "properties": { "amount": { - "description": "\\[a\\] number of units held.", + "description": "number of units held.", "type": "integer", "x-algorand-format": "uint64" }, @@ -1084,7 +1096,7 @@ "type": "boolean" }, "is-frozen": { - "description": "\\[f\\] whether or not the holding is frozen.", + "description": "whether or not the holding is frozen.", "type": "boolean" }, "opted-in-at-round": { @@ -1109,7 +1121,7 @@ "description": "AssetParams specifies the parameters for an asset.\n\n\\[apar\\] when part of an AssetConfig transaction.\n\nDefinition:\ndata/transactions/asset.go : AssetParams", "properties": { "clawback": { - "description": "\\[c\\] Address of account used to clawback holdings of this asset. If empty, clawback is not permitted.", + "description": "Address of account used to clawback holdings of this asset. If empty, clawback is not permitted.", "type": "string" }, "creator": { @@ -1117,31 +1129,31 @@ "type": "string" }, "decimals": { - "description": "\\[dc\\] The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive).", + "description": "The number of digits to use after the decimal point when displaying this asset. If 0, the asset is not divisible. If 1, the base unit of the asset is in tenths. If 2, the base unit of the asset is in hundredths, and so on. This value must be between 0 and 19 (inclusive).", "maximum": 19, "minimum": 0, "type": "integer" }, "default-frozen": { - "description": "\\[df\\] Whether holdings of this asset are frozen by default.", + "description": "Whether holdings of this asset are frozen by default.", "type": "boolean" }, "freeze": { - "description": "\\[f\\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", + "description": "Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", "type": "string" }, "manager": { - "description": "\\[m\\] Address of account used to manage the keys of this asset and to destroy it.", + "description": "Address of account used to manage the keys of this asset and to destroy it.", "type": "string" }, "metadata-hash": { - "description": "\\[am\\] A commitment to some unspecified asset metadata. The format of this metadata is up to the application.", + "description": "A commitment to some unspecified asset metadata. The format of this metadata is up to the application.", "format": "byte", "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, "name": { - "description": "\\[an\\] Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", + "description": "Name of this asset, as supplied by the creator. Included only when the asset name is composed of printable utf-8 characters.", "type": "string" }, "name-b64": { @@ -1151,16 +1163,16 @@ "type": "string" }, "reserve": { - "description": "\\[r\\] Address of account holding reserve (non-minted) units of this asset.", + "description": "Address of account holding reserve (non-minted) units of this asset.", "type": "string" }, "total": { - "description": "\\[t\\] The total number of units of this asset.", + "description": "The total number of units of this asset.", "type": "integer", "x-algorand-format": "uint64" }, "unit-name": { - "description": "\\[un\\] Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", + "description": "Name of a unit of this asset, as supplied by the creator. Included only when the name of a unit of this asset is composed of printable utf-8 characters.", "type": "string" }, "unit-name-b64": { @@ -1170,7 +1182,7 @@ "type": "string" }, "url": { - "description": "\\[au\\] URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", + "description": "URL where more information about the asset can be retrieved. Included only when the URL is composed of printable utf-8 characters.", "type": "string" }, "url-b64": { @@ -1190,6 +1202,14 @@ "Block": { "description": "Block information.\n\nDefinition:\ndata/bookkeeping/block.go : Block", "properties": { + "bonus": { + "description": "the potential bonus payout for this block.", + "type": "integer" + }, + "fees-collected": { + "description": "the sum of all fees paid by transactions in this block.", + "type": "integer" + }, "genesis-hash": { "description": "\\[gh\\] hash to which this block belongs.", "format": "byte", @@ -1209,6 +1229,15 @@ "pattern": "^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$", "type": "string" }, + "proposer": { + "description": "the proposer of this block.", + "type": "string", + "x-algorand-format": "Address" + }, + "proposer-payout": { + "description": "the actual amount transferred to the proposer from the fee sink.", + "type": "integer" + }, "rewards": { "$ref": "#/components/schemas/BlockRewards" }, @@ -1601,6 +1630,13 @@ "ParticipationUpdates": { "description": "Participation account data that needs to be checked/acted on by the network.", "properties": { + "absent-participation-accounts": { + "description": "\\[partupabs\\] a list of online accounts that need to be suspended.", + "items": { + "type": "string" + }, + "type": "array" + }, "expired-participation-accounts": { "description": "\\[partupdrmv\\] a list of online accounts that needs to be converted to offline since their participation key expired.", "items": { @@ -1812,15 +1848,15 @@ "description": "Represents a TEAL value.", "properties": { "bytes": { - "description": "\\[tb\\] bytes value.", + "description": "bytes value.", "type": "string" }, "type": { - "description": "\\[tt\\] value type. Value `1` refers to **bytes**, value `2` refers to **uint**", + "description": "type of the value. Value `1` refers to **bytes**, value `2` refers to **uint**", "type": "integer" }, "uint": { - "description": "\\[ui\\] uint value.", + "description": "uint value.", "type": "integer", "x-algorand-format": "uint64" } @@ -5199,5 +5235,6 @@ { "name": "search" } - ] + ], + "x-original-swagger-version": "2.0" } \ No newline at end of file diff --git a/go.mod b/go.mod index 78abd7e92..a14dd15f7 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.4.0 + github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index 6d72371b5..4c4682e2f 100644 --- a/go.sum +++ b/go.sum @@ -70,8 +70,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 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-algorand-sdk/v2 v2.4.0 h1:R9ykarfk0ojAZlXlrysViDwWjHrvUMA0HmFHg9PmECw= -github.com/algorand/go-algorand-sdk/v2 v2.4.0/go.mod h1:Xk569fTpBTV0QtE74+79NTl6Rz3OC1K3iods4uG0ffU= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b h1:blz1WkFP1ZrQFI79hqmoc/Z3aeThPYDcl85Vq4qOt/g= +github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b/go.mod h1:Xk569fTpBTV0QtE74+79NTl6Rz3OC1K3iods4uG0ffU= 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/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index b36686670..e0c56b083 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -1111,21 +1111,14 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { if !accountData.AuthAddr.IsZero() { var spendingkey sdk.Address copy(spendingkey[:], accountData.AuthAddr[:]) - account.AuthAddr = stringPtr(spendingkey.String()) + account.AuthAddr = omitEmpty(spendingkey.String()) } - { - totalSchema := models.ApplicationStateSchema{ - NumByteSlice: accountData.TotalAppSchema.NumByteSlice, - NumUint: accountData.TotalAppSchema.NumUint, - } - if totalSchema != (models.ApplicationStateSchema{}) { - account.AppsTotalSchema = &totalSchema - } - } - if accountData.TotalExtraAppPages != 0 { - account.AppsTotalExtraPages = uint64Ptr(uint64(accountData.TotalExtraAppPages)) - } + account.AppsTotalSchema = omitEmpty(models.ApplicationStateSchema{ + NumByteSlice: accountData.TotalAppSchema.NumByteSlice, + NumUint: accountData.TotalAppSchema.NumUint, + }) + account.AppsTotalExtraPages = omitEmpty(uint64(accountData.TotalExtraAppPages)) account.TotalAppsOptedIn = accountData.TotalAppLocalStates account.TotalCreatedApps = accountData.TotalAppParams @@ -1134,6 +1127,10 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { account.TotalBoxes = accountData.TotalBoxes account.TotalBoxBytes = accountData.TotalBoxBytes + + account.IncentiveEligible = omitEmpty(accountData.IncentiveEligible) + account.LastHeartbeat = omitEmpty(uint64(accountData.LastHeartbeat)) + account.LastProposed = omitEmpty(uint64(accountData.LastProposed)) } if account.Status == "NotParticipating" { @@ -1305,11 +1302,11 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { Total: ap.Total, Decimals: uint64(ap.Decimals), DefaultFrozen: boolPtr(ap.DefaultFrozen), - UnitName: stringPtr(util.PrintableUTF8OrEmpty(ap.UnitName)), + UnitName: omitEmpty(util.PrintableUTF8OrEmpty(ap.UnitName)), UnitNameB64: byteSlicePtr([]byte(ap.UnitName)), - Name: stringPtr(util.PrintableUTF8OrEmpty(ap.AssetName)), + Name: omitEmpty(util.PrintableUTF8OrEmpty(ap.AssetName)), NameB64: byteSlicePtr([]byte(ap.AssetName)), - Url: stringPtr(util.PrintableUTF8OrEmpty(ap.URL)), + Url: omitEmpty(util.PrintableUTF8OrEmpty(ap.URL)), UrlB64: byteSlicePtr([]byte(ap.URL)), MetadataHash: byteSliceOmitZeroPtr(ap.MetadataHash[:]), Manager: addrStr(ap.Manager), @@ -1493,6 +1490,15 @@ func uintOrDefault(x *uint64) uint64 { return 0 } +// omitEmpty defines a handy impl for all comparable types to convert from default value to nil ptr +func omitEmpty[T comparable](val T) *T { + var defaultVal T + if val == defaultVal { + return nil + } + return &val +} + func uint64Ptr(x uint64) *uint64 { out := new(uint64) *out = x @@ -1505,15 +1511,6 @@ func boolPtr(x bool) *bool { return out } -func stringPtr(x string) *string { - if len(x) == 0 { - return nil - } - out := new(string) - *out = x - return out -} - func byteSlicePtr(x []byte) *[]byte { if len(x) == 0 { return nil From 597d09ae05a0edef14b6184f145822f7d8ac9ea2 Mon Sep 17 00:00:00 2001 From: ohill <145173879+ohill@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:01:49 -0400 Subject: [PATCH 09/26] change indexer reviewdog configuration to match go-algorand reviewdog configuration --- .github/workflows/reviewdog.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index ed9b2ae76..2aa00504e 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -21,10 +21,11 @@ jobs: with: golangci_lint_version: "v1.53.2" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" - reporter: "github-pr-review" + reporter: "github-pr-check" tool_name: "Lint Errors" level: "error" fail_on_error: true + filter_mode: "nofilter" # Non-Blocking Warnings Section reviewdog-warnings: runs-on: ubuntu-latest From 4eaa96fd41866b866ad90fb6a7fa617e80f1e3bf Mon Sep 17 00:00:00 2001 From: ohill <145173879+ohill@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:09:50 -0400 Subject: [PATCH 10/26] add go_version_file config to reviewdog --- .github/workflows/reviewdog.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 2aa00504e..55c9ccb62 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -19,6 +19,7 @@ jobs: - name: reviewdog-golangci-lint uses: reviewdog/action-golangci-lint@v2.3.1 with: + go_version_file: go.mod golangci_lint_version: "v1.53.2" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" reporter: "github-pr-check" From 0b091e8cfbc23fd923888989d28fc9792a3c225e Mon Sep 17 00:00:00 2001 From: ohill <145173879+ohill@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:23:57 -0400 Subject: [PATCH 11/26] update warnings to remove unnecessary build --- .github/workflows/reviewdog.yml | 56 +++++++-------------------------- 1 file changed, 12 insertions(+), 44 deletions(-) diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 55c9ccb62..8415e7a52 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -10,8 +10,6 @@ jobs: uses: actions/checkout@v3.5.3 with: fetch-depth: 0 # required for new-from-rev option in .golangci.yml - - name: Install libraries - run: sudo apt-get -y -q install libboost-math-dev - name: Install specific golang uses: actions/setup-go@v4.0.1 with: @@ -19,6 +17,7 @@ jobs: - name: reviewdog-golangci-lint uses: reviewdog/action-golangci-lint@v2.3.1 with: + github_token: ${{ secrets.GITHUB_TOKEN }} go_version_file: go.mod golangci_lint_version: "v1.53.2" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" @@ -35,50 +34,19 @@ jobs: uses: actions/checkout@v3.5.3 with: fetch-depth: 0 # required for new-from-rev option in .golangci.yml - - name: Install libraries - run: sudo apt-get -y -q install libboost-math-dev - name: Install specific golang uses: actions/setup-go@v4.0.1 with: go-version: '1.20.14' - - name: Add bin to PATH - run: | - echo "$GITHUB_WORKSPACE/bin" >> $GITHUB_PATH - echo "$RUNNER_WORKSPACE/$(basename $GITHUB_REPOSITORY)/bin" >> $GITHUB_PATH - - name: Create folders for golangci-lint - run: mkdir -p cicdtmp/golangci-lint - - name: Check if custom golangci-lint is already built - id: cache-golangci-lint - uses: actions/cache@v3.3.1 + - name: reviewdog-golangci-lint + uses: reviewdog/action-golangci-lint@v2.3.1 with: - path: cicdtmp/golangci-lint/golangci-lint-cgo - key: cicd-golangci-lint-cgo-v0.0.2 - - - name: Build custom golangci-lint with CGO_ENABLED - if: steps.cache-golangci-lint.outputs.cache-hit != 'true' - run: | - cd cicdtmp/golangci-lint - git clone https://github.com/golangci/golangci-lint.git . - git checkout tags/v1.53.2 - CGO_ENABLED=true go build -trimpath -o golangci-lint-cgo ./cmd/golangci-lint - ./golangci-lint-cgo --version - cd ../../ - - name: Install reviewdog - run: | - curl -sfL https://raw.githubusercontent.com/reviewdog/reviewdog/v0.14.1/install.sh | sh -s - reviewdog --version - - name: Run golangci-lint with reviewdog - env: - REVIEWDOG_GITHUB_API_TOKEN: ${{ secrets.GITHUB_TOKEN }} - run: > - ./cicdtmp/golangci-lint/golangci-lint-cgo run - --out-format line-number - -c .golangci-warnings.yml - --allow-parallel-runners - | reviewdog - -f=golangci-lint - -name="Lint Warnings" - -reporter=github-check - -filter-mode=added - -fail-on-error=false - -level=warning + github_token: ${{ secrets.GITHUB_TOKEN }} + go_version_file: go.mod + golangci_lint_version: "v1.53.2" + golangci_lint_flags: "-c .golangci-warnings.yml --allow-parallel-runners" + reporter: "github-pr-check" + tool_name: "Lint Warnings" + level: "warning" + fail_on_error: false + filter_mode: "added" From 3c3447ba6b0184f2ec7132c2f99f80a78a751620 Mon Sep 17 00:00:00 2001 From: ohill <145173879+ohill@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:39:27 -0400 Subject: [PATCH 12/26] fix reviewdog warnings --- config/datadir.go | 5 ++--- util/test/account_testutil.go | 2 +- util/util.go | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/config/datadir.go b/config/datadir.go index 644e53b3c..68014d750 100644 --- a/config/datadir.go +++ b/config/datadir.go @@ -2,7 +2,6 @@ package config import ( "fmt" - "io/ioutil" "os" "path/filepath" "strings" @@ -29,7 +28,7 @@ func algodStat(netpath string) (lastmod time.Time, err error) { func AlgodArgsForDataDir(datadir string) (netAddr string, token string, lastmod time.Time, err error) { netpath, tokenpath := algodPaths(datadir) var netaddrbytes []byte - netaddrbytes, err = ioutil.ReadFile(netpath) + netaddrbytes, err = os.ReadFile(netpath) if err != nil { err = fmt.Errorf("%s: %v", netpath, err) return @@ -39,7 +38,7 @@ func AlgodArgsForDataDir(datadir string) (netAddr string, token string, lastmod netAddr = "http://" + netAddr } - tokenBytes, err := ioutil.ReadFile(tokenpath) + tokenBytes, err := os.ReadFile(tokenpath) if err != nil { err = fmt.Errorf("%s: %v", tokenpath, err) return diff --git a/util/test/account_testutil.go b/util/test/account_testutil.go index 9b45e1177..d7b91358a 100644 --- a/util/test/account_testutil.go +++ b/util/test/account_testutil.go @@ -1,9 +1,9 @@ package test import ( + "crypto/rand" "crypto/sha512" "fmt" - "math/rand" "github.com/algorand/indexer/v3/util" diff --git a/util/util.go b/util/util.go index 685763a5b..3a31af583 100644 --- a/util/util.go +++ b/util/util.go @@ -4,7 +4,6 @@ import ( "errors" "fmt" "io" - "io/ioutil" "os" "path/filepath" "strings" @@ -233,7 +232,7 @@ func ReadGenesis(in io.Reader) (sdk.Genesis, error) { if in == nil { return sdk.Genesis{}, fmt.Errorf("ReadGenesis() err: reader is nil") } - gbytes, err := ioutil.ReadAll(in) + gbytes, err := io.ReadAll(in) if err != nil { return sdk.Genesis{}, fmt.Errorf("ReadGenesis() err: %w", err) } From 59d624d6eed142076f9c576a9dfa255fd962f008 Mon Sep 17 00:00:00 2001 From: ohill <145173879+ohill@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:57:53 -0400 Subject: [PATCH 13/26] fix reviewdog error --- .github/workflows/reviewdog.yml | 2 -- util/test/account_testutil.go | 5 ++++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 8415e7a52..2cddb2cfc 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -17,7 +17,6 @@ jobs: - name: reviewdog-golangci-lint uses: reviewdog/action-golangci-lint@v2.3.1 with: - github_token: ${{ secrets.GITHUB_TOKEN }} go_version_file: go.mod golangci_lint_version: "v1.53.2" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" @@ -41,7 +40,6 @@ jobs: - name: reviewdog-golangci-lint uses: reviewdog/action-golangci-lint@v2.3.1 with: - github_token: ${{ secrets.GITHUB_TOKEN }} go_version_file: go.mod golangci_lint_version: "v1.53.2" golangci_lint_flags: "-c .golangci-warnings.yml --allow-parallel-runners" diff --git a/util/test/account_testutil.go b/util/test/account_testutil.go index d7b91358a..876d6e1cc 100644 --- a/util/test/account_testutil.go +++ b/util/test/account_testutil.go @@ -58,7 +58,10 @@ func DecodeAddressOrPanic(addr string) sdk.Address { // This is necessary to ensure the hash of any two txns used in tests are never the same. func ArbitraryString() []byte { arb := make([]byte, config.MaxTxnNoteBytes) - rand.Read(arb) + _, err := rand.Read(arb) + if err != nil { + panic("rand.Read error") + } return arb } From 3ed7cb32d98fde36a53e5d878a68d5dabe1a5ba7 Mon Sep 17 00:00:00 2001 From: Jason Paulos Date: Mon, 29 Apr 2024 13:43:49 -0400 Subject: [PATCH 14/26] Add unit tests for absenteeism --- api/handlers_test.go | 6 ++++++ .../proposer_incentives_block.block | Bin 0 -> 1040 bytes .../proposer_incentives_block_response.json | 1 + idb/postgres/internal/encoding/encoding_test.go | 9 +++++++-- 4 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 api/test_resources/proposer_incentives_block.block create mode 100644 api/test_resources/proposer_incentives_block_response.json diff --git a/api/handlers_test.go b/api/handlers_test.go index 431c62b59..36459e38d 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -1250,6 +1250,12 @@ func TestFetchBlock(t *testing.T) { blockOptions: idb.GetBlockOptions{Transactions: true}, expected: loadBlockFromFile("test_resources/stpf_block_high_index_response.json"), }, + { + name: "Proposer and Incentives Block", + blockBytes: loadResourceFileOrPanic("test_resources/proposer_incentives_block.block"), + blockOptions: idb.GetBlockOptions{Transactions: true}, + expected: loadBlockFromFile("test_resources/proposer_incentives_block_response.json"), + }, } for _, tc := range testcases { diff --git a/api/test_resources/proposer_incentives_block.block b/api/test_resources/proposer_incentives_block.block new file mode 100644 index 0000000000000000000000000000000000000000..a7f93778486d2fb58bd45c3d14242de6a0ddd937 GIT binary patch literal 1040 zcmZo#nv|2DoPCc$a8Xj`Iffb28WyD`GcHL>O)Wm6z<%qrckaB4jvGtM_PWk`<|ONp zyZFj`CHEtoi>K|-Tco%+JvDE6NosM4Zkget^o%14@8&AY)fAjvTe4|aQ?PZ7O2@t< zYg#^k$(3lEwaY?Bvu;&EVo^zHK}up$@x&tvjEoF;!IFZa)UqQA&o1mqT>4(wg59X| zic@CCv(umBwtH574H8?k=Fi2IvYbl`itBaZz51_Ohb#)yB9@d1x%Ptpa)Ei+Vp>njSD9bcjN;4lBYue18(9?f4|Tu{=;(6}(~EEB_` zlH{|@uNRdRpG(ufb$(e%MV^tV*%1X<&Tqezl_MGheHT3a@x8OGE?eWd;;-&3gLUQ5;pYbPr)7Jb?t z&N*?(vedj}u)?RQO_lq9gyz3{ebv?ZyHJ*g%EVy#6p0-T7LFo|#kSQi%?FuEWEd?e zE=et5T2hu@k~*<@NpewYO5>t}v?Br2bvs?|&0npxh57r1&r`kHPB$6dl>YwR(pXAx zuFaOsA%}M-*v>e^nU-+=&Y{$w_l_L=s&;$E#dF+eo~ph3X5sxYgLzv`=R<=z#lKEm zYdWIGwYWGly=@`TRqgRFuWE1D-W5hbMWpDqEy#J(;kFbIZOs#nncim!wZt=z6J@ZJPTlXp{eLj%Pxx-q7+EGjTMqVQSkUwXD*Q-8<8|vzp z=1nQywf1P>BmpO8PN9D(^#@n1bbZFowx|GT2;O8)gyce?88d_Aa)OONtQTmO*knCV zv|xYKtOb|NwFLs#a=t$`ebU9VEQKGf7bQyUj(nApRG@N8f5X~lCym2rPR!HsSD$=~ Nb#ZYXFzph`82}Sf;Di7G literal 0 HcmV?d00001 diff --git a/api/test_resources/proposer_incentives_block_response.json b/api/test_resources/proposer_incentives_block_response.json new file mode 100644 index 000000000..c71c3db25 --- /dev/null +++ b/api/test_resources/proposer_incentives_block_response.json @@ -0,0 +1 @@ +{"bonus":10000000,"fees-collected":1,"genesis-hash":"7p0jHnxwza10srqCUzt8JIi+xKyE8/RtGIaaujgsKX4=","genesis-id":"test-v1","participation-updates":{"absent-participation-accounts":["AEAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAM3LMI3A"]},"previous-block-hash":"5tC8YaXvIzgHMonUQmmI5svzXrdJefVSFqys/NGpHQk=","proposer":"D4FDFGXJXTBLFYSBVLJOUC5VVPQSH7KZBVCKQ6XIWBEHYM6YRI2U6PGB4A","rewards":{"fee-sink":"A7NMWS3NT3IUDMLVO26ULGXGIIOUQ3ND2TXSER6EBGRZNOBOUIQXHIBGDE","rewards-calculation-round":500000,"rewards-level":0,"rewards-pool":"7777777777777777777777777777777777777777777777777774MSJUVU","rewards-rate":0,"rewards-residue":0},"round":43,"seed":"i767QeAMNYxi0EG0mCT7LyERdseoIeD9D571mo4e4p8=","state-proof-tracking":[{"next-round":512,"online-total-weight":0,"type":0}],"timestamp":1714412239,"transactions":[],"transactions-root":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","transactions-root-sha256":"HQn2+iMjWIFRTaDl+PeJdn5rKOch+otqMK5/Gao+puc=","txn-counter":1003,"upgrade-state":{"current-protocol":"future","next-protocol-approvals":0,"next-protocol-switch-on":0,"next-protocol-vote-before":0},"upgrade-vote":{"upgrade-approve":false,"upgrade-delay":0}} \ No newline at end of file diff --git a/idb/postgres/internal/encoding/encoding_test.go b/idb/postgres/internal/encoding/encoding_test.go index 77c8c1223..50ca9ff76 100644 --- a/idb/postgres/internal/encoding/encoding_test.go +++ b/idb/postgres/internal/encoding/encoding_test.go @@ -230,12 +230,14 @@ func TestBlockHeaderEncoding(t *testing.T) { }, ParticipationUpdates: sdk.ParticipationUpdates{ ExpiredParticipationAccounts: []sdk.Address{newaddr()}, + AbsentParticipationAccounts: []sdk.Address{newaddr()}, }, + Proposer: newaddr(), } buf := EncodeBlockHeader(header) - template := `{"fees":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","partupdrmv":["%s"],"prev":"BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","rnd":3,"rwd":"AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}` + template := `{"fees":"AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","partupdabs":["AQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJVBPJXY"],"partupdrmv":["%s"],"prev":"BQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","prp":"AUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAITAR5VI","rnd":3,"rwd":"AgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="}` expectedString := fmt.Sprintf(template, "AMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANVWEXNA") assert.Equal(t, expectedString, string(buf)) @@ -539,6 +541,9 @@ func TestLcAccountDataEncoding(t *testing.T) { TotalAssets: 13, TotalBoxes: 20, TotalBoxBytes: 21, + LastHeartbeat: 22, + LastProposed: 23, + IncentiveEligible: true, }, VotingData: sdk.VotingData{ VoteID: voteID, @@ -551,7 +556,7 @@ func TestLcAccountDataEncoding(t *testing.T) { } buf := EncodeTrimmedLcAccountData(ad) - expectedString := `{"onl":1,"sel":"DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","spend":"BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","stprf":"EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","tapl":11,"tapp":10,"tas":13,"tasp":12,"tbx":20,"tbxb":21,"teap":9,"tsch":{"nbs":8,"nui":7},"vote":"DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","voteFst":16,"voteKD":18,"voteLst":17}` + expectedString := `{"ie":true,"lhb":22,"lpr":23,"onl":1,"sel":"DwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","spend":"BgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","stprf":"EwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==","tapl":11,"tapp":10,"tas":13,"tasp":12,"tbx":20,"tbxb":21,"teap":9,"tsch":{"nbs":8,"nui":7},"vote":"DgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=","voteFst":16,"voteKD":18,"voteLst":17}` assert.Equal(t, expectedString, string(buf)) decodedAd, err := DecodeTrimmedLcAccountData(buf) From dcf3a3b0bfd235dda3d68e124de5ab6a1f27a9b9 Mon Sep 17 00:00:00 2001 From: Gary <982483+gmalouf@users.noreply.github.com> Date: Thu, 9 May 2024 08:55:35 -0400 Subject: [PATCH 15/26] Bump golang version to 1.21.10, go-algorand-sdk to v2.5.0 (#1612) * Bump golang version to 1.21.10 * Bump go-algorand-sdk to v2.5.0. * Remove non-functioning linters. --- .circleci/config.yml | 4 ++-- .github/workflows/reviewdog.yml | 12 ++++++------ .golangci-warnings.yml | 6 ------ .../docker/indexer-filtered/e2e-read/Dockerfile | 2 +- .../docker/indexer-filtered/e2e-write/Dockerfile | 2 +- e2e_tests/docker/indexer/Dockerfile | 2 +- go.mod | 6 ++++-- go.sum | 12 ++++++++++-- monitoring/Dockerfile-indexer | 2 +- 9 files changed, 26 insertions(+), 22 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b336cd1ce..a1e3e1fce 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -18,7 +18,7 @@ workflows: name: test_with_go_<< matrix.go_version >> matrix: &go-version-matrix parameters: - go_version: ["1.20.14"] + go_version: ["1.21.10"] circleci_build_and_test_nightly: triggers: @@ -33,7 +33,7 @@ workflows: context: lamprey-secrets matrix: &go-version-matrix parameters: - go_version: ["1.20.14"] + go_version: ["1.21.10"] - indexer_vs_algod_nightly: name: nightly_test_indexer_vs_algod context: lamprey-secrets diff --git a/.github/workflows/reviewdog.yml b/.github/workflows/reviewdog.yml index 2cddb2cfc..914c95eff 100644 --- a/.github/workflows/reviewdog.yml +++ b/.github/workflows/reviewdog.yml @@ -13,12 +13,12 @@ jobs: - name: Install specific golang uses: actions/setup-go@v4.0.1 with: - go-version: '1.20.14' + go-version: '1.21.10' - name: reviewdog-golangci-lint - uses: reviewdog/action-golangci-lint@v2.3.1 + uses: reviewdog/action-golangci-lint@v2.6.1 with: go_version_file: go.mod - golangci_lint_version: "v1.53.2" + golangci_lint_version: "v1.58.0" golangci_lint_flags: "-c .golangci.yml --allow-parallel-runners" reporter: "github-pr-check" tool_name: "Lint Errors" @@ -36,12 +36,12 @@ jobs: - name: Install specific golang uses: actions/setup-go@v4.0.1 with: - go-version: '1.20.14' + go-version: '1.21.10' - name: reviewdog-golangci-lint - uses: reviewdog/action-golangci-lint@v2.3.1 + uses: reviewdog/action-golangci-lint@v2.6.1 with: go_version_file: go.mod - golangci_lint_version: "v1.53.2" + golangci_lint_version: "v1.58.0" golangci_lint_flags: "-c .golangci-warnings.yml --allow-parallel-runners" reporter: "github-pr-check" tool_name: "Lint Warnings" diff --git a/.golangci-warnings.yml b/.golangci-warnings.yml index d67544f20..f8ad9135a 100644 --- a/.golangci-warnings.yml +++ b/.golangci-warnings.yml @@ -6,10 +6,7 @@ linters: disable-all: true enable: - staticcheck - - structcheck - typecheck - - varcheck - - deadcode - gosimple - unused @@ -48,9 +45,6 @@ issues: - path: _test\.go linters: - staticcheck - - structcheck - typecheck - - varcheck - - deadcode - gosimple - unused diff --git a/e2e_tests/docker/indexer-filtered/e2e-read/Dockerfile b/e2e_tests/docker/indexer-filtered/e2e-read/Dockerfile index fcd16c38c..8d319fde7 100644 --- a/e2e_tests/docker/indexer-filtered/e2e-read/Dockerfile +++ b/e2e_tests/docker/indexer-filtered/e2e-read/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.14.7 +ARG GO_IMAGE=golang:1.21.10 FROM $GO_IMAGE RUN echo "Go image: $GO_IMAGE" diff --git a/e2e_tests/docker/indexer-filtered/e2e-write/Dockerfile b/e2e_tests/docker/indexer-filtered/e2e-write/Dockerfile index 0fafe996a..ecd26f90f 100644 --- a/e2e_tests/docker/indexer-filtered/e2e-write/Dockerfile +++ b/e2e_tests/docker/indexer-filtered/e2e-write/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.14.7 +ARG GO_IMAGE=golang:1.21.10 FROM $GO_IMAGE ARG CHANNEL=stable ARG CI_E2E_FILENAME diff --git a/e2e_tests/docker/indexer/Dockerfile b/e2e_tests/docker/indexer/Dockerfile index 9179c899e..bb10acf8d 100644 --- a/e2e_tests/docker/indexer/Dockerfile +++ b/e2e_tests/docker/indexer/Dockerfile @@ -1,4 +1,4 @@ -ARG GO_IMAGE=golang:1.20.14 +ARG GO_IMAGE=golang:1.21.10 FROM $GO_IMAGE ARG CHANNEL=stable diff --git a/go.mod b/go.mod index 7a97e654d..4b6b7a859 100644 --- a/go.mod +++ b/go.mod @@ -1,10 +1,12 @@ module github.com/algorand/indexer/v3 -go 1.20 +go 1.21 + +toolchain go1.21.10 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b + github.com/algorand/go-algorand-sdk/v2 v2.5.0 github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index d3215f18b..320f1feba 100644 --- a/go.sum +++ b/go.sum @@ -70,8 +70,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 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-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b h1:blz1WkFP1ZrQFI79hqmoc/Z3aeThPYDcl85Vq4qOt/g= -github.com/algorand/go-algorand-sdk/v2 v2.2.1-0.20240424151847-7914b596ba9b/go.mod h1:Xk569fTpBTV0QtE74+79NTl6Rz3OC1K3iods4uG0ffU= +github.com/algorand/go-algorand-sdk/v2 v2.5.0 h1:7XgFrbH9V3Zz/t1916ruBiWrR4Oq1U4UsiwyQSlmt38= +github.com/algorand/go-algorand-sdk/v2 v2.5.0/go.mod h1:4ayerzjoWChm3kuVhbgFgURTbaYTtlj0c41eP3av5lw= 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/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= @@ -93,6 +93,7 @@ github.com/aws/aws-lambda-go v1.13.3/go.mod h1:4UKl9IzQMoD+QF79YdCuzCwp8VbmG4VAQ github.com/aws/aws-sdk-go v1.27.0/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g= github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= +github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= @@ -109,6 +110,7 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= @@ -266,6 +268,7 @@ github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0= @@ -494,6 +497,7 @@ github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzp github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/maxatome/go-testdeep v1.11.0 h1:Tgh5efyCYyJFGUYiT0qxBSIDeXw0F5zSoatlou685kk= +github.com/maxatome/go-testdeep v1.11.0/go.mod h1:011SgQ6efzZYAen6fDn4BqQ+lUR72ysdyKe7Dyogw70= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= @@ -510,6 +514,7 @@ github.com/mitchellh/mapstructure v1.4.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6 h1:dcztxKSvZ4Id8iPpHERQBbIJfabdt4wUm5qy3wOL2Zc= +github.com/moby/term v0.0.0-20210619224110-3f7ff695adc6/go.mod h1:E2VnQOmVuvZB6UYnnDB0qG5Nq/1tD9acaOpo6xmt0Kw= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= @@ -518,6 +523,7 @@ github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjY github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nats-io/jwt v0.3.0/go.mod h1:fRYCDE99xlTsqUzISS1Bi75UBJ6ljOJQOAAu5VglpSg= @@ -717,6 +723,7 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -1232,6 +1239,7 @@ 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= gotest.tools/v3 v3.0.3 h1:4AuOwCGf4lLR9u3YOe2awrHygurzhO/HeQ6laiA6Sx0= +gotest.tools/v3 v3.0.3/go.mod h1:Z7Lb0S5l+klDB31fvDQX8ss/FlKDxtlFlw3Oa8Ymbl8= honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/monitoring/Dockerfile-indexer b/monitoring/Dockerfile-indexer index 80d0ab15d..d2cf3597a 100644 --- a/monitoring/Dockerfile-indexer +++ b/monitoring/Dockerfile-indexer @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.20.14 +ARG GO_VERSION=1.21.10 FROM golang:$GO_VERSION ENV DEBIAN_FRONTEND noninteractive From ef8395b56d0eb8e596422bf0ff7e95bab480dd9c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 May 2024 14:23:25 -0400 Subject: [PATCH 16/26] build(deps): bump golang.org/x/net from 0.21.0 to 0.23.0 (#1604) Bumps [golang.org/x/net](https://github.com/golang/net) from 0.21.0 to 0.23.0. - [Commits](https://github.com/golang/net/compare/v0.21.0...v0.23.0) --- updated-dependencies: - dependency-name: golang.org/x/net 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 | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4b6b7a859..f6002b5e6 100644 --- a/go.mod +++ b/go.mod @@ -89,7 +89,7 @@ require ( go.uber.org/multierr v1.7.0 // indirect go.uber.org/zap v1.24.0 // indirect golang.org/x/crypto v0.21.0 // indirect - golang.org/x/net v0.21.0 // indirect + golang.org/x/net v0.23.0 // indirect golang.org/x/sync v0.1.0 // indirect golang.org/x/sys v0.18.0 // indirect golang.org/x/text v0.14.0 // indirect diff --git a/go.sum b/go.sum index 320f1feba..c41b5c35d 100644 --- a/go.sum +++ b/go.sum @@ -844,8 +844,8 @@ golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.23.0 h1:7EYJ93RZ9vYSZAIb2x3lnuvqO5zneoD6IvWjuhfxjTs= +golang.org/x/net v0.23.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= From 5fdba20d4ca977167e5b87f19a36f3820d12e177 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 May 2024 14:43:01 -0400 Subject: [PATCH 17/26] --- (#1614) updated-dependencies: - dependency-name: requests dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- misc/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/misc/requirements.txt b/misc/requirements.txt index e631e80b1..611315496 100644 --- a/misc/requirements.txt +++ b/misc/requirements.txt @@ -5,4 +5,4 @@ py-algorand-sdk >=1.3.0,<2 pytest==6.2.5 GitPython==3.1.41 PyYAML==6.0 -requests==2.31.0 \ No newline at end of file +requests==2.32.0 \ No newline at end of file From b019536450a315f30d2e189994cec9d2834225fb Mon Sep 17 00:00:00 2001 From: Jason Paulos Date: Thu, 23 May 2024 11:38:09 -0400 Subject: [PATCH 18/26] Add account min balance field (#1596) * Add account min balance field * Update test resource boxes.json to expect min_balance field to be present/set. * Add unit test for minBalance calculation inspired by go-algorand. --------- Co-authored-by: Gary Malouf <982483+gmalouf@users.noreply.github.com> --- accounting/rewind.go | 3 + api/generated/common/routes.go | 275 ++++++++++++------------- api/generated/common/types.go | 5 + api/generated/v2/routes.go | 357 +++++++++++++++++---------------- api/generated/v2/types.go | 5 + api/indexer.oas2.json | 5 + api/indexer.oas3.yml | 5 + api/test_resources/boxes.json | 65 ++++-- idb/postgres/postgres.go | 21 +- types/min_balance.go | 84 ++++++++ types/min_balance_test.go | 175 ++++++++++++++++ 11 files changed, 657 insertions(+), 343 deletions(-) create mode 100644 types/min_balance.go create mode 100644 types/min_balance_test.go diff --git a/accounting/rewind.go b/accounting/rewind.go index de8895c80..cfc6cdcf7 100644 --- a/accounting/rewind.go +++ b/accounting/rewind.go @@ -178,6 +178,9 @@ func AccountAtRound(ctx context.Context, account models.Account, round uint64, d acct.PendingRewards = 0 acct.Amount = acct.AmountWithoutPendingRewards + // MinBalance is not supported. + acct.MinBalance = 0 + // TODO: Clear out the closed-at field as well. Like Rewards we cannot know this value for all accounts. //acct.ClosedAt = 0 diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 5c1233eca..bf1f44d7f 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -117,143 +117,144 @@ var swaggerSpec = []string{ "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", - "75avVqCzHoP5/wEAAP//Z01abaXfAAA=", + "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", + "+ge3+k7gAAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/common/types.go b/api/generated/common/types.go index 8877540cf..3a0e083ca 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -127,6 +127,11 @@ type Account struct { // LastProposed The round in which this account last proposed the block. LastProposed *uint64 `json:"last-proposed,omitempty"` + // MinBalance MicroAlgo balance required by the account. + // + // The requirement grows based on asset and application usage. + MinBalance uint64 `json:"min-balance"` + // Participation AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 6ffd25359..14159f619 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1257,184 +1257,185 @@ var swaggerSpec = []string{ "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", - "X9HFgqnMzowwPzl5PPn0/wIAAP//csXxQ8d9AQA=", + "iH3D64GnHgBCwFNHMAoe3x32EPYsPdeKi8xtXcIR1PMvYXc9g+rdAuOrBHDh9xWDAAZ5Zc/FQiGd733P", + "s7y2ImgatIoqw3NejbO7ISBvW33sILt4tyS3JuddpqzHPyVBxsaZXXN/plqj17Zdl3/s/Ogo9wDUJwRc", + "1dwmzUpw5A6RU3jeVIGHuV8qRhINgaOH2GM/eXvt8aVbUu0vHsRJ+HdiFMc6QMwa9LV0NMLfWO7gdt6S", + "XdKhnR72jQPf8K67G7AQ/TgH71SKkaDeJ847wnnvN/uvpXd1WVpqU4sLIa+sOLOPf9t0gle+D/ClBDYF", + "P3vEcCA+0NHRWDj+Pp8D/cgIF4W9RCB0UOPDVmTOMTqgocmWli/sjyd2AItddoDRI6TQ1g0JHLaUJQ5M", + "fpLx/ROLfYAUjMO7Qv3Y8MBEf7O0FA5sOnDs6E/PRRrjcn/LrZzQ4ooAMIg1mjEm0C2fcDEllpRd0tKS", + "MiORNQ2DpEWthy0pyTHu+tGQCJbWEOGKgHPZa03I61xnNTH774FOyyZbIJ7JdQaxe31YIQSvqrJAxKQo", + "Nxjp0pXTYQS7HpkDhngv5Qu2wSAbCPuCWwIaWUc/ZqyUltOXPQxrDmoH8DcF/IDQbGfwU9isAfWQ827Q", + "bkuo1s6pB/jrIbR7CDh0AwC6+vfgXO00PDuVMm1Wpv/wN6/htHFmR4qcJiNDV7GP8G0sSp7iwP721XjB", + "p/Vtl/tJKutarQg2mTk9VCQLpV4/S45yKTQTuoZoSCNzWZ70tHSalQzEiKzFkGUXLBHk9d43jvR25CGf", + "W/n8USQdKLbg2rBWnGKIP2jCKzYQ21dRY5iyw//vh/9x9vFp9t80+/1x9pf///TXP7799Oir3o9PPv3w", + "w/9t//TNpx8e/ce/TQaeZWbZbTlPr+mdlOHhg8YEGreWdudQX0rDMpD7sktapsx7L0EoTHJarYMkGEzL", + "B3TuMNEF22QFL+s0Lv4UqKCuZ0CpuSCMWkpITb4Ebro1o22zZTaQfwZW9ZoebFEj0FnZo28P/IXgdYee", + "brvECWRKHXv/cAb3cQtZA87oBSvReDmc9QIvWmEbnmwzHPQuRuHH3iYtRlAMvzw4UnItbX/Q4VWAJR34", + "Fm6iuFvdW9FYHdBVCJmNWdArGpRct67riVcX63vcKGkVi/t4g+X1hx+7vGR6onHeDnBg+6gskQHq4RTc", + "FTfYDnyK7CL9x9WKEdoJHHhBIuYS49FFl8ns4FkIKx53Fp5XcFHOsg4v4XZe9nA4xxLCFq49hX5kruQK", + "Lluf14wVkAN6iRbWNU9LZ1aXNqmPL5ZegoCy0w7MaPk3tvnFtoVTtb09hzn2ljRqGi/leYnjRkdzM5tX", + "CvPdiDsxH4MWhtAeEuygbaJlod7zBpRyoVMxfosmJDbGghmzQjFbs7w2jdqzo1wP+v+75QG7hoR0+GLk", + "c4BJnrZzCrA/bqwdJ/Y2kMfbPDBaVUpe0jJzttwkNYcW3tp7x7xW+kJ9+OvT128dxGBAZFRlQdZILwQa", + "NTLGvV2LZTXkDmMwKKK8AqD7pDtjLtctA/AVpJToiK6WeXJYhBvTGPGja+oMwnPPau9p3nVOBrjEbc4G", + "jcIHfQ3a/gX0kvLSq+w9jOmnApfUuHLs/VrEA9zYTyHyK8kOSv97lzd9E3YQmniGLRkjVpi3RBPpMkM0", + "h2WFUTAKAFqu6MZiC6pl+xRH1CvQ7GS65CmzWFtdSaDVgDxrh7JP67ZB7Hc9QifWASsaPLl93s9/aLdm", + "0jm71YL/VjPCCyaM/aTgznWuob11PoHWtaWXhAUbE23dofwCE+4jubi8PTdaXBjlOvKLlU8S1kQ8Nbee", + "cHY3kWMaFW6fjwMgtgsxsRNRD9wXQTXpsShYGKhomZH38C6MZ+yxDQOegdG9E9zZOa5xKrvTaXpByeV1", + "StOHveSgOE3UjaQfnc2V/D3lRXvVnzaaEHulBx0tvXTuyYAUwzvp7q5xRCHB1k1BClLvjYHqvo7BttHk", + "WG0OZ/CSDfHdsQ2m7ZI6QMjhvkEYCFXn57+iYOntvFTgBXsOuVpbIk/6msYOyqc4fnNNHcx9fQS9mtH8", + "IrGYxiuwZYk2kvhOIWVa+3ROSORgGNq67GMVUytu2uS+kaiuy9nitKN52oaFBWyKmVeXe7HUMjFMLa6o", + "MD6HnCNgrrdmaNKxva6k0gayWSZXWbCcr2g5YN5rCGTBFxyTvtWaRSnLXH9SSS4MIk3BdVXSDbpbNjvy", + "ak4eTyPi5Q6h4Jdc81nJoMXX2GJGNfAijYbJd7GrYsIsNTR/MqL5shaFYoVZumx6WpIgdICCJnh+zJi5", + "YkyQx9Du67+Qh+Dlovkle2Q3z/GUk7Ov/wIWRvzjcZqWQ97RQdrqSXoaa8GnB7vaR9ENlqa1mGd7rzuD", + "XcbcGGjpCP7uG7Oigi5S2b62wIJ9Grt+Zx9EgSkzgWUi3KTnZYZaqpMtqV6m0hPncrXiZuX8HbRcWWxp", + "EmLhXH4UtOkjuQ7g+I/ggVyRtHLtbjU+6VzMP9EVa2/ilFBNdG1BbZRWjridEJcKrsBcnI02EbYEUzqj", + "RxrqfOdRwuXazLN/J/mSKppbUnYyBGU2+/7bPqTPIF8egfzQrMC5xgN+59utmGbqctxF82yS60MeCimy", + "lSUPxSNHqdt3btCdKU2Wuw4n24ccyyPZUbLtWEUjKnsj/BJbBrwhxoVl7IV2e6/szhGwVgls+Pnda8cP", + "rKRibd3qzMcUtTgLxYzi7BJCL9JnY8e84RGoctTm3wT6z2tD98xhxED5G5ti1THQvL8dzn89LHtI6JXy", + "4oKxiovFKfpvAzONo3bZ6JkU9YDGspKWd+K0JNCIVHRjdzmwoFt8w+eM6SyXZcnypIzaib6yzUlFOV6b", + "OMOmd3zcMteCCaa5HnjOz88/LpZWQrGf7UscaVkwIAB97vTdX1EP+ECE/YIJC/erF7ug7g3cdqvAUKed", + "OpyWP9jPro8dzKXvzWDe4V227Sy8b326X4TTtr/7rXUxDGoAsd3XQL+72DVW+e8HyvBqDIWjmpqWPrYT", + "sHvOlCtg0gIHdDBQYoIxorm42OmbvzNdxTvXdtip/vz8oxKFPbnnLnwOfaTadmw8zCsKdgkmigb6fEn5", + "gE+qZiw9of1gZ3wvleHotMPYZ3bgM4rmF0kF5Af7RQcnPvS0j9z59OhALrBGvLV9PvjZUsZYvmLa0FWV", + "3Duj7c7hWwDvit2+0MUSTM1yKQptMShnhFVSL3dlFNDpqdYCJiu5Rl4npsy5VJh9FnhXIzvR3mO3ZGtc", + "exvGTElphgC1cLYSEkhpCK3N0j5hPo6AQa2A7kow+g3kVhEFPZE3lsvweXtpWW6mhJsHOI5ynp2UrJi6", + "KBkxijFytZSakZLRS9YUFYHRHmjyYc0LDSVDSrbmuVwoWi15TqQqmMJqM7Y5yNLYyc33+IS4qF4XB/Fh", + "LWB5obhBvE5cpo9eCRateMVTZOG6P0OtB83KS6ZPyIcriUDoJreBttxvq8esNhgzWPD5nAH1gOWAKA79", + "mg8RTFAeBUINwrBuTXdPA3oYluklffLd90OI9uS771O49v7Hp0+++95ywlQQWq95yanaxM1sqymZ1bw0", + "LtE2JZcsN1LFGgcutGG06OEWaqPcLMDLzGuROze00CUuYvP+x6ffff3k/zz57nunvopm8VHQLsCOiUuu", + "pLCfvMIwYIibMszG1lybz8AtmbXIQF5Over2aHI4lrV4jo2IC7xom3M7JGyF+il/8UtWLJiaNg+xpatN", + "zhEr3EkVccBzhiFi9l3kwihZ1DnDTBfvW3QjAov3QArlEyJ3G7jrvopQA6fXpAaehZBXIAE/RoFMyPYK", + "4Y6xS6YwpqcZ6CE+DhFc2lAFfkrgtuSWyopH6ae9rhaKFmycFwI8Vj9jj5C4wY9wKfcb4BfbvitgtWSA", + "FmedZmCjQA7Lo8RvburN2UIlBuW3d0MRlC+xMo9iJYa6QWUUaDvtSWdzxjLLCCYx3kpNkIArz1llMT2u", + "RMmYfWvwpsNdhgp5nmkLQdAYhJfWYAFMWU7LvC5RlNjCQl7ltARLUIPYJZsbaXEvrrTVmAK4nWsGHuJY", + "UgTnU/YNi3pA2qhLpjauBWpefAUPe29Ux3WnzypnJbtkZRJwRhXwDj/KK7KiYhPOwk7RgDGNIuMC5MgE", + "g4cInvbPTikUgY/3zCHkdiDtUQxsbhGfc8UUlwXPCRf/Yu6ix6IDYAyWApLCcFFD8SfFGrjxqScQotsN", + "w+1jgEq6FFu4qGEWsCaKQ7Cr1mkXkaDQDobQhl4wBNsHEzvuZuyZKqZ5UachmyuatyHbDxnd5X1HDTtV", + "4Wj1gfCyQ7zCJd926bq43EGbzmn1d2mQTrXo8hhiRUPEF3E0POEs7jJQ+ZYDGgNpJDzaUe6WMPYlU7rt", + "hhyZCdh6x9i2RWt8zMvlUxvsP0vm/dH04HwbJMcNznn+GQPvob9Lq5DawYGkZQEAfcVNvsxSgSMOAGxh", + "YXjXFeH7UyJ3AbeQzecsN2NggKgdrIg1CAV+tlC8YLSAiPEm6grjrbqgPPxJEju0jlgeoTkIEg3HA6M8", + "2iOhecCQXcj/ixyJ+y7gHjwhRlwDz+O4s09umWvjkOdViHqnZMM07ErwLo/uCGQmSZt4/aQFK+lm25TQ", + "oD1p4Hm9cRvfHEjgYR8U9GYfDEL2U7t7tm1y26S74HA9+7ciLrXTO0mZcHLzuTRDCJXLSpjw2UzasCwy", + "0xWgsS9XOyWzlkHi7o2Kh0mLkY5r9MEnvW2AL34f4I/uRnxm64ovs+veSVzJr2lEiZLKJlGmCN+jkGiM", + "M4D1++R71FWRHYlNHUuWx6h7sG+pffrrJS0HAi3fsUoxDXoCSj789elr5xQzFG6ZpyMdz88/UmNxCvqR", + "wWRTn6aTgcwQ5+cfZ0AxMe9DOI2+dTHpQ20JEbfd7ede7+u55A0lUY021Pvi9wH6mw8AIxXlztGriTXt", + "76wLOu5Hd48JImsOuLsIF9U7eIV+pHr5kuZGqk0/g6sVrQdS65yff7Tnvc8Wf/19mtxbENKTfIjy97RV", + "ZMH/D3zvPD8k5708PgQS+Syp05z5P62kHyXtCd8n00lPD9CcRZyHOOFntITPmNuQ+Epu/ZMeTNdczLIQ", + "NpKq6DiduHTLcY7ZnaFgXGcrvlDA8qRHHU4THT1RiRcGWe1EWWTH1gzz4h0kbS28A3EDXvQiuJlTCP1K", + "FGzNVGOZedOsrmMpR/URFAbWWaNMTdMmRPa75Q8wDt9OoQ0rtmhr5nteRfT4KS2bNmr88nrjiwzYZJFd", + "Mb5Ypjf27bWGtmz07kO7vPtDSxG4N6D1f2ovJGDkAKGdN2R4azL0iGKDb4AZsN+bJS7/voSkKmZlmGoA", + "XFPsiQj/PrDZ3cpCCUKt+aoq0fnTkZJe7qu9Ek00ASa3H6906KCPWw/fYNf2SDx81MZ1Ydmdkmp7rMbf", + "xXO5qko2zDxXVCD7POfCye1XS2riYureBiTzvFaNEbcbjfELLTlW+dWQxVBIWUHawspwYf8DCRxkbfD/", + "jCr7H3Qqav8PsSrik+xQEzgXSH7lB/KRnJPpBDtPPGYnuaikY1JvU9rprPx5ghM22NIEYwUEJDTZpE9p", + "btD+6Zw1BTNXUl0kxJiZBn1Sy68qLvvap6ZUmbqiKKLQ4EHhUriGrHABNAeZrjV617T8J3bSSrauLK7t", + "D2ChVpcjIQybJ8UlU872IV1OSbRyYJraXsIm4sDbZ00pUn3NBECj3FD6ElpimxsmEVWDad8mUGupWE6O", + "fIX6Lpu52lRGnkIbaHKqjapzo9Frs5mzh5V2o9F5aXf9vC5LYTkBqTnaM43MFLtkdEhND65a7Lea2UMG", + "U51tTMIAqYMdS7S7e4xjp7cWAIldYTBoCh3syo1Plkntnq9o9RFn+ZVk5B1CHEopgEfeSi+q/T23cKgU", + "6JqWJhuUchx/Sd7T0sRshAXI+XkED5nhxLXIwSZHzz+HyGFhuj4K2gWzYhu7f3UNdn+QdsC84aFADqx9", + "pS6Zwljo0ejwi+/xaTq503W8Cze2TxWi9Y1bRbwpEWlIq1j8V3+dmlTJVBQkml8TuBsJX0G4ukwYtblO", + "miG+yHQp91jee754bzvs2FLfrLenpbxiKrPzbjni0psaMd4GW7ZSSYdaLjgeekqwgtjF6OttBA681064", + "Lrv3ohm745RCy1yKrDX73VIdpJcZYFcWshzs2D26au9e5WXrfakWEIkNF4t05kdL6C/Y5n7oEhIex73z", + "BBPvsDIHBI2fgkNDZGS6ckZkNBK2GZ0dVSSsuAacpiuXs+Vemfa9avyLVjxXkoIzRpNymvU4WCfsgS9j", + "2I1tDiZp5TIm5sbOHzYVC065/VI7K1p5eQvkcMsEn9ym0oq8C+7IfY/SXApDORTUSTL36IzLygoIVaMb", + "P7lX6PtL9DJ3fE2270++AgSKDFex/7b9f3/LjGLs7j1cL9gmK/mcGT5gkC7ndiV/Yxvim50cjKcYypHU", + "MviB5qHEmIAm7xORCr8s4EucXoogHYUgae3/0qRghqmVRcWlvCKrOl8C704XzCdYAoMNeJZ3JmqN7jNS", + "tNODufhAXdEcB8Kw/5KqBVPEReKHuiTeALSiHO5J4w3cjc8FRzGaMsbtSvv0BlMBRLQLTKdRDqhEdikP", + "xgXbnKJlEH6/BiEZTiU1ABjklbpFkG6UnirOabYDXy9aRlUs9tVK/hbAP6Bx1cLnVAh7Glf72drGLg/W", + "Adeh1qy/zvHROPHeJkTcZm1jPQP6mztg0N9lxx8o2eLMvUDHoS8B+Mg/v/4nUWzOFOitvvoKhv/qq6nz", + "V/jnk/Zni21ffZV2akrenMP5DYRKAHYMN10SO9oFYDs2VHzkNYbTouOafdCkAJfNsuyEPImCQLIBYE8o", + "RICwUlYs2RqKlcUvKCSAU2xRlxRDfbgQTLU6jcn0g+K/WQun6oI/P6xFqm3MTkLraDtSBUKjKszXq5zb", + "KSeHeZZyyGh03RGbnEjNiJhd5SYjvsSULmFEH2F6kzE/uDF2lHA8P/+oFwLUcl4Zx32WAGCA8YTb2BQy", + "B/gyjz5TUQhnY7/VtHThegKC4z5A2p78ggms4GipnKu+S5jQtXIqQQsrjGdBccPI+DHXTZPr1nIcLgh2", + "fv5R5aj9dR7tLhkEZJ7CrpbNKOzhyO1FVWx7K2IOJaOznC21c7mGPr4YfEV3iV6Axmo1bMPvZIuOI0sg", + "46LvPzB8U7+kKYWezkXYJJXsvMyY//7hqxePCO8WQ4+zPkaC1u5lxyVUxkGEGUZ6sHRzT+4DxZyxoXCe", + "TmAhmbMBVfDW8h12LJAKsY4HtOq6YO+EcmRWhR+phiodrnkTSX8fUym0gCSvXiT5jFZ23L1LQkwnCyXr", + "dOT2QoFpqOsLaoUAYLBQgEfnstMn331PCr5g2pyQf0ByPXx8+3XR2qdJeFNvrVXKkwBgIUErskEuGDGa", + "c+kOtBcczF1QIgxz9yd8nfzk0wnwJZlZpwLcX/V4FlK5CE7ILRrRm5bb+yHC2rkwiiLxzeR8nsy3+3f4", + "vXGLUJ4mK9Y/9RFU+YJtFLsu7/I36BxKjA5TnhIoD9TauR7hKRkdiBwo14nr882TrLlBJ+S17U2YmEtl", + "pepVDZY+tobEfM7gFnOpkL7ONOWhIXOd+J0pCUoDQaQzbHfvWNhsiLKkOfDz2kURWxhCYt2gmHz4HriZ", + "KQL5CGXS/lUjtTAc2R+7jb9Eu1jZh8cC/Y8lLxNYUEn7XcdwTImQRIJzUNwS0xo0WRcRZhcW3kKku73m", + "cTrxIm3qt5gA8ZCvo9oajUYiX1LRVGzfXZKhj5PjajL3ihIlrnm6YoRdwAIXsDgInJ/XUU/IgfBQ+wHY", + "EMUwQ2LQnt1xMiC6WTFhrkn53mJv9E2AerZquwSgBiQA33tXHeALtsmMTI/N0LCEnHkQtUBPitQ2WuN0", + "QO4JMXa+Bn7Du+INsizCvAaDbmS69HpSJ9IFf7ILtmm8XeJagSg2XUPKwmcxrQX/wFeskUuQkUuxQHzU", + "k4jiZVquxZxISLIfbFlOGGY7VugBrMC+23FitJ03QtvI0NvLc3SNWxC5IUEuji1hHpuKtQP7wDExKOpa", + "SS5AZ3BCXoQkMeCHiLH2TeYY1Gd1vRUxI0rIksyV13tR5fXV4NAIzm5waxKEwDVA3si26XNJrgnN59Bg", + "SBHkm63nTDXtUsoY33Kufm8a9vVAvllVgWfBgEbLtdKmAuPQ0Ek3TpkV3Uw8MziZTuyy7D8WbPvvXP1u", + "/6mqEqqcVvO+T2b6AjucyGCeRIj7pC21thjJcBMb1NqhAd1aR88F7s6xBm94VfdVT8YKdExH3vzwnJbl", + "h7VwfoD9sLctnpe0wtC3187jMlBoS8ad+67XWjnqEFtiaJ5bFq9oUj5EcD7QpFs3BRNB9CunbPHG3Emh", + "uyxAjJtULQbXDQqrPhvKc0LVosb0Q3ewvh0rGJBsaMULl5CxX8jOsWxIFmrFCiKVS+XF5y5P21Alh91l", + "qnD3Kscz8rxhDZssFAOYPrXCD6tcsnUpsjx4ltt30kqYRpJz9Mg+n5yQV5gzRjFaIIFV3LBUHaXW+iH5", + "7RWDss4eo7NwulEVvBN7i1o1tzRgtmLgP5EokfZF1uOCE9P1wIkNUSXkqtqH9BlO6Hm/mBgUCxDSfEHn", + "NKoy1/n5R1bBxWqXvYjjKKoqFOsqmd3332oIgLMEG4Yd0NFKxfhCDNRiBwSZU/8Q6O5xJZ+DNpVy6Qbj", + "g9e9VyKw49cjomB5wcEwhQAtMihlv8XlO0Few14MFIdHAheSTeom9ka7VUY1MMYt0ZOZt9EKAbE9K3vI", + "9V2jpNqN66h1BmhRjV19WwFGicpr8VvYHXoXZxZZObdyZliyobQLR/qkWObfT0+xRIHVHOomXulcPCW/", + "MyWdsBqGshei0Y27NOAuP+pJolMorKJ73bpT7lmwBhe/hTscLAB1fv5xTXtcBsB0A/7iejW8dp7xy4FS", + "IvEZe1OZqyFyw0pAOOOWjW1iLvsWMVrAvkb1F2IfLyQyoaAA7rarqQLIQq8GyphsPc351tPcMn4rA9OV", + "lw4x/XCafDppEnNdXfkdxx6puM7hGMWmolR/6jGXPzgPjEINLyHfFDn8rFvQY9iUTil6iT5FI7qVyrRj", + "vDx8J8SRkHQib83Kuadm3jbnrccxptmXCd+1Fa0OWj1uJ/GIIB72OWCDHgdNXjP3MCdSmeMIjW+D5TW9", + "NTLBMu65dj96+gjhazedFY2rQuilrMsCC0OsIBdbI2MmTscVgAp8YVOQC904wOsiDrLW0QzxZhPyyo5M", + "yyu60V5R22DW8HB+V7F8REJJGCdrRO1yem9Ujm7iLOcVZ8IEn5v4XCySD6s30wM7NamlOphFjl8GrYVz", + "vKdNJbW26c1b3ly1KBq90FO3zbRsqwtwYK+Ktm2e+7H9isKRRg/a7pQiqXp6YUt3ED1nG91K7ZxecV8i", + "h72QyuE0w+RNSNEOAB4wygjbyB7aG6ouWo+gu6xuALHAdAKtUVs8RpQEQLMSU5F2YpCHImQ0K50p4209", + "K3kOZgRw+g6GBefxX5B3VBRyRV76ZD4Pf3n38hFRTNel8UjmMxtb5HOQfN5yAoMLr9Tcrfx9FC0Tls+F", + "s6gsuDYqobi881VBzsddDke20VybxusIDdaY7rEXEM4dFUw/QzDhBdtkBS/rQUS2rS6KdsJNXc+gLBwX", + "mJV3Rk0O3iw9EPSWqXd4ONg2JS4V3BxuutJxFwaW625Ma5aqc3/uGwLtECW8eXU79XSWm33Jp+uG9NPN", + "dD3+ENnDJkwiSgRsz9MXROk8/DfisqIpME7Lch/aVSVsmK22S2lT9FMEz9DIkLDT5bQ9Xtrt1PNZMAkU", + "PuN9jstOCK+/e1sazgj6F65YaRkxP/NaFLqzhU05/C321628j2N9fJutptwhpmAsJ9AKmm1DAoZLF3TS", + "xEtrLXPeGOGh1iRWlfy7KDcuKV23okezlZWSl7xIFaIv5YLnGlUw+1qMX/u+n6aTVV0afs1x3vi+aMJO", + "P4d84Z5CUVBVEFY8+e67r//SToVwj8hVf5OS7j1uWU7LSA3P23xsWN0IIuaP8mQh+yRr0NimFo3tIRjX", + "Uolbx9vIAJDh0HevaHUOIrMNoRGqS8u2l4Y3P03tb0uqlw3pjMoWQxlpShy96nr9QXxRZOi74/Bzh9jZ", + "jRwzOtdjiHA0l+Q+3I2YPCI+jCWJbyJK0lvhyi0R9a4WX3zQJex1VTLL2zU0cDCNjj8afPL9nO95v8p/", + "PF5616EBlA6UlhPBvKyWmWw4LlAQNFBdwzu4tz/vY7hSefGWimkLUdr7ZqmSmUa25d9sMh8m8qrvdbbv", + "O3vayUwC+zbI4VYXnymBzTYcuB9ZHNKOWNtZ5qFcDGRMYF5IRtVNQjXMPUdZYbeh/mC+1bb8PD6jiQOn", + "6+U25J6mK++g9iEKHY0zdJFXiP6NVyPwsQLz1biUe2j8dQUA2vt185D8TxAhMJeY3UAYmpsmtfjkqRtp", + "4or8TpbGVPrs9PTq6urET3OSy9XpAqKcMiPrfHnqB4I0kq3Uaa6Lq35ln91yY3iuydO3r4BJ5qZkEDAB", + "Rxcl1D2bPDl5jKkXmaAVn5xNvjl5fPI1XpEl4MUppjmenP3xaTo5vXxyGjtHLVKBD+8ZVfkS0di1PYE0", + "ggzF2VdFaPRSqqd+OGfoAhvx5OxjL0McqFYhTITbv3+rmdpMfGH0WO/XmF/79HB3AD3qpTR6/JpaYUoC", + "xUjuufbItwDcBwi7ZIJwxMSSr7jxKlHFaL50bFoCZmi7J8BNLRS6YBG8J+RnzaJaZPICYo5QvvARDL6U", + "Vug0AJgdIgVXQ+P60eO4a062AQdQKrytZQFRdmAmE5Gn8kmrmI/Tzfvyd5jtNN+QWpSWofQGJ7AT67A0", + "qPOE6Wxy6nbAhfd5N2k9fAJ+ksxBmFkI9zwRV1cbhGHgHpxjN6g1nazscHwaMrfGniJTNFjLDeS+08y2", + "C7lQOyaFqfP0sMPi58gVCXwQ0I9kaMHO5zyjZZlaZmRd7C7zr2u3zAb7cbW6zpfgk9QFtAsZZvN0mShC", + "QJHbm6nrH/mJ+NjM4B8SWorWBo7oY7eDratSFmxyNqelZuntYbjI1tYEjtB74OLeOVeYTlSqRudbnUX+", + "IJNWRK1tIaRI50rtpSQ0GyDd9tGZ7Hvr4Nrc3ytnp7jRffN+t5FThZFNaDlkYrWX0GVvSr4aITZ+mNrt", + "9Kbd/nkIfP/OeF8Wb6d0sWJYULZiCoYUOVjTNFALr6pGnPfuVAXXdFZiPlzQQ7V8ceB9AD6o7YIWe9/M", + "eQl3CE4R3z7MFBHsl6KwhCnjonnYyUvoZYeebUhEXlrDbBkBNiCQRTTewgUPM/wkReY6raigCwujRV37", + "wsYxNGhyxF0F3WaMvNtQMtSS3AML44S1w0xJ1xNrywy/WuEca0gAtXny+LHnH51+PRrt9F8aJcFmwGEP", + "9n3i4VJEyJfj2pprIBRZbZ0C8k2rqjbD3jFrkwG30h/5Z+0eioouuHA+ZXCyK3qBTD1GRjqXTk+hfGoJ", + "ywIFc6RjmtytGaE8bvjS9gb8muT325A/BNeuR3aB397oHAeLhwwX8eiswzccA/Y7h4Dolo7FRz5NJ999", + "6UuwSE0XGmq/gNwx+fVTR5o5/cP7VPPi06Bo81rKi7oKRpGoQFdfwsG27l492wCR2CrhBFOLf3eApEDB", + "h4aiBCAn8R4ZVbO9+PWxr9ABKeaRTz7yyXfDJ9/KU7rHA3qLD2b6kTq+UZNvH397fGbvzzNbwuO345k9", + "7VGAXe+uiBw9u3RUVkhuy43XoPvgKMwUtOV1flpVkIwCtNL6Pr3TBxcz/qzP8lHRey1F74Gf0s5930M8", + "bWZpbupRWI1Cvjobe+QIjhzBl8gRhADTz8IHeNHk/rz/t2L1PL75xzf/zt78cKPHPfRxLc/j++7f96BE", + "OT7qx0f9S3vUE/mk93vivbYyrcy80ZP/HId+GoN2lP+PvMCRF7gd+b9FAPYV/Y8MQSLHy5EtOLIFXzZb", + "sL/MHxiCji30IKzAUQlwfPiPD/9nVwIcH/uj9H985r/8Zz6OTBvrWNdONPShVfpOMUe2WUEEu7KXzUgi", + "S/sY7Xjh44F2PfDHd+MwkUFRPS47y5yvHXX2WaBcfePGh1tIwzAX/CAUkHcFBtvbcR8j6If89sPXP5IT", + "++zm8aSHS8ye2j2+gDhH75v/L7tpHhHrJj1IcNv0efpDXCzk0Nd8QbKQpcH+ssKfIPL3PV/Yn0r8CXIO", + "YMR1ags0XwzvgYZuK/zHjjdqke7yRwtpp1uYbRzznj6SNOd7L31f/ZTUQOTFHIPi4qlXXGRbpw8NDgLC", + "jM2liwKKYKDrHTD4BvsGTdyqIONXFq1pwS0Bhkrb5I2jN1SQdy+fk2+++eYvBO+9FWwQXYYWjENiTZMY", + "uEA3CmrC5zFU6N3L5wDA++DSOqrVzkMNGHWolcOI92/hf+J40z9l0N/njI3AVTsNhBMqscjTdi4llILa", + "qrA4rKD9JxGQp5OuVHHzqo4dQam9k50JjzFg/6Pk1jF26TirRdv4MpTYYg+T8u2beTFMF+WHVpmKcOmQ", + "YwiRuk2SvSRBx2bXY7yPGuej5uBoav4zmpr/R0cSR/t0+kebWO+OKI5q1Q3pMJsm6WjiFEvcfTJ2ssV/", + "OoPhrZGdPYnN3QWN3tCKdDTBfCGsbI8Inc7kepAQ/S9g/6z03+JF4RrO5JrYezV17Ivu5KENDaC10zk8", + "c781pYedfn8hXVW23FISqhZYXPoBDMbF4gwGeIAZcDhQk9rxIdiQC3P29ZNvvnVNFL0is41heurgAejI", + "998CNLbrg9n33z7w1gcK+eXtT2dPf/jBjVEpLgydlcxpGHpzaqPOlqwspevg+GPWa2g/nP3nf/33ycnJ", + "gzGkXK4tNX8qip/oit09UX/anB0XcDTZQU+k3e6uNj3JgOL+jlcM3fRl2Eb8n8l16rrbOxMlFTma7Y9v", + "xuHeDF2vVlRtLK1nBq59hGrOWw6VAB1u9NqPDdP7PjfNCwP14cMTAnleaZsL1FJZDrNka57LhaLVktsX", + "ZXMySifzDMC7c3p7VA7cL+XAcLXoihfrTuF2wkXB1mn5PaD7KE3DM7l+4aaUyYqkX4I6AG8DLnwMYXoW", + "X+f21T++dMeX7jZfOkS7EW/cXlqd01Iu9B6qHWLbjxAKXsuF/jw6nuPzdBivt8/s0vQn9S+CokvBUN8r", + "zI9pgV0lre32LWyVNVV1byc78P1na27V5lHKReZfjP3TAC1e2K5fNO90A1XsNiXg9oCq2JINLbcJTKOC", + "oY6G3ePjuMdr1fJFwIzfd+iFsHt2O/oOLeJB56sFN0Pz2W+Tu48WPIZ/HcO/jqLpXXoPwCGf/uGv526P", + "AbjmYzKQ24bjpcm4fvrRV+BWfQWAzI2lhXeYVBqmPJKbozLvfrs6dCnm6YyWVORsp0YOWW9tQA3ty9Bc", + "LSUQFJcPHwjMVorqJzvKRkfZ6FhI7xjYNDaw6WBM12G5kZh4jpLS3nDBj9k6U6/erHkajiLbn4kB2SfV", + "Rcs8AbpYR5+25bvALBf2ScXMF1tlvmO2i2O2i2O2i2O2i2O2i89jjT7mpTjmpTiKb/+z81KM8ThxRkwL", + "qBQMXZlbjfH5H+RCbtsJpbeo53I144I1ApBfQVN02kh7UNBoSU14h31DI4kOXgY71pUpWQ68r+CEA0Jx", + "zvgl/HeuGPudZYYqy1yPeW9bq/EAQmnMaP64NuZea7NMMSrciM8H4qtTqxWkoTUhVy2hxK9kavnkjazJ", + "FVyWkl9Af1dX0276ilgk7tT6NpIYVQ8ap133DODZmXlkehcGoGMSlWMSlWMSlT+BNmRWyvxCn/4BR52h", + "HmGnERs6DSkxntmPuxQXeBlxunRaqBigGxK1HxktmCLSPvrzki5OyD/s5YTbB66lxlPoaaOzgTWSQjLU", + "hTgFQJcH0AP0bwlTZnbK2yWBW6NV4CSOgeFf8PUcpZqMPEPHZuDtaiQ9u55mG7kGdrzLtAcxcb/cvsFL", + "9ajpPGo6j5rOo6bzqOk85vU96k+P+tOj/vSoPz3qT4/601vXn35Oneft1wo9alWPWtWj2uazhgXFR3v6", + "h5WJdgcGESs+lq0XckjFGmPdmOggJ5TdXQ61OyQh0XbtdVnHX85jDM2RvNwXrfCn6UQzdenveq3Kydlk", + "aUylz05P2ZquqpKd5HJ1CkkqXP8/At8vVyt4qMIvbuToF0fKbPd1JhW3b2+Z6Su6WDCV2ZkR5icnjyef", + "/l8AAAD//84PGZ5wfgEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/api/generated/v2/types.go b/api/generated/v2/types.go index 3b73be557..eeef46d88 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -215,6 +215,11 @@ type Account struct { // LastProposed The round in which this account last proposed the block. LastProposed *uint64 `json:"last-proposed,omitempty"` + // MinBalance MicroAlgo balance required by the account. + // + // The requirement grows based on asset and application usage. + MinBalance uint64 `json:"min-balance"` + // Participation AccountParticipation describes the parameters used by this account in consensus protocol. Participation *AccountParticipation `json:"participation,omitempty"` diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 5cab4503c..ae495ea16 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1028,6 +1028,7 @@ "amount-without-pending-rewards", "rewards", "status", + "min-balance", "total-apps-opted-in", "total-assets-opted-in", "total-box-bytes", @@ -1044,6 +1045,10 @@ "description": "total number of MicroAlgos in the account", "type": "integer" }, + "min-balance": { + "description": "MicroAlgo balance required by the account.\n\nThe requirement grows based on asset and application usage.", + "type": "integer" + }, "amount-without-pending-rewards": { "description": "specifies the amount of MicroAlgos in the account, without the pending rewards.", "type": "integer" diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index 95377909f..9611bb81b 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -767,6 +767,10 @@ "description": "The round in which this account last proposed the block.", "type": "integer" }, + "min-balance": { + "description": "MicroAlgo balance required by the account.\n\nThe requirement grows based on asset and application usage.", + "type": "integer" + }, "participation": { "$ref": "#/components/schemas/AccountParticipation" }, @@ -828,6 +832,7 @@ "address", "amount", "amount-without-pending-rewards", + "min-balance", "pending-rewards", "rewards", "round", diff --git a/api/test_resources/boxes.json b/api/test_resources/boxes.json index 83146e0cf..1ebb2b72d 100644 --- a/api/test_resources/boxes.json +++ b/api/test_resources/boxes.json @@ -1,7 +1,7 @@ { "file": "boxes.json", "owner": "TestBoxes", - "lastModified": "2022-09-23 12:04:49.038378 -0500 CDT m=+3.705634393", + "lastModified": "2024-05-22 09:33:26.523711 -0400 EDT m=+2.930686085", "frozen": true, "cases": [ { @@ -14,7 +14,7 @@ }, "response": { "statusCode": 200, - "body": "{\"accounts\":[{\"address\":\"GJR76Q6OXNZ2CYIVCFCDTJRBAAR6TYEJJENEII3G2U3JH546SPBQA62IFY\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-apps\":[{\"created-at-round\":1,\"deleted\":false,\"id\":1,\"params\":{\"approval-program\":\"CCABADEYQQB6MRtBAHU2GgCABmNyZWF0ZRJBABiBIDEbgQISQAAFSDYaAhc2GgFMuURCAE42GgCABmRlbGV0ZRJBAAg2GgG8REIANzYaAIADc2V0EkEACzYaASI2GgK7QgAgNhoAgAVjaGVjaxJBABE2GgEiNhoCFbo2GgISREIAAQCBAQ==\",\"clear-state-program\":\"CIEB\",\"creator\":\"GJR76Q6OXNZ2CYIVCFCDTJRBAAR6TYEJJENEII3G2U3JH546SPBQA62IFY\",\"global-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0},\"local-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0}}}],\"created-at-round\":0,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":1,\"total-created-assets\":0},{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"N5T74SANUWLHI6ZWYFQBEB6J2VXBTYUYZNWQB2V26DCF4ARKC7GDUW3IRU\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-apps\":[{\"created-at-round\":1,\"deleted\":false,\"id\":3,\"params\":{\"approval-program\":\"CCABADEYQQB6MRtBAHU2GgCABmNyZWF0ZRJBABiBIDEbgQISQAAFSDYaAhc2GgFMuURCAE42GgCABmRlbGV0ZRJBAAg2GgG8REIANzYaAIADc2V0EkEACzYaASI2GgK7QgAgNhoAgAVjaGVjaxJBABE2GgEiNhoCFbo2GgISREIAAQCBAQ==\",\"clear-state-program\":\"CIEB\",\"creator\":\"N5T74SANUWLHI6ZWYFQBEB6J2VXBTYUYZNWQB2V26DCF4ARKC7GDUW3IRU\",\"global-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0},\"local-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0}}}],\"created-at-round\":0,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":1,\"total-created-assets\":0},{\"address\":\"OKUWMFFEKF4B4D7FRQYBVV3C2SNS54ZO4WZ2MJ3576UYKFDHM5P3AFMRWE\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-at-round\":0,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"WCS6TVPJRBSARHLN2326LRU5BYVJZUKI2VJ53CAWKYYHDE455ZGKANWMGM\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":477,\"total-boxes\":9,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"ZROKLZW4GVOK5WQIF2GUR6LHFVEZBMV56BIQEQD4OTIZL2BPSYYUKFBSHM\",\"amount\":3000,\"amount-without-pending-rewards\":3000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"2SYXFSCZAQCZ7YIFUCUZYOVR7G6Y3UBGSJIWT4EZ4CO3T6WVYTMHVSANOY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":570,\"total-boxes\":13,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"4C3S3A5II6AYMEADSW7EVL7JAKVU2ASJMMJAGVUROIJHYMS6B24NCXVEWM\",\"amount\":100000,\"amount-without-pending-rewards\":100000,\"created-at-round\":0,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"NotParticipating\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"6TB2ZQA2GEEDH6XTIOH5A7FUSGINXDPW5ONN6XBOBBGGUXVHRQTITAIIVI\",\"amount\":1000000000000,\"amount-without-pending-rewards\":1000000000000,\"created-at-round\":0,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0}],\"current-round\":9,\"next-token\":\"6TB2ZQA2GEEDH6XTIOH5A7FUSGINXDPW5ONN6XBOBBGGUXVHRQTITAIIVI\"}\n" + "body": "{\"accounts\":[{\"address\":\"GJR76Q6OXNZ2CYIVCFCDTJRBAAR6TYEJJENEII3G2U3JH546SPBQA62IFY\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-apps\":[{\"created-at-round\":1,\"deleted\":false,\"id\":1,\"params\":{\"approval-program\":\"CCABADEYQQB6MRtBAHU2GgCABmNyZWF0ZRJBABiBIDEbgQISQAAFSDYaAhc2GgFMuURCAE42GgCABmRlbGV0ZRJBAAg2GgG8REIANzYaAIADc2V0EkEACzYaASI2GgK7QgAgNhoAgAVjaGVjaxJBABE2GgEiNhoCFbo2GgISREIAAQCBAQ==\",\"clear-state-program\":\"CIEB\",\"creator\":\"GJR76Q6OXNZ2CYIVCFCDTJRBAAR6TYEJJENEII3G2U3JH546SPBQA62IFY\",\"global-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0},\"local-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0}}}],\"created-at-round\":0,\"deleted\":false,\"min-balance\":200000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":1,\"total-created-assets\":0},{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"N5T74SANUWLHI6ZWYFQBEB6J2VXBTYUYZNWQB2V26DCF4ARKC7GDUW3IRU\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-apps\":[{\"created-at-round\":1,\"deleted\":false,\"id\":3,\"params\":{\"approval-program\":\"CCABADEYQQB6MRtBAHU2GgCABmNyZWF0ZRJBABiBIDEbgQISQAAFSDYaAhc2GgFMuURCAE42GgCABmRlbGV0ZRJBAAg2GgG8REIANzYaAIADc2V0EkEACzYaASI2GgK7QgAgNhoAgAVjaGVjaxJBABE2GgEiNhoCFbo2GgISREIAAQCBAQ==\",\"clear-state-program\":\"CIEB\",\"creator\":\"N5T74SANUWLHI6ZWYFQBEB6J2VXBTYUYZNWQB2V26DCF4ARKC7GDUW3IRU\",\"global-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0},\"local-state-schema\":{\"num-byte-slice\":0,\"num-uint\":0}}}],\"created-at-round\":0,\"deleted\":false,\"min-balance\":200000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":1,\"total-created-assets\":0},{\"address\":\"OKUWMFFEKF4B4D7FRQYBVV3C2SNS54ZO4WZ2MJ3576UYKFDHM5P3AFMRWE\",\"amount\":999999499000,\"amount-without-pending-rewards\":999999499000,\"created-at-round\":0,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"sig-type\":\"sig\",\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"WCS6TVPJRBSARHLN2326LRU5BYVJZUKI2VJ53CAWKYYHDE455ZGKANWMGM\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":313300,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":477,\"total-boxes\":9,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"ZROKLZW4GVOK5WQIF2GUR6LHFVEZBMV56BIQEQD4OTIZL2BPSYYUKFBSHM\",\"amount\":3000,\"amount-without-pending-rewards\":3000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"2SYXFSCZAQCZ7YIFUCUZYOVR7G6Y3UBGSJIWT4EZ4CO3T6WVYTMHVSANOY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":360500,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":570,\"total-boxes\":13,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"4C3S3A5II6AYMEADSW7EVL7JAKVU2ASJMMJAGVUROIJHYMS6B24NCXVEWM\",\"amount\":100000,\"amount-without-pending-rewards\":100000,\"created-at-round\":0,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"NotParticipating\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},{\"address\":\"6TB2ZQA2GEEDH6XTIOH5A7FUSGINXDPW5ONN6XBOBBGGUXVHRQTITAIIVI\",\"amount\":1000000000000,\"amount-without-pending-rewards\":1000000000000,\"created-at-round\":0,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0}],\"current-round\":9,\"next-token\":\"6TB2ZQA2GEEDH6XTIOH5A7FUSGINXDPW5ONN6XBOBBGGUXVHRQTITAIIVI\"}\n" }, "witness": { "goType": "generated.AccountsResponse", @@ -46,6 +46,7 @@ ], "created-at-round": 0, "deleted": false, + "min-balance": 200000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -65,6 +66,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -103,6 +105,7 @@ ], "created-at-round": 0, "deleted": false, + "min-balance": 200000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -122,6 +125,7 @@ "amount-without-pending-rewards": 999999499000, "created-at-round": 0, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -141,6 +145,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 313300, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -159,6 +164,7 @@ "amount-without-pending-rewards": 3000, "created-at-round": 1, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -177,6 +183,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 360500, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -195,6 +202,7 @@ "amount-without-pending-rewards": 100000, "created-at-round": 0, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -213,6 +221,7 @@ "amount-without-pending-rewards": 1000000000000, "created-at-round": 0, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -407,7 +416,7 @@ }, "response": { "statusCode": 200, - "body": "{\"account\":{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" + "body": "{\"account\":{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" }, "witness": { "goType": "generated.AccountResponse", @@ -418,6 +427,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -445,7 +455,7 @@ }, "response": { "statusCode": 200, - "body": "{\"account\":{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" + "body": "{\"account\":{\"address\":\"LMTOYRT2WPSUY6JTCW2URER6YN3GETJ5FHTQBA55EVK66JG2QOB32WPIHY\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":100000,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":0,\"total-boxes\":0,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" }, "witness": { "goType": "generated.AccountResponse", @@ -456,6 +466,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 100000, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -483,7 +494,7 @@ }, "response": { "statusCode": 200, - "body": "{\"account\":{\"address\":\"WCS6TVPJRBSARHLN2326LRU5BYVJZUKI2VJ53CAWKYYHDE455ZGKANWMGM\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":477,\"total-boxes\":9,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" + "body": "{\"account\":{\"address\":\"WCS6TVPJRBSARHLN2326LRU5BYVJZUKI2VJ53CAWKYYHDE455ZGKANWMGM\",\"amount\":500000,\"amount-without-pending-rewards\":500000,\"created-at-round\":1,\"deleted\":false,\"min-balance\":313300,\"pending-rewards\":0,\"reward-base\":0,\"rewards\":0,\"round\":9,\"status\":\"Offline\",\"total-apps-opted-in\":0,\"total-assets-opted-in\":0,\"total-box-bytes\":477,\"total-boxes\":9,\"total-created-apps\":0,\"total-created-assets\":0},\"current-round\":9}\n" }, "witness": { "goType": "generated.AccountResponse", @@ -494,6 +505,7 @@ "amount-without-pending-rewards": 500000, "created-at-round": 1, "deleted": false, + "min-balance": 313300, "pending-rewards": 0, "reward-base": 0, "rewards": 0, @@ -1087,7 +1099,7 @@ "body": "{\"name\":\"YSBncmVhdCBib3g=\",\"round\":9,\"value\":\"aXQncyBhIHdvbmRlcmZ1bCBib3gAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "YSBncmVhdCBib3g=", "round": 9, @@ -1114,9 +1126,10 @@ "body": "{\"name\":\"c3Ry\",\"round\":9,\"value\":\"c3RyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "c3Ry", + "round": 9, "value": "c3RyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1140,9 +1153,10 @@ "body": "{\"name\":\"AAAAAAAAAGQ=\",\"round\":9,\"value\":\"AAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "AAAAAAAAAGQ=", + "round": 9, "value": "AAAAAAAAAGQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1166,9 +1180,10 @@ "body": "{\"name\":\"YmFzZTMy\",\"round\":9,\"value\":\"YmFzZTMyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "YmFzZTMy", + "round": 9, "value": "YmFzZTMyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1192,9 +1207,10 @@ "body": "{\"name\":\"YjY0\",\"round\":9,\"value\":\"YjY0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "YjY0", + "round": 9, "value": "YjY0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1218,9 +1234,10 @@ "body": "{\"name\":\"YmFzZTY0\",\"round\":9,\"value\":\"YmFzZTY0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "YmFzZTY0", + "round": 9, "value": "YmFzZTY0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1244,9 +1261,10 @@ "body": "{\"name\":\"c3RyaW5n\",\"round\":9,\"value\":\"c3RyaW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "c3RyaW5n", + "round": 9, "value": "c3RyaW5nAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1270,9 +1288,10 @@ "body": "{\"name\":\"AAAAAAAAACo=\",\"round\":9,\"value\":\"AAAAAAAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "AAAAAAAAACo=", + "round": 9, "value": "AAAAAAAAACoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1296,9 +1315,10 @@ "body": "{\"name\":\"AAAAAAAAAY8ADAAWAAhwbHMgcGFzcwACgA==\",\"round\":9,\"value\":\"AAAAAAAAAY8ADAAWAAhwbHMgcGFzcwACgAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "AAAAAAAAAY8ADAAWAAhwbHMgcGFzcwACgA==", + "round": 9, "value": "AAAAAAAAAY8ADAAWAAhwbHMgcGFzcwACgAAAAAAAAAA=" } }, @@ -1322,9 +1342,10 @@ "body": "{\"name\":\"WybsRnqz5Ux5MxW1SJI+w3ZiTT0p5wCDvSVV7yTag4M=\",\"round\":9,\"value\":\"WybsRnqz5Ux5MxW1SJI+w3ZiTT0p5wCDvSVV7yTag4M=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "WybsRnqz5Ux5MxW1SJI+w3ZiTT0p5wCDvSVV7yTag4M=", + "round": 9, "value": "WybsRnqz5Ux5MxW1SJI+w3ZiTT0p5wCDvSVV7yTag4M=" } }, @@ -1348,9 +1369,10 @@ "body": "{\"name\":\"1LFyyFkEBZ/hBaCpnDqx+b2N0CaSUWnwmeCdufrVxNg=\",\"round\":9,\"value\":\"1LFyyFkEBZ/hBaCpnDqx+b2N0CaSUWnwmeCdufrVxNg=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "1LFyyFkEBZ/hBaCpnDqx+b2N0CaSUWnwmeCdufrVxNg=", + "round": 9, "value": "1LFyyFkEBZ/hBaCpnDqx+b2N0CaSUWnwmeCdufrVxNg=" } }, @@ -1374,9 +1396,10 @@ "body": "{\"name\":\"YjMy\",\"round\":9,\"value\":\"YjMyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "YjMy", + "round": 9, "value": "YjMyAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1400,9 +1423,10 @@ "body": "{\"name\":\"Ynl0ZSBiYXNlMzI=\",\"round\":9,\"value\":\"Ynl0ZSBiYXNlMzIAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "Ynl0ZSBiYXNlMzI=", + "round": 9, "value": "Ynl0ZSBiYXNlMzIAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1426,9 +1450,10 @@ "body": "{\"name\":\"Ynl0ZSBiYXNlNjQ=\",\"round\":9,\"value\":\"Ynl0ZSBiYXNlNjQAAAAAAAAAAAAAAAAAAAAAAAAAAAA=\"}\n" }, "witness": { - "goType": "generated.BoxResponse", + "goType": "generated.Box", "box": { "name": "Ynl0ZSBiYXNlNjQ=", + "round": 9, "value": "Ynl0ZSBiYXNlNjQAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" } }, @@ -1475,4 +1500,4 @@ "witnessError": "400 error" } ] -} +} \ No newline at end of file diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index e0c56b083..0a095e51e 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -996,6 +996,17 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { db.log.Warnf("long query %fs: %s", dt.Seconds(), req.query) } }() + var proto config.ConsensusParams + { + var ok bool + // temporarily cast req.blockheader.CurrentProtocol(string) to protocol.ConsensusVersion + proto, ok = config.Consensus[protocol.ConsensusVersion(req.blockheader.CurrentProtocol)] + if !ok { + err := fmt.Errorf("get protocol err (%s)", req.blockheader.CurrentProtocol) + req.out <- idb.AccountRow{Error: err} + return + } + } for req.rows.Next() { var addr []byte var microalgos uint64 @@ -1131,20 +1142,14 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { account.IncentiveEligible = omitEmpty(accountData.IncentiveEligible) account.LastHeartbeat = omitEmpty(uint64(accountData.LastHeartbeat)) account.LastProposed = omitEmpty(uint64(accountData.LastProposed)) + + account.MinBalance = itypes.AccountMinBalance(accountData, &proto) } if account.Status == "NotParticipating" { account.PendingRewards = 0 } else { // TODO: pending rewards calculation doesn't belong in database layer (this is just the most covenient place which has all the data) - // TODO: replace config.Consensus. config.Consensus map[protocol.ConsensusVersion]ConsensusParams - // temporarily cast req.blockheader.CurrentProtocol(string) to protocol.ConsensusVersion - proto, ok := config.Consensus[protocol.ConsensusVersion(req.blockheader.CurrentProtocol)] - if !ok { - err = fmt.Errorf("get protocol err (%s)", req.blockheader.CurrentProtocol) - req.out <- idb.AccountRow{Error: err} - break - } rewardsUnits := uint64(0) if proto.RewardUnit != 0 { rewardsUnits = microalgos / proto.RewardUnit diff --git a/types/min_balance.go b/types/min_balance.go new file mode 100644 index 000000000..be9f99411 --- /dev/null +++ b/types/min_balance.go @@ -0,0 +1,84 @@ +package types + +import ( + "github.com/algorand/go-algorand-sdk/v2/protocol/config" + sdk "github.com/algorand/go-algorand-sdk/v2/types" +) + +// stateSchemaMinBalance computes the MinBalance requirements for a StateSchema +// based on the consensus parameters +func stateSchemaMinBalance(sm sdk.StateSchema, proto *config.ConsensusParams) uint64 { + // Flat cost for each key/value pair + flatCost := proto.SchemaMinBalancePerEntry * (sm.NumUint + sm.NumByteSlice) + + // Cost for uints + uintCost := proto.SchemaUintMinBalance * sm.NumUint + + // Cost for byte slices + bytesCost := proto.SchemaBytesMinBalance * sm.NumByteSlice + + // Sum the separate costs + return flatCost + uintCost + bytesCost +} + +// minBalance computes the minimum balance requirements for an account based on +// some consensus parameters. MinBalance should correspond roughly to how much +// storage the account is allowed to store on disk. +func minBalance( + proto *config.ConsensusParams, + totalAssets uint64, + totalAppSchema sdk.StateSchema, + totalAppParams uint64, totalAppLocalStates uint64, + totalExtraAppPages uint64, + totalBoxes uint64, totalBoxBytes uint64, +) uint64 { + var min uint64 + + // First, base MinBalance + min = proto.MinBalance + + // MinBalance for each Asset + assetCost := proto.MinBalance * totalAssets + min += assetCost + + // Base MinBalance for each created application + appCreationCost := proto.AppFlatParamsMinBalance * totalAppParams + min += appCreationCost + + // Base MinBalance for each opted in application + appOptInCost := proto.AppFlatOptInMinBalance * totalAppLocalStates + min += appOptInCost + + // MinBalance for state usage measured by LocalStateSchemas and + // GlobalStateSchemas + schemaCost := stateSchemaMinBalance(totalAppSchema, proto) + min += schemaCost + + // MinBalance for each extra app program page + extraAppProgramLenCost := proto.AppFlatParamsMinBalance * totalExtraAppPages + min += extraAppProgramLenCost + + // Base MinBalance for each created box + boxBaseCost := proto.BoxFlatMinBalance * totalBoxes + min += boxBaseCost + + // Per byte MinBalance for boxes + boxByteCost := proto.BoxByteMinBalance * totalBoxBytes + min += boxByteCost + + return min +} + +// AccountMinBalance computes the minimum balance requirements for an account +// based on some consensus parameters. MinBalance should correspond roughly to +// how much storage the account is allowed to store on disk. +func AccountMinBalance(account sdk.AccountData, proto *config.ConsensusParams) uint64 { + return minBalance( + proto, + account.TotalAssets, + account.TotalAppSchema, + account.TotalAppParams, account.TotalAppLocalStates, + uint64(account.TotalExtraAppPages), + account.TotalBoxes, account.TotalBoxBytes, + ) +} diff --git a/types/min_balance_test.go b/types/min_balance_test.go new file mode 100644 index 000000000..485deae5f --- /dev/null +++ b/types/min_balance_test.go @@ -0,0 +1,175 @@ +package types + +import ( + "github.com/algorand/go-algorand-sdk/v2/protocol/config" + sdk "github.com/algorand/go-algorand-sdk/v2/types" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestMinBalance(t *testing.T) { + testConsensusParams := &config.ConsensusParams{ + MinBalance: 100000, + AppFlatParamsMinBalance: 100000, + AppFlatOptInMinBalance: 100000, + SchemaMinBalancePerEntry: 25000, + SchemaUintMinBalance: 3500, + SchemaBytesMinBalance: 25000, + BoxFlatMinBalance: 2500, + BoxByteMinBalance: 400, + } + + tests := []struct { + name string + expectedResult uint64 + proto *config.ConsensusParams + totalAssets uint64 + totalAppSchema sdk.StateSchema + totalAppParams uint64 + totalAppLocalStates uint64 + totalExtraAppPages uint64 + totalBoxes uint64 + totalBoxBytes uint64 + }{ + { + "Passing all 0s/empties to minBalance", + 0, + &config.ConsensusParams{}, + 0, + sdk.StateSchema{}, + 0, + 0, + 0, + 0, + 0, + }, + { + "Base Case: Use non-zero consensus minBalance with otherwise 0s/empties", + 100000, + testConsensusParams, + 0, + sdk.StateSchema{}, + 0, + 0, + 0, + 0, + 0, + }, + { + "Base Case with non-zero totalAssets", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20), + testConsensusParams, + 20, + sdk.StateSchema{}, + 0, + 0, + 0, + 0, + 0, + }, + { + "Layering in created applications", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20) + + (testConsensusParams.AppFlatParamsMinBalance * 30), + testConsensusParams, + 20, + sdk.StateSchema{}, + 30, + 0, + 0, + 0, + 0, + }, + { + "Layering in opted in applications", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20) + + (testConsensusParams.AppFlatParamsMinBalance * 30) + (testConsensusParams.AppFlatOptInMinBalance * 5), + testConsensusParams, + 20, + sdk.StateSchema{}, + 30, + 5, + 0, + 0, + 0, + }, + { + "Including State Usage Costs", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20) + + (testConsensusParams.AppFlatParamsMinBalance * 30) + (testConsensusParams.AppFlatOptInMinBalance * 5) + + (testConsensusParams.SchemaMinBalancePerEntry * (500 + 1000)) + + (testConsensusParams.SchemaUintMinBalance * 500) + + (testConsensusParams.SchemaBytesMinBalance * 1000), + testConsensusParams, + 20, + sdk.StateSchema{ + NumUint: 500, + NumByteSlice: 1000, + }, + 30, + 5, + 0, + 0, + 0, + }, + { + "Including Extra App Pages", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20) + + (testConsensusParams.AppFlatParamsMinBalance * 30) + (testConsensusParams.AppFlatOptInMinBalance * 5) + + (testConsensusParams.SchemaMinBalancePerEntry * (500 + 1000)) + + (testConsensusParams.SchemaUintMinBalance * 500) + + (testConsensusParams.SchemaBytesMinBalance * 1000) + + (testConsensusParams.AppFlatParamsMinBalance * 300), + testConsensusParams, + 20, + sdk.StateSchema{ + NumUint: 500, + NumByteSlice: 1000, + }, + 30, + 5, + 300, + 0, + 0, + }, + { + "Add in Total Boxes and Bytes", + testConsensusParams.MinBalance + (testConsensusParams.MinBalance * 20) + + (testConsensusParams.AppFlatParamsMinBalance * 30) + (testConsensusParams.AppFlatOptInMinBalance * 5) + + (testConsensusParams.SchemaMinBalancePerEntry * (500 + 1000)) + + (testConsensusParams.SchemaUintMinBalance * 500) + + (testConsensusParams.SchemaBytesMinBalance * 1000) + + (testConsensusParams.AppFlatParamsMinBalance * 300) + + (testConsensusParams.BoxFlatMinBalance * 8) + + (testConsensusParams.BoxByteMinBalance * 7500), + testConsensusParams, + 20, + sdk.StateSchema{ + NumUint: 500, + NumByteSlice: 1000, + }, + 30, + 5, + 300, + 8, + 7500, + }, + } + + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + result := minBalance( + test.proto, + test.totalAssets, + test.totalAppSchema, + test.totalAppParams, + test.totalAppLocalStates, + test.totalExtraAppPages, + test.totalBoxes, + test.totalBoxBytes, + ) + + assert.Equal(t, test.expectedResult, result) + }) + } +} From 26b4eff120ba23bb09e746c4c6b8f80b17719e7b Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:53:41 -0400 Subject: [PATCH 19/26] Optimize sub-queries for assets/apps against a given address. (#1615) --- idb/postgres/postgres.go | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 0a095e51e..8cad4c4d9 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -1799,13 +1799,28 @@ func (db *IndexerDb) buildAccountQuery(opts idb.AccountQueryOptions, countOnly b whereArgs = append(whereArgs, *opts.AssetLT) partNumber++ } + + // We want to limit the size of the results in this query to what could actually be needed + if len(opts.GreaterThanAddress) > 0 { + aq += fmt.Sprintf(" AND addr > $%d", partNumber) + whereArgs = append(whereArgs, opts.GreaterThanAddress) + partNumber++ + } aq = "qasf AS (" + aq + ")" withClauses = append(withClauses, aq) } if opts.HasAppID != 0 { - withClauses = append(withClauses, fmt.Sprintf("qapf AS (SELECT addr FROM account_app WHERE app = $%d)", partNumber)) + aq := fmt.Sprintf("SELECT addr FROM account_app WHERE app = $%d", partNumber) whereArgs = append(whereArgs, opts.HasAppID) partNumber++ + + if len(opts.GreaterThanAddress) > 0 { + aq += fmt.Sprintf(" AND addr > $%d", partNumber) + whereArgs = append(whereArgs, opts.GreaterThanAddress) + partNumber++ + } + aq = "qapf AS (" + aq + ")" + withClauses = append(withClauses, aq) } // filters against main account table if len(opts.GreaterThanAddress) > 0 { From 8e7d2e5b31b871f52cd4644baa9548fee780294c Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:54:32 -0400 Subject: [PATCH 20/26] Bump to 2.6 of go sdk. (#1616) --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index f6002b5e6..3c460e5cc 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ toolchain go1.21.10 require ( github.com/algorand/avm-abi v0.2.0 - github.com/algorand/go-algorand-sdk/v2 v2.5.0 + github.com/algorand/go-algorand-sdk/v2 v2.6.0 github.com/algorand/go-codec/codec v1.1.10 github.com/algorand/oapi-codegen v1.12.0-algorand.0 github.com/davecgh/go-spew v1.1.1 diff --git a/go.sum b/go.sum index c41b5c35d..88241e1b1 100644 --- a/go.sum +++ b/go.sum @@ -70,8 +70,8 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= 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-algorand-sdk/v2 v2.5.0 h1:7XgFrbH9V3Zz/t1916ruBiWrR4Oq1U4UsiwyQSlmt38= -github.com/algorand/go-algorand-sdk/v2 v2.5.0/go.mod h1:4ayerzjoWChm3kuVhbgFgURTbaYTtlj0c41eP3av5lw= +github.com/algorand/go-algorand-sdk/v2 v2.6.0 h1:pfL8lloEi26l6PwAFicmPUguWgKpy1eZZTMlQcci5h0= +github.com/algorand/go-algorand-sdk/v2 v2.6.0/go.mod h1:4ayerzjoWChm3kuVhbgFgURTbaYTtlj0c41eP3av5lw= 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/algorand/oapi-codegen v1.12.0-algorand.0 h1:W9PvED+wAJc+9EeXPONnA+0zE9UhynEqoDs4OgAxKhk= From aef44309fae849ff13113d00b77649c5585e039b Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Thu, 6 Jun 2024 14:48:25 -0400 Subject: [PATCH 21/26] Tweak release template. (#1617) --- .goreleaser.yaml | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/.goreleaser.yaml b/.goreleaser.yaml index 3b9d9f052..e9e593b29 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -116,9 +116,11 @@ release: draft: true header: | ![GitHub Logo](https://raw.githubusercontent.com/algorand/go-algorand/master/release/release-banner.jpg) - ## Important - - Indexer {{ .Tag }} uses Conduit for data loading. This is a change from the 2.x version, which managed data loading internally. See our [Using Conduit to Populate an Indexer Database](https://github.com/algorand/conduit/blob/master/docs/tutorials/IndexerWriter.md) tutorial for more information on how to use Conduit. + ## What's Changed + ### Enhancements + * TODO 1 + * TODO 2 + * TODO 3 footer: | **Full Changelog**: https://github.com/algorand/indexer/compare/{{ .PreviousTag }}...{{ .Tag }} From 674516da8e505247fd7726437301cfd51c6be0b8 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Jul 2024 15:09:03 -0400 Subject: [PATCH 22/26] build(deps): bump setuptools from 65.5.1 to 70.0.0 in /e2e_tests (#1618) Bumps [setuptools](https://github.com/pypa/setuptools) from 65.5.1 to 70.0.0. - [Release notes](https://github.com/pypa/setuptools/releases) - [Changelog](https://github.com/pypa/setuptools/blob/main/NEWS.rst) - [Commits](https://github.com/pypa/setuptools/compare/v65.5.1...v70.0.0) --- updated-dependencies: - dependency-name: setuptools dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- e2e_tests/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e2e_tests/pyproject.toml b/e2e_tests/pyproject.toml index 6c82482a8..26a0da0fd 100644 --- a/e2e_tests/pyproject.toml +++ b/e2e_tests/pyproject.toml @@ -13,7 +13,7 @@ dependencies = [ "py-algorand-sdk==1.17.0", "pytest==6.2.5", "PyYAML==6.0", - "setuptools ==65.5.1", + "setuptools ==70.0.0", ] From 316221e01269ced80b76a3b4ea72a9ce0cb28296 Mon Sep 17 00:00:00 2001 From: Gary Malouf <982483+gmalouf@users.noreply.github.com> Date: Fri, 9 Aug 2024 16:27:36 -0400 Subject: [PATCH 23/26] Fix: Ensure requests for asset/application id 0 check for the correct result (#1622) * Make assetId and applicationId arguments pointers across several indexer queries for assets, apps, and transactions. Meant to resolve issue 1087, where requesting the 0 indexed asset/application resulted in a search query returning an incorrect creatable. * Add e2e regression test --------- Co-authored-by: Jason Paulos --- api/converter_utils.go | 18 ++++----- api/handlers.go | 13 ++++--- api/handlers_e2e_test.go | 30 +++++++++++++-- api/handlers_test.go | 12 +++--- cmd/idbtest/idbtest.go | 6 +-- idb/idb.go | 16 ++++---- idb/postgres/postgres.go | 46 +++++++++++------------ idb/postgres/postgres_boxes_test.go | 2 +- idb/postgres/postgres_integration_test.go | 18 ++++----- 9 files changed, 91 insertions(+), 70 deletions(-) diff --git a/api/converter_utils.go b/api/converter_utils.go index 4bc704115..8b4081acd 100644 --- a/api/converter_utils.go +++ b/api/converter_utils.go @@ -645,17 +645,17 @@ func (si *ServerImplementation) assetParamsToAssetQuery(params generated.SearchF return idb.AssetsQuery{}, errors.New(errUnableToParseAddress) } - var assetGreaterThan uint64 = 0 + var assetGreaterThan *uint64 if params.Next != nil { agt, err := strconv.ParseUint(*params.Next, 10, 64) if err != nil { return idb.AssetsQuery{}, fmt.Errorf("%s: %v", errUnableToParseNext, err) } - assetGreaterThan = agt + assetGreaterThan = &agt } query := idb.AssetsQuery{ - AssetID: uintOrDefault(params.AssetId), + AssetID: params.AssetId, AssetIDGreaterThan: assetGreaterThan, Creator: creator, Name: strOrDefault(params.Name), @@ -674,17 +674,17 @@ func (si *ServerImplementation) appParamsToApplicationQuery(params generated.Sea return idb.ApplicationQuery{}, errors.New(errUnableToParseAddress) } - var appGreaterThan uint64 = 0 + var appGreaterThan *uint64 if params.Next != nil { agt, err := strconv.ParseUint(*params.Next, 10, 64) if err != nil { return idb.ApplicationQuery{}, fmt.Errorf("%s: %v", errUnableToParseNext, err) } - appGreaterThan = agt + appGreaterThan = &agt } return idb.ApplicationQuery{ - ApplicationID: uintOrDefault(params.ApplicationId), + ApplicationID: params.ApplicationId, ApplicationIDGreaterThan: appGreaterThan, Address: addr, IncludeDeleted: boolOrDefault(params.IncludeAll), @@ -698,8 +698,8 @@ func (si *ServerImplementation) transactionParamsToTransactionFilter(params gene // Integer filter.MaxRound = uintOrDefault(params.MaxRound) filter.MinRound = uintOrDefault(params.MinRound) - filter.AssetID = uintOrDefault(params.AssetId) - filter.ApplicationID = uintOrDefault(params.ApplicationId) + filter.AssetID = params.AssetId + filter.ApplicationID = params.ApplicationId filter.Limit = min(uintOrDefaultValue(params.Limit, si.opts.DefaultTransactionsLimit), si.opts.MaxTransactionsLimit) filter.Round = params.Round @@ -730,7 +730,7 @@ func (si *ServerImplementation) transactionParamsToTransactionFilter(params gene filter.RekeyTo = params.RekeyTo // filter Algos or Asset but not both. - if filter.AssetID != 0 || filter.TypeEnum == idb.TypeEnumAssetTransfer { + if filter.AssetID != nil || filter.TypeEnum == idb.TypeEnumAssetTransfer { filter.AssetAmountLT = params.CurrencyLessThan filter.AssetAmountGT = params.CurrencyGreaterThan } else { diff --git a/api/handlers.go b/api/handlers.go index f325e4bf4..ca1333535 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -59,7 +59,8 @@ func validateTransactionFilter(filter *idb.TransactionFilter) error { // Round or application-id or asset-id is greater than math.MaxInt64 if filter.MinRound > math.MaxInt64 || filter.MaxRound > math.MaxInt64 || (filter.Round != nil && *filter.Round > math.MaxInt64) || - filter.AssetID > math.MaxInt64 || filter.ApplicationID > math.MaxInt64 { + (filter.AssetID != nil && *filter.AssetID > math.MaxInt64) || + (filter.ApplicationID != nil && *filter.ApplicationID > math.MaxInt64) { errorArr = append(errorArr, errValueExceedingInt64) } @@ -304,18 +305,18 @@ func (si *ServerImplementation) LookupAccountAssets(ctx echo.Context, accountID return badRequest(ctx, errors[0]) } - var assetGreaterThan uint64 = 0 + var assetGreaterThan *uint64 if params.Next != nil { agt, err := strconv.ParseUint(*params.Next, 10, 64) if err != nil { return badRequest(ctx, fmt.Sprintf("%s: %v", errUnableToParseNext, err)) } - assetGreaterThan = agt + assetGreaterThan = &agt } query := idb.AssetBalanceQuery{ Address: addr, - AssetID: uintOrDefault(params.AssetId), + AssetID: params.AssetId, AssetIDGT: assetGreaterThan, IncludeDeleted: boolOrDefault(params.IncludeAll), Limit: min(uintOrDefaultValue(params.Limit, si.opts.DefaultBalancesLimit), si.opts.MaxBalancesLimit), @@ -545,7 +546,7 @@ func (si *ServerImplementation) LookupApplicationByID(ctx echo.Context, applicat return notFound(ctx, errValueExceedingInt64) } q := idb.ApplicationQuery{ - ApplicationID: applicationID, + ApplicationID: uint64Ptr(applicationID), IncludeDeleted: boolOrDefault(params.IncludeAll), Limit: 1, } @@ -819,7 +820,7 @@ func (si *ServerImplementation) LookupAssetBalances(ctx echo.Context, assetID ui } query := idb.AssetBalanceQuery{ - AssetID: assetID, + AssetID: &assetID, AmountGT: params.CurrencyGreaterThan, AmountLT: params.CurrencyLessThan, IncludeDeleted: boolOrDefault(params.IncludeAll), diff --git a/api/handlers_e2e_test.go b/api/handlers_e2e_test.go index 70f6ff507..0808b60cd 100644 --- a/api/handlers_e2e_test.go +++ b/api/handlers_e2e_test.go @@ -223,6 +223,28 @@ func TestApplicationHandlers(t *testing.T) { checkAppLocalState(t, &response.AppsLocalStates[0]) }) } + + t.Run("app-0-query", func(t *testing.T) { + ////////// + // When // We query an app that does not exist + ////////// + + c, api, rec := setupReq("/v2/applications/:appidx", "appidx", "0") + params := generated.LookupApplicationByIDParams{} + err = api.LookupApplicationByID(c, 0, params) + require.NoError(t, err) + + ////////// + // Then // The response is 404 + ////////// + + require.Equal(t, http.StatusNotFound, rec.Code, fmt.Sprintf("unexpected return code, body: %s", rec.Body.String())) + data := rec.Body.Bytes() + var response generated.ErrorResponse + err = json.Decode(data, &response) + require.NoError(t, err) + require.Equal(t, "no application found for application-id: 0", response.Message) + }) } func TestAccountExcludeParameters(t *testing.T) { @@ -1930,7 +1952,7 @@ func runBoxCreateMutateDelete(t *testing.T, comparator boxTestComparator) { err = db.AddBlock(&vb1) require.NoError(t, err) - opts := idb.ApplicationQuery{ApplicationID: uint64(appid)} + opts := idb.ApplicationQuery{ApplicationID: uint64Ptr(uint64(appid))} rowsCh, round := db.Applications(context.Background(), opts) require.Equal(t, uint64(currentRound), round) @@ -2524,12 +2546,12 @@ func TestAccounts(t *testing.T) { require.NoError(t, err) stxn, _, err := util.DecodeSignedTxn(vb.Block.BlockHeader, vb.Block.Payset[0]) require.NoError(t, err) - assetID := crypto.TransactionIDString(stxn.Txn) + transactionID := crypto.TransactionIDString(stxn.Txn) /////////// // When // Look up transaction containing this asset /////////// - path = fmt.Sprintf("/v2/transactions/%s", assetID) + path = fmt.Sprintf("/v2/transactions/%s", transactionID) resp, data = makeRequest(t, listenAddr, path, false) require.Equal(t, http.StatusOK, resp.StatusCode, fmt.Sprintf("unexpected return code, body: %s", string(data))) var txn generated.TransactionResponse @@ -2552,7 +2574,7 @@ func TestAccounts(t *testing.T) { /////////// // When // Look up the asset /////////// - path = fmt.Sprintf("/v2/assets/%d", 0) + path = fmt.Sprintf("/v2/assets/%d", expectedAssetIdx) resp, data = makeRequest(t, listenAddr, path, false) require.Equal(t, http.StatusOK, resp.StatusCode, fmt.Sprintf("unexpected return code, body: %s", string(data))) var asset generated.AssetResponse diff --git a/api/handlers_test.go b/api/handlers_test.go index 36459e38d..18c152698 100644 --- a/api/handlers_test.go +++ b/api/handlers_test.go @@ -55,7 +55,7 @@ func TestTransactionParamToTransactionFilter(t *testing.T) { { "Int field", generated.SearchForTransactionsParams{AssetId: uint64Ptr(1234)}, - idb.TransactionFilter{AssetID: 1234, Limit: defaultOpts.DefaultTransactionsLimit}, + idb.TransactionFilter{AssetID: uint64Ptr(1234), Limit: defaultOpts.DefaultTransactionsLimit}, nil, }, { @@ -120,7 +120,7 @@ func TestTransactionParamToTransactionFilter(t *testing.T) { Round: nil, MinRound: 2, MaxRound: 3, - AssetID: 4, + AssetID: uint64Ptr(4), BeforeTime: time.Date(2021, 1, 1, 1, 0, 0, 0, time.FixedZone("UTC", 0)), AfterTime: time.Date(2022, 2, 2, 2, 0, 0, 0, time.FixedZone("UTC", 0)), AlgosGT: nil, @@ -134,7 +134,7 @@ func TestTransactionParamToTransactionFilter(t *testing.T) { Offset: nil, OffsetLT: nil, OffsetGT: nil, - ApplicationID: 7, + ApplicationID: uint64Ptr(7), }, nil, }, @@ -195,7 +195,7 @@ func TestTransactionParamToTransactionFilter(t *testing.T) { { name: "Searching by application-id", params: generated.SearchForTransactionsParams{ApplicationId: uint64Ptr(1234)}, - filter: idb.TransactionFilter{ApplicationID: 1234, Limit: defaultOpts.DefaultTransactionsLimit}, + filter: idb.TransactionFilter{ApplicationID: uint64Ptr(1234), Limit: defaultOpts.DefaultTransactionsLimit}, errorContains: nil, }, { @@ -299,14 +299,14 @@ func TestValidateTransactionFilter(t *testing.T) { { name: "application-id > math.MaxInt64", filter: idb.TransactionFilter{ - ApplicationID: math.MaxInt64 + 1, + ApplicationID: uint64Ptr(math.MaxInt64 + 1), }, errorContains: []string{errValueExceedingInt64}, }, { name: "asset-id > math.MaxInt64", filter: idb.TransactionFilter{ - AssetID: math.MaxInt64 + 1, + AssetID: uint64Ptr(math.MaxInt64 + 1), }, errorContains: []string{errValueExceedingInt64}, }, diff --git a/cmd/idbtest/idbtest.go b/cmd/idbtest/idbtest.go index 3307e05d0..e6a62554e 100644 --- a/cmd/idbtest/idbtest.go +++ b/cmd/idbtest/idbtest.go @@ -41,8 +41,8 @@ func doAssetQueryTests(db idb.IndexerDb) { printAssetQuery(db, idb.AssetsQuery{Query: "us", Limit: 9}) printAssetQuery(db, idb.AssetsQuery{Name: "Tether USDt", Limit: 1}) printAssetQuery(db, idb.AssetsQuery{Unit: "USDt", Limit: 2}) - printAssetQuery(db, idb.AssetsQuery{AssetID: 312769, Limit: 1}) - printAssetQuery(db, idb.AssetsQuery{AssetIDGreaterThan: 312769, Query: "us", Limit: 2}) + printAssetQuery(db, idb.AssetsQuery{AssetID: uint64Ptr(312769), Limit: 1}) + printAssetQuery(db, idb.AssetsQuery{AssetIDGreaterThan: uint64Ptr(312769), Query: "us", Limit: 2}) tcreator, err := sdk_types.DecodeAddress("XIU7HGGAJ3QOTATPDSIIHPFVKMICXKHMOR2FJKHTVLII4FAOA3CYZQDLG4") maybeFail(err, "addr decode, %v\n", err) printAssetQuery(db, idb.AssetsQuery{Creator: tcreator[:], Limit: 1}) @@ -171,7 +171,7 @@ func main() { printTxnQuery(db, idb.TransactionFilter{Limit: 2}) printTxnQuery(db, idb.TransactionFilter{MinRound: 5000000, Limit: 2}) printTxnQuery(db, idb.TransactionFilter{MaxRound: 100000, Limit: 2}) - printTxnQuery(db, idb.TransactionFilter{AssetID: 604, Limit: 2}) + printTxnQuery(db, idb.TransactionFilter{AssetID: uint64Ptr(604), Limit: 2}) printTxnQuery(db, idb.TransactionFilter{TypeEnum: 2, Limit: 2}) // keyreg offset := uint64(3) printTxnQuery(db, idb.TransactionFilter{Offset: &offset, Limit: 2}) diff --git a/idb/idb.go b/idb/idb.go index c91b1c0b7..a4c58c948 100644 --- a/idb/idb.go +++ b/idb/idb.go @@ -224,11 +224,11 @@ type TransactionFilter struct { AlgosLT *uint64 RekeyTo *bool // nil for no filter - AssetID uint64 // filter transactions relevant to an asset + AssetID *uint64 // filter transactions relevant to an asset AssetAmountGT *uint64 AssetAmountLT *uint64 - ApplicationID uint64 // filter transactions relevant to an application + ApplicationID *uint64 // filter transactions relevant to an application EffectiveAmountGT *uint64 // Algo: Amount + CloseAmount > x EffectiveAmountLT *uint64 // Algo: Amount + CloseAmount < x @@ -306,8 +306,8 @@ func (e MaxAPIResourcesPerAccountError) Error() string { // AssetsQuery is a parameter object with all of the asset filter options. type AssetsQuery struct { - AssetID uint64 - AssetIDGreaterThan uint64 + AssetID *uint64 + AssetIDGreaterThan *uint64 Creator []byte @@ -338,8 +338,8 @@ type AssetRow struct { // AssetBalanceQuery is a parameter object with all of the asset balance filter options. type AssetBalanceQuery struct { - AssetID uint64 - AssetIDGT uint64 + AssetID *uint64 + AssetIDGT *uint64 AmountGT *uint64 // only rows > this AmountLT *uint64 // only rows < this @@ -376,8 +376,8 @@ type ApplicationRow struct { // ApplicationQuery is a parameter object used for query local and global application state. type ApplicationQuery struct { Address []byte - ApplicationID uint64 - ApplicationIDGreaterThan uint64 + ApplicationID *uint64 + ApplicationIDGreaterThan *uint64 IncludeDeleted bool Limit uint64 } diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 8cad4c4d9..1a6850ccb 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -585,19 +585,17 @@ func buildTransactionQuery(tf idb.TransactionFilter) (query string, whereArgs [] whereArgs = append(whereArgs, convertedTime) partNumber++ } - if tf.AssetID != 0 || tf.ApplicationID != 0 { + if tf.AssetID != nil || tf.ApplicationID != nil { var creatableID uint64 - if tf.AssetID != 0 { - creatableID = tf.AssetID - if tf.ApplicationID != 0 { - if tf.AssetID == tf.ApplicationID { - // this is nonsense, but I'll allow it - } else { + if tf.AssetID != nil { + creatableID = *tf.AssetID + if tf.ApplicationID != nil { + if *tf.AssetID != *tf.ApplicationID { return "", nil, fmt.Errorf("cannot search both assetid and appid") } } } else { - creatableID = tf.ApplicationID + creatableID = *tf.ApplicationID } whereParts = append(whereParts, fmt.Sprintf("t.asset = $%d", partNumber)) whereArgs = append(whereArgs, creatableID) @@ -1978,14 +1976,14 @@ func (db *IndexerDb) Assets(ctx context.Context, filter idb.AssetsQuery) (<-chan whereParts := make([]string, 0, maxWhereParts) whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 - if filter.AssetID != 0 { + if filter.AssetID != nil { whereParts = append(whereParts, fmt.Sprintf("a.index = $%d", partNumber)) - whereArgs = append(whereArgs, filter.AssetID) + whereArgs = append(whereArgs, *filter.AssetID) partNumber++ } - if filter.AssetIDGreaterThan != 0 { + if filter.AssetIDGreaterThan != nil { whereParts = append(whereParts, fmt.Sprintf("a.index > $%d", partNumber)) - whereArgs = append(whereArgs, filter.AssetIDGreaterThan) + whereArgs = append(whereArgs, *filter.AssetIDGreaterThan) partNumber++ } if filter.Creator != nil { @@ -2107,14 +2105,14 @@ func (db *IndexerDb) AssetBalances(ctx context.Context, abq idb.AssetBalanceQuer whereParts := make([]string, 0, maxWhereParts) whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 - if abq.AssetID != 0 { + if abq.AssetID != nil { whereParts = append(whereParts, fmt.Sprintf("aa.assetid = $%d", partNumber)) - whereArgs = append(whereArgs, abq.AssetID) + whereArgs = append(whereArgs, *abq.AssetID) partNumber++ } - if abq.AssetIDGT != 0 { + if abq.AssetIDGT != nil { whereParts = append(whereParts, fmt.Sprintf("aa.assetid > $%d", partNumber)) - whereArgs = append(whereArgs, abq.AssetIDGT) + whereArgs = append(whereArgs, *abq.AssetIDGT) partNumber++ } if abq.Address != nil { @@ -2234,9 +2232,9 @@ func (db *IndexerDb) Applications(ctx context.Context, filter idb.ApplicationQue whereParts := make([]string, 0, maxWhereParts) whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 - if filter.ApplicationID != 0 { + if filter.ApplicationID != nil { whereParts = append(whereParts, fmt.Sprintf("index = $%d", partNumber)) - whereArgs = append(whereArgs, filter.ApplicationID) + whereArgs = append(whereArgs, *filter.ApplicationID) partNumber++ } if filter.Address != nil { @@ -2244,9 +2242,9 @@ func (db *IndexerDb) Applications(ctx context.Context, filter idb.ApplicationQue whereArgs = append(whereArgs, filter.Address) partNumber++ } - if filter.ApplicationIDGreaterThan != 0 { + if filter.ApplicationIDGreaterThan != nil { whereParts = append(whereParts, fmt.Sprintf("index > $%d", partNumber)) - whereArgs = append(whereArgs, filter.ApplicationIDGreaterThan) + whereArgs = append(whereArgs, *filter.ApplicationIDGreaterThan) partNumber++ } if !filter.IncludeDeleted { @@ -2485,9 +2483,9 @@ func (db *IndexerDb) AppLocalState(ctx context.Context, filter idb.ApplicationQu whereParts := make([]string, 0, maxWhereParts) whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 - if filter.ApplicationID != 0 { + if filter.ApplicationID != nil { whereParts = append(whereParts, fmt.Sprintf("app = $%d", partNumber)) - whereArgs = append(whereArgs, filter.ApplicationID) + whereArgs = append(whereArgs, *filter.ApplicationID) partNumber++ } if filter.Address != nil { @@ -2495,9 +2493,9 @@ func (db *IndexerDb) AppLocalState(ctx context.Context, filter idb.ApplicationQu whereArgs = append(whereArgs, filter.Address) partNumber++ } - if filter.ApplicationIDGreaterThan != 0 { + if filter.ApplicationIDGreaterThan != nil { whereParts = append(whereParts, fmt.Sprintf("app > $%d", partNumber)) - whereArgs = append(whereArgs, filter.ApplicationIDGreaterThan) + whereArgs = append(whereArgs, *filter.ApplicationIDGreaterThan) partNumber++ } if !filter.IncludeDeleted { diff --git a/idb/postgres/postgres_boxes_test.go b/idb/postgres/postgres_boxes_test.go index d601199c0..3f77d18d9 100644 --- a/idb/postgres/postgres_boxes_test.go +++ b/idb/postgres/postgres_boxes_test.go @@ -124,7 +124,7 @@ func runBoxCreateMutateDelete(t *testing.T, comparator boxTestComparator) { err = db.AddBlock(&vb1) require.NoError(t, err) - opts := idb.ApplicationQuery{ApplicationID: uint64(appid)} + opts := idb.ApplicationQuery{ApplicationID: uint64Ptr(uint64(appid))} rowsCh, round := db.Applications(context.Background(), opts) require.Equal(t, uint64(currentRound), round) diff --git a/idb/postgres/postgres_integration_test.go b/idb/postgres/postgres_integration_test.go index f1854d020..ac3414407 100644 --- a/idb/postgres/postgres_integration_test.go +++ b/idb/postgres/postgres_integration_test.go @@ -856,8 +856,8 @@ func TestAppExtraPages(t *testing.T) { require.Equal(t, uint32(1), ap.ExtraProgramPages) var filter idb.ApplicationQuery - var aidx uint64 = uint64(index) - filter.ApplicationID = aidx + var aidx = index + filter.ApplicationID = uint64Ptr(aidx) appRows, _ := db.Applications(context.Background(), filter) num := 0 for row := range appRows { @@ -938,7 +938,7 @@ func TestLargeAssetAmount(t *testing.T) { // txn := test.MakeAssetConfigTxn( // 0, math.MaxUint64, 0, false, "mc", "mycoin", "", test.AccountA) - assetid := uint64(1) + assetid := uint64Ptr(uint64(1)) vb, err := test.ReadValidatedBlockFromFile("test_resources/validated_blocks/LargeAssetAmount.vb") require.NoError(t, err) err = db.AddBlock(&vb) @@ -1068,7 +1068,7 @@ func TestNonDisplayableUTF8(t *testing.T) { }, } - assetID := uint64(1) + assetID := uint64Ptr(uint64(1)) for _, testcase := range tests { testcase := testcase @@ -1165,7 +1165,7 @@ func TestReconfigAsset(t *testing.T) { unit := "co\000in" name := "algo" url := "https://algorand.com" - assetID := uint64(1) + assetID := uint64Ptr(uint64(1)) // txn := test.MakeAssetConfigTxn( // 0, math.MaxUint64, 0, false, unit, name, url, test.AccountA) @@ -1406,7 +1406,7 @@ func TestAddBlockCreateDeleteAssetSameRound(t *testing.T) { db, shutdownFunc := setupIdb(t, test.MakeGenesis()) defer shutdownFunc() - assetid := uint64(1) + assetid := uint64Ptr(uint64(1)) // createTxn := test.MakeAssetConfigTxn(0, 3, 0, false, "", "", "", test.AccountA) // deleteTxn := test.MakeAssetDestroyTxn(assetid, test.AccountA) vb, err := test.ReadValidatedBlockFromFile("test_resources/validated_blocks/AddBlockCreateDeleteAssetSameRound.vb") @@ -1460,7 +1460,7 @@ func TestAddBlockCreateDeleteAppSameRound(t *testing.T) { db, shutdownFunc := setupIdb(t, test.MakeGenesis()) defer shutdownFunc() - appid := uint64(1) + appid := uint64Ptr(uint64(1)) // createTxn := test.MakeCreateAppTxn(test.AccountA) // deleteTxn := test.MakeAppDestroyTxn(appid, test.AccountA) @@ -1495,7 +1495,7 @@ func TestAddBlockAppOptInOutSameRound(t *testing.T) { // createTxn := test.MakeCreateAppTxn(test.AccountA) // optInTxn := test.MakeAppOptInTxn(appid, test.AccountB) // optOutTxn := test.MakeAppOptOutTxn(appid, test.AccountB) - appid := uint64(1) + appid := uint64Ptr(uint64(1)) vb, err := test.ReadValidatedBlockFromFile("test_resources/validated_blocks/AddBlockAppOptInOutSameRound.vb") require.NoError(t, err) err = db.AddBlock(&vb) @@ -1533,7 +1533,7 @@ func TestAddBlockAppOptInOutSameRound(t *testing.T) { require.True(t, ok) require.NoError(t, lsRow.Error) ls := lsRow.AppLocalState - require.Equal(t, appid, ls.Id) + require.Equal(t, appid, uint64Ptr(ls.Id)) require.NotNil(t, ls.Deleted) assert.True(t, *ls.Deleted) require.NotNil(t, ls.OptedInAtRound) From fb82382d82a7d2991ba74fb86e7e1b3dd842971b Mon Sep 17 00:00:00 2001 From: Jason Paulos Date: Tue, 27 Aug 2024 15:34:07 -0400 Subject: [PATCH 24/26] Regression test for UTF-8 printable characters (#1624) --- util/util_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/util/util_test.go b/util/util_test.go index 3c960b610..d20997d19 100644 --- a/util/util_test.go +++ b/util/util_test.go @@ -12,7 +12,7 @@ import ( func TestPrintableUTF8OrEmpty(t *testing.T) { encodeArg := func(str string) string { - return base64.StdEncoding.EncodeToString([]byte("input")) + return base64.StdEncoding.EncodeToString([]byte(str)) } tests := []struct { name string @@ -29,6 +29,11 @@ func TestPrintableUTF8OrEmpty(t *testing.T) { "8J+qmSBNb25leSwgd2FudAo=", "", }, + { + "Emoji", + encodeArg("🫙"), + "🫙", + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { From 120adcf5f73e8ced749cb7532063359155efb75c Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Thu, 29 Aug 2024 10:48:42 -0300 Subject: [PATCH 25/26] Fix error in assets/apps SQL query --- idb/postgres/postgres.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index bd709a669..5ba34d67a 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -1992,12 +1992,12 @@ func (db *IndexerDb) Assets(ctx context.Context, filter idb.AssetsQuery) (<-chan whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 if filter.AssetID != nil { - whereParts = append(whereParts, fmt.Sprintf("a.index = $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("a.id = $%d", partNumber)) whereArgs = append(whereArgs, *filter.AssetID) partNumber++ } if filter.AssetIDGreaterThan != nil { - whereParts = append(whereParts, fmt.Sprintf("a.index > $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("a.id > $%d", partNumber)) whereArgs = append(whereArgs, *filter.AssetIDGreaterThan) partNumber++ } @@ -2248,7 +2248,7 @@ func (db *IndexerDb) Applications(ctx context.Context, filter idb.ApplicationQue whereArgs := make([]interface{}, 0, maxWhereParts) partNumber := 1 if filter.ApplicationID != nil { - whereParts = append(whereParts, fmt.Sprintf("index = $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("id = $%d", partNumber)) whereArgs = append(whereArgs, *filter.ApplicationID) partNumber++ } @@ -2258,7 +2258,7 @@ func (db *IndexerDb) Applications(ctx context.Context, filter idb.ApplicationQue partNumber++ } if filter.ApplicationIDGreaterThan != nil { - whereParts = append(whereParts, fmt.Sprintf("index > $%d", partNumber)) + whereParts = append(whereParts, fmt.Sprintf("id > $%d", partNumber)) whereArgs = append(whereArgs, *filter.ApplicationIDGreaterThan) partNumber++ } From 3fa33b9cffae2ce4fb708d8922c85941ae022f0e Mon Sep 17 00:00:00 2001 From: Agustin Godnic Date: Thu, 29 Aug 2024 19:03:00 -0300 Subject: [PATCH 26/26] Use a schema for CockroachDB instead of Postgres --- .../internal/schema/setup_postgres.sql | 198 ++++++++--------- .../internal/schema/setup_postgres_sql.go | 201 ++++++++---------- 2 files changed, 181 insertions(+), 218 deletions(-) diff --git a/idb/postgres/internal/schema/setup_postgres.sql b/idb/postgres/internal/schema/setup_postgres.sql index bd2e3242e..72e1a4cee 100644 --- a/idb/postgres/internal/schema/setup_postgres.sql +++ b/idb/postgres/internal/schema/setup_postgres.sql @@ -1,127 +1,109 @@ --- This file is setup_postgres.sql which gets compiled into go source using a go:generate statement in postgres.go --- --- TODO? replace all 'addr bytea' with 'addr_id bigint' and a mapping table? makes addrs an 8 byte int that fits in a register instead of a 32 byte string -CREATE TABLE IF NOT EXISTS block_header ( - round bigint PRIMARY KEY, - realtime timestamp without time zone NOT NULL, - rewardslevel bigint NOT NULL, - header jsonb NOT NULL +CREATE TABLE public.block_header ( + round INT8 NOT NULL, + realtime TIMESTAMP NOT NULL, + rewardslevel INT8 NOT NULL, + header JSONB NOT NULL, + CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), + INDEX block_header_time (realtime ASC) ); --- For looking round by timestamp. We could replace this with a round-to-timestamp algorithm, it should be extremely --- efficient since there is such a high correlation between round and time. -CREATE INDEX IF NOT EXISTS block_header_time ON block_header (realtime); - -CREATE TABLE IF NOT EXISTS txn ( - round bigint NOT NULL, - intra integer NOT NULL, - typeenum smallint NOT NULL, - asset bigint NOT NULL, -- 0=Algos, otherwise AssetIndex - txid bytea, -- base32 of [32]byte hash, or NULL for inner transactions. - txn jsonb NOT NULL, -- json encoding of signed txn with apply data; inner txns exclude nested inner txns - extra jsonb NOT NULL, - PRIMARY KEY ( round, intra ) +CREATE TABLE public.txn ( + round INT8 NOT NULL, + intra INT8 NOT NULL, + typeenum INT2 NOT NULL, + asset INT8 NOT NULL, + txid BYTES NULL, + txn JSONB NOT NULL, + extra JSONB NOT NULL, + note3 BYTES NULL AS (substring(decode((txn->'txn':::STRING)->>'note':::STRING, 'base64':::STRING), 1:::INT8, 3:::INT8)) STORED, + CONSTRAINT txn_pkey PRIMARY KEY (round ASC, intra ASC), + INDEX ndly_txn_asset_extra (asset ASC, round ASC, intra ASC) STORING (txn, extra) WHERE asset > 0:::INT8, + INDEX ndly_txn_txid (txid ASC) STORING (asset, txn, extra), + INDEX ndly_txn_note3 (note3 ASC) WHERE (note3 IS NOT NULL) AND (note3 != '\x000000':::BYTES) ); --- For transaction lookup -CREATE INDEX IF NOT EXISTS txn_by_tixid ON txn ( txid ); - --- Optional, to make txn queries by asset fast: --- CREATE INDEX CONCURRENTLY IF NOT EXISTS txn_asset ON txn (asset, round, intra); - -CREATE TABLE IF NOT EXISTS txn_participation ( - addr bytea NOT NULL, - round bigint NOT NULL, - intra integer NOT NULL +CREATE TABLE public.account ( + addr BYTES NOT NULL, + microalgos INT8 NOT NULL, + rewardsbase INT8 NOT NULL, + rewards_total INT8 NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + keytype VARCHAR(8) NULL, + account_data JSONB NOT NULL, + CONSTRAINT account_pkey PRIMARY KEY (addr ASC) ); --- For query account transactions -CREATE UNIQUE INDEX IF NOT EXISTS txn_participation_i ON txn_participation ( addr, round DESC, intra DESC ); - --- expand data.basics.AccountData -CREATE TABLE IF NOT EXISTS account ( - addr bytea primary key, - microalgos bigint NOT NULL, -- okay because less than 2^54 Algos - rewardsbase bigint NOT NULL, - rewards_total bigint NOT NULL, - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the account is first used - closed_at bigint, -- round that the account was last closed - keytype varchar(8), -- "sig", "msig", "lsig", or NULL if unknown - account_data jsonb NOT NULL -- trimmed ledgercore.AccountData that excludes the fields above; SQL 'NOT NULL' is held though the json string will be "null" iff account is deleted +CREATE TABLE public.account_asset ( + addr BYTES NOT NULL, + assetid INT8 NOT NULL, + amount DECIMAL(20) NOT NULL, + frozen BOOL NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT account_asset_pkey PRIMARY KEY (addr ASC, assetid ASC), + INDEX account_asset_by_addr_partial (addr ASC) WHERE NOT deleted, + INDEX account_asset_asset (assetid ASC, addr ASC), + INDEX ndly_account_asset_holder (assetid ASC, amount DESC) WHERE amount > 0:::DECIMAL, + INDEX ndly_account_asset_optedin (assetid ASC, amount DESC) STORING (frozen, deleted, created_at, closed_at) WHERE NOT deleted ); --- data.basics.AccountData Assets[asset id] AssetHolding{} -CREATE TABLE IF NOT EXISTS account_asset ( - addr bytea NOT NULL, -- [32]byte - assetid bigint NOT NULL, - amount numeric(20) NOT NULL, -- need the full 18446744073709551615 - frozen boolean NOT NULL, - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was added to an account - closed_at bigint, -- round that the asset was last removed from the account - PRIMARY KEY (addr, assetid) +CREATE TABLE public.asset ( + id INT8 NOT NULL, + creator_addr BYTES NOT NULL, + params JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT asset_pkey PRIMARY KEY (id ASC), + INDEX ndly_asset_by_creator_addr_deleted (creator_addr ASC, deleted ASC) STORING (params, created_at, closed_at), + INVERTED INDEX ndly_asset_params_an ((params->>'an':::STRING) gin_trgm_ops), + INVERTED INDEX ndly_asset_params_un ((params->>'un':::STRING) gin_trgm_ops) ); --- For lookup up existing assets by account -CREATE INDEX IF NOT EXISTS account_asset_by_addr_partial ON account_asset(addr) WHERE NOT deleted; - --- Optional, to make queries of all asset balances fast /v2/assets//balances --- CREATE INDEX CONCURRENTLY IF NOT EXISTS account_asset_asset ON account_asset (assetid, addr ASC); - --- data.basics.AccountData AssetParams[index] AssetParams{} -CREATE TABLE IF NOT EXISTS asset ( - index bigint PRIMARY KEY, - creator_addr bytea NOT NULL, - params jsonb NOT NULL, -- data.basics.AssetParams; json string "null" iff asset is deleted - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was created - closed_at bigint -- round that the asset was closed; cannot be recreated because the index is unique +CREATE TABLE public.metastate ( + k STRING NOT NULL, + v JSONB NULL, + CONSTRAINT metastate_pkey PRIMARY KEY (k ASC) ); --- For account lookup -CREATE INDEX IF NOT EXISTS asset_by_creator_addr_deleted ON asset(creator_addr, deleted); - --- Includes indexer import state, migration state, special accounts (fee sink and --- rewards pool) and account totals. -CREATE TABLE IF NOT EXISTS metastate ( - k text primary key, - v jsonb +CREATE TABLE public.app ( + id INT8 NOT NULL, + creator BYTES NOT NULL, + params JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT app_pkey PRIMARY KEY (id ASC), + INDEX app_by_creator_deleted (creator ASC, deleted ASC) ); --- per app global state --- roughly go-algorand/data/basics/userBalance.go AppParams -CREATE TABLE IF NOT EXISTS app ( - index bigint PRIMARY KEY, - creator bytea NOT NULL, -- account address - params jsonb NOT NULL, -- json string "null" iff app is deleted - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was created - closed_at bigint -- round that the app was deleted; cannot be recreated because the index is unique +CREATE TABLE public.account_app ( + addr BYTES NOT NULL, + app INT8 NOT NULL, + localstate JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT account_app_pkey PRIMARY KEY (addr ASC, app ASC), + INDEX account_app_by_addr_partial (addr ASC) WHERE NOT deleted, + INDEX ndly_account_app_app (app ASC, addr ASC) ); --- For account lookup -CREATE INDEX IF NOT EXISTS app_by_creator_deleted ON app(creator, deleted); - --- per-account app local state -CREATE TABLE IF NOT EXISTS account_app ( - addr bytea, - app bigint, - localstate jsonb NOT NULL, -- json string "null" iff deleted from the account - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the app was added to an account - closed_at bigint, -- round that the account_app was last removed from the account - PRIMARY KEY (addr, app) +CREATE TABLE public.app_box ( + app INT8 NOT NULL, + name BYTES NOT NULL, + value BYTES NOT NULL, + CONSTRAINT app_box_pkey PRIMARY KEY (app ASC, name ASC) ); --- For looking up existing app local states by account -CREATE INDEX IF NOT EXISTS account_app_by_addr_partial ON account_app(addr) WHERE NOT deleted; - --- For looking up app box storage -CREATE TABLE IF NOT EXISTS app_box ( - app bigint NOT NULL, - name bytea NOT NULL, - value bytea NOT NULL, -- upon creation 'value' is 0x000...000 with length being the box'es size - PRIMARY KEY (app, name) -); +CREATE TABLE public.txn_participation ( + addr BYTES NOT NULL, + round INT8 NOT NULL, + intra INT8 NOT NULL, + CONSTRAINT txn_participation_pkey PRIMARY KEY (addr ASC, round DESC, intra DESC), + INDEX ndly_txn_participation_rnd (round ASC) +); \ No newline at end of file diff --git a/idb/postgres/internal/schema/setup_postgres_sql.go b/idb/postgres/internal/schema/setup_postgres_sql.go index 7636e9329..91d414b3a 100644 --- a/idb/postgres/internal/schema/setup_postgres_sql.go +++ b/idb/postgres/internal/schema/setup_postgres_sql.go @@ -2,131 +2,112 @@ package schema -const SetupPostgresSql = `-- This file is setup_postgres.sql which gets compiled into go source using a go:generate statement in postgres.go --- --- TODO? replace all 'addr bytea' with 'addr_id bigint' and a mapping table? makes addrs an 8 byte int that fits in a register instead of a 32 byte string - -CREATE TABLE IF NOT EXISTS block_header ( - round bigint PRIMARY KEY, - realtime timestamp without time zone NOT NULL, - rewardslevel bigint NOT NULL, - header jsonb NOT NULL +const SetupPostgresSql = ` +CREATE TABLE public.block_header ( + round INT8 NOT NULL, + realtime TIMESTAMP NOT NULL, + rewardslevel INT8 NOT NULL, + header JSONB NOT NULL, + CONSTRAINT block_header_pkey PRIMARY KEY (round ASC), + INDEX block_header_time (realtime ASC) ); --- For looking round by timestamp. We could replace this with a round-to-timestamp algorithm, it should be extremely --- efficient since there is such a high correlation between round and time. -CREATE INDEX IF NOT EXISTS block_header_time ON block_header (realtime); - -CREATE TABLE IF NOT EXISTS txn ( - round bigint NOT NULL, - intra integer NOT NULL, - typeenum smallint NOT NULL, - asset bigint NOT NULL, -- 0=Algos, otherwise AssetIndex - txid bytea, -- base32 of [32]byte hash, or NULL for inner transactions. - txn jsonb NOT NULL, -- json encoding of signed txn with apply data; inner txns exclude nested inner txns - extra jsonb NOT NULL, - PRIMARY KEY ( round, intra ) +CREATE TABLE public.txn ( + round INT8 NOT NULL, + intra INT8 NOT NULL, + typeenum INT2 NOT NULL, + asset INT8 NOT NULL, + txid BYTES NULL, + txn JSONB NOT NULL, + extra JSONB NOT NULL, + note3 BYTES NULL AS (substring(decode((txn->'txn':::STRING)->>'note':::STRING, 'base64':::STRING), 1:::INT8, 3:::INT8)) STORED, + CONSTRAINT txn_pkey PRIMARY KEY (round ASC, intra ASC), + INDEX ndly_txn_asset_extra (asset ASC, round ASC, intra ASC) STORING (txn, extra) WHERE asset > 0:::INT8, + INDEX ndly_txn_txid (txid ASC) STORING (asset, txn, extra), + INDEX ndly_txn_note3 (note3 ASC) WHERE (note3 IS NOT NULL) AND (note3 != '\x000000':::BYTES) ); --- For transaction lookup -CREATE INDEX IF NOT EXISTS txn_by_tixid ON txn ( txid ); - --- Optional, to make txn queries by asset fast: --- CREATE INDEX CONCURRENTLY IF NOT EXISTS txn_asset ON txn (asset, round, intra); - -CREATE TABLE IF NOT EXISTS txn_participation ( - addr bytea NOT NULL, - round bigint NOT NULL, - intra integer NOT NULL +CREATE TABLE public.account ( + addr BYTES NOT NULL, + microalgos INT8 NOT NULL, + rewardsbase INT8 NOT NULL, + rewards_total INT8 NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + keytype VARCHAR(8) NULL, + account_data JSONB NOT NULL, + CONSTRAINT account_pkey PRIMARY KEY (addr ASC) ); --- For query account transactions -CREATE UNIQUE INDEX IF NOT EXISTS txn_participation_i ON txn_participation ( addr, round DESC, intra DESC ); - --- expand data.basics.AccountData -CREATE TABLE IF NOT EXISTS account ( - addr bytea primary key, - microalgos bigint NOT NULL, -- okay because less than 2^54 Algos - rewardsbase bigint NOT NULL, - rewards_total bigint NOT NULL, - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the account is first used - closed_at bigint, -- round that the account was last closed - keytype varchar(8), -- "sig", "msig", "lsig", or NULL if unknown - account_data jsonb NOT NULL -- trimmed ledgercore.AccountData that excludes the fields above; SQL 'NOT NULL' is held though the json string will be "null" iff account is deleted +CREATE TABLE public.account_asset ( + addr BYTES NOT NULL, + assetid INT8 NOT NULL, + amount DECIMAL(20) NOT NULL, + frozen BOOL NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT account_asset_pkey PRIMARY KEY (addr ASC, assetid ASC), + INDEX account_asset_by_addr_partial (addr ASC) WHERE NOT deleted, + INDEX account_asset_asset (assetid ASC, addr ASC), + INDEX ndly_account_asset_holder (assetid ASC, amount DESC) WHERE amount > 0:::DECIMAL, + INDEX ndly_account_asset_optedin (assetid ASC, amount DESC) STORING (frozen, deleted, created_at, closed_at) WHERE NOT deleted ); --- data.basics.AccountData Assets[asset id] AssetHolding{} -CREATE TABLE IF NOT EXISTS account_asset ( - addr bytea NOT NULL, -- [32]byte - assetid bigint NOT NULL, - amount numeric(20) NOT NULL, -- need the full 18446744073709551615 - frozen boolean NOT NULL, - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was added to an account - closed_at bigint, -- round that the asset was last removed from the account - PRIMARY KEY (addr, assetid) +CREATE TABLE public.asset ( + id INT8 NOT NULL, + creator_addr BYTES NOT NULL, + params JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT asset_pkey PRIMARY KEY (id ASC), + INDEX ndly_asset_by_creator_addr_deleted (creator_addr ASC, deleted ASC) STORING (params, created_at, closed_at), + INVERTED INDEX ndly_asset_params_an ((params->>'an':::STRING) gin_trgm_ops), + INVERTED INDEX ndly_asset_params_un ((params->>'un':::STRING) gin_trgm_ops) ); --- For lookup up existing assets by account -CREATE INDEX IF NOT EXISTS account_asset_by_addr_partial ON account_asset(addr) WHERE NOT deleted; - --- Optional, to make queries of all asset balances fast /v2/assets//balances --- CREATE INDEX CONCURRENTLY IF NOT EXISTS account_asset_asset ON account_asset (assetid, addr ASC); - --- data.basics.AccountData AssetParams[index] AssetParams{} -CREATE TABLE IF NOT EXISTS asset ( - index bigint PRIMARY KEY, - creator_addr bytea NOT NULL, - params jsonb NOT NULL, -- data.basics.AssetParams; json string "null" iff asset is deleted - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was created - closed_at bigint -- round that the asset was closed; cannot be recreated because the index is unique +CREATE TABLE public.metastate ( + k STRING NOT NULL, + v JSONB NULL, + CONSTRAINT metastate_pkey PRIMARY KEY (k ASC) ); --- For account lookup -CREATE INDEX IF NOT EXISTS asset_by_creator_addr_deleted ON asset(creator_addr, deleted); - --- Includes indexer import state, migration state, special accounts (fee sink and --- rewards pool) and account totals. -CREATE TABLE IF NOT EXISTS metastate ( - k text primary key, - v jsonb +CREATE TABLE public.app ( + id INT8 NOT NULL, + creator BYTES NOT NULL, + params JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT app_pkey PRIMARY KEY (id ASC), + INDEX app_by_creator_deleted (creator ASC, deleted ASC) ); --- per app global state --- roughly go-algorand/data/basics/userBalance.go AppParams -CREATE TABLE IF NOT EXISTS app ( - index bigint PRIMARY KEY, - creator bytea NOT NULL, -- account address - params jsonb NOT NULL, -- json string "null" iff app is deleted - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the asset was created - closed_at bigint -- round that the app was deleted; cannot be recreated because the index is unique +CREATE TABLE public.account_app ( + addr BYTES NOT NULL, + app INT8 NOT NULL, + localstate JSONB NOT NULL, + deleted BOOL NOT NULL, + created_at INT8 NOT NULL, + closed_at INT8 NULL, + CONSTRAINT account_app_pkey PRIMARY KEY (addr ASC, app ASC), + INDEX account_app_by_addr_partial (addr ASC) WHERE NOT deleted, + INDEX ndly_account_app_app (app ASC, addr ASC) ); --- For account lookup -CREATE INDEX IF NOT EXISTS app_by_creator_deleted ON app(creator, deleted); - --- per-account app local state -CREATE TABLE IF NOT EXISTS account_app ( - addr bytea, - app bigint, - localstate jsonb NOT NULL, -- json string "null" iff deleted from the account - deleted bool NOT NULL, -- whether or not it is currently deleted - created_at bigint NOT NULL, -- round that the app was added to an account - closed_at bigint, -- round that the account_app was last removed from the account - PRIMARY KEY (addr, app) +CREATE TABLE public.app_box ( + app INT8 NOT NULL, + name BYTES NOT NULL, + value BYTES NOT NULL, + CONSTRAINT app_box_pkey PRIMARY KEY (app ASC, name ASC) ); --- For looking up existing app local states by account -CREATE INDEX IF NOT EXISTS account_app_by_addr_partial ON account_app(addr) WHERE NOT deleted; - --- For looking up app box storage -CREATE TABLE IF NOT EXISTS app_box ( - app bigint NOT NULL, - name bytea NOT NULL, - value bytea NOT NULL, -- upon creation 'value' is 0x000...000 with length being the box'es size - PRIMARY KEY (app, name) -); -` +CREATE TABLE public.txn_participation ( + addr BYTES NOT NULL, + round INT8 NOT NULL, + intra INT8 NOT NULL, + CONSTRAINT txn_participation_pkey PRIMARY KEY (addr ASC, round DESC, intra DESC), + INDEX ndly_txn_participation_rnd (round ASC) +);`