@algorandfoundation/algokit-utils 1.0.0-beta.4 → 1.0.0-beta.40

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 (188) hide show
  1. package/README.md +9 -2
  2. package/{dist/account.d.ts → account.d.ts} +41 -36
  3. package/account.d.ts.map +1 -0
  4. package/{dist/account.js → account.js} +59 -44
  5. package/account.js.map +1 -0
  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/{dist/deploy-app.js → app-deploy.js} +158 -121
  17. package/app-deploy.js.map +1 -0
  18. package/app.d.ts +153 -0
  19. package/app.d.ts.map +1 -0
  20. package/app.js +582 -0
  21. package/app.js.map +1 -0
  22. package/index.d.ts +14 -0
  23. package/index.d.ts.map +1 -0
  24. package/{dist/index.js → index.js} +7 -3
  25. package/index.js.map +1 -0
  26. package/{dist/indexer-lookup.d.ts → indexer-lookup.d.ts} +11 -4
  27. package/indexer-lookup.d.ts.map +1 -0
  28. package/{dist/indexer-lookup.js → indexer-lookup.js} +19 -9
  29. package/indexer-lookup.js.map +1 -0
  30. package/{dist/localnet.d.ts → localnet.d.ts} +10 -10
  31. package/localnet.d.ts.map +1 -0
  32. package/{dist/localnet.js → localnet.js} +16 -16
  33. package/localnet.js.map +1 -0
  34. package/{dist/network-client.d.ts → network-client.d.ts} +15 -24
  35. package/network-client.d.ts.map +1 -0
  36. package/{dist/network-client.js → network-client.js} +16 -16
  37. package/{dist/network-client.js.map → network-client.js.map} +1 -1
  38. package/package.json +5 -93
  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 +121 -0
  72. package/transaction.d.ts.map +1 -0
  73. package/transaction.js +364 -0
  74. package/transaction.js.map +1 -0
  75. package/transfer.d.ts +22 -0
  76. package/transfer.d.ts.map +1 -0
  77. package/transfer.js +67 -0
  78. package/transfer.js.map +1 -0
  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/{dist → types}/algo-http-client-with-retry.js +2 -2
  85. package/types/algo-http-client-with-retry.js.map +1 -0
  86. package/{dist/types → types}/algod.d.ts +28 -15
  87. package/types/algod.d.ts.map +1 -0
  88. package/{dist/algo-amount.d.ts → types/amount.d.ts} +9 -3
  89. package/types/amount.d.ts.map +1 -0
  90. package/{dist/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/{dist/types/appspec.js → types/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 +624 -0
  109. package/types/indexer.d.ts.map +1 -0
  110. package/{dist/types → types}/indexer.js +9 -0
  111. package/types/indexer.js.map +1 -0
  112. package/{dist/config.d.ts → types/logging.d.ts} +2 -16
  113. package/types/logging.d.ts.map +1 -0
  114. package/{dist/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/LICENSE +0 -21
  139. package/dist/account.d.ts.map +0 -1
  140. package/dist/account.js.map +0 -1
  141. package/dist/algo-amount.d.ts.map +0 -1
  142. package/dist/algo-amount.js.map +0 -1
  143. package/dist/algo-http-client-with-retry.d.ts.map +0 -1
  144. package/dist/algo-http-client-with-retry.js.map +0 -1
  145. package/dist/app.d.ts +0 -150
  146. package/dist/app.d.ts.map +0 -1
  147. package/dist/app.js +0 -156
  148. package/dist/app.js.map +0 -1
  149. package/dist/application-client.d.ts +0 -71
  150. package/dist/application-client.d.ts.map +0 -1
  151. package/dist/application-client.js +0 -145
  152. package/dist/application-client.js.map +0 -1
  153. package/dist/config.d.ts.map +0 -1
  154. package/dist/config.js.map +0 -1
  155. package/dist/deploy-app.d.ts +0 -149
  156. package/dist/deploy-app.d.ts.map +0 -1
  157. package/dist/deploy-app.js.map +0 -1
  158. package/dist/index.d.ts +0 -11
  159. package/dist/index.d.ts.map +0 -1
  160. package/dist/index.js.map +0 -1
  161. package/dist/indexer-lookup.d.ts.map +0 -1
  162. package/dist/indexer-lookup.js.map +0 -1
  163. package/dist/localnet.d.ts.map +0 -1
  164. package/dist/localnet.js.map +0 -1
  165. package/dist/network-client.d.ts.map +0 -1
  166. package/dist/package.json +0 -20
  167. package/dist/transaction.d.ts +0 -152
  168. package/dist/transaction.d.ts.map +0 -1
  169. package/dist/transaction.js +0 -268
  170. package/dist/transaction.js.map +0 -1
  171. package/dist/transfer.d.ts +0 -24
  172. package/dist/transfer.d.ts.map +0 -1
  173. package/dist/transfer.js +0 -33
  174. package/dist/transfer.js.map +0 -1
  175. package/dist/types/algod.d.ts.map +0 -1
  176. package/dist/types/appspec.d.ts +0 -79
  177. package/dist/types/appspec.d.ts.map +0 -1
  178. package/dist/types/appspec.js.map +0 -1
  179. package/dist/types/indexer.d.ts +0 -314
  180. package/dist/types/indexer.d.ts.map +0 -1
  181. package/dist/types/indexer.js.map +0 -1
  182. package/dist/urlTokenBaseHTTPClient.d.ts.map +0 -1
  183. package/dist/urlTokenBaseHTTPClient.js.map +0 -1
  184. /package/{dist → types}/algo-http-client-with-retry.d.ts +0 -0
  185. /package/{dist/types → types}/algod.js +0 -0
  186. /package/{dist/types → types}/algod.js.map +0 -0
  187. /package/{dist → types}/urlTokenBaseHTTPClient.d.ts +0 -0
  188. /package/{dist → types}/urlTokenBaseHTTPClient.js +0 -0
@@ -1,88 +1,81 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.performTemplateSubstitutionAndCompile = 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
34
14
  *
35
- * **Note:** if there is a breaking state schema change to an existing app (and `onSchemaBreak` is set to `'delete'`) the existing app will be deleted and re-created.
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`.
36
16
  *
37
- * **Note:** if there is an update (different TEAL code) to an existing app (and `onUpdate` is set to `'delete'`) the existing app will be deleted and re-created.
38
- * @param deployment The arguments to control the app deployment, including:
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.
18
+ *
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.
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']),
74
64
  updatedRound: Number(result.confirmation?.['confirmed-round']),
75
65
  ...metadata,
76
66
  deleted: false,
67
+ operationPerformed: 'create',
68
+ compiledApproval,
69
+ compiledClear,
77
70
  };
78
71
  };
79
72
  const existingApp = apps.apps[metadata.name];
80
- if (!existingApp) {
81
- 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}.`);
82
75
  return await create();
83
76
  }
84
- 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}.`);
85
- 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);
86
79
  const existingApproval = existingAppRecord.params['approval-program'];
87
80
  const existingClear = existingAppRecord.params['clear-state-program'];
88
81
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
@@ -100,34 +93,28 @@ async function deployApp(deployment, algod, indexer) {
100
93
  const newApproval = Buffer.from(appParams.approvalProgram).toString('base64');
101
94
  const newClear = Buffer.from(appParams.clearStateProgram).toString('base64');
102
95
  const isUpdate = newApproval !== existingApproval || newClear !== existingClear;
103
- const isSchemaBreak = schemaIsBroken(existingGlobalSchema, newGlobalSchema) || schemaIsBroken(existingLocalSchema, newLocalSchema);
96
+ const isSchemaBreak = isSchemaIsBroken(existingGlobalSchema, newGlobalSchema) || isSchemaIsBroken(existingLocalSchema, newLocalSchema);
104
97
  const replace = async () => {
98
+ const atc = new algosdk_1.AtomicTransactionComposer();
105
99
  // Create
106
- 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}.`);
107
- const { transaction: createTransaction, ...newApp } = 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();
108
103
  // Delete
109
- 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.`);
110
105
  const { transaction: deleteTransaction } = await (0, app_1.callApp)({
111
- appIndex: existingApp.appIndex,
106
+ appId: existingApp.appId,
112
107
  callType: 'delete',
113
108
  from: appParams.from,
114
109
  args: deleteArgs,
115
110
  transactionParams: appParams.transactionParams,
116
111
  suppressLog: appParams.suppressLog,
117
112
  skipSending: true,
113
+ atc,
118
114
  }, algod);
119
115
  // Ensure create and delete happen atomically
120
- const { confirmations } = await (0, transaction_1.sendGroupOfTransactions)({
121
- transactions: [
122
- {
123
- transaction: createTransaction,
124
- signer: appParams.from,
125
- },
126
- {
127
- transaction: deleteTransaction,
128
- signer: appParams.from,
129
- },
130
- ],
116
+ const { transactions, confirmations, returns } = await (0, transaction_1.sendAtomicTransactionComposer)({
117
+ atc,
131
118
  sendParams: {
132
119
  maxRoundsToWaitForConfirmation: appParams.maxRoundsToWaitForConfirmation,
133
120
  skipWaiting: false,
@@ -135,16 +122,22 @@ async function deployApp(deployment, algod, indexer) {
135
122
  },
136
123
  }, algod);
137
124
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
138
- const createConfirmation = confirmations[0];
125
+ const createConfirmation = confirmations[createTransactions.length - 1];
139
126
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
140
- const deleteConfirmation = confirmations[1];
127
+ const deleteConfirmation = confirmations[confirmations.length - 1];
141
128
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
142
129
  const newAppIndex = createConfirmation['application-index'];
143
- 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.`);
144
131
  return {
145
132
  transaction: createTransaction,
133
+ transactions: transactions,
134
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
146
135
  confirmation: createConfirmation,
147
- 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,
148
141
  appAddress: (0, algosdk_1.getApplicationAddress)(newAppIndex),
149
142
  createdMetadata: metadata,
150
143
  createdRound: Number(createConfirmation['confirmed-round']),
@@ -152,12 +145,15 @@ async function deployApp(deployment, algod, indexer) {
152
145
  ...metadata,
153
146
  deleted: false,
154
147
  deleteResult: { transaction: deleteTransaction, confirmation: deleteConfirmation },
148
+ operationPerformed: 'replace',
149
+ compiledApproval,
150
+ compiledClear,
155
151
  };
156
152
  };
157
153
  const update = async () => {
158
- 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}.`);
159
155
  const result = await (0, app_1.updateApp)({
160
- appIndex: existingApp.appIndex,
156
+ appId: existingApp.appId,
161
157
  from: appParams.from,
162
158
  args: updateArgs,
163
159
  note: getAppDeploymentTransactionNote(metadata),
@@ -170,18 +166,26 @@ async function deployApp(deployment, algod, indexer) {
170
166
  }, algod);
171
167
  return {
172
168
  transaction: result.transaction,
169
+ transactions: result.transactions,
170
+ // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
173
171
  confirmation: result.confirmation,
174
- 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,
175
176
  appAddress: existingApp.appAddress,
176
177
  createdMetadata: existingApp.createdMetadata,
177
178
  createdRound: existingApp.createdRound,
178
179
  updatedRound: Number(result.confirmation?.['confirmed-round']),
179
180
  ...metadata,
180
181
  deleted: false,
182
+ operationPerformed: 'update',
183
+ compiledApproval,
184
+ compiledClear,
181
185
  };
182
186
  };
183
187
  if (isSchemaBreak) {
184
- 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}:`, {
185
189
  from: {
186
190
  global: existingGlobalSchema,
187
191
  local: existingLocalSchema,
@@ -191,47 +195,47 @@ async function deployApp(deployment, algod, indexer) {
191
195
  local: newLocalSchema,
192
196
  },
193
197
  });
194
- if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === OnSchemaBreak.Fail) {
198
+ if (onSchemaBreak === undefined || onSchemaBreak === 'fail' || onSchemaBreak === app_2.OnSchemaBreak.Fail) {
195
199
  throw new Error('Schema break detected and onSchemaBreak=OnSchemaBreak.Fail, stopping deployment. ' +
196
200
  'If you want to try deleting and recreating the app then ' +
197
201
  're-run with onSchemaBreak=OnSchemaBreak.ReplaceApp');
198
202
  }
199
203
  if (existingApp.deletable) {
200
- 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');
201
205
  }
202
206
  else {
203
- 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');
204
208
  }
205
209
  return await replace();
206
210
  }
207
211
  if (isUpdate) {
208
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).info(`Detected a TEAL update in app ${existingApp.appIndex} for creator ${(0, transaction_1.getSenderAddress)(appParams.from)}`);
209
- 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) {
210
214
  throw new Error('Update detected and onUpdate=Fail, stopping deployment. ' +
211
215
  'If you want to try deleting and recreating the app then ' +
212
216
  're-run with onUpdate=UpdateApp');
213
217
  }
214
- if (onUpdate === 'update' || onUpdate === OnUpdate.UpdateApp) {
218
+ if (onUpdate === 'update' || onUpdate === app_2.OnUpdate.UpdateApp) {
215
219
  if (existingApp.updatable) {
216
- 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...`);
217
221
  }
218
222
  else {
219
- 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`);
220
224
  }
221
225
  return await update();
222
226
  }
223
- if (onUpdate === 'replace' || onUpdate === OnUpdate.ReplaceApp) {
227
+ if (onUpdate === 'replace' || onUpdate === app_2.OnUpdate.ReplaceApp) {
224
228
  if (existingApp.deletable) {
225
- 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...');
226
230
  }
227
231
  else {
228
- 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');
229
233
  }
230
234
  return await replace();
231
235
  }
232
236
  }
233
- config_1.AlgoKitConfig.getLogger(appParams.suppressLog).debug('No detected changes in app, nothing to do.');
234
- return existingApp;
237
+ _1.Config.getLogger(appParams.suppressLog).debug('No detected changes in app, nothing to do.');
238
+ return { ...existingApp, operationPerformed: 'nothing', compiledApproval, compiledClear };
235
239
  }
236
240
  exports.deployApp = deployApp;
237
241
  /** Returns true is there is a breaking change in the application state schema from before to after.
@@ -242,12 +246,12 @@ exports.deployApp = deployApp;
242
246
  * @param after The new schema
243
247
  * @returns Whether or not there is a breaking change
244
248
  */
245
- function schemaIsBroken(before, after) {
249
+ function isSchemaIsBroken(before, after) {
246
250
  return before['num-byte-slice'] < after['num-byte-slice'] || before['num-uint'] < after['num-uint'];
247
251
  }
248
- exports.schemaIsBroken = schemaIsBroken;
252
+ exports.isSchemaIsBroken = isSchemaIsBroken;
249
253
  /**
250
- * 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.
251
255
  *
252
256
  * **Note:** It's recommended this is only called once and then stored since it's a somewhat expensive operation (multiple indexer calls).
253
257
  *
@@ -259,12 +263,14 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
259
263
  const appLookup = {};
260
264
  const creatorAddress = typeof creatorAccount !== 'string' ? (0, transaction_1.getSenderAddress)(creatorAccount) : creatorAccount;
261
265
  // Extract all apps that account created
262
- 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) => {
263
268
  // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
264
269
  return { id: a.id, createdAtRound: a['created-at-round'], deleted: a.deleted };
265
- });
270
+ })
271
+ .sort((a, b) => a.createdAtRound - b.createdAtRound);
266
272
  // For each app that account created (in parallel)...
267
- await Promise.all(createdApps.map(async (createdApp) => {
273
+ const apps = await Promise.all(createdApps.map(async (createdApp) => {
268
274
  // Find any app transactions for that app in the round it was created (should always just be a single creation transaction)
269
275
  const appTransactions = await (0, indexer_lookup_1.searchTransactions)(indexer, (s) => s
270
276
  .minRound(createdApp.createdAtRound)
@@ -272,7 +278,7 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
272
278
  .applicationID(createdApp.id)
273
279
  .address(creatorAddress)
274
280
  .addressRole('sender')
275
- .notePrefix(Buffer.from(exports.APP_DEPLOY_NOTE_PREFIX).toString('base64')));
281
+ .notePrefix(Buffer.from(app_2.APP_DEPLOY_NOTE_DAPP).toString('base64')));
276
282
  // Triple check the transaction is intact by filtering for the one we want:
277
283
  // * application-id is 0 when the app is first created
278
284
  // * also verify the sender to prevent a potential security risk
@@ -288,7 +294,14 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
288
294
  b['confirmed-round'] - a['confirmed-round'])[0];
289
295
  if (!appCreationTransaction?.note)
290
296
  // No note; ignoring
291
- 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;
292
305
  const parseNote = (note) => {
293
306
  if (!note) {
294
307
  // No note; ignoring...
@@ -297,17 +310,17 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
297
310
  const decoder = new TextDecoder();
298
311
  const noteAsBase64 = decoder.decode(Buffer.from(note));
299
312
  const noteAsString = Buffer.from(noteAsBase64, 'base64').toString('utf-8');
300
- if (!noteAsString.startsWith(`${exports.APP_DEPLOY_NOTE_PREFIX}{`))
313
+ if (!noteAsString.startsWith(`${app_2.APP_DEPLOY_NOTE_DAPP}:j{`))
301
314
  // Clearly not APP_DEPLOY JSON; ignoring...
302
315
  return;
303
- 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));
304
317
  };
305
318
  try {
306
319
  const creationNote = parseNote(appCreationTransaction.note);
307
320
  const updateNote = parseNote(latestAppUpdateTransaction.note);
308
321
  if (creationNote?.name) {
309
322
  appLookup[creationNote.name] = {
310
- appIndex: createdApp.id,
323
+ appId: createdApp.id,
311
324
  appAddress: (0, algosdk_1.getApplicationAddress)(createdApp.id),
312
325
  createdMetadata: creationNote,
313
326
  createdRound: Number(appCreationTransaction['confirmed-round']),
@@ -318,10 +331,10 @@ async function getCreatorAppsByName(creatorAccount, indexer) {
318
331
  }
319
332
  }
320
333
  catch (e) {
321
- 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);
322
335
  return;
323
336
  }
324
- }));
337
+ });
325
338
  return {
326
339
  creator: creatorAddress,
327
340
  apps: appLookup,
@@ -334,42 +347,56 @@ exports.getCreatorAppsByName = getCreatorAppsByName;
334
347
  * @returns The transaction note as a utf-8 string
335
348
  */
336
349
  function getAppDeploymentTransactionNote(metadata) {
337
- 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
+ };
338
355
  }
339
356
  exports.getAppDeploymentTransactionNote = getAppDeploymentTransactionNote;
340
357
  /**
341
358
  * Replaces deploy-time deployment control parameters within the given teal code.
342
359
  *
343
- * @see {UPDATABLE_TEMPLATE_NAME}
344
- * @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.
345
365
  *
346
366
  * @param tealCode The TEAL code to substitute
347
367
  * @param params The deploy-time deployment control parameter value to replace
348
368
  * @returns The replaced TEAL code
349
369
  */
350
370
  function replaceDeployTimeControlParams(tealCode, params) {
351
- return tealCode
352
- .replace(exports.UPDATABLE_TEMPLATE_NAME, (params.updatable ? 1 : 0).toString())
353
- .replace(exports.DELETABLE_TEMPLATE_NAME, (params.deletable ? 1 : 0).toString());
371
+ if (params.updatable !== undefined) {
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`);
374
+ }
375
+ tealCode = tealCode.replace(new RegExp(app_2.UPDATABLE_TEMPLATE_NAME, 'g'), (params.updatable ? 1 : 0).toString());
376
+ }
377
+ if (params.deletable !== undefined) {
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`);
380
+ }
381
+ tealCode = tealCode.replace(new RegExp(app_2.DELETABLE_TEMPLATE_NAME, 'g'), (params.deletable ? 1 : 0).toString());
382
+ }
383
+ return tealCode;
354
384
  }
355
385
  exports.replaceDeployTimeControlParams = replaceDeployTimeControlParams;
356
386
  /**
357
- * Performs template substitution of a teal file and compiles it, returning the compiled result and optionally caching on the file system.
387
+ * Performs template substitution of a teal file.
358
388
  *
359
389
  * Looks for `TMPL_{parameter}` for template replacements.
360
390
  *
361
391
  * @param tealCode The TEAL logic to compile
362
- * @param algod An algod client
363
- * @param templateParameters Any parameters to replace in the .teal file before compiling
364
- * @param deploymentMetadata The deployment metadata the app will be deployed with
365
- * @returns The information about the compiled code
392
+ * @param templateParams Any parameters to replace in the .teal file before compiling
393
+ * @returns The TEAL code with replacements
366
394
  */
367
- async function performTemplateSubstitutionAndCompile(tealCode, algod, templateParameters, deploymentMetadata) {
368
- if (templateParameters !== undefined) {
369
- for (const key in templateParameters) {
370
- const value = templateParameters[key];
371
- const token = `TMPL_${key}`;
372
- // todo: handle uint8array
395
+ function performTemplateSubstitution(tealCode, templateParams) {
396
+ if (templateParams !== undefined) {
397
+ for (const key in templateParams) {
398
+ const value = templateParams[key];
399
+ const token = `TMPL_${key.replace(/^TMPL_/, '')}`;
373
400
  tealCode = tealCode.replace(new RegExp(token, 'g'), typeof value === 'string'
374
401
  ? `0x${Buffer.from(value, 'utf-8').toString('hex')}`
375
402
  : ArrayBuffer.isView(value)
@@ -377,16 +404,26 @@ async function performTemplateSubstitutionAndCompile(tealCode, algod, templatePa
377
404
  : value.toString());
378
405
  }
379
406
  }
407
+ return tealCode;
408
+ }
409
+ exports.performTemplateSubstitution = performTemplateSubstitution;
410
+ /**
411
+ * Performs template substitution of a teal file and compiles it, returning the compiled result.
412
+ *
413
+ * Looks for `TMPL_{parameter}` for template replacements.
414
+ *
415
+ * @param tealCode The TEAL logic to compile
416
+ * @param algod An algod client
417
+ * @param templateParams Any parameters to replace in the .teal file before compiling
418
+ * @param deploymentMetadata The deployment metadata the app will be deployed with
419
+ * @returns The information about the compiled code
420
+ */
421
+ async function performTemplateSubstitutionAndCompile(tealCode, algod, templateParams, deploymentMetadata) {
422
+ tealCode = performTemplateSubstitution(tealCode, templateParams);
380
423
  if (deploymentMetadata) {
381
424
  tealCode = replaceDeployTimeControlParams(tealCode, deploymentMetadata);
382
425
  }
383
- const compiled = await algod.compile(tealCode).do();
384
- return {
385
- teal: tealCode,
386
- compiled: compiled.result,
387
- compiledHash: compiled.hash,
388
- compiledBase64ToBytes: new Uint8Array(Buffer.from(compiled.result, 'base64')),
389
- };
426
+ return await (0, app_1.compileTeal)(tealCode, algod);
390
427
  }
391
428
  exports.performTemplateSubstitutionAndCompile = performTemplateSubstitutionAndCompile;
392
- //# 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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"}