From 4e90200b5f75c7558db40856e3024d1569fda969 Mon Sep 17 00:00:00 2001 From: chris erway Date: Thu, 21 Mar 2024 15:21:20 -0400 Subject: [PATCH 1/5] 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 4d6cf6c7f369baa6946792a63cf8ffaec894e511 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Wed, 24 Apr 2024 13:03:20 -0400 Subject: [PATCH 2/5] Use latest sdk --- Makefile | 10 ---------- go.mod | 2 +- go.sum | 4 ++-- 3 files changed, 3 insertions(+), 13 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/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= From 466ca2cc91c8814ebea83f17b739356dc3a5296e Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Wed, 24 Apr 2024 14:40:56 -0400 Subject: [PATCH 3/5] return absent accounts in REST API --- api/generated/common/routes.go | 135 ++++++++++---------- api/generated/common/types.go | 3 + api/generated/v2/routes.go | 217 +++++++++++++++++---------------- api/generated/v2/types.go | 3 + api/handlers.go | 14 ++- api/indexer.oas2.json | 7 ++ api/indexer.oas3.yml | 10 +- 7 files changed, 209 insertions(+), 180 deletions(-) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index e52e02a5b..111b67770 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -184,73 +184,74 @@ var swaggerSpec = []string{ "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", + "//+K1LYADt4AAA==", } // 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..47ae16ee9 100644 --- a/api/generated/common/types.go +++ b/api/generated/common/types.go @@ -607,6 +607,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"` } diff --git a/api/generated/v2/routes.go b/api/generated/v2/routes.go index 007399b14..13add362c 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1324,114 +1324,115 @@ var swaggerSpec = []string{ "1v/cXkjAyAFCO2/I8NbE1RHFBvO5GTBxmyUu/74EZCpm3zDVALim2BMR/n1gs7tVYBKEWvNVVaIjoiMl", "vVxSeyVfaOIlbj/85tCxC7cefcCu7QR3+KCD68KyO8XT9lCDv4vnclWVbFh4rtCFFCu547sd8gNGha+9", "DUjmea0aI243mOBnWnKsyKohR6CQsoKkgJXhwv4H8hjI2uD/GVX2P+h30/4fYlUkJ9mhJnAukFrKD+TD", - "FCfTCXaeeMxOSlFJ353eprSTRfnzBIdgsKUJxgpwn2/y957S3KD907kFCmaupLroi2BsXdmz7ORwiWt0", - "9skpVaauCrXCwOrgQyExJ2HIs9YHTopLppxtQbociGhFMEvGVT97EHHgtXwudtDXFCm8ZtKZUW4e/RdQ", - "guQ3Qhiq3gYyNkPKofgdGvni9H3ucrWpjDyFNtDkVBtV50aj210zZ+/U7Uajc9DuWmJdlm05rdQc7YVG", - "ZopdMjqkBseUYr/VzB4ymMJsYxIGSB3sWKLY3WMcWw/7RseuJhhLQ3ODJiSX3JHaPV/R6hec5VeSkXcI", - "ccglbzuQlV5U+3tG4VAp0DUtTTb4inDyG3lPSxOzaQuQ86MIHijDSVhRQhwMibp7DzW+uAEK2gWzYps4", - "fXUNcXqQdsC8gRCjhNO+UpdMYejsaHT42ff4NJ3c6TrehRvbpwrR+satIt6UiDSkVRj+q79OTa5fKgoS", - "za8J3I2ELx5cXSaM2lwnmw1fZLqUeyzvPV+8tx12bKlv1tvTUl4xldl5txxx2Q6hwJatXMihmAWOh54I", - "rCB2Mfp6G4ED77UTrsvuvWjG7jh90DKXImvNfrdUB+llBtiVhaD4HbtHV+3dq/zbdV+qBURiw8ViOPHg", - "Bdvcj7d6wqO3d55gQh1WlmBwTnAYiIw4V85Ii0a4tqCzIwO+fQ6BpOkKg2y5V4OhSSueK0nB2aFJkcx6", - "Eqx7TIGvYNiNbQ4caeUtJpLGzh82FQtOr/1CIita+fcMvHOtEHxym0qhkBA15bGZS2EohxIhSeEenV1Z", - "WQGhanTPJ/cKfX+OOHPHl2P7/uQrQKDIMBT7R9v/97fMKMbu3oP0gm2yks+Z4QMG3xLidP/GNsQ3OzmY", - "TDGUYKdlUIOXfYk+903SICIVflnAlzg3EUE6CgGx2v+lScEMUyuLikt5RVZ1vgTZnS6Yz84DBhHw3O5M", - "1BrdJyxoZ5lyAV66ojkOhEHgJVULpoiLyyauiHAwsKwoh3vSeNt2Qy/BEYumjF27cga9wcDwiHaBaTLK", - "HJRITeTBuGCbU7S8we/XICTDCYgGAIM0RLcI0o2yGcUJsXbg60XLaInli1o5xAL4BzReWvicCmFP42U/", - "1dfY5cE64DrUmvXXOT7aJd7bxBO3WdtYy3t/c4cN5mY2xmA+bMAFQo8bArWBCIBK/vn1P4lic6ZAhfXV", - "VzDBV19NXdN/Pml/toj31Vdp/6G7stWH3PZ2DDdvEmPaBTI7dktk/FDEAQtyYUiBFOAmWZadMCNREIgt", - "B5GFQtQFK2XFkq1xg6NDhxxiii3qkmJ4DReCqVanMclhUCVg1sKpv+DPD2uRahuLmNA62o5UAcWoSu31", - "Kot2KmVhap4ckuBcd8QmjU4zIqbbuMmILzHXRxgRhpozdZMxP7gxRhStWwiFORNRQcd96DcIxXjCbWwK", - "4eC+mJ1PahNCyNhvNS1diJyAgLQPkNglv2AC69RZyueqkxImdK2cmtDCCuNZUNwwMmbwumly3Yp12bYq", - "UCpHjbDzIneh/pCkCLta0aOwhyO3Fwax7e2zc0s+sxwSmrmGPmEl+Gfueo4BGqvVsN28k6g4juaApH2+", - "/8DwTUWOplR0Op1dk5eww60xD/vDVy8eEd4tFh0nDoweX7uXHRcFGQcR5o/owdJNX7gPFHPGhkJoOsF8", - "ZM4G1MO7Sk/ML5uqE9Cq6/a8E8qRwf4/UA1lJFxzFwl2TyP8W0CSVy+SIkcr3erepQmmk4WSdTpaeoEp", - "gLv+l/ZhAEIXPurRoev0ybffkYIvmDYn5B+Qjw2Zb7+2V/s0CW9qhrVKExIALOT4RHnIBQBGcy7dgfYC", - "crkLBIRh7v6Er5MRezoBuSQz61RQ+auezEIqFzUJ6SkjetNyNT9EKDkXRlEkvpmcz5MpW/8OvzeuCMrT", - "ZMX6pz6CKl+wjWLXlV3+Bp3R82or5SkvQ/mX6xGekg0VfizXievz9EnW3KAT8tr2JkzMpbIv7VUN1j+2", - "htRtzggXS6mQz8w0RXAhlZn4nSkJigRBpDN2d+9Y2GyIbKQ5yPPaRe5aGEJu1qCsfPgepJkpAvkI36n9", - "q0ZqYTiKP3Ybf452sbKMxwL9jyUvE1hQSftdx3BMiZAEy7vHLTGVQJOXD2F2odgtRLrbax7npy7S5n+L", - "CQXm+m/KOjRainxJRVOvencRgD5Ojqsx2yuOk7jmhyxWsAXOz+scJ+RASKZwJZnsAwUy5AWN2t0CXNHN", - "iglzTcr3FnujvwLUa1XbXwBq4AXge++qfnvBNpmR6bEZGptQMg9PLdCdIrWN1jgdePeEuDZf6buRXfEG", - "WRFhXoORNzJnet2pe9IFH64Ltmk8YOLqd/hsusYrC9liWjP+ga9Y8y5BQS4lAvFRLBGfl+l3LeYhQpL9", - "YMtywjDbsUIPYAX23Y4To22/EdpGxt9ebqFr3ILINQnyX2wJrdhUrB1M1yoW3E4sATqDE/IiJGYB3z+M", - "b2+ytaA+q+shiFlIQkJdrrzeiyqvwwYnQnCA22DJ8h4hcA1QNrJt+lKSa0LzOTQYUgT5Zus5U027lDLG", - "t5yr35uGfT2Qb1ZVZafmVaKVNhUYjIZOunGErOhm4oXByXRil2X/sWDbf+fqd/tPVZVQt7Oa9/0g0xfY", - "4UQG8yTCyiftV2tLkAw3sUGtHRrQrfXcXLDsHOvIBq66r3oyVqpjBuvmh+e0LD+shfMN7IeabfHGpBWG", - "m712XpiBQlsy7lxmvdbKUYfYOkPz3Ip4RZNmIYLzgSbdQhyYfKFfimOLh+ZOCt0VAWLcpGoxuG5QWPXF", - "UJ4TqhY1pvy5g/XtWMFg+TleuDyB/RpqTmRDslArVhCpXPosPne50YaKAIwsjEQrJzPyvBENm8wPA5g+", - "tY8fVrl03FJkefDmtnzSvjCNJB/RC/rj5IS8wjwtitECCazihqVK9LTWD6lNrxiUJvYYnYXTjQqwndhb", - "1CqBpAGzFQOfikRRri+16BOtdD1wYkNUCaWq9iF9hhN6bmdqHHzwkHIqhDRf0DntWfSpXSkhjl2oqlD9", - "qWR233+rIejMEmwYdkBHKxXjCzFQTxwQZE49I9Dd40qygzaVcin+4oPXPS4RxPHrEVGwvOBgGLZPiwzK", - "sW9xA0+Q17AXAwXOkcCFBI+6iXfRbpVRuYRxS/Rk5m20QkBsL8oecn3XqNF148JcnQFaVGNX31ZQT6KU", - "V8wLu0PvkswiK+dWyQxz95d24UifFMs8//QUSxSY1r9uYoQ+inPyO1PSPVbDUPZCNLpxl9vZ5SQ9SXQK", - "NTh0r1t3yj1rnODit0iHg7WDPn78ZU17UgbAdAP54nploHae8cuBGhPxGXtTmSsqccPiMTjjlo1t4hz7", - "FjFaFJ10+7HfFxKZkC4ed9sV2wBkoVcDdS22nuZ862luGb+V9ejKvw4x5W+afLrXJOaXuvI7jj1SsZTD", - "cYFNEaL+1GMuf3AeGIUa/oV8U+Tws25Bjy2lwSh6jp6Hqo8OOBngOyGOhDhDu/9deT1OOffUzNvmvPU4", - "xjTLmZCvrWh10MJjO4lHBPGwzwEb9Dhocok5xtzZAcgKBSM0vg1W1vTWyITIuOfa/ejpI4Sv3RRSNE71", - "r5eyLgvM9r+C/GfNGzNxOq5EUJALm9pN6MYBXhdxYLOOZog3m5BXdmRaXtGN9oraBrOGh/O7ijUBEkrC", - "OEEiapfTe6NydB1nOa84Eyb43MTnYpF8WL2ZHtipSS3Vwcxt/DJoLZwzPm2KbrVNb97y5soH0YhDT902", - "07KtLsCBvSratnnux/YrCkcaMbTdaTxSJdjClu4ges42upXaOb3ivkQOeyGVw2mGyZuQoh0UPGCUEbaR", - "PbQ3VF20mKC7rG4AscAQ/taoLRkjCrzXrMT0n5245KGoGc1KZ8p4W89KnoMZARzBg2HBRQEU5B0VhVyR", - "lz6BzsOf3718RBTTdWk8kvlswhb5HCSfN4X/4MIrNXcrfx9F0ITlc+EsKguujUooLu98VZBncZfDkW00", - "16bxOkKDNaZY7AWJc0cF02wIJrxgm6zgZT2IyLbVRdFOcqnrGdQH4wIz4c6oycGbpQeC3jL1Dg8H26bE", - "pYKbw01XOu7CwHLdjWnNUnXuz31DoB1PCW9e3U49neVmX/LpuiH9dDNdTz5E8bAJnYiS79rz9EVIOoz/", - "RlJWNAXGblnpQ7uqdI2w1XYpbepDiuAZGhkSdrqctscbKGbv5CyYBMpa8b7EZScE7u94SyMZQf/C1bUs", - "I+FnXotCd7awqa++xf66VfZxoo9vs9WUOyQUjJUEWoG0bUjAcOkCUZoYaq1lzhsjPNQaxKqCfxflxiWC", - "61bRaLayUvKSF6nK5qVc8FyjCmZfi/Fr3/fTdLKqS8OvOc4b3xdN2Gl2yBeOFYqCqoKw4sm33379l3Z6", - "hHtErvqblHTvcctyWkZqeN6WY8PqRhAxf5QnC9knWYPGNrVobA/BuJZKljreRgaADIfDe0WrcxCZbQiN", - "UF1asb00vPlpan9bUr1sSGdU4RYqD1Pi6FXX6w9ijiJD3x2HpDvEzm7kmNG5HkOEo7kk9+FuxOQR8WEs", - "SXwTUZJ+AVi3RNS7WnzxgZiw11XJrGzX0MDB1Dr+aJDl+znf836h+Hi89K5DA6hoJ60kgrlQrTDZSFyg", - "IGiguoZ3cG9/3sdwpXLRLRXTFqK0981SJbOPbMt52WQbTOQy3+ts33f2tJOtBPZtUMKtLj5TUpttOHA/", - "MjukHbG2i8xD+RnImMC8kKCqm5hqWHqOMrFuQ/3BHKft9/P4LCcOnK6X25B7mq68g9oH75Hmaun5VAjk", - "FaJ/49UIcqzAHDYuzR0af13S/fZ+3TxM/xNECMwlZjwQhuamSec9OXcjTVwJ18nSmEqfnZ5eXV2d+GlO", - "crk6XUCUU2ZknS9P/UCQurGVTs11cRWnLNstN4bnmpy/fQVCMjclg4AJOLooie3Z5MnJY0x3yASt+ORs", - "8vTk8cnXeEWWgBenmFp4cvbHp+nk9PLJaewctUgFPrxnVOVLRGPX9gRS9zF8zr4qQqOXUp374ZyhC2zE", - "k7NfelnjQLUKYSLc/v1bzdRm4gtjx3q/xvzap4e7g+pRL6XR49fUCtMUKEZyL7VHvgXgPkDYJROEIyaW", - "fMVDPXzFaL50YloCZmi7J8BN/RG6YBG8J+QnzaL6X/ICYo7wfeEjGHz5qtBpADA7RAquhsb1I8px19zb", - "BhxAqfC2lgVE2YGZTESeyietAjpON+9LzmGG0XxDalFagdIbnMBOrMPSoLYSprjJqdsBF97n3aT18An4", - "STIHYWYh3PNEXLFkeAyD9OAcu0Gt6d7KDsenIVtq7Cky9aXvfXF6PSUh/2jHpDB1nh52WPwcuSKBDwL6", - "kQwt2PmcZ7QsU8uMrIvdZf517ZbZYD+uVtf5EnySuoB2IcMMmi47RQgocnszdf0jPxEfmxn8Q0JL0drA", - "EX3sdrB1VcqCTc7mtNQsvT0MF9namiAReg9c3DvnCtOJStXofKuzyB9k0oqotS2EFOn8pL00hWYDpNsy", - "ncm+tw6uzf29cnaKG90373cbOVUY2YSWQ5E6ewldRqck1wix8cPUbqc37fbPQ+B7PuN9Wbyd0sWKYRHX", - "iikYUuRgTdNALbyqGnHeu1MVXNNZiTloQQ/V8sUB/gByUNsFLfa+mfMS7hCcIvI+zBQR7JeisIQp46Jh", - "7OQl9LJDzzYkIi+tYbaMABsQyCIab+GChxl+lCJznVZU0IWF0aKu5bBxDA2aHHFXQbcZI+82lAz1G/fA", - "wjiJ7bBQ0vXE2jLDr/ZxjnUbgNo8efzYy49Ovx6NdvovjS/BZsBhD/Z94uFSRMiXwNqaayAUNm2dAspN", - "q6o2w94xa5OBtNIf+SftGEVFF1w4nzI42RW9QKEeIyOdS6enUD61hBWBgjnSCU3u1oxQHjdyaXsDfk3K", - "+23IH4Jr1yO7wG9udI6DBTuGC2d01uEbjgH7nUNAdEvHgh+fppNvv/QlWKSmCw31VuDdMfn1U+c1c/qH", - "96nmxafBp81rKS/qKhhFoqJY/RcOtnX36tkGiMTWF04wtXi+AyQFiiw0FCUAOYn3yKia7SWvj+VCB6SY", - "Rzn5KCffjZx8K6x0DwZ6iwwzzaSOPGryzeNvjmz2/rDZEpjfDjZ72qMAu/iuiBw9u3RUVkhuy43XoPvg", - "KMwUtIU7n1cVJKMArbS+T3z64M+MPytbPip6r6XoPTAr7dz3PZ6nzSzNTT0+VqOQr87GHiWCo0TwJUoE", - "IcD0s8gB/mlyf/j/rVg9jzz/yPPvjOeHGz2O0cf1M4/83fP3oEQ5MvUjU//SmHoin/R+LN5rK9PKzBux", - "/Oc49HkM2vH9f5QFjrLA7bz/WwRg36f/USBI5Hg5igVHseDLFgv2f/MHgaBjCz2IKHBUAhwZ/5Hxf3Yl", - "wJHZH1//Rzb/5bP5ODJtrGNdO9HQh1bpO8Uc2WYFEezKXjYjiSwtM9rB4eOBdjH4I984TGRQVI/LzjLn", - "a0edfRYoV/O48eEW0jDMBT8IBeRdgcH2dtzHCPohv/3w9Y/kxD67eTzp4RKzp3aPLyDO0fvm/8tumkfE", - "ukkPEtw2fZ7+EBcLOfQ1X5AsZGmwv6zwJ4j8fc8X9qcSf4KcAxhxndoCzRfDe6Ch2wr/seONWqS7/NFC", - "2ukWZhsnvKePJC353kvfVz8lNRB5MceguHjqFRfZ1ulDg4OAMGNz6aKAIhjoegcMvsG+QRO3+pDxK4vW", - "tOCWAEP1bfLG0RsqyLuXz8nTp0//QvDe24cNosvQgnFIrGkSAxfoRkFN+DyGCr17+RwAeB9cWke12nmo", - "AaMOtXIY8f4t/E8cb/qnDPr7nLERuGqngXCPSizytF1KCaWgtiosDvvQ/pM8kKeT7qvi5lUdOw+l9k52", - "JjzGgP2PereOsUvHWS3axpehxBZ7mJRv38yLYbr4fmiVqQiXDiWGEKnbJNlLEnRsdj3B+6hxPmoOjqbm", - "P6Op+X90JHG0T6d/tIn17ojiqFbdkA6zaZKOJk6JxF2WsVMs/tMZDG+N7OxJbO4uaPSGVqSjCeYLEWV7", - "ROh0JteDhOh/gfhnX/8tWRSu4Uyuib1XUye+6E4e2tAAWjudwzP3W1N62On3F9JVZcstJaFqgcWlH8Bg", - "XCzOYIAHmAGHAzWpnRyCDbkwZ18/efqNa6LoFZltDNNTBw9AR777BqCxXR/Mvvvmgbc+UMgvb386O//+", - "ezdGpbgwdFYyp2HozamNOluyspSug5OPWa+h/XD2n//13ycnJw/GkHK5ttT8XBQ/0hW7e6J+3pwdF3A0", - "2UFPpN3urjY9KYDi/o5XDN2UM2wj/s/kOnXd7Z2JkooczfZHnnE4nqHr1YqqjaX1zMC1j1DNecuhEqAj", - "jV6b2TC9L7tpOAzUhw8sBPK80rYUqKWyEmbJ1jyXC0WrJbccZXMySifzDMC7c3p7VA7cL+XAcLXoihfr", - "TuF2wkXB1un3e0D3UZqGZ3L9wk0pkxVJvwR1AN4GXPgYwvQsvs7tq3/kdEdOd5ucDtFuBI/bS6tzWsqF", - "3kO1Q2z7EY+C13KhP4+O58ieDuP19pldmv6k/kVQdCkY6nuF+TEtsKuktd2+ha2ypqru7WQHvv9iza3a", - "PEq5yDzH2D8N0OKF7fpFy043UMVuUwJuD6iKLdnQctuDaVQw1NGwe2SOe3Crli8CZvy+Qy+E3bPb0Xdo", - "EQ86Xy24GZrPfpvcfbTgMfzrGP51fJrepfcAHPLpH/567vYYgGs+JgO5bTj+NRnXTz/6CtyqrwCQubG0", - "8A6TSsOUR3JzVObdb1eHLsU8ndGSipzt1Mih6K0NqKF9GZqrpQSC4vLhA4HZSlH9ZMe30fFtdCykdwxs", - "GhvYdDCh67DSSEw8R73S3nDBj9k6U1xv1rCG45PtzySA7JPqomWeAF2so0/b8l1glgvLUjHzxdY33zHb", - "xTHbxTHbxTHbxTHbxeexRh/zUhzzUhyfb/+z81KM8ThxRkwLqBQMXZlbjZH9D0oht+2E0lvUc7maccGa", - "B5BfQVN02kh7UNBoSU3gw76hkUQHL4Md68qULAf4KzjhwKM4Z/wS/jtXjP3OMkOVFa7H8NvWajyAUBoz", - "mj+ujbnX2qxQjAo34vOB+OrUagVpaE3IVUso8SuZWjl5I2tyBZel5BfQ39XVtJu+IhaJO7W+jSRG1YPG", - "adc9A3h2Zh6Z3oUB6JhE5ZhE5ZhE5U+gDZmVMr/Qp3/AUWeoR9hpxIZOQ0qMZ/bjLsUFXkacLp0WKgbo", - "hkTtB0YLpoi0TH9e0sUJ+Ye9nHD7wLXUeAo9bXQ2sEZSSIa6EKcA6MoAeoD+LWHKzE55uyRwa7QKnMQx", - "MPwLvp6jVJORZ+jYDLxdjaQX19NiI9cgjneF9vBM3C+3b/BSPWo6j5rOo6bzqOk8ajqPeX2P+tOj/vSo", - "Pz3qT4/606P+9Nb1p59T53n7tUKPWtWjVvWotvmsYUHx0Z7+Yd9EuwODiH0+li0OOaRijbFuTHSQe5Td", - "XQ61OyQh0XbtdVnHX85jDM2RvNwXrfCn6UQzdenveq3KydlkaUylz05P2ZquqpKd5HJ1CkkqXP8/gtwv", - "VytgVOEXN3L0iyNln3799P8CAAD//3BAh1ptewEA", + "FCfTCXaeeMxOSlFJ353eprSTRfnzBIdgsKUJxgpwn2/y957S3KD907kFCmaupLpIPGNmGvRJLdejuERn", + "n5pSZeqK4hOFBg8KiRkJQ5a1AJqDTNcavWta/hM7aSVbVxbX9gewUKvLkRCGzZPikiln+5AuRyNaOcyS", + "cdXPbkQcePusKUWqr5kUZ5QbSv+FltjmRkhE1eBARmlIiRS/kyNfob5PYK42lZGn0AaanGqj6txodAts", + "5uxhpd1odF7aXeusK1JYSUBqjvZMIzPFLhkdUtNjyrPfamYPGUx1tjEJA6QOdizR7u4xjq2HfbdjVxiM", + "9aG5QROXSz5J7Z6vaPULzvIrycg7hDjkurcdyEovqv09t3CoFOialiYbfOU4+ZK8p6WJxQgLkPPzCB4y", + "w0liUYIdDNm6ew86vrgBCtoFs2KbuH91DXF/kHbAvIFRoATWvlKXTGFo72h0+Nn3+DSd3Ok63oUb26cK", + "0frGrSLelIg0pFUs/qu/Tk0uYioKEs2vCdyNhK8gXF0mjNpcJ9sOX2S6lHss7z1fvLcddmypb9bb01Je", + "MZXZebcccdkO8cCWrVzNodgGjoeeEqwgdjH6ehuBA++1E67L7r1oxu44pdAylyJrzX63VAfpZQbYlYWg", + "/R27R1ft3av823pfqgVEYsPFYjgx4gXb3A9dQsLjuHeeYOIdVuZg8FBwaIiMTFfOiIxGwragsyNDv32u", + "gaTpCpdsuVeDoVMrnitJwRmjSeHMehKse+yBL2PYjW0OJmnlMia6xs4fNhULTrn9QicrWvn3FrzDrRB8", + "cptKq5CwNeVRmkthKIcSJknhHp1xWVkBoWp04yf3Cn1/jjhzx9dk+/7kK0CgyHAV+2/b//e3zCjG7t7D", + "9YJtspLPmeEDBukS4oj/xjbENzs5mEwxlACoZfADzUOJMQFNUiMiFX5ZwJc4dxJBOgoBu9r/pUnBDFMr", + "i4pLeUVWdb4E2Z0umM8eBAYb8CzvTNQa3SdUaGfBcgFouqI5DoRB6iVVC6aIixsnrshxMACtKId70ngD", + "d0NDwVGMpoxxu3IavcHA9Yh2gek0ymyUSJ3kwbhgm1O0DMLv1yAkwwmSBgCDNEm3CNKNsi3FCbt24OtF", + "y6iK5ZVaOc4C+Ac0rlr4nAphT+NqPxXZ2OXBOuA61Jr11zk+Gife28QTt1nbWM+A/uYOG/TNbIxBf9jA", + "DIQeNwRqFxEAlfzz638SxeZMgQrrq69ggq++mrqm/3zS/mwR76uv0v5Nd+VLEHLv2zHcvEmMaRfw7NhV", + "kfFDkQksGIYhD1KAG2dZdsKgREEg9h1EFgpRIayUFUu2xg2ODh1ynCm2qEuK4T9cCKZancYkr0GVgFkL", + "p/6CPz+sRaptLGJC62g7UgUeoyq616t82qnkhamDckjSc90RmzQ/zYiYDuQmI77EXCRhRBhqztRNxvzg", + "xhhRVG8hFOZ0RAUd96HpIBTjCbexKYSr+2J7PulOCHFjv9W0dCF8AgLmPkDimfyCCayjZymfq55KmNC1", + "cmpCCyuMZ0Fxw8iYweumyXUr6mXbqlSpHDXCzsvdpSKAJErY1YoehT0cub1wiW1vn51b8q3lkHDNNfQJ", + "NcF/dNdzDNBYrYbt+p1EynG0CSQV9P0Hhm8qhjSlrNPp9pq8iR1ujXniH7568YjwbjHrOLFh9Pjavey4", + "aMk4iDC/RQ+WbnrFfaCYMzYU4tMJNiRzNqAe3lUaY37ZVMWAVl237J1QjkxG8APVUObCNXeRavc0A0EL", + "SPLqRVLkaKWD3bt0wnSyULJOR3MvMEVx1z/UPgxA6MJHPTqcnT759jtS8AXT5oT8A/LFIfPt1x5rnybh", + "TU2zVulEAoCFHKQoD7kAxWjOpTvQXsAwd4GKMMzdn/B1MnZPJyCXZGadCnp/1ZNZSOWiOiF9ZkRvWq7w", + "hwh158IoisQ3k/N5MqXs3+H3xlVCeZqsWP/UR1DlC7ZR7Lqyy9+gM3qGbaU85WUoT3M9wlOyocKU5Tpx", + "fZ4+yZobdEJe296EiblU9qW9qsH6x9aQWs4Z4WIpFfKtmaZIL6RaE78zJUGRIIh0xu7uHQubDZGXNAd5", + "XrvIYgtDyB0blJUP34M0M0UgH+E7tX/VSC0MR/HHbuPP0S5WlvFYoP+x5GUCCyppv+sYjikRkmD5+bgl", + "pjpo8gYizC5UvIVId3vN4/zZRdr8bzGhwFoETdmJRkuRL6lo6mnvLlLQx8lxNXB7xXsS1/yQxRS2wPl5", + "nfeEHAgZFa5klH2gQAa/oFG7W4ArulkxYa5J+d5ib/RXgHqyavsLQA28AHzvXdV5L9gmMzI9NkNjE0rm", + "4akFulOkttEapwPvnhB35yuRN7Ir3iArIsxrMPJG5kyvO3VPuuBjdsE2jQdMXJ0Pn03XeGUhW0xrxj/w", + "FWveJSjIpUQgPool4vMy/a7FPElIsh9sWU4YZjtW6AGswL7bcWK07TdC28j428t9dI1bELkmQX6OLaEf", + "m4q1g/1axYzbiS9AZ3BCXoTEMeCbiPH3TTYZ1Gd1PRgxS0pI+MuV13tR5XXY4OQIDnAbLKneIwSuAcpG", + "tk1fSnJNaD6HBkOKIN9sPWeqaZdSxviWc/V707CvB/LNqqrs1ORKtNKmAoPR0Ek3jpoV3Uy8MDiZTuyy", + "7D8WbPvvXP1u/6mqEuqKVvO+n2b6AjucyGCeRNj7pP1qbQmS4SY2qLVDA7q13pwL5p1jndvAVfdVT8ZK", + "dcyw3fzwnJblh7VwvoH9ULgt3pi0wnC4184LM1BoS8adS6/XWjnqEFtnaJ5bEa9o0kBEcD7QpFsoBJND", + "9EuFbPHQ3EmhuyJAjJtULQbXDQqrvhjKc0LVosaURHewvh0rGCyPxwuXx7Bf482JbEgWasUKIpVL78Xn", + "LnfbUJGCkYWbaOVkRp43omGTmWIA06f28cMqly5ciiwP3uaWT9oXppHkI3ppf5yckFeYR0YxWiCBVdyw", + "VAmh1voh9eoVg9LJHqOzcLpRgbgTe4taJZo0YLZi4FORKBr2pRalopWuB05siCqhVNU+pM9wQs/tTI2D", + "Dx5SToWQ5gs6pz2LUrUrOcSxFVUVqlOVzO77bzUExVmCDcMO6GilYnwhBuqdA4LMqWcEuntcSXbQplIu", + "BWF88LrHJYI4fj0iCpYXHAzTCtAig3LxW9zAE+Q17MVAAXYkcCEBpW7icbRbZVTOYdwSPZl5G60QENuL", + "sodc3zVqiN24cFhngBbV2NW3FXSUKDUW88Lu0Lsks8jKuVUyw9oCpV040ifFMs8/PcUSBZYdqJsYpo/i", + "nPzOlHSP1TCUvRCNbtzlnnY5U08SnUKNEN3r1p1yzxosuPgt0uFgbaOPH39Z056UATDdQL64XpmqnWf8", + "cqAGRnzG3lTmil7csLgNzrhlY5s4zL5FjBZFpxxA7PeFRCaks8fddsVAAFno1UDdja2nOd96mlvGb2Vl", + "uvKvQ0xJnCaf7jWJ+a+u/I5jj1Ss53DcYlMkqT/1mMsfnAdGoYZ/Id8UOfysW9BjS+kyip6j56EqpQNO", + "BvhOiCMhztDuf1dej1POPTXztjlvPY4xzXIm5GsrWh20MNpO4hFBPOxzwAY9DppcZ44xd3YAslbBCI1v", + "g5U1vTUyITLuuXY/evoI4Ws3xRWNSxHopazLAqsRrCA/W/PGTJyOK2EU5MKmthS6cYDXRRx4raMZ4s0m", + "5JUdmZZXdKO9orbBrOHh/K5izYKEkjBO4Ija5fTeqBxdx1nOK86ECT438blYJB9Wb6YHdmpSS3Uwsxy/", + "DFoL54xPm6JgbdObt7y58kY04tBTt820bKsLcGCvirZtnvux/YrCkUYMbXeakVSJuLClO4ies41upXZO", + "r7gvkcNeSOVwmmHyJqRoBwUPGGWEbWQP7Q1VFy0m6C6rG0AsMMVAa9SWjBElBtCsxPSknbjkoagZzUpn", + "ynhbz0qegxkBHMGDYcFFARTkHRWFXJGXPsHPw5/fvXxEFNN1aTyS+WzHFvkcJJ+3xMDgwis1dyt/H0XQ", + "hOVz4SwqC66NSigu73xVkAdyl8ORbTTXpvE6QoM1poDsBYlzRwXTbAgmvGCbrOBlPYjIttVF0U7CqesZ", + "1C/jAjP1zqjJwZulB4LeMvUODwfbpsSlgpvDTVc67sLAct2Nac1Sde7PfUOgHU8Jb17dTj2d5WZf8um6", + "If10M11PPkTxsAmdiJID2/P0RVI6jP9GUlY0BcZuWelDu6p5jbDVdilt6leK4BkaGRJ2upy2xxsotu/k", + "LJgEym7xvsRlJwTu73hLIxlB/8LV3Swj4Wdei0J3trCp/77F/rpV9nGij2+z1ZQ7JBSMlQRagbRtSMBw", + "6QJRmhhqrWXOGyM81ELEqod/F+XGJarrVvlotrJS8pIXqcrrpVzwXKMKZl+L8Wvf99N0sqpLw685zhvf", + "F03YaXbIF44VioKqgrDiybfffv2XdnqEe0Su+puUdO9xy3JaRmp43pZjw+pGEDF/lCcL2SdZg8Y2tWhs", + "D8G4lkrmOt5GBoAMh8N7RatzEJltCI1QXVqxvTS8+Wlqf1tSvWxIZ1SBFyojU+LoVdfrD2KOIkPfHYek", + "O8TObuSY0bkeQ4SjuST34W7E5BHxYSxJfBNRkn6BWrdE1LtafPGBmLDXVcmsbNfQwMHUOv5okOX7Od/z", + "fiH7eLz0rkMDqLgnrSSCuVqtMNlIXKAgaKC6hndwb3/ex3ClcuUtFdMWorT3zVIls49sy8nZZENM5Frf", + "62zfd/a0k60E9m1Qwq0uPlNSm204cD8yO6QdsbaLzEP5GciYwLyQoKqbmGpYeo4yxW5D/cEcrO338/gs", + "Jw6crpfbkHuarryD2gfvkeZq/flUCOQVon/j1QhyrMAcNi4NHxp/XVGA9n7dPEz/E0QIzCVmPBCG5qZJ", + "Nz45dyNNXInZydKYSp+dnl5dXZ34aU5yuTpdQJRTZmSdL0/9QJBaspVOzXVxFbEs2y03hueanL99BUIy", + "NyWDgAk4uijJ7tnkycljTMfIBK345Gzy9OTxydd4RZaAF6eY+nhy9sen6eT08slp7By1SAU+vGdU5UtE", + "Y9f2BFILMnzOvipCo5dSnfvhnKELbMSTs196WeNAtQphItz+/VvN1GbiC3fHer/G/Nqnh7uD6lEvpdHj", + "19QK0xQoRnIvtUe+BeA+QNglE4QjJpZ8xUO9fsVovnRiWgJmaLsnwE19FLpgEbwn5CfNovpk8gJijvB9", + "4SMYfHmt0GkAMDtECq6GxvUjynHX3NsGHECp8LaWBUTZgZlMRJ7KJ60CP04370viYQbUfENqUVqB0huc", + "wE6sw9Kg9hOmuMmp2wEX3ufdpPXwCfhJMgdhZiHc80RcMWd4DIP04By7Qa3p3soOx6chm2vsKTL1pfl9", + "8Xw9JSE/asekMHWeHnZY/By5IoEPAvqRDC3Y+ZxntCxTy4ysi91l/nXtltlgP65W1/kSfJK6gHYhwwyf", + "LjtFCChyezN1/SM/ER+bGfxDQkvR2sARfex2sHVVyoJNzua01Cy9PQwX2dqaIBF6D1zcO+cK04lK1eh8", + "q7PIH2TSiqi1LYQU6fypvTSFZgOk2zKdyb63Dq7N/b1ydoob3Tfvdxs5VRjZhJZDdlZ7CV1GpyTXCLHx", + "w9Rupzft9s9D4Hs+431ZvJ3SxYphkdmKKRhS5GBN00AtvKoacd67UxVc01mJOXJBD9XyxQH+AHJQ2wUt", + "9r6Z8xLuEJwi8j7MFBHsl6KwhCnjomHs5CX0skPPNiQiL61htowAGxDIIhpv4YKHGX6UInOdVlTQhYXR", + "oq7lsHEMDZoccVdBtxkj7zaUDPUl98DCOIntsFDS9cTaMsOv9nGOdSWA2jx5/NjLj06/Ho12+i+NL8Fm", + "wGEP9n3i4VJEyJfo2pprIBRebZ0Cyk2rqjbD3jFrk4G00h/5J+0YRUUXXDifMjjZFb1AoR4jI51Lp6dQ", + "PrWEFYGCOdIJTe7WjFAeN3JpewN+Tcr7bcgfgmvXI7vAb250joMFRYYLe3TW4RuOAfudQ0B0S8eCJJ+m", + "k2+/9CVYpKYLDfVg4N0x+fVT5zVz+of3qebFp8GnzWspL+oqGEWiol39Fw62dffq2QaIxNYXTjC1eL4D", + "JAWKQDQUJQA5iffIqJrtJa+P5UIHpJhHOfkoJ9+NnHwrrHQPBnqLDDPNpI48avLN42+ObPb+sNkSmN8O", + "NnvaowC7+K6IHD27dFRWSG7Ljdeg++AozBS0hTufVxUkowCttL5PfPrgz4w/K1s+Knqvpeg9MCvt3Pc9", + "nqfNLM1NPT5Wo5CvzsYeJYKjRPAlSgQhwPSzyAH+aXJ/+P+tWD2PPP/I8++M54cbPY7Rx/U9j/zd8/eg", + "RDky9SNT/9KYeiKf9H4s3msr08rMG7H85zj0eQza8f1/lAWOssDtvP9bBGDfp/9RIEjkeDmKBUex4MsW", + "C/Z/8weBoGMLPYgocFQCHBn/kfF/diXAkdkfX/9HNv/ls/k4Mm2sY1070dCHVuk7xRzZZgUR7MpeNiOJ", + "LC0z2sHh44F2Mfgj3zhMZFBUj8vOMudrR519FihX87jx4RbSMMwFPwgF5F2BwfZ23McI+iG//fD1j+TE", + "Prt5POnhErOndo8vIM7R++b/y26aR8S6SQ8S3DZ9nv4QFws59DVfkCxkabC/rPAniPx9zxf2pxJ/gpwD", + "GHGd2gLNF8N7oKHbCv+x441apLv80ULa6RZmGye8p48kLfneS99XPyU1EHkxx6C4eOoVF9nW6UODg4Aw", + "Y3PpooAiGOh6Bwy+wb5BE7f6kPEri9a04JYAQ/Vt8sbRGyrIu5fPydOnT/9C8N7bhw2iy9CCcUisaRID", + "F+hGQU34PIYKvXv5HAB4H1xaR7XaeagBow61chjx/i38Txxv+qcM+vucsRG4aqeBcI9KLPK0XUoJpaC2", + "KiwO+9D+kzyQp5Puq+LmVR07D6X2TnYmPMaA/Y96t46xS8dZLdrGl6HEFnuYlG/fzIthuvh+aJWpCJcO", + "JYYQqdsk2UsSdGx2PcH7qHE+ag6OpuY/o6n5f3QkcbRPp3+0ifXuiOKoVt2QDrNpko4mTonEXZaxUyz+", + "0xkMb43s7Els7i5o9IZWpKMJ5gsRZXtE6HQm14OE6H+B+Gdf/y1ZFK7hTK6JvVdTJ77oTh7a0ABaO53D", + "M/dbU3rY6fcX0lVlyy0loWqBxaUfwGBcLM5ggAeYAYcDNamdHIINuTBnXz95+o1rougVmW0M01MHD0BH", + "vvsGoLFdH8y+++aBtz5QyC9vfzo7//57N0aluDB0VjKnYejNqY06W7KylK6Dk49Zr6H9cPaf//XfJycn", + "D8aQcrm21PxcFD/SFbt7on7enB0XcDTZQU+k3e6uNj0pgOL+jlcM3ZQzbCP+z+Q6dd3tnYmSihzN9kee", + "cTieoevViqqNpfXMwLWPUM15y6ESoCONXpvZML0vu2k4DNSHDywE8rzSthSopbISZsnWPJcLRasltxxl", + "czJKJ/MMwLtzentUDtwv5cBwteiKF+tO4XbCRcHW6fd7QPdRmoZncv3CTSmTFUm/BHUA3gZc+BjC9Cy+", + "zu2rf+R0R053m5wO0W4Ej9tLq3NayoXeQ7VDbPsRj4LXcqE/j47nyJ4O4/X2mV2a/qT+RVB0KRjqe4X5", + "MS2wq6S13b6FrbKmqu7tZAe+/2LNrdo8SrnIPMfYPw3Q4oXt+kXLTjdQxW5TAm4PqIot2dBy24NpVDDU", + "0bB7ZI57cKuWLwJm/L5DL4Tds9vRd2gRDzpfLbgZms9+m9x9tOAx/OsY/nV8mt6l9wAc8ukf/nru9hiA", + "az4mA7ltOP41GddPP/oK3KqvAJC5sbTwDpNKw5RHcnNU5t1vV4cuxTyd0ZKKnO3UyKHorQ2ooX0Zmqul", + "BILi8uEDgdlKUf1kx7fR8W10LKR3DGwaG9h0MKHrsNJITDxHvdLecMGP2TpTXG/WsIbjk+3PJIDsk+qi", + "ZZ4AXayjT9vyXWCWC8tSMfPF1jffMdvFMdvFMdvFMdvFMdvF57FGH/NSHPNSHJ9v/7PzUozxOHFGTAuo", + "FAxdmVuNkf0PSiG37YTSW9RzuZpxwZoHkF9BU3TaSHtQ0GhJTeDDvqGRRAcvgx3rypQsB/grOOHAozhn", + "/BL+O1eM/c4yQ5UVrsfw29ZqPIBQGjOaP66NudfarFCMCjfi84H46tRqBWloTchVSyjxK5laOXkja3IF", + "l6XkF9Df1dW0m74iFok7tb6NJEbVg8Zp1z0DeHZmHpnehQHomETlmETlmETlT6ANmZUyv9Cnf8BRZ6hH", + "2GnEhk5DSoxn9uMuxQVeRpwunRYqBuiGRO0HRgumiLRMf17SxQn5h72ccPvAtdR4Cj1tdDawRlJIhroQ", + "pwDoygB6gP4tYcrMTnm7JHBrtAqcxDEw/Au+nqNUk5Fn6NgMvF2NpBfX02Ij1yCOd4X28EzcL7dv8FI9", + "ajqPms6jpvOo6TxqOo95fY/606P+9Kg/PepPj/rTo/701vWnn1Pnefu1Qo9a1aNW9ai2+axhQfHRnv5h", + "30S7A4OIfT6WLQ45pGKNsW5MdJB7lN1dDrU7JCHRdu11WcdfzmMMzZG83Bet8KfpRDN16e96rcrJ2WRp", + "TKXPTk/Zmq6qkp3kcnUKSSpc/z+C3C9XK2BU4Rc3cvSLI2W2+zqTilveW2b6ii4WTGV2ZoT5ycnjyaf/", + "FwAA//9wBkB7MHwBAA==", } // 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..7b98cf44d 100644 --- a/api/generated/v2/types.go +++ b/api/generated/v2/types.go @@ -695,6 +695,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"` } diff --git a/api/handlers.go b/api/handlers.go index 0b2000c7d..73cd0f6ac 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 } diff --git a/api/indexer.oas2.json b/api/indexer.oas2.json index 119bf122f..d32676041 100644 --- a/api/indexer.oas2.json +++ b/api/indexer.oas2.json @@ -1849,6 +1849,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..e3a67916e 100644 --- a/api/indexer.oas3.yml +++ b/api/indexer.oas3.yml @@ -1601,6 +1601,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": { @@ -5199,5 +5206,6 @@ { "name": "search" } - ] + ], + "x-original-swagger-version": "2.0" } \ No newline at end of file From a221e3b07b3f916cf828b1635d597228cea48014 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Thu, 25 Apr 2024 10:30:14 -0400 Subject: [PATCH 4/5] Return new fields in REST --- api/generated/common/routes.go | 362 ++++++++++++++------------- api/generated/common/types.go | 103 +++++--- api/generated/v2/routes.go | 444 +++++++++++++++++---------------- api/generated/v2/types.go | 103 +++++--- api/handlers.go | 4 + api/indexer.oas2.json | 123 +++++---- api/indexer.oas3.yml | 109 +++++--- idb/postgres/postgres.go | 4 + 8 files changed, 682 insertions(+), 570 deletions(-) diff --git a/api/generated/common/routes.go b/api/generated/common/routes.go index 111b67770..5c1233eca 100644 --- a/api/generated/common/routes.go +++ b/api/generated/common/routes.go @@ -72,186 +72,188 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "//+K1LYADt4AAA==", + "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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 47ae16ee9..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"` @@ -721,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 13add362c..6ffd25359 100644 --- a/api/generated/v2/routes.go +++ b/api/generated/v2/routes.go @@ -1212,227 +1212,229 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "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", - "FwAA//9wBkB7MHwBAA==", + "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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 7b98cf44d..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"` @@ -809,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 73cd0f6ac..f325e4bf4 100644 --- a/api/handlers.go +++ b/api/handlers.go @@ -1348,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 d32676041..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", diff --git a/api/indexer.oas3.yml b/api/indexer.oas3.yml index e3a67916e..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" }, @@ -1819,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" } diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index b36686670..248d1de5b 100644 --- a/idb/postgres/postgres.go +++ b/idb/postgres/postgres.go @@ -1134,6 +1134,10 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { account.TotalBoxes = accountData.TotalBoxes account.TotalBoxBytes = accountData.TotalBoxBytes + + account.IncentiveEligible = boolPtr(accountData.IncentiveEligible) + account.LastHeartbeat = uint64Ptr(uint64(accountData.LastHeartbeat)) + account.LastProposed = uint64Ptr(uint64(accountData.LastProposed)) } if account.Status == "NotParticipating" { From 4984f24fdc321017d3ee766aaa54c39863d9fc90 Mon Sep 17 00:00:00 2001 From: John Jannotti Date: Thu, 25 Apr 2024 13:20:37 -0400 Subject: [PATCH 5/5] omitEmpty the new account fields --- idb/postgres/postgres.go | 49 +++++++++++++++++----------------------- 1 file changed, 21 insertions(+), 28 deletions(-) diff --git a/idb/postgres/postgres.go b/idb/postgres/postgres.go index 248d1de5b..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 @@ -1135,9 +1128,9 @@ func (db *IndexerDb) yieldAccountsThread(req *getAccountsRequest) { account.TotalBoxes = accountData.TotalBoxes account.TotalBoxBytes = accountData.TotalBoxBytes - account.IncentiveEligible = boolPtr(accountData.IncentiveEligible) - account.LastHeartbeat = uint64Ptr(uint64(accountData.LastHeartbeat)) - account.LastProposed = uint64Ptr(uint64(accountData.LastProposed)) + account.IncentiveEligible = omitEmpty(accountData.IncentiveEligible) + account.LastHeartbeat = omitEmpty(uint64(accountData.LastHeartbeat)) + account.LastProposed = omitEmpty(uint64(accountData.LastProposed)) } if account.Status == "NotParticipating" { @@ -1309,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), @@ -1497,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 @@ -1509,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