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 @@
1
+ {"version":3,"file":"reservations.js","sourceRoot":"","sources":["../../../src/core/ordering/reservations.ts"],"names":[],"mappings":";;AAMA,wCAiBC;AAGD,kCAWC;AAMD,wDAWC;AAtDD,0CAAkE;AAElE;;;GAGG;AACH,SAAgB,cAAc,CAC5B,UAAsC,EACtC,QAAiB;IAEjB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,EAAE,CAAC,EAAE,KAAK,QAAQ,IAAI,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC;YAAE,SAAS;QACzD,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,QAAQ;YACnC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/D,IAAI,EAAE,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,KAAK,QAAQ;YACzC,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM;gBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACrE,KAAK,MAAM,OAAO,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;YAClC,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,KAAK,QAAQ;gBACpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM;oBAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AAC5B,CAAC;AAED,qGAAqG;AACrG,SAAgB,WAAW,CACzB,UAAsC,EACtC,QAAiB;IAEjB,OAAO,UAAU,CAAC,IAAI,CACpB,CAAC,EAAE,EAAE,EAAE,CACL,EAAE,CAAC,EAAE,KAAK,QAAQ;QAClB,CAAC,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC;QACrB,EAAE,CAAC,KAAK,KAAK,UAAU;QACvB,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO,CACnC,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,UAAsC;IAEtC,IAAI,MAA0D,CAAC;IAC/D,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAA,kBAAU,EAAC,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,KAAK,KAAK,UAAU;YAAE,SAAS;QAC9D,IAAI,EAAE,CAAC,WAAW,EAAE,IAAI,KAAK,OAAO;YAAE,SAAS;QAC/C,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC,WAAW,CAAC,KAAK,GAAG,MAAM,CAAC,KAAK;YAChD,MAAM,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;IACjE,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { isTerminal, type OperationRecord } from '../store/types';\n\n/**\n * Inputs held by live Operations: their reservation, unsigned payload and every Attempt.\n * Coin selection excludes them, so two Operations of a wallet never pick the same coin.\n */\nexport function reservedInputs(\n operations: readonly OperationRecord[],\n exceptId?: string,\n): string[] {\n const inputs = new Set<string>();\n for (const op of operations) {\n if (op.id === exceptId || isTerminal(op.state)) continue;\n if (op.reservation?.kind === 'inputs')\n for (const input of op.reservation.inputs) inputs.add(input);\n if (op.unsigned?.ordering.kind === 'inputs')\n for (const input of op.unsigned.ordering.inputs) inputs.add(input);\n for (const attempt of op.attempts) {\n if (attempt.ordering.kind === 'inputs')\n for (const input of attempt.ordering.inputs) inputs.add(input);\n }\n }\n return [...inputs].sort();\n}\n\n/** The live Operation that may still consume the wallet's current seqno (TON is strictly serial). */\nexport function seqnoHolder(\n operations: readonly OperationRecord[],\n exceptId?: string,\n): OperationRecord | undefined {\n return operations.find(\n (op) =>\n op.id !== exceptId &&\n !isTerminal(op.state) &&\n op.state !== 'included' &&\n op.reservation?.kind === 'seqno',\n );\n}\n\n/**\n * The lowest nonce still reserved by a live, not-yet-included Operation. Included\n * nonces are already consumed on chain, so counting them would mask a gap above them.\n */\nexport function lowestOutstandingNonce(\n operations: readonly OperationRecord[],\n): { nonce: bigint; operationId: string } | undefined {\n let lowest: { nonce: bigint; operationId: string } | undefined;\n for (const op of operations) {\n if (isTerminal(op.state) || op.state === 'included') continue;\n if (op.reservation?.kind !== 'nonce') continue;\n if (!lowest || op.reservation.nonce < lowest.nonce)\n lowest = { nonce: op.reservation.nonce, operationId: op.id };\n }\n return lowest;\n}\n"]}
@@ -0,0 +1,61 @@
1
+ import type { Lease, LockManager, SequenceStore } from '../store/types';
2
+ import type { Clock } from '../util/clock';
3
+ export declare function sequenceKey(namespace: string, chain: string, network: string, address: string): string;
4
+ /** A held lease that can be renewed; renewal failure means another worker took over. */
5
+ export declare class LeaseHandle {
6
+ #private;
7
+ private readonly locks;
8
+ private readonly ttlMs;
9
+ constructor(locks: LockManager, ttlMs: number, lease: Lease);
10
+ get current(): Lease;
11
+ renew(): Promise<void>;
12
+ }
13
+ export interface SequenceCoordinatorDeps {
14
+ readonly locks: LockManager;
15
+ readonly sequences: SequenceStore;
16
+ readonly clock: Clock;
17
+ readonly owner: string;
18
+ readonly leaseMs: number;
19
+ /** How long to wait for a busy address before failing with SEQUENCE_BUSY (default: leaseMs). */
20
+ readonly acquireTimeoutMs?: number;
21
+ /**
22
+ * Observes a failed best-effort lease release (the lease then lapses by its TTL).
23
+ * Its own failure is ignored. Log only the error code: messages may carry store detail.
24
+ */
25
+ onReleaseError?(error: unknown): void;
26
+ }
27
+ export declare class SequenceCoordinator {
28
+ #private;
29
+ private readonly deps;
30
+ constructor(deps: SequenceCoordinatorDeps);
31
+ /**
32
+ * Runs `fn` while holding the address lease for `key`, then releases it.
33
+ *
34
+ * Not re-entrant: a nested `withLease` on the same key waits like any other caller.
35
+ * It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter
36
+ * than `leaseMs`, it can outlive the outer lease, take it over and fence the outer
37
+ * caller. Code that already holds the lease must pass its `LeaseHandle` down instead.
38
+ * The lease is not renewed automatically; long callbacks call `lease.renew()`.
39
+ * `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).
40
+ */
41
+ withLease<T>(key: string, fn: (lease: LeaseHandle) => Promise<T>, signal?: AbortSignal, options?: {
42
+ readonly acquireTimeoutMs?: number;
43
+ }): Promise<T>;
44
+ allocate(lease: LeaseHandle, key: string, chainPending: bigint): Promise<bigint>;
45
+ /**
46
+ * Returns a reserved value for reuse. Only legal while no valid signed bytes exist for
47
+ * it. Precondition: called at most once per allocation, by the Operation holding the
48
+ * value, after its terminal CAS or after a failure before its reservation was persisted.
49
+ * Releasing a value that is at or above `next`, or already released, is a no-op.
50
+ */
51
+ release(lease: LeaseHandle, key: string, value: bigint): Promise<void>;
52
+ /**
53
+ * Nonce reconciliation: returns to `released` every value in [chainPending, next) that is
54
+ * neither released already nor in `reserved`, and returns those values (ascending). It
55
+ * never touches a value below `chainPending` (the chain consumed it) or at or above
56
+ * `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live
57
+ * Operations hold) under it, so no allocation can interleave; nothing is written when
58
+ * there is nothing to reclaim.
59
+ */
60
+ reclaim(lease: LeaseHandle, key: string, chainPending: bigint, reserved: readonly bigint[]): Promise<bigint[]>;
61
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SequenceCoordinator = exports.LeaseHandle = void 0;
4
+ exports.sequenceKey = sequenceKey;
5
+ const error_1 = require("../errors/error");
6
+ function sequenceKey(namespace, chain, network, address) {
7
+ return `seq:${namespace}:${chain}:${network}:${address}`;
8
+ }
9
+ const byValue = (a, b) => (a < b ? -1 : a > b ? 1 : 0);
10
+ /** A held lease that can be renewed; renewal failure means another worker took over. */
11
+ class LeaseHandle {
12
+ locks;
13
+ ttlMs;
14
+ #lease;
15
+ constructor(locks, ttlMs, lease) {
16
+ this.locks = locks;
17
+ this.ttlMs = ttlMs;
18
+ this.#lease = lease;
19
+ }
20
+ get current() {
21
+ return this.#lease;
22
+ }
23
+ async renew() {
24
+ const renewed = await this.locks.renew(this.#lease, this.ttlMs);
25
+ if (!renewed)
26
+ throw new error_1.StateError('FENCING', 'the address lease was lost to another worker');
27
+ this.#lease = renewed;
28
+ }
29
+ }
30
+ exports.LeaseHandle = LeaseHandle;
31
+ /**
32
+ * Lease tokens increase per key only, so a lease for another key cannot fence this one.
33
+ * Messages omit the key: it embeds the wallet address, and error messages reach logs.
34
+ */
35
+ function fenceFor(lease, key) {
36
+ const { key: leased, token } = lease.current;
37
+ if (leased !== key) {
38
+ throw new error_1.StateError('FENCING', 'a lease for another address cannot write this sequence');
39
+ }
40
+ return token;
41
+ }
42
+ class SequenceCoordinator {
43
+ deps;
44
+ constructor(deps) {
45
+ this.deps = deps;
46
+ }
47
+ /**
48
+ * Runs `fn` while holding the address lease for `key`, then releases it.
49
+ *
50
+ * Not re-entrant: a nested `withLease` on the same key waits like any other caller.
51
+ * It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter
52
+ * than `leaseMs`, it can outlive the outer lease, take it over and fence the outer
53
+ * caller. Code that already holds the lease must pass its `LeaseHandle` down instead.
54
+ * The lease is not renewed automatically; long callbacks call `lease.renew()`.
55
+ * `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).
56
+ */
57
+ async withLease(key, fn, signal, options = {}) {
58
+ signal?.throwIfAborted();
59
+ const deadline = this.deps.clock.now() +
60
+ (options.acquireTimeoutMs ?? this.deps.acquireTimeoutMs ?? this.deps.leaseMs);
61
+ let lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);
62
+ while (!lease) {
63
+ if (this.deps.clock.now() >= deadline) {
64
+ throw new error_1.StateError('SEQUENCE_BUSY', 'the address lease is held by another operation', { retryable: true });
65
+ }
66
+ await this.deps.clock.sleep(25, signal);
67
+ lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);
68
+ }
69
+ const handle = new LeaseHandle(this.deps.locks, this.deps.leaseMs, lease);
70
+ try {
71
+ return await fn(handle);
72
+ }
73
+ finally {
74
+ // Best effort: a failed release must not replace the callback's outcome (for
75
+ // example a completed broadcast). The lease then lapses by its TTL, and fencing
76
+ // still guards every write.
77
+ await this.#release(handle.current);
78
+ }
79
+ }
80
+ /**
81
+ * A release that throws, synchronously or not, is reported and absorbed, and so
82
+ * is the observer's own failure, including an async observer's rejection.
83
+ */
84
+ async #release(lease) {
85
+ try {
86
+ await this.deps.locks.release(lease);
87
+ }
88
+ catch (error) {
89
+ try {
90
+ const observed = this.deps.onReleaseError?.(error);
91
+ if (typeof observed?.then === 'function') {
92
+ Promise.resolve(observed).catch(() => undefined);
93
+ }
94
+ }
95
+ catch {
96
+ // An observer failure must not replace the outcome either.
97
+ }
98
+ }
99
+ }
100
+ async allocate(lease, key, chainPending) {
101
+ const fence = fenceFor(lease, key);
102
+ const state = await this.deps.sequences.get(key);
103
+ const released = [...(state?.released ?? [])]
104
+ .filter((n) => n >= chainPending)
105
+ .sort(byValue);
106
+ const floor = state && state.next > chainPending ? state.next : chainPending;
107
+ const pick = released[0] ?? floor;
108
+ const next = pick >= floor ? pick + 1n : floor;
109
+ await this.deps.sequences.put(key, { next, released: released.filter((n) => n !== pick), fence }, state?.version ?? null);
110
+ return pick;
111
+ }
112
+ /**
113
+ * Returns a reserved value for reuse. Only legal while no valid signed bytes exist for
114
+ * it. Precondition: called at most once per allocation, by the Operation holding the
115
+ * value, after its terminal CAS or after a failure before its reservation was persisted.
116
+ * Releasing a value that is at or above `next`, or already released, is a no-op.
117
+ */
118
+ async release(lease, key, value) {
119
+ const fence = fenceFor(lease, key);
120
+ const state = await this.deps.sequences.get(key);
121
+ if (!state || value >= state.next || state.released.includes(value))
122
+ return;
123
+ await this.deps.sequences.put(key, { next: state.next, released: [...state.released, value].sort(byValue), fence }, state.version);
124
+ }
125
+ /**
126
+ * Nonce reconciliation: returns to `released` every value in [chainPending, next) that is
127
+ * neither released already nor in `reserved`, and returns those values (ascending). It
128
+ * never touches a value below `chainPending` (the chain consumed it) or at or above
129
+ * `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live
130
+ * Operations hold) under it, so no allocation can interleave; nothing is written when
131
+ * there is nothing to reclaim.
132
+ */
133
+ async reclaim(lease, key, chainPending, reserved) {
134
+ const fence = fenceFor(lease, key);
135
+ const state = await this.deps.sequences.get(key);
136
+ if (!state)
137
+ return [];
138
+ const held = new Set([...state.released, ...reserved]);
139
+ const reclaimed = [];
140
+ for (let value = chainPending; value < state.next; value++) {
141
+ if (!held.has(value))
142
+ reclaimed.push(value);
143
+ }
144
+ if (reclaimed.length === 0)
145
+ return [];
146
+ await this.deps.sequences.put(key, {
147
+ next: state.next,
148
+ released: [...state.released, ...reclaimed].sort(byValue),
149
+ fence,
150
+ }, state.version);
151
+ return reclaimed;
152
+ }
153
+ }
154
+ exports.SequenceCoordinator = SequenceCoordinator;
155
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../../src/core/ordering/sequence.ts"],"names":[],"mappings":"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","sourcesContent":["import { StateError } from '../errors/error';\nimport type { Lease, LockManager, SequenceStore } from '../store/types';\nimport type { Clock } from '../util/clock';\n\nexport function sequenceKey(\n namespace: string,\n chain: string,\n network: string,\n address: string,\n): string {\n return `seq:${namespace}:${chain}:${network}:${address}`;\n}\n\nconst byValue = (a: bigint, b: bigint): number => (a < b ? -1 : a > b ? 1 : 0);\n\n/** A held lease that can be renewed; renewal failure means another worker took over. */\nexport class LeaseHandle {\n #lease: Lease;\n\n constructor(\n private readonly locks: LockManager,\n private readonly ttlMs: number,\n lease: Lease,\n ) {\n this.#lease = lease;\n }\n\n get current(): Lease {\n return this.#lease;\n }\n\n async renew(): Promise<void> {\n const renewed = await this.locks.renew(this.#lease, this.ttlMs);\n if (!renewed)\n throw new StateError('FENCING', 'the address lease was lost to another worker');\n this.#lease = renewed;\n }\n}\n\n/**\n * Lease tokens increase per key only, so a lease for another key cannot fence this one.\n * Messages omit the key: it embeds the wallet address, and error messages reach logs.\n */\nfunction fenceFor(lease: LeaseHandle, key: string): bigint {\n const { key: leased, token } = lease.current;\n if (leased !== key) {\n throw new StateError(\n 'FENCING',\n 'a lease for another address cannot write this sequence',\n );\n }\n return token;\n}\n\nexport interface SequenceCoordinatorDeps {\n readonly locks: LockManager;\n readonly sequences: SequenceStore;\n readonly clock: Clock;\n readonly owner: string;\n readonly leaseMs: number;\n /** How long to wait for a busy address before failing with SEQUENCE_BUSY (default: leaseMs). */\n readonly acquireTimeoutMs?: number;\n /**\n * Observes a failed best-effort lease release (the lease then lapses by its TTL).\n * Its own failure is ignored. Log only the error code: messages may carry store detail.\n */\n onReleaseError?(error: unknown): void;\n}\n\nexport class SequenceCoordinator {\n constructor(private readonly deps: SequenceCoordinatorDeps) {}\n\n /**\n * Runs `fn` while holding the address lease for `key`, then releases it.\n *\n * Not re-entrant: a nested `withLease` on the same key waits like any other caller.\n * It fails with SEQUENCE_BUSY after `acquireTimeoutMs`, or, when that is not shorter\n * than `leaseMs`, it can outlive the outer lease, take it over and fence the outer\n * caller. Code that already holds the lease must pass its `LeaseHandle` down instead.\n * The lease is not renewed automatically; long callbacks call `lease.renew()`.\n * `options.acquireTimeoutMs` overrides the wait for this call (`0`: a single try).\n */\n async withLease<T>(\n key: string,\n fn: (lease: LeaseHandle) => Promise<T>,\n signal?: AbortSignal,\n options: { readonly acquireTimeoutMs?: number } = {},\n ): Promise<T> {\n signal?.throwIfAborted();\n const deadline =\n this.deps.clock.now() +\n (options.acquireTimeoutMs ?? this.deps.acquireTimeoutMs ?? this.deps.leaseMs);\n let lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);\n while (!lease) {\n if (this.deps.clock.now() >= deadline) {\n throw new StateError(\n 'SEQUENCE_BUSY',\n 'the address lease is held by another operation',\n { retryable: true },\n );\n }\n await this.deps.clock.sleep(25, signal);\n lease = await this.deps.locks.acquire(key, this.deps.owner, this.deps.leaseMs);\n }\n const handle = new LeaseHandle(this.deps.locks, this.deps.leaseMs, lease);\n try {\n return await fn(handle);\n } finally {\n // Best effort: a failed release must not replace the callback's outcome (for\n // example a completed broadcast). The lease then lapses by its TTL, and fencing\n // still guards every write.\n await this.#release(handle.current);\n }\n }\n\n /**\n * A release that throws, synchronously or not, is reported and absorbed, and so\n * is the observer's own failure, including an async observer's rejection.\n */\n async #release(lease: Lease): Promise<void> {\n try {\n await this.deps.locks.release(lease);\n } catch (error) {\n try {\n const observed: unknown = this.deps.onReleaseError?.(error);\n if (typeof (observed as { then?: unknown } | null)?.then === 'function') {\n Promise.resolve(observed).catch(() => undefined);\n }\n } catch {\n // An observer failure must not replace the outcome either.\n }\n }\n }\n\n async allocate(lease: LeaseHandle, key: string, chainPending: bigint): Promise<bigint> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n const released = [...(state?.released ?? [])]\n .filter((n) => n >= chainPending)\n .sort(byValue);\n const floor = state && state.next > chainPending ? state.next : chainPending;\n const pick = released[0] ?? floor;\n const next = pick >= floor ? pick + 1n : floor;\n await this.deps.sequences.put(\n key,\n { next, released: released.filter((n) => n !== pick), fence },\n state?.version ?? null,\n );\n return pick;\n }\n\n /**\n * Returns a reserved value for reuse. Only legal while no valid signed bytes exist for\n * it. Precondition: called at most once per allocation, by the Operation holding the\n * value, after its terminal CAS or after a failure before its reservation was persisted.\n * Releasing a value that is at or above `next`, or already released, is a no-op.\n */\n async release(lease: LeaseHandle, key: string, value: bigint): Promise<void> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n if (!state || value >= state.next || state.released.includes(value)) return;\n await this.deps.sequences.put(\n key,\n { next: state.next, released: [...state.released, value].sort(byValue), fence },\n state.version,\n );\n }\n\n /**\n * Nonce reconciliation: returns to `released` every value in [chainPending, next) that is\n * neither released already nor in `reserved`, and returns those values (ascending). It\n * never touches a value below `chainPending` (the chain consumed it) or at or above\n * `next` (never allocated). The caller holds `lease` and reads `reserved` (the values live\n * Operations hold) under it, so no allocation can interleave; nothing is written when\n * there is nothing to reclaim.\n */\n async reclaim(\n lease: LeaseHandle,\n key: string,\n chainPending: bigint,\n reserved: readonly bigint[],\n ): Promise<bigint[]> {\n const fence = fenceFor(lease, key);\n const state = await this.deps.sequences.get(key);\n if (!state) return [];\n const held = new Set([...state.released, ...reserved]);\n const reclaimed: bigint[] = [];\n for (let value = chainPending; value < state.next; value++) {\n if (!held.has(value)) reclaimed.push(value);\n }\n if (reclaimed.length === 0) return [];\n await this.deps.sequences.put(\n key,\n {\n next: state.next,\n released: [...state.released, ...reclaimed].sort(byValue),\n fence,\n },\n state.version,\n );\n return reclaimed;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { AdapterManifest, DriverFactory } from '../driver/types';
2
+ export declare class AdapterCatalog {
3
+ #private;
4
+ register(manifest: AdapterManifest): void;
5
+ /** Manifests for a chain in registration order; the first is the family default. */
6
+ forChain(chainId: string): AdapterManifest[];
7
+ get(chainId: string, library: string): AdapterManifest | undefined;
8
+ load(manifest: AdapterManifest): Promise<DriverFactory>;
9
+ clone(): AdapterCatalog;
10
+ }
@@ -0,0 +1,56 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AdapterCatalog = void 0;
4
+ const error_1 = require("../errors/error");
5
+ const keyOf = (m) => `${m.family}/${m.library}`;
6
+ function dependencyError(manifest, error) {
7
+ const code = error?.code;
8
+ if (code !== 'MODULE_NOT_FOUND' && code !== 'ERR_MODULE_NOT_FOUND')
9
+ return error;
10
+ const message = error instanceof Error ? error.message : String(error);
11
+ const deps = manifest.peerDependencies.filter((d) => message.includes(`'${d.name}'`) || message.includes(`"${d.name}"`));
12
+ // Only a missing peer dependency is the user's to install. Any other missing module
13
+ // (the adapter's own file, a broken build) keeps its own error.
14
+ if (deps.length === 0)
15
+ return error;
16
+ const install = deps.map((d) => `${d.name}@${d.range}`).join(' ');
17
+ return new error_1.ConfigError('DEPENDENCY_MISSING', `library '${manifest.library}' (${manifest.family}) needs ${deps.map((d) => d.name).join(', ')}; install it: npm i ${install}`, { cause: error, details: { packages: deps.map((d) => d.name) } });
18
+ }
19
+ class AdapterCatalog {
20
+ #manifests = new Map();
21
+ #loaded = new Map();
22
+ register(manifest) {
23
+ const key = keyOf(manifest);
24
+ if (this.#manifests.has(key)) {
25
+ throw new error_1.ConfigError('CONFIG_INVALID', `adapter '${key}' is already registered`);
26
+ }
27
+ this.#manifests.set(key, manifest);
28
+ }
29
+ /** Manifests for a chain in registration order; the first is the family default. */
30
+ forChain(chainId) {
31
+ return [...this.#manifests.values()].filter((m) => m.chains.includes(chainId));
32
+ }
33
+ get(chainId, library) {
34
+ return this.forChain(chainId).find((m) => m.library === library);
35
+ }
36
+ load(manifest) {
37
+ const key = keyOf(manifest);
38
+ let pending = this.#loaded.get(key);
39
+ if (!pending) {
40
+ pending = manifest.load().catch((error) => {
41
+ this.#loaded.delete(key);
42
+ throw dependencyError(manifest, error);
43
+ });
44
+ this.#loaded.set(key, pending);
45
+ }
46
+ return pending;
47
+ }
48
+ clone() {
49
+ const copy = new AdapterCatalog();
50
+ for (const [key, manifest] of this.#manifests)
51
+ copy.#manifests.set(key, manifest);
52
+ return copy;
53
+ }
54
+ }
55
+ exports.AdapterCatalog = AdapterCatalog;
56
+ //# sourceMappingURL=adapters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.js","sourceRoot":"","sources":["../../../src/core/registry/adapters.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AdapterManifest, DriverFactory } from '../driver/types';\nimport { ConfigError } from '../errors/error';\n\nconst keyOf = (m: AdapterManifest): string => `${m.family}/${m.library}`;\n\nfunction dependencyError(manifest: AdapterManifest, error: unknown): unknown {\n const code = (error as { code?: unknown } | null)?.code;\n if (code !== 'MODULE_NOT_FOUND' && code !== 'ERR_MODULE_NOT_FOUND') return error;\n const message = error instanceof Error ? error.message : String(error);\n const deps = manifest.peerDependencies.filter(\n (d) => message.includes(`'${d.name}'`) || message.includes(`\"${d.name}\"`),\n );\n // Only a missing peer dependency is the user's to install. Any other missing module\n // (the adapter's own file, a broken build) keeps its own error.\n if (deps.length === 0) return error;\n const install = deps.map((d) => `${d.name}@${d.range}`).join(' ');\n return new ConfigError(\n 'DEPENDENCY_MISSING',\n `library '${manifest.library}' (${manifest.family}) needs ${deps.map((d) => d.name).join(', ')}; install it: npm i ${install}`,\n { cause: error, details: { packages: deps.map((d) => d.name) } },\n );\n}\n\nexport class AdapterCatalog {\n readonly #manifests = new Map<string, AdapterManifest>();\n readonly #loaded = new Map<string, Promise<DriverFactory>>();\n\n register(manifest: AdapterManifest): void {\n const key = keyOf(manifest);\n if (this.#manifests.has(key)) {\n throw new ConfigError('CONFIG_INVALID', `adapter '${key}' is already registered`);\n }\n this.#manifests.set(key, manifest);\n }\n\n /** Manifests for a chain in registration order; the first is the family default. */\n forChain(chainId: string): AdapterManifest[] {\n return [...this.#manifests.values()].filter((m) => m.chains.includes(chainId));\n }\n\n get(chainId: string, library: string): AdapterManifest | undefined {\n return this.forChain(chainId).find((m) => m.library === library);\n }\n\n load(manifest: AdapterManifest): Promise<DriverFactory> {\n const key = keyOf(manifest);\n let pending = this.#loaded.get(key);\n if (!pending) {\n pending = manifest.load().catch((error: unknown) => {\n this.#loaded.delete(key);\n throw dependencyError(manifest, error);\n });\n this.#loaded.set(key, pending);\n }\n return pending;\n }\n\n clone(): AdapterCatalog {\n const copy = new AdapterCatalog();\n for (const [key, manifest] of this.#manifests) copy.#manifests.set(key, manifest);\n return copy;\n }\n}\n"]}
@@ -0,0 +1,18 @@
1
+ import { type AssetId, type AssetInfo, type AssetMetadata, type AssetRef } from '../model/asset';
2
+ import type { ChainInfo } from '../model/chain';
3
+ export interface AssetRegistration {
4
+ readonly chain: string;
5
+ readonly network: string;
6
+ readonly ref: AssetRef;
7
+ readonly metadata: AssetMetadata;
8
+ readonly aliases?: readonly string[];
9
+ }
10
+ export declare class AssetCatalog {
11
+ #private;
12
+ register(registration: AssetRegistration): AssetInfo;
13
+ registerNative(chain: ChainInfo): void;
14
+ get(id: AssetId): AssetInfo | undefined;
15
+ native(chain: string, network: string): AssetInfo;
16
+ resolveAlias(chain: string, network: string, alias: string): AssetInfo;
17
+ clone(): AssetCatalog;
18
+ }
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AssetCatalog = void 0;
4
+ const error_1 = require("../errors/error");
5
+ const asset_1 = require("../model/asset");
6
+ const names_1 = require("../util/names");
7
+ const ALIAS = /^[A-Z0-9._-]{1,32}$/;
8
+ class AssetCatalog {
9
+ #byId = new Map();
10
+ #aliases = new Map();
11
+ register(registration) {
12
+ const id = (0, asset_1.assetId)(registration.chain, registration.network, registration.ref);
13
+ const problem = (0, asset_1.metadataProblem)(registration.metadata);
14
+ if (problem)
15
+ throw new error_1.ConfigError('CONFIG_INVALID', `asset '${id}': ${problem}`);
16
+ const existing = this.#byId.get(id);
17
+ if (existing &&
18
+ (existing.metadata.symbol !== registration.metadata.symbol ||
19
+ existing.metadata.decimals !== registration.metadata.decimals)) {
20
+ throw new error_1.ConfigError('CONFIG_INVALID', `asset '${id}' is already registered with different metadata`);
21
+ }
22
+ const scopeKey = `${registration.chain}:${registration.network}`;
23
+ const scope = this.#aliases.get(scopeKey) ?? new Map();
24
+ const aliases = (registration.aliases ?? []).map((alias) => {
25
+ const normalized = alias.trim().toUpperCase();
26
+ if (!ALIAS.test(normalized)) {
27
+ throw new error_1.ConfigError('CONFIG_INVALID', `invalid asset alias '${alias}'`);
28
+ }
29
+ const owner = scope.get(normalized);
30
+ if (owner && owner !== id) {
31
+ throw new error_1.ConfigError('CONFIG_INVALID', `alias '${normalized}' on ${scopeKey} already refers to '${owner}'`);
32
+ }
33
+ return normalized;
34
+ });
35
+ const info = existing ??
36
+ Object.freeze({
37
+ id,
38
+ chain: registration.chain,
39
+ network: registration.network,
40
+ ref: registration.ref,
41
+ metadata: Object.freeze({ ...registration.metadata }),
42
+ });
43
+ this.#byId.set(id, info);
44
+ for (const alias of aliases)
45
+ scope.set(alias, id);
46
+ this.#aliases.set(scopeKey, scope);
47
+ return info;
48
+ }
49
+ registerNative(chain) {
50
+ for (const network of Object.keys(chain.networks)) {
51
+ this.register({
52
+ chain: chain.id,
53
+ network,
54
+ ref: 'native',
55
+ metadata: chain.nativeAsset,
56
+ aliases: [chain.nativeAsset.symbol],
57
+ });
58
+ }
59
+ }
60
+ get(id) {
61
+ return this.#byId.get(id);
62
+ }
63
+ native(chain, network) {
64
+ const info = this.#byId.get((0, asset_1.assetId)(chain, network, 'native'));
65
+ if (!info) {
66
+ throw new error_1.ValidationError('ASSET_RESOLUTION', `no native asset registered for ${chain}:${network}`);
67
+ }
68
+ return info;
69
+ }
70
+ resolveAlias(chain, network, alias) {
71
+ const scopeKey = `${chain}:${network}`;
72
+ const scope = this.#aliases.get(scopeKey);
73
+ const id = scope?.get(alias.trim().toUpperCase());
74
+ const info = id ? this.#byId.get(id) : undefined;
75
+ if (!info) {
76
+ throw new error_1.ValidationError('ASSET_RESOLUTION', (0, names_1.unknownName)(`asset alias on ${scopeKey}`, scope?.keys() ?? []));
77
+ }
78
+ return info;
79
+ }
80
+ clone() {
81
+ const copy = new AssetCatalog();
82
+ for (const [id, info] of this.#byId)
83
+ copy.#byId.set(id, info);
84
+ for (const [key, scope] of this.#aliases)
85
+ copy.#aliases.set(key, new Map(scope));
86
+ return copy;
87
+ }
88
+ }
89
+ exports.AssetCatalog = AssetCatalog;
90
+ //# sourceMappingURL=assets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../../src/core/registry/assets.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigError, ValidationError } from '../errors/error';\nimport {\n assetId,\n metadataProblem,\n type AssetId,\n type AssetInfo,\n type AssetMetadata,\n type AssetRef,\n} from '../model/asset';\nimport type { ChainInfo } from '../model/chain';\nimport { unknownName } from '../util/names';\n\nexport interface AssetRegistration {\n readonly chain: string;\n readonly network: string;\n readonly ref: AssetRef;\n readonly metadata: AssetMetadata;\n readonly aliases?: readonly string[];\n}\n\nconst ALIAS = /^[A-Z0-9._-]{1,32}$/;\n\nexport class AssetCatalog {\n readonly #byId = new Map<AssetId, AssetInfo>();\n readonly #aliases = new Map<string, Map<string, AssetId>>();\n\n register(registration: AssetRegistration): AssetInfo {\n const id = assetId(registration.chain, registration.network, registration.ref);\n const problem = metadataProblem(registration.metadata);\n if (problem) throw new ConfigError('CONFIG_INVALID', `asset '${id}': ${problem}`);\n const existing = this.#byId.get(id);\n if (\n existing &&\n (existing.metadata.symbol !== registration.metadata.symbol ||\n existing.metadata.decimals !== registration.metadata.decimals)\n ) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `asset '${id}' is already registered with different metadata`,\n );\n }\n const scopeKey = `${registration.chain}:${registration.network}`;\n const scope = this.#aliases.get(scopeKey) ?? new Map<string, AssetId>();\n const aliases = (registration.aliases ?? []).map((alias) => {\n const normalized = alias.trim().toUpperCase();\n if (!ALIAS.test(normalized)) {\n throw new ConfigError('CONFIG_INVALID', `invalid asset alias '${alias}'`);\n }\n const owner = scope.get(normalized);\n if (owner && owner !== id) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `alias '${normalized}' on ${scopeKey} already refers to '${owner}'`,\n );\n }\n return normalized;\n });\n const info: AssetInfo =\n existing ??\n Object.freeze({\n id,\n chain: registration.chain,\n network: registration.network,\n ref: registration.ref,\n metadata: Object.freeze({ ...registration.metadata }),\n });\n this.#byId.set(id, info);\n for (const alias of aliases) scope.set(alias, id);\n this.#aliases.set(scopeKey, scope);\n return info;\n }\n\n registerNative(chain: ChainInfo): void {\n for (const network of Object.keys(chain.networks)) {\n this.register({\n chain: chain.id,\n network,\n ref: 'native',\n metadata: chain.nativeAsset,\n aliases: [chain.nativeAsset.symbol],\n });\n }\n }\n\n get(id: AssetId): AssetInfo | undefined {\n return this.#byId.get(id);\n }\n\n native(chain: string, network: string): AssetInfo {\n const info = this.#byId.get(assetId(chain, network, 'native'));\n if (!info) {\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n `no native asset registered for ${chain}:${network}`,\n );\n }\n return info;\n }\n\n resolveAlias(chain: string, network: string, alias: string): AssetInfo {\n const scopeKey = `${chain}:${network}`;\n const scope = this.#aliases.get(scopeKey);\n const id = scope?.get(alias.trim().toUpperCase());\n const info = id ? this.#byId.get(id) : undefined;\n if (!info) {\n throw new ValidationError(\n 'ASSET_RESOLUTION',\n unknownName(`asset alias on ${scopeKey}`, scope?.keys() ?? []),\n );\n }\n return info;\n }\n\n clone(): AssetCatalog {\n const copy = new AssetCatalog();\n for (const [id, info] of this.#byId) copy.#byId.set(id, info);\n for (const [key, scope] of this.#aliases) copy.#aliases.set(key, new Map(scope));\n return copy;\n }\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { ChainInfo, NetworkInfo } from '../model/chain';
2
+ export declare class ChainCatalog {
3
+ #private;
4
+ register(chain: ChainInfo): void;
5
+ has(id: string): boolean;
6
+ get(id: string): ChainInfo;
7
+ list(): ChainInfo[];
8
+ network(chainId: string, networkId: string): NetworkInfo;
9
+ clone(): ChainCatalog;
10
+ }
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ChainCatalog = void 0;
4
+ const error_1 = require("../errors/error");
5
+ const names_1 = require("../util/names");
6
+ class ChainCatalog {
7
+ #chains = new Map();
8
+ register(chain) {
9
+ validateChain(chain);
10
+ if (this.#chains.has(chain.id)) {
11
+ throw new error_1.ConfigError('CONFIG_INVALID', `chain '${chain.id}' is already registered`);
12
+ }
13
+ this.#chains.set(chain.id, Object.freeze({ ...chain }));
14
+ }
15
+ has(id) {
16
+ return this.#chains.has(id);
17
+ }
18
+ get(id) {
19
+ const chain = this.#chains.get(id);
20
+ if (!chain) {
21
+ // The caller's text (perhaps a pasted secret) is never repeated; the registered
22
+ // chains are listed.
23
+ throw new error_1.ConfigError('CONFIG_INVALID', (0, names_1.unknownName)('chain', this.#chains.keys()));
24
+ }
25
+ return chain;
26
+ }
27
+ list() {
28
+ return [...this.#chains.values()];
29
+ }
30
+ network(chainId, networkId) {
31
+ const chain = this.get(chainId);
32
+ // Own keys only: `toString` or `constructor` is not a network.
33
+ const network = Object.hasOwn(chain.networks, networkId)
34
+ ? chain.networks[networkId]
35
+ : undefined;
36
+ if (!network) {
37
+ throw new error_1.ConfigError('CONFIG_INVALID', (0, names_1.unknownName)(`network for chain '${chain.id}'`, Object.keys(chain.networks)));
38
+ }
39
+ return network;
40
+ }
41
+ clone() {
42
+ const copy = new ChainCatalog();
43
+ for (const chain of this.#chains.values())
44
+ copy.#chains.set(chain.id, chain);
45
+ return copy;
46
+ }
47
+ }
48
+ exports.ChainCatalog = ChainCatalog;
49
+ function validateChain(chain) {
50
+ const fail = (reason) => {
51
+ throw new error_1.ConfigError('CONFIG_INVALID', `invalid chain '${chain.id}': ${reason}`);
52
+ };
53
+ if (!/^[a-z][a-z0-9-]*$/.test(chain.id))
54
+ fail('id must be lowercase kebab-case');
55
+ if (!chain.networks[chain.defaultNetwork]) {
56
+ fail(`default network '${chain.defaultNetwork}' is not defined`);
57
+ }
58
+ const { decimals } = chain.nativeAsset;
59
+ if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255) {
60
+ fail('native asset decimals must be an integer in [0, 255]');
61
+ }
62
+ if (chain.schemes.length === 0)
63
+ fail('at least one signature scheme is required');
64
+ if (chain.xpubNetworkClass !== undefined &&
65
+ typeof chain.xpubNetworkClass !== 'boolean') {
66
+ fail('xpubNetworkClass must be a boolean');
67
+ }
68
+ for (const [key, network] of Object.entries(chain.networks)) {
69
+ if (network.id !== key)
70
+ fail(`network key '${key}' does not match its id '${network.id}'`);
71
+ if (!Number.isInteger(network.reorgWindow) || network.reorgWindow < 1) {
72
+ fail(`network '${key}': reorgWindow must be a positive integer`);
73
+ }
74
+ if (!Number.isInteger(network.defaultConfirmations) ||
75
+ network.defaultConfirmations < 1) {
76
+ fail(`network '${key}': defaultConfirmations must be a positive integer`);
77
+ }
78
+ }
79
+ }
80
+ //# sourceMappingURL=chains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chains.js","sourceRoot":"","sources":["../../../src/core/registry/chains.ts"],"names":[],"mappings":"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","sourcesContent":["import { ConfigError } from '../errors/error';\nimport type { ChainInfo, NetworkInfo } from '../model/chain';\nimport { unknownName } from '../util/names';\n\nexport class ChainCatalog {\n readonly #chains = new Map<string, ChainInfo>();\n\n register(chain: ChainInfo): void {\n validateChain(chain);\n if (this.#chains.has(chain.id)) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `chain '${chain.id}' is already registered`,\n );\n }\n this.#chains.set(chain.id, Object.freeze({ ...chain }));\n }\n\n has(id: string): boolean {\n return this.#chains.has(id);\n }\n\n get(id: string): ChainInfo {\n const chain = this.#chains.get(id);\n if (!chain) {\n // The caller's text (perhaps a pasted secret) is never repeated; the registered\n // chains are listed.\n throw new ConfigError('CONFIG_INVALID', unknownName('chain', this.#chains.keys()));\n }\n return chain;\n }\n\n list(): ChainInfo[] {\n return [...this.#chains.values()];\n }\n\n network(chainId: string, networkId: string): NetworkInfo {\n const chain = this.get(chainId);\n // Own keys only: `toString` or `constructor` is not a network.\n const network = Object.hasOwn(chain.networks, networkId)\n ? chain.networks[networkId]\n : undefined;\n if (!network) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n unknownName(`network for chain '${chain.id}'`, Object.keys(chain.networks)),\n );\n }\n return network;\n }\n\n clone(): ChainCatalog {\n const copy = new ChainCatalog();\n for (const chain of this.#chains.values()) copy.#chains.set(chain.id, chain);\n return copy;\n }\n}\n\nfunction validateChain(chain: ChainInfo): void {\n const fail = (reason: string): never => {\n throw new ConfigError('CONFIG_INVALID', `invalid chain '${chain.id}': ${reason}`);\n };\n if (!/^[a-z][a-z0-9-]*$/.test(chain.id)) fail('id must be lowercase kebab-case');\n if (!chain.networks[chain.defaultNetwork]) {\n fail(`default network '${chain.defaultNetwork}' is not defined`);\n }\n const { decimals } = chain.nativeAsset;\n if (!Number.isInteger(decimals) || decimals < 0 || decimals > 255) {\n fail('native asset decimals must be an integer in [0, 255]');\n }\n if (chain.schemes.length === 0) fail('at least one signature scheme is required');\n if (\n chain.xpubNetworkClass !== undefined &&\n typeof chain.xpubNetworkClass !== 'boolean'\n ) {\n fail('xpubNetworkClass must be a boolean');\n }\n for (const [key, network] of Object.entries(chain.networks)) {\n if (network.id !== key)\n fail(`network key '${key}' does not match its id '${network.id}'`);\n if (!Number.isInteger(network.reorgWindow) || network.reorgWindow < 1) {\n fail(`network '${key}': reorgWindow must be a positive integer`);\n }\n if (\n !Number.isInteger(network.defaultConfirmations) ||\n network.defaultConfirmations < 1\n ) {\n fail(`network '${key}': defaultConfirmations must be a positive integer`);\n }\n }\n}\n"]}
@@ -0,0 +1,41 @@
1
+ import type { AdapterManifest } from '../driver/types';
2
+ import type { ChainInfo } from '../model/chain';
3
+ import { AdapterCatalog } from './adapters';
4
+ import { AssetCatalog, type AssetRegistration } from './assets';
5
+ import { ChainCatalog } from './chains';
6
+ import { PresetCatalog, type ProviderPreset } from './providers';
7
+ import { SchemeCatalog, type SignatureScheme } from './schemes';
8
+ /** Everything a chain family contributes. Plugin modules must not import SDKs. */
9
+ export interface Plugin {
10
+ readonly name: string;
11
+ readonly chains?: readonly ChainInfo[];
12
+ readonly adapters?: readonly AdapterManifest[];
13
+ readonly presets?: readonly ProviderPreset[];
14
+ readonly assets?: readonly AssetRegistration[];
15
+ readonly schemes?: readonly SignatureScheme[];
16
+ }
17
+ export interface Catalogs {
18
+ readonly chains: ChainCatalog;
19
+ readonly assets: AssetCatalog;
20
+ readonly adapters: AdapterCatalog;
21
+ readonly presets: PresetCatalog;
22
+ readonly schemes: SchemeCatalog;
23
+ /** Every registered plugin by name, to tell a repeat from a different plugin. */
24
+ readonly plugins: Map<string, Plugin>;
25
+ }
26
+ export declare function createCatalogs(): Catalogs;
27
+ export declare function cloneCatalogs(catalogs: Catalogs): Catalogs;
28
+ /**
29
+ * Registers a plugin. Registering the same plugin again (`samePlugin`) is a no-op, so
30
+ * `use()` stays idempotent; a different plugin under a registered name is `CONFIG_INVALID`.
31
+ */
32
+ export declare function applyPlugin(catalogs: Catalogs, plugin: Plugin): void;
33
+ /**
34
+ * Whether two plugins are the same: the same object, or structurally equal
35
+ * data around the same functions. Functions and class instances match only themselves (a
36
+ * closure over other values, or a bound function, is another function), so a factory
37
+ * such as `evmPlugin()` keeps its functions at module level to stay idempotent. Data is
38
+ * every own enumerable key, symbols included, and every array index: a hole matches only
39
+ * a hole.
40
+ */
41
+ export declare function samePlugin(a: Plugin, b: Plugin): boolean;