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":"operations.js","sourceRoot":"","sources":["../../../src/testing/contracts/operations.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert/strict';\nimport type { OrderingData } from '../../core/model/ordering';\nimport type {\n AttemptRecord,\n ClearableField,\n NewOperation,\n OperationPatch,\n OperationStore,\n} from '../../core/store/types';\nimport { rejectsWithCode, rejectsWithCodeKeepingOut, type ContractTestApi } from './api';\n\n/**\n * Narrows a `Promise.allSettled` result to its rejected variant, so a batch of\n * promises that are expected to include failures can be driven with a single\n * `Promise.allSettled` (a bare `Promise.all` would short-circuit on the first\n * rejection and discard the others) and then inspected without repeated casts.\n */\nfunction isRejected<T>(result: PromiseSettledResult<T>): result is PromiseRejectedResult {\n return result.status === 'rejected';\n}\n\nlet counter = 0;\n\nexport function sampleOperation(overrides: Partial<NewOperation> = {}): NewOperation {\n counter += 1;\n return {\n id: `op_contract_${counter}`,\n namespace: 'ns',\n idempotencyKey: `key-${counter}`,\n intentHash: 'hash',\n context: {\n chain: 'c',\n network: 'n',\n library: 'lib',\n providers: ['p'],\n indexers: [],\n wallet: 'w',\n configHash: 'cfg',\n },\n kind: 'transfer',\n state: 'created',\n intent: {\n assetId: 'c:n/native',\n asset: 'native',\n outputs: [{ to: 'to', amount: 10n }],\n from: 'from',\n fee: 'normal',\n },\n attempts: [],\n ...overrides,\n };\n}\n\nexport function sampleAttempt(\n id: string,\n overrides: Partial<AttemptRecord> = {},\n): AttemptRecord {\n const fee = {\n kind: 'x',\n speed: 'normal' as const,\n charges: [{ asset: 'native' as const, amount: 1n, label: 'network' }],\n bound: 'exact' as const,\n details: {},\n };\n return {\n id,\n ref: { id: `ref-${id}`, idKind: 'tx-hash', canonical: true },\n raw: { encoding: 'hex', data: '00' },\n ordering: { kind: 'nonce', nonce: 7n },\n fee,\n unsigned: {\n payload: { encoding: 'hex', data: '00' },\n signingRequests: [\n {\n id: 'r0',\n scheme: 'secp256k1-ecdsa',\n payload: new Uint8Array([1, 2]),\n payloadKind: 'digest',\n publicKey: new Uint8Array([3]),\n },\n ],\n ordering: { kind: 'nonce', nonce: 7n },\n fee,\n summary: { asset: 'c:n/native', outputs: [] },\n },\n purpose: 'original',\n createdAt: 1,\n ...overrides,\n };\n}\n\n/**\n * An ordering of each kind the built-in families record, with each family's own\n * properties. Proofs read these facts from the stored ordering, never from signed bytes,\n * so a store must keep every one whole: a dropped property costs liveness, but a changed\n * one (a `refBlockHash`, a `blockhash`, a `validFrom` moved later, a bigint narrowed to a\n * number) can prove a transaction absent while a block holds it, and `rebuild` then pays\n * twice. The bigints exceed 2^53. The core's `OrderingData` does not name these fields:\n * each family exports its typed ordering, and this contract pins that a store keeps them.\n */\nexport const SAMPLE_ORDERINGS: readonly (readonly [string, OrderingData])[] =\n Object.freeze([\n ['an EVM nonce', { kind: 'nonce', nonce: 2n ** 64n - 1n }],\n [\n 'UTXO inputs',\n {\n kind: 'inputs',\n inputs: [`${'ab'.repeat(32)}:0`, `${'cd'.repeat(32)}:4294967295`],\n },\n ],\n [\n 'a Tron expiry',\n {\n kind: 'expiry',\n expiresAtMs: 1_790_000_000_123,\n lastValidHeight: 2n ** 53n + 65_537n,\n refBlockHash: '0a1b2c3d4e5f6071',\n } as OrderingData,\n ],\n [\n 'a Solana expiry',\n {\n kind: 'expiry',\n lastValidHeight: 2n ** 63n + 150n,\n blockhash: 'GHtXQBsoZHVnNFa9YevAzFr17DJjgHXk3ycTKD5xD3Zi',\n blockhashSlot: 2n ** 53n + 1n,\n } as OrderingData,\n ],\n [\n 'a TON seqno',\n {\n kind: 'seqno',\n seqno: 2n ** 32n - 1n,\n validUntil: 1_790_000_060,\n validFrom: 1_789_999_700,\n } as OrderingData,\n ],\n ]);\n\n/** Every property of `expected`, and no other, with the same value and type. */\nfunction assertWholeOrdering(\n actual: unknown,\n expected: OrderingData,\n where: string,\n): void {\n assert.ok(actual !== null && typeof actual === 'object', `${where}: missing`);\n const got = actual as Readonly<Record<string, unknown>>;\n assert.deepEqual(\n Object.keys(got).sort(),\n Object.keys(expected).sort(),\n `${where}: properties`,\n );\n for (const [key, value] of Object.entries(expected)) {\n assert.equal(typeof got[key], typeof value, `${where}.${key}: type`);\n assert.deepEqual(got[key], value, `${where}.${key}: value`);\n }\n}\n\nexport interface OperationHarness {\n readonly operations: OperationStore;\n /** Moves the store's notion of time forward (a fake clock, or a real sleep). */\n advance(ms: number): Promise<void>;\n}\n\nexport function describeOperationStoreContract(\n api: ContractTestApi,\n create: () => OperationHarness | Promise<OperationHarness>,\n): void {\n api.describe('OperationStore contract', () => {\n api.it('creates if absent on (namespace, idempotencyKey)', async () => {\n const { operations } = await create();\n const first = await operations.create(sampleOperation({ idempotencyKey: 'same' }));\n assert.equal(first.created, true);\n assert.equal(first.record.version, 1);\n const second = await operations.create(sampleOperation({ idempotencyKey: 'same' }));\n assert.equal(second.created, false);\n assert.equal(second.record.id, first.record.id);\n const otherNs = await operations.create(\n sampleOperation({ idempotencyKey: 'same', namespace: 'other' }),\n );\n assert.equal(otherNs.created, true);\n assert.equal((await operations.getByKey('ns', 'same'))?.id, first.record.id);\n assert.equal(await operations.get('ns', 'missing'), null);\n assert.equal(await operations.getByKey('ns', 'missing'), null);\n });\n\n api.it(\n 'rejects create when the runtime input carries a store-owned field, storing nothing',\n async () => {\n const { operations } = await create();\n const forbidden: Record<string, unknown> = {\n claim: { workerId: 'w', token: '1', until: 1 },\n version: 1,\n createdAt: 1,\n updatedAt: 1,\n };\n for (const key of Object.keys(forbidden)) {\n const operation = {\n ...sampleOperation(),\n [key]: forbidden[key],\n } as unknown as NewOperation;\n await rejectsWithCode(operations.create(operation), 'INVALID_TRANSITION');\n assert.equal(await operations.get(operation.namespace, operation.id), null);\n assert.equal(\n await operations.getByKey(operation.namespace, operation.idempotencyKey),\n null,\n );\n }\n },\n );\n\n api.it('updates with compare-and-set versions and clears fields', async () => {\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n const updated = await operations.update(\n 'ns',\n record.id,\n {\n state: 'prepared',\n reservation: { kind: 'nonce', nonce: 3n },\n error: {\n name: 'E',\n code: 'TIMEOUT',\n category: 'timeout',\n message: 'm',\n retryable: true,\n ambiguous: false,\n context: {},\n },\n },\n 1,\n );\n assert.equal(updated.version, 2);\n assert.equal(updated.state, 'prepared');\n await rejectsWithCode(\n operations.update('ns', record.id, { state: 'signed' }, 1),\n 'VERSION_CONFLICT',\n );\n await rejectsWithCode(\n operations.update('ns', 'missing', { state: 'signed' }, 1),\n 'NOT_FOUND',\n );\n const cleared = await operations.update(\n 'ns',\n record.id,\n { clear: ['reservation', 'error'] },\n 2,\n );\n assert.equal(cleared.reservation, undefined);\n assert.equal(cleared.error, undefined);\n assert.equal(cleared.state, 'prepared');\n });\n\n api.it(\n 'bumps the version on every successful update, even one that changes nothing',\n async () => {\n // The engine fences a stale writer with a no-effect compare-and-set; a store\n // that skipped writing an unchanged record would let the stale write land.\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n assert.equal(record.error, undefined);\n const bumped = await operations.update(\n 'ns',\n record.id,\n { clear: ['error'] },\n record.version,\n );\n assert.equal(bumped.version, record.version + 1);\n await rejectsWithCode(\n operations.update('ns', record.id, { state: 'prepared' }, record.version),\n 'VERSION_CONFLICT',\n );\n },\n );\n\n api.it('appends attempts atomically with the state change', async () => {\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n const next = await operations.appendAttempt(\n 'ns',\n record.id,\n sampleAttempt('a1'),\n { state: 'signed' },\n 1,\n );\n assert.equal(next.version, 2);\n assert.equal(next.state, 'signed');\n assert.equal(next.activeAttemptId, 'a1');\n assert.equal(next.attempts.length, 1);\n await rejectsWithCode(\n operations.appendAttempt('ns', record.id, sampleAttempt('a1'), {}, 2),\n 'INVALID_TRANSITION',\n );\n const stored = await operations.get('ns', record.id);\n const request = stored?.attempts[0]?.unsigned.signingRequests[0];\n assert.deepEqual(request?.payload, new Uint8Array([1, 2]));\n const ordering = stored?.attempts[0]?.ordering;\n assert.equal(ordering?.kind === 'nonce' ? ordering.nonce : undefined, 7n);\n });\n\n api.it(\n 'keeps every ordering whole: each property, with its value and its type',\n async () => {\n const { operations } = await create();\n for (const [name, ordering] of SAMPLE_ORDERINGS) {\n const { record } = await operations.create(sampleOperation());\n const sample = sampleAttempt('a1');\n const appended = await operations.appendAttempt(\n 'ns',\n record.id,\n { ...sample, ordering, unsigned: { ...sample.unsigned, ordering } },\n { state: 'signed', reservation: ordering },\n record.version,\n );\n // Read back after the append, and again after a later write to the record.\n const stored = await operations.get('ns', record.id);\n const updated = await operations.update(\n 'ns',\n record.id,\n { state: 'submitted' },\n appended.version,\n );\n const reread = await operations.get('ns', record.id);\n for (const [when, read] of [\n ['appendAttempt', appended],\n ['get', stored],\n ['update', updated],\n ['get after update', reread],\n ] as const) {\n const where = `${name} (${when})`;\n assertWholeOrdering(\n read?.attempts[0]?.ordering,\n ordering,\n `${where} ordering`,\n );\n assertWholeOrdering(\n read?.attempts[0]?.unsigned.ordering,\n ordering,\n `${where} unsigned.ordering`,\n );\n assertWholeOrdering(read?.reservation, ordering, `${where} reservation`);\n }\n }\n },\n );\n\n api.it('isolates returned records from the store', async () => {\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n (record.intent.outputs as { to: string; amount: bigint }[]).push({\n to: 'x',\n amount: 1n,\n });\n assert.equal((await operations.get('ns', record.id))?.intent.outputs.length, 1);\n });\n\n api.it('versions observations and finds operations by ref or tx hash', async () => {\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n await operations.appendAttempt(\n 'ns',\n record.id,\n sampleAttempt('a2'),\n { state: 'signed' },\n 1,\n );\n const base = {\n attemptId: 'a2',\n operationId: record.id,\n state: 'included' as const,\n evidence: 'observed' as const,\n confirmations: 1,\n txHash: 'canonical-hash',\n blockHeight: 2n ** 40n,\n };\n const obs = await operations.putObservation(base, null);\n assert.equal(obs.version, 1);\n await rejectsWithCode(operations.putObservation(base, null), 'VERSION_CONFLICT');\n assert.equal(\n (await operations.putObservation({ ...base, confirmations: 2 }, 1)).version,\n 2,\n );\n assert.equal((await operations.getObservation('a2'))?.blockHeight, 2n ** 40n);\n assert.equal((await operations.findByRef('ns', 'ref-a2'))?.id, record.id);\n assert.equal((await operations.findByRef('ns', 'canonical-hash'))?.id, record.id);\n assert.equal(await operations.findByRef('other', 'ref-a2'), null);\n });\n\n api.it(\n 'replaces an observation whole: a key left out or set to undefined reads back undefined (never null)',\n async () => {\n // The core clears a stale reason or block by leaving it out or setting\n // it to undefined. A store that merged records, or kept undefined as a value such as\n // null, would return a stale or wrong field.\n const { operations } = await create();\n const { record } = await operations.create(sampleOperation());\n await operations.appendAttempt(\n 'ns',\n record.id,\n sampleAttempt('a3'),\n { state: 'signed' },\n 1,\n );\n const failed = await operations.putObservation(\n {\n attemptId: 'a3',\n operationId: record.id,\n state: 'failed',\n evidence: 'observed',\n confirmations: 1,\n blockHeight: 7n,\n blockHash: 'block-7',\n reason: 'transfer bounced',\n },\n null,\n );\n await operations.putObservation(\n {\n attemptId: 'a3',\n operationId: record.id,\n state: 'pending',\n evidence: 'observed',\n confirmations: 0,\n reason: undefined,\n },\n failed.version,\n );\n const reread = await operations.getObservation('a3');\n assert.equal(reread?.state, 'pending');\n assert.equal(reread?.blockHeight, undefined);\n assert.equal(reread?.blockHash, undefined);\n assert.equal(reread?.reason, undefined);\n },\n );\n\n api.it('claims due operations exclusively and fences stale workers', async () => {\n const { operations } = await create();\n const a = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }))\n ).record;\n const b = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }))\n ).record;\n await operations.create(sampleOperation({ state: 'final', nextCheckAt: 100 }));\n await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 10_000 }),\n );\n // Unscheduled operations (no nextCheckAt) are still being built or signed: never due.\n await operations.create(sampleOperation({ state: 'prepared' }));\n const w1 = await operations.claimDue('ns', 'w1', 1_000, 500, 1);\n const w2 = await operations.claimDue('ns', 'w2', 1_000, 500, 10);\n assert.equal(w1.length, 1);\n assert.equal(w2.length, 1);\n assert.notEqual(w1[0]?.id, w2[0]?.id);\n assert.deepEqual(new Set([w1[0]?.id, w2[0]?.id]), new Set([a.id, b.id]));\n assert.equal((await operations.claimDue('ns', 'w3', 1_200, 500, 10)).length, 0);\n const staleClaim = w1[0]!;\n const retaken = await operations.claimDue('ns', 'w3', 1_600, 500, 10);\n const takeover = retaken.find((r) => r.id === staleClaim.id);\n assert.ok(takeover);\n assert.ok(BigInt(takeover.claim!.token) > BigInt(staleClaim.claim!.token));\n await rejectsWithCode(\n operations.update('ns', staleClaim.id, { nextCheckAt: 5 }, takeover.version, {\n claimToken: staleClaim.claim!.token,\n }),\n 'FENCING',\n );\n await rejectsWithCode(\n operations.releaseClaim('ns', staleClaim.id, {\n claimToken: staleClaim.claim!.token,\n }),\n 'FENCING',\n );\n await operations.releaseClaim('ns', staleClaim.id, {\n claimToken: takeover.claim!.token,\n });\n assert.equal((await operations.get('ns', staleClaim.id))?.claim, undefined);\n });\n\n api.it('lists by filter in creation order', async () => {\n const { operations } = await create();\n const one = (\n await operations.create(\n sampleOperation({\n namespace: 'list',\n intent: { ...sampleOperation().intent, from: 'alice' },\n }),\n )\n ).record;\n await operations.create(\n sampleOperation({\n namespace: 'list',\n state: 'final',\n intent: { ...sampleOperation().intent, from: 'alice' },\n }),\n );\n await operations.create(\n sampleOperation({\n namespace: 'list',\n intent: { ...sampleOperation().intent, from: 'bob' },\n }),\n );\n const alice = await operations.list({\n namespace: 'list',\n from: 'alice',\n states: ['created'],\n });\n assert.deepEqual(\n alice.map((r) => r.id),\n [one.id],\n );\n assert.equal((await operations.list({ namespace: 'list' })).length, 3);\n assert.equal((await operations.list({ namespace: 'list', limit: 2 })).length, 2);\n });\n\n api.it(\n 'rejects patch fields outside the writable whitelist, leaving the record unchanged',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const afterAppend = await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('w1'),\n { state: 'signed' },\n 1,\n );\n const snapshot = await operations.get('ns', created.record.id);\n await rejectsWithCode(\n operations.update(\n 'ns',\n created.record.id,\n { attempts: [] } as unknown as OperationPatch,\n afterAppend.version,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n await rejectsWithCode(\n operations.update(\n 'ns',\n created.record.id,\n {\n claim: undefined,\n state: 'submitted',\n ...{ id: 'x' },\n } as unknown as OperationPatch,\n afterAppend.version,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n await rejectsWithCode(\n operations.update(\n 'ns',\n created.record.id,\n { clear: ['attempts', 'claim'] as unknown as ClearableField[] },\n afterAppend.version,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n },\n );\n\n api.it(\n \"rejects appendAttempt's patch fields outside the writable whitelist, leaving the record unchanged\",\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const snapshot = await operations.get('ns', created.record.id);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('wl1'),\n { attempts: [] } as unknown as OperationPatch,\n 1,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('wl2'),\n {\n claim: undefined,\n state: 'submitted',\n ...{ id: 'x' },\n } as unknown as OperationPatch,\n 1,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('wl3'),\n { clear: ['attempts', 'claim'] as unknown as ClearableField[] },\n 1,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n },\n );\n\n api.it(\n 'rejects a clear that is not an array, leaving the record unchanged',\n async () => {\n // A serialized store cannot read a number, an object or a Set as a list either;\n // reading one as `[]` would let a malformed patch commit as if it cleared nothing.\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const snapshot = await operations.get('ns', created.record.id);\n for (const clear of [5, {}, null, 'error', new Set(['error'])]) {\n const patch = { state: 'prepared', clear } as unknown as OperationPatch;\n await rejectsWithCode(\n operations.update('ns', created.record.id, patch, 1),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('n7'),\n patch,\n 1,\n ),\n 'INVALID_TRANSITION',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n }\n },\n );\n\n api.it(\n 'keeps the idempotency key and the wallet address out of its errors',\n async () => {\n // Both are `sensitive` data, and error messages reach logs.\n const { operations } = await create();\n const from = 'TRonWa11etAddre55C0ffee000000000000';\n const idempotencyKey = 'withdrawal-7f3a9c-customer-4417';\n const secrets = [from, idempotencyKey];\n const operation = sampleOperation({\n idempotencyKey,\n state: 'submitted',\n nextCheckAt: 100,\n intent: { ...sampleOperation().intent, from },\n });\n const { record } = await operations.create(operation);\n await rejectsWithCodeKeepingOut(\n operations.create({ ...operation, idempotencyKey: 'another-key' }),\n 'INVALID_TRANSITION',\n secrets,\n );\n await rejectsWithCodeKeepingOut(\n operations.update('ns', record.id, { state: 'prepared' }, 9),\n 'VERSION_CONFLICT',\n secrets,\n );\n await rejectsWithCodeKeepingOut(\n operations.update(\n 'ns',\n record.id,\n { idempotencyKey: 'x' } as unknown as OperationPatch,\n record.version,\n ),\n 'INVALID_TRANSITION',\n secrets,\n );\n const appended = await operations.appendAttempt(\n 'ns',\n record.id,\n sampleAttempt('k1'),\n {},\n record.version,\n );\n await rejectsWithCodeKeepingOut(\n operations.appendAttempt(\n 'ns',\n record.id,\n sampleAttempt('k1'),\n {},\n appended.version,\n ),\n 'INVALID_TRANSITION',\n secrets,\n );\n await rejectsWithCodeKeepingOut(\n operations.appendAttempt('ns', record.id, sampleAttempt('k2'), {}, 1),\n 'VERSION_CONFLICT',\n secrets,\n );\n const [stale] = await operations.claimDue('ns', 'w1', 1_000, 500, 10);\n await operations.claimDue('ns', 'w2', 1_600, 500, 10);\n const current = await operations.get('ns', record.id);\n await rejectsWithCodeKeepingOut(\n operations.update('ns', record.id, {}, current!.version, {\n claimToken: stale!.claim!.token,\n }),\n 'FENCING',\n secrets,\n );\n },\n );\n\n api.it(\n 'purges what the filter matches and nothing else, when it implements purge',\n async () => {\n const { operations } = await create();\n if (operations.purge === undefined) return;\n const done = (\n await operations.create(sampleOperation({ namespace: 'purge', state: 'final' }))\n ).record;\n await operations.appendAttempt(\n 'purge',\n done.id,\n sampleAttempt('p1'),\n {},\n done.version,\n );\n await operations.putObservation(\n {\n attemptId: 'p1',\n operationId: done.id,\n state: 'included',\n evidence: 'proven',\n confirmations: 3,\n txHash: 'purged-hash',\n },\n null,\n );\n const live = (\n await operations.create(\n sampleOperation({ namespace: 'purge', state: 'submitted' }),\n )\n ).record;\n const elsewhere = (\n await operations.create(sampleOperation({ namespace: 'kept', state: 'final' }))\n ).record;\n const liveBefore = await operations.get('purge', live.id);\n const elsewhereBefore = await operations.get('kept', elsewhere.id);\n\n assert.equal(\n await operations.purge({ namespace: 'purge', states: ['final'] }),\n 1,\n );\n assert.equal(await operations.get('purge', done.id), null);\n assert.equal(await operations.getByKey('purge', done.idempotencyKey), null);\n assert.equal(await operations.findByRef('purge', 'ref-p1'), null);\n assert.equal(await operations.findByRef('purge', 'purged-hash'), null);\n assert.equal(await operations.getObservation('p1'), null);\n assert.deepEqual(await operations.get('purge', live.id), liveBefore);\n assert.deepEqual(await operations.get('kept', elsewhere.id), elsewhereBefore);\n // The idempotency key is free again: a new Operation may take it.\n const again = await operations.create(\n sampleOperation({\n namespace: 'purge',\n idempotencyKey: done.idempotencyKey,\n id: `${done.id}-again`,\n }),\n );\n assert.equal(again.created, true);\n assert.equal(await operations.purge({ namespace: 'empty' }), 0);\n },\n );\n\n api.it(\n 'purges at most limit records, the oldest first, when it implements purge',\n async () => {\n const { operations } = await create();\n if (operations.purge === undefined) return;\n const ids: string[] = [];\n for (let i = 0; i < 3; i += 1) {\n const { record } = await operations.create(\n sampleOperation({ namespace: 'purge-limit', state: 'failed' }),\n );\n ids.push(record.id);\n }\n assert.equal(await operations.purge({ namespace: 'purge-limit', limit: 2 }), 2);\n assert.deepEqual(\n (await operations.list({ namespace: 'purge-limit' })).map((r) => r.id),\n [ids[2]],\n );\n assert.equal(await operations.purge({ namespace: 'purge-limit', limit: 0 }), 0);\n assert.equal((await operations.list({ namespace: 'purge-limit' })).length, 1);\n },\n );\n\n api.it(\n 'rejects appendAttempt with a duplicate id even when the content differs, leaving the record unchanged',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const afterFirst = await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('dup'),\n { state: 'signed' },\n 1,\n );\n const snapshot = await operations.get('ns', created.record.id);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('dup', {\n purpose: 'replacement',\n raw: { encoding: 'hex', data: 'ff' },\n }),\n { state: 'failed' },\n afterFirst.version,\n ),\n 'INVALID_TRANSITION',\n );\n const after = await operations.get('ns', created.record.id);\n assert.deepEqual(after, snapshot);\n assert.equal(after?.attempts.length, 1);\n assert.equal(after?.version, afterFirst.version);\n assert.equal(after?.state, 'signed');\n },\n );\n\n api.it(\n 'rejects appendAttempt with a stale expectedVersion, leaving the record unchanged',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('s1'),\n { state: 'signed' },\n 1,\n );\n const snapshot = await operations.get('ns', created.record.id);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('s2'),\n { state: 'submitted' },\n 1,\n ),\n 'VERSION_CONFLICT',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n },\n );\n\n api.it(\n 'rejects appendAttempt from a stale fencing token after a claim takeover, leaving the record unchanged',\n async () => {\n const { operations } = await create();\n const created = await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 100 }),\n );\n const [stale] = await operations.claimDue('ns', 'w1', 1_000, 500, 10);\n const [takeover] = await operations.claimDue('ns', 'w2', 1_600, 500, 10);\n const snapshot = await operations.get('ns', created.record.id);\n await rejectsWithCode(\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('f1'),\n { state: 'signed' },\n takeover!.version,\n { claimToken: stale!.claim!.token },\n ),\n 'FENCING',\n );\n assert.deepEqual(await operations.get('ns', created.record.id), snapshot);\n },\n );\n\n api.it(\n \"isolates a stored attempt from later mutation of the caller's input\",\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const attempt = sampleAttempt('iso1');\n await operations.appendAttempt(\n 'ns',\n created.record.id,\n attempt,\n { state: 'signed' },\n 1,\n );\n attempt.unsigned.signingRequests[0]!.payload[0] = 99;\n (attempt.raw as { data: string }).data = 'ff';\n const stored = await operations.get('ns', created.record.id);\n const storedAttempt = stored?.attempts[0];\n assert.deepEqual(\n storedAttempt?.unsigned.signingRequests[0]?.payload,\n new Uint8Array([1, 2]),\n );\n assert.equal(storedAttempt?.raw.data, '00');\n },\n );\n\n api.it('appends attempts in order without rewriting earlier ones', async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const afterFirst = await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('a1'),\n { state: 'signed' },\n 1,\n );\n const firstAttemptSnapshot = afterFirst.attempts[0];\n const afterSecond = await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('a2'),\n { state: 'submitted' },\n afterFirst.version,\n );\n assert.deepEqual(\n afterSecond.attempts.map((a) => a.id),\n ['a1', 'a2'],\n );\n assert.deepEqual(afterSecond.attempts[0], firstAttemptSnapshot);\n });\n\n api.it(\n 'resolves N concurrent creates under one idempotency key, with distinct ids, to exactly one winner',\n async () => {\n const { operations } = await create();\n const results = await Promise.all(\n Array.from({ length: 5 }, () =>\n operations.create(sampleOperation({ idempotencyKey: 'race-create' })),\n ),\n );\n const winners = results.filter((r) => r.created);\n assert.equal(winners.length, 1);\n const winnerId = winners[0]!.record.id;\n for (const r of results) assert.equal(r.record.id, winnerId);\n const listed = (await operations.list({ namespace: 'ns' })).filter(\n (r) => r.idempotencyKey === 'race-create',\n );\n assert.equal(listed.length, 1);\n assert.equal((await operations.getByKey('ns', 'race-create'))?.id, winnerId);\n },\n );\n\n api.it(\n 'resolves N concurrent updates with the same expectedVersion to exactly one winner',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const results = await Promise.allSettled(\n Array.from({ length: 5 }, () =>\n operations.update('ns', created.record.id, { state: 'prepared' }, 1),\n ),\n );\n assert.equal(results.filter((r) => r.status === 'fulfilled').length, 1);\n const rejected = results.filter(isRejected);\n assert.equal(rejected.length, 4);\n for (const r of rejected) {\n assert.equal((r.reason as { code?: unknown }).code, 'VERSION_CONFLICT');\n }\n },\n );\n\n api.it(\n 'resolves N concurrent appendAttempt calls with the same expectedVersion to exactly one winner',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const results = await Promise.allSettled(\n Array.from({ length: 5 }, (_, i) =>\n operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt(`c${i}`),\n { state: 'signed' },\n 1,\n ),\n ),\n );\n assert.equal(results.filter((r) => r.status === 'fulfilled').length, 1);\n const rejected = results.filter(isRejected);\n assert.equal(rejected.length, 4);\n for (const r of rejected) {\n assert.equal((r.reason as { code?: unknown }).code, 'VERSION_CONFLICT');\n }\n assert.equal((await operations.get('ns', created.record.id))?.attempts.length, 1);\n },\n );\n\n api.it('returns disjoint id sets for two concurrent claimDue calls', async () => {\n const { operations } = await create();\n for (let i = 0; i < 4; i++) {\n await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 100 }),\n );\n }\n const [first, second] = await Promise.all([\n operations.claimDue('ns', 'w1', 1_000, 500, 2),\n operations.claimDue('ns', 'w2', 1_000, 500, 2),\n ]);\n assert.equal(first.length + second.length, 4);\n const firstIds = new Set(first.map((r) => r.id));\n for (const record of second) assert.equal(firstIds.has(record.id), false);\n });\n\n api.it(\n 'returns the original record unchanged when a second create uses the same key but a different intentHash',\n async () => {\n const { operations } = await create();\n const first = await operations.create(\n sampleOperation({ idempotencyKey: 'conflict', intentHash: 'hash-a' }),\n );\n const second = await operations.create(\n sampleOperation({ idempotencyKey: 'conflict', intentHash: 'hash-b' }),\n );\n assert.equal(second.created, false);\n assert.deepEqual(second.record, first.record);\n assert.equal(second.record.intentHash, 'hash-a');\n assert.deepEqual(await operations.get('ns', first.record.id), first.record);\n },\n );\n\n api.it(\n 'treats an explicit undefined patch value as a no-op for that field',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const withReservation = await operations.update(\n 'ns',\n created.record.id,\n { reservation: { kind: 'nonce', nonce: 5n } },\n 1,\n );\n const untouched = await operations.update(\n 'ns',\n created.record.id,\n { reservation: undefined },\n withReservation.version,\n );\n assert.deepEqual(untouched.reservation, { kind: 'nonce', nonce: 5n });\n assert.deepEqual((await operations.get('ns', created.record.id))?.reservation, {\n kind: 'nonce',\n nonce: 5n,\n });\n },\n );\n\n api.it(\n 'clear removes the field entirely, not just sets it to undefined',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const withReservation = await operations.update(\n 'ns',\n created.record.id,\n { reservation: { kind: 'nonce', nonce: 5n } },\n 1,\n );\n const cleared = await operations.update(\n 'ns',\n created.record.id,\n { clear: ['reservation'] },\n withReservation.version,\n );\n assert.equal('reservation' in cleared, false);\n const reread = await operations.get('ns', created.record.id);\n assert.equal(reread !== null && 'reservation' in reread, false);\n },\n );\n\n api.it('never returns claims from another namespace', async () => {\n const { operations } = await create();\n await operations.create(\n sampleOperation({ namespace: 'other', state: 'submitted', nextCheckAt: 50 }),\n );\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 50 }));\n const claimed = await operations.claimDue('ns', 'w1', 1_000, 500, 10);\n assert.equal(claimed.length, 1);\n assert.equal(\n claimed.every((r) => r.namespace === 'ns'),\n true,\n );\n });\n\n api.it('orders claims by (nextCheckAt, createdAt)', async () => {\n const { operations } = await create();\n const c = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 300 }))\n ).record;\n const a = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }))\n ).record;\n const b = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 200 }))\n ).record;\n const claimed = await operations.claimDue('ns', 'w1', 1_000, 500, 10);\n assert.deepEqual(\n claimed.map((r) => r.id),\n [a.id, b.id, c.id],\n );\n });\n\n api.it(\n 'limit picks the earliest due record after sorting, not by insertion order',\n async () => {\n const { operations } = await create();\n // Created in descending nextCheckAt order, so a limit-before-sort bug (e.g.\n // slicing then sorting, instead of sorting then slicing) would return the\n // first-inserted (highest nextCheckAt) record instead of the earliest-due one.\n await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 300 }),\n );\n await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 200 }),\n );\n const earliest = (\n await operations.create(\n sampleOperation({ state: 'submitted', nextCheckAt: 100 }),\n )\n ).record;\n const claimed = await operations.claimDue('ns', 'w1', 1_000, 500, 1);\n assert.deepEqual(\n claimed.map((r) => r.id),\n [earliest.id],\n );\n },\n );\n\n api.it(\n 'limit 2 returns the two earliest due records in order, on fresh records',\n async () => {\n const { operations } = await create();\n await operations.create(\n sampleOperation({ namespace: 'limit2', state: 'submitted', nextCheckAt: 300 }),\n );\n const second = (\n await operations.create(\n sampleOperation({\n namespace: 'limit2',\n state: 'submitted',\n nextCheckAt: 200,\n }),\n )\n ).record;\n const first = (\n await operations.create(\n sampleOperation({\n namespace: 'limit2',\n state: 'submitted',\n nextCheckAt: 100,\n }),\n )\n ).record;\n const claimed = await operations.claimDue('limit2', 'w1', 1_000, 500, 2);\n assert.deepEqual(\n claimed.map((r) => r.id),\n [first.id, second.id],\n );\n },\n );\n\n api.it('breaks a nextCheckAt tie by createdAt, in creation order', async () => {\n const { operations, advance } = await create();\n const first = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }))\n ).record;\n await advance(10);\n const second = (\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }))\n ).record;\n const claimed = await operations.claimDue('ns', 'w1', 1_000, 500, 10);\n assert.deepEqual(\n claimed.map((r) => r.id),\n [first.id, second.id],\n );\n });\n\n api.it('limit 0 returns no claims', async () => {\n const { operations } = await create();\n await operations.create(sampleOperation({ state: 'submitted', nextCheckAt: 100 }));\n assert.deepEqual(await operations.claimDue('ns', 'w1', 1_000, 500, 0), []);\n });\n\n api.it('returns matching records in creation order', async () => {\n const { operations } = await create();\n const a = (await operations.create(sampleOperation({ namespace: 'order' }))).record;\n const b = (await operations.create(sampleOperation({ namespace: 'order' }))).record;\n const c = (await operations.create(sampleOperation({ namespace: 'order' }))).record;\n const found = await operations.list({ namespace: 'order' });\n assert.deepEqual(\n found.map((r) => r.id),\n [a.id, b.id, c.id],\n );\n });\n\n api.it(\n 'putObservation never changes the Operation version, and rejects a stale expectedVersion',\n async () => {\n const { operations } = await create();\n const created = await operations.create(sampleOperation());\n const afterAppend = await operations.appendAttempt(\n 'ns',\n created.record.id,\n sampleAttempt('obs1'),\n { state: 'signed' },\n 1,\n );\n const base = {\n attemptId: 'obs1',\n operationId: created.record.id,\n state: 'included' as const,\n evidence: 'observed' as const,\n confirmations: 1,\n };\n await operations.putObservation(base, null);\n assert.equal(\n (await operations.get('ns', created.record.id))?.version,\n afterAppend.version,\n );\n await operations.putObservation({ ...base, confirmations: 2 }, 1);\n assert.equal(\n (await operations.get('ns', created.record.id))?.version,\n afterAppend.version,\n );\n await rejectsWithCode(\n operations.putObservation({ ...base, confirmations: 3 }, 1),\n 'VERSION_CONFLICT',\n );\n },\n );\n\n api.it(\n 'does not resolve a tx hash to an operation with the same id in a different namespace',\n async () => {\n const { operations } = await create();\n const sharedId = 'op_shared_1';\n await operations.create(\n sampleOperation({ id: sharedId, namespace: 'ns-a', idempotencyKey: 'key-a' }),\n );\n await operations.create(\n sampleOperation({ id: sharedId, namespace: 'ns-b', idempotencyKey: 'key-b' }),\n );\n await operations.appendAttempt(\n 'ns-a',\n sharedId,\n sampleAttempt('shared-attempt'),\n { state: 'signed' },\n 1,\n );\n await operations.putObservation(\n {\n attemptId: 'shared-attempt',\n operationId: sharedId,\n state: 'included',\n evidence: 'observed',\n confirmations: 1,\n txHash: 'shared-hash',\n },\n null,\n );\n const found = await operations.findByRef('ns-a', 'shared-hash');\n assert.equal(found?.id, sharedId);\n assert.equal(found?.namespace, 'ns-a');\n assert.equal(await operations.findByRef('ns-b', 'shared-hash'), null);\n },\n );\n });\n}\n"]}
@@ -0,0 +1,6 @@
1
+ import type { SequenceStore } from '../../core/store/types';
2
+ import { type ContractTestApi } from './api';
3
+ export interface SequenceHarness {
4
+ readonly sequences: SequenceStore;
5
+ }
6
+ export declare function describeSequenceStoreContract(api: ContractTestApi, create: () => SequenceHarness | Promise<SequenceHarness>): void;
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.describeSequenceStoreContract = describeSequenceStoreContract;
7
+ const strict_1 = __importDefault(require("node:assert/strict"));
8
+ const api_1 = require("./api");
9
+ function describeSequenceStoreContract(api, create) {
10
+ api.describe('SequenceStore contract', () => {
11
+ api.it('returns null for unknown keys', async () => {
12
+ const { sequences } = await create();
13
+ strict_1.default.equal(await sequences.get('nope'), null);
14
+ });
15
+ api.it('creates with expectedVersion null and increments versions', async () => {
16
+ const { sequences } = await create();
17
+ await sequences.put('k', { next: 5n, released: [2n], fence: 1n }, null);
18
+ const first = await sequences.get('k');
19
+ strict_1.default.deepEqual(first, { next: 5n, released: [2n], fence: 1n, version: 1 });
20
+ await sequences.put('k', { next: 6n, released: [], fence: 1n }, 1);
21
+ strict_1.default.equal((await sequences.get('k'))?.version, 2);
22
+ });
23
+ api.it('rejects stale versions and leaves stored state unchanged', async () => {
24
+ const { sequences } = await create();
25
+ await sequences.put('k', { next: 1n, released: [], fence: 1n }, null);
26
+ await sequences.put('k', { next: 2n, released: [], fence: 1n }, 1);
27
+ const stored = { next: 2n, released: [], fence: 1n, version: 2 };
28
+ await (0, api_1.rejectsWithCode)(sequences.put('k', { next: 3n, released: [], fence: 1n }, 1), 'VERSION_CONFLICT');
29
+ strict_1.default.deepEqual(await sequences.get('k'), stored);
30
+ await (0, api_1.rejectsWithCode)(sequences.put('k', { next: 3n, released: [], fence: 1n }, null), 'VERSION_CONFLICT');
31
+ strict_1.default.deepEqual(await sequences.get('k'), stored);
32
+ });
33
+ api.it('rejects writes from a stale fencing token and leaves stored state unchanged', async () => {
34
+ const { sequences } = await create();
35
+ await sequences.put('k', { next: 1n, released: [], fence: 2n }, null);
36
+ const stored = { next: 1n, released: [], fence: 2n, version: 1 };
37
+ await (0, api_1.rejectsWithCode)(sequences.put('k', { next: 9n, released: [], fence: 1n }, 1), 'FENCING');
38
+ strict_1.default.deepEqual(await sequences.get('k'), stored);
39
+ });
40
+ api.it('keeps the key out of its errors', async () => {
41
+ // A sequence key embeds a wallet address, and error messages reach logs.
42
+ const { sequences } = await create();
43
+ const address = '0x5eC0FFEE00000000000000000000000000c0FFEE';
44
+ const key = `ns:evm:mainnet:${address}`;
45
+ await sequences.put(key, { next: 1n, released: [], fence: 2n }, null);
46
+ for (const [state, expected, code] of [
47
+ [{ next: 2n, released: [], fence: 2n }, null, 'VERSION_CONFLICT'],
48
+ [{ next: 2n, released: [], fence: 2n }, 7, 'VERSION_CONFLICT'],
49
+ [{ next: 2n, released: [], fence: 1n }, 1, 'FENCING'],
50
+ ]) {
51
+ await (0, api_1.rejectsWithCodeKeepingOut)(sequences.put(key, state, expected), code, [
52
+ key,
53
+ address,
54
+ address.toLowerCase(),
55
+ ]);
56
+ }
57
+ });
58
+ api.it('round-trips large bigints exactly and isolates returned values', async () => {
59
+ const { sequences } = await create();
60
+ await sequences.put('k', { next: 2n ** 70n, released: [2n ** 64n + 1n], fence: 3n }, null);
61
+ const state = await sequences.get('k');
62
+ strict_1.default.equal(state?.next, 2n ** 70n);
63
+ (state?.released).push(1n);
64
+ strict_1.default.deepEqual((await sequences.get('k'))?.released, [2n ** 64n + 1n]);
65
+ });
66
+ });
67
+ }
68
+ //# sourceMappingURL=sequences.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequences.js","sourceRoot":"","sources":["../../../src/testing/contracts/sequences.ts"],"names":[],"mappings":"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","sourcesContent":["import assert from 'node:assert/strict';\nimport type { SequenceStore } from '../../core/store/types';\nimport { rejectsWithCode, rejectsWithCodeKeepingOut, type ContractTestApi } from './api';\n\nexport interface SequenceHarness {\n readonly sequences: SequenceStore;\n}\n\nexport function describeSequenceStoreContract(\n api: ContractTestApi,\n create: () => SequenceHarness | Promise<SequenceHarness>,\n): void {\n api.describe('SequenceStore contract', () => {\n api.it('returns null for unknown keys', async () => {\n const { sequences } = await create();\n assert.equal(await sequences.get('nope'), null);\n });\n\n api.it('creates with expectedVersion null and increments versions', async () => {\n const { sequences } = await create();\n await sequences.put('k', { next: 5n, released: [2n], fence: 1n }, null);\n const first = await sequences.get('k');\n assert.deepEqual(first, { next: 5n, released: [2n], fence: 1n, version: 1 });\n await sequences.put('k', { next: 6n, released: [], fence: 1n }, 1);\n assert.equal((await sequences.get('k'))?.version, 2);\n });\n\n api.it('rejects stale versions and leaves stored state unchanged', async () => {\n const { sequences } = await create();\n await sequences.put('k', { next: 1n, released: [], fence: 1n }, null);\n await sequences.put('k', { next: 2n, released: [], fence: 1n }, 1);\n const stored = { next: 2n, released: [], fence: 1n, version: 2 };\n await rejectsWithCode(\n sequences.put('k', { next: 3n, released: [], fence: 1n }, 1),\n 'VERSION_CONFLICT',\n );\n assert.deepEqual(await sequences.get('k'), stored);\n await rejectsWithCode(\n sequences.put('k', { next: 3n, released: [], fence: 1n }, null),\n 'VERSION_CONFLICT',\n );\n assert.deepEqual(await sequences.get('k'), stored);\n });\n\n api.it(\n 'rejects writes from a stale fencing token and leaves stored state unchanged',\n async () => {\n const { sequences } = await create();\n await sequences.put('k', { next: 1n, released: [], fence: 2n }, null);\n const stored = { next: 1n, released: [], fence: 2n, version: 1 };\n await rejectsWithCode(\n sequences.put('k', { next: 9n, released: [], fence: 1n }, 1),\n 'FENCING',\n );\n assert.deepEqual(await sequences.get('k'), stored);\n },\n );\n\n api.it('keeps the key out of its errors', async () => {\n // A sequence key embeds a wallet address, and error messages reach logs.\n const { sequences } = await create();\n const address = '0x5eC0FFEE00000000000000000000000000c0FFEE';\n const key = `ns:evm:mainnet:${address}`;\n await sequences.put(key, { next: 1n, released: [], fence: 2n }, null);\n for (const [state, expected, code] of [\n [{ next: 2n, released: [], fence: 2n }, null, 'VERSION_CONFLICT'],\n [{ next: 2n, released: [], fence: 2n }, 7, 'VERSION_CONFLICT'],\n [{ next: 2n, released: [], fence: 1n }, 1, 'FENCING'],\n ] as const) {\n await rejectsWithCodeKeepingOut(sequences.put(key, state, expected), code, [\n key,\n address,\n address.toLowerCase(),\n ]);\n }\n });\n\n api.it('round-trips large bigints exactly and isolates returned values', async () => {\n const { sequences } = await create();\n await sequences.put(\n 'k',\n { next: 2n ** 70n, released: [2n ** 64n + 1n], fence: 3n },\n null,\n );\n const state = await sequences.get('k');\n assert.equal(state?.next, 2n ** 70n);\n (state?.released as bigint[]).push(1n);\n assert.deepEqual((await sequences.get('k'))?.released, [2n ** 64n + 1n]);\n });\n });\n}\n"]}
@@ -0,0 +1,63 @@
1
+ import type { Blockchain } from '../core/blockchain/handle';
2
+ import type { AioOptions, Hooks, LifecycleOptions, WalletConfig } from '../core/config/types';
3
+ import { CryptoAio } from '../core/container/container';
4
+ import type { Signer } from '../core/signing/types';
5
+ import type { Stores } from '../core/store/types';
6
+ import type { TransportOptions } from '../core/transport/types';
7
+ import { FakeChain, type FakeChainOptions, type FakeEndpointOptions, type FakeOrdering } from './fake-chain';
8
+ import { FakeClock } from './fake-clock';
9
+ export type FakeChainId = 'fakechain' | 'fakeexpiry' | 'fakeseqno';
10
+ export interface FakeEnvOptions {
11
+ readonly ordering?: FakeOrdering;
12
+ readonly endpoints?: readonly (string | ({
13
+ readonly name: string;
14
+ } & FakeEndpointOptions))[];
15
+ /** Funds the wallet with this many base units (default 1_000_000). Use 0n for none. */
16
+ readonly fund?: bigint;
17
+ readonly chain?: Omit<FakeChainOptions, 'ordering' | 'clock'>;
18
+ readonly wallets?: Readonly<Record<string, WalletConfig>>;
19
+ readonly signer?: Signer;
20
+ readonly stores?: Partial<Stores>;
21
+ readonly transport?: Omit<TransportOptions, 'fetch'>;
22
+ readonly lifecycle?: LifecycleOptions;
23
+ readonly hooks?: Hooks;
24
+ /** Extra container options merged last. Never `clock`, `stores` or `transport` — those are
25
+ * always the generation-fenced values, so this type excludes them; passing any of them
26
+ * would either fail to type-check or (if forced through) be silently overridden. Its
27
+ * `signers` are merged by name over the default signer, and every entry is fenced. */
28
+ readonly aio?: Omit<AioOptions, 'clock' | 'stores' | 'transport'>;
29
+ }
30
+ export interface FakeEnv {
31
+ readonly clock: FakeClock;
32
+ readonly chain: FakeChain;
33
+ readonly aio: CryptoAio;
34
+ readonly bc: Blockchain<FakeChainId>;
35
+ /**
36
+ * The raw, unfenced `Signer` instance — the same object across every `restart()`
37
+ * (stateless, never rebuilt). The container itself holds a fenced PROXY of it (see
38
+ * `generationSigner`), not this object, so an identity assertion against the
39
+ * container's copy (e.g. `containerOf(aio).effective().signers[id]`) must compare `.id`,
40
+ * never `===` against this field.
41
+ */
42
+ readonly signer: Signer;
43
+ readonly stores: Stores;
44
+ readonly address: string;
45
+ readonly chainId: FakeChainId;
46
+ /** Drives a promise to completion on fake time (100 ms steps by default). */
47
+ run<T>(promise: Promise<T>, stepMs?: number): Promise<T>;
48
+ /** A fresh, unrelated fake-chain address. */
49
+ stranger(): string;
50
+ /**
51
+ * Simulates a process restart: a new container (new pool, bus and owner id) attached to
52
+ * the same durable state (stores, FakeChain, the one simulated FakeClock). By default the
53
+ * previous generation's env keeps working — later tasks run two generations concurrently
54
+ * this way. `{ killPrevious: true }` simulates "the old process died": every clock sleep,
55
+ * fetch and store call already in flight or issued later on the OLD generation's handles
56
+ * and stores never settles (neither resolves nor rejects), so it can make no further
57
+ * progress and no old continuation can write to shared state.
58
+ */
59
+ restart(options?: {
60
+ readonly killPrevious?: boolean;
61
+ }): Promise<FakeEnv>;
62
+ }
63
+ export declare function createFakeEnv(options?: FakeEnvOptions): Promise<FakeEnv>;
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFakeEnv = createFakeEnv;
4
+ const secp256k1_1 = require("@noble/curves/secp256k1");
5
+ const container_1 = require("../core/container/container");
6
+ const logger_1 = require("../core/events/logger");
7
+ const local_1 = require("../core/signing/local");
8
+ const memory_1 = require("../core/store/memory");
9
+ const fake_chain_1 = require("./fake-chain");
10
+ const fake_clock_1 = require("./fake-clock");
11
+ const fake_plugin_1 = require("./fake-plugin");
12
+ const generation_1 = require("./generation");
13
+ async function createFakeEnv(options = {}) {
14
+ const clock = new fake_clock_1.FakeClock();
15
+ const ordering = options.ordering ?? 'nonce';
16
+ const chain = new fake_chain_1.FakeChain({ ...options.chain, ordering, clock });
17
+ const chainId = ordering === 'nonce'
18
+ ? 'fakechain'
19
+ : ordering === 'expiry'
20
+ ? 'fakeexpiry'
21
+ : 'fakeseqno';
22
+ const endpoints = (options.endpoints ?? ['main']).map((entry) => {
23
+ const { name, ...rest } = typeof entry === 'string' ? { name: entry } : entry;
24
+ return { name, url: chain.endpoint(name, rest) };
25
+ });
26
+ const signer = options.signer ?? local_1.localSigner.generate({ curves: ['secp256k1'], id: 'hot' }).signer;
27
+ const overrides = Object.fromEntries(Object.entries(options.stores ?? {}).filter(([, store]) => store !== undefined));
28
+ const stores = { ...(0, memory_1.createMemoryStores)(clock), ...overrides };
29
+ const env = await assemble({ clock, chain, chainId, endpoints, signer, stores, options }, { alive: true });
30
+ const fund = options.fund ?? 1000000n;
31
+ if (fund > 0n)
32
+ chain.fund(env.address, fund);
33
+ return env;
34
+ }
35
+ async function assemble(shared, generation) {
36
+ const { clock, chain, chainId, endpoints, signer, stores, options } = shared;
37
+ // A local signer is stateless (holds no per-process state), so it is shared across
38
+ // generations rather than rebuilt on every restart() — only its calls are fenced.
39
+ // Every entry of the FINAL merged map (the default signer plus `options.aio.signers`,
40
+ // the latter winning by name) is fenced, and it's applied after `...options.aio` below
41
+ // so an `aio.signers` map can never bypass the fence.
42
+ const fenced = (0, generation_1.fenceGeneration)({
43
+ clock,
44
+ fetch: chain.fetch,
45
+ stores,
46
+ signers: { [signer.id]: signer, ...options.aio?.signers },
47
+ }, generation);
48
+ const genStores = fenced.stores;
49
+ const aio = new container_1.CryptoAio({
50
+ env: false,
51
+ logger: logger_1.noopLogger,
52
+ plugins: [(0, fake_plugin_1.fakePlugin)()],
53
+ providers: { fake: { endpoints } },
54
+ wallets: { main: { signer: signer.id }, ...options.wallets },
55
+ chains: { [chainId]: { provider: 'fake', wallet: 'main' } },
56
+ lifecycle: {
57
+ pollIntervalMs: 1_000,
58
+ droppedGracePeriodMs: 10_000,
59
+ rebroadcastIntervalMs: 5_000,
60
+ waitTimeoutMs: 120_000,
61
+ leaseMs: 30_000,
62
+ claimLeaseMs: 30_000,
63
+ ...options.lifecycle,
64
+ },
65
+ ...(options.hooks ? { hooks: options.hooks } : {}),
66
+ ...options.aio,
67
+ // Applied AFTER `options.aio`, so a generation's fencing can never be shadowed by it
68
+ // (its type already excludes clock/stores/transport — see `FakeEnvOptions.aio`; `signers`
69
+ // is the fenced merge above). `env.stores` below reads the same `genStores` object
70
+ // handed to the container here, so they're guaranteed to be the same fenced instances.
71
+ signers: fenced.signers,
72
+ clock: fenced.clock,
73
+ stores: genStores,
74
+ transport: {
75
+ fetch: fenced.fetch,
76
+ baseDelayMs: 1,
77
+ maxDelayMs: 5,
78
+ timeoutMs: 5_000,
79
+ ...options.transport,
80
+ },
81
+ });
82
+ const bc = aio.blockchain({ chain: chainId });
83
+ const run = (promise, stepMs = 100) => (0, fake_clock_1.drive)(clock, promise, stepMs);
84
+ const address = (await run(bc.walletAddress())).canonical;
85
+ const stranger = () => (0, fake_chain_1.fakeAddress)(secp256k1_1.secp256k1.getPublicKey(secp256k1_1.secp256k1.utils.randomPrivateKey(), true));
86
+ const restart = (restartOptions) => {
87
+ if (restartOptions?.killPrevious)
88
+ generation.alive = false;
89
+ return assemble(shared, { alive: true });
90
+ };
91
+ return {
92
+ clock,
93
+ chain,
94
+ aio,
95
+ bc,
96
+ signer,
97
+ stores: genStores,
98
+ address,
99
+ chainId,
100
+ run,
101
+ stranger,
102
+ restart,
103
+ };
104
+ }
105
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/testing/env.ts"],"names":[],"mappings":"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","sourcesContent":["import { secp256k1 } from '@noble/curves/secp256k1';\nimport type { Blockchain } from '../core/blockchain/handle';\nimport type {\n AioOptions,\n Hooks,\n LifecycleOptions,\n WalletConfig,\n} from '../core/config/types';\nimport { CryptoAio } from '../core/container/container';\nimport { noopLogger } from '../core/events/logger';\nimport { localSigner } from '../core/signing/local';\nimport type { Signer } from '../core/signing/types';\nimport { createMemoryStores } from '../core/store/memory';\nimport type { Stores } from '../core/store/types';\nimport type { TransportOptions } from '../core/transport/types';\nimport {\n FakeChain,\n fakeAddress,\n type FakeChainOptions,\n type FakeEndpointOptions,\n type FakeOrdering,\n} from './fake-chain';\nimport { FakeClock, drive } from './fake-clock';\nimport { fakePlugin } from './fake-plugin';\nimport { fenceGeneration, type Generation } from './generation';\n\nexport type FakeChainId = 'fakechain' | 'fakeexpiry' | 'fakeseqno';\n\nexport interface FakeEnvOptions {\n readonly ordering?: FakeOrdering;\n readonly endpoints?: readonly (\n string | ({ readonly name: string } & FakeEndpointOptions)\n )[];\n /** Funds the wallet with this many base units (default 1_000_000). Use 0n for none. */\n readonly fund?: bigint;\n readonly chain?: Omit<FakeChainOptions, 'ordering' | 'clock'>;\n readonly wallets?: Readonly<Record<string, WalletConfig>>;\n readonly signer?: Signer;\n readonly stores?: Partial<Stores>;\n readonly transport?: Omit<TransportOptions, 'fetch'>;\n readonly lifecycle?: LifecycleOptions;\n readonly hooks?: Hooks;\n /** Extra container options merged last. Never `clock`, `stores` or `transport` — those are\n * always the generation-fenced values, so this type excludes them; passing any of them\n * would either fail to type-check or (if forced through) be silently overridden. Its\n * `signers` are merged by name over the default signer, and every entry is fenced. */\n readonly aio?: Omit<AioOptions, 'clock' | 'stores' | 'transport'>;\n}\n\nexport interface FakeEnv {\n readonly clock: FakeClock;\n readonly chain: FakeChain;\n readonly aio: CryptoAio;\n readonly bc: Blockchain<FakeChainId>;\n /**\n * The raw, unfenced `Signer` instance — the same object across every `restart()`\n * (stateless, never rebuilt). The container itself holds a fenced PROXY of it (see\n * `generationSigner`), not this object, so an identity assertion against the\n * container's copy (e.g. `containerOf(aio).effective().signers[id]`) must compare `.id`,\n * never `===` against this field.\n */\n readonly signer: Signer;\n readonly stores: Stores;\n readonly address: string;\n readonly chainId: FakeChainId;\n /** Drives a promise to completion on fake time (100 ms steps by default). */\n run<T>(promise: Promise<T>, stepMs?: number): Promise<T>;\n /** A fresh, unrelated fake-chain address. */\n stranger(): string;\n /**\n * Simulates a process restart: a new container (new pool, bus and owner id) attached to\n * the same durable state (stores, FakeChain, the one simulated FakeClock). By default the\n * previous generation's env keeps working — later tasks run two generations concurrently\n * this way. `{ killPrevious: true }` simulates \"the old process died\": every clock sleep,\n * fetch and store call already in flight or issued later on the OLD generation's handles\n * and stores never settles (neither resolves nor rejects), so it can make no further\n * progress and no old continuation can write to shared state.\n */\n restart(options?: { readonly killPrevious?: boolean }): Promise<FakeEnv>;\n}\n\ninterface Shared {\n readonly clock: FakeClock;\n readonly chain: FakeChain;\n readonly chainId: FakeChainId;\n readonly endpoints: readonly { readonly name: string; readonly url: string }[];\n readonly signer: Signer;\n readonly stores: Stores;\n readonly options: FakeEnvOptions;\n}\n\nexport async function createFakeEnv(options: FakeEnvOptions = {}): Promise<FakeEnv> {\n const clock = new FakeClock();\n const ordering = options.ordering ?? 'nonce';\n const chain = new FakeChain({ ...options.chain, ordering, clock });\n const chainId: FakeChainId =\n ordering === 'nonce'\n ? 'fakechain'\n : ordering === 'expiry'\n ? 'fakeexpiry'\n : 'fakeseqno';\n const endpoints = (options.endpoints ?? ['main']).map((entry) => {\n const { name, ...rest } = typeof entry === 'string' ? { name: entry } : entry;\n return { name, url: chain.endpoint(name, rest) };\n });\n const signer =\n options.signer ?? localSigner.generate({ curves: ['secp256k1'], id: 'hot' }).signer;\n const overrides = Object.fromEntries(\n Object.entries(options.stores ?? {}).filter(([, store]) => store !== undefined),\n ) as Partial<Stores>;\n const stores: Stores = { ...createMemoryStores(clock), ...overrides };\n const env = await assemble(\n { clock, chain, chainId, endpoints, signer, stores, options },\n { alive: true },\n );\n const fund = options.fund ?? 1_000_000n;\n if (fund > 0n) chain.fund(env.address, fund);\n return env;\n}\n\nasync function assemble(shared: Shared, generation: Generation): Promise<FakeEnv> {\n const { clock, chain, chainId, endpoints, signer, stores, options } = shared;\n // A local signer is stateless (holds no per-process state), so it is shared across\n // generations rather than rebuilt on every restart() — only its calls are fenced.\n // Every entry of the FINAL merged map (the default signer plus `options.aio.signers`,\n // the latter winning by name) is fenced, and it's applied after `...options.aio` below\n // so an `aio.signers` map can never bypass the fence.\n const fenced = fenceGeneration(\n {\n clock,\n fetch: chain.fetch,\n stores,\n signers: { [signer.id]: signer, ...options.aio?.signers },\n },\n generation,\n );\n const genStores = fenced.stores;\n const aio = new CryptoAio({\n env: false,\n logger: noopLogger,\n plugins: [fakePlugin()],\n providers: { fake: { endpoints } },\n wallets: { main: { signer: signer.id }, ...options.wallets },\n chains: { [chainId]: { provider: 'fake', wallet: 'main' } },\n lifecycle: {\n pollIntervalMs: 1_000,\n droppedGracePeriodMs: 10_000,\n rebroadcastIntervalMs: 5_000,\n waitTimeoutMs: 120_000,\n leaseMs: 30_000,\n claimLeaseMs: 30_000,\n ...options.lifecycle,\n },\n ...(options.hooks ? { hooks: options.hooks } : {}),\n ...options.aio,\n // Applied AFTER `options.aio`, so a generation's fencing can never be shadowed by it\n // (its type already excludes clock/stores/transport — see `FakeEnvOptions.aio`; `signers`\n // is the fenced merge above). `env.stores` below reads the same `genStores` object\n // handed to the container here, so they're guaranteed to be the same fenced instances.\n signers: fenced.signers,\n clock: fenced.clock,\n stores: genStores,\n transport: {\n fetch: fenced.fetch,\n baseDelayMs: 1,\n maxDelayMs: 5,\n timeoutMs: 5_000,\n ...options.transport,\n },\n });\n const bc = aio.blockchain({ chain: chainId });\n const run = <T>(promise: Promise<T>, stepMs = 100): Promise<T> =>\n drive(clock, promise, stepMs);\n const address = (await run(bc.walletAddress())).canonical;\n const stranger = () =>\n fakeAddress(secp256k1.getPublicKey(secp256k1.utils.randomPrivateKey(), true));\n const restart = (restartOptions?: {\n readonly killPrevious?: boolean;\n }): Promise<FakeEnv> => {\n if (restartOptions?.killPrevious) generation.alive = false;\n return assemble(shared, { alive: true });\n };\n return {\n clock,\n chain,\n aio,\n bc,\n signer,\n stores: genStores,\n address,\n chainId,\n run,\n stranger,\n restart,\n };\n}\n"]}
@@ -0,0 +1,118 @@
1
+ import { type Clock } from '../core/util/clock';
2
+ export type FakeOrdering = 'nonce' | 'seqno' | 'expiry';
3
+ /** Unsigned fake transaction; numbers travel as decimal strings. */
4
+ export interface FakeUnsigned {
5
+ readonly chainId: string;
6
+ readonly from: string;
7
+ readonly to: string;
8
+ readonly amount: string;
9
+ readonly fee: string;
10
+ readonly nonce?: string;
11
+ readonly lastValidHeight?: string;
12
+ readonly memo?: string;
13
+ }
14
+ export interface FakeEnvelope {
15
+ readonly tx: FakeUnsigned;
16
+ readonly sig: string;
17
+ readonly recovery: number;
18
+ readonly pub: string;
19
+ }
20
+ export interface FakeWireTx {
21
+ readonly id: string;
22
+ readonly from: string;
23
+ readonly to: string;
24
+ readonly amount: string;
25
+ readonly fee: string;
26
+ readonly nonce?: string;
27
+ readonly memo?: string;
28
+ readonly blockHeight?: string;
29
+ readonly blockHash?: string;
30
+ readonly success?: boolean;
31
+ readonly pending?: boolean;
32
+ }
33
+ export interface FakeWireBlock {
34
+ readonly height: string;
35
+ readonly hash: string;
36
+ readonly parentHash: string;
37
+ readonly timestamp: number;
38
+ readonly txIds: readonly string[];
39
+ readonly txs?: readonly FakeWireTx[];
40
+ }
41
+ export interface FakeEndpointOptions {
42
+ lag?: number;
43
+ identity?: string;
44
+ seesMempool?: boolean;
45
+ down?: boolean;
46
+ html?: boolean;
47
+ acceptThenFail?: boolean;
48
+ refuseNext?: string;
49
+ forkFinalized?: boolean;
50
+ /**
51
+ * A single endpoint lying about blocks: above this height its block reads
52
+ * (`fake_getBlock`, `fake_getBlockHash`) serve a private fork, with other hashes and none
53
+ * of the chain's transactions, and `fake_getTransaction` does not see transactions mined
54
+ * there. Heights, nonces, balances and finality stay honest.
55
+ */
56
+ forkAbove?: number;
57
+ }
58
+ export interface FakeChainOptions {
59
+ readonly ordering?: FakeOrdering;
60
+ readonly chainId?: string;
61
+ readonly finalityDepth?: number;
62
+ readonly minFee?: bigint;
63
+ readonly replacementBumpPercent?: number;
64
+ readonly clock?: Clock;
65
+ }
66
+ export declare const REVERT_ADDRESS: string;
67
+ export declare function fakeAddress(publicKey: Uint8Array): string;
68
+ export declare function isFakeAddress(value: string): boolean;
69
+ export declare function fakeDigest(tx: FakeUnsigned): Uint8Array;
70
+ export declare function encodeEnvelope(envelope: FakeEnvelope): string;
71
+ export declare function decodeEnvelope(raw: string): FakeEnvelope | undefined;
72
+ export declare function fakeTxId(raw: string): string;
73
+ /** Signs outside the library (for tests that craft conflicting transactions). */
74
+ export declare function signFake(tx: FakeUnsigned, privateKey: Uint8Array): string;
75
+ export interface FakeReceipt {
76
+ readonly success: boolean;
77
+ readonly height: bigint;
78
+ readonly hash: string;
79
+ }
80
+ export declare class FakeChain {
81
+ #private;
82
+ readonly ordering: FakeOrdering;
83
+ readonly chainId: string;
84
+ readonly finalityDepth: number;
85
+ readonly minFee: bigint;
86
+ readonly bumpPercent: bigint;
87
+ constructor(options?: FakeChainOptions);
88
+ get head(): bigint;
89
+ finalizedHeight(): bigint;
90
+ block(height: bigint): {
91
+ height: bigint;
92
+ hash: string;
93
+ parentHash: string;
94
+ txIds: string[];
95
+ } | undefined;
96
+ fund(address: string, amount: bigint): void;
97
+ balance(address: string, height?: bigint): bigint;
98
+ nonce(address: string, height?: bigint): bigint;
99
+ receipt(id: string, height?: bigint): FakeReceipt | undefined;
100
+ inMempool(id: string): boolean;
101
+ sendCount(id: string): number;
102
+ dropFromMempool(id: string): void;
103
+ /** Admits a raw transaction directly (bypassing endpoints). Throws the node's error message. */
104
+ submit(raw: string): string;
105
+ mine(count?: number): void;
106
+ /**
107
+ * Replaces the last `depth` blocks with `depth + 1` new ones; dropped txs do not return.
108
+ * `options.force` bypasses the finalized-height guard; it exists only to simulate an
109
+ * adversarial "chain lied about finality" scenario and is never needed for an honest reorg.
110
+ */
111
+ reorg(depth: number, options?: {
112
+ readonly drop?: readonly string[];
113
+ readonly force?: boolean;
114
+ }): void;
115
+ endpoint(name: string, options?: FakeEndpointOptions): string;
116
+ configureEndpoint(name: string, patch: FakeEndpointOptions): void;
117
+ readonly fetch: typeof fetch;
118
+ }