@algorandfoundation/algokit-utils 10.0.0-alpha.2 → 10.0.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/algo25/index.d.ts +2 -0
- package/algo25/index.js +9 -0
- package/algo25/index.mjs +3 -0
- package/package.json +1 -1
- package/packages/abi/src/abi-method.d.ts +1 -1
- package/packages/abi/src/abi-method.js.map +1 -1
- package/packages/abi/src/abi-method.mjs.map +1 -1
- package/packages/algo25/src/index.d.ts +40 -0
- package/packages/algo25/src/index.js +44 -0
- package/packages/algo25/src/index.js.map +1 -1
- package/packages/algo25/src/index.mjs +39 -1
- package/packages/algo25/src/index.mjs.map +1 -1
- package/transactions/method-call.js +12 -12
- package/transactions/method-call.js.map +1 -1
- package/transactions/method-call.mjs +12 -12
- package/transactions/method-call.mjs.map +1 -1
- package/types/algorand-client-transaction-creator.d.ts +37 -37
- package/types/algorand-client-transaction-sender.d.ts +39 -39
- package/types/app-client.d.ts +64 -64
- package/types/app-factory.d.ts +27 -27
- package/types/app-manager.d.ts +1 -1
- package/types/app-manager.js +6 -1
- package/types/app-manager.js.map +1 -1
- package/types/app-manager.mjs +6 -1
- package/types/app-manager.mjs.map +1 -1
- package/types/composer.js +3 -6
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +3 -6
- package/types/composer.mjs.map +1 -1
package/types/app-factory.d.ts
CHANGED
|
@@ -185,7 +185,7 @@ declare class AppFactory {
|
|
|
185
185
|
accountReferences?: ReadableAddress[] | undefined;
|
|
186
186
|
appReferences?: bigint[] | undefined;
|
|
187
187
|
assetReferences?: bigint[] | undefined;
|
|
188
|
-
boxReferences?: (
|
|
188
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
189
189
|
accessReferences?: AccessReference[] | undefined;
|
|
190
190
|
rejectVersion?: number | undefined;
|
|
191
191
|
sender?: ReadableAddress | undefined;
|
|
@@ -233,7 +233,7 @@ declare class AppFactory {
|
|
|
233
233
|
accountReferences?: ReadableAddress[] | undefined;
|
|
234
234
|
appReferences?: bigint[] | undefined;
|
|
235
235
|
assetReferences?: bigint[] | undefined;
|
|
236
|
-
boxReferences?: (
|
|
236
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
237
237
|
accessReferences?: AccessReference[] | undefined;
|
|
238
238
|
rejectVersion?: number | undefined;
|
|
239
239
|
sender?: ReadableAddress | undefined;
|
|
@@ -246,7 +246,7 @@ declare class AppFactory {
|
|
|
246
246
|
sender: Address;
|
|
247
247
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
248
248
|
method: ABIMethod;
|
|
249
|
-
args: (Transaction | ABIValue | TransactionWithSigner |
|
|
249
|
+
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
250
250
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
251
251
|
sender: SendingAddress;
|
|
252
252
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -258,12 +258,12 @@ declare class AppFactory {
|
|
|
258
258
|
validityWindow?: number | bigint | undefined;
|
|
259
259
|
firstValidRound?: bigint | undefined;
|
|
260
260
|
lastValidRound?: bigint | undefined;
|
|
261
|
-
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
262
261
|
args?: Uint8Array[] | undefined;
|
|
262
|
+
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
263
263
|
accountReferences?: ReadableAddress[] | undefined;
|
|
264
264
|
appReferences?: bigint[] | undefined;
|
|
265
265
|
assetReferences?: bigint[] | undefined;
|
|
266
|
-
boxReferences?: (
|
|
266
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
267
267
|
accessReferences?: AccessReference[] | undefined;
|
|
268
268
|
rejectVersion?: number | undefined;
|
|
269
269
|
approvalProgram: string | Uint8Array;
|
|
@@ -293,12 +293,12 @@ declare class AppFactory {
|
|
|
293
293
|
accountReferences?: ReadableAddress[] | undefined;
|
|
294
294
|
appReferences?: bigint[] | undefined;
|
|
295
295
|
assetReferences?: bigint[] | undefined;
|
|
296
|
-
boxReferences?: (
|
|
296
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
297
297
|
accessReferences?: AccessReference[] | undefined;
|
|
298
298
|
rejectVersion?: number | undefined;
|
|
299
299
|
approvalProgram: string | Uint8Array;
|
|
300
300
|
clearStateProgram: string | Uint8Array;
|
|
301
|
-
}> | AppMethodCall<AppMethodCallParams> | undefined)[] | undefined;
|
|
301
|
+
}> | AppMethodCall<AppMethodCallParams> | Promise<Transaction> | undefined)[] | undefined;
|
|
302
302
|
onComplete: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication;
|
|
303
303
|
}>;
|
|
304
304
|
/** Return params for a deployment update ABI call */
|
|
@@ -317,7 +317,7 @@ declare class AppFactory {
|
|
|
317
317
|
accountReferences?: ReadableAddress[] | undefined;
|
|
318
318
|
appReferences?: bigint[] | undefined;
|
|
319
319
|
assetReferences?: bigint[] | undefined;
|
|
320
|
-
boxReferences?: (
|
|
320
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
321
321
|
accessReferences?: AccessReference[] | undefined;
|
|
322
322
|
rejectVersion?: number | undefined;
|
|
323
323
|
sender?: ReadableAddress | undefined;
|
|
@@ -338,7 +338,7 @@ declare class AppFactory {
|
|
|
338
338
|
accountReferences?: ReadableAddress[] | undefined;
|
|
339
339
|
appReferences?: bigint[] | undefined;
|
|
340
340
|
assetReferences?: bigint[] | undefined;
|
|
341
|
-
boxReferences?: (
|
|
341
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
342
342
|
accessReferences?: AccessReference[] | undefined;
|
|
343
343
|
rejectVersion?: number | undefined;
|
|
344
344
|
sender?: ReadableAddress | undefined;
|
|
@@ -348,7 +348,7 @@ declare class AppFactory {
|
|
|
348
348
|
sender: Address;
|
|
349
349
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
350
350
|
method: ABIMethod;
|
|
351
|
-
args: (Transaction | ABIValue | TransactionWithSigner |
|
|
351
|
+
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
352
352
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
353
353
|
sender: SendingAddress;
|
|
354
354
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -360,12 +360,12 @@ declare class AppFactory {
|
|
|
360
360
|
validityWindow?: number | bigint | undefined;
|
|
361
361
|
firstValidRound?: bigint | undefined;
|
|
362
362
|
lastValidRound?: bigint | undefined;
|
|
363
|
-
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
364
363
|
args?: Uint8Array[] | undefined;
|
|
364
|
+
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
365
365
|
accountReferences?: ReadableAddress[] | undefined;
|
|
366
366
|
appReferences?: bigint[] | undefined;
|
|
367
367
|
assetReferences?: bigint[] | undefined;
|
|
368
|
-
boxReferences?: (
|
|
368
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
369
369
|
accessReferences?: AccessReference[] | undefined;
|
|
370
370
|
rejectVersion?: number | undefined;
|
|
371
371
|
approvalProgram: string | Uint8Array;
|
|
@@ -395,12 +395,12 @@ declare class AppFactory {
|
|
|
395
395
|
accountReferences?: ReadableAddress[] | undefined;
|
|
396
396
|
appReferences?: bigint[] | undefined;
|
|
397
397
|
assetReferences?: bigint[] | undefined;
|
|
398
|
-
boxReferences?: (
|
|
398
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
399
399
|
accessReferences?: AccessReference[] | undefined;
|
|
400
400
|
rejectVersion?: number | undefined;
|
|
401
401
|
approvalProgram: string | Uint8Array;
|
|
402
402
|
clearStateProgram: string | Uint8Array;
|
|
403
|
-
}> | AppMethodCall<AppMethodCallParams> | undefined)[] | undefined;
|
|
403
|
+
}> | AppMethodCall<AppMethodCallParams> | Promise<Transaction> | undefined)[] | undefined;
|
|
404
404
|
onComplete: OnApplicationComplete.UpdateApplication;
|
|
405
405
|
};
|
|
406
406
|
/** Return params for a deployment delete ABI call */
|
|
@@ -419,7 +419,7 @@ declare class AppFactory {
|
|
|
419
419
|
accountReferences?: ReadableAddress[] | undefined;
|
|
420
420
|
appReferences?: bigint[] | undefined;
|
|
421
421
|
assetReferences?: bigint[] | undefined;
|
|
422
|
-
boxReferences?: (
|
|
422
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
423
423
|
accessReferences?: AccessReference[] | undefined;
|
|
424
424
|
rejectVersion?: number | undefined;
|
|
425
425
|
sender?: ReadableAddress | undefined;
|
|
@@ -440,7 +440,7 @@ declare class AppFactory {
|
|
|
440
440
|
accountReferences?: ReadableAddress[] | undefined;
|
|
441
441
|
appReferences?: bigint[] | undefined;
|
|
442
442
|
assetReferences?: bigint[] | undefined;
|
|
443
|
-
boxReferences?: (
|
|
443
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
444
444
|
accessReferences?: AccessReference[] | undefined;
|
|
445
445
|
rejectVersion?: number | undefined;
|
|
446
446
|
sender?: ReadableAddress | undefined;
|
|
@@ -450,7 +450,7 @@ declare class AppFactory {
|
|
|
450
450
|
sender: Address;
|
|
451
451
|
signer: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
452
452
|
method: ABIMethod;
|
|
453
|
-
args: (Transaction | ABIValue | TransactionWithSigner |
|
|
453
|
+
args: (Transaction | ABIValue | TransactionWithSigner | AppMethodCall<{
|
|
454
454
|
signer?: AddressWithTransactionSigner | TransactionSigner | undefined;
|
|
455
455
|
sender: SendingAddress;
|
|
456
456
|
rekeyTo?: ReadableAddress | undefined;
|
|
@@ -462,12 +462,12 @@ declare class AppFactory {
|
|
|
462
462
|
validityWindow?: number | bigint | undefined;
|
|
463
463
|
firstValidRound?: bigint | undefined;
|
|
464
464
|
lastValidRound?: bigint | undefined;
|
|
465
|
-
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
466
465
|
args?: Uint8Array[] | undefined;
|
|
466
|
+
onComplete?: OnApplicationComplete.NoOp | OnApplicationComplete.OptIn | OnApplicationComplete.CloseOut | OnApplicationComplete.UpdateApplication | OnApplicationComplete.DeleteApplication | undefined;
|
|
467
467
|
accountReferences?: ReadableAddress[] | undefined;
|
|
468
468
|
appReferences?: bigint[] | undefined;
|
|
469
469
|
assetReferences?: bigint[] | undefined;
|
|
470
|
-
boxReferences?: (
|
|
470
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
471
471
|
accessReferences?: AccessReference[] | undefined;
|
|
472
472
|
rejectVersion?: number | undefined;
|
|
473
473
|
approvalProgram: string | Uint8Array;
|
|
@@ -497,12 +497,12 @@ declare class AppFactory {
|
|
|
497
497
|
accountReferences?: ReadableAddress[] | undefined;
|
|
498
498
|
appReferences?: bigint[] | undefined;
|
|
499
499
|
assetReferences?: bigint[] | undefined;
|
|
500
|
-
boxReferences?: (
|
|
500
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
501
501
|
accessReferences?: AccessReference[] | undefined;
|
|
502
502
|
rejectVersion?: number | undefined;
|
|
503
503
|
approvalProgram: string | Uint8Array;
|
|
504
504
|
clearStateProgram: string | Uint8Array;
|
|
505
|
-
}> | AppMethodCall<AppMethodCallParams> | undefined)[] | undefined;
|
|
505
|
+
}> | AppMethodCall<AppMethodCallParams> | Promise<Transaction> | undefined)[] | undefined;
|
|
506
506
|
onComplete: OnApplicationComplete.DeleteApplication;
|
|
507
507
|
};
|
|
508
508
|
bare: {
|
|
@@ -522,7 +522,7 @@ declare class AppFactory {
|
|
|
522
522
|
accountReferences?: ReadableAddress[] | undefined;
|
|
523
523
|
appReferences?: bigint[] | undefined;
|
|
524
524
|
assetReferences?: bigint[] | undefined;
|
|
525
|
-
boxReferences?: (
|
|
525
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
526
526
|
accessReferences?: AccessReference[] | undefined;
|
|
527
527
|
rejectVersion?: number | undefined;
|
|
528
528
|
sender?: ReadableAddress | undefined;
|
|
@@ -571,7 +571,7 @@ declare class AppFactory {
|
|
|
571
571
|
accountReferences?: ReadableAddress[] | undefined;
|
|
572
572
|
appReferences?: bigint[] | undefined;
|
|
573
573
|
assetReferences?: bigint[] | undefined;
|
|
574
|
-
boxReferences?: (
|
|
574
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
575
575
|
accessReferences?: AccessReference[] | undefined;
|
|
576
576
|
rejectVersion?: number | undefined;
|
|
577
577
|
sender?: ReadableAddress | undefined;
|
|
@@ -600,7 +600,7 @@ declare class AppFactory {
|
|
|
600
600
|
accountReferences?: ReadableAddress[] | undefined;
|
|
601
601
|
appReferences?: bigint[] | undefined;
|
|
602
602
|
assetReferences?: bigint[] | undefined;
|
|
603
|
-
boxReferences?: (
|
|
603
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
604
604
|
accessReferences?: AccessReference[] | undefined;
|
|
605
605
|
rejectVersion?: number | undefined;
|
|
606
606
|
sender?: ReadableAddress | undefined;
|
|
@@ -619,7 +619,7 @@ declare class AppFactory {
|
|
|
619
619
|
accountReferences?: ReadableAddress[] | undefined;
|
|
620
620
|
appReferences?: bigint[] | undefined;
|
|
621
621
|
assetReferences?: bigint[] | undefined;
|
|
622
|
-
boxReferences?: (
|
|
622
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
623
623
|
accessReferences?: AccessReference[] | undefined;
|
|
624
624
|
rejectVersion?: number | undefined;
|
|
625
625
|
sender?: ReadableAddress | undefined;
|
|
@@ -644,7 +644,7 @@ declare class AppFactory {
|
|
|
644
644
|
accountReferences?: ReadableAddress[] | undefined;
|
|
645
645
|
appReferences?: bigint[] | undefined;
|
|
646
646
|
assetReferences?: bigint[] | undefined;
|
|
647
|
-
boxReferences?: (
|
|
647
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
648
648
|
accessReferences?: AccessReference[] | undefined;
|
|
649
649
|
rejectVersion?: number | undefined;
|
|
650
650
|
sender?: ReadableAddress | undefined;
|
|
@@ -663,7 +663,7 @@ declare class AppFactory {
|
|
|
663
663
|
accountReferences?: ReadableAddress[] | undefined;
|
|
664
664
|
appReferences?: bigint[] | undefined;
|
|
665
665
|
assetReferences?: bigint[] | undefined;
|
|
666
|
-
boxReferences?: (
|
|
666
|
+
boxReferences?: (BoxReference | BoxIdentifier)[] | undefined;
|
|
667
667
|
accessReferences?: AccessReference[] | undefined;
|
|
668
668
|
rejectVersion?: number | undefined;
|
|
669
669
|
sender?: ReadableAddress | undefined;
|
package/types/app-manager.d.ts
CHANGED
|
@@ -267,7 +267,7 @@ declare class AppManager {
|
|
|
267
267
|
* const returnValue = AppManager.getABIReturn(confirmation, ABIMethod.fromSignature('hello(string)void'));
|
|
268
268
|
* ```
|
|
269
269
|
*/
|
|
270
|
-
static getABIReturn(confirmation: PendingTransactionResponse, method: ABIMethod | undefined): ABIReturn | undefined;
|
|
270
|
+
static getABIReturn(confirmation: PendingTransactionResponse | undefined, method: ABIMethod | undefined): ABIReturn | undefined;
|
|
271
271
|
private static hasAbiReturnPrefix;
|
|
272
272
|
/**
|
|
273
273
|
* Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.
|
package/types/app-manager.js
CHANGED
|
@@ -297,7 +297,12 @@ var AppManager = class AppManager {
|
|
|
297
297
|
* ```
|
|
298
298
|
*/
|
|
299
299
|
static getABIReturn(confirmation, method) {
|
|
300
|
-
if (!method ||
|
|
300
|
+
if (!method || !confirmation) return;
|
|
301
|
+
if (method.returns.type === "void") return {
|
|
302
|
+
method,
|
|
303
|
+
rawReturnValue: void 0,
|
|
304
|
+
returnValue: void 0
|
|
305
|
+
};
|
|
301
306
|
try {
|
|
302
307
|
const logs = confirmation.logs || [];
|
|
303
308
|
if (logs.length === 0) throw new Error(`App call transaction did not log a return value`);
|
package/types/app-manager.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-manager.js","names":["ProgramSourceMap","getApplicationAddress","getAddress","valueBase64: string","valueRaw: Buffer","ABI_RETURN_PREFIX","UPDATABLE_TEMPLATE_NAME","DELETABLE_TEMPLATE_NAME","result: string[]"],"sources":["../../src/types/app-manager.ts"],"sourcesContent":["import { ABIMethod, ABIReturn, ABIType, ABIValue } from '@algorandfoundation/algokit-abi'\nimport { AlgodClient, EvalDelta, PendingTransactionResponse, TealValue } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress, getAddress, getApplicationAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, BoxReference as TransactionBoxReference } from '@algorandfoundation/algokit-transact'\nimport { ProgramSourceMap } from '@algorandfoundation/sdk'\nimport {\n ABI_RETURN_PREFIX,\n BoxName,\n DELETABLE_TEMPLATE_NAME,\n UPDATABLE_TEMPLATE_NAME,\n type AppState,\n type CompiledTeal,\n type TealTemplateParams,\n} from './app'\n\n/** Information about an app. */\nexport interface AppInformation {\n /** The ID of the app. */\n appId: bigint\n /** The escrow address that the app operates with. */\n appAddress: Address\n /**\n * Approval program.\n */\n approvalProgram: Uint8Array\n /**\n * Clear state program.\n */\n clearStateProgram: Uint8Array\n /**\n * The address that created this application. This is the address where the\n * parameters and global state for this application can be found.\n */\n creator: Address\n /**\n * Current global state values.\n */\n globalState: AppState\n /** The number of allocated ints in per-user local state. */\n localInts: number\n /** The number of allocated byte slices in per-user local state. */\n localByteSlices: number\n /** The number of allocated ints in global state. */\n globalInts: number\n /** The number of allocated byte slices in global state. */\n globalByteSlices: number\n /** Any extra pages that are needed for the smart contract. */\n extraProgramPages?: number\n}\n\n/**\n * Something that identifies an app box name - either a:\n * * `Uint8Array` (the actual binary of the box name)\n * * `string` (that will be encoded to a `Uint8Array`)\n * * `AddressWithSigner` (that will be encoded into the\n * public key address of the corresponding account)\n */\nexport type BoxIdentifier = string | Uint8Array | AddressWithTransactionSigner\n\n/**\n * A grouping of the app ID and name identifier to reference an app box.\n */\nexport interface BoxReference {\n /**\n * A unique application id\n */\n appId: bigint\n /**\n * Identifier for a box name\n */\n name: BoxIdentifier\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValueRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The name of the box to return either as a string, binary array or `BoxName` */\n boxName: BoxIdentifier\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValuesRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The names of the boxes to return either as a string, binary array or BoxName` */\n boxNames: BoxIdentifier[]\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/** Allows management of application information. */\nexport class AppManager {\n private _algod: AlgodClient\n private _compilationResults: Record<string, CompiledTeal> = {}\n\n /**\n * Creates an `AppManager`\n * @param algod An algod instance\n */\n constructor(algod: AlgodClient) {\n this._algod = algod\n }\n\n /**\n * Compiles the given TEAL using algod and returns the result, including source map.\n *\n * The result of this compilation is also cached keyed by the TEAL\n * code so it can be retrieved via `getCompilationResult`.\n *\n * This function is re-entrant; it will only compile the same code once.\n *\n * @param tealCode The TEAL code\n * @returns The information about the compiled file\n * @example\n * ```typescript\n * const compiled = await appManager.compileTeal(tealProgram)\n * ```\n */\n async compileTeal(tealCode: string): Promise<CompiledTeal> {\n if (this._compilationResults[tealCode]) {\n return this._compilationResults[tealCode]\n }\n\n const compiled = await this._algod.tealCompile(tealCode, { sourcemap: true })\n const result = {\n teal: tealCode,\n compiled: compiled.result,\n compiledHash: compiled.hash,\n compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),\n sourceMap: new ProgramSourceMap(compiled.sourcemap as { version: number; sources: string[]; names: string[]; mappings: string }),\n }\n this._compilationResults[tealCode] = result\n\n return result\n }\n\n /**\n * Performs template substitution of a teal template and compiles it, returning the compiled result.\n *\n * Looks for `TMPL_{parameter}` for template replacements and replaces AlgoKit deploy-time control parameters\n * if deployment metadata is specified.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * @param tealTemplateCode The TEAL logic to compile\n * @param templateParams Any parameters to replace in the .teal file before compiling\n * @param deploymentMetadata The deployment metadata the app will be deployed with\n * @returns The information about the compiled code\n * @example\n * ```typescript\n * const compiled = await appManager.compileTealTemplate(tealTemplate, { TMPL_APP_ID: 12345n }, { updatable: true, deletable: false })\n * ```\n */\n async compileTealTemplate(\n tealTemplateCode: string,\n templateParams?: TealTemplateParams,\n deploymentMetadata?: { updatable?: boolean; deletable?: boolean },\n ): Promise<CompiledTeal> {\n let tealCode = AppManager.stripTealComments(tealTemplateCode)\n\n tealCode = AppManager.replaceTealTemplateParams(tealCode, templateParams)\n\n if (deploymentMetadata) {\n tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealCode, deploymentMetadata)\n }\n\n return await this.compileTeal(tealCode)\n }\n\n /**\n * Returns a previous compilation result.\n * @param tealCode The TEAL code\n * @returns The information about the previously compiled file\n * or `undefined` if that TEAL code wasn't previously compiled\n * @example\n * ```typescript\n * const compiled = appManager.getCompilationResult(tealProgram)\n * ```\n */\n getCompilationResult(tealCode: string): CompiledTeal | undefined {\n return this._compilationResults[tealCode]\n }\n\n /**\n * Returns the current app information for the app with the given ID.\n *\n * @example\n * ```typescript\n * const appInfo = await appManager.getById(12353n);\n * ```\n *\n * @param appId The ID of the app\n * @returns The app information\n */\n public async getById(appId: bigint): Promise<AppInformation> {\n const app = await this._algod.getApplicationById(appId)\n const convertedGlobalState = (app.params.globalState ?? []).map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return {\n appId: BigInt(app.id),\n appAddress: getApplicationAddress(app.id),\n approvalProgram: app.params.approvalProgram,\n clearStateProgram: app.params.clearStateProgram,\n creator: app.params.creator,\n localInts: Number(app.params.localStateSchema?.numUint ?? 0),\n localByteSlices: Number(app.params.localStateSchema?.numByteSlice ?? 0),\n globalInts: Number(app.params.globalStateSchema?.numUint ?? 0),\n globalByteSlices: Number(app.params.globalStateSchema?.numByteSlice ?? 0),\n extraProgramPages: Number(app.params.extraProgramPages ?? 0),\n globalState: AppManager.decodeAppState(convertedGlobalState),\n }\n }\n\n /**\n * Returns the current global state values for the given app ID and account address\n *\n * @param appId The ID of the app to return global state for\n * @returns The current global state for the given app\n * @example\n * ```typescript\n * const globalState = await appManager.getGlobalState(12353n);\n * ```\n */\n public async getGlobalState(appId: bigint) {\n return (await this.getById(appId)).globalState\n }\n\n /**\n * Returns the current local state values for the given app ID and account address\n *\n * @param appId The ID of the app to return local state for\n * @param address The string address of the account to get local state for the given app\n * @returns The current local state for the given (app, account) combination\n * @example\n * ```typescript\n * const localState = await appManager.getLocalState(12353n, 'ACCOUNTADDRESS');\n * ```\n */\n public async getLocalState(appId: bigint, address: ReadableAddress) {\n const appInfo = await this._algod.accountApplicationInformation(getAddress(address).toString(), Number(appId))\n\n if (!appInfo.appLocalState) {\n throw new Error(\"Couldn't find local state\")\n }\n\n // If keyValue is undefined or empty, return empty state\n if (!appInfo.appLocalState.keyValue || appInfo.appLocalState.keyValue.length === 0) {\n return {}\n }\n\n const convertedState = appInfo.appLocalState.keyValue.map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return AppManager.decodeAppState(convertedState)\n }\n\n /**\n * Returns the names of the current boxes for the given app.\n * @param appId The ID of the app return box names for\n * @returns The current box names\n * @example\n * ```typescript\n * const boxNames = await appManager.getBoxNames(12353n);\n * ```\n */\n public async getBoxNames(appId: bigint): Promise<BoxName[]> {\n const boxResult = await this._algod.getApplicationBoxes(appId)\n return boxResult.boxes.map((b: { name: Uint8Array }) => {\n return {\n nameRaw: b.name,\n nameBase64: Buffer.from(b.name).toString('base64'),\n name: Buffer.from(b.name).toString('utf-8'),\n }\n })\n }\n\n /**\n * Returns the value of the given box name for the given app.\n * @param appId The ID of the app return box names for\n * @param boxName The name of the box to return either as a string, binary array or `BoxName`\n * @returns The current box value as a byte array\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValue(12353n, 'boxName');\n * ```\n */\n public async getBoxValue(appId: bigint, boxName: BoxIdentifier | BoxName): Promise<Uint8Array> {\n const boxId = typeof boxName === 'object' && 'nameRaw' in boxName ? boxName.nameRaw : boxName\n const name = AppManager.getBoxReference(boxId).name\n const boxResult = await this._algod.getApplicationBoxByName(Number(appId), name)\n return boxResult.value\n }\n\n /**\n * Returns the value of the given box names for the given app.\n * @param appId The ID of the app return box names for\n * @param boxNames The names of the boxes to return either as a string, binary array or `BoxName`\n * @returns The current box values as a byte array in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValues(12353n, ['boxName1', 'boxName2']);\n * ```\n */\n public async getBoxValues(appId: bigint, boxNames: (BoxIdentifier | BoxName)[]): Promise<Uint8Array[]> {\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValue(appId, boxName)))\n }\n\n /**\n * Returns the value of the given box name for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box value as an ABI value\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValueFromABIType({ appId: 12353n, boxName: 'boxName', type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValueFromABIType(request: BoxValueRequestParams): Promise<ABIValue> {\n const { appId, boxName, type } = request\n const value = await this.getBoxValue(appId, boxName)\n return type.decode(value)\n }\n\n /**\n * Returns the value of the given box names for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box values as an ABI value in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValuesFromABIType({ appId: 12353n, boxNames: ['boxName1', 'boxName2'], type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValuesFromABIType(request: BoxValuesRequestParams): Promise<ABIValue[]> {\n const { appId, boxNames, type } = request\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValueFromABIType({ appId, boxName, type })))\n }\n\n /**\n * Returns a `algosdk.BoxReference` given a `BoxIdentifier` or `BoxReference`.\n * @param boxId The box to return a reference for\n * @returns The box reference ready to pass into a `algosdk.Transaction`\n * @example\n * ```typescript\n * const boxRef = AppManager.getBoxReference('boxName');\n * ```\n */\n public static getBoxReference(boxId: BoxIdentifier | BoxReference): TransactionBoxReference {\n const ref = typeof boxId === 'object' && 'appId' in boxId ? boxId : { appId: 0n, name: boxId }\n return {\n appId: ref.appId,\n name: typeof ref.name === 'string' ? new TextEncoder().encode(ref.name) : 'length' in ref.name ? ref.name : ref.name.addr.publicKey,\n } as TransactionBoxReference\n }\n\n /**\n * Converts an array of global/local state values from the algod api to a more friendly\n * generic object keyed by the UTF-8 value of the key.\n * @param state A `global-state`, `local-state`, `global-state-deltas` or `local-state-deltas`\n * @returns An object keyeed by the UTF-8 representation of the key with various parsings of the values\n * @example\n * ```typescript\n * const stateValues = AppManager.decodeAppState(state);\n * ```\n */\n public static decodeAppState(state: { key: Uint8Array; value: TealValue | EvalDelta }[]): AppState {\n const stateValues = {} as AppState\n\n // Start with empty set\n for (const stateVal of state) {\n const keyBase64 = Buffer.from(stateVal.key).toString('base64')\n const keyRaw = stateVal.key\n const key = Buffer.from(stateVal.key).toString('utf-8')\n const tealValue = stateVal.value\n\n const dataTypeFlag = Number('action' in tealValue ? tealValue.action : tealValue.type)\n let valueBase64: string\n let valueRaw: Buffer\n switch (dataTypeFlag) {\n case 1:\n valueBase64 =\n typeof tealValue.bytes === 'string' ? tealValue.bytes : tealValue.bytes ? Buffer.from(tealValue.bytes).toString('base64') : ''\n valueRaw = Buffer.from(valueBase64, 'base64')\n stateValues[key] = {\n keyRaw,\n keyBase64,\n valueRaw: new Uint8Array(valueRaw),\n valueBase64: valueBase64,\n value: valueRaw.toString('utf-8'),\n }\n break\n case 2: {\n const value = tealValue.uint ?? 0\n stateValues[key] = {\n keyRaw,\n keyBase64,\n value: BigInt(value),\n }\n break\n }\n default:\n throw new Error(`Received unknown state data type of ${dataTypeFlag}`)\n }\n }\n\n return stateValues\n }\n\n /**\n * Returns any ABI return values for the given app call arguments and transaction confirmation.\n * @param confirmation The transaction confirmation from algod\n * @param method The ABI method\n * @returns The return value for the method call\n * @example\n * ```typescript\n * const returnValue = AppManager.getABIReturn(confirmation, ABIMethod.fromSignature('hello(string)void'));\n * ```\n */\n public static getABIReturn(confirmation: PendingTransactionResponse, method: ABIMethod | undefined): ABIReturn | undefined {\n if (!method || method.returns.type === 'void') {\n return undefined\n }\n\n try {\n const logs = confirmation.logs || []\n if (logs.length === 0) {\n throw new Error(`App call transaction did not log a return value`)\n }\n const lastLog = logs[logs.length - 1]\n if (!AppManager.hasAbiReturnPrefix(lastLog)) {\n throw new Error(`App call transaction did not log an ABI return value`)\n }\n\n const rawReturnValue = new Uint8Array(lastLog.slice(4))\n return {\n method: method,\n rawReturnValue,\n decodeError: undefined,\n returnValue: method.returns.type.decode(rawReturnValue),\n }\n } catch (err) {\n return {\n method: method,\n rawReturnValue: undefined,\n decodeError: err as Error,\n returnValue: undefined,\n }\n }\n }\n\n private static hasAbiReturnPrefix(log: Uint8Array): boolean {\n if (log.length < ABI_RETURN_PREFIX.length) {\n return false\n }\n for (let i = 0; i < ABI_RETURN_PREFIX.length; i++) {\n if (log[i] !== ABI_RETURN_PREFIX[i]) {\n return false\n }\n }\n return true\n }\n\n /**\n * Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * Note: If these values are defined, but the corresponding `TMPL_*` value\n * isn't in the teal code it will throw an exception.\n *\n * @param tealTemplateCode The TEAL template code to substitute\n * @param params The deploy-time deployment control parameter value to replace\n * @returns The replaced TEAL code\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealTemplate, { updatable: true, deletable: false });\n * ```\n */\n static replaceTealTemplateDeployTimeControlParams(tealTemplateCode: string, params: { updatable?: boolean; deletable?: boolean }) {\n if (params.updatable !== undefined) {\n if (!tealTemplateCode.includes(UPDATABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time updatability control requested for app deployment, but ${UPDATABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, UPDATABLE_TEMPLATE_NAME, (params.updatable ? 1 : 0).toString())\n }\n\n if (params.deletable !== undefined) {\n if (!tealTemplateCode.includes(DELETABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time deletability control requested for app deployment, but ${DELETABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, DELETABLE_TEMPLATE_NAME, (params.deletable ? 1 : 0).toString())\n }\n\n return tealTemplateCode\n }\n\n /**\n * Performs template substitution of a teal file.\n *\n * Looks for `TMPL_{parameter}` for template replacements.\n *\n * @param tealTemplateCode The TEAL template code to make parameter replacements in\n * @param templateParams Any parameters to replace in the teal code\n * @returns The TEAL code with replacements\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateParams(tealTemplate, { TMPL_APP_ID: 12345n });\n * ```\n */\n static replaceTealTemplateParams(tealTemplateCode: string, templateParams?: TealTemplateParams) {\n if (templateParams !== undefined) {\n for (const key in templateParams) {\n const value = templateParams[key]\n const token = `TMPL_${key.replace(/^TMPL_/, '')}`\n\n // If this is a number, first replace any byte representations of the number\n // These may appear in the TEAL in order to circumvent int compression and preserve PC values\n if (typeof value === 'number' || typeof value === 'bigint') {\n tealTemplateCode = tealTemplateCode.replace(new RegExp(`(?<=bytes )${token}`, 'g'), `0x${value.toString(16).padStart(16, '0')}`)\n\n // We could probably return here since mixing pushint and pushbytes is likely not going to happen, but might as well do both\n }\n\n tealTemplateCode = replaceTemplateVariable(\n tealTemplateCode,\n token,\n typeof value === 'string'\n ? `0x${Buffer.from(value, 'utf-8').toString('hex')}`\n : ArrayBuffer.isView(value)\n ? `0x${Buffer.from(value).toString('hex')}`\n : value.toString(),\n )\n }\n }\n\n return tealTemplateCode\n }\n\n /**\n * Remove comments from TEAL code (useful to reduce code size before compilation).\n *\n * @param tealCode The TEAL logic to strip\n * @returns The TEAL without comments\n * @example\n * ```typescript\n * const stripped = AppManager.stripTealComments(tealProgram);\n * ```\n */\n static stripTealComments(tealCode: string) {\n const stripCommentFromLine = (line: string) => {\n const commentIndex = findUnquotedString(line, '//')\n if (commentIndex === undefined) {\n return line\n }\n return line.slice(0, commentIndex).trimEnd()\n }\n\n return tealCode\n .split('\\n')\n .map((line) => stripCommentFromLine(line))\n .join('\\n')\n }\n}\n\n/**\n * Find the first string within a line of TEAL. Only matches outside of quotes and base64 are returned.\n * Returns undefined if not found\n */\nconst findUnquotedString = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n let index = startIndex\n let inQuotes = false\n let inBase64 = false\n\n while (index < endIndex) {\n const currentChar = line[index]\n if ((currentChar === ' ' || currentChar === '(') && !inQuotes && lastTokenBase64(line, index)) {\n // enter base64\n inBase64 = true\n } else if ((currentChar === ' ' || currentChar === ')') && !inQuotes && inBase64) {\n // exit base64\n inBase64 = false\n } else if (currentChar === '\\\\' && inQuotes) {\n // escaped char, skip next character\n index += 1\n } else if (currentChar === '\"') {\n // quote boundary\n inQuotes = !inQuotes\n } else if (!inQuotes && !inBase64 && line.startsWith(token, index)) {\n // can test for match\n return index\n }\n index += 1\n }\n return undefined\n}\n\nconst lastTokenBase64 = (line: string, index: number): boolean => {\n try {\n const tokens = line.slice(0, index).split(/\\s+/)\n const last = tokens[tokens.length - 1]\n return ['base64', 'b64'].includes(last)\n } catch {\n return false\n }\n}\n\nfunction replaceTemplateVariable(program: string, token: string, replacement: string): string {\n const result: string[] = []\n const tokenIndexOffset = replacement.length - token.length\n\n const programLines = program.split('\\n')\n\n for (const line of programLines) {\n const _commentIndex = findUnquotedString(line, '//')\n const commentIndex = _commentIndex === undefined ? line.length : _commentIndex\n let code = line.substring(0, commentIndex)\n const comment = line.substring(commentIndex)\n let trailingIndex = 0\n\n while (true) {\n const tokenIndex = findTemplateToken(code, token, trailingIndex)\n if (tokenIndex === undefined) {\n break\n }\n trailingIndex = tokenIndex + token.length\n const prefix = code.substring(0, tokenIndex)\n const suffix = code.substring(trailingIndex)\n code = `${prefix}${replacement}${suffix}`\n trailingIndex += tokenIndexOffset\n }\n result.push(code + comment)\n }\n\n return result.join('\\n')\n}\n\nconst findTemplateToken = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n\n let index = startIndex\n while (index < endIndex) {\n const tokenIndex = findUnquotedString(line, token, index, endIndex)\n if (tokenIndex === undefined) {\n break\n }\n const trailingIndex = tokenIndex + token.length\n if (\n (tokenIndex === 0 || !isValidTokenCharacter(line[tokenIndex - 1])) &&\n (trailingIndex >= line.length || !isValidTokenCharacter(line[trailingIndex]))\n ) {\n return tokenIndex\n }\n index = trailingIndex\n }\n return undefined\n}\n\nfunction isValidTokenCharacter(char: string): boolean {\n return char.length === 1 && (/\\w/.test(char) || char === '_')\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-manager.js","names":["ProgramSourceMap","getApplicationAddress","getAddress","valueBase64: string","valueRaw: Buffer","ABI_RETURN_PREFIX","UPDATABLE_TEMPLATE_NAME","DELETABLE_TEMPLATE_NAME","result: string[]"],"sources":["../../src/types/app-manager.ts"],"sourcesContent":["import { ABIMethod, ABIReturn, ABIType, ABIValue } from '@algorandfoundation/algokit-abi'\nimport { AlgodClient, EvalDelta, PendingTransactionResponse, TealValue } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress, getAddress, getApplicationAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, BoxReference as TransactionBoxReference } from '@algorandfoundation/algokit-transact'\nimport { ProgramSourceMap } from '@algorandfoundation/sdk'\nimport {\n ABI_RETURN_PREFIX,\n BoxName,\n DELETABLE_TEMPLATE_NAME,\n UPDATABLE_TEMPLATE_NAME,\n type AppState,\n type CompiledTeal,\n type TealTemplateParams,\n} from './app'\n\n/** Information about an app. */\nexport interface AppInformation {\n /** The ID of the app. */\n appId: bigint\n /** The escrow address that the app operates with. */\n appAddress: Address\n /**\n * Approval program.\n */\n approvalProgram: Uint8Array\n /**\n * Clear state program.\n */\n clearStateProgram: Uint8Array\n /**\n * The address that created this application. This is the address where the\n * parameters and global state for this application can be found.\n */\n creator: Address\n /**\n * Current global state values.\n */\n globalState: AppState\n /** The number of allocated ints in per-user local state. */\n localInts: number\n /** The number of allocated byte slices in per-user local state. */\n localByteSlices: number\n /** The number of allocated ints in global state. */\n globalInts: number\n /** The number of allocated byte slices in global state. */\n globalByteSlices: number\n /** Any extra pages that are needed for the smart contract. */\n extraProgramPages?: number\n}\n\n/**\n * Something that identifies an app box name - either a:\n * * `Uint8Array` (the actual binary of the box name)\n * * `string` (that will be encoded to a `Uint8Array`)\n * * `AddressWithSigner` (that will be encoded into the\n * public key address of the corresponding account)\n */\nexport type BoxIdentifier = string | Uint8Array | AddressWithTransactionSigner\n\n/**\n * A grouping of the app ID and name identifier to reference an app box.\n */\nexport interface BoxReference {\n /**\n * A unique application id\n */\n appId: bigint\n /**\n * Identifier for a box name\n */\n name: BoxIdentifier\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValueRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The name of the box to return either as a string, binary array or `BoxName` */\n boxName: BoxIdentifier\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValuesRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The names of the boxes to return either as a string, binary array or BoxName` */\n boxNames: BoxIdentifier[]\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/** Allows management of application information. */\nexport class AppManager {\n private _algod: AlgodClient\n private _compilationResults: Record<string, CompiledTeal> = {}\n\n /**\n * Creates an `AppManager`\n * @param algod An algod instance\n */\n constructor(algod: AlgodClient) {\n this._algod = algod\n }\n\n /**\n * Compiles the given TEAL using algod and returns the result, including source map.\n *\n * The result of this compilation is also cached keyed by the TEAL\n * code so it can be retrieved via `getCompilationResult`.\n *\n * This function is re-entrant; it will only compile the same code once.\n *\n * @param tealCode The TEAL code\n * @returns The information about the compiled file\n * @example\n * ```typescript\n * const compiled = await appManager.compileTeal(tealProgram)\n * ```\n */\n async compileTeal(tealCode: string): Promise<CompiledTeal> {\n if (this._compilationResults[tealCode]) {\n return this._compilationResults[tealCode]\n }\n\n const compiled = await this._algod.tealCompile(tealCode, { sourcemap: true })\n const result = {\n teal: tealCode,\n compiled: compiled.result,\n compiledHash: compiled.hash,\n compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),\n sourceMap: new ProgramSourceMap(compiled.sourcemap as { version: number; sources: string[]; names: string[]; mappings: string }),\n }\n this._compilationResults[tealCode] = result\n\n return result\n }\n\n /**\n * Performs template substitution of a teal template and compiles it, returning the compiled result.\n *\n * Looks for `TMPL_{parameter}` for template replacements and replaces AlgoKit deploy-time control parameters\n * if deployment metadata is specified.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * @param tealTemplateCode The TEAL logic to compile\n * @param templateParams Any parameters to replace in the .teal file before compiling\n * @param deploymentMetadata The deployment metadata the app will be deployed with\n * @returns The information about the compiled code\n * @example\n * ```typescript\n * const compiled = await appManager.compileTealTemplate(tealTemplate, { TMPL_APP_ID: 12345n }, { updatable: true, deletable: false })\n * ```\n */\n async compileTealTemplate(\n tealTemplateCode: string,\n templateParams?: TealTemplateParams,\n deploymentMetadata?: { updatable?: boolean; deletable?: boolean },\n ): Promise<CompiledTeal> {\n let tealCode = AppManager.stripTealComments(tealTemplateCode)\n\n tealCode = AppManager.replaceTealTemplateParams(tealCode, templateParams)\n\n if (deploymentMetadata) {\n tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealCode, deploymentMetadata)\n }\n\n return await this.compileTeal(tealCode)\n }\n\n /**\n * Returns a previous compilation result.\n * @param tealCode The TEAL code\n * @returns The information about the previously compiled file\n * or `undefined` if that TEAL code wasn't previously compiled\n * @example\n * ```typescript\n * const compiled = appManager.getCompilationResult(tealProgram)\n * ```\n */\n getCompilationResult(tealCode: string): CompiledTeal | undefined {\n return this._compilationResults[tealCode]\n }\n\n /**\n * Returns the current app information for the app with the given ID.\n *\n * @example\n * ```typescript\n * const appInfo = await appManager.getById(12353n);\n * ```\n *\n * @param appId The ID of the app\n * @returns The app information\n */\n public async getById(appId: bigint): Promise<AppInformation> {\n const app = await this._algod.getApplicationById(appId)\n const convertedGlobalState = (app.params.globalState ?? []).map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return {\n appId: BigInt(app.id),\n appAddress: getApplicationAddress(app.id),\n approvalProgram: app.params.approvalProgram,\n clearStateProgram: app.params.clearStateProgram,\n creator: app.params.creator,\n localInts: Number(app.params.localStateSchema?.numUint ?? 0),\n localByteSlices: Number(app.params.localStateSchema?.numByteSlice ?? 0),\n globalInts: Number(app.params.globalStateSchema?.numUint ?? 0),\n globalByteSlices: Number(app.params.globalStateSchema?.numByteSlice ?? 0),\n extraProgramPages: Number(app.params.extraProgramPages ?? 0),\n globalState: AppManager.decodeAppState(convertedGlobalState),\n }\n }\n\n /**\n * Returns the current global state values for the given app ID and account address\n *\n * @param appId The ID of the app to return global state for\n * @returns The current global state for the given app\n * @example\n * ```typescript\n * const globalState = await appManager.getGlobalState(12353n);\n * ```\n */\n public async getGlobalState(appId: bigint) {\n return (await this.getById(appId)).globalState\n }\n\n /**\n * Returns the current local state values for the given app ID and account address\n *\n * @param appId The ID of the app to return local state for\n * @param address The string address of the account to get local state for the given app\n * @returns The current local state for the given (app, account) combination\n * @example\n * ```typescript\n * const localState = await appManager.getLocalState(12353n, 'ACCOUNTADDRESS');\n * ```\n */\n public async getLocalState(appId: bigint, address: ReadableAddress) {\n const appInfo = await this._algod.accountApplicationInformation(getAddress(address).toString(), Number(appId))\n\n if (!appInfo.appLocalState) {\n throw new Error(\"Couldn't find local state\")\n }\n\n // If keyValue is undefined or empty, return empty state\n if (!appInfo.appLocalState.keyValue || appInfo.appLocalState.keyValue.length === 0) {\n return {}\n }\n\n const convertedState = appInfo.appLocalState.keyValue.map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return AppManager.decodeAppState(convertedState)\n }\n\n /**\n * Returns the names of the current boxes for the given app.\n * @param appId The ID of the app return box names for\n * @returns The current box names\n * @example\n * ```typescript\n * const boxNames = await appManager.getBoxNames(12353n);\n * ```\n */\n public async getBoxNames(appId: bigint): Promise<BoxName[]> {\n const boxResult = await this._algod.getApplicationBoxes(appId)\n return boxResult.boxes.map((b: { name: Uint8Array }) => {\n return {\n nameRaw: b.name,\n nameBase64: Buffer.from(b.name).toString('base64'),\n name: Buffer.from(b.name).toString('utf-8'),\n }\n })\n }\n\n /**\n * Returns the value of the given box name for the given app.\n * @param appId The ID of the app return box names for\n * @param boxName The name of the box to return either as a string, binary array or `BoxName`\n * @returns The current box value as a byte array\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValue(12353n, 'boxName');\n * ```\n */\n public async getBoxValue(appId: bigint, boxName: BoxIdentifier | BoxName): Promise<Uint8Array> {\n const boxId = typeof boxName === 'object' && 'nameRaw' in boxName ? boxName.nameRaw : boxName\n const name = AppManager.getBoxReference(boxId).name\n const boxResult = await this._algod.getApplicationBoxByName(Number(appId), name)\n return boxResult.value\n }\n\n /**\n * Returns the value of the given box names for the given app.\n * @param appId The ID of the app return box names for\n * @param boxNames The names of the boxes to return either as a string, binary array or `BoxName`\n * @returns The current box values as a byte array in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValues(12353n, ['boxName1', 'boxName2']);\n * ```\n */\n public async getBoxValues(appId: bigint, boxNames: (BoxIdentifier | BoxName)[]): Promise<Uint8Array[]> {\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValue(appId, boxName)))\n }\n\n /**\n * Returns the value of the given box name for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box value as an ABI value\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValueFromABIType({ appId: 12353n, boxName: 'boxName', type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValueFromABIType(request: BoxValueRequestParams): Promise<ABIValue> {\n const { appId, boxName, type } = request\n const value = await this.getBoxValue(appId, boxName)\n return type.decode(value)\n }\n\n /**\n * Returns the value of the given box names for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box values as an ABI value in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValuesFromABIType({ appId: 12353n, boxNames: ['boxName1', 'boxName2'], type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValuesFromABIType(request: BoxValuesRequestParams): Promise<ABIValue[]> {\n const { appId, boxNames, type } = request\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValueFromABIType({ appId, boxName, type })))\n }\n\n /**\n * Returns a `algosdk.BoxReference` given a `BoxIdentifier` or `BoxReference`.\n * @param boxId The box to return a reference for\n * @returns The box reference ready to pass into a `algosdk.Transaction`\n * @example\n * ```typescript\n * const boxRef = AppManager.getBoxReference('boxName');\n * ```\n */\n public static getBoxReference(boxId: BoxIdentifier | BoxReference): TransactionBoxReference {\n const ref = typeof boxId === 'object' && 'appId' in boxId ? boxId : { appId: 0n, name: boxId }\n return {\n appId: ref.appId,\n name: typeof ref.name === 'string' ? new TextEncoder().encode(ref.name) : 'length' in ref.name ? ref.name : ref.name.addr.publicKey,\n } as TransactionBoxReference\n }\n\n /**\n * Converts an array of global/local state values from the algod api to a more friendly\n * generic object keyed by the UTF-8 value of the key.\n * @param state A `global-state`, `local-state`, `global-state-deltas` or `local-state-deltas`\n * @returns An object keyeed by the UTF-8 representation of the key with various parsings of the values\n * @example\n * ```typescript\n * const stateValues = AppManager.decodeAppState(state);\n * ```\n */\n public static decodeAppState(state: { key: Uint8Array; value: TealValue | EvalDelta }[]): AppState {\n const stateValues = {} as AppState\n\n // Start with empty set\n for (const stateVal of state) {\n const keyBase64 = Buffer.from(stateVal.key).toString('base64')\n const keyRaw = stateVal.key\n const key = Buffer.from(stateVal.key).toString('utf-8')\n const tealValue = stateVal.value\n\n const dataTypeFlag = Number('action' in tealValue ? tealValue.action : tealValue.type)\n let valueBase64: string\n let valueRaw: Buffer\n switch (dataTypeFlag) {\n case 1:\n valueBase64 =\n typeof tealValue.bytes === 'string' ? tealValue.bytes : tealValue.bytes ? Buffer.from(tealValue.bytes).toString('base64') : ''\n valueRaw = Buffer.from(valueBase64, 'base64')\n stateValues[key] = {\n keyRaw,\n keyBase64,\n valueRaw: new Uint8Array(valueRaw),\n valueBase64: valueBase64,\n value: valueRaw.toString('utf-8'),\n }\n break\n case 2: {\n const value = tealValue.uint ?? 0\n stateValues[key] = {\n keyRaw,\n keyBase64,\n value: BigInt(value),\n }\n break\n }\n default:\n throw new Error(`Received unknown state data type of ${dataTypeFlag}`)\n }\n }\n\n return stateValues\n }\n\n /**\n * Returns any ABI return values for the given app call arguments and transaction confirmation.\n * @param confirmation The transaction confirmation from algod\n * @param method The ABI method\n * @returns The return value for the method call\n * @example\n * ```typescript\n * const returnValue = AppManager.getABIReturn(confirmation, ABIMethod.fromSignature('hello(string)void'));\n * ```\n */\n public static getABIReturn(confirmation: PendingTransactionResponse | undefined, method: ABIMethod | undefined): ABIReturn | undefined {\n if (!method || !confirmation) {\n return undefined\n }\n\n if (method.returns.type === 'void') {\n return { method, rawReturnValue: undefined, returnValue: undefined }\n }\n\n try {\n const logs = confirmation.logs || []\n if (logs.length === 0) {\n throw new Error(`App call transaction did not log a return value`)\n }\n const lastLog = logs[logs.length - 1]\n if (!AppManager.hasAbiReturnPrefix(lastLog)) {\n throw new Error(`App call transaction did not log an ABI return value`)\n }\n\n const rawReturnValue = new Uint8Array(lastLog.slice(4))\n return {\n method: method,\n rawReturnValue,\n decodeError: undefined,\n returnValue: method.returns.type.decode(rawReturnValue),\n }\n } catch (err) {\n return {\n method: method,\n rawReturnValue: undefined,\n decodeError: err as Error,\n returnValue: undefined,\n }\n }\n }\n\n private static hasAbiReturnPrefix(log: Uint8Array): boolean {\n if (log.length < ABI_RETURN_PREFIX.length) {\n return false\n }\n for (let i = 0; i < ABI_RETURN_PREFIX.length; i++) {\n if (log[i] !== ABI_RETURN_PREFIX[i]) {\n return false\n }\n }\n return true\n }\n\n /**\n * Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * Note: If these values are defined, but the corresponding `TMPL_*` value\n * isn't in the teal code it will throw an exception.\n *\n * @param tealTemplateCode The TEAL template code to substitute\n * @param params The deploy-time deployment control parameter value to replace\n * @returns The replaced TEAL code\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealTemplate, { updatable: true, deletable: false });\n * ```\n */\n static replaceTealTemplateDeployTimeControlParams(tealTemplateCode: string, params: { updatable?: boolean; deletable?: boolean }) {\n if (params.updatable !== undefined) {\n if (!tealTemplateCode.includes(UPDATABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time updatability control requested for app deployment, but ${UPDATABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, UPDATABLE_TEMPLATE_NAME, (params.updatable ? 1 : 0).toString())\n }\n\n if (params.deletable !== undefined) {\n if (!tealTemplateCode.includes(DELETABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time deletability control requested for app deployment, but ${DELETABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, DELETABLE_TEMPLATE_NAME, (params.deletable ? 1 : 0).toString())\n }\n\n return tealTemplateCode\n }\n\n /**\n * Performs template substitution of a teal file.\n *\n * Looks for `TMPL_{parameter}` for template replacements.\n *\n * @param tealTemplateCode The TEAL template code to make parameter replacements in\n * @param templateParams Any parameters to replace in the teal code\n * @returns The TEAL code with replacements\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateParams(tealTemplate, { TMPL_APP_ID: 12345n });\n * ```\n */\n static replaceTealTemplateParams(tealTemplateCode: string, templateParams?: TealTemplateParams) {\n if (templateParams !== undefined) {\n for (const key in templateParams) {\n const value = templateParams[key]\n const token = `TMPL_${key.replace(/^TMPL_/, '')}`\n\n // If this is a number, first replace any byte representations of the number\n // These may appear in the TEAL in order to circumvent int compression and preserve PC values\n if (typeof value === 'number' || typeof value === 'bigint') {\n tealTemplateCode = tealTemplateCode.replace(new RegExp(`(?<=bytes )${token}`, 'g'), `0x${value.toString(16).padStart(16, '0')}`)\n\n // We could probably return here since mixing pushint and pushbytes is likely not going to happen, but might as well do both\n }\n\n tealTemplateCode = replaceTemplateVariable(\n tealTemplateCode,\n token,\n typeof value === 'string'\n ? `0x${Buffer.from(value, 'utf-8').toString('hex')}`\n : ArrayBuffer.isView(value)\n ? `0x${Buffer.from(value).toString('hex')}`\n : value.toString(),\n )\n }\n }\n\n return tealTemplateCode\n }\n\n /**\n * Remove comments from TEAL code (useful to reduce code size before compilation).\n *\n * @param tealCode The TEAL logic to strip\n * @returns The TEAL without comments\n * @example\n * ```typescript\n * const stripped = AppManager.stripTealComments(tealProgram);\n * ```\n */\n static stripTealComments(tealCode: string) {\n const stripCommentFromLine = (line: string) => {\n const commentIndex = findUnquotedString(line, '//')\n if (commentIndex === undefined) {\n return line\n }\n return line.slice(0, commentIndex).trimEnd()\n }\n\n return tealCode\n .split('\\n')\n .map((line) => stripCommentFromLine(line))\n .join('\\n')\n }\n}\n\n/**\n * Find the first string within a line of TEAL. Only matches outside of quotes and base64 are returned.\n * Returns undefined if not found\n */\nconst findUnquotedString = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n let index = startIndex\n let inQuotes = false\n let inBase64 = false\n\n while (index < endIndex) {\n const currentChar = line[index]\n if ((currentChar === ' ' || currentChar === '(') && !inQuotes && lastTokenBase64(line, index)) {\n // enter base64\n inBase64 = true\n } else if ((currentChar === ' ' || currentChar === ')') && !inQuotes && inBase64) {\n // exit base64\n inBase64 = false\n } else if (currentChar === '\\\\' && inQuotes) {\n // escaped char, skip next character\n index += 1\n } else if (currentChar === '\"') {\n // quote boundary\n inQuotes = !inQuotes\n } else if (!inQuotes && !inBase64 && line.startsWith(token, index)) {\n // can test for match\n return index\n }\n index += 1\n }\n return undefined\n}\n\nconst lastTokenBase64 = (line: string, index: number): boolean => {\n try {\n const tokens = line.slice(0, index).split(/\\s+/)\n const last = tokens[tokens.length - 1]\n return ['base64', 'b64'].includes(last)\n } catch {\n return false\n }\n}\n\nfunction replaceTemplateVariable(program: string, token: string, replacement: string): string {\n const result: string[] = []\n const tokenIndexOffset = replacement.length - token.length\n\n const programLines = program.split('\\n')\n\n for (const line of programLines) {\n const _commentIndex = findUnquotedString(line, '//')\n const commentIndex = _commentIndex === undefined ? line.length : _commentIndex\n let code = line.substring(0, commentIndex)\n const comment = line.substring(commentIndex)\n let trailingIndex = 0\n\n while (true) {\n const tokenIndex = findTemplateToken(code, token, trailingIndex)\n if (tokenIndex === undefined) {\n break\n }\n trailingIndex = tokenIndex + token.length\n const prefix = code.substring(0, tokenIndex)\n const suffix = code.substring(trailingIndex)\n code = `${prefix}${replacement}${suffix}`\n trailingIndex += tokenIndexOffset\n }\n result.push(code + comment)\n }\n\n return result.join('\\n')\n}\n\nconst findTemplateToken = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n\n let index = startIndex\n while (index < endIndex) {\n const tokenIndex = findUnquotedString(line, token, index, endIndex)\n if (tokenIndex === undefined) {\n break\n }\n const trailingIndex = tokenIndex + token.length\n if (\n (tokenIndex === 0 || !isValidTokenCharacter(line[tokenIndex - 1])) &&\n (trailingIndex >= line.length || !isValidTokenCharacter(line[trailingIndex]))\n ) {\n return tokenIndex\n }\n index = trailingIndex\n }\n return undefined\n}\n\nfunction isValidTokenCharacter(char: string): boolean {\n return char.length === 1 && (/\\w/.test(char) || char === '_')\n}\n"],"mappings":"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"}
|
package/types/app-manager.mjs
CHANGED
|
@@ -297,7 +297,12 @@ var AppManager = class AppManager {
|
|
|
297
297
|
* ```
|
|
298
298
|
*/
|
|
299
299
|
static getABIReturn(confirmation, method) {
|
|
300
|
-
if (!method ||
|
|
300
|
+
if (!method || !confirmation) return;
|
|
301
|
+
if (method.returns.type === "void") return {
|
|
302
|
+
method,
|
|
303
|
+
rawReturnValue: void 0,
|
|
304
|
+
returnValue: void 0
|
|
305
|
+
};
|
|
301
306
|
try {
|
|
302
307
|
const logs = confirmation.logs || [];
|
|
303
308
|
if (logs.length === 0) throw new Error(`App call transaction did not log a return value`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-manager.mjs","names":["valueBase64: string","valueRaw: Buffer","result: string[]"],"sources":["../../src/types/app-manager.ts"],"sourcesContent":["import { ABIMethod, ABIReturn, ABIType, ABIValue } from '@algorandfoundation/algokit-abi'\nimport { AlgodClient, EvalDelta, PendingTransactionResponse, TealValue } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress, getAddress, getApplicationAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, BoxReference as TransactionBoxReference } from '@algorandfoundation/algokit-transact'\nimport { ProgramSourceMap } from '@algorandfoundation/sdk'\nimport {\n ABI_RETURN_PREFIX,\n BoxName,\n DELETABLE_TEMPLATE_NAME,\n UPDATABLE_TEMPLATE_NAME,\n type AppState,\n type CompiledTeal,\n type TealTemplateParams,\n} from './app'\n\n/** Information about an app. */\nexport interface AppInformation {\n /** The ID of the app. */\n appId: bigint\n /** The escrow address that the app operates with. */\n appAddress: Address\n /**\n * Approval program.\n */\n approvalProgram: Uint8Array\n /**\n * Clear state program.\n */\n clearStateProgram: Uint8Array\n /**\n * The address that created this application. This is the address where the\n * parameters and global state for this application can be found.\n */\n creator: Address\n /**\n * Current global state values.\n */\n globalState: AppState\n /** The number of allocated ints in per-user local state. */\n localInts: number\n /** The number of allocated byte slices in per-user local state. */\n localByteSlices: number\n /** The number of allocated ints in global state. */\n globalInts: number\n /** The number of allocated byte slices in global state. */\n globalByteSlices: number\n /** Any extra pages that are needed for the smart contract. */\n extraProgramPages?: number\n}\n\n/**\n * Something that identifies an app box name - either a:\n * * `Uint8Array` (the actual binary of the box name)\n * * `string` (that will be encoded to a `Uint8Array`)\n * * `AddressWithSigner` (that will be encoded into the\n * public key address of the corresponding account)\n */\nexport type BoxIdentifier = string | Uint8Array | AddressWithTransactionSigner\n\n/**\n * A grouping of the app ID and name identifier to reference an app box.\n */\nexport interface BoxReference {\n /**\n * A unique application id\n */\n appId: bigint\n /**\n * Identifier for a box name\n */\n name: BoxIdentifier\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValueRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The name of the box to return either as a string, binary array or `BoxName` */\n boxName: BoxIdentifier\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValuesRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The names of the boxes to return either as a string, binary array or BoxName` */\n boxNames: BoxIdentifier[]\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/** Allows management of application information. */\nexport class AppManager {\n private _algod: AlgodClient\n private _compilationResults: Record<string, CompiledTeal> = {}\n\n /**\n * Creates an `AppManager`\n * @param algod An algod instance\n */\n constructor(algod: AlgodClient) {\n this._algod = algod\n }\n\n /**\n * Compiles the given TEAL using algod and returns the result, including source map.\n *\n * The result of this compilation is also cached keyed by the TEAL\n * code so it can be retrieved via `getCompilationResult`.\n *\n * This function is re-entrant; it will only compile the same code once.\n *\n * @param tealCode The TEAL code\n * @returns The information about the compiled file\n * @example\n * ```typescript\n * const compiled = await appManager.compileTeal(tealProgram)\n * ```\n */\n async compileTeal(tealCode: string): Promise<CompiledTeal> {\n if (this._compilationResults[tealCode]) {\n return this._compilationResults[tealCode]\n }\n\n const compiled = await this._algod.tealCompile(tealCode, { sourcemap: true })\n const result = {\n teal: tealCode,\n compiled: compiled.result,\n compiledHash: compiled.hash,\n compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),\n sourceMap: new ProgramSourceMap(compiled.sourcemap as { version: number; sources: string[]; names: string[]; mappings: string }),\n }\n this._compilationResults[tealCode] = result\n\n return result\n }\n\n /**\n * Performs template substitution of a teal template and compiles it, returning the compiled result.\n *\n * Looks for `TMPL_{parameter}` for template replacements and replaces AlgoKit deploy-time control parameters\n * if deployment metadata is specified.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * @param tealTemplateCode The TEAL logic to compile\n * @param templateParams Any parameters to replace in the .teal file before compiling\n * @param deploymentMetadata The deployment metadata the app will be deployed with\n * @returns The information about the compiled code\n * @example\n * ```typescript\n * const compiled = await appManager.compileTealTemplate(tealTemplate, { TMPL_APP_ID: 12345n }, { updatable: true, deletable: false })\n * ```\n */\n async compileTealTemplate(\n tealTemplateCode: string,\n templateParams?: TealTemplateParams,\n deploymentMetadata?: { updatable?: boolean; deletable?: boolean },\n ): Promise<CompiledTeal> {\n let tealCode = AppManager.stripTealComments(tealTemplateCode)\n\n tealCode = AppManager.replaceTealTemplateParams(tealCode, templateParams)\n\n if (deploymentMetadata) {\n tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealCode, deploymentMetadata)\n }\n\n return await this.compileTeal(tealCode)\n }\n\n /**\n * Returns a previous compilation result.\n * @param tealCode The TEAL code\n * @returns The information about the previously compiled file\n * or `undefined` if that TEAL code wasn't previously compiled\n * @example\n * ```typescript\n * const compiled = appManager.getCompilationResult(tealProgram)\n * ```\n */\n getCompilationResult(tealCode: string): CompiledTeal | undefined {\n return this._compilationResults[tealCode]\n }\n\n /**\n * Returns the current app information for the app with the given ID.\n *\n * @example\n * ```typescript\n * const appInfo = await appManager.getById(12353n);\n * ```\n *\n * @param appId The ID of the app\n * @returns The app information\n */\n public async getById(appId: bigint): Promise<AppInformation> {\n const app = await this._algod.getApplicationById(appId)\n const convertedGlobalState = (app.params.globalState ?? []).map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return {\n appId: BigInt(app.id),\n appAddress: getApplicationAddress(app.id),\n approvalProgram: app.params.approvalProgram,\n clearStateProgram: app.params.clearStateProgram,\n creator: app.params.creator,\n localInts: Number(app.params.localStateSchema?.numUint ?? 0),\n localByteSlices: Number(app.params.localStateSchema?.numByteSlice ?? 0),\n globalInts: Number(app.params.globalStateSchema?.numUint ?? 0),\n globalByteSlices: Number(app.params.globalStateSchema?.numByteSlice ?? 0),\n extraProgramPages: Number(app.params.extraProgramPages ?? 0),\n globalState: AppManager.decodeAppState(convertedGlobalState),\n }\n }\n\n /**\n * Returns the current global state values for the given app ID and account address\n *\n * @param appId The ID of the app to return global state for\n * @returns The current global state for the given app\n * @example\n * ```typescript\n * const globalState = await appManager.getGlobalState(12353n);\n * ```\n */\n public async getGlobalState(appId: bigint) {\n return (await this.getById(appId)).globalState\n }\n\n /**\n * Returns the current local state values for the given app ID and account address\n *\n * @param appId The ID of the app to return local state for\n * @param address The string address of the account to get local state for the given app\n * @returns The current local state for the given (app, account) combination\n * @example\n * ```typescript\n * const localState = await appManager.getLocalState(12353n, 'ACCOUNTADDRESS');\n * ```\n */\n public async getLocalState(appId: bigint, address: ReadableAddress) {\n const appInfo = await this._algod.accountApplicationInformation(getAddress(address).toString(), Number(appId))\n\n if (!appInfo.appLocalState) {\n throw new Error(\"Couldn't find local state\")\n }\n\n // If keyValue is undefined or empty, return empty state\n if (!appInfo.appLocalState.keyValue || appInfo.appLocalState.keyValue.length === 0) {\n return {}\n }\n\n const convertedState = appInfo.appLocalState.keyValue.map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return AppManager.decodeAppState(convertedState)\n }\n\n /**\n * Returns the names of the current boxes for the given app.\n * @param appId The ID of the app return box names for\n * @returns The current box names\n * @example\n * ```typescript\n * const boxNames = await appManager.getBoxNames(12353n);\n * ```\n */\n public async getBoxNames(appId: bigint): Promise<BoxName[]> {\n const boxResult = await this._algod.getApplicationBoxes(appId)\n return boxResult.boxes.map((b: { name: Uint8Array }) => {\n return {\n nameRaw: b.name,\n nameBase64: Buffer.from(b.name).toString('base64'),\n name: Buffer.from(b.name).toString('utf-8'),\n }\n })\n }\n\n /**\n * Returns the value of the given box name for the given app.\n * @param appId The ID of the app return box names for\n * @param boxName The name of the box to return either as a string, binary array or `BoxName`\n * @returns The current box value as a byte array\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValue(12353n, 'boxName');\n * ```\n */\n public async getBoxValue(appId: bigint, boxName: BoxIdentifier | BoxName): Promise<Uint8Array> {\n const boxId = typeof boxName === 'object' && 'nameRaw' in boxName ? boxName.nameRaw : boxName\n const name = AppManager.getBoxReference(boxId).name\n const boxResult = await this._algod.getApplicationBoxByName(Number(appId), name)\n return boxResult.value\n }\n\n /**\n * Returns the value of the given box names for the given app.\n * @param appId The ID of the app return box names for\n * @param boxNames The names of the boxes to return either as a string, binary array or `BoxName`\n * @returns The current box values as a byte array in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValues(12353n, ['boxName1', 'boxName2']);\n * ```\n */\n public async getBoxValues(appId: bigint, boxNames: (BoxIdentifier | BoxName)[]): Promise<Uint8Array[]> {\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValue(appId, boxName)))\n }\n\n /**\n * Returns the value of the given box name for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box value as an ABI value\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValueFromABIType({ appId: 12353n, boxName: 'boxName', type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValueFromABIType(request: BoxValueRequestParams): Promise<ABIValue> {\n const { appId, boxName, type } = request\n const value = await this.getBoxValue(appId, boxName)\n return type.decode(value)\n }\n\n /**\n * Returns the value of the given box names for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box values as an ABI value in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValuesFromABIType({ appId: 12353n, boxNames: ['boxName1', 'boxName2'], type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValuesFromABIType(request: BoxValuesRequestParams): Promise<ABIValue[]> {\n const { appId, boxNames, type } = request\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValueFromABIType({ appId, boxName, type })))\n }\n\n /**\n * Returns a `algosdk.BoxReference` given a `BoxIdentifier` or `BoxReference`.\n * @param boxId The box to return a reference for\n * @returns The box reference ready to pass into a `algosdk.Transaction`\n * @example\n * ```typescript\n * const boxRef = AppManager.getBoxReference('boxName');\n * ```\n */\n public static getBoxReference(boxId: BoxIdentifier | BoxReference): TransactionBoxReference {\n const ref = typeof boxId === 'object' && 'appId' in boxId ? boxId : { appId: 0n, name: boxId }\n return {\n appId: ref.appId,\n name: typeof ref.name === 'string' ? new TextEncoder().encode(ref.name) : 'length' in ref.name ? ref.name : ref.name.addr.publicKey,\n } as TransactionBoxReference\n }\n\n /**\n * Converts an array of global/local state values from the algod api to a more friendly\n * generic object keyed by the UTF-8 value of the key.\n * @param state A `global-state`, `local-state`, `global-state-deltas` or `local-state-deltas`\n * @returns An object keyeed by the UTF-8 representation of the key with various parsings of the values\n * @example\n * ```typescript\n * const stateValues = AppManager.decodeAppState(state);\n * ```\n */\n public static decodeAppState(state: { key: Uint8Array; value: TealValue | EvalDelta }[]): AppState {\n const stateValues = {} as AppState\n\n // Start with empty set\n for (const stateVal of state) {\n const keyBase64 = Buffer.from(stateVal.key).toString('base64')\n const keyRaw = stateVal.key\n const key = Buffer.from(stateVal.key).toString('utf-8')\n const tealValue = stateVal.value\n\n const dataTypeFlag = Number('action' in tealValue ? tealValue.action : tealValue.type)\n let valueBase64: string\n let valueRaw: Buffer\n switch (dataTypeFlag) {\n case 1:\n valueBase64 =\n typeof tealValue.bytes === 'string' ? tealValue.bytes : tealValue.bytes ? Buffer.from(tealValue.bytes).toString('base64') : ''\n valueRaw = Buffer.from(valueBase64, 'base64')\n stateValues[key] = {\n keyRaw,\n keyBase64,\n valueRaw: new Uint8Array(valueRaw),\n valueBase64: valueBase64,\n value: valueRaw.toString('utf-8'),\n }\n break\n case 2: {\n const value = tealValue.uint ?? 0\n stateValues[key] = {\n keyRaw,\n keyBase64,\n value: BigInt(value),\n }\n break\n }\n default:\n throw new Error(`Received unknown state data type of ${dataTypeFlag}`)\n }\n }\n\n return stateValues\n }\n\n /**\n * Returns any ABI return values for the given app call arguments and transaction confirmation.\n * @param confirmation The transaction confirmation from algod\n * @param method The ABI method\n * @returns The return value for the method call\n * @example\n * ```typescript\n * const returnValue = AppManager.getABIReturn(confirmation, ABIMethod.fromSignature('hello(string)void'));\n * ```\n */\n public static getABIReturn(confirmation: PendingTransactionResponse, method: ABIMethod | undefined): ABIReturn | undefined {\n if (!method || method.returns.type === 'void') {\n return undefined\n }\n\n try {\n const logs = confirmation.logs || []\n if (logs.length === 0) {\n throw new Error(`App call transaction did not log a return value`)\n }\n const lastLog = logs[logs.length - 1]\n if (!AppManager.hasAbiReturnPrefix(lastLog)) {\n throw new Error(`App call transaction did not log an ABI return value`)\n }\n\n const rawReturnValue = new Uint8Array(lastLog.slice(4))\n return {\n method: method,\n rawReturnValue,\n decodeError: undefined,\n returnValue: method.returns.type.decode(rawReturnValue),\n }\n } catch (err) {\n return {\n method: method,\n rawReturnValue: undefined,\n decodeError: err as Error,\n returnValue: undefined,\n }\n }\n }\n\n private static hasAbiReturnPrefix(log: Uint8Array): boolean {\n if (log.length < ABI_RETURN_PREFIX.length) {\n return false\n }\n for (let i = 0; i < ABI_RETURN_PREFIX.length; i++) {\n if (log[i] !== ABI_RETURN_PREFIX[i]) {\n return false\n }\n }\n return true\n }\n\n /**\n * Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * Note: If these values are defined, but the corresponding `TMPL_*` value\n * isn't in the teal code it will throw an exception.\n *\n * @param tealTemplateCode The TEAL template code to substitute\n * @param params The deploy-time deployment control parameter value to replace\n * @returns The replaced TEAL code\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealTemplate, { updatable: true, deletable: false });\n * ```\n */\n static replaceTealTemplateDeployTimeControlParams(tealTemplateCode: string, params: { updatable?: boolean; deletable?: boolean }) {\n if (params.updatable !== undefined) {\n if (!tealTemplateCode.includes(UPDATABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time updatability control requested for app deployment, but ${UPDATABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, UPDATABLE_TEMPLATE_NAME, (params.updatable ? 1 : 0).toString())\n }\n\n if (params.deletable !== undefined) {\n if (!tealTemplateCode.includes(DELETABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time deletability control requested for app deployment, but ${DELETABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, DELETABLE_TEMPLATE_NAME, (params.deletable ? 1 : 0).toString())\n }\n\n return tealTemplateCode\n }\n\n /**\n * Performs template substitution of a teal file.\n *\n * Looks for `TMPL_{parameter}` for template replacements.\n *\n * @param tealTemplateCode The TEAL template code to make parameter replacements in\n * @param templateParams Any parameters to replace in the teal code\n * @returns The TEAL code with replacements\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateParams(tealTemplate, { TMPL_APP_ID: 12345n });\n * ```\n */\n static replaceTealTemplateParams(tealTemplateCode: string, templateParams?: TealTemplateParams) {\n if (templateParams !== undefined) {\n for (const key in templateParams) {\n const value = templateParams[key]\n const token = `TMPL_${key.replace(/^TMPL_/, '')}`\n\n // If this is a number, first replace any byte representations of the number\n // These may appear in the TEAL in order to circumvent int compression and preserve PC values\n if (typeof value === 'number' || typeof value === 'bigint') {\n tealTemplateCode = tealTemplateCode.replace(new RegExp(`(?<=bytes )${token}`, 'g'), `0x${value.toString(16).padStart(16, '0')}`)\n\n // We could probably return here since mixing pushint and pushbytes is likely not going to happen, but might as well do both\n }\n\n tealTemplateCode = replaceTemplateVariable(\n tealTemplateCode,\n token,\n typeof value === 'string'\n ? `0x${Buffer.from(value, 'utf-8').toString('hex')}`\n : ArrayBuffer.isView(value)\n ? `0x${Buffer.from(value).toString('hex')}`\n : value.toString(),\n )\n }\n }\n\n return tealTemplateCode\n }\n\n /**\n * Remove comments from TEAL code (useful to reduce code size before compilation).\n *\n * @param tealCode The TEAL logic to strip\n * @returns The TEAL without comments\n * @example\n * ```typescript\n * const stripped = AppManager.stripTealComments(tealProgram);\n * ```\n */\n static stripTealComments(tealCode: string) {\n const stripCommentFromLine = (line: string) => {\n const commentIndex = findUnquotedString(line, '//')\n if (commentIndex === undefined) {\n return line\n }\n return line.slice(0, commentIndex).trimEnd()\n }\n\n return tealCode\n .split('\\n')\n .map((line) => stripCommentFromLine(line))\n .join('\\n')\n }\n}\n\n/**\n * Find the first string within a line of TEAL. Only matches outside of quotes and base64 are returned.\n * Returns undefined if not found\n */\nconst findUnquotedString = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n let index = startIndex\n let inQuotes = false\n let inBase64 = false\n\n while (index < endIndex) {\n const currentChar = line[index]\n if ((currentChar === ' ' || currentChar === '(') && !inQuotes && lastTokenBase64(line, index)) {\n // enter base64\n inBase64 = true\n } else if ((currentChar === ' ' || currentChar === ')') && !inQuotes && inBase64) {\n // exit base64\n inBase64 = false\n } else if (currentChar === '\\\\' && inQuotes) {\n // escaped char, skip next character\n index += 1\n } else if (currentChar === '\"') {\n // quote boundary\n inQuotes = !inQuotes\n } else if (!inQuotes && !inBase64 && line.startsWith(token, index)) {\n // can test for match\n return index\n }\n index += 1\n }\n return undefined\n}\n\nconst lastTokenBase64 = (line: string, index: number): boolean => {\n try {\n const tokens = line.slice(0, index).split(/\\s+/)\n const last = tokens[tokens.length - 1]\n return ['base64', 'b64'].includes(last)\n } catch {\n return false\n }\n}\n\nfunction replaceTemplateVariable(program: string, token: string, replacement: string): string {\n const result: string[] = []\n const tokenIndexOffset = replacement.length - token.length\n\n const programLines = program.split('\\n')\n\n for (const line of programLines) {\n const _commentIndex = findUnquotedString(line, '//')\n const commentIndex = _commentIndex === undefined ? line.length : _commentIndex\n let code = line.substring(0, commentIndex)\n const comment = line.substring(commentIndex)\n let trailingIndex = 0\n\n while (true) {\n const tokenIndex = findTemplateToken(code, token, trailingIndex)\n if (tokenIndex === undefined) {\n break\n }\n trailingIndex = tokenIndex + token.length\n const prefix = code.substring(0, tokenIndex)\n const suffix = code.substring(trailingIndex)\n code = `${prefix}${replacement}${suffix}`\n trailingIndex += tokenIndexOffset\n }\n result.push(code + comment)\n }\n\n return result.join('\\n')\n}\n\nconst findTemplateToken = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n\n let index = startIndex\n while (index < endIndex) {\n const tokenIndex = findUnquotedString(line, token, index, endIndex)\n if (tokenIndex === undefined) {\n break\n }\n const trailingIndex = tokenIndex + token.length\n if (\n (tokenIndex === 0 || !isValidTokenCharacter(line[tokenIndex - 1])) &&\n (trailingIndex >= line.length || !isValidTokenCharacter(line[trailingIndex]))\n ) {\n return tokenIndex\n }\n index = trailingIndex\n }\n return undefined\n}\n\nfunction isValidTokenCharacter(char: string): boolean {\n return char.length === 1 && (/\\w/.test(char) || char === '_')\n}\n"],"mappings":";;;;;;AAkGA,IAAa,aAAb,MAAa,WAAW;CACtB,AAAQ;CACR,AAAQ,sBAAoD,EAAE;;;;;CAM9D,YAAY,OAAoB;AAC9B,OAAK,SAAS;;;;;;;;;;;;;;;;;CAkBhB,MAAM,YAAY,UAAyC;AACzD,MAAI,KAAK,oBAAoB,UAC3B,QAAO,KAAK,oBAAoB;EAGlC,MAAM,WAAW,MAAM,KAAK,OAAO,YAAY,UAAU,EAAE,WAAW,MAAM,CAAC;EAC7E,MAAM,SAAS;GACb,MAAM;GACN,UAAU,SAAS;GACnB,cAAc,SAAS;GACvB,uBAAuB,IAAI,WAAW,OAAO,KAAK,SAAS,QAAQ,SAAS,CAAC;GAC7E,WAAW,IAAI,iBAAiB,SAAS,UAAuF;GACjI;AACD,OAAK,oBAAoB,YAAY;AAErC,SAAO;;;;;;;;;;;;;;;;;;;;CAqBT,MAAM,oBACJ,kBACA,gBACA,oBACuB;EACvB,IAAI,WAAW,WAAW,kBAAkB,iBAAiB;AAE7D,aAAW,WAAW,0BAA0B,UAAU,eAAe;AAEzE,MAAI,mBACF,YAAW,WAAW,2CAA2C,UAAU,mBAAmB;AAGhG,SAAO,MAAM,KAAK,YAAY,SAAS;;;;;;;;;;;;CAazC,qBAAqB,UAA4C;AAC/D,SAAO,KAAK,oBAAoB;;;;;;;;;;;;;CAclC,MAAa,QAAQ,OAAwC;EAC3D,MAAM,MAAM,MAAM,KAAK,OAAO,mBAAmB,MAAM;EACvD,MAAM,wBAAwB,IAAI,OAAO,eAAe,EAAE,EAAE,KAAK,QAAQ;GACvE,KAAK,GAAG;GACR,OAAO,GAAG;GACX,EAAE;AAEH,SAAO;GACL,OAAO,OAAO,IAAI,GAAG;GACrB,YAAY,sBAAsB,IAAI,GAAG;GACzC,iBAAiB,IAAI,OAAO;GAC5B,mBAAmB,IAAI,OAAO;GAC9B,SAAS,IAAI,OAAO;GACpB,WAAW,OAAO,IAAI,OAAO,kBAAkB,WAAW,EAAE;GAC5D,iBAAiB,OAAO,IAAI,OAAO,kBAAkB,gBAAgB,EAAE;GACvE,YAAY,OAAO,IAAI,OAAO,mBAAmB,WAAW,EAAE;GAC9D,kBAAkB,OAAO,IAAI,OAAO,mBAAmB,gBAAgB,EAAE;GACzE,mBAAmB,OAAO,IAAI,OAAO,qBAAqB,EAAE;GAC5D,aAAa,WAAW,eAAe,qBAAqB;GAC7D;;;;;;;;;;;;CAaH,MAAa,eAAe,OAAe;AACzC,UAAQ,MAAM,KAAK,QAAQ,MAAM,EAAE;;;;;;;;;;;;;CAcrC,MAAa,cAAc,OAAe,SAA0B;EAClE,MAAM,UAAU,MAAM,KAAK,OAAO,8BAA8B,WAAW,QAAQ,CAAC,UAAU,EAAE,OAAO,MAAM,CAAC;AAE9G,MAAI,CAAC,QAAQ,cACX,OAAM,IAAI,MAAM,4BAA4B;AAI9C,MAAI,CAAC,QAAQ,cAAc,YAAY,QAAQ,cAAc,SAAS,WAAW,EAC/E,QAAO,EAAE;EAGX,MAAM,iBAAiB,QAAQ,cAAc,SAAS,KAAK,QAAQ;GACjE,KAAK,GAAG;GACR,OAAO,GAAG;GACX,EAAE;AAEH,SAAO,WAAW,eAAe,eAAe;;;;;;;;;;;CAYlD,MAAa,YAAY,OAAmC;AAE1D,UADkB,MAAM,KAAK,OAAO,oBAAoB,MAAM,EAC7C,MAAM,KAAK,MAA4B;AACtD,UAAO;IACL,SAAS,EAAE;IACX,YAAY,OAAO,KAAK,EAAE,KAAK,CAAC,SAAS,SAAS;IAClD,MAAM,OAAO,KAAK,EAAE,KAAK,CAAC,SAAS,QAAQ;IAC5C;IACD;;;;;;;;;;;;CAaJ,MAAa,YAAY,OAAe,SAAuD;EAC7F,MAAM,QAAQ,OAAO,YAAY,YAAY,aAAa,UAAU,QAAQ,UAAU;EACtF,MAAM,OAAO,WAAW,gBAAgB,MAAM,CAAC;AAE/C,UADkB,MAAM,KAAK,OAAO,wBAAwB,OAAO,MAAM,EAAE,KAAK,EAC/D;;;;;;;;;;;;CAanB,MAAa,aAAa,OAAe,UAA8D;AACrG,SAAO,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAO,YAAY,MAAM,KAAK,YAAY,OAAO,QAAQ,CAAC,CAAC;;;;;;;;;;;CAYnG,MAAa,uBAAuB,SAAmD;EACrF,MAAM,EAAE,OAAO,SAAS,SAAS;EACjC,MAAM,QAAQ,MAAM,KAAK,YAAY,OAAO,QAAQ;AACpD,SAAO,KAAK,OAAO,MAAM;;;;;;;;;;;CAY3B,MAAa,wBAAwB,SAAsD;EACzF,MAAM,EAAE,OAAO,UAAU,SAAS;AAClC,SAAO,MAAM,QAAQ,IAAI,SAAS,IAAI,OAAO,YAAY,MAAM,KAAK,uBAAuB;GAAE;GAAO;GAAS;GAAM,CAAC,CAAC,CAAC;;;;;;;;;;;CAYxH,OAAc,gBAAgB,OAA8D;EAC1F,MAAM,MAAM,OAAO,UAAU,YAAY,WAAW,QAAQ,QAAQ;GAAE,OAAO;GAAI,MAAM;GAAO;AAC9F,SAAO;GACL,OAAO,IAAI;GACX,MAAM,OAAO,IAAI,SAAS,WAAW,IAAI,aAAa,CAAC,OAAO,IAAI,KAAK,GAAG,YAAY,IAAI,OAAO,IAAI,OAAO,IAAI,KAAK,KAAK;GAC3H;;;;;;;;;;;;CAaH,OAAc,eAAe,OAAsE;EACjG,MAAM,cAAc,EAAE;AAGtB,OAAK,MAAM,YAAY,OAAO;GAC5B,MAAM,YAAY,OAAO,KAAK,SAAS,IAAI,CAAC,SAAS,SAAS;GAC9D,MAAM,SAAS,SAAS;GACxB,MAAM,MAAM,OAAO,KAAK,SAAS,IAAI,CAAC,SAAS,QAAQ;GACvD,MAAM,YAAY,SAAS;GAE3B,MAAM,eAAe,OAAO,YAAY,YAAY,UAAU,SAAS,UAAU,KAAK;GACtF,IAAIA;GACJ,IAAIC;AACJ,WAAQ,cAAR;IACE,KAAK;AACH,mBACE,OAAO,UAAU,UAAU,WAAW,UAAU,QAAQ,UAAU,QAAQ,OAAO,KAAK,UAAU,MAAM,CAAC,SAAS,SAAS,GAAG;AAC9H,gBAAW,OAAO,KAAK,aAAa,SAAS;AAC7C,iBAAY,OAAO;MACjB;MACA;MACA,UAAU,IAAI,WAAW,SAAS;MACrB;MACb,OAAO,SAAS,SAAS,QAAQ;MAClC;AACD;IACF,KAAK,GAAG;KACN,MAAM,QAAQ,UAAU,QAAQ;AAChC,iBAAY,OAAO;MACjB;MACA;MACA,OAAO,OAAO,MAAM;MACrB;AACD;;IAEF,QACE,OAAM,IAAI,MAAM,uCAAuC,eAAe;;;AAI5E,SAAO;;;;;;;;;;;;CAaT,OAAc,aAAa,cAA0C,QAAsD;AACzH,MAAI,CAAC,UAAU,OAAO,QAAQ,SAAS,OACrC;AAGF,MAAI;GACF,MAAM,OAAO,aAAa,QAAQ,EAAE;AACpC,OAAI,KAAK,WAAW,EAClB,OAAM,IAAI,MAAM,kDAAkD;GAEpE,MAAM,UAAU,KAAK,KAAK,SAAS;AACnC,OAAI,CAAC,WAAW,mBAAmB,QAAQ,CACzC,OAAM,IAAI,MAAM,uDAAuD;GAGzE,MAAM,iBAAiB,IAAI,WAAW,QAAQ,MAAM,EAAE,CAAC;AACvD,UAAO;IACG;IACR;IACA,aAAa;IACb,aAAa,OAAO,QAAQ,KAAK,OAAO,eAAe;IACxD;WACM,KAAK;AACZ,UAAO;IACG;IACR,gBAAgB;IAChB,aAAa;IACb,aAAa;IACd;;;CAIL,OAAe,mBAAmB,KAA0B;AAC1D,MAAI,IAAI,SAAS,kBAAkB,OACjC,QAAO;AAET,OAAK,IAAI,IAAI,GAAG,IAAI,kBAAkB,QAAQ,IAC5C,KAAI,IAAI,OAAO,kBAAkB,GAC/B,QAAO;AAGX,SAAO;;;;;;;;;;;;;;;;;;;CAoBT,OAAO,2CAA2C,kBAA0B,QAAsD;AAChI,MAAI,OAAO,cAAc,QAAW;AAClC,OAAI,CAAC,iBAAiB,SAAS,wBAAwB,CACrD,OAAM,IAAI,MACR,sEAAsE,wBAAwB,2BAC/F;AAEH,sBAAmB,wBAAwB,kBAAkB,0BAA0B,OAAO,YAAY,IAAI,GAAG,UAAU,CAAC;;AAG9H,MAAI,OAAO,cAAc,QAAW;AAClC,OAAI,CAAC,iBAAiB,SAAS,wBAAwB,CACrD,OAAM,IAAI,MACR,sEAAsE,wBAAwB,2BAC/F;AAEH,sBAAmB,wBAAwB,kBAAkB,0BAA0B,OAAO,YAAY,IAAI,GAAG,UAAU,CAAC;;AAG9H,SAAO;;;;;;;;;;;;;;;CAgBT,OAAO,0BAA0B,kBAA0B,gBAAqC;AAC9F,MAAI,mBAAmB,OACrB,MAAK,MAAM,OAAO,gBAAgB;GAChC,MAAM,QAAQ,eAAe;GAC7B,MAAM,QAAQ,QAAQ,IAAI,QAAQ,UAAU,GAAG;AAI/C,OAAI,OAAO,UAAU,YAAY,OAAO,UAAU,SAChD,oBAAmB,iBAAiB,QAAQ,IAAI,OAAO,cAAc,SAAS,IAAI,EAAE,KAAK,MAAM,SAAS,GAAG,CAAC,SAAS,IAAI,IAAI,GAAG;AAKlI,sBAAmB,wBACjB,kBACA,OACA,OAAO,UAAU,WACb,KAAK,OAAO,KAAK,OAAO,QAAQ,CAAC,SAAS,MAAM,KAChD,YAAY,OAAO,MAAM,GACvB,KAAK,OAAO,KAAK,MAAM,CAAC,SAAS,MAAM,KACvC,MAAM,UAAU,CACvB;;AAIL,SAAO;;;;;;;;;;;;CAaT,OAAO,kBAAkB,UAAkB;EACzC,MAAM,wBAAwB,SAAiB;GAC7C,MAAM,eAAe,mBAAmB,MAAM,KAAK;AACnD,OAAI,iBAAiB,OACnB,QAAO;AAET,UAAO,KAAK,MAAM,GAAG,aAAa,CAAC,SAAS;;AAG9C,SAAO,SACJ,MAAM,KAAK,CACX,KAAK,SAAS,qBAAqB,KAAK,CAAC,CACzC,KAAK,KAAK;;;;;;;AAQjB,MAAM,sBAAsB,MAAc,OAAe,aAAqB,GAAG,cAA2C;CAC1H,MAAM,WAAW,cAAc,SAAY,KAAK,SAAS;CACzD,IAAI,QAAQ;CACZ,IAAI,WAAW;CACf,IAAI,WAAW;AAEf,QAAO,QAAQ,UAAU;EACvB,MAAM,cAAc,KAAK;AACzB,OAAK,gBAAgB,OAAO,gBAAgB,QAAQ,CAAC,YAAY,gBAAgB,MAAM,MAAM,CAE3F,YAAW;YACD,gBAAgB,OAAO,gBAAgB,QAAQ,CAAC,YAAY,SAEtE,YAAW;WACF,gBAAgB,QAAQ,SAEjC,UAAS;WACA,gBAAgB,KAEzB,YAAW,CAAC;WACH,CAAC,YAAY,CAAC,YAAY,KAAK,WAAW,OAAO,MAAM,CAEhE,QAAO;AAET,WAAS;;;AAKb,MAAM,mBAAmB,MAAc,UAA2B;AAChE,KAAI;EACF,MAAM,SAAS,KAAK,MAAM,GAAG,MAAM,CAAC,MAAM,MAAM;EAChD,MAAM,OAAO,OAAO,OAAO,SAAS;AACpC,SAAO,CAAC,UAAU,MAAM,CAAC,SAAS,KAAK;SACjC;AACN,SAAO;;;AAIX,SAAS,wBAAwB,SAAiB,OAAe,aAA6B;CAC5F,MAAMC,SAAmB,EAAE;CAC3B,MAAM,mBAAmB,YAAY,SAAS,MAAM;CAEpD,MAAM,eAAe,QAAQ,MAAM,KAAK;AAExC,MAAK,MAAM,QAAQ,cAAc;EAC/B,MAAM,gBAAgB,mBAAmB,MAAM,KAAK;EACpD,MAAM,eAAe,kBAAkB,SAAY,KAAK,SAAS;EACjE,IAAI,OAAO,KAAK,UAAU,GAAG,aAAa;EAC1C,MAAM,UAAU,KAAK,UAAU,aAAa;EAC5C,IAAI,gBAAgB;AAEpB,SAAO,MAAM;GACX,MAAM,aAAa,kBAAkB,MAAM,OAAO,cAAc;AAChE,OAAI,eAAe,OACjB;AAEF,mBAAgB,aAAa,MAAM;AAGnC,UAAO,GAFQ,KAAK,UAAU,GAAG,WAAW,GAEzB,cADJ,KAAK,UAAU,cAAc;AAE5C,oBAAiB;;AAEnB,SAAO,KAAK,OAAO,QAAQ;;AAG7B,QAAO,OAAO,KAAK,KAAK;;AAG1B,MAAM,qBAAqB,MAAc,OAAe,aAAqB,GAAG,cAA2C;CACzH,MAAM,WAAW,cAAc,SAAY,KAAK,SAAS;CAEzD,IAAI,QAAQ;AACZ,QAAO,QAAQ,UAAU;EACvB,MAAM,aAAa,mBAAmB,MAAM,OAAO,OAAO,SAAS;AACnE,MAAI,eAAe,OACjB;EAEF,MAAM,gBAAgB,aAAa,MAAM;AACzC,OACG,eAAe,KAAK,CAAC,sBAAsB,KAAK,aAAa,GAAG,MAChE,iBAAiB,KAAK,UAAU,CAAC,sBAAsB,KAAK,eAAe,EAE5E,QAAO;AAET,UAAQ;;;AAKZ,SAAS,sBAAsB,MAAuB;AACpD,QAAO,KAAK,WAAW,MAAM,KAAK,KAAK,KAAK,IAAI,SAAS"}
|
|
1
|
+
{"version":3,"file":"app-manager.mjs","names":["valueBase64: string","valueRaw: Buffer","result: string[]"],"sources":["../../src/types/app-manager.ts"],"sourcesContent":["import { ABIMethod, ABIReturn, ABIType, ABIValue } from '@algorandfoundation/algokit-abi'\nimport { AlgodClient, EvalDelta, PendingTransactionResponse, TealValue } from '@algorandfoundation/algokit-algod-client'\nimport { Address, ReadableAddress, getAddress, getApplicationAddress } from '@algorandfoundation/algokit-common'\nimport { AddressWithTransactionSigner, BoxReference as TransactionBoxReference } from '@algorandfoundation/algokit-transact'\nimport { ProgramSourceMap } from '@algorandfoundation/sdk'\nimport {\n ABI_RETURN_PREFIX,\n BoxName,\n DELETABLE_TEMPLATE_NAME,\n UPDATABLE_TEMPLATE_NAME,\n type AppState,\n type CompiledTeal,\n type TealTemplateParams,\n} from './app'\n\n/** Information about an app. */\nexport interface AppInformation {\n /** The ID of the app. */\n appId: bigint\n /** The escrow address that the app operates with. */\n appAddress: Address\n /**\n * Approval program.\n */\n approvalProgram: Uint8Array\n /**\n * Clear state program.\n */\n clearStateProgram: Uint8Array\n /**\n * The address that created this application. This is the address where the\n * parameters and global state for this application can be found.\n */\n creator: Address\n /**\n * Current global state values.\n */\n globalState: AppState\n /** The number of allocated ints in per-user local state. */\n localInts: number\n /** The number of allocated byte slices in per-user local state. */\n localByteSlices: number\n /** The number of allocated ints in global state. */\n globalInts: number\n /** The number of allocated byte slices in global state. */\n globalByteSlices: number\n /** Any extra pages that are needed for the smart contract. */\n extraProgramPages?: number\n}\n\n/**\n * Something that identifies an app box name - either a:\n * * `Uint8Array` (the actual binary of the box name)\n * * `string` (that will be encoded to a `Uint8Array`)\n * * `AddressWithSigner` (that will be encoded into the\n * public key address of the corresponding account)\n */\nexport type BoxIdentifier = string | Uint8Array | AddressWithTransactionSigner\n\n/**\n * A grouping of the app ID and name identifier to reference an app box.\n */\nexport interface BoxReference {\n /**\n * A unique application id\n */\n appId: bigint\n /**\n * Identifier for a box name\n */\n name: BoxIdentifier\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValueRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The name of the box to return either as a string, binary array or `BoxName` */\n boxName: BoxIdentifier\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/**\n * Parameters to get and decode a box value as an ABI type.\n */\nexport interface BoxValuesRequestParams {\n /** The ID of the app return box names for */\n appId: bigint\n /** The names of the boxes to return either as a string, binary array or BoxName` */\n boxNames: BoxIdentifier[]\n /** The ABI type to decode the value using */\n type: ABIType\n}\n\n/** Allows management of application information. */\nexport class AppManager {\n private _algod: AlgodClient\n private _compilationResults: Record<string, CompiledTeal> = {}\n\n /**\n * Creates an `AppManager`\n * @param algod An algod instance\n */\n constructor(algod: AlgodClient) {\n this._algod = algod\n }\n\n /**\n * Compiles the given TEAL using algod and returns the result, including source map.\n *\n * The result of this compilation is also cached keyed by the TEAL\n * code so it can be retrieved via `getCompilationResult`.\n *\n * This function is re-entrant; it will only compile the same code once.\n *\n * @param tealCode The TEAL code\n * @returns The information about the compiled file\n * @example\n * ```typescript\n * const compiled = await appManager.compileTeal(tealProgram)\n * ```\n */\n async compileTeal(tealCode: string): Promise<CompiledTeal> {\n if (this._compilationResults[tealCode]) {\n return this._compilationResults[tealCode]\n }\n\n const compiled = await this._algod.tealCompile(tealCode, { sourcemap: true })\n const result = {\n teal: tealCode,\n compiled: compiled.result,\n compiledHash: compiled.hash,\n compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),\n sourceMap: new ProgramSourceMap(compiled.sourcemap as { version: number; sources: string[]; names: string[]; mappings: string }),\n }\n this._compilationResults[tealCode] = result\n\n return result\n }\n\n /**\n * Performs template substitution of a teal template and compiles it, returning the compiled result.\n *\n * Looks for `TMPL_{parameter}` for template replacements and replaces AlgoKit deploy-time control parameters\n * if deployment metadata is specified.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * @param tealTemplateCode The TEAL logic to compile\n * @param templateParams Any parameters to replace in the .teal file before compiling\n * @param deploymentMetadata The deployment metadata the app will be deployed with\n * @returns The information about the compiled code\n * @example\n * ```typescript\n * const compiled = await appManager.compileTealTemplate(tealTemplate, { TMPL_APP_ID: 12345n }, { updatable: true, deletable: false })\n * ```\n */\n async compileTealTemplate(\n tealTemplateCode: string,\n templateParams?: TealTemplateParams,\n deploymentMetadata?: { updatable?: boolean; deletable?: boolean },\n ): Promise<CompiledTeal> {\n let tealCode = AppManager.stripTealComments(tealTemplateCode)\n\n tealCode = AppManager.replaceTealTemplateParams(tealCode, templateParams)\n\n if (deploymentMetadata) {\n tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealCode, deploymentMetadata)\n }\n\n return await this.compileTeal(tealCode)\n }\n\n /**\n * Returns a previous compilation result.\n * @param tealCode The TEAL code\n * @returns The information about the previously compiled file\n * or `undefined` if that TEAL code wasn't previously compiled\n * @example\n * ```typescript\n * const compiled = appManager.getCompilationResult(tealProgram)\n * ```\n */\n getCompilationResult(tealCode: string): CompiledTeal | undefined {\n return this._compilationResults[tealCode]\n }\n\n /**\n * Returns the current app information for the app with the given ID.\n *\n * @example\n * ```typescript\n * const appInfo = await appManager.getById(12353n);\n * ```\n *\n * @param appId The ID of the app\n * @returns The app information\n */\n public async getById(appId: bigint): Promise<AppInformation> {\n const app = await this._algod.getApplicationById(appId)\n const convertedGlobalState = (app.params.globalState ?? []).map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return {\n appId: BigInt(app.id),\n appAddress: getApplicationAddress(app.id),\n approvalProgram: app.params.approvalProgram,\n clearStateProgram: app.params.clearStateProgram,\n creator: app.params.creator,\n localInts: Number(app.params.localStateSchema?.numUint ?? 0),\n localByteSlices: Number(app.params.localStateSchema?.numByteSlice ?? 0),\n globalInts: Number(app.params.globalStateSchema?.numUint ?? 0),\n globalByteSlices: Number(app.params.globalStateSchema?.numByteSlice ?? 0),\n extraProgramPages: Number(app.params.extraProgramPages ?? 0),\n globalState: AppManager.decodeAppState(convertedGlobalState),\n }\n }\n\n /**\n * Returns the current global state values for the given app ID and account address\n *\n * @param appId The ID of the app to return global state for\n * @returns The current global state for the given app\n * @example\n * ```typescript\n * const globalState = await appManager.getGlobalState(12353n);\n * ```\n */\n public async getGlobalState(appId: bigint) {\n return (await this.getById(appId)).globalState\n }\n\n /**\n * Returns the current local state values for the given app ID and account address\n *\n * @param appId The ID of the app to return local state for\n * @param address The string address of the account to get local state for the given app\n * @returns The current local state for the given (app, account) combination\n * @example\n * ```typescript\n * const localState = await appManager.getLocalState(12353n, 'ACCOUNTADDRESS');\n * ```\n */\n public async getLocalState(appId: bigint, address: ReadableAddress) {\n const appInfo = await this._algod.accountApplicationInformation(getAddress(address).toString(), Number(appId))\n\n if (!appInfo.appLocalState) {\n throw new Error(\"Couldn't find local state\")\n }\n\n // If keyValue is undefined or empty, return empty state\n if (!appInfo.appLocalState.keyValue || appInfo.appLocalState.keyValue.length === 0) {\n return {}\n }\n\n const convertedState = appInfo.appLocalState.keyValue.map((kv) => ({\n key: kv.key,\n value: kv.value,\n }))\n\n return AppManager.decodeAppState(convertedState)\n }\n\n /**\n * Returns the names of the current boxes for the given app.\n * @param appId The ID of the app return box names for\n * @returns The current box names\n * @example\n * ```typescript\n * const boxNames = await appManager.getBoxNames(12353n);\n * ```\n */\n public async getBoxNames(appId: bigint): Promise<BoxName[]> {\n const boxResult = await this._algod.getApplicationBoxes(appId)\n return boxResult.boxes.map((b: { name: Uint8Array }) => {\n return {\n nameRaw: b.name,\n nameBase64: Buffer.from(b.name).toString('base64'),\n name: Buffer.from(b.name).toString('utf-8'),\n }\n })\n }\n\n /**\n * Returns the value of the given box name for the given app.\n * @param appId The ID of the app return box names for\n * @param boxName The name of the box to return either as a string, binary array or `BoxName`\n * @returns The current box value as a byte array\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValue(12353n, 'boxName');\n * ```\n */\n public async getBoxValue(appId: bigint, boxName: BoxIdentifier | BoxName): Promise<Uint8Array> {\n const boxId = typeof boxName === 'object' && 'nameRaw' in boxName ? boxName.nameRaw : boxName\n const name = AppManager.getBoxReference(boxId).name\n const boxResult = await this._algod.getApplicationBoxByName(Number(appId), name)\n return boxResult.value\n }\n\n /**\n * Returns the value of the given box names for the given app.\n * @param appId The ID of the app return box names for\n * @param boxNames The names of the boxes to return either as a string, binary array or `BoxName`\n * @returns The current box values as a byte array in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValues(12353n, ['boxName1', 'boxName2']);\n * ```\n */\n public async getBoxValues(appId: bigint, boxNames: (BoxIdentifier | BoxName)[]): Promise<Uint8Array[]> {\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValue(appId, boxName)))\n }\n\n /**\n * Returns the value of the given box name for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box value as an ABI value\n * @example\n * ```typescript\n * const boxValue = await appManager.getBoxValueFromABIType({ appId: 12353n, boxName: 'boxName', type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValueFromABIType(request: BoxValueRequestParams): Promise<ABIValue> {\n const { appId, boxName, type } = request\n const value = await this.getBoxValue(appId, boxName)\n return type.decode(value)\n }\n\n /**\n * Returns the value of the given box names for the given app decoded based on the given ABI type.\n * @param request The parameters for the box value request\n * @returns The current box values as an ABI value in the same order as the passed in box names\n * @example\n * ```typescript\n * const boxValues = await appManager.getBoxValuesFromABIType({ appId: 12353n, boxNames: ['boxName1', 'boxName2'], type: new ABIUintType(32) });\n * ```\n */\n public async getBoxValuesFromABIType(request: BoxValuesRequestParams): Promise<ABIValue[]> {\n const { appId, boxNames, type } = request\n return await Promise.all(boxNames.map(async (boxName) => await this.getBoxValueFromABIType({ appId, boxName, type })))\n }\n\n /**\n * Returns a `algosdk.BoxReference` given a `BoxIdentifier` or `BoxReference`.\n * @param boxId The box to return a reference for\n * @returns The box reference ready to pass into a `algosdk.Transaction`\n * @example\n * ```typescript\n * const boxRef = AppManager.getBoxReference('boxName');\n * ```\n */\n public static getBoxReference(boxId: BoxIdentifier | BoxReference): TransactionBoxReference {\n const ref = typeof boxId === 'object' && 'appId' in boxId ? boxId : { appId: 0n, name: boxId }\n return {\n appId: ref.appId,\n name: typeof ref.name === 'string' ? new TextEncoder().encode(ref.name) : 'length' in ref.name ? ref.name : ref.name.addr.publicKey,\n } as TransactionBoxReference\n }\n\n /**\n * Converts an array of global/local state values from the algod api to a more friendly\n * generic object keyed by the UTF-8 value of the key.\n * @param state A `global-state`, `local-state`, `global-state-deltas` or `local-state-deltas`\n * @returns An object keyeed by the UTF-8 representation of the key with various parsings of the values\n * @example\n * ```typescript\n * const stateValues = AppManager.decodeAppState(state);\n * ```\n */\n public static decodeAppState(state: { key: Uint8Array; value: TealValue | EvalDelta }[]): AppState {\n const stateValues = {} as AppState\n\n // Start with empty set\n for (const stateVal of state) {\n const keyBase64 = Buffer.from(stateVal.key).toString('base64')\n const keyRaw = stateVal.key\n const key = Buffer.from(stateVal.key).toString('utf-8')\n const tealValue = stateVal.value\n\n const dataTypeFlag = Number('action' in tealValue ? tealValue.action : tealValue.type)\n let valueBase64: string\n let valueRaw: Buffer\n switch (dataTypeFlag) {\n case 1:\n valueBase64 =\n typeof tealValue.bytes === 'string' ? tealValue.bytes : tealValue.bytes ? Buffer.from(tealValue.bytes).toString('base64') : ''\n valueRaw = Buffer.from(valueBase64, 'base64')\n stateValues[key] = {\n keyRaw,\n keyBase64,\n valueRaw: new Uint8Array(valueRaw),\n valueBase64: valueBase64,\n value: valueRaw.toString('utf-8'),\n }\n break\n case 2: {\n const value = tealValue.uint ?? 0\n stateValues[key] = {\n keyRaw,\n keyBase64,\n value: BigInt(value),\n }\n break\n }\n default:\n throw new Error(`Received unknown state data type of ${dataTypeFlag}`)\n }\n }\n\n return stateValues\n }\n\n /**\n * Returns any ABI return values for the given app call arguments and transaction confirmation.\n * @param confirmation The transaction confirmation from algod\n * @param method The ABI method\n * @returns The return value for the method call\n * @example\n * ```typescript\n * const returnValue = AppManager.getABIReturn(confirmation, ABIMethod.fromSignature('hello(string)void'));\n * ```\n */\n public static getABIReturn(confirmation: PendingTransactionResponse | undefined, method: ABIMethod | undefined): ABIReturn | undefined {\n if (!method || !confirmation) {\n return undefined\n }\n\n if (method.returns.type === 'void') {\n return { method, rawReturnValue: undefined, returnValue: undefined }\n }\n\n try {\n const logs = confirmation.logs || []\n if (logs.length === 0) {\n throw new Error(`App call transaction did not log a return value`)\n }\n const lastLog = logs[logs.length - 1]\n if (!AppManager.hasAbiReturnPrefix(lastLog)) {\n throw new Error(`App call transaction did not log an ABI return value`)\n }\n\n const rawReturnValue = new Uint8Array(lastLog.slice(4))\n return {\n method: method,\n rawReturnValue,\n decodeError: undefined,\n returnValue: method.returns.type.decode(rawReturnValue),\n }\n } catch (err) {\n return {\n method: method,\n rawReturnValue: undefined,\n decodeError: err as Error,\n returnValue: undefined,\n }\n }\n }\n\n private static hasAbiReturnPrefix(log: Uint8Array): boolean {\n if (log.length < ABI_RETURN_PREFIX.length) {\n return false\n }\n for (let i = 0; i < ABI_RETURN_PREFIX.length; i++) {\n if (log[i] !== ABI_RETURN_PREFIX[i]) {\n return false\n }\n }\n return true\n }\n\n /**\n * Replaces AlgoKit deploy-time deployment control parameters within the given TEAL template code.\n *\n * * `TMPL_UPDATABLE` for updatability / immutability control\n * * `TMPL_DELETABLE` for deletability / permanence control\n *\n * Note: If these values are defined, but the corresponding `TMPL_*` value\n * isn't in the teal code it will throw an exception.\n *\n * @param tealTemplateCode The TEAL template code to substitute\n * @param params The deploy-time deployment control parameter value to replace\n * @returns The replaced TEAL code\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateDeployTimeControlParams(tealTemplate, { updatable: true, deletable: false });\n * ```\n */\n static replaceTealTemplateDeployTimeControlParams(tealTemplateCode: string, params: { updatable?: boolean; deletable?: boolean }) {\n if (params.updatable !== undefined) {\n if (!tealTemplateCode.includes(UPDATABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time updatability control requested for app deployment, but ${UPDATABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, UPDATABLE_TEMPLATE_NAME, (params.updatable ? 1 : 0).toString())\n }\n\n if (params.deletable !== undefined) {\n if (!tealTemplateCode.includes(DELETABLE_TEMPLATE_NAME)) {\n throw new Error(\n `Deploy-time deletability control requested for app deployment, but ${DELETABLE_TEMPLATE_NAME} not present in TEAL code`,\n )\n }\n tealTemplateCode = replaceTemplateVariable(tealTemplateCode, DELETABLE_TEMPLATE_NAME, (params.deletable ? 1 : 0).toString())\n }\n\n return tealTemplateCode\n }\n\n /**\n * Performs template substitution of a teal file.\n *\n * Looks for `TMPL_{parameter}` for template replacements.\n *\n * @param tealTemplateCode The TEAL template code to make parameter replacements in\n * @param templateParams Any parameters to replace in the teal code\n * @returns The TEAL code with replacements\n * @example\n * ```typescript\n * const tealCode = AppManager.replaceTealTemplateParams(tealTemplate, { TMPL_APP_ID: 12345n });\n * ```\n */\n static replaceTealTemplateParams(tealTemplateCode: string, templateParams?: TealTemplateParams) {\n if (templateParams !== undefined) {\n for (const key in templateParams) {\n const value = templateParams[key]\n const token = `TMPL_${key.replace(/^TMPL_/, '')}`\n\n // If this is a number, first replace any byte representations of the number\n // These may appear in the TEAL in order to circumvent int compression and preserve PC values\n if (typeof value === 'number' || typeof value === 'bigint') {\n tealTemplateCode = tealTemplateCode.replace(new RegExp(`(?<=bytes )${token}`, 'g'), `0x${value.toString(16).padStart(16, '0')}`)\n\n // We could probably return here since mixing pushint and pushbytes is likely not going to happen, but might as well do both\n }\n\n tealTemplateCode = replaceTemplateVariable(\n tealTemplateCode,\n token,\n typeof value === 'string'\n ? `0x${Buffer.from(value, 'utf-8').toString('hex')}`\n : ArrayBuffer.isView(value)\n ? `0x${Buffer.from(value).toString('hex')}`\n : value.toString(),\n )\n }\n }\n\n return tealTemplateCode\n }\n\n /**\n * Remove comments from TEAL code (useful to reduce code size before compilation).\n *\n * @param tealCode The TEAL logic to strip\n * @returns The TEAL without comments\n * @example\n * ```typescript\n * const stripped = AppManager.stripTealComments(tealProgram);\n * ```\n */\n static stripTealComments(tealCode: string) {\n const stripCommentFromLine = (line: string) => {\n const commentIndex = findUnquotedString(line, '//')\n if (commentIndex === undefined) {\n return line\n }\n return line.slice(0, commentIndex).trimEnd()\n }\n\n return tealCode\n .split('\\n')\n .map((line) => stripCommentFromLine(line))\n .join('\\n')\n }\n}\n\n/**\n * Find the first string within a line of TEAL. Only matches outside of quotes and base64 are returned.\n * Returns undefined if not found\n */\nconst findUnquotedString = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n let index = startIndex\n let inQuotes = false\n let inBase64 = false\n\n while (index < endIndex) {\n const currentChar = line[index]\n if ((currentChar === ' ' || currentChar === '(') && !inQuotes && lastTokenBase64(line, index)) {\n // enter base64\n inBase64 = true\n } else if ((currentChar === ' ' || currentChar === ')') && !inQuotes && inBase64) {\n // exit base64\n inBase64 = false\n } else if (currentChar === '\\\\' && inQuotes) {\n // escaped char, skip next character\n index += 1\n } else if (currentChar === '\"') {\n // quote boundary\n inQuotes = !inQuotes\n } else if (!inQuotes && !inBase64 && line.startsWith(token, index)) {\n // can test for match\n return index\n }\n index += 1\n }\n return undefined\n}\n\nconst lastTokenBase64 = (line: string, index: number): boolean => {\n try {\n const tokens = line.slice(0, index).split(/\\s+/)\n const last = tokens[tokens.length - 1]\n return ['base64', 'b64'].includes(last)\n } catch {\n return false\n }\n}\n\nfunction replaceTemplateVariable(program: string, token: string, replacement: string): string {\n const result: string[] = []\n const tokenIndexOffset = replacement.length - token.length\n\n const programLines = program.split('\\n')\n\n for (const line of programLines) {\n const _commentIndex = findUnquotedString(line, '//')\n const commentIndex = _commentIndex === undefined ? line.length : _commentIndex\n let code = line.substring(0, commentIndex)\n const comment = line.substring(commentIndex)\n let trailingIndex = 0\n\n while (true) {\n const tokenIndex = findTemplateToken(code, token, trailingIndex)\n if (tokenIndex === undefined) {\n break\n }\n trailingIndex = tokenIndex + token.length\n const prefix = code.substring(0, tokenIndex)\n const suffix = code.substring(trailingIndex)\n code = `${prefix}${replacement}${suffix}`\n trailingIndex += tokenIndexOffset\n }\n result.push(code + comment)\n }\n\n return result.join('\\n')\n}\n\nconst findTemplateToken = (line: string, token: string, startIndex: number = 0, _endIndex?: number): number | undefined => {\n const endIndex = _endIndex === undefined ? line.length : _endIndex\n\n let index = startIndex\n while (index < endIndex) {\n const tokenIndex = findUnquotedString(line, token, index, endIndex)\n if (tokenIndex === undefined) {\n break\n }\n const trailingIndex = tokenIndex + token.length\n if (\n (tokenIndex === 0 || !isValidTokenCharacter(line[tokenIndex - 1])) &&\n (trailingIndex >= line.length || !isValidTokenCharacter(line[trailingIndex]))\n ) {\n return tokenIndex\n }\n index = trailingIndex\n }\n return undefined\n}\n\nfunction isValidTokenCharacter(char: string): boolean {\n return char.length === 1 && (/\\w/.test(char) || char === '_')\n}\n"],"mappings":"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"}
|
package/types/composer.js
CHANGED
|
@@ -1078,7 +1078,7 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1078
1078
|
if (!this.transactionsWithSigners) {
|
|
1079
1079
|
const suggestedParams = await this.getSuggestedParams();
|
|
1080
1080
|
const builtTransactions = await this._buildTransactions(suggestedParams);
|
|
1081
|
-
this.rawBuildTransactions = builtTransactions.transactions;
|
|
1081
|
+
this.rawBuildTransactions = builtTransactions.transactions.map((txn) => new require_transaction.Transaction({ ...txn }));
|
|
1082
1082
|
const groupAnalysis = (this.composerConfig.coverAppCallInnerTransactionFees || this.composerConfig.populateAppCallResources) && builtTransactions.transactions.some((txn) => txn.type === require_transaction_type.TransactionType.AppCall) ? await this.analyzeGroupRequirements(builtTransactions.transactions, suggestedParams, this.composerConfig) : void 0;
|
|
1083
1083
|
this.populateTransactionAndGroupResources(builtTransactions.transactions, groupAnalysis);
|
|
1084
1084
|
this.transactionsWithSigners = builtTransactions.transactions.map((txn, index) => {
|
|
@@ -1544,11 +1544,8 @@ var TransactionComposer = class TransactionComposer {
|
|
|
1544
1544
|
const confirmation = confirmations[i];
|
|
1545
1545
|
const txn = this.txns[i];
|
|
1546
1546
|
if (txn?.type !== "methodCall") continue;
|
|
1547
|
-
const
|
|
1548
|
-
if (
|
|
1549
|
-
const abiReturn = require_app_manager.AppManager.getABIReturn(confirmation, method);
|
|
1550
|
-
if (abiReturn !== void 0) abiReturns.push(abiReturn);
|
|
1551
|
-
}
|
|
1547
|
+
const abiReturn = require_app_manager.AppManager.getABIReturn(confirmation, txn.data.method);
|
|
1548
|
+
if (abiReturn !== void 0) abiReturns.push(abiReturn);
|
|
1552
1549
|
}
|
|
1553
1550
|
return abiReturns;
|
|
1554
1551
|
}
|