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,270 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PEER_SKEW = void 0;
4
+ exports.parseInput = parseInput;
5
+ exports.attestedReads = attestedReads;
6
+ exports.proofSource = proofSource;
7
+ exports.blockSource = blockSource;
8
+ const address_1 = require("./address");
9
+ const api_1 = require("./api");
10
+ const cb58_1 = require("./cb58");
11
+ const codec_1 = require("./codec");
12
+ const context_1 = require("./context");
13
+ const decode_1 = require("./decode");
14
+ const reader_1 = require("./reader");
15
+ /** Blocks `finalizedHead` trails one endpoint's head by, so peers can attest it. */
16
+ exports.PEER_SKEW = 1n;
17
+ /** Transactions of one block read at once. */
18
+ const TX_READS = 4;
19
+ const MAX_HEIGHT = BigInt(Number.MAX_SAFE_INTEGER);
20
+ const outOfRange = (height) => height < 0n || height > MAX_HEIGHT;
21
+ /** A block as the proof quorum compares it: the consensus facts the verdicts use. */
22
+ const blockKey = (answer) => {
23
+ const b = (0, api_1.parseBlock)(answer);
24
+ return `${b.height}:${b.id}:${b.parentId}:${b.txIds.join(',')}`;
25
+ };
26
+ /** Splits an `inputs` ordering entry (`txID:outputIndex`); malformed data decides nothing. */
27
+ function parseInput(input) {
28
+ const match = /^([1-9A-HJ-NP-Za-km-z]{32,50}):(0|[1-9][0-9]{0,9})$/.exec(input);
29
+ if (!match || !(0, cb58_1.isId)(match[1]) || Number(match[2]) > 0xffffffff) {
30
+ throw (0, context_1.undecided)('malformed input in the ordering');
31
+ }
32
+ return { txId: match[1], outputIndex: Number(match[2]) };
33
+ }
34
+ /** The `utxoId`s (`txID:outputIndex`) in a page of `getUTXOs`. */
35
+ function keysOfPage(answer) {
36
+ const utxos = answer?.utxos;
37
+ if (!Array.isArray(utxos))
38
+ return [];
39
+ return utxos.map((text) => (0, codec_1.utxoKeyOf)((0, api_1.decodeChecked)(text, 'utxo')));
40
+ }
41
+ /**
42
+ * The reads a proof attests under the proof quorum, each fact at its own height, which no
43
+ * endpoint proposes.
44
+ */
45
+ function attestedReads(ctx) {
46
+ const { node, config } = ctx;
47
+ const depth = BigInt(config.confirmations) - 1n;
48
+ /** "I hold a block at `height`" (monotone in the head, so endpoints further ahead agree). */
49
+ const holds = async (height) => (await node.height({
50
+ ...context_1.PROOF,
51
+ quorumKey: (answer) => (0, api_1.parseHeight)(answer?.height) >= height,
52
+ })) >= height;
53
+ /** The block at `height` on the proof endpoints' chain. */
54
+ const blockAt = (height) => node.blockAt(height, { ...context_1.PROOF, quorumKey: blockKey });
55
+ /** Whether the block at `height` is final (N − 1 blocks above it on every proof endpoint). */
56
+ const final = (height) => holds(height + depth);
57
+ return { holds, blockAt, final };
58
+ }
59
+ function proofSource(ctx) {
60
+ const { node, config } = ctx;
61
+ const depth = BigInt(config.confirmations) - 1n;
62
+ const { holds, blockAt, final } = attestedReads(ctx);
63
+ /** Accepted, aborted (P-Chain) or not, as the proof endpoints agree. */
64
+ const acceptance = async (txId) => {
65
+ if (config.vm === 'avm') {
66
+ const tags = {
67
+ ...context_1.PROOF,
68
+ quorumKey: (answer) => answer?.tx,
69
+ };
70
+ return (await node.txBytes(txId, tags)) === null ? 'not' : 'accepted';
71
+ }
72
+ const status = await node.txStatus(txId, {
73
+ ...context_1.PROOF,
74
+ quorumKey: (answer) => {
75
+ const s = (0, api_1.parsePlatformStatus)(answer);
76
+ return s === 'Committed' || s === 'Aborted' ? s : 'not';
77
+ },
78
+ });
79
+ return status === 'Committed' ? 'accepted' : status === 'Aborted' ? 'aborted' : 'not';
80
+ };
81
+ /** Which of `inputs` the proof endpoints (or, at `latest`, one) still list for `from`. */
82
+ const unspentOf = async (from, inputs, level) => {
83
+ const wanted = new Set(inputs);
84
+ const tags = level === 'latest'
85
+ ? context_1.MONITOR
86
+ : {
87
+ ...context_1.PROOF,
88
+ quorumKey: (answer) => keysOfPage(answer)
89
+ .filter((key) => wanted.has(key))
90
+ .sort()
91
+ .join(','),
92
+ };
93
+ const listed = await node.utxos((0, address_1.normalizeAddress)(from, config).canonical, tags);
94
+ const present = new Set();
95
+ for (const bytes of listed) {
96
+ const key = (0, codec_1.utxoKeyOf)(bytes);
97
+ if (wanted.has(key))
98
+ present.add(key);
99
+ }
100
+ return present;
101
+ };
102
+ const inputsOf = (ordering) => ordering.kind === 'inputs'
103
+ ? ordering.inputs.map((input) => {
104
+ const { txId, outputIndex } = parseInput(input);
105
+ return (0, codec_1.utxoKey)(txId, outputIndex);
106
+ })
107
+ : [];
108
+ const source = {
109
+ async finalizedHead() {
110
+ const anchor = (await node.height(context_1.MONITOR)) - exports.PEER_SKEW;
111
+ if (anchor < 0n || !(await holds(anchor))) {
112
+ throw (0, context_1.undecided)('the proof endpoints have not reached the head');
113
+ }
114
+ const height = anchor - depth < 0n ? 0n : anchor - depth;
115
+ const block = await blockAt(height);
116
+ if (!block)
117
+ throw (0, context_1.undecided)('the final block is not visible to the proof endpoints');
118
+ return {
119
+ height,
120
+ hash: block.id,
121
+ ...(block.timestamp !== undefined ? { timestamp: block.timestamp } : {}),
122
+ };
123
+ },
124
+ async includedFinal(ref, ordering, from) {
125
+ if (!(0, cb58_1.isId)(ref.id))
126
+ throw (0, context_1.undecided)('malformed transaction id');
127
+ const status = await acceptance(ref.id);
128
+ if (status !== 'not') {
129
+ const location = await (0, context_1.locate)(ctx, ref.id, context_1.MONITOR);
130
+ if (!location || location === 'no-block') {
131
+ throw (0, context_1.undecided)('the block of the transaction is not located yet');
132
+ }
133
+ const block = await blockAt(location.height);
134
+ if (!block || block.id !== location.hash || !block.txIds.includes(ref.id)) {
135
+ ctx.located.forget(ref.id);
136
+ throw (0, context_1.contradiction)('the located block of the transaction is not on the chain');
137
+ }
138
+ if (!(await final(location.height))) {
139
+ throw (0, context_1.undecided)('the transaction is not final yet');
140
+ }
141
+ return {
142
+ included: true,
143
+ success: status === 'accepted',
144
+ blockHeight: location.height,
145
+ blockHash: location.hash,
146
+ txHash: ref.id,
147
+ ...(status === 'aborted' ? { reason: 'the transaction was aborted' } : {}),
148
+ };
149
+ }
150
+ // Not accepted: only a spent input proves it never will be.
151
+ const inputs = inputsOf(ordering);
152
+ if (inputs.length === 0)
153
+ throw (0, context_1.undecided)('the transaction is not accepted yet');
154
+ const unspent = await unspentOf(from, inputs, 'finalized');
155
+ if (inputs.every((input) => unspent.has(input))) {
156
+ throw (0, context_1.undecided)('the transaction is not accepted yet');
157
+ }
158
+ // Read after the spend: had ours spent the input, it would be accepted by now.
159
+ if ((await acceptance(ref.id)) !== 'not') {
160
+ throw (0, context_1.undecided)('the transaction was accepted meanwhile');
161
+ }
162
+ return { included: false };
163
+ },
164
+ async slotConsumed(ordering, from, level) {
165
+ const inputs = inputsOf(ordering);
166
+ if (inputs.length === 0)
167
+ return false;
168
+ const unspent = await unspentOf(from, inputs, level);
169
+ return inputs.some((input) => !unspent.has(input));
170
+ },
171
+ expired: async () => false,
172
+ async blockHash(height, level) {
173
+ if (outOfRange(height))
174
+ return null;
175
+ if (level === 'finalized' && !(await final(height)))
176
+ return null;
177
+ return (await blockAt(height))?.id ?? null;
178
+ },
179
+ };
180
+ // Every read of every proof decides nothing on "not available here": only a definitive
181
+ // negative may answer "no" (`proofRead`).
182
+ return {
183
+ finalizedHead: () => (0, context_1.proofRead)(() => source.finalizedHead()),
184
+ includedFinal: (ref, ordering, from) => (0, context_1.proofRead)(() => source.includedFinal(ref, ordering, from)),
185
+ slotConsumed: (ordering, from, level) => (0, context_1.proofRead)(() => source.slotConsumed(ordering, from, level)),
186
+ expired: (ordering) => source.expired(ordering),
187
+ blockHash: (height, level) => (0, context_1.proofRead)(() => source.blockHash(height, level)),
188
+ };
189
+ }
190
+ /**
191
+ * Runs `work` on each item, at most `limit` at a time. After a failure the other runners
192
+ * stop at their next step, and the first failure is thrown.
193
+ */
194
+ async function forEachBounded(items, limit, work) {
195
+ let next = 0;
196
+ let failed = false;
197
+ const runner = async () => {
198
+ while (!failed && next < items.length) {
199
+ const index = next++;
200
+ try {
201
+ await work(items[index], index);
202
+ }
203
+ catch (error) {
204
+ failed = true;
205
+ throw error;
206
+ }
207
+ }
208
+ };
209
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, runner));
210
+ }
211
+ function blockSource(ctx) {
212
+ const { node, config } = ctx;
213
+ return {
214
+ async header(height) {
215
+ if (outOfRange(height))
216
+ return null;
217
+ const block = await node.blockAt(height, context_1.MONITOR);
218
+ return block ? (0, reader_1.toDriverBlock)(block) : null;
219
+ },
220
+ async transactions(block, filter) {
221
+ const inconsistent = () => (0, context_1.contradiction)(`block ${block.height} changed while scanning`);
222
+ const current = await node.blockAt(block.height, context_1.MONITOR);
223
+ if (!current || current.id !== block.hash)
224
+ throw inconsistent();
225
+ // `filter.assets` is a hint: a list without the native asset wants tokens only.
226
+ if (filter?.assets?.length && !filter.assets.includes('native'))
227
+ return [];
228
+ const txs = new Array(current.txIds.length);
229
+ await forEachBounded(current.txIds, TX_READS, async (txId, index) => {
230
+ const bytes = await node.txBytes(txId, context_1.MONITOR);
231
+ // An accepted block's transaction is accepted: a node without it is behind.
232
+ if (!bytes)
233
+ throw inconsistent();
234
+ let success = true;
235
+ if (config.vm === 'pvm') {
236
+ const status = await node.txStatus(txId, context_1.MONITOR);
237
+ if (status !== 'Committed' && status !== 'Aborted')
238
+ throw inconsistent();
239
+ success = status === 'Committed';
240
+ }
241
+ txs[index] = (0, decode_1.decodeTransaction)(bytes, config, {
242
+ seen: 'block',
243
+ txHash: txId,
244
+ blockHeight: current.height,
245
+ blockHash: current.id,
246
+ success,
247
+ ...(success ? {} : { reason: 'the transaction was aborted' }),
248
+ });
249
+ });
250
+ // Checked after the reads, so a node that switched blocks meanwhile is caught.
251
+ if ((await node.blockAt(block.height, context_1.MONITOR))?.id !== block.hash) {
252
+ throw inconsistent();
253
+ }
254
+ const watched = new Set();
255
+ for (const address of filter?.addresses ?? []) {
256
+ try {
257
+ watched.add((0, address_1.normalizeAddress)(address, config).canonical);
258
+ }
259
+ catch {
260
+ // Not an address of this chain: it matches nothing.
261
+ }
262
+ }
263
+ if ((filter?.addresses?.length ?? 0) === 0)
264
+ return txs;
265
+ return txs.filter((tx) => tx.transfers.some((t) => watched.has(t.to)) ||
266
+ (tx.details.signers ?? []).some((s) => watched.has(s)));
267
+ },
268
+ };
269
+ }
270
+ //# sourceMappingURL=proofs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proofs.js","sourceRoot":"","sources":["../../../src/adapters/avalanche/proofs.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Proofs (the finalized-state checks behind `proven` verdicts) and the block source.\n *\n * Snowman never reverts an accepted block, so with the default policy (1 confirmation) an\n * accepted transaction is final. Every fact is read under the proof quorum (one\n * endpoint's word never decides), each at its own height with a monotone key, and no\n * endpoint proposes the height: \"block h is final\" is \"every proof endpoint holds a block\n * at h + N − 1\".\n *\n * - `includedFinal` answers \"included\" only when the proof endpoints agree the transaction\n * is accepted and the block at its located height is the located block and holds it. It\n * answers \"not included\" only when one of its inputs is gone from the sender's outputs on\n * every proof endpoint and, read after that, the transaction is still not accepted: then\n * another transaction spent the input, and ours can never be accepted. Every other case\n * decides nothing (a retryable `ProviderError`).\n * - `slotConsumed` reads the sender's outputs: an input missing from them is spent.\n * - The block source reads blocks by height; their transactions are read by id from the\n * node, as bytes that hash to that id. A P-Chain proposal transaction counts as failed\n * when its proposal was aborted.\n */\nimport type {\n BlockSource,\n DriverBlock,\n DriverTransaction,\n FinalityLevel,\n ProofSource,\n} from '../../core/driver/types';\nimport type { OrderingData } from '../../core/model/ordering';\nimport type { AttemptRef } from '../../core/model/transaction';\nimport { normalizeAddress } from './address';\nimport {\n decodeChecked,\n parseBlock,\n parseHeight,\n parsePlatformStatus,\n type NodeBlock,\n} from './api';\nimport { isId } from './cb58';\nimport { utxoKey, utxoKeyOf } from './codec';\nimport {\n MONITOR,\n PROOF,\n contradiction,\n locate,\n proofRead,\n undecided,\n type AvalancheContext,\n} from './context';\nimport { decodeTransaction } from './decode';\nimport { toDriverBlock } from './reader';\nimport type { AvalancheCallTags } from './types';\n\n/** Blocks `finalizedHead` trails one endpoint's head by, so peers can attest it. */\nexport const PEER_SKEW = 1n;\n/** Transactions of one block read at once. */\nconst TX_READS = 4;\nconst MAX_HEIGHT = BigInt(Number.MAX_SAFE_INTEGER);\nconst outOfRange = (height: bigint): boolean => height < 0n || height > MAX_HEIGHT;\n\n/** A block as the proof quorum compares it: the consensus facts the verdicts use. */\nconst blockKey = (answer: unknown): string => {\n const b = parseBlock(answer);\n return `${b.height}:${b.id}:${b.parentId}:${b.txIds.join(',')}`;\n};\n\n/** Splits an `inputs` ordering entry (`txID:outputIndex`); malformed data decides nothing. */\nexport function parseInput(input: string): { txId: string; outputIndex: number } {\n const match = /^([1-9A-HJ-NP-Za-km-z]{32,50}):(0|[1-9][0-9]{0,9})$/.exec(input);\n if (!match || !isId(match[1]) || Number(match[2]) > 0xffffffff) {\n throw undecided('malformed input in the ordering');\n }\n return { txId: match[1] as string, outputIndex: Number(match[2]) };\n}\n\n/** The `utxoId`s (`txID:outputIndex`) in a page of `getUTXOs`. */\nfunction keysOfPage(answer: unknown): string[] {\n const utxos = (answer as { utxos?: unknown } | null)?.utxos;\n if (!Array.isArray(utxos)) return [];\n return utxos.map((text) => utxoKeyOf(decodeChecked(text, 'utxo')));\n}\n\n/**\n * The reads a proof attests under the proof quorum, each fact at its own height, which no\n * endpoint proposes.\n */\nexport function attestedReads(ctx: AvalancheContext) {\n const { node, config } = ctx;\n const depth = BigInt(config.confirmations) - 1n;\n /** \"I hold a block at `height`\" (monotone in the head, so endpoints further ahead agree). */\n const holds = async (height: bigint): Promise<boolean> =>\n (await node.height({\n ...PROOF,\n quorumKey: (answer) =>\n parseHeight((answer as { height?: unknown } | null)?.height) >= height,\n })) >= height;\n /** The block at `height` on the proof endpoints' chain. */\n const blockAt = (height: bigint): Promise<NodeBlock | null> =>\n node.blockAt(height, { ...PROOF, quorumKey: blockKey });\n /** Whether the block at `height` is final (N − 1 blocks above it on every proof endpoint). */\n const final = (height: bigint): Promise<boolean> => holds(height + depth);\n return { holds, blockAt, final };\n}\n\nexport function proofSource(ctx: AvalancheContext): ProofSource {\n const { node, config } = ctx;\n const depth = BigInt(config.confirmations) - 1n;\n const { holds, blockAt, final } = attestedReads(ctx);\n\n /** Accepted, aborted (P-Chain) or not, as the proof endpoints agree. */\n const acceptance = async (txId: string): Promise<'accepted' | 'aborted' | 'not'> => {\n if (config.vm === 'avm') {\n const tags: AvalancheCallTags = {\n ...PROOF,\n quorumKey: (answer) => (answer as { tx?: unknown } | null)?.tx,\n };\n return (await node.txBytes(txId, tags)) === null ? 'not' : 'accepted';\n }\n const status = await node.txStatus(txId, {\n ...PROOF,\n quorumKey: (answer) => {\n const s = parsePlatformStatus(answer);\n return s === 'Committed' || s === 'Aborted' ? s : 'not';\n },\n });\n return status === 'Committed' ? 'accepted' : status === 'Aborted' ? 'aborted' : 'not';\n };\n\n /** Which of `inputs` the proof endpoints (or, at `latest`, one) still list for `from`. */\n const unspentOf = async (\n from: string,\n inputs: readonly string[],\n level: FinalityLevel,\n ): Promise<Set<string>> => {\n const wanted = new Set(inputs);\n const tags: AvalancheCallTags =\n level === 'latest'\n ? MONITOR\n : {\n ...PROOF,\n quorumKey: (answer) =>\n keysOfPage(answer)\n .filter((key) => wanted.has(key))\n .sort()\n .join(','),\n };\n const listed = await node.utxos(normalizeAddress(from, config).canonical, tags);\n const present = new Set<string>();\n for (const bytes of listed) {\n const key = utxoKeyOf(bytes);\n if (wanted.has(key)) present.add(key);\n }\n return present;\n };\n\n const inputsOf = (ordering: OrderingData): string[] =>\n ordering.kind === 'inputs'\n ? ordering.inputs.map((input) => {\n const { txId, outputIndex } = parseInput(input);\n return utxoKey(txId, outputIndex);\n })\n : [];\n\n const source: ProofSource = {\n async finalizedHead() {\n const anchor = (await node.height(MONITOR)) - PEER_SKEW;\n if (anchor < 0n || !(await holds(anchor))) {\n throw undecided('the proof endpoints have not reached the head');\n }\n const height = anchor - depth < 0n ? 0n : anchor - depth;\n const block = await blockAt(height);\n if (!block)\n throw undecided('the final block is not visible to the proof endpoints');\n return {\n height,\n hash: block.id,\n ...(block.timestamp !== undefined ? { timestamp: block.timestamp } : {}),\n };\n },\n\n async includedFinal(ref: AttemptRef, ordering: OrderingData, from: string) {\n if (!isId(ref.id)) throw undecided('malformed transaction id');\n const status = await acceptance(ref.id);\n if (status !== 'not') {\n const location = await locate(ctx, ref.id, MONITOR);\n if (!location || location === 'no-block') {\n throw undecided('the block of the transaction is not located yet');\n }\n const block = await blockAt(location.height);\n if (!block || block.id !== location.hash || !block.txIds.includes(ref.id)) {\n ctx.located.forget(ref.id);\n throw contradiction('the located block of the transaction is not on the chain');\n }\n if (!(await final(location.height))) {\n throw undecided('the transaction is not final yet');\n }\n return {\n included: true,\n success: status === 'accepted',\n blockHeight: location.height,\n blockHash: location.hash,\n txHash: ref.id,\n ...(status === 'aborted' ? { reason: 'the transaction was aborted' } : {}),\n };\n }\n // Not accepted: only a spent input proves it never will be.\n const inputs = inputsOf(ordering);\n if (inputs.length === 0) throw undecided('the transaction is not accepted yet');\n const unspent = await unspentOf(from, inputs, 'finalized');\n if (inputs.every((input) => unspent.has(input))) {\n throw undecided('the transaction is not accepted yet');\n }\n // Read after the spend: had ours spent the input, it would be accepted by now.\n if ((await acceptance(ref.id)) !== 'not') {\n throw undecided('the transaction was accepted meanwhile');\n }\n return { included: false };\n },\n\n async slotConsumed(ordering, from, level) {\n const inputs = inputsOf(ordering);\n if (inputs.length === 0) return false;\n const unspent = await unspentOf(from, inputs, level);\n return inputs.some((input) => !unspent.has(input));\n },\n\n expired: async () => false,\n\n async blockHash(height, level) {\n if (outOfRange(height)) return null;\n if (level === 'finalized' && !(await final(height))) return null;\n return (await blockAt(height))?.id ?? null;\n },\n };\n\n // Every read of every proof decides nothing on \"not available here\": only a definitive\n // negative may answer \"no\" (`proofRead`).\n return {\n finalizedHead: () => proofRead(() => source.finalizedHead()),\n includedFinal: (ref, ordering, from) =>\n proofRead(() => source.includedFinal(ref, ordering, from)),\n slotConsumed: (ordering, from, level) =>\n proofRead(() => source.slotConsumed(ordering, from, level)),\n expired: (ordering) => source.expired(ordering),\n blockHash: (height, level) => proofRead(() => source.blockHash(height, level)),\n };\n}\n\n/**\n * Runs `work` on each item, at most `limit` at a time. After a failure the other runners\n * stop at their next step, and the first failure is thrown.\n */\nasync function forEachBounded<T>(\n items: readonly T[],\n limit: number,\n work: (item: T, index: number) => Promise<void>,\n): Promise<void> {\n let next = 0;\n let failed = false;\n const runner = async (): Promise<void> => {\n while (!failed && next < items.length) {\n const index = next++;\n try {\n await work(items[index] as T, index);\n } catch (error) {\n failed = true;\n throw error;\n }\n }\n };\n await Promise.all(Array.from({ length: Math.min(limit, items.length) }, runner));\n}\n\nexport function blockSource(ctx: AvalancheContext): BlockSource {\n const { node, config } = ctx;\n return {\n async header(height): Promise<DriverBlock | null> {\n if (outOfRange(height)) return null;\n const block = await node.blockAt(height, MONITOR);\n return block ? toDriverBlock(block) : null;\n },\n\n async transactions(block, filter) {\n const inconsistent = () =>\n contradiction(`block ${block.height} changed while scanning`);\n const current = await node.blockAt(block.height, MONITOR);\n if (!current || current.id !== block.hash) throw inconsistent();\n // `filter.assets` is a hint: a list without the native asset wants tokens only.\n if (filter?.assets?.length && !filter.assets.includes('native')) return [];\n const txs: DriverTransaction[] = new Array(current.txIds.length);\n await forEachBounded(current.txIds, TX_READS, async (txId, index) => {\n const bytes = await node.txBytes(txId, MONITOR);\n // An accepted block's transaction is accepted: a node without it is behind.\n if (!bytes) throw inconsistent();\n let success = true;\n if (config.vm === 'pvm') {\n const status = await node.txStatus(txId, MONITOR);\n if (status !== 'Committed' && status !== 'Aborted') throw inconsistent();\n success = status === 'Committed';\n }\n txs[index] = decodeTransaction(bytes, config, {\n seen: 'block',\n txHash: txId,\n blockHeight: current.height,\n blockHash: current.id,\n success,\n ...(success ? {} : { reason: 'the transaction was aborted' }),\n });\n });\n // Checked after the reads, so a node that switched blocks meanwhile is caught.\n if ((await node.blockAt(block.height, MONITOR))?.id !== block.hash) {\n throw inconsistent();\n }\n const watched = new Set<string>();\n for (const address of filter?.addresses ?? []) {\n try {\n watched.add(normalizeAddress(address, config).canonical);\n } catch {\n // Not an address of this chain: it matches nothing.\n }\n }\n if ((filter?.addresses?.length ?? 0) === 0) return txs;\n return txs.filter(\n (tx) =>\n tx.transfers.some((t) => watched.has(t.to)) ||\n ((tx.details.signers as readonly string[] | undefined) ?? []).some((s) =>\n watched.has(s),\n ),\n );\n },\n };\n}\n"]}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Avalanche addresses, point reads, observation, address history and
3
+ * `ext.avalanche.listUnspent`. Every call carries the tags of the `ChainDriver` contract
4
+ * table: `read` for point queries, `monitor` for heights and observations.
5
+ *
6
+ * Observation: the X-Chain has no mempool view (its `getTxStatus` is deprecated and only
7
+ * reports accepted or unknown), so a transaction is in a block once the node holds it and
8
+ * unknown before. The P-Chain also reports its mempool (`Processing`) and an aborted
9
+ * proposal. An accepted transaction whose block is not located yet reads as `mempool`: it
10
+ * is known to the network, and the next look finds its block. An X-Chain transaction from
11
+ * before the linearization (April 2023) has no block and reads as not seen.
12
+ */
13
+ import type { AddressCodec, AddressHistorySource, ChainReader, DriverBlock } from '../../core/driver/types';
14
+ import type { AssetRef } from '../../core/model/asset';
15
+ import type { NodeBlock } from './api';
16
+ import { type ParsedUtxo } from './codec';
17
+ import { type AvalancheContext } from './context';
18
+ import type { AvalancheCallTags, AvalancheUnspent } from './types';
19
+ export declare function assertNative(asset: AssetRef): void;
20
+ export declare function addressCodec(ctx: AvalancheContext): AddressCodec;
21
+ export declare const toDriverBlock: (block: NodeBlock) => DriverBlock;
22
+ /** Every output `address` owns on this chain, parsed (the node's UTXO set). */
23
+ export declare function ownedUtxos(ctx: AvalancheContext, address: string, tags: AvalancheCallTags): Promise<ParsedUtxo[]>;
24
+ /**
25
+ * The outputs a transfer from `address` may spend, largest first (fewest inputs, so the
26
+ * lowest P-Chain fee), each id once; `exclude` leaves out those held by live Operations.
27
+ */
28
+ export declare function spendable(ctx: AvalancheContext, address: string, exclude: readonly string[] | undefined, signal?: AbortSignal): Promise<ParsedUtxo[]>;
29
+ /** `ext.avalanche.listUnspent`: every owned output, largest first. */
30
+ export declare function listUnspent(ctx: AvalancheContext, address: string): Promise<AvalancheUnspent[]>;
31
+ export declare function chainReader(ctx: AvalancheContext): ChainReader;
32
+ /**
33
+ * Address history from the Data API, newest first; the cursor is its page token. Each
34
+ * transaction's bytes come from the node (they authenticate themselves by their id) and are
35
+ * decoded here; one that pays the address nothing and that it did not sign is left out
36
+ * (a server that dropped its filter never lists another address's), and
37
+ * every listed transaction counts toward `limit`, so paging stays bounded. An X-Chain
38
+ * transaction from before its linearization has no block, so it reads as not seen.
39
+ */
40
+ export declare function addressHistory(ctx: AvalancheContext): AddressHistorySource;
@@ -0,0 +1,231 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.toDriverBlock = void 0;
4
+ exports.assertNative = assertNative;
5
+ exports.addressCodec = addressCodec;
6
+ exports.ownedUtxos = ownedUtxos;
7
+ exports.spendable = spendable;
8
+ exports.listUnspent = listUnspent;
9
+ exports.chainReader = chainReader;
10
+ exports.addressHistory = addressHistory;
11
+ const error_1 = require("../../core/errors/error");
12
+ const address_1 = require("./address");
13
+ const cb58_1 = require("./cb58");
14
+ const codec_1 = require("./codec");
15
+ const context_1 = require("./context");
16
+ const decode_1 = require("./decode");
17
+ /** The Data API serves at most 100 transactions per page. */
18
+ const HISTORY_PAGE = 100;
19
+ const PAGE_TOKEN = /^[A-Za-z0-9_-]{1,256}$/;
20
+ const MAX_HEIGHT = BigInt(Number.MAX_SAFE_INTEGER);
21
+ function assertNative(asset) {
22
+ if (asset !== 'native') {
23
+ throw new error_1.UnsupportedCapabilityError('UNSUPPORTED_CAPABILITY', 'only AVAX can be sent or read on the X-Chain and P-Chain here; Avalanche native tokens are not supported');
24
+ }
25
+ }
26
+ function addressCodec(ctx) {
27
+ const { config } = ctx;
28
+ return {
29
+ validate: (address) => {
30
+ try {
31
+ (0, address_1.decodeAddress)(address, config);
32
+ return true;
33
+ }
34
+ catch {
35
+ return false;
36
+ }
37
+ },
38
+ normalize: (address) => (0, address_1.normalizeAddress)(address, config),
39
+ fromPublicKey: (publicKey) => {
40
+ const canonical = (0, address_1.formatAddress)((0, address_1.addressBytesOf)(publicKey), config);
41
+ return { canonical, display: canonical };
42
+ },
43
+ };
44
+ }
45
+ const toDriverBlock = (block) => ({
46
+ height: block.height,
47
+ hash: block.id,
48
+ parentHash: block.parentId,
49
+ ...(block.timestamp !== undefined ? { timestamp: block.timestamp } : {}),
50
+ transactionIds: block.txIds,
51
+ });
52
+ exports.toDriverBlock = toDriverBlock;
53
+ /** Every output `address` owns on this chain, parsed (the node's UTXO set). */
54
+ async function ownedUtxos(ctx, address, tags) {
55
+ const canonical = (0, address_1.normalizeAddress)(address, ctx.config).canonical;
56
+ const listed = await ctx.node.utxos(canonical, tags);
57
+ return listed.map((bytes) => (0, codec_1.parseUtxo)(bytes, ctx.config));
58
+ }
59
+ /**
60
+ * The outputs a transfer from `address` may spend, largest first (fewest inputs, so the
61
+ * lowest P-Chain fee), each id once; `exclude` leaves out those held by live Operations.
62
+ */
63
+ async function spendable(ctx, address, exclude, signal) {
64
+ const from = (0, address_1.decodeAddress)(address, ctx.config);
65
+ const held = new Set(exclude ?? []);
66
+ const owned = await ownedUtxos(ctx, address, (0, context_1.withSignal)(context_1.READ, signal));
67
+ return owned
68
+ .filter((utxo) => !held.has(utxo.utxoId) && (0, codec_1.spendableBy)(utxo, from, ctx.config))
69
+ .sort((a, b) => a.amount === b.amount
70
+ ? a.utxoId < b.utxoId
71
+ ? -1
72
+ : 1
73
+ : a.amount > b.amount
74
+ ? -1
75
+ : 1);
76
+ }
77
+ /** `ext.avalanche.listUnspent`: every owned output, largest first. */
78
+ async function listUnspent(ctx, address) {
79
+ const from = (0, address_1.decodeAddress)(address, ctx.config);
80
+ const owned = await ownedUtxos(ctx, address, context_1.READ);
81
+ return owned
82
+ .map((utxo) => ({
83
+ utxoId: utxo.utxoId,
84
+ txId: utxo.txId,
85
+ outputIndex: utxo.outputIndex,
86
+ assetId: utxo.assetId,
87
+ amount: utxo.amount,
88
+ locktime: utxo.locktime,
89
+ threshold: utxo.threshold,
90
+ spendable: (0, codec_1.spendableBy)(utxo, from, ctx.config),
91
+ }))
92
+ .sort((a, b) => a.amount === b.amount
93
+ ? a.utxoId < b.utxoId
94
+ ? -1
95
+ : 1
96
+ : a.amount > b.amount
97
+ ? -1
98
+ : 1);
99
+ }
100
+ /** What a located, accepted transaction looks like to the core. */
101
+ async function inBlock(ctx, txId, status, tags) {
102
+ const location = await (0, context_1.locate)(ctx, txId, tags);
103
+ // Accepted before the X-Chain had blocks: final, but there is no block to name.
104
+ if (location === 'no-block')
105
+ return { seen: 'none' };
106
+ if (!location)
107
+ return { seen: 'mempool', txHash: txId };
108
+ return {
109
+ seen: 'block',
110
+ txHash: txId,
111
+ blockHeight: location.height,
112
+ blockHash: location.hash,
113
+ success: status === 'accepted',
114
+ ...(status === 'aborted' ? { reason: 'the transaction was aborted' } : {}),
115
+ };
116
+ }
117
+ /**
118
+ * The node's view of `txId` and, once accepted, its block. X-Chain: accepted when the node
119
+ * holds it (`present`), else not seen. P-Chain: from `platform.getTxStatus`.
120
+ */
121
+ async function observeId(ctx, txId, tags, present) {
122
+ if (ctx.config.vm === 'avm') {
123
+ const accepted = present ?? (await ctx.node.txBytes(txId, tags)) !== null;
124
+ return accepted ? inBlock(ctx, txId, 'accepted', tags) : { seen: 'none' };
125
+ }
126
+ const status = await ctx.node.txStatus(txId, tags);
127
+ switch (status) {
128
+ case 'Committed':
129
+ return inBlock(ctx, txId, 'accepted', tags);
130
+ case 'Aborted':
131
+ return inBlock(ctx, txId, 'aborted', tags);
132
+ case 'Processing':
133
+ return { seen: 'mempool', txHash: txId };
134
+ default:
135
+ // Dropped (the node's mempool refused it) or Unknown: not seen.
136
+ return { seen: 'none' };
137
+ }
138
+ }
139
+ function chainReader(ctx) {
140
+ const { node } = ctx;
141
+ return {
142
+ getBalance: async (address, asset) => {
143
+ assertNative(asset);
144
+ const utxos = await spendable(ctx, address, undefined);
145
+ return utxos.reduce((sum, utxo) => sum + utxo.amount, 0n);
146
+ },
147
+ getBlockHeight: () => node.height(context_1.MONITOR),
148
+ // Snowman: an accepted block is final; N confirmations trail the head by N − 1.
149
+ getFinalizedHeight: async () => {
150
+ const height = (await node.height(context_1.MONITOR)) - BigInt(ctx.config.confirmations) + 1n;
151
+ return height < 0n ? 0n : height;
152
+ },
153
+ getBlock: async (ref) => {
154
+ if (typeof ref === 'string') {
155
+ // A malformed id never reaches the node.
156
+ const block = (0, cb58_1.isId)(ref) ? await node.blockById(ref, context_1.READ) : null;
157
+ return block ? (0, exports.toDriverBlock)(block) : null;
158
+ }
159
+ if (ref < 0n || ref > MAX_HEIGHT)
160
+ return null;
161
+ const block = await node.blockAt(ref, context_1.READ);
162
+ return block ? (0, exports.toDriverBlock)(block) : null;
163
+ },
164
+ getTransaction: async (id) => {
165
+ if (!(0, cb58_1.isId)(id))
166
+ return null; // a malformed id never reaches the node
167
+ const bytes = await node.txBytes(id, context_1.READ);
168
+ if (!bytes)
169
+ return null;
170
+ const observation = await observeId(ctx, id, context_1.READ, true);
171
+ return (0, decode_1.decodeTransaction)(bytes, ctx.config, observation);
172
+ },
173
+ // As on a proof path, a refusal on any of these reads decides nothing (retryable).
174
+ observe: async (ref) => (0, cb58_1.isId)(ref.id) ? (0, context_1.proofRead)(() => observeId(ctx, ref.id, context_1.MONITOR)) : { seen: 'none' },
175
+ };
176
+ }
177
+ /**
178
+ * Address history from the Data API, newest first; the cursor is its page token. Each
179
+ * transaction's bytes come from the node (they authenticate themselves by their id) and are
180
+ * decoded here; one that pays the address nothing and that it did not sign is left out
181
+ * (a server that dropped its filter never lists another address's), and
182
+ * every listed transaction counts toward `limit`, so paging stays bounded. An X-Chain
183
+ * transaction from before its linearization has no block, so it reads as not seen.
184
+ */
185
+ function addressHistory(ctx) {
186
+ return {
187
+ async list(address, { cursor, limit }) {
188
+ if (!Number.isSafeInteger(limit) || limit < 1) {
189
+ throw new error_1.ValidationError('INVALID_INTENT', 'limit must be a positive integer');
190
+ }
191
+ if (cursor !== undefined && !PAGE_TOKEN.test(cursor)) {
192
+ throw new error_1.ValidationError('INVALID_INTENT', 'malformed history cursor');
193
+ }
194
+ const canonical = (0, address_1.normalizeAddress)(address, ctx.config).canonical;
195
+ const items = [];
196
+ let served = 0;
197
+ let next = cursor;
198
+ do {
199
+ const page = await ctx.dataApi.history(canonical, {
200
+ ...(next !== undefined ? { cursor: next } : {}),
201
+ pageSize: Math.min(HISTORY_PAGE, limit - served),
202
+ }, context_1.READ);
203
+ for (const entry of page.items) {
204
+ const bytes = await ctx.node.txBytes(entry.txId, context_1.READ);
205
+ if (!bytes) {
206
+ throw (0, context_1.contradiction)('the indexer lists a transaction the node does not have');
207
+ }
208
+ const observation = entry.location
209
+ ? {
210
+ seen: 'block',
211
+ txHash: entry.txId,
212
+ blockHeight: entry.location.height,
213
+ blockHash: entry.location.hash,
214
+ success: true,
215
+ }
216
+ : { seen: 'none' };
217
+ const tx = (0, decode_1.decodeTransaction)(bytes, ctx.config, observation);
218
+ const signers = tx.details.signers;
219
+ const touches = tx.transfers.some((t) => t.to === canonical) ||
220
+ (signers ?? []).includes(canonical);
221
+ if (touches)
222
+ items.push(tx);
223
+ served++;
224
+ }
225
+ next = page.next;
226
+ } while (served < limit && next !== undefined);
227
+ return { items, ...(next !== undefined ? { next } : {}) };
228
+ },
229
+ };
230
+ }
231
+ //# sourceMappingURL=reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reader.js","sourceRoot":"","sources":["../../../src/adapters/avalanche/reader.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Avalanche addresses, point reads, observation, address history and\n * `ext.avalanche.listUnspent`. Every call carries the tags of the `ChainDriver` contract\n * table: `read` for point queries, `monitor` for heights and observations.\n *\n * Observation: the X-Chain has no mempool view (its `getTxStatus` is deprecated and only\n * reports accepted or unknown), so a transaction is in a block once the node holds it and\n * unknown before. The P-Chain also reports its mempool (`Processing`) and an aborted\n * proposal. An accepted transaction whose block is not located yet reads as `mempool`: it\n * is known to the network, and the next look finds its block. An X-Chain transaction from\n * before the linearization (April 2023) has no block and reads as not seen.\n */\nimport type {\n AddressCodec,\n AddressHistorySource,\n ChainReader,\n DriverBlock,\n DriverTransaction,\n DriverTxObservation,\n} from '../../core/driver/types';\nimport { UnsupportedCapabilityError, ValidationError } from '../../core/errors/error';\nimport type { AssetRef } from '../../core/model/asset';\nimport {\n addressBytesOf,\n decodeAddress,\n formatAddress,\n normalizeAddress,\n} from './address';\nimport type { NodeBlock, PlatformStatus } from './api';\nimport { isId } from './cb58';\nimport { parseUtxo, spendableBy, type ParsedUtxo } from './codec';\nimport {\n MONITOR,\n READ,\n contradiction,\n locate,\n proofRead,\n withSignal,\n type AvalancheContext,\n} from './context';\nimport { decodeTransaction } from './decode';\nimport type { AvalancheCallTags, AvalancheUnspent } from './types';\n\n/** The Data API serves at most 100 transactions per page. */\nconst HISTORY_PAGE = 100;\nconst PAGE_TOKEN = /^[A-Za-z0-9_-]{1,256}$/;\nconst MAX_HEIGHT = BigInt(Number.MAX_SAFE_INTEGER);\n\nexport function assertNative(asset: AssetRef): void {\n if (asset !== 'native') {\n throw new UnsupportedCapabilityError(\n 'UNSUPPORTED_CAPABILITY',\n 'only AVAX can be sent or read on the X-Chain and P-Chain here; Avalanche native tokens are not supported',\n );\n }\n}\n\nexport function addressCodec(ctx: AvalancheContext): AddressCodec {\n const { config } = ctx;\n return {\n validate: (address) => {\n try {\n decodeAddress(address, config);\n return true;\n } catch {\n return false;\n }\n },\n normalize: (address) => normalizeAddress(address, config),\n fromPublicKey: (publicKey) => {\n const canonical = formatAddress(addressBytesOf(publicKey), config);\n return { canonical, display: canonical };\n },\n };\n}\n\nexport const toDriverBlock = (block: NodeBlock): DriverBlock => ({\n height: block.height,\n hash: block.id,\n parentHash: block.parentId,\n ...(block.timestamp !== undefined ? { timestamp: block.timestamp } : {}),\n transactionIds: block.txIds,\n});\n\n/** Every output `address` owns on this chain, parsed (the node's UTXO set). */\nexport async function ownedUtxos(\n ctx: AvalancheContext,\n address: string,\n tags: AvalancheCallTags,\n): Promise<ParsedUtxo[]> {\n const canonical = normalizeAddress(address, ctx.config).canonical;\n const listed = await ctx.node.utxos(canonical, tags);\n return listed.map((bytes) => parseUtxo(bytes, ctx.config));\n}\n\n/**\n * The outputs a transfer from `address` may spend, largest first (fewest inputs, so the\n * lowest P-Chain fee), each id once; `exclude` leaves out those held by live Operations.\n */\nexport async function spendable(\n ctx: AvalancheContext,\n address: string,\n exclude: readonly string[] | undefined,\n signal?: AbortSignal,\n): Promise<ParsedUtxo[]> {\n const from = decodeAddress(address, ctx.config);\n const held = new Set(exclude ?? []);\n const owned = await ownedUtxos(ctx, address, withSignal(READ, signal));\n return owned\n .filter((utxo) => !held.has(utxo.utxoId) && spendableBy(utxo, from, ctx.config))\n .sort((a, b) =>\n a.amount === b.amount\n ? a.utxoId < b.utxoId\n ? -1\n : 1\n : a.amount > b.amount\n ? -1\n : 1,\n );\n}\n\n/** `ext.avalanche.listUnspent`: every owned output, largest first. */\nexport async function listUnspent(\n ctx: AvalancheContext,\n address: string,\n): Promise<AvalancheUnspent[]> {\n const from = decodeAddress(address, ctx.config);\n const owned = await ownedUtxos(ctx, address, READ);\n return owned\n .map((utxo) => ({\n utxoId: utxo.utxoId,\n txId: utxo.txId,\n outputIndex: utxo.outputIndex,\n assetId: utxo.assetId,\n amount: utxo.amount,\n locktime: utxo.locktime,\n threshold: utxo.threshold,\n spendable: spendableBy(utxo, from, ctx.config),\n }))\n .sort((a, b) =>\n a.amount === b.amount\n ? a.utxoId < b.utxoId\n ? -1\n : 1\n : a.amount > b.amount\n ? -1\n : 1,\n );\n}\n\n/** What a located, accepted transaction looks like to the core. */\nasync function inBlock(\n ctx: AvalancheContext,\n txId: string,\n status: 'accepted' | 'aborted',\n tags: AvalancheCallTags,\n): Promise<DriverTxObservation> {\n const location = await locate(ctx, txId, tags);\n // Accepted before the X-Chain had blocks: final, but there is no block to name.\n if (location === 'no-block') return { seen: 'none' };\n if (!location) return { seen: 'mempool', txHash: txId };\n return {\n seen: 'block',\n txHash: txId,\n blockHeight: location.height,\n blockHash: location.hash,\n success: status === 'accepted',\n ...(status === 'aborted' ? { reason: 'the transaction was aborted' } : {}),\n };\n}\n\n/**\n * The node's view of `txId` and, once accepted, its block. X-Chain: accepted when the node\n * holds it (`present`), else not seen. P-Chain: from `platform.getTxStatus`.\n */\nasync function observeId(\n ctx: AvalancheContext,\n txId: string,\n tags: AvalancheCallTags,\n present?: boolean,\n): Promise<DriverTxObservation> {\n if (ctx.config.vm === 'avm') {\n const accepted = present ?? (await ctx.node.txBytes(txId, tags)) !== null;\n return accepted ? inBlock(ctx, txId, 'accepted', tags) : { seen: 'none' };\n }\n const status: PlatformStatus = await ctx.node.txStatus(txId, tags);\n switch (status) {\n case 'Committed':\n return inBlock(ctx, txId, 'accepted', tags);\n case 'Aborted':\n return inBlock(ctx, txId, 'aborted', tags);\n case 'Processing':\n return { seen: 'mempool', txHash: txId };\n default:\n // Dropped (the node's mempool refused it) or Unknown: not seen.\n return { seen: 'none' };\n }\n}\n\nexport function chainReader(ctx: AvalancheContext): ChainReader {\n const { node } = ctx;\n return {\n getBalance: async (address, asset) => {\n assertNative(asset);\n const utxos = await spendable(ctx, address, undefined);\n return utxos.reduce((sum, utxo) => sum + utxo.amount, 0n);\n },\n getBlockHeight: () => node.height(MONITOR),\n // Snowman: an accepted block is final; N confirmations trail the head by N − 1.\n getFinalizedHeight: async () => {\n const height = (await node.height(MONITOR)) - BigInt(ctx.config.confirmations) + 1n;\n return height < 0n ? 0n : height;\n },\n getBlock: async (ref) => {\n if (typeof ref === 'string') {\n // A malformed id never reaches the node.\n const block = isId(ref) ? await node.blockById(ref, READ) : null;\n return block ? toDriverBlock(block) : null;\n }\n if (ref < 0n || ref > MAX_HEIGHT) return null;\n const block = await node.blockAt(ref, READ);\n return block ? toDriverBlock(block) : null;\n },\n getTransaction: async (id) => {\n if (!isId(id)) return null; // a malformed id never reaches the node\n const bytes = await node.txBytes(id, READ);\n if (!bytes) return null;\n const observation = await observeId(ctx, id, READ, true);\n return decodeTransaction(bytes, ctx.config, observation);\n },\n // As on a proof path, a refusal on any of these reads decides nothing (retryable).\n observe: async (ref) =>\n isId(ref.id) ? proofRead(() => observeId(ctx, ref.id, MONITOR)) : { seen: 'none' },\n };\n}\n\n/**\n * Address history from the Data API, newest first; the cursor is its page token. Each\n * transaction's bytes come from the node (they authenticate themselves by their id) and are\n * decoded here; one that pays the address nothing and that it did not sign is left out\n * (a server that dropped its filter never lists another address's), and\n * every listed transaction counts toward `limit`, so paging stays bounded. An X-Chain\n * transaction from before its linearization has no block, so it reads as not seen.\n */\nexport function addressHistory(ctx: AvalancheContext): AddressHistorySource {\n return {\n async list(address, { cursor, limit }) {\n if (!Number.isSafeInteger(limit) || limit < 1) {\n throw new ValidationError('INVALID_INTENT', 'limit must be a positive integer');\n }\n if (cursor !== undefined && !PAGE_TOKEN.test(cursor)) {\n throw new ValidationError('INVALID_INTENT', 'malformed history cursor');\n }\n const canonical = normalizeAddress(address, ctx.config).canonical;\n const items: DriverTransaction[] = [];\n let served = 0;\n let next = cursor;\n do {\n const page = await ctx.dataApi.history(\n canonical,\n {\n ...(next !== undefined ? { cursor: next } : {}),\n pageSize: Math.min(HISTORY_PAGE, limit - served),\n },\n READ,\n );\n for (const entry of page.items) {\n const bytes = await ctx.node.txBytes(entry.txId, READ);\n if (!bytes) {\n throw contradiction('the indexer lists a transaction the node does not have');\n }\n const observation: DriverTxObservation = entry.location\n ? {\n seen: 'block',\n txHash: entry.txId,\n blockHeight: entry.location.height,\n blockHash: entry.location.hash,\n success: true,\n }\n : { seen: 'none' };\n const tx = decodeTransaction(bytes, ctx.config, observation);\n const signers = tx.details.signers as readonly string[] | undefined;\n const touches =\n tx.transfers.some((t) => t.to === canonical) ||\n (signers ?? []).includes(canonical);\n if (touches) items.push(tx);\n served++;\n }\n next = page.next;\n } while (served < limit && next !== undefined);\n return { items, ...(next !== undefined ? { next } : {}) };\n },\n };\n}\n"]}