@algorandfoundation/algokit-utils 1.0.0-beta.9 → 1.1.0
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 +38 -0
- package/account.d.ts +41 -36
- package/account.d.ts.map +1 -1
- package/account.js +59 -44
- package/account.js.map +1 -1
- package/amount.d.ts +20 -0
- package/amount.d.ts.map +1 -0
- package/amount.js +36 -0
- package/amount.js.map +1 -0
- package/app-client.d.ts +14 -0
- package/app-client.d.ts.map +1 -0
- package/app-client.js +19 -0
- package/app-client.js.map +1 -0
- package/app-deploy.d.ts +95 -0
- package/app-deploy.d.ts.map +1 -0
- package/{deploy-app.js → app-deploy.js} +129 -119
- package/app-deploy.js.map +1 -0
- package/app.d.ts +112 -148
- package/app.d.ts.map +1 -1
- package/app.js +460 -143
- package/app.js.map +1 -1
- package/index.d.ts +6 -4
- package/index.d.ts.map +1 -1
- package/index.js +7 -4
- package/index.js.map +1 -1
- package/indexer-lookup.d.ts +11 -4
- package/indexer-lookup.d.ts.map +1 -1
- package/indexer-lookup.js +19 -9
- package/indexer-lookup.js.map +1 -1
- package/localnet.d.ts +10 -10
- package/localnet.d.ts.map +1 -1
- package/localnet.js +16 -16
- package/localnet.js.map +1 -1
- package/network-client.d.ts +15 -24
- package/network-client.d.ts.map +1 -1
- package/network-client.js +16 -16
- package/network-client.js.map +1 -1
- package/package.json +2 -2
- package/testing/account.d.ts +14 -0
- package/testing/account.d.ts.map +1 -0
- package/testing/account.js +31 -0
- package/testing/account.js.map +1 -0
- package/testing/fixtures/algokit-log-capture-fixture.d.ts +19 -0
- package/testing/fixtures/algokit-log-capture-fixture.d.ts.map +1 -0
- package/testing/fixtures/algokit-log-capture-fixture.js +43 -0
- package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -0
- package/testing/fixtures/algorand-fixture.d.ts +24 -0
- package/testing/fixtures/algorand-fixture.d.ts.map +1 -0
- package/testing/fixtures/algorand-fixture.js +60 -0
- package/testing/fixtures/algorand-fixture.js.map +1 -0
- package/testing/fixtures/index.d.ts +3 -0
- package/testing/fixtures/index.d.ts.map +1 -0
- package/testing/fixtures/index.js +19 -0
- package/testing/fixtures/index.js.map +1 -0
- package/testing/index.d.ts +6 -0
- package/testing/index.d.ts.map +1 -0
- package/testing/index.js +22 -0
- package/testing/index.js.map +1 -0
- package/testing/indexer.d.ts +12 -0
- package/testing/indexer.d.ts.map +1 -0
- package/testing/indexer.js +40 -0
- package/testing/indexer.js.map +1 -0
- package/testing/test-logger.d.ts +41 -0
- package/testing/test-logger.d.ts.map +1 -0
- package/testing/test-logger.js +71 -0
- package/testing/test-logger.js.map +1 -0
- package/testing/transaction-logger.d.ts +29 -0
- package/testing/transaction-logger.d.ts.map +1 -0
- package/testing/transaction-logger.js +71 -0
- package/testing/transaction-logger.js.map +1 -0
- package/transaction.d.ts +55 -91
- package/transaction.d.ts.map +1 -1
- package/transaction.js +213 -155
- package/transaction.js.map +1 -1
- package/transfer.d.ts +14 -16
- package/transfer.d.ts.map +1 -1
- package/transfer.js +38 -4
- package/transfer.js.map +1 -1
- package/types/account.d.ts +55 -0
- package/types/account.d.ts.map +1 -0
- package/types/account.js +91 -0
- package/types/account.js.map +1 -0
- package/types/algo-http-client-with-retry.d.ts.map +1 -0
- package/{algo-http-client-with-retry.js → types/algo-http-client-with-retry.js} +3 -3
- package/types/algo-http-client-with-retry.js.map +1 -0
- package/types/algod.d.ts +28 -15
- package/types/algod.d.ts.map +1 -1
- package/{algo-amount.d.ts → types/amount.d.ts} +9 -3
- package/types/amount.d.ts.map +1 -0
- package/{algo-amount.js → types/amount.js} +13 -3
- package/types/amount.js.map +1 -0
- package/types/app-client.d.ts +282 -0
- package/types/app-client.d.ts.map +1 -0
- package/types/app-client.js +529 -0
- package/types/app-client.js.map +1 -0
- package/types/app-spec.d.ts +141 -0
- package/types/app-spec.d.ts.map +1 -0
- package/types/{appspec.js → app-spec.js} +5 -7
- package/types/app-spec.js.map +1 -0
- package/types/app.d.ts +285 -0
- package/types/app.d.ts.map +1 -0
- package/types/app.js +32 -0
- package/types/app.js.map +1 -0
- package/types/config.d.ts +32 -0
- package/types/config.d.ts.map +1 -0
- package/types/config.js +53 -0
- package/types/config.js.map +1 -0
- package/types/indexer.d.ts +368 -58
- package/types/indexer.d.ts.map +1 -1
- package/types/indexer.js +9 -0
- package/types/indexer.js.map +1 -1
- package/{config.d.ts → types/logging.d.ts} +2 -16
- package/types/logging.d.ts.map +1 -0
- package/{config.js → types/logging.js} +5 -24
- package/types/logging.js.map +1 -0
- package/types/logic-error.d.ts +37 -0
- package/types/logic-error.d.ts.map +1 -0
- package/types/logic-error.js +50 -0
- package/types/logic-error.js.map +1 -0
- package/types/network-client.d.ts +11 -0
- package/types/network-client.d.ts.map +1 -0
- package/types/network-client.js +3 -0
- package/types/network-client.js.map +1 -0
- package/types/testing.d.ts +89 -0
- package/types/testing.d.ts.map +1 -0
- package/types/testing.js +3 -0
- package/types/testing.js.map +1 -0
- package/types/transaction.d.ts +112 -0
- package/types/transaction.d.ts.map +1 -0
- package/types/transaction.js +3 -0
- package/types/transaction.js.map +1 -0
- package/types/transfer.d.ts +32 -0
- package/types/transfer.d.ts.map +1 -0
- package/types/transfer.js +3 -0
- package/types/transfer.js.map +1 -0
- package/types/urlTokenBaseHTTPClient.d.ts.map +1 -0
- package/types/urlTokenBaseHTTPClient.js.map +1 -0
- package/algo-amount.d.ts.map +0 -1
- package/algo-amount.js.map +0 -1
- package/algo-http-client-with-retry.d.ts.map +0 -1
- package/algo-http-client-with-retry.js.map +0 -1
- package/application-client.d.ts +0 -113
- package/application-client.d.ts.map +0 -1
- package/application-client.js +0 -258
- package/application-client.js.map +0 -1
- package/config.d.ts.map +0 -1
- package/config.js.map +0 -1
- package/deploy-app.d.ts +0 -164
- package/deploy-app.d.ts.map +0 -1
- package/deploy-app.js.map +0 -1
- package/types/appspec.d.ts +0 -78
- package/types/appspec.d.ts.map +0 -1
- package/types/appspec.js.map +0 -1
- package/urlTokenBaseHTTPClient.d.ts.map +0 -1
- package/urlTokenBaseHTTPClient.js.map +0 -1
- /package/{algo-http-client-with-retry.d.ts → types/algo-http-client-with-retry.d.ts} +0 -0
- /package/{urlTokenBaseHTTPClient.d.ts → types/urlTokenBaseHTTPClient.d.ts} +0 -0
- /package/{urlTokenBaseHTTPClient.js → types/urlTokenBaseHTTPClient.js} +0 -0
|
@@ -1,73 +1,63 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.performTemplateSubstitutionAndCompile = exports.performTemplateSubstitution = exports.replaceDeployTimeControlParams = exports.getAppDeploymentTransactionNote = exports.getCreatorAppsByName = exports.
|
|
3
|
+
exports.performTemplateSubstitutionAndCompile = exports.performTemplateSubstitution = exports.replaceDeployTimeControlParams = exports.getAppDeploymentTransactionNote = exports.getCreatorAppsByName = exports.isSchemaIsBroken = exports.deployApp = void 0;
|
|
4
4
|
const algosdk_1 = require("algosdk");
|
|
5
|
+
const _1 = require(".");
|
|
5
6
|
const app_1 = require("./app");
|
|
6
|
-
const config_1 = require("./config");
|
|
7
7
|
const indexer_lookup_1 = require("./indexer-lookup");
|
|
8
8
|
const transaction_1 = require("./transaction");
|
|
9
|
-
|
|
10
|
-
exports.DELETABLE_TEMPLATE_NAME = 'TMPL_DELETABLE';
|
|
11
|
-
exports.APP_DEPLOY_NOTE_PREFIX = 'APP_DEPLOY::';
|
|
12
|
-
/** What action to perform when deploying an app and an update is detected in the TEAL code */
|
|
13
|
-
var OnUpdate;
|
|
14
|
-
(function (OnUpdate) {
|
|
15
|
-
/** Fail the deployment */
|
|
16
|
-
OnUpdate[OnUpdate["Fail"] = 0] = "Fail";
|
|
17
|
-
/** Update the app */
|
|
18
|
-
OnUpdate[OnUpdate["UpdateApp"] = 1] = "UpdateApp";
|
|
19
|
-
/** Delete the app and create a new one in its place */
|
|
20
|
-
OnUpdate[OnUpdate["ReplaceApp"] = 2] = "ReplaceApp";
|
|
21
|
-
})(OnUpdate = exports.OnUpdate || (exports.OnUpdate = {}));
|
|
22
|
-
/** What action to perform when deploying an app and a breaking schema change is detected */
|
|
23
|
-
var OnSchemaBreak;
|
|
24
|
-
(function (OnSchemaBreak) {
|
|
25
|
-
/** Fail the deployment */
|
|
26
|
-
OnSchemaBreak[OnSchemaBreak["Fail"] = 0] = "Fail";
|
|
27
|
-
/** Delete the app and create a new one in its place */
|
|
28
|
-
OnSchemaBreak[OnSchemaBreak["ReplaceApp"] = 1] = "ReplaceApp";
|
|
29
|
-
})(OnSchemaBreak = exports.OnSchemaBreak || (exports.OnSchemaBreak = {}));
|
|
9
|
+
const app_2 = require("./types/app");
|
|
30
10
|
/**
|
|
31
11
|
* Idempotently deploy (create, update/delete if changed) an app against the given name via the given creator account, including deploy-time template placeholder substitutions.
|
|
32
12
|
*
|
|
33
|
-
* To understand the architecture decisions behind this functionality please
|
|
13
|
+
* 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
|
|
14
|
+
*
|
|
15
|
+
* **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`.
|
|
34
16
|
*
|
|
35
17
|
* **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.
|
|
36
18
|
*
|
|
37
19
|
* **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.
|
|
38
20
|
* @param deployment The arguments to control the app deployment
|
|
39
21
|
* @param algod An algod client
|
|
40
|
-
* @param indexer An indexer client
|
|
22
|
+
* @param indexer An indexer client, needed if `existingDeployments` not passed in
|
|
41
23
|
* @returns The app reference of the new/existing app
|
|
42
24
|
*/
|
|
43
25
|
async function deployApp(deployment, algod, indexer) {
|
|
44
|
-
const { metadata, deployTimeParameters, onSchemaBreak, onUpdate, existingDeployments, createArgs, updateArgs, deleteArgs, ...appParams } = deployment;
|
|
26
|
+
const { metadata, deployTimeParams: deployTimeParameters, onSchemaBreak, onUpdate, existingDeployments, createArgs, updateArgs, deleteArgs, ...appParams } = deployment;
|
|
45
27
|
if (existingDeployments && existingDeployments.creator !== (0, transaction_1.getSenderAddress)(appParams.from)) {
|
|
46
28
|
throw new Error(`Received invalid existingDeployments value for creator ${existingDeployments.creator} when attempting to deploy for creator ${appParams.from}`);
|
|
47
29
|
}
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
30
|
+
if (!existingDeployments && !indexer) {
|
|
31
|
+
throw new Error(`Didn't receive an indexer client, but also didn't receive an existingDeployments cache - one of them must be provided`);
|
|
32
|
+
}
|
|
33
|
+
_1.Config.getLogger(appParams.suppressLog).info(`Idempotently deploying app "${metadata.name}" from creator ${(0, transaction_1.getSenderAddress)(appParams.from)} using ${appParams.approvalProgram.length} bytes of teal code and ${appParams.clearStateProgram.length} bytes of teal code`);
|
|
34
|
+
const compiledApproval = typeof appParams.approvalProgram === 'string'
|
|
35
|
+
? await performTemplateSubstitutionAndCompile(appParams.approvalProgram, algod, deployTimeParameters, metadata)
|
|
36
|
+
: undefined;
|
|
37
|
+
appParams.approvalProgram = compiledApproval ? compiledApproval.compiledBase64ToBytes : appParams.approvalProgram;
|
|
38
|
+
const compiledClear = typeof appParams.clearStateProgram === 'string'
|
|
39
|
+
? await performTemplateSubstitutionAndCompile(appParams.clearStateProgram, algod, deployTimeParameters)
|
|
40
|
+
: undefined;
|
|
41
|
+
appParams.clearStateProgram = compiledClear ? compiledClear.compiledBase64ToBytes : appParams.clearStateProgram;
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
58
43
|
const apps = existingDeployments ?? (await getCreatorAppsByName(appParams.from, indexer));
|
|
59
|
-
const create = async (
|
|
44
|
+
const create = async (atc) => {
|
|
60
45
|
const result = await (0, app_1.createApp)({
|
|
61
46
|
...appParams,
|
|
62
47
|
args: createArgs,
|
|
63
48
|
note: getAppDeploymentTransactionNote(metadata),
|
|
64
|
-
|
|
49
|
+
atc,
|
|
65
50
|
skipWaiting: false,
|
|
66
51
|
}, algod);
|
|
67
52
|
return {
|
|
68
53
|
transaction: result.transaction,
|
|
54
|
+
transactions: result.transactions,
|
|
55
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
69
56
|
confirmation: result.confirmation,
|
|
70
|
-
|
|
57
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
58
|
+
confirmations: result.confirmations,
|
|
59
|
+
return: result.return,
|
|
60
|
+
appId: result.appId,
|
|
71
61
|
appAddress: result.appAddress,
|
|
72
62
|
createdMetadata: metadata,
|
|
73
63
|
createdRound: Number(result.confirmation?.['confirmed-round']),
|
|
@@ -75,15 +65,17 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
75
65
|
...metadata,
|
|
76
66
|
deleted: false,
|
|
77
67
|
operationPerformed: 'create',
|
|
68
|
+
compiledApproval,
|
|
69
|
+
compiledClear,
|
|
78
70
|
};
|
|
79
71
|
};
|
|
80
72
|
const existingApp = apps.apps[metadata.name];
|
|
81
|
-
if (!existingApp) {
|
|
82
|
-
|
|
73
|
+
if (!existingApp || existingApp.deleted) {
|
|
74
|
+
_1.Config.getLogger(appParams.suppressLog).info(`App ${metadata.name} not found in apps created by ${(0, transaction_1.getSenderAddress)(appParams.from)}; deploying app with version ${metadata.version}.`);
|
|
83
75
|
return await create();
|
|
84
76
|
}
|
|
85
|
-
|
|
86
|
-
const existingAppRecord = await (0, app_1.
|
|
77
|
+
_1.Config.getLogger(appParams.suppressLog).info(`Existing app ${metadata.name} found by creator ${(0, transaction_1.getSenderAddress)(appParams.from)}, with app id ${existingApp.appId} and version ${existingApp.version}.`);
|
|
78
|
+
const existingAppRecord = await (0, app_1.getAppById)(existingApp.appId, algod);
|
|
87
79
|
const existingApproval = existingAppRecord.params['approval-program'];
|
|
88
80
|
const existingClear = existingAppRecord.params['clear-state-program'];
|
|
89
81
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
@@ -101,34 +93,28 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
101
93
|
const newApproval = Buffer.from(appParams.approvalProgram).toString('base64');
|
|
102
94
|
const newClear = Buffer.from(appParams.clearStateProgram).toString('base64');
|
|
103
95
|
const isUpdate = newApproval !== existingApproval || newClear !== existingClear;
|
|
104
|
-
const isSchemaBreak =
|
|
96
|
+
const isSchemaBreak = isSchemaIsBroken(existingGlobalSchema, newGlobalSchema) || isSchemaIsBroken(existingLocalSchema, newLocalSchema);
|
|
105
97
|
const replace = async () => {
|
|
98
|
+
const atc = new algosdk_1.AtomicTransactionComposer();
|
|
106
99
|
// Create
|
|
107
|
-
|
|
108
|
-
const { transaction: createTransaction } = await create(
|
|
100
|
+
_1.Config.getLogger(appParams.suppressLog).info(`Deploying a new ${metadata.name} app for ${(0, transaction_1.getSenderAddress)(appParams.from)}; deploying app with version ${metadata.version}.`);
|
|
101
|
+
const { transaction: createTransaction } = await create(atc);
|
|
102
|
+
const createTransactions = atc.clone().buildGroup();
|
|
109
103
|
// Delete
|
|
110
|
-
|
|
104
|
+
_1.Config.getLogger(appParams.suppressLog).warn(`Deleting existing ${metadata.name} app with id ${existingApp.appId} from ${(0, transaction_1.getSenderAddress)(appParams.from)} account.`);
|
|
111
105
|
const { transaction: deleteTransaction } = await (0, app_1.callApp)({
|
|
112
|
-
|
|
106
|
+
appId: existingApp.appId,
|
|
113
107
|
callType: 'delete',
|
|
114
108
|
from: appParams.from,
|
|
115
109
|
args: deleteArgs,
|
|
116
110
|
transactionParams: appParams.transactionParams,
|
|
117
111
|
suppressLog: appParams.suppressLog,
|
|
118
112
|
skipSending: true,
|
|
113
|
+
atc,
|
|
119
114
|
}, algod);
|
|
120
115
|
// Ensure create and delete happen atomically
|
|
121
|
-
const { confirmations } = await (0, transaction_1.
|
|
122
|
-
|
|
123
|
-
{
|
|
124
|
-
transaction: createTransaction,
|
|
125
|
-
signer: appParams.from,
|
|
126
|
-
},
|
|
127
|
-
{
|
|
128
|
-
transaction: deleteTransaction,
|
|
129
|
-
signer: appParams.from,
|
|
130
|
-
},
|
|
131
|
-
],
|
|
116
|
+
const { transactions, confirmations, returns } = await (0, transaction_1.sendAtomicTransactionComposer)({
|
|
117
|
+
atc,
|
|
132
118
|
sendParams: {
|
|
133
119
|
maxRoundsToWaitForConfirmation: appParams.maxRoundsToWaitForConfirmation,
|
|
134
120
|
skipWaiting: false,
|
|
@@ -136,16 +122,22 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
136
122
|
},
|
|
137
123
|
}, algod);
|
|
138
124
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
139
|
-
const createConfirmation = confirmations[
|
|
125
|
+
const createConfirmation = confirmations[createTransactions.length - 1];
|
|
140
126
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
141
|
-
const deleteConfirmation = confirmations[1];
|
|
127
|
+
const deleteConfirmation = confirmations[confirmations.length - 1];
|
|
142
128
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
143
129
|
const newAppIndex = createConfirmation['application-index'];
|
|
144
|
-
|
|
130
|
+
_1.Config.getLogger(appParams.suppressLog).warn(`Sent transactions ${createTransaction.txID()} to create app with id ${newAppIndex} and ${deleteTransaction.txID()} to delete app with id ${existingApp.appId} from ${(0, transaction_1.getSenderAddress)(appParams.from)} account.`);
|
|
145
131
|
return {
|
|
146
132
|
transaction: createTransaction,
|
|
133
|
+
transactions: transactions,
|
|
134
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
147
135
|
confirmation: createConfirmation,
|
|
148
|
-
|
|
136
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
137
|
+
confirmations: confirmations,
|
|
138
|
+
return: returns?.[0],
|
|
139
|
+
deleteReturn: returns?.[1],
|
|
140
|
+
appId: newAppIndex,
|
|
149
141
|
appAddress: (0, algosdk_1.getApplicationAddress)(newAppIndex),
|
|
150
142
|
createdMetadata: metadata,
|
|
151
143
|
createdRound: Number(createConfirmation['confirmed-round']),
|
|
@@ -154,12 +146,14 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
154
146
|
deleted: false,
|
|
155
147
|
deleteResult: { transaction: deleteTransaction, confirmation: deleteConfirmation },
|
|
156
148
|
operationPerformed: 'replace',
|
|
149
|
+
compiledApproval,
|
|
150
|
+
compiledClear,
|
|
157
151
|
};
|
|
158
152
|
};
|
|
159
153
|
const update = async () => {
|
|
160
|
-
|
|
154
|
+
_1.Config.getLogger(appParams.suppressLog).info(`Updating existing ${metadata.name} app for ${(0, transaction_1.getSenderAddress)(appParams.from)} to version ${metadata.version}.`);
|
|
161
155
|
const result = await (0, app_1.updateApp)({
|
|
162
|
-
|
|
156
|
+
appId: existingApp.appId,
|
|
163
157
|
from: appParams.from,
|
|
164
158
|
args: updateArgs,
|
|
165
159
|
note: getAppDeploymentTransactionNote(metadata),
|
|
@@ -172,8 +166,13 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
172
166
|
}, algod);
|
|
173
167
|
return {
|
|
174
168
|
transaction: result.transaction,
|
|
169
|
+
transactions: result.transactions,
|
|
170
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
175
171
|
confirmation: result.confirmation,
|
|
176
|
-
|
|
172
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
173
|
+
confirmations: result.confirmations,
|
|
174
|
+
return: result.return,
|
|
175
|
+
appId: existingApp.appId,
|
|
177
176
|
appAddress: existingApp.appAddress,
|
|
178
177
|
createdMetadata: existingApp.createdMetadata,
|
|
179
178
|
createdRound: existingApp.createdRound,
|
|
@@ -181,10 +180,12 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
181
180
|
...metadata,
|
|
182
181
|
deleted: false,
|
|
183
182
|
operationPerformed: 'update',
|
|
183
|
+
compiledApproval,
|
|
184
|
+
compiledClear,
|
|
184
185
|
};
|
|
185
186
|
};
|
|
186
187
|
if (isSchemaBreak) {
|
|
187
|
-
|
|
188
|
+
_1.Config.getLogger(appParams.suppressLog).warn(`Detected a breaking app schema change in app ${existingApp.appId}:`, {
|
|
188
189
|
from: {
|
|
189
190
|
global: existingGlobalSchema,
|
|
190
191
|
local: existingLocalSchema,
|
|
@@ -194,47 +195,47 @@ async function deployApp(deployment, algod, indexer) {
|
|
|
194
195
|
local: newLocalSchema,
|
|
195
196
|
},
|
|
196
197
|
});
|
|
197
|
-
if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === OnSchemaBreak.Fail) {
|
|
198
|
+
if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === app_2.OnSchemaBreak.Fail) {
|
|
198
199
|
throw new Error('Schema break detected and onSchemaBreak=OnSchemaBreak.Fail, stopping deployment. ' +
|
|
199
200
|
'If you want to try deleting and recreating the app then ' +
|
|
200
201
|
're-run with onSchemaBreak=OnSchemaBreak.ReplaceApp');
|
|
201
202
|
}
|
|
202
203
|
if (existingApp.deletable) {
|
|
203
|
-
|
|
204
|
+
_1.Config.getLogger(appParams.suppressLog).info('App is deletable and onSchemaBreak=ReplaceApp, will attempt to create new app and delete old app');
|
|
204
205
|
}
|
|
205
206
|
else {
|
|
206
|
-
|
|
207
|
+
_1.Config.getLogger(appParams.suppressLog).info('App is not deletable but onSchemaBreak=ReplaceApp, will attempt to delete app, delete will most likely fail');
|
|
207
208
|
}
|
|
208
209
|
return await replace();
|
|
209
210
|
}
|
|
210
211
|
if (isUpdate) {
|
|
211
|
-
|
|
212
|
-
if (onUpdate === undefined || onUpdate === 'fail' || onUpdate === OnUpdate.Fail) {
|
|
212
|
+
_1.Config.getLogger(appParams.suppressLog).info(`Detected a TEAL update in app ${existingApp.appId} for creator ${(0, transaction_1.getSenderAddress)(appParams.from)}`);
|
|
213
|
+
if (onUpdate === undefined || onUpdate === 'fail' || onUpdate === app_2.OnUpdate.Fail) {
|
|
213
214
|
throw new Error('Update detected and onUpdate=Fail, stopping deployment. ' +
|
|
214
215
|
'If you want to try deleting and recreating the app then ' +
|
|
215
216
|
're-run with onUpdate=UpdateApp');
|
|
216
217
|
}
|
|
217
|
-
if (onUpdate === 'update' || onUpdate === OnUpdate.UpdateApp) {
|
|
218
|
+
if (onUpdate === 'update' || onUpdate === app_2.OnUpdate.UpdateApp) {
|
|
218
219
|
if (existingApp.updatable) {
|
|
219
|
-
|
|
220
|
+
_1.Config.getLogger(appParams.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`);
|
|
220
221
|
}
|
|
221
222
|
else {
|
|
222
|
-
|
|
223
|
+
_1.Config.getLogger(appParams.suppressLog).warn(`App is not updatable but onUpdate=UpdateApp, will attempt to update app, update will most likely fail`);
|
|
223
224
|
}
|
|
224
225
|
return await update();
|
|
225
226
|
}
|
|
226
|
-
if (onUpdate === 'replace' || onUpdate === OnUpdate.ReplaceApp) {
|
|
227
|
+
if (onUpdate === 'replace' || onUpdate === app_2.OnUpdate.ReplaceApp) {
|
|
227
228
|
if (existingApp.deletable) {
|
|
228
|
-
|
|
229
|
+
_1.Config.getLogger(appParams.suppressLog).warn('App is deletable and onUpdate=ReplaceApp, creating new app and deleting old app...');
|
|
229
230
|
}
|
|
230
231
|
else {
|
|
231
|
-
|
|
232
|
+
_1.Config.getLogger(appParams.suppressLog).warn('App is not deletable and onUpdate=ReplaceApp, will attempt to create new app and delete old app, delete will most likely fail');
|
|
232
233
|
}
|
|
233
234
|
return await replace();
|
|
234
235
|
}
|
|
235
236
|
}
|
|
236
|
-
|
|
237
|
-
return { ...existingApp, operationPerformed: '
|
|
237
|
+
_1.Config.getLogger(appParams.suppressLog).debug('No detected changes in app, nothing to do.');
|
|
238
|
+
return { ...existingApp, operationPerformed: 'nothing', compiledApproval, compiledClear };
|
|
238
239
|
}
|
|
239
240
|
exports.deployApp = deployApp;
|
|
240
241
|
/** Returns true is there is a breaking change in the application state schema from before to after.
|
|
@@ -245,12 +246,12 @@ exports.deployApp = deployApp;
|
|
|
245
246
|
* @param after The new schema
|
|
246
247
|
* @returns Whether or not there is a breaking change
|
|
247
248
|
*/
|
|
248
|
-
function
|
|
249
|
+
function isSchemaIsBroken(before, after) {
|
|
249
250
|
return before['num-byte-slice'] < after['num-byte-slice'] || before['num-uint'] < after['num-uint'];
|
|
250
251
|
}
|
|
251
|
-
exports.
|
|
252
|
+
exports.isSchemaIsBroken = isSchemaIsBroken;
|
|
252
253
|
/**
|
|
253
|
-
* Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account that have an
|
|
254
|
+
* Returns a lookup of name => app metadata (id, address, ...metadata) for all apps created by the given account that have an `AppDeployNote` in the transaction note of the creation transaction.
|
|
254
255
|
*
|
|
255
256
|
* **Note:** It's recommended this is only called once and then stored since it's a somewhat expensive operation (multiple indexer calls).
|
|
256
257
|
*
|
|
@@ -262,12 +263,14 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
|
|
|
262
263
|
const appLookup = {};
|
|
263
264
|
const creatorAddress = typeof creatorAccount !== 'string' ? (0, transaction_1.getSenderAddress)(creatorAccount) : creatorAccount;
|
|
264
265
|
// Extract all apps that account created
|
|
265
|
-
const createdApps = (await (0, indexer_lookup_1.lookupAccountCreatedApplicationByAddress)(indexer, creatorAddress))
|
|
266
|
+
const createdApps = (await (0, indexer_lookup_1.lookupAccountCreatedApplicationByAddress)(indexer, creatorAddress))
|
|
267
|
+
.map((a) => {
|
|
266
268
|
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
267
269
|
return { id: a.id, createdAtRound: a['created-at-round'], deleted: a.deleted };
|
|
268
|
-
})
|
|
270
|
+
})
|
|
271
|
+
.sort((a, b) => a.createdAtRound - b.createdAtRound);
|
|
269
272
|
// For each app that account created (in parallel)...
|
|
270
|
-
await Promise.all(createdApps.map(async (createdApp) => {
|
|
273
|
+
const apps = await Promise.all(createdApps.map(async (createdApp) => {
|
|
271
274
|
// Find any app transactions for that app in the round it was created (should always just be a single creation transaction)
|
|
272
275
|
const appTransactions = await (0, indexer_lookup_1.searchTransactions)(indexer, (s) => s
|
|
273
276
|
.minRound(createdApp.createdAtRound)
|
|
@@ -275,7 +278,7 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
|
|
|
275
278
|
.applicationID(createdApp.id)
|
|
276
279
|
.address(creatorAddress)
|
|
277
280
|
.addressRole('sender')
|
|
278
|
-
.notePrefix(Buffer.from(
|
|
281
|
+
.notePrefix(Buffer.from(app_2.APP_DEPLOY_NOTE_DAPP).toString('base64')));
|
|
279
282
|
// Triple check the transaction is intact by filtering for the one we want:
|
|
280
283
|
// * application-id is 0 when the app is first created
|
|
281
284
|
// * also verify the sender to prevent a potential security risk
|
|
@@ -291,7 +294,14 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
|
|
|
291
294
|
b['confirmed-round'] - a['confirmed-round'])[0];
|
|
292
295
|
if (!appCreationTransaction?.note)
|
|
293
296
|
// No note; ignoring
|
|
294
|
-
return;
|
|
297
|
+
return null;
|
|
298
|
+
return { createdApp, appCreationTransaction, latestAppUpdateTransaction };
|
|
299
|
+
}));
|
|
300
|
+
apps
|
|
301
|
+
.filter((a) => a !== null)
|
|
302
|
+
.forEach((a) => {
|
|
303
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
304
|
+
const { createdApp, appCreationTransaction, latestAppUpdateTransaction } = a;
|
|
295
305
|
const parseNote = (note) => {
|
|
296
306
|
if (!note) {
|
|
297
307
|
// No note; ignoring...
|
|
@@ -300,17 +310,17 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
|
|
|
300
310
|
const decoder = new TextDecoder();
|
|
301
311
|
const noteAsBase64 = decoder.decode(Buffer.from(note));
|
|
302
312
|
const noteAsString = Buffer.from(noteAsBase64, 'base64').toString('utf-8');
|
|
303
|
-
if (!noteAsString.startsWith(`${
|
|
313
|
+
if (!noteAsString.startsWith(`${app_2.APP_DEPLOY_NOTE_DAPP}:j{`))
|
|
304
314
|
// Clearly not APP_DEPLOY JSON; ignoring...
|
|
305
315
|
return;
|
|
306
|
-
return JSON.parse(noteAsString.substring(
|
|
316
|
+
return JSON.parse(noteAsString.substring(app_2.APP_DEPLOY_NOTE_DAPP.length + 2));
|
|
307
317
|
};
|
|
308
318
|
try {
|
|
309
319
|
const creationNote = parseNote(appCreationTransaction.note);
|
|
310
320
|
const updateNote = parseNote(latestAppUpdateTransaction.note);
|
|
311
321
|
if (creationNote?.name) {
|
|
312
322
|
appLookup[creationNote.name] = {
|
|
313
|
-
|
|
323
|
+
appId: createdApp.id,
|
|
314
324
|
appAddress: (0, algosdk_1.getApplicationAddress)(createdApp.id),
|
|
315
325
|
createdMetadata: creationNote,
|
|
316
326
|
createdRound: Number(appCreationTransaction['confirmed-round']),
|
|
@@ -321,10 +331,10 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
|
|
|
321
331
|
}
|
|
322
332
|
}
|
|
323
333
|
catch (e) {
|
|
324
|
-
|
|
334
|
+
_1.Config.logger.warn(`Received error trying to retrieve app with ${createdApp.id} for creator ${creatorAddress}; failing silently`, e);
|
|
325
335
|
return;
|
|
326
336
|
}
|
|
327
|
-
})
|
|
337
|
+
});
|
|
328
338
|
return {
|
|
329
339
|
creator: creatorAddress,
|
|
330
340
|
apps: appLookup,
|
|
@@ -337,14 +347,21 @@ exports.getCreatorAppsByName = getCreatorAppsByName;
|
|
|
337
347
|
* @returns The transaction note as a utf-8 string
|
|
338
348
|
*/
|
|
339
349
|
function getAppDeploymentTransactionNote(metadata) {
|
|
340
|
-
return
|
|
350
|
+
return {
|
|
351
|
+
dAppName: app_2.APP_DEPLOY_NOTE_DAPP,
|
|
352
|
+
data: metadata,
|
|
353
|
+
format: 'j',
|
|
354
|
+
};
|
|
341
355
|
}
|
|
342
356
|
exports.getAppDeploymentTransactionNote = getAppDeploymentTransactionNote;
|
|
343
357
|
/**
|
|
344
358
|
* Replaces deploy-time deployment control parameters within the given teal code.
|
|
345
359
|
*
|
|
346
|
-
*
|
|
347
|
-
*
|
|
360
|
+
* * `TMPL_UPDATABLE` for updatability / immutability control
|
|
361
|
+
* * `TMPL_DELETABLE` for deletability / permanence control
|
|
362
|
+
*
|
|
363
|
+
* Note: If these values are not undefined, but the corresponding `TMPL_*` value
|
|
364
|
+
* isn't in the teal code it will throw an exception.
|
|
348
365
|
*
|
|
349
366
|
* @param tealCode The TEAL code to substitute
|
|
350
367
|
* @param params The deploy-time deployment control parameter value to replace
|
|
@@ -352,16 +369,16 @@ exports.getAppDeploymentTransactionNote = getAppDeploymentTransactionNote;
|
|
|
352
369
|
*/
|
|
353
370
|
function replaceDeployTimeControlParams(tealCode, params) {
|
|
354
371
|
if (params.updatable !== undefined) {
|
|
355
|
-
if (!tealCode.includes(
|
|
356
|
-
throw new Error(`Deploy-time updatability control requested for app deployment, but ${
|
|
372
|
+
if (!tealCode.includes(app_2.UPDATABLE_TEMPLATE_NAME)) {
|
|
373
|
+
throw new Error(`Deploy-time updatability control requested for app deployment, but ${app_2.UPDATABLE_TEMPLATE_NAME} not present in TEAL code`);
|
|
357
374
|
}
|
|
358
|
-
tealCode = tealCode.replace(new RegExp(
|
|
375
|
+
tealCode = tealCode.replace(new RegExp(app_2.UPDATABLE_TEMPLATE_NAME, 'g'), (params.updatable ? 1 : 0).toString());
|
|
359
376
|
}
|
|
360
377
|
if (params.deletable !== undefined) {
|
|
361
|
-
if (!tealCode.includes(
|
|
362
|
-
throw new Error(`Deploy-time deletability control requested for app deployment, but ${
|
|
378
|
+
if (!tealCode.includes(app_2.DELETABLE_TEMPLATE_NAME)) {
|
|
379
|
+
throw new Error(`Deploy-time deletability control requested for app deployment, but ${app_2.DELETABLE_TEMPLATE_NAME} not present in TEAL code`);
|
|
363
380
|
}
|
|
364
|
-
tealCode = tealCode.replace(new RegExp(
|
|
381
|
+
tealCode = tealCode.replace(new RegExp(app_2.DELETABLE_TEMPLATE_NAME, 'g'), (params.deletable ? 1 : 0).toString());
|
|
365
382
|
}
|
|
366
383
|
return tealCode;
|
|
367
384
|
}
|
|
@@ -372,15 +389,14 @@ exports.replaceDeployTimeControlParams = replaceDeployTimeControlParams;
|
|
|
372
389
|
* Looks for `TMPL_{parameter}` for template replacements.
|
|
373
390
|
*
|
|
374
391
|
* @param tealCode The TEAL logic to compile
|
|
375
|
-
* @param
|
|
392
|
+
* @param templateParams Any parameters to replace in the .teal file before compiling
|
|
376
393
|
* @returns The TEAL code with replacements
|
|
377
394
|
*/
|
|
378
|
-
function performTemplateSubstitution(tealCode,
|
|
379
|
-
if (
|
|
380
|
-
for (const key in
|
|
381
|
-
const value =
|
|
395
|
+
function performTemplateSubstitution(tealCode, templateParams) {
|
|
396
|
+
if (templateParams !== undefined) {
|
|
397
|
+
for (const key in templateParams) {
|
|
398
|
+
const value = templateParams[key];
|
|
382
399
|
const token = `TMPL_${key.replace(/^TMPL_/, '')}`;
|
|
383
|
-
// todo: handle uint8array
|
|
384
400
|
tealCode = tealCode.replace(new RegExp(token, 'g'), typeof value === 'string'
|
|
385
401
|
? `0x${Buffer.from(value, 'utf-8').toString('hex')}`
|
|
386
402
|
: ArrayBuffer.isView(value)
|
|
@@ -398,22 +414,16 @@ exports.performTemplateSubstitution = performTemplateSubstitution;
|
|
|
398
414
|
*
|
|
399
415
|
* @param tealCode The TEAL logic to compile
|
|
400
416
|
* @param algod An algod client
|
|
401
|
-
* @param
|
|
417
|
+
* @param templateParams Any parameters to replace in the .teal file before compiling
|
|
402
418
|
* @param deploymentMetadata The deployment metadata the app will be deployed with
|
|
403
419
|
* @returns The information about the compiled code
|
|
404
420
|
*/
|
|
405
|
-
async function performTemplateSubstitutionAndCompile(tealCode, algod,
|
|
406
|
-
tealCode = performTemplateSubstitution(tealCode,
|
|
421
|
+
async function performTemplateSubstitutionAndCompile(tealCode, algod, templateParams, deploymentMetadata) {
|
|
422
|
+
tealCode = performTemplateSubstitution(tealCode, templateParams);
|
|
407
423
|
if (deploymentMetadata) {
|
|
408
424
|
tealCode = replaceDeployTimeControlParams(tealCode, deploymentMetadata);
|
|
409
425
|
}
|
|
410
|
-
|
|
411
|
-
return {
|
|
412
|
-
teal: tealCode,
|
|
413
|
-
compiled: compiled.result,
|
|
414
|
-
compiledHash: compiled.hash,
|
|
415
|
-
compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),
|
|
416
|
-
};
|
|
426
|
+
return await (0, app_1.compileTeal)(tealCode, algod);
|
|
417
427
|
}
|
|
418
428
|
exports.performTemplateSubstitutionAndCompile = performTemplateSubstitutionAndCompile;
|
|
419
|
-
//# sourceMappingURL=deploy
|
|
429
|
+
//# sourceMappingURL=app-deploy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"app-deploy.js","sourceRoot":"","sources":["../src/app-deploy.ts"],"names":[],"mappings":"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"}
|