@@ -939,55 +939,101 @@ describe('Resource population: Mixed', () => {
939939 const v9Result = await v9AppFactory . send . create ( { method : 'createApplication' } )
940940 v8Client = v8Result . appClient
941941 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 ( ) } )
942948 } )
943949
944950 afterAll ( ( ) => {
945951 Config . configure ( { populateAppCallResources : false } )
946952 } )
947953
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 ( )
951958
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 )
954961
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 } )
960967
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 ?? [ ]
963970
964- expect ( v8CallAccts . length + v9CallAccts . length ) . toBe ( 1 )
965- } )
971+ expect ( v8CallAccts . length + v9CallAccts . length ) . toBe ( 1 )
972+ } )
966973
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
969977
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 } )
972991
973- const externalAppID = ( await v8Client . getGlobalState ( ) ) . externalAppID ! . value as bigint
992+ const v8CallApps = transactions [ 0 ] . applicationCall ?. foreignApps ?? [ ]
993+ const v9CallAccts = transactions [ 1 ] . applicationCall ?. accounts ?? [ ]
974994
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+ } )
986998
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
9891003
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+ } )
9911037 } )
9921038} )
9931039
@@ -1169,22 +1215,7 @@ describe('access references', () => {
11691215 let externalClient : AppClient
11701216
11711217 let alice : algosdk . Address
1172- let bob : algosdk . Address
1173- let charlie : algosdk . Address
1174- let dan : algosdk . Address
1175- let eve : algosdk . Address
1176- let frank : algosdk . Address
1177- let grace : algosdk . Address
1178- let heidi : algosdk . Address
1179- let ivan : algosdk . Address
1180- let judy : algosdk . Address
1181- let mallory : algosdk . Address
1182- let niaj : algosdk . Address
1183- let oscar : algosdk . Address
1184- let peggy : algosdk . Address
1185- let quentin : algosdk . Address
1186- let ruth : algosdk . Address
1187- let dave : algosdk . Address
1218+ let getTestAccounts : ( count : number ) => Promise < algosdk . Address [ ] >
11881219
11891220 beforeEach ( fixture . newScope )
11901221
@@ -1211,22 +1242,9 @@ describe('access references', () => {
12111242 } )
12121243
12131244 alice = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1214- bob = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1215- charlie = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1216- dan = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1217- eve = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1218- frank = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1219- grace = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1220- heidi = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1221- ivan = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1222- judy = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1223- mallory = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1224- niaj = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1225- oscar = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1226- peggy = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1227- quentin = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1228- ruth = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } )
1229- dave = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 1 ) } )
1245+ getTestAccounts = async ( count : number ) => {
1246+ return await Promise . all ( Array . from ( { length : count } , ( ) => fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 0.1 ) } ) ) )
1247+ }
12301248 } , 20_000 ) // Account generation and funding can be slow
12311249
12321250 test ( 'address reference enables access' , async ( ) => {
@@ -1243,7 +1261,7 @@ describe('access references', () => {
12431261 method : 'addressBalance' ,
12441262 args : [ alice ] ,
12451263 populateAppCallResources : false ,
1246- accountReferences : [ alice , bob , charlie , dan , eve , frank , grace , heidi ] ,
1264+ accountReferences : [ alice , ... ( await getTestAccounts ( 7 ) ) ] ,
12471265 } )
12481266 } )
12491267
@@ -1253,7 +1271,7 @@ describe('access references', () => {
12531271 method : 'addressBalance' ,
12541272 args : [ alice ] ,
12551273 populateAppCallResources : false ,
1256- accountReferences : [ alice , bob , charlie , dan , eve , frank , grace , heidi , ivan ] ,
1274+ accountReferences : [ alice , ... ( await getTestAccounts ( 8 ) ) ] ,
12571275 } ) ,
12581276 ) . rejects . toThrow ( / m a x n u m b e r o f a c c o u n t s i s 8 / )
12591277 } )
@@ -1263,24 +1281,7 @@ describe('access references', () => {
12631281 method : 'addressBalance' ,
12641282 args : [ alice ] ,
12651283 populateAppCallResources : false ,
1266- accessReferences : [
1267- { address : alice } ,
1268- { address : bob } ,
1269- { address : charlie } ,
1270- { address : dan } ,
1271- { address : eve } ,
1272- { address : frank } ,
1273- { address : grace } ,
1274- { address : heidi } ,
1275- { address : ivan } ,
1276- { address : judy } ,
1277- { address : mallory } ,
1278- { address : niaj } ,
1279- { address : oscar } ,
1280- { address : peggy } ,
1281- { address : quentin } ,
1282- { address : ruth } ,
1283- ] ,
1284+ accessReferences : [ { address : alice } , ...( await getTestAccounts ( 15 ) ) . map ( ( a ) => ( { address : a } ) ) ] ,
12841285 } )
12851286 } )
12861287
@@ -1290,25 +1291,7 @@ describe('access references', () => {
12901291 method : 'addressBalance' ,
12911292 args : [ alice ] ,
12921293 populateAppCallResources : false ,
1293- accessReferences : [
1294- { address : alice } ,
1295- { address : bob } ,
1296- { address : charlie } ,
1297- { address : dan } ,
1298- { address : eve } ,
1299- { address : frank } ,
1300- { address : grace } ,
1301- { address : heidi } ,
1302- { address : ivan } ,
1303- { address : judy } ,
1304- { address : mallory } ,
1305- { address : niaj } ,
1306- { address : oscar } ,
1307- { address : peggy } ,
1308- { address : quentin } ,
1309- { address : ruth } ,
1310- { address : dave } ,
1311- ] ,
1294+ accessReferences : [ { address : alice } , ...( await getTestAccounts ( 16 ) ) . map ( ( a ) => ( { address : a } ) ) ] ,
13121295 } ) ,
13131296 ) . 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 / )
13141297 } )
@@ -1356,7 +1339,6 @@ describe('access references', () => {
13561339 test ( 'locals reference enables access' , async ( ) => {
13571340 const alice = await fixture . context . generateAccount ( { initialFunds : AlgoAmount . Algo ( 1 ) } )
13581341
1359- // Opt alice into the external app
13601342 await fixture . algorand . send . appCallMethodCall ( await externalClient . params . optIn ( { method : 'optInToApplication' , sender : alice } ) )
13611343
13621344 await appClient . send . call ( {
0 commit comments