Skip to content

Commit 5fb7ac8

Browse files
authored
Expose extra program pages to API (algorand#2294)
Add the AppsTotalExtraPages account field to the response returned by the /v2/accounts/{addr} endpoint.
1 parent 0a3d9df commit 5fb7ac8

File tree

9 files changed

+371
-299
lines changed

9 files changed

+371
-299
lines changed

daemon/algod/api/algod.oas2.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1229,6 +1229,10 @@
12291229
"description": "\\[tsch\\] stores the sum of all of the local schemas and global schemas in this account.\n\nNote: the raw account uses `StateSchema` for this type.",
12301230
"$ref": "#/definitions/ApplicationStateSchema"
12311231
},
1232+
"apps-total-extra-pages": {
1233+
"description": "\\[teap\\] the sum of all extra application program pages for this account.",
1234+
"type": "integer"
1235+
},
12321236
"assets": {
12331237
"description": "\\[asset\\] assets held by this account.\n\nNote the raw object uses `map[int] -\u003e AssetHolding` for this type.",
12341238
"type": "array",
@@ -1626,6 +1630,10 @@
16261630
"format": "byte",
16271631
"x-algorand-format": "TEALProgram"
16281632
},
1633+
"extra-program-pages": {
1634+
"description": "\\[epp\\] the amount of extra program pages available to this app.",
1635+
"type": "integer"
1636+
},
16291637
"local-state-schema": {
16301638
"description": "[\\lsch\\] local schema",
16311639
"$ref": "#/definitions/ApplicationStateSchema"

daemon/algod/api/algod.oas3.yml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -716,6 +716,10 @@
716716
},
717717
"type": "array"
718718
},
719+
"apps-total-extra-pages": {
720+
"description": "\\[teap\\] the sum of all extra application program pages for this account.",
721+
"type": "integer"
722+
},
719723
"apps-total-schema": {
720724
"$ref": "#/components/schemas/ApplicationStateSchema"
721725
},
@@ -901,6 +905,10 @@
901905
"type": "string",
902906
"x-algorand-format": "Address"
903907
},
908+
"extra-program-pages": {
909+
"description": "\\[epp\\] the amount of extra program pages available to this app.",
910+
"type": "integer"
911+
},
904912
"global-state": {
905913
"$ref": "#/components/schemas/TealKeyValueStore"
906914
},

daemon/algod/api/server/v2/account.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package v2
1919
import (
2020
"encoding/base64"
2121
"errors"
22+
"math"
2223
"sort"
2324

2425
"github.com/algorand/go-algorand/crypto"
@@ -99,6 +100,7 @@ func AccountDataToAccount(
99100
NumByteSlice: record.TotalAppSchema.NumByteSlice,
100101
NumUint: record.TotalAppSchema.NumUint,
101102
}
103+
totalExtraPages := uint64(record.TotalExtraAppPages)
102104

103105
amount := record.MicroAlgos
104106
pendingRewards, overflowed := basics.OSubA(amount, amountWithoutPendingRewards)
@@ -123,6 +125,7 @@ func AccountDataToAccount(
123125
AuthAddr: addrOrNil(record.AuthAddr),
124126
AppsLocalState: &appsLocalState,
125127
AppsTotalSchema: &totalAppSchema,
128+
AppsTotalExtraPages: &totalExtraPages,
126129
}, nil
127130
}
128131

@@ -308,6 +311,14 @@ func AccountToAccountData(a *generated.Account) (basics.AccountData, error) {
308311
totalSchema.NumByteSlice = a.AppsTotalSchema.NumByteSlice
309312
}
310313

314+
var totalExtraPages uint32
315+
if a.AppsTotalExtraPages != nil {
316+
if *a.AppsTotalExtraPages > math.MaxUint32 {
317+
return basics.AccountData{}, errors.New("AppsTotalExtraPages exceeds maximum decodable value")
318+
}
319+
totalExtraPages = uint32(*a.AppsTotalExtraPages)
320+
}
321+
311322
status, err := basics.UnmarshalStatus(a.Status)
312323
if err != nil {
313324
return basics.AccountData{}, err
@@ -327,6 +338,7 @@ func AccountToAccountData(a *generated.Account) (basics.AccountData, error) {
327338
AppLocalStates: appLocalStates,
328339
AppParams: appParams,
329340
TotalAppSchema: totalSchema,
341+
TotalExtraAppPages: totalExtraPages,
330342
}
331343

332344
if a.AuthAddr != nil {
@@ -358,6 +370,12 @@ func ApplicationParamsToAppParams(gap *generated.ApplicationParams) (basics.AppP
358370
ApprovalProgram: gap.ApprovalProgram,
359371
ClearStateProgram: gap.ClearStateProgram,
360372
}
373+
if gap.ExtraProgramPages != nil {
374+
if *gap.ExtraProgramPages > math.MaxUint32 {
375+
return basics.AppParams{}, errors.New("ExtraProgramPages exceeds maximum decodable value")
376+
}
377+
ap.ExtraProgramPages = uint32(*gap.ExtraProgramPages)
378+
}
361379
if gap.LocalStateSchema != nil {
362380
ap.LocalStateSchema = basics.StateSchema{
363381
NumUint: gap.LocalStateSchema.NumUint,
@@ -382,12 +400,14 @@ func ApplicationParamsToAppParams(gap *generated.ApplicationParams) (basics.AppP
382400
// AppParamsToApplication converts basics.AppParams to generated.Application
383401
func AppParamsToApplication(creator string, appIdx basics.AppIndex, appParams *basics.AppParams) generated.Application {
384402
globalState := convertTKVToGenerated(&appParams.GlobalState)
403+
extraProgramPages := uint64(appParams.ExtraProgramPages)
385404
return generated.Application{
386405
Id: uint64(appIdx),
387406
Params: generated.ApplicationParams{
388407
Creator: creator,
389408
ApprovalProgram: appParams.ApprovalProgram,
390409
ClearStateProgram: appParams.ClearStateProgram,
410+
ExtraProgramPages: &extraProgramPages,
391411
GlobalState: globalState,
392412
LocalStateSchema: &generated.ApplicationStateSchema{
393413
NumByteSlice: appParams.LocalStateSchema.NumByteSlice,

daemon/algod/api/server/v2/account_test.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,15 @@ func TestAccount(t *testing.T) {
4848
StateSchemas: basics.StateSchemas{
4949
GlobalStateSchema: basics.StateSchema{NumUint: 2},
5050
},
51+
ExtraProgramPages: 1,
5152
}
53+
54+
totalAppSchema := basics.StateSchema{
55+
NumUint: appParams1.GlobalStateSchema.NumUint + appParams2.GlobalStateSchema.NumUint,
56+
NumByteSlice: appParams1.GlobalStateSchema.NumByteSlice + appParams2.GlobalStateSchema.NumByteSlice,
57+
}
58+
totalAppExtraPages := appParams1.ExtraProgramPages + appParams2.ExtraProgramPages
59+
5260
assetParams1 := basics.AssetParams{
5361
Total: 100,
5462
DefaultFrozen: false,
@@ -69,6 +77,8 @@ func TestAccount(t *testing.T) {
6977
RewardedMicroAlgos: basics.MicroAlgos{Raw: ^uint64(0)},
7078
RewardsBase: 0,
7179
AppParams: map[basics.AppIndex]basics.AppParams{appIdx1: appParams1, appIdx2: appParams2},
80+
TotalAppSchema: totalAppSchema,
81+
TotalExtraAppPages: totalAppExtraPages,
7282
AppLocalStates: map[basics.AppIndex]basics.AppLocalState{
7383
appIdx1: {
7484
Schema: basics.StateSchema{NumUint: 10},
@@ -95,12 +105,21 @@ func TestAccount(t *testing.T) {
95105
require.Equal(t, addr, conv.Address)
96106
require.Equal(t, b.MicroAlgos.Raw, conv.Amount)
97107
require.Equal(t, a.MicroAlgos.Raw, conv.AmountWithoutPendingRewards)
108+
require.NotNil(t, conv.AppsTotalSchema)
109+
require.Equal(t, totalAppSchema.NumUint, conv.AppsTotalSchema.NumUint)
110+
require.Equal(t, totalAppSchema.NumByteSlice, conv.AppsTotalSchema.NumByteSlice)
111+
require.NotNil(t, conv.AppsTotalExtraPages)
112+
require.Equal(t, uint64(totalAppExtraPages), *conv.AppsTotalExtraPages)
98113

99114
verifyCreatedApp := func(index int, appIdx basics.AppIndex, params basics.AppParams) {
100115
require.Equal(t, uint64(appIdx), (*conv.CreatedApps)[index].Id)
101116
require.Equal(t, params.ApprovalProgram, (*conv.CreatedApps)[index].Params.ApprovalProgram)
117+
require.NotNil(t, (*conv.CreatedApps)[index].Params.ExtraProgramPages)
118+
require.Equal(t, uint64(params.ExtraProgramPages), *(*conv.CreatedApps)[index].Params.ExtraProgramPages)
119+
require.NotNil(t, (*conv.CreatedApps)[index].Params.GlobalStateSchema)
102120
require.Equal(t, params.GlobalStateSchema.NumUint, (*conv.CreatedApps)[index].Params.GlobalStateSchema.NumUint)
103121
require.Equal(t, params.GlobalStateSchema.NumByteSlice, (*conv.CreatedApps)[index].Params.GlobalStateSchema.NumByteSlice)
122+
require.NotNil(t, (*conv.CreatedApps)[index].Params.LocalStateSchema)
104123
require.Equal(t, params.LocalStateSchema.NumUint, (*conv.CreatedApps)[index].Params.LocalStateSchema.NumUint)
105124
require.Equal(t, params.LocalStateSchema.NumByteSlice, (*conv.CreatedApps)[index].Params.LocalStateSchema.NumByteSlice)
106125
}

0 commit comments

Comments
 (0)