@aeternity/aepp-sdk 11.0.1 → 12.0.0

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 (376) hide show
  1. package/LICENSE +1 -1
  2. package/dist/aepp-sdk.browser-script.js +1 -1
  3. package/dist/aepp-sdk.browser-script.js.LICENSE.txt +12 -19
  4. package/dist/aepp-sdk.browser-script.js.map +1 -1
  5. package/dist/aepp-sdk.browser.js +1 -1
  6. package/dist/aepp-sdk.browser.js.map +1 -1
  7. package/dist/aepp-sdk.js +1 -1
  8. package/dist/aepp-sdk.js.map +1 -1
  9. package/es/AeSdk.d.ts +37 -0
  10. package/es/AeSdk.mjs +81 -0
  11. package/es/AeSdk.mjs.map +1 -0
  12. package/es/AeSdkAepp.d.ts +69 -0
  13. package/es/AeSdkAepp.mjs +175 -0
  14. package/es/AeSdkAepp.mjs.map +1 -0
  15. package/es/AeSdkBase.d.ts +212 -0
  16. package/es/AeSdkBase.mjs +310 -0
  17. package/es/AeSdkBase.mjs.map +1 -0
  18. package/es/AeSdkWallet.d.ts +103 -0
  19. package/es/AeSdkWallet.mjs +322 -0
  20. package/es/AeSdkWallet.mjs.map +1 -0
  21. package/es/Node.d.ts +44 -0
  22. package/es/Node.mjs +141 -0
  23. package/es/Node.mjs.map +1 -0
  24. package/es/account/Base.d.ts +65 -0
  25. package/es/account/Base.mjs +123 -0
  26. package/es/account/Base.mjs.map +1 -0
  27. package/es/account/Memory.d.ts +25 -0
  28. package/es/account/Memory.mjs +81 -0
  29. package/es/account/Memory.mjs.map +1 -0
  30. package/es/account/Rpc.d.ts +27 -0
  31. package/es/account/Rpc.mjs +79 -0
  32. package/es/account/Rpc.mjs.map +1 -0
  33. package/es/aens.d.ts +209 -0
  34. package/es/aens.mjs +332 -0
  35. package/es/aens.mjs.map +1 -0
  36. package/es/aepp-wallet-communication/connection/Browser.d.ts +32 -0
  37. package/es/aepp-wallet-communication/connection/Browser.mjs +70 -0
  38. package/es/aepp-wallet-communication/connection/Browser.mjs.map +1 -0
  39. package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +17 -0
  40. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +57 -0
  41. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -0
  42. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.d.ts +35 -0
  43. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs +142 -0
  44. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs.map +1 -0
  45. package/es/aepp-wallet-communication/connection-proxy.d.ts +10 -0
  46. package/{src/utils/crypto-ts.ts → es/aepp-wallet-communication/connection-proxy.mjs} +15 -11
  47. package/es/aepp-wallet-communication/connection-proxy.mjs.map +1 -0
  48. package/es/aepp-wallet-communication/rpc/RpcClient.d.ts +33 -0
  49. package/es/aepp-wallet-communication/rpc/RpcClient.mjs +169 -0
  50. package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -0
  51. package/es/aepp-wallet-communication/rpc/types.d.ts +77 -0
  52. package/es/aepp-wallet-communication/rpc/types.mjs +3 -0
  53. package/es/aepp-wallet-communication/rpc/types.mjs.map +1 -0
  54. package/es/aepp-wallet-communication/schema.d.ts +90 -46
  55. package/es/aepp-wallet-communication/schema.mjs +214 -0
  56. package/es/aepp-wallet-communication/schema.mjs.map +1 -0
  57. package/es/aepp-wallet-communication/wallet-detector.d.ts +24 -0
  58. package/es/aepp-wallet-communication/wallet-detector.mjs +63 -0
  59. package/es/aepp-wallet-communication/wallet-detector.mjs.map +1 -0
  60. package/es/apis/compiler/compiler.d.ts +92 -0
  61. package/es/apis/compiler/compiler.mjs +576 -0
  62. package/es/apis/compiler/compiler.mjs.map +1 -0
  63. package/es/apis/compiler/index.d.ts +2 -0
  64. package/es/apis/compiler/index.mjs +3 -0
  65. package/es/apis/compiler/index.mjs.map +1 -0
  66. package/es/apis/compiler/models/index.d.ts +248 -0
  67. package/es/apis/compiler/models/index.mjs +48 -0
  68. package/es/apis/compiler/models/index.mjs.map +1 -0
  69. package/es/apis/compiler/models/mappers.d.ts +23 -0
  70. package/es/apis/compiler/models/mappers.mjs +585 -0
  71. package/es/apis/compiler/models/mappers.mjs.map +1 -0
  72. package/es/apis/compiler/models/parameters.d.ts +13 -0
  73. package/es/apis/compiler/models/parameters.mjs +71 -0
  74. package/es/apis/compiler/models/parameters.mjs.map +1 -0
  75. package/es/apis/node/index.d.ts +2 -0
  76. package/es/apis/node/index.mjs +3 -0
  77. package/es/apis/node/index.mjs.map +1 -0
  78. package/es/apis/node/models/index.d.ts +1061 -0
  79. package/es/apis/node/models/index.mjs +2 -0
  80. package/es/apis/node/models/index.mjs.map +1 -0
  81. package/es/apis/node/models/mappers.d.ts +95 -0
  82. package/es/apis/node/models/mappers.mjs +4164 -0
  83. package/es/apis/node/models/mappers.mjs.map +1 -0
  84. package/es/apis/node/models/parameters.d.ts +17 -0
  85. package/es/apis/node/models/parameters.mjs +165 -0
  86. package/es/apis/node/models/parameters.mjs.map +1 -0
  87. package/es/apis/node/node.d.ts +215 -0
  88. package/es/apis/node/node.mjs +1165 -0
  89. package/es/apis/node/node.mjs.map +1 -0
  90. package/es/chain.d.ts +220 -0
  91. package/es/chain.mjs +524 -0
  92. package/es/chain.mjs.map +1 -0
  93. package/es/channel/handlers.d.ts +34 -0
  94. package/es/channel/handlers.mjs +147 -112
  95. package/es/channel/handlers.mjs.map +1 -1
  96. package/es/channel/index.d.ts +634 -0
  97. package/es/channel/index.mjs +898 -900
  98. package/es/channel/index.mjs.map +1 -1
  99. package/es/channel/internal.d.ts +100 -0
  100. package/es/channel/internal.mjs +97 -51
  101. package/es/channel/internal.mjs.map +1 -1
  102. package/es/contract/Compiler.d.ts +17 -0
  103. package/es/contract/Compiler.mjs +67 -0
  104. package/es/contract/Compiler.mjs.map +1 -0
  105. package/es/contract/aci.d.ts +125 -0
  106. package/es/contract/aci.mjs +199 -180
  107. package/es/contract/aci.mjs.map +1 -1
  108. package/es/contract/ga.d.ts +68 -0
  109. package/es/contract/ga.mjs +190 -0
  110. package/es/contract/ga.mjs.map +1 -0
  111. package/es/contract/methods.d.ts +68 -0
  112. package/es/contract/methods.mjs +101 -0
  113. package/es/contract/methods.mjs.map +1 -0
  114. package/es/index.d.ts +32 -0
  115. package/es/index.mjs +32 -40
  116. package/es/index.mjs.map +1 -1
  117. package/es/oracle.d.ts +154 -0
  118. package/es/oracle.mjs +288 -0
  119. package/es/oracle.mjs.map +1 -0
  120. package/es/spend.d.ts +61 -0
  121. package/es/spend.mjs +122 -0
  122. package/es/spend.mjs.map +1 -0
  123. package/es/tx/builder/constants.d.ts +41 -0
  124. package/es/tx/builder/constants.mjs +11 -19
  125. package/es/tx/builder/constants.mjs.map +1 -1
  126. package/es/tx/builder/field-types.d.ts +62 -0
  127. package/es/tx/builder/field-types.mjs +62 -10
  128. package/es/tx/builder/field-types.mjs.map +1 -1
  129. package/es/tx/builder/helpers.d.ts +131 -0
  130. package/es/tx/builder/helpers.mjs +71 -169
  131. package/es/tx/builder/helpers.mjs.map +1 -1
  132. package/es/tx/builder/index.d.ts +75 -0
  133. package/es/tx/builder/index.mjs +141 -323
  134. package/es/tx/builder/index.mjs.map +1 -1
  135. package/es/tx/builder/schema.d.ts +350 -0
  136. package/es/tx/builder/schema.mjs +173 -510
  137. package/es/tx/builder/schema.mjs.map +1 -1
  138. package/es/tx/index.d.ts +63 -0
  139. package/es/tx/index.mjs +171 -265
  140. package/es/tx/index.mjs.map +1 -1
  141. package/es/tx/min-fee.d.ts +20 -0
  142. package/es/tx/min-fee.mjs +148 -0
  143. package/es/tx/min-fee.mjs.map +1 -0
  144. package/es/tx/validator.d.ts +19 -0
  145. package/es/tx/validator.mjs +64 -71
  146. package/es/tx/validator.mjs.map +1 -1
  147. package/es/typings/@aeternity__argon2-browser/index.d.mjs +2 -0
  148. package/es/typings/@aeternity__argon2-browser/index.d.mjs.map +1 -0
  149. package/es/typings/@aeternity__uuid/index.d.mjs +2 -0
  150. package/es/typings/@aeternity__uuid/index.d.mjs.map +1 -0
  151. package/es/typings/bip32-path/index.d.mjs +2 -0
  152. package/es/typings/bip32-path/index.d.mjs.map +1 -0
  153. package/es/typings/blakejs/index.d.mjs.map +1 -1
  154. package/es/typings/tweetnacl-auth/index.d.mjs +2 -0
  155. package/es/typings/tweetnacl-auth/index.d.mjs.map +1 -0
  156. package/es/utils/amount-formatter.d.ts +42 -0
  157. package/es/utils/amount-formatter.mjs +28 -41
  158. package/es/utils/amount-formatter.mjs.map +1 -1
  159. package/es/utils/autorest.d.ts +6 -0
  160. package/es/utils/autorest.mjs +97 -0
  161. package/es/utils/autorest.mjs.map +1 -0
  162. package/es/utils/bignumber.d.ts +13 -0
  163. package/es/utils/bignumber.mjs +10 -8
  164. package/es/utils/bignumber.mjs.map +1 -1
  165. package/es/{bytes.d.ts → utils/bytes.d.ts} +10 -13
  166. package/es/utils/bytes.mjs +10 -14
  167. package/es/utils/bytes.mjs.map +1 -1
  168. package/es/utils/crypto.d.ts +103 -0
  169. package/es/utils/crypto.mjs +60 -68
  170. package/es/utils/crypto.mjs.map +1 -1
  171. package/es/utils/encoder.d.ts +26 -0
  172. package/es/utils/encoder.mjs +47 -51
  173. package/es/utils/encoder.mjs.map +1 -1
  174. package/es/{errors.d.ts → utils/errors.d.ts} +254 -57
  175. package/es/utils/errors.mjs +318 -125
  176. package/es/utils/errors.mjs.map +1 -1
  177. package/es/utils/hd-wallet.d.ts +34 -0
  178. package/es/utils/hd-wallet.mjs +27 -16
  179. package/es/utils/hd-wallet.mjs.map +1 -1
  180. package/es/utils/json-big.d.ts +5 -0
  181. package/es/utils/json-big.mjs +10 -14
  182. package/es/utils/json-big.mjs.map +1 -1
  183. package/es/utils/keystore.d.ts +51 -0
  184. package/es/utils/keystore.mjs +98 -193
  185. package/es/utils/keystore.mjs.map +1 -1
  186. package/es/{mptree.d.ts → utils/mptree.d.ts} +5 -8
  187. package/es/utils/mptree.mjs +13 -14
  188. package/es/utils/mptree.mjs.map +1 -1
  189. package/es/utils/other.d.ts +14 -0
  190. package/es/utils/other.mjs +21 -36
  191. package/es/utils/other.mjs.map +1 -1
  192. package/es/{semver-satisfies.d.ts → utils/semver-satisfies.d.ts} +0 -0
  193. package/es/utils/semver-satisfies.mjs.map +1 -1
  194. package/es/utils/string.d.ts +24 -0
  195. package/es/utils/string.mjs +8 -10
  196. package/es/utils/string.mjs.map +1 -1
  197. package/package.json +49 -39
  198. package/src/AeSdk.ts +65 -0
  199. package/src/AeSdkAepp.ts +167 -0
  200. package/src/AeSdkBase.ts +320 -0
  201. package/src/AeSdkWallet.ts +332 -0
  202. package/src/Node.ts +167 -0
  203. package/src/account/Base.ts +114 -0
  204. package/src/account/Memory.ts +83 -0
  205. package/src/account/Rpc.ts +67 -0
  206. package/src/aens.ts +391 -0
  207. package/src/aepp-wallet-communication/connection/Browser.ts +68 -0
  208. package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +58 -0
  209. package/src/aepp-wallet-communication/connection/BrowserWindowMessage.ts +111 -0
  210. package/{es/utils/crypto-ts.mjs → src/aepp-wallet-communication/connection-proxy.ts} +16 -17
  211. package/src/aepp-wallet-communication/rpc/RpcClient.ts +137 -0
  212. package/src/aepp-wallet-communication/rpc/types.ts +66 -0
  213. package/src/aepp-wallet-communication/schema.ts +181 -0
  214. package/src/aepp-wallet-communication/wallet-detector.ts +71 -0
  215. package/src/apis/compiler/code-model-v4.yaml +2649 -0
  216. package/src/apis/compiler/compiler.ts +585 -0
  217. package/src/apis/compiler/index.ts +2 -0
  218. package/src/apis/compiler/models/index.ts +301 -0
  219. package/src/apis/compiler/models/mappers.ts +583 -0
  220. package/src/apis/compiler/models/parameters.ts +93 -0
  221. package/src/apis/node/code-model-v4.yaml +10046 -0
  222. package/src/apis/node/index.ts +2 -0
  223. package/src/apis/node/models/index.ts +1253 -0
  224. package/src/apis/node/models/mappers.ts +4278 -0
  225. package/src/apis/node/models/parameters.ts +188 -0
  226. package/src/apis/node/node.ts +1299 -0
  227. package/src/chain.ts +444 -0
  228. package/src/channel/{handlers.js → handlers.ts} +220 -128
  229. package/src/channel/index.ts +991 -0
  230. package/src/channel/internal.ts +345 -0
  231. package/src/contract/Compiler.ts +66 -0
  232. package/src/contract/aci.ts +529 -0
  233. package/src/contract/ga.ts +178 -0
  234. package/src/contract/methods.ts +118 -0
  235. package/src/index.ts +51 -0
  236. package/src/oracle.ts +342 -0
  237. package/src/spend.ts +152 -0
  238. package/src/tx/builder/{constants.js → constants.ts} +12 -16
  239. package/src/tx/builder/field-types.ts +111 -0
  240. package/src/tx/builder/helpers.ts +253 -0
  241. package/src/tx/builder/index.ts +394 -0
  242. package/src/tx/builder/schema.ts +771 -0
  243. package/src/tx/index.ts +199 -0
  244. package/src/tx/min-fee.ts +136 -0
  245. package/src/tx/validator.ts +226 -0
  246. package/src/typings/@aeternity__argon2-browser/index.d.ts +3 -0
  247. package/src/typings/@aeternity__uuid/index.d.ts +3 -0
  248. package/src/typings/bip32-path/index.d.ts +33 -0
  249. package/src/typings/tweetnacl-auth/index.d.ts +14 -0
  250. package/src/utils/amount-formatter.ts +29 -42
  251. package/src/utils/autorest.ts +90 -0
  252. package/src/utils/bignumber.ts +9 -11
  253. package/src/utils/bytes.ts +12 -14
  254. package/src/utils/crypto.ts +217 -0
  255. package/src/utils/encoder.ts +52 -55
  256. package/src/utils/errors.ts +268 -134
  257. package/src/utils/hd-wallet.ts +134 -0
  258. package/src/utils/json-big.ts +26 -0
  259. package/src/utils/keystore.ts +179 -0
  260. package/src/utils/mptree.ts +14 -14
  261. package/src/utils/other.ts +28 -43
  262. package/src/utils/string.ts +8 -10
  263. package/es/account/base.mjs +0 -179
  264. package/es/account/base.mjs.map +0 -1
  265. package/es/account/memory.mjs +0 -99
  266. package/es/account/memory.mjs.map +0 -1
  267. package/es/account/multiple.mjs +0 -179
  268. package/es/account/multiple.mjs.map +0 -1
  269. package/es/ae/aens.mjs +0 -404
  270. package/es/ae/aens.mjs.map +0 -1
  271. package/es/ae/aepp.mjs +0 -45
  272. package/es/ae/aepp.mjs.map +0 -1
  273. package/es/ae/contract.mjs +0 -159
  274. package/es/ae/contract.mjs.map +0 -1
  275. package/es/ae/index.mjs +0 -207
  276. package/es/ae/index.mjs.map +0 -1
  277. package/es/ae/oracle.mjs +0 -339
  278. package/es/ae/oracle.mjs.map +0 -1
  279. package/es/ae/universal.mjs +0 -45
  280. package/es/ae/universal.mjs.map +0 -1
  281. package/es/ae/wallet.mjs +0 -50
  282. package/es/ae/wallet.mjs.map +0 -1
  283. package/es/amount-formatter.d.ts +0 -58
  284. package/es/bignumber.d.ts +0 -18
  285. package/es/chain/index.mjs +0 -272
  286. package/es/chain/index.mjs.map +0 -1
  287. package/es/chain/node.mjs +0 -442
  288. package/es/chain/node.mjs.map +0 -1
  289. package/es/contract/compiler.mjs +0 -115
  290. package/es/contract/compiler.mjs.map +0 -1
  291. package/es/contract/ga/helpers.mjs +0 -30
  292. package/es/contract/ga/helpers.mjs.map +0 -1
  293. package/es/contract/ga/index.mjs +0 -178
  294. package/es/contract/ga/index.mjs.map +0 -1
  295. package/es/crypto-ts.d.ts +0 -9
  296. package/es/encoder.d.ts +0 -26
  297. package/es/node-pool/index.mjs +0 -188
  298. package/es/node-pool/index.mjs.map +0 -1
  299. package/es/node.mjs +0 -133
  300. package/es/node.mjs.map +0 -1
  301. package/es/other.d.ts +0 -31
  302. package/es/string.d.ts +0 -26
  303. package/es/tx/tx-object.mjs +0 -283
  304. package/es/tx/tx-object.mjs.map +0 -1
  305. package/es/tx/tx.mjs +0 -938
  306. package/es/tx/tx.mjs.map +0 -1
  307. package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs +0 -132
  308. package/es/utils/aepp-wallet-communication/connection/browser-runtime.mjs.map +0 -1
  309. package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs +0 -183
  310. package/es/utils/aepp-wallet-communication/connection/browser-window-message.mjs.map +0 -1
  311. package/es/utils/aepp-wallet-communication/connection/index.mjs +0 -87
  312. package/es/utils/aepp-wallet-communication/connection/index.mjs.map +0 -1
  313. package/es/utils/aepp-wallet-communication/content-script-bridge.mjs +0 -98
  314. package/es/utils/aepp-wallet-communication/content-script-bridge.mjs.map +0 -1
  315. package/es/utils/aepp-wallet-communication/helpers.mjs +0 -92
  316. package/es/utils/aepp-wallet-communication/helpers.mjs.map +0 -1
  317. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs +0 -375
  318. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.mjs.map +0 -1
  319. package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs +0 -275
  320. package/es/utils/aepp-wallet-communication/rpc/rpc-client.mjs.map +0 -1
  321. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs +0 -541
  322. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.mjs.map +0 -1
  323. package/es/utils/aepp-wallet-communication/schema.mjs +0 -102
  324. package/es/utils/aepp-wallet-communication/schema.mjs.map +0 -1
  325. package/es/utils/aepp-wallet-communication/wallet-detector.mjs +0 -110
  326. package/es/utils/aepp-wallet-communication/wallet-detector.mjs.map +0 -1
  327. package/es/utils/async-init.mjs +0 -64
  328. package/es/utils/async-init.mjs.map +0 -1
  329. package/es/utils/crypto-ts.mjs.map +0 -1
  330. package/es/utils/swagger.mjs +0 -164
  331. package/es/utils/swagger.mjs.map +0 -1
  332. package/src/account/base.js +0 -153
  333. package/src/account/memory.js +0 -83
  334. package/src/account/multiple.js +0 -162
  335. package/src/ae/aens.js +0 -361
  336. package/src/ae/aepp.js +0 -45
  337. package/src/ae/contract.js +0 -148
  338. package/src/ae/index.js +0 -168
  339. package/src/ae/oracle.js +0 -311
  340. package/src/ae/universal.js +0 -47
  341. package/src/ae/wallet.js +0 -50
  342. package/src/chain/index.js +0 -269
  343. package/src/chain/node.js +0 -320
  344. package/src/channel/index.js +0 -903
  345. package/src/channel/internal.js +0 -236
  346. package/src/contract/aci.js +0 -376
  347. package/src/contract/compiler.js +0 -100
  348. package/src/contract/ga/helpers.js +0 -19
  349. package/src/contract/ga/index.js +0 -150
  350. package/src/index.js +0 -89
  351. package/src/node-pool/index.js +0 -172
  352. package/src/node.js +0 -116
  353. package/src/tx/builder/field-types.js +0 -61
  354. package/src/tx/builder/helpers.js +0 -334
  355. package/src/tx/builder/index.js +0 -465
  356. package/src/tx/builder/schema.js +0 -1100
  357. package/src/tx/index.js +0 -301
  358. package/src/tx/tx-object.js +0 -187
  359. package/src/tx/tx.js +0 -631
  360. package/src/tx/validator.js +0 -181
  361. package/src/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -119
  362. package/src/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -165
  363. package/src/utils/aepp-wallet-communication/connection/index.js +0 -85
  364. package/src/utils/aepp-wallet-communication/content-script-bridge.js +0 -86
  365. package/src/utils/aepp-wallet-communication/helpers.js +0 -60
  366. package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -294
  367. package/src/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -232
  368. package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -401
  369. package/src/utils/aepp-wallet-communication/schema.ts +0 -80
  370. package/src/utils/aepp-wallet-communication/wallet-detector.js +0 -92
  371. package/src/utils/async-init.js +0 -45
  372. package/src/utils/crypto.js +0 -219
  373. package/src/utils/hd-wallet.js +0 -100
  374. package/src/utils/json-big.js +0 -26
  375. package/src/utils/keystore.js +0 -219
  376. package/src/utils/swagger.js +0 -156
@@ -0,0 +1,529 @@
1
+ /*
2
+ * ISC License (ISC)
3
+ * Copyright (c) 2022 aeternity developers
4
+ *
5
+ * Permission to use, copy, modify, and/or distribute this software for any
6
+ * purpose with or without fee is hereby granted, provided that the above
7
+ * copyright notice and this permission notice appear in all copies.
8
+ *
9
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ * PERFORMANCE OF THIS SOFTWARE.
16
+ */
17
+ // @ts-expect-error TODO remove
18
+ import { Encoder as Calldata } from '@aeternity/aepp-calldata'
19
+ import { DRY_RUN_ACCOUNT, GAS_MAX, TX_TYPE, AMOUNT, AensName } from '../tx/builder/schema'
20
+ import { buildContractIdByContractTx, unpackTx } from '../tx/builder'
21
+ import { _buildTx } from '../tx'
22
+ import { send } from '../spend'
23
+ import { decode, EncodedData, EncodingType } from '../utils/encoder'
24
+ import {
25
+ MissingContractDefError,
26
+ MissingContractAddressError,
27
+ InactiveContractError,
28
+ BytecodeMismatchError,
29
+ DuplicateContractError,
30
+ MissingFunctionNameError,
31
+ InvalidMethodInvocationError,
32
+ NotPayableFunctionError,
33
+ TypeError,
34
+ NodeInvocationError,
35
+ IllegalArgumentError,
36
+ NoSuchContractFunctionError,
37
+ MissingEventDefinitionError,
38
+ AmbiguousEventDefinitionError,
39
+ UnexpectedTsError
40
+ } from '../utils/errors'
41
+ import { hash } from '../utils/crypto'
42
+ import { Aci as BaseAci } from '../apis/compiler'
43
+ import Compiler from './Compiler'
44
+ import Node from '../Node'
45
+ import {
46
+ getAccount, getContract, getContractByteCode, getKeyBlock, resolveName, txDryRun
47
+ } from '../chain'
48
+ import AccountBase from '../account/Base'
49
+
50
+ interface FunctionACI {
51
+ arguments: any[]
52
+ name: string
53
+ payable: boolean
54
+ returns: string
55
+ stateful: boolean
56
+ }
57
+
58
+ interface Aci extends BaseAci {
59
+ encodedAci: {
60
+ contract: {
61
+ name: string
62
+ event: any
63
+ kind: string
64
+ state: any
65
+ type_defs: any[]
66
+ functions: FunctionACI[]
67
+ }
68
+ }
69
+ externalEncodedAci: any[]
70
+ }
71
+
72
+ interface Event {
73
+ address: EncodedData<'ct'>
74
+ data: string
75
+ topics: Array<string | number>
76
+ }
77
+
78
+ interface DecodedEvent {
79
+ name: string
80
+ args: unknown
81
+ contract: {
82
+ name: string
83
+ address: EncodedData<'ct'>
84
+ }
85
+ }
86
+
87
+ type TxData = Awaited<ReturnType<typeof send>>
88
+
89
+ export interface ContractInstance {
90
+ _aci: Aci
91
+ _name: string
92
+ calldata: any
93
+ source?: string
94
+ bytecode?: EncodedData<'cb'>
95
+ deployInfo: {
96
+ address?: EncodedData<'ct'>
97
+ result?: {
98
+ callerId: string
99
+ callerNonce: string
100
+ contractId: string
101
+ gasPrice: bigint
102
+ gasUsed: number
103
+ height: number
104
+ log: any[]
105
+ returnType: string
106
+ returnValue: string
107
+ }
108
+ owner?: EncodedData<'ak'>
109
+ transaction?: string
110
+ rawTx?: string
111
+ txData?: TxData
112
+ }
113
+ options: any
114
+ compile: (options?: {}) => Promise<EncodedData<'cb'>>
115
+ _estimateGas: (name: string, params: any[], options: object) => Promise<number>
116
+ deploy: (params?: any[], options?: object) => Promise<any>
117
+ call: (fn: string, params?: any[], options?: {}) => Promise<{
118
+ hash: string
119
+ tx: any
120
+ txData: TxData
121
+ rawTx: string
122
+ result: {
123
+ callerId: EncodedData<'ak'>
124
+ callerNonce: number
125
+ contractId: EncodedData<'ct'>
126
+ gasPrice: number
127
+ gasUsed: number
128
+ height: number
129
+ log: any[]
130
+ returnType: string
131
+ returnValue: string
132
+ }
133
+ decodedResult: any
134
+ decodedEvents: DecodedEvent[]
135
+ }>
136
+ decodeEvents: (
137
+ events: Event[], options?: { omitUnknown?: boolean, contractAddressToName?: any }
138
+ ) => DecodedEvent[]
139
+ methods: any
140
+ }
141
+
142
+ type ContractCallReturnType = 'ok' | 'error' | 'revert'
143
+
144
+ /**
145
+ * Generate contract ACI object with predefined js methods for contract usage - can be used for
146
+ * creating a reference to already deployed contracts
147
+ * @param options - Options object
148
+ * @returns JS Contract API
149
+ * @example
150
+ * ```js
151
+ * const contractIns = await aeSdk.getContractInstance({ source })
152
+ * await contractIns.deploy([321]) or await contractIns.methods.init(321)
153
+ * const callResult = await contractIns.call('setState', [123]) or
154
+ * await contractIns.methods.setState.send(123, options)
155
+ * const staticCallResult = await contractIns.call('setState', [123], { callStatic: true }) or
156
+ * await contractIns.methods.setState.get(123, options)
157
+ * ```
158
+ * Also you can call contract like: `await contractIns.methods.setState(123, options)`
159
+ * Then sdk decide to make on-chain or static call(dry-run API) transaction based on function is
160
+ * stateful or not
161
+ */
162
+ export default async function getContractInstance ({
163
+ onAccount,
164
+ onCompiler,
165
+ onNode,
166
+ source,
167
+ bytecode,
168
+ aci: _aci,
169
+ contractAddress,
170
+ fileSystem = {},
171
+ validateBytecode,
172
+ ...otherOptions
173
+ }: {
174
+ onAccount: AccountBase
175
+ onCompiler: Compiler
176
+ onNode: Node
177
+ source?: string
178
+ bytecode?: EncodedData<'cb'>
179
+ aci?: Aci
180
+ contractAddress?: EncodedData<'ct'> | AensName
181
+ fileSystem?: Record<string, string>
182
+ validateBytecode?: boolean
183
+ [key: string]: any
184
+ }): Promise<ContractInstance> {
185
+ if (_aci == null && source != null) {
186
+ // TODO: should be fixed when the compiledAci interface gets updated
187
+ _aci = await onCompiler.generateACI({ code: source, options: { fileSystem } }) as Aci
188
+ }
189
+ if (_aci == null) throw new MissingContractDefError()
190
+
191
+ if (contractAddress != null) {
192
+ contractAddress = await resolveName(
193
+ contractAddress, 'contract_pubkey', { resolveByNode: true, onNode }
194
+ ) as EncodedData<'ct'>
195
+ }
196
+
197
+ if (contractAddress == null && source == null && bytecode == null) {
198
+ throw new MissingContractAddressError('Can\'t create instance by ACI without address')
199
+ }
200
+
201
+ if (contractAddress != null) {
202
+ const contract = await getContract(contractAddress, { onNode })
203
+ if (contract.active == null) throw new InactiveContractError(contractAddress)
204
+ }
205
+
206
+ const instance: ContractInstance = {
207
+ _aci,
208
+ _name: _aci.encodedAci.contract.name,
209
+ calldata: new Calldata([_aci.encodedAci, ..._aci.externalEncodedAci]),
210
+ source,
211
+ bytecode,
212
+ deployInfo: { address: contractAddress },
213
+ options: {
214
+ onAccount,
215
+ onCompiler,
216
+ onNode,
217
+ amount: AMOUNT,
218
+ callStatic: false,
219
+ fileSystem,
220
+ ...otherOptions
221
+ },
222
+ compile: async function (_options?: {}): Promise<any> {},
223
+ _estimateGas: async function (
224
+ _name: string, _params: any[], _options: object
225
+ ): Promise<any> {},
226
+ deploy: async function (_params?: any[], _options?: any): Promise<any> {},
227
+ call: async function (_fn: string, _params?: any[], _options?: {}): Promise<any> {},
228
+ decodeEvents (_events: Event[], options?: { omitUnknown?: boolean }): any {},
229
+ methods: undefined
230
+ }
231
+
232
+ if (validateBytecode != null) {
233
+ if (contractAddress == null) throw new MissingContractAddressError('Can\'t validate bytecode without contract address')
234
+ const onChanBytecode = (await getContractByteCode(contractAddress, { onNode })).bytecode
235
+ const isValid: boolean = source != null
236
+ ? await onCompiler.validateByteCode(
237
+ { bytecode: onChanBytecode, source, options: instance.options }
238
+ ).then(() => true, () => false)
239
+ : bytecode === onChanBytecode
240
+ if (!isValid) throw new BytecodeMismatchError(source != null ? 'source' : 'bytecode')
241
+ }
242
+
243
+ /**
244
+ * Compile contract
245
+ * @returns bytecode
246
+ */
247
+ instance.compile = async (options = {}): Promise<EncodedData<'cb'>> => {
248
+ if (instance.bytecode != null) throw new IllegalArgumentError('Contract already compiled')
249
+ if (instance.source == null) throw new IllegalArgumentError('Can\'t compile without source code')
250
+ instance.bytecode = (await onCompiler.compileContract({
251
+ code: instance.source, options: { ...instance.options, ...options }
252
+ })).bytecode as EncodedData<'cb'>
253
+ return instance.bytecode
254
+ }
255
+
256
+ const sendAndProcess = async (tx: EncodedData<'tx'>, options: any): Promise<{
257
+ result?: ContractInstance['deployInfo']['result']
258
+ hash: TxData['hash']
259
+ tx: Awaited<ReturnType<typeof unpackTx<TX_TYPE.contractCall | TX_TYPE.contractCreate>>>
260
+ txData: TxData
261
+ rawTx: EncodedData<'tx'>
262
+ }> => {
263
+ options = { ...instance.options, ...options }
264
+ const txData = await send(tx, options)
265
+ const result = {
266
+ hash: txData.hash,
267
+ tx: unpackTx<TX_TYPE.contractCall | TX_TYPE.contractCreate>(txData.rawTx),
268
+ txData,
269
+ rawTx: txData.rawTx
270
+ }
271
+ if (txData.blockHeight == null) return result
272
+ const { callInfo } = await onNode.getTransactionInfoByHash(txData.hash)
273
+ Object.assign(result.txData, callInfo) // TODO: don't duplicate data in result
274
+ // @ts-expect-error TODO api should be updated to match types
275
+ handleCallError(callInfo, tx)
276
+ return { ...result, result: callInfo }
277
+ }
278
+ const handleCallError = (
279
+ { returnType, returnValue }: {
280
+ returnType: ContractCallReturnType
281
+ returnValue: EncodedData<EncodingType>
282
+ },
283
+ transaction: string): void => {
284
+ let message: string
285
+ switch (returnType) {
286
+ case 'ok': return
287
+ case 'revert':
288
+ message = instance.calldata.decodeFateString(returnValue)
289
+ break
290
+ case 'error':
291
+ message = decode(returnValue).toString()
292
+ break
293
+ }
294
+ throw new NodeInvocationError(message, transaction)
295
+ }
296
+
297
+ instance._estimateGas = async (
298
+ name: string, params: any[], options: object): Promise<number> => {
299
+ const { result: { gasUsed } } =
300
+ await instance.call(name, params, { ...options, callStatic: true })
301
+ // taken from https://github.com/aeternity/aepp-sdk-js/issues/1286#issuecomment-977814771
302
+ return Math.floor(gasUsed * 1.25)
303
+ }
304
+
305
+ /**
306
+ * Deploy contract
307
+ * @param params - Contract init function arguments array
308
+ * @param options - Options
309
+ * @returns deploy info
310
+ */
311
+ instance.deploy = async (params = [],
312
+ options:
313
+ Parameters<typeof instance.compile>[0] &
314
+ Parameters<typeof instance.call>[2] &
315
+ Parameters<AccountBase['address']>[0] &
316
+ Parameters<typeof sendAndProcess>[1]
317
+ ): Promise<ContractInstance['deployInfo']> => {
318
+ const opt = { ...instance.options, ...options }
319
+ if (instance.bytecode == null) await instance.compile(opt)
320
+ // @ts-expect-error
321
+ if (opt.callStatic === true) return await instance.call('init', params, opt)
322
+ if (instance.deployInfo.address != null) throw new DuplicateContractError()
323
+
324
+ const ownerId = await opt.onAccount.address(options)
325
+ const tx = await _buildTx(TX_TYPE.contractCreate, {
326
+ ...opt,
327
+ gasLimit: opt.gasLimit ?? await instance._estimateGas('init', params, opt),
328
+ callData: instance.calldata.encode(instance._name, 'init', params),
329
+ code: instance.bytecode,
330
+ ownerId,
331
+ onNode
332
+ })
333
+ const contractId = buildContractIdByContractTx(tx)
334
+ const { hash, rawTx, result, txData } = await sendAndProcess(tx, opt)
335
+ instance.deployInfo = Object.freeze({
336
+ result,
337
+ owner: ownerId,
338
+ transaction: hash,
339
+ rawTx,
340
+ txData,
341
+ address: contractId
342
+ })
343
+ return instance.deployInfo
344
+ }
345
+
346
+ /**
347
+ * Get function schema from contract ACI object
348
+ * @param name - Function name
349
+ * @returns function ACI
350
+ */
351
+ function getFunctionACI (name: string): Partial<FunctionACI> {
352
+ const fn = instance._aci.encodedAci.contract.functions.find(
353
+ (f: { name: string }) => f.name === name)
354
+ if (fn != null) {
355
+ return fn
356
+ }
357
+ if (name === 'init') return { payable: false }
358
+ throw new NoSuchContractFunctionError(`Function ${name} doesn't exist in contract`)
359
+ }
360
+
361
+ /**
362
+ * Call contract function
363
+ * @param fn - Function name
364
+ * @param params - Array of function arguments
365
+ * @param options - Array of function arguments
366
+ * @returns CallResult
367
+ */
368
+ instance.call = async (fn: string, params: any[] = [], options: object = {}) => {
369
+ const opt = { ...instance.options, ...options }
370
+ const fnACI = getFunctionACI(fn)
371
+ const contractId = instance.deployInfo.address
372
+
373
+ if (fn == null) throw new MissingFunctionNameError()
374
+ if (fn === 'init' && opt.callStatic === false) throw new InvalidMethodInvocationError('"init" can be called only via dryRun')
375
+ if (contractId == null && fn !== 'init') throw new InvalidMethodInvocationError('You need to deploy contract before calling!')
376
+ if (fn !== 'init' && opt.amount > 0 && fnACI.payable === false) throw new NotPayableFunctionError(opt.amount, fn)
377
+
378
+ const callerId = await Promise.resolve()
379
+ .then(() => opt.onAccount.address(opt))
380
+ .catch((error: any) => {
381
+ if (opt.callStatic === true) return DRY_RUN_ACCOUNT.pub
382
+ else throw error
383
+ }) as EncodedData<'ak'>
384
+ const callData = instance.calldata.encode(instance._name, fn, params)
385
+
386
+ let res: any
387
+ if (opt.callStatic === true) {
388
+ if (typeof opt.top === 'number') {
389
+ opt.top = (await getKeyBlock(opt.top, { onNode })).hash
390
+ }
391
+ const txOpt = {
392
+ ...opt,
393
+ onNode,
394
+ gasLimit: opt.gasLimit ?? GAS_MAX,
395
+ callData
396
+ }
397
+ if (opt.nonce == null && opt.top != null) {
398
+ opt.nonce = (await getAccount(callerId, { hash: opt.top, onNode })).nonce + 1
399
+ }
400
+ const tx = await (fn === 'init'
401
+ ? _buildTx(TX_TYPE.contractCreate, { ...txOpt, code: instance.bytecode, ownerId: callerId })
402
+ : _buildTx(TX_TYPE.contractCall, { ...txOpt, callerId, contractId }))
403
+
404
+ const { callObj, ...dryRunOther } = await txDryRun(tx, callerId, { onNode, ...opt })
405
+ if (callObj == null) throw new UnexpectedTsError()
406
+ handleCallError({
407
+ returnType: callObj.returnType as ContractCallReturnType,
408
+ returnValue: callObj.returnValue as EncodedData<EncodingType>
409
+ }, tx)
410
+ res = { ...dryRunOther, tx: unpackTx(tx), result: callObj }
411
+ } else {
412
+ const tx = await _buildTx(TX_TYPE.contractCall, {
413
+ ...opt,
414
+ onNode,
415
+ gasLimit: opt.gasLimit ?? await instance._estimateGas(fn, params, opt),
416
+ callerId,
417
+ contractId,
418
+ callData
419
+ })
420
+ res = await sendAndProcess(tx, opt)
421
+ }
422
+ if (opt.callStatic === true || res.txData.blockHeight != null) {
423
+ res.decodedResult = fnACI.returns != null && fnACI.returns !== 'unit' && fn !== 'init' &&
424
+ instance.calldata.decode(instance._name, fn, res.result.returnValue)
425
+ res.decodedEvents = instance.decodeEvents(res.result.log, opt)
426
+ }
427
+ return res
428
+ }
429
+
430
+ /**
431
+ * @param address - Contract address that emitted event
432
+ * @param nameHash - Hash of emitted event name
433
+ * @param options - Options
434
+ * @returns Contract name
435
+ * @throws {@link MissingEventDefinitionError}
436
+ * @throws {@link AmbiguousEventDefinitionError}
437
+ */
438
+ function getContractNameByEvent (
439
+ address: EncodedData<'ct'>,
440
+ nameHash: BigInt,
441
+ { contractAddressToName }: { contractAddressToName?: { [key: EncodedData<'ct'>]: string } }
442
+ ): string {
443
+ const addressToName = { ...instance.options.contractAddressToName, ...contractAddressToName }
444
+ if (addressToName[address] != null) return addressToName[address]
445
+
446
+ const matchedEvents = [
447
+ instance._aci.encodedAci,
448
+ ...instance._aci.externalEncodedAci
449
+ ]
450
+ .filter(({ contract }) => contract?.event)
451
+ .map(({ contract }) => [contract.name, contract.event.variant])
452
+ .map(([name, events]) => events.map((event: {}) => [name, Object.keys(event)[0]]))
453
+ .flat()
454
+ .filter(([, eventName]) => BigInt('0x' + hash(eventName).toString('hex')) === nameHash)
455
+ switch (matchedEvents.length) {
456
+ case 0: throw new MissingEventDefinitionError(nameHash.toString(), address)
457
+ case 1: return matchedEvents[0][0]
458
+ default: throw new AmbiguousEventDefinitionError(address, matchedEvents)
459
+ }
460
+ }
461
+
462
+ /**
463
+ * Decode Events
464
+ * @param events - Array of encoded events (callRes.result.log)
465
+ * @param options - Options
466
+ * @returns DecodedEvents
467
+ */
468
+ instance.decodeEvents = (
469
+ events: Event[],
470
+ { omitUnknown, ...opt }: { omitUnknown?: boolean } = {}
471
+ ): DecodedEvent[] => events
472
+ .map(event => {
473
+ const topics = event.topics.map((t: string | number) => BigInt(t))
474
+ let contractName
475
+ try {
476
+ contractName = getContractNameByEvent(event.address, topics[0], opt)
477
+ } catch (error) {
478
+ if ((omitUnknown ?? false) && error instanceof MissingEventDefinitionError) return null
479
+ throw error
480
+ }
481
+ const decoded = instance.calldata.decodeEvent(contractName, event.data, topics)
482
+ const [name, args] = Object.entries(decoded)[0]
483
+ return {
484
+ name,
485
+ args,
486
+ contract: {
487
+ name: contractName,
488
+ address: event.address
489
+ }
490
+ }
491
+ }).filter((e: DecodedEvent | null): e is DecodedEvent => e != null)
492
+
493
+ /**
494
+ * Generate proto function based on contract function using Contract ACI schema
495
+ * All function can be called like:
496
+ * ```js
497
+ * await contract.methods.testFunction()
498
+ * ```
499
+ * then sdk will decide to use dry-run or send tx
500
+ * on-chain base on if function stateful or not.
501
+ * Also, you can manually do that:
502
+ * ```js
503
+ * await contract.methods.testFunction.get() // use call-static (dry-run)
504
+ * await contract.methods.testFunction.send() // send tx on-chain
505
+ * ```
506
+ */
507
+ instance.methods = Object.fromEntries(instance._aci.encodedAci.contract.functions
508
+ .map(({ name, arguments: aciArgs, stateful }: FunctionACI) => {
509
+ const genHandler = (callStatic: boolean) => async (...args: any[]) => {
510
+ const options = args.length === aciArgs.length + 1 ? args.pop() : {}
511
+ if (typeof options !== 'object') throw new TypeError(`Options should be an object: ${options as string}`)
512
+ if (name === 'init') return await instance.deploy(args, { callStatic, ...options })
513
+ return await instance.call(name, args, { callStatic, ...options })
514
+ }
515
+ return [
516
+ name,
517
+ Object.assign(
518
+ genHandler(name === 'init' ? false : !stateful),
519
+ {
520
+ get: genHandler(true),
521
+ send: genHandler(false)
522
+ }
523
+ )
524
+ ]
525
+ })
526
+ )
527
+
528
+ return instance
529
+ }
@@ -0,0 +1,178 @@
1
+ /*
2
+ * ISC License (ISC)
3
+ * Copyright (c) 2022 aeternity developers
4
+ *
5
+ * Permission to use, copy, modify, and/or distribute this software for any
6
+ * purpose with or without fee is hereby granted, provided that the above
7
+ * copyright notice and this permission notice appear in all copies.
8
+ *
9
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
10
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11
+ * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
12
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
14
+ * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15
+ * PERFORMANCE OF THIS SOFTWARE.
16
+ */
17
+
18
+ /**
19
+ * Generalized Account module - routines to use generalized account
20
+ */
21
+
22
+ import { TX_TYPE, MAX_AUTH_FUN_GAS, TxSchema } from '../tx/builder/schema'
23
+ import { buildContractIdByContractTx, buildTx, BuiltTx, TxUnpacked, unpackTx } from '../tx/builder'
24
+ import { _buildTx, BuildTxOptions, getVmVersion, prepareTxParams } from '../tx'
25
+ import { hash } from '../utils/crypto'
26
+ import { decode, EncodedData } from '../utils/encoder'
27
+ import { IllegalArgumentError, MissingParamError, InvalidAuthDataError } from '../utils/errors'
28
+ import { concatBuffers } from '../utils/other'
29
+ import AccountBase from '../account/Base'
30
+ import { getContractInstance } from './methods'
31
+ import { send, SendOptions } from '../spend'
32
+ import Node from '../Node'
33
+ import { getAccount } from '../chain'
34
+ import Compiler from './Compiler'
35
+
36
+ /**
37
+ * Check if account is GA
38
+ * @param address - Account address
39
+ * @param options - Options
40
+ * @returns if account is GA
41
+ */
42
+ export async function isGA (
43
+ address: EncodedData<'ak'>, options: Parameters<typeof getAccount>[1]
44
+ ): Promise<boolean> {
45
+ const { contractId } = await getAccount(address, options)
46
+ return contractId != null
47
+ }
48
+
49
+ /**
50
+ * Convert current account to GA
51
+ * @param authFnName - Authorization function name
52
+ * @param source - Auth contract source code
53
+ * @param args - init arguments
54
+ * @param options - Options
55
+ * @returns General Account Object
56
+ */
57
+ export async function createGeneralizedAccount (
58
+ authFnName: string,
59
+ source: string,
60
+ args: any[],
61
+ { onAccount, onCompiler, onNode, ...options }: CreateGeneralizedAccountOptions
62
+ ): Promise<Readonly<{
63
+ owner: EncodedData<'ak'>
64
+ transaction: EncodedData<'th'>
65
+ rawTx: EncodedData<'tx'>
66
+ gaContractId: EncodedData<'ct'>
67
+ }>> {
68
+ const ownerId = await onAccount.address(options)
69
+ if (await isGA(ownerId, { onNode })) throw new IllegalArgumentError(`Account ${ownerId} is already GA`)
70
+
71
+ const contract = await getContractInstance({ onAccount, onCompiler, onNode, source })
72
+
73
+ const tx = await _buildTx(TX_TYPE.gaAttach, {
74
+ ...options,
75
+ onNode,
76
+ code: await contract.compile(),
77
+ gasLimit: options.gasLimit ?? await contract._estimateGas('init', args, options),
78
+ ownerId,
79
+ callData: contract.calldata.encode(contract._name, 'init', args),
80
+ authFun: hash(authFnName)
81
+ })
82
+ const contractId = buildContractIdByContractTx(tx)
83
+ const { hash: transaction, rawTx } = await send(tx, { onNode, onAccount, onCompiler, ...options })
84
+
85
+ return Object.freeze({
86
+ owner: ownerId,
87
+ transaction,
88
+ rawTx,
89
+ gaContractId: contractId
90
+ })
91
+ }
92
+
93
+ interface CreateGeneralizedAccountOptions extends
94
+ BuildTxOptions<TX_TYPE.gaAttach, 'authFun' | 'callData' | 'code' | 'ownerId' | 'gasLimit'>,
95
+ SendOptions {
96
+ onAccount: AccountBase
97
+ onCompiler: Compiler
98
+ onNode: Node
99
+ gasLimit?: number
100
+ }
101
+
102
+ /**
103
+ * Create a metaTx transaction
104
+ * @param rawTransaction - Inner transaction
105
+ * @param authData - Object with gaMeta params
106
+ * @param authFnName - Authorization function name
107
+ * @param options - Options
108
+ * @param options.onAccount - Account to use
109
+ * @returns Transaction string
110
+ */
111
+ export async function createMetaTx (
112
+ rawTransaction: EncodedData<'tx'>,
113
+ authData: {
114
+ gasLimit?: number
115
+ callData?: EncodedData<'cb'>
116
+ source?: string
117
+ args?: any[]
118
+ },
119
+ authFnName: string,
120
+ { onAccount, onCompiler, onNode, ...options }:
121
+ { onAccount: AccountBase, onCompiler: Compiler, onNode: Node }
122
+ & Parameters<AccountBase['address']>[0]
123
+ ): Promise<EncodedData<'tx'>> {
124
+ const wrapInEmptySignedTx = (
125
+ tx: EncodedData<'tx'> | Uint8Array | TxUnpacked<TxSchema>
126
+ ): BuiltTx<TxSchema, 'tx'> => buildTx({ encodedTx: tx, signatures: [] }, TX_TYPE.signed)
127
+
128
+ if (Object.keys(authData).length <= 0) throw new MissingParamError('authData is required')
129
+
130
+ const gasLimit = authData.gasLimit ?? MAX_AUTH_FUN_GAS
131
+ if (gasLimit > MAX_AUTH_FUN_GAS) {
132
+ throw new InvalidAuthDataError(`the maximum gasLimit value for ga authFun is ${MAX_AUTH_FUN_GAS}, got ${gasLimit}`)
133
+ }
134
+
135
+ const authCallData = authData.callData ?? await (async () => {
136
+ if (authData.source == null || authData.args == null) throw new InvalidAuthDataError('Auth data must contain source code and arguments.')
137
+ const contract = await getContractInstance({
138
+ onAccount, onCompiler, onNode, source: authData.source
139
+ })
140
+ return contract.calldata.encode(contract._name, authFnName, authData.args)
141
+ })()
142
+
143
+ const { abiVersion } = await getVmVersion(TX_TYPE.contractCall, { onNode })
144
+ const wrappedTx = wrapInEmptySignedTx(unpackTx<TX_TYPE.signed>(rawTransaction))
145
+ const params = {
146
+ ...options,
147
+ tx: {
148
+ ...wrappedTx,
149
+ tx: wrappedTx.txObject
150
+ },
151
+ gaId: await onAccount.address(options),
152
+ abiVersion,
153
+ authData: authCallData,
154
+ gasLimit,
155
+ vsn: 2
156
+ }
157
+ // @ts-expect-error createMetaTx needs to be integrated into tx builder
158
+ const { fee } = await prepareTxParams(TX_TYPE.gaMeta, { ...params, onNode })
159
+ const { rlpEncoded: metaTxRlp } = buildTx({ ...params, fee }, TX_TYPE.gaMeta)
160
+ return wrapInEmptySignedTx(metaTxRlp).tx
161
+ }
162
+
163
+ /**
164
+ * Build a transaction hash the same as `Auth.tx_hash`
165
+ * @param transaction - tx-encoded transaction
166
+ * @param options - Options
167
+ * @param options.onNode - Node to use
168
+ * @returns Transaction hash
169
+ */
170
+ export async function buildAuthTxHash (
171
+ transaction: EncodedData<'tx'>,
172
+ { onNode }: { onNode: Node }
173
+ ): Promise<Uint8Array> {
174
+ const { networkId } = await onNode.getStatus()
175
+ return new Uint8Array(hash(
176
+ concatBuffers([Buffer.from(networkId), decode(transaction)])
177
+ ))
178
+ }