crypto-aio 0.0.3 → 0.1.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 (691) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/README.md +144 -14
  3. package/dist/adapters/avalanche/address.d.ts +15 -0
  4. package/dist/adapters/avalanche/address.js +74 -0
  5. package/dist/adapters/avalanche/address.js.map +1 -0
  6. package/dist/adapters/avalanche/api.d.ts +100 -0
  7. package/dist/adapters/avalanche/api.js +381 -0
  8. package/dist/adapters/avalanche/api.js.map +1 -0
  9. package/dist/adapters/avalanche/builder.d.ts +13 -0
  10. package/dist/adapters/avalanche/builder.js +336 -0
  11. package/dist/adapters/avalanche/builder.js.map +1 -0
  12. package/dist/adapters/avalanche/cb58.d.ts +7 -0
  13. package/dist/adapters/avalanche/cb58.js +49 -0
  14. package/dist/adapters/avalanche/cb58.js.map +1 -0
  15. package/dist/adapters/avalanche/chains.d.ts +21 -0
  16. package/dist/adapters/avalanche/chains.js +79 -0
  17. package/dist/adapters/avalanche/chains.js.map +1 -0
  18. package/dist/adapters/avalanche/codec.d.ts +94 -0
  19. package/dist/adapters/avalanche/codec.js +371 -0
  20. package/dist/adapters/avalanche/codec.js.map +1 -0
  21. package/dist/adapters/avalanche/context.d.ts +59 -0
  22. package/dist/adapters/avalanche/context.js +114 -0
  23. package/dist/adapters/avalanche/context.js.map +1 -0
  24. package/dist/adapters/avalanche/decode.d.ts +16 -0
  25. package/dist/adapters/avalanche/decode.js +101 -0
  26. package/dist/adapters/avalanche/decode.js.map +1 -0
  27. package/dist/adapters/avalanche/driver.d.ts +22 -0
  28. package/dist/adapters/avalanche/driver.js +81 -0
  29. package/dist/adapters/avalanche/driver.js.map +1 -0
  30. package/dist/adapters/avalanche/errors.d.ts +18 -0
  31. package/dist/adapters/avalanche/errors.js +61 -0
  32. package/dist/adapters/avalanche/errors.js.map +1 -0
  33. package/dist/adapters/avalanche/fees.d.ts +23 -0
  34. package/dist/adapters/avalanche/fees.js +105 -0
  35. package/dist/adapters/avalanche/fees.js.map +1 -0
  36. package/dist/adapters/avalanche/index.d.ts +19 -0
  37. package/dist/adapters/avalanche/index.js +8 -0
  38. package/dist/adapters/avalanche/index.js.map +1 -0
  39. package/dist/adapters/avalanche/network.d.ts +37 -0
  40. package/dist/adapters/avalanche/network.js +135 -0
  41. package/dist/adapters/avalanche/network.js.map +1 -0
  42. package/dist/adapters/avalanche/plugin.d.ts +21 -0
  43. package/dist/adapters/avalanche/plugin.js +46 -0
  44. package/dist/adapters/avalanche/plugin.js.map +1 -0
  45. package/dist/adapters/avalanche/presets.d.ts +6 -0
  46. package/dist/adapters/avalanche/presets.js +86 -0
  47. package/dist/adapters/avalanche/presets.js.map +1 -0
  48. package/dist/adapters/avalanche/proofs.d.ts +41 -0
  49. package/dist/adapters/avalanche/proofs.js +270 -0
  50. package/dist/adapters/avalanche/proofs.js.map +1 -0
  51. package/dist/adapters/avalanche/reader.d.ts +40 -0
  52. package/dist/adapters/avalanche/reader.js +231 -0
  53. package/dist/adapters/avalanche/reader.js.map +1 -0
  54. package/dist/adapters/avalanche/sdk.d.ts +182 -0
  55. package/dist/adapters/avalanche/sdk.js +21 -0
  56. package/dist/adapters/avalanche/sdk.js.map +1 -0
  57. package/dist/adapters/avalanche/types.d.ts +86 -0
  58. package/dist/{type/common.js → adapters/avalanche/types.js} +1 -1
  59. package/dist/adapters/avalanche/types.js.map +1 -0
  60. package/dist/adapters/evm/builder.d.ts +11 -0
  61. package/dist/adapters/evm/builder.js +326 -0
  62. package/dist/adapters/evm/builder.js.map +1 -0
  63. package/dist/adapters/evm/chains.d.ts +6 -0
  64. package/dist/adapters/evm/chains.js +203 -0
  65. package/dist/adapters/evm/chains.js.map +1 -0
  66. package/dist/adapters/evm/client.d.ts +84 -0
  67. package/dist/adapters/evm/client.js +335 -0
  68. package/dist/adapters/evm/client.js.map +1 -0
  69. package/dist/adapters/evm/decode.d.ts +35 -0
  70. package/dist/adapters/evm/decode.js +170 -0
  71. package/dist/adapters/evm/decode.js.map +1 -0
  72. package/dist/adapters/evm/driver.d.ts +8 -0
  73. package/dist/adapters/evm/driver.js +61 -0
  74. package/dist/adapters/evm/driver.js.map +1 -0
  75. package/dist/adapters/evm/errors.d.ts +20 -0
  76. package/dist/adapters/evm/errors.js +110 -0
  77. package/dist/adapters/evm/errors.js.map +1 -0
  78. package/dist/adapters/evm/ethers-client.d.ts +43 -0
  79. package/dist/adapters/evm/ethers-client.js +135 -0
  80. package/dist/adapters/evm/ethers-client.js.map +1 -0
  81. package/dist/adapters/evm/fees.d.ts +79 -0
  82. package/dist/adapters/evm/fees.js +234 -0
  83. package/dist/adapters/evm/fees.js.map +1 -0
  84. package/dist/adapters/evm/index.d.ts +20 -0
  85. package/dist/adapters/evm/index.js +11 -0
  86. package/dist/adapters/evm/index.js.map +1 -0
  87. package/dist/adapters/evm/network.d.ts +60 -0
  88. package/dist/adapters/evm/network.js +131 -0
  89. package/dist/adapters/evm/network.js.map +1 -0
  90. package/dist/adapters/evm/plugin.d.ts +36 -0
  91. package/dist/adapters/evm/plugin.js +102 -0
  92. package/dist/adapters/evm/plugin.js.map +1 -0
  93. package/dist/adapters/evm/presets.d.ts +2 -0
  94. package/dist/adapters/evm/presets.js +105 -0
  95. package/dist/adapters/evm/presets.js.map +1 -0
  96. package/dist/adapters/evm/proofs.d.ts +19 -0
  97. package/dist/adapters/evm/proofs.js +358 -0
  98. package/dist/adapters/evm/proofs.js.map +1 -0
  99. package/dist/adapters/evm/rawtx.d.ts +25 -0
  100. package/dist/adapters/evm/rawtx.js +176 -0
  101. package/dist/adapters/evm/rawtx.js.map +1 -0
  102. package/dist/adapters/evm/reader.d.ts +65 -0
  103. package/dist/adapters/evm/reader.js +292 -0
  104. package/dist/adapters/evm/reader.js.map +1 -0
  105. package/dist/adapters/evm/rpc.d.ts +39 -0
  106. package/dist/adapters/evm/rpc.js +152 -0
  107. package/dist/adapters/evm/rpc.js.map +1 -0
  108. package/dist/adapters/evm/tokens.d.ts +7 -0
  109. package/dist/adapters/evm/tokens.js +23 -0
  110. package/dist/adapters/evm/tokens.js.map +1 -0
  111. package/dist/adapters/evm/types.d.ts +255 -0
  112. package/dist/{type/account.js → adapters/evm/types.js} +1 -1
  113. package/dist/adapters/evm/types.js.map +1 -0
  114. package/dist/adapters/evm/web3-client.d.ts +23 -0
  115. package/dist/adapters/evm/web3-client.js +159 -0
  116. package/dist/adapters/evm/web3-client.js.map +1 -0
  117. package/dist/adapters/solana/builder.d.ts +18 -0
  118. package/dist/adapters/solana/builder.js +545 -0
  119. package/dist/adapters/solana/builder.js.map +1 -0
  120. package/dist/adapters/solana/chains.d.ts +13 -0
  121. package/dist/adapters/solana/chains.js +37 -0
  122. package/dist/adapters/solana/chains.js.map +1 -0
  123. package/dist/adapters/solana/decode.d.ts +111 -0
  124. package/dist/adapters/solana/decode.js +595 -0
  125. package/dist/adapters/solana/decode.js.map +1 -0
  126. package/dist/adapters/solana/driver.d.ts +15 -0
  127. package/dist/adapters/solana/driver.js +72 -0
  128. package/dist/adapters/solana/driver.js.map +1 -0
  129. package/dist/adapters/solana/errors.d.ts +36 -0
  130. package/dist/adapters/solana/errors.js +154 -0
  131. package/dist/adapters/solana/errors.js.map +1 -0
  132. package/dist/adapters/solana/fees.d.ts +68 -0
  133. package/dist/adapters/solana/fees.js +205 -0
  134. package/dist/adapters/solana/fees.js.map +1 -0
  135. package/dist/adapters/solana/heights.d.ts +47 -0
  136. package/dist/adapters/solana/heights.js +185 -0
  137. package/dist/adapters/solana/heights.js.map +1 -0
  138. package/dist/adapters/solana/history.d.ts +10 -0
  139. package/dist/adapters/solana/history.js +71 -0
  140. package/dist/adapters/solana/history.js.map +1 -0
  141. package/dist/adapters/solana/index.d.ts +16 -0
  142. package/dist/adapters/solana/index.js +9 -0
  143. package/dist/adapters/solana/index.js.map +1 -0
  144. package/dist/adapters/solana/keys.d.ts +13 -0
  145. package/dist/adapters/solana/keys.js +69 -0
  146. package/dist/adapters/solana/keys.js.map +1 -0
  147. package/dist/adapters/solana/network.d.ts +24 -0
  148. package/dist/adapters/solana/network.js +95 -0
  149. package/dist/adapters/solana/network.js.map +1 -0
  150. package/dist/adapters/solana/plugin.d.ts +18 -0
  151. package/dist/adapters/solana/plugin.js +41 -0
  152. package/dist/adapters/solana/plugin.js.map +1 -0
  153. package/dist/adapters/solana/presets.d.ts +2 -0
  154. package/dist/adapters/solana/presets.js +77 -0
  155. package/dist/adapters/solana/presets.js.map +1 -0
  156. package/dist/adapters/solana/programs.d.ts +44 -0
  157. package/dist/adapters/solana/programs.js +159 -0
  158. package/dist/adapters/solana/programs.js.map +1 -0
  159. package/dist/adapters/solana/proofs.d.ts +56 -0
  160. package/dist/adapters/solana/proofs.js +540 -0
  161. package/dist/adapters/solana/proofs.js.map +1 -0
  162. package/dist/adapters/solana/reader.d.ts +82 -0
  163. package/dist/adapters/solana/reader.js +326 -0
  164. package/dist/adapters/solana/reader.js.map +1 -0
  165. package/dist/adapters/solana/rpc.d.ts +102 -0
  166. package/dist/adapters/solana/rpc.js +301 -0
  167. package/dist/adapters/solana/rpc.js.map +1 -0
  168. package/dist/adapters/solana/tokens.d.ts +7 -0
  169. package/dist/adapters/solana/tokens.js +19 -0
  170. package/dist/adapters/solana/tokens.js.map +1 -0
  171. package/dist/adapters/solana/types.d.ts +121 -0
  172. package/dist/{type/contract.js → adapters/solana/types.js} +1 -1
  173. package/dist/adapters/solana/types.js.map +1 -0
  174. package/dist/adapters/solana/web3.d.ts +5 -0
  175. package/dist/adapters/solana/web3.js +83 -0
  176. package/dist/adapters/solana/web3.js.map +1 -0
  177. package/dist/adapters/solana/wire.d.ts +62 -0
  178. package/dist/adapters/solana/wire.js +168 -0
  179. package/dist/adapters/solana/wire.js.map +1 -0
  180. package/dist/adapters/ton/address.d.ts +43 -0
  181. package/dist/adapters/ton/address.js +168 -0
  182. package/dist/adapters/ton/address.js.map +1 -0
  183. package/dist/adapters/ton/api.d.ts +344 -0
  184. package/dist/adapters/ton/api.js +942 -0
  185. package/dist/adapters/ton/api.js.map +1 -0
  186. package/dist/adapters/ton/builder.d.ts +18 -0
  187. package/dist/adapters/ton/builder.js +701 -0
  188. package/dist/adapters/ton/builder.js.map +1 -0
  189. package/dist/adapters/ton/chains.d.ts +16 -0
  190. package/dist/adapters/ton/chains.js +39 -0
  191. package/dist/adapters/ton/chains.js.map +1 -0
  192. package/dist/adapters/ton/decode.d.ts +43 -0
  193. package/dist/adapters/ton/decode.js +219 -0
  194. package/dist/adapters/ton/decode.js.map +1 -0
  195. package/dist/adapters/ton/driver.d.ts +10 -0
  196. package/dist/adapters/ton/driver.js +117 -0
  197. package/dist/adapters/ton/driver.js.map +1 -0
  198. package/dist/adapters/ton/errors.d.ts +36 -0
  199. package/dist/adapters/ton/errors.js +89 -0
  200. package/dist/adapters/ton/errors.js.map +1 -0
  201. package/dist/adapters/ton/fees.d.ts +28 -0
  202. package/dist/adapters/ton/fees.js +121 -0
  203. package/dist/adapters/ton/fees.js.map +1 -0
  204. package/dist/adapters/ton/index.d.ts +16 -0
  205. package/dist/adapters/ton/index.js +9 -0
  206. package/dist/adapters/ton/index.js.map +1 -0
  207. package/dist/adapters/ton/messages.d.ts +157 -0
  208. package/dist/adapters/ton/messages.js +397 -0
  209. package/dist/adapters/ton/messages.js.map +1 -0
  210. package/dist/adapters/ton/native-client.d.ts +10 -0
  211. package/dist/adapters/ton/native-client.js +47 -0
  212. package/dist/adapters/ton/native-client.js.map +1 -0
  213. package/dist/adapters/ton/network.d.ts +58 -0
  214. package/dist/adapters/ton/network.js +207 -0
  215. package/dist/adapters/ton/network.js.map +1 -0
  216. package/dist/adapters/ton/plugin.d.ts +24 -0
  217. package/dist/adapters/ton/plugin.js +57 -0
  218. package/dist/adapters/ton/plugin.js.map +1 -0
  219. package/dist/adapters/ton/presets.d.ts +6 -0
  220. package/dist/adapters/ton/presets.js +94 -0
  221. package/dist/adapters/ton/presets.js.map +1 -0
  222. package/dist/adapters/ton/proofs.d.ts +66 -0
  223. package/dist/adapters/ton/proofs.js +813 -0
  224. package/dist/adapters/ton/proofs.js.map +1 -0
  225. package/dist/adapters/ton/reader.d.ts +194 -0
  226. package/dist/adapters/ton/reader.js +781 -0
  227. package/dist/adapters/ton/reader.js.map +1 -0
  228. package/dist/adapters/ton/tokens.d.ts +10 -0
  229. package/dist/adapters/ton/tokens.js +27 -0
  230. package/dist/adapters/ton/tokens.js.map +1 -0
  231. package/dist/adapters/ton/trace.d.ts +48 -0
  232. package/dist/adapters/ton/trace.js +277 -0
  233. package/dist/adapters/ton/trace.js.map +1 -0
  234. package/dist/adapters/ton/types.d.ts +105 -0
  235. package/dist/{type/transact.js → adapters/ton/types.js} +1 -1
  236. package/dist/adapters/ton/types.js.map +1 -0
  237. package/dist/adapters/ton/wallets.d.ts +86 -0
  238. package/dist/adapters/ton/wallets.js +373 -0
  239. package/dist/adapters/ton/wallets.js.map +1 -0
  240. package/dist/adapters/tron/abi.d.ts +39 -0
  241. package/dist/adapters/tron/abi.js +110 -0
  242. package/dist/adapters/tron/abi.js.map +1 -0
  243. package/dist/adapters/tron/address.d.ts +20 -0
  244. package/dist/adapters/tron/address.js +110 -0
  245. package/dist/adapters/tron/address.js.map +1 -0
  246. package/dist/adapters/tron/builder.d.ts +12 -0
  247. package/dist/adapters/tron/builder.js +553 -0
  248. package/dist/adapters/tron/builder.js.map +1 -0
  249. package/dist/adapters/tron/chains.d.ts +12 -0
  250. package/dist/adapters/tron/chains.js +35 -0
  251. package/dist/adapters/tron/chains.js.map +1 -0
  252. package/dist/adapters/tron/codec.d.ts +10 -0
  253. package/dist/adapters/tron/codec.js +322 -0
  254. package/dist/adapters/tron/codec.js.map +1 -0
  255. package/dist/adapters/tron/decode.d.ts +50 -0
  256. package/dist/adapters/tron/decode.js +280 -0
  257. package/dist/adapters/tron/decode.js.map +1 -0
  258. package/dist/adapters/tron/driver.d.ts +12 -0
  259. package/dist/adapters/tron/driver.js +106 -0
  260. package/dist/adapters/tron/driver.js.map +1 -0
  261. package/dist/adapters/tron/errors.d.ts +74 -0
  262. package/dist/adapters/tron/errors.js +261 -0
  263. package/dist/adapters/tron/errors.js.map +1 -0
  264. package/dist/adapters/tron/fees.d.ts +49 -0
  265. package/dist/adapters/tron/fees.js +166 -0
  266. package/dist/adapters/tron/fees.js.map +1 -0
  267. package/dist/adapters/tron/http.d.ts +173 -0
  268. package/dist/adapters/tron/http.js +729 -0
  269. package/dist/adapters/tron/http.js.map +1 -0
  270. package/dist/adapters/tron/index.d.ts +16 -0
  271. package/dist/adapters/tron/index.js +15 -0
  272. package/dist/adapters/tron/index.js.map +1 -0
  273. package/dist/adapters/tron/network.d.ts +44 -0
  274. package/dist/adapters/tron/network.js +163 -0
  275. package/dist/adapters/tron/network.js.map +1 -0
  276. package/dist/adapters/tron/plugin.d.ts +17 -0
  277. package/dist/adapters/tron/plugin.js +39 -0
  278. package/dist/adapters/tron/plugin.js.map +1 -0
  279. package/dist/adapters/tron/presets.d.ts +5 -0
  280. package/dist/adapters/tron/presets.js +68 -0
  281. package/dist/adapters/tron/presets.js.map +1 -0
  282. package/dist/adapters/tron/proofs.d.ts +80 -0
  283. package/dist/adapters/tron/proofs.js +370 -0
  284. package/dist/adapters/tron/proofs.js.map +1 -0
  285. package/dist/adapters/tron/protobuf.d.ts +36 -0
  286. package/dist/adapters/tron/protobuf.js +90 -0
  287. package/dist/adapters/tron/protobuf.js.map +1 -0
  288. package/dist/adapters/tron/reader.d.ts +47 -0
  289. package/dist/adapters/tron/reader.js +203 -0
  290. package/dist/adapters/tron/reader.js.map +1 -0
  291. package/dist/adapters/tron/tokens.d.ts +7 -0
  292. package/dist/adapters/tron/tokens.js +14 -0
  293. package/dist/adapters/tron/tokens.js.map +1 -0
  294. package/dist/adapters/tron/types.d.ts +166 -0
  295. package/dist/adapters/tron/types.js +3 -0
  296. package/dist/adapters/tron/types.js.map +1 -0
  297. package/dist/adapters/utxo/address.d.ts +51 -0
  298. package/dist/adapters/utxo/address.js +341 -0
  299. package/dist/adapters/utxo/address.js.map +1 -0
  300. package/dist/adapters/utxo/builder.d.ts +35 -0
  301. package/dist/adapters/utxo/builder.js +380 -0
  302. package/dist/adapters/utxo/builder.js.map +1 -0
  303. package/dist/adapters/utxo/chains.d.ts +17 -0
  304. package/dist/adapters/utxo/chains.js +99 -0
  305. package/dist/adapters/utxo/chains.js.map +1 -0
  306. package/dist/adapters/utxo/codec.d.ts +120 -0
  307. package/dist/adapters/utxo/codec.js +408 -0
  308. package/dist/adapters/utxo/codec.js.map +1 -0
  309. package/dist/adapters/utxo/coinselect.d.ts +48 -0
  310. package/dist/adapters/utxo/coinselect.js +131 -0
  311. package/dist/adapters/utxo/coinselect.js.map +1 -0
  312. package/dist/adapters/utxo/context.d.ts +57 -0
  313. package/dist/adapters/utxo/context.js +118 -0
  314. package/dist/adapters/utxo/context.js.map +1 -0
  315. package/dist/adapters/utxo/decode.d.ts +14 -0
  316. package/dist/adapters/utxo/decode.js +85 -0
  317. package/dist/adapters/utxo/decode.js.map +1 -0
  318. package/dist/adapters/utxo/driver.d.ts +16 -0
  319. package/dist/adapters/utxo/driver.js +74 -0
  320. package/dist/adapters/utxo/driver.js.map +1 -0
  321. package/dist/adapters/utxo/ecc.d.ts +9 -0
  322. package/dist/adapters/utxo/ecc.js +26 -0
  323. package/dist/adapters/utxo/ecc.js.map +1 -0
  324. package/dist/adapters/utxo/errors.d.ts +52 -0
  325. package/dist/adapters/utxo/errors.js +191 -0
  326. package/dist/adapters/utxo/errors.js.map +1 -0
  327. package/dist/adapters/utxo/esplora.d.ts +79 -0
  328. package/dist/adapters/utxo/esplora.js +451 -0
  329. package/dist/adapters/utxo/esplora.js.map +1 -0
  330. package/dist/adapters/utxo/fees.d.ts +41 -0
  331. package/dist/adapters/utxo/fees.js +125 -0
  332. package/dist/adapters/utxo/fees.js.map +1 -0
  333. package/dist/adapters/utxo/index.d.ts +17 -0
  334. package/dist/adapters/utxo/index.js +8 -0
  335. package/dist/adapters/utxo/index.js.map +1 -0
  336. package/dist/adapters/utxo/network.d.ts +50 -0
  337. package/dist/adapters/utxo/network.js +165 -0
  338. package/dist/adapters/utxo/network.js.map +1 -0
  339. package/dist/adapters/utxo/plugin.d.ts +17 -0
  340. package/dist/adapters/utxo/plugin.js +41 -0
  341. package/dist/adapters/utxo/plugin.js.map +1 -0
  342. package/dist/adapters/utxo/presets.d.ts +12 -0
  343. package/dist/adapters/utxo/presets.js +47 -0
  344. package/dist/adapters/utxo/presets.js.map +1 -0
  345. package/dist/adapters/utxo/preview.d.ts +3 -0
  346. package/dist/adapters/utxo/preview.js +65 -0
  347. package/dist/adapters/utxo/preview.js.map +1 -0
  348. package/dist/adapters/utxo/proofs.d.ts +57 -0
  349. package/dist/adapters/utxo/proofs.js +331 -0
  350. package/dist/adapters/utxo/proofs.js.map +1 -0
  351. package/dist/adapters/utxo/rawtx.d.ts +59 -0
  352. package/dist/adapters/utxo/rawtx.js +234 -0
  353. package/dist/adapters/utxo/rawtx.js.map +1 -0
  354. package/dist/adapters/utxo/reader.d.ts +36 -0
  355. package/dist/adapters/utxo/reader.js +265 -0
  356. package/dist/adapters/utxo/reader.js.map +1 -0
  357. package/dist/adapters/utxo/sdk.d.ts +18 -0
  358. package/dist/adapters/utxo/sdk.js +17 -0
  359. package/dist/adapters/utxo/sdk.js.map +1 -0
  360. package/dist/adapters/utxo/signed-psbt.d.ts +36 -0
  361. package/dist/adapters/utxo/signed-psbt.js +428 -0
  362. package/dist/adapters/utxo/signed-psbt.js.map +1 -0
  363. package/dist/adapters/utxo/spend.d.ts +59 -0
  364. package/dist/adapters/utxo/spend.js +230 -0
  365. package/dist/adapters/utxo/spend.js.map +1 -0
  366. package/dist/adapters/utxo/types.d.ts +167 -0
  367. package/dist/adapters/utxo/types.js +3 -0
  368. package/dist/adapters/utxo/types.js.map +1 -0
  369. package/dist/core/assets/service.d.ts +18 -0
  370. package/dist/core/assets/service.js +69 -0
  371. package/dist/core/assets/service.js.map +1 -0
  372. package/dist/core/blockchain/default-ref.d.ts +4 -0
  373. package/dist/core/blockchain/default-ref.js +16 -0
  374. package/dist/core/blockchain/default-ref.js.map +1 -0
  375. package/dist/core/blockchain/handle.d.ts +200 -0
  376. package/dist/core/blockchain/handle.js +579 -0
  377. package/dist/core/blockchain/handle.js.map +1 -0
  378. package/dist/core/blockchain/internal.d.ts +19 -0
  379. package/dist/core/blockchain/internal.js +16 -0
  380. package/dist/core/blockchain/internal.js.map +1 -0
  381. package/dist/core/blockchain/mapping.d.ts +22 -0
  382. package/dist/core/blockchain/mapping.js +136 -0
  383. package/dist/core/blockchain/mapping.js.map +1 -0
  384. package/dist/core/config/env.d.ts +8 -0
  385. package/dist/core/config/env.js +60 -0
  386. package/dist/core/config/env.js.map +1 -0
  387. package/dist/core/config/merge.d.ts +26 -0
  388. package/dist/core/config/merge.js +144 -0
  389. package/dist/core/config/merge.js.map +1 -0
  390. package/dist/core/config/resolve.d.ts +12 -0
  391. package/dist/core/config/resolve.js +251 -0
  392. package/dist/core/config/resolve.js.map +1 -0
  393. package/dist/core/config/types.d.ts +165 -0
  394. package/dist/core/config/types.js +3 -0
  395. package/dist/core/config/types.js.map +1 -0
  396. package/dist/core/container/builtins.d.ts +4 -0
  397. package/dist/core/container/builtins.js +13 -0
  398. package/dist/core/container/builtins.js.map +1 -0
  399. package/dist/core/container/container.d.ts +69 -0
  400. package/dist/core/container/container.js +466 -0
  401. package/dist/core/container/container.js.map +1 -0
  402. package/dist/core/container/default.d.ts +15 -0
  403. package/dist/core/container/default.js +70 -0
  404. package/dist/core/container/default.js.map +1 -0
  405. package/dist/core/container/internals.d.ts +54 -0
  406. package/dist/core/container/internals.js +21 -0
  407. package/dist/core/container/internals.js.map +1 -0
  408. package/dist/core/container/pool.d.ts +27 -0
  409. package/dist/core/container/pool.js +77 -0
  410. package/dist/core/container/pool.js.map +1 -0
  411. package/dist/core/driver/types.d.ts +346 -0
  412. package/dist/core/driver/types.js +3 -0
  413. package/dist/core/driver/types.js.map +1 -0
  414. package/dist/core/errors/codes.d.ts +153 -0
  415. package/dist/core/errors/codes.js +49 -0
  416. package/dist/core/errors/codes.js.map +1 -0
  417. package/dist/core/errors/error.d.ts +66 -0
  418. package/dist/core/errors/error.js +129 -0
  419. package/dist/core/errors/error.js.map +1 -0
  420. package/dist/core/events/bus.d.ts +12 -0
  421. package/dist/core/events/bus.js +46 -0
  422. package/dist/core/events/bus.js.map +1 -0
  423. package/dist/core/events/logger.d.ts +13 -0
  424. package/dist/core/events/logger.js +42 -0
  425. package/dist/core/events/logger.js.map +1 -0
  426. package/dist/core/events/types.d.ts +131 -0
  427. package/dist/core/events/types.js +3 -0
  428. package/dist/core/events/types.js.map +1 -0
  429. package/dist/core/lifecycle/engine-rules.d.ts +107 -0
  430. package/dist/core/lifecycle/engine-rules.js +257 -0
  431. package/dist/core/lifecycle/engine-rules.js.map +1 -0
  432. package/dist/core/lifecycle/engine.d.ts +500 -0
  433. package/dist/core/lifecycle/engine.js +1732 -0
  434. package/dist/core/lifecycle/engine.js.map +1 -0
  435. package/dist/core/lifecycle/evaluate.d.ts +19 -0
  436. package/dist/core/lifecycle/evaluate.js +72 -0
  437. package/dist/core/lifecycle/evaluate.js.map +1 -0
  438. package/dist/core/lifecycle/intent.d.ts +11 -0
  439. package/dist/core/lifecycle/intent.js +88 -0
  440. package/dist/core/lifecycle/intent.js.map +1 -0
  441. package/dist/core/lifecycle/monitor.d.ts +138 -0
  442. package/dist/core/lifecycle/monitor.js +606 -0
  443. package/dist/core/lifecycle/monitor.js.map +1 -0
  444. package/dist/core/lifecycle/observations.d.ts +17 -0
  445. package/dist/core/lifecycle/observations.js +59 -0
  446. package/dist/core/lifecycle/observations.js.map +1 -0
  447. package/dist/core/lifecycle/reconcile.d.ts +58 -0
  448. package/dist/core/lifecycle/reconcile.js +112 -0
  449. package/dist/core/lifecycle/reconcile.js.map +1 -0
  450. package/dist/core/lifecycle/views.d.ts +49 -0
  451. package/dist/core/lifecycle/views.js +57 -0
  452. package/dist/core/lifecycle/views.js.map +1 -0
  453. package/dist/core/lifecycle/workers.d.ts +82 -0
  454. package/dist/core/lifecycle/workers.js +329 -0
  455. package/dist/core/lifecycle/workers.js.map +1 -0
  456. package/dist/core/model/address.d.ts +32 -0
  457. package/dist/core/model/address.js +43 -0
  458. package/dist/core/model/address.js.map +1 -0
  459. package/dist/core/model/amount.d.ts +25 -0
  460. package/dist/core/model/amount.js +102 -0
  461. package/dist/core/model/amount.js.map +1 -0
  462. package/dist/core/model/asset.d.ts +28 -0
  463. package/dist/core/model/asset.js +47 -0
  464. package/dist/core/model/asset.js.map +1 -0
  465. package/dist/core/model/capability.d.ts +3 -0
  466. package/dist/core/model/capability.js +18 -0
  467. package/dist/core/model/capability.js.map +1 -0
  468. package/dist/core/model/chain.d.ts +63 -0
  469. package/dist/core/model/chain.js +8 -0
  470. package/dist/core/model/chain.js.map +1 -0
  471. package/dist/core/model/fee.d.ts +36 -0
  472. package/dist/core/model/fee.js +17 -0
  473. package/dist/core/model/fee.js.map +1 -0
  474. package/dist/core/model/ids.d.ts +37 -0
  475. package/dist/core/model/ids.js +13 -0
  476. package/dist/core/model/ids.js.map +1 -0
  477. package/dist/core/model/intent.d.ts +63 -0
  478. package/dist/core/model/intent.js +81 -0
  479. package/dist/core/model/intent.js.map +1 -0
  480. package/dist/core/model/ordering.d.ts +20 -0
  481. package/dist/core/model/ordering.js +29 -0
  482. package/dist/core/model/ordering.js.map +1 -0
  483. package/dist/core/model/transaction.d.ts +116 -0
  484. package/dist/{type/lib-types.js → core/model/transaction.js} +1 -1
  485. package/dist/core/model/transaction.js.map +1 -0
  486. package/dist/core/observe/scanner.d.ts +135 -0
  487. package/dist/core/observe/scanner.js +355 -0
  488. package/dist/core/observe/scanner.js.map +1 -0
  489. package/dist/core/ordering/reservations.d.ts +16 -0
  490. package/dist/core/ordering/reservations.js +53 -0
  491. package/dist/core/ordering/reservations.js.map +1 -0
  492. package/dist/core/ordering/sequence.d.ts +61 -0
  493. package/dist/core/ordering/sequence.js +155 -0
  494. package/dist/core/ordering/sequence.js.map +1 -0
  495. package/dist/core/registry/adapters.d.ts +10 -0
  496. package/dist/core/registry/adapters.js +56 -0
  497. package/dist/core/registry/adapters.js.map +1 -0
  498. package/dist/core/registry/assets.d.ts +18 -0
  499. package/dist/core/registry/assets.js +90 -0
  500. package/dist/core/registry/assets.js.map +1 -0
  501. package/dist/core/registry/chains.d.ts +10 -0
  502. package/dist/core/registry/chains.js +80 -0
  503. package/dist/core/registry/chains.js.map +1 -0
  504. package/dist/core/registry/plugin.d.ts +41 -0
  505. package/dist/core/registry/plugin.js +109 -0
  506. package/dist/core/registry/plugin.js.map +1 -0
  507. package/dist/core/registry/providers.d.ts +31 -0
  508. package/dist/core/registry/providers.js +43 -0
  509. package/dist/core/registry/providers.js.map +1 -0
  510. package/dist/core/registry/schemes.d.ts +30 -0
  511. package/dist/core/registry/schemes.js +84 -0
  512. package/dist/core/registry/schemes.js.map +1 -0
  513. package/dist/core/secret/fragments.d.ts +33 -0
  514. package/dist/core/secret/fragments.js +110 -0
  515. package/dist/core/secret/fragments.js.map +1 -0
  516. package/dist/core/secret/redact.d.ts +10 -0
  517. package/dist/core/secret/redact.js +110 -0
  518. package/dist/core/secret/redact.js.map +1 -0
  519. package/dist/core/secret/secret.d.ts +14 -0
  520. package/dist/core/secret/secret.js +42 -0
  521. package/dist/core/secret/secret.js.map +1 -0
  522. package/dist/core/signing/callback.d.ts +10 -0
  523. package/dist/core/signing/callback.js +22 -0
  524. package/dist/core/signing/callback.js.map +1 -0
  525. package/dist/core/signing/guard.d.ts +18 -0
  526. package/dist/core/signing/guard.js +72 -0
  527. package/dist/core/signing/guard.js.map +1 -0
  528. package/dist/core/signing/hd.d.ts +36 -0
  529. package/dist/core/signing/hd.js +167 -0
  530. package/dist/core/signing/hd.js.map +1 -0
  531. package/dist/core/signing/local.d.ts +48 -0
  532. package/dist/core/signing/local.js +190 -0
  533. package/dist/core/signing/local.js.map +1 -0
  534. package/dist/core/signing/orchestrator.d.ts +40 -0
  535. package/dist/core/signing/orchestrator.js +300 -0
  536. package/dist/core/signing/orchestrator.js.map +1 -0
  537. package/dist/core/signing/types.d.ts +64 -0
  538. package/dist/core/signing/types.js +3 -0
  539. package/dist/core/signing/types.js.map +1 -0
  540. package/dist/core/signing/wallet.d.ts +48 -0
  541. package/dist/core/signing/wallet.js +153 -0
  542. package/dist/core/signing/wallet.js.map +1 -0
  543. package/dist/core/store/clone.d.ts +25 -0
  544. package/dist/core/store/clone.js +71 -0
  545. package/dist/core/store/clone.js.map +1 -0
  546. package/dist/core/store/memory.d.ts +38 -0
  547. package/dist/core/store/memory.js +325 -0
  548. package/dist/core/store/memory.js.map +1 -0
  549. package/dist/core/store/types.d.ts +246 -0
  550. package/dist/core/store/types.js +117 -0
  551. package/dist/core/store/types.js.map +1 -0
  552. package/dist/core/transport/backoff.d.ts +8 -0
  553. package/dist/core/transport/backoff.js +27 -0
  554. package/dist/core/transport/backoff.js.map +1 -0
  555. package/dist/core/transport/circuit.d.ts +25 -0
  556. package/dist/core/transport/circuit.js +61 -0
  557. package/dist/core/transport/circuit.js.map +1 -0
  558. package/dist/core/transport/http-transport.d.ts +30 -0
  559. package/dist/core/transport/http-transport.js +1695 -0
  560. package/dist/core/transport/http-transport.js.map +1 -0
  561. package/dist/core/transport/rate-limit.d.ts +27 -0
  562. package/dist/core/transport/rate-limit.js +78 -0
  563. package/dist/core/transport/rate-limit.js.map +1 -0
  564. package/dist/core/transport/stale-view.d.ts +11 -0
  565. package/dist/core/transport/stale-view.js +17 -0
  566. package/dist/core/transport/stale-view.js.map +1 -0
  567. package/dist/core/transport/types.d.ts +144 -0
  568. package/dist/core/transport/types.js +6 -0
  569. package/dist/core/transport/types.js.map +1 -0
  570. package/dist/core/util/bytes.d.ts +9 -0
  571. package/dist/core/util/bytes.js +40 -0
  572. package/dist/core/util/bytes.js.map +1 -0
  573. package/dist/core/util/clock.d.ts +6 -0
  574. package/dist/core/util/clock.js +26 -0
  575. package/dist/core/util/clock.js.map +1 -0
  576. package/dist/core/util/freeze.d.ts +8 -0
  577. package/dist/core/util/freeze.js +31 -0
  578. package/dist/core/util/freeze.js.map +1 -0
  579. package/dist/core/util/json.d.ts +29 -0
  580. package/dist/core/util/json.js +165 -0
  581. package/dist/core/util/json.js.map +1 -0
  582. package/dist/core/util/names.d.ts +21 -0
  583. package/dist/core/util/names.js +46 -0
  584. package/dist/core/util/names.js.map +1 -0
  585. package/dist/index.d.ts +64 -14
  586. package/dist/index.js +105 -49
  587. package/dist/index.js.map +1 -1
  588. package/dist/native.d.ts +21 -0
  589. package/dist/native.js +44 -0
  590. package/dist/native.js.map +1 -0
  591. package/dist/testing/contracts/api.d.ts +12 -0
  592. package/dist/testing/contracts/api.js +58 -0
  593. package/dist/testing/contracts/api.js.map +1 -0
  594. package/dist/testing/contracts/cursors.d.ts +6 -0
  595. package/dist/testing/contracts/cursors.js +43 -0
  596. package/dist/testing/contracts/cursors.js.map +1 -0
  597. package/dist/testing/contracts/locks.d.ts +10 -0
  598. package/dist/testing/contracts/locks.js +63 -0
  599. package/dist/testing/contracts/locks.js.map +1 -0
  600. package/dist/testing/contracts/operations.d.ts +21 -0
  601. package/dist/testing/contracts/operations.js +718 -0
  602. package/dist/testing/contracts/operations.js.map +1 -0
  603. package/dist/testing/contracts/sequences.d.ts +6 -0
  604. package/dist/testing/contracts/sequences.js +68 -0
  605. package/dist/testing/contracts/sequences.js.map +1 -0
  606. package/dist/testing/env.d.ts +63 -0
  607. package/dist/testing/env.js +105 -0
  608. package/dist/testing/env.js.map +1 -0
  609. package/dist/testing/fake-chain.d.ts +118 -0
  610. package/dist/testing/fake-chain.js +536 -0
  611. package/dist/testing/fake-chain.js.map +1 -0
  612. package/dist/testing/fake-clock.d.ts +15 -0
  613. package/dist/testing/fake-clock.js +86 -0
  614. package/dist/testing/fake-clock.js.map +1 -0
  615. package/dist/testing/fake-driver.d.ts +15 -0
  616. package/dist/testing/fake-driver.js +458 -0
  617. package/dist/testing/fake-driver.js.map +1 -0
  618. package/dist/testing/fake-fetch.d.ts +32 -0
  619. package/dist/testing/fake-fetch.js +81 -0
  620. package/dist/testing/fake-fetch.js.map +1 -0
  621. package/dist/testing/fake-plugin.d.ts +30 -0
  622. package/dist/testing/fake-plugin.js +66 -0
  623. package/dist/testing/fake-plugin.js.map +1 -0
  624. package/dist/testing/faulty-store.d.ts +36 -0
  625. package/dist/testing/faulty-store.js +66 -0
  626. package/dist/testing/faulty-store.js.map +1 -0
  627. package/dist/testing/generation.d.ts +60 -0
  628. package/dist/testing/generation.js +252 -0
  629. package/dist/testing/generation.js.map +1 -0
  630. package/dist/testing/index.d.ts +28 -0
  631. package/dist/testing/index.js +51 -0
  632. package/dist/testing/index.js.map +1 -0
  633. package/package.json +188 -45
  634. package/dist/libs/eth/account.d.ts +0 -9
  635. package/dist/libs/eth/account.js +0 -58
  636. package/dist/libs/eth/account.js.map +0 -1
  637. package/dist/libs/eth/contract.d.ts +0 -7
  638. package/dist/libs/eth/contract.js +0 -42
  639. package/dist/libs/eth/contract.js.map +0 -1
  640. package/dist/libs/eth/index.d.ts +0 -24
  641. package/dist/libs/eth/index.js +0 -72
  642. package/dist/libs/eth/index.js.map +0 -1
  643. package/dist/libs/eth/transact.d.ts +0 -7
  644. package/dist/libs/eth/transact.js +0 -26
  645. package/dist/libs/eth/transact.js.map +0 -1
  646. package/dist/libs/index.d.ts +0 -2
  647. package/dist/libs/index.js +0 -19
  648. package/dist/libs/index.js.map +0 -1
  649. package/dist/libs/trx/account.d.ts +0 -9
  650. package/dist/libs/trx/account.js +0 -55
  651. package/dist/libs/trx/account.js.map +0 -1
  652. package/dist/libs/trx/contract.d.ts +0 -7
  653. package/dist/libs/trx/contract.js +0 -27
  654. package/dist/libs/trx/contract.js.map +0 -1
  655. package/dist/libs/trx/index.d.ts +0 -22
  656. package/dist/libs/trx/index.js +0 -64
  657. package/dist/libs/trx/index.js.map +0 -1
  658. package/dist/libs/trx/transact.d.ts +0 -7
  659. package/dist/libs/trx/transact.js +0 -26
  660. package/dist/libs/trx/transact.js.map +0 -1
  661. package/dist/tool/common.d.ts +0 -28
  662. package/dist/tool/common.js +0 -33
  663. package/dist/tool/common.js.map +0 -1
  664. package/dist/tool/eth-tools.d.ts +0 -3
  665. package/dist/tool/eth-tools.js +0 -33
  666. package/dist/tool/eth-tools.js.map +0 -1
  667. package/dist/tool/index.d.ts +0 -5
  668. package/dist/tool/index.js +0 -22
  669. package/dist/tool/index.js.map +0 -1
  670. package/dist/tool/logging.d.ts +0 -3
  671. package/dist/tool/logging.js +0 -11
  672. package/dist/tool/logging.js.map +0 -1
  673. package/dist/tool/options.d.ts +0 -6
  674. package/dist/tool/options.js +0 -41
  675. package/dist/tool/options.js.map +0 -1
  676. package/dist/tool/trx-tools.d.ts +0 -3
  677. package/dist/tool/trx-tools.js +0 -20
  678. package/dist/tool/trx-tools.js.map +0 -1
  679. package/dist/type/account.d.ts +0 -9
  680. package/dist/type/account.js.map +0 -1
  681. package/dist/type/common.d.ts +0 -18
  682. package/dist/type/common.js.map +0 -1
  683. package/dist/type/contract.d.ts +0 -10
  684. package/dist/type/contract.js.map +0 -1
  685. package/dist/type/index.d.ts +0 -5
  686. package/dist/type/index.js +0 -22
  687. package/dist/type/index.js.map +0 -1
  688. package/dist/type/lib-types.d.ts +0 -9
  689. package/dist/type/lib-types.js.map +0 -1
  690. package/dist/type/transact.d.ts +0 -7
  691. package/dist/type/transact.js.map +0 -1
@@ -0,0 +1,261 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.classifyBroadcast = classifyBroadcast;
4
+ exports.classifyOwnBroadcast = classifyOwnBroadcast;
5
+ exports.txBytesOf = txBytesOf;
6
+ const error_1 = require("../../core/errors/error");
7
+ const bytes_1 = require("../../core/util/bytes");
8
+ const protobuf_1 = require("./protobuf");
9
+ const refused = (code, reason) => Object.freeze({ kind: 'refused', code, reason });
10
+ const rejected = (reason) => Object.freeze({ kind: 'rejected', reason });
11
+ const ACCEPTED = Object.freeze({ kind: 'accepted' });
12
+ /** `Dup transaction.`, or `Transaction already exists.` from the id cache: never a failure. */
13
+ const ALREADY_KNOWN = Object.freeze({ kind: 'already-known' });
14
+ /** `Constant.PER_SIGN_LENGTH`: consensus (`TransactionCapsule.checkWeight`) refuses less. */
15
+ const MIN_SIGNATURE_BYTES = 65;
16
+ /** `Constant.TRANSACTION_MAX_BYTE_SIZE` (500 KiB). */
17
+ const MAX_TX_BYTES = 512_000;
18
+ /** `Constant.MAX_RESULT_SIZE_IN_TX` × 2, which the "with result" size check adds. */
19
+ const RESULT_BYTES = 128;
20
+ /**
21
+ * The signature and size rules measure the bytes as sent, while what lands is the
22
+ * txID with any signatures. A relayer may drop a signature, and java-tron reads only a
23
+ * signature's first 65 bytes (`checkWeight`), so it may trim padding too. So a claim holds
24
+ * only for bytes whose txID has no smaller valid form: one signature and, for the size, one
25
+ * of exactly 65 bytes.
26
+ */
27
+ const oneSignature = (tx) => tx.signatures.length === 1;
28
+ /** The size rules: java-tron measures the transaction without `ret`. */
29
+ const oversize = (tx) => oneSignature(tx) && tx.signatures[0] === MIN_SIGNATURE_BYTES && tx.size > MAX_TX_BYTES;
30
+ const PERMANENT = [
31
+ {
32
+ // Admission refuses sizes outside 65–68 (`SignUtils.isValidLength`), but consensus keeps
33
+ // `size < 65` (its own comment: longer historical signatures carry padding), so only a
34
+ // shorter signature is invalid everywhere.
35
+ code: 'SIGERROR',
36
+ text: /^Validate signature error: Signature size is (0|[1-9]\d{0,9})$/,
37
+ shows: (size) => size < MIN_SIGNATURE_BYTES,
38
+ holds: (tx) => oneSignature(tx) && tx.signatures[0] < MIN_SIGNATURE_BYTES,
39
+ result: rejected('malformed signature'),
40
+ },
41
+ {
42
+ // `Wallet.broadcastTransaction`: no contract at all (TransferActuator's use of the same
43
+ // text needs a missing parameter, which a parsed transaction never has).
44
+ code: 'CONTRACT_VALIDATE_ERROR',
45
+ text: /^Contract validate error : No contract!$/,
46
+ holds: (tx) => tx.contracts === 0,
47
+ result: rejected('no contract'),
48
+ },
49
+ {
50
+ code: 'CONTRACT_VALIDATE_ERROR',
51
+ text: /^Contract validate error : Cannot transfer TRX to yourself\.$/,
52
+ holds: (tx) => tx.transfer !== undefined && tx.transfer.owner === tx.transfer.to,
53
+ result: rejected('transfer to self'),
54
+ },
55
+ {
56
+ code: 'CONTRACT_VALIDATE_ERROR',
57
+ text: /^Contract validate error : Amount must be greater than 0\.$/,
58
+ holds: (tx) => tx.transfer !== undefined && tx.transfer.amount <= 0n,
59
+ result: rejected('non-positive amount'),
60
+ },
61
+ {
62
+ // `Manager.validateCommon`, applied in blocks too: the whole transaction.
63
+ code: 'TOO_BIG_TRANSACTION_ERROR',
64
+ text: /^Too big transaction, TxId [0-9a-f]{64}, the size is (0|[1-9]\d{0,18}) bytes, maxTxSize 512000$/,
65
+ shows: (size) => size > MAX_TX_BYTES,
66
+ holds: oversize,
67
+ result: rejected('transaction too large'),
68
+ },
69
+ {
70
+ // The size without results + 128 bytes; in blocks only under
71
+ // `allowConsensusLogicOptimization`, so only a size the plain check also refuses.
72
+ code: 'TOO_BIG_TRANSACTION_ERROR',
73
+ text: /^Too big transaction with result, TxId [0-9a-f]{64}, the size is (0|[1-9]\d{0,18}) bytes, maxTxSize 512000$/,
74
+ shows: (size) => size - RESULT_BYTES > MAX_TX_BYTES,
75
+ holds: oversize,
76
+ result: rejected('transaction too large'),
77
+ },
78
+ ];
79
+ /** Refinements of `CONTRACT_VALIDATE_ERROR`: all state-dependent, so all `refused`. */
80
+ const CONTRACT_REFUSALS = [
81
+ // `BandwidthProcessor.consume` refuses a missing owner before any contract check.
82
+ [
83
+ /^Contract validate error : account \[T[1-9A-HJ-NP-Za-km-z]{33}\] does not exist$/,
84
+ refused('INSUFFICIENT_FUNDS', 'sender account not activated'),
85
+ ],
86
+ // TransferActuator's own wording, which `consume` pre-empts in v4.8.2.2.
87
+ [
88
+ /^Contract validate error : Validate TransferContract error, no OwnerAccount\.$/,
89
+ refused('INSUFFICIENT_FUNDS', 'sender account not activated'),
90
+ ],
91
+ // TransferActuator (the amount) and `MUtil.transfer` (a call value).
92
+ [
93
+ /^Contract validate error : Validate (?:TransferContract|InternalTransfer) error, balance is not sufficient\.$/,
94
+ refused('INSUFFICIENT_FUNDS', 'insufficient balance'),
95
+ ],
96
+ ];
97
+ /** The refusals java-tron answers before it pools the transaction, by code. */
98
+ const REFUSED = new Map([
99
+ ['SIGERROR', refused('TX_REFUSED', 'signature not accepted for this account')],
100
+ ['CONTRACT_VALIDATE_ERROR', refused('TX_REFUSED', 'contract validation failed')],
101
+ ['CONTRACT_EXE_ERROR', refused('TX_REFUSED', 'contract execution failed')],
102
+ [
103
+ 'BANDWITH_ERROR',
104
+ refused('INSUFFICIENT_FUNDS', 'insufficient bandwidth or balance for fees'),
105
+ ],
106
+ ['TAPOS_ERROR', refused('TX_REFUSED', 'reference block not on the canonical chain')],
107
+ ['TOO_BIG_TRANSACTION_ERROR', refused('TX_REFUSED', 'transaction refused')],
108
+ ['TRANSACTION_EXPIRATION_ERROR', refused('TX_EXPIRED', 'transaction expired')],
109
+ ]);
110
+ const NODE_LOCAL = new Set([
111
+ 'SERVER_BUSY',
112
+ 'NO_CONNECTION',
113
+ 'NOT_ENOUGH_EFFECTIVE_CONNECTION',
114
+ 'BLOCK_UNSOLIDIFIED',
115
+ ]);
116
+ function permanent(code, message) {
117
+ for (const rule of PERMANENT) {
118
+ if (rule.code !== code)
119
+ continue;
120
+ const match = rule.text.exec(message);
121
+ if (match === null)
122
+ continue;
123
+ if (rule.shows && !rule.shows(Number(match[1])))
124
+ return undefined;
125
+ return rule;
126
+ }
127
+ return undefined;
128
+ }
129
+ /** The node's answer at its word, with the rule when it claims a definitive rejection. */
130
+ function classified(answer) {
131
+ if (answer.accepted)
132
+ return { result: ACCEPTED };
133
+ const { code = '', message = '' } = answer;
134
+ if (code === 'DUP_TRANSACTION_ERROR')
135
+ return { result: ALREADY_KNOWN };
136
+ const refusal = REFUSED.get(code);
137
+ if (refusal === undefined) {
138
+ throw new error_1.ProviderError('PROVIDER_UNAVAILABLE', NODE_LOCAL.has(code)
139
+ ? // "P2P broadcast failed." comes after java-tron pooled the transaction.
140
+ 'the node could not relay the transaction; it may have been sent'
141
+ : 'the node answered the broadcast without a known refusal; it may have been sent', { ambiguous: true });
142
+ }
143
+ const rule = permanent(code, message);
144
+ if (rule)
145
+ return { result: rule.result, rule };
146
+ if (code === 'CONTRACT_VALIDATE_ERROR') {
147
+ for (const [text, result] of CONTRACT_REFUSALS) {
148
+ if (text.test(message))
149
+ return { result };
150
+ }
151
+ }
152
+ return { result: refusal };
153
+ }
154
+ /** The node's answer at its word (see `classifyOwnBroadcast` for our own broadcasts). */
155
+ function classifyBroadcast(answer) {
156
+ return classified(answer).result;
157
+ }
158
+ /** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */
159
+ const UNCONFIRMED = refused('TX_REFUSED', 'the node claimed the transaction is invalid');
160
+ /**
161
+ * The node's answer to bytes this driver sent, `sent` being those bytes read by
162
+ * `txBytesOf` (`undefined` when they do not read). A `rejected` stands only when its claimed
163
+ * reason holds for `sent`; otherwise the answer is `refused`. Every other answer is the
164
+ * node's, as `classifyBroadcast` reads it: acceptance, duplicates, state-dependent refusals
165
+ * (balance, a missing account, bandwidth, TaPoS, expiry, the fee limit) and possibly sent.
166
+ */
167
+ function classifyOwnBroadcast(answer, sent) {
168
+ const { result, rule } = classified(answer);
169
+ if (rule === undefined)
170
+ return result;
171
+ return sent !== undefined && rule.holds(sent) ? result : UNCONFIRMED;
172
+ }
173
+ /** Bytes are read up to twice java-tron's transaction limit, and no further. */
174
+ const MAX_READ_BYTES = 2 * MAX_TX_BYTES;
175
+ const INT64_MAX = (1n << 63n) - 1n;
176
+ const INT64_SPAN = 1n << 64n;
177
+ const TRANSFER_URL = 'type.googleapis.com/protocol.TransferContract';
178
+ /** `ContractType.TransferContract`. */
179
+ const TRANSFER_TYPE = 1n;
180
+ /** A field's bytes, or none: absent fields read as empty, as java-tron reads them. */
181
+ const bytesField = (value) => (0, protobuf_1.bytesOf)(value) ?? new Uint8Array();
182
+ /**
183
+ * The bytes a broadcast sent, as the rejection checks read them, SDK-free: `Transaction`
184
+ * (`raw_data` once, signatures, `ret` entries left out of the size), the contracts in
185
+ * `raw_data`, and a single TransferContract's fields. `undefined` for hex that does not read
186
+ * strictly, or is longer than `MAX_READ_BYTES`; no claim holds for it.
187
+ */
188
+ function txBytesOf(hex) {
189
+ if (typeof hex !== 'string' || hex.length > 2 * MAX_READ_BYTES)
190
+ return undefined;
191
+ let bytes;
192
+ try {
193
+ bytes = (0, bytes_1.fromHex)(hex);
194
+ }
195
+ catch {
196
+ return undefined;
197
+ }
198
+ const outer = (0, protobuf_1.wireFields)(bytes, 'refuse');
199
+ if (!outer)
200
+ return undefined;
201
+ let raw;
202
+ let size = 0;
203
+ const signatures = [];
204
+ for (const { field, value, length } of outer) {
205
+ if (!(value instanceof Uint8Array))
206
+ return undefined;
207
+ if (field === 1 && raw === undefined)
208
+ raw = value;
209
+ else if (field === 2)
210
+ signatures.push(value.length);
211
+ else if (field !== 5)
212
+ return undefined;
213
+ // `ret` (field 5): java-tron clears it before it measures the transaction.
214
+ if (field !== 5)
215
+ size += length;
216
+ }
217
+ const fields = raw ? (0, protobuf_1.wireFields)(raw, 'refuse') : null;
218
+ if (!fields)
219
+ return undefined;
220
+ const contracts = fields.filter((f) => f.field === 11);
221
+ const read = { size, signatures, contracts: contracts.length };
222
+ const only = contracts.length === 1 ? contracts[0]?.value : undefined;
223
+ if (only === undefined)
224
+ return read;
225
+ if (!(only instanceof Uint8Array))
226
+ return undefined;
227
+ const contract = (0, protobuf_1.singular)(only, {
228
+ 1: 'varint',
229
+ 2: 'bytes',
230
+ 3: 'bytes',
231
+ 4: 'bytes',
232
+ 5: 'varint',
233
+ });
234
+ if (!contract)
235
+ return undefined;
236
+ if (contract.get(1) !== TRANSFER_TYPE)
237
+ return read;
238
+ const any = (0, protobuf_1.singular)(bytesField(contract.get(2)), { 1: 'bytes', 2: 'bytes' });
239
+ if (!any)
240
+ return undefined;
241
+ // java-tron unpacks the parameter as the named type; any other type fails otherwise.
242
+ if ((0, bytes_1.toHex)(bytesField(any.get(1))) !== (0, bytes_1.toHex)((0, bytes_1.utf8ToBytes)(TRANSFER_URL)))
243
+ return read;
244
+ const transfer = (0, protobuf_1.singular)(bytesField(any.get(2)), {
245
+ 1: 'bytes',
246
+ 2: 'bytes',
247
+ 3: 'varint',
248
+ });
249
+ if (!transfer)
250
+ return undefined;
251
+ const amount = transfer.get(3) ?? 0n;
252
+ return {
253
+ ...read,
254
+ transfer: {
255
+ owner: (0, bytes_1.toHex)(bytesField(transfer.get(1))),
256
+ to: (0, bytes_1.toHex)(bytesField(transfer.get(2))),
257
+ amount: amount > INT64_MAX ? amount - INT64_SPAN : amount,
258
+ },
259
+ };
260
+ }
261
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../../src/adapters/tron/errors.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Broadcast classification, pure. java-tron answers\n * `/wallet/broadcasthex` with HTTP 200 and `{ result: false, code, message }`, so the\n * transport never sees these as errors. The codes, texts and their order are java-tron's\n * (`Wallet.broadcastTransaction`, `Manager.pushTransaction` and `processTransaction`,\n * checked against GreatVoyage-v4.8.2.2, `d5c3d1d1`).\n * - `rejected` only on definitive evidence: the refusal code plus an exact, anchored text\n * that consensus also refuses for these bytes on every node at every time — a signature\n * under 65 bytes, no contract, a transfer to self, a non-positive amount, or a size over\n * the constant 512,000-byte limit (the signature and size rules only for bytes with one\n * signature). Numbers in those texts must show the defect: a text that\n * contradicts itself decides nothing.\n * - Refusal codes java-tron gives before it pools the transaction are `refused`, the\n * default for any text: account state, permissions, chain parameters and node policy\n * can change.\n * - Node-local codes (busy, not connected, not solidified, \"P2P broadcast failed.\", which\n * java-tron returns after it pooled the transaction), `OTHER_ERROR` (its catch-all, which\n * also covers a failure after pooling) and any empty or unknown code are thrown as a\n * retryable `PROVIDER_UNAVAILABLE` marked `ambiguous`: possibly sent, even for a bare\n * `Blockchain.broadcast` caller.\n * Nothing here decides from text alone: the code gates every result. Reasons are\n * fixed literals: no address, amount, transaction id or node text. Every pattern is\n * anchored and linear, whatever the message's length.\n *\n * A node's rejection is a claim. `classifyBroadcast` takes the node at\n * its word; `classifyOwnBroadcast`, which the broadcaster uses, keeps a `rejected` only when\n * the claimed reason holds for the bytes that were sent (`txBytesOf`, read with the SDK-free\n * reader the codec shares, `protobuf.ts`), and makes every other one `refused`, which\n * is not terminal. A terminal `rejected`\n * lets a caller pay again, so a lying endpoint that relayed the bytes, or keeps them to relay\n * later, would make that a second payment. Our builder refuses every byte-only defect before\n * signing, so a true rejection of our own bytes should not happen; a refusal costs liveness\n * only, and the expiry proof still ends the Operation.\n */\nimport type { BroadcastResult } from '../../core/driver/types';\nimport { ProviderError } from '../../core/errors/error';\nimport { fromHex, toHex, utf8ToBytes } from '../../core/util/bytes';\nimport type { BroadcastAnswer } from './http';\nimport { bytesOf, singular, wireFields, type WireValue } from './protobuf';\n\ntype RefusalCode = Extract<BroadcastResult, { kind: 'refused' }>['code'];\n\nconst refused = (code: RefusalCode, reason: string): BroadcastResult =>\n Object.freeze({ kind: 'refused', code, reason });\nconst rejected = (reason: string): BroadcastResult =>\n Object.freeze({ kind: 'rejected', reason });\n\nconst ACCEPTED: BroadcastResult = Object.freeze({ kind: 'accepted' });\n/** `Dup transaction.`, or `Transaction already exists.` from the id cache: never a failure. */\nconst ALREADY_KNOWN: BroadcastResult = Object.freeze({ kind: 'already-known' });\n\n/** `Constant.PER_SIGN_LENGTH`: consensus (`TransactionCapsule.checkWeight`) refuses less. */\nconst MIN_SIGNATURE_BYTES = 65;\n/** `Constant.TRANSACTION_MAX_BYTE_SIZE` (500 KiB). */\nconst MAX_TX_BYTES = 512_000;\n/** `Constant.MAX_RESULT_SIZE_IN_TX` × 2, which the \"with result\" size check adds. */\nconst RESULT_BYTES = 128;\n\n/**\n * Our signed transaction as java-tron's byte-only checks read it, from the hex\n * that was sent.\n */\nexport interface TronTxBytes {\n /** The serialized `Transaction` without `ret`, which java-tron clears before measuring it. */\n readonly size: number;\n /** Each signature's length, in bytes. */\n readonly signatures: readonly number[];\n /** How many contracts `raw_data` holds (field 11). */\n readonly contracts: number;\n /**\n * The one contract when it is a TransferContract: its addresses as hex and its amount as\n * java-tron reads the `int64` (negative above 2^63 − 1; 0 when absent).\n */\n readonly transfer?: {\n readonly owner: string;\n readonly to: string;\n readonly amount: bigint;\n };\n}\n\ninterface Permanent {\n readonly code: string;\n readonly text: RegExp;\n /** For a text with a number: whether the number shows the defect (else it decides nothing). */\n readonly shows?: (value: number) => boolean;\n /** Whether the claimed reason holds for the bytes that were sent. */\n readonly holds: (tx: TronTxBytes) => boolean;\n readonly result: BroadcastResult;\n}\n\n/**\n * The signature and size rules measure the bytes as sent, while what lands is the\n * txID with any signatures. A relayer may drop a signature, and java-tron reads only a\n * signature's first 65 bytes (`checkWeight`), so it may trim padding too. So a claim holds\n * only for bytes whose txID has no smaller valid form: one signature and, for the size, one\n * of exactly 65 bytes.\n */\nconst oneSignature = (tx: TronTxBytes): boolean => tx.signatures.length === 1;\n\n/** The size rules: java-tron measures the transaction without `ret`. */\nconst oversize = (tx: TronTxBytes): boolean =>\n oneSignature(tx) && tx.signatures[0] === MIN_SIGNATURE_BYTES && tx.size > MAX_TX_BYTES;\n\nconst PERMANENT: readonly Permanent[] = [\n {\n // Admission refuses sizes outside 65–68 (`SignUtils.isValidLength`), but consensus keeps\n // `size < 65` (its own comment: longer historical signatures carry padding), so only a\n // shorter signature is invalid everywhere.\n code: 'SIGERROR',\n text: /^Validate signature error: Signature size is (0|[1-9]\\d{0,9})$/,\n shows: (size) => size < MIN_SIGNATURE_BYTES,\n holds: (tx) => oneSignature(tx) && (tx.signatures[0] as number) < MIN_SIGNATURE_BYTES,\n result: rejected('malformed signature'),\n },\n {\n // `Wallet.broadcastTransaction`: no contract at all (TransferActuator's use of the same\n // text needs a missing parameter, which a parsed transaction never has).\n code: 'CONTRACT_VALIDATE_ERROR',\n text: /^Contract validate error : No contract!$/,\n holds: (tx) => tx.contracts === 0,\n result: rejected('no contract'),\n },\n {\n code: 'CONTRACT_VALIDATE_ERROR',\n text: /^Contract validate error : Cannot transfer TRX to yourself\\.$/,\n holds: (tx) => tx.transfer !== undefined && tx.transfer.owner === tx.transfer.to,\n result: rejected('transfer to self'),\n },\n {\n code: 'CONTRACT_VALIDATE_ERROR',\n text: /^Contract validate error : Amount must be greater than 0\\.$/,\n holds: (tx) => tx.transfer !== undefined && tx.transfer.amount <= 0n,\n result: rejected('non-positive amount'),\n },\n {\n // `Manager.validateCommon`, applied in blocks too: the whole transaction.\n code: 'TOO_BIG_TRANSACTION_ERROR',\n text: /^Too big transaction, TxId [0-9a-f]{64}, the size is (0|[1-9]\\d{0,18}) bytes, maxTxSize 512000$/,\n shows: (size) => size > MAX_TX_BYTES,\n holds: oversize,\n result: rejected('transaction too large'),\n },\n {\n // The size without results + 128 bytes; in blocks only under\n // `allowConsensusLogicOptimization`, so only a size the plain check also refuses.\n code: 'TOO_BIG_TRANSACTION_ERROR',\n text: /^Too big transaction with result, TxId [0-9a-f]{64}, the size is (0|[1-9]\\d{0,18}) bytes, maxTxSize 512000$/,\n shows: (size) => size - RESULT_BYTES > MAX_TX_BYTES,\n holds: oversize,\n result: rejected('transaction too large'),\n },\n];\n\n/** Refinements of `CONTRACT_VALIDATE_ERROR`: all state-dependent, so all `refused`. */\nconst CONTRACT_REFUSALS: readonly (readonly [RegExp, BroadcastResult])[] = [\n // `BandwidthProcessor.consume` refuses a missing owner before any contract check.\n [\n /^Contract validate error : account \\[T[1-9A-HJ-NP-Za-km-z]{33}\\] does not exist$/,\n refused('INSUFFICIENT_FUNDS', 'sender account not activated'),\n ],\n // TransferActuator's own wording, which `consume` pre-empts in v4.8.2.2.\n [\n /^Contract validate error : Validate TransferContract error, no OwnerAccount\\.$/,\n refused('INSUFFICIENT_FUNDS', 'sender account not activated'),\n ],\n // TransferActuator (the amount) and `MUtil.transfer` (a call value).\n [\n /^Contract validate error : Validate (?:TransferContract|InternalTransfer) error, balance is not sufficient\\.$/,\n refused('INSUFFICIENT_FUNDS', 'insufficient balance'),\n ],\n];\n\n/** The refusals java-tron answers before it pools the transaction, by code. */\nconst REFUSED: ReadonlyMap<string, BroadcastResult> = new Map([\n ['SIGERROR', refused('TX_REFUSED', 'signature not accepted for this account')],\n ['CONTRACT_VALIDATE_ERROR', refused('TX_REFUSED', 'contract validation failed')],\n ['CONTRACT_EXE_ERROR', refused('TX_REFUSED', 'contract execution failed')],\n [\n 'BANDWITH_ERROR',\n refused('INSUFFICIENT_FUNDS', 'insufficient bandwidth or balance for fees'),\n ],\n ['TAPOS_ERROR', refused('TX_REFUSED', 'reference block not on the canonical chain')],\n ['TOO_BIG_TRANSACTION_ERROR', refused('TX_REFUSED', 'transaction refused')],\n ['TRANSACTION_EXPIRATION_ERROR', refused('TX_EXPIRED', 'transaction expired')],\n]);\n\nconst NODE_LOCAL: ReadonlySet<string> = new Set([\n 'SERVER_BUSY',\n 'NO_CONNECTION',\n 'NOT_ENOUGH_EFFECTIVE_CONNECTION',\n 'BLOCK_UNSOLIDIFIED',\n]);\n\nfunction permanent(code: string, message: string): Permanent | undefined {\n for (const rule of PERMANENT) {\n if (rule.code !== code) continue;\n const match = rule.text.exec(message);\n if (match === null) continue;\n if (rule.shows && !rule.shows(Number(match[1]))) return undefined;\n return rule;\n }\n return undefined;\n}\n\n/** The node's answer at its word, with the rule when it claims a definitive rejection. */\nfunction classified(answer: BroadcastAnswer): {\n readonly result: BroadcastResult;\n readonly rule?: Permanent;\n} {\n if (answer.accepted) return { result: ACCEPTED };\n const { code = '', message = '' } = answer;\n if (code === 'DUP_TRANSACTION_ERROR') return { result: ALREADY_KNOWN };\n const refusal = REFUSED.get(code);\n if (refusal === undefined) {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n NODE_LOCAL.has(code)\n ? // \"P2P broadcast failed.\" comes after java-tron pooled the transaction.\n 'the node could not relay the transaction; it may have been sent'\n : 'the node answered the broadcast without a known refusal; it may have been sent',\n { ambiguous: true },\n );\n }\n const rule = permanent(code, message);\n if (rule) return { result: rule.result, rule };\n if (code === 'CONTRACT_VALIDATE_ERROR') {\n for (const [text, result] of CONTRACT_REFUSALS) {\n if (text.test(message)) return { result };\n }\n }\n return { result: refusal };\n}\n\n/** The node's answer at its word (see `classifyOwnBroadcast` for our own broadcasts). */\nexport function classifyBroadcast(answer: BroadcastAnswer): BroadcastResult {\n return classified(answer).result;\n}\n\n/** A rejection this driver cannot confirm for the bytes it sent: observed, never terminal. */\nconst UNCONFIRMED: BroadcastResult = refused(\n 'TX_REFUSED',\n 'the node claimed the transaction is invalid',\n);\n\n/**\n * The node's answer to bytes this driver sent, `sent` being those bytes read by\n * `txBytesOf` (`undefined` when they do not read). A `rejected` stands only when its claimed\n * reason holds for `sent`; otherwise the answer is `refused`. Every other answer is the\n * node's, as `classifyBroadcast` reads it: acceptance, duplicates, state-dependent refusals\n * (balance, a missing account, bandwidth, TaPoS, expiry, the fee limit) and possibly sent.\n */\nexport function classifyOwnBroadcast(\n answer: BroadcastAnswer,\n sent: TronTxBytes | undefined,\n): BroadcastResult {\n const { result, rule } = classified(answer);\n if (rule === undefined) return result;\n return sent !== undefined && rule.holds(sent) ? result : UNCONFIRMED;\n}\n\n/** Bytes are read up to twice java-tron's transaction limit, and no further. */\nconst MAX_READ_BYTES = 2 * MAX_TX_BYTES;\nconst INT64_MAX = (1n << 63n) - 1n;\nconst INT64_SPAN = 1n << 64n;\nconst TRANSFER_URL = 'type.googleapis.com/protocol.TransferContract';\n/** `ContractType.TransferContract`. */\nconst TRANSFER_TYPE = 1n;\n\n/** A field's bytes, or none: absent fields read as empty, as java-tron reads them. */\nconst bytesField = (value: WireValue | undefined): Uint8Array =>\n bytesOf(value) ?? new Uint8Array();\n\n/**\n * The bytes a broadcast sent, as the rejection checks read them, SDK-free: `Transaction`\n * (`raw_data` once, signatures, `ret` entries left out of the size), the contracts in\n * `raw_data`, and a single TransferContract's fields. `undefined` for hex that does not read\n * strictly, or is longer than `MAX_READ_BYTES`; no claim holds for it.\n */\nexport function txBytesOf(hex: string): TronTxBytes | undefined {\n if (typeof hex !== 'string' || hex.length > 2 * MAX_READ_BYTES) return undefined;\n let bytes: Uint8Array;\n try {\n bytes = fromHex(hex);\n } catch {\n return undefined;\n }\n const outer = wireFields(bytes, 'refuse');\n if (!outer) return undefined;\n let raw: Uint8Array | undefined;\n let size = 0;\n const signatures: number[] = [];\n for (const { field, value, length } of outer) {\n if (!(value instanceof Uint8Array)) return undefined;\n if (field === 1 && raw === undefined) raw = value;\n else if (field === 2) signatures.push(value.length);\n else if (field !== 5) return undefined;\n // `ret` (field 5): java-tron clears it before it measures the transaction.\n if (field !== 5) size += length;\n }\n const fields = raw ? wireFields(raw, 'refuse') : null;\n if (!fields) return undefined;\n const contracts = fields.filter((f) => f.field === 11);\n const read = { size, signatures, contracts: contracts.length };\n const only = contracts.length === 1 ? contracts[0]?.value : undefined;\n if (only === undefined) return read;\n if (!(only instanceof Uint8Array)) return undefined;\n const contract = singular(only, {\n 1: 'varint',\n 2: 'bytes',\n 3: 'bytes',\n 4: 'bytes',\n 5: 'varint',\n });\n if (!contract) return undefined;\n if (contract.get(1) !== TRANSFER_TYPE) return read;\n const any = singular(bytesField(contract.get(2)), { 1: 'bytes', 2: 'bytes' });\n if (!any) return undefined;\n // java-tron unpacks the parameter as the named type; any other type fails otherwise.\n if (toHex(bytesField(any.get(1))) !== toHex(utf8ToBytes(TRANSFER_URL))) return read;\n const transfer = singular(bytesField(any.get(2)), {\n 1: 'bytes',\n 2: 'bytes',\n 3: 'varint',\n });\n if (!transfer) return undefined;\n const amount = (transfer.get(3) as bigint | undefined) ?? 0n;\n return {\n ...read,\n transfer: {\n owner: toHex(bytesField(transfer.get(1))),\n to: toHex(bytesField(transfer.get(2))),\n amount: amount > INT64_MAX ? amount - INT64_SPAN : amount,\n },\n };\n}\n"]}
@@ -0,0 +1,49 @@
1
+ import { type FeeEstimateDraft, type FeeOverride, type FeeSpeed } from '../../core/model/fee';
2
+ import { type ChainParameters } from './http';
3
+ import type { TronFeeOverride, TronResources } from './types';
4
+ export interface TronFeeInput {
5
+ readonly fee: FeeSpeed | FeeOverride;
6
+ readonly params: ChainParameters;
7
+ /** The sender's resources now. */
8
+ readonly resources: TronResources;
9
+ /** Bytes of bandwidth: an upper bound of the signed size, plus 64. */
10
+ readonly bandwidth: bigint;
11
+ /** A TRX transfer to an account that does not exist yet. */
12
+ readonly activation: boolean;
13
+ readonly memo: boolean;
14
+ /** TRC-20 transfers: the simulated energy (`energy_used`, penalty included). */
15
+ readonly energy?: bigint;
16
+ /**
17
+ * Percent added to the simulated energy (dynamic energy can rise before inclusion): the
18
+ * network config's `energyMarginPercent`, an integer from 0 to 1,000.
19
+ */
20
+ readonly marginPercent: number;
21
+ /**
22
+ * The handle's fee-limit bound in sun (`TronNetworkConfig.maxFeeLimit`): from 1 to
23
+ * 2^53 − 1, the largest `fee_limit` the codec writes exactly.
24
+ */
25
+ readonly maxFeeLimit: bigint;
26
+ }
27
+ /** The fee-limit ceiling, and which bound sets it. */
28
+ export interface FeeLimitCeiling {
29
+ readonly value: bigint;
30
+ /** `network`: `getMaxFeeLimit`, which no option can lift; `option`: the handle's bound. */
31
+ readonly bound: 'network' | 'option';
32
+ }
33
+ /**
34
+ * The largest fee limit a TRC-20 transfer may carry (one function for the estimate and
35
+ * its size bound): the network's `getMaxFeeLimit` (VMActuator refuses more) and the
36
+ * handle's `maxFeeLimit`. The node reports its maximum, as it reports the energy price and the
37
+ * simulated energy, so only the handle's bound is the operator's own. That bound is at most
38
+ * 2^53 − 1, so the ceiling is always encodable; on a tie the network is named, since raising
39
+ * the option would not help.
40
+ */
41
+ export declare function feeLimitCeiling(params: Pick<ChainParameters, 'maxFeeLimit'>, maxFeeLimit: bigint): FeeLimitCeiling;
42
+ /**
43
+ * A validated `{ feeLimit }` override, or `undefined` for a speed. Anything else, including
44
+ * a string that is not a speed or an override with another key, is `INVALID_INTENT`.
45
+ */
46
+ export declare function feeOverrideOf(fee: FeeSpeed | FeeOverride): TronFeeOverride | undefined;
47
+ export declare function tronFee(input: TronFeeInput): FeeEstimateDraft;
48
+ /** Sum of every charge (all in TRX). */
49
+ export declare const feeSun: (fee: FeeEstimateDraft) => bigint;
@@ -0,0 +1,166 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.feeSun = void 0;
4
+ exports.feeLimitCeiling = feeLimitCeiling;
5
+ exports.feeOverrideOf = feeOverrideOf;
6
+ exports.tronFee = tronFee;
7
+ /**
8
+ * The `tron` fee kind, pure: bandwidth, energy, account creation and the memo
9
+ * fee, from the chain's own parameters and the sender's resources. Every charge is in TRX
10
+ * (bigint sun, never a `Number`) and may be 0 (staked or free resources). The rules are
11
+ * java-tron's (checked against GreatVoyage-v4.8.2.2, `d5c3d1d1`):
12
+ * - bandwidth (`BandwidthProcessor.consume`): the signed size + 64 bytes, from staked
13
+ * bandwidth, else free bandwidth, else burned at `getTransactionFee` per byte; a transfer
14
+ * that creates the recipient's account uses staked bandwidth ×
15
+ * `getCreateNewAccountBandwidthRate`, else burns `getCreateAccountFee`, and pays
16
+ * `getCreateNewAccountFeeInSystemContract` on top (`TransferActuator`); it never uses
17
+ * free bandwidth;
18
+ * - energy (`VMActuator.getAccountEnergyLimitWithFixRatio`): `fee_limit / getEnergyFee`
19
+ * caps the call's energy, staked energy included, so the fee limit covers the whole
20
+ * simulated energy plus a margin; only the part staked energy does not cover is burned;
21
+ * - a memo pays `getMemoFee` (`Manager.consumeMemoFee`).
22
+ */
23
+ const error_1 = require("../../core/errors/error");
24
+ const fee_1 = require("../../core/model/fee");
25
+ const http_1 = require("./http");
26
+ const network_1 = require("./network");
27
+ function invalid(message) {
28
+ return new error_1.ValidationError('INVALID_INTENT', message);
29
+ }
30
+ /**
31
+ * The largest fee limit a TRC-20 transfer may carry (one function for the estimate and
32
+ * its size bound): the network's `getMaxFeeLimit` (VMActuator refuses more) and the
33
+ * handle's `maxFeeLimit`. The node reports its maximum, as it reports the energy price and the
34
+ * simulated energy, so only the handle's bound is the operator's own. That bound is at most
35
+ * 2^53 − 1, so the ceiling is always encodable; on a tie the network is named, since raising
36
+ * the option would not help.
37
+ */
38
+ function feeLimitCeiling(params, maxFeeLimit) {
39
+ if (typeof maxFeeLimit !== 'bigint' ||
40
+ maxFeeLimit < 1n ||
41
+ maxFeeLimit > network_1.MAX_ENCODABLE_FEE_LIMIT) {
42
+ // The network config bounds it; anything else is a driver bug, never the caller's intent.
43
+ throw new error_1.ConfigError('CONFIG_INVALID', 'maxFeeLimit must be a bigint of sun from 1 to 2^53 − 1');
44
+ }
45
+ return params.maxFeeLimit <= maxFeeLimit
46
+ ? { value: params.maxFeeLimit, bound: 'network' }
47
+ : { value: maxFeeLimit, bound: 'option' };
48
+ }
49
+ /**
50
+ * What exceeds the ceiling, named after the bound that sets it. A need above the handle's
51
+ * bound carries it and the need (decimal strings), so the caller sees what to allow.
52
+ */
53
+ function aboveCeiling(ceiling, need) {
54
+ if (ceiling.bound === 'network') {
55
+ return invalid(need !== undefined
56
+ ? "the transfer needs more energy than the network's maximum fee limit"
57
+ : "feeLimit is above the network's maximum fee limit");
58
+ }
59
+ if (need === undefined) {
60
+ return invalid('feeLimit is above maxFeeLimit, the Tron handle option that bounds it (in sun)');
61
+ }
62
+ return new error_1.ValidationError('INVALID_INTENT', 'the transfer needs more energy than maxFeeLimit allows (a Tron handle option, in sun)', { details: { required: need.toString(), maxFeeLimit: ceiling.value.toString() } });
63
+ }
64
+ /**
65
+ * A validated `{ feeLimit }` override, or `undefined` for a speed. Anything else, including
66
+ * a string that is not a speed or an override with another key, is `INVALID_INTENT`.
67
+ */
68
+ function feeOverrideOf(fee) {
69
+ if ((0, fee_1.isFeeSpeed)(fee))
70
+ return undefined;
71
+ const shape = () => invalid('a Tron fee is a speed or { feeLimit: bigint } (sun, positive)');
72
+ if (fee === null || typeof fee !== 'object' || Array.isArray(fee))
73
+ throw shape();
74
+ const keys = Object.keys(fee);
75
+ const { feeLimit } = fee;
76
+ if (keys.length !== 1 || typeof feeLimit !== 'bigint' || feeLimit <= 0n) {
77
+ throw shape();
78
+ }
79
+ return { feeLimit };
80
+ }
81
+ const ceilDiv = (a, b) => (a + b - 1n) / b;
82
+ const min = (a, b) => (a < b ? a : b);
83
+ function tronFee(input) {
84
+ const { params, resources, bandwidth, marginPercent } = input;
85
+ if (!Number.isSafeInteger(marginPercent) || marginPercent < 0) {
86
+ // The network config bounds it (0–1,000); a fraction would throw a RangeError below.
87
+ throw new error_1.ConfigError('CONFIG_INVALID', 'energyMarginPercent must be a non-negative integer');
88
+ }
89
+ // Every transaction consumes bandwidth, and a TRC-20 call energy; a zero or negative
90
+ // one would give a fee limit of 0, which fails on chain (out of energy) and still pays.
91
+ // The bandwidth is the driver's own measure of the bytes it built (at least 133
92
+ // bytes, `bandwidthOf`), so a non-positive one is a driver bug: an internal, non-retryable
93
+ // CryptoAioError that fails the transfer before signing, never a foreign error.
94
+ // The energy is the node's simulation, so a non-positive one is a malformed answer
95
+ // (retryable).
96
+ if (bandwidth <= 0n) {
97
+ throw invalid('cannot estimate a Tron fee: the measured bandwidth is not positive');
98
+ }
99
+ if (input.energy !== undefined && input.energy <= 0n)
100
+ throw (0, http_1.malformed)('energy used');
101
+ const override = feeOverrideOf(input.fee);
102
+ const charges = [];
103
+ const charge = (label, amount) => charges.push({ asset: 'native', amount, label });
104
+ let bandwidthFee;
105
+ if (input.activation) {
106
+ const cost = bandwidth * params.createNewAccountBandwidthRate;
107
+ bandwidthFee = resources.stakedBandwidth >= cost ? 0n : params.createAccountFee;
108
+ }
109
+ else if (resources.stakedBandwidth >= bandwidth ||
110
+ resources.freeBandwidth >= bandwidth) {
111
+ bandwidthFee = 0n;
112
+ }
113
+ else {
114
+ bandwidthFee = bandwidth * params.transactionFee;
115
+ }
116
+ charge('bandwidth', bandwidthFee);
117
+ let energyDetails = {};
118
+ if (input.energy !== undefined) {
119
+ const need = ceilDiv(input.energy * BigInt(100 + marginPercent), 100n);
120
+ // Fee limit = min(estimate × margin, network maximum, maxFeeLimit). The ceiling
121
+ // caps the margin, never the simulated energy itself: a fee limit below that fails on
122
+ // chain (out of energy) and still pays, so a need above the ceiling is refused before
123
+ // anything is signed.
124
+ const ceiling = feeLimitCeiling(params, input.maxFeeLimit);
125
+ const cost = input.energy * params.energyFee;
126
+ if (cost > ceiling.value)
127
+ throw aboveCeiling(ceiling, cost);
128
+ const estimate = min(need * params.energyFee, ceiling.value);
129
+ let feeLimit = estimate;
130
+ if (override) {
131
+ if (override.feeLimit < estimate) {
132
+ throw invalid('feeLimit is below the estimated energy cost; the transaction would fail on chain and still pay');
133
+ }
134
+ if (override.feeLimit > ceiling.value)
135
+ throw aboveCeiling(ceiling);
136
+ feeLimit = override.feeLimit;
137
+ }
138
+ const covered = resources.energy * params.energyFee;
139
+ charge('energy', feeLimit > covered ? feeLimit - covered : 0n);
140
+ energyDetails = { energy: need, energyPrice: params.energyFee, feeLimit };
141
+ }
142
+ else if (override) {
143
+ throw invalid('a Tron fee override applies to TRC-20 transfers only');
144
+ }
145
+ if (input.activation)
146
+ charge('activation', params.createNewAccountFeeInSystemContract);
147
+ if (input.memo)
148
+ charge('memo', params.memoFee);
149
+ const details = {
150
+ bandwidth,
151
+ bandwidthPrice: params.transactionFee,
152
+ ...energyDetails,
153
+ activation: input.activation,
154
+ };
155
+ return {
156
+ kind: 'tron',
157
+ speed: override ? 'custom' : input.fee,
158
+ charges,
159
+ bound: 'upper',
160
+ details: { ...details },
161
+ };
162
+ }
163
+ /** Sum of every charge (all in TRX). */
164
+ const feeSun = (fee) => fee.charges.reduce((sum, c) => sum + c.amount, 0n);
165
+ exports.feeSun = feeSun;
166
+ //# sourceMappingURL=fees.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fees.js","sourceRoot":"","sources":["../../../src/adapters/tron/fees.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The `tron` fee kind, pure: bandwidth, energy, account creation and the memo\n * fee, from the chain's own parameters and the sender's resources. Every charge is in TRX\n * (bigint sun, never a `Number`) and may be 0 (staked or free resources). The rules are\n * java-tron's (checked against GreatVoyage-v4.8.2.2, `d5c3d1d1`):\n * - bandwidth (`BandwidthProcessor.consume`): the signed size + 64 bytes, from staked\n * bandwidth, else free bandwidth, else burned at `getTransactionFee` per byte; a transfer\n * that creates the recipient's account uses staked bandwidth ×\n * `getCreateNewAccountBandwidthRate`, else burns `getCreateAccountFee`, and pays\n * `getCreateNewAccountFeeInSystemContract` on top (`TransferActuator`); it never uses\n * free bandwidth;\n * - energy (`VMActuator.getAccountEnergyLimitWithFixRatio`): `fee_limit / getEnergyFee`\n * caps the call's energy, staked energy included, so the fee limit covers the whole\n * simulated energy plus a margin; only the part staked energy does not cover is burned;\n * - a memo pays `getMemoFee` (`Manager.consumeMemoFee`).\n */\nimport { ConfigError, ValidationError } from '../../core/errors/error';\nimport {\n isFeeSpeed,\n type FeeChargeDraft,\n type FeeEstimateDraft,\n type FeeOverride,\n type FeeSpeed,\n} from '../../core/model/fee';\nimport { malformed, type ChainParameters } from './http';\nimport { MAX_ENCODABLE_FEE_LIMIT } from './network';\nimport type { TronFeeDetails, TronFeeOverride, TronResources } from './types';\n\nexport interface TronFeeInput {\n readonly fee: FeeSpeed | FeeOverride;\n readonly params: ChainParameters;\n /** The sender's resources now. */\n readonly resources: TronResources;\n /** Bytes of bandwidth: an upper bound of the signed size, plus 64. */\n readonly bandwidth: bigint;\n /** A TRX transfer to an account that does not exist yet. */\n readonly activation: boolean;\n readonly memo: boolean;\n /** TRC-20 transfers: the simulated energy (`energy_used`, penalty included). */\n readonly energy?: bigint;\n /**\n * Percent added to the simulated energy (dynamic energy can rise before inclusion): the\n * network config's `energyMarginPercent`, an integer from 0 to 1,000.\n */\n readonly marginPercent: number;\n /**\n * The handle's fee-limit bound in sun (`TronNetworkConfig.maxFeeLimit`): from 1 to\n * 2^53 − 1, the largest `fee_limit` the codec writes exactly.\n */\n readonly maxFeeLimit: bigint;\n}\n\n/** The fee-limit ceiling, and which bound sets it. */\nexport interface FeeLimitCeiling {\n readonly value: bigint;\n /** `network`: `getMaxFeeLimit`, which no option can lift; `option`: the handle's bound. */\n readonly bound: 'network' | 'option';\n}\n\nfunction invalid(message: string): ValidationError {\n return new ValidationError('INVALID_INTENT', message);\n}\n\n/**\n * The largest fee limit a TRC-20 transfer may carry (one function for the estimate and\n * its size bound): the network's `getMaxFeeLimit` (VMActuator refuses more) and the\n * handle's `maxFeeLimit`. The node reports its maximum, as it reports the energy price and the\n * simulated energy, so only the handle's bound is the operator's own. That bound is at most\n * 2^53 − 1, so the ceiling is always encodable; on a tie the network is named, since raising\n * the option would not help.\n */\nexport function feeLimitCeiling(\n params: Pick<ChainParameters, 'maxFeeLimit'>,\n maxFeeLimit: bigint,\n): FeeLimitCeiling {\n if (\n typeof maxFeeLimit !== 'bigint' ||\n maxFeeLimit < 1n ||\n maxFeeLimit > MAX_ENCODABLE_FEE_LIMIT\n ) {\n // The network config bounds it; anything else is a driver bug, never the caller's intent.\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'maxFeeLimit must be a bigint of sun from 1 to 2^53 − 1',\n );\n }\n return params.maxFeeLimit <= maxFeeLimit\n ? { value: params.maxFeeLimit, bound: 'network' }\n : { value: maxFeeLimit, bound: 'option' };\n}\n\n/**\n * What exceeds the ceiling, named after the bound that sets it. A need above the handle's\n * bound carries it and the need (decimal strings), so the caller sees what to allow.\n */\nfunction aboveCeiling(ceiling: FeeLimitCeiling, need?: bigint): ValidationError {\n if (ceiling.bound === 'network') {\n return invalid(\n need !== undefined\n ? \"the transfer needs more energy than the network's maximum fee limit\"\n : \"feeLimit is above the network's maximum fee limit\",\n );\n }\n if (need === undefined) {\n return invalid(\n 'feeLimit is above maxFeeLimit, the Tron handle option that bounds it (in sun)',\n );\n }\n return new ValidationError(\n 'INVALID_INTENT',\n 'the transfer needs more energy than maxFeeLimit allows (a Tron handle option, in sun)',\n { details: { required: need.toString(), maxFeeLimit: ceiling.value.toString() } },\n );\n}\n\n/**\n * A validated `{ feeLimit }` override, or `undefined` for a speed. Anything else, including\n * a string that is not a speed or an override with another key, is `INVALID_INTENT`.\n */\nexport function feeOverrideOf(fee: FeeSpeed | FeeOverride): TronFeeOverride | undefined {\n if (isFeeSpeed(fee)) return undefined;\n const shape = (): ValidationError =>\n invalid('a Tron fee is a speed or { feeLimit: bigint } (sun, positive)');\n if (fee === null || typeof fee !== 'object' || Array.isArray(fee)) throw shape();\n const keys = Object.keys(fee);\n const { feeLimit } = fee as { feeLimit?: unknown };\n if (keys.length !== 1 || typeof feeLimit !== 'bigint' || feeLimit <= 0n) {\n throw shape();\n }\n return { feeLimit };\n}\n\nconst ceilDiv = (a: bigint, b: bigint): bigint => (a + b - 1n) / b;\nconst min = (a: bigint, b: bigint): bigint => (a < b ? a : b);\n\nexport function tronFee(input: TronFeeInput): FeeEstimateDraft {\n const { params, resources, bandwidth, marginPercent } = input;\n if (!Number.isSafeInteger(marginPercent) || marginPercent < 0) {\n // The network config bounds it (0–1,000); a fraction would throw a RangeError below.\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'energyMarginPercent must be a non-negative integer',\n );\n }\n // Every transaction consumes bandwidth, and a TRC-20 call energy; a zero or negative\n // one would give a fee limit of 0, which fails on chain (out of energy) and still pays.\n // The bandwidth is the driver's own measure of the bytes it built (at least 133\n // bytes, `bandwidthOf`), so a non-positive one is a driver bug: an internal, non-retryable\n // CryptoAioError that fails the transfer before signing, never a foreign error.\n // The energy is the node's simulation, so a non-positive one is a malformed answer\n // (retryable).\n if (bandwidth <= 0n) {\n throw invalid('cannot estimate a Tron fee: the measured bandwidth is not positive');\n }\n if (input.energy !== undefined && input.energy <= 0n) throw malformed('energy used');\n const override = feeOverrideOf(input.fee);\n const charges: FeeChargeDraft[] = [];\n const charge = (label: string, amount: bigint) =>\n charges.push({ asset: 'native', amount, label });\n\n let bandwidthFee: bigint;\n if (input.activation) {\n const cost = bandwidth * params.createNewAccountBandwidthRate;\n bandwidthFee = resources.stakedBandwidth >= cost ? 0n : params.createAccountFee;\n } else if (\n resources.stakedBandwidth >= bandwidth ||\n resources.freeBandwidth >= bandwidth\n ) {\n bandwidthFee = 0n;\n } else {\n bandwidthFee = bandwidth * params.transactionFee;\n }\n charge('bandwidth', bandwidthFee);\n\n let energyDetails: Pick<TronFeeDetails, 'energy' | 'energyPrice' | 'feeLimit'> = {};\n if (input.energy !== undefined) {\n const need = ceilDiv(input.energy * BigInt(100 + marginPercent), 100n);\n // Fee limit = min(estimate × margin, network maximum, maxFeeLimit). The ceiling\n // caps the margin, never the simulated energy itself: a fee limit below that fails on\n // chain (out of energy) and still pays, so a need above the ceiling is refused before\n // anything is signed.\n const ceiling = feeLimitCeiling(params, input.maxFeeLimit);\n const cost = input.energy * params.energyFee;\n if (cost > ceiling.value) throw aboveCeiling(ceiling, cost);\n const estimate = min(need * params.energyFee, ceiling.value);\n let feeLimit = estimate;\n if (override) {\n if (override.feeLimit < estimate) {\n throw invalid(\n 'feeLimit is below the estimated energy cost; the transaction would fail on chain and still pay',\n );\n }\n if (override.feeLimit > ceiling.value) throw aboveCeiling(ceiling);\n feeLimit = override.feeLimit;\n }\n const covered = resources.energy * params.energyFee;\n charge('energy', feeLimit > covered ? feeLimit - covered : 0n);\n energyDetails = { energy: need, energyPrice: params.energyFee, feeLimit };\n } else if (override) {\n throw invalid('a Tron fee override applies to TRC-20 transfers only');\n }\n if (input.activation) charge('activation', params.createNewAccountFeeInSystemContract);\n if (input.memo) charge('memo', params.memoFee);\n\n const details: TronFeeDetails = {\n bandwidth,\n bandwidthPrice: params.transactionFee,\n ...energyDetails,\n activation: input.activation,\n };\n return {\n kind: 'tron',\n speed: override ? 'custom' : (input.fee as FeeSpeed),\n charges,\n bound: 'upper',\n details: { ...details },\n };\n}\n\n/** Sum of every charge (all in TRX). */\nexport const feeSun = (fee: FeeEstimateDraft): bigint =>\n fee.charges.reduce((sum, c) => sum + c.amount, 0n);\n"]}