@algorandfoundation/algokit-utils 10.0.0-alpha.3 → 10.0.0-alpha.31

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 (487) hide show
  1. package/_virtual/rolldown_runtime.js +10 -15
  2. package/abi/index.d.ts +2 -1
  3. package/abi/index.js +3 -0
  4. package/abi/index.mjs +2 -1
  5. package/algod-client/index.d.ts +3 -7
  6. package/algod-client/index.js +2 -5
  7. package/algod-client/index.mjs +2 -2
  8. package/index.d.ts +1 -2
  9. package/index.js +0 -7
  10. package/index.mjs +1 -2
  11. package/indexer-client/index.d.ts +2 -2
  12. package/indexer-client/index.js +6 -6
  13. package/indexer-client/index.mjs +2 -2
  14. package/{indexer-lookup.d.ts → indexer-client/indexer-lookup.d.ts} +8 -11
  15. package/{indexer-lookup.mjs → indexer-client/indexer-lookup.js} +6 -10
  16. package/indexer-client/indexer-lookup.js.map +1 -0
  17. package/{indexer-lookup.js → indexer-client/indexer-lookup.mjs} +3 -18
  18. package/indexer-client/indexer-lookup.mjs.map +1 -0
  19. package/kmd-client/index.d.ts +1 -2
  20. package/kmd-client/index.js +0 -5
  21. package/kmd-client/index.mjs +1 -2
  22. package/package.json +5 -6
  23. package/packages/abi/src/abi-method.d.ts +1 -1
  24. package/packages/abi/src/abi-method.js +1 -1
  25. package/packages/abi/src/abi-method.js.map +1 -1
  26. package/packages/abi/src/abi-method.mjs +1 -1
  27. package/packages/abi/src/abi-method.mjs.map +1 -1
  28. package/packages/abi/src/abi-type.d.ts +1 -3
  29. package/packages/abi/src/abi-type.js +7 -36
  30. package/packages/abi/src/abi-type.js.map +1 -1
  31. package/packages/abi/src/abi-type.mjs +7 -36
  32. package/packages/abi/src/abi-type.mjs.map +1 -1
  33. package/packages/abi/src/arc56-contract.js +1 -0
  34. package/packages/abi/src/arc56-contract.js.map +1 -1
  35. package/packages/abi/src/arc56-contract.mjs +1 -0
  36. package/packages/abi/src/arc56-contract.mjs.map +1 -1
  37. package/packages/abi/src/utils.d.ts +22 -0
  38. package/packages/abi/src/utils.js +57 -0
  39. package/packages/abi/src/utils.js.map +1 -0
  40. package/packages/abi/src/utils.mjs +55 -0
  41. package/packages/abi/src/utils.mjs.map +1 -0
  42. package/packages/algo25/src/index.js +1 -1
  43. package/packages/algo25/src/index.mjs +1 -1
  44. package/packages/algod_client/src/apis/api-service.d.ts +44 -44
  45. package/packages/algod_client/src/apis/api-service.js +155 -155
  46. package/packages/algod_client/src/apis/api-service.js.map +1 -1
  47. package/packages/algod_client/src/apis/api-service.mjs +155 -155
  48. package/packages/algod_client/src/apis/api-service.mjs.map +1 -1
  49. package/packages/algod_client/src/core/api-error.js +3 -1
  50. package/packages/algod_client/src/core/api-error.js.map +1 -1
  51. package/packages/algod_client/src/core/api-error.mjs +3 -1
  52. package/packages/algod_client/src/core/api-error.mjs.map +1 -1
  53. package/packages/algod_client/src/core/model-runtime.js +6 -6
  54. package/packages/algod_client/src/core/model-runtime.js.map +1 -1
  55. package/packages/algod_client/src/core/model-runtime.mjs +8 -8
  56. package/packages/algod_client/src/core/model-runtime.mjs.map +1 -1
  57. package/packages/algod_client/src/models/account-participation.js +4 -4
  58. package/packages/algod_client/src/models/account-participation.js.map +1 -1
  59. package/packages/algod_client/src/models/account-participation.mjs +4 -4
  60. package/packages/algod_client/src/models/account-participation.mjs.map +1 -1
  61. package/packages/algod_client/src/models/application-state-schema.d.ts +2 -2
  62. package/packages/algod_client/src/models/application-state-schema.js +2 -2
  63. package/packages/algod_client/src/models/application-state-schema.js.map +1 -1
  64. package/packages/algod_client/src/models/application-state-schema.mjs +2 -2
  65. package/packages/algod_client/src/models/application-state-schema.mjs.map +1 -1
  66. package/packages/algod_client/src/models/asset-params.js +2 -1
  67. package/packages/algod_client/src/models/asset-params.js.map +1 -1
  68. package/packages/algod_client/src/models/asset-params.mjs +2 -1
  69. package/packages/algod_client/src/models/asset-params.mjs.map +1 -1
  70. package/packages/algod_client/src/models/block-response.js +1 -2
  71. package/packages/algod_client/src/models/block-response.js.map +1 -1
  72. package/packages/algod_client/src/models/block-response.mjs +2 -3
  73. package/packages/algod_client/src/models/block-response.mjs.map +1 -1
  74. package/packages/algod_client/src/models/block.d.ts +60 -40
  75. package/packages/algod_client/src/models/block.js +184 -108
  76. package/packages/algod_client/src/models/block.js.map +1 -1
  77. package/packages/algod_client/src/models/block.mjs +184 -108
  78. package/packages/algod_client/src/models/block.mjs.map +1 -1
  79. package/packages/algod_client/src/models/eval-delta-key-value.js +2 -2
  80. package/packages/algod_client/src/models/eval-delta-key-value.js.map +1 -1
  81. package/packages/algod_client/src/models/eval-delta-key-value.mjs +2 -2
  82. package/packages/algod_client/src/models/eval-delta-key-value.mjs.map +1 -1
  83. package/packages/algod_client/src/models/eval-delta.js +2 -2
  84. package/packages/algod_client/src/models/eval-delta.js.map +1 -1
  85. package/packages/algod_client/src/models/eval-delta.mjs +2 -2
  86. package/packages/algod_client/src/models/eval-delta.mjs.map +1 -1
  87. package/packages/algod_client/src/models/ledger-state-delta.js +1 -1
  88. package/packages/algod_client/src/models/ledger-state-delta.js.map +1 -1
  89. package/packages/algod_client/src/models/ledger-state-delta.mjs +2 -2
  90. package/packages/algod_client/src/models/ledger-state-delta.mjs.map +1 -1
  91. package/packages/algod_client/src/models/simulate-request.js +1 -1
  92. package/packages/algod_client/src/models/simulate-request.mjs +1 -1
  93. package/packages/algod_client/src/models/simulate-response.d.ts +2 -1
  94. package/packages/algod_client/src/models/simulate-response.js +6 -1
  95. package/packages/algod_client/src/models/simulate-response.js.map +1 -1
  96. package/packages/algod_client/src/models/simulate-response.mjs +6 -2
  97. package/packages/algod_client/src/models/simulate-response.mjs.map +1 -1
  98. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.d.ts +3 -5
  99. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js +4 -6
  100. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js.map +1 -1
  101. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs +3 -5
  102. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs.map +1 -1
  103. package/packages/algod_client/src/models/transaction-parameters-response.js +2 -2
  104. package/packages/algod_client/src/models/transaction-parameters-response.js.map +1 -1
  105. package/packages/algod_client/src/models/transaction-parameters-response.mjs +2 -2
  106. package/packages/algod_client/src/models/transaction-parameters-response.mjs.map +1 -1
  107. package/packages/common/src/address.d.ts +0 -1
  108. package/packages/common/src/address.js +4 -17
  109. package/packages/common/src/address.js.map +1 -1
  110. package/packages/common/src/address.mjs +5 -17
  111. package/packages/common/src/address.mjs.map +1 -1
  112. package/packages/common/src/codecs/composite/map.js +7 -4
  113. package/packages/common/src/codecs/composite/map.js.map +1 -1
  114. package/packages/common/src/codecs/composite/map.mjs +7 -4
  115. package/packages/common/src/codecs/composite/map.mjs.map +1 -1
  116. package/packages/common/src/codecs/composite/record.js +0 -1
  117. package/packages/common/src/codecs/composite/record.js.map +1 -1
  118. package/packages/common/src/codecs/primitives/address.js +0 -1
  119. package/packages/common/src/codecs/primitives/address.js.map +1 -1
  120. package/packages/common/src/codecs/primitives/bytes-base64.js +26 -0
  121. package/packages/common/src/codecs/primitives/bytes-base64.js.map +1 -0
  122. package/packages/common/src/codecs/primitives/bytes-base64.mjs +25 -0
  123. package/packages/common/src/codecs/primitives/bytes-base64.mjs.map +1 -0
  124. package/packages/common/src/codecs/primitives/bytes.js +0 -1
  125. package/packages/common/src/codecs/primitives/bytes.js.map +1 -1
  126. package/packages/common/src/codecs/primitives/fixed-bytes.js +0 -1
  127. package/packages/common/src/codecs/primitives/fixed-bytes.js.map +1 -1
  128. package/packages/common/src/codecs/wire.js +0 -1
  129. package/packages/common/src/codecs/wire.js.map +1 -1
  130. package/packages/common/src/json.mjs +2 -2
  131. package/packages/common/src/json.mjs.map +1 -1
  132. package/packages/common/src/msgpack.js +0 -1
  133. package/packages/common/src/msgpack.js.map +1 -1
  134. package/packages/{sdk/src/logic → common/src}/sourcemap.d.ts +2 -2
  135. package/packages/{sdk/src/logic → common/src}/sourcemap.js +2 -2
  136. package/packages/{sdk/src/logic → common/src}/sourcemap.js.map +1 -1
  137. package/packages/{sdk/src/logic → common/src}/sourcemap.mjs +1 -1
  138. package/packages/{sdk/src/logic → common/src}/sourcemap.mjs.map +1 -1
  139. package/packages/indexer_client/src/apis/api-service.d.ts +1 -1
  140. package/packages/indexer_client/src/apis/api-service.js +12 -12
  141. package/packages/indexer_client/src/apis/api-service.js.map +1 -1
  142. package/packages/indexer_client/src/apis/api-service.mjs +12 -12
  143. package/packages/indexer_client/src/apis/api-service.mjs.map +1 -1
  144. package/packages/indexer_client/src/core/api-error.js +3 -1
  145. package/packages/indexer_client/src/core/api-error.js.map +1 -1
  146. package/packages/indexer_client/src/core/api-error.mjs +3 -1
  147. package/packages/indexer_client/src/core/api-error.mjs.map +1 -1
  148. package/packages/indexer_client/src/core/model-runtime.js +0 -15
  149. package/packages/indexer_client/src/core/model-runtime.js.map +1 -1
  150. package/packages/indexer_client/src/core/model-runtime.mjs +1 -13
  151. package/packages/indexer_client/src/core/model-runtime.mjs.map +1 -1
  152. package/packages/indexer_client/src/models/account-participation.js +4 -4
  153. package/packages/indexer_client/src/models/account-participation.js.map +1 -1
  154. package/packages/indexer_client/src/models/account-participation.mjs +4 -4
  155. package/packages/indexer_client/src/models/account-participation.mjs.map +1 -1
  156. package/packages/indexer_client/src/models/application-state-schema.d.ts +2 -2
  157. package/packages/indexer_client/src/models/application-state-schema.js +2 -2
  158. package/packages/indexer_client/src/models/application-state-schema.js.map +1 -1
  159. package/packages/indexer_client/src/models/application-state-schema.mjs +2 -2
  160. package/packages/indexer_client/src/models/application-state-schema.mjs.map +1 -1
  161. package/packages/indexer_client/src/models/asset-params.js +2 -1
  162. package/packages/indexer_client/src/models/asset-params.js.map +1 -1
  163. package/packages/indexer_client/src/models/asset-params.mjs +2 -1
  164. package/packages/indexer_client/src/models/asset-params.mjs.map +1 -1
  165. package/packages/indexer_client/src/models/block.d.ts +5 -5
  166. package/packages/indexer_client/src/models/block.js +13 -13
  167. package/packages/indexer_client/src/models/block.js.map +1 -1
  168. package/packages/indexer_client/src/models/block.mjs +13 -13
  169. package/packages/indexer_client/src/models/block.mjs.map +1 -1
  170. package/packages/indexer_client/src/models/eval-delta-key-value.d.ts +1 -1
  171. package/packages/indexer_client/src/models/eval-delta-key-value.js +2 -2
  172. package/packages/indexer_client/src/models/eval-delta-key-value.js.map +1 -1
  173. package/packages/indexer_client/src/models/eval-delta-key-value.mjs +2 -2
  174. package/packages/indexer_client/src/models/eval-delta-key-value.mjs.map +1 -1
  175. package/packages/indexer_client/src/models/eval-delta.d.ts +1 -1
  176. package/packages/indexer_client/src/models/eval-delta.js +2 -2
  177. package/packages/indexer_client/src/models/eval-delta.js.map +1 -1
  178. package/packages/indexer_client/src/models/eval-delta.mjs +2 -2
  179. package/packages/indexer_client/src/models/eval-delta.mjs.map +1 -1
  180. package/packages/indexer_client/src/models/hb-proof-fields.js +6 -6
  181. package/packages/indexer_client/src/models/hb-proof-fields.js.map +1 -1
  182. package/packages/indexer_client/src/models/hb-proof-fields.mjs +6 -6
  183. package/packages/indexer_client/src/models/hb-proof-fields.mjs.map +1 -1
  184. package/packages/indexer_client/src/models/participation-updates.d.ts +2 -2
  185. package/packages/indexer_client/src/models/participation-updates.js +2 -2
  186. package/packages/indexer_client/src/models/participation-updates.js.map +1 -1
  187. package/packages/indexer_client/src/models/participation-updates.mjs +2 -2
  188. package/packages/indexer_client/src/models/participation-updates.mjs.map +1 -1
  189. package/packages/indexer_client/src/models/state-proof-verifier.js +2 -2
  190. package/packages/indexer_client/src/models/state-proof-verifier.js.map +1 -1
  191. package/packages/indexer_client/src/models/state-proof-verifier.mjs +2 -2
  192. package/packages/indexer_client/src/models/state-proof-verifier.mjs.map +1 -1
  193. package/packages/indexer_client/src/models/state-schema.d.ts +2 -2
  194. package/packages/indexer_client/src/models/state-schema.js +2 -2
  195. package/packages/indexer_client/src/models/state-schema.js.map +1 -1
  196. package/packages/indexer_client/src/models/state-schema.mjs +2 -2
  197. package/packages/indexer_client/src/models/state-schema.mjs.map +1 -1
  198. package/packages/indexer_client/src/models/teal-key-value.d.ts +1 -1
  199. package/packages/indexer_client/src/models/teal-key-value.js +2 -2
  200. package/packages/indexer_client/src/models/teal-key-value.js.map +1 -1
  201. package/packages/indexer_client/src/models/teal-key-value.mjs +2 -2
  202. package/packages/indexer_client/src/models/teal-key-value.mjs.map +1 -1
  203. package/packages/indexer_client/src/models/transaction-heartbeat.js +2 -1
  204. package/packages/indexer_client/src/models/transaction-heartbeat.js.map +1 -1
  205. package/packages/indexer_client/src/models/transaction-heartbeat.mjs +2 -1
  206. package/packages/indexer_client/src/models/transaction-heartbeat.mjs.map +1 -1
  207. package/packages/indexer_client/src/models/transaction-keyreg.js +4 -4
  208. package/packages/indexer_client/src/models/transaction-keyreg.js.map +1 -1
  209. package/packages/indexer_client/src/models/transaction-keyreg.mjs +4 -4
  210. package/packages/indexer_client/src/models/transaction-keyreg.mjs.map +1 -1
  211. package/packages/indexer_client/src/models/transaction-signature-logicsig.js +2 -1
  212. package/packages/indexer_client/src/models/transaction-signature-logicsig.js.map +1 -1
  213. package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs +2 -1
  214. package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs.map +1 -1
  215. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.js +3 -3
  216. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.js.map +1 -1
  217. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs +3 -3
  218. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs.map +1 -1
  219. package/packages/indexer_client/src/models/transaction-state-proof.d.ts +1 -1
  220. package/packages/indexer_client/src/models/transaction-state-proof.js +2 -2
  221. package/packages/indexer_client/src/models/transaction-state-proof.js.map +1 -1
  222. package/packages/indexer_client/src/models/transaction-state-proof.mjs +2 -2
  223. package/packages/indexer_client/src/models/transaction-state-proof.mjs.map +1 -1
  224. package/packages/indexer_client/src/models/transaction.d.ts +2 -2
  225. package/packages/indexer_client/src/models/transaction.js +6 -5
  226. package/packages/indexer_client/src/models/transaction.js.map +1 -1
  227. package/packages/indexer_client/src/models/transaction.mjs +6 -5
  228. package/packages/indexer_client/src/models/transaction.mjs.map +1 -1
  229. package/packages/kmd_client/src/apis/api-service.d.ts +5 -5
  230. package/packages/kmd_client/src/apis/api-service.js +32 -32
  231. package/packages/kmd_client/src/apis/api-service.js.map +1 -1
  232. package/packages/kmd_client/src/apis/api-service.mjs +32 -32
  233. package/packages/kmd_client/src/apis/api-service.mjs.map +1 -1
  234. package/packages/kmd_client/src/core/api-error.js +3 -1
  235. package/packages/kmd_client/src/core/api-error.js.map +1 -1
  236. package/packages/kmd_client/src/core/api-error.mjs +3 -1
  237. package/packages/kmd_client/src/core/api-error.mjs.map +1 -1
  238. package/packages/kmd_client/src/core/model-runtime.js +2 -12
  239. package/packages/kmd_client/src/core/model-runtime.js.map +1 -1
  240. package/packages/kmd_client/src/core/model-runtime.mjs +3 -11
  241. package/packages/kmd_client/src/core/model-runtime.mjs.map +1 -1
  242. package/packages/transact/src/logicsig.d.ts +35 -33
  243. package/packages/transact/src/logicsig.js +74 -76
  244. package/packages/transact/src/logicsig.js.map +1 -1
  245. package/packages/transact/src/logicsig.mjs +77 -78
  246. package/packages/transact/src/logicsig.mjs.map +1 -1
  247. package/packages/transact/src/multisig.d.ts +11 -116
  248. package/packages/transact/src/multisig.js +106 -136
  249. package/packages/transact/src/multisig.js.map +1 -1
  250. package/packages/transact/src/multisig.mjs +108 -118
  251. package/packages/transact/src/multisig.mjs.map +1 -1
  252. package/packages/transact/src/signer.js +9 -2
  253. package/packages/transact/src/signer.js.map +1 -1
  254. package/packages/transact/src/signer.mjs +10 -3
  255. package/packages/transact/src/signer.mjs.map +1 -1
  256. package/packages/transact/src/transactions/app-call.d.ts +10 -15
  257. package/packages/transact/src/transactions/app-call.js.map +1 -1
  258. package/packages/transact/src/transactions/app-call.mjs.map +1 -1
  259. package/packages/transact/src/transactions/asset-config.d.ts +1 -6
  260. package/packages/transact/src/transactions/asset-config.js.map +1 -1
  261. package/packages/transact/src/transactions/asset-config.mjs.map +1 -1
  262. package/packages/transact/src/transactions/asset-freeze.d.ts +1 -6
  263. package/packages/transact/src/transactions/asset-transfer.d.ts +1 -6
  264. package/packages/transact/src/transactions/key-registration.d.ts +1 -8
  265. package/packages/transact/src/transactions/reference-types-meta.d.ts +26 -0
  266. package/packages/transact/src/transactions/reference-types-meta.js +71 -0
  267. package/packages/transact/src/transactions/reference-types-meta.js.map +1 -0
  268. package/packages/transact/src/transactions/reference-types-meta.mjs +69 -0
  269. package/packages/transact/src/transactions/reference-types-meta.mjs.map +1 -0
  270. package/packages/transact/src/transactions/signed-transaction-meta.js +8 -9
  271. package/packages/transact/src/transactions/signed-transaction-meta.js.map +1 -1
  272. package/packages/transact/src/transactions/signed-transaction-meta.mjs +8 -8
  273. package/packages/transact/src/transactions/signed-transaction-meta.mjs.map +1 -1
  274. package/packages/transact/src/transactions/signed-transaction.d.ts +10 -6
  275. package/packages/transact/src/transactions/signed-transaction.js +1 -1
  276. package/packages/transact/src/transactions/signed-transaction.js.map +1 -1
  277. package/packages/transact/src/transactions/signed-transaction.mjs +1 -2
  278. package/packages/transact/src/transactions/signed-transaction.mjs.map +1 -1
  279. package/packages/transact/src/transactions/state-proof.d.ts +1 -1
  280. package/packages/transact/src/transactions/transaction-meta.js +29 -23
  281. package/packages/transact/src/transactions/transaction-meta.js.map +1 -1
  282. package/packages/transact/src/transactions/transaction-meta.mjs +29 -23
  283. package/packages/transact/src/transactions/transaction-meta.mjs.map +1 -1
  284. package/packages/transact/src/transactions/transaction.d.ts +5 -2
  285. package/packages/transact/src/transactions/transaction.js +5 -4
  286. package/packages/transact/src/transactions/transaction.js.map +1 -1
  287. package/packages/transact/src/transactions/transaction.mjs +5 -4
  288. package/packages/transact/src/transactions/transaction.mjs.map +1 -1
  289. package/testing/account.js +1 -2
  290. package/testing/account.js.map +1 -1
  291. package/testing/account.mjs +1 -2
  292. package/testing/account.mjs.map +1 -1
  293. package/testing/fixtures/algorand-fixture.d.ts +3 -3
  294. package/testing/fixtures/algorand-fixture.js.map +1 -1
  295. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  296. package/testing/transaction-logger.js +1 -1
  297. package/testing/transaction-logger.mjs +1 -1
  298. package/transact/index.d.ts +11 -10
  299. package/transact/index.js +7 -31
  300. package/transact/index.mjs +7 -10
  301. package/transaction/transaction.js +2 -2
  302. package/transaction/transaction.js.map +1 -1
  303. package/transaction/transaction.mjs +2 -2
  304. package/transaction/transaction.mjs.map +1 -1
  305. package/transactions/app-call.d.ts +5 -4
  306. package/transactions/app-call.js +16 -16
  307. package/transactions/app-call.js.map +1 -1
  308. package/transactions/app-call.mjs +16 -16
  309. package/transactions/app-call.mjs.map +1 -1
  310. package/transactions/asset-config.d.ts +1 -1
  311. package/transactions/asset-config.js +1 -1
  312. package/transactions/asset-config.js.map +1 -1
  313. package/transactions/asset-config.mjs +1 -1
  314. package/transactions/asset-config.mjs.map +1 -1
  315. package/transactions/key-registration.d.ts +1 -1
  316. package/transactions/key-registration.js.map +1 -1
  317. package/transactions/key-registration.mjs.map +1 -1
  318. package/transactions/method-call.d.ts +1 -1
  319. package/transactions/method-call.js +77 -84
  320. package/transactions/method-call.js.map +1 -1
  321. package/transactions/method-call.mjs +77 -84
  322. package/transactions/method-call.mjs.map +1 -1
  323. package/types/account-manager.d.ts +7 -9
  324. package/types/account-manager.js +17 -7
  325. package/types/account-manager.js.map +1 -1
  326. package/types/account-manager.mjs +17 -7
  327. package/types/account-manager.mjs.map +1 -1
  328. package/types/algorand-client-transaction-creator.d.ts +53 -39
  329. package/types/algorand-client-transaction-creator.js +8 -0
  330. package/types/algorand-client-transaction-creator.js.map +1 -1
  331. package/types/algorand-client-transaction-creator.mjs +8 -0
  332. package/types/algorand-client-transaction-creator.mjs.map +1 -1
  333. package/types/algorand-client-transaction-sender.d.ts +58 -44
  334. package/types/algorand-client-transaction-sender.js +8 -1
  335. package/types/algorand-client-transaction-sender.js.map +1 -1
  336. package/types/algorand-client-transaction-sender.mjs +8 -0
  337. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  338. package/types/amount.js +23 -4
  339. package/types/amount.js.map +1 -1
  340. package/types/amount.mjs +20 -2
  341. package/types/amount.mjs.map +1 -1
  342. package/types/app-client.d.ts +111 -106
  343. package/types/app-client.js +2 -3
  344. package/types/app-client.js.map +1 -1
  345. package/types/app-client.mjs +2 -2
  346. package/types/app-client.mjs.map +1 -1
  347. package/types/app-deployer.d.ts +1 -1
  348. package/types/app-deployer.js +3 -3
  349. package/types/app-deployer.js.map +1 -1
  350. package/types/app-deployer.mjs +3 -3
  351. package/types/app-deployer.mjs.map +1 -1
  352. package/types/app-factory.d.ts +44 -41
  353. package/types/app-factory.js +2 -2
  354. package/types/app-factory.js.map +1 -1
  355. package/types/app-factory.mjs +2 -2
  356. package/types/app-factory.mjs.map +1 -1
  357. package/types/app-manager.d.ts +3 -1
  358. package/types/app-manager.js +17 -11
  359. package/types/app-manager.js.map +1 -1
  360. package/types/app-manager.mjs +17 -11
  361. package/types/app-manager.mjs.map +1 -1
  362. package/types/app-spec.js +12 -5
  363. package/types/app-spec.js.map +1 -1
  364. package/types/app-spec.mjs +12 -5
  365. package/types/app-spec.mjs.map +1 -1
  366. package/types/app.d.ts +2 -2
  367. package/types/app.js.map +1 -1
  368. package/types/app.mjs.map +1 -1
  369. package/types/asset-manager.js +1 -1
  370. package/types/asset-manager.js.map +1 -1
  371. package/types/asset-manager.mjs +1 -1
  372. package/types/asset-manager.mjs.map +1 -1
  373. package/types/async-event-emitter.d.ts +3 -6
  374. package/types/async-event-emitter.js.map +1 -1
  375. package/types/async-event-emitter.mjs.map +1 -1
  376. package/types/client-manager.d.ts +1 -1
  377. package/types/client-manager.js.map +1 -1
  378. package/types/client-manager.mjs.map +1 -1
  379. package/types/composer.d.ts +11 -3
  380. package/types/composer.js +55 -46
  381. package/types/composer.js.map +1 -1
  382. package/types/composer.mjs +46 -36
  383. package/types/composer.mjs.map +1 -1
  384. package/types/debugging.d.ts +13 -9
  385. package/types/debugging.js.map +1 -1
  386. package/types/debugging.mjs.map +1 -1
  387. package/types/expand.d.ts +2 -9
  388. package/types/kmd-account-manager.d.ts +1 -0
  389. package/types/kmd-account-manager.js +22 -11
  390. package/types/kmd-account-manager.js.map +1 -1
  391. package/types/kmd-account-manager.mjs +23 -12
  392. package/types/kmd-account-manager.mjs.map +1 -1
  393. package/types/lifecycle-events.d.ts +0 -1
  394. package/types/lifecycle-events.js.map +1 -1
  395. package/types/lifecycle-events.mjs.map +1 -1
  396. package/types/testing.d.ts +4 -4
  397. package/types/transaction.d.ts +1 -1
  398. package/_virtual/rolldown_runtime.mjs +0 -13
  399. package/indexer-lookup.js.map +0 -1
  400. package/indexer-lookup.mjs.map +0 -1
  401. package/packages/algod_client/src/core/model-runtime.d.ts +0 -10
  402. package/packages/algod_client/src/models/application-local-reference.d.ts +0 -20
  403. package/packages/algod_client/src/models/application-local-reference.js +0 -23
  404. package/packages/algod_client/src/models/application-local-reference.js.map +0 -1
  405. package/packages/algod_client/src/models/application-local-reference.mjs +0 -23
  406. package/packages/algod_client/src/models/application-local-reference.mjs.map +0 -1
  407. package/packages/algod_client/src/models/asset-holding-reference.d.ts +0 -20
  408. package/packages/algod_client/src/models/asset-holding-reference.js +0 -23
  409. package/packages/algod_client/src/models/asset-holding-reference.js.map +0 -1
  410. package/packages/algod_client/src/models/asset-holding-reference.mjs +0 -23
  411. package/packages/algod_client/src/models/asset-holding-reference.mjs.map +0 -1
  412. package/packages/algod_client/src/models/box-reference.d.ts +0 -17
  413. package/packages/algod_client/src/models/box-reference.js +0 -23
  414. package/packages/algod_client/src/models/box-reference.js.map +0 -1
  415. package/packages/algod_client/src/models/box-reference.mjs +0 -23
  416. package/packages/algod_client/src/models/box-reference.mjs.map +0 -1
  417. package/packages/indexer_client/src/core/model-runtime.d.ts +0 -10
  418. package/packages/kmd_client/src/core/model-runtime.d.ts +0 -10
  419. package/packages/sdk/src/convert.d.ts +0 -17
  420. package/packages/sdk/src/convert.js +0 -28
  421. package/packages/sdk/src/convert.js.map +0 -1
  422. package/packages/sdk/src/convert.mjs +0 -25
  423. package/packages/sdk/src/convert.mjs.map +0 -1
  424. package/packages/sdk/src/encoding/binarydata.d.ts +0 -34
  425. package/packages/sdk/src/encoding/binarydata.js +0 -65
  426. package/packages/sdk/src/encoding/binarydata.js.map +0 -1
  427. package/packages/sdk/src/encoding/binarydata.mjs +0 -60
  428. package/packages/sdk/src/encoding/binarydata.mjs.map +0 -1
  429. package/packages/sdk/src/encoding/encoding.d.ts +0 -237
  430. package/packages/sdk/src/encoding/encoding.js +0 -302
  431. package/packages/sdk/src/encoding/encoding.js.map +0 -1
  432. package/packages/sdk/src/encoding/encoding.mjs +0 -287
  433. package/packages/sdk/src/encoding/encoding.mjs.map +0 -1
  434. package/packages/sdk/src/encoding/schema/array.js +0 -35
  435. package/packages/sdk/src/encoding/schema/array.js.map +0 -1
  436. package/packages/sdk/src/encoding/schema/array.mjs +0 -35
  437. package/packages/sdk/src/encoding/schema/array.mjs.map +0 -1
  438. package/packages/sdk/src/encoding/schema/bytearray.js +0 -49
  439. package/packages/sdk/src/encoding/schema/bytearray.js.map +0 -1
  440. package/packages/sdk/src/encoding/schema/bytearray.mjs +0 -49
  441. package/packages/sdk/src/encoding/schema/bytearray.mjs.map +0 -1
  442. package/packages/sdk/src/encoding/schema/map.d.ts +0 -58
  443. package/packages/sdk/src/encoding/schema/map.js +0 -110
  444. package/packages/sdk/src/encoding/schema/map.js.map +0 -1
  445. package/packages/sdk/src/encoding/schema/map.mjs +0 -107
  446. package/packages/sdk/src/encoding/schema/map.mjs.map +0 -1
  447. package/packages/sdk/src/encoding/schema/optional.js +0 -46
  448. package/packages/sdk/src/encoding/schema/optional.js.map +0 -1
  449. package/packages/sdk/src/encoding/schema/optional.mjs +0 -46
  450. package/packages/sdk/src/encoding/schema/optional.mjs.map +0 -1
  451. package/packages/sdk/src/encoding/schema/uint64.js +0 -30
  452. package/packages/sdk/src/encoding/schema/uint64.js.map +0 -1
  453. package/packages/sdk/src/encoding/schema/uint64.mjs +0 -30
  454. package/packages/sdk/src/encoding/schema/uint64.mjs.map +0 -1
  455. package/packages/sdk/src/encoding/uint64.d.ts +0 -34
  456. package/packages/sdk/src/encoding/uint64.js +0 -34
  457. package/packages/sdk/src/encoding/uint64.js.map +0 -1
  458. package/packages/sdk/src/encoding/uint64.mjs +0 -33
  459. package/packages/sdk/src/encoding/uint64.mjs.map +0 -1
  460. package/packages/sdk/src/index.d.ts +0 -44
  461. package/packages/sdk/src/index.js +0 -62
  462. package/packages/sdk/src/index.js.map +0 -1
  463. package/packages/sdk/src/index.mjs +0 -58
  464. package/packages/sdk/src/index.mjs.map +0 -1
  465. package/packages/sdk/src/nacl/naclWrappers.js +0 -14
  466. package/packages/sdk/src/nacl/naclWrappers.js.map +0 -1
  467. package/packages/sdk/src/nacl/naclWrappers.mjs +0 -11
  468. package/packages/sdk/src/nacl/naclWrappers.mjs.map +0 -1
  469. package/packages/sdk/src/types/intDecoding.d.ts +0 -28
  470. package/packages/sdk/src/types/intDecoding.js +0 -32
  471. package/packages/sdk/src/types/intDecoding.js.map +0 -1
  472. package/packages/sdk/src/types/intDecoding.mjs +0 -31
  473. package/packages/sdk/src/types/intDecoding.mjs.map +0 -1
  474. package/packages/sdk/src/types/transactions/encoded.d.ts +0 -40
  475. package/packages/sdk/src/types/transactions/encoded.js +0 -64
  476. package/packages/sdk/src/types/transactions/encoded.js.map +0 -1
  477. package/packages/sdk/src/types/transactions/encoded.mjs +0 -59
  478. package/packages/sdk/src/types/transactions/encoded.mjs.map +0 -1
  479. package/packages/sdk/src/utils/utils.d.ts +0 -64
  480. package/packages/sdk/src/utils/utils.js +0 -140
  481. package/packages/sdk/src/utils/utils.js.map +0 -1
  482. package/packages/sdk/src/utils/utils.mjs +0 -128
  483. package/packages/sdk/src/utils/utils.mjs.map +0 -1
  484. package/packages/transact/src/transactions/common.d.ts +0 -37
  485. package/sdk/index.d.ts +0 -10
  486. package/sdk/index.js +0 -59
  487. package/sdk/index.mjs +0 -11
@@ -1 +1 @@
1
- {"version":3,"file":"app-call.js","names":["buildTransactionCommonData","calculateExtraProgramPages","Transaction","TransactionType","OnApplicationComplete","getAddress","AppManager","MAX_OVERALL_REFERENCES","appCall","getApplicationAddress","MAX_ACCOUNT_REFERENCES","groupIndex"],"sources":["../../src/transactions/app-call.ts"],"sourcesContent":["import {\n ApplicationLocalReference,\n AssetHoldingReference,\n SimulateUnnamedResourcesAccessed,\n SuggestedParams,\n} from '@algorandfoundation/algokit-algod-client'\nimport {\n Address,\n MAX_ACCOUNT_REFERENCES,\n MAX_OVERALL_REFERENCES,\n ReadableAddress,\n getAddress,\n getApplicationAddress,\n} from '@algorandfoundation/algokit-common'\nimport {\n AccessReference,\n OnApplicationComplete,\n BoxReference as TransactBoxReference,\n Transaction,\n TransactionType,\n} from '@algorandfoundation/algokit-transact'\nimport { AppManager, BoxIdentifier, BoxReference as UtilsBoxReference } from '../types/app-manager'\nimport { Expand } from '../types/expand'\nimport { calculateExtraProgramPages } from '../util'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Common parameters for defining an application call transaction. */\nexport type CommonAppCallParams = CommonTransactionParams & {\n /** ID of the application; 0 if the application is being created. */\n appId: bigint\n /** The [on-complete](https://dev.algorand.co/concepts/smart-contracts/avm#oncomplete) action of the call; defaults to no-op. */\n onComplete?: OnApplicationComplete\n /** Any [arguments to pass to the smart contract call](/concepts/smart-contracts/languages/teal/#argument-passing). */\n args?: Uint8Array[]\n /** Any account addresses to add to the [accounts array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n accountReferences?: ReadableAddress[]\n /** The ID of any apps to load to the [foreign apps array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n appReferences?: bigint[]\n /** The ID of any assets to load to the [foreign assets array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n assetReferences?: bigint[]\n /** Any boxes to load to the [boxes array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays).\n *\n * Either the name identifier (which will be set against app ID of `0` i.e.\n * the current app), or a box identifier with the name identifier and app ID.\n */\n boxReferences?: (UtilsBoxReference | BoxIdentifier)[]\n /** Access references unifies `accountReferences`, `appReferences`, `assetReferences`, and `boxReferences` under a single list. If non-empty, these other reference lists must be empty. If access is empty, those other reference lists may be non-empty. */\n accessReferences?: AccessReference[]\n /** The lowest application version for which this transaction should immediately fail. 0 indicates that no version check should be performed. */\n rejectVersion?: number\n}\n\n/** Parameters to define an app create transaction */\nexport type AppCreateParams = Expand<\n Omit<CommonAppCallParams, 'appId'> & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.ClearState>\n /** The program to execute for all OnCompletes other than ClearState as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n clearStateProgram: string | Uint8Array\n /** The state schema for the app. This is immutable once the app is created. */\n schema?: {\n /** The number of integers saved in global state. */\n globalInts: number\n /** The number of byte slices saved in global state. */\n globalByteSlices: number\n /** The number of integers saved in local state. */\n localInts: number\n /** The number of byte slices saved in local state. */\n localByteSlices: number\n }\n /** Number of extra pages required for the programs.\n * Defaults to the number needed for the programs in this call if not specified.\n * This is immutable once the app is created. */\n extraProgramPages?: number\n }\n>\n\n/** Parameters to define an app update transaction */\nexport type AppUpdateParams = Expand<\n CommonAppCallParams & {\n onComplete?: OnApplicationComplete.UpdateApplication\n /** The program to execute for all OnCompletes other than ClearState as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n clearStateProgram: string | Uint8Array\n }\n>\n\n/** Parameters to define an application call transaction. */\nexport type AppCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication>\n}\n\n/** Common parameters to define an ABI method call transaction. */\nexport type AppMethodCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication | OnApplicationComplete.ClearState>\n}\n\n/** Parameters to define an application delete call transaction. */\nexport type AppDeleteParams = CommonAppCallParams & {\n onComplete?: OnApplicationComplete.DeleteApplication\n}\n\nexport const buildAppCreate = async (\n params: AppCreateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n const globalStateSchema =\n params.schema?.globalByteSlices !== undefined || params.schema?.globalInts !== undefined\n ? {\n numByteSlices: params.schema?.globalByteSlices ?? 0,\n numUints: params.schema?.globalInts ?? 0,\n }\n : undefined\n const localStateSchema =\n params.schema?.localByteSlices !== undefined || params.schema?.localInts !== undefined\n ? {\n numByteSlices: params.schema?.localByteSlices ?? 0,\n numUints: params.schema?.localInts ?? 0,\n }\n : undefined\n const extraProgramPages =\n params.extraProgramPages !== undefined ? params.extraProgramPages : calculateExtraProgramPages(approvalProgram!, clearStateProgram!)\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: 0n, // App creation always uses ID 0\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppUpdate = async (\n params: AppUpdateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: OnApplicationComplete.UpdateApplication,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppCall = (\n params: AppCallParams | AppDeleteParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\n/**\n * Populate transaction-level resources for app call transactions\n */\nexport function populateTransactionResources(\n transaction: Transaction, // NOTE: transaction is mutated in place\n resourcesAccessed: SimulateUnnamedResourcesAccessed,\n groupIndex: number,\n): void {\n if (transaction.type !== TransactionType.AppCall || transaction.appCall === undefined) {\n return\n }\n\n // Check for unexpected resources at transaction level\n if (resourcesAccessed.boxes || resourcesAccessed.extraBoxRefs) {\n throw new Error('Unexpected boxes at the transaction level')\n }\n if (resourcesAccessed.appLocals) {\n throw new Error('Unexpected app locals at the transaction level')\n }\n if (resourcesAccessed.assetHoldings) {\n throw new Error('Unexpected asset holdings at the transaction level')\n }\n\n let accountsCount = 0\n let appsCount = 0\n let assetsCount = 0\n const boxesCount = transaction.appCall.boxReferences?.length ?? 0\n\n // Populate accounts\n if (resourcesAccessed.accounts) {\n transaction.appCall.accountReferences = transaction.appCall.accountReferences ?? []\n for (const account of resourcesAccessed.accounts) {\n const address = account\n if (!transaction.appCall.accountReferences.some((a) => a.equals(address))) {\n transaction.appCall.accountReferences.push(address)\n }\n }\n accountsCount = transaction.appCall.accountReferences.length\n }\n\n // Populate apps\n if (resourcesAccessed.apps) {\n transaction.appCall.appReferences = transaction.appCall.appReferences ?? []\n for (const appId of resourcesAccessed.apps) {\n if (!transaction.appCall.appReferences.includes(appId)) {\n transaction.appCall.appReferences.push(appId)\n }\n }\n appsCount = transaction.appCall.appReferences.length\n }\n\n // Populate assets\n if (resourcesAccessed.assets) {\n transaction.appCall.assetReferences = transaction.appCall.assetReferences ?? []\n for (const assetId of resourcesAccessed.assets) {\n if (!transaction.appCall.assetReferences.includes(assetId)) {\n transaction.appCall.assetReferences.push(assetId)\n }\n }\n assetsCount = transaction.appCall.assetReferences.length\n }\n\n if (accountsCount + assetsCount + appsCount + boxesCount > MAX_OVERALL_REFERENCES) {\n throw new Error(`Resource reference limit of ${MAX_OVERALL_REFERENCES} exceeded in transaction ${groupIndex}`)\n }\n}\n\nenum GroupResourceType {\n Account,\n App,\n Asset,\n Box,\n ExtraBoxRef,\n AssetHolding,\n AppLocal,\n}\n\n/**\n * Populate group-level resources for app call transactions\n */\nexport function populateGroupResources(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n groupResources: SimulateUnnamedResourcesAccessed,\n): void {\n let remainingAccounts = [...(groupResources.accounts ?? [])]\n let remainingApps = [...(groupResources.apps ?? [])]\n let remainingAssets = [...(groupResources.assets ?? [])]\n const remainingBoxes = [...(groupResources.boxes ?? [])]\n\n // Process cross-reference resources first (app locals and asset holdings) as they are most restrictive\n if (groupResources.appLocals) {\n groupResources.appLocals.forEach((appLocal) => {\n populateGroupResource(transactions, { type: GroupResourceType.AppLocal, data: appLocal })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.account)\n remainingApps = remainingApps.filter((app) => app !== appLocal.app)\n })\n }\n\n if (groupResources.assetHoldings) {\n groupResources.assetHoldings.forEach((assetHolding) => {\n populateGroupResource(transactions, { type: GroupResourceType.AssetHolding, data: assetHolding })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.account)\n remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.asset)\n })\n }\n\n // Process accounts next because account limit is 4\n remainingAccounts.forEach((account) => {\n populateGroupResource(transactions, { type: GroupResourceType.Account, data: account })\n })\n\n // Process boxes\n remainingBoxes.forEach((boxRef) => {\n populateGroupResource(transactions, {\n type: GroupResourceType.Box,\n data: {\n appId: boxRef.app,\n name: boxRef.name,\n },\n })\n // Remove apps as resource if we're adding it here\n remainingApps = remainingApps.filter((app) => app !== boxRef.app)\n })\n\n // Process assets\n remainingAssets.forEach((asset) => {\n populateGroupResource(transactions, { type: GroupResourceType.Asset, data: asset })\n })\n\n // Process remaining apps\n remainingApps.forEach((app) => {\n populateGroupResource(transactions, { type: GroupResourceType.App, data: app })\n })\n\n // Handle extra box refs\n if (groupResources.extraBoxRefs) {\n for (let i = 0; i < groupResources.extraBoxRefs; i++) {\n populateGroupResource(transactions, { type: GroupResourceType.ExtraBoxRef })\n }\n }\n}\n\n/**\n * Helper function to check if an app call transaction is below resource limit\n */\nfunction isAppCallBelowResourceLimit(txn: Transaction): boolean {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const accountsCount = txn.appCall?.accountReferences?.length || 0\n const assetsCount = txn.appCall?.assetReferences?.length || 0\n const appsCount = txn.appCall?.appReferences?.length || 0\n const boxesCount = txn.appCall?.boxReferences?.length || 0\n\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n}\n\ntype GroupResourceToPopulate =\n | { type: GroupResourceType.Account; data: Address }\n | { type: GroupResourceType.App; data: bigint }\n | { type: GroupResourceType.Asset; data: bigint }\n | { type: GroupResourceType.Box; data: TransactBoxReference }\n | { type: GroupResourceType.ExtraBoxRef }\n | { type: GroupResourceType.AssetHolding; data: AssetHoldingReference }\n | { type: GroupResourceType.AppLocal; data: ApplicationLocalReference }\n\n/**\n * Helper function to populate a specific resource into a transaction group\n */\nfunction populateGroupResource(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n resource: GroupResourceToPopulate,\n): void {\n // For asset holdings and app locals, first try to find a transaction that already has the account available\n if (resource.type === GroupResourceType.AssetHolding || resource.type === GroupResourceType.AppLocal) {\n const address = resource.data.account\n\n // Try to find a transaction that already has the account available\n const groupIndex1 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n\n // Check if account is in foreign accounts array\n if (appCall.accountReferences?.some((a) => a.equals(address))) {\n return true\n }\n\n // Check if account is available as an app account\n if (appCall.appReferences) {\n for (const appId of appCall.appReferences) {\n if (address === getApplicationAddress(appId)) {\n return true\n }\n }\n }\n\n // Check if account appears in any app call transaction fields\n if (txn.sender.equals(address)) {\n return true\n }\n\n return false\n })\n\n if (groupIndex1 !== -1) {\n const appCall = transactions[groupIndex1].appCall!\n if (resource.type === GroupResourceType.AssetHolding) {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.asset)) {\n appCall.assetReferences.push(resource.data.asset)\n }\n } else {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.app)) {\n appCall.appReferences.push(resource.data.app)\n }\n }\n return\n }\n\n // Try to find a transaction that has the asset/app available and space for account\n const groupIndex2 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n if ((appCall.accountReferences?.length ?? 0) >= MAX_ACCOUNT_REFERENCES) {\n return false\n }\n\n if (resource.type === GroupResourceType.AssetHolding) {\n return appCall.assetReferences?.includes(resource.data.asset) || false\n } else {\n return appCall.appReferences?.includes(resource.data.app) || appCall.appId === resource.data.app\n }\n })\n\n if (groupIndex2 !== -1) {\n const appCall = transactions[groupIndex2].appCall!\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.includes(address)) {\n appCall.accountReferences.push(address)\n }\n return\n }\n }\n\n // For boxes, first try to find a transaction that already has the app available\n if (resource.type === GroupResourceType.Box) {\n const groupIndex = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n })\n\n if (groupIndex !== -1) {\n const appCall = transactions[groupIndex].appCall!\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n return\n }\n }\n\n // Find the first transaction that can accommodate the resource\n const groupIndex = transactions.findIndex((txn) => {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const appCall = txn.appCall!\n const accountsCount = appCall.accountReferences?.length ?? 0\n const assetsCount = appCall.assetReferences?.length ?? 0\n const appsCount = appCall.appReferences?.length ?? 0\n const boxesCount = appCall.boxReferences?.length ?? 0\n\n switch (resource.type) {\n case GroupResourceType.Account:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n case GroupResourceType.AssetHolding:\n case GroupResourceType.AppLocal:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n case GroupResourceType.Box:\n if (resource.data.appId !== 0n) {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n } else {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n default:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n })\n\n if (groupIndex === -1) {\n throw new Error('No more transactions below reference limit. Add another app call to the group.')\n }\n\n const appCall = transactions[groupIndex].appCall!\n\n switch (resource.type) {\n case GroupResourceType.Account: {\n appCall.accountReferences = appCall.accountReferences ?? []\n const address = resource.data\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.App:\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data)) {\n appCall.appReferences.push(resource.data)\n }\n break\n case GroupResourceType.Box: {\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n if (resource.data.appId !== 0n) {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n break\n }\n case GroupResourceType.ExtraBoxRef:\n appCall.boxReferences = appCall.boxReferences ?? []\n appCall.boxReferences.push({ appId: 0n, name: new Uint8Array(0) })\n break\n case GroupResourceType.AssetHolding: {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.asset)) {\n appCall.assetReferences.push(resource.data.asset)\n }\n const address = resource.data.account\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.AppLocal: {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.app)) {\n appCall.appReferences.push(resource.data.app)\n }\n const address = resource.data.account\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.Asset:\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data)) {\n appCall.assetReferences.push(resource.data)\n }\n break\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-call.js","names":["buildTransactionCommonData","calculateExtraProgramPages","Transaction","TransactionType","OnApplicationComplete","getAddress","AppManager","MAX_OVERALL_REFERENCES","appCall","getApplicationAddress","MAX_ACCOUNT_REFERENCES","groupIndex"],"sources":["../../src/transactions/app-call.ts"],"sourcesContent":["import { SimulateUnnamedResourcesAccessed, SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport {\n Address,\n Expand,\n MAX_ACCOUNT_REFERENCES,\n MAX_OVERALL_REFERENCES,\n ReadableAddress,\n getAddress,\n getApplicationAddress,\n} from '@algorandfoundation/algokit-common'\nimport {\n HoldingReference,\n LocalsReference,\n OnApplicationComplete,\n ResourceReference,\n BoxReference as TransactBoxReference,\n Transaction,\n TransactionType,\n} from '@algorandfoundation/algokit-transact'\nimport { AppManager, BoxIdentifier, BoxReference as UtilsBoxReference } from '../types/app-manager'\nimport { calculateExtraProgramPages } from '../util'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Common parameters for defining an application call transaction. */\nexport type CommonAppCallParams = CommonTransactionParams & {\n /** ID of the application; 0 if the application is being created. */\n appId: bigint\n /** The [on-complete](https://dev.algorand.co/concepts/smart-contracts/avm#oncomplete) action of the call; defaults to no-op. */\n onComplete?: OnApplicationComplete\n /** Any [arguments to pass to the smart contract call](/concepts/smart-contracts/languages/teal/#argument-passing). */\n args?: Uint8Array[]\n /** Any account addresses to add to the [accounts array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n accountReferences?: ReadableAddress[]\n /** The ID of any apps to load to the [foreign apps array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n appReferences?: bigint[]\n /** The ID of any assets to load to the [foreign assets array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n assetReferences?: bigint[]\n /** Any boxes to load to the [boxes array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays).\n *\n * Either the name identifier (which will be set against app ID of `0` i.e.\n * the current app), or a box identifier with the name identifier and app ID.\n */\n boxReferences?: (UtilsBoxReference | BoxIdentifier)[]\n /** Access references unifies `accountReferences`, `appReferences`, `assetReferences`, and `boxReferences` under a single list. If non-empty, these other reference lists must be empty. If access is empty, those other reference lists may be non-empty. */\n accessReferences?: ResourceReference[]\n /** If set, the transaction will be rejected when the app's version is greater than or equal to this value. This can be used to prevent calling an app after it has been updated. Set to 0 or leave undefined to skip the version check. */\n rejectVersion?: number\n}\n\n/** Parameters to define an app create transaction */\nexport type AppCreateParams = Expand<\n Omit<CommonAppCallParams, 'appId'> & {\n appId?: 0\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.ClearState>\n /** The program to execute for all OnCompletes other than ClearState as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n clearStateProgram: string | Uint8Array\n /** The state schema for the app. This is immutable once the app is created. */\n schema?: {\n /** The number of integers saved in global state. */\n globalInts: number\n /** The number of byte slices saved in global state. */\n globalByteSlices: number\n /** The number of integers saved in local state. */\n localInts: number\n /** The number of byte slices saved in local state. */\n localByteSlices: number\n }\n /** Number of extra pages required for the programs.\n * Defaults to the number needed for the programs in this call if not specified.\n * This is immutable once the app is created. */\n extraProgramPages?: number\n }\n>\n\n/** Parameters to define an app update transaction */\nexport type AppUpdateParams = Expand<\n CommonAppCallParams & {\n onComplete?: OnApplicationComplete.UpdateApplication\n /** The program to execute for all OnCompletes other than ClearState as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n clearStateProgram: string | Uint8Array\n }\n>\n\n/** Parameters to define an application call transaction. */\nexport type AppCallParams = CommonAppCallParams & { onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication> }\n\n/** Common parameters to define an ABI method call transaction. */\nexport type AppMethodCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication | OnApplicationComplete.ClearState>\n}\n\n/** Parameters to define an application delete call transaction. */\nexport type AppDeleteParams = CommonAppCallParams & { onComplete?: OnApplicationComplete.DeleteApplication }\n\nexport const buildAppCreate = async (\n params: AppCreateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n const globalStateSchema =\n params.schema?.globalByteSlices !== undefined || params.schema?.globalInts !== undefined\n ? { numByteSlices: params.schema?.globalByteSlices ?? 0, numUints: params.schema?.globalInts ?? 0 }\n : undefined\n const localStateSchema =\n params.schema?.localByteSlices !== undefined || params.schema?.localInts !== undefined\n ? { numByteSlices: params.schema?.localByteSlices ?? 0, numUints: params.schema?.localInts ?? 0 }\n : undefined\n const extraProgramPages =\n params.extraProgramPages !== undefined ? params.extraProgramPages : calculateExtraProgramPages(approvalProgram!, clearStateProgram!)\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: 0n, // App creation always uses ID 0\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppUpdate = async (\n params: AppUpdateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: OnApplicationComplete.UpdateApplication,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppCall = (\n params: AppCallParams | AppDeleteParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\n/**\n * Populate transaction-level resources for app call transactions\n */\nexport function populateTransactionResources(\n transaction: Transaction, // NOTE: transaction is mutated in place\n resourcesAccessed: SimulateUnnamedResourcesAccessed,\n groupIndex: number,\n): void {\n if (transaction.type !== TransactionType.AppCall || transaction.appCall === undefined) {\n return\n }\n\n // Check for unexpected resources at transaction level\n if (resourcesAccessed.boxes || resourcesAccessed.extraBoxRefs) {\n throw new Error('Unexpected boxes at the transaction level')\n }\n if (resourcesAccessed.appLocals) {\n throw new Error('Unexpected app locals at the transaction level')\n }\n if (resourcesAccessed.assetHoldings) {\n throw new Error('Unexpected asset holdings at the transaction level')\n }\n\n let accountsCount = 0\n let appsCount = 0\n let assetsCount = 0\n const boxesCount = transaction.appCall.boxReferences?.length ?? 0\n\n // Populate accounts\n if (resourcesAccessed.accounts) {\n transaction.appCall.accountReferences = transaction.appCall.accountReferences ?? []\n for (const account of resourcesAccessed.accounts) {\n const address = account\n if (!transaction.appCall.accountReferences.some((a) => a.equals(address))) {\n transaction.appCall.accountReferences.push(address)\n }\n }\n accountsCount = transaction.appCall.accountReferences.length\n }\n\n // Populate apps\n if (resourcesAccessed.apps) {\n transaction.appCall.appReferences = transaction.appCall.appReferences ?? []\n for (const appId of resourcesAccessed.apps) {\n if (!transaction.appCall.appReferences.includes(appId)) {\n transaction.appCall.appReferences.push(appId)\n }\n }\n appsCount = transaction.appCall.appReferences.length\n }\n\n // Populate assets\n if (resourcesAccessed.assets) {\n transaction.appCall.assetReferences = transaction.appCall.assetReferences ?? []\n for (const assetId of resourcesAccessed.assets) {\n if (!transaction.appCall.assetReferences.includes(assetId)) {\n transaction.appCall.assetReferences.push(assetId)\n }\n }\n assetsCount = transaction.appCall.assetReferences.length\n }\n\n if (accountsCount + assetsCount + appsCount + boxesCount > MAX_OVERALL_REFERENCES) {\n throw new Error(`Resource reference limit of ${MAX_OVERALL_REFERENCES} exceeded in transaction ${groupIndex}`)\n }\n}\n\nenum GroupResourceType {\n Account,\n App,\n Asset,\n Box,\n ExtraBoxRef,\n AssetHolding,\n AppLocal,\n}\n\n/**\n * Populate group-level resources for app call transactions\n */\nexport function populateGroupResources(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n groupResources: SimulateUnnamedResourcesAccessed,\n): void {\n let remainingAccounts = [...(groupResources.accounts ?? [])]\n let remainingApps = [...(groupResources.apps ?? [])]\n let remainingAssets = [...(groupResources.assets ?? [])]\n const remainingBoxes = [...(groupResources.boxes ?? [])]\n\n // Process cross-reference resources first (app locals and asset holdings) as they are most restrictive\n if (groupResources.appLocals) {\n groupResources.appLocals.forEach((appLocal) => {\n populateGroupResource(transactions, { type: GroupResourceType.AppLocal, data: appLocal })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.address)\n remainingApps = remainingApps.filter((app) => app !== appLocal.appId)\n })\n }\n\n if (groupResources.assetHoldings) {\n groupResources.assetHoldings.forEach((assetHolding) => {\n populateGroupResource(transactions, { type: GroupResourceType.AssetHolding, data: assetHolding })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.address)\n remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.assetId)\n })\n }\n\n // Process accounts next because account limit is 4\n remainingAccounts.forEach((account) => {\n populateGroupResource(transactions, { type: GroupResourceType.Account, data: account })\n })\n\n // Process boxes\n remainingBoxes.forEach((boxRef) => {\n populateGroupResource(transactions, { type: GroupResourceType.Box, data: { appId: boxRef.appId, name: boxRef.name } })\n // Remove apps as resource if we're adding it here\n remainingApps = remainingApps.filter((app) => app !== boxRef.appId)\n })\n\n // Process assets\n remainingAssets.forEach((asset) => {\n populateGroupResource(transactions, { type: GroupResourceType.Asset, data: asset })\n })\n\n // Process remaining apps\n remainingApps.forEach((app) => {\n populateGroupResource(transactions, { type: GroupResourceType.App, data: app })\n })\n\n // Handle extra box refs\n if (groupResources.extraBoxRefs) {\n for (let i = 0; i < groupResources.extraBoxRefs; i++) {\n populateGroupResource(transactions, { type: GroupResourceType.ExtraBoxRef })\n }\n }\n}\n\n/**\n * Helper function to check if an app call transaction is below resource limit\n */\nfunction isAppCallBelowResourceLimit(txn: Transaction): boolean {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const accountsCount = txn.appCall?.accountReferences?.length || 0\n const assetsCount = txn.appCall?.assetReferences?.length || 0\n const appsCount = txn.appCall?.appReferences?.length || 0\n const boxesCount = txn.appCall?.boxReferences?.length || 0\n\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n}\n\ntype GroupResourceToPopulate =\n | { type: GroupResourceType.Account; data: Address }\n | { type: GroupResourceType.App; data: bigint }\n | { type: GroupResourceType.Asset; data: bigint }\n | { type: GroupResourceType.Box; data: TransactBoxReference }\n | { type: GroupResourceType.ExtraBoxRef }\n | { type: GroupResourceType.AssetHolding; data: HoldingReference }\n | { type: GroupResourceType.AppLocal; data: LocalsReference }\n\n/**\n * Helper function to populate a specific resource into a transaction group\n */\nfunction populateGroupResource(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n resource: GroupResourceToPopulate,\n): void {\n // For asset holdings and app locals, first try to find a transaction that already has the account available\n if (resource.type === GroupResourceType.AssetHolding || resource.type === GroupResourceType.AppLocal) {\n const address = resource.data.address\n\n // Try to find a transaction that already has the account available\n const groupIndex1 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n\n // Check if account is in foreign accounts array\n if (appCall.accountReferences?.some((a) => a.equals(address))) {\n return true\n }\n\n // Check if account is available as an app account\n if (appCall.appReferences) {\n for (const appId of appCall.appReferences) {\n if (address === getApplicationAddress(appId)) {\n return true\n }\n }\n }\n\n // Check if account appears in any app call transaction fields\n if (txn.sender.equals(address)) {\n return true\n }\n\n return false\n })\n\n if (groupIndex1 !== -1) {\n const appCall = transactions[groupIndex1].appCall!\n if (resource.type === GroupResourceType.AssetHolding) {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.assetId)) {\n appCall.assetReferences.push(resource.data.assetId)\n }\n } else {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n return\n }\n\n // Try to find a transaction that has the asset/app available and space for account\n const groupIndex2 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n if ((appCall.accountReferences?.length ?? 0) >= MAX_ACCOUNT_REFERENCES) {\n return false\n }\n\n if (resource.type === GroupResourceType.AssetHolding) {\n return appCall.assetReferences?.includes(resource.data.assetId) || false\n } else {\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n }\n })\n\n if (groupIndex2 !== -1) {\n const appCall = transactions[groupIndex2].appCall!\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.includes(address)) {\n appCall.accountReferences.push(address)\n }\n return\n }\n }\n\n // For boxes, first try to find a transaction that already has the app available\n if (resource.type === GroupResourceType.Box) {\n const groupIndex = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n })\n\n if (groupIndex !== -1) {\n const appCall = transactions[groupIndex].appCall!\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n return\n }\n }\n\n // Find the first transaction that can accommodate the resource\n const groupIndex = transactions.findIndex((txn) => {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const appCall = txn.appCall!\n const accountsCount = appCall.accountReferences?.length ?? 0\n const assetsCount = appCall.assetReferences?.length ?? 0\n const appsCount = appCall.appReferences?.length ?? 0\n const boxesCount = appCall.boxReferences?.length ?? 0\n\n switch (resource.type) {\n case GroupResourceType.Account:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n case GroupResourceType.AssetHolding:\n case GroupResourceType.AppLocal:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n case GroupResourceType.Box:\n if (resource.data.appId !== 0n) {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n } else {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n default:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n })\n\n if (groupIndex === -1) {\n throw new Error('No more transactions below reference limit. Add another app call to the group.')\n }\n\n const appCall = transactions[groupIndex].appCall!\n\n switch (resource.type) {\n case GroupResourceType.Account: {\n appCall.accountReferences = appCall.accountReferences ?? []\n const address = resource.data\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.App:\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data)) {\n appCall.appReferences.push(resource.data)\n }\n break\n case GroupResourceType.Box: {\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n if (resource.data.appId !== 0n) {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n break\n }\n case GroupResourceType.ExtraBoxRef:\n appCall.boxReferences = appCall.boxReferences ?? []\n appCall.boxReferences.push({ appId: 0n, name: new Uint8Array(0) })\n break\n case GroupResourceType.AssetHolding: {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.assetId)) {\n appCall.assetReferences.push(resource.data.assetId)\n }\n const address = resource.data.address\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.AppLocal: {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n const address = resource.data.address\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.Asset:\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data)) {\n appCall.assetReferences.push(resource.data)\n }\n break\n }\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { MAX_ACCOUNT_REFERENCES, MAX_OVERALL_REFERENCES } from "../packages/common/src/constants.mjs";
2
2
  import { getAddress, getApplicationAddress } from "../packages/common/src/address.mjs";
3
+ import { calculateExtraProgramPages } from "../util.mjs";
3
4
  import { OnApplicationComplete } from "../packages/transact/src/transactions/app-call.mjs";
4
5
  import { TransactionType } from "../packages/transact/src/transactions/transaction-type.mjs";
5
6
  import { Transaction } from "../packages/transact/src/transactions/transaction.mjs";
6
- import { calculateExtraProgramPages } from "../util.mjs";
7
7
  import { AppManager } from "../types/app-manager.mjs";
8
8
  import { buildTransactionCommonData } from "./common.mjs";
9
9
 
@@ -143,16 +143,16 @@ function populateGroupResources(transactions, groupResources) {
143
143
  type: GroupResourceType.AppLocal,
144
144
  data: appLocal
145
145
  });
146
- remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.account);
147
- remainingApps = remainingApps.filter((app) => app !== appLocal.app);
146
+ remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.address);
147
+ remainingApps = remainingApps.filter((app) => app !== appLocal.appId);
148
148
  });
149
149
  if (groupResources.assetHoldings) groupResources.assetHoldings.forEach((assetHolding) => {
150
150
  populateGroupResource(transactions, {
151
151
  type: GroupResourceType.AssetHolding,
152
152
  data: assetHolding
153
153
  });
154
- remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.account);
155
- remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.asset);
154
+ remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.address);
155
+ remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.assetId);
156
156
  });
157
157
  remainingAccounts.forEach((account) => {
158
158
  populateGroupResource(transactions, {
@@ -164,11 +164,11 @@ function populateGroupResources(transactions, groupResources) {
164
164
  populateGroupResource(transactions, {
165
165
  type: GroupResourceType.Box,
166
166
  data: {
167
- appId: boxRef.app,
167
+ appId: boxRef.appId,
168
168
  name: boxRef.name
169
169
  }
170
170
  });
171
- remainingApps = remainingApps.filter((app) => app !== boxRef.app);
171
+ remainingApps = remainingApps.filter((app) => app !== boxRef.appId);
172
172
  });
173
173
  remainingAssets.forEach((asset) => {
174
174
  populateGroupResource(transactions, {
@@ -201,7 +201,7 @@ function isAppCallBelowResourceLimit(txn) {
201
201
  */
202
202
  function populateGroupResource(transactions, resource) {
203
203
  if (resource.type === GroupResourceType.AssetHolding || resource.type === GroupResourceType.AppLocal) {
204
- const address = resource.data.account;
204
+ const address = resource.data.address;
205
205
  const groupIndex1 = transactions.findIndex((txn) => {
206
206
  if (!isAppCallBelowResourceLimit(txn)) return false;
207
207
  const appCall$1 = txn.appCall;
@@ -216,10 +216,10 @@ function populateGroupResource(transactions, resource) {
216
216
  const appCall$1 = transactions[groupIndex1].appCall;
217
217
  if (resource.type === GroupResourceType.AssetHolding) {
218
218
  appCall$1.assetReferences = appCall$1.assetReferences ?? [];
219
- if (!appCall$1.assetReferences.includes(resource.data.asset)) appCall$1.assetReferences.push(resource.data.asset);
219
+ if (!appCall$1.assetReferences.includes(resource.data.assetId)) appCall$1.assetReferences.push(resource.data.assetId);
220
220
  } else {
221
221
  appCall$1.appReferences = appCall$1.appReferences ?? [];
222
- if (!appCall$1.appReferences.includes(resource.data.app)) appCall$1.appReferences.push(resource.data.app);
222
+ if (!appCall$1.appReferences.includes(resource.data.appId)) appCall$1.appReferences.push(resource.data.appId);
223
223
  }
224
224
  return;
225
225
  }
@@ -227,8 +227,8 @@ function populateGroupResource(transactions, resource) {
227
227
  if (!isAppCallBelowResourceLimit(txn)) return false;
228
228
  const appCall$1 = txn.appCall;
229
229
  if ((appCall$1.accountReferences?.length ?? 0) >= MAX_ACCOUNT_REFERENCES) return false;
230
- if (resource.type === GroupResourceType.AssetHolding) return appCall$1.assetReferences?.includes(resource.data.asset) || false;
231
- else return appCall$1.appReferences?.includes(resource.data.app) || appCall$1.appId === resource.data.app;
230
+ if (resource.type === GroupResourceType.AssetHolding) return appCall$1.assetReferences?.includes(resource.data.assetId) || false;
231
+ else return appCall$1.appReferences?.includes(resource.data.appId) || appCall$1.appId === resource.data.appId;
232
232
  });
233
233
  if (groupIndex2 !== -1) {
234
234
  const appCall$1 = transactions[groupIndex2].appCall;
@@ -303,16 +303,16 @@ function populateGroupResource(transactions, resource) {
303
303
  break;
304
304
  case GroupResourceType.AssetHolding: {
305
305
  appCall.assetReferences = appCall.assetReferences ?? [];
306
- if (!appCall.assetReferences.includes(resource.data.asset)) appCall.assetReferences.push(resource.data.asset);
307
- const address = resource.data.account;
306
+ if (!appCall.assetReferences.includes(resource.data.assetId)) appCall.assetReferences.push(resource.data.assetId);
307
+ const address = resource.data.address;
308
308
  appCall.accountReferences = appCall.accountReferences ?? [];
309
309
  if (!appCall.accountReferences.some((a) => a.equals(address))) appCall.accountReferences.push(address);
310
310
  break;
311
311
  }
312
312
  case GroupResourceType.AppLocal: {
313
313
  appCall.appReferences = appCall.appReferences ?? [];
314
- if (!appCall.appReferences.includes(resource.data.app)) appCall.appReferences.push(resource.data.app);
315
- const address = resource.data.account;
314
+ if (!appCall.appReferences.includes(resource.data.appId)) appCall.appReferences.push(resource.data.appId);
315
+ const address = resource.data.address;
316
316
  appCall.accountReferences = appCall.accountReferences ?? [];
317
317
  if (!appCall.accountReferences.some((a) => a.equals(address))) appCall.accountReferences.push(address);
318
318
  break;
@@ -1 +1 @@
1
- {"version":3,"file":"app-call.mjs","names":["appCall","groupIndex"],"sources":["../../src/transactions/app-call.ts"],"sourcesContent":["import {\n ApplicationLocalReference,\n AssetHoldingReference,\n SimulateUnnamedResourcesAccessed,\n SuggestedParams,\n} from '@algorandfoundation/algokit-algod-client'\nimport {\n Address,\n MAX_ACCOUNT_REFERENCES,\n MAX_OVERALL_REFERENCES,\n ReadableAddress,\n getAddress,\n getApplicationAddress,\n} from '@algorandfoundation/algokit-common'\nimport {\n AccessReference,\n OnApplicationComplete,\n BoxReference as TransactBoxReference,\n Transaction,\n TransactionType,\n} from '@algorandfoundation/algokit-transact'\nimport { AppManager, BoxIdentifier, BoxReference as UtilsBoxReference } from '../types/app-manager'\nimport { Expand } from '../types/expand'\nimport { calculateExtraProgramPages } from '../util'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Common parameters for defining an application call transaction. */\nexport type CommonAppCallParams = CommonTransactionParams & {\n /** ID of the application; 0 if the application is being created. */\n appId: bigint\n /** The [on-complete](https://dev.algorand.co/concepts/smart-contracts/avm#oncomplete) action of the call; defaults to no-op. */\n onComplete?: OnApplicationComplete\n /** Any [arguments to pass to the smart contract call](/concepts/smart-contracts/languages/teal/#argument-passing). */\n args?: Uint8Array[]\n /** Any account addresses to add to the [accounts array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n accountReferences?: ReadableAddress[]\n /** The ID of any apps to load to the [foreign apps array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n appReferences?: bigint[]\n /** The ID of any assets to load to the [foreign assets array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n assetReferences?: bigint[]\n /** Any boxes to load to the [boxes array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays).\n *\n * Either the name identifier (which will be set against app ID of `0` i.e.\n * the current app), or a box identifier with the name identifier and app ID.\n */\n boxReferences?: (UtilsBoxReference | BoxIdentifier)[]\n /** Access references unifies `accountReferences`, `appReferences`, `assetReferences`, and `boxReferences` under a single list. If non-empty, these other reference lists must be empty. If access is empty, those other reference lists may be non-empty. */\n accessReferences?: AccessReference[]\n /** The lowest application version for which this transaction should immediately fail. 0 indicates that no version check should be performed. */\n rejectVersion?: number\n}\n\n/** Parameters to define an app create transaction */\nexport type AppCreateParams = Expand<\n Omit<CommonAppCallParams, 'appId'> & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.ClearState>\n /** The program to execute for all OnCompletes other than ClearState as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n clearStateProgram: string | Uint8Array\n /** The state schema for the app. This is immutable once the app is created. */\n schema?: {\n /** The number of integers saved in global state. */\n globalInts: number\n /** The number of byte slices saved in global state. */\n globalByteSlices: number\n /** The number of integers saved in local state. */\n localInts: number\n /** The number of byte slices saved in local state. */\n localByteSlices: number\n }\n /** Number of extra pages required for the programs.\n * Defaults to the number needed for the programs in this call if not specified.\n * This is immutable once the app is created. */\n extraProgramPages?: number\n }\n>\n\n/** Parameters to define an app update transaction */\nexport type AppUpdateParams = Expand<\n CommonAppCallParams & {\n onComplete?: OnApplicationComplete.UpdateApplication\n /** The program to execute for all OnCompletes other than ClearState as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n clearStateProgram: string | Uint8Array\n }\n>\n\n/** Parameters to define an application call transaction. */\nexport type AppCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication>\n}\n\n/** Common parameters to define an ABI method call transaction. */\nexport type AppMethodCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication | OnApplicationComplete.ClearState>\n}\n\n/** Parameters to define an application delete call transaction. */\nexport type AppDeleteParams = CommonAppCallParams & {\n onComplete?: OnApplicationComplete.DeleteApplication\n}\n\nexport const buildAppCreate = async (\n params: AppCreateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n const globalStateSchema =\n params.schema?.globalByteSlices !== undefined || params.schema?.globalInts !== undefined\n ? {\n numByteSlices: params.schema?.globalByteSlices ?? 0,\n numUints: params.schema?.globalInts ?? 0,\n }\n : undefined\n const localStateSchema =\n params.schema?.localByteSlices !== undefined || params.schema?.localInts !== undefined\n ? {\n numByteSlices: params.schema?.localByteSlices ?? 0,\n numUints: params.schema?.localInts ?? 0,\n }\n : undefined\n const extraProgramPages =\n params.extraProgramPages !== undefined ? params.extraProgramPages : calculateExtraProgramPages(approvalProgram!, clearStateProgram!)\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: 0n, // App creation always uses ID 0\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppUpdate = async (\n params: AppUpdateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: OnApplicationComplete.UpdateApplication,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppCall = (\n params: AppCallParams | AppDeleteParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\n/**\n * Populate transaction-level resources for app call transactions\n */\nexport function populateTransactionResources(\n transaction: Transaction, // NOTE: transaction is mutated in place\n resourcesAccessed: SimulateUnnamedResourcesAccessed,\n groupIndex: number,\n): void {\n if (transaction.type !== TransactionType.AppCall || transaction.appCall === undefined) {\n return\n }\n\n // Check for unexpected resources at transaction level\n if (resourcesAccessed.boxes || resourcesAccessed.extraBoxRefs) {\n throw new Error('Unexpected boxes at the transaction level')\n }\n if (resourcesAccessed.appLocals) {\n throw new Error('Unexpected app locals at the transaction level')\n }\n if (resourcesAccessed.assetHoldings) {\n throw new Error('Unexpected asset holdings at the transaction level')\n }\n\n let accountsCount = 0\n let appsCount = 0\n let assetsCount = 0\n const boxesCount = transaction.appCall.boxReferences?.length ?? 0\n\n // Populate accounts\n if (resourcesAccessed.accounts) {\n transaction.appCall.accountReferences = transaction.appCall.accountReferences ?? []\n for (const account of resourcesAccessed.accounts) {\n const address = account\n if (!transaction.appCall.accountReferences.some((a) => a.equals(address))) {\n transaction.appCall.accountReferences.push(address)\n }\n }\n accountsCount = transaction.appCall.accountReferences.length\n }\n\n // Populate apps\n if (resourcesAccessed.apps) {\n transaction.appCall.appReferences = transaction.appCall.appReferences ?? []\n for (const appId of resourcesAccessed.apps) {\n if (!transaction.appCall.appReferences.includes(appId)) {\n transaction.appCall.appReferences.push(appId)\n }\n }\n appsCount = transaction.appCall.appReferences.length\n }\n\n // Populate assets\n if (resourcesAccessed.assets) {\n transaction.appCall.assetReferences = transaction.appCall.assetReferences ?? []\n for (const assetId of resourcesAccessed.assets) {\n if (!transaction.appCall.assetReferences.includes(assetId)) {\n transaction.appCall.assetReferences.push(assetId)\n }\n }\n assetsCount = transaction.appCall.assetReferences.length\n }\n\n if (accountsCount + assetsCount + appsCount + boxesCount > MAX_OVERALL_REFERENCES) {\n throw new Error(`Resource reference limit of ${MAX_OVERALL_REFERENCES} exceeded in transaction ${groupIndex}`)\n }\n}\n\nenum GroupResourceType {\n Account,\n App,\n Asset,\n Box,\n ExtraBoxRef,\n AssetHolding,\n AppLocal,\n}\n\n/**\n * Populate group-level resources for app call transactions\n */\nexport function populateGroupResources(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n groupResources: SimulateUnnamedResourcesAccessed,\n): void {\n let remainingAccounts = [...(groupResources.accounts ?? [])]\n let remainingApps = [...(groupResources.apps ?? [])]\n let remainingAssets = [...(groupResources.assets ?? [])]\n const remainingBoxes = [...(groupResources.boxes ?? [])]\n\n // Process cross-reference resources first (app locals and asset holdings) as they are most restrictive\n if (groupResources.appLocals) {\n groupResources.appLocals.forEach((appLocal) => {\n populateGroupResource(transactions, { type: GroupResourceType.AppLocal, data: appLocal })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.account)\n remainingApps = remainingApps.filter((app) => app !== appLocal.app)\n })\n }\n\n if (groupResources.assetHoldings) {\n groupResources.assetHoldings.forEach((assetHolding) => {\n populateGroupResource(transactions, { type: GroupResourceType.AssetHolding, data: assetHolding })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.account)\n remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.asset)\n })\n }\n\n // Process accounts next because account limit is 4\n remainingAccounts.forEach((account) => {\n populateGroupResource(transactions, { type: GroupResourceType.Account, data: account })\n })\n\n // Process boxes\n remainingBoxes.forEach((boxRef) => {\n populateGroupResource(transactions, {\n type: GroupResourceType.Box,\n data: {\n appId: boxRef.app,\n name: boxRef.name,\n },\n })\n // Remove apps as resource if we're adding it here\n remainingApps = remainingApps.filter((app) => app !== boxRef.app)\n })\n\n // Process assets\n remainingAssets.forEach((asset) => {\n populateGroupResource(transactions, { type: GroupResourceType.Asset, data: asset })\n })\n\n // Process remaining apps\n remainingApps.forEach((app) => {\n populateGroupResource(transactions, { type: GroupResourceType.App, data: app })\n })\n\n // Handle extra box refs\n if (groupResources.extraBoxRefs) {\n for (let i = 0; i < groupResources.extraBoxRefs; i++) {\n populateGroupResource(transactions, { type: GroupResourceType.ExtraBoxRef })\n }\n }\n}\n\n/**\n * Helper function to check if an app call transaction is below resource limit\n */\nfunction isAppCallBelowResourceLimit(txn: Transaction): boolean {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const accountsCount = txn.appCall?.accountReferences?.length || 0\n const assetsCount = txn.appCall?.assetReferences?.length || 0\n const appsCount = txn.appCall?.appReferences?.length || 0\n const boxesCount = txn.appCall?.boxReferences?.length || 0\n\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n}\n\ntype GroupResourceToPopulate =\n | { type: GroupResourceType.Account; data: Address }\n | { type: GroupResourceType.App; data: bigint }\n | { type: GroupResourceType.Asset; data: bigint }\n | { type: GroupResourceType.Box; data: TransactBoxReference }\n | { type: GroupResourceType.ExtraBoxRef }\n | { type: GroupResourceType.AssetHolding; data: AssetHoldingReference }\n | { type: GroupResourceType.AppLocal; data: ApplicationLocalReference }\n\n/**\n * Helper function to populate a specific resource into a transaction group\n */\nfunction populateGroupResource(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n resource: GroupResourceToPopulate,\n): void {\n // For asset holdings and app locals, first try to find a transaction that already has the account available\n if (resource.type === GroupResourceType.AssetHolding || resource.type === GroupResourceType.AppLocal) {\n const address = resource.data.account\n\n // Try to find a transaction that already has the account available\n const groupIndex1 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n\n // Check if account is in foreign accounts array\n if (appCall.accountReferences?.some((a) => a.equals(address))) {\n return true\n }\n\n // Check if account is available as an app account\n if (appCall.appReferences) {\n for (const appId of appCall.appReferences) {\n if (address === getApplicationAddress(appId)) {\n return true\n }\n }\n }\n\n // Check if account appears in any app call transaction fields\n if (txn.sender.equals(address)) {\n return true\n }\n\n return false\n })\n\n if (groupIndex1 !== -1) {\n const appCall = transactions[groupIndex1].appCall!\n if (resource.type === GroupResourceType.AssetHolding) {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.asset)) {\n appCall.assetReferences.push(resource.data.asset)\n }\n } else {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.app)) {\n appCall.appReferences.push(resource.data.app)\n }\n }\n return\n }\n\n // Try to find a transaction that has the asset/app available and space for account\n const groupIndex2 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n if ((appCall.accountReferences?.length ?? 0) >= MAX_ACCOUNT_REFERENCES) {\n return false\n }\n\n if (resource.type === GroupResourceType.AssetHolding) {\n return appCall.assetReferences?.includes(resource.data.asset) || false\n } else {\n return appCall.appReferences?.includes(resource.data.app) || appCall.appId === resource.data.app\n }\n })\n\n if (groupIndex2 !== -1) {\n const appCall = transactions[groupIndex2].appCall!\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.includes(address)) {\n appCall.accountReferences.push(address)\n }\n return\n }\n }\n\n // For boxes, first try to find a transaction that already has the app available\n if (resource.type === GroupResourceType.Box) {\n const groupIndex = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n })\n\n if (groupIndex !== -1) {\n const appCall = transactions[groupIndex].appCall!\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n return\n }\n }\n\n // Find the first transaction that can accommodate the resource\n const groupIndex = transactions.findIndex((txn) => {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const appCall = txn.appCall!\n const accountsCount = appCall.accountReferences?.length ?? 0\n const assetsCount = appCall.assetReferences?.length ?? 0\n const appsCount = appCall.appReferences?.length ?? 0\n const boxesCount = appCall.boxReferences?.length ?? 0\n\n switch (resource.type) {\n case GroupResourceType.Account:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n case GroupResourceType.AssetHolding:\n case GroupResourceType.AppLocal:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n case GroupResourceType.Box:\n if (resource.data.appId !== 0n) {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n } else {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n default:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n })\n\n if (groupIndex === -1) {\n throw new Error('No more transactions below reference limit. Add another app call to the group.')\n }\n\n const appCall = transactions[groupIndex].appCall!\n\n switch (resource.type) {\n case GroupResourceType.Account: {\n appCall.accountReferences = appCall.accountReferences ?? []\n const address = resource.data\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.App:\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data)) {\n appCall.appReferences.push(resource.data)\n }\n break\n case GroupResourceType.Box: {\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n if (resource.data.appId !== 0n) {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n break\n }\n case GroupResourceType.ExtraBoxRef:\n appCall.boxReferences = appCall.boxReferences ?? []\n appCall.boxReferences.push({ appId: 0n, name: new Uint8Array(0) })\n break\n case GroupResourceType.AssetHolding: {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.asset)) {\n appCall.assetReferences.push(resource.data.asset)\n }\n const address = resource.data.account\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.AppLocal: {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.app)) {\n appCall.appReferences.push(resource.data.app)\n }\n const address = resource.data.account\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.Asset:\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data)) {\n appCall.assetReferences.push(resource.data)\n }\n break\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"app-call.mjs","names":["appCall","groupIndex"],"sources":["../../src/transactions/app-call.ts"],"sourcesContent":["import { SimulateUnnamedResourcesAccessed, SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport {\n Address,\n Expand,\n MAX_ACCOUNT_REFERENCES,\n MAX_OVERALL_REFERENCES,\n ReadableAddress,\n getAddress,\n getApplicationAddress,\n} from '@algorandfoundation/algokit-common'\nimport {\n HoldingReference,\n LocalsReference,\n OnApplicationComplete,\n ResourceReference,\n BoxReference as TransactBoxReference,\n Transaction,\n TransactionType,\n} from '@algorandfoundation/algokit-transact'\nimport { AppManager, BoxIdentifier, BoxReference as UtilsBoxReference } from '../types/app-manager'\nimport { calculateExtraProgramPages } from '../util'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Common parameters for defining an application call transaction. */\nexport type CommonAppCallParams = CommonTransactionParams & {\n /** ID of the application; 0 if the application is being created. */\n appId: bigint\n /** The [on-complete](https://dev.algorand.co/concepts/smart-contracts/avm#oncomplete) action of the call; defaults to no-op. */\n onComplete?: OnApplicationComplete\n /** Any [arguments to pass to the smart contract call](/concepts/smart-contracts/languages/teal/#argument-passing). */\n args?: Uint8Array[]\n /** Any account addresses to add to the [accounts array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n accountReferences?: ReadableAddress[]\n /** The ID of any apps to load to the [foreign apps array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n appReferences?: bigint[]\n /** The ID of any assets to load to the [foreign assets array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays). */\n assetReferences?: bigint[]\n /** Any boxes to load to the [boxes array](https://dev.algorand.co/concepts/smart-contracts/resource-usage#what-are-reference-arrays).\n *\n * Either the name identifier (which will be set against app ID of `0` i.e.\n * the current app), or a box identifier with the name identifier and app ID.\n */\n boxReferences?: (UtilsBoxReference | BoxIdentifier)[]\n /** Access references unifies `accountReferences`, `appReferences`, `assetReferences`, and `boxReferences` under a single list. If non-empty, these other reference lists must be empty. If access is empty, those other reference lists may be non-empty. */\n accessReferences?: ResourceReference[]\n /** If set, the transaction will be rejected when the app's version is greater than or equal to this value. This can be used to prevent calling an app after it has been updated. Set to 0 or leave undefined to skip the version check. */\n rejectVersion?: number\n}\n\n/** Parameters to define an app create transaction */\nexport type AppCreateParams = Expand<\n Omit<CommonAppCallParams, 'appId'> & {\n appId?: 0\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.ClearState>\n /** The program to execute for all OnCompletes other than ClearState as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal that will be compiled (string) or compiled teal (encoded as a byte array (Uint8Array)). */\n clearStateProgram: string | Uint8Array\n /** The state schema for the app. This is immutable once the app is created. */\n schema?: {\n /** The number of integers saved in global state. */\n globalInts: number\n /** The number of byte slices saved in global state. */\n globalByteSlices: number\n /** The number of integers saved in local state. */\n localInts: number\n /** The number of byte slices saved in local state. */\n localByteSlices: number\n }\n /** Number of extra pages required for the programs.\n * Defaults to the number needed for the programs in this call if not specified.\n * This is immutable once the app is created. */\n extraProgramPages?: number\n }\n>\n\n/** Parameters to define an app update transaction */\nexport type AppUpdateParams = Expand<\n CommonAppCallParams & {\n onComplete?: OnApplicationComplete.UpdateApplication\n /** The program to execute for all OnCompletes other than ClearState as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n approvalProgram: string | Uint8Array\n /** The program to execute for ClearState OnComplete as raw teal (string) or compiled teal (base 64 encoded as a byte array (Uint8Array)) */\n clearStateProgram: string | Uint8Array\n }\n>\n\n/** Parameters to define an application call transaction. */\nexport type AppCallParams = CommonAppCallParams & { onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication> }\n\n/** Common parameters to define an ABI method call transaction. */\nexport type AppMethodCallParams = CommonAppCallParams & {\n onComplete?: Exclude<OnApplicationComplete, OnApplicationComplete.UpdateApplication | OnApplicationComplete.ClearState>\n}\n\n/** Parameters to define an application delete call transaction. */\nexport type AppDeleteParams = CommonAppCallParams & { onComplete?: OnApplicationComplete.DeleteApplication }\n\nexport const buildAppCreate = async (\n params: AppCreateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n const globalStateSchema =\n params.schema?.globalByteSlices !== undefined || params.schema?.globalInts !== undefined\n ? { numByteSlices: params.schema?.globalByteSlices ?? 0, numUints: params.schema?.globalInts ?? 0 }\n : undefined\n const localStateSchema =\n params.schema?.localByteSlices !== undefined || params.schema?.localInts !== undefined\n ? { numByteSlices: params.schema?.localByteSlices ?? 0, numUints: params.schema?.localInts ?? 0 }\n : undefined\n const extraProgramPages =\n params.extraProgramPages !== undefined ? params.extraProgramPages : calculateExtraProgramPages(approvalProgram!, clearStateProgram!)\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: 0n, // App creation always uses ID 0\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppUpdate = async (\n params: AppUpdateParams,\n appManager: AppManager,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const approvalProgram =\n typeof params.approvalProgram === 'string'\n ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes\n : params.approvalProgram\n const clearStateProgram =\n typeof params.clearStateProgram === 'string'\n ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes\n : params.clearStateProgram\n\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: OnApplicationComplete.UpdateApplication,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppCall = (\n params: AppCallParams | AppDeleteParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n // If accessReferences is provided, we should not pass legacy foreign arrays\n const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0\n\n return new Transaction({\n ...commonData,\n type: TransactionType.AppCall,\n appCall: {\n appId: params.appId,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n args: params.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: params.accountReferences?.map((a) => getAddress(a)),\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\n/**\n * Populate transaction-level resources for app call transactions\n */\nexport function populateTransactionResources(\n transaction: Transaction, // NOTE: transaction is mutated in place\n resourcesAccessed: SimulateUnnamedResourcesAccessed,\n groupIndex: number,\n): void {\n if (transaction.type !== TransactionType.AppCall || transaction.appCall === undefined) {\n return\n }\n\n // Check for unexpected resources at transaction level\n if (resourcesAccessed.boxes || resourcesAccessed.extraBoxRefs) {\n throw new Error('Unexpected boxes at the transaction level')\n }\n if (resourcesAccessed.appLocals) {\n throw new Error('Unexpected app locals at the transaction level')\n }\n if (resourcesAccessed.assetHoldings) {\n throw new Error('Unexpected asset holdings at the transaction level')\n }\n\n let accountsCount = 0\n let appsCount = 0\n let assetsCount = 0\n const boxesCount = transaction.appCall.boxReferences?.length ?? 0\n\n // Populate accounts\n if (resourcesAccessed.accounts) {\n transaction.appCall.accountReferences = transaction.appCall.accountReferences ?? []\n for (const account of resourcesAccessed.accounts) {\n const address = account\n if (!transaction.appCall.accountReferences.some((a) => a.equals(address))) {\n transaction.appCall.accountReferences.push(address)\n }\n }\n accountsCount = transaction.appCall.accountReferences.length\n }\n\n // Populate apps\n if (resourcesAccessed.apps) {\n transaction.appCall.appReferences = transaction.appCall.appReferences ?? []\n for (const appId of resourcesAccessed.apps) {\n if (!transaction.appCall.appReferences.includes(appId)) {\n transaction.appCall.appReferences.push(appId)\n }\n }\n appsCount = transaction.appCall.appReferences.length\n }\n\n // Populate assets\n if (resourcesAccessed.assets) {\n transaction.appCall.assetReferences = transaction.appCall.assetReferences ?? []\n for (const assetId of resourcesAccessed.assets) {\n if (!transaction.appCall.assetReferences.includes(assetId)) {\n transaction.appCall.assetReferences.push(assetId)\n }\n }\n assetsCount = transaction.appCall.assetReferences.length\n }\n\n if (accountsCount + assetsCount + appsCount + boxesCount > MAX_OVERALL_REFERENCES) {\n throw new Error(`Resource reference limit of ${MAX_OVERALL_REFERENCES} exceeded in transaction ${groupIndex}`)\n }\n}\n\nenum GroupResourceType {\n Account,\n App,\n Asset,\n Box,\n ExtraBoxRef,\n AssetHolding,\n AppLocal,\n}\n\n/**\n * Populate group-level resources for app call transactions\n */\nexport function populateGroupResources(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n groupResources: SimulateUnnamedResourcesAccessed,\n): void {\n let remainingAccounts = [...(groupResources.accounts ?? [])]\n let remainingApps = [...(groupResources.apps ?? [])]\n let remainingAssets = [...(groupResources.assets ?? [])]\n const remainingBoxes = [...(groupResources.boxes ?? [])]\n\n // Process cross-reference resources first (app locals and asset holdings) as they are most restrictive\n if (groupResources.appLocals) {\n groupResources.appLocals.forEach((appLocal) => {\n populateGroupResource(transactions, { type: GroupResourceType.AppLocal, data: appLocal })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== appLocal.address)\n remainingApps = remainingApps.filter((app) => app !== appLocal.appId)\n })\n }\n\n if (groupResources.assetHoldings) {\n groupResources.assetHoldings.forEach((assetHolding) => {\n populateGroupResource(transactions, { type: GroupResourceType.AssetHolding, data: assetHolding })\n // Remove resources from remaining if we're adding them here\n remainingAccounts = remainingAccounts.filter((acc) => acc !== assetHolding.address)\n remainingAssets = remainingAssets.filter((asset) => asset !== assetHolding.assetId)\n })\n }\n\n // Process accounts next because account limit is 4\n remainingAccounts.forEach((account) => {\n populateGroupResource(transactions, { type: GroupResourceType.Account, data: account })\n })\n\n // Process boxes\n remainingBoxes.forEach((boxRef) => {\n populateGroupResource(transactions, { type: GroupResourceType.Box, data: { appId: boxRef.appId, name: boxRef.name } })\n // Remove apps as resource if we're adding it here\n remainingApps = remainingApps.filter((app) => app !== boxRef.appId)\n })\n\n // Process assets\n remainingAssets.forEach((asset) => {\n populateGroupResource(transactions, { type: GroupResourceType.Asset, data: asset })\n })\n\n // Process remaining apps\n remainingApps.forEach((app) => {\n populateGroupResource(transactions, { type: GroupResourceType.App, data: app })\n })\n\n // Handle extra box refs\n if (groupResources.extraBoxRefs) {\n for (let i = 0; i < groupResources.extraBoxRefs; i++) {\n populateGroupResource(transactions, { type: GroupResourceType.ExtraBoxRef })\n }\n }\n}\n\n/**\n * Helper function to check if an app call transaction is below resource limit\n */\nfunction isAppCallBelowResourceLimit(txn: Transaction): boolean {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const accountsCount = txn.appCall?.accountReferences?.length || 0\n const assetsCount = txn.appCall?.assetReferences?.length || 0\n const appsCount = txn.appCall?.appReferences?.length || 0\n const boxesCount = txn.appCall?.boxReferences?.length || 0\n\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n}\n\ntype GroupResourceToPopulate =\n | { type: GroupResourceType.Account; data: Address }\n | { type: GroupResourceType.App; data: bigint }\n | { type: GroupResourceType.Asset; data: bigint }\n | { type: GroupResourceType.Box; data: TransactBoxReference }\n | { type: GroupResourceType.ExtraBoxRef }\n | { type: GroupResourceType.AssetHolding; data: HoldingReference }\n | { type: GroupResourceType.AppLocal; data: LocalsReference }\n\n/**\n * Helper function to populate a specific resource into a transaction group\n */\nfunction populateGroupResource(\n transactions: Transaction[], // NOTE: transactions are mutated in place\n resource: GroupResourceToPopulate,\n): void {\n // For asset holdings and app locals, first try to find a transaction that already has the account available\n if (resource.type === GroupResourceType.AssetHolding || resource.type === GroupResourceType.AppLocal) {\n const address = resource.data.address\n\n // Try to find a transaction that already has the account available\n const groupIndex1 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n\n // Check if account is in foreign accounts array\n if (appCall.accountReferences?.some((a) => a.equals(address))) {\n return true\n }\n\n // Check if account is available as an app account\n if (appCall.appReferences) {\n for (const appId of appCall.appReferences) {\n if (address === getApplicationAddress(appId)) {\n return true\n }\n }\n }\n\n // Check if account appears in any app call transaction fields\n if (txn.sender.equals(address)) {\n return true\n }\n\n return false\n })\n\n if (groupIndex1 !== -1) {\n const appCall = transactions[groupIndex1].appCall!\n if (resource.type === GroupResourceType.AssetHolding) {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.assetId)) {\n appCall.assetReferences.push(resource.data.assetId)\n }\n } else {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n return\n }\n\n // Try to find a transaction that has the asset/app available and space for account\n const groupIndex2 = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n if ((appCall.accountReferences?.length ?? 0) >= MAX_ACCOUNT_REFERENCES) {\n return false\n }\n\n if (resource.type === GroupResourceType.AssetHolding) {\n return appCall.assetReferences?.includes(resource.data.assetId) || false\n } else {\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n }\n })\n\n if (groupIndex2 !== -1) {\n const appCall = transactions[groupIndex2].appCall!\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.includes(address)) {\n appCall.accountReferences.push(address)\n }\n return\n }\n }\n\n // For boxes, first try to find a transaction that already has the app available\n if (resource.type === GroupResourceType.Box) {\n const groupIndex = transactions.findIndex((txn) => {\n if (!isAppCallBelowResourceLimit(txn)) {\n return false\n }\n\n const appCall = txn.appCall!\n return appCall.appReferences?.includes(resource.data.appId) || appCall.appId === resource.data.appId\n })\n\n if (groupIndex !== -1) {\n const appCall = transactions[groupIndex].appCall!\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n return\n }\n }\n\n // Find the first transaction that can accommodate the resource\n const groupIndex = transactions.findIndex((txn) => {\n if (txn.type !== TransactionType.AppCall) {\n return false\n }\n if (txn.appCall?.accessReferences?.length) {\n return false\n }\n\n const appCall = txn.appCall!\n const accountsCount = appCall.accountReferences?.length ?? 0\n const assetsCount = appCall.assetReferences?.length ?? 0\n const appsCount = appCall.appReferences?.length ?? 0\n const boxesCount = appCall.boxReferences?.length ?? 0\n\n switch (resource.type) {\n case GroupResourceType.Account:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n case GroupResourceType.AssetHolding:\n case GroupResourceType.AppLocal:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n case GroupResourceType.Box:\n if (resource.data.appId !== 0n) {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES - 1\n } else {\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n default:\n return accountsCount + assetsCount + appsCount + boxesCount < MAX_OVERALL_REFERENCES\n }\n })\n\n if (groupIndex === -1) {\n throw new Error('No more transactions below reference limit. Add another app call to the group.')\n }\n\n const appCall = transactions[groupIndex].appCall!\n\n switch (resource.type) {\n case GroupResourceType.Account: {\n appCall.accountReferences = appCall.accountReferences ?? []\n const address = resource.data\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.App:\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data)) {\n appCall.appReferences.push(resource.data)\n }\n break\n case GroupResourceType.Box: {\n appCall.boxReferences = appCall.boxReferences ?? []\n const exists = appCall.boxReferences.some(\n (b) =>\n b.appId === resource.data.appId &&\n b.name.length === resource.data.name.length &&\n b.name.every((byte, i) => byte === resource.data.name[i]),\n )\n if (!exists) {\n appCall.boxReferences.push({ appId: resource.data.appId, name: resource.data.name })\n }\n if (resource.data.appId !== 0n) {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n }\n break\n }\n case GroupResourceType.ExtraBoxRef:\n appCall.boxReferences = appCall.boxReferences ?? []\n appCall.boxReferences.push({ appId: 0n, name: new Uint8Array(0) })\n break\n case GroupResourceType.AssetHolding: {\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data.assetId)) {\n appCall.assetReferences.push(resource.data.assetId)\n }\n const address = resource.data.address\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.AppLocal: {\n appCall.appReferences = appCall.appReferences ?? []\n if (!appCall.appReferences.includes(resource.data.appId)) {\n appCall.appReferences.push(resource.data.appId)\n }\n const address = resource.data.address\n appCall.accountReferences = appCall.accountReferences ?? []\n if (!appCall.accountReferences.some((a) => a.equals(address))) {\n appCall.accountReferences.push(address)\n }\n break\n }\n case GroupResourceType.Asset:\n appCall.assetReferences = appCall.assetReferences ?? []\n if (!appCall.assetReferences.includes(resource.data)) {\n appCall.assetReferences.push(resource.data)\n }\n break\n }\n}\n"],"mappings":"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"}
@@ -160,7 +160,7 @@ type AssetFreezeParams = CommonTransactionParams & {
160
160
  /** The ID of the asset to freeze/unfreeze */
161
161
  assetId: bigint;
162
162
  /** The address of the account to freeze or unfreeze */
163
- account: ReadableAddress;
163
+ freezeTarget: ReadableAddress;
164
164
  /** Whether the assets in the account should be frozen */
165
165
  frozen: boolean;
166
166
  };
@@ -43,7 +43,7 @@ const buildAssetFreeze = (params, suggestedParams, defaultValidityWindow) => {
43
43
  type: require_transaction_type.TransactionType.AssetFreeze,
44
44
  assetFreeze: {
45
45
  assetId: params.assetId,
46
- freezeTarget: require_address.getAddress(params.account),
46
+ freezeTarget: require_address.getAddress(params.freezeTarget),
47
47
  frozen: params.frozen
48
48
  }
49
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"asset-config.js","names":["Transaction","buildTransactionCommonData","TransactionType","ensureString","getOptionalAddress","getAddress"],"sources":["../../src/transactions/asset-config.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { ReadableAddress, getAddress, getOptionalAddress } from '@algorandfoundation/algokit-common'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData, ensureString } from './common'\n\n/** Parameters to define an asset create transaction.\n *\n * The account that sends this transaction will automatically be opted in to the asset and will hold all units after creation.\n */\nexport type AssetCreateParams = CommonTransactionParams & {\n /** The total amount of the smallest divisible (decimal) unit to create.\n *\n * For example, if `decimals` is, say, 2, then for every 100 `total` there would be 1 whole unit.\n *\n * This field can only be specified upon asset creation.\n */\n total: bigint\n\n /** The amount of decimal places the asset should have.\n *\n * If unspecified then the asset will be in whole units (i.e. `0`).\n *\n * * If 0, the asset is not divisible;\n * * If 1, the base unit of the asset is in tenths;\n * * If 2, the base unit of the asset is in hundredths;\n * * If 3, the base unit of the asset is in thousandths;\n * * and so on up to 19 decimal places.\n *\n * This field can only be specified upon asset creation.\n */\n decimals?: number\n\n /** The optional name of the asset.\n *\n * Max size is 32 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n assetName?: string\n\n /** The optional name of the unit of this asset (e.g. ticker name).\n *\n * Max size is 8 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n unitName?: string\n\n /** Specifies an optional URL where more information about the asset can be retrieved (e.g. metadata).\n *\n * Max size is 96 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n url?: string\n\n /** 32-byte hash of some metadata that is relevant to your asset and/or asset holders.\n *\n * The format of this metadata is up to the application.\n *\n * This field can only be specified upon asset creation.\n */\n metadataHash?: string | Uint8Array\n\n /** Whether the asset is frozen by default for all accounts.\n * Defaults to `false`.\n *\n * If `true` then for anyone apart from the creator to hold the\n * asset it needs to be unfrozen per account using an asset freeze\n * transaction from the `freeze` account, which must be set on creation.\n *\n * This field can only be specified upon asset creation.\n */\n defaultFrozen?: boolean\n\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the `manager` the asset becomes permanently immutable.\n */\n manager?: ReadableAddress\n\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n reserve?: ReadableAddress\n\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n freeze?: ReadableAddress\n\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset reconfiguration transaction.\n *\n * **Note:** The manager, reserve, freeze, and clawback addresses\n * are immutably empty if they are not set. If manager is not set then\n * all fields are immutable from that point forward.\n */\nexport type AssetConfigParams = CommonTransactionParams & {\n /** ID of the asset to reconfigure */\n assetId: bigint\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) the asset will become permanently immutable.\n */\n manager?: ReadableAddress\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n reserve?: ReadableAddress\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n freeze?: ReadableAddress\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset freeze transaction. */\nexport type AssetFreezeParams = CommonTransactionParams & {\n /** The ID of the asset to freeze/unfreeze */\n assetId: bigint\n /** The address of the account to freeze or unfreeze */\n account: ReadableAddress\n /** Whether the assets in the account should be frozen */\n frozen: boolean\n}\n\n/** Parameters to define an asset destroy transaction.\n *\n * Created assets can be destroyed only by the asset manager account. All of the assets must be owned by the creator of the asset before the asset can be deleted.\n */\nexport type AssetDestroyParams = CommonTransactionParams & {\n /** ID of the asset to destroy */\n assetId: bigint\n}\n\nexport const buildAssetCreate = (\n params: AssetCreateParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: 0n, // Asset creation always uses ID 0\n total: params.total,\n decimals: params.decimals,\n defaultFrozen: params.defaultFrozen,\n assetName: params.assetName,\n unitName: params.unitName,\n url: params.url,\n metadataHash: ensureString(params.metadataHash),\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetConfig = (\n params: AssetConfigParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetFreeze = (\n params: AssetFreezeParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetFreeze,\n assetFreeze: {\n assetId: params.assetId,\n freezeTarget: getAddress(params.account),\n frozen: params.frozen,\n },\n })\n}\n\nexport const buildAssetDestroy = (\n params: AssetDestroyParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n },\n })\n}\n"],"mappings":";;;;;;AA4LA,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIA,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS;GACT,OAAO,OAAO;GACd,UAAU,OAAO;GACjB,eAAe,OAAO;GACtB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,KAAK,OAAO;GACZ,cAAcC,4BAAa,OAAO,aAAa;GAC/C,SAASC,mCAAmB,OAAO,QAAQ;GAC3C,SAASA,mCAAmB,OAAO,QAAQ;GAC3C,QAAQA,mCAAmB,OAAO,OAAO;GACzC,UAAUA,mCAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIJ,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,SAASE,mCAAmB,OAAO,QAAQ;GAC3C,SAASA,mCAAmB,OAAO,QAAQ;GAC3C,QAAQA,mCAAmB,OAAO,OAAO;GACzC,UAAUA,mCAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIJ,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,cAAcG,2BAAW,OAAO,QAAQ;GACxC,QAAQ,OAAO;GAChB;EACF,CAAC;;AAGJ,MAAa,qBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIL,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa,EACX,SAAS,OAAO,SACjB;EACF,CAAC"}
1
+ {"version":3,"file":"asset-config.js","names":["Transaction","buildTransactionCommonData","TransactionType","ensureString","getOptionalAddress","getAddress"],"sources":["../../src/transactions/asset-config.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { ReadableAddress, getAddress, getOptionalAddress } from '@algorandfoundation/algokit-common'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData, ensureString } from './common'\n\n/** Parameters to define an asset create transaction.\n *\n * The account that sends this transaction will automatically be opted in to the asset and will hold all units after creation.\n */\nexport type AssetCreateParams = CommonTransactionParams & {\n /** The total amount of the smallest divisible (decimal) unit to create.\n *\n * For example, if `decimals` is, say, 2, then for every 100 `total` there would be 1 whole unit.\n *\n * This field can only be specified upon asset creation.\n */\n total: bigint\n\n /** The amount of decimal places the asset should have.\n *\n * If unspecified then the asset will be in whole units (i.e. `0`).\n *\n * * If 0, the asset is not divisible;\n * * If 1, the base unit of the asset is in tenths;\n * * If 2, the base unit of the asset is in hundredths;\n * * If 3, the base unit of the asset is in thousandths;\n * * and so on up to 19 decimal places.\n *\n * This field can only be specified upon asset creation.\n */\n decimals?: number\n\n /** The optional name of the asset.\n *\n * Max size is 32 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n assetName?: string\n\n /** The optional name of the unit of this asset (e.g. ticker name).\n *\n * Max size is 8 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n unitName?: string\n\n /** Specifies an optional URL where more information about the asset can be retrieved (e.g. metadata).\n *\n * Max size is 96 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n url?: string\n\n /** 32-byte hash of some metadata that is relevant to your asset and/or asset holders.\n *\n * The format of this metadata is up to the application.\n *\n * This field can only be specified upon asset creation.\n */\n metadataHash?: string | Uint8Array\n\n /** Whether the asset is frozen by default for all accounts.\n * Defaults to `false`.\n *\n * If `true` then for anyone apart from the creator to hold the\n * asset it needs to be unfrozen per account using an asset freeze\n * transaction from the `freeze` account, which must be set on creation.\n *\n * This field can only be specified upon asset creation.\n */\n defaultFrozen?: boolean\n\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the `manager` the asset becomes permanently immutable.\n */\n manager?: ReadableAddress\n\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n reserve?: ReadableAddress\n\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n freeze?: ReadableAddress\n\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset reconfiguration transaction.\n *\n * **Note:** The manager, reserve, freeze, and clawback addresses\n * are immutably empty if they are not set. If manager is not set then\n * all fields are immutable from that point forward.\n */\nexport type AssetConfigParams = CommonTransactionParams & {\n /** ID of the asset to reconfigure */\n assetId: bigint\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) the asset will become permanently immutable.\n */\n manager?: ReadableAddress\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n reserve?: ReadableAddress\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n freeze?: ReadableAddress\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset freeze transaction. */\nexport type AssetFreezeParams = CommonTransactionParams & {\n /** The ID of the asset to freeze/unfreeze */\n assetId: bigint\n /** The address of the account to freeze or unfreeze */\n freezeTarget: ReadableAddress\n /** Whether the assets in the account should be frozen */\n frozen: boolean\n}\n\n/** Parameters to define an asset destroy transaction.\n *\n * Created assets can be destroyed only by the asset manager account. All of the assets must be owned by the creator of the asset before the asset can be deleted.\n */\nexport type AssetDestroyParams = CommonTransactionParams & {\n /** ID of the asset to destroy */\n assetId: bigint\n}\n\nexport const buildAssetCreate = (\n params: AssetCreateParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: 0n, // Asset creation always uses ID 0\n total: params.total,\n decimals: params.decimals,\n defaultFrozen: params.defaultFrozen,\n assetName: params.assetName,\n unitName: params.unitName,\n url: params.url,\n metadataHash: ensureString(params.metadataHash),\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetConfig = (\n params: AssetConfigParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetFreeze = (\n params: AssetFreezeParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetFreeze,\n assetFreeze: {\n assetId: params.assetId,\n freezeTarget: getAddress(params.freezeTarget),\n frozen: params.frozen,\n },\n })\n}\n\nexport const buildAssetDestroy = (\n params: AssetDestroyParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n },\n })\n}\n"],"mappings":";;;;;;AA4LA,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIA,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS;GACT,OAAO,OAAO;GACd,UAAU,OAAO;GACjB,eAAe,OAAO;GACtB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,KAAK,OAAO;GACZ,cAAcC,4BAAa,OAAO,aAAa;GAC/C,SAASC,mCAAmB,OAAO,QAAQ;GAC3C,SAASA,mCAAmB,OAAO,QAAQ;GAC3C,QAAQA,mCAAmB,OAAO,OAAO;GACzC,UAAUA,mCAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIJ,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,SAASE,mCAAmB,OAAO,QAAQ;GAC3C,SAASA,mCAAmB,OAAO,QAAQ;GAC3C,QAAQA,mCAAmB,OAAO,OAAO;GACzC,UAAUA,mCAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIJ,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,cAAcG,2BAAW,OAAO,aAAa;GAC7C,QAAQ,OAAO;GAChB;EACF,CAAC;;AAGJ,MAAa,qBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAIL,gCAAY;EACrB,GAFiBC,0CAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAMC,yCAAgB;EACtB,aAAa,EACX,SAAS,OAAO,SACjB;EACF,CAAC"}
@@ -43,7 +43,7 @@ const buildAssetFreeze = (params, suggestedParams, defaultValidityWindow) => {
43
43
  type: TransactionType.AssetFreeze,
44
44
  assetFreeze: {
45
45
  assetId: params.assetId,
46
- freezeTarget: getAddress(params.account),
46
+ freezeTarget: getAddress(params.freezeTarget),
47
47
  frozen: params.frozen
48
48
  }
49
49
  });
@@ -1 +1 @@
1
- {"version":3,"file":"asset-config.mjs","names":[],"sources":["../../src/transactions/asset-config.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { ReadableAddress, getAddress, getOptionalAddress } from '@algorandfoundation/algokit-common'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData, ensureString } from './common'\n\n/** Parameters to define an asset create transaction.\n *\n * The account that sends this transaction will automatically be opted in to the asset and will hold all units after creation.\n */\nexport type AssetCreateParams = CommonTransactionParams & {\n /** The total amount of the smallest divisible (decimal) unit to create.\n *\n * For example, if `decimals` is, say, 2, then for every 100 `total` there would be 1 whole unit.\n *\n * This field can only be specified upon asset creation.\n */\n total: bigint\n\n /** The amount of decimal places the asset should have.\n *\n * If unspecified then the asset will be in whole units (i.e. `0`).\n *\n * * If 0, the asset is not divisible;\n * * If 1, the base unit of the asset is in tenths;\n * * If 2, the base unit of the asset is in hundredths;\n * * If 3, the base unit of the asset is in thousandths;\n * * and so on up to 19 decimal places.\n *\n * This field can only be specified upon asset creation.\n */\n decimals?: number\n\n /** The optional name of the asset.\n *\n * Max size is 32 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n assetName?: string\n\n /** The optional name of the unit of this asset (e.g. ticker name).\n *\n * Max size is 8 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n unitName?: string\n\n /** Specifies an optional URL where more information about the asset can be retrieved (e.g. metadata).\n *\n * Max size is 96 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n url?: string\n\n /** 32-byte hash of some metadata that is relevant to your asset and/or asset holders.\n *\n * The format of this metadata is up to the application.\n *\n * This field can only be specified upon asset creation.\n */\n metadataHash?: string | Uint8Array\n\n /** Whether the asset is frozen by default for all accounts.\n * Defaults to `false`.\n *\n * If `true` then for anyone apart from the creator to hold the\n * asset it needs to be unfrozen per account using an asset freeze\n * transaction from the `freeze` account, which must be set on creation.\n *\n * This field can only be specified upon asset creation.\n */\n defaultFrozen?: boolean\n\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the `manager` the asset becomes permanently immutable.\n */\n manager?: ReadableAddress\n\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n reserve?: ReadableAddress\n\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n freeze?: ReadableAddress\n\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset reconfiguration transaction.\n *\n * **Note:** The manager, reserve, freeze, and clawback addresses\n * are immutably empty if they are not set. If manager is not set then\n * all fields are immutable from that point forward.\n */\nexport type AssetConfigParams = CommonTransactionParams & {\n /** ID of the asset to reconfigure */\n assetId: bigint\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) the asset will become permanently immutable.\n */\n manager?: ReadableAddress\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n reserve?: ReadableAddress\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n freeze?: ReadableAddress\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset freeze transaction. */\nexport type AssetFreezeParams = CommonTransactionParams & {\n /** The ID of the asset to freeze/unfreeze */\n assetId: bigint\n /** The address of the account to freeze or unfreeze */\n account: ReadableAddress\n /** Whether the assets in the account should be frozen */\n frozen: boolean\n}\n\n/** Parameters to define an asset destroy transaction.\n *\n * Created assets can be destroyed only by the asset manager account. All of the assets must be owned by the creator of the asset before the asset can be deleted.\n */\nexport type AssetDestroyParams = CommonTransactionParams & {\n /** ID of the asset to destroy */\n assetId: bigint\n}\n\nexport const buildAssetCreate = (\n params: AssetCreateParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: 0n, // Asset creation always uses ID 0\n total: params.total,\n decimals: params.decimals,\n defaultFrozen: params.defaultFrozen,\n assetName: params.assetName,\n unitName: params.unitName,\n url: params.url,\n metadataHash: ensureString(params.metadataHash),\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetConfig = (\n params: AssetConfigParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetFreeze = (\n params: AssetFreezeParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetFreeze,\n assetFreeze: {\n assetId: params.assetId,\n freezeTarget: getAddress(params.account),\n frozen: params.frozen,\n },\n })\n}\n\nexport const buildAssetDestroy = (\n params: AssetDestroyParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n },\n })\n}\n"],"mappings":";;;;;;AA4LA,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS;GACT,OAAO,OAAO;GACd,UAAU,OAAO;GACjB,eAAe,OAAO;GACtB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,KAAK,OAAO;GACZ,cAAc,aAAa,OAAO,aAAa;GAC/C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,QAAQ,mBAAmB,OAAO,OAAO;GACzC,UAAU,mBAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,QAAQ,mBAAmB,OAAO,OAAO;GACzC,UAAU,mBAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,cAAc,WAAW,OAAO,QAAQ;GACxC,QAAQ,OAAO;GAChB;EACF,CAAC;;AAGJ,MAAa,qBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa,EACX,SAAS,OAAO,SACjB;EACF,CAAC"}
1
+ {"version":3,"file":"asset-config.mjs","names":[],"sources":["../../src/transactions/asset-config.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { ReadableAddress, getAddress, getOptionalAddress } from '@algorandfoundation/algokit-common'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData, ensureString } from './common'\n\n/** Parameters to define an asset create transaction.\n *\n * The account that sends this transaction will automatically be opted in to the asset and will hold all units after creation.\n */\nexport type AssetCreateParams = CommonTransactionParams & {\n /** The total amount of the smallest divisible (decimal) unit to create.\n *\n * For example, if `decimals` is, say, 2, then for every 100 `total` there would be 1 whole unit.\n *\n * This field can only be specified upon asset creation.\n */\n total: bigint\n\n /** The amount of decimal places the asset should have.\n *\n * If unspecified then the asset will be in whole units (i.e. `0`).\n *\n * * If 0, the asset is not divisible;\n * * If 1, the base unit of the asset is in tenths;\n * * If 2, the base unit of the asset is in hundredths;\n * * If 3, the base unit of the asset is in thousandths;\n * * and so on up to 19 decimal places.\n *\n * This field can only be specified upon asset creation.\n */\n decimals?: number\n\n /** The optional name of the asset.\n *\n * Max size is 32 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n assetName?: string\n\n /** The optional name of the unit of this asset (e.g. ticker name).\n *\n * Max size is 8 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n unitName?: string\n\n /** Specifies an optional URL where more information about the asset can be retrieved (e.g. metadata).\n *\n * Max size is 96 bytes.\n *\n * This field can only be specified upon asset creation.\n */\n url?: string\n\n /** 32-byte hash of some metadata that is relevant to your asset and/or asset holders.\n *\n * The format of this metadata is up to the application.\n *\n * This field can only be specified upon asset creation.\n */\n metadataHash?: string | Uint8Array\n\n /** Whether the asset is frozen by default for all accounts.\n * Defaults to `false`.\n *\n * If `true` then for anyone apart from the creator to hold the\n * asset it needs to be unfrozen per account using an asset freeze\n * transaction from the `freeze` account, which must be set on creation.\n *\n * This field can only be specified upon asset creation.\n */\n defaultFrozen?: boolean\n\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the `manager` the asset becomes permanently immutable.\n */\n manager?: ReadableAddress\n\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n reserve?: ReadableAddress\n\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n freeze?: ReadableAddress\n\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) at asset creation or subsequently set to empty by the manager the field is permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset reconfiguration transaction.\n *\n * **Note:** The manager, reserve, freeze, and clawback addresses\n * are immutably empty if they are not set. If manager is not set then\n * all fields are immutable from that point forward.\n */\nexport type AssetConfigParams = CommonTransactionParams & {\n /** ID of the asset to reconfigure */\n assetId: bigint\n /** The address of the optional account that can manage the configuration of the asset and destroy it.\n *\n * The configuration fields it can change are `manager`, `reserve`, `clawback`, and `freeze`.\n *\n * If not set (`undefined` or `\"\"`) the asset will become permanently immutable.\n */\n manager?: ReadableAddress\n /**\n * The address of the optional account that holds the reserve (uncirculated supply) units of the asset.\n *\n * This address has no specific authority in the protocol itself and is informational only.\n *\n * Some standards like [ARC-19](https://github.com/algorandfoundation/ARCs/blob/main/ARCs/arc-0019.md)\n * rely on this field to hold meaningful data.\n *\n * It can be used in the case where you want to signal to holders of your asset that the uncirculated units\n * of the asset reside in an account that is different from the default creator account.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n reserve?: ReadableAddress\n /**\n * The address of the optional account that can be used to freeze or unfreeze holdings of this asset for any account.\n *\n * If empty, freezing is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n freeze?: ReadableAddress\n /**\n * The address of the optional account that can clawback holdings of this asset from any account.\n *\n * **This field should be used with caution** as the clawback account has the ability to **unconditionally take assets from any account**.\n *\n * If empty, clawback is not permitted.\n *\n * If not set (`undefined` or `\"\"`) the field will become permanently empty.\n */\n clawback?: ReadableAddress\n}\n\n/** Parameters to define an asset freeze transaction. */\nexport type AssetFreezeParams = CommonTransactionParams & {\n /** The ID of the asset to freeze/unfreeze */\n assetId: bigint\n /** The address of the account to freeze or unfreeze */\n freezeTarget: ReadableAddress\n /** Whether the assets in the account should be frozen */\n frozen: boolean\n}\n\n/** Parameters to define an asset destroy transaction.\n *\n * Created assets can be destroyed only by the asset manager account. All of the assets must be owned by the creator of the asset before the asset can be deleted.\n */\nexport type AssetDestroyParams = CommonTransactionParams & {\n /** ID of the asset to destroy */\n assetId: bigint\n}\n\nexport const buildAssetCreate = (\n params: AssetCreateParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: 0n, // Asset creation always uses ID 0\n total: params.total,\n decimals: params.decimals,\n defaultFrozen: params.defaultFrozen,\n assetName: params.assetName,\n unitName: params.unitName,\n url: params.url,\n metadataHash: ensureString(params.metadataHash),\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetConfig = (\n params: AssetConfigParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n manager: getOptionalAddress(params.manager),\n reserve: getOptionalAddress(params.reserve),\n freeze: getOptionalAddress(params.freeze),\n clawback: getOptionalAddress(params.clawback),\n },\n })\n}\n\nexport const buildAssetFreeze = (\n params: AssetFreezeParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetFreeze,\n assetFreeze: {\n assetId: params.assetId,\n freezeTarget: getAddress(params.freezeTarget),\n frozen: params.frozen,\n },\n })\n}\n\nexport const buildAssetDestroy = (\n params: AssetDestroyParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n return new Transaction({\n ...commonData,\n type: TransactionType.AssetConfig,\n assetConfig: {\n assetId: params.assetId,\n },\n })\n}\n"],"mappings":";;;;;;AA4LA,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS;GACT,OAAO,OAAO;GACd,UAAU,OAAO;GACjB,eAAe,OAAO;GACtB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,KAAK,OAAO;GACZ,cAAc,aAAa,OAAO,aAAa;GAC/C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,QAAQ,mBAAmB,OAAO,OAAO;GACzC,UAAU,mBAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,SAAS,mBAAmB,OAAO,QAAQ;GAC3C,QAAQ,mBAAmB,OAAO,OAAO;GACzC,UAAU,mBAAmB,OAAO,SAAS;GAC9C;EACF,CAAC;;AAGJ,MAAa,oBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa;GACX,SAAS,OAAO;GAChB,cAAc,WAAW,OAAO,aAAa;GAC7C,QAAQ,OAAO;GAChB;EACF,CAAC;;AAGJ,MAAa,qBACX,QACA,iBACA,0BACgB;AAEhB,QAAO,IAAI,YAAY;EACrB,GAFiB,2BAA2B,QAAQ,iBAAiB,sBAAsB;EAG3F,MAAM,gBAAgB;EACtB,aAAa,EACX,SAAS,OAAO,SACjB;EACF,CAAC"}
@@ -15,7 +15,7 @@ type OnlineKeyRegistrationParams = CommonTransactionParams & {
15
15
  /** This is the dilution for the 2-level participation key. It determines the interval (number of rounds) for generating new ephemeral keys */
16
16
  voteKeyDilution: bigint;
17
17
  /** The 64 byte state proof public key commitment */
18
- stateProofKey?: Uint8Array;
18
+ stateProofKey: Uint8Array;
19
19
  };
20
20
  /** Parameters to define an offline key registration transaction. */
21
21
  type OfflineKeyRegistrationParams = CommonTransactionParams & {
@@ -1 +1 @@
1
- {"version":3,"file":"key-registration.js","names":["buildTransactionCommonData","Transaction","TransactionType"],"sources":["../../src/transactions/key-registration.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Parameters to define an online key registration transaction. */\nexport type OnlineKeyRegistrationParams = CommonTransactionParams & {\n /** The root participation public key */\n voteKey: Uint8Array\n /** The VRF public key */\n selectionKey: Uint8Array\n /** The first round that the participation key is valid. Not to be confused with the `firstValid` round of the keyreg transaction */\n voteFirst: bigint\n /** The last round that the participation key is valid. Not to be confused with the `lastValid` round of the keyreg transaction */\n voteLast: bigint\n /** This is the dilution for the 2-level participation key. It determines the interval (number of rounds) for generating new ephemeral keys */\n voteKeyDilution: bigint\n /** The 64 byte state proof public key commitment */\n stateProofKey?: Uint8Array\n}\n\n/** Parameters to define an offline key registration transaction. */\nexport type OfflineKeyRegistrationParams = CommonTransactionParams & {\n /** Prevent this account from ever participating again. The account will also no longer earn rewards */\n preventAccountFromEverParticipatingAgain?: boolean\n}\n\nexport const buildKeyReg = (\n params: OnlineKeyRegistrationParams | OfflineKeyRegistrationParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n if ('voteKey' in params) {\n return new Transaction({\n ...commonData,\n type: TransactionType.KeyRegistration,\n keyRegistration: {\n voteKey: params.voteKey,\n selectionKey: params.selectionKey,\n voteFirst: params.voteFirst,\n voteLast: params.voteLast,\n voteKeyDilution: params.voteKeyDilution,\n nonParticipation: false,\n stateProofKey: params.stateProofKey,\n },\n })\n } else {\n return new Transaction({\n ...commonData,\n type: TransactionType.KeyRegistration,\n keyRegistration: {\n nonParticipation: params.preventAccountFromEverParticipatingAgain,\n },\n })\n }\n}\n"],"mappings":";;;;;AA0BA,MAAa,eACX,QACA,iBACA,0BACgB;CAChB,MAAM,aAAaA,0CAA2B,QAAQ,iBAAiB,sBAAsB;AAC7F,KAAI,aAAa,OACf,QAAO,IAAIC,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,iBAAiB;GACf,SAAS,OAAO;GAChB,cAAc,OAAO;GACrB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,iBAAiB,OAAO;GACxB,kBAAkB;GAClB,eAAe,OAAO;GACvB;EACF,CAAC;KAEF,QAAO,IAAID,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,iBAAiB,EACf,kBAAkB,OAAO,0CAC1B;EACF,CAAC"}
1
+ {"version":3,"file":"key-registration.js","names":["buildTransactionCommonData","Transaction","TransactionType"],"sources":["../../src/transactions/key-registration.ts"],"sourcesContent":["import { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Transaction, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { CommonTransactionParams, buildTransactionCommonData } from './common'\n\n/** Parameters to define an online key registration transaction. */\nexport type OnlineKeyRegistrationParams = CommonTransactionParams & {\n /** The root participation public key */\n voteKey: Uint8Array\n /** The VRF public key */\n selectionKey: Uint8Array\n /** The first round that the participation key is valid. Not to be confused with the `firstValid` round of the keyreg transaction */\n voteFirst: bigint\n /** The last round that the participation key is valid. Not to be confused with the `lastValid` round of the keyreg transaction */\n voteLast: bigint\n /** This is the dilution for the 2-level participation key. It determines the interval (number of rounds) for generating new ephemeral keys */\n voteKeyDilution: bigint\n /** The 64 byte state proof public key commitment */\n stateProofKey: Uint8Array\n}\n\n/** Parameters to define an offline key registration transaction. */\nexport type OfflineKeyRegistrationParams = CommonTransactionParams & {\n /** Prevent this account from ever participating again. The account will also no longer earn rewards */\n preventAccountFromEverParticipatingAgain?: boolean\n}\n\nexport const buildKeyReg = (\n params: OnlineKeyRegistrationParams | OfflineKeyRegistrationParams,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Transaction => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n if ('voteKey' in params) {\n return new Transaction({\n ...commonData,\n type: TransactionType.KeyRegistration,\n keyRegistration: {\n voteKey: params.voteKey,\n selectionKey: params.selectionKey,\n voteFirst: params.voteFirst,\n voteLast: params.voteLast,\n voteKeyDilution: params.voteKeyDilution,\n nonParticipation: false,\n stateProofKey: params.stateProofKey,\n },\n })\n } else {\n return new Transaction({\n ...commonData,\n type: TransactionType.KeyRegistration,\n keyRegistration: {\n nonParticipation: params.preventAccountFromEverParticipatingAgain,\n },\n })\n }\n}\n"],"mappings":";;;;;AA0BA,MAAa,eACX,QACA,iBACA,0BACgB;CAChB,MAAM,aAAaA,0CAA2B,QAAQ,iBAAiB,sBAAsB;AAC7F,KAAI,aAAa,OACf,QAAO,IAAIC,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,iBAAiB;GACf,SAAS,OAAO;GAChB,cAAc,OAAO;GACrB,WAAW,OAAO;GAClB,UAAU,OAAO;GACjB,iBAAiB,OAAO;GACxB,kBAAkB;GAClB,eAAe,OAAO;GACvB;EACF,CAAC;KAEF,QAAO,IAAID,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,iBAAiB,EACf,kBAAkB,OAAO,0CAC1B;EACF,CAAC"}