crypto-aio 0.0.2 → 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 (672) 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/lib-types.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/adapters/ton/types.js +3 -0
  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/core/model/transaction.js +3 -0
  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 -44
  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 -2
  638. package/dist/libs/eth/contract.js +0 -7
  639. package/dist/libs/eth/contract.js.map +0 -1
  640. package/dist/libs/eth/index.d.ts +0 -20
  641. package/dist/libs/eth/index.js +0 -62
  642. package/dist/libs/eth/index.js.map +0 -1
  643. package/dist/libs/eth/transact.d.ts +0 -2
  644. package/dist/libs/eth/transact.js +0 -7
  645. package/dist/libs/eth/transact.js.map +0 -1
  646. package/dist/libs/index.d.ts +0 -1
  647. package/dist/libs/index.js +0 -18
  648. package/dist/libs/index.js.map +0 -1
  649. package/dist/tool/common.d.ts +0 -28
  650. package/dist/tool/common.js +0 -33
  651. package/dist/tool/common.js.map +0 -1
  652. package/dist/tool/eth-tools.d.ts +0 -3
  653. package/dist/tool/eth-tools.js +0 -33
  654. package/dist/tool/eth-tools.js.map +0 -1
  655. package/dist/tool/index.d.ts +0 -4
  656. package/dist/tool/index.js +0 -21
  657. package/dist/tool/index.js.map +0 -1
  658. package/dist/tool/logging.d.ts +0 -3
  659. package/dist/tool/logging.js +0 -11
  660. package/dist/tool/logging.js.map +0 -1
  661. package/dist/tool/options.d.ts +0 -4
  662. package/dist/tool/options.js +0 -28
  663. package/dist/tool/options.js.map +0 -1
  664. package/dist/type/account.d.ts +0 -9
  665. package/dist/type/account.js.map +0 -1
  666. package/dist/type/common.d.ts +0 -18
  667. package/dist/type/common.js.map +0 -1
  668. package/dist/type/index.d.ts +0 -3
  669. package/dist/type/index.js +0 -20
  670. package/dist/type/index.js.map +0 -1
  671. package/dist/type/lib-types.d.ts +0 -7
  672. package/dist/type/lib-types.js.map +0 -1
@@ -0,0 +1,781 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.pageMemo = exports.NO_STATE_EXIT = exports.ASSEMBLED_MEMO = exports.MEMO_TX_LENGTH = exports.CHAIN_MEMO = void 0;
4
+ exports.keep = keep;
5
+ exports.createTonContext = createTonContext;
6
+ exports.jettonWalletAddress = jettonWalletAddress;
7
+ exports.jettonBalance = jettonBalance;
8
+ exports.jettonWalletFacts = jettonWalletFacts;
9
+ exports.verifyJettonWallet = verifyJettonWallet;
10
+ exports.jettonMaster = jettonMaster;
11
+ exports.toDriverBlock = toDriverBlock;
12
+ exports.findOwnAttempt = findOwnAttempt;
13
+ exports.confirmLegs = confirmLegs;
14
+ exports.traceBlock = traceBlock;
15
+ exports.decodeWithJettons = decodeWithJettons;
16
+ exports.createTonReader = createTonReader;
17
+ exports.walletSeqno = walletSeqno;
18
+ exports.publicKeyAt = publicKeyAt;
19
+ exports.provenRequest = provenRequest;
20
+ exports.createTonSequence = createTonSequence;
21
+ exports.createTonExt = createTonExt;
22
+ /**
23
+ * TON addresses, reads, seqnos, jetton lookups and the `ext.ton` API. Every call carries the
24
+ * tags of the `ChainDriver` contract table (`src/core/driver/types.ts`): `read` for point
25
+ * queries, `monitor` for heights, observations and seqnos. Jetton metadata, which the
26
+ * core caches for the container's life, is a `read` under the proof quorum.
27
+ */
28
+ const core_1 = require("@ton/core");
29
+ const node_crypto_1 = require("node:crypto");
30
+ const error_1 = require("../../core/errors/error");
31
+ const address_1 = require("./address");
32
+ const api_1 = require("./api");
33
+ const decode_1 = require("./decode");
34
+ const messages_1 = require("./messages");
35
+ const trace_1 = require("./trace");
36
+ const wallets_1 = require("./wallets");
37
+ /** The most authenticated transactions a driver keeps (each at most `MEMO_TX_LENGTH`). */
38
+ exports.CHAIN_MEMO = 4_096;
39
+ /** The longest transaction BOC text kept: a wallet transaction takes about 1-2 KB. */
40
+ exports.MEMO_TX_LENGTH = 16_384;
41
+ /** The most assembled messages a driver remembers; an evicted one is guarded as foreign. */
42
+ exports.ASSEMBLED_MEMO = 4_096;
43
+ /** Keeps `value` in a bounded memo, dropping the oldest entry beyond `size`. */
44
+ function keep(memo, key, value, size) {
45
+ memo.set(key, value);
46
+ if (memo.size > size)
47
+ memo.delete(memo.keys().next().value);
48
+ }
49
+ function createTonContext(args) {
50
+ const codec = (0, address_1.createTonAddressCodec)({
51
+ testnet: args.config.testnet,
52
+ fromPublicKey: (publicKey, wallet) => (0, wallets_1.walletAddress)((0, wallets_1.resolveIdentity)(wallet, args.config.globalId), publicKey),
53
+ });
54
+ return {
55
+ ...args,
56
+ codec,
57
+ jettonWallets: new Map(),
58
+ verified: new Map(),
59
+ chainTxs: new Map(),
60
+ assembled: new Map(),
61
+ };
62
+ }
63
+ const assetError = (reason) => new error_1.ValidationError('ASSET_RESOLUTION', reason);
64
+ const notYet = (reason) => new error_1.ProviderError('PROVIDER_UNAVAILABLE', reason, { retryable: true });
65
+ /**
66
+ * Metadata the indexer does not have, for a token read anywhere (`jettonMetadata`):
67
+ * non-retryable, so the core reports a transfer of it unresolved instead of failing the
68
+ * read, and not `ASSET_RESOLUTION`, so the core never caches it.
69
+ */
70
+ const unresolvable = (reason) => new error_1.ProviderError('PROVIDER_UNAVAILABLE', reason, { retryable: false });
71
+ /**
72
+ * The core caches a token's metadata,
73
+ * and its "no such token", for the container's life, so one lagging or buggy endpoint must
74
+ * never decide it. Balances stay plain reads.
75
+ */
76
+ const METADATA = { ...api_1.READ, quorum: 'proof' };
77
+ /**
78
+ * A token's own failure (a missing account, a TVM exit code, content that does
79
+ * not parse) is `ASSET_RESOLUTION`; `PROVIDER_MISCONFIGURED` and already retryable errors
80
+ * propagate unchanged; any other definitive node answer is made retryable.
81
+ */
82
+ function asRetryable(error) {
83
+ if ((0, error_1.isCryptoAioError)(error) &&
84
+ error.category === 'provider' &&
85
+ !error.retryable &&
86
+ error.code !== 'PROVIDER_MISCONFIGURED') {
87
+ return (0, error_1.withContext)(error, {}, { retryable: true });
88
+ }
89
+ return error;
90
+ }
91
+ async function tokenCall(work) {
92
+ try {
93
+ return await work();
94
+ }
95
+ catch (error) {
96
+ throw asRetryable(error);
97
+ }
98
+ }
99
+ const cellStack = (entry) => entry?.type === 'cell' ? entry.boc : undefined;
100
+ /** A lookup id (a 32-byte hash in hex, either case) in lower case; undefined otherwise. */
101
+ const hashId = (id) => typeof id === 'string' && /^[0-9a-fA-F]{64}$/.test(id) ? id.toLowerCase() : undefined;
102
+ /** The wallet address a `get_wallet_address` answer names; null when it names none. */
103
+ function namedWallet(result) {
104
+ const boc = result.exitCode === 0 ? cellStack(result.stack[0]) : undefined;
105
+ return boc ? (0, messages_1.addressFromBoc)(boc) : null;
106
+ }
107
+ /**
108
+ * What endpoints must agree on for `get_wallet_address`: the exit code and the
109
+ * address it names, never the slice's serialization. It never throws: an answer that does
110
+ * not parse is itself a fact, which the parse then refuses (retryable).
111
+ */
112
+ function walletAddressKey(body) {
113
+ try {
114
+ const result = (0, api_1.runResultOf)(body);
115
+ return { exitCode: result.exitCode, wallet: namedWallet(result) };
116
+ }
117
+ catch {
118
+ return 'malformed';
119
+ }
120
+ }
121
+ /**
122
+ * The jetton wallet `master` assigns to `owner` (`get_wallet_address`), at masterchain
123
+ * block `block` when given. Cached only when the proof quorum attested it: the builder
124
+ * sends jettons to it and the verdict checks it, so one endpoint's answer must never stick.
125
+ * Under a quorum the endpoints agree on the address itself (`walletAddressKey`).
126
+ */
127
+ async function jettonWalletAddress(ctx, master, owner, tags, block) {
128
+ const key = `${master}|${owner}`;
129
+ const cached = ctx.jettonWallets.get(key);
130
+ if (cached)
131
+ return cached;
132
+ const keyed = tags.quorum !== undefined && tags.quorumKey === undefined
133
+ ? { ...tags, quorumKey: walletAddressKey }
134
+ : tags;
135
+ const result = await tokenCall(() => ctx.api.runGetMethod(master, 'get_wallet_address', [['tvm.Slice', (0, messages_1.addressArgument)(owner)]], keyed, block));
136
+ const address = namedWallet(result);
137
+ if (!address)
138
+ throw assetError('the jetton master gives no wallet address');
139
+ if (tags.quorum !== undefined)
140
+ ctx.jettonWallets.set(key, address);
141
+ return address;
142
+ }
143
+ /**
144
+ * `owner`'s jetton balance; 0 while its jetton wallet is not deployed. The state and the
145
+ * balance are read at one block, so a load-balanced endpoint never mixes two views.
146
+ */
147
+ async function jettonBalance(ctx, master, owner, tags) {
148
+ const wallet = await jettonWalletAddress(ctx, master, owner, tags);
149
+ const state = await tokenCall(() => ctx.api.account(wallet, tags));
150
+ if (state.status === 'uninitialized')
151
+ return 0n;
152
+ const data = await tokenCall(() => ctx.api.runGetMethod(wallet, 'get_wallet_data', [], tags, state.blockSeqno));
153
+ const first = data.stack[0];
154
+ if (data.exitCode === 0 && first?.type === 'num' && first.value >= 0n) {
155
+ return first.value;
156
+ }
157
+ throw assetError('the jetton wallet gives no balance');
158
+ }
159
+ /** toncenter's exit code for an account it holds no state for at the block asked. */
160
+ exports.NO_STATE_EXIT = -13;
161
+ async function jettonWalletFacts(ctx, address, tags, block) {
162
+ const known = ctx.verified.get(address);
163
+ if (known)
164
+ return { kind: 'verified', wallet: known };
165
+ const data = await tokenCall(() => ctx.api.runGetMethod(address, 'get_wallet_data', [], tags, block));
166
+ if (data.exitCode !== 0)
167
+ return { kind: 'unknown', exitCode: data.exitCode };
168
+ const ownerBoc = cellStack(data.stack[1]);
169
+ const masterBoc = cellStack(data.stack[2]);
170
+ const owner = ownerBoc ? (0, messages_1.addressFromBoc)(ownerBoc) : null;
171
+ const master = masterBoc ? (0, messages_1.addressFromBoc)(masterBoc) : null;
172
+ if (!owner || !master)
173
+ return { kind: 'unknown' };
174
+ let named;
175
+ try {
176
+ named = await jettonWalletAddress(ctx, master, owner, tags, block);
177
+ }
178
+ catch (error) {
179
+ if ((0, error_1.isCryptoAioError)(error, 'ASSET_RESOLUTION'))
180
+ return { kind: 'unknown' };
181
+ throw error;
182
+ }
183
+ if (named !== address)
184
+ return { kind: 'foreign' };
185
+ const verified = { address, owner, master };
186
+ if (tags.quorum !== undefined)
187
+ ctx.verified.set(address, verified);
188
+ return { kind: 'verified', wallet: verified };
189
+ }
190
+ /**
191
+ * The lenient reading for history: a wallet the master names, else `undefined` (any
192
+ * other contract; the transaction is then `partial`), so a fake contract never stalls a
193
+ * page. One exception: "no state at this block" (exit -13) for the jetton
194
+ * wallet whose own transaction this is (`ranHere`) contradicts the chain, which shows it
195
+ * running there, so it is unavailable data (retryable), never a silent drop of a deposit.
196
+ */
197
+ async function verifyJettonWallet(ctx, address, tags, block, ranHere = false, memo) {
198
+ const facts = await remembered(memo?.jettonWallets, address, () => jettonWalletFacts(ctx, address, tags, block));
199
+ if (facts.kind === 'verified')
200
+ return facts.wallet;
201
+ if (ranHere && facts.kind === 'unknown' && facts.exitCode === exports.NO_STATE_EXIT) {
202
+ throw notYet('the jetton wallet state is not available at its block');
203
+ }
204
+ return undefined;
205
+ }
206
+ // ---- jetton metadata (TEP-64) -------------------------------------------------------------
207
+ /**
208
+ * The most cells one on-chain content value is read to (at most 127 bytes each,
209
+ * about 8 KB), snake or chunked alike; past them it is unreadable. A symbol or name takes a
210
+ * few cells: the bound keeps an author's long texts readable while bounding the work on
211
+ * content anyone can deploy.
212
+ */
213
+ const MAX_VALUE_CELLS = 64;
214
+ /** The longest symbol and name kept: the indexer's limits (`api.ts`). */
215
+ const MAX_SYMBOL_LENGTH = 256;
216
+ const MAX_NAME_LENGTH = 256;
217
+ /**
218
+ * TEP-64 snake data, read in one pass (`@ton/core`'s `loadStringTail` recurses
219
+ * per cell and concatenates at each level, quadratic in the chain); undefined for a cell that
220
+ * is not whole bytes with at most one ref, or a chain past `MAX_VALUE_CELLS`.
221
+ */
222
+ function snakeBytes(first) {
223
+ let slice = first;
224
+ const chunks = [];
225
+ for (let cells = 1;; cells += 1) {
226
+ const bits = slice.remainingBits;
227
+ if (cells > MAX_VALUE_CELLS || bits % 8 !== 0 || slice.remainingRefs > 1) {
228
+ return undefined;
229
+ }
230
+ if (bits > 0)
231
+ chunks.push(slice.loadBuffer(bits / 8));
232
+ if (slice.remainingRefs === 0)
233
+ return Buffer.concat(chunks);
234
+ slice = slice.loadRef().beginParse();
235
+ }
236
+ }
237
+ /**
238
+ * TEP-64 chunked data (`chunks#01 data:ChunkedData`, `chunked_data#_ data:(HashmapE 32
239
+ * ^(SnakeData ~0))`): its chunks in index order, from 0 without a gap, each one cell of
240
+ * whole bytes and no refs; at most `MAX_VALUE_CELLS` of them. Undefined otherwise.
241
+ */
242
+ function chunkedBytes(slice) {
243
+ const dict = slice.loadDict(core_1.Dictionary.Keys.Uint(32), core_1.Dictionary.Values.Cell());
244
+ if (dict.size > MAX_VALUE_CELLS)
245
+ return undefined;
246
+ const chunks = [];
247
+ for (let index = 0; index < dict.size; index += 1) {
248
+ const chunk = dict.get(index)?.beginParse();
249
+ if (!chunk || chunk.remainingRefs !== 0 || chunk.remainingBits % 8 !== 0) {
250
+ return undefined;
251
+ }
252
+ chunks.push(chunk.loadBuffer(chunk.remainingBits / 8));
253
+ }
254
+ return Buffer.concat(chunks);
255
+ }
256
+ /**
257
+ * A TEP-64 `ContentData` value as text: snake data (prefix 0x00, which some masters omit) or
258
+ * chunked data (prefix 0x01), both bounded by `MAX_VALUE_CELLS`. Undefined when it does not
259
+ * read.
260
+ */
261
+ function contentText(value) {
262
+ try {
263
+ const slice = value.beginParse();
264
+ const prefix = slice.remainingBits >= 8 ? slice.preloadUint(8) : undefined;
265
+ if (prefix === 0 || prefix === 1)
266
+ slice.skip(8);
267
+ const bytes = prefix === 1 ? chunkedBytes(slice) : snakeBytes(slice);
268
+ return bytes?.toString('utf8');
269
+ }
270
+ catch {
271
+ return undefined;
272
+ }
273
+ }
274
+ const contentKey = (name) => (0, node_crypto_1.createHash)('sha256').update(name).digest();
275
+ /**
276
+ * TEP-64: a parsed content cell's layout and fields. A layout or dictionary that does not
277
+ * read is the token's own content (`ASSET_RESOLUTION`).
278
+ */
279
+ function contentOf(cell) {
280
+ try {
281
+ const slice = cell.beginParse();
282
+ const prefix = slice.loadUint(8);
283
+ if (prefix === 1)
284
+ return { fields: {}, linked: true };
285
+ if (prefix !== 0)
286
+ throw new Error('layout');
287
+ const dict = slice.loadDict(core_1.Dictionary.Keys.Buffer(32), core_1.Dictionary.Values.Cell());
288
+ const fields = {};
289
+ for (const key of ['decimals', 'symbol', 'name']) {
290
+ const value = dict.get(contentKey(key));
291
+ if (value)
292
+ fields[key] = contentText(value) ?? null;
293
+ }
294
+ return { fields, linked: dict.has(contentKey('uri')) };
295
+ }
296
+ catch {
297
+ throw assetError('the jetton content is unreadable');
298
+ }
299
+ }
300
+ /** A content BOC as a cell; undefined when it does not parse as one root. */
301
+ function contentCell(boc) {
302
+ try {
303
+ const cells = core_1.Cell.fromBoc(Buffer.from(boc, 'base64'));
304
+ return cells.length === 1 ? cells[0] : undefined;
305
+ }
306
+ catch {
307
+ return undefined;
308
+ }
309
+ }
310
+ /**
311
+ * Content cells parsed once per metadata read: a state-sized content takes about 2 s to
312
+ * decode (`MAX_STATE_BOC_LENGTH`), and the quorum's endpoints usually serve the same text.
313
+ */
314
+ function contentCells() {
315
+ const parsed = new Map();
316
+ return (boc) => {
317
+ if (!parsed.has(boc))
318
+ parsed.set(boc, contentCell(boc));
319
+ return parsed.get(boc);
320
+ };
321
+ }
322
+ /**
323
+ * The facts endpoints must agree on for jetton metadata: the exit code and the content
324
+ * cell's hash, never the rest of the answer (a total supply that moves between two reads)
325
+ * nor the cell's serialization. It never throws: an answer that does not parse
326
+ * is itself a fact, which the parse then refuses (retryable).
327
+ */
328
+ function jettonDataKey(cellOf) {
329
+ return (body) => {
330
+ try {
331
+ const { exitCode, content } = (0, api_1.jettonDataOf)(body);
332
+ if (!content)
333
+ return { exitCode };
334
+ if (content.kind === 'oversized')
335
+ return { exitCode, content: 'oversized' };
336
+ const cell = cellOf(content.boc);
337
+ return { exitCode, content: cell ? cell.hash().toString('hex') : 'unparseable' };
338
+ }
339
+ catch {
340
+ return 'malformed';
341
+ }
342
+ };
343
+ }
344
+ /**
345
+ * A jetton's metadata, under the proof quorum. The master's content decides what it can:
346
+ * - no master, or content beyond an account state's limits (every quorum endpoint agreed
347
+ * on it), or a layout or value that does not read: `ASSET_RESOLUTION`;
348
+ * - a content BOC that does not parse: the endpoint's fault, retryable;
349
+ * - content wholly on chain: its own symbol, and its decimals or TEP-64's default of 9;
350
+ * - otherwise the off-chain JSON fills in what the chain does not state, as the indexer
351
+ * fetched it, and only those fields are judged: one the indexer holds but is not one
352
+ * (agreed by the quorum) is the token's own `ASSET_RESOLUTION`. Metadata the indexer
353
+ * does not have (no usable entry: never indexed, not valid, an unfetchable JSON; or a
354
+ * JSON that states no decimals) is never a default: an index that lags or drops its
355
+ * filter would otherwise cache 9 decimals for the container's life, and a 6-decimal
356
+ * token would be mis-scaled 1,000× (fund safety over liveness).
357
+ *
358
+ * That absence is `unresolvable`, a non-retryable `PROVIDER_UNAVAILABLE`. Anyone can send
359
+ * a junk jetton to a deposit address, and a retryable answer would fail every history
360
+ * page and `getTransaction` that holds it, forever. Non-retryable, the core reports the
361
+ * transfer with its raw base-unit amount and the asset unresolved and reads the rest of
362
+ * the page. Its code is not `ASSET_RESOLUTION`, the one failure the core caches for the
363
+ * container's life, so it is never cached: once the indexer has the metadata, the next
364
+ * read resolves the token. A transfer of such a token fails the same way, before anything
365
+ * is signed.
366
+ * Known gap: that refusal is not retryable, even for a jetton the indexer has simply not
367
+ * indexed yet; it records nothing, so the same call succeeds later. A retryable refusal
368
+ * needs the core to report a transfer unresolved on a retryable failure too, or the
369
+ * history stall comes back. A jetton whose metadata states no decimals stays unresolved:
370
+ * the only way to use it is to register its decimals in a plugin's `assets`.
371
+ */
372
+ async function jettonMetadata(ctx, master) {
373
+ const cellOf = contentCells();
374
+ const data = await tokenCall(() => ctx.api.jettonData(master, { ...METADATA, quorumKey: jettonDataKey(cellOf) }));
375
+ if (data.exitCode !== 0 || !data.content) {
376
+ throw assetError('no jetton master at this address');
377
+ }
378
+ if (data.content.kind === 'oversized')
379
+ throw assetError('the jetton content is unreadable');
380
+ const cell = cellOf(data.content.boc);
381
+ if (!cell)
382
+ throw notYet('malformed jetton content answer');
383
+ const { fields, linked } = contentOf(cell);
384
+ if (fields.decimals === null)
385
+ throw assetError('the jetton decimals are unreadable');
386
+ if (fields.symbol === null)
387
+ throw assetError('the jetton symbol is unreadable');
388
+ let decimals = fields.decimals;
389
+ let symbol = fields.symbol;
390
+ let name = fields.name ?? undefined;
391
+ if (!linked) {
392
+ decimals ??= '9';
393
+ }
394
+ else if (decimals === undefined || symbol === undefined) {
395
+ const info = await tokenCall(() => ctx.api.tokenInfo(master, METADATA));
396
+ if (!info)
397
+ throw unresolvable('the jetton metadata is not indexed');
398
+ if (decimals === undefined)
399
+ decimals = info.decimals;
400
+ if (symbol === undefined)
401
+ symbol = info.symbol;
402
+ name ??= info.name;
403
+ if (decimals === null)
404
+ throw assetError('the jetton decimals are unreadable');
405
+ if (symbol === null)
406
+ throw assetError('the jetton symbol is unreadable');
407
+ if (decimals === undefined)
408
+ throw unresolvable('the jetton metadata states no decimals');
409
+ }
410
+ if (!/^\d{1,3}$/.test(decimals) || Number(decimals) > 255) {
411
+ throw assetError('the jetton decimals are unreadable');
412
+ }
413
+ if (!symbol)
414
+ throw assetError('the jetton has no symbol');
415
+ if (symbol.length > MAX_SYMBOL_LENGTH)
416
+ throw assetError('the jetton symbol is unreadable');
417
+ return {
418
+ symbol,
419
+ decimals: Number(decimals),
420
+ ...(name && name.length <= MAX_NAME_LENGTH ? { name } : {}),
421
+ };
422
+ }
423
+ /** The canonical master address of a jetton asset ref; `ASSET_RESOLUTION` otherwise. */
424
+ function jettonMaster(ctx, asset) {
425
+ if (asset === 'native' || asset.standard !== 'jetton') {
426
+ throw assetError(`TON tokens use the 'jetton' standard`);
427
+ }
428
+ try {
429
+ return ctx.codec.normalize(asset.contract).canonical;
430
+ }
431
+ catch {
432
+ throw assetError('not a TON jetton master address');
433
+ }
434
+ }
435
+ function toDriverBlock(header) {
436
+ return {
437
+ height: BigInt(header.id.seqno),
438
+ hash: header.id.rootHash,
439
+ parentHash: header.prev[0]?.rootHash ?? '',
440
+ timestamp: header.genUtime,
441
+ };
442
+ }
443
+ // ---- transactions and Attempts -------------------------------------------------------------
444
+ /**
445
+ * The transaction a lookup id names (anyone's): by message hash, then by its own hash. An
446
+ * external message can run more than once while it does not consume its seqno; the run
447
+ * that consumed it is the one that took effect, so it is preferred.
448
+ */
449
+ async function findTransaction(ctx, id, tags) {
450
+ const hash = hashId(id);
451
+ if (!hash)
452
+ return null;
453
+ const byMessage = await ctx.api.transactionsByMessage(hash, tags);
454
+ const runs = byMessage.filter((tx) => tx.inMsg?.source === null);
455
+ const found = runs.find(trace_1.consumesSeqno) ?? runs[0] ?? byMessage[0];
456
+ return found ?? ctx.api.transaction(hash, tags);
457
+ }
458
+ /**
459
+ * Our own Attempt's wallet transaction, bound by account and a locally computed hash
460
+ * (`isOwnAttempt`, never a first-result fallback). A run that did not consume its
461
+ * seqno (a failed action phase, or a compute phase that failed before `commit()`) leaves the
462
+ * same message valid, so it may run again; the run that consumed the seqno is preferred,
463
+ * since only it decides.
464
+ */
465
+ async function findOwnAttempt(ctx, ref, from, tags) {
466
+ const hash = hashId(ref.id);
467
+ if (!hash)
468
+ return undefined;
469
+ const own = (await ctx.api.transactionsByMessage(hash, tags)).filter((tx) => (0, trace_1.isOwnAttempt)(tx, from, hash));
470
+ return own.find(trace_1.consumesSeqno) ?? own[0];
471
+ }
472
+ /**
473
+ * Each jetton leg's wallets must be the master's own for the sender and the intended
474
+ * recipient (the same master), as masterchain block `block` (the trace's last) records
475
+ * them: a fake jetton wallet can "accept" a transfer that moves nothing. The verdict
476
+ * unchanged when they are.
477
+ *
478
+ * Only positive evidence decides `failed`, never a missing
479
+ * answer. The sender's jetton wallet is the one the proof quorum attested at build and the
480
+ * trace shows both wallets running, so a leg that cannot be verified (no answer, exit -13
481
+ * "no state at this block", nothing that parses), or a sender wallet that is not ours,
482
+ * contradicts the chain: a retryable `PROVIDER_INCONSISTENT` (logged `JETTON_UNVERIFIED`),
483
+ * never a terminal failure that a new key would pay again. `failed` only when the recipient
484
+ * wallet answered, and it is not the master's for the intended recipient (another wallet
485
+ * named, another owner, another master): the jettons went elsewhere.
486
+ */
487
+ async function confirmLegs(ctx, verdict, from, tags, block) {
488
+ if (verdict.kind !== 'success')
489
+ return verdict;
490
+ for (const leg of verdict.legs) {
491
+ const sender = await jettonWalletFacts(ctx, leg.senderWallet, tags, block);
492
+ const recipient = await jettonWalletFacts(ctx, leg.recipientWallet, tags, block);
493
+ if (sender.kind !== 'verified' ||
494
+ sender.wallet.owner !== from ||
495
+ recipient.kind === 'unknown') {
496
+ ctx.log.warn('a jetton wallet of the transfer could not be verified', {
497
+ code: 'JETTON_UNVERIFIED',
498
+ });
499
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the jetton wallets of the transfer could not be verified at its block', { retryable: true });
500
+ }
501
+ if (recipient.kind === 'foreign' ||
502
+ recipient.wallet.owner !== leg.recipient ||
503
+ recipient.wallet.master !== sender.wallet.master) {
504
+ return Object.freeze({ kind: 'failed', reason: trace_1.REASONS.jettonUnverified });
505
+ }
506
+ }
507
+ return verdict;
508
+ }
509
+ /** The newest masterchain block of a trace: every leg's wallet has run by then. */
510
+ function traceBlock(root, trace) {
511
+ return Math.max(root.mcSeqno, ...(trace?.transactions ?? []).map((tx) => tx.mcSeqno));
512
+ }
513
+ const pageMemo = () => ({
514
+ headers: new Map(),
515
+ jettonWallets: new Map(),
516
+ });
517
+ exports.pageMemo = pageMemo;
518
+ /** `read()` once per key in `memo` (none: read every time). */
519
+ function remembered(memo, key, read) {
520
+ if (!memo)
521
+ return read();
522
+ let pending = memo.get(key);
523
+ if (!pending) {
524
+ pending = read();
525
+ memo.set(key, pending);
526
+ }
527
+ return pending;
528
+ }
529
+ /**
530
+ * A transaction decoded with its jetton wallet verified at the transaction's own block
531
+ * and its block's hash; `memo` shares both reads across one history page.
532
+ */
533
+ async function decodeWithJettons(ctx, tx, tags, memo) {
534
+ const candidate = (0, decode_1.jettonWalletToVerify)(tx);
535
+ // The arrival's own jetton wallet ran here; a notification's sender ran earlier.
536
+ const jetton = candidate
537
+ ? await verifyJettonWallet(ctx, candidate, tags, tx.mcSeqno, candidate === tx.account, memo)
538
+ : undefined;
539
+ const header = await remembered(memo?.headers, tx.mcSeqno, () => ctx.api.masterchainHeader(tx.mcSeqno, tags));
540
+ return (0, decode_1.decodeTransaction)(tx, {
541
+ blockHash: header.id.rootHash,
542
+ ...(jetton ? { jetton } : {}),
543
+ });
544
+ }
545
+ /** The highest masterchain seqno (a uint32). */
546
+ const MAX_BLOCK_SEQNO = 0xffffffffn;
547
+ function createTonReader(ctx) {
548
+ const { api } = ctx;
549
+ return {
550
+ getBalance: async (address, asset) => {
551
+ const owner = ctx.codec.normalize(address).canonical;
552
+ if (asset === 'native')
553
+ return (await api.account(owner, api_1.READ)).balance;
554
+ return jettonBalance(ctx, jettonMaster(ctx, asset), owner, api_1.READ);
555
+ },
556
+ getBlockHeight: async () => BigInt(await api.masterchainHead(api_1.MONITOR)),
557
+ // Every masterchain block is final once it exists.
558
+ getFinalizedHeight: async () => BigInt(await api.masterchainHead(api_1.MONITOR)),
559
+ getBlock: async (ref) => {
560
+ let seqno;
561
+ let hash;
562
+ if (typeof ref === 'bigint') {
563
+ if (ref < 0n || ref > MAX_BLOCK_SEQNO)
564
+ return null;
565
+ seqno = Number(ref);
566
+ }
567
+ else {
568
+ hash = hashId(ref);
569
+ if (!hash)
570
+ return null;
571
+ seqno = await api.masterchainSeqnoOf(hash, api_1.READ);
572
+ }
573
+ if (seqno === null || seqno > (await api.masterchainHead(api_1.READ)))
574
+ return null;
575
+ const header = await api.masterchainHeader(seqno, api_1.READ);
576
+ if (hash !== undefined && header.id.rootHash !== hash) {
577
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the indexer and the liteserver name different blocks', { retryable: true });
578
+ }
579
+ return toDriverBlock(header);
580
+ },
581
+ getTransaction: async (id) => {
582
+ const tx = await findTransaction(ctx, id, api_1.READ);
583
+ return tx ? decodeWithJettons(ctx, tx, api_1.READ) : null;
584
+ },
585
+ observe: async (ref, ordering, from) => {
586
+ const managed = ordering !== undefined && from !== undefined;
587
+ const wallet = managed ? ctx.codec.normalize(from).canonical : undefined;
588
+ // A managed Attempt is only ever our own wallet transaction (`isOwnAttempt`, before
589
+ // any verdict), never a fallback.
590
+ const tx = wallet !== undefined
591
+ ? await findOwnAttempt(ctx, ref, wallet, api_1.MONITOR)
592
+ : await findTransaction(ctx, ref.id, api_1.MONITOR);
593
+ if (!tx)
594
+ return { seen: 'none' };
595
+ const header = await api.masterchainHeader(tx.mcSeqno, api_1.MONITOR);
596
+ const seen = {
597
+ seen: 'block',
598
+ txHash: tx.hash,
599
+ blockHeight: BigInt(tx.mcSeqno),
600
+ blockHash: header.id.rootHash,
601
+ };
602
+ // Anyone's transaction: its execution status as the chain reports it.
603
+ if (wallet === undefined)
604
+ return { ...seen, success: (0, decode_1.executed)(tx) };
605
+ // Our own Attempt: the verdict path.
606
+ const trace = await api.trace(tx.hash, api_1.MONITOR);
607
+ const verdict = await confirmLegs(ctx, (0, trace_1.attemptVerdict)(tx, trace), wallet, api_1.MONITOR, traceBlock(tx, trace));
608
+ if (verdict.kind === 'pending')
609
+ return seen;
610
+ return verdict.kind === 'success'
611
+ ? { ...seen, success: true }
612
+ : { ...seen, success: false, reason: verdict.reason };
613
+ },
614
+ getTokenMetadata: async (ref) => jettonMetadata(ctx, jettonMaster(ctx, ref)),
615
+ normalizeTokenRef: (ref) => ({
616
+ standard: 'jetton',
617
+ contract: jettonMaster(ctx, ref),
618
+ }),
619
+ };
620
+ }
621
+ /**
622
+ * A get-method's answer is the one run where it was asked: at `block` (the full id
623
+ * when the caller has it, else the masterchain seqno), and on `state` when given, the
624
+ * account's last transaction there. An endpoint that drops the block answers at its own
625
+ * latest state, which decides nothing (a retryable `PROVIDER_INCONSISTENT`).
626
+ */
627
+ function assertRunAt(result, block, state) {
628
+ const atBlock = typeof block === 'number'
629
+ ? result.block.workchain === -1 &&
630
+ result.block.shard === api_1.MASTERCHAIN_SHARD &&
631
+ result.block.seqno === block
632
+ : (0, api_1.sameBlock)(result.block, block);
633
+ if (!atBlock ||
634
+ (state !== undefined &&
635
+ (result.lastTransaction.lt !== state.lastLt ||
636
+ result.lastTransaction.hash !== state.lastHash))) {
637
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'a get-method was answered at another state than the one asked', { retryable: true });
638
+ }
639
+ }
640
+ const MAX_WALLET_SEQNO = 0xffffffffn;
641
+ /** The wallet's seqno at the latest state: 0 while undeployed (its first message deploys it). */
642
+ async function walletSeqno(ctx, address, tags) {
643
+ return (await liveSeqno(ctx, address, tags)).seqno;
644
+ }
645
+ /**
646
+ * The seqno at the block the account state was read at, so both come from one view. A
647
+ * frozen account is refused from its state alone, before any get-method: its deploy
648
+ * `StateInit` would not revive it, and a message signed for it can never run.
649
+ */
650
+ async function liveSeqno(ctx, address, tags) {
651
+ const state = await ctx.api.account(address, tags);
652
+ if (state.status === 'uninitialized') {
653
+ return { seqno: 0n, state, deployed: false };
654
+ }
655
+ if (state.status === 'frozen') {
656
+ throw new error_1.ChainError('TX_REFUSED', 'the wallet account is frozen');
657
+ }
658
+ const result = await ctx.api.runGetMethodAt(address, 'seqno', [], tags, state.blockSeqno);
659
+ assertRunAt(result, state.block, state);
660
+ const first = result.stack[0];
661
+ if (result.exitCode !== 0 ||
662
+ first?.type !== 'num' ||
663
+ first.value < 0n ||
664
+ first.value > MAX_WALLET_SEQNO) {
665
+ throw new error_1.ValidationError('INVALID_INTENT', 'the account is not a v4r2 or v5r1 wallet');
666
+ }
667
+ return { seqno: first.value, state, deployed: true };
668
+ }
669
+ /**
670
+ * The wallet's public key at masterchain block `block` (`get_public_key`), read once and
671
+ * only when needed; undefined when the account has none there. The answer is bound to the
672
+ * block asked and, when given, to the account state read there.
673
+ */
674
+ function publicKeyAt(ctx, address, tags, block, state) {
675
+ let key;
676
+ const seqno = typeof block === 'number' ? block : block.seqno;
677
+ const read = async () => {
678
+ const result = await ctx.api.runGetMethodAt(address, 'get_public_key', [], tags, seqno);
679
+ assertRunAt(result, block, state);
680
+ const first = result.stack[0];
681
+ if (result.exitCode !== 0 || first?.type !== 'num')
682
+ return undefined;
683
+ if (first.value < 0n || first.value >= 1n << 256n)
684
+ return undefined;
685
+ return Buffer.from(first.value.toString(16).padStart(64, '0'), 'hex');
686
+ };
687
+ return () => (key ??= read());
688
+ }
689
+ /**
690
+ * The wallet request `tx` proves `from` consumed its seqno,
691
+ * else null. Every request must be the wallet's own, signed by its key (`requestIsOwn`): a
692
+ * lone lying indexer can make up an external one, and anyone can post a relayed W5 body for
693
+ * a small fee (a v5r1 wallet ignores a forged one). And it must have consumed the seqno: an
694
+ * external request only when `consumesSeqno` holds (its action phase succeeded, or W5
695
+ * committed and then threw 137), a relayed one only when the wallet ran it to the end
696
+ * (`ran`: with no `commit()` there, a failed action phase rolls the seqno back). A foreign
697
+ * request signed with the same key whose action phase failed consumed nothing. `publicKey`
698
+ * gives the wallet's key for `tx`; it is read only for a request that passed the rest.
699
+ */
700
+ async function provenRequest(ctx, tx, from, publicKey) {
701
+ const inMsg = tx.inMsg;
702
+ if (!inMsg || tx.account !== from)
703
+ return null;
704
+ const body = (0, messages_1.messageBody)(inMsg);
705
+ const request = body ? (0, messages_1.decodeWalletRequest)(body) : null;
706
+ if (!body || !request)
707
+ return null;
708
+ if (inMsg.source === null) {
709
+ if (request.auth !== 'external' || !(0, trace_1.consumesSeqno)(tx))
710
+ return null;
711
+ }
712
+ else if (request.auth !== 'internal' || !(0, decode_1.ran)(tx)) {
713
+ return null;
714
+ }
715
+ const key = await publicKey(tx);
716
+ return key && (0, wallets_1.requestIsOwn)(from, body, key, ctx.config.globalId) ? request : null;
717
+ }
718
+ /** The history page the seqno floor reads, and how many pages before it gives up. */
719
+ const FLOOR_PAGE = 64;
720
+ const FLOOR_PAGES = 4;
721
+ /**
722
+ * The seqno after the newest wallet request the indexer has. Once the previous transfer
723
+ * is `included`, the core hands out the next seqno; a lagging liteserver read could still
724
+ * show the consumed one, and a message signed for it could only end `replaced`. Only a
725
+ * proven request counts, and only one newer than the live read: the live read
726
+ * already covers the rest. The history is paged on the indexer's own pages (a page
727
+ * whose newest transactions are not final yet still leads to the older ones) until it
728
+ * reaches the live read's block; more than `FLOOR_PAGES` pages since then decides nothing
729
+ * (retryable) rather than guess, and so does a request dated after its own lifetime.
730
+ */
731
+ async function indexedSeqnoFloor(ctx, address, live, tags) {
732
+ const liveKey = live.deployed
733
+ ? publicKeyAt(ctx, address, tags, live.state.block, live.state)
734
+ : async () => undefined;
735
+ // An undeployed wallet at the live read has no key there: read it at the evidence's own
736
+ // block, which a lagging endpoint refuses (retryable), so nothing is guessed meanwhile.
737
+ const key = async (tx) => (await liveKey()) ?? publicKeyAt(ctx, address, tags, tx.mcSeqno)();
738
+ let endLt;
739
+ for (let page = 0; page < FLOOR_PAGES; page += 1) {
740
+ const { transactions, next } = await ctx.api.accountTransactionsPage(address, { limit: FLOOR_PAGE, ...(endLt !== undefined ? { endLt } : {}) }, tags);
741
+ for (const tx of transactions) {
742
+ if (tx.mcSeqno <= live.state.blockSeqno)
743
+ return 0n; // newest first: the rest is older still
744
+ const request = await provenRequest(ctx, tx, address, key);
745
+ if (!request)
746
+ continue;
747
+ // A request that ran after its own lifetime is a record the chain
748
+ // cannot produce (the wallet refuses it), so it decides nothing, as in the proofs.
749
+ if (request.validUntil <= tx.now) {
750
+ throw new error_1.ProviderError('PROVIDER_INCONSISTENT', 'the seqno consumer ran after its request expired', { retryable: true });
751
+ }
752
+ return BigInt(request.seqno) + 1n;
753
+ }
754
+ if (next === undefined)
755
+ return 0n;
756
+ endLt = next;
757
+ }
758
+ throw notYet('the wallet history since the live seqno read is too long to check');
759
+ }
760
+ function createTonSequence(ctx) {
761
+ return {
762
+ pending: async (address) => {
763
+ const wallet = ctx.codec.normalize(address).canonical;
764
+ const live = await liveSeqno(ctx, wallet, api_1.MONITOR);
765
+ const floor = await indexedSeqnoFloor(ctx, wallet, live, api_1.MONITOR);
766
+ return live.seqno > floor ? live.seqno : floor;
767
+ },
768
+ latest: async (address) => walletSeqno(ctx, ctx.codec.normalize(address).canonical, api_1.MONITOR),
769
+ };
770
+ }
771
+ function createTonExt(ctx) {
772
+ return {
773
+ ton: {
774
+ getSeqno: async (address) => walletSeqno(ctx, ctx.codec.normalize(address).canonical, api_1.READ),
775
+ // A caller sends jettons to it, so the proof quorum attests it, and the attested
776
+ // answer is kept.
777
+ jettonWallet: async (owner, master) => jettonWalletAddress(ctx, jettonMaster(ctx, { standard: 'jetton', contract: master }), ctx.codec.normalize(owner).canonical, api_1.PROOF),
778
+ },
779
+ };
780
+ }
781
+ //# sourceMappingURL=reader.js.map