@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.
Files changed (158) hide show
  1. package/README.md +38 -0
  2. package/account.d.ts +41 -36
  3. package/account.d.ts.map +1 -1
  4. package/account.js +59 -44
  5. package/account.js.map +1 -1
  6. package/amount.d.ts +20 -0
  7. package/amount.d.ts.map +1 -0
  8. package/amount.js +36 -0
  9. package/amount.js.map +1 -0
  10. package/app-client.d.ts +14 -0
  11. package/app-client.d.ts.map +1 -0
  12. package/app-client.js +19 -0
  13. package/app-client.js.map +1 -0
  14. package/app-deploy.d.ts +95 -0
  15. package/app-deploy.d.ts.map +1 -0
  16. package/{deploy-app.js → app-deploy.js} +129 -119
  17. package/app-deploy.js.map +1 -0
  18. package/app.d.ts +112 -148
  19. package/app.d.ts.map +1 -1
  20. package/app.js +460 -143
  21. package/app.js.map +1 -1
  22. package/index.d.ts +6 -4
  23. package/index.d.ts.map +1 -1
  24. package/index.js +7 -4
  25. package/index.js.map +1 -1
  26. package/indexer-lookup.d.ts +11 -4
  27. package/indexer-lookup.d.ts.map +1 -1
  28. package/indexer-lookup.js +19 -9
  29. package/indexer-lookup.js.map +1 -1
  30. package/localnet.d.ts +10 -10
  31. package/localnet.d.ts.map +1 -1
  32. package/localnet.js +16 -16
  33. package/localnet.js.map +1 -1
  34. package/network-client.d.ts +15 -24
  35. package/network-client.d.ts.map +1 -1
  36. package/network-client.js +16 -16
  37. package/network-client.js.map +1 -1
  38. package/package.json +2 -2
  39. package/testing/account.d.ts +14 -0
  40. package/testing/account.d.ts.map +1 -0
  41. package/testing/account.js +31 -0
  42. package/testing/account.js.map +1 -0
  43. package/testing/fixtures/algokit-log-capture-fixture.d.ts +19 -0
  44. package/testing/fixtures/algokit-log-capture-fixture.d.ts.map +1 -0
  45. package/testing/fixtures/algokit-log-capture-fixture.js +43 -0
  46. package/testing/fixtures/algokit-log-capture-fixture.js.map +1 -0
  47. package/testing/fixtures/algorand-fixture.d.ts +24 -0
  48. package/testing/fixtures/algorand-fixture.d.ts.map +1 -0
  49. package/testing/fixtures/algorand-fixture.js +60 -0
  50. package/testing/fixtures/algorand-fixture.js.map +1 -0
  51. package/testing/fixtures/index.d.ts +3 -0
  52. package/testing/fixtures/index.d.ts.map +1 -0
  53. package/testing/fixtures/index.js +19 -0
  54. package/testing/fixtures/index.js.map +1 -0
  55. package/testing/index.d.ts +6 -0
  56. package/testing/index.d.ts.map +1 -0
  57. package/testing/index.js +22 -0
  58. package/testing/index.js.map +1 -0
  59. package/testing/indexer.d.ts +12 -0
  60. package/testing/indexer.d.ts.map +1 -0
  61. package/testing/indexer.js +40 -0
  62. package/testing/indexer.js.map +1 -0
  63. package/testing/test-logger.d.ts +41 -0
  64. package/testing/test-logger.d.ts.map +1 -0
  65. package/testing/test-logger.js +71 -0
  66. package/testing/test-logger.js.map +1 -0
  67. package/testing/transaction-logger.d.ts +29 -0
  68. package/testing/transaction-logger.d.ts.map +1 -0
  69. package/testing/transaction-logger.js +71 -0
  70. package/testing/transaction-logger.js.map +1 -0
  71. package/transaction.d.ts +55 -91
  72. package/transaction.d.ts.map +1 -1
  73. package/transaction.js +213 -155
  74. package/transaction.js.map +1 -1
  75. package/transfer.d.ts +14 -16
  76. package/transfer.d.ts.map +1 -1
  77. package/transfer.js +38 -4
  78. package/transfer.js.map +1 -1
  79. package/types/account.d.ts +55 -0
  80. package/types/account.d.ts.map +1 -0
  81. package/types/account.js +91 -0
  82. package/types/account.js.map +1 -0
  83. package/types/algo-http-client-with-retry.d.ts.map +1 -0
  84. package/{algo-http-client-with-retry.js → types/algo-http-client-with-retry.js} +3 -3
  85. package/types/algo-http-client-with-retry.js.map +1 -0
  86. package/types/algod.d.ts +28 -15
  87. package/types/algod.d.ts.map +1 -1
  88. package/{algo-amount.d.ts → types/amount.d.ts} +9 -3
  89. package/types/amount.d.ts.map +1 -0
  90. package/{algo-amount.js → types/amount.js} +13 -3
  91. package/types/amount.js.map +1 -0
  92. package/types/app-client.d.ts +282 -0
  93. package/types/app-client.d.ts.map +1 -0
  94. package/types/app-client.js +529 -0
  95. package/types/app-client.js.map +1 -0
  96. package/types/app-spec.d.ts +141 -0
  97. package/types/app-spec.d.ts.map +1 -0
  98. package/types/{appspec.js → app-spec.js} +5 -7
  99. package/types/app-spec.js.map +1 -0
  100. package/types/app.d.ts +285 -0
  101. package/types/app.d.ts.map +1 -0
  102. package/types/app.js +32 -0
  103. package/types/app.js.map +1 -0
  104. package/types/config.d.ts +32 -0
  105. package/types/config.d.ts.map +1 -0
  106. package/types/config.js +53 -0
  107. package/types/config.js.map +1 -0
  108. package/types/indexer.d.ts +368 -58
  109. package/types/indexer.d.ts.map +1 -1
  110. package/types/indexer.js +9 -0
  111. package/types/indexer.js.map +1 -1
  112. package/{config.d.ts → types/logging.d.ts} +2 -16
  113. package/types/logging.d.ts.map +1 -0
  114. package/{config.js → types/logging.js} +5 -24
  115. package/types/logging.js.map +1 -0
  116. package/types/logic-error.d.ts +37 -0
  117. package/types/logic-error.d.ts.map +1 -0
  118. package/types/logic-error.js +50 -0
  119. package/types/logic-error.js.map +1 -0
  120. package/types/network-client.d.ts +11 -0
  121. package/types/network-client.d.ts.map +1 -0
  122. package/types/network-client.js +3 -0
  123. package/types/network-client.js.map +1 -0
  124. package/types/testing.d.ts +89 -0
  125. package/types/testing.d.ts.map +1 -0
  126. package/types/testing.js +3 -0
  127. package/types/testing.js.map +1 -0
  128. package/types/transaction.d.ts +112 -0
  129. package/types/transaction.d.ts.map +1 -0
  130. package/types/transaction.js +3 -0
  131. package/types/transaction.js.map +1 -0
  132. package/types/transfer.d.ts +32 -0
  133. package/types/transfer.d.ts.map +1 -0
  134. package/types/transfer.js +3 -0
  135. package/types/transfer.js.map +1 -0
  136. package/types/urlTokenBaseHTTPClient.d.ts.map +1 -0
  137. package/types/urlTokenBaseHTTPClient.js.map +1 -0
  138. package/algo-amount.d.ts.map +0 -1
  139. package/algo-amount.js.map +0 -1
  140. package/algo-http-client-with-retry.d.ts.map +0 -1
  141. package/algo-http-client-with-retry.js.map +0 -1
  142. package/application-client.d.ts +0 -113
  143. package/application-client.d.ts.map +0 -1
  144. package/application-client.js +0 -258
  145. package/application-client.js.map +0 -1
  146. package/config.d.ts.map +0 -1
  147. package/config.js.map +0 -1
  148. package/deploy-app.d.ts +0 -164
  149. package/deploy-app.d.ts.map +0 -1
  150. package/deploy-app.js.map +0 -1
  151. package/types/appspec.d.ts +0 -78
  152. package/types/appspec.d.ts.map +0 -1
  153. package/types/appspec.js.map +0 -1
  154. package/urlTokenBaseHTTPClient.d.ts.map +0 -1
  155. package/urlTokenBaseHTTPClient.js.map +0 -1
  156. /package/{algo-http-client-with-retry.d.ts → types/algo-http-client-with-retry.d.ts} +0 -0
  157. /package/{urlTokenBaseHTTPClient.d.ts → types/urlTokenBaseHTTPClient.d.ts} +0 -0
  158. /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.schemaIsBroken = exports.deployApp = exports.OnSchemaBreak = exports.OnUpdate = exports.APP_DEPLOY_NOTE_PREFIX = exports.DELETABLE_TEMPLATE_NAME = exports.UPDATABLE_TEMPLATE_NAME = void 0;
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
- exports.UPDATABLE_TEMPLATE_NAME = 'TMPL_UPDATABLE';
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 @see https://github.com/algorandfoundation/algokit-cli/blob/main/docs/architecture-decisions/2023-01-12_smart-contract-deployment.md
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
- config_1.AlgoKitConfig.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`);
49
- appParams.approvalProgram =
50
- typeof appParams.approvalProgram === 'string'
51
- ? (await performTemplateSubstitutionAndCompile(appParams.approvalProgram, algod, deployTimeParameters, metadata))
52
- .compiledBase64ToBytes
53
- : appParams.approvalProgram;
54
- appParams.clearStateProgram =
55
- typeof appParams.clearStateProgram === 'string'
56
- ? (await performTemplateSubstitutionAndCompile(appParams.clearStateProgram, algod, deployTimeParameters)).compiledBase64ToBytes
57
- : appParams.clearStateProgram;
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 (skipSending) => {
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
- skipSending: skipSending ?? false,
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
- appIndex: result.appIndex,
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
- config_1.AlgoKitConfig.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}.`);
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`Existing app ${metadata.name} found by creator ${(0, transaction_1.getSenderAddress)(appParams.from)}, with app index ${existingApp.appIndex} and version ${existingApp.version}.`);
86
- const existingAppRecord = await (0, app_1.getAppByIndex)(existingApp.appIndex, algod);
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 = schemaIsBroken(existingGlobalSchema, newGlobalSchema) || schemaIsBroken(existingLocalSchema, newLocalSchema);
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`Deploying a new ${metadata.name} app for ${(0, transaction_1.getSenderAddress)(appParams.from)}; deploying app with version ${metadata.version}.`);
108
- const { transaction: createTransaction } = await create(true);
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).warn(`Deleting existing ${metadata.name} app with index ${existingApp.appIndex} from ${(0, transaction_1.getSenderAddress)(appParams.from)} account.`);
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
- appIndex: existingApp.appIndex,
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.sendGroupOfTransactions)({
122
- transactions: [
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[0];
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).warn(`Sent transactions ${createTransaction.txID()} to create app with index ${newAppIndex} and ${deleteTransaction.txID()} to delete app with index ${existingApp.appIndex} from ${(0, transaction_1.getSenderAddress)(appParams.from)} account.`);
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
- appIndex: newAppIndex,
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`Updating existing ${metadata.name} app for ${(0, transaction_1.getSenderAddress)(appParams.from)} to version ${metadata.version}.`);
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
- appIndex: existingApp.appIndex,
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
- appIndex: existingApp.appIndex,
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).warn(`Detected a breaking app schema change in app ${existingApp.appIndex}:`, {
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info('App is deletable and onSchemaBreak=ReplaceApp, will attempt to create new app and delete old app');
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info('App is not deletable but onSchemaBreak=ReplaceApp, will attempt to delete app, delete will most likely fail');
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`Detected a TEAL update in app ${existingApp.appIndex} for creator ${(0, transaction_1.getSenderAddress)(appParams.from)}`);
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`);
220
+ _1.Config.getLogger(appParams.suppressLog).info(`App is updatable and onUpdate=UpdateApp, updating app...`);
220
221
  }
221
222
  else {
222
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).warn(`App is not updatable but onUpdate=UpdateApp, will attempt to update app, update will most likely fail`);
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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).warn('App is deletable and onUpdate=ReplaceApp, creating new app and deleting old app...');
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
- config_1.AlgoKitConfig.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
+ _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
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).debug('No detected changes in app, nothing to do.');
237
- return { ...existingApp, operationPerformed: 'none' };
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 schemaIsBroken(before, after) {
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.schemaIsBroken = schemaIsBroken;
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 @see {AppDeployNote} in the transaction note of the creation transaction.
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)).map((a) => {
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(exports.APP_DEPLOY_NOTE_PREFIX).toString('base64')));
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(`${exports.APP_DEPLOY_NOTE_PREFIX}{`))
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(exports.APP_DEPLOY_NOTE_PREFIX.length));
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
- appIndex: createdApp.id,
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
- config_1.AlgoKitConfig.logger.warn(`Received error trying to retrieve app with ${createdApp.id} for creator ${creatorAddress}; failing silently`, e);
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 `${exports.APP_DEPLOY_NOTE_PREFIX}${JSON.stringify(metadata)}`;
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
- * @see {UPDATABLE_TEMPLATE_NAME}
347
- * @see {DELETABLE_TEMPLATE_NAME}
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(exports.UPDATABLE_TEMPLATE_NAME)) {
356
- throw new Error(`Deploy-time updatability control requested for app deployment, but ${exports.UPDATABLE_TEMPLATE_NAME} not present in TEAL code`);
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(exports.UPDATABLE_TEMPLATE_NAME, 'g'), (params.updatable ? 1 : 0).toString());
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(exports.DELETABLE_TEMPLATE_NAME)) {
362
- throw new Error(`Deploy-time deletability control requested for app deployment, but ${exports.DELETABLE_TEMPLATE_NAME} not present in TEAL code`);
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(exports.DELETABLE_TEMPLATE_NAME, 'g'), (params.deletable ? 1 : 0).toString());
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 templateParameters Any parameters to replace in the .teal file before compiling
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, templateParameters) {
379
- if (templateParameters !== undefined) {
380
- for (const key in templateParameters) {
381
- const value = templateParameters[key];
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 templateParameters Any parameters to replace in the .teal file before compiling
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, templateParameters, deploymentMetadata) {
406
- tealCode = performTemplateSubstitution(tealCode, templateParameters);
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
- const compiled = await algod.compile(tealCode).do();
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-app.js.map
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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"}