@algorandfoundation/algokit-utils 7.0.0 → 8.0.0-beta.1
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/README.md +14 -3
- package/account/account.d.ts +4 -1
- package/account/account.js +4 -3
- package/account/account.js.map +1 -1
- package/account/account.mjs +5 -4
- package/account/account.mjs.map +1 -1
- package/account/get-dispenser-account.d.ts +1 -1
- package/amount.d.ts +1 -0
- package/amount.js +3 -2
- package/amount.js.map +1 -1
- package/amount.mjs +3 -3
- package/amount.mjs.map +1 -1
- package/app-client.d.ts +4 -4
- package/app-client.js +4 -4
- package/app-client.js.map +1 -1
- package/app-client.mjs +4 -4
- package/app-client.mjs.map +1 -1
- package/app-deploy.js +23 -5
- package/app-deploy.js.map +1 -1
- package/app-deploy.mjs +24 -6
- package/app-deploy.mjs.map +1 -1
- package/app.js +7 -4
- package/app.js.map +1 -1
- package/app.mjs +7 -4
- package/app.mjs.map +1 -1
- package/index.js +1 -1
- package/index.mjs +2 -2
- package/indexer-lookup.d.ts +10 -8
- package/indexer-lookup.js +14 -10
- package/indexer-lookup.js.map +1 -1
- package/indexer-lookup.mjs +14 -10
- package/indexer-lookup.mjs.map +1 -1
- package/network-client.d.ts +1 -7
- package/network-client.js +2 -9
- package/network-client.js.map +1 -1
- package/network-client.mjs +2 -9
- package/network-client.mjs.map +1 -1
- package/package.json +2 -2
- package/testing/_asset.d.ts +2 -1
- package/testing/account.d.ts +4 -3
- package/testing/account.js +8 -2
- package/testing/account.js.map +1 -1
- package/testing/account.mjs +9 -3
- package/testing/account.mjs.map +1 -1
- package/testing/fixtures/algorand-fixture.js +5 -6
- package/testing/fixtures/algorand-fixture.js.map +1 -1
- package/testing/fixtures/algorand-fixture.mjs +5 -6
- package/testing/fixtures/algorand-fixture.mjs.map +1 -1
- package/testing/test-logger.js +7 -1
- package/testing/test-logger.js.map +1 -1
- package/testing/test-logger.mjs +7 -1
- package/testing/test-logger.mjs.map +1 -1
- package/transaction/perform-atomic-transaction-composer-simulate.d.ts +4 -1
- package/transaction/perform-atomic-transaction-composer-simulate.js +14 -10
- package/transaction/perform-atomic-transaction-composer-simulate.js.map +1 -1
- package/transaction/perform-atomic-transaction-composer-simulate.mjs +15 -11
- package/transaction/perform-atomic-transaction-composer-simulate.mjs.map +1 -1
- package/transaction/transaction.d.ts +1 -17
- package/transaction/transaction.js +110 -82
- package/transaction/transaction.js.map +1 -1
- package/transaction/transaction.mjs +112 -83
- package/transaction/transaction.mjs.map +1 -1
- package/transfer/transfer.js +3 -1
- package/transfer/transfer.js.map +1 -1
- package/transfer/transfer.mjs +3 -1
- package/transfer/transfer.mjs.map +1 -1
- package/types/account-manager.d.ts +20 -20
- package/types/account-manager.js +27 -20
- package/types/account-manager.js.map +1 -1
- package/types/account-manager.mjs +28 -21
- package/types/account-manager.mjs.map +1 -1
- package/types/account.d.ts +8 -8
- package/types/account.js +2 -2
- package/types/account.js.map +1 -1
- package/types/account.mjs +3 -3
- package/types/account.mjs.map +1 -1
- package/types/algo-http-client-with-retry.d.ts +1 -2
- package/types/algo-http-client-with-retry.js +33 -3
- package/types/algo-http-client-with-retry.js.map +1 -1
- package/types/algo-http-client-with-retry.mjs +32 -2
- package/types/algo-http-client-with-retry.mjs.map +1 -1
- package/types/algorand-client-transaction-creator.d.ts +11 -11
- package/types/algorand-client-transaction-sender.d.ts +97 -97
- package/types/algorand-client-transaction-sender.js.map +1 -1
- package/types/algorand-client-transaction-sender.mjs.map +1 -1
- package/types/algorand-client.d.ts +3 -3
- package/types/algorand-client.js +1 -1
- package/types/algorand-client.js.map +1 -1
- package/types/algorand-client.mjs +1 -1
- package/types/algorand-client.mjs.map +1 -1
- package/types/app-client.d.ts +280 -279
- package/types/app-client.js +10 -10
- package/types/app-client.js.map +1 -1
- package/types/app-client.mjs +11 -11
- package/types/app-client.mjs.map +1 -1
- package/types/app-deployer.d.ts +4 -4
- package/types/app-deployer.js +22 -23
- package/types/app-deployer.js.map +1 -1
- package/types/app-deployer.mjs +23 -24
- package/types/app-deployer.mjs.map +1 -1
- package/types/app-factory.d.ts +128 -138
- package/types/app-factory.js +4 -3
- package/types/app-factory.js.map +1 -1
- package/types/app-factory.mjs +5 -4
- package/types/app-factory.mjs.map +1 -1
- package/types/app-manager.d.ts +5 -5
- package/types/app-manager.js +11 -15
- package/types/app-manager.js.map +1 -1
- package/types/app-manager.mjs +12 -16
- package/types/app-manager.mjs.map +1 -1
- package/types/app.d.ts +4 -4
- package/types/app.js.map +1 -1
- package/types/app.mjs.map +1 -1
- package/types/asset-manager.d.ts +5 -5
- package/types/asset-manager.js +8 -11
- package/types/asset-manager.js.map +1 -1
- package/types/asset-manager.mjs +8 -11
- package/types/asset-manager.mjs.map +1 -1
- package/types/client-manager.d.ts +2 -9
- package/types/client-manager.js +9 -19
- package/types/client-manager.js.map +1 -1
- package/types/client-manager.mjs +9 -19
- package/types/client-manager.mjs.map +1 -1
- package/types/composer.d.ts +22 -22
- package/types/composer.js +73 -83
- package/types/composer.js.map +1 -1
- package/types/composer.mjs +74 -84
- package/types/composer.mjs.map +1 -1
- package/types/dispenser-client.d.ts +2 -1
- package/types/dispenser-client.js +5 -1
- package/types/dispenser-client.js.map +1 -1
- package/types/dispenser-client.mjs +5 -1
- package/types/dispenser-client.mjs.map +1 -1
- package/types/indexer.d.ts +74 -755
- package/types/indexer.js.map +1 -1
- package/types/indexer.mjs.map +1 -1
- package/types/kmd-account-manager.d.ts +2 -2
- package/types/kmd-account-manager.js.map +1 -1
- package/types/kmd-account-manager.mjs.map +1 -1
- package/types/network-client.d.ts +1 -1
- package/types/network-client.js.map +1 -1
- package/types/network-client.mjs.map +1 -1
- package/types/testing.d.ts +5 -6
- package/types/urlTokenBaseHTTPClient.d.ts +0 -40
- package/types/urlTokenBaseHTTPClient.js +0 -153
- package/types/urlTokenBaseHTTPClient.js.map +0 -1
- package/types/urlTokenBaseHTTPClient.mjs +0 -151
- package/types/urlTokenBaseHTTPClient.mjs.map +0 -1
package/types/app-deployer.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import algosdk from 'algosdk';
|
|
1
|
+
import algosdk, { Address } from 'algosdk';
|
|
2
2
|
import { AlgorandClientTransactionSender } from './algorand-client-transaction-sender';
|
|
3
3
|
import { OnSchemaBreak, OnUpdate, type ABIReturn, type AppDeployMetadata, type SendAppCreateTransactionResult, type SendAppUpdateTransactionResult, type TealTemplateParams } from './app';
|
|
4
4
|
import { AppManager } from './app-manager';
|
|
@@ -50,7 +50,7 @@ export interface AppMetadata extends AppDeployMetadata {
|
|
|
50
50
|
/** The id of the app */
|
|
51
51
|
appId: bigint;
|
|
52
52
|
/** The Algorand address of the account associated with the app */
|
|
53
|
-
appAddress:
|
|
53
|
+
appAddress: Address;
|
|
54
54
|
/** The round the app was created */
|
|
55
55
|
createdRound: bigint;
|
|
56
56
|
/** The last round that the app was updated */
|
|
@@ -63,7 +63,7 @@ export interface AppMetadata extends AppDeployMetadata {
|
|
|
63
63
|
/** A lookup of name -> Algorand app for a creator */
|
|
64
64
|
export interface AppLookup {
|
|
65
65
|
/** The address of the creator associated with this lookup */
|
|
66
|
-
creator: Readonly<
|
|
66
|
+
creator: Readonly<Address>;
|
|
67
67
|
/** A hash map of app name to app metadata */
|
|
68
68
|
apps: {
|
|
69
69
|
[name: string]: AppMetadata;
|
|
@@ -122,5 +122,5 @@ export declare class AppDeployer {
|
|
|
122
122
|
* @param ignoreCache Whether or not to ignore the cache and force a lookup, default: use the cache
|
|
123
123
|
* @returns A name-based lookup of the app metadata
|
|
124
124
|
*/
|
|
125
|
-
getCreatorAppsByName(creatorAddress: string, ignoreCache?: boolean): Promise<AppLookup>;
|
|
125
|
+
getCreatorAppsByName(creatorAddress: string | Address, ignoreCache?: boolean): Promise<AppLookup>;
|
|
126
126
|
}
|
package/types/app-deployer.js
CHANGED
|
@@ -42,7 +42,7 @@ class AppDeployer {
|
|
|
42
42
|
format: 'j',
|
|
43
43
|
});
|
|
44
44
|
// Check for required fields
|
|
45
|
-
if (existingDeployments && existingDeployments.creator !== createParams.sender) {
|
|
45
|
+
if (existingDeployments && existingDeployments.creator.toString() !== createParams.sender.toString()) {
|
|
46
46
|
throw new Error(`Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${createParams.sender}`);
|
|
47
47
|
}
|
|
48
48
|
if (!existingDeployments && !this._indexer) {
|
|
@@ -239,9 +239,10 @@ class AppDeployer {
|
|
|
239
239
|
return { ...existingApp, operationPerformed: 'nothing' };
|
|
240
240
|
}
|
|
241
241
|
updateAppLookup(sender, appMetadata) {
|
|
242
|
-
const
|
|
242
|
+
const s = typeof sender === 'string' ? sender : sender.toString();
|
|
243
|
+
const lookup = this._appLookups.get(s);
|
|
243
244
|
if (!lookup) {
|
|
244
|
-
this._appLookups.set(
|
|
245
|
+
this._appLookups.set(s, { creator: algosdk.Address.fromString(s), apps: { [appMetadata.name]: appMetadata } });
|
|
245
246
|
}
|
|
246
247
|
else {
|
|
247
248
|
lookup.apps[appMetadata.name] = appMetadata;
|
|
@@ -262,8 +263,9 @@ class AppDeployer {
|
|
|
262
263
|
*/
|
|
263
264
|
async getCreatorAppsByName(creatorAddress, ignoreCache) {
|
|
264
265
|
const appLookup = {};
|
|
265
|
-
|
|
266
|
-
|
|
266
|
+
const address = typeof creatorAddress === 'string' ? creatorAddress : creatorAddress.toString();
|
|
267
|
+
if (!ignoreCache && this._appLookups.has(address)) {
|
|
268
|
+
return this._appLookups.get(address);
|
|
267
269
|
}
|
|
268
270
|
if (!this._indexer) {
|
|
269
271
|
throw new Error(`Didn't receive an indexer client when this AppManager was created, but received a call to getCreatorApps`);
|
|
@@ -272,9 +274,9 @@ class AppDeployer {
|
|
|
272
274
|
const createdApps = (await indexerLookup.lookupAccountCreatedApplicationByAddress(this._indexer, creatorAddress))
|
|
273
275
|
.map((a) => {
|
|
274
276
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
275
|
-
return { id:
|
|
277
|
+
return { id: a.id, createdAtRound: a.createdAtRound, deleted: a.deleted };
|
|
276
278
|
})
|
|
277
|
-
.sort((a, b) => a.createdAtRound - b.createdAtRound);
|
|
279
|
+
.sort((a, b) => Number(a.createdAtRound - b.createdAtRound));
|
|
278
280
|
// For each app that account created (in parallel)...
|
|
279
281
|
const apps = await Promise.all(createdApps.map(async (createdApp) => {
|
|
280
282
|
// Find any app transactions for that app in the round it was created (should always just be a single creation transaction)
|
|
@@ -290,14 +292,14 @@ class AppDeployer {
|
|
|
290
292
|
// * also verify the sender to prevent a potential security risk
|
|
291
293
|
const appCreationTransaction = appTransactions.transactions.filter(
|
|
292
294
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
293
|
-
(t) => t
|
|
295
|
+
(t) => t.applicationTransaction?.applicationId === 0n && t.sender.toString() === creatorAddress.toString())[0];
|
|
294
296
|
const latestAppUpdateTransaction = appTransactions.transactions
|
|
295
|
-
.filter((t) => t.sender === creatorAddress)
|
|
296
|
-
.sort((a, b) => a
|
|
297
|
+
.filter((t) => t.sender.toString() === creatorAddress.toString())
|
|
298
|
+
.sort((a, b) => a.confirmedRound === b.confirmedRound
|
|
297
299
|
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
298
|
-
(b
|
|
300
|
+
(b.intraRoundOffset - a.intraRoundOffset) / 10
|
|
299
301
|
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
300
|
-
b
|
|
302
|
+
Number(b.confirmedRound - a.confirmedRound))[0];
|
|
301
303
|
if (!appCreationTransaction?.note)
|
|
302
304
|
// No note; ignoring
|
|
303
305
|
return null;
|
|
@@ -313,25 +315,22 @@ class AppDeployer {
|
|
|
313
315
|
// No note; ignoring...
|
|
314
316
|
return;
|
|
315
317
|
}
|
|
316
|
-
|
|
317
|
-
const noteAsBase64 = decoder.decode(Buffer.from(note));
|
|
318
|
-
const noteAsString = Buffer.from(noteAsBase64, 'base64').toString('utf-8');
|
|
319
|
-
if (!noteAsString.startsWith(`${types_app.APP_DEPLOY_NOTE_DAPP}:j{`))
|
|
318
|
+
if (!note.startsWith(`${types_app.APP_DEPLOY_NOTE_DAPP}:j{`))
|
|
320
319
|
// Clearly not APP_DEPLOY JSON; ignoring...
|
|
321
320
|
return;
|
|
322
|
-
return JSON.parse(
|
|
321
|
+
return JSON.parse(note.substring(types_app.APP_DEPLOY_NOTE_DAPP.length + 2));
|
|
323
322
|
};
|
|
324
323
|
try {
|
|
325
|
-
const creationNote = parseNote(appCreationTransaction.note);
|
|
326
|
-
const updateNote = parseNote(latestAppUpdateTransaction.note);
|
|
324
|
+
const creationNote = parseNote(appCreationTransaction.note ? Buffer.from(appCreationTransaction.note).toString('utf-8') : undefined);
|
|
325
|
+
const updateNote = parseNote(latestAppUpdateTransaction.note ? Buffer.from(latestAppUpdateTransaction.note).toString('utf-8') : undefined);
|
|
327
326
|
if (creationNote?.name) {
|
|
328
327
|
appLookup[creationNote.name] = {
|
|
329
328
|
appId: createdApp.id,
|
|
330
329
|
appAddress: algosdk.getApplicationAddress(createdApp.id),
|
|
331
330
|
createdMetadata: creationNote,
|
|
332
|
-
createdRound:
|
|
331
|
+
createdRound: appCreationTransaction.confirmedRound ?? 0n,
|
|
333
332
|
...(updateNote ?? creationNote),
|
|
334
|
-
updatedRound:
|
|
333
|
+
updatedRound: latestAppUpdateTransaction?.confirmedRound ?? 0n,
|
|
335
334
|
deleted: createdApp.deleted ?? false,
|
|
336
335
|
};
|
|
337
336
|
}
|
|
@@ -342,10 +341,10 @@ class AppDeployer {
|
|
|
342
341
|
}
|
|
343
342
|
});
|
|
344
343
|
const lookup = {
|
|
345
|
-
creator: creatorAddress,
|
|
344
|
+
creator: typeof creatorAddress === 'string' ? algosdk.Address.fromString(creatorAddress) : creatorAddress,
|
|
346
345
|
apps: appLookup,
|
|
347
346
|
};
|
|
348
|
-
this._appLookups.set(creatorAddress, lookup);
|
|
347
|
+
this._appLookups.set(creatorAddress.toString(), lookup);
|
|
349
348
|
return lookup;
|
|
350
349
|
}
|
|
351
350
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app-deployer.js","sources":["../../src/types/app-deployer.ts"],"sourcesContent":["import algosdk from 'algosdk'\nimport { Config } from '../config'\nimport * as indexer from '../indexer-lookup'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport {\n APP_DEPLOY_NOTE_DAPP,\n OnSchemaBreak,\n OnUpdate,\n type ABIReturn,\n type AppDeployMetadata,\n type SendAppCreateTransactionResult,\n type SendAppUpdateTransactionResult,\n type TealTemplateParams,\n} from './app'\nimport { AppManager } from './app-manager'\nimport {\n AppCreateMethodCall,\n AppCreateParams,\n AppDeleteMethodCall,\n AppDeleteParams,\n AppUpdateMethodCall,\n AppUpdateParams,\n TransactionComposer,\n} from './composer'\nimport { Expand } from './expand'\nimport { ConfirmedTransactionResult, SendParams } from './transaction'\n\n/** Params to specify an update transaction for an app deployment */\nexport type DeployAppUpdateParams = Expand<Omit<AppUpdateParams, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify an update method call for an app deployment */\nexport type DeployAppUpdateMethodCall = Expand<Omit<AppUpdateMethodCall, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify a transaction for an app deployment */\nexport type DeployAppDeleteParams = Expand<Omit<AppDeleteParams, 'appId'>>\n/** Params to specify a delete method call for an app deployment */\nexport type DeployAppDeleteMethodCall = Expand<Omit<AppDeleteMethodCall, 'appId'>>\n\n/** The parameters to idempotently deploy an app */\nexport type AppDeployParams = Expand<\n SendParams & {\n /** The deployment metadata */\n metadata: AppDeployMetadata\n /** Any deploy-time parameters to replace in the TEAL code before compiling it (used if teal code is passed in as a string) */\n deployTimeParams?: TealTemplateParams\n /** What action to perform if a schema break (storage schema or extra pages change) is detected:\n *\n * * `fail` - Fail the deployment (throw an error, **default**)\n * * `replace` - Delete the old app and create a new one\n * * `append` - Deploy a new app and leave the old one as is\n */\n onSchemaBreak?: 'replace' | 'fail' | 'append' | OnSchemaBreak\n /** What action to perform if a TEAL code update is detected:\n *\n * * `fail` - Fail the deployment (throw an error, **default**)\n * * `update` - Update the app with the new TEAL code\n * * `replace` - Delete the old app and create a new one\n * * `append` - Deploy a new app and leave the old one as is\n */\n onUpdate?: 'update' | 'replace' | 'fail' | 'append' | OnUpdate\n /** Create transaction parameters to use if a create needs to be issued as part of deployment */\n createParams: AppCreateParams | AppCreateMethodCall\n /** Update transaction parameters to use if an update needs to be issued as part of deployment */\n updateParams: DeployAppUpdateParams | DeployAppUpdateMethodCall\n /** Delete transaction parameters to use if a delete needs to be issued as part of deployment */\n deleteParams: DeployAppDeleteParams | DeployAppDeleteMethodCall\n /** Optional cached value of the existing apps for the given creator; use this to avoid an indexer lookup */\n existingDeployments?: AppLookup\n /** Whether or not to ignore the app metadata cache and force a lookup, default: use the cache **/\n ignoreCache?: boolean\n }\n>\n\n/** The metadata that can be collected about a deployed app */\nexport interface AppMetadata extends AppDeployMetadata {\n /** The id of the app */\n appId: bigint\n /** The Algorand address of the account associated with the app */\n appAddress: string\n /** The round the app was created */\n createdRound: bigint\n /** The last round that the app was updated */\n updatedRound: bigint\n /** The metadata when the app was created */\n createdMetadata: AppDeployMetadata\n /** Whether or not the app is deleted */\n deleted: boolean\n}\n\n/** A lookup of name -> Algorand app for a creator */\nexport interface AppLookup {\n /** The address of the creator associated with this lookup */\n creator: Readonly<string>\n /** A hash map of app name to app metadata */\n apps: {\n [name: string]: AppMetadata\n }\n}\n\nexport type AppDeployResult =\n | Expand<{ operationPerformed: 'create' } & Omit<AppMetadata, 'appId' | 'appAddress'> & SendAppCreateTransactionResult>\n | Expand<{ operationPerformed: 'update' } & AppMetadata & SendAppUpdateTransactionResult>\n | Expand<\n { operationPerformed: 'replace' } & Omit<AppMetadata, 'appId' | 'appAddress'> &\n SendAppCreateTransactionResult & {\n deleteReturn?: ABIReturn\n deleteResult: ConfirmedTransactionResult\n }\n >\n | Expand<{ operationPerformed: 'nothing' } & AppMetadata>\n\n/** Allows management of deployment and deployment metadata of applications. */\nexport class AppDeployer {\n private _appManager: AppManager\n private _transactionSender: AlgorandClientTransactionSender\n private _indexer?: algosdk.Indexer\n private _appLookups = new Map<string, AppLookup>()\n\n /**\n * Creates an `AppManager`\n * @param appManager An `AppManager` instance\n * @param transactionSender An `AlgorandClientTransactionSender` instance\n * @param indexer An optional indexer instance; supply if you want to indexer to look up app metadata\n */\n constructor(appManager: AppManager, transactionSender: AlgorandClientTransactionSender, indexer?: algosdk.Indexer) {\n this._appManager = appManager\n this._transactionSender = transactionSender\n this._indexer = indexer\n }\n\n /**\n * Idempotently deploy (create if not exists, update if changed) an app against the given name for the given creator account, including deploy-time TEAL template placeholder substitutions (if specified).\n *\n * To understand the architecture decisions behind this functionality please see https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md\n *\n * **Note:** When using the return from this function be sure to check `operationPerformed` to get access to various return properties like `transaction`, `confirmation` and `deleteResult`.\n *\n * **Note:** if there is a breaking state schema change to an existing app (and `onSchemaBreak` is set to `'replace'`) the existing app will be deleted and re-created.\n *\n * **Note:** if there is an update (different TEAL code) to an existing app (and `onUpdate` is set to `'replace'`) the existing app will be deleted and re-created.\n * @param deployment The arguments to control the app deployment\n * @returns The app reference of the new/existing app\n */\n async deploy(deployment: AppDeployParams): Promise<AppDeployResult> {\n const {\n metadata,\n deployTimeParams,\n onSchemaBreak,\n onUpdate,\n createParams,\n updateParams,\n deleteParams,\n existingDeployments,\n ignoreCache,\n ...sendParams\n } = deployment\n\n // Set creation note\n\n createParams.note = updateParams.note = TransactionComposer.arc2Note({\n dAppName: APP_DEPLOY_NOTE_DAPP,\n data: metadata,\n format: 'j',\n })\n\n // Check for required fields\n\n if (existingDeployments && existingDeployments.creator !== createParams.sender) {\n throw new Error(\n `Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${createParams.sender}`,\n )\n }\n if (!existingDeployments && !this._indexer) {\n throw new Error(\n `Didn't receive an indexer client when this AppManager was created, but also didn't receive an existingDeployments cache - one of them must be provided`,\n )\n }\n\n Config.getLogger(sendParams?.suppressLog).info(\n `Idempotently deploying app \"${metadata.name}\" from creator ${createParams.sender} using ${createParams.approvalProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'} and ${createParams.clearStateProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'}`,\n )\n\n // Compile code if required\n\n const compiledApproval =\n typeof createParams.approvalProgram === 'string'\n ? await this._appManager.compileTealTemplate(createParams.approvalProgram, deployTimeParams, metadata)\n : undefined\n const approvalProgram = compiledApproval ? compiledApproval.compiledBase64ToBytes : createParams.approvalProgram\n\n const compiledClear =\n typeof createParams.clearStateProgram === 'string'\n ? await this._appManager.compileTealTemplate(createParams.clearStateProgram, deployTimeParams)\n : undefined\n const clearStateProgram = compiledClear ? compiledClear.compiledBase64ToBytes : createParams.clearStateProgram\n\n // Define routines for create, update, and replace\n\n const createApp = async () => {\n const result = await ('method' in createParams\n ? this._transactionSender.appCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram, ...sendParams })\n : this._transactionSender.appCreate({ ...createParams, approvalProgram, clearStateProgram, ...sendParams }))\n const appMetadata: AppMetadata = {\n appId: result.appId,\n appAddress: result.appAddress,\n ...metadata,\n createdMetadata: metadata,\n createdRound: BigInt(result.confirmation.confirmedRound!),\n updatedRound: BigInt(result.confirmation.confirmedRound!),\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n return {\n operationPerformed: 'create',\n compiledApproval,\n compiledClear,\n ...result,\n ...appMetadata,\n } satisfies SendAppCreateTransactionResult & AppMetadata & { operationPerformed: 'create' }\n }\n const updateApp = async (existingApp: AppMetadata) => {\n Config.getLogger(sendParams?.suppressLog).info(\n `Updating existing ${metadata.name} app for ${createParams.sender} to version ${metadata.version}.`,\n )\n const result = await ('method' in updateParams\n ? this._transactionSender.appUpdateMethodCall({\n appId: existingApp.appId,\n approvalProgram,\n clearStateProgram,\n ...updateParams,\n ...sendParams,\n })\n : this._transactionSender.appUpdate({\n appId: existingApp.appId,\n approvalProgram,\n clearStateProgram,\n ...updateParams,\n ...sendParams,\n }))\n const appMetadata: AppMetadata = {\n appId: existingApp.appId,\n appAddress: existingApp.appAddress,\n createdMetadata: existingApp.createdMetadata,\n createdRound: existingApp.createdRound,\n updatedRound: BigInt(result.confirmation.confirmedRound!),\n ...metadata,\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n return {\n operationPerformed: 'update',\n compiledApproval,\n compiledClear,\n ...result,\n ...appMetadata,\n } satisfies SendAppUpdateTransactionResult & AppMetadata & { operationPerformed: 'update' }\n }\n const replaceApp = async (existingApp: AppMetadata) => {\n Config.getLogger(sendParams?.suppressLog).info(\n `Deploying a new ${metadata.name} app for ${createParams.sender}; deploying app with version ${metadata.version}.`,\n )\n\n Config.getLogger(sendParams?.suppressLog).warn(\n `Deleting existing ${metadata.name} app with id ${existingApp.appId} from ${deleteParams.sender} account.`,\n )\n\n const composer = this._transactionSender.newGroup()\n if ('method' in createParams) {\n composer.addAppCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram })\n } else {\n composer.addAppCreate({ ...createParams, approvalProgram, clearStateProgram })\n }\n const createIndex = await composer.count()\n if ('method' in deleteParams) {\n composer.addAppDeleteMethodCall({ appId: existingApp.appId, ...deleteParams })\n } else {\n composer.addAppDelete({ appId: existingApp.appId, ...deleteParams })\n }\n const result = await composer.send({ ...sendParams, suppressLog: true })\n const confirmation = result.confirmations.at(createIndex - 1)!\n const transaction = result.transactions.at(createIndex - 1)!\n const deleteTransaction = result.transactions.at(-1)!\n\n Config.getLogger(sendParams?.suppressLog).warn(\n `Sent transactions ${transaction.txID()} to create app with id ${confirmation.applicationIndex} and ${deleteTransaction.txID()} to delete app with id ${\n existingApp.appId\n } from ${createParams.sender} account.`,\n )\n\n const appMetadata: AppMetadata = {\n appId: BigInt(confirmation.applicationIndex!),\n appAddress: algosdk.getApplicationAddress(confirmation.applicationIndex!),\n ...metadata,\n createdMetadata: metadata,\n createdRound: BigInt(confirmation.confirmedRound!),\n updatedRound: BigInt(confirmation.confirmedRound!),\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n\n return {\n operationPerformed: 'replace',\n ...result,\n compiledApproval,\n compiledClear,\n transaction,\n confirmation,\n return: 'method' in createParams ? result.returns?.[0] : undefined,\n deleteReturn: 'method' in deleteParams ? result.returns?.at(-1) : undefined,\n ...appMetadata,\n deleteResult: { transaction: deleteTransaction, confirmation: result.confirmations.at(-1)! },\n } satisfies { operationPerformed: 'replace' } & AppMetadata &\n SendAppCreateTransactionResult & {\n deleteReturn?: ABIReturn\n deleteResult: ConfirmedTransactionResult\n }\n }\n\n // Lookup existing app metadata\n\n const apps = existingDeployments ?? (await this.getCreatorAppsByName(createParams.sender, ignoreCache))\n\n const existingApp = apps.apps[metadata.name]\n if (!existingApp || existingApp.deleted) {\n Config.getLogger(sendParams?.suppressLog).info(\n `App ${metadata.name} not found in apps created by ${createParams.sender}; deploying app with version ${metadata.version}.`,\n )\n\n return await createApp()\n }\n\n Config.getLogger(sendParams?.suppressLog).info(\n `Existing app ${metadata.name} found by creator ${createParams.sender}, with app id ${existingApp.appId} and version ${existingApp.version}.`,\n )\n\n const existingAppRecord = await this._appManager.getById(existingApp.appId)\n const existingApproval = Buffer.from(existingAppRecord.approvalProgram).toString('base64')\n const existingClear = Buffer.from(existingAppRecord.clearStateProgram).toString('base64')\n\n const newApproval = Buffer.from(approvalProgram).toString('base64')\n const newClear = Buffer.from(clearStateProgram).toString('base64')\n\n // Check for changes\n\n const isUpdate = newApproval !== existingApproval || newClear !== existingClear\n const isSchemaBreak =\n existingAppRecord.localInts < (createParams.schema?.localInts ?? 0) ||\n existingAppRecord.globalInts < (createParams.schema?.globalInts ?? 0) ||\n existingAppRecord.localByteSlices < (createParams.schema?.localByteSlices ?? 0) ||\n existingAppRecord.globalByteSlices < (createParams.schema?.globalByteSlices ?? 0)\n\n if (isSchemaBreak) {\n Config.getLogger(sendParams?.suppressLog).warn(`Detected a breaking app schema change in app ${existingApp.appId}:`, {\n from: {\n globalInts: existingAppRecord.globalInts,\n globalByteSlices: existingAppRecord.globalByteSlices,\n localInts: existingAppRecord.localInts,\n localByteSlices: existingAppRecord.localByteSlices,\n },\n to: createParams.schema,\n })\n\n if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === OnSchemaBreak.Fail) {\n throw new Error(\n 'Schema break detected and onSchemaBreak=OnSchemaBreak.Fail, stopping deployment. ' +\n 'If you want to try deleting and recreating the app then ' +\n 're-run with onSchemaBreak=OnSchemaBreak.ReplaceApp',\n )\n }\n\n if (onSchemaBreak === 'append' || onSchemaBreak === OnSchemaBreak.AppendApp) {\n Config.getLogger(sendParams?.suppressLog).info('onSchemaBreak=AppendApp, will attempt to create a new app')\n return await createApp()\n }\n\n if (existingApp.deletable) {\n Config.getLogger(sendParams?.suppressLog).info(\n 'App is deletable and onSchemaBreak=ReplaceApp, will attempt to create new app and delete old app',\n )\n } else {\n Config.getLogger(sendParams?.suppressLog).info(\n 'App is not deletable but onSchemaBreak=ReplaceApp, will attempt to delete app, delete will most likely fail',\n )\n }\n\n return await replaceApp(existingApp)\n }\n\n if (isUpdate) {\n Config.getLogger(sendParams?.suppressLog).info(\n `Detected a TEAL update in app ${existingApp.appId} for creator ${createParams.sender}`,\n )\n\n if (onUpdate === undefined || onUpdate === 'fail' || onUpdate === OnUpdate.Fail) {\n throw new Error('Update detected and onUpdate=Fail, stopping deployment. Try a different onUpdate value to not fail.')\n }\n\n if (onUpdate === 'append' || onUpdate === OnUpdate.AppendApp) {\n Config.getLogger(sendParams?.suppressLog).info('onUpdate=AppendApp, will attempt to create a new app')\n return await createApp()\n }\n\n if (onUpdate === 'update' || onUpdate === OnUpdate.UpdateApp) {\n if (existingApp.updatable) {\n Config.getLogger(sendParams?.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`)\n } else {\n Config.getLogger(sendParams?.suppressLog).warn(\n `App is not updatable but onUpdate=UpdateApp, will attempt to update app, update will most likely fail`,\n )\n }\n\n return await updateApp(existingApp)\n }\n\n if (onUpdate === 'replace' || onUpdate === OnUpdate.ReplaceApp) {\n if (existingApp.deletable) {\n Config.getLogger(sendParams?.suppressLog).warn(\n 'App is deletable and onUpdate=ReplaceApp, creating new app and deleting old app...',\n )\n } else {\n Config.getLogger(sendParams?.suppressLog).warn(\n 'App is not deletable and onUpdate=ReplaceApp, will attempt to create new app and delete old app, delete will most likely fail',\n )\n }\n\n return await replaceApp(existingApp)\n }\n }\n\n Config.getLogger(sendParams?.suppressLog).debug('No detected changes in app, nothing to do.')\n\n return { ...existingApp, operationPerformed: 'nothing' }\n }\n\n private updateAppLookup(sender: string, appMetadata: AppMetadata) {\n const lookup = this._appLookups.get(sender)\n if (!lookup) {\n this._appLookups.set(sender, { creator: sender, apps: { [appMetadata.name]: appMetadata } })\n } else {\n lookup.apps[appMetadata.name] = appMetadata\n }\n }\n\n /**\n * Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account that have\n * an [ARC-2](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md) `AppDeployNote` as the transaction\n * note of the app creation transaction.\n *\n * This function caches the result for the given creator account so that subsequent calls will not require an indexer lookup.\n *\n * If the `AppManager` instance wasn't created with an indexer client, this function will throw an error.\n *\n * @param creatorAddress The address of the account that is the creator of the apps you want to search for\n * @param ignoreCache Whether or not to ignore the cache and force a lookup, default: use the cache\n * @returns A name-based lookup of the app metadata\n */\n async getCreatorAppsByName(creatorAddress: string, ignoreCache?: boolean): Promise<AppLookup> {\n const appLookup: Record<string, AppMetadata> = {}\n\n if (!ignoreCache && this._appLookups.has(creatorAddress)) {\n return this._appLookups.get(creatorAddress)!\n }\n\n if (!this._indexer) {\n throw new Error(`Didn't receive an indexer client when this AppManager was created, but received a call to getCreatorApps`)\n }\n\n // Extract all apps that account created\n const createdApps = (await indexer.lookupAccountCreatedApplicationByAddress(this._indexer, creatorAddress))\n .map((a) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return { id: BigInt(a.id), createdAtRound: a['created-at-round']!, deleted: a.deleted }\n })\n .sort((a, b) => a.createdAtRound - b.createdAtRound)\n\n // For each app that account created (in parallel)...\n const apps = await Promise.all(\n createdApps.map(async (createdApp) => {\n // Find any app transactions for that app in the round it was created (should always just be a single creation transaction)\n const appTransactions = await indexer.searchTransactions(this._indexer!, (s) =>\n s\n .minRound(createdApp.createdAtRound)\n .txType(algosdk.TransactionType.appl)\n .applicationID(Number(createdApp.id))\n .address(creatorAddress)\n .addressRole('sender')\n .notePrefix(Buffer.from(APP_DEPLOY_NOTE_DAPP).toString('base64')),\n )\n\n // Triple check the transaction is intact by filtering for the one we want:\n // * application-id is 0 when the app is first created\n // * also verify the sender to prevent a potential security risk\n const appCreationTransaction = appTransactions.transactions.filter(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (t) => t['application-transaction']!['application-id'] === 0 && t.sender === creatorAddress,\n )[0]\n\n const latestAppUpdateTransaction = appTransactions.transactions\n .filter((t) => t.sender === creatorAddress)\n .sort((a, b) =>\n a['confirmed-round'] === b['confirmed-round']\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (b['intra-round-offset']! - a['intra-round-offset']!) / 10\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n b['confirmed-round']! - a['confirmed-round']!,\n )[0]\n\n if (!appCreationTransaction?.note)\n // No note; ignoring\n return null\n\n return { createdApp, appCreationTransaction, latestAppUpdateTransaction }\n }),\n )\n\n apps\n .filter((a) => a !== null)\n .forEach((a) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { createdApp, appCreationTransaction, latestAppUpdateTransaction } = a!\n\n const parseNote = (note?: string) => {\n if (!note) {\n // No note; ignoring...\n return\n }\n\n const decoder = new TextDecoder()\n const noteAsBase64 = decoder.decode(Buffer.from(note))\n const noteAsString = Buffer.from(noteAsBase64, 'base64').toString('utf-8')\n\n if (!noteAsString.startsWith(`${APP_DEPLOY_NOTE_DAPP}:j{`))\n // Clearly not APP_DEPLOY JSON; ignoring...\n return\n\n return JSON.parse(noteAsString.substring(APP_DEPLOY_NOTE_DAPP.length + 2)) as AppDeployMetadata\n }\n\n try {\n const creationNote = parseNote(appCreationTransaction.note)\n const updateNote = parseNote(latestAppUpdateTransaction.note)\n if (creationNote?.name) {\n appLookup[creationNote.name] = {\n appId: createdApp.id,\n appAddress: algosdk.getApplicationAddress(createdApp.id),\n createdMetadata: creationNote,\n createdRound: BigInt(appCreationTransaction['confirmed-round'] ?? 0),\n ...(updateNote ?? creationNote),\n updatedRound: BigInt(latestAppUpdateTransaction?.['confirmed-round'] ?? 0),\n deleted: createdApp.deleted ?? false,\n }\n }\n } catch (e) {\n Config.logger.warn(\n `Received error trying to retrieve app with ${createdApp.id} for creator ${creatorAddress}; failing silently`,\n e,\n )\n return\n }\n })\n\n const lookup = {\n creator: creatorAddress,\n apps: appLookup,\n }\n\n this._appLookups.set(creatorAddress, lookup)\n\n return lookup\n }\n}\n"],"names":["TransactionComposer","APP_DEPLOY_NOTE_DAPP","Config","OnSchemaBreak","OnUpdate","indexer.lookupAccountCreatedApplicationByAddress","indexer.searchTransactions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"app-deployer.js","sources":["../../src/types/app-deployer.ts"],"sourcesContent":["import algosdk, { Address } from 'algosdk'\nimport { Config } from '../config'\nimport * as indexer from '../indexer-lookup'\nimport { AlgorandClientTransactionSender } from './algorand-client-transaction-sender'\nimport {\n APP_DEPLOY_NOTE_DAPP,\n OnSchemaBreak,\n OnUpdate,\n type ABIReturn,\n type AppDeployMetadata,\n type SendAppCreateTransactionResult,\n type SendAppUpdateTransactionResult,\n type TealTemplateParams,\n} from './app'\nimport { AppManager } from './app-manager'\nimport {\n AppCreateMethodCall,\n AppCreateParams,\n AppDeleteMethodCall,\n AppDeleteParams,\n AppUpdateMethodCall,\n AppUpdateParams,\n TransactionComposer,\n} from './composer'\nimport { Expand } from './expand'\nimport { ConfirmedTransactionResult, SendParams } from './transaction'\n\n/** Params to specify an update transaction for an app deployment */\nexport type DeployAppUpdateParams = Expand<Omit<AppUpdateParams, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify an update method call for an app deployment */\nexport type DeployAppUpdateMethodCall = Expand<Omit<AppUpdateMethodCall, 'appId' | 'approvalProgram' | 'clearStateProgram'>>\n/** Params to specify a transaction for an app deployment */\nexport type DeployAppDeleteParams = Expand<Omit<AppDeleteParams, 'appId'>>\n/** Params to specify a delete method call for an app deployment */\nexport type DeployAppDeleteMethodCall = Expand<Omit<AppDeleteMethodCall, 'appId'>>\n\n/** The parameters to idempotently deploy an app */\nexport type AppDeployParams = Expand<\n SendParams & {\n /** The deployment metadata */\n metadata: AppDeployMetadata\n /** Any deploy-time parameters to replace in the TEAL code before compiling it (used if teal code is passed in as a string) */\n deployTimeParams?: TealTemplateParams\n /** What action to perform if a schema break (storage schema or extra pages change) is detected:\n *\n * * `fail` - Fail the deployment (throw an error, **default**)\n * * `replace` - Delete the old app and create a new one\n * * `append` - Deploy a new app and leave the old one as is\n */\n onSchemaBreak?: 'replace' | 'fail' | 'append' | OnSchemaBreak\n /** What action to perform if a TEAL code update is detected:\n *\n * * `fail` - Fail the deployment (throw an error, **default**)\n * * `update` - Update the app with the new TEAL code\n * * `replace` - Delete the old app and create a new one\n * * `append` - Deploy a new app and leave the old one as is\n */\n onUpdate?: 'update' | 'replace' | 'fail' | 'append' | OnUpdate\n /** Create transaction parameters to use if a create needs to be issued as part of deployment */\n createParams: AppCreateParams | AppCreateMethodCall\n /** Update transaction parameters to use if an update needs to be issued as part of deployment */\n updateParams: DeployAppUpdateParams | DeployAppUpdateMethodCall\n /** Delete transaction parameters to use if a delete needs to be issued as part of deployment */\n deleteParams: DeployAppDeleteParams | DeployAppDeleteMethodCall\n /** Optional cached value of the existing apps for the given creator; use this to avoid an indexer lookup */\n existingDeployments?: AppLookup\n /** Whether or not to ignore the app metadata cache and force a lookup, default: use the cache **/\n ignoreCache?: boolean\n }\n>\n\n/** The metadata that can be collected about a deployed app */\nexport interface AppMetadata extends AppDeployMetadata {\n /** The id of the app */\n appId: bigint\n /** The Algorand address of the account associated with the app */\n appAddress: Address\n /** The round the app was created */\n createdRound: bigint\n /** The last round that the app was updated */\n updatedRound: bigint\n /** The metadata when the app was created */\n createdMetadata: AppDeployMetadata\n /** Whether or not the app is deleted */\n deleted: boolean\n}\n\n/** A lookup of name -> Algorand app for a creator */\nexport interface AppLookup {\n /** The address of the creator associated with this lookup */\n creator: Readonly<Address>\n /** A hash map of app name to app metadata */\n apps: {\n [name: string]: AppMetadata\n }\n}\n\nexport type AppDeployResult =\n | Expand<{ operationPerformed: 'create' } & Omit<AppMetadata, 'appId' | 'appAddress'> & SendAppCreateTransactionResult>\n | Expand<{ operationPerformed: 'update' } & AppMetadata & SendAppUpdateTransactionResult>\n | Expand<\n { operationPerformed: 'replace' } & Omit<AppMetadata, 'appId' | 'appAddress'> &\n SendAppCreateTransactionResult & {\n deleteReturn?: ABIReturn\n deleteResult: ConfirmedTransactionResult\n }\n >\n | Expand<{ operationPerformed: 'nothing' } & AppMetadata>\n\n/** Allows management of deployment and deployment metadata of applications. */\nexport class AppDeployer {\n private _appManager: AppManager\n private _transactionSender: AlgorandClientTransactionSender\n private _indexer?: algosdk.Indexer\n private _appLookups = new Map<string, AppLookup>()\n\n /**\n * Creates an `AppManager`\n * @param appManager An `AppManager` instance\n * @param transactionSender An `AlgorandClientTransactionSender` instance\n * @param indexer An optional indexer instance; supply if you want to indexer to look up app metadata\n */\n constructor(appManager: AppManager, transactionSender: AlgorandClientTransactionSender, indexer?: algosdk.Indexer) {\n this._appManager = appManager\n this._transactionSender = transactionSender\n this._indexer = indexer\n }\n\n /**\n * Idempotently deploy (create if not exists, update if changed) an app against the given name for the given creator account, including deploy-time TEAL template placeholder substitutions (if specified).\n *\n * To understand the architecture decisions behind this functionality please see https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md\n *\n * **Note:** When using the return from this function be sure to check `operationPerformed` to get access to various return properties like `transaction`, `confirmation` and `deleteResult`.\n *\n * **Note:** if there is a breaking state schema change to an existing app (and `onSchemaBreak` is set to `'replace'`) the existing app will be deleted and re-created.\n *\n * **Note:** if there is an update (different TEAL code) to an existing app (and `onUpdate` is set to `'replace'`) the existing app will be deleted and re-created.\n * @param deployment The arguments to control the app deployment\n * @returns The app reference of the new/existing app\n */\n async deploy(deployment: AppDeployParams): Promise<AppDeployResult> {\n const {\n metadata,\n deployTimeParams,\n onSchemaBreak,\n onUpdate,\n createParams,\n updateParams,\n deleteParams,\n existingDeployments,\n ignoreCache,\n ...sendParams\n } = deployment\n\n // Set creation note\n\n createParams.note = updateParams.note = TransactionComposer.arc2Note({\n dAppName: APP_DEPLOY_NOTE_DAPP,\n data: metadata,\n format: 'j',\n })\n\n // Check for required fields\n\n if (existingDeployments && existingDeployments.creator.toString() !== createParams.sender.toString()) {\n throw new Error(\n `Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${createParams.sender}`,\n )\n }\n if (!existingDeployments && !this._indexer) {\n throw new Error(\n `Didn't receive an indexer client when this AppManager was created, but also didn't receive an existingDeployments cache - one of them must be provided`,\n )\n }\n\n Config.getLogger(sendParams?.suppressLog).info(\n `Idempotently deploying app \"${metadata.name}\" from creator ${createParams.sender} using ${createParams.approvalProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'} and ${createParams.clearStateProgram.length} bytes of ${typeof createParams.approvalProgram === 'string' ? 'teal code' : 'AVM bytecode'}`,\n )\n\n // Compile code if required\n\n const compiledApproval =\n typeof createParams.approvalProgram === 'string'\n ? await this._appManager.compileTealTemplate(createParams.approvalProgram, deployTimeParams, metadata)\n : undefined\n const approvalProgram = compiledApproval ? compiledApproval.compiledBase64ToBytes : createParams.approvalProgram\n\n const compiledClear =\n typeof createParams.clearStateProgram === 'string'\n ? await this._appManager.compileTealTemplate(createParams.clearStateProgram, deployTimeParams)\n : undefined\n const clearStateProgram = compiledClear ? compiledClear.compiledBase64ToBytes : createParams.clearStateProgram\n\n // Define routines for create, update, and replace\n\n const createApp = async () => {\n const result = await ('method' in createParams\n ? this._transactionSender.appCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram, ...sendParams })\n : this._transactionSender.appCreate({ ...createParams, approvalProgram, clearStateProgram, ...sendParams }))\n const appMetadata: AppMetadata = {\n appId: result.appId,\n appAddress: result.appAddress,\n ...metadata,\n createdMetadata: metadata,\n createdRound: BigInt(result.confirmation.confirmedRound!),\n updatedRound: BigInt(result.confirmation.confirmedRound!),\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n return {\n operationPerformed: 'create',\n compiledApproval,\n compiledClear,\n ...result,\n ...appMetadata,\n } satisfies SendAppCreateTransactionResult & AppMetadata & { operationPerformed: 'create' }\n }\n const updateApp = async (existingApp: AppMetadata) => {\n Config.getLogger(sendParams?.suppressLog).info(\n `Updating existing ${metadata.name} app for ${createParams.sender} to version ${metadata.version}.`,\n )\n const result = await ('method' in updateParams\n ? this._transactionSender.appUpdateMethodCall({\n appId: existingApp.appId,\n approvalProgram,\n clearStateProgram,\n ...updateParams,\n ...sendParams,\n })\n : this._transactionSender.appUpdate({\n appId: existingApp.appId,\n approvalProgram,\n clearStateProgram,\n ...updateParams,\n ...sendParams,\n }))\n const appMetadata: AppMetadata = {\n appId: existingApp.appId,\n appAddress: existingApp.appAddress,\n createdMetadata: existingApp.createdMetadata,\n createdRound: existingApp.createdRound,\n updatedRound: BigInt(result.confirmation.confirmedRound!),\n ...metadata,\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n return {\n operationPerformed: 'update',\n compiledApproval,\n compiledClear,\n ...result,\n ...appMetadata,\n } satisfies SendAppUpdateTransactionResult & AppMetadata & { operationPerformed: 'update' }\n }\n const replaceApp = async (existingApp: AppMetadata) => {\n Config.getLogger(sendParams?.suppressLog).info(\n `Deploying a new ${metadata.name} app for ${createParams.sender}; deploying app with version ${metadata.version}.`,\n )\n\n Config.getLogger(sendParams?.suppressLog).warn(\n `Deleting existing ${metadata.name} app with id ${existingApp.appId} from ${deleteParams.sender} account.`,\n )\n\n const composer = this._transactionSender.newGroup()\n if ('method' in createParams) {\n composer.addAppCreateMethodCall({ ...createParams, approvalProgram, clearStateProgram })\n } else {\n composer.addAppCreate({ ...createParams, approvalProgram, clearStateProgram })\n }\n const createIndex = await composer.count()\n if ('method' in deleteParams) {\n composer.addAppDeleteMethodCall({ appId: existingApp.appId, ...deleteParams })\n } else {\n composer.addAppDelete({ appId: existingApp.appId, ...deleteParams })\n }\n const result = await composer.send({ ...sendParams, suppressLog: true })\n const confirmation = result.confirmations.at(createIndex - 1)!\n const transaction = result.transactions.at(createIndex - 1)!\n const deleteTransaction = result.transactions.at(-1)!\n\n Config.getLogger(sendParams?.suppressLog).warn(\n `Sent transactions ${transaction.txID()} to create app with id ${confirmation.applicationIndex} and ${deleteTransaction.txID()} to delete app with id ${\n existingApp.appId\n } from ${createParams.sender} account.`,\n )\n\n const appMetadata: AppMetadata = {\n appId: BigInt(confirmation.applicationIndex!),\n appAddress: algosdk.getApplicationAddress(confirmation.applicationIndex!),\n ...metadata,\n createdMetadata: metadata,\n createdRound: BigInt(confirmation.confirmedRound!),\n updatedRound: BigInt(confirmation.confirmedRound!),\n deleted: false,\n }\n this.updateAppLookup(createParams.sender, appMetadata)\n\n return {\n operationPerformed: 'replace',\n ...result,\n compiledApproval,\n compiledClear,\n transaction,\n confirmation,\n return: 'method' in createParams ? result.returns?.[0] : undefined,\n deleteReturn: 'method' in deleteParams ? result.returns?.at(-1) : undefined,\n ...appMetadata,\n deleteResult: { transaction: deleteTransaction, confirmation: result.confirmations.at(-1)! },\n } satisfies { operationPerformed: 'replace' } & AppMetadata &\n SendAppCreateTransactionResult & {\n deleteReturn?: ABIReturn\n deleteResult: ConfirmedTransactionResult\n }\n }\n\n // Lookup existing app metadata\n\n const apps = existingDeployments ?? (await this.getCreatorAppsByName(createParams.sender, ignoreCache))\n\n const existingApp = apps.apps[metadata.name]\n if (!existingApp || existingApp.deleted) {\n Config.getLogger(sendParams?.suppressLog).info(\n `App ${metadata.name} not found in apps created by ${createParams.sender}; deploying app with version ${metadata.version}.`,\n )\n\n return await createApp()\n }\n\n Config.getLogger(sendParams?.suppressLog).info(\n `Existing app ${metadata.name} found by creator ${createParams.sender}, with app id ${existingApp.appId} and version ${existingApp.version}.`,\n )\n\n const existingAppRecord = await this._appManager.getById(existingApp.appId)\n const existingApproval = Buffer.from(existingAppRecord.approvalProgram).toString('base64')\n const existingClear = Buffer.from(existingAppRecord.clearStateProgram).toString('base64')\n\n const newApproval = Buffer.from(approvalProgram).toString('base64')\n const newClear = Buffer.from(clearStateProgram).toString('base64')\n\n // Check for changes\n\n const isUpdate = newApproval !== existingApproval || newClear !== existingClear\n const isSchemaBreak =\n existingAppRecord.localInts < (createParams.schema?.localInts ?? 0) ||\n existingAppRecord.globalInts < (createParams.schema?.globalInts ?? 0) ||\n existingAppRecord.localByteSlices < (createParams.schema?.localByteSlices ?? 0) ||\n existingAppRecord.globalByteSlices < (createParams.schema?.globalByteSlices ?? 0)\n\n if (isSchemaBreak) {\n Config.getLogger(sendParams?.suppressLog).warn(`Detected a breaking app schema change in app ${existingApp.appId}:`, {\n from: {\n globalInts: existingAppRecord.globalInts,\n globalByteSlices: existingAppRecord.globalByteSlices,\n localInts: existingAppRecord.localInts,\n localByteSlices: existingAppRecord.localByteSlices,\n },\n to: createParams.schema,\n })\n\n if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === OnSchemaBreak.Fail) {\n throw new Error(\n 'Schema break detected and onSchemaBreak=OnSchemaBreak.Fail, stopping deployment. ' +\n 'If you want to try deleting and recreating the app then ' +\n 're-run with onSchemaBreak=OnSchemaBreak.ReplaceApp',\n )\n }\n\n if (onSchemaBreak === 'append' || onSchemaBreak === OnSchemaBreak.AppendApp) {\n Config.getLogger(sendParams?.suppressLog).info('onSchemaBreak=AppendApp, will attempt to create a new app')\n return await createApp()\n }\n\n if (existingApp.deletable) {\n Config.getLogger(sendParams?.suppressLog).info(\n 'App is deletable and onSchemaBreak=ReplaceApp, will attempt to create new app and delete old app',\n )\n } else {\n Config.getLogger(sendParams?.suppressLog).info(\n 'App is not deletable but onSchemaBreak=ReplaceApp, will attempt to delete app, delete will most likely fail',\n )\n }\n\n return await replaceApp(existingApp)\n }\n\n if (isUpdate) {\n Config.getLogger(sendParams?.suppressLog).info(\n `Detected a TEAL update in app ${existingApp.appId} for creator ${createParams.sender}`,\n )\n\n if (onUpdate === undefined || onUpdate === 'fail' || onUpdate === OnUpdate.Fail) {\n throw new Error('Update detected and onUpdate=Fail, stopping deployment. Try a different onUpdate value to not fail.')\n }\n\n if (onUpdate === 'append' || onUpdate === OnUpdate.AppendApp) {\n Config.getLogger(sendParams?.suppressLog).info('onUpdate=AppendApp, will attempt to create a new app')\n return await createApp()\n }\n\n if (onUpdate === 'update' || onUpdate === OnUpdate.UpdateApp) {\n if (existingApp.updatable) {\n Config.getLogger(sendParams?.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`)\n } else {\n Config.getLogger(sendParams?.suppressLog).warn(\n `App is not updatable but onUpdate=UpdateApp, will attempt to update app, update will most likely fail`,\n )\n }\n\n return await updateApp(existingApp)\n }\n\n if (onUpdate === 'replace' || onUpdate === OnUpdate.ReplaceApp) {\n if (existingApp.deletable) {\n Config.getLogger(sendParams?.suppressLog).warn(\n 'App is deletable and onUpdate=ReplaceApp, creating new app and deleting old app...',\n )\n } else {\n Config.getLogger(sendParams?.suppressLog).warn(\n 'App is not deletable and onUpdate=ReplaceApp, will attempt to create new app and delete old app, delete will most likely fail',\n )\n }\n\n return await replaceApp(existingApp)\n }\n }\n\n Config.getLogger(sendParams?.suppressLog).debug('No detected changes in app, nothing to do.')\n\n return { ...existingApp, operationPerformed: 'nothing' }\n }\n\n private updateAppLookup(sender: string | Address, appMetadata: AppMetadata) {\n const s = typeof sender === 'string' ? sender : sender.toString()\n const lookup = this._appLookups.get(s)\n if (!lookup) {\n this._appLookups.set(s, { creator: Address.fromString(s), apps: { [appMetadata.name]: appMetadata } })\n } else {\n lookup.apps[appMetadata.name] = appMetadata\n }\n }\n\n /**\n * Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account that have\n * an [ARC-2](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0002.md) `AppDeployNote` as the transaction\n * note of the app creation transaction.\n *\n * This function caches the result for the given creator account so that subsequent calls will not require an indexer lookup.\n *\n * If the `AppManager` instance wasn't created with an indexer client, this function will throw an error.\n *\n * @param creatorAddress The address of the account that is the creator of the apps you want to search for\n * @param ignoreCache Whether or not to ignore the cache and force a lookup, default: use the cache\n * @returns A name-based lookup of the app metadata\n */\n async getCreatorAppsByName(creatorAddress: string | Address, ignoreCache?: boolean): Promise<AppLookup> {\n const appLookup: Record<string, AppMetadata> = {}\n\n const address = typeof creatorAddress === 'string' ? creatorAddress : creatorAddress.toString()\n if (!ignoreCache && this._appLookups.has(address)) {\n return this._appLookups.get(address)!\n }\n\n if (!this._indexer) {\n throw new Error(`Didn't receive an indexer client when this AppManager was created, but received a call to getCreatorApps`)\n }\n\n // Extract all apps that account created\n const createdApps = (await indexer.lookupAccountCreatedApplicationByAddress(this._indexer, creatorAddress))\n .map((a) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return { id: a.id, createdAtRound: a.createdAtRound!, deleted: a.deleted }\n })\n .sort((a, b) => Number(a.createdAtRound - b.createdAtRound))\n\n // For each app that account created (in parallel)...\n const apps = await Promise.all(\n createdApps.map(async (createdApp) => {\n // Find any app transactions for that app in the round it was created (should always just be a single creation transaction)\n const appTransactions = await indexer.searchTransactions(this._indexer!, (s) =>\n s\n .minRound(createdApp.createdAtRound)\n .txType(algosdk.TransactionType.appl)\n .applicationID(Number(createdApp.id))\n .address(creatorAddress)\n .addressRole('sender')\n .notePrefix(Buffer.from(APP_DEPLOY_NOTE_DAPP).toString('base64')),\n )\n\n // Triple check the transaction is intact by filtering for the one we want:\n // * application-id is 0 when the app is first created\n // * also verify the sender to prevent a potential security risk\n const appCreationTransaction = appTransactions.transactions.filter(\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (t) => t.applicationTransaction?.applicationId === 0n && t.sender.toString() === creatorAddress.toString(),\n )[0]\n\n const latestAppUpdateTransaction = appTransactions.transactions\n .filter((t) => t.sender.toString() === creatorAddress.toString())\n .sort((a, b) =>\n a.confirmedRound === b.confirmedRound\n ? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n (b.intraRoundOffset! - a.intraRoundOffset!) / 10\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n Number(b.confirmedRound! - a.confirmedRound!),\n )[0]\n\n if (!appCreationTransaction?.note)\n // No note; ignoring\n return null\n\n return { createdApp, appCreationTransaction, latestAppUpdateTransaction }\n }),\n )\n\n apps\n .filter((a) => a !== null)\n .forEach((a) => {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const { createdApp, appCreationTransaction, latestAppUpdateTransaction } = a!\n\n const parseNote = (note?: string) => {\n if (!note) {\n // No note; ignoring...\n return\n }\n\n if (!note.startsWith(`${APP_DEPLOY_NOTE_DAPP}:j{`))\n // Clearly not APP_DEPLOY JSON; ignoring...\n return\n\n return JSON.parse(note.substring(APP_DEPLOY_NOTE_DAPP.length + 2)) as AppDeployMetadata\n }\n\n try {\n const creationNote = parseNote(\n appCreationTransaction.note ? Buffer.from(appCreationTransaction.note).toString('utf-8') : undefined,\n )\n const updateNote = parseNote(\n latestAppUpdateTransaction.note ? Buffer.from(latestAppUpdateTransaction.note).toString('utf-8') : undefined,\n )\n if (creationNote?.name) {\n appLookup[creationNote.name] = {\n appId: createdApp.id,\n appAddress: algosdk.getApplicationAddress(createdApp.id),\n createdMetadata: creationNote,\n createdRound: appCreationTransaction.confirmedRound ?? 0n,\n ...(updateNote ?? creationNote),\n updatedRound: latestAppUpdateTransaction?.confirmedRound ?? 0n,\n deleted: createdApp.deleted ?? false,\n }\n }\n } catch (e) {\n Config.logger.warn(\n `Received error trying to retrieve app with ${createdApp.id} for creator ${creatorAddress}; failing silently`,\n e,\n )\n return\n }\n })\n\n const lookup = {\n creator: typeof creatorAddress === 'string' ? Address.fromString(creatorAddress) : creatorAddress,\n apps: appLookup,\n }\n\n this._appLookups.set(creatorAddress.toString(), lookup)\n\n return lookup\n }\n}\n"],"names":["TransactionComposer","APP_DEPLOY_NOTE_DAPP","Config","OnSchemaBreak","OnUpdate","Address","indexer.lookupAccountCreatedApplicationByAddress","indexer.searchTransactions"],"mappings":"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"}
|
package/types/app-deployer.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import algosdk from 'algosdk';
|
|
1
|
+
import algosdk, { Address } from 'algosdk';
|
|
2
2
|
import { Config } from '../config.mjs';
|
|
3
3
|
import { lookupAccountCreatedApplicationByAddress, searchTransactions } from '../indexer-lookup.mjs';
|
|
4
4
|
import { APP_DEPLOY_NOTE_DAPP, OnSchemaBreak, OnUpdate } from './app.mjs';
|
|
@@ -40,7 +40,7 @@ class AppDeployer {
|
|
|
40
40
|
format: 'j',
|
|
41
41
|
});
|
|
42
42
|
// Check for required fields
|
|
43
|
-
if (existingDeployments && existingDeployments.creator !== createParams.sender) {
|
|
43
|
+
if (existingDeployments && existingDeployments.creator.toString() !== createParams.sender.toString()) {
|
|
44
44
|
throw new Error(`Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${createParams.sender}`);
|
|
45
45
|
}
|
|
46
46
|
if (!existingDeployments && !this._indexer) {
|
|
@@ -237,9 +237,10 @@ class AppDeployer {
|
|
|
237
237
|
return { ...existingApp, operationPerformed: 'nothing' };
|
|
238
238
|
}
|
|
239
239
|
updateAppLookup(sender, appMetadata) {
|
|
240
|
-
const
|
|
240
|
+
const s = typeof sender === 'string' ? sender : sender.toString();
|
|
241
|
+
const lookup = this._appLookups.get(s);
|
|
241
242
|
if (!lookup) {
|
|
242
|
-
this._appLookups.set(
|
|
243
|
+
this._appLookups.set(s, { creator: Address.fromString(s), apps: { [appMetadata.name]: appMetadata } });
|
|
243
244
|
}
|
|
244
245
|
else {
|
|
245
246
|
lookup.apps[appMetadata.name] = appMetadata;
|
|
@@ -260,8 +261,9 @@ class AppDeployer {
|
|
|
260
261
|
*/
|
|
261
262
|
async getCreatorAppsByName(creatorAddress, ignoreCache) {
|
|
262
263
|
const appLookup = {};
|
|
263
|
-
|
|
264
|
-
|
|
264
|
+
const address = typeof creatorAddress === 'string' ? creatorAddress : creatorAddress.toString();
|
|
265
|
+
if (!ignoreCache && this._appLookups.has(address)) {
|
|
266
|
+
return this._appLookups.get(address);
|
|
265
267
|
}
|
|
266
268
|
if (!this._indexer) {
|
|
267
269
|
throw new Error(`Didn't receive an indexer client when this AppManager was created, but received a call to getCreatorApps`);
|
|
@@ -270,9 +272,9 @@ class AppDeployer {
|
|
|
270
272
|
const createdApps = (await lookupAccountCreatedApplicationByAddress(this._indexer, creatorAddress))
|
|
271
273
|
.map((a) => {
|
|
272
274
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
273
|
-
return { id:
|
|
275
|
+
return { id: a.id, createdAtRound: a.createdAtRound, deleted: a.deleted };
|
|
274
276
|
})
|
|
275
|
-
.sort((a, b) => a.createdAtRound - b.createdAtRound);
|
|
277
|
+
.sort((a, b) => Number(a.createdAtRound - b.createdAtRound));
|
|
276
278
|
// For each app that account created (in parallel)...
|
|
277
279
|
const apps = await Promise.all(createdApps.map(async (createdApp) => {
|
|
278
280
|
// Find any app transactions for that app in the round it was created (should always just be a single creation transaction)
|
|
@@ -288,14 +290,14 @@ class AppDeployer {
|
|
|
288
290
|
// * also verify the sender to prevent a potential security risk
|
|
289
291
|
const appCreationTransaction = appTransactions.transactions.filter(
|
|
290
292
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
291
|
-
(t) => t
|
|
293
|
+
(t) => t.applicationTransaction?.applicationId === 0n && t.sender.toString() === creatorAddress.toString())[0];
|
|
292
294
|
const latestAppUpdateTransaction = appTransactions.transactions
|
|
293
|
-
.filter((t) => t.sender === creatorAddress)
|
|
294
|
-
.sort((a, b) => a
|
|
295
|
+
.filter((t) => t.sender.toString() === creatorAddress.toString())
|
|
296
|
+
.sort((a, b) => a.confirmedRound === b.confirmedRound
|
|
295
297
|
? // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
296
|
-
(b
|
|
298
|
+
(b.intraRoundOffset - a.intraRoundOffset) / 10
|
|
297
299
|
: // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
298
|
-
b
|
|
300
|
+
Number(b.confirmedRound - a.confirmedRound))[0];
|
|
299
301
|
if (!appCreationTransaction?.note)
|
|
300
302
|
// No note; ignoring
|
|
301
303
|
return null;
|
|
@@ -311,25 +313,22 @@ class AppDeployer {
|
|
|
311
313
|
// No note; ignoring...
|
|
312
314
|
return;
|
|
313
315
|
}
|
|
314
|
-
|
|
315
|
-
const noteAsBase64 = decoder.decode(Buffer.from(note));
|
|
316
|
-
const noteAsString = Buffer.from(noteAsBase64, 'base64').toString('utf-8');
|
|
317
|
-
if (!noteAsString.startsWith(`${APP_DEPLOY_NOTE_DAPP}:j{`))
|
|
316
|
+
if (!note.startsWith(`${APP_DEPLOY_NOTE_DAPP}:j{`))
|
|
318
317
|
// Clearly not APP_DEPLOY JSON; ignoring...
|
|
319
318
|
return;
|
|
320
|
-
return JSON.parse(
|
|
319
|
+
return JSON.parse(note.substring(APP_DEPLOY_NOTE_DAPP.length + 2));
|
|
321
320
|
};
|
|
322
321
|
try {
|
|
323
|
-
const creationNote = parseNote(appCreationTransaction.note);
|
|
324
|
-
const updateNote = parseNote(latestAppUpdateTransaction.note);
|
|
322
|
+
const creationNote = parseNote(appCreationTransaction.note ? Buffer.from(appCreationTransaction.note).toString('utf-8') : undefined);
|
|
323
|
+
const updateNote = parseNote(latestAppUpdateTransaction.note ? Buffer.from(latestAppUpdateTransaction.note).toString('utf-8') : undefined);
|
|
325
324
|
if (creationNote?.name) {
|
|
326
325
|
appLookup[creationNote.name] = {
|
|
327
326
|
appId: createdApp.id,
|
|
328
327
|
appAddress: algosdk.getApplicationAddress(createdApp.id),
|
|
329
328
|
createdMetadata: creationNote,
|
|
330
|
-
createdRound:
|
|
329
|
+
createdRound: appCreationTransaction.confirmedRound ?? 0n,
|
|
331
330
|
...(updateNote ?? creationNote),
|
|
332
|
-
updatedRound:
|
|
331
|
+
updatedRound: latestAppUpdateTransaction?.confirmedRound ?? 0n,
|
|
333
332
|
deleted: createdApp.deleted ?? false,
|
|
334
333
|
};
|
|
335
334
|
}
|
|
@@ -340,10 +339,10 @@ class AppDeployer {
|
|
|
340
339
|
}
|
|
341
340
|
});
|
|
342
341
|
const lookup = {
|
|
343
|
-
creator: creatorAddress,
|
|
342
|
+
creator: typeof creatorAddress === 'string' ? Address.fromString(creatorAddress) : creatorAddress,
|
|
344
343
|
apps: appLookup,
|
|
345
344
|
};
|
|
346
|
-
this._appLookups.set(creatorAddress, lookup);
|
|
345
|
+
this._appLookups.set(creatorAddress.toString(), lookup);
|
|
347
346
|
return lookup;
|
|
348
347
|
}
|
|
349
348
|
}
|