@@ -939,55 +939,101 @@ describe('Resource population: Mixed', () => {
939
939
const v9Result = await v9AppFactory . send . create ( { method : 'createApplication' } )
940
940
v8Client = v8Result . appClient
941
941
v9Client = v9Result . appClient
942
+
943
+ await v8Client . fundAppAccount ( { amount : ( 328500 ) . microAlgo ( ) } )
944
+ await v8Client . send . call ( { method : 'bootstrap' , staticFee : ( 3_000 ) . microAlgo ( ) } )
945
+
946
+ await v9Client . fundAppAccount ( { amount : ( 2334300 ) . microAlgo ( ) } )
947
+ await v9Client . send . call ( { method : 'bootstrap' , staticFee : ( 3_000 ) . microAlgo ( ) } )
942
948
} )
943
949
944
950
afterAll ( ( ) => {
945
951
Config . configure ( { populateAppCallResources : false } )
946
952
} )
947
953
948
- test ( 'same account' , async ( ) => {
949
- const { algorand, testAccount } = fixture . context
950
- const acct = algosdk . generateAccount ( )
954
+ describe ( 'mixed' , ( ) => {
955
+ test ( 'same account' , async ( ) => {
956
+ const { algorand, testAccount } = fixture . context
957
+ const acct = algosdk . generateAccount ( )
951
958
952
- const rekeyedTo = algorand . account . random ( )
953
- await algorand . account . rekeyAccount ( testAccount , rekeyedTo )
959
+ const rekeyedTo = algorand . account . random ( )
960
+ await algorand . account . rekeyAccount ( testAccount , rekeyedTo )
954
961
955
- const { transactions } = await algorand . send
956
- . newGroup ( )
957
- . addAppCallMethodCall ( await v8Client . params . call ( { method : 'addressBalance' , args : [ acct . addr . toString ( ) ] , sender : testAccount } ) )
958
- . addAppCallMethodCall ( await v9Client . params . call ( { method : 'addressBalance' , args : [ acct . addr . toString ( ) ] , sender : testAccount } ) )
959
- . send ( { populateAppCallResources : true } )
962
+ const { transactions } = await algorand . send
963
+ . newGroup ( )
964
+ . addAppCallMethodCall ( await v8Client . params . call ( { method : 'addressBalance' , args : [ acct . addr . toString ( ) ] , sender : testAccount } ) )
965
+ . addAppCallMethodCall ( await v9Client . params . call ( { method : 'addressBalance' , args : [ acct . addr . toString ( ) ] , sender : testAccount } ) )
966
+ . send ( { populateAppCallResources : true } )
960
967
961
- const v8CallAccts = transactions [ 0 ] . applicationCall ?. accounts ?? [ ]
962
- const v9CallAccts = transactions [ 1 ] . applicationCall ?. accounts ?? [ ]
968
+ const v8CallAccts = transactions [ 0 ] . applicationCall ?. accounts ?? [ ]
969
+ const v9CallAccts = transactions [ 1 ] . applicationCall ?. accounts ?? [ ]
963
970
964
- expect ( v8CallAccts . length + v9CallAccts . length ) . toBe ( 1 )
965
- } )
971
+ expect ( v8CallAccts . length + v9CallAccts . length ) . toBe ( 1 )
972
+ } )
966
973
967
- test ( 'app account' , async ( ) => {
968
- const { algorand, testAccount } = fixture . context
974
+ test ( 'app account' , async ( ) => {
975
+ const { algorand, testAccount } = fixture . context
976
+ const externalAppID = ( await v8Client . getGlobalState ( ) ) . externalAppID ! . value as bigint
969
977
970
- await v8Client . fundAppAccount ( { amount : ( 328500 ) . microAlgo ( ) } )
971
- await v8Client . send . call ( { method : 'bootstrap' , staticFee : ( 3_000 ) . microAlgo ( ) } )
978
+ const { transactions } = await algorand . send
979
+ . newGroup ( )
980
+ . addAppCallMethodCall (
981
+ await v8Client . params . call ( { method : 'externalAppCall' , staticFee : ( 2_000 ) . microAlgo ( ) , sender : testAccount } ) ,
982
+ )
983
+ . addAppCallMethodCall (
984
+ await v9Client . params . call ( {
985
+ method : 'addressBalance' ,
986
+ args : [ algosdk . getApplicationAddress ( externalAppID ) . toString ( ) ] ,
987
+ sender : testAccount ,
988
+ } ) ,
989
+ )
990
+ . send ( { populateAppCallResources : true } )
972
991
973
- const externalAppID = ( await v8Client . getGlobalState ( ) ) . externalAppID ! . value as bigint
992
+ const v8CallApps = transactions [ 0 ] . applicationCall ?. foreignApps ?? [ ]
993
+ const v9CallAccts = transactions [ 1 ] . applicationCall ?. accounts ?? [ ]
974
994
975
- const { transactions } = await algorand . send
976
- . newGroup ( )
977
- . addAppCallMethodCall ( await v8Client . params . call ( { method : 'externalAppCall' , staticFee : ( 2_000 ) . microAlgo ( ) , sender : testAccount } ) )
978
- . addAppCallMethodCall (
979
- await v9Client . params . call ( {
980
- method : 'addressBalance' ,
981
- args : [ algosdk . getApplicationAddress ( externalAppID ) . toString ( ) ] ,
982
- sender : testAccount ,
983
- } ) ,
984
- )
985
- . send ( { populateAppCallResources : true } )
995
+ expect ( v8CallApps ! . length + v9CallAccts ! . length ) . toBe ( 1 )
996
+ } )
997
+ } )
986
998
987
- const v8CallApps = transactions [ 0 ] . applicationCall ?. foreignApps ?? [ ]
988
- const v9CallAccts = transactions [ 1 ] . applicationCall ?. accounts ?? [ ]
999
+ describe ( 'accessReferences' , ( ) => {
1000
+ test ( 'fails to populate a transaction with access references' , async ( ) => {
1001
+ const { testAccount } = fixture . context
1002
+ const assetId = ( await v9Client . getGlobalState ( ) ) . asa . value as bigint
989
1003
990
- expect ( v8CallApps ! . length + v9CallAccts ! . length ) . toBe ( 1 )
1004
+ await expect (
1005
+ async ( ) =>
1006
+ await v9Client . send . call ( {
1007
+ method : 'hasAsset' ,
1008
+ accessReferences : [ { assetId : assetId } ] ,
1009
+ args : [ testAccount . toString ( ) ] ,
1010
+ } ) ,
1011
+ ) . rejects . toThrow ( 'No more transactions below reference limit. Add another app call to the group.' )
1012
+ } )
1013
+
1014
+ test ( 'successfully populates a transaction group including a transaction with access references' , async ( ) => {
1015
+ const assetId = ( await v9Client . getGlobalState ( ) ) . asa . value as bigint
1016
+ const { testAccount } = fixture . context
1017
+
1018
+ await v9Client . algorand
1019
+ . newGroup ( )
1020
+ . addAppCallMethodCall (
1021
+ await v9Client . params . call ( {
1022
+ method : 'hasAsset' ,
1023
+ accessReferences : [ { assetId : assetId } ] ,
1024
+ args : [ testAccount . toString ( ) ] ,
1025
+ note : '1' ,
1026
+ } ) ,
1027
+ )
1028
+ . addAppCallMethodCall (
1029
+ await v9Client . params . call ( {
1030
+ method : 'hasAsset' ,
1031
+ args : [ testAccount . toString ( ) ] ,
1032
+ note : '2' ,
1033
+ } ) ,
1034
+ )
1035
+ . send ( )
1036
+ } )
991
1037
} )
992
1038
} )
993
1039
@@ -1189,22 +1235,7 @@ describe('access references', () => {
1189
1235
let externalClient : AppClient
1190
1236
1191
1237
let alice : algosdk . Address
1192
- let bob : algosdk . Address
1193
- let charlie : algosdk . Address
1194
- let dan : algosdk . Address
1195
- let eve : algosdk . Address
1196
- let frank : algosdk . Address
1197
- let grace : algosdk . Address
1198
- let heidi : algosdk . Address
1199
- let ivan : algosdk . Address
1200
- let judy : algosdk . Address
1201
- let mallory : algosdk . Address
1202
- let niaj : algosdk . Address
1203
- let oscar : algosdk . Address
1204
- let peggy : algosdk . Address
1205
- let quentin : algosdk . Address
1206
- let ruth : algosdk . Address
1207
- let dave : algosdk . Address
1238
+ let getTestAccounts : ( count : number ) => Promise < algosdk . Address [ ] >
1208
1239
1209
1240
beforeEach ( fixture . newScope )
1210
1241
@@ -1231,22 +1262,9 @@ describe('access references', () => {
1231
1262
} )
1232
1263
1233
1264
alice = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1234
- bob = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1235
- charlie = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1236
- dan = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1237
- eve = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1238
- frank = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1239
- grace = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1240
- heidi = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1241
- ivan = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1242
- judy = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1243
- mallory = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1244
- niaj = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1245
- oscar = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1246
- peggy = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1247
- quentin = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1248
- ruth = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1249
- dave = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 1 ) } )
1265
+ getTestAccounts = async ( count : number ) => {
1266
+ return await Promise . all ( Array . from ( { length : count } , ( ) => fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } ) ) )
1267
+ }
1250
1268
} , 20_000 ) // Account generation and funding can be slow
1251
1269
1252
1270
test ( 'address reference enables access' , async ( ) => {
@@ -1263,7 +1281,7 @@ describe('access references', () => {
1263
1281
method : 'addressBalance' ,
1264
1282
args : [ alice ] ,
1265
1283
populateAppCallResources : false ,
1266
- accountReferences : [ alice , bob , charlie , dan , eve , frank , grace , heidi ] ,
1284
+ accountReferences : [ alice , ... ( await getTestAccounts ( 7 ) ) ] ,
1267
1285
} )
1268
1286
} )
1269
1287
@@ -1273,7 +1291,7 @@ describe('access references', () => {
1273
1291
method : 'addressBalance' ,
1274
1292
args : [ alice ] ,
1275
1293
populateAppCallResources : false ,
1276
- accountReferences : [ alice , bob , charlie , dan , eve , frank , grace , heidi , ivan ] ,
1294
+ accountReferences : [ alice , ... ( await getTestAccounts ( 8 ) ) ] ,
1277
1295
} ) ,
1278
1296
) . rejects . toThrow ( / m a x n u m b e r o f a c c o u n t s i s 8 / )
1279
1297
} )
@@ -1283,24 +1301,7 @@ describe('access references', () => {
1283
1301
method : 'addressBalance' ,
1284
1302
args : [ alice ] ,
1285
1303
populateAppCallResources : false ,
1286
- accessReferences : [
1287
- { address : alice } ,
1288
- { address : bob } ,
1289
- { address : charlie } ,
1290
- { address : dan } ,
1291
- { address : eve } ,
1292
- { address : frank } ,
1293
- { address : grace } ,
1294
- { address : heidi } ,
1295
- { address : ivan } ,
1296
- { address : judy } ,
1297
- { address : mallory } ,
1298
- { address : niaj } ,
1299
- { address : oscar } ,
1300
- { address : peggy } ,
1301
- { address : quentin } ,
1302
- { address : ruth } ,
1303
- ] ,
1304
+ accessReferences : [ { address : alice } , ...( await getTestAccounts ( 15 ) ) . map ( ( a ) => ( { address : a } ) ) ] ,
1304
1305
} )
1305
1306
} )
1306
1307
@@ -1310,25 +1311,7 @@ describe('access references', () => {
1310
1311
method : 'addressBalance' ,
1311
1312
args : [ alice ] ,
1312
1313
populateAppCallResources : false ,
1313
- accessReferences : [
1314
- { address : alice } ,
1315
- { address : bob } ,
1316
- { address : charlie } ,
1317
- { address : dan } ,
1318
- { address : eve } ,
1319
- { address : frank } ,
1320
- { address : grace } ,
1321
- { address : heidi } ,
1322
- { address : ivan } ,
1323
- { address : judy } ,
1324
- { address : mallory } ,
1325
- { address : niaj } ,
1326
- { address : oscar } ,
1327
- { address : peggy } ,
1328
- { address : quentin } ,
1329
- { address : ruth } ,
1330
- { address : dave } ,
1331
- ] ,
1314
+ accessReferences : [ { address : alice } , ...( await getTestAccounts ( 16 ) ) . map ( ( a ) => ( { address : a } ) ) ] ,
1332
1315
} ) ,
1333
1316
) . rejects . toThrow ( / m a x n u m b e r o f r e f e r e n c e s i s 1 6 / )
1334
1317
} )
@@ -1376,7 +1359,6 @@ describe('access references', () => {
1376
1359
test ( 'locals reference enables access' , async ( ) => {
1377
1360
const alice = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 1 ) } )
1378
1361
1379
- // Opt alice into the external app
1380
1362
await fixture . algorand . send . appCallMethodCall ( await externalClient . params . optIn ( { method : 'optInToApplication' , sender : alice } ) )
1381
1363
1382
1364
await appClient . send . call ( {
0 commit comments