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,335 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvmClientBase = exports.ADDRESS_WORD = exports.ABI_WORD = exports.ADDRESS = void 0;
4
+ exports.uncompressedPublicKey = uncompressedPublicKey;
5
+ exports.quantity = quantity;
6
+ exports.transferLogWords = transferLogWords;
7
+ exports.blockParam = blockParam;
8
+ /**
9
+ * The SDK-free half of every `EvmClient`: the JSON-RPC methods the driver calls and the
10
+ * normalization of their answers into plain data. A subclass supplies the SDK half: the
11
+ * `send` bridge (the SDK's own JSON-RPC primitive, wired to the transport) and the codec.
12
+ *
13
+ * I/O never uses an SDK's high-level helpers: those
14
+ * issue extra calls under the wrong tags (ethers `broadcastTransaction` also reads the block
15
+ * number; `getTransactionReceipt` may fetch the transaction), throw on not-found (web3
16
+ * `TransactionNotFound`) or drop chain fields the fees need (OP `l1Fee`, Arbitrum
17
+ * `gasUsedForL1`). So one driver call is exactly one tagged JSON-RPC request.
18
+ */
19
+ const secp256k1_1 = require("@noble/curves/secp256k1");
20
+ const error_1 = require("../../core/errors/error");
21
+ /** `0x` and 40 hex digits; the checksum is the SDK's to check. */
22
+ exports.ADDRESS = /^0x[0-9a-fA-F]{40}$/;
23
+ /**
24
+ * The 65-byte uncompressed form of a secp256k1 public key, accepted only as a 33-byte
25
+ * compressed key (`0x02`/`0x03`) or a 65-byte `0x04` key that decodes to a point on the
26
+ * curve. Both clients derive addresses from its result, never from the caller's bytes: an
27
+ * SDK may read 32 bytes as a *private* key or 64 bytes as an unprefixed public key, and
28
+ * either would yield an address nobody holds the key to. The error never echoes the input.
29
+ */
30
+ function uncompressedPublicKey(publicKey) {
31
+ const prefix = publicKey instanceof Uint8Array ? publicKey[0] : undefined;
32
+ const shaped = ((prefix === 0x02 || prefix === 0x03) && publicKey.length === 33) ||
33
+ (prefix === 0x04 && publicKey.length === 65);
34
+ try {
35
+ if (shaped)
36
+ return secp256k1_1.secp256k1.ProjectivePoint.fromHex(publicKey).toRawBytes(false);
37
+ }
38
+ catch {
39
+ // Not a point on the curve.
40
+ }
41
+ throw new error_1.ValidationError('INVALID_ADDRESS', 'public key must be a 33- or 65-byte secp256k1 point');
42
+ }
43
+ const HASH = /^0x[0-9a-fA-F]{64}$/;
44
+ const QUANTITY = /^0x[0-9a-fA-F]+$/;
45
+ const DATA = /^0x(?:[0-9a-fA-F]{2})*$/;
46
+ const BLOOM = /^0x[0-9a-fA-F]{512}$/;
47
+ function malformed(field) {
48
+ return new error_1.ProviderError('PROVIDER_UNAVAILABLE', `malformed ${field} in a JSON-RPC answer`);
49
+ }
50
+ /**
51
+ * A JSON-RPC quantity (`0x` and hex digits) as a bigint. Anything else throws a retryable
52
+ * `PROVIDER_UNAVAILABLE` naming `field`: the one check of every hex quantity the driver
53
+ * reads, quorum keys and health probes included (a key that throws is a disagreement).
54
+ */
55
+ function quantity(value, field) {
56
+ if (typeof value !== 'string' || !QUANTITY.test(value))
57
+ throw malformed(field);
58
+ return BigInt(value);
59
+ }
60
+ function optionalQuantity(value, field) {
61
+ return value === undefined || value === null ? undefined : quantity(value, field);
62
+ }
63
+ function hash(value, field) {
64
+ if (typeof value !== 'string' || !HASH.test(value))
65
+ throw malformed(field);
66
+ return value.toLowerCase();
67
+ }
68
+ function data(value, field) {
69
+ if (typeof value !== 'string' || !DATA.test(value))
70
+ throw malformed(field);
71
+ return value.toLowerCase();
72
+ }
73
+ function object(value, field) {
74
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
75
+ throw malformed(field);
76
+ return value;
77
+ }
78
+ /** One ABI word: 32 bytes. */
79
+ exports.ABI_WORD = /^0x[0-9a-fA-F]{64}$/;
80
+ /** An ABI-encoded address: 12 zero bytes, then 20 address bytes. */
81
+ exports.ADDRESS_WORD = /^0x0{24}[0-9a-fA-F]{40}$/;
82
+ /**
83
+ * The three ABI words of an ERC-20 `Transfer` log (`from`, `to`, amount), or `null`. Anyone
84
+ * can emit a look-alike event: anything but the topic and three well-formed words is not a
85
+ * transfer, and never an error that would fail a whole block scan.
86
+ */
87
+ function transferLogWords(log, topic) {
88
+ const [first, from, to] = log.topics;
89
+ if (log.topics.length !== 3 ||
90
+ first !== topic ||
91
+ !exports.ADDRESS_WORD.test(from) ||
92
+ !exports.ADDRESS_WORD.test(to) ||
93
+ !exports.ABI_WORD.test(log.data)) {
94
+ return null;
95
+ }
96
+ return { from: from, to: to, data: log.data };
97
+ }
98
+ function blockParam(block) {
99
+ return typeof block === 'bigint' ? `0x${block.toString(16)}` : block;
100
+ }
101
+ const hexOf = (value) => `0x${value.toString(16)}`;
102
+ class EvmClientBase {
103
+ /** The chain id of the network this client serves. */
104
+ chainId;
105
+ constructor(chainId) {
106
+ this.chainId = chainId;
107
+ }
108
+ serializeUnsigned(tx) {
109
+ return this.encodeUnsigned(this.#onNetwork(tx));
110
+ }
111
+ unsignedHash(tx) {
112
+ return this.hashUnsigned(this.#onNetwork(tx));
113
+ }
114
+ serializeSigned(tx, signature) {
115
+ return this.encodeSigned(this.#onNetwork(tx), signature);
116
+ }
117
+ /**
118
+ * A transaction for another chain is refused before any codec work. The SDKs
119
+ * disagree about it: ethers commits to `tx.chainId`, web3 to the client's chain id (and
120
+ * throws a plain `Error` for a type-2 mismatch), so without this guard the two clients
121
+ * would produce different signing bytes for the same fields.
122
+ */
123
+ #onNetwork(tx) {
124
+ if (tx.chainId !== this.chainId) {
125
+ throw new error_1.ValidationError('INVALID_INTENT', 'transaction chain id does not match the network');
126
+ }
127
+ return tx;
128
+ }
129
+ /** Runs the SDK's checksum; `INVALID_ADDRESS` for anything but a valid hex address. */
130
+ checked(address, checksum) {
131
+ try {
132
+ if (exports.ADDRESS.test(address))
133
+ return checksum(address);
134
+ }
135
+ catch {
136
+ // A mixed-case address with a wrong checksum.
137
+ }
138
+ throw new error_1.ValidationError('INVALID_ADDRESS', 'not an EVM address');
139
+ }
140
+ async blockNumber(tags) {
141
+ return quantity(await this.send('eth_blockNumber', [], tags), 'block number');
142
+ }
143
+ async getBalance(address, block, tags) {
144
+ const result = await this.send('eth_getBalance', [address, blockParam(block)], tags);
145
+ return quantity(result, 'balance');
146
+ }
147
+ async getTransactionCount(address, block, tags) {
148
+ const params = [address, blockParam(block)];
149
+ return quantity(await this.send('eth_getTransactionCount', params, tags), 'nonce');
150
+ }
151
+ async call(request, block, tags) {
152
+ const result = await this.send('eth_call', [this.#request(request), blockParam(block)], tags);
153
+ return data(result, 'call result');
154
+ }
155
+ async estimateGas(request, tags) {
156
+ return quantity(await this.send('eth_estimateGas', [this.#request(request)], tags), 'gas');
157
+ }
158
+ async gasPrice(tags) {
159
+ return quantity(await this.send('eth_gasPrice', [], tags), 'gas price');
160
+ }
161
+ async feeHistory(blockCount, newest, percentiles, tags) {
162
+ const params = [hexOf(BigInt(blockCount)), blockParam(newest), [...percentiles]];
163
+ const json = object(await this.send('eth_feeHistory', params, tags), 'fee history');
164
+ const list = (value, field) => {
165
+ if (!Array.isArray(value))
166
+ throw malformed(field);
167
+ return value;
168
+ };
169
+ return {
170
+ oldestBlock: quantity(json.oldestBlock, 'oldest block'),
171
+ baseFeePerGas: list(json.baseFeePerGas, 'base fees').map((v) => quantity(v, 'base fee')),
172
+ reward: list(json.reward ?? [], 'rewards').map((row) => list(row, 'rewards').map((v) => quantity(v, 'reward'))),
173
+ gasUsedRatio: list(json.gasUsedRatio ?? [], 'gas used ratios').map((v) => {
174
+ if (typeof v !== 'number')
175
+ throw malformed('gas used ratio');
176
+ return v;
177
+ }),
178
+ };
179
+ }
180
+ async getBlock(block, tags) {
181
+ const byHash = typeof block === 'string' && HASH.test(block);
182
+ const result = byHash
183
+ ? await this.send('eth_getBlockByHash', [block, false], tags)
184
+ : await this.send('eth_getBlockByNumber', [blockParam(block), false], tags);
185
+ if (result === null)
186
+ return null;
187
+ const json = object(result, 'block');
188
+ return {
189
+ ...this.#header(json),
190
+ transactions: this.#list(json.transactions, 'block transactions').map((t) => hash(typeof t === 'string' ? t : t?.hash, 'transaction hash')),
191
+ };
192
+ }
193
+ async getBlockWithTransactions(block, tags) {
194
+ const result = await this.send('eth_getBlockByNumber', [blockParam(block), true], tags);
195
+ if (result === null)
196
+ return null;
197
+ const json = object(result, 'block');
198
+ const { logsBloom } = json;
199
+ return {
200
+ ...this.#header(json),
201
+ transactions: this.#list(json.transactions, 'block transactions').map((t) => this.#tx(object(t, 'transaction'))),
202
+ // Only a hint for scans: a missing or malformed bloom may hold anything.
203
+ ...(typeof logsBloom === 'string' && BLOOM.test(logsBloom)
204
+ ? { logsBloom: logsBloom.toLowerCase() }
205
+ : {}),
206
+ };
207
+ }
208
+ /** An answer about another transaction is malformed, never another's facts. */
209
+ async getTransaction(txHash, tags) {
210
+ const result = await this.send('eth_getTransactionByHash', [txHash], tags);
211
+ if (result === null)
212
+ return null;
213
+ const tx = this.#tx(object(result, 'transaction'));
214
+ if (tx.hash !== txHash.toLowerCase())
215
+ throw malformed('transaction hash');
216
+ return tx;
217
+ }
218
+ /** An answer about another transaction is malformed, never another's receipt. */
219
+ async getReceipt(txHash, tags) {
220
+ const result = await this.send('eth_getTransactionReceipt', [txHash], tags);
221
+ if (result === null)
222
+ return null;
223
+ const receipt = this.#receipt(object(result, 'receipt'));
224
+ if (receipt.transactionHash !== txHash.toLowerCase()) {
225
+ throw malformed('transaction hash');
226
+ }
227
+ return receipt;
228
+ }
229
+ async getBlockReceipts(blockHash, tags) {
230
+ const result = await this.send('eth_getBlockReceipts', [blockHash], tags);
231
+ if (result === null)
232
+ return null;
233
+ return this.#list(result, 'block receipts').map((receipt) => this.#receipt(object(receipt, 'receipt')));
234
+ }
235
+ #receipt(json) {
236
+ const status = quantity(json.status, 'receipt status');
237
+ if (status !== 0n && status !== 1n)
238
+ throw malformed('receipt status');
239
+ const l1Fee = optionalQuantity(json.l1Fee, 'L1 fee');
240
+ const gasUsedForL1 = optionalQuantity(json.gasUsedForL1, 'L1 gas');
241
+ return {
242
+ transactionHash: hash(json.transactionHash, 'transaction hash'),
243
+ blockHash: hash(json.blockHash, 'block hash'),
244
+ blockNumber: quantity(json.blockNumber, 'block number'),
245
+ status: status === 1n ? 1 : 0,
246
+ from: this.#address(json.from, 'sender'),
247
+ to: json.to === null || json.to === undefined
248
+ ? null
249
+ : this.#address(json.to, 'recipient'),
250
+ contractAddress: json.contractAddress === null || json.contractAddress === undefined
251
+ ? null
252
+ : this.#address(json.contractAddress, 'contract address'),
253
+ gasUsed: quantity(json.gasUsed, 'gas used'),
254
+ effectiveGasPrice: quantity(json.effectiveGasPrice, 'effective gas price'),
255
+ ...(l1Fee !== undefined ? { l1Fee } : {}),
256
+ ...(gasUsedForL1 !== undefined ? { gasUsedForL1 } : {}),
257
+ logs: this.#list(json.logs, 'receipt logs').map((log) => this.#log(object(log, 'log'))),
258
+ };
259
+ }
260
+ async getLogs(filter, tags) {
261
+ const params = [{ blockHash: filter.blockHash, topics: [...filter.topics] }];
262
+ const result = await this.send('eth_getLogs', params, tags);
263
+ return this.#list(result, 'logs').map((log) => this.#log(object(log, 'log')));
264
+ }
265
+ async sendRawTransaction(raw, tags) {
266
+ return hash(await this.send('eth_sendRawTransaction', [raw], tags), 'transaction hash');
267
+ }
268
+ #request(request) {
269
+ return {
270
+ ...(request.from !== undefined ? { from: request.from } : {}),
271
+ to: request.to,
272
+ ...(request.value !== undefined ? { value: hexOf(request.value) } : {}),
273
+ ...(request.data !== undefined ? { data: request.data } : {}),
274
+ };
275
+ }
276
+ #list(value, field) {
277
+ if (!Array.isArray(value))
278
+ throw malformed(field);
279
+ return value;
280
+ }
281
+ #address(value, field) {
282
+ if (typeof value !== 'string' || !exports.ADDRESS.test(value))
283
+ throw malformed(field);
284
+ return this.checksum(value.toLowerCase());
285
+ }
286
+ #header(json) {
287
+ const baseFeePerGas = optionalQuantity(json.baseFeePerGas, 'base fee');
288
+ return {
289
+ number: quantity(json.number, 'block number'),
290
+ hash: hash(json.hash, 'block hash'),
291
+ parentHash: hash(json.parentHash, 'parent hash'),
292
+ timestamp: Number(quantity(json.timestamp, 'timestamp')),
293
+ ...(baseFeePerGas !== undefined ? { baseFeePerGas } : {}),
294
+ };
295
+ }
296
+ #tx(json) {
297
+ const gasPrice = optionalQuantity(json.gasPrice, 'gas price');
298
+ const maxFeePerGas = optionalQuantity(json.maxFeePerGas, 'max fee');
299
+ const maxPriorityFeePerGas = optionalQuantity(json.maxPriorityFeePerGas, 'priority fee');
300
+ const blockHash = json.blockHash ?? null;
301
+ const blockNumber = json.blockNumber ?? null;
302
+ return {
303
+ hash: hash(json.hash, 'transaction hash'),
304
+ from: this.#address(json.from, 'sender'),
305
+ to: json.to === null || json.to === undefined
306
+ ? null
307
+ : this.#address(json.to, 'recipient'),
308
+ nonce: quantity(json.nonce, 'nonce'),
309
+ value: quantity(json.value, 'value'),
310
+ // No calldata field is malformed, never an empty call (older nodes say `data`).
311
+ input: data(json.input ?? json.data, 'input'),
312
+ type: Number(optionalQuantity(json.type, 'type') ?? 0n),
313
+ gasLimit: quantity(json.gas, 'gas limit'),
314
+ ...(gasPrice !== undefined ? { gasPrice } : {}),
315
+ ...(maxFeePerGas !== undefined ? { maxFeePerGas } : {}),
316
+ ...(maxPriorityFeePerGas !== undefined ? { maxPriorityFeePerGas } : {}),
317
+ blockHash: blockHash === null ? null : hash(blockHash, 'block hash'),
318
+ blockNumber: blockNumber === null ? null : quantity(blockNumber, 'block number'),
319
+ };
320
+ }
321
+ #log(json) {
322
+ return {
323
+ address: this.#address(json.address, 'log address'),
324
+ topics: this.#list(json.topics, 'log topics').map((t) => hash(t, 'log topic')),
325
+ data: data(json.data, 'log data'),
326
+ logIndex: Number(quantity(json.logIndex, 'log index')),
327
+ blockHash: hash(json.blockHash, 'block hash'),
328
+ blockNumber: quantity(json.blockNumber, 'block number'),
329
+ transactionHash: hash(json.transactionHash, 'transaction hash'),
330
+ removed: json.removed === true,
331
+ };
332
+ }
333
+ }
334
+ exports.EvmClientBase = EvmClientBase;
335
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../../src/adapters/evm/client.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The SDK-free half of every `EvmClient`: the JSON-RPC methods the driver calls and the\n * normalization of their answers into plain data. A subclass supplies the SDK half: the\n * `send` bridge (the SDK's own JSON-RPC primitive, wired to the transport) and the codec.\n *\n * I/O never uses an SDK's high-level helpers: those\n * issue extra calls under the wrong tags (ethers `broadcastTransaction` also reads the block\n * number; `getTransactionReceipt` may fetch the transaction), throw on not-found (web3\n * `TransactionNotFound`) or drop chain fields the fees need (OP `l1Fee`, Arbitrum\n * `gasUsedForL1`). So one driver call is exactly one tagged JSON-RPC request.\n */\nimport { secp256k1 } from '@noble/curves/secp256k1';\nimport type { DisposableNativeClient } from '../../core/driver/types';\nimport { ProviderError, ValidationError } from '../../core/errors/error';\nimport type {\n EvmAbi,\n EvmBlock,\n EvmBlockTag,\n EvmCallRequest,\n EvmCallTags,\n EvmClient,\n EvmFeeHistory,\n EvmFullBlock,\n EvmLog,\n EvmReceipt,\n EvmSignature,\n EvmTx,\n EvmTxFields,\n} from './types';\n\n/** `0x` and 40 hex digits; the checksum is the SDK's to check. */\nexport const ADDRESS = /^0x[0-9a-fA-F]{40}$/;\n\n/**\n * The 65-byte uncompressed form of a secp256k1 public key, accepted only as a 33-byte\n * compressed key (`0x02`/`0x03`) or a 65-byte `0x04` key that decodes to a point on the\n * curve. Both clients derive addresses from its result, never from the caller's bytes: an\n * SDK may read 32 bytes as a *private* key or 64 bytes as an unprefixed public key, and\n * either would yield an address nobody holds the key to. The error never echoes the input.\n */\nexport function uncompressedPublicKey(publicKey: Uint8Array): Uint8Array {\n const prefix = publicKey instanceof Uint8Array ? publicKey[0] : undefined;\n const shaped =\n ((prefix === 0x02 || prefix === 0x03) && publicKey.length === 33) ||\n (prefix === 0x04 && publicKey.length === 65);\n try {\n if (shaped) return secp256k1.ProjectivePoint.fromHex(publicKey).toRawBytes(false);\n } catch {\n // Not a point on the curve.\n }\n throw new ValidationError(\n 'INVALID_ADDRESS',\n 'public key must be a 33- or 65-byte secp256k1 point',\n );\n}\nconst HASH = /^0x[0-9a-fA-F]{64}$/;\nconst QUANTITY = /^0x[0-9a-fA-F]+$/;\nconst DATA = /^0x(?:[0-9a-fA-F]{2})*$/;\nconst BLOOM = /^0x[0-9a-fA-F]{512}$/;\n\ntype Json = Record<string, unknown>;\n\nfunction malformed(field: string): ProviderError {\n return new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `malformed ${field} in a JSON-RPC answer`,\n );\n}\n\n/**\n * A JSON-RPC quantity (`0x` and hex digits) as a bigint. Anything else throws a retryable\n * `PROVIDER_UNAVAILABLE` naming `field`: the one check of every hex quantity the driver\n * reads, quorum keys and health probes included (a key that throws is a disagreement).\n */\nexport function quantity(value: unknown, field: string): bigint {\n if (typeof value !== 'string' || !QUANTITY.test(value)) throw malformed(field);\n return BigInt(value);\n}\n\nfunction optionalQuantity(value: unknown, field: string): bigint | undefined {\n return value === undefined || value === null ? undefined : quantity(value, field);\n}\n\nfunction hash(value: unknown, field: string): string {\n if (typeof value !== 'string' || !HASH.test(value)) throw malformed(field);\n return value.toLowerCase();\n}\n\nfunction data(value: unknown, field: string): string {\n if (typeof value !== 'string' || !DATA.test(value)) throw malformed(field);\n return value.toLowerCase();\n}\n\nfunction object(value: unknown, field: string): Json {\n if (value === null || typeof value !== 'object' || Array.isArray(value))\n throw malformed(field);\n return value as Json;\n}\n\n/** One ABI word: 32 bytes. */\nexport const ABI_WORD = /^0x[0-9a-fA-F]{64}$/;\n/** An ABI-encoded address: 12 zero bytes, then 20 address bytes. */\nexport const ADDRESS_WORD = /^0x0{24}[0-9a-fA-F]{40}$/;\n\n/**\n * The three ABI words of an ERC-20 `Transfer` log (`from`, `to`, amount), or `null`. Anyone\n * can emit a look-alike event: anything but the topic and three well-formed words is not a\n * transfer, and never an error that would fail a whole block scan.\n */\nexport function transferLogWords(\n log: { readonly topics: readonly string[]; readonly data: string },\n topic: string,\n): { readonly from: string; readonly to: string; readonly data: string } | null {\n const [first, from, to] = log.topics;\n if (\n log.topics.length !== 3 ||\n first !== topic ||\n !ADDRESS_WORD.test(from as string) ||\n !ADDRESS_WORD.test(to as string) ||\n !ABI_WORD.test(log.data)\n ) {\n return null;\n }\n return { from: from as string, to: to as string, data: log.data };\n}\n\nexport function blockParam(block: EvmBlockTag): string {\n return typeof block === 'bigint' ? `0x${block.toString(16)}` : block;\n}\n\nconst hexOf = (value: bigint): string => `0x${value.toString(16)}`;\n\nexport abstract class EvmClientBase implements EvmClient {\n abstract readonly library: string;\n abstract readonly abi: EvmAbi;\n /** The chain id of the network this client serves. */\n protected readonly chainId: bigint;\n\n constructor(chainId: bigint) {\n this.chainId = chainId;\n }\n\n /** One JSON-RPC request through the SDK's bridge, under `tags`; resolves with `result`. */\n protected abstract send(\n method: string,\n params: readonly unknown[],\n tags: EvmCallTags,\n ): Promise<unknown>;\n\n abstract isAddress(value: string): boolean;\n abstract checksum(address: string): string;\n abstract addressFromPublicKey(publicKey: Uint8Array): string;\n abstract createNative(): DisposableNativeClient;\n\n /** The SDK codec, reached only through the chain-id guard below. */\n protected abstract encodeUnsigned(tx: EvmTxFields): string;\n protected abstract hashUnsigned(tx: EvmTxFields): string;\n protected abstract encodeSigned(\n tx: EvmTxFields,\n signature: EvmSignature,\n ): { readonly raw: string; readonly hash: string };\n\n serializeUnsigned(tx: EvmTxFields): string {\n return this.encodeUnsigned(this.#onNetwork(tx));\n }\n\n unsignedHash(tx: EvmTxFields): string {\n return this.hashUnsigned(this.#onNetwork(tx));\n }\n\n serializeSigned(\n tx: EvmTxFields,\n signature: EvmSignature,\n ): { readonly raw: string; readonly hash: string } {\n return this.encodeSigned(this.#onNetwork(tx), signature);\n }\n\n /**\n * A transaction for another chain is refused before any codec work. The SDKs\n * disagree about it: ethers commits to `tx.chainId`, web3 to the client's chain id (and\n * throws a plain `Error` for a type-2 mismatch), so without this guard the two clients\n * would produce different signing bytes for the same fields.\n */\n #onNetwork(tx: EvmTxFields): EvmTxFields {\n if (tx.chainId !== this.chainId) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'transaction chain id does not match the network',\n );\n }\n return tx;\n }\n\n /** Runs the SDK's checksum; `INVALID_ADDRESS` for anything but a valid hex address. */\n protected checked(address: string, checksum: (value: string) => string): string {\n try {\n if (ADDRESS.test(address)) return checksum(address);\n } catch {\n // A mixed-case address with a wrong checksum.\n }\n throw new ValidationError('INVALID_ADDRESS', 'not an EVM address');\n }\n\n async blockNumber(tags: EvmCallTags): Promise<bigint> {\n return quantity(await this.send('eth_blockNumber', [], tags), 'block number');\n }\n\n async getBalance(\n address: string,\n block: EvmBlockTag,\n tags: EvmCallTags,\n ): Promise<bigint> {\n const result = await this.send('eth_getBalance', [address, blockParam(block)], tags);\n return quantity(result, 'balance');\n }\n\n async getTransactionCount(\n address: string,\n block: EvmBlockTag,\n tags: EvmCallTags,\n ): Promise<bigint> {\n const params = [address, blockParam(block)];\n return quantity(await this.send('eth_getTransactionCount', params, tags), 'nonce');\n }\n\n async call(\n request: EvmCallRequest,\n block: EvmBlockTag,\n tags: EvmCallTags,\n ): Promise<string> {\n const result = await this.send(\n 'eth_call',\n [this.#request(request), blockParam(block)],\n tags,\n );\n return data(result, 'call result');\n }\n\n async estimateGas(request: EvmCallRequest, tags: EvmCallTags): Promise<bigint> {\n return quantity(\n await this.send('eth_estimateGas', [this.#request(request)], tags),\n 'gas',\n );\n }\n\n async gasPrice(tags: EvmCallTags): Promise<bigint> {\n return quantity(await this.send('eth_gasPrice', [], tags), 'gas price');\n }\n\n async feeHistory(\n blockCount: number,\n newest: EvmBlockTag,\n percentiles: readonly number[],\n tags: EvmCallTags,\n ): Promise<EvmFeeHistory> {\n const params = [hexOf(BigInt(blockCount)), blockParam(newest), [...percentiles]];\n const json = object(await this.send('eth_feeHistory', params, tags), 'fee history');\n const list = (value: unknown, field: string): unknown[] => {\n if (!Array.isArray(value)) throw malformed(field);\n return value;\n };\n return {\n oldestBlock: quantity(json.oldestBlock, 'oldest block'),\n baseFeePerGas: list(json.baseFeePerGas, 'base fees').map((v) =>\n quantity(v, 'base fee'),\n ),\n reward: list(json.reward ?? [], 'rewards').map((row) =>\n list(row, 'rewards').map((v) => quantity(v, 'reward')),\n ),\n gasUsedRatio: list(json.gasUsedRatio ?? [], 'gas used ratios').map((v) => {\n if (typeof v !== 'number') throw malformed('gas used ratio');\n return v;\n }),\n };\n }\n\n async getBlock(\n block: EvmBlockTag | string,\n tags: EvmCallTags,\n ): Promise<EvmBlock | null> {\n const byHash = typeof block === 'string' && HASH.test(block);\n const result = byHash\n ? await this.send('eth_getBlockByHash', [block, false], tags)\n : await this.send(\n 'eth_getBlockByNumber',\n [blockParam(block as EvmBlockTag), false],\n tags,\n );\n if (result === null) return null;\n const json = object(result, 'block');\n return {\n ...this.#header(json),\n transactions: this.#list(json.transactions, 'block transactions').map((t) =>\n hash(typeof t === 'string' ? t : (t as Json | null)?.hash, 'transaction hash'),\n ),\n };\n }\n\n async getBlockWithTransactions(\n block: bigint,\n tags: EvmCallTags,\n ): Promise<EvmFullBlock | null> {\n const result = await this.send(\n 'eth_getBlockByNumber',\n [blockParam(block), true],\n tags,\n );\n if (result === null) return null;\n const json = object(result, 'block');\n const { logsBloom } = json;\n return {\n ...this.#header(json),\n transactions: this.#list(json.transactions, 'block transactions').map((t) =>\n this.#tx(object(t, 'transaction')),\n ),\n // Only a hint for scans: a missing or malformed bloom may hold anything.\n ...(typeof logsBloom === 'string' && BLOOM.test(logsBloom)\n ? { logsBloom: logsBloom.toLowerCase() }\n : {}),\n };\n }\n\n /** An answer about another transaction is malformed, never another's facts. */\n async getTransaction(txHash: string, tags: EvmCallTags): Promise<EvmTx | null> {\n const result = await this.send('eth_getTransactionByHash', [txHash], tags);\n if (result === null) return null;\n const tx = this.#tx(object(result, 'transaction'));\n if (tx.hash !== txHash.toLowerCase()) throw malformed('transaction hash');\n return tx;\n }\n\n /** An answer about another transaction is malformed, never another's receipt. */\n async getReceipt(txHash: string, tags: EvmCallTags): Promise<EvmReceipt | null> {\n const result = await this.send('eth_getTransactionReceipt', [txHash], tags);\n if (result === null) return null;\n const receipt = this.#receipt(object(result, 'receipt'));\n if (receipt.transactionHash !== txHash.toLowerCase()) {\n throw malformed('transaction hash');\n }\n return receipt;\n }\n\n async getBlockReceipts(\n blockHash: string,\n tags: EvmCallTags,\n ): Promise<readonly EvmReceipt[] | null> {\n const result = await this.send('eth_getBlockReceipts', [blockHash], tags);\n if (result === null) return null;\n return this.#list(result, 'block receipts').map((receipt) =>\n this.#receipt(object(receipt, 'receipt')),\n );\n }\n\n #receipt(json: Json): EvmReceipt {\n const status = quantity(json.status, 'receipt status');\n if (status !== 0n && status !== 1n) throw malformed('receipt status');\n const l1Fee = optionalQuantity(json.l1Fee, 'L1 fee');\n const gasUsedForL1 = optionalQuantity(json.gasUsedForL1, 'L1 gas');\n return {\n transactionHash: hash(json.transactionHash, 'transaction hash'),\n blockHash: hash(json.blockHash, 'block hash'),\n blockNumber: quantity(json.blockNumber, 'block number'),\n status: status === 1n ? 1 : 0,\n from: this.#address(json.from, 'sender'),\n to:\n json.to === null || json.to === undefined\n ? null\n : this.#address(json.to, 'recipient'),\n contractAddress:\n json.contractAddress === null || json.contractAddress === undefined\n ? null\n : this.#address(json.contractAddress, 'contract address'),\n gasUsed: quantity(json.gasUsed, 'gas used'),\n effectiveGasPrice: quantity(json.effectiveGasPrice, 'effective gas price'),\n ...(l1Fee !== undefined ? { l1Fee } : {}),\n ...(gasUsedForL1 !== undefined ? { gasUsedForL1 } : {}),\n logs: this.#list(json.logs, 'receipt logs').map((log) =>\n this.#log(object(log, 'log')),\n ),\n };\n }\n\n async getLogs(\n filter: { readonly blockHash: string; readonly topics: readonly (string | null)[] },\n tags: EvmCallTags,\n ): Promise<readonly EvmLog[]> {\n const params = [{ blockHash: filter.blockHash, topics: [...filter.topics] }];\n const result = await this.send('eth_getLogs', params, tags);\n return this.#list(result, 'logs').map((log) => this.#log(object(log, 'log')));\n }\n\n async sendRawTransaction(raw: string, tags: EvmCallTags): Promise<string> {\n return hash(\n await this.send('eth_sendRawTransaction', [raw], tags),\n 'transaction hash',\n );\n }\n\n #request(request: EvmCallRequest): Json {\n return {\n ...(request.from !== undefined ? { from: request.from } : {}),\n to: request.to,\n ...(request.value !== undefined ? { value: hexOf(request.value) } : {}),\n ...(request.data !== undefined ? { data: request.data } : {}),\n };\n }\n\n #list(value: unknown, field: string): unknown[] {\n if (!Array.isArray(value)) throw malformed(field);\n return value;\n }\n\n #address(value: unknown, field: string): string {\n if (typeof value !== 'string' || !ADDRESS.test(value)) throw malformed(field);\n return this.checksum(value.toLowerCase());\n }\n\n #header(json: Json): Omit<EvmBlock, 'transactions'> {\n const baseFeePerGas = optionalQuantity(json.baseFeePerGas, 'base fee');\n return {\n number: quantity(json.number, 'block number'),\n hash: hash(json.hash, 'block hash'),\n parentHash: hash(json.parentHash, 'parent hash'),\n timestamp: Number(quantity(json.timestamp, 'timestamp')),\n ...(baseFeePerGas !== undefined ? { baseFeePerGas } : {}),\n };\n }\n\n #tx(json: Json): EvmTx {\n const gasPrice = optionalQuantity(json.gasPrice, 'gas price');\n const maxFeePerGas = optionalQuantity(json.maxFeePerGas, 'max fee');\n const maxPriorityFeePerGas = optionalQuantity(\n json.maxPriorityFeePerGas,\n 'priority fee',\n );\n const blockHash = json.blockHash ?? null;\n const blockNumber = json.blockNumber ?? null;\n return {\n hash: hash(json.hash, 'transaction hash'),\n from: this.#address(json.from, 'sender'),\n to:\n json.to === null || json.to === undefined\n ? null\n : this.#address(json.to, 'recipient'),\n nonce: quantity(json.nonce, 'nonce'),\n value: quantity(json.value, 'value'),\n // No calldata field is malformed, never an empty call (older nodes say `data`).\n input: data(json.input ?? json.data, 'input'),\n type: Number(optionalQuantity(json.type, 'type') ?? 0n),\n gasLimit: quantity(json.gas, 'gas limit'),\n ...(gasPrice !== undefined ? { gasPrice } : {}),\n ...(maxFeePerGas !== undefined ? { maxFeePerGas } : {}),\n ...(maxPriorityFeePerGas !== undefined ? { maxPriorityFeePerGas } : {}),\n blockHash: blockHash === null ? null : hash(blockHash, 'block hash'),\n blockNumber: blockNumber === null ? null : quantity(blockNumber, 'block number'),\n };\n }\n\n #log(json: Json): EvmLog {\n return {\n address: this.#address(json.address, 'log address'),\n topics: this.#list(json.topics, 'log topics').map((t) => hash(t, 'log topic')),\n data: data(json.data, 'log data'),\n logIndex: Number(quantity(json.logIndex, 'log index')),\n blockHash: hash(json.blockHash, 'block hash'),\n blockNumber: quantity(json.blockNumber, 'block number'),\n transactionHash: hash(json.transactionHash, 'transaction hash'),\n removed: json.removed === true,\n };\n }\n}\n"]}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Transactions and receipts into the driver model: native value and ERC-20 `Transfer`
3
+ * logs as transfers, fees in the native asset, and `decoding: 'partial'` whenever
4
+ * contract code ran, since internal transfers need traces, which the driver does not
5
+ * read.
6
+ */
7
+ import type { DriverTransaction, DriverTxObservation } from '../../core/driver/types';
8
+ import { type EvmNetworkConfig } from './network';
9
+ import type { EvmAbi, EvmReceipt, EvmTx } from './types';
10
+ /**
11
+ * No phantom success: a token `transfer` call worked only if the token logged a
12
+ * `Transfer` from the sender to the call's recipient, of a positive amount whenever the
13
+ * call asked for one. ERC-20 requires the event, and some tokens return `false` instead
14
+ * of reverting, so a successful receipt alone would report a transfer that moved nothing;
15
+ * a log to anyone else, or of nothing, pays the recipient nothing either. A
16
+ * fee-on-transfer token logs less than asked, and still counts; a non-compliant token
17
+ * that moves value without the event is reported failed. The call's arguments come from
18
+ * its signed calldata. Only verdicts on our own transactions apply it (`evmObservation`,
19
+ * `includedFinal`), never the decoder.
20
+ */
21
+ export declare function tokenTransferLanded(abi: EvmAbi, tx: EvmTx, receipt: EvmReceipt): boolean;
22
+ /** What the chain reports: where the transaction is, and its receipt's status. */
23
+ export declare function chainObservation(tx: EvmTx, receipt: EvmReceipt | null): DriverTxObservation;
24
+ /**
25
+ * The verdict on one of our own transactions: the chain's status, and a successful token
26
+ * `transfer` that logged no transfer to its recipient is `success: false`.
27
+ */
28
+ export declare function evmObservation(abi: EvmAbi, tx: EvmTx, receipt: EvmReceipt | null): DriverTxObservation;
29
+ /**
30
+ * Any transaction as the chain reports it: the receipt's status, never the token
31
+ * verdict, so a third party's call that shares the `transfer` selector is not misreported.
32
+ * Pass the network's config so bor's system logs do not make a plain Polygon transfer
33
+ * `partial`.
34
+ */
35
+ export declare function decodeTransaction(abi: EvmAbi, tx: EvmTx, receipt: EvmReceipt | null, timestamp?: number, network?: Pick<EvmNetworkConfig, 'polygonSystemLogs'>): DriverTransaction;
@@ -0,0 +1,170 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.tokenTransferLanded = tokenTransferLanded;
4
+ exports.chainObservation = chainObservation;
5
+ exports.evmObservation = evmObservation;
6
+ exports.decodeTransaction = decodeTransaction;
7
+ const client_1 = require("./client");
8
+ const fees_1 = require("./fees");
9
+ const network_1 = require("./network");
10
+ const TRANSFER_SELECTOR = '0xa9059cbb';
11
+ /**
12
+ * The recipient (lower-cased) and amount of an ERC-20 `transfer(address,uint256)`
13
+ * call: the selector, then two ABI words. `null` for any other calldata.
14
+ */
15
+ function transferCall(input) {
16
+ const to = `0x${input.slice(10, 74)}`;
17
+ const amount = `0x${input.slice(74)}`;
18
+ if (!input.startsWith(TRANSFER_SELECTOR) ||
19
+ !client_1.ADDRESS_WORD.test(to) ||
20
+ !client_1.ABI_WORD.test(amount)) {
21
+ return null;
22
+ }
23
+ return { to: `0x${to.slice(26)}`.toLowerCase(), amount: BigInt(amount) };
24
+ }
25
+ /**
26
+ * No phantom success: a token `transfer` call worked only if the token logged a
27
+ * `Transfer` from the sender to the call's recipient, of a positive amount whenever the
28
+ * call asked for one. ERC-20 requires the event, and some tokens return `false` instead
29
+ * of reverting, so a successful receipt alone would report a transfer that moved nothing;
30
+ * a log to anyone else, or of nothing, pays the recipient nothing either. A
31
+ * fee-on-transfer token logs less than asked, and still counts; a non-compliant token
32
+ * that moves value without the event is reported failed. The call's arguments come from
33
+ * its signed calldata. Only verdicts on our own transactions apply it (`evmObservation`,
34
+ * `includedFinal`), never the decoder.
35
+ */
36
+ function tokenTransferLanded(abi, tx, receipt) {
37
+ if (tx.to === null || !tx.input.startsWith(TRANSFER_SELECTOR))
38
+ return true;
39
+ const call = transferCall(tx.input);
40
+ if (!call)
41
+ return false;
42
+ return receipt.logs.some((log) => {
43
+ const transfer = log.address === tx.to ? abi.decodeTransfer(log) : null;
44
+ return (transfer !== null &&
45
+ transfer.from === tx.from &&
46
+ transfer.to.toLowerCase() === call.to &&
47
+ (call.amount === 0n || transfer.amount > 0n));
48
+ });
49
+ }
50
+ /** What the chain reports: where the transaction is, and its receipt's status. */
51
+ function chainObservation(tx, receipt) {
52
+ if (receipt) {
53
+ return {
54
+ seen: 'block',
55
+ txHash: tx.hash,
56
+ blockHeight: receipt.blockNumber,
57
+ blockHash: receipt.blockHash,
58
+ success: receipt.status === 1,
59
+ ...(receipt.status === 0 ? { reason: 'reverted' } : {}),
60
+ };
61
+ }
62
+ if (tx.blockHash !== null && tx.blockNumber !== null) {
63
+ return {
64
+ seen: 'block',
65
+ txHash: tx.hash,
66
+ blockHeight: tx.blockNumber,
67
+ blockHash: tx.blockHash,
68
+ };
69
+ }
70
+ return { seen: 'mempool', txHash: tx.hash };
71
+ }
72
+ /**
73
+ * The verdict on one of our own transactions: the chain's status, and a successful token
74
+ * `transfer` that logged no transfer to its recipient is `success: false`.
75
+ */
76
+ function evmObservation(abi, tx, receipt) {
77
+ const observation = chainObservation(tx, receipt);
78
+ if (!receipt || receipt.status === 0 || tokenTransferLanded(abi, tx, receipt)) {
79
+ return observation;
80
+ }
81
+ return { ...observation, success: false, reason: 'token transfer failed' };
82
+ }
83
+ /** bor's fee log or native transfer log, from the MRC20 predeploy. */
84
+ const isPolygonSystemLog = (log) => log.address.toLowerCase() === network_1.POLYGON_FEE_LOG.address &&
85
+ (log.topics[0] === network_1.POLYGON_FEE_LOG.topic ||
86
+ log.topics[0] === network_1.POLYGON_TRANSFER_LOG.topic);
87
+ /**
88
+ * Whether contract code ran: calldata, logs, or more execution gas than a plain transfer.
89
+ * On Polygon PoS, a plain transfer (no calldata, exactly 21,000 execution gas) also
90
+ * carries bor's system logs, which are no sign of code: its value is `tx.value`.
91
+ */
92
+ function ranCode(tx, receipt, polygonSystemLogs) {
93
+ const executionGas = receipt.gasUsed - (receipt.gasUsedForL1 ?? 0n);
94
+ if (tx.input !== '0x' || executionGas !== fees_1.TRANSFER_GAS)
95
+ return true;
96
+ const logs = polygonSystemLogs
97
+ ? receipt.logs.filter((log) => !isPolygonSystemLog(log))
98
+ : receipt.logs;
99
+ return logs.length > 0;
100
+ }
101
+ /**
102
+ * Any transaction as the chain reports it: the receipt's status, never the token
103
+ * verdict, so a third party's call that shares the `transfer` selector is not misreported.
104
+ * Pass the network's config so bor's system logs do not make a plain Polygon transfer
105
+ * `partial`.
106
+ */
107
+ function decodeTransaction(abi, tx, receipt, timestamp, network = { polygonSystemLogs: false }) {
108
+ const transfers = [];
109
+ const executed = receipt === null || receipt.status === 1;
110
+ const to = tx.to ?? receipt?.contractAddress ?? null;
111
+ if (executed && tx.value > 0n && to !== null) {
112
+ transfers.push({
113
+ locator: 'native',
114
+ from: [tx.from],
115
+ to,
116
+ asset: 'native',
117
+ amount: tx.value,
118
+ source: 'native',
119
+ });
120
+ }
121
+ for (const log of receipt?.status === 1 ? receipt.logs : []) {
122
+ const decoded = abi.decodeTransfer(log);
123
+ if (!decoded)
124
+ continue;
125
+ transfers.push({
126
+ locator: `log:${log.logIndex}`,
127
+ from: [decoded.from],
128
+ to: decoded.to,
129
+ asset: { standard: 'erc20', contract: log.address },
130
+ amount: decoded.amount,
131
+ source: 'token-event',
132
+ });
133
+ }
134
+ const decoding = receipt === null
135
+ ? 'partial'
136
+ : receipt.status === 0 || !ranCode(tx, receipt, network.polygonSystemLogs)
137
+ ? 'complete'
138
+ : 'partial';
139
+ return {
140
+ id: tx.hash,
141
+ observation: chainObservation(tx, receipt),
142
+ ...(receipt
143
+ ? {
144
+ fee: [
145
+ {
146
+ asset: 'native',
147
+ amount: receipt.gasUsed * receipt.effectiveGasPrice + (receipt.l1Fee ?? 0n),
148
+ },
149
+ ],
150
+ }
151
+ : {}),
152
+ transfers,
153
+ decoding,
154
+ ...(timestamp !== undefined ? { timestamp } : {}),
155
+ details: {
156
+ nonce: tx.nonce,
157
+ type: tx.type,
158
+ gasLimit: tx.gasLimit,
159
+ ...(receipt
160
+ ? {
161
+ gasUsed: receipt.gasUsed,
162
+ effectiveGasPrice: receipt.effectiveGasPrice,
163
+ status: receipt.status,
164
+ }
165
+ : {}),
166
+ ...(receipt?.l1Fee !== undefined ? { l1Fee: receipt.l1Fee } : {}),
167
+ },
168
+ };
169
+ }
170
+ //# sourceMappingURL=decode.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decode.js","sourceRoot":"","sources":["../../../src/adapters/evm/decode.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Transactions and receipts into the driver model: native value and ERC-20 `Transfer`\n * logs as transfers, fees in the native asset, and `decoding: 'partial'` whenever\n * contract code ran, since internal transfers need traces, which the driver does not\n * read.\n */\nimport type {\n DriverTransaction,\n DriverTransfer,\n DriverTxObservation,\n} from '../../core/driver/types';\nimport { ABI_WORD, ADDRESS_WORD } from './client';\nimport { TRANSFER_GAS } from './fees';\nimport { POLYGON_FEE_LOG, POLYGON_TRANSFER_LOG, type EvmNetworkConfig } from './network';\nimport type { EvmAbi, EvmLog, EvmReceipt, EvmTx } from './types';\n\nconst TRANSFER_SELECTOR = '0xa9059cbb';\n\n/**\n * The recipient (lower-cased) and amount of an ERC-20 `transfer(address,uint256)`\n * call: the selector, then two ABI words. `null` for any other calldata.\n */\nfunction transferCall(\n input: string,\n): { readonly to: string; readonly amount: bigint } | null {\n const to = `0x${input.slice(10, 74)}`;\n const amount = `0x${input.slice(74)}`;\n if (\n !input.startsWith(TRANSFER_SELECTOR) ||\n !ADDRESS_WORD.test(to) ||\n !ABI_WORD.test(amount)\n ) {\n return null;\n }\n return { to: `0x${to.slice(26)}`.toLowerCase(), amount: BigInt(amount) };\n}\n\n/**\n * No phantom success: a token `transfer` call worked only if the token logged a\n * `Transfer` from the sender to the call's recipient, of a positive amount whenever the\n * call asked for one. ERC-20 requires the event, and some tokens return `false` instead\n * of reverting, so a successful receipt alone would report a transfer that moved nothing;\n * a log to anyone else, or of nothing, pays the recipient nothing either. A\n * fee-on-transfer token logs less than asked, and still counts; a non-compliant token\n * that moves value without the event is reported failed. The call's arguments come from\n * its signed calldata. Only verdicts on our own transactions apply it (`evmObservation`,\n * `includedFinal`), never the decoder.\n */\nexport function tokenTransferLanded(\n abi: EvmAbi,\n tx: EvmTx,\n receipt: EvmReceipt,\n): boolean {\n if (tx.to === null || !tx.input.startsWith(TRANSFER_SELECTOR)) return true;\n const call = transferCall(tx.input);\n if (!call) return false;\n return receipt.logs.some((log) => {\n const transfer = log.address === tx.to ? abi.decodeTransfer(log) : null;\n return (\n transfer !== null &&\n transfer.from === tx.from &&\n transfer.to.toLowerCase() === call.to &&\n (call.amount === 0n || transfer.amount > 0n)\n );\n });\n}\n\n/** What the chain reports: where the transaction is, and its receipt's status. */\nexport function chainObservation(\n tx: EvmTx,\n receipt: EvmReceipt | null,\n): DriverTxObservation {\n if (receipt) {\n return {\n seen: 'block',\n txHash: tx.hash,\n blockHeight: receipt.blockNumber,\n blockHash: receipt.blockHash,\n success: receipt.status === 1,\n ...(receipt.status === 0 ? { reason: 'reverted' } : {}),\n };\n }\n if (tx.blockHash !== null && tx.blockNumber !== null) {\n return {\n seen: 'block',\n txHash: tx.hash,\n blockHeight: tx.blockNumber,\n blockHash: tx.blockHash,\n };\n }\n return { seen: 'mempool', txHash: tx.hash };\n}\n\n/**\n * The verdict on one of our own transactions: the chain's status, and a successful token\n * `transfer` that logged no transfer to its recipient is `success: false`.\n */\nexport function evmObservation(\n abi: EvmAbi,\n tx: EvmTx,\n receipt: EvmReceipt | null,\n): DriverTxObservation {\n const observation = chainObservation(tx, receipt);\n if (!receipt || receipt.status === 0 || tokenTransferLanded(abi, tx, receipt)) {\n return observation;\n }\n return { ...observation, success: false, reason: 'token transfer failed' };\n}\n\n/** bor's fee log or native transfer log, from the MRC20 predeploy. */\nconst isPolygonSystemLog = (log: EvmLog): boolean =>\n log.address.toLowerCase() === POLYGON_FEE_LOG.address &&\n (log.topics[0] === POLYGON_FEE_LOG.topic ||\n log.topics[0] === POLYGON_TRANSFER_LOG.topic);\n\n/**\n * Whether contract code ran: calldata, logs, or more execution gas than a plain transfer.\n * On Polygon PoS, a plain transfer (no calldata, exactly 21,000 execution gas) also\n * carries bor's system logs, which are no sign of code: its value is `tx.value`.\n */\nfunction ranCode(tx: EvmTx, receipt: EvmReceipt, polygonSystemLogs: boolean): boolean {\n const executionGas = receipt.gasUsed - (receipt.gasUsedForL1 ?? 0n);\n if (tx.input !== '0x' || executionGas !== TRANSFER_GAS) return true;\n const logs = polygonSystemLogs\n ? receipt.logs.filter((log) => !isPolygonSystemLog(log))\n : receipt.logs;\n return logs.length > 0;\n}\n\n/**\n * Any transaction as the chain reports it: the receipt's status, never the token\n * verdict, so a third party's call that shares the `transfer` selector is not misreported.\n * Pass the network's config so bor's system logs do not make a plain Polygon transfer\n * `partial`.\n */\nexport function decodeTransaction(\n abi: EvmAbi,\n tx: EvmTx,\n receipt: EvmReceipt | null,\n timestamp?: number,\n network: Pick<EvmNetworkConfig, 'polygonSystemLogs'> = { polygonSystemLogs: false },\n): DriverTransaction {\n const transfers: DriverTransfer[] = [];\n const executed = receipt === null || receipt.status === 1;\n const to = tx.to ?? receipt?.contractAddress ?? null;\n if (executed && tx.value > 0n && to !== null) {\n transfers.push({\n locator: 'native',\n from: [tx.from],\n to,\n asset: 'native',\n amount: tx.value,\n source: 'native',\n });\n }\n for (const log of receipt?.status === 1 ? receipt.logs : []) {\n const decoded = abi.decodeTransfer(log);\n if (!decoded) continue;\n transfers.push({\n locator: `log:${log.logIndex}`,\n from: [decoded.from],\n to: decoded.to,\n asset: { standard: 'erc20', contract: log.address },\n amount: decoded.amount,\n source: 'token-event',\n });\n }\n const decoding =\n receipt === null\n ? 'partial'\n : receipt.status === 0 || !ranCode(tx, receipt, network.polygonSystemLogs)\n ? 'complete'\n : 'partial';\n return {\n id: tx.hash,\n observation: chainObservation(tx, receipt),\n ...(receipt\n ? {\n fee: [\n {\n asset: 'native' as const,\n amount: receipt.gasUsed * receipt.effectiveGasPrice + (receipt.l1Fee ?? 0n),\n },\n ],\n }\n : {}),\n transfers,\n decoding,\n ...(timestamp !== undefined ? { timestamp } : {}),\n details: {\n nonce: tx.nonce,\n type: tx.type,\n gasLimit: tx.gasLimit,\n ...(receipt\n ? {\n gasUsed: receipt.gasUsed,\n effectiveGasPrice: receipt.effectiveGasPrice,\n status: receipt.status,\n }\n : {}),\n ...(receipt?.l1Fee !== undefined ? { l1Fee: receipt.l1Fee } : {}),\n },\n };\n}\n"]}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `EvmDriver`: all EVM logic, over the `EvmClient` strategy. One factory serves
3
+ * every EVM chain and network; each network's registry data configures it.
4
+ */
5
+ import type { DriverFactory } from '../../core/driver/types';
6
+ import type { Transport } from '../../core/transport/types';
7
+ import type { EvmClient } from './types';
8
+ export declare function evmDriverFactory(makeClient: (transport: Transport, chainId: bigint) => EvmClient): DriverFactory;