@algorandfoundation/algokit-utils 10.0.0-alpha.1 → 10.0.0-alpha.11

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 (317) hide show
  1. package/README.md +27 -5
  2. package/_virtual/rolldown_runtime.js +20 -11
  3. package/_virtual/rolldown_runtime.mjs +10 -5
  4. package/algo25/index.d.ts +2 -0
  5. package/algo25/index.js +9 -0
  6. package/algo25/index.mjs +3 -0
  7. package/algod-client/index.d.ts +2 -5
  8. package/package.json +1 -1
  9. package/packages/abi/src/abi-method.d.ts +1 -1
  10. package/packages/abi/src/abi-method.js.map +1 -1
  11. package/packages/abi/src/abi-method.mjs.map +1 -1
  12. package/packages/abi/src/abi-type.d.ts +1 -1
  13. package/packages/abi/src/abi-type.js +4 -2
  14. package/packages/abi/src/abi-type.js.map +1 -1
  15. package/packages/abi/src/abi-type.mjs +4 -2
  16. package/packages/abi/src/abi-type.mjs.map +1 -1
  17. package/packages/abi/src/arc56-contract.js +1 -0
  18. package/packages/abi/src/arc56-contract.js.map +1 -1
  19. package/packages/abi/src/arc56-contract.mjs +1 -0
  20. package/packages/abi/src/arc56-contract.mjs.map +1 -1
  21. package/packages/algo25/src/english.js.map +1 -1
  22. package/packages/algo25/src/english.mjs.map +1 -1
  23. package/packages/algo25/src/index.d.ts +40 -0
  24. package/packages/algo25/src/index.js +44 -0
  25. package/packages/algo25/src/index.js.map +1 -1
  26. package/packages/algo25/src/index.mjs +39 -1
  27. package/packages/algo25/src/index.mjs.map +1 -1
  28. package/packages/algod_client/src/apis/api-service.d.ts +44 -44
  29. package/packages/algod_client/src/apis/api-service.js +153 -153
  30. package/packages/algod_client/src/apis/api-service.js.map +1 -1
  31. package/packages/algod_client/src/apis/api-service.mjs +153 -153
  32. package/packages/algod_client/src/apis/api-service.mjs.map +1 -1
  33. package/packages/algod_client/src/core/api-error.js +3 -1
  34. package/packages/algod_client/src/core/api-error.js.map +1 -1
  35. package/packages/algod_client/src/core/api-error.mjs +3 -1
  36. package/packages/algod_client/src/core/api-error.mjs.map +1 -1
  37. package/packages/algod_client/src/core/model-runtime.js +4 -4
  38. package/packages/algod_client/src/core/model-runtime.js.map +1 -1
  39. package/packages/algod_client/src/core/model-runtime.mjs +6 -6
  40. package/packages/algod_client/src/core/model-runtime.mjs.map +1 -1
  41. package/packages/algod_client/src/models/account-participation.js +4 -4
  42. package/packages/algod_client/src/models/account-participation.js.map +1 -1
  43. package/packages/algod_client/src/models/account-participation.mjs +4 -4
  44. package/packages/algod_client/src/models/account-participation.mjs.map +1 -1
  45. package/packages/algod_client/src/models/application-state-schema.d.ts +2 -2
  46. package/packages/algod_client/src/models/application-state-schema.js +2 -2
  47. package/packages/algod_client/src/models/application-state-schema.js.map +1 -1
  48. package/packages/algod_client/src/models/application-state-schema.mjs +2 -2
  49. package/packages/algod_client/src/models/application-state-schema.mjs.map +1 -1
  50. package/packages/algod_client/src/models/asset-params.js +2 -1
  51. package/packages/algod_client/src/models/asset-params.js.map +1 -1
  52. package/packages/algod_client/src/models/asset-params.mjs +2 -1
  53. package/packages/algod_client/src/models/asset-params.mjs.map +1 -1
  54. package/packages/algod_client/src/models/block-response.js +1 -2
  55. package/packages/algod_client/src/models/block-response.js.map +1 -1
  56. package/packages/algod_client/src/models/block-response.mjs +2 -3
  57. package/packages/algod_client/src/models/block-response.mjs.map +1 -1
  58. package/packages/algod_client/src/models/block.d.ts +49 -29
  59. package/packages/algod_client/src/models/block.js +174 -98
  60. package/packages/algod_client/src/models/block.js.map +1 -1
  61. package/packages/algod_client/src/models/block.mjs +174 -98
  62. package/packages/algod_client/src/models/block.mjs.map +1 -1
  63. package/packages/algod_client/src/models/ledger-state-delta.js +1 -1
  64. package/packages/algod_client/src/models/ledger-state-delta.js.map +1 -1
  65. package/packages/algod_client/src/models/ledger-state-delta.mjs +2 -2
  66. package/packages/algod_client/src/models/ledger-state-delta.mjs.map +1 -1
  67. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.d.ts +3 -5
  68. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js +4 -6
  69. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.js.map +1 -1
  70. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs +3 -5
  71. package/packages/algod_client/src/models/simulate-unnamed-resources-accessed.mjs.map +1 -1
  72. package/packages/algod_client/src/models/transaction-parameters-response.js +2 -2
  73. package/packages/algod_client/src/models/transaction-parameters-response.js.map +1 -1
  74. package/packages/algod_client/src/models/transaction-parameters-response.mjs +2 -2
  75. package/packages/algod_client/src/models/transaction-parameters-response.mjs.map +1 -1
  76. package/packages/common/src/address.js +0 -14
  77. package/packages/common/src/address.js.map +1 -1
  78. package/packages/common/src/address.mjs +1 -14
  79. package/packages/common/src/address.mjs.map +1 -1
  80. package/packages/common/src/codecs/composite/map.js +7 -4
  81. package/packages/common/src/codecs/composite/map.js.map +1 -1
  82. package/packages/common/src/codecs/composite/map.mjs +7 -4
  83. package/packages/common/src/codecs/composite/map.mjs.map +1 -1
  84. package/packages/common/src/codecs/composite/record.js +0 -1
  85. package/packages/common/src/codecs/composite/record.js.map +1 -1
  86. package/packages/common/src/codecs/primitives/address.js +0 -1
  87. package/packages/common/src/codecs/primitives/address.js.map +1 -1
  88. package/packages/common/src/codecs/primitives/bytes.js +0 -1
  89. package/packages/common/src/codecs/primitives/bytes.js.map +1 -1
  90. package/packages/common/src/codecs/primitives/fixed-bytes.js +0 -1
  91. package/packages/common/src/codecs/primitives/fixed-bytes.js.map +1 -1
  92. package/packages/common/src/codecs/wire.js +0 -1
  93. package/packages/common/src/codecs/wire.js.map +1 -1
  94. package/packages/common/src/msgpack.js +0 -1
  95. package/packages/common/src/msgpack.js.map +1 -1
  96. package/packages/indexer_client/src/apis/api-service.d.ts +1 -1
  97. package/packages/indexer_client/src/apis/api-service.js +12 -12
  98. package/packages/indexer_client/src/apis/api-service.js.map +1 -1
  99. package/packages/indexer_client/src/apis/api-service.mjs +12 -12
  100. package/packages/indexer_client/src/apis/api-service.mjs.map +1 -1
  101. package/packages/indexer_client/src/core/api-error.js +3 -1
  102. package/packages/indexer_client/src/core/api-error.js.map +1 -1
  103. package/packages/indexer_client/src/core/api-error.mjs +3 -1
  104. package/packages/indexer_client/src/core/api-error.mjs.map +1 -1
  105. package/packages/indexer_client/src/core/model-runtime.js +4 -4
  106. package/packages/indexer_client/src/core/model-runtime.js.map +1 -1
  107. package/packages/indexer_client/src/core/model-runtime.mjs +6 -6
  108. package/packages/indexer_client/src/core/model-runtime.mjs.map +1 -1
  109. package/packages/indexer_client/src/models/account-participation.js +4 -4
  110. package/packages/indexer_client/src/models/account-participation.js.map +1 -1
  111. package/packages/indexer_client/src/models/account-participation.mjs +4 -4
  112. package/packages/indexer_client/src/models/account-participation.mjs.map +1 -1
  113. package/packages/indexer_client/src/models/application-state-schema.d.ts +2 -2
  114. package/packages/indexer_client/src/models/application-state-schema.js +2 -2
  115. package/packages/indexer_client/src/models/application-state-schema.js.map +1 -1
  116. package/packages/indexer_client/src/models/application-state-schema.mjs +2 -2
  117. package/packages/indexer_client/src/models/application-state-schema.mjs.map +1 -1
  118. package/packages/indexer_client/src/models/asset-params.js +2 -1
  119. package/packages/indexer_client/src/models/asset-params.js.map +1 -1
  120. package/packages/indexer_client/src/models/asset-params.mjs +2 -1
  121. package/packages/indexer_client/src/models/asset-params.mjs.map +1 -1
  122. package/packages/indexer_client/src/models/block.js +8 -8
  123. package/packages/indexer_client/src/models/block.js.map +1 -1
  124. package/packages/indexer_client/src/models/block.mjs +8 -8
  125. package/packages/indexer_client/src/models/block.mjs.map +1 -1
  126. package/packages/indexer_client/src/models/eval-delta-key-value.d.ts +1 -1
  127. package/packages/indexer_client/src/models/eval-delta-key-value.js +2 -2
  128. package/packages/indexer_client/src/models/eval-delta-key-value.js.map +1 -1
  129. package/packages/indexer_client/src/models/eval-delta-key-value.mjs +2 -2
  130. package/packages/indexer_client/src/models/eval-delta-key-value.mjs.map +1 -1
  131. package/packages/indexer_client/src/models/eval-delta.d.ts +1 -1
  132. package/packages/indexer_client/src/models/eval-delta.js +2 -2
  133. package/packages/indexer_client/src/models/eval-delta.js.map +1 -1
  134. package/packages/indexer_client/src/models/eval-delta.mjs +2 -2
  135. package/packages/indexer_client/src/models/eval-delta.mjs.map +1 -1
  136. package/packages/indexer_client/src/models/hb-proof-fields.js +6 -6
  137. package/packages/indexer_client/src/models/hb-proof-fields.js.map +1 -1
  138. package/packages/indexer_client/src/models/hb-proof-fields.mjs +6 -6
  139. package/packages/indexer_client/src/models/hb-proof-fields.mjs.map +1 -1
  140. package/packages/indexer_client/src/models/state-proof-verifier.js +2 -2
  141. package/packages/indexer_client/src/models/state-proof-verifier.js.map +1 -1
  142. package/packages/indexer_client/src/models/state-proof-verifier.mjs +2 -2
  143. package/packages/indexer_client/src/models/state-proof-verifier.mjs.map +1 -1
  144. package/packages/indexer_client/src/models/state-schema.d.ts +2 -2
  145. package/packages/indexer_client/src/models/state-schema.js +2 -2
  146. package/packages/indexer_client/src/models/state-schema.js.map +1 -1
  147. package/packages/indexer_client/src/models/state-schema.mjs +2 -2
  148. package/packages/indexer_client/src/models/state-schema.mjs.map +1 -1
  149. package/packages/indexer_client/src/models/teal-key-value.d.ts +1 -1
  150. package/packages/indexer_client/src/models/teal-key-value.js +2 -2
  151. package/packages/indexer_client/src/models/teal-key-value.js.map +1 -1
  152. package/packages/indexer_client/src/models/teal-key-value.mjs +2 -2
  153. package/packages/indexer_client/src/models/teal-key-value.mjs.map +1 -1
  154. package/packages/indexer_client/src/models/transaction-heartbeat.js +2 -1
  155. package/packages/indexer_client/src/models/transaction-heartbeat.js.map +1 -1
  156. package/packages/indexer_client/src/models/transaction-heartbeat.mjs +2 -1
  157. package/packages/indexer_client/src/models/transaction-heartbeat.mjs.map +1 -1
  158. package/packages/indexer_client/src/models/transaction-keyreg.js +4 -4
  159. package/packages/indexer_client/src/models/transaction-keyreg.js.map +1 -1
  160. package/packages/indexer_client/src/models/transaction-keyreg.mjs +4 -4
  161. package/packages/indexer_client/src/models/transaction-keyreg.mjs.map +1 -1
  162. package/packages/indexer_client/src/models/transaction-signature-logicsig.js +2 -1
  163. package/packages/indexer_client/src/models/transaction-signature-logicsig.js.map +1 -1
  164. package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs +2 -1
  165. package/packages/indexer_client/src/models/transaction-signature-logicsig.mjs.map +1 -1
  166. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.js +3 -3
  167. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.js.map +1 -1
  168. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs +3 -3
  169. package/packages/indexer_client/src/models/transaction-signature-multisig-subsignature.mjs.map +1 -1
  170. package/packages/indexer_client/src/models/transaction.d.ts +2 -2
  171. package/packages/indexer_client/src/models/transaction.js +6 -5
  172. package/packages/indexer_client/src/models/transaction.js.map +1 -1
  173. package/packages/indexer_client/src/models/transaction.mjs +6 -5
  174. package/packages/indexer_client/src/models/transaction.mjs.map +1 -1
  175. package/packages/kmd_client/src/apis/api-service.d.ts +5 -5
  176. package/packages/kmd_client/src/apis/api-service.js +32 -32
  177. package/packages/kmd_client/src/apis/api-service.js.map +1 -1
  178. package/packages/kmd_client/src/apis/api-service.mjs +32 -32
  179. package/packages/kmd_client/src/apis/api-service.mjs.map +1 -1
  180. package/packages/kmd_client/src/core/api-error.js +3 -1
  181. package/packages/kmd_client/src/core/api-error.js.map +1 -1
  182. package/packages/kmd_client/src/core/api-error.mjs +3 -1
  183. package/packages/kmd_client/src/core/api-error.mjs.map +1 -1
  184. package/packages/kmd_client/src/core/model-runtime.js +4 -4
  185. package/packages/kmd_client/src/core/model-runtime.js.map +1 -1
  186. package/packages/kmd_client/src/core/model-runtime.mjs +6 -6
  187. package/packages/kmd_client/src/core/model-runtime.mjs.map +1 -1
  188. package/packages/sdk/src/encoding/encoding.js +12 -2
  189. package/packages/sdk/src/encoding/encoding.js.map +1 -1
  190. package/packages/sdk/src/encoding/encoding.mjs +12 -1
  191. package/packages/sdk/src/encoding/encoding.mjs.map +1 -1
  192. package/packages/sdk/src/encoding/schema/map.js +0 -2
  193. package/packages/sdk/src/encoding/schema/map.js.map +1 -1
  194. package/packages/transact/src/logicsig.d.ts +3 -15
  195. package/packages/transact/src/logicsig.js +16 -36
  196. package/packages/transact/src/logicsig.js.map +1 -1
  197. package/packages/transact/src/logicsig.mjs +18 -36
  198. package/packages/transact/src/logicsig.mjs.map +1 -1
  199. package/packages/transact/src/multisig.d.ts +7 -115
  200. package/packages/transact/src/multisig.js +86 -136
  201. package/packages/transact/src/multisig.js.map +1 -1
  202. package/packages/transact/src/multisig.mjs +87 -117
  203. package/packages/transact/src/multisig.mjs.map +1 -1
  204. package/packages/transact/src/transactions/app-call.d.ts +10 -10
  205. package/packages/transact/src/transactions/app-call.js.map +1 -1
  206. package/packages/transact/src/transactions/app-call.mjs.map +1 -1
  207. package/packages/transact/src/transactions/reference-types-meta.d.ts +26 -0
  208. package/packages/transact/src/transactions/reference-types-meta.js +71 -0
  209. package/packages/transact/src/transactions/reference-types-meta.js.map +1 -0
  210. package/packages/transact/src/transactions/reference-types-meta.mjs +69 -0
  211. package/packages/transact/src/transactions/reference-types-meta.mjs.map +1 -0
  212. package/packages/transact/src/transactions/signed-transaction-meta.js +2 -3
  213. package/packages/transact/src/transactions/signed-transaction-meta.js.map +1 -1
  214. package/packages/transact/src/transactions/signed-transaction-meta.mjs +3 -3
  215. package/packages/transact/src/transactions/signed-transaction-meta.mjs.map +1 -1
  216. package/packages/transact/src/transactions/signed-transaction.d.ts +2 -2
  217. package/packages/transact/src/transactions/signed-transaction.js.map +1 -1
  218. package/packages/transact/src/transactions/signed-transaction.mjs.map +1 -1
  219. package/packages/transact/src/transactions/transaction-meta.js +29 -23
  220. package/packages/transact/src/transactions/transaction-meta.js.map +1 -1
  221. package/packages/transact/src/transactions/transaction-meta.mjs +29 -23
  222. package/packages/transact/src/transactions/transaction-meta.mjs.map +1 -1
  223. package/packages/transact/src/transactions/transaction.js +1 -0
  224. package/packages/transact/src/transactions/transaction.js.map +1 -1
  225. package/packages/transact/src/transactions/transaction.mjs +1 -0
  226. package/packages/transact/src/transactions/transaction.mjs.map +1 -1
  227. package/sdk/index.js +1 -1
  228. package/testing/account.js +2 -5
  229. package/testing/account.js.map +1 -1
  230. package/testing/account.mjs +2 -5
  231. package/testing/account.mjs.map +1 -1
  232. package/testing/fixtures/algorand-fixture.d.ts +3 -3
  233. package/testing/fixtures/algorand-fixture.js.map +1 -1
  234. package/testing/fixtures/algorand-fixture.mjs.map +1 -1
  235. package/transact/index.d.ts +5 -4
  236. package/transact/index.js +4 -22
  237. package/transact/index.mjs +4 -3
  238. package/transaction/transaction.js +2 -2
  239. package/transaction/transaction.js.map +1 -1
  240. package/transaction/transaction.mjs +2 -2
  241. package/transaction/transaction.mjs.map +1 -1
  242. package/transactions/app-call.d.ts +4 -3
  243. package/transactions/app-call.js +15 -15
  244. package/transactions/app-call.js.map +1 -1
  245. package/transactions/app-call.mjs +15 -15
  246. package/transactions/app-call.mjs.map +1 -1
  247. package/transactions/asset-config.d.ts +1 -1
  248. package/transactions/asset-config.js +1 -1
  249. package/transactions/asset-config.js.map +1 -1
  250. package/transactions/asset-config.mjs +1 -1
  251. package/transactions/asset-config.mjs.map +1 -1
  252. package/transactions/method-call.js +69 -77
  253. package/transactions/method-call.js.map +1 -1
  254. package/transactions/method-call.mjs +69 -77
  255. package/transactions/method-call.mjs.map +1 -1
  256. package/types/account-manager.d.ts +1 -1
  257. package/types/account-manager.js +3 -3
  258. package/types/account-manager.js.map +1 -1
  259. package/types/account-manager.mjs +3 -3
  260. package/types/account-manager.mjs.map +1 -1
  261. package/types/algorand-client-transaction-creator.d.ts +97 -83
  262. package/types/algorand-client-transaction-creator.js +8 -0
  263. package/types/algorand-client-transaction-creator.js.map +1 -1
  264. package/types/algorand-client-transaction-creator.mjs +8 -0
  265. package/types/algorand-client-transaction-creator.mjs.map +1 -1
  266. package/types/algorand-client-transaction-sender.d.ts +100 -86
  267. package/types/algorand-client-transaction-sender.js +8 -1
  268. package/types/algorand-client-transaction-sender.js.map +1 -1
  269. package/types/algorand-client-transaction-sender.mjs +8 -0
  270. package/types/algorand-client-transaction-sender.mjs.map +1 -1
  271. package/types/app-client.d.ts +265 -260
  272. package/types/app-client.js +0 -1
  273. package/types/app-client.js.map +1 -1
  274. package/types/app-deployer.js +1 -1
  275. package/types/app-deployer.js.map +1 -1
  276. package/types/app-deployer.mjs +1 -1
  277. package/types/app-deployer.mjs.map +1 -1
  278. package/types/app-factory.d.ts +91 -88
  279. package/types/app-manager.d.ts +3 -1
  280. package/types/app-manager.js +16 -10
  281. package/types/app-manager.js.map +1 -1
  282. package/types/app-manager.mjs +16 -10
  283. package/types/app-manager.mjs.map +1 -1
  284. package/types/app-spec.js +12 -5
  285. package/types/app-spec.js.map +1 -1
  286. package/types/app-spec.mjs +12 -5
  287. package/types/app-spec.mjs.map +1 -1
  288. package/types/asset-manager.js +1 -1
  289. package/types/asset-manager.js.map +1 -1
  290. package/types/asset-manager.mjs +1 -1
  291. package/types/asset-manager.mjs.map +1 -1
  292. package/types/composer.d.ts +9 -0
  293. package/types/composer.js +28 -13
  294. package/types/composer.js.map +1 -1
  295. package/types/composer.mjs +28 -12
  296. package/types/composer.mjs.map +1 -1
  297. package/types/kmd-account-manager.d.ts +1 -0
  298. package/types/kmd-account-manager.js +21 -10
  299. package/types/kmd-account-manager.js.map +1 -1
  300. package/types/kmd-account-manager.mjs +22 -11
  301. package/types/kmd-account-manager.mjs.map +1 -1
  302. package/types/testing.d.ts +2 -2
  303. package/packages/algod_client/src/models/application-local-reference.d.ts +0 -20
  304. package/packages/algod_client/src/models/application-local-reference.js +0 -23
  305. package/packages/algod_client/src/models/application-local-reference.js.map +0 -1
  306. package/packages/algod_client/src/models/application-local-reference.mjs +0 -23
  307. package/packages/algod_client/src/models/application-local-reference.mjs.map +0 -1
  308. package/packages/algod_client/src/models/asset-holding-reference.d.ts +0 -20
  309. package/packages/algod_client/src/models/asset-holding-reference.js +0 -23
  310. package/packages/algod_client/src/models/asset-holding-reference.js.map +0 -1
  311. package/packages/algod_client/src/models/asset-holding-reference.mjs +0 -23
  312. package/packages/algod_client/src/models/asset-holding-reference.mjs.map +0 -1
  313. package/packages/algod_client/src/models/box-reference.d.ts +0 -17
  314. package/packages/algod_client/src/models/box-reference.js +0 -23
  315. package/packages/algod_client/src/models/box-reference.js.map +0 -1
  316. package/packages/algod_client/src/models/box-reference.mjs +0 -23
  317. package/packages/algod_client/src/models/box-reference.mjs.map +0 -1
@@ -82,68 +82,58 @@ const isAbiValue = (x) => {
82
82
  return typeof x === "bigint" || typeof x === "boolean" || typeof x === "number" || typeof x === "string" || x instanceof Uint8Array || x instanceof require_address.Address;
83
83
  };
84
84
  /**
85
- * Populate reference arrays from processed ABI method call arguments
85
+ * Prepares method arguments for ABI encoding by building reference arrays and
86
+ * replacing reference-type arguments (account, asset, application) with their indices.
86
87
  */
87
- function populateMethodArgsIntoReferenceArrays(sender, appId, method, methodArgs, accountReferences, appReferences, assetReferences) {
88
- const accounts = accountReferences ?? [];
89
- const assets = assetReferences ?? [];
90
- const apps = appReferences ?? [];
91
- methodArgs.forEach((arg, i) => {
92
- const argType = method.args[i].type;
93
- if (require_abi_method.argTypeIsReference(argType)) switch (argType) {
94
- case "account":
95
- if (typeof arg === "string" && arg !== sender.toString() && !accounts.some((a) => a.toString() === arg)) accounts.push(require_address.getAddress(arg));
96
- break;
97
- case "asset":
98
- if (typeof arg === "bigint" && !assets.includes(arg)) assets.push(arg);
99
- break;
100
- case "application":
101
- if (typeof arg === "bigint" && arg !== appId && !apps.includes(arg)) apps.push(arg);
102
- break;
103
- }
104
- });
88
+ function prepareArgsForEncoding(sender, appId, method, methodArgs, accountReferences, appReferences, assetReferences) {
89
+ const accounts = [...accountReferences ?? []];
90
+ const assets = [...assetReferences ?? []];
91
+ const apps = [...appReferences ?? []];
105
92
  return {
106
93
  accountReferences: accounts,
107
94
  appReferences: apps,
108
- assetReferences: assets
109
- };
110
- }
111
- /**
112
- * Calculate array index for ABI reference values
113
- */
114
- function calculateMethodArgReferenceArrayIndex(refValue, referenceType, sender, appId, accountReferences, appReferences, assetReferences) {
115
- switch (referenceType) {
116
- case "account":
117
- if (typeof refValue === "string") {
118
- if (refValue === sender.toString()) return 0;
119
- const index = accountReferences.findIndex((a) => a.toString() === refValue);
120
- if (index === -1) throw new Error(`Account ${refValue} not found in reference array`);
121
- return index + 1;
122
- }
123
- throw new Error("Account reference must be a string");
124
- case "asset":
125
- if (typeof refValue === "bigint") {
126
- const index = assetReferences.indexOf(refValue);
127
- if (index === -1) throw new Error(`Asset ${refValue} not found in reference array`);
128
- return index;
95
+ assetReferences: assets,
96
+ updatedArgs: methodArgs.map((arg, i) => {
97
+ const argType = method.args[i].type;
98
+ if (!require_abi_method.argTypeIsReference(argType)) return arg;
99
+ switch (argType) {
100
+ case "account": {
101
+ let addr;
102
+ if (typeof arg === "string") addr = require_address.getAddress(arg);
103
+ else if (arg instanceof Uint8Array) addr = new require_address.Address(arg);
104
+ else throw new Error("Invalid value for account");
105
+ if (sender.equals(addr)) return 0;
106
+ const existing = accounts.findIndex((a) => a.equals(addr)) + 1;
107
+ if (existing) return existing;
108
+ accounts.push(addr);
109
+ return accounts.length;
110
+ }
111
+ case "asset": {
112
+ if (typeof arg !== "bigint") throw new Error("Invalid value for asset");
113
+ const existing = assets.findIndex((a) => a === arg);
114
+ if (existing === -1) {
115
+ assets.push(arg);
116
+ return assets.length - 1;
117
+ }
118
+ return existing;
119
+ }
120
+ case "application": {
121
+ if (typeof arg !== "bigint") throw new Error("Invalid value for application");
122
+ if (arg === appId) return 0;
123
+ const existing = apps.findIndex((a) => a === arg) + 1;
124
+ if (existing) return existing;
125
+ apps.push(arg);
126
+ return apps.length;
127
+ }
129
128
  }
130
- throw new Error("Asset reference must be a bigint");
131
- case "application":
132
- if (typeof refValue === "bigint") {
133
- if (refValue === appId) return 0;
134
- const index = appReferences.indexOf(refValue);
135
- if (index === -1) throw new Error(`Application ${refValue} not found in reference array`);
136
- return index + 1;
137
- }
138
- throw new Error("Application reference must be a bigint");
139
- default: throw new Error(`Unknown reference type: ${referenceType}`);
140
- }
129
+ })
130
+ };
141
131
  }
142
132
  /**
143
133
  * Encode ABI method arguments with tuple packing support
144
134
  * Ports the logic from the Rust encode_method_arguments function
145
135
  */
146
- function encodeMethodArguments(method, args, sender, appId, accountReferences, appReferences, assetReferences) {
136
+ function encodeMethodArguments(method, args) {
147
137
  const encodedArgs = new Array();
148
138
  encodedArgs.push(method.getSelector());
149
139
  const abiTypes = new Array();
@@ -153,10 +143,9 @@ function encodeMethodArguments(method, args, sender, appId, accountReferences, a
153
143
  const argValue = args[i];
154
144
  if (require_abi_method.argTypeIsTransaction(methodArg.type)) {} else if (require_abi_method.argTypeIsReference(methodArg.type)) {
155
145
  const referenceType = methodArg.type;
156
- if (typeof argValue === "string" || typeof argValue === "bigint") {
157
- const foreignIndex = calculateMethodArgReferenceArrayIndex(argValue, referenceType, sender, appId, accountReferences, appReferences, assetReferences);
146
+ if (typeof argValue === "number") {
158
147
  abiTypes.push(new require_abi_type.ABIUintType(8));
159
- abiValues.push(foreignIndex);
148
+ abiValues.push(argValue);
160
149
  } else throw new Error(`Invalid reference value for ${referenceType}: ${argValue}`);
161
150
  } else if (argValue !== void 0) {
162
151
  abiTypes.push(methodArg.type);
@@ -198,12 +187,12 @@ function encodeArgsWithTuplePacking(abiTypes, abiValues) {
198
187
  return encodedArgs;
199
188
  }
200
189
  /**
201
- * Common method call building logic
190
+ * Builds encoded ABI method arguments and resolves reference arrays
202
191
  */
203
- function buildMethodCallCommon(params, commonData) {
204
- const { accountReferences, appReferences, assetReferences } = populateMethodArgsIntoReferenceArrays(commonData.sender, params.appId, params.method, params.args ?? [], params.accountReferences, params.appReferences, params.assetReferences);
192
+ function buildMethodCallArgsAndReferences(params) {
193
+ const { accountReferences, appReferences, assetReferences, updatedArgs } = prepareArgsForEncoding(params.sender, params.appId, params.method, params.args ?? [], params.accountReferences, params.appReferences, params.assetReferences);
205
194
  return {
206
- args: encodeMethodArguments(params.method, params.args, commonData.sender, params.appId, accountReferences, appReferences, assetReferences),
195
+ args: encodeMethodArguments(params.method, updatedArgs),
207
196
  accountReferences,
208
197
  appReferences,
209
198
  assetReferences
@@ -223,14 +212,15 @@ const buildAppCreateMethodCall = async (params, appManager, suggestedParams, def
223
212
  } : void 0;
224
213
  const extraProgramPages = params.extraProgramPages !== void 0 ? params.extraProgramPages : require_util.calculateExtraProgramPages(approvalProgram, clearStateProgram);
225
214
  const accountReferences = params.accountReferences?.map((a) => require_address.getAddress(a));
226
- const common = buildMethodCallCommon({
215
+ const argsAndReferences = buildMethodCallArgsAndReferences({
216
+ sender: commonData.sender,
227
217
  appId: 0n,
228
218
  method: params.method,
229
219
  args: params.args ?? [],
230
220
  accountReferences,
231
221
  appReferences: params.appReferences,
232
222
  assetReferences: params.assetReferences
233
- }, commonData);
223
+ });
234
224
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
235
225
  return new require_transaction.Transaction({
236
226
  ...commonData,
@@ -243,11 +233,11 @@ const buildAppCreateMethodCall = async (params, appManager, suggestedParams, def
243
233
  globalStateSchema,
244
234
  localStateSchema,
245
235
  extraProgramPages,
246
- args: common.args,
236
+ args: argsAndReferences.args,
247
237
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
248
- accountReferences: params.accountReferences?.map((a) => require_address.getAddress(a)),
249
- appReferences: params.appReferences,
250
- assetReferences: params.assetReferences,
238
+ accountReferences: argsAndReferences.accountReferences,
239
+ appReferences: argsAndReferences.appReferences,
240
+ assetReferences: argsAndReferences.assetReferences,
251
241
  boxReferences: params.boxReferences?.map(require_app_manager.AppManager.getBoxReference)
252
242
  },
253
243
  rejectVersion: params.rejectVersion
@@ -259,14 +249,15 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
259
249
  const approvalProgram = typeof params.approvalProgram === "string" ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes : params.approvalProgram;
260
250
  const clearStateProgram = typeof params.clearStateProgram === "string" ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes : params.clearStateProgram;
261
251
  const accountReferences = params.accountReferences?.map((a) => require_address.getAddress(a));
262
- const common = buildMethodCallCommon({
252
+ const argsAndReferences = buildMethodCallArgsAndReferences({
253
+ sender: commonData.sender,
263
254
  appId: params.appId,
264
255
  method: params.method,
265
256
  args: params.args ?? [],
266
257
  accountReferences,
267
258
  appReferences: params.appReferences,
268
259
  assetReferences: params.assetReferences
269
- }, commonData);
260
+ });
270
261
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
271
262
  return new require_transaction.Transaction({
272
263
  ...commonData,
@@ -276,11 +267,11 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
276
267
  onComplete: require_app_call.OnApplicationComplete.UpdateApplication,
277
268
  approvalProgram,
278
269
  clearStateProgram,
279
- args: common.args,
270
+ args: argsAndReferences.args,
280
271
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
281
- accountReferences: params.accountReferences?.map((a) => require_address.getAddress(a)),
282
- appReferences: params.appReferences,
283
- assetReferences: params.assetReferences,
272
+ accountReferences: argsAndReferences.accountReferences,
273
+ appReferences: argsAndReferences.appReferences,
274
+ assetReferences: argsAndReferences.assetReferences,
284
275
  boxReferences: params.boxReferences?.map(require_app_manager.AppManager.getBoxReference)
285
276
  },
286
277
  rejectVersion: params.rejectVersion
@@ -290,14 +281,15 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
290
281
  const buildAppCallMethodCall = async (params, suggestedParams, defaultValidityWindow) => {
291
282
  const commonData = require_common.buildTransactionCommonData(params, suggestedParams, defaultValidityWindow);
292
283
  const accountReferences = params.accountReferences?.map((a) => require_address.getAddress(a));
293
- const common = buildMethodCallCommon({
284
+ const argsAndReferences = buildMethodCallArgsAndReferences({
285
+ sender: commonData.sender,
294
286
  appId: params.appId,
295
287
  method: params.method,
296
288
  args: params.args ?? [],
297
289
  accountReferences,
298
290
  appReferences: params.appReferences,
299
291
  assetReferences: params.assetReferences
300
- }, commonData);
292
+ });
301
293
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
302
294
  return new require_transaction.Transaction({
303
295
  ...commonData,
@@ -305,11 +297,11 @@ const buildAppCallMethodCall = async (params, suggestedParams, defaultValidityWi
305
297
  appCall: {
306
298
  appId: params.appId,
307
299
  onComplete: params.onComplete ?? require_app_call.OnApplicationComplete.NoOp,
308
- args: common.args,
300
+ args: argsAndReferences.args,
309
301
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
310
- accountReferences: params.accountReferences?.map((a) => require_address.getAddress(a)),
311
- appReferences: params.appReferences,
312
- assetReferences: params.assetReferences,
302
+ accountReferences: argsAndReferences.accountReferences,
303
+ appReferences: argsAndReferences.appReferences,
304
+ assetReferences: argsAndReferences.assetReferences,
313
305
  boxReferences: params.boxReferences?.map(require_app_manager.AppManager.getBoxReference)
314
306
  },
315
307
  rejectVersion: params.rejectVersion
@@ -1 +1 @@
1
- {"version":3,"file":"method-call.js","names":["Address","argTypeIsReference","getAddress","argTypeIsTransaction","ABIUintType","encodedArgs: Uint8Array[]","ABITupleType","buildTransactionCommonData","calculateExtraProgramPages","Transaction","TransactionType","OnApplicationComplete","AppManager"],"sources":["../../src/transactions/method-call.ts"],"sourcesContent":["import {\n ABIMethod,\n ABIReferenceType,\n ABITupleType,\n ABIType,\n ABIUintType,\n ABIValue,\n argTypeIsReference,\n argTypeIsTransaction,\n} from '@algorandfoundation/algokit-abi'\nimport { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, getAddress } from '@algorandfoundation/algokit-common'\nimport { OnApplicationComplete, Transaction, TransactionSigner, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { TransactionWithSigner } from '../transaction'\nimport { AlgoAmount } from '../types/amount'\nimport { AppManager } from '../types/app-manager'\nimport { Expand } from '../types/expand'\nimport { calculateExtraProgramPages } from '../util'\nimport { AppCreateParams, AppDeleteParams, AppMethodCallParams, AppUpdateParams } from './app-call'\nimport { TransactionCommonData, buildTransactionCommonData } from './common'\n\nconst ARGS_TUPLE_PACKING_THRESHOLD = 14 // 14+ args trigger tuple packing, excluding the method selector\n\n/** Parameters to define an ABI method call create transaction. */\nexport type AppCreateMethodCall = Expand<AppMethodCall<AppCreateParams>>\n/** Parameters to define an ABI method call update transaction. */\nexport type AppUpdateMethodCall = Expand<AppMethodCall<AppUpdateParams>>\n/** Parameters to define an ABI method call delete transaction. */\nexport type AppDeleteMethodCall = Expand<AppMethodCall<AppDeleteParams>>\n/** Parameters to define an ABI method call transaction. */\nexport type AppCallMethodCall = Expand<AppMethodCall<AppMethodCallParams>>\n\nexport type ProcessedAppCreateMethodCall = Expand<\n Omit<AppCreateMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\nexport type ProcessedAppUpdateMethodCall = Expand<\n Omit<AppUpdateMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\nexport type ProcessedAppCallMethodCall = Expand<\n Omit<AppCallMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\n/** Types that can be used to define a transaction argument for an ABI call transaction. */\nexport type AppMethodCallTransactionArgument =\n // The following should match the partial `args` types from `AppMethodCall<T>` below\n | TransactionWithSigner\n | Transaction\n | Promise<Transaction>\n | AppMethodCall<AppCreateParams>\n | AppMethodCall<AppUpdateParams>\n | AppMethodCall<AppMethodCallParams>\n\n/** Parameters to define an ABI method call. */\nexport type AppMethodCall<T> = Expand<Omit<T, 'args'>> & {\n /** The ABI method to call */\n method: ABIMethod\n /** Arguments to the ABI method, either:\n * * An ABI value\n * * A transaction with explicit signer\n * * A transaction (where the signer will be automatically assigned)\n * * An unawaited transaction (e.g. from algorand.createTransaction.{transactionType}())\n * * Another method call (via method call params object)\n * * undefined (this represents a placeholder transaction argument that is fulfilled by another method call argument)\n */\n args?: (\n | ABIValue\n // The following should match the above `AppMethodCallTransactionArgument` type above\n | TransactionWithSigner\n | Transaction\n | Promise<Transaction>\n | AppMethodCall<AppCreateParams>\n | AppMethodCall<AppUpdateParams>\n | AppMethodCall<AppMethodCallParams>\n | undefined\n )[]\n}\n\ntype AppMethodCallArgs = AppMethodCall<unknown>['args']\ntype AppMethodCallArg = NonNullable<AppMethodCallArgs>[number]\n\nexport type AsyncTransactionParams = {\n txn: Promise<Transaction>\n signer?: TransactionSigner\n maxFee?: AlgoAmount\n}\n\nexport type TransactionParams = {\n txn: Transaction\n signer?: TransactionSigner\n maxFee?: AlgoAmount\n}\n\ntype ExtractedMethodCallTransactionArg =\n | { data: TransactionParams; type: 'txn' }\n | {\n data: AsyncTransactionParams\n type: 'asyncTxn'\n }\n | { data: ProcessedAppCallMethodCall | ProcessedAppCreateMethodCall | ProcessedAppUpdateMethodCall; type: 'methodCall' }\n\nexport function extractComposerTransactionsFromAppMethodCallParams(\n params: AppCallMethodCall | AppCreateMethodCall | AppUpdateMethodCall | AppDeleteMethodCall,\n parentSigner?: TransactionSigner,\n): ExtractedMethodCallTransactionArg[] {\n const composerTransactions = new Array<ExtractedMethodCallTransactionArg>()\n const methodCallArgs = params.args\n if (!methodCallArgs) return []\n\n // Extract signer from params, falling back to parentSigner\n const currentSigner = params.signer ? ('signer' in params.signer ? params.signer.signer : params.signer) : parentSigner\n\n for (let i = 0; i < methodCallArgs.length; i++) {\n const arg = methodCallArgs[i]\n\n if (arg === undefined) {\n // is a transaction or default value placeholder, do nothing\n continue\n }\n if (isAbiValue(arg)) {\n // if is ABI value, also ignore\n continue\n }\n\n if (isTransactionWithSignerArg(arg)) {\n composerTransactions.push({\n data: {\n txn: arg.txn,\n signer: arg.signer,\n },\n type: 'txn',\n })\n\n continue\n }\n if (isAppCallMethodCallArg(arg)) {\n // Recursively extract nested method call transactions, passing the nested call itself and current signer as parent\n const nestedComposerTransactions = extractComposerTransactionsFromAppMethodCallParams(arg, currentSigner)\n composerTransactions.push(...nestedComposerTransactions)\n composerTransactions.push({\n data: {\n ...arg,\n signer: arg.signer ?? currentSigner,\n args: processAppMethodCallArgs(arg.args),\n },\n type: 'methodCall',\n } satisfies ExtractedMethodCallTransactionArg)\n\n continue\n }\n if (arg instanceof Promise) {\n composerTransactions.push({\n data: {\n txn: arg,\n signer: currentSigner,\n },\n type: 'asyncTxn',\n })\n continue\n }\n\n composerTransactions.push({\n data: {\n txn: Promise.resolve(arg),\n signer: currentSigner,\n },\n type: 'asyncTxn',\n })\n }\n\n return composerTransactions\n}\n\nexport function processAppMethodCallArgs(args: AppMethodCallArg[] | undefined): (ABIValue | undefined)[] | undefined {\n if (args === undefined) return undefined\n\n return args.map((arg) => {\n if (arg === undefined) {\n // Handle explicit placeholders (either transaction or default value)\n return undefined\n } else if (!isAbiValue(arg)) {\n // If the arg is not an ABIValue, it's must be a transaction, set to undefined\n // transaction arguments should be flattened out and added into the composer during the add process\n return undefined\n }\n return arg\n })\n}\n\nfunction isTransactionWithSignerArg(arg: AppMethodCallArg): arg is TransactionWithSigner {\n return typeof arg === 'object' && arg !== undefined && 'txn' in arg && 'signer' in arg\n}\n\nfunction isAppCallMethodCallArg(\n arg: AppMethodCallArg,\n): arg is AppMethodCall<AppCreateParams> | AppMethodCall<AppUpdateParams> | AppMethodCall<AppMethodCallParams> {\n return typeof arg === 'object' && arg !== undefined && 'method' in arg\n}\n\nconst isAbiValue = (x: unknown): x is ABIValue => {\n if (Array.isArray(x)) return x.length == 0 || x.every(isAbiValue)\n\n // If x is a POJO literal\n if (Object.getPrototypeOf(x) === Object.getPrototypeOf({})) {\n return Object.values(x as object).every(isAbiValue)\n }\n\n return (\n typeof x === 'bigint' ||\n typeof x === 'boolean' ||\n typeof x === 'number' ||\n typeof x === 'string' ||\n x instanceof Uint8Array ||\n x instanceof Address\n )\n}\n\n/**\n * Populate reference arrays from processed ABI method call arguments\n */\nfunction populateMethodArgsIntoReferenceArrays(\n sender: Address,\n appId: bigint,\n method: ABIMethod,\n methodArgs: AppMethodCallArg[],\n accountReferences?: Address[],\n appReferences?: bigint[],\n assetReferences?: bigint[],\n): { accountReferences: Address[]; appReferences: bigint[]; assetReferences: bigint[] } {\n const accounts = accountReferences ?? []\n const assets = assetReferences ?? []\n const apps = appReferences ?? []\n\n methodArgs.forEach((arg, i) => {\n const argType = method.args[i].type\n if (argTypeIsReference(argType)) {\n switch (argType) {\n case 'account':\n if (typeof arg === 'string' && arg !== sender.toString() && !accounts.some((a) => a.toString() === arg)) {\n accounts.push(getAddress(arg))\n }\n break\n case 'asset':\n if (typeof arg === 'bigint' && !assets.includes(arg)) {\n assets.push(arg)\n }\n break\n case 'application':\n if (typeof arg === 'bigint' && arg !== appId && !apps.includes(arg)) {\n apps.push(arg)\n }\n break\n }\n }\n })\n\n return { accountReferences: accounts, appReferences: apps, assetReferences: assets }\n}\n\n/**\n * Calculate array index for ABI reference values\n */\nfunction calculateMethodArgReferenceArrayIndex(\n refValue: string | bigint,\n referenceType: ABIReferenceType,\n sender: Address,\n appId: bigint,\n accountReferences: Address[],\n appReferences: bigint[],\n assetReferences: bigint[],\n): number {\n switch (referenceType) {\n case 'account':\n if (typeof refValue === 'string') {\n // If address is the same as sender, use index 0\n if (refValue === sender.toString()) return 0\n const index = accountReferences.findIndex((a) => a.toString() === refValue)\n if (index === -1) throw new Error(`Account ${refValue} not found in reference array`)\n return index + 1\n }\n throw new Error('Account reference must be a string')\n case 'asset':\n if (typeof refValue === 'bigint') {\n const index = assetReferences.indexOf(refValue)\n if (index === -1) throw new Error(`Asset ${refValue} not found in reference array`)\n return index\n }\n throw new Error('Asset reference must be a bigint')\n case 'application':\n if (typeof refValue === 'bigint') {\n // If app ID is the same as the current app, use index 0\n if (refValue === appId) return 0\n const index = appReferences.indexOf(refValue)\n if (index === -1) throw new Error(`Application ${refValue} not found in reference array`)\n return index + 1\n }\n throw new Error('Application reference must be a bigint')\n default:\n throw new Error(`Unknown reference type: ${referenceType}`)\n }\n}\n\n/**\n * Encode ABI method arguments with tuple packing support\n * Ports the logic from the Rust encode_method_arguments function\n */\nfunction encodeMethodArguments(\n method: ABIMethod,\n args: (ABIValue | undefined)[],\n sender: Address,\n appId: bigint,\n accountReferences: Address[],\n appReferences: bigint[],\n assetReferences: bigint[],\n): Uint8Array[] {\n const encodedArgs = new Array<Uint8Array>()\n\n // Insert method selector at the front\n encodedArgs.push(method.getSelector())\n\n // Get ABI types for non-transaction arguments\n const abiTypes = new Array<ABIType>()\n const abiValues = new Array<ABIValue>()\n\n // Process each method argument\n for (let i = 0; i < method.args.length; i++) {\n const methodArg = method.args[i]\n const argValue = args[i]\n\n if (argTypeIsTransaction(methodArg.type)) {\n // Transaction arguments are not ABI encoded - they're handled separately\n } else if (argTypeIsReference(methodArg.type)) {\n // Reference types are encoded as uint8 indexes\n const referenceType = methodArg.type\n if (typeof argValue === 'string' || typeof argValue === 'bigint') {\n const foreignIndex = calculateMethodArgReferenceArrayIndex(\n argValue,\n referenceType,\n sender,\n appId,\n accountReferences,\n appReferences,\n assetReferences,\n )\n\n abiTypes.push(new ABIUintType(8))\n abiValues.push(foreignIndex)\n } else {\n throw new Error(`Invalid reference value for ${referenceType}: ${argValue}`)\n }\n } else if (argValue !== undefined) {\n // Regular ABI value\n abiTypes.push(methodArg.type)\n // it's safe to cast to ABIValue here because the abiType must be ABIValue\n abiValues.push(argValue as ABIValue)\n }\n\n // Skip undefined values (transaction placeholders)\n }\n\n if (abiValues.length !== abiTypes.length) {\n throw new Error('Mismatch in length of non-transaction arguments')\n }\n\n // Apply ARC-4 tuple packing for methods with more than 14 arguments\n // 14 instead of 15 in the ARC-4 because the first argument (method selector) is added separately\n if (abiTypes.length > ARGS_TUPLE_PACKING_THRESHOLD) {\n encodedArgs.push(...encodeArgsWithTuplePacking(abiTypes, abiValues))\n } else {\n encodedArgs.push(...encodeArgsIndividually(abiTypes, abiValues))\n }\n\n return encodedArgs\n}\n\n/**\n * Encode individual ABI values\n */\nfunction encodeArgsIndividually(abiTypes: ABIType[], abiValues: ABIValue[]): Uint8Array[] {\n const encodedArgs: Uint8Array[] = []\n\n for (let i = 0; i < abiTypes.length; i++) {\n const abiType = abiTypes[i]\n const abiValue = abiValues[i]\n const encoded = abiType.encode(abiValue)\n encodedArgs.push(encoded)\n }\n\n return encodedArgs\n}\n\n/**\n * Encode ABI values with tuple packing for methods with many arguments\n */\nfunction encodeArgsWithTuplePacking(abiTypes: ABIType[], abiValues: ABIValue[]): Uint8Array[] {\n const encodedArgs: Uint8Array[] = []\n\n // Encode first 14 arguments individually\n const first14AbiTypes = abiTypes.slice(0, ARGS_TUPLE_PACKING_THRESHOLD)\n const first14AbiValues = abiValues.slice(0, ARGS_TUPLE_PACKING_THRESHOLD)\n encodedArgs.push(...encodeArgsIndividually(first14AbiTypes, first14AbiValues))\n\n // Pack remaining arguments into tuple at position 15\n const remainingAbiTypes = abiTypes.slice(ARGS_TUPLE_PACKING_THRESHOLD)\n const remainingAbiValues = abiValues.slice(ARGS_TUPLE_PACKING_THRESHOLD)\n\n if (remainingAbiTypes.length > 0) {\n const tupleType = new ABITupleType(remainingAbiTypes)\n const tupleValue = remainingAbiValues\n const tupleEncoded = tupleType.encode(tupleValue)\n encodedArgs.push(tupleEncoded)\n }\n\n return encodedArgs\n}\n\n/**\n * Common method call building logic\n */\nfunction buildMethodCallCommon(\n params: {\n appId: bigint\n method: ABIMethod\n args: (ABIValue | undefined)[]\n accountReferences?: Address[]\n appReferences?: bigint[]\n assetReferences?: bigint[]\n },\n commonData: TransactionCommonData,\n): { args: Uint8Array[]; accountReferences: Address[]; appReferences: bigint[]; assetReferences: bigint[] } {\n const { accountReferences, appReferences, assetReferences } = populateMethodArgsIntoReferenceArrays(\n commonData.sender,\n params.appId,\n params.method,\n params.args ?? [],\n params.accountReferences,\n params.appReferences,\n params.assetReferences,\n )\n\n const encodedArgs = encodeMethodArguments(\n params.method,\n params.args,\n commonData.sender,\n params.appId,\n accountReferences,\n appReferences,\n assetReferences,\n )\n\n return {\n args: encodedArgs,\n accountReferences,\n appReferences,\n assetReferences,\n }\n}\n\nexport const buildAppCreateMethodCall = async (\n params: ProcessedAppCreateMethodCall,\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 const accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const common = buildMethodCallCommon(\n {\n appId: 0n,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n },\n commonData,\n )\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,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: common.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 buildAppUpdateMethodCall = async (\n params: ProcessedAppUpdateMethodCall,\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 accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const common = buildMethodCallCommon(\n {\n appId: params.appId,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n },\n commonData,\n )\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: common.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 buildAppCallMethodCall = async (\n params: ProcessedAppCallMethodCall,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const common = buildMethodCallCommon(\n {\n appId: params.appId,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n },\n commonData,\n )\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: params.onComplete ?? OnApplicationComplete.NoOp,\n args: common.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"],"mappings":"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"}
1
+ {"version":3,"file":"method-call.js","names":["Address","argTypeIsReference","addr: Address","getAddress","argTypeIsTransaction","ABIUintType","encodedArgs: Uint8Array[]","ABITupleType","buildTransactionCommonData","calculateExtraProgramPages","Transaction","TransactionType","OnApplicationComplete","AppManager"],"sources":["../../src/transactions/method-call.ts"],"sourcesContent":["import {\n ABIMethod,\n ABITupleType,\n ABIType,\n ABIUintType,\n ABIValue,\n argTypeIsReference,\n argTypeIsTransaction,\n} from '@algorandfoundation/algokit-abi'\nimport { SuggestedParams } from '@algorandfoundation/algokit-algod-client'\nimport { Address, getAddress } from '@algorandfoundation/algokit-common'\nimport { OnApplicationComplete, Transaction, TransactionSigner, TransactionType } from '@algorandfoundation/algokit-transact'\nimport { TransactionWithSigner } from '../transaction'\nimport { AlgoAmount } from '../types/amount'\nimport { AppManager } from '../types/app-manager'\nimport { Expand } from '../types/expand'\nimport { calculateExtraProgramPages } from '../util'\nimport { AppCreateParams, AppDeleteParams, AppMethodCallParams, AppUpdateParams } from './app-call'\nimport { buildTransactionCommonData } from './common'\n\nconst ARGS_TUPLE_PACKING_THRESHOLD = 14 // 14+ args trigger tuple packing, excluding the method selector\n\n/** Parameters to define an ABI method call create transaction. */\nexport type AppCreateMethodCall = Expand<AppMethodCall<AppCreateParams>>\n/** Parameters to define an ABI method call update transaction. */\nexport type AppUpdateMethodCall = Expand<AppMethodCall<AppUpdateParams>>\n/** Parameters to define an ABI method call delete transaction. */\nexport type AppDeleteMethodCall = Expand<AppMethodCall<AppDeleteParams>>\n/** Parameters to define an ABI method call transaction. */\nexport type AppCallMethodCall = Expand<AppMethodCall<AppMethodCallParams>>\n\nexport type ProcessedAppCreateMethodCall = Expand<\n Omit<AppCreateMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\nexport type ProcessedAppUpdateMethodCall = Expand<\n Omit<AppUpdateMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\nexport type ProcessedAppCallMethodCall = Expand<\n Omit<AppCallMethodCall, 'args'> & {\n args?: (ABIValue | undefined)[]\n }\n>\n\n/** Types that can be used to define a transaction argument for an ABI call transaction. */\nexport type AppMethodCallTransactionArgument =\n // The following should match the partial `args` types from `AppMethodCall<T>` below\n | TransactionWithSigner\n | Transaction\n | Promise<Transaction>\n | AppMethodCall<AppCreateParams>\n | AppMethodCall<AppUpdateParams>\n | AppMethodCall<AppMethodCallParams>\n\n/** Parameters to define an ABI method call. */\nexport type AppMethodCall<T> = Expand<Omit<T, 'args'>> & {\n /** The ABI method to call */\n method: ABIMethod\n /** Arguments to the ABI method, either:\n * * An ABI value\n * * A transaction with explicit signer\n * * A transaction (where the signer will be automatically assigned)\n * * An unawaited transaction (e.g. from algorand.createTransaction.{transactionType}())\n * * Another method call (via method call params object)\n * * undefined (this represents a placeholder transaction argument that is fulfilled by another method call argument)\n */\n args?: (\n | ABIValue\n // The following should match the above `AppMethodCallTransactionArgument` type above\n | TransactionWithSigner\n | Transaction\n | Promise<Transaction>\n | AppMethodCall<AppCreateParams>\n | AppMethodCall<AppUpdateParams>\n | AppMethodCall<AppMethodCallParams>\n | undefined\n )[]\n}\n\ntype AppMethodCallArgs = AppMethodCall<unknown>['args']\ntype AppMethodCallArg = NonNullable<AppMethodCallArgs>[number]\n\nexport type AsyncTransactionParams = {\n txn: Promise<Transaction>\n signer?: TransactionSigner\n maxFee?: AlgoAmount\n}\n\nexport type TransactionParams = {\n txn: Transaction\n signer?: TransactionSigner\n maxFee?: AlgoAmount\n}\n\ntype ExtractedMethodCallTransactionArg =\n | { data: TransactionParams; type: 'txn' }\n | {\n data: AsyncTransactionParams\n type: 'asyncTxn'\n }\n | { data: ProcessedAppCallMethodCall | ProcessedAppCreateMethodCall | ProcessedAppUpdateMethodCall; type: 'methodCall' }\n\nexport function extractComposerTransactionsFromAppMethodCallParams(\n params: AppCallMethodCall | AppCreateMethodCall | AppUpdateMethodCall | AppDeleteMethodCall,\n parentSigner?: TransactionSigner,\n): ExtractedMethodCallTransactionArg[] {\n const composerTransactions = new Array<ExtractedMethodCallTransactionArg>()\n const methodCallArgs = params.args\n if (!methodCallArgs) return []\n\n // Extract signer from params, falling back to parentSigner\n const currentSigner = params.signer ? ('signer' in params.signer ? params.signer.signer : params.signer) : parentSigner\n\n for (let i = 0; i < methodCallArgs.length; i++) {\n const arg = methodCallArgs[i]\n\n if (arg === undefined) {\n // is a transaction or default value placeholder, do nothing\n continue\n }\n if (isAbiValue(arg)) {\n // if is ABI value, also ignore\n continue\n }\n\n if (isTransactionWithSignerArg(arg)) {\n composerTransactions.push({\n data: {\n txn: arg.txn,\n signer: arg.signer,\n },\n type: 'txn',\n })\n\n continue\n }\n if (isAppCallMethodCallArg(arg)) {\n // Recursively extract nested method call transactions, passing the nested call itself and current signer as parent\n const nestedComposerTransactions = extractComposerTransactionsFromAppMethodCallParams(arg, currentSigner)\n composerTransactions.push(...nestedComposerTransactions)\n composerTransactions.push({\n data: {\n ...arg,\n signer: arg.signer ?? currentSigner,\n args: processAppMethodCallArgs(arg.args),\n },\n type: 'methodCall',\n } satisfies ExtractedMethodCallTransactionArg)\n\n continue\n }\n if (arg instanceof Promise) {\n composerTransactions.push({\n data: {\n txn: arg,\n signer: currentSigner,\n },\n type: 'asyncTxn',\n })\n continue\n }\n\n composerTransactions.push({\n data: {\n txn: Promise.resolve(arg),\n signer: currentSigner,\n },\n type: 'asyncTxn',\n })\n }\n\n return composerTransactions\n}\n\nexport function processAppMethodCallArgs(args: AppMethodCallArg[] | undefined): (ABIValue | undefined)[] | undefined {\n if (args === undefined) return undefined\n\n return args.map((arg) => {\n if (arg === undefined) {\n // Handle explicit placeholders (either transaction or default value)\n return undefined\n } else if (!isAbiValue(arg)) {\n // If the arg is not an ABIValue, it's must be a transaction, set to undefined\n // transaction arguments should be flattened out and added into the composer during the add process\n return undefined\n }\n return arg\n })\n}\n\nfunction isTransactionWithSignerArg(arg: AppMethodCallArg): arg is TransactionWithSigner {\n return typeof arg === 'object' && arg !== undefined && 'txn' in arg && 'signer' in arg\n}\n\nfunction isAppCallMethodCallArg(\n arg: AppMethodCallArg,\n): arg is AppMethodCall<AppCreateParams> | AppMethodCall<AppUpdateParams> | AppMethodCall<AppMethodCallParams> {\n return typeof arg === 'object' && arg !== undefined && 'method' in arg\n}\n\nconst isAbiValue = (x: unknown): x is ABIValue => {\n if (Array.isArray(x)) return x.length == 0 || x.every(isAbiValue)\n\n // If x is a POJO literal\n if (Object.getPrototypeOf(x) === Object.getPrototypeOf({})) {\n return Object.values(x as object).every(isAbiValue)\n }\n\n return (\n typeof x === 'bigint' ||\n typeof x === 'boolean' ||\n typeof x === 'number' ||\n typeof x === 'string' ||\n x instanceof Uint8Array ||\n x instanceof Address\n )\n}\n\n/**\n * Prepares method arguments for ABI encoding by building reference arrays and\n * replacing reference-type arguments (account, asset, application) with their indices.\n */\nfunction prepareArgsForEncoding(\n sender: Address,\n appId: bigint,\n method: ABIMethod,\n methodArgs: (ABIValue | undefined)[],\n accountReferences?: Address[],\n appReferences?: bigint[],\n assetReferences?: bigint[],\n): { accountReferences: Address[]; appReferences: bigint[]; assetReferences: bigint[]; updatedArgs: (ABIValue | undefined)[] } {\n const accounts = [...(accountReferences ?? [])]\n const assets = [...(assetReferences ?? [])]\n const apps = [...(appReferences ?? [])]\n\n const updatedArgs = methodArgs.map((arg, i) => {\n const argType = method.args[i].type\n if (!argTypeIsReference(argType)) {\n return arg\n }\n switch (argType) {\n case 'account': {\n let addr: Address\n if (typeof arg === 'string') {\n addr = getAddress(arg)\n } else if (arg instanceof Uint8Array) {\n addr = new Address(arg)\n } else {\n throw new Error('Invalid value for account')\n }\n\n if (sender.equals(addr)) {\n return 0\n }\n\n const existing = accounts.findIndex((a) => a.equals(addr)) + 1\n if (existing) return existing\n\n accounts.push(addr)\n return accounts.length\n }\n case 'asset': {\n if (typeof arg !== 'bigint') {\n throw new Error('Invalid value for asset')\n }\n\n const existing = assets.findIndex((a) => a === arg)\n if (existing === -1) {\n assets.push(arg)\n return assets.length - 1\n }\n\n return existing\n }\n case 'application': {\n if (typeof arg !== 'bigint') {\n throw new Error('Invalid value for application')\n }\n\n if (arg === appId) return 0\n\n const existing = apps.findIndex((a) => a === arg) + 1\n if (existing) return existing\n\n apps.push(arg)\n return apps.length\n }\n }\n })\n\n return { accountReferences: accounts, appReferences: apps, assetReferences: assets, updatedArgs }\n}\n\n/**\n * Encode ABI method arguments with tuple packing support\n * Ports the logic from the Rust encode_method_arguments function\n */\nfunction encodeMethodArguments(method: ABIMethod, args: (ABIValue | undefined)[]): Uint8Array[] {\n const encodedArgs = new Array<Uint8Array>()\n\n // Insert method selector at the front\n encodedArgs.push(method.getSelector())\n\n // Get ABI types for non-transaction arguments\n const abiTypes = new Array<ABIType>()\n const abiValues = new Array<ABIValue>()\n\n // Process each method argument\n for (let i = 0; i < method.args.length; i++) {\n const methodArg = method.args[i]\n const argValue = args[i]\n\n if (argTypeIsTransaction(methodArg.type)) {\n // Transaction arguments are not ABI encoded - they're handled separately\n } else if (argTypeIsReference(methodArg.type)) {\n // Reference types are encoded as uint8 indexes\n const referenceType = methodArg.type\n if (typeof argValue === 'number') {\n abiTypes.push(new ABIUintType(8))\n abiValues.push(argValue)\n } else {\n throw new Error(`Invalid reference value for ${referenceType}: ${argValue}`)\n }\n } else if (argValue !== undefined) {\n // Regular ABI value\n abiTypes.push(methodArg.type)\n // it's safe to cast to ABIValue here because the abiType must be ABIValue\n abiValues.push(argValue as ABIValue)\n }\n\n // Skip undefined values (transaction placeholders)\n }\n\n if (abiValues.length !== abiTypes.length) {\n throw new Error('Mismatch in length of non-transaction arguments')\n }\n\n // Apply ARC-4 tuple packing for methods with more than 14 arguments\n // 14 instead of 15 in the ARC-4 because the first argument (method selector) is added separately\n if (abiTypes.length > ARGS_TUPLE_PACKING_THRESHOLD) {\n encodedArgs.push(...encodeArgsWithTuplePacking(abiTypes, abiValues))\n } else {\n encodedArgs.push(...encodeArgsIndividually(abiTypes, abiValues))\n }\n\n return encodedArgs\n}\n\n/**\n * Encode individual ABI values\n */\nfunction encodeArgsIndividually(abiTypes: ABIType[], abiValues: ABIValue[]): Uint8Array[] {\n const encodedArgs: Uint8Array[] = []\n\n for (let i = 0; i < abiTypes.length; i++) {\n const abiType = abiTypes[i]\n const abiValue = abiValues[i]\n const encoded = abiType.encode(abiValue)\n encodedArgs.push(encoded)\n }\n\n return encodedArgs\n}\n\n/**\n * Encode ABI values with tuple packing for methods with many arguments\n */\nfunction encodeArgsWithTuplePacking(abiTypes: ABIType[], abiValues: ABIValue[]): Uint8Array[] {\n const encodedArgs: Uint8Array[] = []\n\n // Encode first 14 arguments individually\n const first14AbiTypes = abiTypes.slice(0, ARGS_TUPLE_PACKING_THRESHOLD)\n const first14AbiValues = abiValues.slice(0, ARGS_TUPLE_PACKING_THRESHOLD)\n encodedArgs.push(...encodeArgsIndividually(first14AbiTypes, first14AbiValues))\n\n // Pack remaining arguments into tuple at position 15\n const remainingAbiTypes = abiTypes.slice(ARGS_TUPLE_PACKING_THRESHOLD)\n const remainingAbiValues = abiValues.slice(ARGS_TUPLE_PACKING_THRESHOLD)\n\n if (remainingAbiTypes.length > 0) {\n const tupleType = new ABITupleType(remainingAbiTypes)\n const tupleValue = remainingAbiValues\n const tupleEncoded = tupleType.encode(tupleValue)\n encodedArgs.push(tupleEncoded)\n }\n\n return encodedArgs\n}\n\n/**\n * Builds encoded ABI method arguments and resolves reference arrays\n */\nfunction buildMethodCallArgsAndReferences(params: {\n sender: Address\n appId: bigint\n method: ABIMethod\n args: (ABIValue | undefined)[]\n accountReferences?: Address[]\n appReferences?: bigint[]\n assetReferences?: bigint[]\n}): { args: Uint8Array[]; accountReferences: Address[]; appReferences: bigint[]; assetReferences: bigint[] } {\n const { accountReferences, appReferences, assetReferences, updatedArgs } = prepareArgsForEncoding(\n params.sender,\n params.appId,\n params.method,\n params.args ?? [],\n params.accountReferences,\n params.appReferences,\n params.assetReferences,\n )\n\n const encodedArgs = encodeMethodArguments(params.method, updatedArgs)\n\n return {\n args: encodedArgs,\n accountReferences,\n appReferences,\n assetReferences,\n }\n}\n\nexport const buildAppCreateMethodCall = async (\n params: ProcessedAppCreateMethodCall,\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 const accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const argsAndReferences = buildMethodCallArgsAndReferences({\n sender: commonData.sender,\n appId: 0n,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n })\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,\n onComplete: params.onComplete ?? OnApplicationComplete.NoOp,\n approvalProgram: approvalProgram,\n clearStateProgram: clearStateProgram,\n globalStateSchema: globalStateSchema,\n localStateSchema: localStateSchema,\n extraProgramPages: extraProgramPages,\n args: argsAndReferences.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: argsAndReferences.accountReferences,\n appReferences: argsAndReferences.appReferences,\n assetReferences: argsAndReferences.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppUpdateMethodCall = async (\n params: ProcessedAppUpdateMethodCall,\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 accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const argsAndReferences = buildMethodCallArgsAndReferences({\n sender: commonData.sender,\n appId: params.appId,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n })\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: argsAndReferences.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: argsAndReferences.accountReferences,\n appReferences: argsAndReferences.appReferences,\n assetReferences: argsAndReferences.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n\nexport const buildAppCallMethodCall = async (\n params: ProcessedAppCallMethodCall,\n suggestedParams: SuggestedParams,\n defaultValidityWindow: bigint,\n): Promise<Transaction> => {\n const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow)\n const accountReferences = params.accountReferences?.map((a) => getAddress(a))\n const argsAndReferences = buildMethodCallArgsAndReferences({\n sender: commonData.sender,\n appId: params.appId,\n method: params.method,\n args: params.args ?? [],\n accountReferences: accountReferences,\n appReferences: params.appReferences,\n assetReferences: params.assetReferences,\n })\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: params.onComplete ?? OnApplicationComplete.NoOp,\n args: argsAndReferences.args,\n ...(hasAccessReferences\n ? { accessReferences: params.accessReferences }\n : {\n accountReferences: argsAndReferences.accountReferences,\n appReferences: argsAndReferences.appReferences,\n assetReferences: argsAndReferences.assetReferences,\n boxReferences: params.boxReferences?.map(AppManager.getBoxReference),\n }),\n rejectVersion: params.rejectVersion,\n },\n })\n}\n"],"mappings":";;;;;;;;;;;AAoBA,MAAM,+BAA+B;AAuFrC,SAAgB,mDACd,QACA,cACqC;CACrC,MAAM,uBAAuB,IAAI,OAA0C;CAC3E,MAAM,iBAAiB,OAAO;AAC9B,KAAI,CAAC,eAAgB,QAAO,EAAE;CAG9B,MAAM,gBAAgB,OAAO,SAAU,YAAY,OAAO,SAAS,OAAO,OAAO,SAAS,OAAO,SAAU;AAE3G,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,QAAQ,KAAK;EAC9C,MAAM,MAAM,eAAe;AAE3B,MAAI,QAAQ,OAEV;AAEF,MAAI,WAAW,IAAI,CAEjB;AAGF,MAAI,2BAA2B,IAAI,EAAE;AACnC,wBAAqB,KAAK;IACxB,MAAM;KACJ,KAAK,IAAI;KACT,QAAQ,IAAI;KACb;IACD,MAAM;IACP,CAAC;AAEF;;AAEF,MAAI,uBAAuB,IAAI,EAAE;GAE/B,MAAM,6BAA6B,mDAAmD,KAAK,cAAc;AACzG,wBAAqB,KAAK,GAAG,2BAA2B;AACxD,wBAAqB,KAAK;IACxB,MAAM;KACJ,GAAG;KACH,QAAQ,IAAI,UAAU;KACtB,MAAM,yBAAyB,IAAI,KAAK;KACzC;IACD,MAAM;IACP,CAA6C;AAE9C;;AAEF,MAAI,eAAe,SAAS;AAC1B,wBAAqB,KAAK;IACxB,MAAM;KACJ,KAAK;KACL,QAAQ;KACT;IACD,MAAM;IACP,CAAC;AACF;;AAGF,uBAAqB,KAAK;GACxB,MAAM;IACJ,KAAK,QAAQ,QAAQ,IAAI;IACzB,QAAQ;IACT;GACD,MAAM;GACP,CAAC;;AAGJ,QAAO;;AAGT,SAAgB,yBAAyB,MAA4E;AACnH,KAAI,SAAS,OAAW,QAAO;AAE/B,QAAO,KAAK,KAAK,QAAQ;AACvB,MAAI,QAAQ,OAEV;WACS,CAAC,WAAW,IAAI,CAGzB;AAEF,SAAO;GACP;;AAGJ,SAAS,2BAA2B,KAAqD;AACvF,QAAO,OAAO,QAAQ,YAAY,QAAQ,UAAa,SAAS,OAAO,YAAY;;AAGrF,SAAS,uBACP,KAC6G;AAC7G,QAAO,OAAO,QAAQ,YAAY,QAAQ,UAAa,YAAY;;AAGrE,MAAM,cAAc,MAA8B;AAChD,KAAI,MAAM,QAAQ,EAAE,CAAE,QAAO,EAAE,UAAU,KAAK,EAAE,MAAM,WAAW;AAGjE,KAAI,OAAO,eAAe,EAAE,KAAK,OAAO,eAAe,EAAE,CAAC,CACxD,QAAO,OAAO,OAAO,EAAY,CAAC,MAAM,WAAW;AAGrD,QACE,OAAO,MAAM,YACb,OAAO,MAAM,aACb,OAAO,MAAM,YACb,OAAO,MAAM,YACb,aAAa,cACb,aAAaA;;;;;;AAQjB,SAAS,uBACP,QACA,OACA,QACA,YACA,mBACA,eACA,iBAC6H;CAC7H,MAAM,WAAW,CAAC,GAAI,qBAAqB,EAAE,CAAE;CAC/C,MAAM,SAAS,CAAC,GAAI,mBAAmB,EAAE,CAAE;CAC3C,MAAM,OAAO,CAAC,GAAI,iBAAiB,EAAE,CAAE;AAyDvC,QAAO;EAAE,mBAAmB;EAAU,eAAe;EAAM,iBAAiB;EAAQ,aAvDhE,WAAW,KAAK,KAAK,MAAM;GAC7C,MAAM,UAAU,OAAO,KAAK,GAAG;AAC/B,OAAI,CAACC,sCAAmB,QAAQ,CAC9B,QAAO;AAET,WAAQ,SAAR;IACE,KAAK,WAAW;KACd,IAAIC;AACJ,SAAI,OAAO,QAAQ,SACjB,QAAOC,2BAAW,IAAI;cACb,eAAe,WACxB,QAAO,IAAIH,wBAAQ,IAAI;SAEvB,OAAM,IAAI,MAAM,4BAA4B;AAG9C,SAAI,OAAO,OAAO,KAAK,CACrB,QAAO;KAGT,MAAM,WAAW,SAAS,WAAW,MAAM,EAAE,OAAO,KAAK,CAAC,GAAG;AAC7D,SAAI,SAAU,QAAO;AAErB,cAAS,KAAK,KAAK;AACnB,YAAO,SAAS;;IAElB,KAAK,SAAS;AACZ,SAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,MAAM,0BAA0B;KAG5C,MAAM,WAAW,OAAO,WAAW,MAAM,MAAM,IAAI;AACnD,SAAI,aAAa,IAAI;AACnB,aAAO,KAAK,IAAI;AAChB,aAAO,OAAO,SAAS;;AAGzB,YAAO;;IAET,KAAK,eAAe;AAClB,SAAI,OAAO,QAAQ,SACjB,OAAM,IAAI,MAAM,gCAAgC;AAGlD,SAAI,QAAQ,MAAO,QAAO;KAE1B,MAAM,WAAW,KAAK,WAAW,MAAM,MAAM,IAAI,GAAG;AACpD,SAAI,SAAU,QAAO;AAErB,UAAK,KAAK,IAAI;AACd,YAAO,KAAK;;;IAGhB;EAE+F;;;;;;AAOnG,SAAS,sBAAsB,QAAmB,MAA8C;CAC9F,MAAM,cAAc,IAAI,OAAmB;AAG3C,aAAY,KAAK,OAAO,aAAa,CAAC;CAGtC,MAAM,WAAW,IAAI,OAAgB;CACrC,MAAM,YAAY,IAAI,OAAiB;AAGvC,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,QAAQ,KAAK;EAC3C,MAAM,YAAY,OAAO,KAAK;EAC9B,MAAM,WAAW,KAAK;AAEtB,MAAII,wCAAqB,UAAU,KAAK,EAAE,YAE/BH,sCAAmB,UAAU,KAAK,EAAE;GAE7C,MAAM,gBAAgB,UAAU;AAChC,OAAI,OAAO,aAAa,UAAU;AAChC,aAAS,KAAK,IAAII,6BAAY,EAAE,CAAC;AACjC,cAAU,KAAK,SAAS;SAExB,OAAM,IAAI,MAAM,+BAA+B,cAAc,IAAI,WAAW;aAErE,aAAa,QAAW;AAEjC,YAAS,KAAK,UAAU,KAAK;AAE7B,aAAU,KAAK,SAAqB;;;AAMxC,KAAI,UAAU,WAAW,SAAS,OAChC,OAAM,IAAI,MAAM,kDAAkD;AAKpE,KAAI,SAAS,SAAS,6BACpB,aAAY,KAAK,GAAG,2BAA2B,UAAU,UAAU,CAAC;KAEpE,aAAY,KAAK,GAAG,uBAAuB,UAAU,UAAU,CAAC;AAGlE,QAAO;;;;;AAMT,SAAS,uBAAuB,UAAqB,WAAqC;CACxF,MAAMC,cAA4B,EAAE;AAEpC,MAAK,IAAI,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK;EACxC,MAAM,UAAU,SAAS;EACzB,MAAM,WAAW,UAAU;EAC3B,MAAM,UAAU,QAAQ,OAAO,SAAS;AACxC,cAAY,KAAK,QAAQ;;AAG3B,QAAO;;;;;AAMT,SAAS,2BAA2B,UAAqB,WAAqC;CAC5F,MAAMA,cAA4B,EAAE;CAGpC,MAAM,kBAAkB,SAAS,MAAM,GAAG,6BAA6B;CACvE,MAAM,mBAAmB,UAAU,MAAM,GAAG,6BAA6B;AACzE,aAAY,KAAK,GAAG,uBAAuB,iBAAiB,iBAAiB,CAAC;CAG9E,MAAM,oBAAoB,SAAS,MAAM,6BAA6B;CACtE,MAAM,qBAAqB,UAAU,MAAM,6BAA6B;AAExE,KAAI,kBAAkB,SAAS,GAAG;EAGhC,MAAM,eAFY,IAAIC,8BAAa,kBAAkB,CAEtB,OADZ,mBAC8B;AACjD,cAAY,KAAK,aAAa;;AAGhC,QAAO;;;;;AAMT,SAAS,iCAAiC,QAQmE;CAC3G,MAAM,EAAE,mBAAmB,eAAe,iBAAiB,gBAAgB,uBACzE,OAAO,QACP,OAAO,OACP,OAAO,QACP,OAAO,QAAQ,EAAE,EACjB,OAAO,mBACP,OAAO,eACP,OAAO,gBACR;AAID,QAAO;EACL,MAHkB,sBAAsB,OAAO,QAAQ,YAAY;EAInE;EACA;EACA;EACD;;AAGH,MAAa,2BAA2B,OACtC,QACA,YACA,iBACA,0BACyB;CACzB,MAAM,aAAaC,0CAA2B,QAAQ,iBAAiB,sBAAsB;CAC7F,MAAM,kBACJ,OAAO,OAAO,oBAAoB,YAC7B,MAAM,WAAW,YAAY,OAAO,gBAAgB,EAAE,wBACvD,OAAO;CACb,MAAM,oBACJ,OAAO,OAAO,sBAAsB,YAC/B,MAAM,WAAW,YAAY,OAAO,kBAAkB,EAAE,wBACzD,OAAO;CACb,MAAM,oBACJ,OAAO,QAAQ,qBAAqB,UAAa,OAAO,QAAQ,eAAe,SAC3E;EACE,eAAe,OAAO,QAAQ,oBAAoB;EAClD,UAAU,OAAO,QAAQ,cAAc;EACxC,GACD;CACN,MAAM,mBACJ,OAAO,QAAQ,oBAAoB,UAAa,OAAO,QAAQ,cAAc,SACzE;EACE,eAAe,OAAO,QAAQ,mBAAmB;EACjD,UAAU,OAAO,QAAQ,aAAa;EACvC,GACD;CACN,MAAM,oBACJ,OAAO,sBAAsB,SAAY,OAAO,oBAAoBC,wCAA2B,iBAAkB,kBAAmB;CACtI,MAAM,oBAAoB,OAAO,mBAAmB,KAAK,MAAMN,2BAAW,EAAE,CAAC;CAC7E,MAAM,oBAAoB,iCAAiC;EACzD,QAAQ,WAAW;EACnB,OAAO;EACP,QAAQ,OAAO;EACf,MAAM,OAAO,QAAQ,EAAE;EACJ;EACnB,eAAe,OAAO;EACtB,iBAAiB,OAAO;EACzB,CAAC;CAGF,MAAM,sBAAsB,OAAO,oBAAoB,OAAO,iBAAiB,SAAS;AAExF,QAAO,IAAIO,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,SAAS;GACP,OAAO;GACP,YAAY,OAAO,cAAcC,uCAAsB;GACtC;GACE;GACA;GACD;GACC;GACnB,MAAM,kBAAkB;GACxB,GAAI,sBACA,EAAE,kBAAkB,OAAO,kBAAkB,GAC7C;IACE,mBAAmB,kBAAkB;IACrC,eAAe,kBAAkB;IACjC,iBAAiB,kBAAkB;IACnC,eAAe,OAAO,eAAe,IAAIC,+BAAW,gBAAgB;IACrE;GACL,eAAe,OAAO;GACvB;EACF,CAAC;;AAGJ,MAAa,2BAA2B,OACtC,QACA,YACA,iBACA,0BACyB;CACzB,MAAM,aAAaL,0CAA2B,QAAQ,iBAAiB,sBAAsB;CAC7F,MAAM,kBACJ,OAAO,OAAO,oBAAoB,YAC7B,MAAM,WAAW,YAAY,OAAO,gBAAgB,EAAE,wBACvD,OAAO;CACb,MAAM,oBACJ,OAAO,OAAO,sBAAsB,YAC/B,MAAM,WAAW,YAAY,OAAO,kBAAkB,EAAE,wBACzD,OAAO;CACb,MAAM,oBAAoB,OAAO,mBAAmB,KAAK,MAAML,2BAAW,EAAE,CAAC;CAC7E,MAAM,oBAAoB,iCAAiC;EACzD,QAAQ,WAAW;EACnB,OAAO,OAAO;EACd,QAAQ,OAAO;EACf,MAAM,OAAO,QAAQ,EAAE;EACJ;EACnB,eAAe,OAAO;EACtB,iBAAiB,OAAO;EACzB,CAAC;CAGF,MAAM,sBAAsB,OAAO,oBAAoB,OAAO,iBAAiB,SAAS;AAExF,QAAO,IAAIO,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,SAAS;GACP,OAAO,OAAO;GACd,YAAYC,uCAAsB;GACjB;GACE;GACnB,MAAM,kBAAkB;GACxB,GAAI,sBACA,EAAE,kBAAkB,OAAO,kBAAkB,GAC7C;IACE,mBAAmB,kBAAkB;IACrC,eAAe,kBAAkB;IACjC,iBAAiB,kBAAkB;IACnC,eAAe,OAAO,eAAe,IAAIC,+BAAW,gBAAgB;IACrE;GACL,eAAe,OAAO;GACvB;EACF,CAAC;;AAGJ,MAAa,yBAAyB,OACpC,QACA,iBACA,0BACyB;CACzB,MAAM,aAAaL,0CAA2B,QAAQ,iBAAiB,sBAAsB;CAC7F,MAAM,oBAAoB,OAAO,mBAAmB,KAAK,MAAML,2BAAW,EAAE,CAAC;CAC7E,MAAM,oBAAoB,iCAAiC;EACzD,QAAQ,WAAW;EACnB,OAAO,OAAO;EACd,QAAQ,OAAO;EACf,MAAM,OAAO,QAAQ,EAAE;EACJ;EACnB,eAAe,OAAO;EACtB,iBAAiB,OAAO;EACzB,CAAC;CAGF,MAAM,sBAAsB,OAAO,oBAAoB,OAAO,iBAAiB,SAAS;AAExF,QAAO,IAAIO,gCAAY;EACrB,GAAG;EACH,MAAMC,yCAAgB;EACtB,SAAS;GACP,OAAO,OAAO;GACd,YAAY,OAAO,cAAcC,uCAAsB;GACvD,MAAM,kBAAkB;GACxB,GAAI,sBACA,EAAE,kBAAkB,OAAO,kBAAkB,GAC7C;IACE,mBAAmB,kBAAkB;IACrC,eAAe,kBAAkB;IACjC,iBAAiB,kBAAkB;IACnC,eAAe,OAAO,eAAe,IAAIC,+BAAW,gBAAgB;IACrE;GACL,eAAe,OAAO;GACvB;EACF,CAAC"}
@@ -82,68 +82,58 @@ const isAbiValue = (x) => {
82
82
  return typeof x === "bigint" || typeof x === "boolean" || typeof x === "number" || typeof x === "string" || x instanceof Uint8Array || x instanceof Address;
83
83
  };
84
84
  /**
85
- * Populate reference arrays from processed ABI method call arguments
85
+ * Prepares method arguments for ABI encoding by building reference arrays and
86
+ * replacing reference-type arguments (account, asset, application) with their indices.
86
87
  */
87
- function populateMethodArgsIntoReferenceArrays(sender, appId, method, methodArgs, accountReferences, appReferences, assetReferences) {
88
- const accounts = accountReferences ?? [];
89
- const assets = assetReferences ?? [];
90
- const apps = appReferences ?? [];
91
- methodArgs.forEach((arg, i) => {
92
- const argType = method.args[i].type;
93
- if (argTypeIsReference(argType)) switch (argType) {
94
- case "account":
95
- if (typeof arg === "string" && arg !== sender.toString() && !accounts.some((a) => a.toString() === arg)) accounts.push(getAddress(arg));
96
- break;
97
- case "asset":
98
- if (typeof arg === "bigint" && !assets.includes(arg)) assets.push(arg);
99
- break;
100
- case "application":
101
- if (typeof arg === "bigint" && arg !== appId && !apps.includes(arg)) apps.push(arg);
102
- break;
103
- }
104
- });
88
+ function prepareArgsForEncoding(sender, appId, method, methodArgs, accountReferences, appReferences, assetReferences) {
89
+ const accounts = [...accountReferences ?? []];
90
+ const assets = [...assetReferences ?? []];
91
+ const apps = [...appReferences ?? []];
105
92
  return {
106
93
  accountReferences: accounts,
107
94
  appReferences: apps,
108
- assetReferences: assets
109
- };
110
- }
111
- /**
112
- * Calculate array index for ABI reference values
113
- */
114
- function calculateMethodArgReferenceArrayIndex(refValue, referenceType, sender, appId, accountReferences, appReferences, assetReferences) {
115
- switch (referenceType) {
116
- case "account":
117
- if (typeof refValue === "string") {
118
- if (refValue === sender.toString()) return 0;
119
- const index = accountReferences.findIndex((a) => a.toString() === refValue);
120
- if (index === -1) throw new Error(`Account ${refValue} not found in reference array`);
121
- return index + 1;
122
- }
123
- throw new Error("Account reference must be a string");
124
- case "asset":
125
- if (typeof refValue === "bigint") {
126
- const index = assetReferences.indexOf(refValue);
127
- if (index === -1) throw new Error(`Asset ${refValue} not found in reference array`);
128
- return index;
95
+ assetReferences: assets,
96
+ updatedArgs: methodArgs.map((arg, i) => {
97
+ const argType = method.args[i].type;
98
+ if (!argTypeIsReference(argType)) return arg;
99
+ switch (argType) {
100
+ case "account": {
101
+ let addr;
102
+ if (typeof arg === "string") addr = getAddress(arg);
103
+ else if (arg instanceof Uint8Array) addr = new Address(arg);
104
+ else throw new Error("Invalid value for account");
105
+ if (sender.equals(addr)) return 0;
106
+ const existing = accounts.findIndex((a) => a.equals(addr)) + 1;
107
+ if (existing) return existing;
108
+ accounts.push(addr);
109
+ return accounts.length;
110
+ }
111
+ case "asset": {
112
+ if (typeof arg !== "bigint") throw new Error("Invalid value for asset");
113
+ const existing = assets.findIndex((a) => a === arg);
114
+ if (existing === -1) {
115
+ assets.push(arg);
116
+ return assets.length - 1;
117
+ }
118
+ return existing;
119
+ }
120
+ case "application": {
121
+ if (typeof arg !== "bigint") throw new Error("Invalid value for application");
122
+ if (arg === appId) return 0;
123
+ const existing = apps.findIndex((a) => a === arg) + 1;
124
+ if (existing) return existing;
125
+ apps.push(arg);
126
+ return apps.length;
127
+ }
129
128
  }
130
- throw new Error("Asset reference must be a bigint");
131
- case "application":
132
- if (typeof refValue === "bigint") {
133
- if (refValue === appId) return 0;
134
- const index = appReferences.indexOf(refValue);
135
- if (index === -1) throw new Error(`Application ${refValue} not found in reference array`);
136
- return index + 1;
137
- }
138
- throw new Error("Application reference must be a bigint");
139
- default: throw new Error(`Unknown reference type: ${referenceType}`);
140
- }
129
+ })
130
+ };
141
131
  }
142
132
  /**
143
133
  * Encode ABI method arguments with tuple packing support
144
134
  * Ports the logic from the Rust encode_method_arguments function
145
135
  */
146
- function encodeMethodArguments(method, args, sender, appId, accountReferences, appReferences, assetReferences) {
136
+ function encodeMethodArguments(method, args) {
147
137
  const encodedArgs = new Array();
148
138
  encodedArgs.push(method.getSelector());
149
139
  const abiTypes = new Array();
@@ -153,10 +143,9 @@ function encodeMethodArguments(method, args, sender, appId, accountReferences, a
153
143
  const argValue = args[i];
154
144
  if (argTypeIsTransaction(methodArg.type)) {} else if (argTypeIsReference(methodArg.type)) {
155
145
  const referenceType = methodArg.type;
156
- if (typeof argValue === "string" || typeof argValue === "bigint") {
157
- const foreignIndex = calculateMethodArgReferenceArrayIndex(argValue, referenceType, sender, appId, accountReferences, appReferences, assetReferences);
146
+ if (typeof argValue === "number") {
158
147
  abiTypes.push(new ABIUintType(8));
159
- abiValues.push(foreignIndex);
148
+ abiValues.push(argValue);
160
149
  } else throw new Error(`Invalid reference value for ${referenceType}: ${argValue}`);
161
150
  } else if (argValue !== void 0) {
162
151
  abiTypes.push(methodArg.type);
@@ -198,12 +187,12 @@ function encodeArgsWithTuplePacking(abiTypes, abiValues) {
198
187
  return encodedArgs;
199
188
  }
200
189
  /**
201
- * Common method call building logic
190
+ * Builds encoded ABI method arguments and resolves reference arrays
202
191
  */
203
- function buildMethodCallCommon(params, commonData) {
204
- const { accountReferences, appReferences, assetReferences } = populateMethodArgsIntoReferenceArrays(commonData.sender, params.appId, params.method, params.args ?? [], params.accountReferences, params.appReferences, params.assetReferences);
192
+ function buildMethodCallArgsAndReferences(params) {
193
+ const { accountReferences, appReferences, assetReferences, updatedArgs } = prepareArgsForEncoding(params.sender, params.appId, params.method, params.args ?? [], params.accountReferences, params.appReferences, params.assetReferences);
205
194
  return {
206
- args: encodeMethodArguments(params.method, params.args, commonData.sender, params.appId, accountReferences, appReferences, assetReferences),
195
+ args: encodeMethodArguments(params.method, updatedArgs),
207
196
  accountReferences,
208
197
  appReferences,
209
198
  assetReferences
@@ -223,14 +212,15 @@ const buildAppCreateMethodCall = async (params, appManager, suggestedParams, def
223
212
  } : void 0;
224
213
  const extraProgramPages = params.extraProgramPages !== void 0 ? params.extraProgramPages : calculateExtraProgramPages(approvalProgram, clearStateProgram);
225
214
  const accountReferences = params.accountReferences?.map((a) => getAddress(a));
226
- const common = buildMethodCallCommon({
215
+ const argsAndReferences = buildMethodCallArgsAndReferences({
216
+ sender: commonData.sender,
227
217
  appId: 0n,
228
218
  method: params.method,
229
219
  args: params.args ?? [],
230
220
  accountReferences,
231
221
  appReferences: params.appReferences,
232
222
  assetReferences: params.assetReferences
233
- }, commonData);
223
+ });
234
224
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
235
225
  return new Transaction({
236
226
  ...commonData,
@@ -243,11 +233,11 @@ const buildAppCreateMethodCall = async (params, appManager, suggestedParams, def
243
233
  globalStateSchema,
244
234
  localStateSchema,
245
235
  extraProgramPages,
246
- args: common.args,
236
+ args: argsAndReferences.args,
247
237
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
248
- accountReferences: params.accountReferences?.map((a) => getAddress(a)),
249
- appReferences: params.appReferences,
250
- assetReferences: params.assetReferences,
238
+ accountReferences: argsAndReferences.accountReferences,
239
+ appReferences: argsAndReferences.appReferences,
240
+ assetReferences: argsAndReferences.assetReferences,
251
241
  boxReferences: params.boxReferences?.map(AppManager.getBoxReference)
252
242
  },
253
243
  rejectVersion: params.rejectVersion
@@ -259,14 +249,15 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
259
249
  const approvalProgram = typeof params.approvalProgram === "string" ? (await appManager.compileTeal(params.approvalProgram)).compiledBase64ToBytes : params.approvalProgram;
260
250
  const clearStateProgram = typeof params.clearStateProgram === "string" ? (await appManager.compileTeal(params.clearStateProgram)).compiledBase64ToBytes : params.clearStateProgram;
261
251
  const accountReferences = params.accountReferences?.map((a) => getAddress(a));
262
- const common = buildMethodCallCommon({
252
+ const argsAndReferences = buildMethodCallArgsAndReferences({
253
+ sender: commonData.sender,
263
254
  appId: params.appId,
264
255
  method: params.method,
265
256
  args: params.args ?? [],
266
257
  accountReferences,
267
258
  appReferences: params.appReferences,
268
259
  assetReferences: params.assetReferences
269
- }, commonData);
260
+ });
270
261
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
271
262
  return new Transaction({
272
263
  ...commonData,
@@ -276,11 +267,11 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
276
267
  onComplete: OnApplicationComplete.UpdateApplication,
277
268
  approvalProgram,
278
269
  clearStateProgram,
279
- args: common.args,
270
+ args: argsAndReferences.args,
280
271
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
281
- accountReferences: params.accountReferences?.map((a) => getAddress(a)),
282
- appReferences: params.appReferences,
283
- assetReferences: params.assetReferences,
272
+ accountReferences: argsAndReferences.accountReferences,
273
+ appReferences: argsAndReferences.appReferences,
274
+ assetReferences: argsAndReferences.assetReferences,
284
275
  boxReferences: params.boxReferences?.map(AppManager.getBoxReference)
285
276
  },
286
277
  rejectVersion: params.rejectVersion
@@ -290,14 +281,15 @@ const buildAppUpdateMethodCall = async (params, appManager, suggestedParams, def
290
281
  const buildAppCallMethodCall = async (params, suggestedParams, defaultValidityWindow) => {
291
282
  const commonData = buildTransactionCommonData(params, suggestedParams, defaultValidityWindow);
292
283
  const accountReferences = params.accountReferences?.map((a) => getAddress(a));
293
- const common = buildMethodCallCommon({
284
+ const argsAndReferences = buildMethodCallArgsAndReferences({
285
+ sender: commonData.sender,
294
286
  appId: params.appId,
295
287
  method: params.method,
296
288
  args: params.args ?? [],
297
289
  accountReferences,
298
290
  appReferences: params.appReferences,
299
291
  assetReferences: params.assetReferences
300
- }, commonData);
292
+ });
301
293
  const hasAccessReferences = params.accessReferences && params.accessReferences.length > 0;
302
294
  return new Transaction({
303
295
  ...commonData,
@@ -305,11 +297,11 @@ const buildAppCallMethodCall = async (params, suggestedParams, defaultValidityWi
305
297
  appCall: {
306
298
  appId: params.appId,
307
299
  onComplete: params.onComplete ?? OnApplicationComplete.NoOp,
308
- args: common.args,
300
+ args: argsAndReferences.args,
309
301
  ...hasAccessReferences ? { accessReferences: params.accessReferences } : {
310
- accountReferences: params.accountReferences?.map((a) => getAddress(a)),
311
- appReferences: params.appReferences,
312
- assetReferences: params.assetReferences,
302
+ accountReferences: argsAndReferences.accountReferences,
303
+ appReferences: argsAndReferences.appReferences,
304
+ assetReferences: argsAndReferences.assetReferences,
313
305
  boxReferences: params.boxReferences?.map(AppManager.getBoxReference)
314
306
  },
315
307
  rejectVersion: params.rejectVersion