algosdk 2.9.0 → 3.0.0-beta.1

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 (805) hide show
  1. package/README.md +8 -4
  2. package/dist/browser/algosdk.min.js +1 -1
  3. package/dist/browser/algosdk.min.js.LICENSE.txt +0 -9
  4. package/dist/browser/algosdk.min.js.map +1 -1
  5. package/dist/cjs/abi/abi_type.js +34 -27
  6. package/dist/cjs/abi/abi_type.js.map +1 -1
  7. package/dist/cjs/abi/contract.js +3 -3
  8. package/dist/cjs/abi/contract.js.map +1 -1
  9. package/dist/cjs/abi/index.js +6 -6
  10. package/dist/cjs/abi/index.js.map +1 -1
  11. package/dist/cjs/abi/interface.js +3 -3
  12. package/dist/cjs/abi/interface.js.map +1 -1
  13. package/dist/cjs/abi/method.js +10 -10
  14. package/dist/cjs/abi/method.js.map +1 -1
  15. package/dist/cjs/abi/reference.js +1 -1
  16. package/dist/cjs/abi/reference.js.map +1 -1
  17. package/dist/cjs/abi/transaction.js +2 -2
  18. package/dist/cjs/abi/transaction.js.map +1 -1
  19. package/dist/cjs/account.js +4 -4
  20. package/dist/cjs/account.js.map +1 -1
  21. package/dist/cjs/boxStorage.js +17 -17
  22. package/dist/cjs/boxStorage.js.map +1 -1
  23. package/dist/cjs/client/client.js +77 -41
  24. package/dist/cjs/client/client.js.map +1 -1
  25. package/dist/cjs/client/index.js +29 -0
  26. package/dist/cjs/client/index.js.map +1 -0
  27. package/dist/cjs/client/kmd.js +69 -86
  28. package/dist/cjs/client/kmd.js.map +1 -1
  29. package/dist/cjs/client/urlTokenBaseHTTPClient.js +16 -11
  30. package/dist/cjs/client/urlTokenBaseHTTPClient.js.map +1 -1
  31. package/dist/cjs/client/v2/algod/accountApplicationInformation.js +11 -7
  32. package/dist/cjs/client/v2/algod/accountApplicationInformation.js.map +1 -1
  33. package/dist/cjs/client/v2/algod/accountAssetInformation.js +11 -7
  34. package/dist/cjs/client/v2/algod/accountAssetInformation.js.map +1 -1
  35. package/dist/cjs/client/v2/algod/accountInformation.js +11 -6
  36. package/dist/cjs/client/v2/algod/accountInformation.js.map +1 -1
  37. package/dist/cjs/client/v2/algod/algod.js +85 -83
  38. package/dist/cjs/client/v2/algod/algod.js.map +1 -1
  39. package/dist/cjs/client/v2/algod/block.js +6 -33
  40. package/dist/cjs/client/v2/algod/block.js.map +1 -1
  41. package/dist/cjs/client/v2/algod/compile.js +17 -11
  42. package/dist/cjs/client/v2/algod/compile.js.map +1 -1
  43. package/dist/cjs/client/v2/algod/disassemble.js +17 -11
  44. package/dist/cjs/client/v2/algod/disassemble.js.map +1 -1
  45. package/dist/cjs/client/v2/algod/dryrun.js +18 -37
  46. package/dist/cjs/client/v2/algod/dryrun.js.map +1 -1
  47. package/dist/cjs/client/v2/algod/genesis.js +6 -2
  48. package/dist/cjs/client/v2/algod/genesis.js.map +1 -1
  49. package/dist/cjs/client/v2/algod/getApplicationBoxByName.js +10 -10
  50. package/dist/cjs/client/v2/algod/getApplicationBoxByName.js.map +1 -1
  51. package/dist/cjs/client/v2/algod/getApplicationBoxes.js +8 -8
  52. package/dist/cjs/client/v2/algod/getApplicationBoxes.js.map +1 -1
  53. package/dist/cjs/client/v2/algod/getApplicationByID.js +10 -5
  54. package/dist/cjs/client/v2/algod/getApplicationByID.js.map +1 -1
  55. package/dist/cjs/client/v2/algod/getAssetByID.js +10 -5
  56. package/dist/cjs/client/v2/algod/getAssetByID.js.map +1 -1
  57. package/dist/cjs/client/v2/algod/getBlockHash.js +10 -6
  58. package/dist/cjs/client/v2/algod/getBlockHash.js.map +1 -1
  59. package/dist/cjs/client/v2/algod/getBlockOffsetTimestamp.js +6 -5
  60. package/dist/cjs/client/v2/algod/getBlockOffsetTimestamp.js.map +1 -1
  61. package/dist/cjs/client/v2/algod/getBlockTxids.js +10 -4
  62. package/dist/cjs/client/v2/algod/getBlockTxids.js.map +1 -1
  63. package/dist/cjs/client/v2/algod/getLedgerStateDelta.js +11 -6
  64. package/dist/cjs/client/v2/algod/getLedgerStateDelta.js.map +1 -1
  65. package/dist/cjs/client/v2/algod/getLedgerStateDeltaForTransactionGroup.js +11 -6
  66. package/dist/cjs/client/v2/algod/getLedgerStateDeltaForTransactionGroup.js.map +1 -1
  67. package/dist/cjs/client/v2/algod/getSyncRound.js +6 -5
  68. package/dist/cjs/client/v2/algod/getSyncRound.js.map +1 -1
  69. package/dist/cjs/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.js +9 -9
  70. package/dist/cjs/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.js.map +1 -1
  71. package/dist/cjs/client/v2/algod/getTransactionProof.js +10 -6
  72. package/dist/cjs/client/v2/algod/getTransactionProof.js.map +1 -1
  73. package/dist/cjs/client/v2/algod/healthCheck.js +4 -9
  74. package/dist/cjs/client/v2/algod/healthCheck.js.map +1 -1
  75. package/dist/cjs/{types → client/v2/algod}/index.js +5 -3
  76. package/dist/cjs/client/v2/algod/index.js.map +1 -0
  77. package/dist/cjs/client/v2/algod/lightBlockHeaderProof.js +10 -5
  78. package/dist/cjs/client/v2/algod/lightBlockHeaderProof.js.map +1 -1
  79. package/dist/cjs/client/v2/algod/models/types.js +3701 -1828
  80. package/dist/cjs/client/v2/algod/models/types.js.map +1 -1
  81. package/dist/cjs/client/v2/algod/pendingTransactionInformation.js +6 -32
  82. package/dist/cjs/client/v2/algod/pendingTransactionInformation.js.map +1 -1
  83. package/dist/cjs/client/v2/algod/pendingTransactions.js +6 -31
  84. package/dist/cjs/client/v2/algod/pendingTransactions.js.map +1 -1
  85. package/dist/cjs/client/v2/algod/pendingTransactionsByAddress.js +7 -33
  86. package/dist/cjs/client/v2/algod/pendingTransactionsByAddress.js.map +1 -1
  87. package/dist/cjs/client/v2/algod/ready.js +4 -2
  88. package/dist/cjs/client/v2/algod/ready.js.map +1 -1
  89. package/dist/cjs/client/v2/algod/sendRawTransaction.js +17 -8
  90. package/dist/cjs/client/v2/algod/sendRawTransaction.js.map +1 -1
  91. package/dist/cjs/client/v2/algod/setBlockOffsetTimestamp.js +13 -8
  92. package/dist/cjs/client/v2/algod/setBlockOffsetTimestamp.js.map +1 -1
  93. package/dist/cjs/client/v2/algod/setSyncRound.js +13 -8
  94. package/dist/cjs/client/v2/algod/setSyncRound.js.map +1 -1
  95. package/dist/cjs/client/v2/algod/simulateTransaction.js +15 -35
  96. package/dist/cjs/client/v2/algod/simulateTransaction.js.map +1 -1
  97. package/dist/cjs/client/v2/algod/stateproof.js +10 -5
  98. package/dist/cjs/client/v2/algod/stateproof.js.map +1 -1
  99. package/dist/cjs/client/v2/algod/status.js +8 -2
  100. package/dist/cjs/client/v2/algod/status.js.map +1 -1
  101. package/dist/cjs/client/v2/algod/statusAfterBlock.js +10 -5
  102. package/dist/cjs/client/v2/algod/statusAfterBlock.js.map +1 -1
  103. package/dist/cjs/client/v2/algod/suggestedParams.js +13 -9
  104. package/dist/cjs/client/v2/algod/suggestedParams.js.map +1 -1
  105. package/dist/cjs/client/v2/algod/supply.js +8 -2
  106. package/dist/cjs/client/v2/algod/supply.js.map +1 -1
  107. package/dist/cjs/client/v2/algod/unsetSyncRound.js +11 -5
  108. package/dist/cjs/client/v2/algod/unsetSyncRound.js.map +1 -1
  109. package/dist/cjs/client/v2/algod/versions.js +8 -2
  110. package/dist/cjs/client/v2/algod/versions.js.map +1 -1
  111. package/dist/cjs/client/v2/indexer/index.js +22 -0
  112. package/dist/cjs/client/v2/indexer/index.js.map +1 -0
  113. package/dist/cjs/client/v2/indexer/indexer.js +44 -43
  114. package/dist/cjs/client/v2/indexer/indexer.js.map +1 -1
  115. package/dist/cjs/client/v2/indexer/lookupAccountAppLocalStates.js +11 -6
  116. package/dist/cjs/client/v2/indexer/lookupAccountAppLocalStates.js.map +1 -1
  117. package/dist/cjs/client/v2/indexer/lookupAccountAssets.js +11 -6
  118. package/dist/cjs/client/v2/indexer/lookupAccountAssets.js.map +1 -1
  119. package/dist/cjs/client/v2/indexer/lookupAccountByID.js +11 -6
  120. package/dist/cjs/client/v2/indexer/lookupAccountByID.js.map +1 -1
  121. package/dist/cjs/client/v2/indexer/lookupAccountCreatedApplications.js +11 -6
  122. package/dist/cjs/client/v2/indexer/lookupAccountCreatedApplications.js.map +1 -1
  123. package/dist/cjs/client/v2/indexer/lookupAccountCreatedAssets.js +11 -6
  124. package/dist/cjs/client/v2/indexer/lookupAccountCreatedAssets.js.map +1 -1
  125. package/dist/cjs/client/v2/indexer/lookupAccountTransactions.js +19 -12
  126. package/dist/cjs/client/v2/indexer/lookupAccountTransactions.js.map +1 -1
  127. package/dist/cjs/client/v2/indexer/lookupApplicationBoxByIDandName.js +10 -10
  128. package/dist/cjs/client/v2/indexer/lookupApplicationBoxByIDandName.js.map +1 -1
  129. package/dist/cjs/client/v2/indexer/lookupApplicationLogs.js +10 -5
  130. package/dist/cjs/client/v2/indexer/lookupApplicationLogs.js.map +1 -1
  131. package/dist/cjs/client/v2/indexer/lookupApplications.js +10 -5
  132. package/dist/cjs/client/v2/indexer/lookupApplications.js.map +1 -1
  133. package/dist/cjs/client/v2/indexer/lookupAssetBalances.js +10 -5
  134. package/dist/cjs/client/v2/indexer/lookupAssetBalances.js.map +1 -1
  135. package/dist/cjs/client/v2/indexer/lookupAssetByID.js +10 -5
  136. package/dist/cjs/client/v2/indexer/lookupAssetByID.js.map +1 -1
  137. package/dist/cjs/client/v2/indexer/lookupAssetTransactions.js +19 -12
  138. package/dist/cjs/client/v2/indexer/lookupAssetTransactions.js.map +1 -1
  139. package/dist/cjs/client/v2/indexer/lookupBlock.js +10 -5
  140. package/dist/cjs/client/v2/indexer/lookupBlock.js.map +1 -1
  141. package/dist/cjs/client/v2/indexer/lookupTransactionByID.js +10 -5
  142. package/dist/cjs/client/v2/indexer/lookupTransactionByID.js.map +1 -1
  143. package/dist/cjs/client/v2/indexer/makeHealthCheck.js +8 -2
  144. package/dist/cjs/client/v2/indexer/makeHealthCheck.js.map +1 -1
  145. package/dist/cjs/client/v2/indexer/models/types.js +3591 -1651
  146. package/dist/cjs/client/v2/indexer/models/types.js.map +1 -1
  147. package/dist/cjs/client/v2/indexer/searchAccounts.js +9 -3
  148. package/dist/cjs/client/v2/indexer/searchAccounts.js.map +1 -1
  149. package/dist/cjs/client/v2/indexer/searchForApplicationBoxes.js +8 -8
  150. package/dist/cjs/client/v2/indexer/searchForApplicationBoxes.js.map +1 -1
  151. package/dist/cjs/client/v2/indexer/searchForApplications.js +9 -3
  152. package/dist/cjs/client/v2/indexer/searchForApplications.js.map +1 -1
  153. package/dist/cjs/client/v2/indexer/searchForAssets.js +9 -3
  154. package/dist/cjs/client/v2/indexer/searchForAssets.js.map +1 -1
  155. package/dist/cjs/client/v2/indexer/searchForTransactions.js +17 -9
  156. package/dist/cjs/client/v2/indexer/searchForTransactions.js.map +1 -1
  157. package/dist/cjs/client/v2/jsonrequest.js +22 -54
  158. package/dist/cjs/client/v2/jsonrequest.js.map +1 -1
  159. package/dist/cjs/client/v2/serviceClient.js +5 -25
  160. package/dist/cjs/client/v2/serviceClient.js.map +1 -1
  161. package/dist/cjs/client/v2/untypedmodel.js +22 -0
  162. package/dist/cjs/client/v2/untypedmodel.js.map +1 -0
  163. package/dist/cjs/composer.js +64 -58
  164. package/dist/cjs/composer.js.map +1 -1
  165. package/dist/cjs/convert.js.map +1 -1
  166. package/dist/cjs/dryrun.js +107 -203
  167. package/dist/cjs/dryrun.js.map +1 -1
  168. package/dist/cjs/encoding/address.js +88 -104
  169. package/dist/cjs/encoding/address.js.map +1 -1
  170. package/dist/cjs/encoding/bigint.js +2 -3
  171. package/dist/cjs/encoding/bigint.js.map +1 -1
  172. package/dist/cjs/encoding/binarydata.js +82 -0
  173. package/dist/cjs/encoding/binarydata.js.map +1 -0
  174. package/dist/cjs/encoding/encoding.js +353 -38
  175. package/dist/cjs/encoding/encoding.js.map +1 -1
  176. package/dist/cjs/encoding/schema/address.js +41 -0
  177. package/dist/cjs/encoding/schema/address.js.map +1 -0
  178. package/dist/cjs/encoding/schema/array.js +43 -0
  179. package/dist/cjs/encoding/schema/array.js.map +1 -0
  180. package/dist/cjs/encoding/schema/binarystring.js +55 -0
  181. package/dist/cjs/encoding/schema/binarystring.js.map +1 -0
  182. package/dist/cjs/encoding/schema/blockhash.js +67 -0
  183. package/dist/cjs/encoding/schema/blockhash.js.map +1 -0
  184. package/dist/cjs/encoding/schema/boolean.js +42 -0
  185. package/dist/cjs/encoding/schema/boolean.js.map +1 -0
  186. package/dist/cjs/encoding/schema/bytearray.js +98 -0
  187. package/dist/cjs/encoding/schema/bytearray.js.map +1 -0
  188. package/dist/cjs/encoding/schema/index.js +34 -0
  189. package/dist/cjs/encoding/schema/index.js.map +1 -0
  190. package/dist/cjs/encoding/schema/map.js +528 -0
  191. package/dist/cjs/encoding/schema/map.js.map +1 -0
  192. package/dist/cjs/encoding/schema/optional.js +58 -0
  193. package/dist/cjs/encoding/schema/optional.js.map +1 -0
  194. package/dist/cjs/encoding/schema/string.js +43 -0
  195. package/dist/cjs/encoding/schema/string.js.map +1 -0
  196. package/dist/cjs/encoding/schema/uint64.js +36 -0
  197. package/dist/cjs/encoding/schema/uint64.js.map +1 -0
  198. package/dist/cjs/encoding/schema/untyped.js +33 -0
  199. package/dist/cjs/encoding/schema/untyped.js.map +1 -0
  200. package/dist/cjs/encoding/uint64.js +2 -2
  201. package/dist/cjs/encoding/uint64.js.map +1 -1
  202. package/dist/cjs/group.js +23 -60
  203. package/dist/cjs/group.js.map +1 -1
  204. package/dist/cjs/index.js +2 -2
  205. package/dist/cjs/index.js.map +1 -1
  206. package/dist/cjs/logic/sourcemap.js +56 -25
  207. package/dist/cjs/logic/sourcemap.js.map +1 -1
  208. package/dist/cjs/logicsig.js +113 -146
  209. package/dist/cjs/logicsig.js.map +1 -1
  210. package/dist/cjs/main.js +113 -122
  211. package/dist/cjs/main.js.map +1 -1
  212. package/dist/cjs/makeTxn.js +310 -570
  213. package/dist/cjs/makeTxn.js.map +1 -1
  214. package/dist/cjs/mnemonic/mnemonic.js +8 -8
  215. package/dist/cjs/mnemonic/mnemonic.js.map +1 -1
  216. package/dist/cjs/multisig.js +60 -312
  217. package/dist/cjs/multisig.js.map +1 -1
  218. package/dist/cjs/multisigSigning.js +285 -0
  219. package/dist/cjs/multisigSigning.js.map +1 -0
  220. package/dist/cjs/nacl/naclWrappers.js +2 -2
  221. package/dist/cjs/nacl/naclWrappers.js.map +1 -1
  222. package/dist/cjs/signedTransaction.js +106 -0
  223. package/dist/cjs/signedTransaction.js.map +1 -0
  224. package/dist/cjs/signer.js +7 -7
  225. package/dist/cjs/signer.js.map +1 -1
  226. package/dist/cjs/signing.js +105 -0
  227. package/dist/cjs/signing.js.map +1 -0
  228. package/dist/cjs/stateproof.js +421 -0
  229. package/dist/cjs/stateproof.js.map +1 -0
  230. package/dist/cjs/transaction.js +724 -1009
  231. package/dist/cjs/transaction.js.map +1 -1
  232. package/dist/cjs/types/block.js +813 -0
  233. package/dist/cjs/types/block.js.map +1 -0
  234. package/dist/cjs/types/intDecoding.js +1 -1
  235. package/dist/cjs/types/intDecoding.js.map +1 -1
  236. package/dist/cjs/types/statedelta.js +1155 -0
  237. package/dist/cjs/types/statedelta.js.map +1 -0
  238. package/dist/cjs/types/transactions/base.js +22 -5
  239. package/dist/cjs/types/transactions/base.js.map +1 -1
  240. package/dist/cjs/types/transactions/encoded.js +67 -0
  241. package/dist/cjs/types/transactions/encoded.js.map +1 -1
  242. package/dist/cjs/types/transactions/index.js +2 -5
  243. package/dist/cjs/types/transactions/index.js.map +1 -1
  244. package/dist/cjs/utils/utils.js +86 -22
  245. package/dist/cjs/utils/utils.js.map +1 -1
  246. package/dist/cjs/wait.js +4 -4
  247. package/dist/cjs/wait.js.map +1 -1
  248. package/dist/esm/abi/abi_type.js +22 -15
  249. package/dist/esm/abi/abi_type.js.map +1 -1
  250. package/dist/esm/abi/contract.js +1 -1
  251. package/dist/esm/abi/contract.js.map +1 -1
  252. package/dist/esm/abi/index.js +6 -6
  253. package/dist/esm/abi/index.js.map +1 -1
  254. package/dist/esm/abi/interface.js +1 -1
  255. package/dist/esm/abi/interface.js.map +1 -1
  256. package/dist/esm/abi/method.js +4 -4
  257. package/dist/esm/abi/method.js.map +1 -1
  258. package/dist/esm/abi/transaction.js +1 -1
  259. package/dist/esm/abi/transaction.js.map +1 -1
  260. package/dist/esm/account.js +4 -4
  261. package/dist/esm/account.js.map +1 -1
  262. package/dist/esm/boxStorage.js +15 -15
  263. package/dist/esm/boxStorage.js.map +1 -1
  264. package/dist/esm/client/client.js +74 -40
  265. package/dist/esm/client/client.js.map +1 -1
  266. package/dist/esm/client/index.js +7 -0
  267. package/dist/esm/client/index.js.map +1 -0
  268. package/dist/esm/client/kmd.js +67 -62
  269. package/dist/esm/client/kmd.js.map +1 -1
  270. package/dist/esm/client/urlTokenBaseHTTPClient.js +16 -11
  271. package/dist/esm/client/urlTokenBaseHTTPClient.js.map +1 -1
  272. package/dist/esm/client/v2/algod/accountApplicationInformation.js +10 -6
  273. package/dist/esm/client/v2/algod/accountApplicationInformation.js.map +1 -1
  274. package/dist/esm/client/v2/algod/accountAssetInformation.js +10 -6
  275. package/dist/esm/client/v2/algod/accountAssetInformation.js.map +1 -1
  276. package/dist/esm/client/v2/algod/accountInformation.js +10 -5
  277. package/dist/esm/client/v2/algod/accountInformation.js.map +1 -1
  278. package/dist/esm/client/v2/algod/algod.js +71 -70
  279. package/dist/esm/client/v2/algod/algod.js.map +1 -1
  280. package/dist/esm/client/v2/algod/block.js +5 -9
  281. package/dist/esm/client/v2/algod/block.js.map +1 -1
  282. package/dist/esm/client/v2/algod/compile.js +16 -10
  283. package/dist/esm/client/v2/algod/compile.js.map +1 -1
  284. package/dist/esm/client/v2/algod/disassemble.js +16 -10
  285. package/dist/esm/client/v2/algod/disassemble.js.map +1 -1
  286. package/dist/esm/client/v2/algod/dryrun.js +16 -12
  287. package/dist/esm/client/v2/algod/dryrun.js.map +1 -1
  288. package/dist/esm/client/v2/algod/genesis.js +5 -1
  289. package/dist/esm/client/v2/algod/genesis.js.map +1 -1
  290. package/dist/esm/client/v2/algod/getApplicationBoxByName.js +9 -9
  291. package/dist/esm/client/v2/algod/getApplicationBoxByName.js.map +1 -1
  292. package/dist/esm/client/v2/algod/getApplicationBoxes.js +7 -7
  293. package/dist/esm/client/v2/algod/getApplicationBoxes.js.map +1 -1
  294. package/dist/esm/client/v2/algod/getApplicationByID.js +9 -4
  295. package/dist/esm/client/v2/algod/getApplicationByID.js.map +1 -1
  296. package/dist/esm/client/v2/algod/getAssetByID.js +9 -4
  297. package/dist/esm/client/v2/algod/getAssetByID.js.map +1 -1
  298. package/dist/esm/client/v2/algod/getBlockHash.js +9 -5
  299. package/dist/esm/client/v2/algod/getBlockHash.js.map +1 -1
  300. package/dist/esm/client/v2/algod/getBlockOffsetTimestamp.js +5 -4
  301. package/dist/esm/client/v2/algod/getBlockOffsetTimestamp.js.map +1 -1
  302. package/dist/esm/client/v2/algod/getBlockTxids.js +9 -3
  303. package/dist/esm/client/v2/algod/getBlockTxids.js.map +1 -1
  304. package/dist/esm/client/v2/algod/getLedgerStateDelta.js +10 -5
  305. package/dist/esm/client/v2/algod/getLedgerStateDelta.js.map +1 -1
  306. package/dist/esm/client/v2/algod/getLedgerStateDeltaForTransactionGroup.js +10 -5
  307. package/dist/esm/client/v2/algod/getLedgerStateDeltaForTransactionGroup.js.map +1 -1
  308. package/dist/esm/client/v2/algod/getSyncRound.js +5 -4
  309. package/dist/esm/client/v2/algod/getSyncRound.js.map +1 -1
  310. package/dist/esm/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.js +8 -8
  311. package/dist/esm/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.js.map +1 -1
  312. package/dist/esm/client/v2/algod/getTransactionProof.js +9 -5
  313. package/dist/esm/client/v2/algod/getTransactionProof.js.map +1 -1
  314. package/dist/esm/client/v2/algod/healthCheck.js +3 -8
  315. package/dist/esm/client/v2/algod/healthCheck.js.map +1 -1
  316. package/dist/esm/client/v2/algod/index.js +4 -0
  317. package/dist/esm/client/v2/algod/index.js.map +1 -0
  318. package/dist/esm/client/v2/algod/lightBlockHeaderProof.js +9 -4
  319. package/dist/esm/client/v2/algod/lightBlockHeaderProof.js.map +1 -1
  320. package/dist/esm/client/v2/algod/models/types.js +3701 -1825
  321. package/dist/esm/client/v2/algod/models/types.js.map +1 -1
  322. package/dist/esm/client/v2/algod/pendingTransactionInformation.js +5 -8
  323. package/dist/esm/client/v2/algod/pendingTransactionInformation.js.map +1 -1
  324. package/dist/esm/client/v2/algod/pendingTransactions.js +5 -7
  325. package/dist/esm/client/v2/algod/pendingTransactions.js.map +1 -1
  326. package/dist/esm/client/v2/algod/pendingTransactionsByAddress.js +6 -9
  327. package/dist/esm/client/v2/algod/pendingTransactionsByAddress.js.map +1 -1
  328. package/dist/esm/client/v2/algod/ready.js +3 -1
  329. package/dist/esm/client/v2/algod/ready.js.map +1 -1
  330. package/dist/esm/client/v2/algod/sendRawTransaction.js +15 -6
  331. package/dist/esm/client/v2/algod/sendRawTransaction.js.map +1 -1
  332. package/dist/esm/client/v2/algod/setBlockOffsetTimestamp.js +12 -7
  333. package/dist/esm/client/v2/algod/setBlockOffsetTimestamp.js.map +1 -1
  334. package/dist/esm/client/v2/algod/setSyncRound.js +12 -7
  335. package/dist/esm/client/v2/algod/setSyncRound.js.map +1 -1
  336. package/dist/esm/client/v2/algod/simulateTransaction.js +14 -11
  337. package/dist/esm/client/v2/algod/simulateTransaction.js.map +1 -1
  338. package/dist/esm/client/v2/algod/stateproof.js +9 -4
  339. package/dist/esm/client/v2/algod/stateproof.js.map +1 -1
  340. package/dist/esm/client/v2/algod/status.js +7 -1
  341. package/dist/esm/client/v2/algod/status.js.map +1 -1
  342. package/dist/esm/client/v2/algod/statusAfterBlock.js +9 -4
  343. package/dist/esm/client/v2/algod/statusAfterBlock.js.map +1 -1
  344. package/dist/esm/client/v2/algod/suggestedParams.js +12 -8
  345. package/dist/esm/client/v2/algod/suggestedParams.js.map +1 -1
  346. package/dist/esm/client/v2/algod/supply.js +7 -1
  347. package/dist/esm/client/v2/algod/supply.js.map +1 -1
  348. package/dist/esm/client/v2/algod/unsetSyncRound.js +10 -4
  349. package/dist/esm/client/v2/algod/unsetSyncRound.js.map +1 -1
  350. package/dist/esm/client/v2/algod/versions.js +7 -1
  351. package/dist/esm/client/v2/algod/versions.js.map +1 -1
  352. package/dist/esm/client/v2/indexer/index.js +4 -0
  353. package/dist/esm/client/v2/indexer/index.js.map +1 -0
  354. package/dist/esm/client/v2/indexer/indexer.js +42 -42
  355. package/dist/esm/client/v2/indexer/indexer.js.map +1 -1
  356. package/dist/esm/client/v2/indexer/lookupAccountAppLocalStates.js +10 -5
  357. package/dist/esm/client/v2/indexer/lookupAccountAppLocalStates.js.map +1 -1
  358. package/dist/esm/client/v2/indexer/lookupAccountAssets.js +10 -5
  359. package/dist/esm/client/v2/indexer/lookupAccountAssets.js.map +1 -1
  360. package/dist/esm/client/v2/indexer/lookupAccountByID.js +10 -5
  361. package/dist/esm/client/v2/indexer/lookupAccountByID.js.map +1 -1
  362. package/dist/esm/client/v2/indexer/lookupAccountCreatedApplications.js +10 -5
  363. package/dist/esm/client/v2/indexer/lookupAccountCreatedApplications.js.map +1 -1
  364. package/dist/esm/client/v2/indexer/lookupAccountCreatedAssets.js +10 -5
  365. package/dist/esm/client/v2/indexer/lookupAccountCreatedAssets.js.map +1 -1
  366. package/dist/esm/client/v2/indexer/lookupAccountTransactions.js +18 -11
  367. package/dist/esm/client/v2/indexer/lookupAccountTransactions.js.map +1 -1
  368. package/dist/esm/client/v2/indexer/lookupApplicationBoxByIDandName.js +9 -9
  369. package/dist/esm/client/v2/indexer/lookupApplicationBoxByIDandName.js.map +1 -1
  370. package/dist/esm/client/v2/indexer/lookupApplicationLogs.js +9 -4
  371. package/dist/esm/client/v2/indexer/lookupApplicationLogs.js.map +1 -1
  372. package/dist/esm/client/v2/indexer/lookupApplications.js +9 -4
  373. package/dist/esm/client/v2/indexer/lookupApplications.js.map +1 -1
  374. package/dist/esm/client/v2/indexer/lookupAssetBalances.js +9 -4
  375. package/dist/esm/client/v2/indexer/lookupAssetBalances.js.map +1 -1
  376. package/dist/esm/client/v2/indexer/lookupAssetByID.js +9 -4
  377. package/dist/esm/client/v2/indexer/lookupAssetByID.js.map +1 -1
  378. package/dist/esm/client/v2/indexer/lookupAssetTransactions.js +17 -10
  379. package/dist/esm/client/v2/indexer/lookupAssetTransactions.js.map +1 -1
  380. package/dist/esm/client/v2/indexer/lookupBlock.js +9 -4
  381. package/dist/esm/client/v2/indexer/lookupBlock.js.map +1 -1
  382. package/dist/esm/client/v2/indexer/lookupTransactionByID.js +9 -4
  383. package/dist/esm/client/v2/indexer/lookupTransactionByID.js.map +1 -1
  384. package/dist/esm/client/v2/indexer/makeHealthCheck.js +7 -1
  385. package/dist/esm/client/v2/indexer/makeHealthCheck.js.map +1 -1
  386. package/dist/esm/client/v2/indexer/models/types.js +3591 -1648
  387. package/dist/esm/client/v2/indexer/models/types.js.map +1 -1
  388. package/dist/esm/client/v2/indexer/searchAccounts.js +8 -2
  389. package/dist/esm/client/v2/indexer/searchAccounts.js.map +1 -1
  390. package/dist/esm/client/v2/indexer/searchForApplicationBoxes.js +7 -7
  391. package/dist/esm/client/v2/indexer/searchForApplicationBoxes.js.map +1 -1
  392. package/dist/esm/client/v2/indexer/searchForApplications.js +8 -2
  393. package/dist/esm/client/v2/indexer/searchForApplications.js.map +1 -1
  394. package/dist/esm/client/v2/indexer/searchForAssets.js +8 -2
  395. package/dist/esm/client/v2/indexer/searchForAssets.js.map +1 -1
  396. package/dist/esm/client/v2/indexer/searchForTransactions.js +15 -7
  397. package/dist/esm/client/v2/indexer/searchForTransactions.js.map +1 -1
  398. package/dist/esm/client/v2/jsonrequest.js +22 -51
  399. package/dist/esm/client/v2/jsonrequest.js.map +1 -1
  400. package/dist/esm/client/v2/serviceClient.js +3 -20
  401. package/dist/esm/client/v2/serviceClient.js.map +1 -1
  402. package/dist/esm/client/v2/untypedmodel.js +18 -0
  403. package/dist/esm/client/v2/untypedmodel.js.map +1 -0
  404. package/dist/esm/composer.js +43 -37
  405. package/dist/esm/composer.js.map +1 -1
  406. package/dist/esm/convert.js.map +1 -1
  407. package/dist/esm/dryrun.js +98 -195
  408. package/dist/esm/dryrun.js.map +1 -1
  409. package/dist/esm/encoding/address.js +85 -100
  410. package/dist/esm/encoding/address.js.map +1 -1
  411. package/dist/esm/encoding/bigint.js +2 -3
  412. package/dist/esm/encoding/bigint.js.map +1 -1
  413. package/dist/esm/encoding/binarydata.js +73 -0
  414. package/dist/esm/encoding/binarydata.js.map +1 -0
  415. package/dist/esm/encoding/encoding.js +337 -12
  416. package/dist/esm/encoding/encoding.js.map +1 -1
  417. package/dist/esm/encoding/schema/address.js +37 -0
  418. package/dist/esm/encoding/schema/address.js.map +1 -0
  419. package/dist/esm/encoding/schema/array.js +39 -0
  420. package/dist/esm/encoding/schema/array.js.map +1 -0
  421. package/dist/esm/encoding/schema/binarystring.js +51 -0
  422. package/dist/esm/encoding/schema/binarystring.js.map +1 -0
  423. package/dist/esm/encoding/schema/blockhash.js +60 -0
  424. package/dist/esm/encoding/schema/blockhash.js.map +1 -0
  425. package/dist/esm/encoding/schema/boolean.js +38 -0
  426. package/dist/esm/encoding/schema/boolean.js.map +1 -0
  427. package/dist/esm/encoding/schema/bytearray.js +93 -0
  428. package/dist/esm/encoding/schema/bytearray.js.map +1 -0
  429. package/dist/esm/encoding/schema/index.js +12 -0
  430. package/dist/esm/encoding/schema/index.js.map +1 -0
  431. package/dist/esm/encoding/schema/map.js +517 -0
  432. package/dist/esm/encoding/schema/map.js.map +1 -0
  433. package/dist/esm/encoding/schema/optional.js +54 -0
  434. package/dist/esm/encoding/schema/optional.js.map +1 -0
  435. package/dist/esm/encoding/schema/string.js +39 -0
  436. package/dist/esm/encoding/schema/string.js.map +1 -0
  437. package/dist/esm/encoding/schema/uint64.js +32 -0
  438. package/dist/esm/encoding/schema/uint64.js.map +1 -0
  439. package/dist/esm/encoding/schema/untyped.js +29 -0
  440. package/dist/esm/encoding/schema/untyped.js.map +1 -0
  441. package/dist/esm/encoding/uint64.js +1 -1
  442. package/dist/esm/encoding/uint64.js.map +1 -1
  443. package/dist/esm/group.js +22 -58
  444. package/dist/esm/group.js.map +1 -1
  445. package/dist/esm/index.js +2 -2
  446. package/dist/esm/index.js.map +1 -1
  447. package/dist/esm/logic/sourcemap.js +54 -23
  448. package/dist/esm/logic/sourcemap.js.map +1 -1
  449. package/dist/esm/logicsig.js +110 -141
  450. package/dist/esm/logicsig.js.map +1 -1
  451. package/dist/esm/main.js +47 -76
  452. package/dist/esm/main.js.map +1 -1
  453. package/dist/esm/makeTxn.js +304 -529
  454. package/dist/esm/makeTxn.js.map +1 -1
  455. package/dist/esm/mnemonic/mnemonic.js +5 -5
  456. package/dist/esm/mnemonic/mnemonic.js.map +1 -1
  457. package/dist/esm/multisig.js +56 -305
  458. package/dist/esm/multisig.js.map +1 -1
  459. package/dist/esm/multisigSigning.js +254 -0
  460. package/dist/esm/multisigSigning.js.map +1 -0
  461. package/dist/esm/nacl/naclWrappers.js +1 -1
  462. package/dist/esm/nacl/naclWrappers.js.map +1 -1
  463. package/dist/esm/package.json +1 -0
  464. package/dist/esm/signedTransaction.js +100 -0
  465. package/dist/esm/signedTransaction.js.map +1 -0
  466. package/dist/esm/signer.js +3 -3
  467. package/dist/esm/signer.js.map +1 -1
  468. package/dist/esm/signing.js +77 -0
  469. package/dist/esm/signing.js.map +1 -0
  470. package/dist/esm/stateproof.js +408 -0
  471. package/dist/esm/stateproof.js.map +1 -0
  472. package/dist/esm/transaction.js +723 -1005
  473. package/dist/esm/transaction.js.map +1 -1
  474. package/dist/esm/types/block.js +797 -0
  475. package/dist/esm/types/block.js.map +1 -0
  476. package/dist/esm/types/intDecoding.js +1 -1
  477. package/dist/esm/types/intDecoding.js.map +1 -1
  478. package/dist/esm/types/statedelta.js +1129 -0
  479. package/dist/esm/types/statedelta.js.map +1 -0
  480. package/dist/esm/types/transactions/base.js +18 -2
  481. package/dist/esm/types/transactions/base.js.map +1 -1
  482. package/dist/esm/types/transactions/encoded.js +62 -1
  483. package/dist/esm/types/transactions/encoded.js.map +1 -1
  484. package/dist/esm/types/transactions/index.js +2 -3
  485. package/dist/esm/types/transactions/index.js.map +1 -1
  486. package/dist/esm/utils/utils.js +80 -21
  487. package/dist/esm/utils/utils.js.map +1 -1
  488. package/dist/esm/wait.js +4 -4
  489. package/dist/esm/wait.js.map +1 -1
  490. package/dist/types/abi/abi_type.d.ts +1 -1
  491. package/dist/types/abi/contract.d.ts +2 -2
  492. package/dist/types/abi/index.d.ts +6 -6
  493. package/dist/types/abi/interface.d.ts +1 -1
  494. package/dist/types/abi/method.d.ts +6 -6
  495. package/dist/types/abi/transaction.d.ts +1 -1
  496. package/dist/types/account.d.ts +1 -1
  497. package/dist/types/boxStorage.d.ts +4 -5
  498. package/dist/types/client/baseHTTPClient.d.ts +9 -6
  499. package/dist/types/client/client.d.ts +59 -18
  500. package/dist/types/client/index.d.ts +5 -0
  501. package/dist/types/client/kmd.d.ts +12 -10
  502. package/dist/types/client/urlTokenBaseHTTPClient.d.ts +8 -5
  503. package/dist/types/client/v2/algod/accountApplicationInformation.d.ts +8 -6
  504. package/dist/types/client/v2/algod/accountAssetInformation.d.ts +8 -6
  505. package/dist/types/client/v2/algod/accountInformation.d.ts +7 -5
  506. package/dist/types/client/v2/algod/algod.d.ts +53 -52
  507. package/dist/types/client/v2/algod/block.d.ts +5 -4
  508. package/dist/types/client/v2/algod/compile.d.ts +7 -9
  509. package/dist/types/client/v2/algod/disassemble.d.ts +7 -9
  510. package/dist/types/client/v2/algod/dryrun.d.ts +7 -9
  511. package/dist/types/client/v2/algod/genesis.d.ts +4 -2
  512. package/dist/types/client/v2/algod/getApplicationBoxByName.d.ts +6 -7
  513. package/dist/types/client/v2/algod/getApplicationBoxes.d.ts +6 -7
  514. package/dist/types/client/v2/algod/getApplicationByID.d.ts +6 -5
  515. package/dist/types/client/v2/algod/getAssetByID.d.ts +6 -5
  516. package/dist/types/client/v2/algod/getBlockHash.d.ts +7 -6
  517. package/dist/types/client/v2/algod/getBlockOffsetTimestamp.d.ts +5 -4
  518. package/dist/types/client/v2/algod/getBlockTxids.d.ts +6 -5
  519. package/dist/types/client/v2/algod/getLedgerStateDelta.d.ts +6 -5
  520. package/dist/types/client/v2/algod/getLedgerStateDeltaForTransactionGroup.d.ts +6 -5
  521. package/dist/types/client/v2/algod/getSyncRound.d.ts +5 -4
  522. package/dist/types/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.d.ts +6 -7
  523. package/dist/types/client/v2/algod/getTransactionProof.d.ts +6 -5
  524. package/dist/types/client/v2/algod/healthCheck.d.ts +4 -3
  525. package/dist/types/client/v2/algod/index.d.ts +2 -0
  526. package/dist/types/client/v2/algod/lightBlockHeaderProof.d.ts +6 -5
  527. package/dist/types/client/v2/algod/models/types.d.ts +604 -317
  528. package/dist/types/client/v2/algod/pendingTransactionInformation.d.ts +5 -4
  529. package/dist/types/client/v2/algod/pendingTransactions.d.ts +5 -4
  530. package/dist/types/client/v2/algod/pendingTransactionsByAddress.d.ts +7 -5
  531. package/dist/types/client/v2/algod/ready.d.ts +4 -2
  532. package/dist/types/client/v2/algod/sendRawTransaction.d.ts +7 -5
  533. package/dist/types/client/v2/algod/setBlockOffsetTimestamp.d.ts +6 -6
  534. package/dist/types/client/v2/algod/setSyncRound.d.ts +6 -6
  535. package/dist/types/client/v2/algod/simulateTransaction.d.ts +7 -7
  536. package/dist/types/client/v2/algod/stateproof.d.ts +6 -5
  537. package/dist/types/client/v2/algod/status.d.ts +5 -2
  538. package/dist/types/client/v2/algod/statusAfterBlock.d.ts +6 -5
  539. package/dist/types/client/v2/algod/suggestedParams.d.ts +25 -4
  540. package/dist/types/client/v2/algod/supply.d.ts +5 -2
  541. package/dist/types/client/v2/algod/unsetSyncRound.d.ts +5 -3
  542. package/dist/types/client/v2/algod/versions.d.ts +5 -2
  543. package/dist/types/client/v2/indexer/index.d.ts +2 -0
  544. package/dist/types/client/v2/indexer/indexer.d.ts +31 -30
  545. package/dist/types/client/v2/indexer/lookupAccountAppLocalStates.d.ts +7 -5
  546. package/dist/types/client/v2/indexer/lookupAccountAssets.d.ts +7 -5
  547. package/dist/types/client/v2/indexer/lookupAccountByID.d.ts +7 -5
  548. package/dist/types/client/v2/indexer/lookupAccountCreatedApplications.d.ts +7 -5
  549. package/dist/types/client/v2/indexer/lookupAccountCreatedAssets.d.ts +7 -5
  550. package/dist/types/client/v2/indexer/lookupAccountTransactions.d.ts +11 -9
  551. package/dist/types/client/v2/indexer/lookupApplicationBoxByIDandName.d.ts +6 -7
  552. package/dist/types/client/v2/indexer/lookupApplicationLogs.d.ts +6 -5
  553. package/dist/types/client/v2/indexer/lookupApplications.d.ts +6 -5
  554. package/dist/types/client/v2/indexer/lookupAssetBalances.d.ts +6 -5
  555. package/dist/types/client/v2/indexer/lookupAssetByID.d.ts +6 -5
  556. package/dist/types/client/v2/indexer/lookupAssetTransactions.d.ts +12 -10
  557. package/dist/types/client/v2/indexer/lookupBlock.d.ts +6 -5
  558. package/dist/types/client/v2/indexer/lookupTransactionByID.d.ts +6 -5
  559. package/dist/types/client/v2/indexer/makeHealthCheck.d.ts +5 -2
  560. package/dist/types/client/v2/indexer/models/types.d.ts +513 -267
  561. package/dist/types/client/v2/indexer/searchAccounts.d.ts +7 -3
  562. package/dist/types/client/v2/indexer/searchForApplicationBoxes.d.ts +6 -7
  563. package/dist/types/client/v2/indexer/searchForApplications.d.ts +7 -3
  564. package/dist/types/client/v2/indexer/searchForAssets.d.ts +7 -3
  565. package/dist/types/client/v2/indexer/searchForTransactions.d.ts +11 -7
  566. package/dist/types/client/v2/jsonrequest.d.ts +20 -33
  567. package/dist/types/client/v2/serviceClient.d.ts +4 -18
  568. package/dist/types/client/v2/untypedmodel.d.ts +10 -0
  569. package/dist/types/composer.d.ts +18 -17
  570. package/dist/types/dryrun.d.ts +8 -80
  571. package/dist/types/encoding/address.d.ts +40 -31
  572. package/dist/types/encoding/binarydata.d.ts +30 -0
  573. package/dist/types/encoding/encoding.d.ts +219 -7
  574. package/dist/types/encoding/schema/address.d.ts +10 -0
  575. package/dist/types/encoding/schema/array.d.ts +11 -0
  576. package/dist/types/encoding/schema/binarystring.d.ts +18 -0
  577. package/dist/types/encoding/schema/blockhash.d.ts +16 -0
  578. package/dist/types/encoding/schema/boolean.d.ts +10 -0
  579. package/dist/types/encoding/schema/bytearray.d.ts +19 -0
  580. package/dist/types/encoding/schema/index.d.ts +11 -0
  581. package/dist/types/encoding/schema/map.d.ts +125 -0
  582. package/dist/types/encoding/schema/optional.d.ts +24 -0
  583. package/dist/types/encoding/schema/string.d.ts +9 -0
  584. package/dist/types/encoding/schema/uint64.d.ts +9 -0
  585. package/dist/types/encoding/schema/untyped.d.ts +9 -0
  586. package/dist/types/encoding/uint64.d.ts +1 -0
  587. package/dist/types/group.d.ts +6 -25
  588. package/dist/types/index.d.ts +2 -2
  589. package/dist/types/logic/sourcemap.d.ts +39 -13
  590. package/dist/types/logicsig.d.ts +27 -57
  591. package/dist/types/main.d.ts +43 -54
  592. package/dist/types/makeTxn.d.ts +117 -404
  593. package/dist/types/mnemonic/mnemonic.d.ts +1 -1
  594. package/dist/types/multisig.d.ts +28 -99
  595. package/dist/types/multisigSigning.d.ts +72 -0
  596. package/dist/types/signedTransaction.d.ts +55 -0
  597. package/dist/types/signer.d.ts +5 -5
  598. package/dist/types/signing.d.ts +29 -0
  599. package/dist/types/stateproof.d.ts +194 -0
  600. package/dist/types/transaction.d.ts +103 -182
  601. package/dist/types/types/account.d.ts +2 -1
  602. package/dist/types/types/block.d.ts +407 -0
  603. package/dist/types/types/intDecoding.d.ts +1 -1
  604. package/dist/types/types/statedelta.d.ts +575 -0
  605. package/dist/types/types/transactions/base.d.ts +206 -118
  606. package/dist/types/types/transactions/encoded.d.ts +7 -301
  607. package/dist/types/types/transactions/index.d.ts +2 -15
  608. package/dist/types/types/utils.d.ts +7 -7
  609. package/dist/types/utils/utils.d.ts +21 -16
  610. package/dist/types/wait.d.ts +3 -2
  611. package/package.json +48 -20
  612. package/src/abi/abi_type.ts +28 -18
  613. package/src/abi/contract.ts +2 -2
  614. package/src/abi/index.ts +6 -6
  615. package/src/abi/interface.ts +1 -1
  616. package/src/abi/method.ts +11 -9
  617. package/src/abi/transaction.ts +2 -2
  618. package/src/account.ts +5 -5
  619. package/src/boxStorage.ts +25 -23
  620. package/src/client/baseHTTPClient.ts +12 -6
  621. package/src/client/client.ts +147 -75
  622. package/src/client/index.ts +6 -0
  623. package/src/client/kmd.ts +79 -72
  624. package/src/client/urlTokenBaseHTTPClient.ts +25 -14
  625. package/src/client/v2/algod/accountApplicationInformation.ts +16 -9
  626. package/src/client/v2/algod/accountAssetInformation.ts +16 -9
  627. package/src/client/v2/algod/accountInformation.ts +16 -11
  628. package/src/client/v2/algod/algod.ts +83 -105
  629. package/src/client/v2/algod/block.ts +7 -11
  630. package/src/client/v2/algod/compile.ts +27 -19
  631. package/src/client/v2/algod/disassemble.ts +27 -19
  632. package/src/client/v2/algod/dryrun.ts +23 -19
  633. package/src/client/v2/algod/genesis.ts +8 -2
  634. package/src/client/v2/algod/getApplicationBoxByName.ts +10 -15
  635. package/src/client/v2/algod/getApplicationBoxes.ts +12 -13
  636. package/src/client/v2/algod/getApplicationByID.ts +15 -7
  637. package/src/client/v2/algod/getAssetByID.ts +15 -7
  638. package/src/client/v2/algod/getBlockHash.ts +13 -9
  639. package/src/client/v2/algod/getBlockOffsetTimestamp.ts +7 -8
  640. package/src/client/v2/algod/getBlockTxids.ts +12 -6
  641. package/src/client/v2/algod/getLedgerStateDelta.ts +16 -8
  642. package/src/client/v2/algod/getLedgerStateDeltaForTransactionGroup.ts +16 -8
  643. package/src/client/v2/algod/getSyncRound.ts +7 -8
  644. package/src/client/v2/algod/getTransactionGroupLedgerStateDeltasForRound.ts +15 -15
  645. package/src/client/v2/algod/getTransactionProof.ts +11 -9
  646. package/src/client/v2/algod/healthCheck.ts +5 -9
  647. package/src/client/v2/algod/index.ts +3 -0
  648. package/src/client/v2/algod/lightBlockHeaderProof.ts +15 -8
  649. package/src/client/v2/algod/models/types.ts +4699 -2263
  650. package/src/client/v2/algod/pendingTransactionInformation.ts +11 -11
  651. package/src/client/v2/algod/pendingTransactions.ts +7 -9
  652. package/src/client/v2/algod/pendingTransactionsByAddress.ts +12 -11
  653. package/src/client/v2/algod/ready.ts +6 -2
  654. package/src/client/v2/algod/sendRawTransaction.ts +24 -13
  655. package/src/client/v2/algod/setBlockOffsetTimestamp.ts +21 -11
  656. package/src/client/v2/algod/setSyncRound.ts +21 -11
  657. package/src/client/v2/algod/simulateTransaction.ts +22 -23
  658. package/src/client/v2/algod/stateproof.ts +15 -8
  659. package/src/client/v2/algod/status.ts +10 -2
  660. package/src/client/v2/algod/statusAfterBlock.ts +15 -7
  661. package/src/client/v2/algod/suggestedParams.ts +40 -10
  662. package/src/client/v2/algod/supply.ts +10 -2
  663. package/src/client/v2/algod/unsetSyncRound.ts +16 -5
  664. package/src/client/v2/algod/versions.ts +10 -2
  665. package/src/client/v2/indexer/index.ts +3 -0
  666. package/src/client/v2/indexer/indexer.ts +51 -59
  667. package/src/client/v2/indexer/lookupAccountAppLocalStates.ts +16 -11
  668. package/src/client/v2/indexer/lookupAccountAssets.ts +16 -11
  669. package/src/client/v2/indexer/lookupAccountByID.ts +16 -11
  670. package/src/client/v2/indexer/lookupAccountCreatedApplications.ts +16 -11
  671. package/src/client/v2/indexer/lookupAccountCreatedAssets.ts +16 -11
  672. package/src/client/v2/indexer/lookupAccountTransactions.ts +26 -19
  673. package/src/client/v2/indexer/lookupApplicationBoxByIDandName.ts +10 -15
  674. package/src/client/v2/indexer/lookupApplicationLogs.ts +15 -7
  675. package/src/client/v2/indexer/lookupApplications.ts +15 -7
  676. package/src/client/v2/indexer/lookupAssetBalances.ts +15 -7
  677. package/src/client/v2/indexer/lookupAssetByID.ts +15 -7
  678. package/src/client/v2/indexer/lookupAssetTransactions.ts +27 -16
  679. package/src/client/v2/indexer/lookupBlock.ts +15 -7
  680. package/src/client/v2/indexer/lookupTransactionByID.ts +15 -7
  681. package/src/client/v2/indexer/makeHealthCheck.ts +10 -2
  682. package/src/client/v2/indexer/models/types.ts +4454 -1988
  683. package/src/client/v2/indexer/searchAccounts.ts +13 -4
  684. package/src/client/v2/indexer/searchForApplicationBoxes.ts +12 -13
  685. package/src/client/v2/indexer/searchForApplications.ts +13 -4
  686. package/src/client/v2/indexer/searchForAssets.ts +13 -4
  687. package/src/client/v2/indexer/searchForTransactions.ts +22 -11
  688. package/src/client/v2/jsonrequest.ts +39 -57
  689. package/src/client/v2/serviceClient.ts +9 -31
  690. package/src/client/v2/untypedmodel.ts +25 -0
  691. package/src/composer.ts +83 -60
  692. package/src/dryrun.ts +129 -306
  693. package/src/encoding/address.ts +134 -146
  694. package/src/encoding/bigint.ts +2 -4
  695. package/src/encoding/binarydata.ts +80 -0
  696. package/src/encoding/encoding.ts +558 -13
  697. package/src/encoding/schema/address.ts +53 -0
  698. package/src/encoding/schema/array.ts +66 -0
  699. package/src/encoding/schema/binarystring.ts +73 -0
  700. package/src/encoding/schema/blockhash.ts +84 -0
  701. package/src/encoding/schema/boolean.ts +54 -0
  702. package/src/encoding/schema/bytearray.ts +127 -0
  703. package/src/encoding/schema/index.ts +26 -0
  704. package/src/encoding/schema/map.ts +713 -0
  705. package/src/encoding/schema/optional.ts +72 -0
  706. package/src/encoding/schema/string.ts +55 -0
  707. package/src/encoding/schema/uint64.ts +46 -0
  708. package/src/encoding/schema/untyped.ts +47 -0
  709. package/src/encoding/uint64.ts +2 -1
  710. package/src/group.ts +27 -75
  711. package/src/index.ts +2 -2
  712. package/src/logic/sourcemap.ts +94 -29
  713. package/src/logicsig.ts +154 -202
  714. package/src/main.ts +91 -94
  715. package/src/makeTxn.ts +660 -1338
  716. package/src/mnemonic/mnemonic.ts +14 -14
  717. package/src/multisig.ts +89 -403
  718. package/src/multisigSigning.ts +359 -0
  719. package/src/nacl/naclWrappers.ts +1 -1
  720. package/src/signedTransaction.ts +163 -0
  721. package/src/signer.ts +10 -5
  722. package/src/signing.ts +95 -0
  723. package/src/stateproof.ts +595 -0
  724. package/src/transaction.ts +986 -1242
  725. package/src/types/account.ts +3 -1
  726. package/src/types/block.ts +1278 -0
  727. package/src/types/intDecoding.ts +1 -1
  728. package/src/types/statedelta.ts +1717 -0
  729. package/src/types/transactions/base.ts +230 -122
  730. package/src/types/transactions/encoded.ts +81 -371
  731. package/src/types/transactions/index.ts +2 -72
  732. package/src/types/utils.ts +3 -3
  733. package/src/utils/utils.ts +96 -25
  734. package/src/wait.ts +8 -7
  735. package/dist/cjs/bid.js +0 -83
  736. package/dist/cjs/bid.js.map +0 -1
  737. package/dist/cjs/client/v2/basemodel.js +0 -67
  738. package/dist/cjs/client/v2/basemodel.js.map +0 -1
  739. package/dist/cjs/types/address.js +0 -3
  740. package/dist/cjs/types/address.js.map +0 -1
  741. package/dist/cjs/types/blockHeader.js +0 -3
  742. package/dist/cjs/types/blockHeader.js.map +0 -1
  743. package/dist/cjs/types/index.js.map +0 -1
  744. package/dist/cjs/types/multisig.js +0 -3
  745. package/dist/cjs/types/multisig.js.map +0 -1
  746. package/dist/cjs/types/transactions/application.js +0 -3
  747. package/dist/cjs/types/transactions/application.js.map +0 -1
  748. package/dist/cjs/types/transactions/asset.js +0 -3
  749. package/dist/cjs/types/transactions/asset.js.map +0 -1
  750. package/dist/cjs/types/transactions/builder.js +0 -3
  751. package/dist/cjs/types/transactions/builder.js.map +0 -1
  752. package/dist/cjs/types/transactions/keyreg.js +0 -3
  753. package/dist/cjs/types/transactions/keyreg.js.map +0 -1
  754. package/dist/cjs/types/transactions/payment.js +0 -3
  755. package/dist/cjs/types/transactions/payment.js.map +0 -1
  756. package/dist/cjs/types/transactions/stateproof.js +0 -3
  757. package/dist/cjs/types/transactions/stateproof.js.map +0 -1
  758. package/dist/esm/bid.js +0 -57
  759. package/dist/esm/bid.js.map +0 -1
  760. package/dist/esm/client/v2/basemodel.js +0 -64
  761. package/dist/esm/client/v2/basemodel.js.map +0 -1
  762. package/dist/esm/types/address.js +0 -2
  763. package/dist/esm/types/address.js.map +0 -1
  764. package/dist/esm/types/blockHeader.js +0 -2
  765. package/dist/esm/types/blockHeader.js.map +0 -1
  766. package/dist/esm/types/index.js +0 -4
  767. package/dist/esm/types/index.js.map +0 -1
  768. package/dist/esm/types/multisig.js +0 -2
  769. package/dist/esm/types/multisig.js.map +0 -1
  770. package/dist/esm/types/transactions/application.js +0 -2
  771. package/dist/esm/types/transactions/application.js.map +0 -1
  772. package/dist/esm/types/transactions/asset.js +0 -2
  773. package/dist/esm/types/transactions/asset.js.map +0 -1
  774. package/dist/esm/types/transactions/builder.js +0 -2
  775. package/dist/esm/types/transactions/builder.js.map +0 -1
  776. package/dist/esm/types/transactions/keyreg.js +0 -2
  777. package/dist/esm/types/transactions/keyreg.js.map +0 -1
  778. package/dist/esm/types/transactions/payment.js +0 -2
  779. package/dist/esm/types/transactions/payment.js.map +0 -1
  780. package/dist/esm/types/transactions/stateproof.js +0 -2
  781. package/dist/esm/types/transactions/stateproof.js.map +0 -1
  782. package/dist/types/bid.d.ts +0 -38
  783. package/dist/types/client/v2/basemodel.d.ts +0 -11
  784. package/dist/types/types/address.d.ts +0 -7
  785. package/dist/types/types/blockHeader.d.ts +0 -67
  786. package/dist/types/types/index.d.ts +0 -3
  787. package/dist/types/types/multisig.d.ts +0 -20
  788. package/dist/types/types/transactions/application.d.ts +0 -22
  789. package/dist/types/types/transactions/asset.d.ts +0 -28
  790. package/dist/types/types/transactions/builder.d.ts +0 -36
  791. package/dist/types/types/transactions/keyreg.d.ts +0 -8
  792. package/dist/types/types/transactions/payment.d.ts +0 -8
  793. package/dist/types/types/transactions/stateproof.d.ts +0 -8
  794. package/src/bid.ts +0 -96
  795. package/src/client/v2/basemodel.ts +0 -81
  796. package/src/types/address.ts +0 -7
  797. package/src/types/blockHeader.ts +0 -81
  798. package/src/types/index.ts +0 -3
  799. package/src/types/multisig.ts +0 -22
  800. package/src/types/transactions/application.ts +0 -111
  801. package/src/types/transactions/asset.ts +0 -108
  802. package/src/types/transactions/builder.ts +0 -69
  803. package/src/types/transactions/keyreg.ts +0 -23
  804. package/src/types/transactions/payment.ts +0 -14
  805. package/src/types/transactions/stateproof.ts +0 -17
@@ -1,1298 +1,1106 @@
1
- import { Buffer } from 'buffer';
2
1
  import base32 from 'hi-base32';
3
- import * as address from './encoding/address';
4
- import * as encoding from './encoding/encoding';
5
- import * as nacl from './nacl/naclWrappers';
6
- import * as utils from './utils/utils';
7
- import { translateBoxReferences } from './boxStorage';
2
+ import { boxReferencesToEncodingData } from './boxStorage.js';
3
+ import { Address } from './encoding/address.js';
4
+ import * as encoding from './encoding/encoding.js';
8
5
  import {
6
+ AddressSchema,
7
+ Uint64Schema,
8
+ ByteArraySchema,
9
+ FixedLengthByteArraySchema,
10
+ StringSchema,
11
+ ArraySchema,
12
+ NamedMapSchema,
13
+ BooleanSchema,
14
+ OptionalSchema,
15
+ allOmitEmpty,
16
+ } from './encoding/schema/index.js';
17
+ import * as nacl from './nacl/naclWrappers.js';
18
+ import {
19
+ SuggestedParams,
20
+ BoxReference,
9
21
  OnApplicationComplete,
22
+ isOnApplicationComplete,
10
23
  TransactionParams,
11
24
  TransactionType,
12
25
  isTransactionType,
13
- BoxReference,
14
- } from './types/transactions/base';
15
- import AnyTransaction, {
16
- MustHaveSuggestedParams,
17
- MustHaveSuggestedParamsInline,
18
- EncodedTransaction,
19
- EncodedSignedTransaction,
20
- EncodedMultisig,
21
- EncodedLogicSig,
22
- } from './types/transactions';
23
- import { Address } from './types/address';
26
+ PaymentTransactionParams,
27
+ AssetConfigurationTransactionParams,
28
+ AssetTransferTransactionParams,
29
+ AssetFreezeTransactionParams,
30
+ KeyRegistrationTransactionParams,
31
+ ApplicationCallTransactionParams,
32
+ StateProofTransactionParams,
33
+ } from './types/transactions/base.js';
34
+ import { StateProof, StateProofMessage } from './stateproof.js';
35
+ import * as utils from './utils/utils.js';
24
36
 
25
37
  const ALGORAND_TRANSACTION_LENGTH = 52;
26
- export const ALGORAND_MIN_TX_FEE = 1000; // version v5
27
38
  const ALGORAND_TRANSACTION_LEASE_LENGTH = 32;
28
- const ALGORAND_MAX_ASSET_DECIMALS = 19;
29
39
  const NUM_ADDL_BYTES_AFTER_SIGNING = 75; // NUM_ADDL_BYTES_AFTER_SIGNING is the number of bytes added to a txn after signing it
30
- const ALGORAND_TRANSACTION_LEASE_LABEL_LENGTH = 5;
31
- const ALGORAND_TRANSACTION_ADDRESS_LENGTH = 32;
32
- const ALGORAND_TRANSACTION_REKEY_LABEL_LENGTH = 5;
33
40
  const ASSET_METADATA_HASH_LENGTH = 32;
34
41
  const KEYREG_VOTE_KEY_LENGTH = 32;
35
42
  const KEYREG_SELECTION_KEY_LENGTH = 32;
36
43
  const KEYREG_STATE_PROOF_KEY_LENGTH = 64;
44
+ const ALGORAND_TRANSACTION_GROUP_LENGTH = 32;
37
45
 
38
- type AnyTransactionWithParams = MustHaveSuggestedParams<AnyTransaction>;
39
- type AnyTransactionWithParamsInline = MustHaveSuggestedParamsInline<AnyTransaction>;
40
-
41
- /**
42
- * A modified version of the transaction params. Represents the internal structure that the Transaction class uses
43
- * to store inputted transaction objects.
44
- */
45
- // Omit allows overwriting properties
46
- interface TransactionStorageStructure
47
- extends Omit<
48
- TransactionParams,
49
- | 'from'
50
- | 'to'
51
- | 'genesisHash'
52
- | 'closeRemainderTo'
53
- | 'voteKey'
54
- | 'selectionKey'
55
- | 'stateProofKey'
56
- | 'assetManager'
57
- | 'assetReserve'
58
- | 'assetFreeze'
59
- | 'assetClawback'
60
- | 'assetRevocationTarget'
61
- | 'freezeAccount'
62
- | 'appAccounts'
63
- | 'suggestedParams'
64
- | 'reKeyTo'
65
- > {
66
- from: string | Address;
67
- to: string | Address;
68
- fee: number;
69
- amount: number | bigint;
70
- firstRound: number;
71
- lastRound: number;
72
- note?: Uint8Array;
73
- genesisID: string;
74
- genesisHash: string | Buffer;
75
- lease?: Uint8Array;
76
- closeRemainderTo?: string | Address;
77
- voteKey: string | Buffer;
78
- selectionKey: string | Buffer;
79
- stateProofKey: string | Buffer;
80
- voteFirst: number;
81
- voteLast: number;
82
- voteKeyDilution: number;
83
- assetIndex: number;
84
- assetTotal: number | bigint;
85
- assetDecimals: number;
86
- assetDefaultFrozen: boolean;
87
- assetManager: string | Address;
88
- assetReserve: string | Address;
89
- assetFreeze: string | Address;
90
- assetClawback: string | Address;
91
- assetUnitName: string;
92
- assetName: string;
93
- assetURL: string;
94
- assetMetadataHash?: string | Uint8Array;
95
- freezeAccount: string | Address;
96
- freezeState: boolean;
97
- assetRevocationTarget?: string | Address;
98
- appIndex: number;
99
- appOnComplete: OnApplicationComplete;
100
- appLocalInts: number;
101
- appLocalByteSlices: number;
102
- appGlobalInts: number;
103
- appGlobalByteSlices: number;
104
- appApprovalProgram: Uint8Array;
105
- appClearProgram: Uint8Array;
106
- appArgs?: Uint8Array[];
107
- appAccounts?: string[] | Address[];
108
- appForeignApps?: number[];
109
- appForeignAssets?: number[];
110
- type?: TransactionType;
111
- flatFee: boolean;
112
- reKeyTo?: string | Address;
113
- nonParticipation?: boolean;
114
- group?: Buffer;
115
- extraPages?: number;
116
- boxes?: BoxReference[];
117
- stateProofType?: number | bigint;
118
- stateProof?: Uint8Array;
119
- stateProofMessage?: Uint8Array;
46
+ function uint8ArrayIsEmpty(input: Uint8Array): boolean {
47
+ return input.every((value) => value === 0);
120
48
  }
121
49
 
122
50
  function getKeyregKey(
123
- input: undefined | string | Uint8Array | Buffer,
51
+ input: undefined | string | Uint8Array,
124
52
  inputName: string,
125
53
  length: number
126
- ): Buffer | undefined {
54
+ ): Uint8Array | undefined {
127
55
  if (input == null) {
128
56
  return undefined;
129
57
  }
130
58
 
131
- let inputAsBuffer: Buffer | undefined;
59
+ let inputBytes: Uint8Array | undefined;
60
+
61
+ if (input instanceof Uint8Array) {
62
+ inputBytes = input;
63
+ }
64
+
65
+ if (inputBytes == null || inputBytes.byteLength !== length) {
66
+ throw Error(`${inputName} must be a ${length} byte Uint8Array`);
67
+ }
68
+
69
+ return inputBytes;
70
+ }
132
71
 
72
+ function ensureAddress(input: unknown): Address {
73
+ if (input == null) {
74
+ throw new Error('Address must not be null or undefined');
75
+ }
133
76
  if (typeof input === 'string') {
134
- inputAsBuffer = Buffer.from(input, 'base64');
135
- } else if (input.constructor === Uint8Array) {
136
- inputAsBuffer = Buffer.from(input);
137
- } else if (Buffer.isBuffer(input)) {
138
- inputAsBuffer = input;
77
+ return Address.fromString(input);
78
+ }
79
+ if (input instanceof Address) {
80
+ return input;
139
81
  }
82
+ throw new Error(`Not an address: ${input}`);
83
+ }
140
84
 
141
- if (inputAsBuffer == null || inputAsBuffer.byteLength !== length) {
142
- throw Error(
143
- `${inputName} must be a ${length} byte Uint8Array or Buffer or base64 string.`
85
+ function optionalAddress(input: unknown): Address | undefined {
86
+ if (input == null) {
87
+ return undefined;
88
+ }
89
+ let addr: Address;
90
+ if (input instanceof Address) {
91
+ addr = input;
92
+ } else if (typeof input === 'string') {
93
+ addr = Address.fromString(input);
94
+ } else {
95
+ throw new Error(`Not an address: ${input}`);
96
+ }
97
+ if (uint8ArrayIsEmpty(addr.publicKey)) {
98
+ // If it's the zero address, throw an error so that the user won't be surprised that this gets dropped
99
+ throw new Error(
100
+ 'Invalid use of the zero address. To omit this value, pass in undefined'
144
101
  );
145
102
  }
103
+ return addr;
104
+ }
105
+
106
+ function optionalUint8Array(input: unknown): Uint8Array | undefined {
107
+ if (typeof input === 'undefined') {
108
+ return undefined;
109
+ }
110
+ if (input instanceof Uint8Array) {
111
+ return input;
112
+ }
113
+ throw new Error(`Not a Uint8Array: ${input}`);
114
+ }
115
+
116
+ function ensureUint8Array(input: unknown): Uint8Array {
117
+ if (input instanceof Uint8Array) {
118
+ return input;
119
+ }
120
+ throw new Error(`Not a Uint8Array: ${input}`);
121
+ }
122
+
123
+ function optionalUint64(input: unknown): bigint | undefined {
124
+ if (typeof input === 'undefined') {
125
+ return undefined;
126
+ }
127
+ return utils.ensureUint64(input);
128
+ }
129
+
130
+ function ensureBoolean(input: unknown): boolean {
131
+ if (input === true || input === false) {
132
+ return input;
133
+ }
134
+ throw new Error(`Not a boolean: ${input}`);
135
+ }
146
136
 
147
- return inputAsBuffer;
137
+ function ensureArray(input: unknown): unknown[] {
138
+ if (Array.isArray(input)) {
139
+ return input.slice();
140
+ }
141
+ throw new Error(`Not an array: ${input}`);
142
+ }
143
+
144
+ function optionalFixedLengthByteArray(
145
+ input: unknown,
146
+ length: number,
147
+ name: string
148
+ ): Uint8Array | undefined {
149
+ const bytes = optionalUint8Array(input);
150
+ if (typeof bytes === 'undefined') {
151
+ return undefined;
152
+ }
153
+ if (bytes.byteLength !== length) {
154
+ throw new Error(
155
+ `${name} must be ${length} bytes long, was ${bytes.byteLength}`
156
+ );
157
+ }
158
+ if (uint8ArrayIsEmpty(bytes)) {
159
+ // if contains all 0s, omit it
160
+ return undefined;
161
+ }
162
+ return bytes;
163
+ }
164
+
165
+ export interface TransactionBoxReference {
166
+ readonly appIndex: bigint;
167
+ readonly name: Uint8Array;
168
+ }
169
+
170
+ function ensureBoxReference(input: unknown): TransactionBoxReference {
171
+ if (input != null && typeof input === 'object') {
172
+ const { appIndex, name } = input as BoxReference;
173
+ return {
174
+ appIndex: utils.ensureUint64(appIndex),
175
+ name: ensureUint8Array(name),
176
+ };
177
+ }
178
+ throw new Error(`Not a box reference: ${input}`);
179
+ }
180
+
181
+ const TX_TAG = new TextEncoder().encode('TX');
182
+
183
+ export interface PaymentTransactionFields {
184
+ readonly receiver: Address;
185
+ readonly amount: bigint;
186
+ readonly closeRemainderTo?: Address;
187
+ }
188
+
189
+ export interface KeyRegistrationTransactionFields {
190
+ readonly voteKey?: Uint8Array;
191
+ readonly selectionKey?: Uint8Array;
192
+ readonly stateProofKey?: Uint8Array;
193
+ readonly voteFirst?: bigint;
194
+ readonly voteLast?: bigint;
195
+ readonly voteKeyDilution?: bigint;
196
+ readonly nonParticipation: boolean;
197
+ }
198
+
199
+ export interface AssetConfigTransactionFields {
200
+ readonly assetIndex: bigint;
201
+ readonly total: bigint;
202
+ readonly decimals: number;
203
+ readonly defaultFrozen: boolean;
204
+ readonly manager?: Address;
205
+ readonly reserve?: Address;
206
+ readonly freeze?: Address;
207
+ readonly clawback?: Address;
208
+ readonly unitName?: string;
209
+ readonly assetName?: string;
210
+ readonly assetURL?: string;
211
+ readonly assetMetadataHash?: Uint8Array;
212
+ }
213
+
214
+ export interface AssetTransferTransactionFields {
215
+ readonly assetIndex: bigint;
216
+ readonly amount: bigint;
217
+ readonly assetSender?: Address;
218
+ readonly receiver: Address;
219
+ readonly closeRemainderTo?: Address;
220
+ }
221
+
222
+ export interface AssetFreezeTransactionFields {
223
+ readonly assetIndex: bigint;
224
+ readonly freezeAccount: Address;
225
+ readonly frozen: boolean;
226
+ }
227
+
228
+ export interface ApplicationTransactionFields {
229
+ readonly appIndex: bigint;
230
+ readonly onComplete: OnApplicationComplete;
231
+ readonly numLocalInts: number;
232
+ readonly numLocalByteSlices: number;
233
+ readonly numGlobalInts: number;
234
+ readonly numGlobalByteSlices: number;
235
+ readonly extraPages: number;
236
+ readonly approvalProgram: Uint8Array;
237
+ readonly clearProgram: Uint8Array;
238
+ readonly appArgs: ReadonlyArray<Uint8Array>;
239
+ readonly accounts: ReadonlyArray<Address>;
240
+ readonly foreignApps: ReadonlyArray<bigint>;
241
+ readonly foreignAssets: ReadonlyArray<bigint>;
242
+ readonly boxes: ReadonlyArray<TransactionBoxReference>;
243
+ }
244
+
245
+ export interface StateProofTransactionFields {
246
+ readonly stateProofType: number;
247
+ readonly stateProof?: StateProof;
248
+ readonly message?: StateProofMessage;
148
249
  }
149
250
 
150
251
  /**
151
252
  * Transaction enables construction of Algorand transactions
152
253
  * */
153
- export class Transaction implements TransactionStorageStructure {
154
- name = 'Transaction';
155
- tag = Buffer.from('TX');
156
-
157
- // Implement transaction params
158
- from: Address;
159
- to: Address;
160
- fee: number;
161
- amount: number | bigint;
162
- firstRound: number;
163
- lastRound: number;
164
- note?: Uint8Array;
165
- genesisID: string;
166
- genesisHash: Buffer;
167
- lease?: Uint8Array;
168
- closeRemainderTo?: Address;
169
- voteKey: Buffer;
170
- selectionKey: Buffer;
171
- stateProofKey: Buffer;
172
- voteFirst: number;
173
- voteLast: number;
174
- voteKeyDilution: number;
175
- assetIndex: number;
176
- assetTotal: number | bigint;
177
- assetDecimals: number;
178
- assetDefaultFrozen: boolean;
179
- assetManager: Address;
180
- assetReserve: Address;
181
- assetFreeze: Address;
182
- assetClawback: Address;
183
- assetUnitName: string;
184
- assetName: string;
185
- assetURL: string;
186
- assetMetadataHash?: Uint8Array;
187
- freezeAccount: Address;
188
- freezeState: boolean;
189
- assetRevocationTarget?: Address;
190
- appIndex: number;
191
- appOnComplete: OnApplicationComplete;
192
- appLocalInts: number;
193
- appLocalByteSlices: number;
194
- appGlobalInts: number;
195
- appGlobalByteSlices: number;
196
- appApprovalProgram: Uint8Array;
197
- appClearProgram: Uint8Array;
198
- appArgs?: Uint8Array[];
199
- appAccounts?: Address[];
200
- appForeignApps?: number[];
201
- appForeignAssets?: number[];
202
- boxes?: BoxReference[];
203
- type?: TransactionType;
204
- flatFee: boolean;
205
- reKeyTo?: Address;
206
- nonParticipation?: boolean;
207
- group?: Buffer;
208
- extraPages?: number;
209
- stateProofType?: number | bigint;
210
- stateProof?: Uint8Array;
211
- stateProofMessage?: Uint8Array;
212
-
213
- constructor({ ...transaction }: AnyTransaction) {
214
- // Populate defaults
215
- /* eslint-disable no-param-reassign */
216
- const defaults: Partial<TransactionParams> = {
217
- type: TransactionType.pay,
218
- flatFee: false,
219
- nonParticipation: false,
220
- };
221
- // Default type
222
- if (typeof transaction.type === 'undefined') {
223
- transaction.type = defaults.type;
224
- }
225
- // Default flatFee
226
- if (
227
- typeof (transaction as AnyTransactionWithParamsInline).flatFee ===
228
- 'undefined'
229
- ) {
230
- (transaction as AnyTransactionWithParamsInline).flatFee =
231
- defaults.flatFee;
232
- }
233
- // Default nonParticipation
234
- if (
235
- transaction.type === TransactionType.keyreg &&
236
- typeof transaction.voteKey !== 'undefined' &&
237
- typeof transaction.nonParticipation === 'undefined'
238
- ) {
239
- transaction.nonParticipation = defaults.nonParticipation;
254
+ export class Transaction implements encoding.Encodable {
255
+ static readonly encodingSchema = new NamedMapSchema(
256
+ allOmitEmpty([
257
+ // Common
258
+ { key: 'type', valueSchema: new StringSchema() },
259
+ { key: 'snd', valueSchema: new AddressSchema() },
260
+ { key: 'lv', valueSchema: new Uint64Schema() },
261
+ { key: 'gen', valueSchema: new OptionalSchema(new StringSchema()) },
262
+ {
263
+ key: 'gh',
264
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(32)),
265
+ },
266
+ { key: 'fee', valueSchema: new Uint64Schema() },
267
+ { key: 'fv', valueSchema: new Uint64Schema() },
268
+ { key: 'note', valueSchema: new ByteArraySchema() },
269
+ {
270
+ key: 'lx',
271
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(32)),
272
+ },
273
+ { key: 'rekey', valueSchema: new OptionalSchema(new AddressSchema()) },
274
+ {
275
+ key: 'grp',
276
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(32)),
277
+ },
278
+ // We mark all top-level type-specific fields optional because they will not be present when
279
+ // the transaction is not that type.
280
+ // Payment
281
+ { key: 'amt', valueSchema: new OptionalSchema(new Uint64Schema()) },
282
+ { key: 'rcv', valueSchema: new OptionalSchema(new AddressSchema()) },
283
+ { key: 'close', valueSchema: new OptionalSchema(new AddressSchema()) },
284
+ // Keyreg
285
+ {
286
+ key: 'votekey',
287
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(32)),
288
+ },
289
+ {
290
+ key: 'selkey',
291
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(32)),
292
+ },
293
+ {
294
+ key: 'sprfkey',
295
+ valueSchema: new OptionalSchema(new FixedLengthByteArraySchema(64)),
296
+ },
297
+ { key: 'votefst', valueSchema: new OptionalSchema(new Uint64Schema()) },
298
+ { key: 'votelst', valueSchema: new OptionalSchema(new Uint64Schema()) },
299
+ { key: 'votekd', valueSchema: new OptionalSchema(new Uint64Schema()) },
300
+ { key: 'nonpart', valueSchema: new OptionalSchema(new BooleanSchema()) },
301
+ // AssetConfig
302
+ { key: 'caid', valueSchema: new OptionalSchema(new Uint64Schema()) },
303
+ {
304
+ key: 'apar',
305
+ valueSchema: new OptionalSchema(
306
+ new NamedMapSchema(
307
+ allOmitEmpty([
308
+ { key: 't', valueSchema: new Uint64Schema() },
309
+ { key: 'dc', valueSchema: new Uint64Schema() },
310
+ { key: 'df', valueSchema: new BooleanSchema() },
311
+ {
312
+ key: 'm',
313
+ valueSchema: new OptionalSchema(new AddressSchema()),
314
+ },
315
+ {
316
+ key: 'r',
317
+ valueSchema: new OptionalSchema(new AddressSchema()),
318
+ },
319
+ {
320
+ key: 'f',
321
+ valueSchema: new OptionalSchema(new AddressSchema()),
322
+ },
323
+ {
324
+ key: 'c',
325
+ valueSchema: new OptionalSchema(new AddressSchema()),
326
+ },
327
+ {
328
+ key: 'un',
329
+ valueSchema: new OptionalSchema(new StringSchema()),
330
+ },
331
+ {
332
+ key: 'an',
333
+ valueSchema: new OptionalSchema(new StringSchema()),
334
+ },
335
+ {
336
+ key: 'au',
337
+ valueSchema: new OptionalSchema(new StringSchema()),
338
+ },
339
+ {
340
+ key: 'am',
341
+ valueSchema: new OptionalSchema(
342
+ new FixedLengthByteArraySchema(32)
343
+ ),
344
+ },
345
+ ])
346
+ )
347
+ ),
348
+ },
349
+ // AssetTransfer
350
+ { key: 'xaid', valueSchema: new OptionalSchema(new Uint64Schema()) },
351
+ { key: 'aamt', valueSchema: new OptionalSchema(new Uint64Schema()) },
352
+ { key: 'arcv', valueSchema: new OptionalSchema(new AddressSchema()) },
353
+ { key: 'aclose', valueSchema: new OptionalSchema(new AddressSchema()) },
354
+ { key: 'asnd', valueSchema: new OptionalSchema(new AddressSchema()) },
355
+ // AssetFreeze
356
+ { key: 'faid', valueSchema: new OptionalSchema(new Uint64Schema()) },
357
+ { key: 'afrz', valueSchema: new OptionalSchema(new BooleanSchema()) },
358
+ { key: 'fadd', valueSchema: new OptionalSchema(new AddressSchema()) },
359
+ // Application
360
+ { key: 'apid', valueSchema: new OptionalSchema(new Uint64Schema()) },
361
+ { key: 'apan', valueSchema: new OptionalSchema(new Uint64Schema()) },
362
+ {
363
+ key: 'apaa',
364
+ valueSchema: new OptionalSchema(new ArraySchema(new ByteArraySchema())),
365
+ },
366
+ {
367
+ key: 'apat',
368
+ valueSchema: new OptionalSchema(new ArraySchema(new AddressSchema())),
369
+ },
370
+ {
371
+ key: 'apas',
372
+ valueSchema: new OptionalSchema(new ArraySchema(new Uint64Schema())),
373
+ },
374
+ {
375
+ key: 'apfa',
376
+ valueSchema: new OptionalSchema(new ArraySchema(new Uint64Schema())),
377
+ },
378
+ {
379
+ key: 'apbx',
380
+ valueSchema: new OptionalSchema(
381
+ new ArraySchema(
382
+ new NamedMapSchema(
383
+ allOmitEmpty([
384
+ {
385
+ key: 'i',
386
+ valueSchema: new Uint64Schema(),
387
+ },
388
+ {
389
+ key: 'n',
390
+ valueSchema: new ByteArraySchema(),
391
+ },
392
+ ])
393
+ )
394
+ )
395
+ ),
396
+ },
397
+ { key: 'apap', valueSchema: new OptionalSchema(new ByteArraySchema()) },
398
+ { key: 'apsu', valueSchema: new OptionalSchema(new ByteArraySchema()) },
399
+ {
400
+ key: 'apls',
401
+ valueSchema: new OptionalSchema(
402
+ new NamedMapSchema(
403
+ allOmitEmpty([
404
+ {
405
+ key: 'nui',
406
+ valueSchema: new Uint64Schema(),
407
+ },
408
+ {
409
+ key: 'nbs',
410
+ valueSchema: new Uint64Schema(),
411
+ },
412
+ ])
413
+ )
414
+ ),
415
+ },
416
+ {
417
+ key: 'apgs',
418
+ valueSchema: new OptionalSchema(
419
+ new NamedMapSchema(
420
+ allOmitEmpty([
421
+ {
422
+ key: 'nui',
423
+ valueSchema: new Uint64Schema(),
424
+ },
425
+ {
426
+ key: 'nbs',
427
+ valueSchema: new Uint64Schema(),
428
+ },
429
+ ])
430
+ )
431
+ ),
432
+ },
433
+ { key: 'apep', valueSchema: new OptionalSchema(new Uint64Schema()) },
434
+ // StateProof
435
+ { key: 'sptype', valueSchema: new OptionalSchema(new Uint64Schema()) },
436
+ { key: 'sp', valueSchema: new OptionalSchema(StateProof.encodingSchema) },
437
+ {
438
+ key: 'spmsg',
439
+ valueSchema: new OptionalSchema(StateProofMessage.encodingSchema),
440
+ },
441
+ ])
442
+ );
443
+
444
+ /** common */
445
+ public readonly type: TransactionType;
446
+ public readonly sender: Address;
447
+ public readonly note: Uint8Array;
448
+ public readonly lease?: Uint8Array;
449
+ public readonly rekeyTo?: Address;
450
+
451
+ /** group */
452
+ public group?: Uint8Array;
453
+
454
+ /** suggested params */
455
+ public fee: bigint;
456
+ public readonly firstValid: bigint;
457
+ public readonly lastValid: bigint;
458
+ public readonly genesisID?: string;
459
+ public readonly genesisHash?: Uint8Array;
460
+
461
+ /** type-specific fields */
462
+ public readonly payment?: PaymentTransactionFields;
463
+ public readonly keyreg?: KeyRegistrationTransactionFields;
464
+ public readonly assetConfig?: AssetConfigTransactionFields;
465
+ public readonly assetTransfer?: AssetTransferTransactionFields;
466
+ public readonly assetFreeze?: AssetFreezeTransactionFields;
467
+ public readonly applicationCall?: ApplicationTransactionFields;
468
+ public readonly stateProof?: StateProofTransactionFields;
469
+
470
+ constructor(params: TransactionParams) {
471
+ if (!isTransactionType(params.type)) {
472
+ throw new Error(`Invalid transaction type: ${params.type}`);
240
473
  }
241
- /* eslint-enable no-param-reassign */
242
-
243
- // Move suggested parameters from its object to inline
244
- if (
245
- (transaction as AnyTransactionWithParams).suggestedParams !== undefined
246
- ) {
247
- // Create a temporary reference to the transaction object that has params inline and also as a suggested params object
248
- // - Helpful for moving params from named object to inline
249
- const reference = transaction as AnyTransactionWithParams &
250
- AnyTransactionWithParamsInline;
251
- reference.genesisHash = reference.suggestedParams.genesisHash;
252
- reference.fee = reference.suggestedParams.fee;
253
- if (reference.suggestedParams.flatFee !== undefined)
254
- reference.flatFee = reference.suggestedParams.flatFee;
255
- reference.firstRound = reference.suggestedParams.firstRound;
256
- reference.lastRound = reference.suggestedParams.lastRound;
257
- reference.genesisID = reference.suggestedParams.genesisID;
474
+
475
+ // Common fields
476
+ this.type = params.type; // verified above
477
+ this.sender = ensureAddress(params.sender);
478
+ this.note = ensureUint8Array(params.note ?? new Uint8Array());
479
+ this.lease = optionalFixedLengthByteArray(
480
+ params.lease,
481
+ ALGORAND_TRANSACTION_LEASE_LENGTH,
482
+ 'lease'
483
+ );
484
+ this.rekeyTo = optionalAddress(params.rekeyTo);
485
+
486
+ // Group
487
+ this.group = undefined;
488
+
489
+ // Suggested params fields
490
+ this.firstValid = utils.ensureUint64(params.suggestedParams.firstValid);
491
+ this.lastValid = utils.ensureUint64(params.suggestedParams.lastValid);
492
+ if (params.suggestedParams.genesisID) {
493
+ if (typeof params.suggestedParams.genesisID !== 'string') {
494
+ throw new Error('Genesis ID must be a string if present');
495
+ }
496
+ this.genesisID = params.suggestedParams.genesisID;
258
497
  }
498
+ this.genesisHash = optionalUint8Array(params.suggestedParams.genesisHash);
499
+ // Fee is handled at the end
259
500
 
260
- // At this point all suggestedParams have been moved to be inline, so we can reassign the transaction object type
261
- // to one which is more useful as we prepare properties for storing
262
- const txn = transaction as TransactionStorageStructure;
501
+ const fieldsPresent: TransactionType[] = [];
502
+ if (params.paymentParams) fieldsPresent.push(TransactionType.pay);
503
+ if (params.keyregParams) fieldsPresent.push(TransactionType.keyreg);
504
+ if (params.assetConfigParams) fieldsPresent.push(TransactionType.acfg);
505
+ if (params.assetTransferParams) fieldsPresent.push(TransactionType.axfer);
506
+ if (params.assetFreezeParams) fieldsPresent.push(TransactionType.afrz);
507
+ if (params.appCallParams) fieldsPresent.push(TransactionType.appl);
508
+ if (params.stateProofParams) fieldsPresent.push(TransactionType.stpf);
263
509
 
264
- txn.from = address.decodeAddress(txn.from as string);
265
- if (txn.to !== undefined) txn.to = address.decodeAddress(txn.to as string);
266
- if (txn.closeRemainderTo !== undefined)
267
- txn.closeRemainderTo = address.decodeAddress(
268
- txn.closeRemainderTo as string
269
- );
270
- if (txn.assetManager !== undefined)
271
- txn.assetManager = address.decodeAddress(txn.assetManager as string);
272
- if (txn.assetReserve !== undefined)
273
- txn.assetReserve = address.decodeAddress(txn.assetReserve as string);
274
- if (txn.assetFreeze !== undefined)
275
- txn.assetFreeze = address.decodeAddress(txn.assetFreeze as string);
276
- if (txn.assetClawback !== undefined)
277
- txn.assetClawback = address.decodeAddress(txn.assetClawback as string);
278
- if (txn.assetRevocationTarget !== undefined)
279
- txn.assetRevocationTarget = address.decodeAddress(
280
- txn.assetRevocationTarget as string
281
- );
282
- if (txn.freezeAccount !== undefined)
283
- txn.freezeAccount = address.decodeAddress(txn.freezeAccount as string);
284
- if (txn.reKeyTo !== undefined)
285
- txn.reKeyTo = address.decodeAddress(txn.reKeyTo as string);
286
- if (txn.genesisHash === undefined)
287
- throw Error('genesis hash must be specified and in a base64 string.');
288
-
289
- txn.genesisHash = Buffer.from(txn.genesisHash as string, 'base64');
290
-
291
- if (
292
- txn.amount !== undefined &&
293
- (!(
294
- Number.isSafeInteger(txn.amount) ||
295
- (typeof txn.amount === 'bigint' &&
296
- txn.amount <= BigInt('0xffffffffffffffff'))
297
- ) ||
298
- txn.amount < 0)
299
- )
300
- throw Error(
301
- 'Amount must be a positive number and smaller than 2^64-1. If the number is larger than 2^53-1, use bigint.'
302
- );
303
- if (!Number.isSafeInteger(txn.fee) || txn.fee < 0)
304
- throw Error('fee must be a positive number and smaller than 2^53-1');
305
- if (!Number.isSafeInteger(txn.firstRound) || txn.firstRound < 0)
306
- throw Error('firstRound must be a positive number');
307
- if (!Number.isSafeInteger(txn.lastRound) || txn.lastRound < 0)
308
- throw Error('lastRound must be a positive number');
309
- if (
310
- txn.extraPages !== undefined &&
311
- (!Number.isInteger(txn.extraPages) ||
312
- txn.extraPages < 0 ||
313
- txn.extraPages > 3)
314
- )
315
- throw Error('extraPages must be an Integer between and including 0 to 3');
316
- if (
317
- txn.assetTotal !== undefined &&
318
- (!(
319
- Number.isSafeInteger(txn.assetTotal) ||
320
- (typeof txn.assetTotal === 'bigint' &&
321
- txn.assetTotal <= BigInt('0xffffffffffffffff'))
322
- ) ||
323
- txn.assetTotal < 0)
324
- )
325
- throw Error(
326
- 'Total asset issuance must be a positive number and smaller than 2^64-1. If the number is larger than 2^53-1, use bigint.'
327
- );
328
- if (
329
- txn.assetDecimals !== undefined &&
330
- (!Number.isSafeInteger(txn.assetDecimals) ||
331
- txn.assetDecimals < 0 ||
332
- txn.assetDecimals > ALGORAND_MAX_ASSET_DECIMALS)
333
- )
334
- throw Error(
335
- `assetDecimals must be a positive number and smaller than ${ALGORAND_MAX_ASSET_DECIMALS.toString()}`
336
- );
337
- if (
338
- txn.assetIndex !== undefined &&
339
- (!Number.isSafeInteger(txn.assetIndex) || txn.assetIndex < 0)
340
- )
341
- throw Error(
342
- 'Asset index must be a positive number and smaller than 2^53-1'
343
- );
344
- if (
345
- txn.appIndex !== undefined &&
346
- (!Number.isSafeInteger(txn.appIndex) || txn.appIndex < 0)
347
- )
348
- throw Error(
349
- 'Application index must be a positive number and smaller than 2^53-1'
350
- );
351
- if (
352
- txn.appLocalInts !== undefined &&
353
- (!Number.isSafeInteger(txn.appLocalInts) || txn.appLocalInts < 0)
354
- )
355
- throw Error(
356
- 'Application local ints count must be a positive number and smaller than 2^53-1'
357
- );
358
- if (
359
- txn.appLocalByteSlices !== undefined &&
360
- (!Number.isSafeInteger(txn.appLocalByteSlices) ||
361
- txn.appLocalByteSlices < 0)
362
- )
363
- throw Error(
364
- 'Application local byte slices count must be a positive number and smaller than 2^53-1'
365
- );
366
- if (
367
- txn.appGlobalInts !== undefined &&
368
- (!Number.isSafeInteger(txn.appGlobalInts) || txn.appGlobalInts < 0)
369
- )
370
- throw Error(
371
- 'Application global ints count must be a positive number and smaller than 2^53-1'
372
- );
373
- if (
374
- txn.appGlobalByteSlices !== undefined &&
375
- (!Number.isSafeInteger(txn.appGlobalByteSlices) ||
376
- txn.appGlobalByteSlices < 0)
377
- )
378
- throw Error(
379
- 'Application global byte slices count must be a positive number and smaller than 2^53-1'
510
+ if (fieldsPresent.length !== 1) {
511
+ throw new Error(
512
+ `Transaction has wrong number of type fields present (${fieldsPresent.length}): ${fieldsPresent}`
380
513
  );
381
- if (txn.appApprovalProgram !== undefined) {
382
- if (txn.appApprovalProgram.constructor !== Uint8Array)
383
- throw Error('appApprovalProgram must be a Uint8Array.');
384
514
  }
385
- if (txn.appClearProgram !== undefined) {
386
- if (txn.appClearProgram.constructor !== Uint8Array)
387
- throw Error('appClearProgram must be a Uint8Array.');
388
- }
389
- if (txn.appArgs !== undefined) {
390
- if (!Array.isArray(txn.appArgs))
391
- throw Error('appArgs must be an Array of Uint8Array.');
392
- txn.appArgs = txn.appArgs.slice();
393
- txn.appArgs.forEach((arg) => {
394
- if (arg.constructor !== Uint8Array)
395
- throw Error('each element of AppArgs must be a Uint8Array.');
396
- });
397
- } else {
398
- txn.appArgs = [];
399
- }
400
- if (txn.appAccounts !== undefined) {
401
- if (!Array.isArray(txn.appAccounts))
402
- throw Error('appAccounts must be an Array of addresses.');
403
- txn.appAccounts = txn.appAccounts.map((addressAsString) =>
404
- address.decodeAddress(addressAsString)
515
+
516
+ if (this.type !== fieldsPresent[0]) {
517
+ throw new Error(
518
+ `Transaction has type ${this.type} but fields present for ${fieldsPresent[0]}`
405
519
  );
406
520
  }
407
- if (txn.appForeignApps !== undefined) {
408
- if (!Array.isArray(txn.appForeignApps))
409
- throw Error('appForeignApps must be an Array of integers.');
410
- txn.appForeignApps = txn.appForeignApps.slice();
411
- txn.appForeignApps.forEach((foreignAppIndex) => {
412
- if (!Number.isSafeInteger(foreignAppIndex) || foreignAppIndex < 0)
413
- throw Error(
414
- 'each foreign application index must be a positive number and smaller than 2^53-1'
415
- );
416
- });
417
- }
418
- if (txn.appForeignAssets !== undefined) {
419
- if (!Array.isArray(txn.appForeignAssets))
420
- throw Error('appForeignAssets must be an Array of integers.');
421
- txn.appForeignAssets = txn.appForeignAssets.slice();
422
- txn.appForeignAssets.forEach((foreignAssetIndex) => {
423
- if (!Number.isSafeInteger(foreignAssetIndex) || foreignAssetIndex < 0)
424
- throw Error(
425
- 'each foreign asset index must be a positive number and smaller than 2^53-1'
426
- );
427
- });
428
- }
429
- if (txn.boxes !== undefined) {
430
- if (!Array.isArray(txn.boxes))
431
- throw Error('boxes must be an Array of BoxReference.');
432
- txn.boxes = txn.boxes.slice();
433
- txn.boxes.forEach((box) => {
434
- if (
435
- !Number.isSafeInteger(box.appIndex) ||
436
- box.name.constructor !== Uint8Array
437
- )
438
- throw Error(
439
- 'box app index must be a number and name must be an Uint8Array.'
440
- );
441
- });
521
+
522
+ if (params.paymentParams) {
523
+ this.payment = {
524
+ receiver: ensureAddress(params.paymentParams.receiver),
525
+ amount: utils.ensureUint64(params.paymentParams.amount),
526
+ closeRemainderTo: optionalAddress(
527
+ params.paymentParams.closeRemainderTo
528
+ ),
529
+ };
442
530
  }
443
- if (
444
- txn.assetMetadataHash !== undefined &&
445
- txn.assetMetadataHash.length !== 0
446
- ) {
447
- if (typeof txn.assetMetadataHash === 'string') {
448
- txn.assetMetadataHash = new Uint8Array(
449
- Buffer.from(txn.assetMetadataHash)
531
+
532
+ if (params.keyregParams) {
533
+ this.keyreg = {
534
+ voteKey: getKeyregKey(
535
+ params.keyregParams.voteKey,
536
+ 'voteKey',
537
+ KEYREG_VOTE_KEY_LENGTH
538
+ )!,
539
+ selectionKey: getKeyregKey(
540
+ params.keyregParams.selectionKey,
541
+ 'selectionKey',
542
+ KEYREG_SELECTION_KEY_LENGTH
543
+ )!,
544
+ stateProofKey: getKeyregKey(
545
+ params.keyregParams.stateProofKey,
546
+ 'stateProofKey',
547
+ KEYREG_STATE_PROOF_KEY_LENGTH
548
+ )!,
549
+ voteFirst: optionalUint64(params.keyregParams.voteFirst),
550
+ voteLast: optionalUint64(params.keyregParams.voteLast),
551
+ voteKeyDilution: optionalUint64(params.keyregParams.voteKeyDilution),
552
+ nonParticipation: ensureBoolean(
553
+ params.keyregParams.nonParticipation ?? false
554
+ ),
555
+ };
556
+ // Checking non-participation key registration
557
+ if (
558
+ this.keyreg.nonParticipation &&
559
+ (this.keyreg.voteKey ||
560
+ this.keyreg.selectionKey ||
561
+ this.keyreg.stateProofKey ||
562
+ typeof this.keyreg.voteFirst !== 'undefined' ||
563
+ typeof this.keyreg.voteLast !== 'undefined' ||
564
+ typeof this.keyreg.voteKeyDilution !== 'undefined')
565
+ ) {
566
+ throw new Error(
567
+ 'nonParticipation is true but participation params are present.'
450
568
  );
451
569
  }
452
-
570
+ // Checking online key registration
453
571
  if (
454
- txn.assetMetadataHash.constructor !== Uint8Array ||
455
- txn.assetMetadataHash.byteLength !== ASSET_METADATA_HASH_LENGTH
572
+ // If we are participating
573
+ !this.keyreg.nonParticipation &&
574
+ // And *ANY* participating fields are present
575
+ (this.keyreg.voteKey ||
576
+ this.keyreg.selectionKey ||
577
+ this.keyreg.stateProofKey ||
578
+ typeof this.keyreg.voteFirst !== 'undefined' ||
579
+ typeof this.keyreg.voteLast !== 'undefined' ||
580
+ typeof this.keyreg.voteKeyDilution !== 'undefined') &&
581
+ // Then *ALL* participating fields must be present (with an exception for stateProofKey,
582
+ // which was introduced later so for backwards compatibility we don't require it)
583
+ !(
584
+ this.keyreg.voteKey &&
585
+ this.keyreg.selectionKey &&
586
+ typeof this.keyreg.voteFirst !== 'undefined' &&
587
+ typeof this.keyreg.voteLast !== 'undefined' &&
588
+ typeof this.keyreg.voteKeyDilution !== 'undefined'
589
+ )
456
590
  ) {
457
- throw Error(
458
- `assetMetadataHash must be a ${ASSET_METADATA_HASH_LENGTH} byte Uint8Array or string.`
591
+ throw new Error(
592
+ `Online key registration missing at least one of the following fields: voteKey, selectionKey, voteFirst, voteLast, voteKeyDilution`
459
593
  );
460
594
  }
595
+ // The last option is an offline key registration where all the fields
596
+ // nonParticipation, voteKey, selectionKey, stateProofKey, voteFirst, voteLast, voteKeyDilution
597
+ // are all undefined
598
+ }
461
599
 
462
- if (txn.assetMetadataHash.every((value) => value === 0)) {
463
- // if hash contains all 0s, omit it
464
- txn.assetMetadataHash = undefined;
465
- }
466
- } else {
467
- txn.assetMetadataHash = undefined;
600
+ if (params.assetConfigParams) {
601
+ this.assetConfig = {
602
+ assetIndex: utils.ensureUint64(
603
+ params.assetConfigParams.assetIndex ?? 0
604
+ ),
605
+ total: utils.ensureUint64(params.assetConfigParams.total ?? 0),
606
+ decimals: utils.ensureSafeUnsignedInteger(
607
+ params.assetConfigParams.decimals ?? 0
608
+ ),
609
+ defaultFrozen: ensureBoolean(
610
+ params.assetConfigParams.defaultFrozen ?? false
611
+ ),
612
+ manager: optionalAddress(params.assetConfigParams.manager),
613
+ reserve: optionalAddress(params.assetConfigParams.reserve),
614
+ freeze: optionalAddress(params.assetConfigParams.freeze),
615
+ clawback: optionalAddress(params.assetConfigParams.clawback),
616
+ unitName: params.assetConfigParams.unitName,
617
+ assetName: params.assetConfigParams.assetName,
618
+ assetURL: params.assetConfigParams.assetURL,
619
+ assetMetadataHash: optionalFixedLengthByteArray(
620
+ params.assetConfigParams.assetMetadataHash,
621
+ ASSET_METADATA_HASH_LENGTH,
622
+ 'assetMetadataHash'
623
+ ),
624
+ };
468
625
  }
469
- if (txn.note !== undefined) {
470
- if (txn.note.constructor !== Uint8Array)
471
- throw Error('note must be a Uint8Array.');
472
- } else {
473
- txn.note = new Uint8Array(0);
626
+
627
+ if (params.assetTransferParams) {
628
+ this.assetTransfer = {
629
+ assetIndex: utils.ensureUint64(params.assetTransferParams.assetIndex),
630
+ amount: utils.ensureUint64(params.assetTransferParams.amount),
631
+ assetSender: optionalAddress(params.assetTransferParams.assetSender),
632
+ receiver: ensureAddress(params.assetTransferParams.receiver),
633
+ closeRemainderTo: optionalAddress(
634
+ params.assetTransferParams.closeRemainderTo
635
+ ),
636
+ };
474
637
  }
475
- if (txn.lease !== undefined) {
476
- if (txn.lease.constructor !== Uint8Array)
477
- throw Error('lease must be a Uint8Array.');
478
- if (txn.lease.length !== ALGORAND_TRANSACTION_LEASE_LENGTH)
479
- throw Error(
480
- `lease must be of length ${ALGORAND_TRANSACTION_LEASE_LENGTH.toString()}.`
481
- );
482
- if (txn.lease.every((value) => value === 0)) {
483
- // if lease contains all 0s, omit it
484
- txn.lease = new Uint8Array(0);
485
- }
486
- } else {
487
- txn.lease = new Uint8Array(0);
638
+
639
+ if (params.assetFreezeParams) {
640
+ this.assetFreeze = {
641
+ assetIndex: utils.ensureUint64(params.assetFreezeParams.assetIndex),
642
+ freezeAccount: ensureAddress(params.assetFreezeParams.freezeTarget),
643
+ frozen: ensureBoolean(params.assetFreezeParams.frozen),
644
+ };
488
645
  }
489
- txn.voteKey = getKeyregKey(txn.voteKey, 'voteKey', KEYREG_VOTE_KEY_LENGTH);
490
- txn.selectionKey = getKeyregKey(
491
- txn.selectionKey,
492
- 'selectionKey',
493
- KEYREG_SELECTION_KEY_LENGTH
494
- );
495
- txn.stateProofKey = getKeyregKey(
496
- txn.stateProofKey,
497
- 'stateProofKey',
498
- KEYREG_STATE_PROOF_KEY_LENGTH
499
- );
500
- // Checking non-participation key registration
501
- if (
502
- txn.nonParticipation &&
503
- (txn.voteKey ||
504
- txn.selectionKey ||
505
- txn.voteFirst ||
506
- txn.stateProofKey ||
507
- txn.voteLast ||
508
- txn.voteKeyDilution)
509
- ) {
510
- throw new Error(
511
- 'nonParticipation is true but participation params are present.'
512
- );
646
+
647
+ if (params.appCallParams) {
648
+ const { onComplete } = params.appCallParams;
649
+ if (!isOnApplicationComplete(onComplete)) {
650
+ throw new Error(`Invalid onCompletion value: ${onComplete}`);
651
+ }
652
+ this.applicationCall = {
653
+ appIndex: utils.ensureUint64(params.appCallParams.appIndex),
654
+ onComplete,
655
+ numLocalInts: utils.ensureSafeUnsignedInteger(
656
+ params.appCallParams.numLocalInts ?? 0
657
+ ),
658
+ numLocalByteSlices: utils.ensureSafeUnsignedInteger(
659
+ params.appCallParams.numLocalByteSlices ?? 0
660
+ ),
661
+ numGlobalInts: utils.ensureSafeUnsignedInteger(
662
+ params.appCallParams.numGlobalInts ?? 0
663
+ ),
664
+ numGlobalByteSlices: utils.ensureSafeUnsignedInteger(
665
+ params.appCallParams.numGlobalByteSlices ?? 0
666
+ ),
667
+ extraPages: utils.ensureSafeUnsignedInteger(
668
+ params.appCallParams.extraPages ?? 0
669
+ ),
670
+ approvalProgram: ensureUint8Array(
671
+ params.appCallParams.approvalProgram ?? new Uint8Array()
672
+ ),
673
+ clearProgram: ensureUint8Array(
674
+ params.appCallParams.clearProgram ?? new Uint8Array()
675
+ ),
676
+ appArgs: ensureArray(params.appCallParams.appArgs ?? []).map(
677
+ ensureUint8Array
678
+ ),
679
+ accounts: ensureArray(params.appCallParams.accounts ?? []).map(
680
+ ensureAddress
681
+ ),
682
+ foreignApps: ensureArray(params.appCallParams.foreignApps ?? []).map(
683
+ utils.ensureUint64
684
+ ),
685
+ foreignAssets: ensureArray(
686
+ params.appCallParams.foreignAssets ?? []
687
+ ).map(utils.ensureUint64),
688
+ boxes: ensureArray(params.appCallParams.boxes ?? []).map(
689
+ ensureBoxReference
690
+ ),
691
+ };
513
692
  }
514
- // Checking online key registration
515
- if (
516
- !txn.nonParticipation &&
517
- (txn.voteKey ||
518
- txn.selectionKey ||
519
- txn.stateProofKey ||
520
- txn.voteFirst ||
521
- txn.voteLast ||
522
- txn.voteKeyDilution) &&
523
- !(
524
- txn.voteKey &&
525
- txn.selectionKey &&
526
- txn.voteFirst &&
527
- txn.voteLast &&
528
- txn.voteKeyDilution
529
- )
530
- // stateProofKey not included here for backwards compatibility
531
- ) {
532
- throw new Error(
533
- 'online key registration missing at least one of the following fields: ' +
534
- 'voteKey, selectionKey, voteFirst, voteLast, voteKeyDilution'
535
- );
693
+
694
+ if (params.stateProofParams) {
695
+ this.stateProof = {
696
+ stateProofType: utils.ensureSafeUnsignedInteger(
697
+ params.stateProofParams.stateProofType ?? 0
698
+ ),
699
+ stateProof: params.stateProofParams.stateProof,
700
+ message: params.stateProofParams.message,
701
+ };
536
702
  }
537
- // The last option is an offline key registration where all the fields
538
- // nonParticipation, voteKey, selectionKey, voteFirst, voteLast, voteKeyDilution
539
- // are all undefined/false
540
703
 
541
- // Remove unwanted properties and store transaction on instance
542
- delete ((txn as unknown) as AnyTransactionWithParams).suggestedParams;
543
- Object.assign(this, utils.removeUndefinedProperties(txn));
704
+ // Determine fee
705
+ this.fee = utils.ensureUint64(params.suggestedParams.fee);
544
706
 
545
- // Modify Fee
546
- if (!txn.flatFee) {
547
- this.fee *= this.estimateSize();
707
+ const feeDependsOnSize = !ensureBoolean(
708
+ params.suggestedParams.flatFee ?? false
709
+ );
710
+ if (feeDependsOnSize) {
711
+ const minFee = utils.ensureUint64(params.suggestedParams.minFee);
712
+ this.fee *= BigInt(this.estimateSize());
548
713
  // If suggested fee too small and will be rejected, set to min tx fee
549
- if (this.fee < ALGORAND_MIN_TX_FEE) {
550
- this.fee = ALGORAND_MIN_TX_FEE;
714
+ if (this.fee < minFee) {
715
+ this.fee = minFee;
551
716
  }
552
717
  }
718
+ }
553
719
 
554
- // say we are aware of groups
555
- this.group = undefined;
720
+ // eslint-disable-next-line class-methods-use-this
721
+ getEncodingSchema(): encoding.Schema {
722
+ return Transaction.encodingSchema;
723
+ }
724
+
725
+ toEncodingData(): Map<string, unknown> {
726
+ const data = new Map<string, unknown>([
727
+ ['type', this.type],
728
+ ['fv', this.firstValid],
729
+ ['lv', this.lastValid],
730
+ ['snd', this.sender],
731
+ ['gen', this.genesisID],
732
+ ['gh', this.genesisHash],
733
+ ['fee', this.fee],
734
+ ['note', this.note],
735
+ ['lx', this.lease],
736
+ ['rekey', this.rekeyTo],
737
+ ['grp', this.group],
738
+ ]);
739
+
740
+ if (this.payment) {
741
+ data.set('amt', this.payment.amount);
742
+ data.set('rcv', this.payment.receiver);
743
+ data.set('close', this.payment.closeRemainderTo);
744
+ return data;
745
+ }
746
+
747
+ if (this.keyreg) {
748
+ data.set('votekey', this.keyreg.voteKey);
749
+ data.set('selkey', this.keyreg.selectionKey);
750
+ data.set('sprfkey', this.keyreg.stateProofKey);
751
+ data.set('votefst', this.keyreg.voteFirst);
752
+ data.set('votelst', this.keyreg.voteLast);
753
+ data.set('votekd', this.keyreg.voteKeyDilution);
754
+ data.set('nonpart', this.keyreg.nonParticipation);
755
+ return data;
756
+ }
757
+
758
+ if (this.assetConfig) {
759
+ data.set('caid', this.assetConfig.assetIndex);
760
+ const assetParams = new Map<string, unknown>([
761
+ ['t', this.assetConfig.total],
762
+ ['dc', this.assetConfig.decimals],
763
+ ['df', this.assetConfig.defaultFrozen],
764
+ ['m', this.assetConfig.manager],
765
+ ['r', this.assetConfig.reserve],
766
+ ['f', this.assetConfig.freeze],
767
+ ['c', this.assetConfig.clawback],
768
+ ['un', this.assetConfig.unitName],
769
+ ['an', this.assetConfig.assetName],
770
+ ['au', this.assetConfig.assetURL],
771
+ ['am', this.assetConfig.assetMetadataHash],
772
+ ]);
773
+ data.set('apar', assetParams);
774
+ return data;
775
+ }
556
776
 
557
- // stpf fields
558
- if (
559
- txn.stateProofType !== undefined &&
560
- (!Number.isSafeInteger(txn.stateProofType) || txn.stateProofType < 0)
561
- )
562
- throw Error(
563
- 'State Proof type must be a positive number and smaller than 2^53-1'
777
+ if (this.assetTransfer) {
778
+ data.set('xaid', this.assetTransfer.assetIndex);
779
+ data.set('aamt', this.assetTransfer.amount);
780
+ data.set('arcv', this.assetTransfer.receiver);
781
+ data.set('aclose', this.assetTransfer.closeRemainderTo);
782
+ data.set('asnd', this.assetTransfer.assetSender);
783
+ return data;
784
+ }
785
+
786
+ if (this.assetFreeze) {
787
+ data.set('faid', this.assetFreeze.assetIndex);
788
+ data.set('afrz', this.assetFreeze.frozen);
789
+ data.set('fadd', this.assetFreeze.freezeAccount);
790
+ return data;
791
+ }
792
+
793
+ if (this.applicationCall) {
794
+ data.set('apid', this.applicationCall.appIndex);
795
+ data.set('apan', this.applicationCall.onComplete);
796
+ data.set('apaa', this.applicationCall.appArgs);
797
+ data.set('apat', this.applicationCall.accounts);
798
+ data.set('apas', this.applicationCall.foreignAssets);
799
+ data.set('apfa', this.applicationCall.foreignApps);
800
+ data.set(
801
+ 'apbx',
802
+ boxReferencesToEncodingData(
803
+ this.applicationCall.boxes,
804
+ this.applicationCall.foreignApps,
805
+ this.applicationCall.appIndex
806
+ )
564
807
  );
565
- if (txn.stateProofMessage !== undefined) {
566
- if (txn.stateProofMessage.constructor !== Uint8Array)
567
- throw Error('stateProofMessage must be a Uint8Array.');
568
- } else {
569
- txn.stateProofMessage = new Uint8Array(0);
808
+ data.set('apap', this.applicationCall.approvalProgram);
809
+ data.set('apsu', this.applicationCall.clearProgram);
810
+ data.set(
811
+ 'apls',
812
+ new Map<string, number>([
813
+ ['nui', this.applicationCall.numLocalInts],
814
+ ['nbs', this.applicationCall.numLocalByteSlices],
815
+ ])
816
+ );
817
+ data.set(
818
+ 'apgs',
819
+ new Map<string, number>([
820
+ ['nui', this.applicationCall.numGlobalInts],
821
+ ['nbs', this.applicationCall.numGlobalByteSlices],
822
+ ])
823
+ );
824
+ data.set('apep', this.applicationCall.extraPages);
825
+ return data;
570
826
  }
571
- if (txn.stateProof !== undefined) {
572
- if (txn.stateProof.constructor !== Uint8Array)
573
- throw Error('stateProof must be a Uint8Array.');
574
- } else {
575
- txn.stateProof = new Uint8Array(0);
827
+
828
+ if (this.stateProof) {
829
+ data.set('sptype', this.stateProof.stateProofType);
830
+ data.set(
831
+ 'sp',
832
+ this.stateProof.stateProof
833
+ ? this.stateProof.stateProof.toEncodingData()
834
+ : undefined
835
+ );
836
+ data.set(
837
+ 'spmsg',
838
+ this.stateProof.message
839
+ ? this.stateProof.message.toEncodingData()
840
+ : undefined
841
+ );
842
+ return data;
576
843
  }
577
- }
578
844
 
579
- // eslint-disable-next-line camelcase
580
- get_obj_for_encoding() {
581
- if (this.type === 'pay') {
582
- const txn: EncodedTransaction = {
583
- amt: this.amount,
584
- fee: this.fee,
585
- fv: this.firstRound,
586
- lv: this.lastRound,
587
- note: Buffer.from(this.note),
588
- snd: Buffer.from(this.from.publicKey),
589
- type: 'pay',
590
- gen: this.genesisID,
591
- gh: this.genesisHash,
592
- lx: Buffer.from(this.lease),
593
- grp: this.group,
594
- };
845
+ throw new Error(`Unexpected transaction type: ${this.type}`);
846
+ }
595
847
 
596
- // parse close address
597
- if (
598
- this.closeRemainderTo !== undefined &&
599
- address.encodeAddress(this.closeRemainderTo.publicKey) !==
600
- address.ALGORAND_ZERO_ADDRESS_STRING
601
- ) {
602
- txn.close = Buffer.from(this.closeRemainderTo.publicKey);
603
- }
604
- if (this.reKeyTo !== undefined) {
605
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
606
- }
607
- // allowed zero values
608
- if (this.to !== undefined) txn.rcv = Buffer.from(this.to.publicKey);
609
- if (!txn.note.length) delete txn.note;
610
- if (!txn.amt) delete txn.amt;
611
- if (!txn.fee) delete txn.fee;
612
- if (!txn.fv) delete txn.fv;
613
- if (!txn.gen) delete txn.gen;
614
- if (txn.grp === undefined) delete txn.grp;
615
- if (!txn.lx.length) delete txn.lx;
616
- if (!txn.rekey) delete txn.rekey;
617
- return txn;
848
+ static fromEncodingData(data: unknown): Transaction {
849
+ if (!(data instanceof Map)) {
850
+ throw new Error(`Invalid decoded logic sig account: ${data}`);
618
851
  }
619
- if (this.type === 'keyreg') {
620
- const txn: EncodedTransaction = {
621
- fee: this.fee,
622
- fv: this.firstRound,
623
- lv: this.lastRound,
624
- note: Buffer.from(this.note),
625
- snd: Buffer.from(this.from.publicKey),
626
- type: this.type,
627
- gen: this.genesisID,
628
- gh: this.genesisHash,
629
- lx: Buffer.from(this.lease),
630
- grp: this.group,
631
- votekey: this.voteKey,
632
- selkey: this.selectionKey,
633
- sprfkey: this.stateProofKey,
634
- votefst: this.voteFirst,
635
- votelst: this.voteLast,
636
- votekd: this.voteKeyDilution,
637
- };
638
- // allowed zero values
639
- if (!txn.note.length) delete txn.note;
640
- if (!txn.lx.length) delete txn.lx;
641
- if (!txn.fee) delete txn.fee;
642
- if (!txn.fv) delete txn.fv;
643
- if (!txn.gen) delete txn.gen;
644
- if (txn.grp === undefined) delete txn.grp;
645
- if (this.reKeyTo !== undefined) {
646
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
647
- }
648
- if (this.nonParticipation) {
649
- txn.nonpart = true;
650
- }
651
- if (!txn.selkey) delete txn.selkey;
652
- if (!txn.votekey) delete txn.votekey;
653
- if (!txn.sprfkey) delete txn.sprfkey;
654
- if (!txn.votefst) delete txn.votefst;
655
- if (!txn.votelst) delete txn.votelst;
656
- if (!txn.votekd) delete txn.votekd;
657
- return txn;
852
+ const suggestedParams: SuggestedParams = {
853
+ minFee: BigInt(0),
854
+ flatFee: true,
855
+ fee: data.get('fee') ?? 0,
856
+ firstValid: data.get('fv') ?? 0,
857
+ lastValid: data.get('lv') ?? 0,
858
+ genesisHash: data.get('gh'),
859
+ genesisID: data.get('gen'),
860
+ };
861
+
862
+ const txnType = data.get('type');
863
+ if (!isTransactionType(txnType)) {
864
+ throw new Error(`Unrecognized transaction type: ${txnType}`);
658
865
  }
659
- if (this.type === 'acfg') {
660
- // asset creation, or asset reconfigure, or asset destruction
661
- const txn: EncodedTransaction = {
662
- fee: this.fee,
663
- fv: this.firstRound,
664
- lv: this.lastRound,
665
- note: Buffer.from(this.note),
666
- snd: Buffer.from(this.from.publicKey),
667
- type: this.type,
668
- gen: this.genesisID,
669
- gh: this.genesisHash,
670
- lx: Buffer.from(this.lease),
671
- grp: this.group,
672
- caid: this.assetIndex,
673
- apar: {
674
- t: this.assetTotal,
675
- df: this.assetDefaultFrozen,
676
- dc: this.assetDecimals,
677
- },
678
- };
679
- if (this.assetManager !== undefined)
680
- txn.apar.m = Buffer.from(this.assetManager.publicKey);
681
- if (this.assetReserve !== undefined)
682
- txn.apar.r = Buffer.from(this.assetReserve.publicKey);
683
- if (this.assetFreeze !== undefined)
684
- txn.apar.f = Buffer.from(this.assetFreeze.publicKey);
685
- if (this.assetClawback !== undefined)
686
- txn.apar.c = Buffer.from(this.assetClawback.publicKey);
687
- if (this.assetName !== undefined) txn.apar.an = this.assetName;
688
- if (this.assetUnitName !== undefined) txn.apar.un = this.assetUnitName;
689
- if (this.assetURL !== undefined) txn.apar.au = this.assetURL;
690
- if (this.assetMetadataHash !== undefined)
691
- txn.apar.am = Buffer.from(this.assetMetadataHash);
692
-
693
- // allowed zero values
694
- if (!txn.note.length) delete txn.note;
695
- if (!txn.lx.length) delete txn.lx;
696
- if (!txn.amt) delete txn.amt;
697
- if (!txn.fee) delete txn.fee;
698
- if (!txn.fv) delete txn.fv;
699
- if (!txn.gen) delete txn.gen;
700
- if (this.reKeyTo !== undefined) {
701
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
702
- }
703
866
 
704
- if (!txn.caid) delete txn.caid;
705
- if (
706
- !txn.apar.t &&
707
- !txn.apar.un &&
708
- !txn.apar.an &&
709
- !txn.apar.df &&
710
- !txn.apar.m &&
711
- !txn.apar.r &&
712
- !txn.apar.f &&
713
- !txn.apar.c &&
714
- !txn.apar.au &&
715
- !txn.apar.am &&
716
- !txn.apar.dc
717
- ) {
718
- delete txn.apar;
719
- } else {
720
- if (!txn.apar.t) delete txn.apar.t;
721
- if (!txn.apar.dc) delete txn.apar.dc;
722
- if (!txn.apar.un) delete txn.apar.un;
723
- if (!txn.apar.an) delete txn.apar.an;
724
- if (!txn.apar.df) delete txn.apar.df;
725
- if (!txn.apar.m) delete txn.apar.m;
726
- if (!txn.apar.r) delete txn.apar.r;
727
- if (!txn.apar.f) delete txn.apar.f;
728
- if (!txn.apar.c) delete txn.apar.c;
729
- if (!txn.apar.au) delete txn.apar.au;
730
- if (!txn.apar.am) delete txn.apar.am;
731
- }
732
- if (txn.grp === undefined) delete txn.grp;
867
+ const params: TransactionParams = {
868
+ type: txnType,
869
+ sender: data.get('snd') ?? Address.zeroAddress(),
870
+ note: data.get('note'),
871
+ lease: data.get('lx'),
872
+ suggestedParams,
873
+ };
733
874
 
734
- return txn;
875
+ if (data.get('rekey')) {
876
+ params.rekeyTo = data.get('rekey');
735
877
  }
736
- if (this.type === 'axfer') {
737
- // asset transfer, acceptance, revocation, mint, or burn
738
- const txn: EncodedTransaction = {
739
- aamt: this.amount,
740
- fee: this.fee,
741
- fv: this.firstRound,
742
- lv: this.lastRound,
743
- note: Buffer.from(this.note),
744
- snd: Buffer.from(this.from.publicKey),
745
- arcv: Buffer.from(this.to.publicKey),
746
- type: this.type,
747
- gen: this.genesisID,
748
- gh: this.genesisHash,
749
- lx: Buffer.from(this.lease),
750
- grp: this.group,
751
- xaid: this.assetIndex,
878
+
879
+ if (params.type === TransactionType.pay) {
880
+ const paymentParams: PaymentTransactionParams = {
881
+ amount: data.get('amt') ?? 0,
882
+ receiver: data.get('rcv') ?? Address.zeroAddress(),
752
883
  };
753
- if (this.closeRemainderTo !== undefined)
754
- txn.aclose = Buffer.from(this.closeRemainderTo.publicKey);
755
- if (this.assetRevocationTarget !== undefined)
756
- txn.asnd = Buffer.from(this.assetRevocationTarget.publicKey);
757
- // allowed zero values
758
- if (!txn.note.length) delete txn.note;
759
- if (!txn.lx.length) delete txn.lx;
760
- if (!txn.aamt) delete txn.aamt;
761
- if (!txn.amt) delete txn.amt;
762
- if (!txn.fee) delete txn.fee;
763
- if (!txn.fv) delete txn.fv;
764
- if (!txn.gen) delete txn.gen;
765
- if (txn.grp === undefined) delete txn.grp;
766
- if (!txn.aclose) delete txn.aclose;
767
- if (!txn.asnd) delete txn.asnd;
768
- if (!txn.rekey) delete txn.rekey;
769
- if (this.reKeyTo !== undefined) {
770
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
884
+ if (data.get('close')) {
885
+ paymentParams.closeRemainderTo = data.get('close');
771
886
  }
772
- return txn;
773
- }
774
- if (this.type === 'afrz') {
775
- // asset freeze or unfreeze
776
- const txn: EncodedTransaction = {
777
- fee: this.fee,
778
- fv: this.firstRound,
779
- lv: this.lastRound,
780
- note: Buffer.from(this.note),
781
- snd: Buffer.from(this.from.publicKey),
782
- type: this.type,
783
- gen: this.genesisID,
784
- gh: this.genesisHash,
785
- lx: Buffer.from(this.lease),
786
- grp: this.group,
787
- faid: this.assetIndex,
788
- afrz: this.freezeState,
887
+ params.paymentParams = paymentParams;
888
+ } else if (params.type === TransactionType.keyreg) {
889
+ const keyregParams: KeyRegistrationTransactionParams = {
890
+ voteKey: data.get('votekey'),
891
+ selectionKey: data.get('selkey'),
892
+ stateProofKey: data.get('sprfkey'),
893
+ voteFirst: data.get('votefst'),
894
+ voteLast: data.get('votelst'),
895
+ voteKeyDilution: data.get('votekd'),
896
+ nonParticipation: data.get('nonpart'),
789
897
  };
790
- if (this.freezeAccount !== undefined)
791
- txn.fadd = Buffer.from(this.freezeAccount.publicKey);
792
- // allowed zero values
793
- if (!txn.note.length) delete txn.note;
794
- if (!txn.lx.length) delete txn.lx;
795
- if (!txn.amt) delete txn.amt;
796
- if (!txn.fee) delete txn.fee;
797
- if (!txn.fv) delete txn.fv;
798
- if (!txn.gen) delete txn.gen;
799
- if (!txn.afrz) delete txn.afrz;
800
- if (txn.grp === undefined) delete txn.grp;
801
- if (this.reKeyTo !== undefined) {
802
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
803
- }
804
- return txn;
805
- }
806
- if (this.type === 'appl') {
807
- // application call of some kind
808
- const txn: EncodedTransaction = {
809
- fee: this.fee,
810
- fv: this.firstRound,
811
- lv: this.lastRound,
812
- note: Buffer.from(this.note),
813
- snd: Buffer.from(this.from.publicKey),
814
- type: this.type,
815
- gen: this.genesisID,
816
- gh: this.genesisHash,
817
- lx: Buffer.from(this.lease),
818
- grp: this.group,
819
- apid: this.appIndex,
820
- apan: this.appOnComplete,
821
- apls: {
822
- nui: this.appLocalInts,
823
- nbs: this.appLocalByteSlices,
824
- },
825
- apgs: {
826
- nui: this.appGlobalInts,
827
- nbs: this.appGlobalByteSlices,
828
- },
829
- apfa: this.appForeignApps,
830
- apas: this.appForeignAssets,
831
- apep: this.extraPages,
832
- apbx: translateBoxReferences(
833
- this.boxes,
834
- this.appForeignApps,
835
- this.appIndex
836
- ),
898
+ params.keyregParams = keyregParams;
899
+ } else if (params.type === TransactionType.acfg) {
900
+ const assetConfigParams: AssetConfigurationTransactionParams = {
901
+ assetIndex: data.get('caid'),
837
902
  };
838
- if (this.reKeyTo !== undefined) {
839
- txn.rekey = Buffer.from(this.reKeyTo.publicKey);
903
+ if (data.get('apar')) {
904
+ const assetParams = data.get('apar') as Map<string, any>;
905
+ assetConfigParams.total = assetParams.get('t');
906
+ assetConfigParams.decimals = assetParams.get('dc');
907
+ assetConfigParams.defaultFrozen = assetParams.get('df');
908
+ assetConfigParams.unitName = assetParams.get('un');
909
+ assetConfigParams.assetName = assetParams.get('an');
910
+ assetConfigParams.assetURL = assetParams.get('au');
911
+ assetConfigParams.assetMetadataHash = assetParams.get('am');
912
+ if (assetParams.get('m')) {
913
+ assetConfigParams.manager = assetParams.get('m');
914
+ }
915
+ if (assetParams.get('r')) {
916
+ assetConfigParams.reserve = assetParams.get('r');
917
+ }
918
+ if (assetParams.get('f')) {
919
+ assetConfigParams.freeze = assetParams.get('f');
920
+ }
921
+ if (assetParams.get('c')) {
922
+ assetConfigParams.clawback = assetParams.get('c');
923
+ }
840
924
  }
841
- if (this.appApprovalProgram !== undefined) {
842
- txn.apap = Buffer.from(this.appApprovalProgram);
925
+ params.assetConfigParams = assetConfigParams;
926
+ } else if (params.type === TransactionType.axfer) {
927
+ const assetTransferParams: AssetTransferTransactionParams = {
928
+ assetIndex: data.get('xaid') ?? 0,
929
+ amount: data.get('aamt') ?? 0,
930
+ receiver: data.get('arcv') ?? Address.zeroAddress(),
931
+ };
932
+ if (data.get('aclose')) {
933
+ assetTransferParams.closeRemainderTo = data.get('aclose');
843
934
  }
844
- if (this.appClearProgram !== undefined) {
845
- txn.apsu = Buffer.from(this.appClearProgram);
935
+ if (data.get('asnd')) {
936
+ assetTransferParams.assetSender = data.get('asnd');
846
937
  }
847
- if (this.appArgs !== undefined) {
848
- txn.apaa = this.appArgs.map((arg) => Buffer.from(arg));
938
+ params.assetTransferParams = assetTransferParams;
939
+ } else if (params.type === TransactionType.afrz) {
940
+ const assetFreezeParams: AssetFreezeTransactionParams = {
941
+ assetIndex: data.get('faid') ?? 0,
942
+ freezeTarget: data.get('fadd') ?? Address.zeroAddress(),
943
+ frozen: data.get('afrz') ?? false,
944
+ };
945
+ params.assetFreezeParams = assetFreezeParams;
946
+ } else if (params.type === TransactionType.appl) {
947
+ const appCallParams: ApplicationCallTransactionParams = {
948
+ appIndex: data.get('apid') ?? 0,
949
+ onComplete: utils.ensureSafeUnsignedInteger(data.get('apan') ?? 0),
950
+ appArgs: data.get('apaa'),
951
+ accounts: data.get('apat'),
952
+ foreignAssets: data.get('apas'),
953
+ foreignApps: data.get('apfa'),
954
+ approvalProgram: data.get('apap'),
955
+ clearProgram: data.get('apsu'),
956
+ extraPages: data.get('apep'),
957
+ };
958
+ const localSchema = data.get('apls') as Map<string, number> | undefined;
959
+ if (localSchema) {
960
+ appCallParams.numLocalInts = localSchema.get('nui');
961
+ appCallParams.numLocalByteSlices = localSchema.get('nbs');
849
962
  }
850
- if (this.appAccounts !== undefined) {
851
- txn.apat = this.appAccounts.map((decodedAddress) =>
852
- Buffer.from(decodedAddress.publicKey)
853
- );
963
+ const globalSchema = data.get('apgs') as Map<string, number> | undefined;
964
+ if (globalSchema) {
965
+ appCallParams.numGlobalInts = globalSchema.get('nui');
966
+ appCallParams.numGlobalByteSlices = globalSchema.get('nbs');
854
967
  }
855
- // allowed zero values
856
- if (!txn.note.length) delete txn.note;
857
- if (!txn.lx.length) delete txn.lx;
858
- if (!txn.amt) delete txn.amt;
859
- if (!txn.fee) delete txn.fee;
860
- if (!txn.fv) delete txn.fv;
861
- if (!txn.gen) delete txn.gen;
862
- if (!txn.apid) delete txn.apid;
863
- if (!txn.apls.nui) delete txn.apls.nui;
864
- if (!txn.apls.nbs) delete txn.apls.nbs;
865
- if (!txn.apls.nui && !txn.apls.nbs) delete txn.apls;
866
- if (!txn.apgs.nui) delete txn.apgs.nui;
867
- if (!txn.apgs.nbs) delete txn.apgs.nbs;
868
- if (!txn.apaa || !txn.apaa.length) delete txn.apaa;
869
- if (!txn.apgs.nui && !txn.apgs.nbs) delete txn.apgs;
870
- if (!txn.apap) delete txn.apap;
871
- if (!txn.apsu) delete txn.apsu;
872
- if (!txn.apan) delete txn.apan;
873
- if (!txn.apfa || !txn.apfa.length) delete txn.apfa;
874
- if (!txn.apas || !txn.apas.length) delete txn.apas;
875
- for (const box of txn.apbx) {
876
- if (!box.i) delete box.i;
877
- if (!box.n || !box.n.length) delete box.n;
968
+ const boxes = data.get('apbx') as Array<Map<string, unknown>> | undefined;
969
+ if (boxes) {
970
+ appCallParams.boxes = boxes.map((box) => {
971
+ const index = utils.ensureSafeUnsignedInteger(box.get('i') ?? 0);
972
+ const name = ensureUint8Array(box.get('n') ?? new Uint8Array());
973
+ if (index === 0) {
974
+ // We return 0 for the app ID so that it's guaranteed translateBoxReferences will
975
+ // translate the app index back to 0. If we instead returned the called app ID,
976
+ // translateBoxReferences would translate the app index to a nonzero value if the called
977
+ // app is also in the foreign app array.
978
+ return {
979
+ appIndex: 0,
980
+ name,
981
+ };
982
+ }
983
+ if (
984
+ !appCallParams.foreignApps ||
985
+ index > appCallParams.foreignApps.length
986
+ ) {
987
+ throw new Error(
988
+ `Cannot find foreign app index ${index} in ${appCallParams.foreignApps}`
989
+ );
990
+ }
991
+ return {
992
+ appIndex: appCallParams.foreignApps[index - 1],
993
+ name,
994
+ };
995
+ });
878
996
  }
879
- if (!txn.apbx || !txn.apbx.length) delete txn.apbx;
880
- if (!txn.apat || !txn.apat.length) delete txn.apat;
881
- if (!txn.apep) delete txn.apep;
882
- if (txn.grp === undefined) delete txn.grp;
883
- return txn;
884
- }
885
- if (this.type === 'stpf') {
886
- // state proof txn
887
- const txn: EncodedTransaction = {
888
- fee: this.fee,
889
- fv: this.firstRound,
890
- lv: this.lastRound,
891
- note: Buffer.from(this.note),
892
- snd: Buffer.from(this.from.publicKey),
893
- type: this.type,
894
- gen: this.genesisID,
895
- gh: this.genesisHash,
896
- lx: Buffer.from(this.lease),
897
- sptype: this.stateProofType,
898
- spmsg: Buffer.from(this.stateProofMessage),
899
- sp: Buffer.from(this.stateProof),
997
+ params.appCallParams = appCallParams;
998
+ } else if (params.type === TransactionType.stpf) {
999
+ const stateProofParams: StateProofTransactionParams = {
1000
+ stateProofType: data.get('sptype'),
1001
+ stateProof: data.get('sp')
1002
+ ? StateProof.fromEncodingData(data.get('sp'))
1003
+ : undefined,
1004
+ message: data.get('spmsg')
1005
+ ? StateProofMessage.fromEncodingData(data.get('spmsg'))
1006
+ : undefined,
900
1007
  };
901
- // allowed zero values
902
- if (!txn.sptype) delete txn.sptype;
903
- if (!txn.note.length) delete txn.note;
904
- if (!txn.lx.length) delete txn.lx;
905
- if (!txn.amt) delete txn.amt;
906
- if (!txn.fee) delete txn.fee;
907
- if (!txn.fv) delete txn.fv;
908
- if (!txn.gen) delete txn.gen;
909
- if (!txn.apid) delete txn.apid;
910
- if (!txn.apaa || !txn.apaa.length) delete txn.apaa;
911
- if (!txn.apap) delete txn.apap;
912
- if (!txn.apsu) delete txn.apsu;
913
- if (!txn.apan) delete txn.apan;
914
- if (!txn.apfa || !txn.apfa.length) delete txn.apfa;
915
- if (!txn.apas || !txn.apas.length) delete txn.apas;
916
- if (!txn.apat || !txn.apat.length) delete txn.apat;
917
- if (!txn.apep) delete txn.apep;
918
- if (txn.grp === undefined) delete txn.grp;
919
- return txn;
1008
+ params.stateProofParams = stateProofParams;
1009
+ } else {
1010
+ const exhaustiveCheck: never = params.type;
1011
+ throw new Error(`Unexpected transaction type: ${exhaustiveCheck}`);
920
1012
  }
921
1013
 
922
- return undefined;
923
- }
924
-
925
- // eslint-disable-next-line camelcase
926
- static from_obj_for_encoding(txnForEnc: EncodedTransaction): Transaction {
927
- const txn = Object.create(this.prototype) as Transaction;
928
- txn.name = 'Transaction';
929
- txn.tag = Buffer.from('TX');
1014
+ const txn = new Transaction(params);
930
1015
 
931
- txn.genesisID = txnForEnc.gen;
932
- txn.genesisHash = Buffer.from(txnForEnc.gh);
933
- if (!isTransactionType(txnForEnc.type)) {
934
- throw new Error(`Unrecognized transaction type: ${txnForEnc.type}`);
935
- }
936
- txn.type = txnForEnc.type;
937
- txn.fee = txnForEnc.fee;
938
- txn.firstRound = txnForEnc.fv;
939
- txn.lastRound = txnForEnc.lv;
940
- txn.note = new Uint8Array(txnForEnc.note);
941
- txn.lease = new Uint8Array(txnForEnc.lx);
942
- txn.from = address.decodeAddress(
943
- address.encodeAddress(new Uint8Array(txnForEnc.snd))
944
- );
945
- if (txnForEnc.grp !== undefined) txn.group = Buffer.from(txnForEnc.grp);
946
- if (txnForEnc.rekey !== undefined)
947
- txn.reKeyTo = address.decodeAddress(
948
- address.encodeAddress(new Uint8Array(txnForEnc.rekey))
949
- );
950
-
951
- if (txnForEnc.type === 'pay') {
952
- txn.amount = txnForEnc.amt;
953
- txn.to = address.decodeAddress(
954
- address.encodeAddress(new Uint8Array(txnForEnc.rcv))
955
- );
956
- if (txnForEnc.close !== undefined)
957
- txn.closeRemainderTo = address.decodeAddress(
958
- address.encodeAddress(txnForEnc.close)
959
- );
960
- } else if (txnForEnc.type === 'keyreg') {
961
- if (txnForEnc.votekey !== undefined) {
962
- txn.voteKey = Buffer.from(txnForEnc.votekey);
963
- }
964
- if (txnForEnc.selkey !== undefined) {
965
- txn.selectionKey = Buffer.from(txnForEnc.selkey);
966
- }
967
- if (txnForEnc.sprfkey !== undefined) {
968
- txn.stateProofKey = Buffer.from(txnForEnc.sprfkey);
969
- }
970
- if (txnForEnc.votekd !== undefined) {
971
- txn.voteKeyDilution = txnForEnc.votekd;
972
- }
973
- if (txnForEnc.votefst !== undefined) {
974
- txn.voteFirst = txnForEnc.votefst;
975
- }
976
- if (txnForEnc.votelst !== undefined) {
977
- txn.voteLast = txnForEnc.votelst;
978
- }
979
- if (txnForEnc.nonpart !== undefined) {
980
- txn.nonParticipation = txnForEnc.nonpart;
981
- }
982
- } else if (txnForEnc.type === 'acfg') {
983
- // asset creation, or asset reconfigure, or asset destruction
984
- if (txnForEnc.caid !== undefined) {
985
- txn.assetIndex = txnForEnc.caid;
986
- }
987
- if (txnForEnc.apar !== undefined) {
988
- txn.assetTotal = txnForEnc.apar.t;
989
- txn.assetDefaultFrozen = txnForEnc.apar.df;
990
- if (txnForEnc.apar.dc !== undefined)
991
- txn.assetDecimals = txnForEnc.apar.dc;
992
- if (txnForEnc.apar.m !== undefined)
993
- txn.assetManager = address.decodeAddress(
994
- address.encodeAddress(new Uint8Array(txnForEnc.apar.m))
995
- );
996
- if (txnForEnc.apar.r !== undefined)
997
- txn.assetReserve = address.decodeAddress(
998
- address.encodeAddress(new Uint8Array(txnForEnc.apar.r))
999
- );
1000
- if (txnForEnc.apar.f !== undefined)
1001
- txn.assetFreeze = address.decodeAddress(
1002
- address.encodeAddress(new Uint8Array(txnForEnc.apar.f))
1003
- );
1004
- if (txnForEnc.apar.c !== undefined)
1005
- txn.assetClawback = address.decodeAddress(
1006
- address.encodeAddress(new Uint8Array(txnForEnc.apar.c))
1007
- );
1008
- if (txnForEnc.apar.un !== undefined)
1009
- txn.assetUnitName = txnForEnc.apar.un;
1010
- if (txnForEnc.apar.an !== undefined) txn.assetName = txnForEnc.apar.an;
1011
- if (txnForEnc.apar.au !== undefined) txn.assetURL = txnForEnc.apar.au;
1012
- if (txnForEnc.apar.am !== undefined)
1013
- txn.assetMetadataHash = txnForEnc.apar.am;
1014
- }
1015
- } else if (txnForEnc.type === 'axfer') {
1016
- // asset transfer, acceptance, revocation, mint, or burn
1017
- if (txnForEnc.xaid !== undefined) {
1018
- txn.assetIndex = txnForEnc.xaid;
1019
- }
1020
- if (txnForEnc.aamt !== undefined) txn.amount = txnForEnc.aamt;
1021
- if (txnForEnc.aclose !== undefined) {
1022
- txn.closeRemainderTo = address.decodeAddress(
1023
- address.encodeAddress(new Uint8Array(txnForEnc.aclose))
1024
- );
1025
- }
1026
- if (txnForEnc.asnd !== undefined) {
1027
- txn.assetRevocationTarget = address.decodeAddress(
1028
- address.encodeAddress(new Uint8Array(txnForEnc.asnd))
1029
- );
1030
- }
1031
- txn.to = address.decodeAddress(
1032
- address.encodeAddress(new Uint8Array(txnForEnc.arcv))
1033
- );
1034
- } else if (txnForEnc.type === 'afrz') {
1035
- if (txnForEnc.afrz !== undefined) {
1036
- txn.freezeState = txnForEnc.afrz;
1037
- }
1038
- if (txnForEnc.faid !== undefined) {
1039
- txn.assetIndex = txnForEnc.faid;
1040
- }
1041
- txn.freezeAccount = address.decodeAddress(
1042
- address.encodeAddress(new Uint8Array(txnForEnc.fadd))
1043
- );
1044
- } else if (txnForEnc.type === 'appl') {
1045
- if (txnForEnc.apid !== undefined) {
1046
- txn.appIndex = txnForEnc.apid;
1047
- }
1048
- if (txnForEnc.apan !== undefined) {
1049
- txn.appOnComplete = txnForEnc.apan;
1050
- }
1051
- if (txnForEnc.apls !== undefined) {
1052
- if (txnForEnc.apls.nui !== undefined)
1053
- txn.appLocalInts = txnForEnc.apls.nui;
1054
- if (txnForEnc.apls.nbs !== undefined)
1055
- txn.appLocalByteSlices = txnForEnc.apls.nbs;
1056
- }
1057
- if (txnForEnc.apgs !== undefined) {
1058
- if (txnForEnc.apgs.nui !== undefined)
1059
- txn.appGlobalInts = txnForEnc.apgs.nui;
1060
- if (txnForEnc.apgs.nbs !== undefined)
1061
- txn.appGlobalByteSlices = txnForEnc.apgs.nbs;
1062
- }
1063
- if (txnForEnc.apep !== undefined) {
1064
- txn.extraPages = txnForEnc.apep;
1065
- }
1066
- if (txnForEnc.apap !== undefined) {
1067
- txn.appApprovalProgram = new Uint8Array(txnForEnc.apap);
1068
- }
1069
- if (txnForEnc.apsu !== undefined) {
1070
- txn.appClearProgram = new Uint8Array(txnForEnc.apsu);
1071
- }
1072
- if (txnForEnc.apaa !== undefined) {
1073
- txn.appArgs = txnForEnc.apaa.map((arg) => new Uint8Array(arg));
1074
- }
1075
- if (txnForEnc.apat !== undefined) {
1076
- txn.appAccounts = txnForEnc.apat.map((addressBytes) =>
1077
- address.decodeAddress(
1078
- address.encodeAddress(new Uint8Array(addressBytes))
1079
- )
1080
- );
1081
- }
1082
- if (txnForEnc.apfa !== undefined) {
1083
- txn.appForeignApps = txnForEnc.apfa;
1084
- }
1085
- if (txnForEnc.apas !== undefined) {
1086
- txn.appForeignAssets = txnForEnc.apas;
1087
- }
1088
- if (txnForEnc.apbx !== undefined) {
1089
- txn.boxes = txnForEnc.apbx.map((box) => ({
1090
- // We return 0 for the app ID so that it's guaranteed translateBoxReferences will
1091
- // translate the app index back to 0. If we instead returned the called app ID,
1092
- // translateBoxReferences would translate the app index to a nonzero value if the called
1093
- // app is also in the foreign app array.
1094
- appIndex: box.i ? txn.appForeignApps[box.i - 1] : 0,
1095
- name: box.n,
1096
- }));
1097
- }
1098
- } else if (txnForEnc.type === 'stpf') {
1099
- if (txnForEnc.sptype !== undefined) {
1100
- txn.stateProofType = txnForEnc.sptype;
1101
- }
1102
- if (txnForEnc.sp !== undefined) {
1103
- txn.stateProof = txnForEnc.sp;
1104
- }
1105
- if (txnForEnc.spmsg !== undefined) {
1106
- txn.stateProofMessage = txnForEnc.spmsg;
1016
+ if (data.get('grp')) {
1017
+ const group = ensureUint8Array(data.get('grp'));
1018
+ if (group.byteLength !== ALGORAND_TRANSACTION_GROUP_LENGTH) {
1019
+ throw new Error(`Invalid group length: ${group.byteLength}`);
1107
1020
  }
1021
+ txn.group = group;
1108
1022
  }
1023
+
1109
1024
  return txn;
1110
1025
  }
1111
1026
 
1112
- estimateSize() {
1027
+ private estimateSize() {
1113
1028
  return this.toByte().length + NUM_ADDL_BYTES_AFTER_SIGNING;
1114
1029
  }
1115
1030
 
1116
1031
  bytesToSign() {
1117
1032
  const encodedMsg = this.toByte();
1118
- return Buffer.from(utils.concatArrays(this.tag, encodedMsg));
1033
+ return utils.concatArrays(TX_TAG, encodedMsg);
1119
1034
  }
1120
1035
 
1121
1036
  toByte() {
1122
- return encoding.encode(this.get_obj_for_encoding());
1037
+ return encoding.encodeMsgpack(this);
1123
1038
  }
1124
1039
 
1125
1040
  // returns the raw signature
1126
- rawSignTxn(sk: Uint8Array) {
1041
+ rawSignTxn(sk: Uint8Array): Uint8Array {
1127
1042
  const toBeSigned = this.bytesToSign();
1128
1043
  const sig = nacl.sign(toBeSigned, sk);
1129
- return Buffer.from(sig);
1044
+ return sig;
1130
1045
  }
1131
1046
 
1132
- signTxn(sk: Uint8Array) {
1133
- // construct signed message
1134
- const sTxn: EncodedSignedTransaction = {
1135
- sig: this.rawSignTxn(sk),
1136
- txn: this.get_obj_for_encoding(),
1137
- };
1138
- // add AuthAddr if signing with a different key than From indicates
1047
+ signTxn(sk: Uint8Array): Uint8Array {
1048
+ // TODO: deprecate in favor of SignedTransaction class
1139
1049
  const keypair = nacl.keyPairFromSecretKey(sk);
1140
- const pubKeyFromSk = keypair.publicKey;
1141
- if (
1142
- address.encodeAddress(pubKeyFromSk) !==
1143
- address.encodeAddress(this.from.publicKey)
1144
- ) {
1145
- sTxn.sgnr = Buffer.from(pubKeyFromSk);
1146
- }
1147
- return new Uint8Array(encoding.encode(sTxn));
1050
+ const signerAddr = new Address(keypair.publicKey);
1051
+ const sig = this.rawSignTxn(sk);
1052
+ return this.attachSignature(signerAddr, sig);
1148
1053
  }
1149
1054
 
1150
- attachSignature(signerAddr: string, signature: Uint8Array) {
1055
+ attachSignature(
1056
+ signerAddr: string | Address,
1057
+ signature: Uint8Array
1058
+ ): Uint8Array {
1059
+ // TODO: deprecate in favor of SignedTransaction class
1151
1060
  if (!nacl.isValidSignatureLength(signature.length)) {
1152
1061
  throw new Error('Invalid signature length');
1153
1062
  }
1154
- const sTxn: EncodedSignedTransaction = {
1155
- sig: Buffer.from(signature),
1156
- txn: this.get_obj_for_encoding(),
1157
- };
1063
+ const sTxn = new Map<string, unknown>([
1064
+ ['sig', signature],
1065
+ ['txn', this.toEncodingData()],
1066
+ ]);
1067
+ const signerAddrObj = ensureAddress(signerAddr);
1158
1068
  // add AuthAddr if signing with a different key than From indicates
1159
- if (signerAddr !== address.encodeAddress(this.from.publicKey)) {
1160
- const signerPublicKey = address.decodeAddress(signerAddr).publicKey;
1161
- sTxn.sgnr = Buffer.from(signerPublicKey);
1069
+ if (!this.sender.equals(signerAddrObj)) {
1070
+ sTxn.set('sgnr', signerAddrObj);
1162
1071
  }
1163
- return new Uint8Array(encoding.encode(sTxn));
1072
+
1073
+ // This is a hack to avoid a circular reference with the SignedTransaction class
1074
+ const stxnSchema = new NamedMapSchema(
1075
+ allOmitEmpty([
1076
+ {
1077
+ key: 'txn',
1078
+ valueSchema: Transaction.encodingSchema,
1079
+ },
1080
+ {
1081
+ key: 'sig',
1082
+ valueSchema: new FixedLengthByteArraySchema(64),
1083
+ },
1084
+ {
1085
+ key: 'sgnr',
1086
+ valueSchema: new OptionalSchema(new AddressSchema()),
1087
+ },
1088
+ ])
1089
+ );
1090
+
1091
+ return encoding.msgpackRawEncode(stxnSchema.prepareMsgpack(sTxn));
1164
1092
  }
1165
1093
 
1166
- rawTxID() {
1094
+ rawTxID(): Uint8Array {
1167
1095
  const enMsg = this.toByte();
1168
- const gh = Buffer.from(utils.concatArrays(this.tag, enMsg));
1169
- return Buffer.from(nacl.genericHash(gh));
1096
+ const gh = utils.concatArrays(TX_TAG, enMsg);
1097
+ return Uint8Array.from(nacl.genericHash(gh));
1170
1098
  }
1171
1099
 
1172
- txID() {
1100
+ txID(): string {
1173
1101
  const hash = this.rawTxID();
1174
1102
  return base32.encode(hash).slice(0, ALGORAND_TRANSACTION_LENGTH);
1175
1103
  }
1176
-
1177
- // add a lease to a transaction not yet having
1178
- // supply feePerByte to increment fee accordingly
1179
- addLease(lease: Uint8Array, feePerByte = 0) {
1180
- let mutableLease: Uint8Array;
1181
-
1182
- if (lease !== undefined) {
1183
- if (lease.constructor !== Uint8Array)
1184
- throw Error('lease must be a Uint8Array.');
1185
- if (lease.length !== ALGORAND_TRANSACTION_LEASE_LENGTH)
1186
- throw Error(
1187
- `lease must be of length ${ALGORAND_TRANSACTION_LEASE_LENGTH.toString()}.`
1188
- );
1189
-
1190
- mutableLease = new Uint8Array(lease);
1191
- } else {
1192
- mutableLease = new Uint8Array(0);
1193
- }
1194
- this.lease = mutableLease;
1195
- if (feePerByte !== 0) {
1196
- this.fee +=
1197
- (ALGORAND_TRANSACTION_LEASE_LABEL_LENGTH +
1198
- ALGORAND_TRANSACTION_LEASE_LENGTH) *
1199
- feePerByte;
1200
- }
1201
- }
1202
-
1203
- // add the rekey-to field to a transaction not yet having it
1204
- // supply feePerByte to increment fee accordingly
1205
- addRekey(reKeyTo: string, feePerByte = 0) {
1206
- if (reKeyTo !== undefined) {
1207
- this.reKeyTo = address.decodeAddress(reKeyTo);
1208
- }
1209
- if (feePerByte !== 0) {
1210
- this.fee +=
1211
- (ALGORAND_TRANSACTION_REKEY_LABEL_LENGTH +
1212
- ALGORAND_TRANSACTION_ADDRESS_LENGTH) *
1213
- feePerByte;
1214
- }
1215
- }
1216
-
1217
- // build display dict for prettyPrint and toString
1218
- // eslint-disable-next-line no-underscore-dangle
1219
- _getDictForDisplay() {
1220
- const forPrinting: TransactionStorageStructure & Record<string, any> = {
1221
- ...this,
1222
- };
1223
- forPrinting.tag = forPrinting.tag.toString();
1224
- forPrinting.from = address.encodeAddress(
1225
- (forPrinting.from as Address).publicKey
1226
- );
1227
- if (forPrinting.to !== undefined)
1228
- forPrinting.to = address.encodeAddress(
1229
- (forPrinting.to as Address).publicKey
1230
- );
1231
- // things that need fixing:
1232
- if (forPrinting.freezeAccount !== undefined)
1233
- forPrinting.freezeAccount = address.encodeAddress(
1234
- (forPrinting.freezeAccount as Address).publicKey
1235
- );
1236
- if (forPrinting.closeRemainderTo !== undefined)
1237
- forPrinting.closeRemainderTo = address.encodeAddress(
1238
- (forPrinting.closeRemainderTo as Address).publicKey
1239
- );
1240
- if (forPrinting.assetManager !== undefined)
1241
- forPrinting.assetManager = address.encodeAddress(
1242
- (forPrinting.assetManager as Address).publicKey
1243
- );
1244
- if (forPrinting.assetReserve !== undefined)
1245
- forPrinting.assetReserve = address.encodeAddress(
1246
- (forPrinting.assetReserve as Address).publicKey
1247
- );
1248
- if (forPrinting.assetFreeze !== undefined)
1249
- forPrinting.assetFreeze = address.encodeAddress(
1250
- (forPrinting.assetFreeze as Address).publicKey
1251
- );
1252
- if (forPrinting.assetClawback !== undefined)
1253
- forPrinting.assetClawback = address.encodeAddress(
1254
- (forPrinting.assetClawback as Address).publicKey
1255
- );
1256
- if (forPrinting.assetRevocationTarget !== undefined)
1257
- forPrinting.assetRevocationTarget = address.encodeAddress(
1258
- (forPrinting.assetRevocationTarget as Address).publicKey
1259
- );
1260
- if (forPrinting.reKeyTo !== undefined)
1261
- forPrinting.reKeyTo = address.encodeAddress(
1262
- (forPrinting.reKeyTo as Address).publicKey
1263
- );
1264
- forPrinting.genesisHash = forPrinting.genesisHash.toString('base64');
1265
- return forPrinting;
1266
- }
1267
-
1268
- // pretty print the transaction to console
1269
- prettyPrint() {
1270
- // eslint-disable-next-line no-underscore-dangle,no-console
1271
- console.log(this._getDictForDisplay());
1272
- }
1273
-
1274
- // get string representation
1275
- toString() {
1276
- // eslint-disable-next-line no-underscore-dangle
1277
- return JSON.stringify(this._getDictForDisplay());
1278
- }
1279
- }
1280
-
1281
- /**
1282
- * encodeUnsignedSimulateTransaction takes a txnBuilder.Transaction object,
1283
- * converts it into a SignedTransaction-like object, and converts it to a Buffer.
1284
- *
1285
- * Note: this function should only be used to simulate unsigned transactions.
1286
- *
1287
- * @param transactionObject - Transaction object to simulate.
1288
- */
1289
- export function encodeUnsignedSimulateTransaction(
1290
- transactionObject: Transaction
1291
- ) {
1292
- const objToEncode: EncodedSignedTransaction = {
1293
- txn: transactionObject.get_obj_for_encoding(),
1294
- };
1295
- return encoding.encode(objToEncode);
1296
1104
  }
1297
1105
 
1298
1106
  /**
@@ -1300,82 +1108,18 @@ export function encodeUnsignedSimulateTransaction(
1300
1108
  * family of transactions, and converts it to a Buffer
1301
1109
  * @param transactionObject - the completed Transaction object
1302
1110
  */
1303
- export function encodeUnsignedTransaction(transactionObject: Transaction) {
1304
- const objToEncode = transactionObject.get_obj_for_encoding();
1305
- return encoding.encode(objToEncode);
1111
+ export function encodeUnsignedTransaction(
1112
+ transactionObject: Transaction
1113
+ ): Uint8Array {
1114
+ return encoding.encodeMsgpack(transactionObject);
1306
1115
  }
1307
1116
 
1308
1117
  /**
1309
- * decodeUnsignedTransaction takes a Buffer (as if from encodeUnsignedTransaction) and converts it to a txnBuilder.Transaction object
1118
+ * decodeUnsignedTransaction takes a Uint8Array (as if from encodeUnsignedTransaction) and converts it to a txnBuilder.Transaction object
1310
1119
  * @param transactionBuffer - the Uint8Array containing a transaction
1311
1120
  */
1312
1121
  export function decodeUnsignedTransaction(
1313
1122
  transactionBuffer: ArrayLike<number>
1314
- ) {
1315
- const partlyDecodedObject = encoding.decode(
1316
- transactionBuffer
1317
- ) as EncodedTransaction;
1318
- return Transaction.from_obj_for_encoding(partlyDecodedObject);
1319
- }
1320
-
1321
- /**
1322
- * Object representing a transaction with a signature
1323
- */
1324
- export interface SignedTransaction {
1325
- /**
1326
- * Transaction signature
1327
- */
1328
- sig?: Buffer;
1329
-
1330
- /**
1331
- * The transaction that was signed
1332
- */
1333
- txn: Transaction;
1334
-
1335
- /**
1336
- * Multisig structure
1337
- */
1338
- msig?: EncodedMultisig;
1339
-
1340
- /**
1341
- * Logic signature
1342
- */
1343
- lsig?: EncodedLogicSig;
1344
-
1345
- /**
1346
- * The signer, if signing with a different key than the Transaction type `from` property indicates
1347
- */
1348
- sgnr?: Buffer;
1123
+ ): Transaction {
1124
+ return encoding.decodeMsgpack(transactionBuffer, Transaction);
1349
1125
  }
1350
-
1351
- /**
1352
- * decodeSignedTransaction takes a Buffer (from transaction.signTxn) and converts it to an object
1353
- * containing the Transaction (txn), the signature (sig), and the auth-addr field if applicable (sgnr)
1354
- * @param transactionBuffer - the Uint8Array containing a transaction
1355
- * @returns containing a Transaction, the signature, and possibly an auth-addr field
1356
- */
1357
- export function decodeSignedTransaction(
1358
- transactionBuffer: Uint8Array
1359
- ): SignedTransaction {
1360
- const stxnDecoded = encoding.decode(
1361
- transactionBuffer
1362
- ) as EncodedSignedTransaction;
1363
- const stxn: SignedTransaction = {
1364
- ...stxnDecoded,
1365
- txn: Transaction.from_obj_for_encoding(stxnDecoded.txn),
1366
- };
1367
- return stxn;
1368
- }
1369
-
1370
- /**
1371
- * Either a valid transaction object or an instance of the Transaction class
1372
- */
1373
- export type TransactionLike = AnyTransaction | Transaction;
1374
-
1375
- export function instantiateTxnIfNeeded(transactionLike: TransactionLike) {
1376
- return transactionLike instanceof Transaction
1377
- ? transactionLike
1378
- : new Transaction(transactionLike);
1379
- }
1380
-
1381
- export default Transaction;