@algorandfoundation/algokit-utils 2.3.3-beta.3 → 2.3.3-beta.5

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