diff --git a/cmd/goal/account.go b/cmd/goal/account.go index 794d646ef3..a707aaa4ff 100644 --- a/cmd/goal/account.go +++ b/cmd/goal/account.go @@ -695,6 +695,8 @@ func printAccountInfo(client libgoal.Client, address string, onlyShowAssetIDs bo frozen := "" if assetHolding.IsFrozen { frozen = " (frozen)" + } else if assetParams.Params.Frozen != nil { + frozen = " (globally frozen)" } fmt.Fprintf(report, "\tID %d, %s, balance %s %s%s\n", assetHolding.AssetID, assetName, amount, unitName, frozen) diff --git a/cmd/goal/asset.go b/cmd/goal/asset.go index 1625b13676..00a1e56249 100644 --- a/cmd/goal/asset.go +++ b/cmd/goal/asset.go @@ -115,7 +115,6 @@ func init() { freezeAssetCmd.Flags().StringVar(&account, "account", "", "Account address to freeze/unfreeze") freezeAssetCmd.Flags().BoolVar(&assetFrozen, "freeze", false, "Freeze or unfreeze") freezeAssetCmd.MarkFlagRequired("freezer") - freezeAssetCmd.MarkFlagRequired("account") freezeAssetCmd.MarkFlagRequired("freeze") optinAssetCmd.Flags().StringVar(&assetUnitName, "asset", "", "Unit name of the asset being accepted") @@ -806,6 +805,7 @@ var infoAssetCmd = &cobra.Command{ fmt.Printf("Issued: %s %s\n", assetDecimalsFmt(asset.Params.Total-res.Amount, asset.Params.Decimals), derefString(asset.Params.UnitName)) fmt.Printf("Decimals: %d\n", asset.Params.Decimals) fmt.Printf("Default frozen: %v\n", derefBool(asset.Params.DefaultFrozen)) + fmt.Printf("Global freeze: %v\n", derefBool(asset.Params.Frozen)) fmt.Printf("Manager address: %s\n", derefString(asset.Params.Manager)) if reserveEmpty { fmt.Printf("Reserve address: %s (Empty. Defaulting to creator)\n", derefString(asset.Params.Reserve)) diff --git a/config/consensus.go b/config/consensus.go index c6c947046f..28dbc32ab2 100644 --- a/config/consensus.go +++ b/config/consensus.go @@ -554,6 +554,11 @@ type ConsensusParams struct { // Heartbeat support Heartbeat bool + + // Allow for afrz transactions to target the zero address, freezing that + // asset for all holders. Subsequent unfreezing of an individuals holdings + // allows them to transfer the asset again. + EnableGlobalFreeze bool } // ProposerPayoutRules puts several related consensus parameters in one place. The same @@ -1396,6 +1401,7 @@ func initConsensusProtocols() { vFuture.LogicSigVersion = 12 // When moving this to a release, put a new higher LogicSigVersion here vFuture.EnableAppVersioning = true // if not promoted when v12 goes into effect, update logic/field.go + vFuture.EnableGlobalFreeze = true Consensus[protocol.ConsensusFuture] = vFuture diff --git a/daemon/algod/api/algod.oas2.json b/daemon/algod/api/algod.oas2.json index 9c37f8d931..6c164c62d2 100644 --- a/daemon/algod/api/algod.oas2.json +++ b/daemon/algod/api/algod.oas2.json @@ -3476,6 +3476,10 @@ "description": "\\[f\\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", "type": "string" }, + "frozen": { + "description": "\\[fr\\] Whether this asset is frozen.", + "type": "boolean" + }, "manager": { "description": "\\[m\\] Address of account used to manage the keys of this asset and to destroy it.", "type": "string" diff --git a/daemon/algod/api/algod.oas3.yml b/daemon/algod/api/algod.oas3.yml index fa5a2b8268..c65302683e 100644 --- a/daemon/algod/api/algod.oas3.yml +++ b/daemon/algod/api/algod.oas3.yml @@ -1617,6 +1617,10 @@ "description": "\\[f\\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted.", "type": "string" }, + "frozen": { + "description": "\\[fr\\] Whether this asset is frozen.", + "type": "boolean" + }, "manager": { "description": "\\[m\\] Address of account used to manage the keys of this asset and to destroy it.", "type": "string" diff --git a/daemon/algod/api/server/v2/account.go b/daemon/algod/api/server/v2/account.go index 00d4720420..731b27013f 100644 --- a/daemon/algod/api/server/v2/account.go +++ b/daemon/algod/api/server/v2/account.go @@ -255,6 +255,12 @@ func AccountToAccountData(a *model.Account) (basics.AccountData, error) { if ca.Params.DefaultFrozen != nil { defaultFrozen = *ca.Params.DefaultFrozen } + var lastGlobalFreeze uint64 + if ca.Params.Frozen != nil { + // model.Asset doesn't know the LastGlobalFreeze value, so we + // fake it by setting it to MaxUint64 for basics.AssetParams. + lastGlobalFreeze = math.MaxUint64 + } var url string if ca.Params.Url != nil { url = *ca.Params.Url @@ -269,17 +275,18 @@ func AccountToAccountData(a *model.Account) (basics.AccountData, error) { } assetParams[basics.AssetIndex(ca.Index)] = basics.AssetParams{ - Total: ca.Params.Total, - Decimals: uint32(ca.Params.Decimals), - DefaultFrozen: defaultFrozen, - UnitName: unitName, - AssetName: name, - URL: url, - MetadataHash: metadataHash, - Manager: manager, - Reserve: reserve, - Freeze: freeze, - Clawback: clawback, + Total: ca.Params.Total, + Decimals: uint32(ca.Params.Decimals), + DefaultFrozen: defaultFrozen, + LastGlobalFreeze: lastGlobalFreeze, + UnitName: unitName, + AssetName: name, + URL: url, + MetadataHash: metadataHash, + Manager: manager, + Reserve: reserve, + Freeze: freeze, + Clawback: clawback, } } } @@ -491,6 +498,7 @@ func AssetParamsToAsset(creator string, idx basics.AssetIndex, params *basics.As Total: params.Total, Decimals: uint64(params.Decimals), DefaultFrozen: &frozen, + Frozen: omitEmpty(uint64ToBool(params.LastGlobalFreeze)), Name: omitEmpty(printableUTF8OrEmpty(params.AssetName)), NameB64: sliceOrNil([]byte(params.AssetName)), UnitName: omitEmpty(printableUTF8OrEmpty(params.UnitName)), diff --git a/daemon/algod/api/server/v2/generated/data/routes.go b/daemon/algod/api/server/v2/generated/data/routes.go index c3fbbd17b4..15d1c897c1 100644 --- a/daemon/algod/api/server/v2/generated/data/routes.go +++ b/daemon/algod/api/server/v2/generated/data/routes.go @@ -234,109 +234,109 @@ var swaggerSpec = []string{ "FadWT0KKijWkOUVDlEYlhqnlNZdUj931I37lexsgT7/rda00pps06cixAnKxSVp93759U+TDKKFCrASV", "Gq8NRLWs/UCMcloiFfl64E2CEI+a8yV7OI8K6vvdKMSVMGJRArZ4RC0W3OB12Xjdmy5ueSDt2mDzxxOa", "r2tZaCjs2hBijWKNiotCXhP/uAB7DSDZQ2z36Cv2GUZ+GnEF9x0WvRA0e/roK4zboT8epm5ZXyp+H8su", - "kGeHmPA0HWPoK43hmKQfNR3kvdQAv8P47bDnNFHXKWcJW/oL5fBZ2nDJV5B+BrI5ABP1xd3EqIEeXiQ5", - "HcBYrXZM2PT8YLnjTyNPyx37IzBYrjYbYTc+PtCojaOntlA1TRqGw5JuofJWgCt8xDDbKqEmfwI1hm9G", - "noZhMPSP6AqO0TpnnHKMlqINgA+VT9l5SGGMpciaCmSEGzeXWzrKkhgPv2SVFtKimaW2y+xPTi3WPHfs", - "72QM3Gzx5ZNESa9uSRh5HOAfHe8aDOirNOr1CNkHmcX3ZZ9JJbON4yjF/TaVQ3QqR+OB05GfY+Gn+4ee", - "Kvm6UbJRcqs75MYjTn0rwpN7BrwlKTbrOYoej17ZR6fMWqfJg9duh35+9cJLGRulU3UJ2uPuJQ4NVgu4", - "wod56U1yY95yL3Q5aRduA/2nDbMKImckloWznFQEIsfpvjf5Tor/5Yc2wTr6b+nBY88GqHTC2untdh85", - "qPE4q1vfTUxxafhtBHOT0YajDLEyEuRPUfxNn08RltQHifa8Y3B89BvTTgdHOf7BAwT6wYO5F4N/e9z9", - "TOz9wYN0nuOkyc392mLhNhox9k3t4dcqYQD7Wm2JC4e4JZ+GIWGATF5S7mZc+DHmrFuB7uOLD3fzfiwd", - "zZom/7B+/NxHwCfmjrhj+041FlKdZHTCNQ7KZyZ93QeDLaINcKMuoFROdYor6sRW6iTZ9W6wQIGfFt9u", - "8R7gJLZrURa/tL7DHnvUXObrZIjtwnX8lSTPzsVCDCBZpGPNpYQyORxpbL8GzS6he/5VTZ1nI+TEtv0S", - "rrTc3uJawLtgBqDChA69wpZughir3ZxTTU6DcqUKhvO0FSHakz8s9ZyqP5l4HIzDbmrrgz7xIbXP1rMU", - "JcYwpr2h2DLT3I7wE6yHHorzuHGwPLkh5ZlGB8242OB1Y/imKgFP5hVop/mrJT5I7XbH/GM4clTugZnK", - "fcKWmO1BMVtrydRyGS0DpBUayt2cVdwYGuShWxZsce7Z00cPHyaNOYidCSslLIZl/tQu5dEpNqEvvkIR", - "5dE/CtjDsH5oKeqYjR0Sji/IiBWVUzyVSi2jvQN9f+5KomKMTeHQE/Ydpg1yRNzJE49GuJCBt5uNsq5K", - "xYs5ZgZ+/c3ZC0azUh8qMU/FIFdog+qSf9JpMD07Z0iLNJJ2Zvo4+/NguFUbmzW1G1OJ/VyLtrqk6AWs", - "oHUqxs4Je06GwSY6gyZhmF9ab6CISkWSaorE4f5jLc/XaHHrXPPjvHJ6FdPAzlp/RPR0rykdhAzbwe0L", - "mVId0znDot7XwgA+Z4cr6OYSbBJreotvyC3YXZ6upSRKOabWd1Mo6Fi0B+BITAuu8iRkPcQfaW+hYsbH", - "FnW9wF7phwy9CrE9X3bITBfyU7MfvMk851JJkWMdgZS4iHnPpjnfJpRcSHvNzMyf0MThStalbR7SeiyO", - "VqoNjNAjbujIjr66TSXqoD8tbH29shVY4zkbFPNQJtq7eYQ04EtBOSKK+aTSiVCd5CuCJizgSDLClEYj", - "drtv3bcfvVUXM0pcCon2G482r3yQI6Y0Av2tkgnLVgqMX0/3KYx54/qcYIrDArbvTl6olcgvxArHoOAw", - "t2wKuBwOdRbCL324o2v7zLX1ieebnztBTjTpWVX5SceLiCcFSbuVowhOReOE8IgIuc348Wh7yG1v3DTe", - "p47Q4ApjsaDCe3hAGE0h6u4o3zhFiigKWzB6jpjMPitkAowXQgbHYPqCyJNXAm4MnteRfibX3JLuMImn", - "vQZejrwewOe95Fm+7VD9tPsOJbjGMMf4NrY1tEcYR9Oglfi53LFwKBx1R8LEM142cceJitgoVXkhiiI1", - "ezWyU4zDMe4svDfsoOvg27emO5ayOPYmGkvwt6iLFdiMF0UqL9TX+JXh1/DCCraQ100Fp+ZpXTfB95Da", - "/ES5kqbe7JkrNLjldFHR+QQ1xIXvww5jmprFDv9NlS8a3xkfcXz0k9YQXlwcl9V++EQ3JfU6ms6MWGXT", - "MYF3yu3R0U59M0Jv+98ppYe3rn8XT1l7XC7eoxR/+8ZdHHHW20HUNV0tTVJajHBW+D1kC2rSKXa5El5l", - "gyJd6MvHzUtsWQ/40DAJ+BUvR56Rxx4Aul/JKj72mDwfzX3Arc9tZTnby4JG8wVRBGzPpzB0jI1FvVLQ", - "693Z4v1a9yJ03CP1fcf/RJFPLbMY9TvdzDXUbvCxviGfrX9o0uRlqfLJp94Pc+Y6jefCVJuNTxKdiMy6", - "2qgipvM4xgcgzbQo6DQRyI66Z/IbKkbJL/o6PVrHZnGsqZTQ6Jcwp/dtAbwADE0dTxSZSD1m2beixCo/", - "/3Hx04+z8Y2MdmC4pT43bdKoPLYxzROgPnmsVAcf9bjtRMkypUTMZ2bEyI0ZaNKnwZdyTX74lox2U0Ci", - "RC3HtH4xdfABAaxUKvX6MJHGrN2IgPaIDtqNJV4S00WKHvpVdxIaDZkg2yasqQ05qVZkR/KZUuQnVU/G", - "y//BHkrXh893RUV2BvV5Bqzz+RSRb4CPD/PZeXGUUJSqSTSjUVKs9YVYrS2WNPgL8AL0ywMlG9oyDajV", - "VMqItkRr6QbzOXLXONzJ1GcSr9fg01uEl9KDsUL47BXkFuvytmGBGuCYAhRusuDY+2fphnG20Lwm8RUb", - "9pVpGBbjPSDHDTJLRdnRqJDpyfSiBGdN8De9Xbvmps1n03tUPvlp63IJOaaN3pvJ6z/XIKMsUfNge0NY", - "llFiL9G8wMLE58dblluA9iXa2gtPVIDo1uCMPfS/hN09wzrUkKys2jw/vElmZcQAuTlDku0xZ4GPdxOm", - "oQzEQghm9rmq2+oho0mxo7x0N5wrkKS7ONpcdXumTFeFnzSX63pUXkwU+8aSfQ2LSo/rmM+xhrfxoX28", - "ycwcW2LY+bCy0LXP7Ix51xr/WMjxDCb8FpIs0iyluPQFFhAr5I285roILe4kaxbdTSIN9LKZWbRPT4aB", - "LIlaFfiKKy+VEyOysadw3dceTajkPUMxrW2GI4RrCVpD0bi9SmUgsyo8VdkHxz5UUODujZBgRutDEXCj", - "ucFftcnPsU4ex1zg3MfrxgtkGjbcQaejFOXjc+5D9jP6HrIUhDppB62IDb0eLtgbHh0JM0BiTPVL5m/L", - "w9kPbmJQFFKCzoJ3sZ+vXHZT1mFi0qLO6YKOD0ZjdJ2cXGgPK0na4vLhKns6QvS8/xJ2p2TRCJWOww7G", - "QJPkRKBHGVl7m3ynJlaTgnt1J+B92kR7lVJlNuLQOh8mWe9T/KXILwGTJDbB+SNF7Nln6EdpIhau17uQ", - "VLyqQEJx/4SxM0nPoULwQrf+Ym9yec/um3+LsxY11T3whtOTtzL9rgQrEuhbcrMwzH4eZsCxultORYMc", - "SOG9lWNhVddYvaBb5vRkqlY+DCfol9lviYqgSMkkF+SVfIYHPVV9HJM3RFlG0FnNmfdmMlOqVBTyTRJM", - "uKHSmIonQ4AsyCl5Dhoo/OBJBCQLxydOIeUG9FkB1ZJpaAMFbpoecVjjPqXR92duZunyu6XS0KlW73pT", - "KtTmyQ7mGcX/LITVXO9uksRwUGN/YD0ZxfLBkLsm2q5dSBtxN8RhWarrDJlV1hQCSam2rp3pXsahKl3b", - "z53qBUSxe9x4QW3H1rxgudIa8rhH+qUqQbVRGrJSYShfKspgaZ3cvcHnaZKVasVUlasCqKBOmoLG5qql", - "5Cg2QRQ5lUQB0Q6+c6Y+ER1PnNLdqeQrzFDUOph/Pmz+a9eH3ty3aa9o0Rn5q0ei0sH4NFceQ9R4CC8S", - "DiVs6dsS07x5KbZIN6BTR37JrK5hznyLfhFxf/C5BrYRxhAoDS1di7LEJ+9iG3nXm+CUNGpHxN5zDJ29", - "Ehhf1U1/QNJw5e68JidEzAMu4oRNzK61qlfrKAN3A2dQeXXtFeJ4lJ9NjSFw+PbNTfGEbZSxXtOkkdol", - "t2GFn+VKWq3KsmuUIhF95T2QP/DtWZ7bF0pdLnh+eR/1Wqlss9JiHl6G9wNA25l0L/da9wLOqN774VzG", - "1A7DIT3RTmaQPRZ3dOX7CMx3hznoYZv72XBh/XV1mWlajTmTjFu1EXn6TP1jRVSOxkGmWFQy2xoVn6T8", - "GNgMD3t8WTUBNMgih2gGyZPV886YZwQ+kADZjfsvSuD9cdkSPKMZuSiHzMVLUVk+Kuv1AEBI6dG2rTVV", - "rIwlsYarqBUlecAwiD6gE28VjDa7HWxuhDsHysKtgBpEuDYAfkbGhzllxaNo2YXahu/327R5NwL+w34q", - "7zCPsTC+i5a0NAXyhRQ7IxwhnQN8b8zba3ywv5ga+dZUF554w0cAjMfCdWCYFBF3LBhLLkooslRxyvPG", - "RjWPNG3//K5fM14Yz8lzXofakG7sWoNP+UIivu76vyruSEk1zYeWZFnAFujtzu+gFRV9nEf+FyipJmTP", - "GKCqrIQr6IQI+jw0NYqa4gpCX9N0ZgVAhd7Ivo0sFfsW3+U9w4lfexZFT03BbtKSQoilnWIHzCRJo85W", - "ZnRMzNSj5CC6EkXNO/gzx4ocXTOgO8oJVA10hCzokVOn+ZlGeBUGOAv9U6JMwMS7aXzoaBaURt0+BnQw", - "FrY2Y6depkNh4yRLjYMFZysaRyyReMs3TMWv5bhBckjyrbo1cZ+EkhFiv9lCjlKN13eg8BrPiJPC52tB", - "apcABWkFrkvC2r4GyaSKanBec9OoKm32x/ADTYyNhPTa9A2cym3E6u13luFgzPTSwI0qErqh05ub5z/J", - "Sdx7EEfHS9GIAf/Ec4/9K1C3VzuwAdY6l24/neyPVSz9Lea5+Jwt6jBQWaprKqoZ66HPIfhBifqCC8iL", - "5aK5lkNk7twnJu2bOkT0JmHDd0xp/MdpnX+reSmWO+QzBH7oxsyaOxLyjleKCPCRvm7i/eLVPAAWrC0q", - "TEXrFlPHjIbbuVEioN1FHqofKbbhlxBvAwY7EP/MrWOcpl6g5cJd2b3tHGLBLz4kl9nwItb0McVlt858", - "SHrsev/P9r1jPFXITFeVPA8lVH0Npy6fwTLJgbjsGjb7H8QO+Voggab0cku0OmRQKG5gMj2SdaVemYzV", - "p+mAPShJOyjNc6tlTLT89oqQ7HlKPGkpd70LU6NuBkDHhSwPgR/X9fw4+E9mnx1bxhTw/17wPlLJN4aX", - "ivZ+BCx3sqwkYCVr9UJtMw1LcyjAhMzVTp3XbX6WYGIVMtfADUXcnP/kFc82uaqQThGmmNDGp9mMUsBS", - "yJZZClnVNqHHYI5VuYsQFhv9Ea0jLrQxKcEJk1e8/OkKtBbF2Ma500E1L+MaGsHR4fsmTBjNnTocQJhW", - "h8M3uK0ZPW7mLnCq0kXhmsZyWXBdxM2FZDlod++za74zN/coNc6BQz4lHkkz3cwQkXcJSZsAKXfeKXxL", - "f08DIL9Dx88Ehw3GBSecNWTasWrEPzOE4R/CYbPh26xUK3wpOnIgfFZd9PCRCqgkmsFJPpu27jCPEb/D", - "/mmwoIBnRFbhrFOm2H/uf8KtRDXyZyns3pNPNsr+012Ku6WDGZAqV23wPxHL8DymXlv7BDvxi+sgbIYM", - "FYH2INpEGPEPde3iI7uIYRD+qX5sBJ9eD64baZF6002WgQwtBmZPeD+YNpSd5z48a2hKG5gaCClz/yL+", - "SEsb2efDvTQCHhXv92e9O20TMuPGOaaI3v438FmlqiyfEvNJNUcK7ybwkHZhHKGPyAkwsu4mPMY0VXg6", - "ua065XiOrSM4Wg7okLeryvcp/WNmohGO3nVBqCXyMiptj9YtfMnTGFPmQb0OPumuGaxhEowzDXmt0Ux8", - "zXeH67KN5Lq++MvZF48e//r4iy+Za8AKsQLT5kvv1TVr4wKF7Nt9Pm4k4GB5Nr0JIcMEIS74H8OjqmZT", - "/FkjbmvaZKiDqm7H2JcTF0Dq0eew0NWN9grHaUP7/762K7XIO9+xFAr++D3TqizT9SoauSrhQEntVuRC", - "cRpIBdoIYx0j7HpAhW0jos0azYOYtfiKMgYpmUOwH3sqEHYk5Cq1kLGAWuRn+H7fe40YbKvS8yry9Oxb", - "l9fTyEKHQiNGxSyAVaryor1YshRE+IJI19BYxr3hEy3iUYxsw2wpWjZFiD7yPE16cUXx/dy+W+3Wpjm9", - "28SEeBEO5Q1Ic8w/MZ6b4iacpDXt/93wj0SyjTvjGs1y/whekdQP9rw5PhvEPTSJJiaBNky8kCAPBGDk", - "tW3nnWT0UCxKoazJS4D+hOBA7osfP7SO5YPPQhCS0OEAePHz2bZd85LBg/OJUxP/0CAlWsq7MUroLP/Q", - "i9zAepuLJNoibzSxFgyxJTUUC6Pn1uZZ84p5RCsZPHbWSlnmNNOyTDySJjsOnqmYcJxKoK94+fG5xrdC", - "G3uG+IDi1fjTqPilbIxkQqW5WS7GF3zS3NGr2LubWr7Eh9n/CW6PkvecH8o74Qe3GRp3sKT/KtwK9Nab", - "XeOYFGT16Eu28GVCKg25MH3n/nUQTpqHoaDF0ge0wtYeeIl6aJ2/KHsLMl6GSBz2Y+Teanz2HsL2iH5i", - "pjJycpNUnqK+AVkk8JfiUXH14gPXxS1LStwstU+UpO/I1D7DusxTl4frwEunNjBc5+TbuoPbxEXdrm1q", - "XqrJlSnevn1jF1PSSaWrSLjumM/qTspJHFVM4g/IZEU48mP4eVMU88tYbmPK3zuSf723H7UoDwasdLLp", - "f5jPVpTMBvPF/+qr3nzcuzRAMJJRyi/9NuliCDGJtXYmj6aKkv9MSJHvuyXymuOrxrzWwu6w4nEwoIlf", - "kzWqv2tye/jcMI0vzd99Vl1CU9y+zQRSm3C7fqd4ifcRufiku4VUecK+oSzu/qD8+d7i3+DzPz0pHn7+", - "6N8Wf3r4xcMcnnzx1cOH/Ksn/NFXnz+Cx3/64slDeLT88qvF4+Lxk8eLJ4+ffPnFV/nnTx4tnnz51b/d", - "c3zIgUyAhvINT2f/OzsrVyo7e3mevXbAtjjhlfge3N6grrzEFFaI1BxPImy4KGdPw0//K5ywk1xt2uHD", - "rzNfWWq2trYyT09Pr6+vT+Iupyt8+p9ZVefr0zAPZjvryCsvz5sYfYrDwR1trce4qU0eKPft1TcXr9nZ", - "y/OTWVTRfvbw5OHJI1+UW/JKzJ7OPsef8PSscd9PMYfqqfHlEU6bt1of5oNvVUXFE9ynVZMozv21Bl5i", - "gh33xwasFnn4pIEXO/9/c81XK9An+HqDfrp6fBqkkdP3PnPCh33fTuPIkNP3nQQTxYGeIfLhUJPT96Ho", - "7/4BOwVffcxZ1GEioPuanS6w0M/UphCvbnwpqMaY0/coiI/+fuqtKemPqBDRSTsNiVpGWtKT/PTHDgrf", - "261byP7hXJtovJzbfF1Xp+/xP3hoohVRFtdTu5Wn6EA+fd9BhP88QET397Z73AITFAbg1HJJlZL3fT59", - "T/9GE8G2Ai2cNIpZdfyvlP3sFAvm7YY/76R3d5aQylnzszRA2nKoKrGTefv0reEj50VofLGTeRCbQ0wk", - "cofHDx/S9E/wPzNfUKqX2eXUn+eZaSro7zXadPKmIu/t2esaeOmBH9iTGcLw6OPBcC4pDtIxY7o0Psxn", - "X3xMLJxLJ9/wkmFLmv7zj7gJoK9EDuw1bCqluRbljv0sm1DOqLxvigIvpbqWAXIncdSbDdc7lOQ36goM", - "85WDI+JkGpzsROEeGALQ0jBeedzxkTezql6UIp/NKUvuO5TWbEpwCUak4UzBgNYO3j0V3x08E9N3oSsP", - "70lZMwnOA8kMaPhEfsnB/oa977tgaap7qQ2a/ZMR/JMR3CEjsLWWo0c0ur8w7xpU/olrzvM17OMHw9sy", - "uuBnlUollrjYwyx8BZsxXnHR5RVtqOHs6Ztp1Qu914MM2gUYd5hPgjLjJPVW19ANRwpnHn2u0V7vq8j+", - "4d3fxf3+jMtwnjs7Tm5NrksBuqECLodFhf7JBf6/4QJUHY3Tvs6ZhbI08dm3Cs8+eYB8Ok1JnrmJfKCT", - "/bQVpjs/nwa7RUoH7bZ83/mzq1eZdW0LdR3NghZ/clcNtQz3sTb9v0+vubDZUmmfdJMvLehhZwu8PPVV", - "lHq/toULBl+wGkP0Y/ycNPnrKffqRuob8rqxjgN9OPXVq3wjjUIUdPjcWt1iKxby2cZ+9ead43JYPt6z", - "4NYo8/T0FJ/FrJWxp7MP8/c9g0388V1DWKFc7qzS4grrWLybz7aZ0mIlJC8zb9VoS8HNHp88nH34fwEA", - "AP//sn63M9oKAQA=", + "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", + "Gm0puNnjk4ezD/8vAAD//wntaq8tCwEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/generated/experimental/routes.go b/daemon/algod/api/server/v2/generated/experimental/routes.go index d8672d7974..2d5845b29d 100644 --- a/daemon/algod/api/server/v2/generated/experimental/routes.go +++ b/daemon/algod/api/server/v2/generated/experimental/routes.go @@ -131,233 +131,233 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL var swaggerSpec = []string{ "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", - "AQAA//+DQtmvDAwBAA==", + "n//3V+gGSJAEJWpmYu9W3U/2iPjSaDQa/Q3dH2a52lRKgrRm9vTDrOKab8CCxr94nqta2kwU7q8CTK5F", + "ZYWSs6fhGzNWC7mazWfC/Vpxu57NZ5JvoG3j+s9nGv5eCw3F7KnVNcxnJl/DhruB7a5yrZuRttlKZX6I", + "Mxri/Pns454PvCg0GDOE8qUsd0zIvKwLYFZzaXjuPhl2Leya2bUwzHdmQjIlgakls+tOY7YUUBbmJCzy", + "7zXoXbRKP/n4kj62IGZalTCE85naLISEABU0QDUbwqxiBSyx0Zpb5mZwsIaGVjEDXOdrtlT6AKgERAwv", + "yHoze/p2ZkAWoHG3chBX+N+lBvgdMsv1Cuzs/Ty1uKUFnVmxSSzt3GNfg6lLaxi2xTWuxBVI5nqdsJ9q", + "Y9kCGJfs9ffP2JdffvmNW8iGWwuFJ7LRVbWzx2ui7rOns4JbCJ+HtMbLldJcFlnT/vX3z3D+C7/Aqa24", + "MZA+LGfuCzt/PraA0DFBQkJaWOE+dKjf9UgcivbnBSyVhol7Qo3vdFPi+T/rruTc5utKCWkT+8LwK6PP", + "SR4Wdd/HwxoAOu0rhyntBn37MPvm/YdH80cPP/7L27Psv/2fX335ceLynzXjHsBAsmFeaw0y32UrDRxP", + "y5rLIT5ee3owa1WXBVvzK9x8vkFW7/sy15dY5xUva0cnItfqrFwpw7gnowKWvC4tCxOzWpaOTbnRPLUz", + "YVil1ZUooJg77nu9Fvma5dzQENiOXYuydDRYGyjGaC29uj2H6WOMEgfXjfCBC/rHRUa7rgOYgC1ygywv", + "lYHMqgPXU7hxuCxYfKG0d5U57rJib9bAcHL3gS5bxJ10NF2WO2ZxXwvGDeMsXE1zJpZsp2p2jZtTikvs", + "71fjsLZhDmm4OZ171B3eMfQNkJFA3kKpErhE5IVzN0SZXIpVrcGw6zXYtb/zNJhKSQNMLf4GuXXb/h8X", + "L39mSrOfwBi+glc8v2Qgc1VAccLOl0wqG5GGpyXEoes5tg4PV+qS/5tRjiY2ZlXx/DJ9o5diIxKr+olv", + "xabeMFlvFqDdloYrxCqmwdZajgFEIx4gxQ3fDid9o2uZ4/6303ZkOUdtwlQl3yHCNnz754dzD45hvCxZ", + "BbIQcsXsVo7KcW7uw+BlWtWymCDmWLen0cVqKsjFUkDBmlH2QOKnOQSPkMfB0wpfEThhkFFwmlkOgCNh", + "m6AZd7rdF1bxFUQkc8J+8cwNv1p1CbIhdLbY4adKw5VQtWk6jcCIU++XwKWykFUaliJBYxceHY7BUBvP", + "gTdeBsqVtFxIKBxzRqCVBWJWozBFE+7Xd4a3+IIb+PrJ2B3ffp24+0vV3/W9Oz5pt7FRRkcycXW6r/7A", + "piWrTv8J+mE8txGrjH4ebKRYvXG3zVKUeBP9ze1fQENtkAl0EBHuJiNWkttaw9N38oH7i2XswnJZcF24", + "Xzb00091acWFWLmfSvrphVqJ/EKsRpDZwJpUuLDbhv5x46XZsd0m9YoXSl3WVbygvKO4Lnbs/PnYJtOY", + "xxLmWaPtxorHm21QRo7tYbfNRo4AOYq7iruGl7DT4KDl+RL/2S6RnvhS/+7+qarS9bbVMoVaR8f+Skbz", + "gTcrnFVVKXLukPjaf3ZfHRMAUiR42+IUL9SnHyIQK60q0FbQoLyqslLlvMyM5RZH+lcNy9nT2b+ctvaX", + "U+puTqPJX7heF9jJiawkBmW8qo4Y45UTfcweZuEYNH5CNkFsD4UmIWkTHSkJx4JLuOLSnrQqS4cfNAf4", + "rZ+pxTdJO4Tvngo2inBGDRdgSAKmhvcMi1DPEK0M0YoC6apUi+aHL86qqsUgfj+rKsIHSo8gUDCDrTDW", + "3Mfl8/YkxfOcPz9hP8RjoyiuZLlzlwOJGu5uWPpby99ijW3Jr6Ed8Z5huJ1Kn7itCWhwYv5dUByqFWtV", + "OqnnIK24xn/xbWMyc79P6vzPQWIxbseJCxUtjznScfCXSLn5okc5Q8Lx5p4TdtbvezOycaPsIRhz3mLx", + "rokHfxEWNuYgJUQQRdTkt4drzXczLyRmKOwNyeQXA0QhFV8JidDOnfok2YZf0n4oxLsjBDCNXkS0RBJk", + "Y0L1MqdH/cnAzvJPQK2pjQ2SqJNUS2Es6tXYmK2hRMGZy0DQManciDImbPieRTQwX2teES37LyR2CYn6", + "PDUiWG958U68E5MwR+w+2miE6sZs+SDrTEKCXKMHw7elyi//ws36Dk74Iow1pH2chq2BF6DZmpt14uD0", + "aLsdbQp9u4ZIs2wRTXXSLPGFWpk7WGKpjmFdVfWMl6WbesiyeqvFgScd5LJkrjGDjUCDuVccycJO+hf7", + "judrJxawnJflvDUVqSor4QpKp7QLKUHPmV1z2x5+HDnoNXiODDhmZ4FFq/FmJjSx6cYWoYFtON5AG6fN", + "VGW3T8NBDd9ATwrCG1HVaEWIFI3z52F1cAUSeVIzNILfrBGtNfHgJ25u/wlnlooWRxZAG9x3Df4aftEB", + "2rVu71PZTqF0QTZr634TmuVK0xB0w/vJ3X+A67YzUecXlYbMD6H5FWjDS7e63qLuN+R7V6fzwMksuOXR", + "yfRUmFbAiHNgPxTvQCesNC/xP7xk7rOTYhwltdQjUBhRkTu1oIvZoYpmcg3Q3qrYhkyZrOL55VFQPmsn", + "T7OZSSfvO7Ke+i30i2h26M1WFOautgkHG9ur7gkh21VgRwNZZC/TieaagoA3qmLEPnogEKfA0Qghanvn", + "19q3apuC6Vu1HVxpagt3shNunMnMHuH7H7nUExaibn6EfIqbhhe4jO8GB3brejxbKH0zgal3h0rWOlQZ", + "d6NG8uK8RwfYtK4yz34SThlq0BuojWHZL+f0h09hq4OFC8v/ACwYN+pdYKE70F1jQW0qUcIdnO51Uk5d", + "cANfPmYXfzn76tHjvz7+6mtHkpVWK803bLGzYNgX3vLIjN2VcD950FCASo/+9ZPghuuOmxrHqFrnsOHV", + "cChy75GCT82YazfEWhfNuOoGwElMH9ztTWhn5Ll2oD2HRb26AGudMv9Kq+WdM/zBDCnosNGrSjvZyXRd", + "oV4gPC1ck1PYWs1PK2wJsqBQCrcOYZyau1ncCVGNbXzRzlIwj9ECDh6KY7epnWYXb5Xe6fouLDigtdJJ", + "KaPSyqpclZkTZYVK3HWvfAvmW4Ttqvq/E7Tsmhvm5kYHbS2LkSvNbuX0K5qGfrOVLW72ike03sTq/LxT", + "9qWL/FbRqkBndisZUmfnpl1qtWGcFdgRxakfwJKIKTZwYfmmerlc3o1BV+FACZFAbMC4mRi1cAKegVxJ", + "ilc8cPv7Uaegp4+Y4Eiz4wB4jFzsZI7ewLs4tuOC0UZIDE0wO5lHUpKDsYRi1SHL21vpxtBBU90zCXAc", + "Ol7gZ3RHPIfS8u+VftNK6D9oVVd3zp77c05dDveL8Q6PwvUNlm4hV2U3RnblYD9JrfGzLOhZYyehNSD0", + "SJEvxGptI5X4lVZ/wJ2YnCUFKH4ge1jp+gytYj+rwjETW5s7ECXbwVoO5+g25mt8oWrLOJOqANz82qSF", + "zJGoSgznwig0G8utaIIRhi3AUVfOa7faumIYYzW4L9qOGc/phGaIGjMSYdKEBlErmo4i9koNvNixBYBk", + "auHDOHyACS6SY4CYDWKaF3ET/KIDV6VVDsZAkXlr+0HQQju6OuwePCHgCHAzCzOKLbm+NbCXVwfhvIRd", + "huGMhn3x46/m/meA1yrLywOIxTYp9PZNhkOop02/j+D6k8dkR8ZIolon3joGUYKFMRQehZPR/etDNNjF", + "26PlCjRGzfyhFB8muR0BNaD+wfR+W2jraiRI36vpTsJzGya5VEGwSg1WcmOzQ2zZNerYEtwKIk6Y4sQ4", + "8Ijg9YIbS5FeQhZotqXrBOchIcxNMQ7wqBriRv41aCDDsXN3D0pTm0YdMXVVKW2hSK0BjXujc/0M22Yu", + "tYzGbnQeq1ht4NDIY1iKxvfI8how/sFtY8rzxsHh4jBswN3zuyQqO0C0iNgHyEVoFWE3DlQeAUSYFtFE", + "OML0KKeJjp7PjFVV5biFzWrZ9BtD0wW1PrO/tG2HxEV+HLq3CwUGfUS+vYf8mjBLIeprbpiHI1hr0ZxD", + "IWlDmN1hzIyQOWT7KB9VPNcqPgIHD2ldrTQvICug5LuEnZk+M/q8bwDc8VbdVRYyijVOb3pLySG0c8/Q", + "CsczKeGR4ReWuyPoVIGWQHzvAyMXgGOnmJOno3vNUDhXcovCeLhs2urEiHgbXinrdtzTA4LsOfoUgEfw", + "0Ax9c1Rg56zVPftT/BcYP0EjRxw/yQ7M2BLa8Y9awIgt2D/jis5Lj733OHCSbY6ysQN8ZOzIjhimX3Ft", + "RS4q1HV+hN2dq379CZKxAawAy0UJBYs+kBpYxf0ZRcn2x7yZKjjJ9jYEf2B8SywnRCJ1gb+EHercr+j5", + "RWTquAtdNjGqu5+4ZAhoCOp2InjcBLY8t+XOCWp2DTt2DRqYqRcUpTH0p1hVZfEASf/Mnhm9Azrp/t3r", + "Eb/AoaLlpdyWpBPsh+9NTzHooMPrApVS5QQL2QAZSQgmhcewSrldF/6FV3jjEyipA6Rn2hh90Fz/90wH", + "zbgC9l+qZjmXqHLVFhqZRmkUFFCAdDM4EayZ08dfthiCEjZAmiR+efCgv/AHD/yeC8OWcB2eRbqGfXQ8", + "eIB2nFfK2M7hugN7qDtu54nrAx1X7uLzWkifpxwO6vIjT9nJV73BG2+XO1PGeMJ1y781A+idzO2Utcc0", + "Mi2gDced5MvphkAN1o37fiE2dcntXXit4IqXmboCrUUBBzm5n1go+d0VL1823fDJJ+SORnPIcnyoOHEs", + "eOP60NtGN46Qwh1getcwFSA4p14X1OmAitkGPYjNBgrBLZQ7VmnIgZ70OcnRNEs9YRTsn6+5XKHCoFW9", + "8nESNA4y/NqQaUbXcjBEUqiyW5mhkTt1AfhIvPCq04lTwJ1K17eQkwJzzZv5/EPeKTdztAd9j0HSSTaf", + "jWq8DqlXrcZLyOk+TZ1wGXTkvQg/7cQTXSmIOif7DPEVb4s7TG5z/xiTfTt0CsrhxFFQc/txLK7Zqdvl", + "7g6EHhqIaag0GLyiYjOVoa9qGT9DD9GQO2NhM7TkU9e/jhy/16P6opKlkJBtlIRdMvOKkPATfkweJ7wm", + "RzqjwDLWt6+DdODvgdWdZwo13ha/uNv9E9r3WJnvlb4rlygNOFm8n+CBPOhu91Pe1E/KyzLhWvSPVPsM", + "wMybyDmhGTdG5QJltvPCzH3gM3kj/YvWLvpfNU9v7uDs9cft+dDi/AdoI4ayYpzlpUALspLG6jq37yRH", + "G1W01EQQV1DGx62Wz0KTtJk0YcX0Q72THAP4GstVMmBjCQkzzfcAwXhp6tUKjO3pOkuAd9K3EpLVUlic", + "a+OOS0bnpQKNkVQn1HLDd2zpaMIq9jtoxRa17Ur/+AbbWFGW3qHnpmFq+U5yy0rgxrKfhHyzxeGC0z8c", + "WQn2WunLBgvp230FEowwWTrY7Af6ik8X/PLX/hkDRvTT5xBX2yaFmLlldvLA/J8v/v3p27Psv3n2+8Ps", + "m//v9P2HJx/vPxj8+Pjjn//8f7s/ffnxz/f//V9TOxVgT70Q9pCfP/ea8flzVH+i1wh92D+Z/X8jZJYk", + "sjiao0db7AvMhuEJ6H7XOGbX8E7arXSEdMVLUTjechNy6N8wg7NIp6NHNZ2N6BnDwlqPVCpuwWVYgsn0", + "WOONpahhfGb6LT46Jf3zejwvy1rSVgbpm56ahvgytZw3+RYoFdtTho/x1zwEefo/H3/19WzePqJvvs/m", + "M//1fYKSRbFNpUooYJvSFeN3IPcMq/jOgE1zD4Q9GUpHsR3xsBvYLECbtag+PacwVizSHC68yvI2p608", + "l/SGwZ0fdHHuvOdELT893FYDFFDZdSpFU0dQw1btbgL0wk4qra5Azpk4gZO+zadw+qIP6iuBL0NgqlZq", + "ijbUnAMitEAVEdbjhUwyrKTop/eCw1/+5s7VIT9wCq7+nKmI3ns/fPeGnXqGae5R1g4aOsqzkFCl/fvQ", + "TkCS42bxs7l38p18Dku0Pij59J0suOWnC25Ebk5rA/pbXnKZw8lKsafhyelzbvk7OZC0RnNHRu/CWVUv", + "SpGzy1ghacmT8oENR3j37i0vV+rdu/eD2Iyh+uCnSvIXmiBzgrCqbeazGWUarrlO+b5Mk80GR6Z0Zftm", + "JSFb1WQgDdmS/PhpnseryvSzWgyXX1WlW35EhsbnbHBbxoxVzZM7J6D4V8tuf39W/mLQ/DrYVWoDhv22", + "4dVbIe17lr2rHz78Eh8vtmkefvNXvqPJXQWTrSujWTf6RhVcOKmVGKueVXyVcrG9e/fWAq9w91Fe3qCN", + "oywZdus8rAwPDHCodgHNK+7RDSA4jn7/jIu7oF4hc2V6CfgJt7D7xvxW+xWlCLjxdh1IM8Bru87c2U6u", + "yjgSDzvTJLRbOSErRGMYsUJt1ef+WwDL15Bf+qRssKnsbt7pHgJ+vKAZWIcwlK6PHlFiwih0UCyA1VXB", + "vSjO5a6fucfQiwoc9DVcwu6NavNNHZOqp5s5xowdVKTUSLp0xBofWz9Gf/N9VFl4S+sTsOD71EAWTxu6", + "CH3GDzKJvHdwiFNE0clsMoYIrhOIIOIfQcENFurGuxXpp5YnZA7SiivIoBQrsUhlGv7PoT8swOqo0idX", + "9FHIzYCGiSVzqvyCLlav3msuV+CuZ3elKsNLShybDNpAfWgNXNsFcLvXzi/jt40BOlQpr/FxOVr45m4J", + "sHX7LSxa7CRcO60CDUXUxkcvn4zHnxHgUNwQntC91RRORnVdj7pEUsVwKzfYbdRaH5oX0xnCRd83gFlZ", + "1bXbFweF8glFKW9NdL/Uhq9gRHeJvXcTU350PH44yCGJJCmDqGVf1BhIAkmQqXHm1pw8w+C+uEOMamYv", + "IDPMRA5i7zPCPOEeYYsSBdgmcpX2nuuOF5USH4+BlmYtoGUrCgYwuhiJj+Oam3AcMSVs4LKTpLM/8AXx", + "vux751EsYZT3tcmtF27DPgcd6P0+B19IvBey7cVK/4TMeU73wucLqe1QEkXTAkpY0cKpcSCUNidUu0EO", + "jpfLJfKWLBWWGBmoIwHAzwFOc3nAGPlG2OQRUmQcgY2BDzgw+1nFZ1OujgFS+pxWPIyNV0T0N6Qf9lGg", + "vhNGVeUuVzHib8wDB/DZNlrJohdRjcMwIefMsbkrXjo253XxdpBBEjhUKHop33zozf0xRWOPa4qu/KPW", + "RELCTVYTS7MB6LSovQfihdpm9EI5qYsstgtH78m3C/heOnUwKd3ePcMWaovhXHi1UKz8AVjG4QhgRLaX", + "rTBIr9hvTM4iYPZNu1/OTVGhQZLxhtaGXMYEvSlTj8iWY+TyRZRB70YA9MxQbTkKb5Y4aD7oiifDy7y9", + "1eZtZtjwLCx1/MeOUHKXRvA3tI91c979pc1tOJ4/LZyoT5Lsb2hZuk0SRupcUWLFY3Iw9smhA8QerL7q", + "y4FJtHZjvbp4jbCWYiWO+Q6dkkO0GSgBleCsI5pml6lIAafLA97jF6FbZKzD3eNydz8KINSwEsZC6zQK", + "cUGfwxzPMUO0Usvx1dlKL936XivVXP7kNseOnWV+8hVgBP5SaGMz9Lgll+AafW/QiPS9a5qWQLshilRP", + "QRRpjovTXsIuK0RZp+nVz/vjczftz81FY+oF3mJCUoDWAut/JAOX90xNse17F/yCFvyC39l6p50G19RN", + "rB25dOf4JzkXPQa2jx0kCDBFHMNdG0XpHgYZPTgfcsdIGo1iWk72eRsGh6kIYx+MUgvP3sdufhopuZYo", + "02H6haBaraAIGdyCP0xGefJKJVdRoaqq2pcW8IRRdj5MrrcnL58Pw4exIPxI3M+ELGCbhj7WChDy9mUd", + "5hTESVYgKV1J2iyURE0c4o8tIlvdJ/aF9h8AJIOg3/Sc2W10Mu1Ss524ASXwwuskBsL69h/L4YZ41M3H", + "wqc7yV33HyEcEGlK2Kh2yzANwQgD5lUlim3P8USjjhrB+FHW5RFpC1mLH+wABrpB0EmC62QL96HW3sB+", + "ijrvqdPKKPbaBxY7+ua5f4Bf1Bo9GJ3I5mFq+kZXm7j2H3+9sErzFXgvVEYg3WoIXM4xaIgSvxtmBYWT", + "FGK5hNj7Ym7iOegAN7CxFxNIN0FkaRdNLaT9+kmKjA5QTwvjYZSlKSZBC2M++TdDL1eQ6SNTUnMlRFtz", + "A1dV8rn+j7DLfuVl7ZQMoU0bnuvdTt3L94hdv9r8CDsc+WDUqwPswK6g5ek1IA2mLP3NJxPl6L5nOlUM", + "UL3sbOERO3WW3qU72hpfd2Kc+NtbplOXobuU2xyMNkjCwTJlNy7SsQnu9EAX8X1SPrQJojgsg0TyfjyV", + "MKFK5/AqanJRHKLdN8DLQLy4nNnH+ex2kQCp28yPeADXr5oLNIlnjDQlz3AnsOdIlPOq0uqKl5mPlxi7", + "/LW68pc/Ng/hFZ9Yk0lT9pvvzl688uB/nM/yErjOGkvA6KqwXfVPsyqqVLH/KqGE5t7QSZaiaPObpNNx", + "jMU1Ji/vGZsGdV/a+JnoKPqYi2U64P0g7/OhPrTEPSE/UDURP63PkwJ+ukE+/IqLMjgbA7Qjwem4uGnF", + "g5JcIR7g1sFCUczXrccafdzw7t3bq4DH1k1AATNNCvlEBJWZYCDvM5H0IWyJ+ADrwyW9xAyYacVG+vyY", + "yPF8jBG/cyHte6U7d4x/AJmMUfrjpDcnyxMeR0LCQyXQvsx2wki++231mzv0Dx7EJ/rBgzn7rfQfIgDx", + "94X/HdWYBw+STsqktczxIjSGSb6B+81jjtGN+LR6voTraXLA2dWmEWDVOBk2FErBRgHd1x5711p4fBb+", + "lwJKcD+dTLEFxJtO6I6BmXKCLsYePDaxrBsqPmqYkv3QbXxr60gL7xRf3IJ8vsMjJOsN+kkzU4o8HUEi", + "F8ZxH0kxm64xw8YjRmE3Yi1GQoBlLaKxXLMpqVl7QEZzJJFpktlhW9wtlD/etRR/r4GJwilPSwEar8/e", + "jRp0EBx1IPemzW9+YHKHtcPfxtyyx60VTE77bC173YTPG9dVWGiqfNKRgebxjAPGvSdI3NNHuOXw0dy6", + "G+k5TV2aUoQ+MDrvExyZI1lUXphsqdXvkL6w0U2VyLcR/KsCrcm/g0wFCPZZSuO7bmvjt7Mf2u7pKvjY", + "xt9a5Q6Lbuq33eQyTZ/q4zbyJrq1SWeF9kge0/XiQIbuC4QR1oLHK4q5xYoaIciJSzpPlGyi85AtfSrj", + "J6OnNH57Kj3Mg2e2Jb9e8FS1HadyOZii7e2EY1nFQuewAaZJpUCzsyhQvGkrKGFdBbp1dQyT395QfaJp", + "JytOrZ6EFBVrSHOKhiiNSgxTy2suqR6760f8yvc2QJ5+1+taaUw3adKRYwXkYpO0+r5797bIh1FChVgJ", + "KjVeG4hqWfuBGOW0RCry9cCbBCEeNedL9nAeFdT3u1GIK2HEogRs8YhaLLjB67Lxujdd3PJA2rXB5o8n", + "NF/XstBQ2LUhxBrFGhUXhbwm/nEB9hpAsofY7tE37AuM/DTiCu47LHohaPb00TcYt0N/PEzdsr5U/D6W", + "XSDPDjHhaTrG0FcawzFJP2o6yHupAX6H8dthz2mirlPOErb0F8rhs7TvwtLx6qMV772p3B5IvoL0y5LN", + "gWVSXyQQDETooVqSHwOM1WrHhE0uaQOWO5Y38lrdcVQCg+VqsxF240MOjdo4Em1rX9OkYTisEheKeQW4", + "wkeM3K0Smvdn0Iz4ZuS1GcZX/4ze5Ritc8YpbWkp2pj6UEyVnYesyFjdrClqRrhxc7mlo3iKIfZLVmkh", + "LVpuarvM/uQ0bc1zx1FPxsDNFl8/SVQJ61aZkccB/snxrsGAvkqjXo+QfRCDfF/2hVQy2zgmVdxvs0NE", + "B300xDgdTDoW0bp/6KnCtBslGyW3ukNuPGL+tyI8uWfAW5Jis56j6PHolX1yyqx1mjx47Xbol9cvvOCy", + "UTpV6qA97l6I0WC1gCt865feJDfmLfdCl5N24TbQf97IrSDFRpJeOMtJ3SLyxe575u8Ug19/anO2o0uY", + "3lD2zIpKJwyo3hT4ieMkjzPk9T3PFOqG30YwNxltOMoQKyPvBuhhQNPnc0Q69UGiPe/YMB/9xrRT61E1", + "ePAAgX7wYO4l698edz8Te3/wIJ06OWnFc7+2WLiNko19U3v4rUrY1L5VW+LCIRTKZ3ZI2DSTl5S7GRd+", + "jDnrFrX79OLD3TxJSwfIpsk/rB8/9xHwmbkj7ti+U421WSfZsXCNg4qcSff5wfiNaAPcqAsoldPG4iI9", + "seE7SXa9GyxQ4OfFt1u8BziJ7VqUxa+tO7LHHjWX+ToZtbtwHf9KkmfnYiEGkKz7seZSQpkcjjS2vwbN", + "bqj78b+pqfNshJzYtl8VlpbbW1wLeBfMAFSY0KFX2NJNEGO1m8aqSZNQrlTBcJ62yER78ofVo1MlLRPv", + "jXHYTW19HCm+zfYJgJaixLDItIMVW2aa2xF+giXWQ70fNw5WPDekPNPooBkXG7xuDN9UJeDJvALtNH+1", + "xDeu3e6Y0gxHjipIMFO5T9gSE0goZmstmVouo2WAtEJDuZuzihtDgzx0y4Itzj17+ujhw6R9CLEzYaWE", + "xbDMl+1SHp1iE/riix5Rav6jgD0M68eWoo7Z2CHh+BqPWKQ5xVOpejPaO9Cd6K4kqu/Y1CI9YT9gJiJH", + "xJ3U82jXC0l9uwku66pUvJhjsuE33529YDQr9aGq9VRfcoVmrS75J/0Q0xN+hkxLI5lspo+zP7WGW7Wx", + "WVMOMpUr0LVoC1aKXgwMWqdi7Jyw52RrbAI+aBKGKav1Boqo+iSppkgc7j/W8nyNFrfONT/OK6cXRg3s", + "rHVxRK8Bm2pEyLAd3L42KpVGnTOsE34tDOALebiCbnrCJlenNyKHdIXd5elaSqKUY8qHN7WHjkV7AI7E", + "tOB9T0LWQ/yR9haqj3xsndgL7JV+G9ErOttzj4dkdyHlNfvJW+FzLpUUOZYmSImLmEptmj9vQhWHtCPO", + "zPwJTRyuZKnb5m2ux+Jo8dvACD3ihr7x6KvbVKIO+tPC1pdAW4E1nrNBMQ+Vp73nSEgDvrqUI6KYTyqd", + "iP5JPkxoIg2OJCPMkjRit/veffvZW3UxScWlkGi/8Wjzygf5dkoj0IUrmbBspcD49XRf15i3rs8JZk0s", + "YPv+5IVaifxCrHAMijdzy6YYzuFQZyGi00dQurbPXFufy775uRM3RZOeVZWfdLwueVKQtFs5iuBUgE+I", + "uIiQ24wfj7aH3PaGYuN96ggNrjC8Cyq8hweE0dS27o7ynVOkiKKwBaMXjsmEtkImwHghZPA1pi+IPHkl", + "4MbgeR3pZ3LNLekOk3jaG+DlyIMEfDFMzurbDtXP5O9QgmsMc4xvY1uWe4RxNA1aiZ/LHQuHwlF3JEw8", + "42UTypwoso1SlReiKPizV3Y7xTgc487CE8YOug4+p2u6Y3WMY2+isZyBi7pYgc14UaRSTX2LXxl+DY+2", + "YAt53RSFal7rdXOGD6nNT5QraerNnrlCg1tOF9WxT1BDXEs/7DBmvlns8N9URaTxnfFBzEe/kg0Ry8Vx", + "ifKHr35TUq+j6cyIVTYdE3in3B4d7dQ3I/S2/51Seng++w/xOrbH5eI9SvG379zFESfSHQRy09XS5LnF", + "oGmF30MCoiZDY5cr4VU2qPuFvnzcvMSW9YAPDZOAX/Fy5GV67AGg+5Ws4mPv0/PRdArc+nRZlrO9LGg0", + "BREF1fZ8CkPH2FggLcXR3p0t3q91L0LHPVI/dvxPFEzVMotRv9PNXEPtBh/rG/IFAIYmTV6WKp986v0w", + "Z67TeHpNtdn4vNOJYK+rjSpiOo/DhgDSTIviWBOx8ah7Jr+hYpT8oq/To3VsFseaSgmNfglzejIXwAvA", + "0NTxRJGJ1GOWfS9KLBz0Hxcvf56Nb2S0A8Mt9eluk0blsY1pXhX1yWOlOviox20nSpYpJWI+MyNGbkxq", + "kz4Nvjps8sP3ZLSbAhLlfjmm9Yupgw8IYKVS2dyHuTlm7UYEtEd00G4s8ZKYLlL00C/kk9BoyATZNmFN", + "uclJ5Sc7ks+UukGpEjVe/g/2ULo+fAotqtszKPkzYJ3Pp4h8A3x8nM/Oi6OEolSZoxmNkmKtL8RqbbFK", + "wl+AF6BfHagC0VZ+QK2mUka0VV9LN5hPu7vG4U6mvrx4swafMSM8vh6MFSJyryC3WOq3DQvUAMfUtHCT", + "Bcfe/1SDGGcLzQMVXwRiX+WHYX3fA3LcIFlVlHCNaqOeTK9zcNbEk9NzuGtu2hQ5vXfqk1/LLpeQYybq", + "vcnB/nMNMko8NQ+2N4RlGeUKE82jLsylfrxluQVoX+6uvfBENY1uDc5Y7oBL2N0zrEMNyWKtzYvGmyRr", + "RgyQmzPk7R5zFvh4N2EaykAshGBmn/66LUgymmc7SnV3w7kCSbqLo01/t2fKdKH5SXO5rkel2kSxbyx/", + "2LBO9biO+RzLghsf2sebZM+xJYadD4sVXftk0ZjKrfGPhbTRYMJvIW8jzVKKS1+zAbFC3shrrovQ4k4S", + "cdHdJNJAL5uZRfuaZRjIkih/gQ/D8lI5MSIbe13XfUDShEreMxTT2iZNQriWoDUUjdurVAYyq8Lrl31w", + "7EMFBe7eCAlmtOQUATeabvx1m08dS+9xTC/OfbxuvECmYcMddDrKej4+5z5kP6PvIfFBKL120IrY0Ovh", + "GsDhHZMwAyTGVL9k/rY8nFDhJgZFISXoLHgX+ynQZTcLHuY6LeqcLuj4YDRG18n5ivawkqQtLh+usqcj", + "RBkDLmF3ShaNUDw57GAMNElOBHqU5LW3yXdqYjUpuFd3At7nzd1XKVVmIw6t82He9j7FX4r8EjDvYhOc", + "P1IXn32BfpQmYuF6vQt5yqsKJBT3Txg7k/TCKgQvdEs69iaX9+y++bc4a1FTKQVvOD15J9PvSrDIgb4l", + "NwvD7OdhBhyru+VUNMiBrOBbORZWdY0FEbqVU0+mauXDcIJ+5f6WqAiKlExyQV7JZ3jQUwXNMR9ElLgE", + "ndWceW8mM6VKRSHfJGeFGyqNqXgyBMiCnJI6oYHCD55EQLIWfeIUUrpBn2hQLZmGNlDgphkXh2XzUxp9", + "f+Zmli6/WyoNnQL4rjdlV22e7GDqUvzPQljN9e4meREHZfsH1pNRLB8MuWui7dqFtBF3QxyWpbrOkFll", + "TW2RlGrr2pnuZRwK3bX93KleQBS7x40X1HZszQuWK60hj3ukn4USVBulISsVhvKlogyW1sndG3yeJlmp", + "VkxVuSqAavSkKWhsrlpKjmITRJFTSRQQ7eDTaeoT0fHEKd2dSr7CDEWtgyntw+a/cX3oGX+bSYsWnZG/", + "eiQqHYzPnOUxRI2H8CLhUA6Yvi0xzZuXYot0Azp15JfM6hrmzLfo1yX3B59rYBthDIHS0NK1KEt8RS+2", + "kXe9CU5Jo3ZE7D3H0NkrgfFV3YwKJA1X7s5r0kzEPOAizgHF7FqrerWOkno3cAaVV9deIY5H+cXUGAKH", + "b9/cFE/YRhnrNU0aqV1yG1b4Ra6k1aosu0YpEtFX3gP5E9+e5bl9odTlgueX91Gvlco2Ky3m4bF5PwC0", + "nUn30rl1L+CMSsgfTo9M7TAc0hPtZAbZY3FHF9OPwHx/mIMetrmfDRfWX1eXmabVmDPJuFUbkafP1D9X", + "ROVoHGSKRSUTuFE9S0q5gc3wsMeXVRNAgyxyiGaQPFmQ74x5RuADCZDduP+iBN4fly3BM5qRi3LIXLwU", + "leWjsl4PAISUHm3bWlMRzFgSa7iKWlHmBAyD6AM68VbBaLPbweZGuHOgLNwKqEGEawPgF2R8mFOiPYqW", + "Xaht+H6/zcR3I+A/7qfyDvMYC+O7aElLUyBfyNozwhHSacX3xry9wQf7i6mRb03B4ok3fATAeCxcB4ZJ", + "EXHHgrHkooQiS9W7PG9sVPNI0/bP7/pl6IXxnDzndSg36cauNfgsMiTi667/q+KOlFTTfGhJlgVsgd7u", + "/A5aUR3JeeR/gZLKTPaMAarKSriCToigT21To6gpriD0NU1nVgBU6I3s28hSsW/xXd4znPi1Z1H01BTs", + "Ji0phFjaKXbATJI06mxlRsfETD1KDqIrUdS8gz9zrMjRNQO6o5xA1UBHyIIeOXWaX2iE12GAs9A/JcoE", + "TLyfxoeOZkFp1O1jQAdjYWszduplOhQ2ztvUOFhwtqJxxBKJt3zDVPxajhskhyTfqlsT90koGSH2uy3k", + "KNV4fQcKr/GMOCl8vhakdglQkFbguiSs7WuQTKqorOc1N42q0iaUDD/QxNhISK9N38Cp3Eas3n5nGQ7G", + "TC+z3KgioRs6vbl5/rOcxL0HcXS8FI0Y8E8899i/AnV7tQMbYPl06fbTyf5YGNPfYp6Lz9miDgOVpbqm", + "Op2xHvocgh+UqC+4gLxYLpprOUTmzn2u076pQ0RvEjZ8x5TGf5zW+feal2K5Qz5D4IduzKy5IyHveKWI", + "AB/p6ybeL17NA2DB2qLCVLRuMXXMaLidGyUC2l3koaCSYht+CfE2YLAD8c/cOsZp6gVaLtyV3dvOIRb8", + "4kNymQ0vYk0fs2Z2S9eHPMqu9//fvneMpwrJ7qqS56Eqqy8L1eUzWHk5EJddw2b/g9ghXwsk0FRzbolW", + "hwwKxQ1MpkeyrtQrk7GSNx2wB1VuB9V+brWMiZbfXl2TPU+JJy3lrndhatTNAOi4NuYh8ONSoZ8G/8mE", + "tmPLmAL+PwreR4oDx/BSHeBPgOVOlpUErGStXqhtpmFpDgWYkLnaqfO6zc8STKxC5hq4oYib85de8Wzz", + "tQrpFGGKCW18ms0oBSyFbJmlkFVtE3oMpm2VuwhhsdEf0TriQhuTEpwwecXLl1egtSjGNs6dDiqjGZfl", + "CI4O3zdhwmju1OEAwrQ6HL7Bbc3ocTN3gVPhLwrXNJbLgusibi4ky0G7e59d8525uUepcQ4c8inxSJrp", + "ZoaIvEtI2gRIufNO4Vv6exoA+R06fiY4bDAuOOGsIdOOVSP+mSEM/xQOmw3fZqVa4UvRkQPhE/Wih49U", + "QCXRDE7y2bR1h3mM+B32T4M1CjwjsgpnnTLF/nP/ErcS1chfpLB7Tz7ZKPtPdynulg5mQKpctcH/RCzD", + "85h6be0T7MQvroOwGTJUBNqDaBNhxD/UtYuP7CKGQfin+rERfHqJuW6kRepNN1kGMrQYmD3h/WDaUHae", + "+/CsoSltYGogpMz9i/gjLW1knw/30gh4aAox/qx3p21CZtw4x9Tl2/8GPqtUleVTYj6pjEnh3QQe0i6M", + "I/QROQFG1t2Ex5imsE8nt1Wnws+xpQlHKwwd8nZV+T6lf8xMNMLRuy4ItUReRtXy0bqFL3kaY8o8qNfB", + "J901gzVMgnGmIa81momv+e5wqbeRXNcXfzn76tHjvz7+6mvmGrBCrMC0Kdh7pdLauEAh+3afTxsJOFie", + "TW9CyDBBiAv+x/CoqtkUf9aI25o2GeqgUNwx9uXEBZB69DmsnXWjvcJx2tD+f6ztSi3yzncshYI/fs+0", + "Kst0CYxGrko4UFK7FblQnAZSgTbCWMcIux5QYduIaLNG8yBmLb6ijEFK5hDsx54KhB0JuUotZCygFvkZ", + "vt/3XiMG26r0vIo8PfvW5fU0stCh0IhRMQtglaq8aC+WLAURviDSNTSWcW/4RIt4FCPbMFuKlk0Roo88", + "T5NeXKR8P7fvFtC1aU7vNjEhXoRDeQPSHPNPjOemuAknaU37/zD8I5Fs4864RrPcP4JXJPWDPW+OzwZx", + "D02iiUmgDRMvJMgDARh5bdt5Jxk9FItSKGvyEqA/ITiQ++LHT61j+eCzEIQkdDgAXvx8tm3XvGTw4Hzm", + "1MQ/NUiJlvJ+jBI6yz/0Ijew3uYiibbIG02sBUNsSQ3Fwui5tXnWvGIe0UoGj521UpY5zbQsE4+kyY6D", + "ZyomHKcS6Ctefnqu8b3Qxp4hPqB4Pf40Kn4pGyOZUGlulovxBZ80d/Qq9u6mlq/wYfZ/gtuj5D3nh/JO", + "+MFthsYdXlJ49bLxRoNk1zgmBVk9+potfJmQSkMuTN+5fx2Ek+ZhKGix9AGtsLUHXqIeWuevyt6CjJch", + "Eof9HLm3Gp+9h7A9op+ZqYyc3CSVp6hvQBYJ/KV4VFwQ+cB1ccuSEjdL7RMl6Tsytc+w1PPU5eE68NKp", + "DQzXOfm27uA2cVG3a5ual2pyZYp3797axZR0UukqEq475rO6k3ISRxWT+AMyWRGO/Bh+3hTF/DqW25jy", + "947kX+/tRy3KgwErnWz6H+ezFSWzwXzxf/VVbz7tXRogGMko5Zd+m3QxhJjEWjuTR1NFyX8mpMj33RJ5", + "zfFVY15rYXdYRDkY0MRfk2Wvf2hye/jcMI0vzd99Vl1CUy+/zQRSm3C7/qB4ifcRufiku4VUecK+oyzu", + "/qD8+d7i3+DLPz0pHn756N8Wf3r41cMcnnz1zcOH/Jsn/NE3Xz6Cx3/66slDeLT8+pvF4+Lxk8eLJ4+f", + "fP3VN/mXTx4tnnz9zb/dc3zIgUyAhvINT2f/OzsrVyo7e3WevXHAtjjhlfgR3N6grrzEFFaI1BxPImy4", + "KGdPw0//K5ywk1xt2uHDrzNfWWq2trYyT09Pr6+vT+Iupyt8+p9ZVefr0zAPZjvryCuvzpsYfYrDwR1t", + "rce4qU0eKPft9XcXb9jZq/OTWVQkf/bw5OHJI1/nW/JKzJ7OvsSf8PSscd9PMYfqqfHlEU6bt1of54Nv", + "VUXFE9ynVZMozv21Bl5igh33xwasFnn4pIEXO/9/c81XK9An+HqDfrp6fBqkkdMPPnPCx33fTuPIkNMP", + "nQQTxYGeTeRD0if5QqlLdIkH+eie6cVxnMRlys8Lh35qicEX5rxlhKHWNPqcZ0/fpmwvPoayqhelyBld", + "30i/bnMi8mrShrTsAw1tM9PUQG+ZoWNwD7Nv3n/46k8fU0JWH5CfvEOw9YD4kFx85YUPFE4CXH+vQe9a", + "wNBbP4vBGLoLk84WJ2hWvriFn+2E/eIjHfAr8ZQmItQ/Cqs0XAlVm6bTCGBuiBRcDRbeY3VCDP1Dcnj8", + "8GE4+V6ujsjq1FNrjO6u72EQF3RMOoNOFfCEUOQWkyE+hhT7i6GUSw6bQnKKqsdw2w2/JK8LBtQx7d/N", + "eoz6GF1EcvN+xG9LYO5/YE2mCY+yaaZEnrwhtxw5gSGUNjaMlYLMfj68KVXI++N89uRIathroOrkiE2A", + "/xMvHchQhLQxBMGjTwfBuaSIT3ft0PX4cT776lPi4Fw65sVLhi2jWsQJipeXUl3L0NLJMvVmw/UOJRU7", + "ZY99liP0JYZ2RPd0sXJ3ht/OiC1jsZkKtHAKIy9n7z8eul5OP4Qa9Psvo079cR+vHHWYeMnta3a6wCJx", + "U5uCiRqPLwVNYOb0A57Q0d9PvSU+/RGNaSSlnYYkXyMtKZ1L+mMHhR/s1i1k/3CuTTRezm2+rqvTD/gf", + "FLiiFVEG8FO7lacYfHT6oYMI/3mAiO7vbfe4BSa3DcCp5ZIK9+/7fPqB/o0m6hBmK9R0BZTvokbP1pBf", + "ztJ3X688QtSLkTzKFyUUxJyeTOgglY073ehAv0bxw7CXPzKxZNCfQpgwwxHnlhKLnmIt2l2Ly/DzTubJ", + "H4fb3EmqOPLzaVCHUqJtt+WHzp/dI2fWtS3UdTQLGhLJCj6EzH2sTf/v02subLZU2ufyw3r4w84WeHnq", + "i7P0fm3zoQ++YJL36Mf4lVry11PuUT2rlEmQ7Wt+HXn/zrAxSQhg7LcKNYqx22mbLYRECopvqNZ+QB+H", + "svHgXsJ6kDvbumCGeXgwGYhWvMi5waLpbTLnrrT+MXnsPrW08S0vWMihkrFW9jjzWmpnaf8YkkiS3TyH", + "KygdxTCl2SHe85llma8efvnppr8AfSVyYG9gUynNtSh37BfZPMC5MSv+Hslb8/wSZfyG5Ck6U/Pr7pse", + "nc4q0S0EFpKMALNbtuayKP07fFVjhUNHm+h0VVHYj7vCQiG8SmkEgLJPQkGBEOaEXTRhIhh0UQc1qSCy", + "Qa8I5lSmSTiGkJAbccJVMp9tM8cPViAzz5GyhSp2voTUTPNru6W39QO2R3LmCE8cSIGpr17QGWkU4sbD", + "59ZOGdv90CDRWPzevncKMRbc97aK1oz19PQUHxKtlbGnM6fPd01c8cf3DeZCgeFZpcUVVv5ApCktnJpa", + "Zt4O1BbPmz0+eTj7+P8CAAD//wFSIslfDAEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/generated/model/types.go b/daemon/algod/api/server/v2/generated/model/types.go index 52f37b79fc..b9baf1bfbf 100644 --- a/daemon/algod/api/server/v2/generated/model/types.go +++ b/daemon/algod/api/server/v2/generated/model/types.go @@ -477,6 +477,9 @@ type AssetParams struct { // Freeze \[f\] Address of account used to freeze holdings of this asset. If empty, freezing is not permitted. Freeze *string `json:"freeze,omitempty"` + // Frozen \[fr\] Whether this asset is frozen. + Frozen *bool `json:"frozen,omitempty"` + // Manager \[m\] Address of account used to manage the keys of this asset and to destroy it. Manager *string `json:"manager,omitempty"` diff --git a/daemon/algod/api/server/v2/generated/nonparticipating/private/routes.go b/daemon/algod/api/server/v2/generated/nonparticipating/private/routes.go index 03474cebda..e710a7bdc8 100644 --- a/daemon/algod/api/server/v2/generated/nonparticipating/private/routes.go +++ b/daemon/algod/api/server/v2/generated/nonparticipating/private/routes.go @@ -304,114 +304,114 @@ var swaggerSpec = []string{ "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/generated/nonparticipating/public/routes.go b/daemon/algod/api/server/v2/generated/nonparticipating/public/routes.go index 646cd7f8f5..74932f894b 100644 --- a/daemon/algod/api/server/v2/generated/nonparticipating/public/routes.go +++ b/daemon/algod/api/server/v2/generated/nonparticipating/public/routes.go @@ -895,192 +895,192 @@ var swaggerSpec = []string{ "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", - "Pv3fAAAA//9NN7DNVcUBAA==", + "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", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/generated/participating/private/routes.go b/daemon/algod/api/server/v2/generated/participating/private/routes.go index a2757febb7..b2c2972af5 100644 --- a/daemon/algod/api/server/v2/generated/participating/private/routes.go +++ b/daemon/algod/api/server/v2/generated/participating/private/routes.go @@ -368,118 +368,118 @@ var swaggerSpec = []string{ "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", - "GB8BAA==", + "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", + "5NHsw/8NAAD//4E1DblrHwEA", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/generated/participating/public/routes.go b/daemon/algod/api/server/v2/generated/participating/public/routes.go index 878f514137..9631a0e70e 100644 --- a/daemon/algod/api/server/v2/generated/participating/public/routes.go +++ b/daemon/algod/api/server/v2/generated/participating/public/routes.go @@ -297,120 +297,121 @@ var swaggerSpec = []string{ "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", + "AP//CNtbP1AkAQA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/daemon/algod/api/server/v2/utils.go b/daemon/algod/api/server/v2/utils.go index a560872a2e..3d3bf0b4c5 100644 --- a/daemon/algod/api/server/v2/utils.go +++ b/daemon/algod/api/server/v2/utils.go @@ -143,6 +143,10 @@ func nilToZero[T any](valPtr *T) T { return *valPtr } +func uint64ToBool(in uint64) bool { + return in != 0 +} + func computeCreatableIndexInPayset(tx node.TxnWithStatus, txnCounter uint64, payset []transactions.SignedTxnWithAD) (cidx *uint64) { // Compute transaction index in block txID := tx.Txn.Txn.ID() diff --git a/data/basics/msgp_gen.go b/data/basics/msgp_gen.go index 71c0c87ec0..f09f60fdc6 100644 --- a/data/basics/msgp_gen.go +++ b/data/basics/msgp_gen.go @@ -425,31 +425,7 @@ func (z *AccountData) MarshalMsg(b []byte) (o []byte) { zb0004 := (*z).Assets[zb0003] _ = zb0004 o = zb0003.MarshalMsg(o) - // omitempty: check for empty values - zb0010Len := uint32(2) - var zb0010Mask uint8 /* 3 bits */ - if zb0004.Amount == 0 { - zb0010Len-- - zb0010Mask |= 0x2 - } - if zb0004.Frozen == false { - zb0010Len-- - zb0010Mask |= 0x4 - } - // variable map header, size zb0010Len - o = append(o, 0x80|uint8(zb0010Len)) - if zb0010Len != 0 { - if (zb0010Mask & 0x2) == 0 { // if not empty - // string "a" - o = append(o, 0xa1, 0x61) - o = msgp.AppendUint64(o, zb0004.Amount) - } - if (zb0010Mask & 0x4) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBool(o, zb0004.Frozen) - } - } + o = zb0004.MarshalMsg(o) } } if (zb0009Mask & 0x40) == 0 { // if not empty @@ -516,24 +492,24 @@ func (z *AccountData) MarshalMsg(b []byte) (o []byte) { // string "tsch" o = append(o, 0xa4, 0x74, 0x73, 0x63, 0x68) // omitempty: check for empty values - zb0011Len := uint32(2) - var zb0011Mask uint8 /* 3 bits */ + zb0010Len := uint32(2) + var zb0010Mask uint8 /* 3 bits */ if (*z).TotalAppSchema.NumByteSlice == 0 { - zb0011Len-- - zb0011Mask |= 0x2 + zb0010Len-- + zb0010Mask |= 0x2 } if (*z).TotalAppSchema.NumUint == 0 { - zb0011Len-- - zb0011Mask |= 0x4 + zb0010Len-- + zb0010Mask |= 0x4 } - // variable map header, size zb0011Len - o = append(o, 0x80|uint8(zb0011Len)) - if (zb0011Mask & 0x2) == 0 { // if not empty + // variable map header, size zb0010Len + o = append(o, 0x80|uint8(zb0010Len)) + if (zb0010Mask & 0x2) == 0 { // if not empty // string "nbs" o = append(o, 0xa3, 0x6e, 0x62, 0x73) o = msgp.AppendUint64(o, (*z).TotalAppSchema.NumByteSlice) } - if (zb0011Mask & 0x4) == 0 { // if not empty + if (zb0010Mask & 0x4) == 0 { // if not empty // string "nui" o = append(o, 0xa3, 0x6e, 0x75, 0x69) o = msgp.AppendUint64(o, (*z).TotalAppSchema.NumUint) @@ -766,74 +742,10 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) err = msgp.WrapError(err, "struct-from-array", "Assets") return } - var zb0020 int - var zb0021 bool - zb0020, zb0021, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0020, zb0021, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - if zb0020 > 0 { - zb0020-- - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array", "Amount") - return - } - } - if zb0020 > 0 { - zb0020-- - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array", "Frozen") - return - } - } - if zb0020 > 0 { - err = msgp.ErrTooManyArrayFields(zb0020) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - if zb0021 { - zb0004 = AssetHolding{} - } - for zb0020 > 0 { - zb0020-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - switch string(field) { - case "a": - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "Amount") - return - } - case "f": - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "Frozen") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - } - } + bts, err = zb0004.UnmarshalMsgWithState(bts, st) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) + return } (*z).Assets[zb0003] = zb0004 } @@ -856,27 +768,27 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) } if zb0009 > 0 { zb0009-- - var zb0022 int - var zb0023 bool - zb0022, zb0023, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0020 int + var zb0021 bool + zb0020, zb0021, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") return } - if zb0022 > bounds.EncodedMaxAppLocalStates { - err = msgp.ErrOverflow(uint64(zb0022), uint64(bounds.EncodedMaxAppLocalStates)) + if zb0020 > bounds.EncodedMaxAppLocalStates { + err = msgp.ErrOverflow(uint64(zb0020), uint64(bounds.EncodedMaxAppLocalStates)) err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") return } - if zb0023 { + if zb0021 { (*z).AppLocalStates = nil } else if (*z).AppLocalStates == nil { - (*z).AppLocalStates = make(map[AppIndex]AppLocalState, zb0022) + (*z).AppLocalStates = make(map[AppIndex]AppLocalState, zb0020) } - for zb0022 > 0 { + for zb0020 > 0 { var zb0005 AppIndex var zb0006 AppLocalState - zb0022-- + zb0020-- bts, err = zb0005.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") @@ -892,27 +804,27 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) } if zb0009 > 0 { zb0009-- - var zb0024 int - var zb0025 bool - zb0024, zb0025, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0022 int + var zb0023 bool + zb0022, zb0023, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppParams") return } - if zb0024 > bounds.EncodedMaxAppParams { - err = msgp.ErrOverflow(uint64(zb0024), uint64(bounds.EncodedMaxAppParams)) + if zb0022 > bounds.EncodedMaxAppParams { + err = msgp.ErrOverflow(uint64(zb0022), uint64(bounds.EncodedMaxAppParams)) err = msgp.WrapError(err, "struct-from-array", "AppParams") return } - if zb0025 { + if zb0023 { (*z).AppParams = nil } else if (*z).AppParams == nil { - (*z).AppParams = make(map[AppIndex]AppParams, zb0024) + (*z).AppParams = make(map[AppIndex]AppParams, zb0022) } - for zb0024 > 0 { + for zb0022 > 0 { var zb0007 AppIndex var zb0008 AppParams - zb0024-- + zb0022-- bts, err = zb0007.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppParams") @@ -928,33 +840,33 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) } if zb0009 > 0 { zb0009-- - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0024 int + var zb0025 bool + zb0024, zb0025, bts, err = msgp.ReadMapHeaderBytes(bts) if _, ok := err.(msgp.TypeError); ok { - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0024, zb0025, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") return } - if zb0026 > 0 { - zb0026-- + if zb0024 > 0 { + zb0024-- (*z).TotalAppSchema.NumUint, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array", "NumUint") return } } - if zb0026 > 0 { - zb0026-- + if zb0024 > 0 { + zb0024-- (*z).TotalAppSchema.NumByteSlice, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array", "NumByteSlice") return } } - if zb0026 > 0 { - err = msgp.ErrTooManyArrayFields(zb0026) + if zb0024 > 0 { + err = msgp.ErrTooManyArrayFields(zb0024) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array") return @@ -965,11 +877,11 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") return } - if zb0027 { + if zb0025 { (*z).TotalAppSchema = StateSchema{} } - for zb0026 > 0 { - zb0026-- + for zb0024 > 0 { + zb0024-- field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") @@ -1047,13 +959,13 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) switch string(field) { case "onl": { - var zb0028 byte - zb0028, bts, err = msgp.ReadByteBytes(bts) + var zb0026 byte + zb0026, bts, err = msgp.ReadByteBytes(bts) if err != nil { err = msgp.WrapError(err, "Status") return } - (*z).Status = Status(zb0028) + (*z).Status = Status(zb0026) } case "algo": bts, err = (*z).MicroAlgos.UnmarshalMsgWithState(bts, st) @@ -1093,23 +1005,23 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) } case "voteFst": { - var zb0029 uint64 - zb0029, bts, err = msgp.ReadUint64Bytes(bts) + var zb0027 uint64 + zb0027, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "VoteFirstValid") return } - (*z).VoteFirstValid = Round(zb0029) + (*z).VoteFirstValid = Round(zb0027) } case "voteLst": { - var zb0030 uint64 - zb0030, bts, err = msgp.ReadUint64Bytes(bts) + var zb0028 uint64 + zb0028, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "VoteLastValid") return } - (*z).VoteLastValid = Round(zb0030) + (*z).VoteLastValid = Round(zb0028) } case "voteKD": (*z).VoteKeyDilution, bts, err = msgp.ReadUint64Bytes(bts) @@ -1119,46 +1031,46 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) } case "lpr": { - var zb0031 uint64 - zb0031, bts, err = msgp.ReadUint64Bytes(bts) + var zb0029 uint64 + zb0029, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "LastProposed") return } - (*z).LastProposed = Round(zb0031) + (*z).LastProposed = Round(zb0029) } case "lhb": { - var zb0032 uint64 - zb0032, bts, err = msgp.ReadUint64Bytes(bts) + var zb0030 uint64 + zb0030, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "LastHeartbeat") return } - (*z).LastHeartbeat = Round(zb0032) + (*z).LastHeartbeat = Round(zb0030) } case "apar": - var zb0033 int - var zb0034 bool - zb0033, zb0034, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0031 int + var zb0032 bool + zb0031, zb0032, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AssetParams") return } - if zb0033 > bounds.EncodedMaxAssetsPerAccount { - err = msgp.ErrOverflow(uint64(zb0033), uint64(bounds.EncodedMaxAssetsPerAccount)) + if zb0031 > bounds.EncodedMaxAssetsPerAccount { + err = msgp.ErrOverflow(uint64(zb0031), uint64(bounds.EncodedMaxAssetsPerAccount)) err = msgp.WrapError(err, "AssetParams") return } - if zb0034 { + if zb0032 { (*z).AssetParams = nil } else if (*z).AssetParams == nil { - (*z).AssetParams = make(map[AssetIndex]AssetParams, zb0033) + (*z).AssetParams = make(map[AssetIndex]AssetParams, zb0031) } - for zb0033 > 0 { + for zb0031 > 0 { var zb0001 AssetIndex var zb0002 AssetParams - zb0033-- + zb0031-- bts, err = zb0001.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AssetParams") @@ -1172,100 +1084,36 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) (*z).AssetParams[zb0001] = zb0002 } case "asset": - var zb0035 int - var zb0036 bool - zb0035, zb0036, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0033 int + var zb0034 bool + zb0033, zb0034, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Assets") return } - if zb0035 > bounds.EncodedMaxAssetsPerAccount { - err = msgp.ErrOverflow(uint64(zb0035), uint64(bounds.EncodedMaxAssetsPerAccount)) + if zb0033 > bounds.EncodedMaxAssetsPerAccount { + err = msgp.ErrOverflow(uint64(zb0033), uint64(bounds.EncodedMaxAssetsPerAccount)) err = msgp.WrapError(err, "Assets") return } - if zb0036 { + if zb0034 { (*z).Assets = nil } else if (*z).Assets == nil { - (*z).Assets = make(map[AssetIndex]AssetHolding, zb0035) + (*z).Assets = make(map[AssetIndex]AssetHolding, zb0033) } - for zb0035 > 0 { + for zb0033 > 0 { var zb0003 AssetIndex var zb0004 AssetHolding - zb0035-- + zb0033-- bts, err = zb0003.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "Assets") return } - var zb0037 int - var zb0038 bool - zb0037, zb0038, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0037, zb0038, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - if zb0037 > 0 { - zb0037-- - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array", "Amount") - return - } - } - if zb0037 > 0 { - zb0037-- - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array", "Frozen") - return - } - } - if zb0037 > 0 { - err = msgp.ErrTooManyArrayFields(zb0037) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - if zb0038 { - zb0004 = AssetHolding{} - } - for zb0037 > 0 { - zb0037-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - switch string(field) { - case "a": - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "Amount") - return - } - case "f": - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "Frozen") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - } - } + bts, err = zb0004.UnmarshalMsgWithState(bts, st) + if err != nil { + err = msgp.WrapError(err, "Assets", zb0003) + return } (*z).Assets[zb0003] = zb0004 } @@ -1282,27 +1130,27 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) return } case "appl": - var zb0039 int - var zb0040 bool - zb0039, zb0040, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0035 int + var zb0036 bool + zb0035, zb0036, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AppLocalStates") return } - if zb0039 > bounds.EncodedMaxAppLocalStates { - err = msgp.ErrOverflow(uint64(zb0039), uint64(bounds.EncodedMaxAppLocalStates)) + if zb0035 > bounds.EncodedMaxAppLocalStates { + err = msgp.ErrOverflow(uint64(zb0035), uint64(bounds.EncodedMaxAppLocalStates)) err = msgp.WrapError(err, "AppLocalStates") return } - if zb0040 { + if zb0036 { (*z).AppLocalStates = nil } else if (*z).AppLocalStates == nil { - (*z).AppLocalStates = make(map[AppIndex]AppLocalState, zb0039) + (*z).AppLocalStates = make(map[AppIndex]AppLocalState, zb0035) } - for zb0039 > 0 { + for zb0035 > 0 { var zb0005 AppIndex var zb0006 AppLocalState - zb0039-- + zb0035-- bts, err = zb0005.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AppLocalStates") @@ -1316,27 +1164,27 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) (*z).AppLocalStates[zb0005] = zb0006 } case "appp": - var zb0041 int - var zb0042 bool - zb0041, zb0042, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0037 int + var zb0038 bool + zb0037, zb0038, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AppParams") return } - if zb0041 > bounds.EncodedMaxAppParams { - err = msgp.ErrOverflow(uint64(zb0041), uint64(bounds.EncodedMaxAppParams)) + if zb0037 > bounds.EncodedMaxAppParams { + err = msgp.ErrOverflow(uint64(zb0037), uint64(bounds.EncodedMaxAppParams)) err = msgp.WrapError(err, "AppParams") return } - if zb0042 { + if zb0038 { (*z).AppParams = nil } else if (*z).AppParams == nil { - (*z).AppParams = make(map[AppIndex]AppParams, zb0041) + (*z).AppParams = make(map[AppIndex]AppParams, zb0037) } - for zb0041 > 0 { + for zb0037 > 0 { var zb0007 AppIndex var zb0008 AppParams - zb0041-- + zb0037-- bts, err = zb0007.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AppParams") @@ -1350,33 +1198,33 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) (*z).AppParams[zb0007] = zb0008 } case "tsch": - var zb0043 int - var zb0044 bool - zb0043, zb0044, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0039 int + var zb0040 bool + zb0039, zb0040, bts, err = msgp.ReadMapHeaderBytes(bts) if _, ok := err.(msgp.TypeError); ok { - zb0043, zb0044, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0039, zb0040, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema") return } - if zb0043 > 0 { - zb0043-- + if zb0039 > 0 { + zb0039-- (*z).TotalAppSchema.NumUint, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array", "NumUint") return } } - if zb0043 > 0 { - zb0043-- + if zb0039 > 0 { + zb0039-- (*z).TotalAppSchema.NumByteSlice, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array", "NumByteSlice") return } } - if zb0043 > 0 { - err = msgp.ErrTooManyArrayFields(zb0043) + if zb0039 > 0 { + err = msgp.ErrTooManyArrayFields(zb0039) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array") return @@ -1387,11 +1235,11 @@ func (z *AccountData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) err = msgp.WrapError(err, "TotalAppSchema") return } - if zb0044 { + if zb0040 { (*z).TotalAppSchema = StateSchema{} } - for zb0043 > 0 { - zb0043-- + for zb0039 > 0 { + zb0039-- field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema") @@ -1473,7 +1321,7 @@ func (z *AccountData) Msgsize() (s int) { for zb0003, zb0004 := range (*z).Assets { _ = zb0003 _ = zb0004 - s += 0 + zb0003.Msgsize() + 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s += 0 + zb0003.Msgsize() + zb0004.Msgsize() } } s += 6 + (*z).AuthAddr.Msgsize() + 3 + msgp.BoolSize + 5 + msgp.MapHeaderSize @@ -1514,8 +1362,7 @@ func AccountDataMaxSize() (s int) { // Adding size of map keys for z.Assets s += bounds.EncodedMaxAssetsPerAccount * (AssetIndexMaxSize()) // Adding size of map values for z.Assets - s += bounds.EncodedMaxAssetsPerAccount * (1) - s += 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s += bounds.EncodedMaxAssetsPerAccount * (AssetHoldingMaxSize()) s += 6 + AddressMaxSize() + 3 + msgp.BoolSize + 5 s += msgp.MapHeaderSize // Adding size of map keys for z.AppLocalStates @@ -2691,8 +2538,8 @@ func AppParamsMaxSize() (s int) { func (z *AssetHolding) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0001Len := uint32(2) - var zb0001Mask uint8 /* 3 bits */ + zb0001Len := uint32(3) + var zb0001Mask uint8 /* 4 bits */ if (*z).Amount == 0 { zb0001Len-- zb0001Mask |= 0x2 @@ -2701,6 +2548,10 @@ func (z *AssetHolding) MarshalMsg(b []byte) (o []byte) { zb0001Len-- zb0001Mask |= 0x4 } + if (*z).LastFreezeChange == 0 { + zb0001Len-- + zb0001Mask |= 0x8 + } // variable map header, size zb0001Len o = append(o, 0x80|uint8(zb0001Len)) if zb0001Len != 0 { @@ -2714,6 +2565,11 @@ func (z *AssetHolding) MarshalMsg(b []byte) (o []byte) { o = append(o, 0xa1, 0x66) o = msgp.AppendBool(o, (*z).Frozen) } + if (zb0001Mask & 0x8) == 0 { // if not empty + // string "fc" + o = append(o, 0xa2, 0x66, 0x63) + o = msgp.AppendUint64(o, (*z).LastFreezeChange) + } } return } @@ -2757,6 +2613,14 @@ func (z *AssetHolding) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) return } } + if zb0001 > 0 { + zb0001-- + (*z).LastFreezeChange, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "LastFreezeChange") + return + } + } if zb0001 > 0 { err = msgp.ErrTooManyArrayFields(zb0001) if err != nil { @@ -2792,6 +2656,12 @@ func (z *AssetHolding) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) err = msgp.WrapError(err, "Frozen") return } + case "fc": + (*z).LastFreezeChange, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "LastFreezeChange") + return + } default: err = msgp.ErrNoField(string(field)) if err != nil { @@ -2815,18 +2685,18 @@ func (_ *AssetHolding) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *AssetHolding) Msgsize() (s int) { - s = 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s = 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 3 + msgp.Uint64Size return } // MsgIsZero returns whether this is a zero value func (z *AssetHolding) MsgIsZero() bool { - return ((*z).Amount == 0) && ((*z).Frozen == false) + return ((*z).Amount == 0) && ((*z).Frozen == false) && ((*z).LastFreezeChange == 0) } // MaxSize returns a maximum valid message size for this message type func AssetHoldingMaxSize() (s int) { - s = 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s = 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 3 + msgp.Uint64Size return } @@ -2894,8 +2764,8 @@ func AssetIndexMaxSize() (s int) { func (z *AssetParams) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0002Len := uint32(11) - var zb0002Mask uint16 /* 12 bits */ + zb0002Len := uint32(12) + var zb0002Mask uint16 /* 13 bits */ if (*z).MetadataHash == ([32]byte{}) { zb0002Len-- zb0002Mask |= 0x2 @@ -2924,22 +2794,26 @@ func (z *AssetParams) MarshalMsg(b []byte) (o []byte) { zb0002Len-- zb0002Mask |= 0x80 } - if (*z).Manager.MsgIsZero() { + if (*z).LastGlobalFreeze == 0 { zb0002Len-- zb0002Mask |= 0x100 } - if (*z).Reserve.MsgIsZero() { + if (*z).Manager.MsgIsZero() { zb0002Len-- zb0002Mask |= 0x200 } - if (*z).Total == 0 { + if (*z).Reserve.MsgIsZero() { zb0002Len-- zb0002Mask |= 0x400 } - if (*z).UnitName == "" { + if (*z).Total == 0 { zb0002Len-- zb0002Mask |= 0x800 } + if (*z).UnitName == "" { + zb0002Len-- + zb0002Mask |= 0x1000 + } // variable map header, size zb0002Len o = append(o, 0x80|uint8(zb0002Len)) if zb0002Len != 0 { @@ -2979,21 +2853,26 @@ func (z *AssetParams) MarshalMsg(b []byte) (o []byte) { o = (*z).Freeze.MarshalMsg(o) } if (zb0002Mask & 0x100) == 0 { // if not empty + // string "gf" + o = append(o, 0xa2, 0x67, 0x66) + o = msgp.AppendUint64(o, (*z).LastGlobalFreeze) + } + if (zb0002Mask & 0x200) == 0 { // if not empty // string "m" o = append(o, 0xa1, 0x6d) o = (*z).Manager.MarshalMsg(o) } - if (zb0002Mask & 0x200) == 0 { // if not empty + if (zb0002Mask & 0x400) == 0 { // if not empty // string "r" o = append(o, 0xa1, 0x72) o = (*z).Reserve.MarshalMsg(o) } - if (zb0002Mask & 0x400) == 0 { // if not empty + if (zb0002Mask & 0x800) == 0 { // if not empty // string "t" o = append(o, 0xa1, 0x74) o = msgp.AppendUint64(o, (*z).Total) } - if (zb0002Mask & 0x800) == 0 { // if not empty + if (zb0002Mask & 0x1000) == 0 { // if not empty // string "un" o = append(o, 0xa2, 0x75, 0x6e) o = msgp.AppendString(o, (*z).UnitName) @@ -3143,6 +3022,14 @@ func (z *AssetParams) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) return } } + if zb0002 > 0 { + zb0002-- + (*z).LastGlobalFreeze, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "LastGlobalFreeze") + return + } + } if zb0002 > 0 { err = msgp.ErrTooManyArrayFields(zb0002) if err != nil { @@ -3262,6 +3149,12 @@ func (z *AssetParams) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState) err = msgp.WrapError(err, "Clawback") return } + case "gf": + (*z).LastGlobalFreeze, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "LastGlobalFreeze") + return + } default: err = msgp.ErrNoField(string(field)) if err != nil { @@ -3285,13 +3178,13 @@ func (_ *AssetParams) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *AssetParams) Msgsize() (s int) { - s = 1 + 2 + msgp.Uint64Size + 3 + msgp.Uint32Size + 3 + msgp.BoolSize + 3 + msgp.StringPrefixSize + len((*z).UnitName) + 3 + msgp.StringPrefixSize + len((*z).AssetName) + 3 + msgp.StringPrefixSize + len((*z).URL) + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() + s = 1 + 2 + msgp.Uint64Size + 3 + msgp.Uint32Size + 3 + msgp.BoolSize + 3 + msgp.StringPrefixSize + len((*z).UnitName) + 3 + msgp.StringPrefixSize + len((*z).AssetName) + 3 + msgp.StringPrefixSize + len((*z).URL) + 3 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() + 3 + msgp.Uint64Size return } // MsgIsZero returns whether this is a zero value func (z *AssetParams) MsgIsZero() bool { - return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([32]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) + return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([32]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) && ((*z).LastGlobalFreeze == 0) } // MaxSize returns a maximum valid message size for this message type @@ -3299,7 +3192,7 @@ func AssetParamsMaxSize() (s int) { s = 1 + 2 + msgp.Uint64Size + 3 + msgp.Uint32Size + 3 + msgp.BoolSize + 3 + msgp.StringPrefixSize + bounds.MaxAssetUnitNameBytes + 3 + msgp.StringPrefixSize + bounds.MaxAssetNameBytes + 3 + msgp.StringPrefixSize + bounds.MaxAssetURLBytes + 3 // Calculating size of array: z.MetadataHash s += msgp.ArrayHeaderSize + ((32) * (msgp.ByteSize)) - s += 2 + AddressMaxSize() + 2 + AddressMaxSize() + 2 + AddressMaxSize() + 2 + AddressMaxSize() + s += 2 + AddressMaxSize() + 2 + AddressMaxSize() + 2 + AddressMaxSize() + 2 + AddressMaxSize() + 3 + msgp.Uint64Size return } @@ -3491,31 +3384,7 @@ func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { zb0004 := (*z).AccountData.Assets[zb0003] _ = zb0004 o = zb0003.MarshalMsg(o) - // omitempty: check for empty values - zb0010Len := uint32(2) - var zb0010Mask uint8 /* 3 bits */ - if zb0004.Amount == 0 { - zb0010Len-- - zb0010Mask |= 0x2 - } - if zb0004.Frozen == false { - zb0010Len-- - zb0010Mask |= 0x4 - } - // variable map header, size zb0010Len - o = append(o, 0x80|uint8(zb0010Len)) - if zb0010Len != 0 { - if (zb0010Mask & 0x2) == 0 { // if not empty - // string "a" - o = append(o, 0xa1, 0x61) - o = msgp.AppendUint64(o, zb0004.Amount) - } - if (zb0010Mask & 0x4) == 0 { // if not empty - // string "f" - o = append(o, 0xa1, 0x66) - o = msgp.AppendBool(o, zb0004.Frozen) - } - } + o = zb0004.MarshalMsg(o) } } if (zb0009Mask & 0x100) == 0 { // if not empty @@ -3582,24 +3451,24 @@ func (z *BalanceRecord) MarshalMsg(b []byte) (o []byte) { // string "tsch" o = append(o, 0xa4, 0x74, 0x73, 0x63, 0x68) // omitempty: check for empty values - zb0011Len := uint32(2) - var zb0011Mask uint8 /* 3 bits */ + zb0010Len := uint32(2) + var zb0010Mask uint8 /* 3 bits */ if (*z).AccountData.TotalAppSchema.NumByteSlice == 0 { - zb0011Len-- - zb0011Mask |= 0x2 + zb0010Len-- + zb0010Mask |= 0x2 } if (*z).AccountData.TotalAppSchema.NumUint == 0 { - zb0011Len-- - zb0011Mask |= 0x4 + zb0010Len-- + zb0010Mask |= 0x4 } - // variable map header, size zb0011Len - o = append(o, 0x80|uint8(zb0011Len)) - if (zb0011Mask & 0x2) == 0 { // if not empty + // variable map header, size zb0010Len + o = append(o, 0x80|uint8(zb0010Len)) + if (zb0010Mask & 0x2) == 0 { // if not empty // string "nbs" o = append(o, 0xa3, 0x6e, 0x62, 0x73) o = msgp.AppendUint64(o, (*z).AccountData.TotalAppSchema.NumByteSlice) } - if (zb0011Mask & 0x4) == 0 { // if not empty + if (zb0010Mask & 0x4) == 0 { // if not empty // string "nui" o = append(o, 0xa3, 0x6e, 0x75, 0x69) o = msgp.AppendUint64(o, (*z).AccountData.TotalAppSchema.NumUint) @@ -3840,74 +3709,10 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState err = msgp.WrapError(err, "struct-from-array", "Assets") return } - var zb0020 int - var zb0021 bool - zb0020, zb0021, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0020, zb0021, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - if zb0020 > 0 { - zb0020-- - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array", "Amount") - return - } - } - if zb0020 > 0 { - zb0020-- - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array", "Frozen") - return - } - } - if zb0020 > 0 { - err = msgp.ErrTooManyArrayFields(zb0020) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - if zb0021 { - zb0004 = AssetHolding{} - } - for zb0020 > 0 { - zb0020-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - switch string(field) { - case "a": - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "Amount") - return - } - case "f": - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003, "Frozen") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) - return - } - } - } + bts, err = zb0004.UnmarshalMsgWithState(bts, st) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "Assets", zb0003) + return } (*z).AccountData.Assets[zb0003] = zb0004 } @@ -3930,27 +3735,27 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } if zb0009 > 0 { zb0009-- - var zb0022 int - var zb0023 bool - zb0022, zb0023, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0020 int + var zb0021 bool + zb0020, zb0021, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") return } - if zb0022 > bounds.EncodedMaxAppLocalStates { - err = msgp.ErrOverflow(uint64(zb0022), uint64(bounds.EncodedMaxAppLocalStates)) + if zb0020 > bounds.EncodedMaxAppLocalStates { + err = msgp.ErrOverflow(uint64(zb0020), uint64(bounds.EncodedMaxAppLocalStates)) err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") return } - if zb0023 { + if zb0021 { (*z).AccountData.AppLocalStates = nil } else if (*z).AccountData.AppLocalStates == nil { - (*z).AccountData.AppLocalStates = make(map[AppIndex]AppLocalState, zb0022) + (*z).AccountData.AppLocalStates = make(map[AppIndex]AppLocalState, zb0020) } - for zb0022 > 0 { + for zb0020 > 0 { var zb0005 AppIndex var zb0006 AppLocalState - zb0022-- + zb0020-- bts, err = zb0005.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppLocalStates") @@ -3966,27 +3771,27 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } if zb0009 > 0 { zb0009-- - var zb0024 int - var zb0025 bool - zb0024, zb0025, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0022 int + var zb0023 bool + zb0022, zb0023, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppParams") return } - if zb0024 > bounds.EncodedMaxAppParams { - err = msgp.ErrOverflow(uint64(zb0024), uint64(bounds.EncodedMaxAppParams)) + if zb0022 > bounds.EncodedMaxAppParams { + err = msgp.ErrOverflow(uint64(zb0022), uint64(bounds.EncodedMaxAppParams)) err = msgp.WrapError(err, "struct-from-array", "AppParams") return } - if zb0025 { + if zb0023 { (*z).AccountData.AppParams = nil } else if (*z).AccountData.AppParams == nil { - (*z).AccountData.AppParams = make(map[AppIndex]AppParams, zb0024) + (*z).AccountData.AppParams = make(map[AppIndex]AppParams, zb0022) } - for zb0024 > 0 { + for zb0022 > 0 { var zb0007 AppIndex var zb0008 AppParams - zb0024-- + zb0022-- bts, err = zb0007.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "struct-from-array", "AppParams") @@ -4002,33 +3807,33 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } if zb0009 > 0 { zb0009-- - var zb0026 int - var zb0027 bool - zb0026, zb0027, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0024 int + var zb0025 bool + zb0024, zb0025, bts, err = msgp.ReadMapHeaderBytes(bts) if _, ok := err.(msgp.TypeError); ok { - zb0026, zb0027, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0024, zb0025, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") return } - if zb0026 > 0 { - zb0026-- + if zb0024 > 0 { + zb0024-- (*z).AccountData.TotalAppSchema.NumUint, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array", "NumUint") return } } - if zb0026 > 0 { - zb0026-- + if zb0024 > 0 { + zb0024-- (*z).AccountData.TotalAppSchema.NumByteSlice, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array", "NumByteSlice") return } } - if zb0026 > 0 { - err = msgp.ErrTooManyArrayFields(zb0026) + if zb0024 > 0 { + err = msgp.ErrTooManyArrayFields(zb0024) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema", "struct-from-array") return @@ -4039,11 +3844,11 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") return } - if zb0027 { + if zb0025 { (*z).AccountData.TotalAppSchema = StateSchema{} } - for zb0026 > 0 { - zb0026-- + for zb0024 > 0 { + zb0024-- field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err, "struct-from-array", "TotalAppSchema") @@ -4127,13 +3932,13 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } case "onl": { - var zb0028 byte - zb0028, bts, err = msgp.ReadByteBytes(bts) + var zb0026 byte + zb0026, bts, err = msgp.ReadByteBytes(bts) if err != nil { err = msgp.WrapError(err, "Status") return } - (*z).AccountData.Status = Status(zb0028) + (*z).AccountData.Status = Status(zb0026) } case "algo": bts, err = (*z).AccountData.MicroAlgos.UnmarshalMsgWithState(bts, st) @@ -4173,23 +3978,23 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } case "voteFst": { - var zb0029 uint64 - zb0029, bts, err = msgp.ReadUint64Bytes(bts) + var zb0027 uint64 + zb0027, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "VoteFirstValid") return } - (*z).AccountData.VoteFirstValid = Round(zb0029) + (*z).AccountData.VoteFirstValid = Round(zb0027) } case "voteLst": { - var zb0030 uint64 - zb0030, bts, err = msgp.ReadUint64Bytes(bts) + var zb0028 uint64 + zb0028, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "VoteLastValid") return } - (*z).AccountData.VoteLastValid = Round(zb0030) + (*z).AccountData.VoteLastValid = Round(zb0028) } case "voteKD": (*z).AccountData.VoteKeyDilution, bts, err = msgp.ReadUint64Bytes(bts) @@ -4199,46 +4004,46 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState } case "lpr": { - var zb0031 uint64 - zb0031, bts, err = msgp.ReadUint64Bytes(bts) + var zb0029 uint64 + zb0029, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "LastProposed") return } - (*z).AccountData.LastProposed = Round(zb0031) + (*z).AccountData.LastProposed = Round(zb0029) } case "lhb": { - var zb0032 uint64 - zb0032, bts, err = msgp.ReadUint64Bytes(bts) + var zb0030 uint64 + zb0030, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "LastHeartbeat") return } - (*z).AccountData.LastHeartbeat = Round(zb0032) + (*z).AccountData.LastHeartbeat = Round(zb0030) } case "apar": - var zb0033 int - var zb0034 bool - zb0033, zb0034, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0031 int + var zb0032 bool + zb0031, zb0032, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AssetParams") return } - if zb0033 > bounds.EncodedMaxAssetsPerAccount { - err = msgp.ErrOverflow(uint64(zb0033), uint64(bounds.EncodedMaxAssetsPerAccount)) + if zb0031 > bounds.EncodedMaxAssetsPerAccount { + err = msgp.ErrOverflow(uint64(zb0031), uint64(bounds.EncodedMaxAssetsPerAccount)) err = msgp.WrapError(err, "AssetParams") return } - if zb0034 { + if zb0032 { (*z).AccountData.AssetParams = nil } else if (*z).AccountData.AssetParams == nil { - (*z).AccountData.AssetParams = make(map[AssetIndex]AssetParams, zb0033) + (*z).AccountData.AssetParams = make(map[AssetIndex]AssetParams, zb0031) } - for zb0033 > 0 { + for zb0031 > 0 { var zb0001 AssetIndex var zb0002 AssetParams - zb0033-- + zb0031-- bts, err = zb0001.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AssetParams") @@ -4252,100 +4057,36 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState (*z).AccountData.AssetParams[zb0001] = zb0002 } case "asset": - var zb0035 int - var zb0036 bool - zb0035, zb0036, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0033 int + var zb0034 bool + zb0033, zb0034, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "Assets") return } - if zb0035 > bounds.EncodedMaxAssetsPerAccount { - err = msgp.ErrOverflow(uint64(zb0035), uint64(bounds.EncodedMaxAssetsPerAccount)) + if zb0033 > bounds.EncodedMaxAssetsPerAccount { + err = msgp.ErrOverflow(uint64(zb0033), uint64(bounds.EncodedMaxAssetsPerAccount)) err = msgp.WrapError(err, "Assets") return } - if zb0036 { + if zb0034 { (*z).AccountData.Assets = nil } else if (*z).AccountData.Assets == nil { - (*z).AccountData.Assets = make(map[AssetIndex]AssetHolding, zb0035) + (*z).AccountData.Assets = make(map[AssetIndex]AssetHolding, zb0033) } - for zb0035 > 0 { + for zb0033 > 0 { var zb0003 AssetIndex var zb0004 AssetHolding - zb0035-- + zb0033-- bts, err = zb0003.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "Assets") return } - var zb0037 int - var zb0038 bool - zb0037, zb0038, bts, err = msgp.ReadMapHeaderBytes(bts) - if _, ok := err.(msgp.TypeError); ok { - zb0037, zb0038, bts, err = msgp.ReadArrayHeaderBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - if zb0037 > 0 { - zb0037-- - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array", "Amount") - return - } - } - if zb0037 > 0 { - zb0037-- - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array", "Frozen") - return - } - } - if zb0037 > 0 { - err = msgp.ErrTooManyArrayFields(zb0037) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "struct-from-array") - return - } - } - } else { - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - if zb0038 { - zb0004 = AssetHolding{} - } - for zb0037 > 0 { - zb0037-- - field, bts, err = msgp.ReadMapKeyZC(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - switch string(field) { - case "a": - zb0004.Amount, bts, err = msgp.ReadUint64Bytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "Amount") - return - } - case "f": - zb0004.Frozen, bts, err = msgp.ReadBoolBytes(bts) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003, "Frozen") - return - } - default: - err = msgp.ErrNoField(string(field)) - if err != nil { - err = msgp.WrapError(err, "Assets", zb0003) - return - } - } - } + bts, err = zb0004.UnmarshalMsgWithState(bts, st) + if err != nil { + err = msgp.WrapError(err, "Assets", zb0003) + return } (*z).AccountData.Assets[zb0003] = zb0004 } @@ -4362,27 +4103,27 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState return } case "appl": - var zb0039 int - var zb0040 bool - zb0039, zb0040, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0035 int + var zb0036 bool + zb0035, zb0036, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AppLocalStates") return } - if zb0039 > bounds.EncodedMaxAppLocalStates { - err = msgp.ErrOverflow(uint64(zb0039), uint64(bounds.EncodedMaxAppLocalStates)) + if zb0035 > bounds.EncodedMaxAppLocalStates { + err = msgp.ErrOverflow(uint64(zb0035), uint64(bounds.EncodedMaxAppLocalStates)) err = msgp.WrapError(err, "AppLocalStates") return } - if zb0040 { + if zb0036 { (*z).AccountData.AppLocalStates = nil } else if (*z).AccountData.AppLocalStates == nil { - (*z).AccountData.AppLocalStates = make(map[AppIndex]AppLocalState, zb0039) + (*z).AccountData.AppLocalStates = make(map[AppIndex]AppLocalState, zb0035) } - for zb0039 > 0 { + for zb0035 > 0 { var zb0005 AppIndex var zb0006 AppLocalState - zb0039-- + zb0035-- bts, err = zb0005.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AppLocalStates") @@ -4396,27 +4137,27 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState (*z).AccountData.AppLocalStates[zb0005] = zb0006 } case "appp": - var zb0041 int - var zb0042 bool - zb0041, zb0042, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0037 int + var zb0038 bool + zb0037, zb0038, bts, err = msgp.ReadMapHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "AppParams") return } - if zb0041 > bounds.EncodedMaxAppParams { - err = msgp.ErrOverflow(uint64(zb0041), uint64(bounds.EncodedMaxAppParams)) + if zb0037 > bounds.EncodedMaxAppParams { + err = msgp.ErrOverflow(uint64(zb0037), uint64(bounds.EncodedMaxAppParams)) err = msgp.WrapError(err, "AppParams") return } - if zb0042 { + if zb0038 { (*z).AccountData.AppParams = nil } else if (*z).AccountData.AppParams == nil { - (*z).AccountData.AppParams = make(map[AppIndex]AppParams, zb0041) + (*z).AccountData.AppParams = make(map[AppIndex]AppParams, zb0037) } - for zb0041 > 0 { + for zb0037 > 0 { var zb0007 AppIndex var zb0008 AppParams - zb0041-- + zb0037-- bts, err = zb0007.UnmarshalMsgWithState(bts, st) if err != nil { err = msgp.WrapError(err, "AppParams") @@ -4430,33 +4171,33 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState (*z).AccountData.AppParams[zb0007] = zb0008 } case "tsch": - var zb0043 int - var zb0044 bool - zb0043, zb0044, bts, err = msgp.ReadMapHeaderBytes(bts) + var zb0039 int + var zb0040 bool + zb0039, zb0040, bts, err = msgp.ReadMapHeaderBytes(bts) if _, ok := err.(msgp.TypeError); ok { - zb0043, zb0044, bts, err = msgp.ReadArrayHeaderBytes(bts) + zb0039, zb0040, bts, err = msgp.ReadArrayHeaderBytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema") return } - if zb0043 > 0 { - zb0043-- + if zb0039 > 0 { + zb0039-- (*z).AccountData.TotalAppSchema.NumUint, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array", "NumUint") return } } - if zb0043 > 0 { - zb0043-- + if zb0039 > 0 { + zb0039-- (*z).AccountData.TotalAppSchema.NumByteSlice, bts, err = msgp.ReadUint64Bytes(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array", "NumByteSlice") return } } - if zb0043 > 0 { - err = msgp.ErrTooManyArrayFields(zb0043) + if zb0039 > 0 { + err = msgp.ErrTooManyArrayFields(zb0039) if err != nil { err = msgp.WrapError(err, "TotalAppSchema", "struct-from-array") return @@ -4467,11 +4208,11 @@ func (z *BalanceRecord) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState err = msgp.WrapError(err, "TotalAppSchema") return } - if zb0044 { + if zb0040 { (*z).AccountData.TotalAppSchema = StateSchema{} } - for zb0043 > 0 { - zb0043-- + for zb0039 > 0 { + zb0039-- field, bts, err = msgp.ReadMapKeyZC(bts) if err != nil { err = msgp.WrapError(err, "TotalAppSchema") @@ -4553,7 +4294,7 @@ func (z *BalanceRecord) Msgsize() (s int) { for zb0003, zb0004 := range (*z).AccountData.Assets { _ = zb0003 _ = zb0004 - s += 0 + zb0003.Msgsize() + 1 + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s += 0 + zb0003.Msgsize() + zb0004.Msgsize() } } s += 6 + (*z).AccountData.AuthAddr.Msgsize() + 3 + msgp.BoolSize + 5 + msgp.MapHeaderSize @@ -4594,8 +4335,7 @@ func BalanceRecordMaxSize() (s int) { // Adding size of map keys for z.AccountData.Assets s += bounds.EncodedMaxAssetsPerAccount * (AssetIndexMaxSize()) // Adding size of map values for z.AccountData.Assets - s += bounds.EncodedMaxAssetsPerAccount * (1) - s += 2 + msgp.Uint64Size + 2 + msgp.BoolSize + s += bounds.EncodedMaxAssetsPerAccount * (AssetHoldingMaxSize()) s += 6 + AddressMaxSize() + 3 + msgp.BoolSize + 5 s += msgp.MapHeaderSize // Adding size of map keys for z.AccountData.AppLocalStates diff --git a/data/basics/userBalance.go b/data/basics/userBalance.go index 7f472f0c20..e2bf3a340b 100644 --- a/data/basics/userBalance.go +++ b/data/basics/userBalance.go @@ -345,8 +345,9 @@ type CreatableLocator struct { type AssetHolding struct { _struct struct{} `codec:",omitempty,omitemptyarray"` - Amount uint64 `codec:"a"` - Frozen bool `codec:"f"` + Amount uint64 `codec:"a"` + Frozen bool `codec:"f"` + LastFreezeChange uint64 `codec:"fc"` } // AssetParams describes the parameters of an asset. @@ -398,6 +399,10 @@ type AssetParams struct { // Clawback specifies an account that is allowed to take units // of this asset from any account. Clawback Address `codec:"c"` + + // LastGlobalFreeze specifies the last time (as a transaction counter) the + // asset was frozen globally, or 0 if the last global change was unfreeze. + LastGlobalFreeze uint64 `codec:"gf"` } // ToBeHashed implements crypto.Hashable diff --git a/data/transactions/asset.go b/data/transactions/asset.go index 93b6af840e..a41a71bce4 100644 --- a/data/transactions/asset.go +++ b/data/transactions/asset.go @@ -17,6 +17,9 @@ package transactions import ( + "errors" + + "github.com/algorand/go-algorand/config" "github.com/algorand/go-algorand/data/basics" ) @@ -75,3 +78,38 @@ type AssetFreezeTxnFields struct { // AssetFrozen is the new frozen value. AssetFrozen bool `codec:"afrz"` } + +var errAssetIDCannotBeZero = errors.New("asset ID cannot be zero") +var errCannotCloseAssetByClawback = errors.New("cannot close asset by clawback") +var errFreezeAccountCannotBeEmpty = errors.New("freeze account cannot be empty") + +// wellFormed performs some stateless checks on the AssetConfig transaction +func (ac AssetConfigTxnFields) wellFormed() error { + return nil +} + +// wellFormed performs some stateless checks on the AssetTransfer transaction +func (ax AssetTransferTxnFields) wellFormed() error { + if ax.XferAsset == 0 { + return errAssetIDCannotBeZero + } + + if !ax.AssetSender.IsZero() && !ax.AssetCloseTo.IsZero() { + return errCannotCloseAssetByClawback + } + + return nil +} + +// wellFormed performs some stateless checks on the AssetFreeze transaction +func (af AssetFreezeTxnFields) wellFormed(proto config.ConsensusParams) error { + if af.FreezeAsset == 0 { + return errAssetIDCannotBeZero + } + + if !proto.EnableGlobalFreeze && af.FreezeAccount.IsZero() { + return errFreezeAccountCannotBeEmpty + } + + return nil +} diff --git a/data/transactions/logic/README.md b/data/transactions/logic/README.md index 408eec057f..e183daf892 100644 --- a/data/transactions/logic/README.md +++ b/data/transactions/logic/README.md @@ -650,7 +650,7 @@ Asset fields include `AssetHolding` and `AssetParam` fields that are used in the | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | | Index | Name | Type | In | Notes | diff --git a/data/transactions/logic/TEAL_opcodes_v10.md b/data/transactions/logic/TEAL_opcodes_v10.md index bfd2c1e36b..5900123cda 100644 --- a/data/transactions/logic/TEAL_opcodes_v10.md +++ b/data/transactions/logic/TEAL_opcodes_v10.md @@ -991,7 +991,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v11.md b/data/transactions/logic/TEAL_opcodes_v11.md index 3e38852ed5..0fd197f8aa 100644 --- a/data/transactions/logic/TEAL_opcodes_v11.md +++ b/data/transactions/logic/TEAL_opcodes_v11.md @@ -996,7 +996,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v2.md b/data/transactions/logic/TEAL_opcodes_v2.md index 84d21cb744..5995d71000 100644 --- a/data/transactions/logic/TEAL_opcodes_v2.md +++ b/data/transactions/logic/TEAL_opcodes_v2.md @@ -635,7 +635,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v3.md b/data/transactions/logic/TEAL_opcodes_v3.md index b9b21b141f..a3c74b8a39 100644 --- a/data/transactions/logic/TEAL_opcodes_v3.md +++ b/data/transactions/logic/TEAL_opcodes_v3.md @@ -723,7 +723,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v4.md b/data/transactions/logic/TEAL_opcodes_v4.md index 2fb554bed1..1279ffbaef 100644 --- a/data/transactions/logic/TEAL_opcodes_v4.md +++ b/data/transactions/logic/TEAL_opcodes_v4.md @@ -777,7 +777,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v5.md b/data/transactions/logic/TEAL_opcodes_v5.md index 92f52f59a2..16735128f7 100644 --- a/data/transactions/logic/TEAL_opcodes_v5.md +++ b/data/transactions/logic/TEAL_opcodes_v5.md @@ -891,7 +891,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v6.md b/data/transactions/logic/TEAL_opcodes_v6.md index 6621c3c84a..b355d51999 100644 --- a/data/transactions/logic/TEAL_opcodes_v6.md +++ b/data/transactions/logic/TEAL_opcodes_v6.md @@ -896,7 +896,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v7.md b/data/transactions/logic/TEAL_opcodes_v7.md index 46752e9121..b4ac9458a1 100644 --- a/data/transactions/logic/TEAL_opcodes_v7.md +++ b/data/transactions/logic/TEAL_opcodes_v7.md @@ -964,7 +964,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v8.md b/data/transactions/logic/TEAL_opcodes_v8.md index 2c94de5a56..2f3558d6d1 100644 --- a/data/transactions/logic/TEAL_opcodes_v8.md +++ b/data/transactions/logic/TEAL_opcodes_v8.md @@ -988,7 +988,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/TEAL_opcodes_v9.md b/data/transactions/logic/TEAL_opcodes_v9.md index 68afbe47ee..253ad70298 100644 --- a/data/transactions/logic/TEAL_opcodes_v9.md +++ b/data/transactions/logic/TEAL_opcodes_v9.md @@ -988,7 +988,7 @@ Fields | Index | Name | Type | Notes | | - | ------ | -- | --------- | | 0 | AssetBalance | uint64 | Amount of the asset unit held by this account | -| 1 | AssetFrozen | bool | Is the asset frozen or not | +| 1 | AssetFrozen | bool | Is the asset effectively frozen, accounting for local and global freeze state | params: Txn.Accounts offset (or, since v4, an _available_ address), asset id (or, since v4, a Txn.ForeignAssets offset). Return: did_exist flag (1 if the asset existed and 0 otherwise), value. diff --git a/data/transactions/logic/eval.go b/data/transactions/logic/eval.go index 271c970652..176013788d 100644 --- a/data/transactions/logic/eval.go +++ b/data/transactions/logic/eval.go @@ -2892,11 +2892,15 @@ func opUncover(cx *EvalContext) error { return nil } -func (cx *EvalContext) assetHoldingToValue(holding *basics.AssetHolding, fs assetHoldingFieldSpec) (sv stackValue, err error) { +func (cx *EvalContext) assetHoldingToValue(holding *basics.AssetHolding, fs assetHoldingFieldSpec, params *basics.AssetParams) (sv stackValue, err error) { switch fs.field { case AssetBalance: sv.Uint = holding.Amount case AssetFrozen: + isAccountFrozen := holding.Frozen + isAssetFrozen := params.LastGlobalFreeze > holding.LastFreezeChange + sv.Uint = boolToUint(isAccountFrozen || isAssetFrozen) + case AssetFrozenLocally: sv.Uint = boolToUint(holding.Frozen) default: return sv, fmt.Errorf("invalid asset_holding_get field %d", fs.field) @@ -2934,6 +2938,8 @@ func (cx *EvalContext) assetParamsToValue(params *basics.AssetParams, creator ba sv.Bytes = params.Clawback[:] case AssetCreator: sv.Bytes = creator[:] + case AssetGlobalFrozen: + sv.Uint = boolToUint(params.LastGlobalFreeze > 0) default: return sv, fmt.Errorf("invalid asset_params_get field %d", fs.field) } @@ -4922,7 +4928,8 @@ func opAssetHoldingGet(cx *EvalContext) error { if holding, err := cx.Ledger.AssetHolding(addr, asset); err == nil { // the holding exists, read the value exist = 1 - value, err = cx.assetHoldingToValue(&holding, fs) + params, _, _ := cx.Ledger.AssetParams(asset) // Asset may be deleted, so empty params is fine + value, err = cx.assetHoldingToValue(&holding, fs, ¶ms) if err != nil { return err } diff --git a/data/transactions/logic/fields.go b/data/transactions/logic/fields.go index 4e6f07bcae..c574f6d0b8 100644 --- a/data/transactions/logic/fields.go +++ b/data/transactions/logic/fields.go @@ -1152,8 +1152,11 @@ type AssetHoldingField int const ( // AssetBalance AssetHolding.Amount AssetBalance AssetHoldingField = iota - // AssetFrozen AssetHolding.Frozen + // AssetFrozen AssetHolding.Frozen || (AssetParams.LastGlobalFreeze > AssetHolding.LastFreezeChange) AssetFrozen + // AssetFrozenLocally AssetHolding.Frozen + AssetFrozenLocally + invalidAssetHoldingField // compile-time constant for number of fields ) @@ -1184,7 +1187,8 @@ func (fs assetHoldingFieldSpec) Note() string { var assetHoldingFieldSpecs = [...]assetHoldingFieldSpec{ {AssetBalance, StackUint64, 2, "Amount of the asset unit held by this account"}, - {AssetFrozen, StackBoolean, 2, "Is the asset frozen or not"}, + {AssetFrozen, StackBoolean, 2, "Is the asset effectively frozen, accounting for local and global freeze state"}, + {AssetFrozenLocally, StackBoolean, 12, "Is the account frozen or not"}, } func assetHoldingFieldSpecByField(f AssetHoldingField) (assetHoldingFieldSpec, bool) { @@ -1240,6 +1244,9 @@ const ( // AssetCreator is not *in* the Params, but it is uniquely determined. AssetCreator + // AssetGlobalFrozen AssetParams.LastGlobalFreeze > 0 + AssetGlobalFrozen + invalidAssetParamsField // compile-time constant for number of fields ) @@ -1281,6 +1288,7 @@ var assetParamsFieldSpecs = [...]assetParamsFieldSpec{ {AssetFreeze, StackAddress, 2, "Freeze address"}, {AssetClawback, StackAddress, 2, "Clawback address"}, {AssetCreator, StackAddress, 5, "Creator address"}, + {AssetGlobalFrozen, StackBoolean, 12, "Is the asset frozen or not"}, } func assetParamsFieldSpecByField(f AssetParamsField) (assetParamsFieldSpec, bool) { diff --git a/data/transactions/logic/fields_string.go b/data/transactions/logic/fields_string.go index a9059e56f3..fa9ecd0006 100644 --- a/data/transactions/logic/fields_string.go +++ b/data/transactions/logic/fields_string.go @@ -146,12 +146,13 @@ func _() { _ = x[AssetFreeze-9] _ = x[AssetClawback-10] _ = x[AssetCreator-11] - _ = x[invalidAssetParamsField-12] + _ = x[AssetGlobalFrozen-12] + _ = x[invalidAssetParamsField-13] } -const _AssetParamsField_name = "AssetTotalAssetDecimalsAssetDefaultFrozenAssetUnitNameAssetNameAssetURLAssetMetadataHashAssetManagerAssetReserveAssetFreezeAssetClawbackAssetCreatorinvalidAssetParamsField" +const _AssetParamsField_name = "AssetTotalAssetDecimalsAssetDefaultFrozenAssetUnitNameAssetNameAssetURLAssetMetadataHashAssetManagerAssetReserveAssetFreezeAssetClawbackAssetCreatorAssetGlobalFrozeninvalidAssetParamsField" -var _AssetParamsField_index = [...]uint8{0, 10, 23, 41, 54, 63, 71, 88, 100, 112, 123, 136, 148, 171} +var _AssetParamsField_index = [...]uint8{0, 10, 23, 41, 54, 63, 71, 88, 100, 112, 123, 136, 148, 165, 188} func (i AssetParamsField) String() string { if i < 0 || i >= AssetParamsField(len(_AssetParamsField_index)-1) { @@ -224,12 +225,13 @@ func _() { var x [1]struct{} _ = x[AssetBalance-0] _ = x[AssetFrozen-1] - _ = x[invalidAssetHoldingField-2] + _ = x[AssetFrozenLocally-2] + _ = x[invalidAssetHoldingField-3] } -const _AssetHoldingField_name = "AssetBalanceAssetFrozeninvalidAssetHoldingField" +const _AssetHoldingField_name = "AssetBalanceAssetFrozenAssetFrozenLocallyinvalidAssetHoldingField" -var _AssetHoldingField_index = [...]uint8{0, 12, 23, 47} +var _AssetHoldingField_index = [...]uint8{0, 12, 23, 41, 65} func (i AssetHoldingField) String() string { if i < 0 || i >= AssetHoldingField(len(_AssetHoldingField_index)-1) { diff --git a/data/transactions/transaction.go b/data/transactions/transaction.go index 70b2068f3c..64cd054e7d 100644 --- a/data/transactions/transaction.go +++ b/data/transactions/transaction.go @@ -342,6 +342,24 @@ func (tx Transaction) WellFormed(spec SpecialAddresses, proto config.ConsensusPa return fmt.Errorf("asset transaction not supported") } + switch tx.Type { + case protocol.AssetConfigTx: + err := tx.AssetConfigTxnFields.wellFormed() + if err != nil { + return err + } + case protocol.AssetTransferTx: + err := tx.AssetTransferTxnFields.wellFormed() + if err != nil { + return err + } + case protocol.AssetFreezeTx: + err := tx.AssetFreezeTxnFields.wellFormed(proto) + if err != nil { + return err + } + } + case protocol.ApplicationCallTx: if !proto.Application { return fmt.Errorf("application transaction not supported") diff --git a/ledger/apply/asset.go b/ledger/apply/asset.go index 9b85f5b31a..ccb5fae27b 100644 --- a/ledger/apply/asset.go +++ b/ledger/apply/asset.go @@ -208,8 +208,15 @@ func takeOut(balances Balances, addr basics.Address, asset basics.AssetIndex, am return fmt.Errorf("asset %v missing from %v", asset, addr) } - if sndHolding.Frozen && !bypassFreeze { - return fmt.Errorf("asset %v frozen in %v", asset, addr) + if !bypassFreeze { + if sndHolding.Frozen { + return fmt.Errorf("asset %v frozen in %v", asset, addr) + } + + err = checkGlobalFreeze(balances, addr, asset, sndHolding) + if err != nil { + return err + } } newAmount, overflowed := basics.OSub(sndHolding.Amount, amount) @@ -234,8 +241,15 @@ func putIn(balances Balances, addr basics.Address, asset basics.AssetIndex, amou return fmt.Errorf("receiver error: must optin, asset %v missing from %v", asset, addr) } - if rcvHolding.Frozen && !bypassFreeze { - return fmt.Errorf("asset frozen in recipient") + if !bypassFreeze { + if rcvHolding.Frozen { + return fmt.Errorf("asset frozen in recipient") + } + + err = checkGlobalFreeze(balances, addr, asset, rcvHolding) + if err != nil { + return err + } } var overflowed bool @@ -247,6 +261,26 @@ func putIn(balances Balances, addr basics.Address, asset basics.AssetIndex, amou return balances.PutAssetHolding(addr, asset, rcvHolding) } +// checkGlobalFreeze exclusively checks if a particular account is +// constrained by the global freeze state. +// It is assumed assetHolding.Frozen is False and isn't checked here, +// because depending on if the asset is being sent/received, the error +// message differs. +func checkGlobalFreeze(balances Balances, addr basics.Address, asset basics.AssetIndex, assetHolding basics.AssetHolding) error { + assetParams, _, err := getParams(balances, asset) + if err != nil { + return err + } + + // LastGlobalFreeze is only enforced if a LastFreezeChange hasn't + // occoured after it. + if assetParams.LastGlobalFreeze > assetHolding.LastFreezeChange { + return fmt.Errorf("asset %v globally frozen for %v", asset, addr) + } + + return nil +} + // AssetTransfer applies an AssetTransfer transaction using the Balances interface. func AssetTransfer(ct transactions.AssetTransferTxnFields, header transactions.Header, balances Balances, spec transactions.SpecialAddresses, ad *transactions.ApplyData) error { // Default to sending from the transaction sender's account. @@ -332,11 +366,6 @@ func AssetTransfer(ct transactions.AssetTransferTxnFields, header transactions.H } if ct.AssetCloseTo != (basics.Address{}) { - // Cannot close by clawback - if clawback { - return fmt.Errorf("cannot close asset by clawback") - } - record, err := balances.Get(source, false) if err != nil { return err @@ -433,9 +462,9 @@ func AssetTransfer(ct transactions.AssetTransferTxnFields, header transactions.H } // AssetFreeze applies an AssetFreeze transaction using the Balances interface. -func AssetFreeze(cf transactions.AssetFreezeTxnFields, header transactions.Header, balances Balances, spec transactions.SpecialAddresses, ad *transactions.ApplyData) error { +func AssetFreeze(cf transactions.AssetFreezeTxnFields, header transactions.Header, balances Balances, spec transactions.SpecialAddresses, ad *transactions.ApplyData, txnCounter uint64) error { // Only the Freeze address can change the freeze value. - params, _, err := getParams(balances, cf.FreezeAsset) + params, creator, err := getParams(balances, cf.FreezeAsset) if err != nil { return err } @@ -444,6 +473,17 @@ func AssetFreeze(cf transactions.AssetFreezeTxnFields, header transactions.Heade return fmt.Errorf("freeze not allowed: sender %v, freeze %v", header.Sender, params.Freeze) } + // If FreezeAccount is not set, then this is a global freeze/unfreeze operation. + if cf.FreezeAccount.IsZero() { + if cf.AssetFrozen { + params.LastGlobalFreeze = txnCounter + 1 + } else { + params.LastGlobalFreeze = 0 + } + + return balances.PutAssetParams(creator, cf.FreezeAsset, params) + } + // Get the account to be frozen/unfrozen. holding, ok, err := balances.GetAssetHolding(cf.FreezeAccount, cf.FreezeAsset) if err != nil { @@ -454,5 +494,8 @@ func AssetFreeze(cf transactions.AssetFreezeTxnFields, header transactions.Heade } holding.Frozen = cf.AssetFrozen + if balances.ConsensusParams().EnableGlobalFreeze { + holding.LastFreezeChange = txnCounter + 1 + } return balances.PutAssetHolding(cf.FreezeAccount, cf.FreezeAsset, holding) } diff --git a/ledger/eval/applications.go b/ledger/eval/applications.go index 85a5ad4ab7..d37b1fd8bb 100644 --- a/ledger/eval/applications.go +++ b/ledger/eval/applications.go @@ -344,7 +344,7 @@ func (cs *roundCowState) Perform(gi int, ep *logic.EvalParams) error { err = apply.AssetTransfer(txn.Txn.AssetTransferTxnFields, txn.Txn.Header, cs, *ep.Specials, &txn.ApplyData) case protocol.AssetFreezeTx: - err = apply.AssetFreeze(txn.Txn.AssetFreezeTxnFields, txn.Txn.Header, cs, *ep.Specials, &txn.ApplyData) + err = apply.AssetFreeze(txn.Txn.AssetFreezeTxnFields, txn.Txn.Header, cs, *ep.Specials, &txn.ApplyData, cs.Counter()) case protocol.ApplicationCallTx: err = apply.ApplicationCall(txn.Txn.ApplicationCallTxnFields, txn.Txn.Header, cs, &txn.ApplyData, diff --git a/ledger/eval/eval.go b/ledger/eval/eval.go index 8b422af70f..935ab23d81 100644 --- a/ledger/eval/eval.go +++ b/ledger/eval/eval.go @@ -1297,7 +1297,7 @@ func (eval *BlockEvaluator) applyTransaction(tx transactions.Transaction, cow *r err = apply.AssetTransfer(tx.AssetTransferTxnFields, tx.Header, cow, eval.specials, &ad) case protocol.AssetFreezeTx: - err = apply.AssetFreeze(tx.AssetFreezeTxnFields, tx.Header, cow, eval.specials, &ad) + err = apply.AssetFreeze(tx.AssetFreezeTxnFields, tx.Header, cow, eval.specials, &ad, ctr) case protocol.ApplicationCallTx: err = apply.ApplicationCall(tx.ApplicationCallTxnFields, tx.Header, cow, &ad, gi, evalParams, ctr) diff --git a/ledger/store/trackerdb/data.go b/ledger/store/trackerdb/data.go index dd3ef060aa..a8f7df4b14 100644 --- a/ledger/store/trackerdb/data.go +++ b/ledger/store/trackerdb/data.go @@ -134,6 +134,12 @@ type ResourcesData struct { UpdateRound uint64 `codec:"z"` Version uint64 `codec:"A"` + + // Asset Global Freeze. Two new uint64s to contain the txnCounter value. + // `LastGlobalFreeze` belongs to AssetParams, indicating when the asset was globally frozen, or 0 if unfrozen. + // `LastFreezeChange` belongs to AssetHolding, indicating the last time it was set. + LastGlobalFreeze uint64 `codec:"B"` + LastFreezeChange uint64 `codec:"C"` } // BaseVotingData is the base struct used to store voting data @@ -580,7 +586,9 @@ func (rd *ResourcesData) IsEmptyAssetFields() bool { rd.Manager.IsZero() && rd.Reserve.IsZero() && rd.Freeze.IsZero() && - rd.Clawback.IsZero() + rd.Clawback.IsZero() && + rd.LastGlobalFreeze == 0 && + rd.LastFreezeChange == 0 } // IsAsset returns true if the flag is ResourceFlagsEmptyAsset and the fields are not empty. @@ -604,6 +612,7 @@ func (rd *ResourcesData) ClearAssetParams() { rd.Reserve = basics.Address{} rd.Freeze = basics.Address{} rd.Clawback = basics.Address{} + rd.LastGlobalFreeze = 0 hadHolding := (rd.ResourceFlags & ResourceFlagsNotHolding) == ResourceFlagsHolding rd.ResourceFlags -= rd.ResourceFlags & ResourceFlagsOwnership rd.ResourceFlags &= ^ResourceFlagsEmptyAsset @@ -625,6 +634,7 @@ func (rd *ResourcesData) SetAssetParams(ap basics.AssetParams, haveHoldings bool rd.Reserve = ap.Reserve rd.Freeze = ap.Freeze rd.Clawback = ap.Clawback + rd.LastGlobalFreeze = ap.LastGlobalFreeze rd.ResourceFlags |= ResourceFlagsOwnership if !haveHoldings { rd.ResourceFlags |= ResourceFlagsNotHolding @@ -638,17 +648,18 @@ func (rd *ResourcesData) SetAssetParams(ap basics.AssetParams, haveHoldings bool // GetAssetParams getter for asset params. func (rd *ResourcesData) GetAssetParams() basics.AssetParams { ap := basics.AssetParams{ - Total: rd.Total, - Decimals: rd.Decimals, - DefaultFrozen: rd.DefaultFrozen, - UnitName: rd.UnitName, - AssetName: rd.AssetName, - URL: rd.URL, - MetadataHash: rd.MetadataHash, - Manager: rd.Manager, - Reserve: rd.Reserve, - Freeze: rd.Freeze, - Clawback: rd.Clawback, + Total: rd.Total, + Decimals: rd.Decimals, + DefaultFrozen: rd.DefaultFrozen, + UnitName: rd.UnitName, + AssetName: rd.AssetName, + URL: rd.URL, + MetadataHash: rd.MetadataHash, + Manager: rd.Manager, + Reserve: rd.Reserve, + Freeze: rd.Freeze, + Clawback: rd.Clawback, + LastGlobalFreeze: rd.LastGlobalFreeze, } return ap } @@ -657,6 +668,7 @@ func (rd *ResourcesData) GetAssetParams() basics.AssetParams { func (rd *ResourcesData) ClearAssetHolding() { rd.Amount = 0 rd.Frozen = false + rd.LastFreezeChange = 0 rd.ResourceFlags |= ResourceFlagsNotHolding hadParams := (rd.ResourceFlags & ResourceFlagsOwnership) == ResourceFlagsOwnership @@ -671,6 +683,7 @@ func (rd *ResourcesData) ClearAssetHolding() { func (rd *ResourcesData) SetAssetHolding(ah basics.AssetHolding) { rd.Amount = ah.Amount rd.Frozen = ah.Frozen + rd.LastFreezeChange = ah.LastFreezeChange rd.ResourceFlags &= ^(ResourceFlagsNotHolding + ResourceFlagsEmptyAsset) // ResourceFlagsHolding is set implicitly since it is zero if rd.IsEmptyAssetFields() { @@ -681,8 +694,9 @@ func (rd *ResourcesData) SetAssetHolding(ah basics.AssetHolding) { // GetAssetHolding getter for asset holding. func (rd *ResourcesData) GetAssetHolding() basics.AssetHolding { return basics.AssetHolding{ - Amount: rd.Amount, - Frozen: rd.Frozen, + Amount: rd.Amount, + Frozen: rd.Frozen, + LastFreezeChange: rd.LastFreezeChange, } } diff --git a/ledger/store/trackerdb/msgp_gen.go b/ledger/store/trackerdb/msgp_gen.go index 9e522d305d..2c952a0857 100644 --- a/ledger/store/trackerdb/msgp_gen.go +++ b/ledger/store/trackerdb/msgp_gen.go @@ -1744,115 +1744,123 @@ func ResourceFlagsMaxSize() (s int) { func (z *ResourcesData) MarshalMsg(b []byte) (o []byte) { o = msgp.Require(b, z.Msgsize()) // omitempty: check for empty values - zb0002Len := uint32(27) - var zb0002Mask uint32 /* 28 bits */ + zb0002Len := uint32(29) + var zb0002Mask uint32 /* 30 bits */ if (*z).Version == 0 { zb0002Len-- zb0002Mask |= 0x1 } - if (*z).Total == 0 { + if (*z).LastGlobalFreeze == 0 { + zb0002Len-- + zb0002Mask |= 0x2 + } + if (*z).LastFreezeChange == 0 { zb0002Len-- zb0002Mask |= 0x4 } + if (*z).Total == 0 { + zb0002Len-- + zb0002Mask |= 0x10 + } if (*z).Decimals == 0 { zb0002Len-- - zb0002Mask |= 0x8 + zb0002Mask |= 0x20 } if (*z).DefaultFrozen == false { zb0002Len-- - zb0002Mask |= 0x10 + zb0002Mask |= 0x40 } if (*z).UnitName == "" { zb0002Len-- - zb0002Mask |= 0x20 + zb0002Mask |= 0x80 } if (*z).AssetName == "" { zb0002Len-- - zb0002Mask |= 0x40 + zb0002Mask |= 0x100 } if (*z).URL == "" { zb0002Len-- - zb0002Mask |= 0x80 + zb0002Mask |= 0x200 } if (*z).MetadataHash == ([32]byte{}) { zb0002Len-- - zb0002Mask |= 0x100 + zb0002Mask |= 0x400 } if (*z).Manager.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x200 + zb0002Mask |= 0x800 } if (*z).Reserve.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x400 + zb0002Mask |= 0x1000 } if (*z).Freeze.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x800 + zb0002Mask |= 0x2000 } if (*z).Clawback.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x1000 + zb0002Mask |= 0x4000 } if (*z).Amount == 0 { zb0002Len-- - zb0002Mask |= 0x2000 + zb0002Mask |= 0x8000 } if (*z).Frozen == false { zb0002Len-- - zb0002Mask |= 0x4000 + zb0002Mask |= 0x10000 } if (*z).SchemaNumUint == 0 { zb0002Len-- - zb0002Mask |= 0x8000 + zb0002Mask |= 0x20000 } if (*z).SchemaNumByteSlice == 0 { zb0002Len-- - zb0002Mask |= 0x10000 + zb0002Mask |= 0x40000 } if (*z).KeyValue.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x20000 + zb0002Mask |= 0x80000 } if len((*z).ApprovalProgram) == 0 { zb0002Len-- - zb0002Mask |= 0x40000 + zb0002Mask |= 0x100000 } if len((*z).ClearStateProgram) == 0 { zb0002Len-- - zb0002Mask |= 0x80000 + zb0002Mask |= 0x200000 } if (*z).GlobalState.MsgIsZero() { zb0002Len-- - zb0002Mask |= 0x100000 + zb0002Mask |= 0x400000 } if (*z).LocalStateSchemaNumUint == 0 { zb0002Len-- - zb0002Mask |= 0x200000 + zb0002Mask |= 0x800000 } if (*z).LocalStateSchemaNumByteSlice == 0 { zb0002Len-- - zb0002Mask |= 0x400000 + zb0002Mask |= 0x1000000 } if (*z).GlobalStateSchemaNumUint == 0 { zb0002Len-- - zb0002Mask |= 0x800000 + zb0002Mask |= 0x2000000 } if (*z).GlobalStateSchemaNumByteSlice == 0 { zb0002Len-- - zb0002Mask |= 0x1000000 + zb0002Mask |= 0x4000000 } if (*z).ExtraProgramPages == 0 { zb0002Len-- - zb0002Mask |= 0x2000000 + zb0002Mask |= 0x8000000 } if (*z).ResourceFlags == 0 { zb0002Len-- - zb0002Mask |= 0x4000000 + zb0002Mask |= 0x10000000 } if (*z).UpdateRound == 0 { zb0002Len-- - zb0002Mask |= 0x8000000 + zb0002Mask |= 0x20000000 } // variable map header, size zb0002Len o = msgp.AppendMapHeader(o, zb0002Len) @@ -1862,132 +1870,142 @@ func (z *ResourcesData) MarshalMsg(b []byte) (o []byte) { o = append(o, 0xa1, 0x41) o = msgp.AppendUint64(o, (*z).Version) } + if (zb0002Mask & 0x2) == 0 { // if not empty + // string "B" + o = append(o, 0xa1, 0x42) + o = msgp.AppendUint64(o, (*z).LastGlobalFreeze) + } if (zb0002Mask & 0x4) == 0 { // if not empty + // string "C" + o = append(o, 0xa1, 0x43) + o = msgp.AppendUint64(o, (*z).LastFreezeChange) + } + if (zb0002Mask & 0x10) == 0 { // if not empty // string "a" o = append(o, 0xa1, 0x61) o = msgp.AppendUint64(o, (*z).Total) } - if (zb0002Mask & 0x8) == 0 { // if not empty + if (zb0002Mask & 0x20) == 0 { // if not empty // string "b" o = append(o, 0xa1, 0x62) o = msgp.AppendUint32(o, (*z).Decimals) } - if (zb0002Mask & 0x10) == 0 { // if not empty + if (zb0002Mask & 0x40) == 0 { // if not empty // string "c" o = append(o, 0xa1, 0x63) o = msgp.AppendBool(o, (*z).DefaultFrozen) } - if (zb0002Mask & 0x20) == 0 { // if not empty + if (zb0002Mask & 0x80) == 0 { // if not empty // string "d" o = append(o, 0xa1, 0x64) o = msgp.AppendString(o, (*z).UnitName) } - if (zb0002Mask & 0x40) == 0 { // if not empty + if (zb0002Mask & 0x100) == 0 { // if not empty // string "e" o = append(o, 0xa1, 0x65) o = msgp.AppendString(o, (*z).AssetName) } - if (zb0002Mask & 0x80) == 0 { // if not empty + if (zb0002Mask & 0x200) == 0 { // if not empty // string "f" o = append(o, 0xa1, 0x66) o = msgp.AppendString(o, (*z).URL) } - if (zb0002Mask & 0x100) == 0 { // if not empty + if (zb0002Mask & 0x400) == 0 { // if not empty // string "g" o = append(o, 0xa1, 0x67) o = msgp.AppendBytes(o, ((*z).MetadataHash)[:]) } - if (zb0002Mask & 0x200) == 0 { // if not empty + if (zb0002Mask & 0x800) == 0 { // if not empty // string "h" o = append(o, 0xa1, 0x68) o = (*z).Manager.MarshalMsg(o) } - if (zb0002Mask & 0x400) == 0 { // if not empty + if (zb0002Mask & 0x1000) == 0 { // if not empty // string "i" o = append(o, 0xa1, 0x69) o = (*z).Reserve.MarshalMsg(o) } - if (zb0002Mask & 0x800) == 0 { // if not empty + if (zb0002Mask & 0x2000) == 0 { // if not empty // string "j" o = append(o, 0xa1, 0x6a) o = (*z).Freeze.MarshalMsg(o) } - if (zb0002Mask & 0x1000) == 0 { // if not empty + if (zb0002Mask & 0x4000) == 0 { // if not empty // string "k" o = append(o, 0xa1, 0x6b) o = (*z).Clawback.MarshalMsg(o) } - if (zb0002Mask & 0x2000) == 0 { // if not empty + if (zb0002Mask & 0x8000) == 0 { // if not empty // string "l" o = append(o, 0xa1, 0x6c) o = msgp.AppendUint64(o, (*z).Amount) } - if (zb0002Mask & 0x4000) == 0 { // if not empty + if (zb0002Mask & 0x10000) == 0 { // if not empty // string "m" o = append(o, 0xa1, 0x6d) o = msgp.AppendBool(o, (*z).Frozen) } - if (zb0002Mask & 0x8000) == 0 { // if not empty + if (zb0002Mask & 0x20000) == 0 { // if not empty // string "n" o = append(o, 0xa1, 0x6e) o = msgp.AppendUint64(o, (*z).SchemaNumUint) } - if (zb0002Mask & 0x10000) == 0 { // if not empty + if (zb0002Mask & 0x40000) == 0 { // if not empty // string "o" o = append(o, 0xa1, 0x6f) o = msgp.AppendUint64(o, (*z).SchemaNumByteSlice) } - if (zb0002Mask & 0x20000) == 0 { // if not empty + if (zb0002Mask & 0x80000) == 0 { // if not empty // string "p" o = append(o, 0xa1, 0x70) o = (*z).KeyValue.MarshalMsg(o) } - if (zb0002Mask & 0x40000) == 0 { // if not empty + if (zb0002Mask & 0x100000) == 0 { // if not empty // string "q" o = append(o, 0xa1, 0x71) o = msgp.AppendBytes(o, (*z).ApprovalProgram) } - if (zb0002Mask & 0x80000) == 0 { // if not empty + if (zb0002Mask & 0x200000) == 0 { // if not empty // string "r" o = append(o, 0xa1, 0x72) o = msgp.AppendBytes(o, (*z).ClearStateProgram) } - if (zb0002Mask & 0x100000) == 0 { // if not empty + if (zb0002Mask & 0x400000) == 0 { // if not empty // string "s" o = append(o, 0xa1, 0x73) o = (*z).GlobalState.MarshalMsg(o) } - if (zb0002Mask & 0x200000) == 0 { // if not empty + if (zb0002Mask & 0x800000) == 0 { // if not empty // string "t" o = append(o, 0xa1, 0x74) o = msgp.AppendUint64(o, (*z).LocalStateSchemaNumUint) } - if (zb0002Mask & 0x400000) == 0 { // if not empty + if (zb0002Mask & 0x1000000) == 0 { // if not empty // string "u" o = append(o, 0xa1, 0x75) o = msgp.AppendUint64(o, (*z).LocalStateSchemaNumByteSlice) } - if (zb0002Mask & 0x800000) == 0 { // if not empty + if (zb0002Mask & 0x2000000) == 0 { // if not empty // string "v" o = append(o, 0xa1, 0x76) o = msgp.AppendUint64(o, (*z).GlobalStateSchemaNumUint) } - if (zb0002Mask & 0x1000000) == 0 { // if not empty + if (zb0002Mask & 0x4000000) == 0 { // if not empty // string "w" o = append(o, 0xa1, 0x77) o = msgp.AppendUint64(o, (*z).GlobalStateSchemaNumByteSlice) } - if (zb0002Mask & 0x2000000) == 0 { // if not empty + if (zb0002Mask & 0x8000000) == 0 { // if not empty // string "x" o = append(o, 0xa1, 0x78) o = msgp.AppendUint32(o, (*z).ExtraProgramPages) } - if (zb0002Mask & 0x4000000) == 0 { // if not empty + if (zb0002Mask & 0x10000000) == 0 { // if not empty // string "y" o = append(o, 0xa1, 0x79) o = msgp.AppendUint8(o, uint8((*z).ResourceFlags)) } - if (zb0002Mask & 0x8000000) == 0 { // if not empty + if (zb0002Mask & 0x20000000) == 0 { // if not empty // string "z" o = append(o, 0xa1, 0x7a) o = msgp.AppendUint64(o, (*z).UpdateRound) @@ -2259,6 +2277,22 @@ func (z *ResourcesData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState return } } + if zb0002 > 0 { + zb0002-- + (*z).LastGlobalFreeze, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "LastGlobalFreeze") + return + } + } + if zb0002 > 0 { + zb0002-- + (*z).LastFreezeChange, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "struct-from-array", "LastFreezeChange") + return + } + } if zb0002 > 0 { err = msgp.ErrTooManyArrayFields(zb0002) if err != nil { @@ -2468,6 +2502,18 @@ func (z *ResourcesData) UnmarshalMsgWithState(bts []byte, st msgp.UnmarshalState err = msgp.WrapError(err, "Version") return } + case "B": + (*z).LastGlobalFreeze, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "LastGlobalFreeze") + return + } + case "C": + (*z).LastFreezeChange, bts, err = msgp.ReadUint64Bytes(bts) + if err != nil { + err = msgp.WrapError(err, "LastFreezeChange") + return + } default: err = msgp.ErrNoField(string(field)) if err != nil { @@ -2491,13 +2537,13 @@ func (_ *ResourcesData) CanUnmarshalMsg(z interface{}) bool { // Msgsize returns an upper bound estimate of the number of bytes occupied by the serialized message func (z *ResourcesData) Msgsize() (s int) { - s = 3 + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.BoolSize + 2 + msgp.StringPrefixSize + len((*z).UnitName) + 2 + msgp.StringPrefixSize + len((*z).AssetName) + 2 + msgp.StringPrefixSize + len((*z).URL) + 2 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + (*z).KeyValue.Msgsize() + 2 + msgp.BytesPrefixSize + len((*z).ApprovalProgram) + 2 + msgp.BytesPrefixSize + len((*z).ClearStateProgram) + 2 + (*z).GlobalState.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.Uint8Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + s = 3 + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.BoolSize + 2 + msgp.StringPrefixSize + len((*z).UnitName) + 2 + msgp.StringPrefixSize + len((*z).AssetName) + 2 + msgp.StringPrefixSize + len((*z).URL) + 2 + msgp.ArrayHeaderSize + (32 * (msgp.ByteSize)) + 2 + (*z).Manager.Msgsize() + 2 + (*z).Reserve.Msgsize() + 2 + (*z).Freeze.Msgsize() + 2 + (*z).Clawback.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + (*z).KeyValue.Msgsize() + 2 + msgp.BytesPrefixSize + len((*z).ApprovalProgram) + 2 + msgp.BytesPrefixSize + len((*z).ClearStateProgram) + 2 + (*z).GlobalState.Msgsize() + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.Uint8Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size return } // MsgIsZero returns whether this is a zero value func (z *ResourcesData) MsgIsZero() bool { - return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([32]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) && ((*z).Amount == 0) && ((*z).Frozen == false) && ((*z).SchemaNumUint == 0) && ((*z).SchemaNumByteSlice == 0) && ((*z).KeyValue.MsgIsZero()) && (len((*z).ApprovalProgram) == 0) && (len((*z).ClearStateProgram) == 0) && ((*z).GlobalState.MsgIsZero()) && ((*z).LocalStateSchemaNumUint == 0) && ((*z).LocalStateSchemaNumByteSlice == 0) && ((*z).GlobalStateSchemaNumUint == 0) && ((*z).GlobalStateSchemaNumByteSlice == 0) && ((*z).ExtraProgramPages == 0) && ((*z).ResourceFlags == 0) && ((*z).UpdateRound == 0) && ((*z).Version == 0) + return ((*z).Total == 0) && ((*z).Decimals == 0) && ((*z).DefaultFrozen == false) && ((*z).UnitName == "") && ((*z).AssetName == "") && ((*z).URL == "") && ((*z).MetadataHash == ([32]byte{})) && ((*z).Manager.MsgIsZero()) && ((*z).Reserve.MsgIsZero()) && ((*z).Freeze.MsgIsZero()) && ((*z).Clawback.MsgIsZero()) && ((*z).Amount == 0) && ((*z).Frozen == false) && ((*z).SchemaNumUint == 0) && ((*z).SchemaNumByteSlice == 0) && ((*z).KeyValue.MsgIsZero()) && (len((*z).ApprovalProgram) == 0) && (len((*z).ClearStateProgram) == 0) && ((*z).GlobalState.MsgIsZero()) && ((*z).LocalStateSchemaNumUint == 0) && ((*z).LocalStateSchemaNumByteSlice == 0) && ((*z).GlobalStateSchemaNumUint == 0) && ((*z).GlobalStateSchemaNumByteSlice == 0) && ((*z).ExtraProgramPages == 0) && ((*z).ResourceFlags == 0) && ((*z).UpdateRound == 0) && ((*z).Version == 0) && ((*z).LastGlobalFreeze == 0) && ((*z).LastFreezeChange == 0) } // MaxSize returns a maximum valid message size for this message type @@ -2511,7 +2557,7 @@ func ResourcesDataMaxSize() (s int) { s += 2 // Calculating size of array: z.MetadataHash s += msgp.ArrayHeaderSize + ((32) * (msgp.ByteSize)) - s += 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + basics.TealKeyValueMaxSize() + 2 + msgp.BytesPrefixSize + bounds.MaxAvailableAppProgramLen + 2 + msgp.BytesPrefixSize + bounds.MaxAvailableAppProgramLen + 2 + basics.TealKeyValueMaxSize() + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.Uint8Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + s += 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + basics.AddressMaxSize() + 2 + msgp.Uint64Size + 2 + msgp.BoolSize + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + basics.TealKeyValueMaxSize() + 2 + msgp.BytesPrefixSize + bounds.MaxAvailableAppProgramLen + 2 + msgp.BytesPrefixSize + bounds.MaxAvailableAppProgramLen + 2 + basics.TealKeyValueMaxSize() + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint32Size + 2 + msgp.Uint8Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size + 2 + msgp.Uint64Size return } diff --git a/ledger/testing/randomAccounts.go b/ledger/testing/randomAccounts.go index 58cbe06d7e..e4a95a9994 100644 --- a/ledger/testing/randomAccounts.go +++ b/ledger/testing/randomAccounts.go @@ -135,6 +135,9 @@ func RandomAssetParams() basics.AssetParams { if crypto.RandUint64()%5 != 0 { crypto.RandBytes(ap.Clawback[:]) } + if crypto.RandUint64()%5 != 0 { + ap.LastGlobalFreeze = crypto.RandUint64() + } return ap } @@ -150,10 +153,15 @@ func RandomAssetHolding(forceFrozen bool) basics.AssetHolding { if crypto.RandUint64()%5 != 0 { amount = crypto.RandUint64() } + var lastFreezeChange uint64 + if crypto.RandUint64()%5 != 0 { + lastFreezeChange = crypto.RandUint64() + } ah := basics.AssetHolding{ - Amount: amount, - Frozen: frozen, + Amount: amount, + Frozen: frozen, + LastFreezeChange: lastFreezeChange, } return ah } diff --git a/libgoal/transactions.go b/libgoal/transactions.go index 3c80b69dea..2c18fdbf90 100644 --- a/libgoal/transactions.go +++ b/libgoal/transactions.go @@ -840,9 +840,11 @@ func (c *Client) MakeUnsignedAssetFreezeTx(index uint64, accountToChange string, tx.Type = protocol.AssetFreezeTx tx.FreezeAsset = basics.AssetIndex(index) - tx.FreezeAccount, err = basics.UnmarshalChecksumAddress(accountToChange) - if err != nil { - return tx, err + if accountToChange != "" { + tx.FreezeAccount, err = basics.UnmarshalChecksumAddress(accountToChange) + if err != nil { + return tx, err + } } tx.AssetFrozen = newFreezeSetting diff --git a/test/e2e-go/features/transactions/asset_test.go b/test/e2e-go/features/transactions/asset_test.go index b83860bdd1..6dccb30e84 100644 --- a/test/e2e-go/features/transactions/asset_test.go +++ b/test/e2e-go/features/transactions/asset_test.go @@ -1237,3 +1237,241 @@ func verifyAssetParameters(asset model.AssetParams, asser.Equal(*asset.MetadataHash, metadataHash) asser.Equal(*asset.Url, assetURL) } + +func TestAssetGlobalFreeze(t *testing.T) { + partitiontest.PartitionTest(t) + defer fixtures.ShutdownSynchronizedTest(t) + + t.Parallel() + a := require.New(fixtures.SynchronizedTest(t)) + + var fixture fixtures.RestClientFixture + fixture.Setup(t, filepath.Join("nettemplates", "TwoNodes50EachFuture.json")) + defer fixture.Shutdown() + + client := fixture.LibGoalClient + accountList, err := fixture.GetWalletsSortedByBalance() + a.NoError(err) + account0 := accountList[0].Address + wh, err := client.GetUnencryptedWalletHandle() + a.NoError(err) + + manager, err := client.GenerateAddress(wh) + a.NoError(err) + + reserve, err := client.GenerateAddress(wh) + a.NoError(err) + + freeze, err := client.GenerateAddress(wh) + a.NoError(err) + + clawback, err := client.GenerateAddress(wh) + a.NoError(err) + + extra, err := client.GenerateAddress(wh) + a.NoError(err) + + // Fund the manager, freeze, clawback, and extra, so they can issue transactions later on + _, err = client.SendPaymentFromUnencryptedWallet(account0, manager, 0, 10000000000, nil) + a.NoError(err) + _, err = client.SendPaymentFromUnencryptedWallet(account0, reserve, 0, 10000000000, nil) + a.NoError(err) + _, err = client.SendPaymentFromUnencryptedWallet(account0, freeze, 0, 10000000000, nil) + a.NoError(err) + _, err = client.SendPaymentFromUnencryptedWallet(account0, clawback, 0, 10000000000, nil) + a.NoError(err) + + // Create two assets: one with default-freeze, and one without default-freeze + txids := make(map[string]string) + + tx, err := client.MakeUnsignedAssetCreateTx(100, false, manager, reserve, freeze, clawback, "nofreeze", "xx", "foo://bar", nil, 0) + txid, err := helperFillSignBroadcast(client, wh, account0, tx, err) + a.NoError(err) + txids[txid] = account0 + + tx, err = client.MakeUnsignedAssetCreateTx(100, true, manager, reserve, freeze, clawback, "frozen", "xx", "foo://bar", nil, 0) + txid, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.NoError(err) + txids[txid] = account0 + + _, curRound := fixture.GetBalanceAndRound(account0) + confirmed := fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "creating assets") + + info, err := client.AccountInformation(account0, true) + a.NoError(err) + a.NotNil(info.CreatedAssets) + a.Equal(len(*info.CreatedAssets), 2) + var frozenIdx, nonFrozenIdx uint64 + for _, asset := range *info.CreatedAssets { + idx := asset.Index + cp := asset.Params + if cp.UnitName != nil && *cp.UnitName == "frozen" { + frozenIdx = idx + } + + if cp.UnitName != nil && *cp.UnitName == "nofreeze" { + nonFrozenIdx = idx + } + } + + // Fund the account: extra + tx, err = client.SendPaymentFromUnencryptedWallet(account0, extra, 0, 10000000000, nil) + a.NoError(err) + _, curRound = fixture.GetBalanceAndRound(account0) + fixture.WaitForConfirmedTxn(curRound+20, tx.ID().String()) + + // Opt in to both assets should succeed, regardless of + // their default frozen status. + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 0, extra, "", "") + txid, err = helperFillSignBroadcast(client, wh, extra, tx, err) + a.NoError(err) + txids[txid] = extra + + tx, err = client.MakeUnsignedAssetSendTx(nonFrozenIdx, 0, extra, "", "") + txid, err = helperFillSignBroadcast(client, wh, extra, tx, err) + a.NoError(err) + txids[txid] = extra + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "opting into assets") + + // Send each asset to the opted in account. + // frozen should be rejected. + // nonFrozen should succeed. + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 1, extra, "", "") + _, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.Error(err) + a.True(strings.Contains(err.Error(), "asset frozen in recipient")) + + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetSendTx(nonFrozenIdx, 5, extra, "", "") + txid, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.NoError(err) + txids[txid] = account0 + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "sending unfrozen asset") + + // Unfreeze the recipient of the frozen asset. Now the + // transfer should succeed. + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetFreezeTx(frozenIdx, extra, false) + txid, err = helperFillSignBroadcast(client, wh, freeze, tx, err) + a.NoError(err) + txids[txid] = freeze + + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 5, extra, "", "") + txid, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.NoError(err) + txids[txid] = account0 + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "unfreeze and send remaining asset") + + // Globally Freeze both assets. + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetFreezeTx(frozenIdx, "", true) + txid, err = helperFillSignBroadcast(client, wh, freeze, tx, err) + a.NoError(err) + txids[txid] = freeze + + tx, err = client.MakeUnsignedAssetFreezeTx(nonFrozenIdx, "", true) + txid, err = helperFillSignBroadcast(client, wh, freeze, tx, err) + a.NoError(err) + txids[txid] = freeze + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "global freeze both assets") + + // Both assets should be unable to be transfered now + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 2, extra, "", "") + _, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.Error(err) + a.True(strings.Contains(err.Error(), "globally frozen for")) + + tx, err = client.MakeUnsignedAssetSendTx(nonFrozenIdx, 2, extra, "", "") + txid, err = helperFillSignBroadcast(client, wh, account0, tx, err) + a.Error(err) + a.True(strings.Contains(err.Error(), "globally frozen for")) + + // Clawback should still be possible + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 1, account0, "", extra) + txid, err = helperFillSignBroadcast(client, wh, clawback, tx, err) + a.NoError(err) + txids[txid] = clawback + + tx, err = client.MakeUnsignedAssetSendTx(nonFrozenIdx, 1, account0, "", extra) + txid, err = helperFillSignBroadcast(client, wh, clawback, tx, err) + a.NoError(err) + txids[txid] = clawback + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "clawback whilst globally frozen") + + // Unfreeze sender and receiver individually to allow them to + // continue using the asset, despite being globally frozen. + txids = make(map[string]string) + tx, err = client.MakeUnsignedAssetFreezeTx(frozenIdx, extra, false) + txid, err = helperFillSignBroadcast(client, wh, freeze, tx, err) + a.NoError(err) + txids[txid] = freeze + + tx, err = client.MakeUnsignedAssetFreezeTx(frozenIdx, account0, false) + txid, err = helperFillSignBroadcast(client, wh, freeze, tx, err) + a.NoError(err) + txids[txid] = freeze + + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 1, account0, "", "") + txid, err = helperFillSignBroadcast(client, wh, extra, tx, err) + a.NoError(err) + txids[txid] = extra + + _, curRound = fixture.GetBalanceAndRound(account0) + confirmed = fixture.WaitForAllTxnsToConfirm(curRound+20, txids) + a.True(confirmed, "unfreeze account whilst globally frozen") + + // Check that the asset balances are correct + info, err = client.AccountInformation(account0, true) + a.NoError(err) + a.NotNil(info.Assets) + a.Equal(len(*info.Assets), 2) + for _, asset := range *info.Assets { + if asset.AssetID == frozenIdx { + a.Equal(asset.Amount, uint64(97)) + } else if asset.AssetID == nonFrozenIdx { + a.Equal(asset.Amount, uint64(96)) + } + } + + info, err = client.AccountInformation(extra, true) + a.NoError(err) + a.NotNil(info.Assets) + a.Equal(len(*info.Assets), 2) + for _, asset := range *info.Assets { + if asset.AssetID == frozenIdx { + a.Equal(asset.Amount, uint64(3)) + } else if asset.AssetID == nonFrozenIdx { + a.Equal(asset.Amount, uint64(4)) + } + } + + // Should be able to close out asset slots and close entire account. + tx, err = client.MakeUnsignedAssetSendTx(nonFrozenIdx, 0, "", account0, "") + _, err = helperFillSignBroadcast(client, wh, extra, tx, err) + a.NoError(err) + + tx, err = client.MakeUnsignedAssetSendTx(frozenIdx, 0, "", account0, "") + _, err = helperFillSignBroadcast(client, wh, extra, tx, err) + a.NoError(err) + + _, err = client.SendPaymentFromWallet(wh, nil, extra, "", 0, 0, nil, account0, 0, 0) + a.NoError(err) +} diff --git a/test/scripts/e2e_subs/example.py b/test/scripts/e2e_subs/example.py index 9e4e97097a..eb0d504e5a 100755 --- a/test/scripts/e2e_subs/example.py +++ b/test/scripts/e2e_subs/example.py @@ -66,6 +66,11 @@ assert goal.holding(goal.account, gold)[1] assert goal.holding(joe, gold)[1] +# Global freeze +freeze3 = goal.afrz(flo, gold, "", True) +txinfo, err = goal.send(freeze3) +assert not err, err + # App create teal = "test/scripts/e2e_subs/tealprogs" approval = goal.assemble(os.path.join(teal, "app-escrow.teal")) diff --git a/test/scripts/e2e_subs/rest-assets-endpoint.sh b/test/scripts/e2e_subs/rest-assets-endpoint.sh index 9b6c77b363..4b52d512d6 100755 --- a/test/scripts/e2e_subs/rest-assets-endpoint.sh +++ b/test/scripts/e2e_subs/rest-assets-endpoint.sh @@ -32,3 +32,8 @@ call_and_verify "Asset parameter parsing error 2." "/v2/assets/not-a-number" 400 # Good request, but invalid query parameters call_and_verify "Asset invalid parameter" "/v2/assets/$ASSET_ID?this-should-not-fail=200" 200 '","decimals":19,"default-frozen":false,"freeze":"' +# Freeze asset globally +${gcmd} asset freeze --assetid $ASSET_ID --freezer ${ACCOUNT} --freeze=true + +# Good request, include "frozen" field +call_and_verify "Should contain asset data." "/v2/assets/$ASSET_ID" 200 '","frozen":true,"'