@aeternity/aepp-sdk 10.0.0 → 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 (424) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +15 -14
  3. package/dist/aepp-sdk.browser-script.js +1 -1
  4. package/dist/aepp-sdk.browser-script.js.LICENSE.txt +13 -40
  5. package/dist/aepp-sdk.browser-script.js.map +1 -1
  6. package/dist/aepp-sdk.browser.js +1 -1
  7. package/dist/aepp-sdk.browser.js.map +1 -1
  8. package/dist/aepp-sdk.js +1 -1
  9. package/dist/aepp-sdk.js.map +1 -1
  10. package/es/AeSdk.d.ts +37 -0
  11. package/es/AeSdk.mjs +81 -0
  12. package/es/AeSdk.mjs.map +1 -0
  13. package/es/AeSdkAepp.d.ts +69 -0
  14. package/es/AeSdkAepp.mjs +175 -0
  15. package/es/AeSdkAepp.mjs.map +1 -0
  16. package/es/AeSdkBase.d.ts +212 -0
  17. package/es/AeSdkBase.mjs +310 -0
  18. package/es/AeSdkBase.mjs.map +1 -0
  19. package/es/AeSdkWallet.d.ts +103 -0
  20. package/es/AeSdkWallet.mjs +322 -0
  21. package/es/AeSdkWallet.mjs.map +1 -0
  22. package/es/Node.d.ts +44 -0
  23. package/es/Node.mjs +141 -0
  24. package/es/Node.mjs.map +1 -0
  25. package/es/account/Base.d.ts +65 -0
  26. package/es/account/Base.mjs +123 -0
  27. package/es/account/Base.mjs.map +1 -0
  28. package/es/account/Memory.d.ts +25 -0
  29. package/es/account/Memory.mjs +81 -0
  30. package/es/account/Memory.mjs.map +1 -0
  31. package/es/account/Rpc.d.ts +27 -0
  32. package/es/account/Rpc.mjs +79 -0
  33. package/es/account/Rpc.mjs.map +1 -0
  34. package/es/aens.d.ts +209 -0
  35. package/es/aens.mjs +332 -0
  36. package/es/aens.mjs.map +1 -0
  37. package/es/aepp-wallet-communication/connection/Browser.d.ts +32 -0
  38. package/es/aepp-wallet-communication/connection/Browser.mjs +70 -0
  39. package/es/aepp-wallet-communication/connection/Browser.mjs.map +1 -0
  40. package/es/aepp-wallet-communication/connection/BrowserRuntime.d.ts +17 -0
  41. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs +57 -0
  42. package/es/aepp-wallet-communication/connection/BrowserRuntime.mjs.map +1 -0
  43. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.d.ts +35 -0
  44. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs +142 -0
  45. package/es/aepp-wallet-communication/connection/BrowserWindowMessage.mjs.map +1 -0
  46. package/es/aepp-wallet-communication/connection-proxy.d.ts +10 -0
  47. package/{src/utils/crypto-ts.ts → es/aepp-wallet-communication/connection-proxy.mjs} +15 -11
  48. package/es/aepp-wallet-communication/connection-proxy.mjs.map +1 -0
  49. package/es/aepp-wallet-communication/rpc/RpcClient.d.ts +33 -0
  50. package/es/aepp-wallet-communication/rpc/RpcClient.mjs +169 -0
  51. package/es/aepp-wallet-communication/rpc/RpcClient.mjs.map +1 -0
  52. package/es/aepp-wallet-communication/rpc/types.d.ts +77 -0
  53. package/es/aepp-wallet-communication/rpc/types.mjs +3 -0
  54. package/es/aepp-wallet-communication/rpc/types.mjs.map +1 -0
  55. package/es/aepp-wallet-communication/schema.d.ts +118 -0
  56. package/es/aepp-wallet-communication/schema.mjs +214 -0
  57. package/es/aepp-wallet-communication/schema.mjs.map +1 -0
  58. package/es/aepp-wallet-communication/wallet-detector.d.ts +24 -0
  59. package/es/aepp-wallet-communication/wallet-detector.mjs +63 -0
  60. package/es/aepp-wallet-communication/wallet-detector.mjs.map +1 -0
  61. package/es/apis/compiler/compiler.d.ts +92 -0
  62. package/es/apis/compiler/compiler.mjs +576 -0
  63. package/es/apis/compiler/compiler.mjs.map +1 -0
  64. package/es/apis/compiler/index.d.ts +2 -0
  65. package/es/apis/compiler/index.mjs +3 -0
  66. package/es/apis/compiler/index.mjs.map +1 -0
  67. package/es/apis/compiler/models/index.d.ts +248 -0
  68. package/es/apis/compiler/models/index.mjs +48 -0
  69. package/es/apis/compiler/models/index.mjs.map +1 -0
  70. package/es/apis/compiler/models/mappers.d.ts +23 -0
  71. package/es/apis/compiler/models/mappers.mjs +585 -0
  72. package/es/apis/compiler/models/mappers.mjs.map +1 -0
  73. package/es/apis/compiler/models/parameters.d.ts +13 -0
  74. package/es/apis/compiler/models/parameters.mjs +71 -0
  75. package/es/apis/compiler/models/parameters.mjs.map +1 -0
  76. package/es/apis/node/index.d.ts +2 -0
  77. package/es/apis/node/index.mjs +3 -0
  78. package/es/apis/node/index.mjs.map +1 -0
  79. package/es/apis/node/models/index.d.ts +1061 -0
  80. package/es/apis/node/models/index.mjs +2 -0
  81. package/es/apis/node/models/index.mjs.map +1 -0
  82. package/es/apis/node/models/mappers.d.ts +95 -0
  83. package/es/apis/node/models/mappers.mjs +4164 -0
  84. package/es/apis/node/models/mappers.mjs.map +1 -0
  85. package/es/apis/node/models/parameters.d.ts +17 -0
  86. package/es/apis/node/models/parameters.mjs +165 -0
  87. package/es/apis/node/models/parameters.mjs.map +1 -0
  88. package/es/apis/node/node.d.ts +215 -0
  89. package/es/apis/node/node.mjs +1165 -0
  90. package/es/apis/node/node.mjs.map +1 -0
  91. package/es/chain.d.ts +220 -0
  92. package/es/chain.mjs +524 -0
  93. package/es/chain.mjs.map +1 -0
  94. package/es/channel/handlers.d.ts +34 -0
  95. package/es/channel/{handlers.js → handlers.mjs} +163 -130
  96. package/es/channel/handlers.mjs.map +1 -0
  97. package/es/channel/index.d.ts +634 -0
  98. package/es/channel/index.mjs +978 -0
  99. package/es/channel/index.mjs.map +1 -0
  100. package/es/channel/internal.d.ts +100 -0
  101. package/es/channel/internal.mjs +328 -0
  102. package/es/channel/internal.mjs.map +1 -0
  103. package/es/contract/Compiler.d.ts +17 -0
  104. package/es/contract/Compiler.mjs +67 -0
  105. package/es/contract/Compiler.mjs.map +1 -0
  106. package/es/contract/aci.d.ts +125 -0
  107. package/es/contract/aci.mjs +496 -0
  108. package/es/contract/aci.mjs.map +1 -0
  109. package/es/contract/ga.d.ts +68 -0
  110. package/es/contract/ga.mjs +190 -0
  111. package/es/contract/ga.mjs.map +1 -0
  112. package/es/contract/methods.d.ts +68 -0
  113. package/es/contract/methods.mjs +101 -0
  114. package/es/contract/methods.mjs.map +1 -0
  115. package/es/index.d.ts +32 -0
  116. package/es/index.mjs +49 -0
  117. package/es/index.mjs.map +1 -0
  118. package/es/oracle.d.ts +154 -0
  119. package/es/oracle.mjs +288 -0
  120. package/es/oracle.mjs.map +1 -0
  121. package/es/spend.d.ts +61 -0
  122. package/es/spend.mjs +122 -0
  123. package/es/spend.mjs.map +1 -0
  124. package/es/tx/builder/constants.d.ts +41 -0
  125. package/es/tx/builder/constants.mjs +100 -0
  126. package/es/tx/builder/constants.mjs.map +1 -0
  127. package/es/tx/builder/field-types.d.ts +62 -0
  128. package/es/tx/builder/field-types.mjs +126 -0
  129. package/es/tx/builder/field-types.mjs.map +1 -0
  130. package/es/tx/builder/helpers.d.ts +131 -0
  131. package/es/tx/builder/helpers.mjs +223 -0
  132. package/es/tx/builder/helpers.mjs.map +1 -0
  133. package/es/tx/builder/index.d.ts +75 -0
  134. package/es/tx/builder/index.mjs +424 -0
  135. package/es/tx/builder/index.mjs.map +1 -0
  136. package/es/tx/builder/schema.d.ts +350 -0
  137. package/es/tx/builder/schema.mjs +320 -0
  138. package/es/tx/builder/schema.mjs.map +1 -0
  139. package/es/tx/index.d.ts +63 -0
  140. package/es/tx/index.mjs +209 -0
  141. package/es/tx/index.mjs.map +1 -0
  142. package/es/tx/min-fee.d.ts +20 -0
  143. package/es/tx/min-fee.mjs +148 -0
  144. package/es/tx/min-fee.mjs.map +1 -0
  145. package/es/tx/validator.d.ts +19 -0
  146. package/es/tx/validator.mjs +240 -0
  147. package/es/tx/validator.mjs.map +1 -0
  148. package/es/typings/@aeternity__argon2-browser/index.d.mjs +2 -0
  149. package/es/typings/@aeternity__argon2-browser/index.d.mjs.map +1 -0
  150. package/es/typings/@aeternity__uuid/index.d.mjs +2 -0
  151. package/es/typings/@aeternity__uuid/index.d.mjs.map +1 -0
  152. package/es/typings/bip32-path/index.d.mjs +2 -0
  153. package/es/typings/bip32-path/index.d.mjs.map +1 -0
  154. package/es/typings/blakejs/index.d.mjs +2 -0
  155. package/es/typings/blakejs/index.d.mjs.map +1 -0
  156. package/es/typings/tweetnacl-auth/index.d.mjs +2 -0
  157. package/es/typings/tweetnacl-auth/index.d.mjs.map +1 -0
  158. package/es/utils/amount-formatter.d.ts +42 -0
  159. package/es/utils/{amount-formatter.js → amount-formatter.mjs} +38 -44
  160. package/es/utils/amount-formatter.mjs.map +1 -0
  161. package/es/utils/autorest.d.ts +6 -0
  162. package/es/utils/autorest.mjs +97 -0
  163. package/es/utils/autorest.mjs.map +1 -0
  164. package/es/utils/bignumber.d.ts +13 -0
  165. package/es/utils/bignumber.mjs +23 -0
  166. package/es/utils/bignumber.mjs.map +1 -0
  167. package/es/{bytes.d.ts → utils/bytes.d.ts} +10 -13
  168. package/es/utils/{bytes.js → bytes.mjs} +26 -22
  169. package/es/utils/bytes.mjs.map +1 -0
  170. package/es/utils/crypto.d.ts +103 -0
  171. package/es/utils/crypto.mjs +221 -0
  172. package/es/utils/crypto.mjs.map +1 -0
  173. package/es/utils/encoder.d.ts +26 -0
  174. package/es/utils/encoder.mjs +102 -0
  175. package/es/utils/encoder.mjs.map +1 -0
  176. package/es/utils/errors.d.ts +481 -0
  177. package/es/utils/errors.mjs +882 -0
  178. package/es/utils/errors.mjs.map +1 -0
  179. package/es/utils/hd-wallet.d.ts +34 -0
  180. package/es/utils/hd-wallet.mjs +122 -0
  181. package/es/utils/hd-wallet.mjs.map +1 -0
  182. package/es/utils/json-big.d.ts +5 -0
  183. package/es/utils/json-big.mjs +41 -0
  184. package/es/utils/json-big.mjs.map +1 -0
  185. package/es/utils/keystore.d.ts +51 -0
  186. package/es/utils/keystore.mjs +145 -0
  187. package/es/utils/keystore.mjs.map +1 -0
  188. package/es/{mptree.d.ts → utils/mptree.d.ts} +5 -8
  189. package/es/utils/{mptree.js → mptree.mjs} +33 -25
  190. package/es/utils/mptree.mjs.map +1 -0
  191. package/es/utils/other.d.ts +14 -0
  192. package/es/utils/other.mjs +28 -0
  193. package/es/utils/other.mjs.map +1 -0
  194. package/es/{semver-satisfies.d.ts → utils/semver-satisfies.d.ts} +0 -0
  195. package/es/utils/{semver-satisfies.js → semver-satisfies.mjs} +1 -1
  196. package/es/utils/semver-satisfies.mjs.map +1 -0
  197. package/es/utils/string.d.ts +24 -0
  198. package/es/utils/{string.js → string.mjs} +9 -11
  199. package/es/utils/string.mjs.map +1 -0
  200. package/package.json +67 -64
  201. package/src/AeSdk.ts +65 -0
  202. package/src/AeSdkAepp.ts +167 -0
  203. package/src/AeSdkBase.ts +320 -0
  204. package/src/AeSdkWallet.ts +332 -0
  205. package/src/Node.ts +167 -0
  206. package/src/account/Base.ts +114 -0
  207. package/src/account/Memory.ts +83 -0
  208. package/src/account/Rpc.ts +67 -0
  209. package/src/aens.ts +391 -0
  210. package/src/aepp-wallet-communication/connection/Browser.ts +68 -0
  211. package/src/aepp-wallet-communication/connection/BrowserRuntime.ts +58 -0
  212. package/src/aepp-wallet-communication/connection/BrowserWindowMessage.ts +111 -0
  213. package/{es/utils/crypto-ts.js → src/aepp-wallet-communication/connection-proxy.ts} +16 -9
  214. package/src/aepp-wallet-communication/rpc/RpcClient.ts +137 -0
  215. package/src/aepp-wallet-communication/rpc/types.ts +66 -0
  216. package/src/aepp-wallet-communication/schema.ts +181 -0
  217. package/src/aepp-wallet-communication/wallet-detector.ts +71 -0
  218. package/src/apis/compiler/code-model-v4.yaml +2649 -0
  219. package/src/apis/compiler/compiler.ts +585 -0
  220. package/src/apis/compiler/index.ts +2 -0
  221. package/src/apis/compiler/models/index.ts +301 -0
  222. package/src/apis/compiler/models/mappers.ts +583 -0
  223. package/src/apis/compiler/models/parameters.ts +93 -0
  224. package/src/apis/node/code-model-v4.yaml +10046 -0
  225. package/src/apis/node/index.ts +2 -0
  226. package/src/apis/node/models/index.ts +1253 -0
  227. package/src/apis/node/models/mappers.ts +4278 -0
  228. package/src/apis/node/models/parameters.ts +188 -0
  229. package/src/apis/node/node.ts +1299 -0
  230. package/src/chain.ts +444 -0
  231. package/src/channel/{handlers.js → handlers.ts} +238 -143
  232. package/src/channel/index.ts +991 -0
  233. package/src/channel/internal.ts +345 -0
  234. package/src/contract/Compiler.ts +66 -0
  235. package/src/contract/aci.ts +529 -0
  236. package/src/contract/ga.ts +178 -0
  237. package/src/contract/methods.ts +118 -0
  238. package/src/index.ts +51 -0
  239. package/src/oracle.ts +342 -0
  240. package/src/spend.ts +152 -0
  241. package/src/tx/builder/constants.ts +96 -0
  242. package/src/tx/builder/field-types.ts +111 -0
  243. package/src/tx/builder/helpers.ts +253 -0
  244. package/src/tx/builder/index.ts +394 -0
  245. package/src/tx/builder/schema.ts +771 -0
  246. package/src/tx/index.ts +199 -0
  247. package/src/tx/min-fee.ts +136 -0
  248. package/src/tx/validator.ts +226 -0
  249. package/src/typings/@aeternity__argon2-browser/index.d.ts +3 -0
  250. package/src/typings/@aeternity__uuid/index.d.ts +3 -0
  251. package/src/typings/bip32-path/index.d.ts +33 -0
  252. package/src/typings/tweetnacl-auth/index.d.ts +14 -0
  253. package/src/utils/amount-formatter.ts +29 -41
  254. package/src/utils/autorest.ts +90 -0
  255. package/src/utils/bignumber.ts +9 -19
  256. package/src/utils/bytes.ts +15 -16
  257. package/src/utils/crypto.ts +217 -0
  258. package/src/utils/encoder.ts +98 -0
  259. package/src/utils/errors.ts +817 -0
  260. package/src/utils/hd-wallet.ts +134 -0
  261. package/src/utils/json-big.ts +26 -0
  262. package/src/utils/keystore.ts +179 -0
  263. package/src/utils/mptree.ts +26 -20
  264. package/src/utils/other.ts +28 -43
  265. package/src/utils/string.ts +8 -10
  266. package/CHANGELOG.md +0 -1603
  267. package/es/account/base.js +0 -169
  268. package/es/account/base.js.map +0 -1
  269. package/es/account/memory.js +0 -84
  270. package/es/account/memory.js.map +0 -1
  271. package/es/account/multiple.js +0 -178
  272. package/es/account/multiple.js.map +0 -1
  273. package/es/ae/aens.js +0 -408
  274. package/es/ae/aens.js.map +0 -1
  275. package/es/ae/aepp.js +0 -45
  276. package/es/ae/aepp.js.map +0 -1
  277. package/es/ae/contract.js +0 -312
  278. package/es/ae/contract.js.map +0 -1
  279. package/es/ae/index.js +0 -206
  280. package/es/ae/index.js.map +0 -1
  281. package/es/ae/oracle.js +0 -322
  282. package/es/ae/oracle.js.map +0 -1
  283. package/es/ae/universal.js +0 -45
  284. package/es/ae/universal.js.map +0 -1
  285. package/es/ae/wallet.js +0 -50
  286. package/es/ae/wallet.js.map +0 -1
  287. package/es/amount-formatter.d.ts +0 -58
  288. package/es/bignumber.d.ts +0 -24
  289. package/es/chain/index.js +0 -256
  290. package/es/chain/index.js.map +0 -1
  291. package/es/chain/node.js +0 -394
  292. package/es/chain/node.js.map +0 -1
  293. package/es/channel/handlers.js.map +0 -1
  294. package/es/channel/index.js +0 -980
  295. package/es/channel/index.js.map +0 -1
  296. package/es/channel/internal.js +0 -266
  297. package/es/channel/internal.js.map +0 -1
  298. package/es/contract/aci/helpers.js +0 -298
  299. package/es/contract/aci/helpers.js.map +0 -1
  300. package/es/contract/aci/index.js +0 -361
  301. package/es/contract/aci/index.js.map +0 -1
  302. package/es/contract/aci/transformation.js +0 -66
  303. package/es/contract/aci/transformation.js.map +0 -1
  304. package/es/contract/compiler.js +0 -244
  305. package/es/contract/compiler.js.map +0 -1
  306. package/es/contract/ga/helpers.js +0 -22
  307. package/es/contract/ga/helpers.js.map +0 -1
  308. package/es/contract/ga/index.js +0 -170
  309. package/es/contract/ga/index.js.map +0 -1
  310. package/es/contract/index.js +0 -162
  311. package/es/contract/index.js.map +0 -1
  312. package/es/crypto-ts.d.ts +0 -9
  313. package/es/index.js +0 -57
  314. package/es/index.js.map +0 -1
  315. package/es/node-pool/index.js +0 -187
  316. package/es/node-pool/index.js.map +0 -1
  317. package/es/node.js +0 -132
  318. package/es/node.js.map +0 -1
  319. package/es/other.d.ts +0 -31
  320. package/es/string.d.ts +0 -26
  321. package/es/tx/builder/helpers.js +0 -305
  322. package/es/tx/builder/helpers.js.map +0 -1
  323. package/es/tx/builder/index.js +0 -595
  324. package/es/tx/builder/index.js.map +0 -1
  325. package/es/tx/builder/schema.js +0 -814
  326. package/es/tx/builder/schema.js.map +0 -1
  327. package/es/tx/index.js +0 -300
  328. package/es/tx/index.js.map +0 -1
  329. package/es/tx/tx-object.js +0 -276
  330. package/es/tx/tx-object.js.map +0 -1
  331. package/es/tx/tx.js +0 -937
  332. package/es/tx/tx.js.map +0 -1
  333. package/es/tx/validator.js +0 -208
  334. package/es/tx/validator.js.map +0 -1
  335. package/es/typings/blakejs/index.d.js +0 -2
  336. package/es/typings/blakejs/index.d.js.map +0 -1
  337. package/es/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -131
  338. package/es/utils/aepp-wallet-communication/connection/browser-runtime.js.map +0 -1
  339. package/es/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -184
  340. package/es/utils/aepp-wallet-communication/connection/browser-window-message.js.map +0 -1
  341. package/es/utils/aepp-wallet-communication/connection/index.js +0 -84
  342. package/es/utils/aepp-wallet-communication/connection/index.js.map +0 -1
  343. package/es/utils/aepp-wallet-communication/content-script-bridge.js +0 -97
  344. package/es/utils/aepp-wallet-communication/content-script-bridge.js.map +0 -1
  345. package/es/utils/aepp-wallet-communication/helpers.js +0 -103
  346. package/es/utils/aepp-wallet-communication/helpers.js.map +0 -1
  347. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -329
  348. package/es/utils/aepp-wallet-communication/rpc/aepp-rpc.js.map +0 -1
  349. package/es/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -270
  350. package/es/utils/aepp-wallet-communication/rpc/rpc-client.js.map +0 -1
  351. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -533
  352. package/es/utils/aepp-wallet-communication/rpc/wallet-rpc.js.map +0 -1
  353. package/es/utils/aepp-wallet-communication/schema.js +0 -107
  354. package/es/utils/aepp-wallet-communication/schema.js.map +0 -1
  355. package/es/utils/aepp-wallet-communication/wallet-detector.js +0 -109
  356. package/es/utils/aepp-wallet-communication/wallet-detector.js.map +0 -1
  357. package/es/utils/amount-formatter.js.map +0 -1
  358. package/es/utils/async-init.js +0 -67
  359. package/es/utils/async-init.js.map +0 -1
  360. package/es/utils/bignumber.js +0 -28
  361. package/es/utils/bignumber.js.map +0 -1
  362. package/es/utils/bytes.js.map +0 -1
  363. package/es/utils/crypto-ts.js.map +0 -1
  364. package/es/utils/crypto.js +0 -304
  365. package/es/utils/crypto.js.map +0 -1
  366. package/es/utils/hd-wallet.js +0 -112
  367. package/es/utils/hd-wallet.js.map +0 -1
  368. package/es/utils/json-big.js +0 -45
  369. package/es/utils/json-big.js.map +0 -1
  370. package/es/utils/keystore.js +0 -228
  371. package/es/utils/keystore.js.map +0 -1
  372. package/es/utils/mptree.js.map +0 -1
  373. package/es/utils/other.js +0 -43
  374. package/es/utils/other.js.map +0 -1
  375. package/es/utils/semver-satisfies.js.map +0 -1
  376. package/es/utils/string.js.map +0 -1
  377. package/es/utils/swagger.js +0 -132
  378. package/es/utils/swagger.js.map +0 -1
  379. package/src/account/base.js +0 -153
  380. package/src/account/memory.js +0 -78
  381. package/src/account/multiple.js +0 -154
  382. package/src/ae/aens.js +0 -366
  383. package/src/ae/aepp.js +0 -45
  384. package/src/ae/contract.js +0 -285
  385. package/src/ae/index.js +0 -167
  386. package/src/ae/oracle.js +0 -296
  387. package/src/ae/universal.js +0 -47
  388. package/src/ae/wallet.js +0 -50
  389. package/src/chain/index.js +0 -250
  390. package/src/chain/node.js +0 -293
  391. package/src/channel/index.js +0 -898
  392. package/src/channel/internal.js +0 -231
  393. package/src/contract/aci/index.js +0 -317
  394. package/src/contract/aci/transformation.js +0 -72
  395. package/src/contract/compiler.js +0 -195
  396. package/src/contract/ga/helpers.js +0 -17
  397. package/src/contract/ga/index.js +0 -147
  398. package/src/contract/index.js +0 -163
  399. package/src/index.js +0 -90
  400. package/src/node-pool/index.js +0 -171
  401. package/src/node.js +0 -118
  402. package/src/tx/builder/helpers.js +0 -325
  403. package/src/tx/builder/index.js +0 -460
  404. package/src/tx/builder/schema.js +0 -1211
  405. package/src/tx/index.js +0 -301
  406. package/src/tx/tx-object.js +0 -186
  407. package/src/tx/tx.js +0 -622
  408. package/src/tx/validator.js +0 -161
  409. package/src/utils/aepp-wallet-communication/connection/browser-runtime.js +0 -114
  410. package/src/utils/aepp-wallet-communication/connection/browser-window-message.js +0 -161
  411. package/src/utils/aepp-wallet-communication/connection/index.js +0 -85
  412. package/src/utils/aepp-wallet-communication/content-script-bridge.js +0 -85
  413. package/src/utils/aepp-wallet-communication/helpers.js +0 -70
  414. package/src/utils/aepp-wallet-communication/rpc/aepp-rpc.js +0 -268
  415. package/src/utils/aepp-wallet-communication/rpc/rpc-client.js +0 -223
  416. package/src/utils/aepp-wallet-communication/rpc/wallet-rpc.js +0 -390
  417. package/src/utils/aepp-wallet-communication/schema.js +0 -108
  418. package/src/utils/aepp-wallet-communication/wallet-detector.js +0 -91
  419. package/src/utils/async-init.js +0 -41
  420. package/src/utils/crypto.js +0 -312
  421. package/src/utils/hd-wallet.js +0 -115
  422. package/src/utils/json-big.js +0 -26
  423. package/src/utils/keystore.js +0 -223
  424. package/src/utils/swagger.js +0 -133
@@ -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
+ }