@getomnichain/omnichain 0.2.0 → 0.3.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 (582) hide show
  1. package/dist/cjs/abstract_gas_pricing.js +27 -0
  2. package/dist/cjs/abstract_gas_pricing.js.map +1 -0
  3. package/dist/cjs/address.factory.js +81 -0
  4. package/dist/cjs/address.factory.js.map +1 -0
  5. package/dist/cjs/address.js +17 -0
  6. package/dist/cjs/address.js.map +1 -0
  7. package/dist/cjs/address_field.decorator.js +37 -0
  8. package/dist/cjs/address_field.decorator.js.map +1 -0
  9. package/dist/cjs/chain.base.js +118 -0
  10. package/dist/cjs/chain.base.js.map +1 -0
  11. package/dist/cjs/chain_ids.js +205 -0
  12. package/dist/cjs/chain_ids.js.map +1 -0
  13. package/dist/cjs/errors.js +118 -0
  14. package/dist/cjs/errors.js.map +1 -0
  15. package/dist/cjs/evm/evm_address.js +63 -0
  16. package/dist/cjs/evm/evm_address.js.map +1 -0
  17. package/dist/cjs/evm/evm_chain.js +1109 -0
  18. package/dist/cjs/evm/evm_chain.js.map +1 -0
  19. package/dist/cjs/evm/evm_chains.js +530 -0
  20. package/dist/cjs/evm/evm_chains.js.map +1 -0
  21. package/dist/cjs/evm/evm_gas_estimate.js +76 -0
  22. package/dist/cjs/evm/evm_gas_estimate.js.map +1 -0
  23. package/dist/cjs/evm/evm_gas_pricing.js +62 -0
  24. package/dist/cjs/evm/evm_gas_pricing.js.map +1 -0
  25. package/dist/cjs/evm/evm_token.js +26 -0
  26. package/dist/cjs/evm/evm_token.js.map +1 -0
  27. package/dist/cjs/evm/evm_tokens.js +109 -0
  28. package/dist/cjs/evm/evm_tokens.js.map +1 -0
  29. package/dist/cjs/evm/evm_transaction_status.js +187 -0
  30. package/dist/cjs/evm/evm_transaction_status.js.map +1 -0
  31. package/dist/cjs/evm/index.js +26 -0
  32. package/dist/cjs/evm/index.js.map +1 -0
  33. package/dist/cjs/evm/unsigned_evm_transaction.js +34 -0
  34. package/dist/cjs/evm/unsigned_evm_transaction.js.map +1 -0
  35. package/dist/cjs/index.js +34 -0
  36. package/dist/cjs/index.js.map +1 -0
  37. package/dist/cjs/is_address.decorator.js +54 -0
  38. package/dist/cjs/is_address.decorator.js.map +1 -0
  39. package/dist/cjs/network_type.js +152 -0
  40. package/dist/cjs/network_type.js.map +1 -0
  41. package/dist/cjs/package.json +3 -0
  42. package/dist/cjs/priority.js +26 -0
  43. package/dist/cjs/priority.js.map +1 -0
  44. package/dist/cjs/solana/index.js +25 -0
  45. package/dist/cjs/solana/index.js.map +1 -0
  46. package/dist/cjs/solana/solana_address.js +49 -0
  47. package/dist/cjs/solana/solana_address.js.map +1 -0
  48. package/dist/cjs/solana/solana_chain.js +1305 -0
  49. package/dist/cjs/solana/solana_chain.js.map +1 -0
  50. package/dist/cjs/solana/solana_chains.js +88 -0
  51. package/dist/cjs/solana/solana_chains.js.map +1 -0
  52. package/dist/cjs/solana/solana_gas_pricing.js +30 -0
  53. package/dist/cjs/solana/solana_gas_pricing.js.map +1 -0
  54. package/dist/cjs/solana/solana_token.js +38 -0
  55. package/dist/cjs/solana/solana_token.js.map +1 -0
  56. package/dist/cjs/solana/solana_tokens.js +29 -0
  57. package/dist/cjs/solana/solana_tokens.js.map +1 -0
  58. package/dist/cjs/solana/solana_transaction_status.js +149 -0
  59. package/dist/cjs/solana/solana_transaction_status.js.map +1 -0
  60. package/dist/cjs/solana/unsigned_solana_transaction.js +63 -0
  61. package/dist/cjs/solana/unsigned_solana_transaction.js.map +1 -0
  62. package/dist/cjs/token.js +66 -0
  63. package/dist/cjs/token.js.map +1 -0
  64. package/dist/cjs/ton/index.js +18 -0
  65. package/dist/cjs/ton/index.js.map +1 -0
  66. package/dist/cjs/ton/ton_address.js +57 -0
  67. package/dist/cjs/ton/ton_address.js.map +1 -0
  68. package/dist/cjs/transaction_status.js +283 -0
  69. package/dist/cjs/transaction_status.js.map +1 -0
  70. package/dist/cjs/unsigned_transaction.js +13 -0
  71. package/dist/cjs/unsigned_transaction.js.map +1 -0
  72. package/dist/cjs/utxo/btc/btc_address.js +43 -0
  73. package/dist/cjs/utxo/btc/btc_address.js.map +1 -0
  74. package/dist/cjs/utxo/btc/btc_chain.js +66 -0
  75. package/dist/cjs/utxo/btc/btc_chain.js.map +1 -0
  76. package/dist/cjs/utxo/btc/btc_chains.js +49 -0
  77. package/dist/cjs/utxo/btc/btc_chains.js.map +1 -0
  78. package/dist/cjs/utxo/btc/btc_token.js +15 -0
  79. package/dist/cjs/utxo/btc/btc_token.js.map +1 -0
  80. package/dist/cjs/utxo/btc/index.js +30 -0
  81. package/dist/cjs/utxo/btc/index.js.map +1 -0
  82. package/dist/cjs/utxo/btc/network_params.js +196 -0
  83. package/dist/cjs/utxo/btc/network_params.js.map +1 -0
  84. package/dist/cjs/utxo/btc/tools/asset_outpoint.js +16 -0
  85. package/dist/cjs/utxo/btc/tools/asset_outpoint.js.map +1 -0
  86. package/dist/cjs/utxo/btc/tools/bitcoin_core.tool.js +179 -0
  87. package/dist/cjs/utxo/btc/tools/bitcoin_core.tool.js.map +1 -0
  88. package/dist/cjs/utxo/btc/tools/esplora.tool.js +120 -0
  89. package/dist/cjs/utxo/btc/tools/esplora.tool.js.map +1 -0
  90. package/dist/cjs/utxo/btc/tools/inscription_index.js +3 -0
  91. package/dist/cjs/utxo/btc/tools/inscription_index.js.map +1 -0
  92. package/dist/cjs/utxo/btc/tools/ordiscan.tool.js +60 -0
  93. package/dist/cjs/utxo/btc/tools/ordiscan.tool.js.map +1 -0
  94. package/dist/cjs/utxo/btc/tools/rare_sat_index.js +3 -0
  95. package/dist/cjs/utxo/btc/tools/rare_sat_index.js.map +1 -0
  96. package/dist/cjs/utxo/btc/tools/rune_index.js +3 -0
  97. package/dist/cjs/utxo/btc/tools/rune_index.js.map +1 -0
  98. package/dist/cjs/utxo/btc/tools/unisat.tool.js +56 -0
  99. package/dist/cjs/utxo/btc/tools/unisat.tool.js.map +1 -0
  100. package/dist/cjs/utxo/coin_selection.js +160 -0
  101. package/dist/cjs/utxo/coin_selection.js.map +1 -0
  102. package/dist/cjs/utxo/doge/doge_chains.js +32 -0
  103. package/dist/cjs/utxo/doge/doge_chains.js.map +1 -0
  104. package/dist/cjs/utxo/doge/index.js +19 -0
  105. package/dist/cjs/utxo/doge/index.js.map +1 -0
  106. package/dist/cjs/utxo/doge/network_params.js +30 -0
  107. package/dist/cjs/utxo/doge/network_params.js.map +1 -0
  108. package/dist/cjs/utxo/ecc.js +47 -0
  109. package/dist/cjs/utxo/ecc.js.map +1 -0
  110. package/dist/cjs/utxo/fee.js +61 -0
  111. package/dist/cjs/utxo/fee.js.map +1 -0
  112. package/dist/cjs/utxo/index.js +36 -0
  113. package/dist/cjs/utxo/index.js.map +1 -0
  114. package/dist/cjs/utxo/ltc/index.js +19 -0
  115. package/dist/cjs/utxo/ltc/index.js.map +1 -0
  116. package/dist/cjs/utxo/ltc/ltc_chains.js +32 -0
  117. package/dist/cjs/utxo/ltc/ltc_chains.js.map +1 -0
  118. package/dist/cjs/utxo/ltc/network_params.js +33 -0
  119. package/dist/cjs/utxo/ltc/network_params.js.map +1 -0
  120. package/dist/cjs/utxo/script.js +59 -0
  121. package/dist/cjs/utxo/script.js.map +1 -0
  122. package/dist/cjs/utxo/tools/broadcaster.js +3 -0
  123. package/dist/cjs/utxo/tools/broadcaster.js.map +1 -0
  124. package/dist/cjs/utxo/tools/chain_tip_provider.js +3 -0
  125. package/dist/cjs/utxo/tools/chain_tip_provider.js.map +1 -0
  126. package/dist/cjs/utxo/tools/fee_estimator.js +3 -0
  127. package/dist/cjs/utxo/tools/fee_estimator.js.map +1 -0
  128. package/dist/cjs/utxo/tools/raw_transaction_provider.js +3 -0
  129. package/dist/cjs/utxo/tools/raw_transaction_provider.js.map +1 -0
  130. package/dist/cjs/utxo/tools/utxo_provider.js +3 -0
  131. package/dist/cjs/utxo/tools/utxo_provider.js.map +1 -0
  132. package/dist/cjs/utxo/unsigned_utxo_transaction.js +36 -0
  133. package/dist/cjs/utxo/unsigned_utxo_transaction.js.map +1 -0
  134. package/dist/cjs/utxo/utxo.js +3 -0
  135. package/dist/{utxo → cjs/utxo}/utxo.js.map +1 -1
  136. package/dist/cjs/utxo/utxo_chain.js +612 -0
  137. package/dist/cjs/utxo/utxo_chain.js.map +1 -0
  138. package/dist/cjs/utxo/utxo_chains.js +68 -0
  139. package/dist/cjs/utxo/utxo_chains.js.map +1 -0
  140. package/dist/cjs/utxo/utxo_gas_pricing.js +24 -0
  141. package/dist/cjs/utxo/utxo_gas_pricing.js.map +1 -0
  142. package/dist/cjs/utxo/utxo_network_params.js +18 -0
  143. package/dist/cjs/utxo/utxo_network_params.js.map +1 -0
  144. package/dist/cjs/utxo/utxo_transaction_status.js +95 -0
  145. package/dist/cjs/utxo/utxo_transaction_status.js.map +1 -0
  146. package/dist/esm/abstract_gas_pricing.d.ts.map +1 -0
  147. package/dist/esm/abstract_gas_pricing.js.map +1 -0
  148. package/dist/esm/address.d.ts.map +1 -0
  149. package/dist/esm/address.factory.d.ts.map +1 -0
  150. package/dist/esm/address.factory.js.map +1 -0
  151. package/dist/esm/address.js.map +1 -0
  152. package/dist/esm/address_field.decorator.d.ts.map +1 -0
  153. package/dist/esm/address_field.decorator.js.map +1 -0
  154. package/dist/{chain.base.d.ts → esm/chain.base.d.ts} +38 -1
  155. package/dist/esm/chain.base.d.ts.map +1 -0
  156. package/dist/esm/chain.base.js.map +1 -0
  157. package/dist/esm/chain_ids.d.ts.map +1 -0
  158. package/dist/esm/chain_ids.js.map +1 -0
  159. package/dist/{errors.d.ts → esm/errors.d.ts} +13 -0
  160. package/dist/esm/errors.d.ts.map +1 -0
  161. package/dist/esm/errors.js +107 -0
  162. package/dist/esm/errors.js.map +1 -0
  163. package/dist/esm/evm/evm_address.d.ts.map +1 -0
  164. package/dist/esm/evm/evm_address.js.map +1 -0
  165. package/dist/{evm → esm/evm}/evm_chain.d.ts +48 -2
  166. package/dist/esm/evm/evm_chain.d.ts.map +1 -0
  167. package/dist/{evm → esm/evm}/evm_chain.js +423 -4
  168. package/dist/esm/evm/evm_chain.js.map +1 -0
  169. package/dist/esm/evm/evm_chains.d.ts.map +1 -0
  170. package/dist/esm/evm/evm_chains.js.map +1 -0
  171. package/dist/esm/evm/evm_gas_estimate.d.ts.map +1 -0
  172. package/dist/esm/evm/evm_gas_estimate.js.map +1 -0
  173. package/dist/esm/evm/evm_gas_pricing.d.ts.map +1 -0
  174. package/dist/esm/evm/evm_gas_pricing.js.map +1 -0
  175. package/dist/esm/evm/evm_token.d.ts.map +1 -0
  176. package/dist/esm/evm/evm_token.js.map +1 -0
  177. package/dist/esm/evm/evm_tokens.d.ts.map +1 -0
  178. package/dist/esm/evm/evm_tokens.js.map +1 -0
  179. package/dist/{evm → esm/evm}/evm_transaction_status.d.ts +4 -0
  180. package/dist/esm/evm/evm_transaction_status.d.ts.map +1 -0
  181. package/dist/{evm → esm/evm}/evm_transaction_status.js +4 -0
  182. package/dist/esm/evm/evm_transaction_status.js.map +1 -0
  183. package/dist/esm/evm/index.d.ts.map +1 -0
  184. package/dist/esm/evm/index.js.map +1 -0
  185. package/dist/{evm → esm/evm}/unsigned_evm_transaction.d.ts +13 -0
  186. package/dist/esm/evm/unsigned_evm_transaction.d.ts.map +1 -0
  187. package/dist/{evm → esm/evm}/unsigned_evm_transaction.js +12 -0
  188. package/dist/esm/evm/unsigned_evm_transaction.js.map +1 -0
  189. package/dist/esm/index.d.ts.map +1 -0
  190. package/dist/esm/index.js.map +1 -0
  191. package/dist/esm/is_address.decorator.d.ts.map +1 -0
  192. package/dist/esm/is_address.decorator.js.map +1 -0
  193. package/dist/esm/network_type.d.ts.map +1 -0
  194. package/dist/esm/network_type.js.map +1 -0
  195. package/dist/esm/package.json +3 -0
  196. package/dist/esm/priority.d.ts.map +1 -0
  197. package/dist/esm/priority.js.map +1 -0
  198. package/dist/esm/solana/index.d.ts.map +1 -0
  199. package/dist/esm/solana/index.js.map +1 -0
  200. package/dist/esm/solana/solana_address.d.ts.map +1 -0
  201. package/dist/esm/solana/solana_address.js.map +1 -0
  202. package/dist/{solana → esm/solana}/solana_chain.d.ts +87 -3
  203. package/dist/esm/solana/solana_chain.d.ts.map +1 -0
  204. package/dist/{solana → esm/solana}/solana_chain.js +618 -23
  205. package/dist/esm/solana/solana_chain.js.map +1 -0
  206. package/dist/esm/solana/solana_chains.d.ts.map +1 -0
  207. package/dist/esm/solana/solana_chains.js.map +1 -0
  208. package/dist/esm/solana/solana_gas_pricing.d.ts.map +1 -0
  209. package/dist/esm/solana/solana_gas_pricing.js.map +1 -0
  210. package/dist/esm/solana/solana_token.d.ts.map +1 -0
  211. package/dist/esm/solana/solana_token.js.map +1 -0
  212. package/dist/esm/solana/solana_tokens.d.ts.map +1 -0
  213. package/dist/esm/solana/solana_tokens.js.map +1 -0
  214. package/dist/esm/solana/solana_transaction_status.d.ts.map +1 -0
  215. package/dist/esm/solana/solana_transaction_status.js.map +1 -0
  216. package/dist/{solana → esm/solana}/unsigned_solana_transaction.d.ts +20 -1
  217. package/dist/esm/solana/unsigned_solana_transaction.d.ts.map +1 -0
  218. package/dist/esm/solana/unsigned_solana_transaction.js +59 -0
  219. package/dist/esm/solana/unsigned_solana_transaction.js.map +1 -0
  220. package/dist/esm/token.d.ts.map +1 -0
  221. package/dist/esm/token.js.map +1 -0
  222. package/dist/esm/ton/index.d.ts.map +1 -0
  223. package/dist/esm/ton/index.js.map +1 -0
  224. package/dist/esm/ton/ton_address.d.ts.map +1 -0
  225. package/dist/esm/ton/ton_address.js.map +1 -0
  226. package/dist/esm/transaction_status.d.ts.map +1 -0
  227. package/dist/esm/transaction_status.js.map +1 -0
  228. package/dist/esm/unsigned_transaction.d.ts.map +1 -0
  229. package/dist/esm/unsigned_transaction.js.map +1 -0
  230. package/dist/esm/utxo/btc/btc_address.d.ts.map +1 -0
  231. package/dist/esm/utxo/btc/btc_address.js.map +1 -0
  232. package/dist/esm/utxo/btc/btc_chain.d.ts.map +1 -0
  233. package/dist/esm/utxo/btc/btc_chain.js.map +1 -0
  234. package/dist/esm/utxo/btc/btc_chains.d.ts.map +1 -0
  235. package/dist/esm/utxo/btc/btc_chains.js.map +1 -0
  236. package/dist/esm/utxo/btc/btc_token.d.ts.map +1 -0
  237. package/dist/esm/utxo/btc/btc_token.js.map +1 -0
  238. package/dist/esm/utxo/btc/index.d.ts.map +1 -0
  239. package/dist/esm/utxo/btc/index.js.map +1 -0
  240. package/dist/esm/utxo/btc/network_params.d.ts.map +1 -0
  241. package/dist/esm/utxo/btc/network_params.js.map +1 -0
  242. package/dist/esm/utxo/btc/tools/asset_outpoint.d.ts.map +1 -0
  243. package/dist/esm/utxo/btc/tools/asset_outpoint.js.map +1 -0
  244. package/dist/esm/utxo/btc/tools/bitcoin_core.tool.d.ts.map +1 -0
  245. package/dist/esm/utxo/btc/tools/bitcoin_core.tool.js.map +1 -0
  246. package/dist/esm/utxo/btc/tools/esplora.tool.d.ts.map +1 -0
  247. package/dist/esm/utxo/btc/tools/esplora.tool.js.map +1 -0
  248. package/dist/esm/utxo/btc/tools/inscription_index.d.ts.map +1 -0
  249. package/dist/esm/utxo/btc/tools/inscription_index.js.map +1 -0
  250. package/dist/esm/utxo/btc/tools/ordiscan.tool.d.ts.map +1 -0
  251. package/dist/esm/utxo/btc/tools/ordiscan.tool.js.map +1 -0
  252. package/dist/esm/utxo/btc/tools/rare_sat_index.d.ts.map +1 -0
  253. package/dist/esm/utxo/btc/tools/rare_sat_index.js.map +1 -0
  254. package/dist/esm/utxo/btc/tools/rune_index.d.ts.map +1 -0
  255. package/dist/esm/utxo/btc/tools/rune_index.js.map +1 -0
  256. package/dist/esm/utxo/btc/tools/unisat.tool.d.ts.map +1 -0
  257. package/dist/esm/utxo/btc/tools/unisat.tool.js.map +1 -0
  258. package/dist/esm/utxo/coin_selection.d.ts.map +1 -0
  259. package/dist/esm/utxo/coin_selection.js.map +1 -0
  260. package/dist/esm/utxo/doge/doge_chains.d.ts.map +1 -0
  261. package/dist/esm/utxo/doge/doge_chains.js.map +1 -0
  262. package/dist/esm/utxo/doge/index.d.ts.map +1 -0
  263. package/dist/esm/utxo/doge/index.js.map +1 -0
  264. package/dist/esm/utxo/doge/network_params.d.ts.map +1 -0
  265. package/dist/esm/utxo/doge/network_params.js.map +1 -0
  266. package/dist/esm/utxo/ecc.d.ts.map +1 -0
  267. package/dist/esm/utxo/ecc.js.map +1 -0
  268. package/dist/esm/utxo/fee.d.ts.map +1 -0
  269. package/dist/esm/utxo/fee.js.map +1 -0
  270. package/dist/esm/utxo/index.d.ts.map +1 -0
  271. package/dist/esm/utxo/index.js.map +1 -0
  272. package/dist/esm/utxo/ltc/index.d.ts.map +1 -0
  273. package/dist/esm/utxo/ltc/index.js.map +1 -0
  274. package/dist/{utxo/doge/doge_chains.d.ts.map → esm/utxo/ltc/ltc_chains.d.ts.map} +1 -1
  275. package/dist/{utxo/doge/doge_chains.js.map → esm/utxo/ltc/ltc_chains.js.map} +1 -1
  276. package/dist/esm/utxo/ltc/network_params.d.ts.map +1 -0
  277. package/dist/esm/utxo/ltc/network_params.js.map +1 -0
  278. package/dist/esm/utxo/script.d.ts.map +1 -0
  279. package/dist/esm/utxo/script.js.map +1 -0
  280. package/dist/esm/utxo/tools/broadcaster.d.ts.map +1 -0
  281. package/dist/esm/utxo/tools/broadcaster.js.map +1 -0
  282. package/dist/esm/utxo/tools/chain_tip_provider.d.ts.map +1 -0
  283. package/dist/esm/utxo/tools/chain_tip_provider.js.map +1 -0
  284. package/dist/esm/utxo/tools/fee_estimator.d.ts.map +1 -0
  285. package/dist/esm/utxo/tools/fee_estimator.js.map +1 -0
  286. package/dist/esm/utxo/tools/raw_transaction_provider.d.ts.map +1 -0
  287. package/dist/esm/utxo/tools/raw_transaction_provider.js.map +1 -0
  288. package/dist/esm/utxo/tools/utxo_provider.d.ts.map +1 -0
  289. package/dist/esm/utxo/tools/utxo_provider.js.map +1 -0
  290. package/dist/esm/utxo/unsigned_utxo_transaction.d.ts.map +1 -0
  291. package/dist/esm/utxo/unsigned_utxo_transaction.js.map +1 -0
  292. package/dist/esm/utxo/utxo.d.ts.map +1 -0
  293. package/dist/esm/utxo/utxo.js.map +1 -0
  294. package/dist/{utxo → esm/utxo}/utxo_chain.d.ts +15 -2
  295. package/dist/esm/utxo/utxo_chain.d.ts.map +1 -0
  296. package/dist/{utxo → esm/utxo}/utxo_chain.js +96 -13
  297. package/dist/esm/utxo/utxo_chain.js.map +1 -0
  298. package/dist/esm/utxo/utxo_chains.d.ts.map +1 -0
  299. package/dist/esm/utxo/utxo_chains.js.map +1 -0
  300. package/dist/esm/utxo/utxo_gas_pricing.d.ts.map +1 -0
  301. package/dist/esm/utxo/utxo_gas_pricing.js.map +1 -0
  302. package/dist/esm/utxo/utxo_network_params.d.ts.map +1 -0
  303. package/dist/esm/utxo/utxo_network_params.js.map +1 -0
  304. package/dist/esm/utxo/utxo_transaction_status.d.ts.map +1 -0
  305. package/dist/esm/utxo/utxo_transaction_status.js.map +1 -0
  306. package/docs/CONNECTIONS.md +33 -0
  307. package/docs/EIP7702.md +77 -0
  308. package/docs/JITO.md +41 -0
  309. package/docs/MULTI_RPC.md +28 -0
  310. package/package.json +32 -16
  311. package/dist/abstract_gas_pricing.d.ts.map +0 -1
  312. package/dist/abstract_gas_pricing.js.map +0 -1
  313. package/dist/address.d.ts.map +0 -1
  314. package/dist/address.factory.d.ts.map +0 -1
  315. package/dist/address.factory.js.map +0 -1
  316. package/dist/address.js.map +0 -1
  317. package/dist/address_field.decorator.d.ts.map +0 -1
  318. package/dist/address_field.decorator.js.map +0 -1
  319. package/dist/chain.base.d.ts.map +0 -1
  320. package/dist/chain.base.js.map +0 -1
  321. package/dist/chain_ids.d.ts.map +0 -1
  322. package/dist/chain_ids.js.map +0 -1
  323. package/dist/errors.d.ts.map +0 -1
  324. package/dist/errors.js +0 -62
  325. package/dist/errors.js.map +0 -1
  326. package/dist/evm/evm_address.d.ts.map +0 -1
  327. package/dist/evm/evm_address.js.map +0 -1
  328. package/dist/evm/evm_chain.d.ts.map +0 -1
  329. package/dist/evm/evm_chain.js.map +0 -1
  330. package/dist/evm/evm_chains.d.ts.map +0 -1
  331. package/dist/evm/evm_chains.js.map +0 -1
  332. package/dist/evm/evm_gas_estimate.d.ts.map +0 -1
  333. package/dist/evm/evm_gas_estimate.js.map +0 -1
  334. package/dist/evm/evm_gas_pricing.d.ts.map +0 -1
  335. package/dist/evm/evm_gas_pricing.js.map +0 -1
  336. package/dist/evm/evm_token.d.ts.map +0 -1
  337. package/dist/evm/evm_token.js.map +0 -1
  338. package/dist/evm/evm_tokens.d.ts.map +0 -1
  339. package/dist/evm/evm_tokens.js.map +0 -1
  340. package/dist/evm/evm_transaction_status.d.ts.map +0 -1
  341. package/dist/evm/evm_transaction_status.js.map +0 -1
  342. package/dist/evm/index.d.ts.map +0 -1
  343. package/dist/evm/index.js.map +0 -1
  344. package/dist/evm/unsigned_evm_transaction.d.ts.map +0 -1
  345. package/dist/evm/unsigned_evm_transaction.js.map +0 -1
  346. package/dist/index.d.ts.map +0 -1
  347. package/dist/index.js.map +0 -1
  348. package/dist/is_address.decorator.d.ts.map +0 -1
  349. package/dist/is_address.decorator.js.map +0 -1
  350. package/dist/network_type.d.ts.map +0 -1
  351. package/dist/network_type.js.map +0 -1
  352. package/dist/priority.d.ts.map +0 -1
  353. package/dist/priority.js.map +0 -1
  354. package/dist/solana/index.d.ts.map +0 -1
  355. package/dist/solana/index.js.map +0 -1
  356. package/dist/solana/solana_address.d.ts.map +0 -1
  357. package/dist/solana/solana_address.js.map +0 -1
  358. package/dist/solana/solana_chain.d.ts.map +0 -1
  359. package/dist/solana/solana_chain.js.map +0 -1
  360. package/dist/solana/solana_chains.d.ts.map +0 -1
  361. package/dist/solana/solana_chains.js.map +0 -1
  362. package/dist/solana/solana_gas_pricing.d.ts.map +0 -1
  363. package/dist/solana/solana_gas_pricing.js.map +0 -1
  364. package/dist/solana/solana_token.d.ts.map +0 -1
  365. package/dist/solana/solana_token.js.map +0 -1
  366. package/dist/solana/solana_tokens.d.ts.map +0 -1
  367. package/dist/solana/solana_tokens.js.map +0 -1
  368. package/dist/solana/solana_transaction_status.d.ts.map +0 -1
  369. package/dist/solana/solana_transaction_status.js.map +0 -1
  370. package/dist/solana/unsigned_solana_transaction.d.ts.map +0 -1
  371. package/dist/solana/unsigned_solana_transaction.js +0 -26
  372. package/dist/solana/unsigned_solana_transaction.js.map +0 -1
  373. package/dist/token.d.ts.map +0 -1
  374. package/dist/token.js.map +0 -1
  375. package/dist/ton/index.d.ts.map +0 -1
  376. package/dist/ton/index.js.map +0 -1
  377. package/dist/ton/ton_address.d.ts.map +0 -1
  378. package/dist/ton/ton_address.js.map +0 -1
  379. package/dist/transaction_status.d.ts.map +0 -1
  380. package/dist/transaction_status.js.map +0 -1
  381. package/dist/unsigned_transaction.d.ts.map +0 -1
  382. package/dist/unsigned_transaction.js.map +0 -1
  383. package/dist/utxo/btc/btc_address.d.ts.map +0 -1
  384. package/dist/utxo/btc/btc_address.js.map +0 -1
  385. package/dist/utxo/btc/btc_chain.d.ts.map +0 -1
  386. package/dist/utxo/btc/btc_chain.js.map +0 -1
  387. package/dist/utxo/btc/btc_chains.d.ts.map +0 -1
  388. package/dist/utxo/btc/btc_chains.js.map +0 -1
  389. package/dist/utxo/btc/btc_token.d.ts.map +0 -1
  390. package/dist/utxo/btc/btc_token.js.map +0 -1
  391. package/dist/utxo/btc/index.d.ts.map +0 -1
  392. package/dist/utxo/btc/index.js.map +0 -1
  393. package/dist/utxo/btc/network_params.d.ts.map +0 -1
  394. package/dist/utxo/btc/network_params.js.map +0 -1
  395. package/dist/utxo/btc/tools/asset_outpoint.d.ts.map +0 -1
  396. package/dist/utxo/btc/tools/asset_outpoint.js.map +0 -1
  397. package/dist/utxo/btc/tools/bitcoin_core.tool.d.ts.map +0 -1
  398. package/dist/utxo/btc/tools/bitcoin_core.tool.js.map +0 -1
  399. package/dist/utxo/btc/tools/esplora.tool.d.ts.map +0 -1
  400. package/dist/utxo/btc/tools/esplora.tool.js.map +0 -1
  401. package/dist/utxo/btc/tools/inscription_index.d.ts.map +0 -1
  402. package/dist/utxo/btc/tools/inscription_index.js.map +0 -1
  403. package/dist/utxo/btc/tools/ordiscan.tool.d.ts.map +0 -1
  404. package/dist/utxo/btc/tools/ordiscan.tool.js.map +0 -1
  405. package/dist/utxo/btc/tools/rare_sat_index.d.ts.map +0 -1
  406. package/dist/utxo/btc/tools/rare_sat_index.js.map +0 -1
  407. package/dist/utxo/btc/tools/rune_index.d.ts.map +0 -1
  408. package/dist/utxo/btc/tools/rune_index.js.map +0 -1
  409. package/dist/utxo/btc/tools/unisat.tool.d.ts.map +0 -1
  410. package/dist/utxo/btc/tools/unisat.tool.js.map +0 -1
  411. package/dist/utxo/coin_selection.d.ts.map +0 -1
  412. package/dist/utxo/coin_selection.js.map +0 -1
  413. package/dist/utxo/doge/index.d.ts.map +0 -1
  414. package/dist/utxo/doge/index.js.map +0 -1
  415. package/dist/utxo/doge/network_params.d.ts.map +0 -1
  416. package/dist/utxo/doge/network_params.js.map +0 -1
  417. package/dist/utxo/ecc.d.ts.map +0 -1
  418. package/dist/utxo/ecc.js.map +0 -1
  419. package/dist/utxo/fee.d.ts.map +0 -1
  420. package/dist/utxo/fee.js.map +0 -1
  421. package/dist/utxo/index.d.ts.map +0 -1
  422. package/dist/utxo/index.js.map +0 -1
  423. package/dist/utxo/ltc/index.d.ts.map +0 -1
  424. package/dist/utxo/ltc/index.js.map +0 -1
  425. package/dist/utxo/ltc/ltc_chains.d.ts.map +0 -1
  426. package/dist/utxo/ltc/ltc_chains.js.map +0 -1
  427. package/dist/utxo/ltc/network_params.d.ts.map +0 -1
  428. package/dist/utxo/ltc/network_params.js.map +0 -1
  429. package/dist/utxo/script.d.ts.map +0 -1
  430. package/dist/utxo/script.js.map +0 -1
  431. package/dist/utxo/tools/broadcaster.d.ts.map +0 -1
  432. package/dist/utxo/tools/broadcaster.js.map +0 -1
  433. package/dist/utxo/tools/chain_tip_provider.d.ts.map +0 -1
  434. package/dist/utxo/tools/chain_tip_provider.js.map +0 -1
  435. package/dist/utxo/tools/fee_estimator.d.ts.map +0 -1
  436. package/dist/utxo/tools/fee_estimator.js.map +0 -1
  437. package/dist/utxo/tools/raw_transaction_provider.d.ts.map +0 -1
  438. package/dist/utxo/tools/raw_transaction_provider.js.map +0 -1
  439. package/dist/utxo/tools/utxo_provider.d.ts.map +0 -1
  440. package/dist/utxo/tools/utxo_provider.js.map +0 -1
  441. package/dist/utxo/unsigned_utxo_transaction.d.ts.map +0 -1
  442. package/dist/utxo/unsigned_utxo_transaction.js.map +0 -1
  443. package/dist/utxo/utxo.d.ts.map +0 -1
  444. package/dist/utxo/utxo_chain.d.ts.map +0 -1
  445. package/dist/utxo/utxo_chain.js.map +0 -1
  446. package/dist/utxo/utxo_chains.d.ts.map +0 -1
  447. package/dist/utxo/utxo_chains.js.map +0 -1
  448. package/dist/utxo/utxo_gas_pricing.d.ts.map +0 -1
  449. package/dist/utxo/utxo_gas_pricing.js.map +0 -1
  450. package/dist/utxo/utxo_network_params.d.ts.map +0 -1
  451. package/dist/utxo/utxo_network_params.js.map +0 -1
  452. package/dist/utxo/utxo_transaction_status.d.ts.map +0 -1
  453. package/dist/utxo/utxo_transaction_status.js.map +0 -1
  454. /package/dist/{abstract_gas_pricing.d.ts → esm/abstract_gas_pricing.d.ts} +0 -0
  455. /package/dist/{abstract_gas_pricing.js → esm/abstract_gas_pricing.js} +0 -0
  456. /package/dist/{address.d.ts → esm/address.d.ts} +0 -0
  457. /package/dist/{address.factory.d.ts → esm/address.factory.d.ts} +0 -0
  458. /package/dist/{address.factory.js → esm/address.factory.js} +0 -0
  459. /package/dist/{address.js → esm/address.js} +0 -0
  460. /package/dist/{address_field.decorator.d.ts → esm/address_field.decorator.d.ts} +0 -0
  461. /package/dist/{address_field.decorator.js → esm/address_field.decorator.js} +0 -0
  462. /package/dist/{chain.base.js → esm/chain.base.js} +0 -0
  463. /package/dist/{chain_ids.d.ts → esm/chain_ids.d.ts} +0 -0
  464. /package/dist/{chain_ids.js → esm/chain_ids.js} +0 -0
  465. /package/dist/{evm → esm/evm}/evm_address.d.ts +0 -0
  466. /package/dist/{evm → esm/evm}/evm_address.js +0 -0
  467. /package/dist/{evm → esm/evm}/evm_chains.d.ts +0 -0
  468. /package/dist/{evm → esm/evm}/evm_chains.js +0 -0
  469. /package/dist/{evm → esm/evm}/evm_gas_estimate.d.ts +0 -0
  470. /package/dist/{evm → esm/evm}/evm_gas_estimate.js +0 -0
  471. /package/dist/{evm → esm/evm}/evm_gas_pricing.d.ts +0 -0
  472. /package/dist/{evm → esm/evm}/evm_gas_pricing.js +0 -0
  473. /package/dist/{evm → esm/evm}/evm_token.d.ts +0 -0
  474. /package/dist/{evm → esm/evm}/evm_token.js +0 -0
  475. /package/dist/{evm → esm/evm}/evm_tokens.d.ts +0 -0
  476. /package/dist/{evm → esm/evm}/evm_tokens.js +0 -0
  477. /package/dist/{evm → esm/evm}/index.d.ts +0 -0
  478. /package/dist/{evm → esm/evm}/index.js +0 -0
  479. /package/dist/{index.d.ts → esm/index.d.ts} +0 -0
  480. /package/dist/{index.js → esm/index.js} +0 -0
  481. /package/dist/{is_address.decorator.d.ts → esm/is_address.decorator.d.ts} +0 -0
  482. /package/dist/{is_address.decorator.js → esm/is_address.decorator.js} +0 -0
  483. /package/dist/{network_type.d.ts → esm/network_type.d.ts} +0 -0
  484. /package/dist/{network_type.js → esm/network_type.js} +0 -0
  485. /package/dist/{priority.d.ts → esm/priority.d.ts} +0 -0
  486. /package/dist/{priority.js → esm/priority.js} +0 -0
  487. /package/dist/{solana → esm/solana}/index.d.ts +0 -0
  488. /package/dist/{solana → esm/solana}/index.js +0 -0
  489. /package/dist/{solana → esm/solana}/solana_address.d.ts +0 -0
  490. /package/dist/{solana → esm/solana}/solana_address.js +0 -0
  491. /package/dist/{solana → esm/solana}/solana_chains.d.ts +0 -0
  492. /package/dist/{solana → esm/solana}/solana_chains.js +0 -0
  493. /package/dist/{solana → esm/solana}/solana_gas_pricing.d.ts +0 -0
  494. /package/dist/{solana → esm/solana}/solana_gas_pricing.js +0 -0
  495. /package/dist/{solana → esm/solana}/solana_token.d.ts +0 -0
  496. /package/dist/{solana → esm/solana}/solana_token.js +0 -0
  497. /package/dist/{solana → esm/solana}/solana_tokens.d.ts +0 -0
  498. /package/dist/{solana → esm/solana}/solana_tokens.js +0 -0
  499. /package/dist/{solana → esm/solana}/solana_transaction_status.d.ts +0 -0
  500. /package/dist/{solana → esm/solana}/solana_transaction_status.js +0 -0
  501. /package/dist/{token.d.ts → esm/token.d.ts} +0 -0
  502. /package/dist/{token.js → esm/token.js} +0 -0
  503. /package/dist/{ton → esm/ton}/index.d.ts +0 -0
  504. /package/dist/{ton → esm/ton}/index.js +0 -0
  505. /package/dist/{ton → esm/ton}/ton_address.d.ts +0 -0
  506. /package/dist/{ton → esm/ton}/ton_address.js +0 -0
  507. /package/dist/{transaction_status.d.ts → esm/transaction_status.d.ts} +0 -0
  508. /package/dist/{transaction_status.js → esm/transaction_status.js} +0 -0
  509. /package/dist/{unsigned_transaction.d.ts → esm/unsigned_transaction.d.ts} +0 -0
  510. /package/dist/{unsigned_transaction.js → esm/unsigned_transaction.js} +0 -0
  511. /package/dist/{utxo → esm/utxo}/btc/btc_address.d.ts +0 -0
  512. /package/dist/{utxo → esm/utxo}/btc/btc_address.js +0 -0
  513. /package/dist/{utxo → esm/utxo}/btc/btc_chain.d.ts +0 -0
  514. /package/dist/{utxo → esm/utxo}/btc/btc_chain.js +0 -0
  515. /package/dist/{utxo → esm/utxo}/btc/btc_chains.d.ts +0 -0
  516. /package/dist/{utxo → esm/utxo}/btc/btc_chains.js +0 -0
  517. /package/dist/{utxo → esm/utxo}/btc/btc_token.d.ts +0 -0
  518. /package/dist/{utxo → esm/utxo}/btc/btc_token.js +0 -0
  519. /package/dist/{utxo → esm/utxo}/btc/index.d.ts +0 -0
  520. /package/dist/{utxo → esm/utxo}/btc/index.js +0 -0
  521. /package/dist/{utxo → esm/utxo}/btc/network_params.d.ts +0 -0
  522. /package/dist/{utxo → esm/utxo}/btc/network_params.js +0 -0
  523. /package/dist/{utxo → esm/utxo}/btc/tools/asset_outpoint.d.ts +0 -0
  524. /package/dist/{utxo → esm/utxo}/btc/tools/asset_outpoint.js +0 -0
  525. /package/dist/{utxo → esm/utxo}/btc/tools/bitcoin_core.tool.d.ts +0 -0
  526. /package/dist/{utxo → esm/utxo}/btc/tools/bitcoin_core.tool.js +0 -0
  527. /package/dist/{utxo → esm/utxo}/btc/tools/esplora.tool.d.ts +0 -0
  528. /package/dist/{utxo → esm/utxo}/btc/tools/esplora.tool.js +0 -0
  529. /package/dist/{utxo → esm/utxo}/btc/tools/inscription_index.d.ts +0 -0
  530. /package/dist/{utxo → esm/utxo}/btc/tools/inscription_index.js +0 -0
  531. /package/dist/{utxo → esm/utxo}/btc/tools/ordiscan.tool.d.ts +0 -0
  532. /package/dist/{utxo → esm/utxo}/btc/tools/ordiscan.tool.js +0 -0
  533. /package/dist/{utxo → esm/utxo}/btc/tools/rare_sat_index.d.ts +0 -0
  534. /package/dist/{utxo → esm/utxo}/btc/tools/rare_sat_index.js +0 -0
  535. /package/dist/{utxo → esm/utxo}/btc/tools/rune_index.d.ts +0 -0
  536. /package/dist/{utxo → esm/utxo}/btc/tools/rune_index.js +0 -0
  537. /package/dist/{utxo → esm/utxo}/btc/tools/unisat.tool.d.ts +0 -0
  538. /package/dist/{utxo → esm/utxo}/btc/tools/unisat.tool.js +0 -0
  539. /package/dist/{utxo → esm/utxo}/coin_selection.d.ts +0 -0
  540. /package/dist/{utxo → esm/utxo}/coin_selection.js +0 -0
  541. /package/dist/{utxo → esm/utxo}/doge/doge_chains.d.ts +0 -0
  542. /package/dist/{utxo → esm/utxo}/doge/doge_chains.js +0 -0
  543. /package/dist/{utxo → esm/utxo}/doge/index.d.ts +0 -0
  544. /package/dist/{utxo → esm/utxo}/doge/index.js +0 -0
  545. /package/dist/{utxo → esm/utxo}/doge/network_params.d.ts +0 -0
  546. /package/dist/{utxo → esm/utxo}/doge/network_params.js +0 -0
  547. /package/dist/{utxo → esm/utxo}/ecc.d.ts +0 -0
  548. /package/dist/{utxo → esm/utxo}/ecc.js +0 -0
  549. /package/dist/{utxo → esm/utxo}/fee.d.ts +0 -0
  550. /package/dist/{utxo → esm/utxo}/fee.js +0 -0
  551. /package/dist/{utxo → esm/utxo}/index.d.ts +0 -0
  552. /package/dist/{utxo → esm/utxo}/index.js +0 -0
  553. /package/dist/{utxo → esm/utxo}/ltc/index.d.ts +0 -0
  554. /package/dist/{utxo → esm/utxo}/ltc/index.js +0 -0
  555. /package/dist/{utxo → esm/utxo}/ltc/ltc_chains.d.ts +0 -0
  556. /package/dist/{utxo → esm/utxo}/ltc/ltc_chains.js +0 -0
  557. /package/dist/{utxo → esm/utxo}/ltc/network_params.d.ts +0 -0
  558. /package/dist/{utxo → esm/utxo}/ltc/network_params.js +0 -0
  559. /package/dist/{utxo → esm/utxo}/script.d.ts +0 -0
  560. /package/dist/{utxo → esm/utxo}/script.js +0 -0
  561. /package/dist/{utxo → esm/utxo}/tools/broadcaster.d.ts +0 -0
  562. /package/dist/{utxo → esm/utxo}/tools/broadcaster.js +0 -0
  563. /package/dist/{utxo → esm/utxo}/tools/chain_tip_provider.d.ts +0 -0
  564. /package/dist/{utxo → esm/utxo}/tools/chain_tip_provider.js +0 -0
  565. /package/dist/{utxo → esm/utxo}/tools/fee_estimator.d.ts +0 -0
  566. /package/dist/{utxo → esm/utxo}/tools/fee_estimator.js +0 -0
  567. /package/dist/{utxo → esm/utxo}/tools/raw_transaction_provider.d.ts +0 -0
  568. /package/dist/{utxo → esm/utxo}/tools/raw_transaction_provider.js +0 -0
  569. /package/dist/{utxo → esm/utxo}/tools/utxo_provider.d.ts +0 -0
  570. /package/dist/{utxo → esm/utxo}/tools/utxo_provider.js +0 -0
  571. /package/dist/{utxo → esm/utxo}/unsigned_utxo_transaction.d.ts +0 -0
  572. /package/dist/{utxo → esm/utxo}/unsigned_utxo_transaction.js +0 -0
  573. /package/dist/{utxo → esm/utxo}/utxo.d.ts +0 -0
  574. /package/dist/{utxo → esm/utxo}/utxo.js +0 -0
  575. /package/dist/{utxo → esm/utxo}/utxo_chains.d.ts +0 -0
  576. /package/dist/{utxo → esm/utxo}/utxo_chains.js +0 -0
  577. /package/dist/{utxo → esm/utxo}/utxo_gas_pricing.d.ts +0 -0
  578. /package/dist/{utxo → esm/utxo}/utxo_gas_pricing.js +0 -0
  579. /package/dist/{utxo → esm/utxo}/utxo_network_params.d.ts +0 -0
  580. /package/dist/{utxo → esm/utxo}/utxo_network_params.js +0 -0
  581. /package/dist/{utxo → esm/utxo}/utxo_transaction_status.d.ts +0 -0
  582. /package/dist/{utxo → esm/utxo}/utxo_transaction_status.js +0 -0
@@ -1,5 +1,5 @@
1
1
  import { JsonRpcProvider, TransactionReceipt } from 'ethers';
2
- import { Chain, CreateTransferRequest } from '../chain.base.ts';
2
+ import { BroadcastOpts, Chain, CreateTransferRequest, CreateUnsignedTransactionRequest, Eip7702Authorization, GetTransactionStatusOpts } from '../chain.base.ts';
3
3
  import { Priority } from '../priority.ts';
4
4
  import { EvmGasEstimate } from './evm_gas_estimate.ts';
5
5
  import { NestedBalanceChanges } from '../transaction_status.ts';
@@ -19,6 +19,7 @@ export interface EvmChainInit {
19
19
  * (e.g. `ARBITRUM_RPC_URL`), then `EVM_<chainId>_RPC_URL`, then throws.
20
20
  */
21
21
  rpcUrl?: string;
22
+ rpcUrls?: string[];
22
23
  supportsEip1559?: boolean;
23
24
  /**
24
25
  * OP-stack rollups (Optimism/Base/Unichain/WorldChain/Boba/Sonic and
@@ -48,9 +49,36 @@ export interface EvmChainInit {
48
49
  * **Declarative-only in v0** — see `nativeTransferGasLimit` note above.
49
50
  */
50
51
  nativeTransferGasMultiplier?: number;
52
+ supports7702?: boolean;
53
+ }
54
+ export interface CreateEvmUnsignedTransactionRequest extends CreateUnsignedTransactionRequest {
55
+ from: string;
56
+ to: string;
57
+ data?: string;
58
+ value?: bigint;
59
+ authorizationList?: Eip7702Authorization[];
60
+ gasLimit?: bigint;
61
+ nonce?: bigint;
62
+ maxFeePerGas?: bigint;
63
+ maxPriorityFeePerGas?: bigint;
64
+ }
65
+ export interface EvmCallRequest {
66
+ to: string;
67
+ data: string;
68
+ blockTag?: string | number;
69
+ from?: string;
70
+ value?: bigint;
71
+ estimateGas?: boolean;
72
+ }
73
+ export interface EvmCallResult {
74
+ result?: string;
75
+ gasEstimate?: bigint;
76
+ /** Raw ABI-encoded revert data when the call reverted (0x-prefixed hex). Present only on SimulationFailed. */
77
+ revertData?: string;
51
78
  }
52
79
  export declare class EvmChain extends Chain {
53
80
  readonly rpcUrl: string | undefined;
81
+ readonly rpcUrls: readonly string[];
54
82
  readonly supportsEip1559: boolean;
55
83
  readonly hasL1Fee: boolean;
56
84
  /**
@@ -68,6 +96,7 @@ export declare class EvmChain extends Chain {
68
96
  * `nativeTransferGasLimit`.
69
97
  */
70
98
  readonly nativeTransferGasMultiplier: number;
99
+ readonly supports7702: boolean;
71
100
  private readonly _nativeToken;
72
101
  private _provider;
73
102
  private _resolvedRpcUrl;
@@ -93,11 +122,28 @@ export declare class EvmChain extends Chain {
93
122
  getTokenExplorerUrl(tokenIdentifier?: string): string;
94
123
  getTransactionExplorerUrl(txHash: string): string;
95
124
  validateAddress(raw: string): boolean;
125
+ private normalizeAddressOrThrow;
96
126
  validateTokenIdentifier(raw: string | undefined): boolean;
97
127
  getBalance(owner: string, tokenIdentifier?: string): Promise<bigint>;
98
128
  createTransferUnsignedTransaction(req: CreateTransferRequest): Promise<UnsignedEvmTransaction>;
99
129
  getChainTipHeight(): Promise<number>;
100
- getTransactionStatus(txHash: string): Promise<EvmTransactionStatus>;
130
+ broadcast(signed: string | Uint8Array, opts?: BroadcastOpts): Promise<string>;
131
+ getPendingNonce(address: string): Promise<bigint>;
132
+ getDelegation(address: string): Promise<{
133
+ delegate: string;
134
+ } | null>;
135
+ call(req: EvmCallRequest): Promise<EvmCallResult>;
136
+ buildAuthorizationDigest(input: {
137
+ delegate: string;
138
+ nonce: bigint;
139
+ chainId: number;
140
+ }): Uint8Array;
141
+ createUnsignedTransaction(req: CreateEvmUnsignedTransactionRequest): Promise<UnsignedEvmTransaction>;
142
+ private classifyBroadcastError;
143
+ getTransactionStatus(txHash: string, opts?: GetTransactionStatusOpts): Promise<EvmTransactionStatus>;
144
+ getTransactionStatus(txHashes: string[], opts?: GetTransactionStatusOpts): Promise<EvmTransactionStatus[]>;
145
+ private getSingleTransactionStatus;
146
+ private getTransactionStatusOnce;
101
147
  decodeBalanceChanges(args: {
102
148
  from: string;
103
149
  to: string | null;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evm_chain.d.ts","sourceRoot":"","sources":["../../../evm/evm_chain.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { AbiCoder, Contract, Interface, JsonRpcProvider, } from 'ethers';
1
+ import { AbiCoder, Contract, Interface, JsonRpcProvider, concat, encodeRlp, getAddress, getBytes, hexlify, keccak256, toBeArray, } from 'ethers';
2
2
  import { NetworkType, tryNetworkTypeOf } from "../network_type.js";
3
- import { Chain, resolveTransferAmount } from "../chain.base.js";
3
+ import { Chain, resolveTransferAmount, } from "../chain.base.js";
4
4
  import { ChainError, ChainErrorKinds, sanitizeCause, sanitizeMessage } from "../errors.js";
5
5
  import { Priority } from "../priority.js";
6
6
  import { EvmGasEstimate } from "./evm_gas_estimate.js";
@@ -53,6 +53,7 @@ const ERC20_ABI = [
53
53
  const ERC20_INTERFACE = new Interface(ERC20_ABI);
54
54
  export class EvmChain extends Chain {
55
55
  rpcUrl;
56
+ rpcUrls;
56
57
  supportsEip1559;
57
58
  hasL1Fee;
58
59
  /**
@@ -70,6 +71,7 @@ export class EvmChain extends Chain {
70
71
  * `nativeTransferGasLimit`.
71
72
  */
72
73
  nativeTransferGasMultiplier;
74
+ supports7702;
73
75
  _nativeToken;
74
76
  _provider = null;
75
77
  _resolvedRpcUrl = null;
@@ -86,10 +88,15 @@ export class EvmChain extends Chain {
86
88
  }
87
89
  super(init.chainId, init.name, NetworkType.EVM, init.blockTimeSeconds, init.nativeSymbol, init.explorerBaseUrl);
88
90
  this.rpcUrl = init.rpcUrl;
91
+ this.rpcUrls = init.rpcUrls ?? [];
92
+ if (this.rpcUrls.length > 1) {
93
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EvmChainInit.rpcUrls accepts only ONE endpoint in 0.3.0 (got ${this.rpcUrls.length}). Automatic failover retry is deferred to a follow-up release; passing >1 endpoint would silently discard entries.`, { chainId: init.chainId });
94
+ }
89
95
  this.supportsEip1559 = init.supportsEip1559 ?? true;
90
96
  this.hasL1Fee = init.hasL1Fee ?? false;
91
97
  this.nativeTransferGasLimit = init.nativeTransferGasLimit ?? 21000;
92
98
  this.nativeTransferGasMultiplier = init.nativeTransferGasMultiplier ?? 1.4;
99
+ this.supports7702 = init.supports7702 ?? false;
93
100
  this._nativeToken = EvmToken.native(init.chainId, init.nativeSymbol, init.nativeDecimals ?? 18);
94
101
  // NOTE: no `registerNonEvmChain(id, EVM)` call — a module-scope write on
95
102
  // 48 pre-baked chains would let a consumer's earlier
@@ -232,6 +239,13 @@ export class EvmChain extends Chain {
232
239
  readRpcUrl() {
233
240
  if (this.rpcUrl && this.rpcUrl.trim().length > 0)
234
241
  return this.rpcUrl.trim();
242
+ if (this.rpcUrls.length > 0) {
243
+ for (const candidate of this.rpcUrls) {
244
+ if (candidate && candidate.trim().length > 0)
245
+ return candidate.trim();
246
+ }
247
+ throw new ChainError(ChainErrorKinds.RpcNotConfigured, `${this.name}: rpcUrls was supplied but every entry is blank; refusing to fall back to env or public defaults`, { chainId: this.chainId });
248
+ }
235
249
  const env = globalThis.process?.env;
236
250
  const candidates = envCandidatesFor(this.name, this.chainId);
237
251
  for (const key of candidates) {
@@ -239,7 +253,7 @@ export class EvmChain extends Chain {
239
253
  if (value && value.trim().length > 0)
240
254
  return value.trim();
241
255
  }
242
- throw new ChainError(ChainErrorKinds.RpcNotConfigured, `${this.name} RPC URL is not configured (pass rpcUrl at construction, or set one of: ${candidates.join(', ')})`, { chainId: this.chainId, envCandidates: candidates });
256
+ throw new ChainError(ChainErrorKinds.RpcNotConfigured, `${this.name} RPC URL is not configured (pass rpcUrl, rpcUrls at construction, or set one of: ${candidates.join(', ')})`, { chainId: this.chainId, envCandidates: candidates });
243
257
  }
244
258
  rpcHost() {
245
259
  const url = this._resolvedRpcUrl ?? this.rpcUrl;
@@ -275,6 +289,15 @@ export class EvmChain extends Chain {
275
289
  return false;
276
290
  }
277
291
  }
292
+ normalizeAddressOrThrow(raw, field) {
293
+ const body = raw.replace(/^0[xX]/, '');
294
+ try {
295
+ return getAddress(`0x${body}`);
296
+ }
297
+ catch (err) {
298
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM address for ${field}: ${raw}`, { chainId: this.chainId, address: raw }, err instanceof Error ? err : undefined);
299
+ }
300
+ }
278
301
  validateTokenIdentifier(raw) {
279
302
  if (raw === undefined)
280
303
  return true;
@@ -373,7 +396,323 @@ export class EvmChain extends Chain {
373
396
  throw this.rpcError('Failed to read chain tip', err);
374
397
  }
375
398
  }
376
- async getTransactionStatus(txHash) {
399
+ async broadcast(signed, opts) {
400
+ if (opts && opts.signal !== undefined) {
401
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `EVM broadcast: signal is not honored in 0.3.0 (silently ignoring would let a caller conclude 'not sent' while the tx still lands). Cancellation returns in 0.3.1.`, { chainId: this.chainId });
402
+ }
403
+ let hex;
404
+ if (typeof signed === 'string') {
405
+ const stripped = signed.startsWith('0x') ? signed.slice(2) : signed;
406
+ if (!/^[0-9a-fA-F]+$/.test(stripped) || stripped.length % 2 !== 0 || stripped.length === 0) {
407
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EVM broadcast: signed transaction must be 0x-prefixed hex or Uint8Array (got malformed string of length ${signed.length})`, { chainId: this.chainId });
408
+ }
409
+ hex = `0x${stripped}`;
410
+ }
411
+ else {
412
+ if (signed.length === 0) {
413
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EVM broadcast: signed transaction bytes are empty`, { chainId: this.chainId });
414
+ }
415
+ hex = hexlify(signed);
416
+ }
417
+ try {
418
+ const resp = await this.getProvider().broadcastTransaction(hex);
419
+ return resp.hash;
420
+ }
421
+ catch (err) {
422
+ const rawMsg = (err instanceof Error ? err.message : String(err)).toLowerCase();
423
+ if (/already[-_ ]?known|known\s+transaction|transaction[-_ ]?already[-_ ]?known|already\s+in\s+(?:the\s+)?(?:mempool|pool)|already[-_ ]?present/.test(rawMsg)) {
424
+ // Node "already known" is authoritative for THAT node's mempool —
425
+ // the identical signed bytes are pending or landed. Return the
426
+ // deterministic hash so the consumer stays on the polling path.
427
+ // Do NOT gate on a follow-up getTransaction read: load-balanced
428
+ // providers (Alchemy/Infura/QuickNode round-robin) routinely serve
429
+ // the confirmation read from a different backend that has not yet
430
+ // seen the pending tx → null → falsely-terminal BroadcastRejected
431
+ // → consumer re-signs against a fresh nonce → double-send while
432
+ // the original is live. If the tx really never lands, the
433
+ // consumer's getTransactionStatus poll will surface NotFound and
434
+ // the safe-broadcast rule (re-broadcast same bytes, never re-sign)
435
+ // still applies. Matches SolanaChain/UtxoChain already-known paths.
436
+ return keccak256(hex);
437
+ }
438
+ throw this.classifyBroadcastError(err);
439
+ }
440
+ }
441
+ async getPendingNonce(address) {
442
+ if (!this.validateAddress(address)) {
443
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM address for getPendingNonce: ${address}`, { chainId: this.chainId, address });
444
+ }
445
+ const normalized = this.normalizeAddressOrThrow(address, 'getPendingNonce.address');
446
+ try {
447
+ const n = await this.getProvider().getTransactionCount(normalized, 'pending');
448
+ return BigInt(n);
449
+ }
450
+ catch (err) {
451
+ throw this.rpcError(`Failed to read pending nonce for ${normalized}`, err, { address: normalized });
452
+ }
453
+ }
454
+ async getDelegation(address) {
455
+ if (!this.supports7702) {
456
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `EVM chain ${this.name} was not initialized with supports7702: true`, { chainId: this.chainId });
457
+ }
458
+ try {
459
+ getAddress(address);
460
+ }
461
+ catch (err) {
462
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM address: ${address}`, { chainId: this.chainId, address }, err instanceof Error ? err : undefined);
463
+ }
464
+ let code;
465
+ try {
466
+ code = await this.getProvider().getCode(address);
467
+ }
468
+ catch (err) {
469
+ throw this.rpcError(`Failed to read code for ${address}`, err, { address });
470
+ }
471
+ if (!code.startsWith('0x'))
472
+ return null;
473
+ const stripped = code.slice(2).toLowerCase();
474
+ if (stripped.length !== 46)
475
+ return null;
476
+ if (!stripped.startsWith('ef0100'))
477
+ return null;
478
+ return { delegate: getAddress(`0x${stripped.slice(6)}`) };
479
+ }
480
+ async call(req) {
481
+ if (!this.validateAddress(req.to)) {
482
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM 'to' address for call: ${req.to}`, { chainId: this.chainId, address: req.to });
483
+ }
484
+ if (req.from !== undefined && !this.validateAddress(req.from)) {
485
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM 'from' address for call: ${req.from}`, { chainId: this.chainId, address: req.from });
486
+ }
487
+ if (!/^0x([0-9a-fA-F]{2})*$/.test(req.data)) {
488
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EvmCallRequest.data must be 0x-prefixed even-length hex`, { chainId: this.chainId });
489
+ }
490
+ const provider = this.getProvider();
491
+ const tx = {
492
+ to: this.normalizeAddressOrThrow(req.to, 'call.to'),
493
+ data: req.data,
494
+ from: req.from === undefined ? undefined : this.normalizeAddressOrThrow(req.from, 'call.from'),
495
+ value: req.value,
496
+ };
497
+ if (req.estimateGas && req.blockTag !== undefined) {
498
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EvmChain.call: blockTag is not honored when estimateGas: true (ethers v6 eth_estimateGas has no block-tag plumbing). Split the call: use estimateGas without blockTag, or drop estimateGas to run eth_call at the tag.`, { chainId: this.chainId });
499
+ }
500
+ try {
501
+ if (req.estimateGas) {
502
+ const g = await provider.estimateGas(tx);
503
+ return { gasEstimate: BigInt(g) };
504
+ }
505
+ const result = await provider.call(req.blockTag !== undefined ? { ...tx, blockTag: req.blockTag } : tx);
506
+ return { result };
507
+ }
508
+ catch (err) {
509
+ const strCode = ethersErrCode(err);
510
+ const rawData = err.data
511
+ ?? err.info?.error?.data;
512
+ const revertData = typeof rawData === 'string' && /^0x[0-9a-fA-F]*$/.test(rawData) ? rawData : undefined;
513
+ if (strCode === 'CALL_EXCEPTION' || revertData !== undefined) {
514
+ throw new ChainError(ChainErrorKinds.SimulationFailed, sanitizeMessage(`eth_${req.estimateGas ? 'estimateGas' : 'call'} on ${req.to} reverted`, this._resolvedRpcUrl), { chainId: this.chainId, revertData }, sanitizeCause(err, this._resolvedRpcUrl));
515
+ }
516
+ if (strCode === 'INSUFFICIENT_FUNDS') {
517
+ throw new ChainError(ChainErrorKinds.InsufficientFunds, sanitizeMessage(`eth_${req.estimateGas ? 'estimateGas' : 'call'} on ${req.to}: insufficient funds`, this._resolvedRpcUrl), { chainId: this.chainId }, sanitizeCause(err, this._resolvedRpcUrl));
518
+ }
519
+ throw this.rpcError(`eth_${req.estimateGas ? 'estimateGas' : 'call'} on ${req.to} failed`, err);
520
+ }
521
+ }
522
+ buildAuthorizationDigest(input) {
523
+ if (!this.supports7702) {
524
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `EVM chain ${this.name} was not initialized with supports7702: true`, { chainId: this.chainId });
525
+ }
526
+ if (input.chainId !== this.chainId) {
527
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization chainId ${input.chainId} does not match ${this.chainId}. Cross-chain replay guard: chainId=0 wildcards are rejected by default.`, { chainId: this.chainId });
528
+ }
529
+ if (input.nonce < 0n) {
530
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization nonce must be >= 0`, { chainId: this.chainId });
531
+ }
532
+ let normalizedDelegate;
533
+ try {
534
+ normalizedDelegate = getAddress(input.delegate);
535
+ }
536
+ catch (err) {
537
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `buildAuthorizationDigest: delegate is not a valid EVM address: ${input.delegate}`, { chainId: this.chainId, address: input.delegate }, err instanceof Error ? err : undefined);
538
+ }
539
+ const rlp = encodeRlp([
540
+ toBeArray(BigInt(input.chainId)),
541
+ normalizedDelegate,
542
+ toBeArray(input.nonce),
543
+ ]);
544
+ const payload = concat(['0x05', rlp]);
545
+ return getBytes(keccak256(payload));
546
+ }
547
+ async createUnsignedTransaction(req) {
548
+ if (req && req.signal !== undefined) {
549
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `EVM createUnsignedTransaction: signal is not honored in 0.3.0 (silently ignoring would let a caller conclude 'not built' while the blockhash fetch/build proceeds against stale state). Cancellation returns in 0.3.1.`, { chainId: this.chainId });
550
+ }
551
+ if (!req.from) {
552
+ throw new ChainError(ChainErrorKinds.InvalidArgument, 'CreateEvmUnsignedTransactionRequest.from is required', { chainId: this.chainId });
553
+ }
554
+ if (!this.validateAddress(req.from)) {
555
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM 'from' address (fails EIP-55 checksum or byte length): ${req.from}`, { chainId: this.chainId, address: req.from });
556
+ }
557
+ if (!req.to) {
558
+ throw new ChainError(ChainErrorKinds.InvalidArgument, 'CreateEvmUnsignedTransactionRequest.to is required', { chainId: this.chainId });
559
+ }
560
+ if (!this.validateAddress(req.to)) {
561
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Invalid EVM 'to' address (fails EIP-55 checksum or byte length): ${req.to}`, { chainId: this.chainId, address: req.to });
562
+ }
563
+ if (req.data !== undefined && !/^0x([0-9a-fA-F]{2})*$/.test(req.data)) {
564
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `CreateEvmUnsignedTransactionRequest.data must be a 0x-prefixed even-length hex string`, { chainId: this.chainId });
565
+ }
566
+ if (req.authorizationList !== undefined) {
567
+ if (!Array.isArray(req.authorizationList) || req.authorizationList.length === 0) {
568
+ throw new ChainError(ChainErrorKinds.InvalidArgument, 'authorizationList must be a non-empty array when provided', { chainId: this.chainId });
569
+ }
570
+ if (!this.supports7702) {
571
+ throw new ChainError(ChainErrorKinds.FeatureNotSupported, `EVM chain ${this.name} was not initialized with supports7702: true`, { chainId: this.chainId });
572
+ }
573
+ for (let i = 0; i < req.authorizationList.length; i++) {
574
+ const auth = req.authorizationList[i];
575
+ if (auth.chainId !== this.chainId) {
576
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization[${i}].chainId ${auth.chainId} does not match ${this.chainId}. Cross-chain replay guard: chainId=0 wildcards are rejected by default.`, { chainId: this.chainId });
577
+ }
578
+ if (!this.validateAddress(auth.address)) {
579
+ throw new ChainError(ChainErrorKinds.InvalidAddress, `Authorization[${i}].address is not a valid EVM address: ${auth.address}`, { chainId: this.chainId, address: auth.address });
580
+ }
581
+ if (typeof auth.nonce !== 'bigint' || auth.nonce < 0n) {
582
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization[${i}].nonce must be a non-negative bigint (got ${typeof auth.nonce})`, { chainId: this.chainId });
583
+ }
584
+ const sig = auth.signature;
585
+ if (!sig || typeof sig !== 'object'
586
+ || typeof sig.r !== 'string' || !/^0x[0-9a-fA-F]{64}$/.test(sig.r)
587
+ || typeof sig.s !== 'string' || !/^0x[0-9a-fA-F]{64}$/.test(sig.s)
588
+ || (sig.yParity !== 0 && sig.yParity !== 1)) {
589
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization[${i}].signature must be { r: 0x + 64-hex, s: 0x + 64-hex, yParity: 0 | 1 }`, { chainId: this.chainId });
590
+ }
591
+ const rBig = BigInt(sig.r);
592
+ const sBig = BigInt(sig.s);
593
+ if (rBig === 0n || sBig === 0n) {
594
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization[${i}].signature: r and s must both be non-zero`, { chainId: this.chainId });
595
+ }
596
+ // EIP-2 low-s canonical form. An authorization with s > secp256k1n/2
597
+ // is silently rejected by the EVM at execution — tx lands, gas is
598
+ // spent, no delegation installed. Catch at build time.
599
+ const SECP256K1_HALF_N = 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0n;
600
+ if (sBig > SECP256K1_HALF_N) {
601
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `Authorization[${i}].signature.s violates EIP-2 low-s canonical form (s must be <= secp256k1n/2). Non-canonical authorizations are silently skipped by the EVM.`, { chainId: this.chainId });
602
+ }
603
+ }
604
+ }
605
+ if (!this.supportsEip1559 && (req.maxFeePerGas !== undefined || req.maxPriorityFeePerGas !== undefined)) {
606
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `EVM chain ${this.name} is legacy (supportsEip1559=false); maxFeePerGas/maxPriorityFeePerGas are not accepted. Use gasPrice via UnsignedEvmTransaction consumers.`, { chainId: this.chainId });
607
+ }
608
+ const emittedType = req.authorizationList !== undefined ? 4 : this.supportsEip1559 ? 2 : 0;
609
+ return new UnsignedEvmTransaction({
610
+ chainId: this.chainId,
611
+ from: this.normalizeAddressOrThrow(req.from, 'createUnsignedTransaction.from'),
612
+ to: this.normalizeAddressOrThrow(req.to, 'createUnsignedTransaction.to'),
613
+ value: req.value ?? 0n,
614
+ data: req.data ?? '0x',
615
+ type: emittedType,
616
+ authorizationList: req.authorizationList,
617
+ gasLimit: req.gasLimit,
618
+ nonce: req.nonce,
619
+ maxFeePerGas: req.maxFeePerGas,
620
+ maxPriorityFeePerGas: req.maxPriorityFeePerGas,
621
+ });
622
+ }
623
+ classifyBroadcastError(err) {
624
+ const rpc = this._resolvedRpcUrl;
625
+ const strCode = ethersErrCode(err);
626
+ const numCode = errCode(err);
627
+ const rawMsg = err instanceof Error ? err.message : String(err);
628
+ const msg = rawMsg.toLowerCase();
629
+ const safeCause = sanitizeCause(err, rpc);
630
+ if (strCode === 'NONCE_EXPIRED' || msg.includes('nonce too low') || msg.includes('nonce_too_low') || msg.includes('nonce has already been used')) {
631
+ return new ChainError(ChainErrorKinds.NonceTooLow, sanitizeMessage(`EVM broadcast rejected: nonce too low on ${this.name}`, rpc), { chainId: this.chainId, rpcHost: this.rpcHost() }, safeCause);
632
+ }
633
+ if (strCode === 'INSUFFICIENT_FUNDS' || msg.includes('insufficient funds')) {
634
+ return new ChainError(ChainErrorKinds.InsufficientFunds, sanitizeMessage(`EVM broadcast rejected: insufficient funds on ${this.name}`, rpc), { chainId: this.chainId, rpcHost: this.rpcHost() }, safeCause);
635
+ }
636
+ if (strCode === 'REPLACEMENT_UNDERPRICED' || msg.includes('replacement') || msg.includes('underpriced')) {
637
+ return new ChainError(ChainErrorKinds.BroadcastRejected, sanitizeMessage(`EVM broadcast rejected on ${this.name} (replacement/known-nonce)`, rpc), { chainId: this.chainId, rpcHost: this.rpcHost() }, safeCause);
638
+ }
639
+ const rateLimitCodes = new Set([-32005, -32007, -32016, -32029, 429]);
640
+ if (numCode !== undefined && rateLimitCodes.has(numCode)) {
641
+ return this.rpcError(`EVM broadcast rate-limited on ${this.name}`, err);
642
+ }
643
+ const transportSignals = /econnreset|econnrefused|econnaborted|etimedout|enotfound|network request failed|fetch failed|socket hang up|too\s+many\s+requests|rate.?limit|network error/;
644
+ const httpStatus = err.info?.status
645
+ ?? err.status;
646
+ const isTransportHttp = typeof httpStatus === 'number' && (httpStatus === 429 || httpStatus === 502 || httpStatus === 503 || httpStatus === 504);
647
+ if (transportSignals.test(msg) || isTransportHttp
648
+ || strCode === 'NETWORK_ERROR' || strCode === 'SERVER_ERROR' || strCode === 'TIMEOUT') {
649
+ return this.rpcError(`EVM broadcast transport failure on ${this.name}`, err);
650
+ }
651
+ // Default terminal: any unrecognized rejection is a node reject, NOT a
652
+ // transient transport failure. This matches Solana/UTXO defaults and
653
+ // prevents a relayer retry-loop from re-broadcasting a permanently-
654
+ // invalid tx forever.
655
+ return new ChainError(ChainErrorKinds.BroadcastRejected, sanitizeMessage(`EVM broadcast rejected on ${this.name}`, rpc), { chainId: this.chainId, rpcHost: this.rpcHost() }, safeCause);
656
+ }
657
+ async getTransactionStatus(txHash, opts) {
658
+ if (Array.isArray(txHash)) {
659
+ return runBatchStatus(txHash, (h, batchSignal) => {
660
+ const composedSignal = opts?.signal
661
+ ? anySignal(opts.signal, batchSignal)
662
+ : batchSignal;
663
+ return this.getSingleTransactionStatus(h, { ...opts, signal: composedSignal });
664
+ });
665
+ }
666
+ return this.getSingleTransactionStatus(txHash, opts);
667
+ }
668
+ async getSingleTransactionStatus(txHash, opts) {
669
+ if (opts?.confirmations !== undefined && opts.confirmations > 1 && !opts.wait) {
670
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `getTransactionStatus: confirmations > 1 requires wait: true (a single status read cannot enforce block depth)`, { chainId: this.chainId, txHash });
671
+ }
672
+ if (!opts?.wait)
673
+ return this.getTransactionStatusOnce(txHash);
674
+ if (opts.signal?.aborted) {
675
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `getTransactionStatus aborted before first poll`, { chainId: this.chainId, txHash });
676
+ }
677
+ if (opts.timeoutMs === undefined) {
678
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `getTransactionStatus: wait: true requires an explicit timeoutMs. Unbounded polling would pin an RPC worker + connection forever if the tx is dropped.`, { chainId: this.chainId, txHash });
679
+ }
680
+ if (opts.timeoutMs < 0) {
681
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `getTransactionStatus: timeoutMs must be >= 0`, { chainId: this.chainId, txHash });
682
+ }
683
+ const deadline = Date.now() + opts.timeoutMs;
684
+ const pollMs = Math.max(500, this.blockTimeSeconds * 1000);
685
+ const minConfirmations = Math.max(1, opts.confirmations ?? 1);
686
+ let last;
687
+ while (true) {
688
+ last = await this.getTransactionStatusOnce(txHash);
689
+ if (last.status === 'Success' || last.status === 'Failed') {
690
+ if (minConfirmations <= 1)
691
+ return last;
692
+ let tip;
693
+ try {
694
+ tip = await this.getProvider().getBlockNumber();
695
+ }
696
+ catch (err) {
697
+ throw this.rpcError(`Failed to read chain tip for confirmations check`, err, { txHash });
698
+ }
699
+ const depth = last.blockNumber === null ? 0 : tip - last.blockNumber + 1;
700
+ if (depth >= minConfirmations)
701
+ return last;
702
+ if (Date.now() >= deadline) {
703
+ throw new ChainError(ChainErrorKinds.RpcError, `getTransactionStatus timed out after ${opts.timeoutMs}ms with only ${depth} confirmation(s); required ${minConfirmations}. Consumer must NOT credit as final.`, { chainId: this.chainId, txHash });
704
+ }
705
+ }
706
+ else if (Date.now() >= deadline) {
707
+ throw new ChainError(ChainErrorKinds.RpcError, `getTransactionStatus timed out after ${opts.timeoutMs}ms; last observed status was ${last.status}. Consumer must NOT credit as final AND must NOT re-sign — the tx may still land. Re-broadcast the same signed bytes or continue polling with the same txHash.`, { chainId: this.chainId, txHash });
708
+ }
709
+ await interruptibleSleep(pollMs, opts.signal);
710
+ if (opts.signal?.aborted) {
711
+ throw new ChainError(ChainErrorKinds.InvalidArgument, `getTransactionStatus aborted mid-poll`, { chainId: this.chainId, txHash });
712
+ }
713
+ }
714
+ }
715
+ async getTransactionStatusOnce(txHash) {
377
716
  const provider = this.getProvider();
378
717
  let tx = null;
379
718
  let receipt = null;
@@ -469,6 +808,7 @@ export class EvmChain extends Chain {
469
808
  inclusionAt,
470
809
  error: errorInfo,
471
810
  fees,
811
+ blockNumber: receipt.blockNumber,
472
812
  });
473
813
  }
474
814
  // Only allocated on the Success path — failed txs carry logs: null.
@@ -495,6 +835,7 @@ export class EvmChain extends Chain {
495
835
  balanceChanges,
496
836
  logs,
497
837
  fees,
838
+ blockNumber: receipt.blockNumber,
498
839
  });
499
840
  }
500
841
  async decodeBalanceChanges(args) {
@@ -678,6 +1019,84 @@ function stringifyErr(err) {
678
1019
  return err.message;
679
1020
  return String(err);
680
1021
  }
1022
+ const BATCH_STATUS_CONCURRENCY = 8;
1023
+ async function runBatchStatus(items, fetchOne) {
1024
+ const results = new Array(items.length);
1025
+ const ac = new AbortController();
1026
+ let cursor = 0;
1027
+ const workers = [];
1028
+ const spawn = async () => {
1029
+ while (!ac.signal.aborted) {
1030
+ const idx = cursor++;
1031
+ if (idx >= items.length)
1032
+ return;
1033
+ try {
1034
+ results[idx] = await fetchOne(items[idx], ac.signal);
1035
+ }
1036
+ catch (err) {
1037
+ ac.abort();
1038
+ throw err;
1039
+ }
1040
+ }
1041
+ };
1042
+ const workerCount = Math.min(BATCH_STATUS_CONCURRENCY, items.length);
1043
+ for (let i = 0; i < workerCount; i++)
1044
+ workers.push(spawn());
1045
+ await Promise.all(workers);
1046
+ return results;
1047
+ }
1048
+ function anySignal(a, b) {
1049
+ if (typeof AbortSignal.any === 'function')
1050
+ return AbortSignal.any([a, b]);
1051
+ const ac = new AbortController();
1052
+ const onAbort = () => ac.abort();
1053
+ if (a.aborted || b.aborted)
1054
+ ac.abort();
1055
+ else {
1056
+ a.addEventListener('abort', onAbort, { once: true });
1057
+ b.addEventListener('abort', onAbort, { once: true });
1058
+ }
1059
+ return ac.signal;
1060
+ }
1061
+ async function interruptibleSleep(ms, signal) {
1062
+ if (signal?.aborted)
1063
+ return;
1064
+ await new Promise((resolve) => {
1065
+ const t = setTimeout(() => {
1066
+ signal?.removeEventListener('abort', onAbort);
1067
+ resolve();
1068
+ }, ms);
1069
+ const onAbort = () => {
1070
+ clearTimeout(t);
1071
+ resolve();
1072
+ };
1073
+ signal?.addEventListener('abort', onAbort, { once: true });
1074
+ });
1075
+ }
1076
+ function errCode(err) {
1077
+ if (typeof err !== 'object' || err === null)
1078
+ return undefined;
1079
+ const e = err;
1080
+ const candidates = [
1081
+ typeof e.code === 'number' ? e.code : undefined,
1082
+ e.error?.code,
1083
+ e.info?.error?.code,
1084
+ typeof e.code === 'string' && /^-?\d+$/.test(e.code) ? e.code : undefined,
1085
+ ];
1086
+ for (const raw of candidates) {
1087
+ if (typeof raw === 'number')
1088
+ return raw;
1089
+ if (typeof raw === 'string' && /^-?\d+$/.test(raw))
1090
+ return Number(raw);
1091
+ }
1092
+ return undefined;
1093
+ }
1094
+ function ethersErrCode(err) {
1095
+ if (typeof err !== 'object' || err === null)
1096
+ return undefined;
1097
+ const e = err;
1098
+ return typeof e.code === 'string' ? e.code : undefined;
1099
+ }
681
1100
  function envCandidatesFor(name, chainId) {
682
1101
  const normalized = name.replace(/ /g, '_').toUpperCase() + '_RPC_URL';
683
1102
  return [normalized, `EVM_${chainId}_RPC_URL`];