crypto-aio 0.0.2 → 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 (672) 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/lib-types.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/adapters/ton/types.js +3 -0
  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/core/model/transaction.js +3 -0
  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 -44
  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 -2
  638. package/dist/libs/eth/contract.js +0 -7
  639. package/dist/libs/eth/contract.js.map +0 -1
  640. package/dist/libs/eth/index.d.ts +0 -20
  641. package/dist/libs/eth/index.js +0 -62
  642. package/dist/libs/eth/index.js.map +0 -1
  643. package/dist/libs/eth/transact.d.ts +0 -2
  644. package/dist/libs/eth/transact.js +0 -7
  645. package/dist/libs/eth/transact.js.map +0 -1
  646. package/dist/libs/index.d.ts +0 -1
  647. package/dist/libs/index.js +0 -18
  648. package/dist/libs/index.js.map +0 -1
  649. package/dist/tool/common.d.ts +0 -28
  650. package/dist/tool/common.js +0 -33
  651. package/dist/tool/common.js.map +0 -1
  652. package/dist/tool/eth-tools.d.ts +0 -3
  653. package/dist/tool/eth-tools.js +0 -33
  654. package/dist/tool/eth-tools.js.map +0 -1
  655. package/dist/tool/index.d.ts +0 -4
  656. package/dist/tool/index.js +0 -21
  657. package/dist/tool/index.js.map +0 -1
  658. package/dist/tool/logging.d.ts +0 -3
  659. package/dist/tool/logging.js +0 -11
  660. package/dist/tool/logging.js.map +0 -1
  661. package/dist/tool/options.d.ts +0 -4
  662. package/dist/tool/options.js +0 -28
  663. package/dist/tool/options.js.map +0 -1
  664. package/dist/type/account.d.ts +0 -9
  665. package/dist/type/account.js.map +0 -1
  666. package/dist/type/common.d.ts +0 -18
  667. package/dist/type/common.js.map +0 -1
  668. package/dist/type/index.d.ts +0 -3
  669. package/dist/type/index.js +0 -20
  670. package/dist/type/index.js.map +0 -1
  671. package/dist/type/lib-types.d.ts +0 -7
  672. package/dist/type/lib-types.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-transport.js","sourceRoot":"","sources":["../../../src/core/transport/http-transport.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n ConfigError,\n ProviderError,\n TimeoutError,\n ValidationError,\n isCryptoAioError,\n withContext,\n type CryptoAioError,\n} from '../errors/error';\nimport type { EventBus } from '../events/bus';\nimport type { Logger } from '../events/logger';\nimport { createScrubber, endpointSecrets } from '../secret/fragments';\nimport { reveal } from '../secret/secret';\nimport { randomId } from '../util/bytes';\nimport type { Clock } from '../util/clock';\nimport { parseJson, quorumJson } from '../util/json';\nimport { backoffDelay, parseRetryAfter } from './backoff';\nimport { CircuitBreaker } from './circuit';\nimport { TokenBucket } from './rate-limit';\nimport {\n PLACEHOLDER_ORIGIN,\n type CallOptions,\n type EndpointCall,\n type EndpointConfig,\n type EndpointState,\n type EndpointStatus,\n type HealthProbes,\n type HttpRequest,\n type RequestPurpose,\n type RetryClass,\n type Transport,\n type TransportOptions,\n} from './types';\n\nconst DEFAULTS = {\n maxAttempts: 3,\n baseDelayMs: 200,\n maxDelayMs: 5_000,\n timeoutMs: 15_000,\n maxLagBlocks: 5,\n proofQuorum: 2,\n failureThreshold: 5,\n openMs: 30_000,\n healthIntervalMs: 15_000,\n /** An answer's byte cap; a full Solana block in `jsonParsed` stays far below. */\n maxResponseBytes: 64 * 1024 * 1024,\n};\n\ntype ResolvedOptions = typeof DEFAULTS & { fetch?: typeof fetch };\ntype Mode = 'rpc' | 'json' | 'text';\ntype Work<T> = (endpoint: Endpoint, signal: AbortSignal) => Promise<T>;\n/** The counted endpoints' verdict: agreeing answers, or one refusal they all gave. */\ntype Decided<T> =\n | { readonly results: readonly { readonly endpoint: Endpoint; readonly value: T }[] }\n | { readonly refusal: CryptoAioError; readonly endpoints: readonly Endpoint[] };\n/** What a recovering endpoint's trial request came back with. */\ntype TrialOutcome<T> =\n | { readonly endpoint: Endpoint; readonly kind: 'answer'; readonly value: T }\n | { readonly endpoint: Endpoint; readonly kind: 'refusal' | 'failed' };\n\nconst MAX_RETRY_AFTER_MS = 60_000;\n/** Consecutive failed health refreshes (identity or height probe, or failing requests)\n * after which an endpoint stops counting toward a proof quorum's size (a sustained\n * outage, not a hiccup). Liveness traded against safety: with two endpoints, the other\n * one then proves alone, so proof reads want three or more. */\nconst HEALTH_MISS_LIMIT = 3;\nconst TIMEOUT = new Error('transport timeout');\n/**\n * Whether a probe failed only because the endpoint rate-limited it, directly or as the\n * cause of a failed identity check. Such a probe learned nothing about the endpoint's\n * health, which keeps its last good height and identity. Keyless TronGrid and toncenter\n * answer probes HTTP 429 under load; counting that as a failure made a live endpoint\n * unusable.\n */\nfunction rateLimited(error: unknown): boolean {\n return (\n isCryptoAioError(error, 'RATE_LIMITED') ||\n (error instanceof Error && isCryptoAioError(error.cause, 'RATE_LIMITED'))\n );\n}\n\n/** Statuses that must never carry a body on the Response passed back to the SDK. */\nconst NULL_BODY_STATUSES = new Set([101, 103, 204, 205, 304]);\n\n/** Races `promise` against `signal`, rejecting with the signal's abort\n * reason if it fires first. Guards against a probe callback that ignores its own signal\n * argument and never settles on its own. */\nfunction raceAbort<T>(promise: Promise<T>, signal: AbortSignal): Promise<T> {\n if (signal.aborted) return Promise.reject(signal.reason as unknown);\n return new Promise<T>((resolve, reject) => {\n const onAbort = () => reject(signal.reason as unknown);\n signal.addEventListener('abort', onAbort, { once: true });\n promise.then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', onAbort);\n });\n });\n}\n\ninterface Endpoint {\n readonly id: string;\n readonly kind: 'rpc' | 'indexer';\n readonly url: string;\n readonly headers: Readonly<Record<string, string>>;\n /** Removes this endpoint's URL, header values and every secret fragment of them from a\n * text; with `limit`, reads and returns at most that many characters. Every text copied\n * from a provider or a failure goes through it: a provider can echo a key back. */\n readonly scrub: (text: string, limit?: number) => string;\n readonly priority: number;\n readonly timeoutMs?: number;\n readonly breaker: CircuitBreaker;\n readonly bucket?: TokenBucket;\n identity: 'unchecked' | 'ok' | 'mismatch';\n identityCheck?: Promise<void>;\n identityRetryAt?: number;\n /** Earliest time this endpoint may be picked again, from Retry-After or backoff. */\n notBefore: number;\n height?: bigint;\n /** Health refreshes in a row whose identity or height probe failed, or that found the\n * endpoint's requests failing; 0 once a refresh's probes succeed while its requests do\n * not fail (a caller-aborted identity check is neither). */\n healthMisses: number;\n /** When the last counted miss was recorded; at most one counts per interval. */\n lastMissAt?: number;\n latencyMs?: number;\n failures: number;\n /** Tokens this endpoint's probes have taken from its bucket, ever (for the backoff\n * floor of a failed refresh). */\n probeTokens: number;\n}\n\nexport interface HttpTransportDeps {\n readonly clock: Clock;\n readonly events: EventBus;\n readonly log: Logger;\n readonly options?: TransportOptions;\n readonly id?: string;\n readonly random?: () => number;\n}\n\nconst POSITIVE_MS_OPTIONS = [\n 'timeoutMs',\n 'baseDelayMs',\n 'maxDelayMs',\n 'healthIntervalMs',\n] as const;\n\n/** Validated at construction so bad config fails fast, never with the URL in the message. */\nfunction validateOptions(options: TransportOptions): void {\n if (\n options.maxAttempts !== undefined &&\n (!Number.isInteger(options.maxAttempts) || options.maxAttempts < 1)\n ) {\n throw new ConfigError('CONFIG_INVALID', 'maxAttempts must be an integer >= 1');\n }\n for (const key of POSITIVE_MS_OPTIONS) {\n const value = options[key];\n if (value !== undefined && !(Number.isFinite(value) && value > 0)) {\n throw new ConfigError('CONFIG_INVALID', `${key} must be a finite number > 0`);\n }\n }\n const cap = options.maxResponseBytes;\n if (cap !== undefined && !(Number.isSafeInteger(cap) && cap > 0)) {\n throw new ConfigError('CONFIG_INVALID', 'maxResponseBytes must be an integer > 0');\n }\n}\n\nfunction resolveOptions(options: TransportOptions = {}): ResolvedOptions {\n const out: ResolvedOptions = { ...DEFAULTS };\n for (const [key, value] of Object.entries(options)) {\n if (value !== undefined) (out as Record<string, unknown>)[key] = value;\n }\n return out;\n}\n\nfunction joinUrl(base: string, path: string, query: string): string {\n const url = new URL(base);\n if (path && path !== '/') {\n url.pathname =\n url.pathname.replace(/\\/$/, '') + (path.startsWith('/') ? path : `/${path}`);\n }\n new URLSearchParams(query).forEach((value, key) => url.searchParams.append(key, value));\n return url.toString();\n}\n\n/** Serialized once, before any endpoint is attempted; a bigint or other non-JSON value\n * never reaches an endpoint and never counts as an endpoint failure. */\nfunction serializeJson(payload: unknown): string {\n try {\n return JSON.stringify(payload);\n } catch (error) {\n throw new ValidationError(\n 'INVALID_INTENT',\n 'request payload could not be serialized',\n {\n cause: error,\n },\n );\n }\n}\n\n/** Builds the request once, before #run, so an invalid or forbidden method, a\n * GET/HEAD with a body or a bad header value is a local config error — no fetch, no breaker\n * bookkeeping, never ambiguous. The message never repeats the input. */\nfunction buildRequest(url: string | URL, init: RequestInit, what: string): Request {\n try {\n return new Request(url, init);\n } catch {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `${what} has an invalid method, header or body`,\n );\n }\n}\n\nfunction rpcLabel(payload: unknown): string {\n if (Array.isArray(payload)) return 'batch';\n const method = (payload as { method?: unknown } | null)?.method;\n return typeof method === 'string' ? method : 'rpc';\n}\n\n/** Low-cardinality event label: method+route when a route template is given, else the bare method. */\nfunction routeLabel(method: string, route: string | undefined): string {\n return route ? `${method} ${route}` : method;\n}\n\nconst IDENTITY_FIELD_CHARS = /[^A-Za-z0-9:_.-]/g;\n\n/** Strips everything but a safe character set and caps length, for event fields sourced from provider answers. */\nfunction sanitizeIdentityField(value: string): string {\n const cleaned = value.replace(IDENTITY_FIELD_CHARS, '').slice(0, 64);\n return cleaned.length > 0 ? cleaned : 'invalid';\n}\n\n/**\n * Whether every quorum result matches the first under `quorumJson`, compared whole or, with\n * a `quorumKey`, on the key's projection. A key that throws (or projects something\n * `quorumJson` rejects) counts as a disagreement, never a foreign error. `quorumJson`,\n * not `canonicalJson`, so an object shaped like a bigint tag never agrees with a revived\n * bigint.\n */\nfunction quorumAgrees(\n values: readonly unknown[],\n quorumKey: ((result: unknown) => unknown) | undefined,\n): boolean {\n const agree = (key: (value: unknown) => string): boolean => {\n const expected = key(values[0]);\n return values.every((value) => key(value) === expected);\n };\n if (!quorumKey) return agree(quorumJson);\n try {\n return agree((value) => quorumJson(quorumKey(value)));\n } catch {\n return false;\n }\n}\n\nexport class HttpTransport implements Transport {\n readonly id: string;\n readonly #endpoints: Endpoint[];\n readonly #opts: ResolvedOptions;\n /** Errors from an attempt whose `fetch` was invoked and answered, so the request may\n * have been delivered — every such failure except HTTP 401/403/429 and JSON-RPC-level rate\n * limiting (those mean the request was never actually processed). The cost of erring\n * this way: some undelivered broadcasts are monitored as ambiguous, the safe side. */\n readonly #maybeDelivered = new WeakSet<CryptoAioError>();\n /** Identity-check failures caused only by the owning request's caller\n * aborting — they say nothing about the endpoint, so a refresh that joined one counts the\n * endpoint as not attempted rather than failed. */\n readonly #abandonedChecks = new WeakSet<object>();\n /** Identity-check failures caused by the owning request's own deadline (possibly\n * a caller-shortened `timeoutMs`); a refresh that joined one learned nothing under its\n * own deadline, so it is no health miss. */\n readonly #timedOutChecks = new WeakSet<object>();\n readonly #clock: Clock;\n readonly #events: EventBus;\n readonly #log: Logger;\n readonly #random: () => number;\n #probes: HealthProbes = {};\n #best: bigint | undefined;\n #highest: bigint | undefined;\n /** The highest height verified by an identity-checked endpoint; lowered only by\n * `#decayPeak`. */\n #verifiedPeak: bigint | undefined;\n /** Completed refreshes in a row whose verified best stayed more than `maxLagBlocks`\n * below the peak (see `#decayPeak`). */\n #peakMisses = 0;\n #lastHealthAt = Number.NEGATIVE_INFINITY;\n /** Set after a refresh where every probe failed, so ensureFreshHealth backs\n * off instead of storming the same down endpoints on every read during an outage. */\n #nextRefreshAt = Number.NEGATIVE_INFINITY;\n /** Set as a trial answers or refuses (its breaker closed), so the next\n * health check refreshes at once and the endpoint rejoins the count by the ordinary rules.\n * A refresh clears it when it starts, so one already running when the flag was set (and\n * which may have read the breaker before it closed) does not count. */\n #refreshDue = false;\n #healthRun: Promise<void> | undefined;\n #rpcId = 0;\n\n constructor(endpoints: readonly EndpointConfig[], deps: HttpTransportDeps) {\n if (endpoints.length === 0) {\n throw new ConfigError('CONFIG_INVALID', 'a transport needs at least one endpoint');\n }\n validateOptions(deps.options ?? {});\n this.id = deps.id ?? randomId('tr');\n this.#opts = resolveOptions(deps.options);\n this.#clock = deps.clock;\n this.#events = deps.events;\n this.#log = deps.log;\n this.#random = deps.random ?? Math.random;\n const names = new Set<string>();\n this.#endpoints = endpoints.map((config, index): Endpoint => {\n const id = config.name ?? `endpoint-${index}`;\n if (names.has(id))\n throw new ConfigError('CONFIG_INVALID', `duplicate endpoint name '${id}'`);\n names.add(id);\n const url = reveal(config.url);\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new ConfigError('CONFIG_INVALID', `endpoint '${id}' has an invalid URL`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `endpoint '${id}' must use http or https`,\n );\n }\n const headers: Record<string, string> = {};\n for (const [name, value] of Object.entries(config.headers ?? {})) {\n const revealed = reveal(value);\n // Validated once here (never with the value in the message) so a bad\n // header can never surface later as a per-attempt local error.\n try {\n new Headers({ [name]: revealed });\n } catch {\n throw new ConfigError(\n 'CONFIG_INVALID',\n `endpoint '${id}' has an invalid value for header '${name}'`,\n );\n }\n headers[name] = revealed;\n }\n return {\n id,\n kind: config.kind ?? 'rpc',\n url,\n headers,\n scrub: createScrubber(`<${id}>`, endpointSecrets(url, headers)),\n priority: config.priority ?? 0,\n ...(config.timeoutMs !== undefined ? { timeoutMs: config.timeoutMs } : {}),\n breaker: new CircuitBreaker(\n { failureThreshold: this.#opts.failureThreshold, openMs: this.#opts.openMs },\n this.#clock,\n ),\n ...(config.rateLimit\n ? {\n bucket: new TokenBucket(\n config.rateLimit.rps,\n config.rateLimit.burst ?? Math.max(1, Math.ceil(config.rateLimit.rps)),\n this.#clock,\n ),\n }\n : {}),\n identity: 'unchecked',\n notBefore: Number.NEGATIVE_INFINITY,\n healthMisses: 0,\n failures: 0,\n probeTokens: 0,\n };\n });\n }\n\n // rpc/rpcRaw/http are `async` on purpose: serializing the body happens synchronously,\n // before any endpoint is touched, and `async` turns a bad payload into a rejected Promise\n // rather than a synchronous throw, keeping the Transport contract's `Promise<T>` honest.\n async rpc<T = unknown>(\n method: string,\n params: unknown = [],\n options: CallOptions = {},\n ): Promise<T> {\n const id = ++this.#rpcId;\n const body = serializeJson({ jsonrpc: '2.0', id, method, params });\n return this.#run(method, options, (endpoint, signal) =>\n this.#rpcOnce<T>(endpoint, method, id, body, signal, options.exactIntegers),\n );\n }\n\n async rpcRaw(payload: unknown, options: CallOptions = {}): Promise<unknown> {\n const label = rpcLabel(payload);\n const body = serializeJson(payload);\n return this.#run(label, options, async (endpoint, signal) => {\n const { json } = await this.#exchange(\n endpoint,\n label,\n this.#jsonPost(endpoint.url, body),\n signal,\n 'rpc',\n label,\n options.exactIntegers,\n );\n return json;\n });\n }\n\n async http<T = unknown>(request: HttpRequest, options: CallOptions = {}): Promise<T> {\n const bodyText =\n request.body === undefined\n ? undefined\n : typeof request.body === 'string'\n ? request.body\n : serializeJson(request.body);\n buildRequest(\n PLACEHOLDER_ORIGIN,\n {\n method: request.method,\n ...(request.headers ? { headers: request.headers } : {}),\n ...(bodyText !== undefined ? { body: bodyText } : {}),\n },\n 'http request',\n );\n return this.#run(\n routeLabel(request.method, request.route),\n options,\n (endpoint, signal) =>\n this.#httpOnce<T>(endpoint, request, bodyText, signal, options.exactIntegers),\n );\n }\n\n createFetch(\n classify?: (url: URL, init: RequestInit | undefined) => CallOptions,\n ): typeof fetch {\n const bridged = async (\n input: string | URL | Request,\n init?: RequestInit,\n ): Promise<Response> => {\n const raw =\n typeof input === 'string' ? input : input instanceof URL ? input.href : input.url;\n // A relative or otherwise invalid URL is a config error; the message never\n // repeats the caller's input.\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new ConfigError('CONFIG_INVALID', 'bridged fetch requires an absolute URL');\n }\n if (url.origin !== PLACEHOLDER_ORIGIN) {\n throw new ConfigError(\n 'CONFIG_INVALID',\n 'bridged fetch accepts only transport placeholder URLs',\n );\n }\n // A Request input keeps its own method, headers and body unless init overrides them.\n const method = init?.method ?? (input instanceof Request ? input.method : 'GET');\n const headerSource =\n init?.headers ?? (input instanceof Request ? input.headers : undefined);\n let body = init?.body ?? undefined;\n if (body === undefined && input instanceof Request && input.body) {\n // A Request input's own body is preserved (read once, replayed on every retry).\n body = new Uint8Array(await input.arrayBuffer());\n } else if (body instanceof ReadableStream) {\n // A stream body can only be read once; buffer it up front so every retry attempt\n // can replay the same bytes.\n body = new Uint8Array(await new Response(body).arrayBuffer());\n }\n // The whole request is built once, here, before #run — a\n // bad SDK header value, a GET/HEAD with a body or an invalid or forbidden method fails\n // with no fetch, no breaker bookkeeping and no ambiguity tag, never as a per-attempt\n // local error. Every attempt reuses its method, headers and body bytes (headers and\n // bytes together, so e.g. a multipart boundary always matches its body).\n const template = buildRequest(\n url,\n {\n method,\n ...(headerSource !== undefined ? { headers: headerSource } : {}),\n ...(body !== undefined ? { body } : {}),\n },\n 'bridged fetch request',\n );\n const payload = template.body\n ? new Uint8Array(await template.arrayBuffer())\n : undefined;\n // Bridged SDK calls have no route template; the raw path never becomes an event label.\n const label = template.method;\n const options = classify?.(url, init) ?? {};\n const signal = init?.signal ?? options.signal;\n return this.#run(\n label,\n { ...options, ...(signal ? { signal } : {}) },\n async (endpoint, deadline) => {\n // Cloning an already-valid Headers instance never throws.\n const requestHeaders = new Headers(template.headers);\n for (const [name, value] of Object.entries(endpoint.headers))\n requestHeaders.set(name, value);\n const started = this.#clock.now();\n const response = await this.#fetch(\n joinUrl(endpoint.url, url.pathname, url.search),\n {\n method: template.method,\n headers: requestHeaders,\n ...(payload !== undefined ? { body: payload } : {}),\n signal: deadline,\n redirect: 'error',\n },\n );\n // An error-status response body is never returned to the SDK; drain it so the\n // connection can be released instead of leaking it.\n try {\n this.#throwForStatus(endpoint, response);\n } catch (error) {\n // cancel() returns a promise that can reject asynchronously; an unhandled\n // rejection here can crash the process, so it's always caught, even when body\n // is null.\n void response.body?.cancel().catch(() => undefined);\n throw error;\n }\n // Buffer the whole body here, while the deadline and the caller's signal are\n // still attached, and hand the SDK a fresh Response whose `url` is always '' — the\n // real endpoint URL (and any secret it carries) never reaches the SDK.\n const buffer = await this.#body(endpoint, response);\n this.#emitResponse(endpoint, label, started, buffer.byteLength);\n // The Response constructor throws if a body is given alongside a status that\n // must never carry one.\n const responseHeaders = new Headers(response.headers);\n // Drop headers describing the original (possibly compressed) wire body —\n // they no longer describe this already-decoded buffer.\n responseHeaders.delete('content-encoding');\n responseHeaders.delete('content-length');\n return new Response(NULL_BODY_STATUSES.has(response.status) ? null : buffer, {\n status: response.status,\n statusText: response.statusText,\n headers: responseHeaders,\n });\n },\n );\n };\n return bridged as typeof fetch;\n }\n\n /** Least-invasive detector for \"no health probe was ever configured\" — mirrors the same\n * condition `ensureFreshHealth` already uses to skip probing entirely. */\n hasProbes(): boolean {\n return Boolean(this.#probes.height) || Boolean(this.#probes.identity);\n }\n\n setProbes(probes: HealthProbes): void {\n this.#probes = probes;\n // A new probe set invalidates any previously confirmed identity, the health timers\n // and the stored heights. #highest stays: it is the stale-view guard, rebuilt from\n // verified endpoints only if one turns out mismatched.\n this.#lastHealthAt = Number.NEGATIVE_INFINITY;\n this.#nextRefreshAt = Number.NEGATIVE_INFINITY;\n this.#best = undefined;\n for (const endpoint of this.#endpoints) {\n endpoint.identity = 'unchecked';\n endpoint.identityCheck = undefined;\n endpoint.identityRetryAt = undefined;\n endpoint.height = undefined;\n endpoint.healthMisses = 0;\n endpoint.lastMissAt = undefined;\n }\n }\n\n async ensureFreshHealth(signal?: AbortSignal): Promise<void> {\n if (!this.#probes.height && !this.#probes.identity) return;\n // An in-flight refresh is awaited before the staleness check, so a second concurrent\n // caller can't slip through and read endpoint state mid-refresh (e.g. heights still\n // unset). This caller's own signal is raced against it; the shared run itself is not\n // cancelled by it.\n if (this.#healthRun) await this.#join(this.#healthRun, signal);\n if (!this.#refreshDue) {\n if (this.#clock.now() - this.#lastHealthAt < this.#opts.healthIntervalMs) return;\n // After a fully-failed refresh, back off until #nextRefreshAt instead\n // of re-probing every down endpoint on every read during an outage. Reads in this\n // window simply see no fresh health and proceed with the existing\n // no-eligible-endpoint semantics.\n if (this.#clock.now() < this.#nextRefreshAt) return;\n }\n await this.refreshHealth(signal);\n }\n\n refreshHealth(signal?: AbortSignal): Promise<void> {\n // The shared run is started at most once and is never bound to any one caller's\n // signal; each caller instead races its own signal against it via #join.\n this.#healthRun ??= this.#refresh().finally(() => {\n this.#healthRun = undefined;\n });\n return this.#join(this.#healthRun, signal);\n }\n\n /** Resolves/rejects with `run`, but also rejects early (with only THIS caller's promise)\n * if `signal` aborts first. `run` itself is left untouched either way. */\n #join(run: Promise<void>, signal?: AbortSignal): Promise<void> {\n if (!signal) return run;\n if (signal.aborted) return Promise.reject(signal.reason);\n return new Promise<void>((resolve, reject) => {\n const onAbort = () => reject(signal.reason);\n signal.addEventListener('abort', onAbort, { once: true });\n run.then(resolve, reject).finally(() => {\n signal.removeEventListener('abort', onAbort);\n });\n });\n }\n\n status(): EndpointStatus[] {\n return this.#endpoints.map((e) => {\n const lag =\n e.height !== undefined && this.#best !== undefined\n ? this.#best - e.height\n : undefined;\n const state: EndpointState =\n e.identity === 'mismatch'\n ? 'disabled'\n : e.breaker.state === 'open'\n ? 'open'\n : e.breaker.state === 'half-open'\n ? 'half-open'\n : this.#lagging(e)\n ? 'lagging'\n : e.height !== undefined || e.identity === 'ok'\n ? 'healthy'\n : 'unknown';\n return {\n id: e.id,\n kind: e.kind,\n state,\n failures: e.failures,\n ...(e.height !== undefined ? { height: e.height } : {}),\n ...(lag !== undefined ? { lag } : {}),\n ...(e.latencyMs !== undefined ? { latencyMs: e.latencyMs } : {}),\n ...(e.identity === 'mismatch' ? { reason: 'identity-mismatch' } : {}),\n };\n });\n }\n\n highestHeight(): bigint | undefined {\n return this.#highest;\n }\n\n get maxLagBlocks(): number {\n return this.#opts.maxLagBlocks;\n }\n\n // ---- request orchestration -------------------------------------------------------\n\n async #run<T>(label: string, options: CallOptions, work: Work<T>): Promise<T> {\n const purpose: RequestPurpose =\n options.purpose ?? (options.quorum !== undefined ? 'proof' : 'read');\n // A proof quorum under purpose 'read' counts endpoints by health too, so it keeps\n // health fresh as well; otherwise a dead endpoint would never miss and stall it.\n if (purpose === 'monitor' || purpose === 'proof' || options.quorum === 'proof')\n await this.ensureFreshHealth(options.signal);\n if (options.quorum !== undefined) return this.#quorum(label, purpose, options, work);\n if ((options.fanout ?? 1) > 1) return this.#fanout(label, purpose, options, work);\n return this.#withRetry(label, purpose, options, work);\n }\n\n async #withRetry<T>(\n label: string,\n purpose: RequestPurpose,\n options: CallOptions,\n work: Work<T>,\n ): Promise<T> {\n const retry = options.retry ?? 'safe';\n const attempts = retry === 'never-auto' ? 1 : this.#opts.maxAttempts;\n const tried = new Set<string>();\n let last: CryptoAioError | undefined;\n let mayHaveSent = false;\n for (let attempt = 0; attempt < attempts; attempt++) {\n let endpoint: Endpoint;\n try {\n // The raw call-level override (possibly undefined) is passed through\n // so #pick can fall back to the endpoint's own timeoutMs, matching #attempt.\n endpoint = await this.#pick(purpose, tried, options.signal, options.timeoutMs);\n } catch (error) {\n if (options.signal?.aborted) throw error;\n if (last) break;\n throw error;\n }\n tried.add(endpoint.id);\n try {\n return await this.#attempt(endpoint, label, attempt, options, work);\n } catch (error) {\n const { failure, definitive } = this.#endpointFailure(error, options);\n if (this.#maybeDelivered.has(failure)) mayHaveSent = true;\n if (definitive)\n throw this.#externalize(this.#finalize(failure, retry, mayHaveSent));\n last = failure;\n // A rate-limit wait is #pick's job; only back off for other failures.\n if (attempt + 1 < attempts && failure.code !== 'RATE_LIMITED') {\n await this.#clock.sleep(this.#delay(attempt), options.signal);\n }\n }\n }\n throw this.#externalize(this.#finalize(last as CryptoAioError, retry, mayHaveSent));\n }\n\n async #quorum<T>(\n label: string,\n purpose: RequestPurpose,\n options: CallOptions,\n work: Work<T>,\n ): Promise<T> {\n const proof = isProofQuorum(purpose, options);\n const { sized, inRange } = this.#quorumCandidates(purpose, proof);\n // Only the endpoints the quorum counts answer toward it. A recovering endpoint (out\n // of the count, its breaker half-open) is tried alongside them, from the start, so\n // it is tried even when too few counted endpoints can answer; its answer only\n // blocks. The trial lets it rejoin even when only proof reads would ask it: only a\n // request closes its breaker, and while the breaker is not closed every health\n // refresh records a miss for it.\n const counted: ReadonlySet<Endpoint> = new Set(sized);\n const trial = proof ? this.#trial(label, inRange, counted, options, work) : undefined;\n let decided: Decided<T>;\n try {\n decided = await this.#decide(label, purpose, proof, counted, options, work);\n } catch (error) {\n await trial;\n throw error;\n }\n const outcome = await trial;\n // The caller aborted while the trial ran: the read ends as any aborted read does.\n if (options.signal?.aborted) throw options.signal.reason;\n if (outcome && outcome.kind !== 'failed') {\n const agrees =\n outcome.kind === 'answer' &&\n 'results' in decided &&\n quorumAgrees(\n [...decided.results.map((r) => r.value), outcome.value],\n options.quorumKey,\n );\n if (!agrees) {\n const asked =\n 'results' in decided\n ? decided.results.map((r) => r.endpoint)\n : decided.endpoints;\n throw this.#inconsistent(\n label,\n [...asked, outcome.endpoint].map((e) => e.id),\n );\n }\n }\n if ('refusal' in decided) throw decided.refusal;\n return (decided.results[0] as { readonly value: T }).value;\n }\n\n /**\n * The counted endpoints' verdict (no other endpoint answers toward it): their agreeing\n * answers, or the definitive error they all returned alike. Anything\n * else throws: too few answers, a disagreement, or (outside a proof quorum) the first\n * definitive error.\n */\n async #decide<T>(\n label: string,\n purpose: RequestPurpose,\n proof: boolean,\n counted: ReadonlySet<Endpoint>,\n options: CallOptions,\n work: Work<T>,\n ): Promise<Decided<T>> {\n const requested =\n options.quorum === 'proof' ? this.#opts.proofQuorum : (options.quorum ?? 1);\n // Sized from the full candidate set, not the rate-limit-filtered\n // eligible set — a required endpoint being rate-limited must not silently shrink the\n // quorum. A required endpoint that's rate-limited therefore fails the call with a\n // retryable error instead of resolving from fewer endpoints than needed.\n // Nor may lag, an unknown height, an unconfirmed identity or an open\n // breaker shrink a proof quorum (#quorumCandidates), so one liar is never alone.\n // Known gap: the floor of 1 lets the one endpoint still counted prove alone once\n // every other endpoint is out of the count (a liar, if the honest ones are down for\n // three health intervals). It favours liveness; raising it changes every family's\n // proofs.\n const needed = Math.max(1, Math.min(requested, counted.size));\n const eligible = (): Endpoint[] => {\n const now = this.#clock.now();\n return this.#quorumCandidates(purpose, proof).inRange.filter(\n (e) => e.notBefore <= now && counted.has(e),\n );\n };\n // If fewer endpoints are eligible right now than needed, fail fast —\n // before querying any of them — instead of querying what's available and discovering\n // the shortfall only afterward. This is also where lag that leaves too few\n // endpoints decides nothing (retryable).\n if (eligible().length < needed) {\n throw this.#externalize(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `quorum of ${needed} not reachable for ${label}`,\n { context: { transportId: this.id } },\n ),\n );\n }\n const results: { endpoint: Endpoint; value: T }[] = [];\n // Under a proof quorum, one endpoint's definitive error is its answer, not yet the\n // quorum's: it is kept, and the other endpoints are still asked, so one endpoint's\n // revert never decides alone (e.g. marking a token unresolvable). Known gap: outside\n // a proof quorum, the first definitive error still ends the read at once.\n const refusals: { endpoint: Endpoint; error: CryptoAioError }[] = [];\n const tried = new Set<string>();\n let last: CryptoAioError | undefined;\n while (results.length + refusals.length < needed) {\n const endpoint = eligible().find((e) => !tried.has(e.id));\n if (!endpoint) break;\n tried.add(endpoint.id);\n try {\n results.push({\n endpoint,\n value: await this.#attempt(endpoint, label, tried.size - 1, options, work),\n });\n } catch (error) {\n const { failure, definitive } = this.#endpointFailure(error, options);\n if (!definitive) last = failure;\n else if (proof) refusals.push({ endpoint, error: failure });\n else throw failure;\n }\n }\n if (results.length + refusals.length < needed) {\n throw this.#externalize(\n last ??\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `quorum of ${needed} not reachable for ${label}`,\n { context: { transportId: this.id } },\n ),\n );\n }\n const [refusal] = refusals;\n if (refusal) {\n // A definitive error decides only when every endpoint of the quorum returned\n // an equivalent one; a refusal against an answer, or unlike refusals, decide nothing.\n if (\n results.length === 0 &&\n refusals.every((r) => sameRefusal(r.error, refusal.error))\n ) {\n return { refusal: refusal.error, endpoints: refusals.map((r) => r.endpoint) };\n }\n throw this.#inconsistent(\n label,\n [...results, ...refusals].map((r) => r.endpoint.id),\n );\n }\n if (\n results.length === 0 ||\n !quorumAgrees(\n results.map((r) => r.value),\n options.quorumKey,\n )\n ) {\n throw this.#inconsistent(\n label,\n results.map((r) => r.endpoint.id),\n );\n }\n return { results };\n }\n\n /**\n * The trial of a recovering endpoint, one per read: among the in-range endpoints\n * the quorum does not count (health misses) whose breaker is half-open, the first by\n * priority, then name. Its request is an ordinary attempt (its rate limit, identity check\n * and breaker bookkeeping, so an answer closes the breaker and a failure counts against\n * it), except that it never waits for a rate-limit token: with none free now,\n * it is not sent this read (a failure). The read waits for a trial it sent, up to the\n * call's timeout. Each concurrent proof read in a half-open window may send its own\n * trial. Never rejects: the outcome is an answer, a refusal (a definitive error) or a\n * failure, which the verdict ignores. Known gap: with a `burst` of 1, the health\n * refresh a proof read runs first can spend the endpoint's only token on its probe, so\n * the trial is skipped and the endpoint can stay out; proof endpoints want a `burst` of\n * 2 or more.\n */\n #trial<T>(\n label: string,\n inRange: readonly Endpoint[],\n counted: ReadonlySet<Endpoint>,\n options: CallOptions,\n work: Work<T>,\n ): Promise<TrialOutcome<T>> | undefined {\n const now = this.#clock.now();\n const [endpoint] = inRange\n .filter(\n (e) => !counted.has(e) && e.breaker.state === 'half-open' && e.notBefore <= now,\n )\n .sort(\n (a, b) => a.priority - b.priority || (a.id < b.id ? -1 : a.id > b.id ? 1 : 0),\n );\n if (!endpoint) return undefined;\n // An answer or a refusal closed the endpoint's breaker, so the next\n // health check refreshes at once and it rejoins the count by the ordinary rules. Set\n // here, as the trial settles, not when the read does: whatever becomes of the counted\n // endpoints (a failure, the caller's abort, a slow answer), no later read finds the\n // endpoint closed but still out of the count, so its veto never lapses.\n return this.#attempt(endpoint, label, 0, options, work, false).then(\n (value): TrialOutcome<T> => {\n this.#refreshDue = true;\n return { endpoint, kind: 'answer', value };\n },\n (error: unknown): TrialOutcome<T> => {\n const refused =\n !options.signal?.aborted && isCryptoAioError(error) && !error.retryable;\n if (refused) this.#refreshDue = true;\n return { endpoint, kind: refused ? 'refusal' : 'failed' };\n },\n );\n }\n\n /** A quorum whose endpoints disagree: a retryable `PROVIDER_INCONSISTENT`, announced. */\n #inconsistent(label: string, endpointIds: string[]): ProviderError {\n this.#events.emit('provider.inconsistent', {\n transportId: this.id,\n method: label,\n endpointIds,\n });\n return new ProviderError('PROVIDER_INCONSISTENT', `endpoints disagree on ${label}`, {\n context: { transportId: this.id },\n });\n }\n\n async #fanout<T>(\n label: string,\n purpose: RequestPurpose,\n options: CallOptions,\n work: Work<T>,\n ): Promise<T> {\n const targets = this.#eligible(purpose).slice(0, options.fanout);\n if (targets.length === 0) throw this.#noHealthyEndpoint();\n const settled = await Promise.allSettled(\n targets.map((endpoint, index) =>\n this.#attempt(endpoint, label, index, options, work),\n ),\n );\n for (const outcome of settled)\n if (outcome.status === 'fulfilled') return outcome.value;\n if (options.signal?.aborted) throw options.signal.reason;\n const errors = settled.map(\n (outcome) => (outcome as PromiseRejectedResult).reason as CryptoAioError,\n );\n // Any settled attempt that reached the network makes the whole fanout ambiguous.\n const mayHaveSent = errors.some((e) => this.#maybeDelivered.has(e));\n const retry = options.retry ?? 'safe';\n const definitive = errors.find((e) => !e.retryable);\n if (definitive)\n throw this.#externalize(this.#finalize(definitive, retry, mayHaveSent));\n throw this.#externalize(\n this.#finalize(errors[0] as CryptoAioError, retry, mayHaveSent),\n );\n }\n\n async #attempt<T>(\n endpoint: Endpoint,\n label: string,\n attempt: number,\n options: CallOptions,\n work: Work<T>,\n /** False for a trial, which never waits for a rate-limit token. */\n waitForToken = true,\n ): Promise<T> {\n const timeoutMs = options.timeoutMs ?? endpoint.timeoutMs ?? this.#opts.timeoutMs;\n // A first-use identity probe takes its own token (#direct), so it runs before this\n // request takes one: the probe and the request never leave back to back. When it fails,\n // the request takes no token, and the failure is thrown inside the `try` below, where\n // the check always ran, so its message, cause and breaker bookkeeping are unchanged.\n const identityFailure = await this.#identityFirst(\n endpoint,\n timeoutMs,\n options.signal,\n );\n // The token-bucket wait runs before the per-attempt deadline is armed,\n // with its own timeoutMs-bounded budget. A wait that times out (or that the caller\n // aborts) never touches the breaker and is never tagged ambiguous — no fetch has\n // happened yet.\n if (identityFailure === undefined) {\n await this.#takeToken(endpoint, timeoutMs, options.signal, waitForToken);\n }\n const { signal, cancel } = this.#deadline(timeoutMs, options.signal);\n const started = this.#clock.now();\n // Only set once THIS attempt's own onAttempt() call ran, so only this\n // attempt may release a half-open probe slot it actually claimed.\n let ownsProbe = false;\n try {\n if (identityFailure !== undefined) throw identityFailure;\n await this.#ensureIdentity(endpoint, signal);\n // onAttempt() itself reports whether this attempt claimed the slot.\n ownsProbe = endpoint.breaker.onAttempt();\n this.#events.emit('rpc.request', {\n transportId: this.id,\n endpointId: endpoint.id,\n method: label,\n attempt,\n });\n const value = await work(endpoint, signal);\n endpoint.breaker.onSuccess();\n endpoint.failures = 0;\n endpoint.latencyMs = this.#clock.now() - started;\n return value;\n } catch (error) {\n if (options.signal?.aborted) {\n // Only free the half-open slot if THIS attempt actually claimed it —\n // an abort during the identity check or the token wait never frees another\n // request's half-open slot.\n if (ownsProbe) endpoint.breaker.onAbandon();\n throw options.signal.reason;\n }\n const failure = this.#classify(error, endpoint, signal);\n if (failure.retryable) {\n endpoint.breaker.onFailure();\n endpoint.failures += 1;\n } else {\n // A definitive answer proves the endpoint is reachable and healthy.\n endpoint.breaker.onSuccess();\n endpoint.failures = 0;\n }\n this.#events.emit('rpc.error', {\n transportId: this.id,\n endpointId: endpoint.id,\n method: label,\n latencyMs: this.#clock.now() - started,\n code: failure.code,\n retryable: failure.retryable,\n });\n throw failure;\n } finally {\n cancel();\n }\n }\n\n /**\n * Runs a pending first-use identity check under its own deadline, before the request\n * takes its token, and returns its failure for `#attempt` to throw where the check\n * always ran. Only the caller's abort propagates from here.\n */\n async #identityFirst(\n endpoint: Endpoint,\n timeoutMs: number,\n outer?: AbortSignal,\n ): Promise<unknown> {\n if (!this.#identityProbed() || endpoint.identity !== 'unchecked') return undefined;\n const { signal, cancel } = this.#deadline(timeoutMs, outer);\n try {\n await this.#ensureIdentity(endpoint, signal);\n return undefined;\n } catch (error) {\n if (outer?.aborted) throw outer.reason;\n return error;\n } finally {\n cancel();\n }\n }\n\n /** Bounds the token-bucket wait by the caller's signal and the call's\n * timeoutMs, run before the per-attempt deadline is armed. A wait that exceeds timeoutMs\n * fails with a retryable rate-limit error, without touching the breaker — no fetch has\n * happened yet, so this can never be tagged ambiguous either. */\n async #takeToken(\n endpoint: Endpoint,\n timeoutMs: number,\n outer?: AbortSignal,\n wait = true,\n ): Promise<void> {\n if (!endpoint.bucket) return;\n if (!wait) {\n // With no token free now, no wait: the same retryable RATE_LIMITED, before\n // any fetch or breaker bookkeeping.\n if (endpoint.bucket.tryTakeNow()) return;\n throw new ProviderError(\n 'RATE_LIMITED',\n `no rate limit token free for endpoint '${endpoint.id}'`,\n { context: this.#context(endpoint) },\n );\n }\n const { signal, cancel } = this.#deadline(timeoutMs, outer);\n try {\n await endpoint.bucket.take(signal);\n } catch {\n if (outer?.aborted) throw outer.reason;\n throw new ProviderError(\n 'RATE_LIMITED',\n `rate limit wait exceeded the call timeout for endpoint '${endpoint.id}'`,\n { context: this.#context(endpoint) },\n );\n } finally {\n cancel();\n }\n }\n\n /** Endpoints that are structurally usable for `purpose` (breaker, identity, lag/height),\n * ignoring any per-endpoint rate-limit wait. */\n #candidates(purpose: RequestPurpose): Endpoint[] {\n // A single proof read measures lag as a quorum read does, against the corroborated\n // height, so one over-reporting endpoint never leaves itself the only candidate.\n if (purpose === 'proof') return this.#quorumCandidates(purpose, true).inRange;\n const strict = purpose === 'monitor';\n return this.#usable().filter((e) => !strict || !this.#excludedForHeight(e));\n }\n\n /**\n * A quorum read's endpoints: `sized`, which the quorum's size counts, and `inRange`, the\n * only ones asked.\n *\n * `sized`: for a proof quorum (`proof`, see `isProofQuorum`) whose refreshes can see\n * a dead endpoint (a height probe, or an identity probe with an expected identity),\n * every endpoint not proven mismatched, whatever its height, identity state (confirmed,\n * not yet checked or identity-throttled) or breaker state, until `HEALTH_MISS_LIMIT`\n * health refreshes in a row, at most one per `healthIntervalMs`, failed its identity or\n * height probe or found its requests failing (breaker not closed, or failures in a row\n * at `failureThreshold`): a sustained outage. Such an endpoint cannot be asked, so it\n * makes the read decide nothing rather than letting fewer endpoints decide it. It\n * counts again once it serves requests and a later refresh succeeds; meanwhile it never\n * answers toward the quorum, and only its half-open trial (`#trial`) can block a read.\n * Otherwise (no such probe, or another quorum) it is the usable endpoints (the prior,\n * weaker rule).\n *\n * `inRange`: the usable endpoints (breaker, identity, throttle). For a monitor or proof\n * purpose with a height probe, only those with a known height (only a confirmed endpoint\n * has one) at most `maxLagBlocks` behind the corroborated height, the second-highest\n * known height, so one endpoint that over-reports its head never marks honest ones as\n * lagging. With two known heights the corroborated height is the lower one, so the lag\n * filter excludes neither: it takes three endpoints to exclude a lagging one, and a proof\n * read should be anchored to a height (asked at an explicit block), so a lagging endpoint\n * disagrees or errs instead of answering for an older state.\n *\n * Known gap: an endpoint that disagrees is never demoted, so a liar among the first\n * endpoints asked keeps proof reads deciding nothing (liveness only).\n */\n #quorumCandidates(\n purpose: RequestPurpose,\n proof: boolean,\n ): {\n readonly sized: Endpoint[];\n readonly inRange: Endpoint[];\n } {\n const usable = this.#usable();\n // When no refresh can see a dead endpoint (no probe, or only an\n // identity probe without an expected identity, where #refresh does no I/O), nothing\n // ever records a miss, so counting endpoints that cannot answer would stall proofs for\n // good; the count is then the usable endpoints (the prior, weaker rule: a liar can\n // prove alone once the honest endpoints' breakers open). So every family sets both an\n // identity probe, with its expected identity, and a height probe.\n const sized =\n proof && (this.#probes.height !== undefined || this.#identityProbed())\n ? this.#endpoints.filter(\n (e) => e.identity !== 'mismatch' && e.healthMisses < HEALTH_MISS_LIMIT,\n )\n : usable;\n const strict = purpose === 'monitor' || purpose === 'proof';\n if (!strict || !this.#probes.height) return { sized, inRange: usable };\n const known = usable.filter((e) => e.height !== undefined);\n const reference = corroboratedHeight(known);\n const lag = BigInt(this.#opts.maxLagBlocks);\n const inRange =\n reference === undefined\n ? known\n : known.filter((e) => reference - (e.height as bigint) <= lag);\n return { sized, inRange };\n }\n\n /** Endpoints that pass the identity, identity-throttle and breaker filters, best first. */\n #usable(): Endpoint[] {\n const now = this.#clock.now();\n return this.#endpoints\n .filter(\n (e) =>\n e.identity !== 'mismatch' &&\n // An identity-throttled endpoint is excluded the same way a\n // rate-limited one is — never picked, and a throttle hit never reaches the breaker.\n (e.identityRetryAt === undefined || e.identityRetryAt <= now) &&\n e.breaker.canRequest(),\n )\n .sort(\n (a, b) =>\n a.priority - b.priority ||\n a.failures - b.failures ||\n (a.latencyMs ?? 0) - (b.latencyMs ?? 0),\n );\n }\n\n #eligible(purpose: RequestPurpose): Endpoint[] {\n const now = this.#clock.now();\n return this.#candidates(purpose).filter((e) => e.notBefore <= now);\n }\n\n #noHealthyEndpoint(): ProviderError {\n return new ProviderError('PROVIDER_UNAVAILABLE', 'no healthy endpoint available', {\n context: { transportId: this.id },\n });\n }\n\n /** Picks the best available endpoint, waiting only when every structurally-usable\n * endpoint is still rate-limited, and only until the earliest one frees up.\n * That wait is bounded by the call's timeoutMs — a wait longer than that\n * fails at once with a retryable rate-limit error instead of stalling the whole call. */\n async #pick(\n purpose: RequestPurpose,\n tried: ReadonlySet<string>,\n signal: AbortSignal | undefined,\n callTimeoutMs: number | undefined,\n ): Promise<Endpoint> {\n for (;;) {\n const eligible = this.#eligible(purpose);\n if (eligible.length > 0) {\n const untried = eligible.filter((e) => !tried.has(e.id));\n const pool = untried.length > 0 ? untried : eligible;\n return (\n pool.find((e) => !e.bucket || e.bucket.msUntilToken() === 0) ??\n (pool[0] as Endpoint)\n );\n }\n const waiting = this.#candidates(purpose);\n if (waiting.length === 0) throw this.#noHealthyEndpoint();\n const earliest = waiting.reduce((min, e) =>\n e.notBefore < min.notBefore ? e : min,\n );\n const waitMs = Math.max(0, earliest.notBefore - this.#clock.now());\n // Matches #attempt's own effective-timeout resolution — the earliest\n // endpoint's own timeoutMs, when set, bounds its wait instead of only the transport\n // default.\n const boundMs = callTimeoutMs ?? earliest.timeoutMs ?? this.#opts.timeoutMs;\n if (waitMs > boundMs) {\n throw new ProviderError(\n 'RATE_LIMITED',\n 'endpoint rate limit wait exceeds the call timeout',\n { context: this.#context(earliest) },\n );\n }\n await this.#clock.sleep(waitMs, signal);\n }\n }\n\n #lagging(endpoint: Endpoint): boolean {\n return (\n endpoint.height !== undefined &&\n this.#best !== undefined &&\n this.#best - endpoint.height > BigInt(this.#opts.maxLagBlocks)\n );\n }\n\n /** Once a height probe is configured, an endpoint whose height is unknown (its probe\n * never ran or failed) is excluded from monitor/proof reads the same way a lagging one is. */\n #excludedForHeight(endpoint: Endpoint): boolean {\n if (!this.#probes.height) return false;\n if (endpoint.height === undefined) return true;\n return this.#lagging(endpoint);\n }\n\n /** Clamps Retry-After, or falls back to backoff, and records the endpoint's notBefore. */\n #applyRateLimit(endpoint: Endpoint, retryAfterMs: number | undefined): number {\n const delayMs =\n retryAfterMs !== undefined\n ? Math.min(retryAfterMs, MAX_RETRY_AFTER_MS)\n : backoffDelay(endpoint.failures, this.#opts, this.#random);\n endpoint.notBefore = this.#clock.now() + delayMs;\n return delayMs;\n }\n\n #delay(attempt: number): number {\n return backoffDelay(attempt, this.#opts, this.#random);\n }\n\n /** `mayHaveSent` covers every attempt that was possibly delivered, not just this one;\n * once true, even a later definitive error can't rule out an earlier ambiguous attempt. */\n #finalize(\n error: CryptoAioError,\n retry: RetryClass,\n mayHaveSent: boolean,\n ): CryptoAioError {\n return retry === 'ambiguous-on-failure' && mayHaveSent\n ? withContext(error, {}, { ambiguous: true })\n : error;\n }\n\n /** PROVIDER_MISCONFIGURED is only retryable internally, to allow failover between\n * endpoints; once every endpoint has been exhausted, the caller must see it as final. */\n #externalize(error: CryptoAioError): CryptoAioError {\n return error.code === 'PROVIDER_MISCONFIGURED' && error.retryable\n ? withContext(error, {}, { retryable: false })\n : error;\n }\n\n /** Shared retry-loop catch handling. Caller aborts propagate as-is; everything else is\n * classified as either a definitive (stop retrying) or a retryable endpoint failure. */\n #endpointFailure(\n error: unknown,\n options: CallOptions,\n ): { readonly failure: CryptoAioError; readonly definitive: boolean } {\n if (options.signal?.aborted) throw options.signal.reason;\n const failure = error as CryptoAioError;\n return { failure, definitive: !failure.retryable };\n }\n\n #deadline(\n ms: number,\n outer?: AbortSignal,\n ): { signal: AbortSignal; cancel: () => void } {\n const controller = new AbortController();\n const onOuter = () => controller.abort(outer?.reason);\n if (outer?.aborted) controller.abort(outer.reason);\n else outer?.addEventListener('abort', onOuter, { once: true });\n const timer = new AbortController();\n void this.#clock.sleep(ms, timer.signal).then(\n () => controller.abort(TIMEOUT),\n () => undefined,\n );\n return {\n signal: controller.signal,\n cancel: () => {\n timer.abort();\n outer?.removeEventListener('abort', onOuter);\n },\n };\n }\n\n // ---- single requests -------------------------------------------------------------\n\n #fetch(url: string, init: RequestInit): Promise<Response> {\n return (this.#opts.fetch ?? globalThis.fetch)(url, init);\n }\n\n /** The JSON-RPC POST shape is identical whether the caller goes through `rpc()` or the\n * direct per-endpoint health-probe calls. */\n #jsonPost(\n url: string,\n body: string,\n ): { method: 'POST'; url: string; headers: Record<string, string>; body: string } {\n return { method: 'POST', url, headers: { 'content-type': 'application/json' }, body };\n }\n\n async #rpcOnce<T>(\n endpoint: Endpoint,\n method: string,\n id: number,\n body: string,\n signal: AbortSignal,\n exactIntegers = false,\n ): Promise<T> {\n const { json } = await this.#exchange(\n endpoint,\n method,\n this.#jsonPost(endpoint.url, body),\n signal,\n 'rpc',\n method,\n exactIntegers,\n );\n return this.#unwrapRpc<T>(endpoint, method, id, json);\n }\n\n async #httpOnce<T>(\n endpoint: Endpoint,\n request: HttpRequest,\n bodyText: string | undefined,\n signal: AbortSignal,\n exactIntegers = false,\n ): Promise<T> {\n const query = request.query\n ? new URLSearchParams({ ...request.query }).toString()\n : '';\n const hasBody = bodyText !== undefined;\n const mode = request.responseType ?? 'json';\n const { text, json } = await this.#exchange(\n endpoint,\n routeLabel(request.method, request.route),\n {\n method: request.method,\n url: joinUrl(endpoint.url, request.path, query),\n headers: {\n ...(hasBody\n ? {\n 'content-type':\n typeof request.body === 'string' ? 'text/plain' : 'application/json',\n }\n : {}),\n ...request.headers,\n },\n ...(hasBody ? { body: bodyText } : {}),\n },\n signal,\n mode,\n // Error texts name the route template, as events do, never the concrete path, which\n // carries addresses and transaction ids: error texts end up in logs and alerting.\n routeLabel(request.method, request.route),\n exactIntegers,\n );\n return (mode === 'text' ? text : json) as T;\n }\n\n /**\n * The probes' single-attempt calls. Each request first takes a token from the\n * endpoint's own bucket, bounded by the probe's deadline (`signal`), so probes and\n * requests share one rate limit and a rate-limited endpoint never answers a probe 429.\n * The probe takes it with priority, ahead of requests already waiting, so a queue of\n * requests never starves it past its deadline into an unknown height.\n */\n #direct(endpoint: Endpoint, signal: AbortSignal): EndpointCall {\n return {\n rpc: async <T>(method: string, params?: unknown) => {\n const id = ++this.#rpcId;\n const body = serializeJson({ jsonrpc: '2.0', id, method, params: params ?? [] });\n await this.#probeToken(endpoint, signal);\n return this.#rpcOnce<T>(endpoint, method, id, body, signal);\n },\n http: async <T>(request: HttpRequest) => {\n const bodyText =\n request.body === undefined\n ? undefined\n : typeof request.body === 'string'\n ? request.body\n : serializeJson(request.body);\n await this.#probeToken(endpoint, signal);\n return this.#httpOnce<T>(endpoint, request, bodyText, signal);\n },\n };\n }\n\n /** A probe call's token, taken with priority and counted for #refresh's backoff. */\n async #probeToken(endpoint: Endpoint, signal: AbortSignal): Promise<void> {\n if (!endpoint.bucket) return;\n await endpoint.bucket.take(signal, true);\n endpoint.probeTokens += 1;\n }\n\n async #exchange(\n endpoint: Endpoint,\n label: string,\n request: {\n method: string;\n url: string;\n headers: Record<string, string>;\n body?: string;\n },\n signal: AbortSignal,\n mode: Mode,\n errorLabel: string = label,\n exactIntegers = false,\n ): Promise<{ text: string; json: unknown }> {\n const started = this.#clock.now();\n const response = await this.#fetch(request.url, {\n method: request.method,\n headers: { ...endpoint.headers, ...request.headers },\n ...(request.body !== undefined ? { body: request.body } : {}),\n signal,\n redirect: 'error',\n });\n const bytes = await this.#body(endpoint, response);\n const text = new TextDecoder().decode(bytes);\n this.#throwForStatus(endpoint, response);\n const context = this.#context(endpoint);\n let json: unknown;\n if (mode !== 'text' || !response.ok) {\n try {\n json = text.length > 0 ? parseJson(text, exactIntegers) : null;\n } catch {\n if (response.ok) {\n // An unparseable 2xx body is inherently ambiguous — the server accepted the\n // request but we can't tell what it said.\n throw this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `endpoint returned a non-JSON body (HTTP ${response.status})`,\n { context },\n ),\n );\n }\n }\n }\n if (!response.ok) {\n const isRpcError =\n mode === 'rpc' && json !== null && typeof json === 'object' && 'error' in json;\n if (!isRpcError) {\n if (mode === 'rpc') {\n // A 4xx in RPC mode without a JSON-RPC envelope is an endpoint-local failure,\n // not a definitive protocol answer: retry and fail over. The server did\n // respond, so a later definitive failure on this call still inherits ambiguity.\n throw this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `${errorLabel} did not return a JSON-RPC envelope (HTTP ${response.status})`,\n { context },\n ),\n );\n }\n // A REST 4xx that isn't 401/403/429/408 (peeled off in\n // #throwForStatus) is a definitive, non-retryable answer from the endpoint — it\n // must not itself set mayHaveSent, though it still inherits ambiguity from an\n // earlier tagged attempt via #withRetry/#fanout's accumulated mayHaveSent.\n throw new ProviderError(\n 'RPC_ERROR',\n `${errorLabel} refused (HTTP ${response.status})`,\n {\n context,\n details: {\n status: response.status,\n body: endpoint.scrub(text, 300),\n },\n },\n );\n }\n }\n this.#emitResponse(endpoint, label, started, bytes.byteLength);\n return { text, json };\n }\n\n /**\n * An answer's body, at most `maxResponseBytes`. A longer one, by its declared length\n * or as it streams, is cancelled and fails as a retryable `PROVIDER_UNAVAILABLE`,\n * tagged as possibly delivered, since the server did answer. Without the cap one\n * endpoint could exhaust memory with an endless answer.\n */\n async #body(endpoint: Endpoint, response: Response): Promise<Uint8Array> {\n const limit = this.#opts.maxResponseBytes;\n const tooLarge = () =>\n this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `endpoint answered more than ${limit} bytes`,\n { context: this.#context(endpoint) },\n ),\n );\n const declared = Number(response.headers.get('content-length') ?? Number.NaN);\n if (declared > limit) {\n void response.body?.cancel().catch(() => undefined);\n throw tooLarge();\n }\n if (!response.body) return new Uint8Array(0);\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n size += value.byteLength;\n if (size > limit) {\n void reader.cancel().catch(() => undefined);\n throw tooLarge();\n }\n chunks.push(value);\n }\n const out = new Uint8Array(size);\n let at = 0;\n for (const chunk of chunks) {\n out.set(chunk, at);\n at += chunk.byteLength;\n }\n return out;\n }\n\n /** The `rpc.response` event is emitted identically from `#exchange` and the SDK bridge. */\n #emitResponse(\n endpoint: Endpoint,\n method: string,\n started: number,\n byteLength: number,\n ): void {\n this.#events.emit('rpc.response', {\n transportId: this.id,\n endpointId: endpoint.id,\n method,\n latencyMs: this.#clock.now() - started,\n bytes: byteLength,\n });\n }\n\n #throwForStatus(endpoint: Endpoint, response: Response): void {\n const context = this.#context(endpoint);\n const status = response.status;\n if (status === 408) {\n // Retryable in every mode: a request timeout is an endpoint-local failure that\n // may have reached the server before it gave up.\n throw this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n 'endpoint request timed out (HTTP 408)',\n { context },\n ),\n );\n }\n if (status === 429) {\n // Rate-limiting means the request was never actually processed — excluded from\n // ambiguity, like 401/403 below.\n const retryAfterMs = parseRetryAfter(\n response.headers.get('retry-after'),\n this.#clock.now(),\n );\n const delayMs = this.#applyRateLimit(endpoint, retryAfterMs);\n throw new ProviderError('RATE_LIMITED', 'endpoint rate limited (HTTP 429)', {\n context,\n details: { retryAfterMs: delayMs },\n });\n }\n if (status === 401 || status === 403) {\n // Credentials were rejected before any processing — excluded from ambiguity.\n throw new ProviderError(\n 'PROVIDER_MISCONFIGURED',\n `endpoint rejected the credentials (HTTP ${status})`,\n {\n context,\n retryable: true,\n },\n );\n }\n if (status >= 500) {\n // A 5xx is inherently ambiguous — the server may have processed the request.\n throw this.#markSent(\n new ProviderError('PROVIDER_UNAVAILABLE', `endpoint error (HTTP ${status})`, {\n context,\n }),\n );\n }\n }\n\n #unwrapRpc<T>(endpoint: Endpoint, method: string, id: number, json: unknown): T {\n const context = this.#context(endpoint);\n // Step 1: the body must be an object. The server did respond, so this attempt may\n // have been delivered even though its answer was unusable.\n if (json === null || typeof json !== 'object' || Array.isArray(json)) {\n throw this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `malformed JSON-RPC response to ${method}`,\n { context },\n ),\n );\n }\n const body = json as {\n id?: unknown;\n result?: unknown;\n error?: { code?: unknown; message?: unknown; data?: unknown } | null;\n };\n const hasResult = 'result' in body;\n const hasError = 'error' in body && body.error !== undefined && body.error !== null;\n const errorCode =\n hasError && typeof body.error?.code === 'number' ? body.error.code : undefined;\n // Step 2: id must match, except a null id is only valid alongside a parse/invalid-request error.\n const idIsNullForProtocolError =\n body.id === null && (errorCode === -32700 || errorCode === -32600);\n const idMatches = idIsNullForProtocolError || String(body.id) === String(id);\n // Step 3: exactly one of result/error. Any of these three problems is an endpoint-local\n // failure, not a definitive protocol answer: retry and fail over. Same reasoning\n // as step 1 — the server responded, so this attempt may have been delivered.\n if (!idMatches || (hasResult && hasError) || (!hasResult && !hasError)) {\n throw this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `invalid JSON-RPC envelope for ${method}`,\n { context },\n ),\n );\n }\n // Step 4: only now classify the error or return the result.\n if (hasError) {\n const err = body.error as { code?: unknown; message?: unknown; data?: unknown };\n const code = typeof err.code === 'number' ? err.code : undefined;\n const message = endpoint.scrub(\n typeof err.message === 'string' ? err.message : 'unknown error',\n 300,\n );\n const rawData = err.data;\n const data =\n rawData === undefined\n ? undefined\n : endpoint.scrub(\n typeof rawData === 'string' ? rawData : stringifyData(rawData),\n 512,\n );\n const details = {\n rpcCode: code,\n rpcMessage: message,\n ...(data !== undefined ? { rpcData: data } : {}),\n };\n if (\n code === -32005 ||\n code === 429 ||\n /rate limit|too many requests|request limit/i.test(message)\n ) {\n // No Retry-After header at the JSON-RPC level, so back off. A JSON-RPC-level\n // rate limit carries the same \"never processed\" meaning as an HTTP 429 — excluded\n // from ambiguity for the same reason.\n const retryAfterMs = this.#applyRateLimit(endpoint, undefined);\n throw new ProviderError('RATE_LIMITED', `endpoint rate limited ${method}`, {\n context,\n details: { ...details, retryAfterMs },\n });\n }\n // A definitive JSON-RPC application error (e.g. \"nonce too low\") is not itself tagged:\n // the server told us exactly what happened, so a lone instance of it is never\n // ambiguous. It still inherits ambiguity from an earlier possibly-delivered attempt\n // via #withRetry/#fanout's accumulated `mayHaveSent`.\n throw new ProviderError('RPC_ERROR', `${method} failed: ${message}`, {\n context,\n details,\n });\n }\n return body.result as T;\n }\n\n // ---- health ----------------------------------------------------------------------\n\n /** Same condition under which #ensureIdentity actually probes. */\n #identityProbed(): boolean {\n return (\n this.#probes.identity !== undefined && this.#probes.expectedIdentity !== undefined\n );\n }\n\n /** The highest known height among endpoints that may feed health heights — with an\n * identity probe configured, only endpoints whose identity is 'ok', since an endpoint\n * that serves another network reports that network's height. */\n #verifiedMaxHeight(): bigint | undefined {\n const probed = this.#identityProbed();\n let max: bigint | undefined;\n for (const e of this.#endpoints) {\n if (e.height === undefined || e.identity === 'mismatch') continue;\n if (probed && e.identity !== 'ok') continue;\n if (max === undefined || e.height > max) max = e.height;\n }\n return max;\n }\n\n async #ensureIdentity(endpoint: Endpoint, signal: AbortSignal): Promise<void> {\n const probe = this.#probes.identity;\n const expected = this.#probes.expectedIdentity;\n if (!probe || expected === undefined || endpoint.identity === 'ok') return;\n if (endpoint.identity === 'unchecked') {\n // A prior probe attempt failed (not a confirmed mismatch): back off until the next\n // health interval instead of re-probing on every attempt.\n if (\n endpoint.identityRetryAt !== undefined &&\n this.#clock.now() < endpoint.identityRetryAt\n ) {\n throw new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `endpoint '${endpoint.id}' identity not yet confirmed`,\n { context: this.#context(endpoint) },\n );\n }\n const shared = endpoint.identityCheck;\n if (shared) {\n // A joiner races its own signal against the shared check, the same way\n // #join does — its caller's abort or its own deadline rejects only this caller, and\n // the check runs on for its owner. Only TIMEOUT (this joiner's deadline) is wrapped;\n // a caller's abort reason and the check's own failure propagate as they are.\n try {\n await raceAbort(shared, signal);\n } catch (error) {\n if (error !== TIMEOUT) throw error;\n throw this.#identityProbeFailed(endpoint, error, signal);\n }\n } else {\n const check = this.#checkIdentity(endpoint, probe, expected, signal);\n endpoint.identityCheck = check;\n // Cleared from outside the check, once settled and only while still current: a probe\n // that throws synchronously can't leave a settled check behind, and a check replaced\n // by setProbes can't clear its successor.\n const clear = () => {\n if (endpoint.identityCheck === check) endpoint.identityCheck = undefined;\n };\n void check.then(clear, clear);\n await check;\n }\n }\n if (endpoint.identity === 'mismatch') {\n throw new ProviderError(\n 'PROVIDER_MISCONFIGURED',\n `endpoint '${endpoint.id}' serves a different network than configured`,\n {\n context: this.#context(endpoint),\n retryable: true,\n },\n );\n }\n }\n\n /** The owner's identity probe; joiners share its promise via endpoint.identityCheck. */\n async #checkIdentity(\n endpoint: Endpoint,\n probe: NonNullable<HealthProbes['identity']>,\n expected: string,\n signal: AbortSignal,\n ): Promise<void> {\n try {\n // Races the probe against `signal` so a probe that ignores its own\n // signal argument can't hang #ensureIdentity forever.\n const actual = await raceAbort(probe(this.#direct(endpoint, signal)), signal);\n if (actual === expected) {\n endpoint.identity = 'ok';\n endpoint.identityRetryAt = undefined;\n return;\n }\n this.#disable(endpoint, expected, actual);\n } catch (error) {\n // Any probe failure (a definitive RPC error, a transport error, a malformed reply) is\n // an endpoint-local failure, not a confirmed mismatch: identity stays 'unchecked' and\n // the endpoint fails over.\n // A caller abort is not a probe failure — it must not set the\n // throttle, or a single-endpoint transport could be locked out entirely.\n const callerAborted = signal.aborted && signal.reason !== TIMEOUT;\n if (!callerAborted) {\n // A rate-limited probe waits out the endpoint's own delay (its Retry-After, or\n // backoff), not a whole health interval: a 429 never locks a live endpoint out.\n endpoint.identityRetryAt = rateLimited(error)\n ? endpoint.notBefore\n : this.#clock.now() + this.#opts.healthIntervalMs;\n }\n const failure = this.#identityProbeFailed(endpoint, error, signal);\n if (callerAborted) this.#abandonedChecks.add(failure);\n else if (signal.aborted) this.#timedOutChecks.add(failure);\n throw failure;\n }\n }\n\n /**\n * Records a genuine failed health refresh, at most one per `healthIntervalMs`,\n * so a caller that refreshes often (`refreshHealth`, `getNetworkStatus`) never turns one\n * hiccup into three misses and the endpoint's exclusion from a proof quorum's count.\n */\n #recordMiss(endpoint: Endpoint): void {\n const now = this.#clock.now();\n if (\n endpoint.lastMissAt !== undefined &&\n now - endpoint.lastMissAt < this.#opts.healthIntervalMs\n ) {\n return;\n }\n endpoint.healthMisses += 1;\n endpoint.lastMissAt = now;\n }\n\n /**\n * Whether the endpoint's requests are failing: its circuit breaker is not closed (open\n * or half-open), or its consecutive request failures reached the breaker's\n * `failureThreshold`. An endpoint that answers probes but no request must leave a\n * proof quorum's count as a probe-dead one does. Read only; `#refresh` still never does\n * breaker bookkeeping.\n */\n #failingRequests(endpoint: Endpoint): boolean {\n return (\n endpoint.breaker.state !== 'closed' ||\n endpoint.failures >= this.#opts.failureThreshold\n );\n }\n\n /** A proven identity mismatch: the endpoint serves a different network and is disabled. */\n #disable(endpoint: Endpoint, expected: string, actual: unknown): void {\n endpoint.identity = 'mismatch';\n // A disabled endpoint's height stops counting at once; #best and\n // #highest are rebuilt from identity-verified endpoints with known heights only,\n // never below a verified peak, even while a verified endpoint's height is unknown.\n endpoint.height = undefined;\n this.#best = this.#verifiedMaxHeight();\n this.#highest = maxHeight(this.#verifiedPeak, this.#best);\n this.#events.emit('provider.misconfigured', {\n transportId: this.id,\n endpointId: endpoint.id,\n expected: sanitizeIdentityField(expected),\n // An endpoint could answer its identity probe with our own key.\n actual: sanitizeIdentityField(endpoint.scrub(String(actual), 256)),\n });\n this.#log.warn('endpoint serves a different network; disabled', {\n endpointId: endpoint.id,\n });\n }\n\n /**\n * With no height probe, the identity probe is a confirmed endpoint's only\n * health signal, so `#refresh` re-runs it (under the refresh's own deadline), or a dead\n * endpoint would never miss and a proof quorum would count it for good. A different\n * answer disables the endpoint as a first check does; a failure is a health miss only,\n * never an identity throttle, so a confirmed endpoint stays in service for requests.\n */\n async #reconfirmIdentity(endpoint: Endpoint, signal: AbortSignal): Promise<void> {\n const probe = this.#probes.identity;\n const expected = this.#probes.expectedIdentity;\n if (!probe || expected === undefined) return;\n const actual = await raceAbort(probe(this.#direct(endpoint, signal)), signal);\n if (actual !== expected) this.#disable(endpoint, expected, actual);\n }\n\n /** An identity probe failure as a retryable, sanitized, untagged endpoint-local error. */\n #identityProbeFailed(\n endpoint: Endpoint,\n error: unknown,\n signal: AbortSignal,\n ): ProviderError {\n return new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `identity probe failed for endpoint '${endpoint.id}'`,\n {\n context: this.#context(endpoint),\n cause: this.#classify(error, endpoint, signal),\n },\n );\n }\n\n async #refresh(): Promise<void> {\n this.#refreshDue = false;\n const probe = this.#probes.height;\n const identityProbed = this.#identityProbed();\n const targets = this.#endpoints.filter((e) => e.identity !== 'mismatch');\n const tokensBefore = targets.map((e) => e.probeTokens);\n // Only a refresh where at least one endpoint's probe(s) actually succeeded\n // counts as fresh (see #lastHealthAt below).\n let anySucceeded = false;\n // Set when an endpoint was not really attempted (see #abandonedChecks).\n let anyAbandoned = false;\n await Promise.all(\n targets.map(async (endpoint) => {\n // An endpoint that asked us to wait (a 429's Retry-After, or backoff) is\n // not probed until then, and keeps its last height and identity meanwhile: neither\n // a miss nor a success.\n if (endpoint.notBefore > this.#clock.now()) return;\n // The shared run is never bound to any single caller's signal; each probe only\n // ever times out against its own deadline.\n const { signal: deadline, cancel } = this.#deadline(\n endpoint.timeoutMs ?? this.#opts.timeoutMs,\n );\n try {\n if (identityProbed) {\n // A throttled identity probe is skipped here entirely\n // rather than re-attempted and left to #ensureIdentity's own internal throttle\n // check to reject — there's no traffic behind a throttle hit, so nothing should\n // even look like an attempt.\n const identityThrottled =\n endpoint.identityRetryAt !== undefined &&\n this.#clock.now() < endpoint.identityRetryAt;\n // With no height probe, a confirmed identity is re-probed as the\n // endpoint's health signal. A skipped (throttled) one is neither a miss nor a\n // success.\n if (!identityThrottled) {\n if (!probe && endpoint.identity === 'ok')\n await this.#reconfirmIdentity(endpoint, deadline);\n else await this.#ensureIdentity(endpoint, deadline);\n }\n // Only an endpoint verified 'ok' in this refresh is height-probed\n // and feeds #best/#highest/lag/anySucceeded. A throttled or still-unchecked one\n // is cleared and does not count as succeeded.\n if (endpoint.identity !== 'ok') {\n endpoint.height = undefined;\n return;\n }\n }\n if (probe) {\n endpoint.height = await raceAbort(\n probe(this.#direct(endpoint, deadline)),\n deadline,\n );\n }\n // Identity and height failures feed one counter, which a refresh whose\n // probes all succeeded (with no height probe, the identity alone) resets.\n // Unless the endpoint's requests fail: then its answered probes are a\n // miss too, so an endpoint that answers probes but no request leaves a proof\n // quorum's count as a probe-dead one does, while a shorter outage still counts.\n if (this.#failingRequests(endpoint)) {\n this.#recordMiss(endpoint);\n } else {\n endpoint.healthMisses = 0;\n endpoint.lastMissAt = undefined;\n }\n anySucceeded = true;\n } catch (error) {\n // A rate-limited probe learned nothing, so the\n // endpoint keeps its last good height and identity and records no miss.\n if (rateLimited(error)) return;\n // A failed identity or height probe clears the stored height\n // instead of leaving it stale, so the endpoint counts as unknown.\n endpoint.height = undefined;\n // Only a failure under this refresh's own deadline is a miss. A\n // joined identity check that its request's caller aborted, or that the request's\n // own (possibly caller-shortened) deadline ended while this refresh's had not,\n // learned nothing here, so it counts as not attempted. The height probe itself\n // runs only under this refresh's own deadline.\n const foreign =\n this.#abandonedChecks.has(error as object) ||\n (this.#timedOutChecks.has(error as object) && !deadline.aborted);\n if (foreign) anyAbandoned = true;\n else this.#recordMiss(endpoint);\n // #refresh never does breaker bookkeeping — no onAttempt, onSuccess,\n // onFailure or onAbandon. A probe failure here only affects height/identity state,\n // never endpoint.breaker or endpoint.failures. The breaker tracks request\n // traffic, so after an outage only a request closes it: reads may wait out\n // `openMs`.\n } finally {\n cancel();\n }\n }),\n );\n // Rises only with identity-verified heights (and decays only through #decayPeak).\n const best = this.#verifiedMaxHeight();\n if (best !== undefined) {\n this.#best = best;\n this.#highest = maxHeight(this.#highest, best);\n // With an identity probe, `best` came from identity-verified endpoints only.\n if (this.#identityProbed())\n this.#verifiedPeak = maxHeight(this.#verifiedPeak, best);\n this.#decayPeak(best);\n }\n for (const status of this.status()) {\n // 'half-open' has no matching value in the provider.health event payload; 'unknown'\n // is likewise not worth reporting.\n if (status.state === 'unknown' || status.state === 'half-open') continue;\n this.#events.emit('provider.health', {\n transportId: this.id,\n endpointId: status.id,\n state: status.state,\n ...(status.height !== undefined ? { height: status.height.toString() } : {}),\n ...(status.lag !== undefined ? { lag: status.lag.toString() } : {}),\n });\n }\n // Only a completed refresh counts as fresh; #healthRun's `finally` clears the\n // in-flight marker regardless, but the staleness clock only advances here.\n // If every endpoint's probe(s) failed, #lastHealthAt is left unset (rather\n // than stamped) so the next ensureFreshHealth call probes again instead of trusting a\n // fully-failed refresh as fresh for a whole healthIntervalMs.\n // But an immediate re-probe on every read during an outage is its own\n // storm, so a fully-failed refresh instead sets a short backoff.\n // A refresh with an endpoint left unattempted (a joined identity check its\n // caller aborted) never arms the backoff, so the next read re-probes it.\n // The backoff is floored at the time each endpoint's bucket needs to refill\n // the tokens this refresh's probes took from it plus one, so repeated failing probes\n // (which take their tokens with priority) never take every token of a slow bucket. The\n // extra token keeps a window where only requests may take one: without it, a refresh\n // that starts as a token refills ties with the requests waiting for it.\n if (anySucceeded) {\n this.#lastHealthAt = this.#clock.now();\n } else if (!anyAbandoned) {\n let refillMs = 0;\n targets.forEach((e, i) => {\n const taken = e.probeTokens - (tokensBefore[i] ?? e.probeTokens);\n if (e.bucket && taken > 0)\n refillMs = Math.max(refillMs, e.bucket.refillMs(taken + 1));\n });\n this.#nextRefreshAt =\n this.#clock.now() +\n Math.max(Math.min(this.#opts.healthIntervalMs, 1_000), refillMs);\n }\n }\n\n /**\n * Lets a forged peak decay. A high-water mark that only rises lets one probe that saw a\n * forged far-future head make every view stale until restart (a TON probe, for one,\n * can report any masterchain height within 32 bits). A peak that no verified endpoint\n * comes within `maxLagBlocks` of, for three completed refreshes in a row\n * (`HEALTH_MISS_LIMIT`, as for a proof quorum's misses), falls back to the refresh's\n * verified best. Liveness only: a stale view decides nothing, and proofs never read\n * this mark.\n */\n #decayPeak(best: bigint): void {\n const peak = this.#highest;\n if (peak === undefined || best + BigInt(this.#opts.maxLagBlocks) >= peak) {\n this.#peakMisses = 0;\n return;\n }\n this.#peakMisses += 1;\n if (this.#peakMisses < HEALTH_MISS_LIMIT) return;\n this.#peakMisses = 0;\n this.#highest = best;\n this.#verifiedPeak = best;\n }\n\n // ---- errors ----------------------------------------------------------------------\n\n #context(endpoint: Endpoint): { transportId: string; endpointId: string } {\n return { transportId: this.id, endpointId: endpoint.id };\n }\n\n #classify(error: unknown, endpoint: Endpoint, signal: AbortSignal): CryptoAioError {\n const context = this.#context(endpoint);\n if (isCryptoAioError(error))\n return error.context.endpointId ? error : withContext(error, context);\n if (signal.aborted && signal.reason === TIMEOUT) {\n return this.#markSent(\n new TimeoutError('TIMEOUT', `request to endpoint '${endpoint.id}' timed out`, {\n context,\n }),\n );\n }\n const inner =\n error instanceof Error && error.cause instanceof Error ? error.cause : error;\n const clean = new Error(\n endpoint.scrub(inner instanceof Error ? inner.message : String(inner), 1_000),\n );\n clean.name = inner instanceof Error ? inner.name : 'Error';\n clean.stack = `${clean.name}: ${clean.message}`;\n // A raw (non-CryptoAioError) throw from fetch is a network error after the call.\n return this.#markSent(\n new ProviderError(\n 'PROVIDER_UNAVAILABLE',\n `request to endpoint '${endpoint.id}' failed: ${clean.message}`,\n { context, cause: clean },\n ),\n );\n }\n\n /** Tags an error as \"the attempt may have reached the network\", for ambiguity tracking. */\n #markSent<E extends CryptoAioError>(error: E): E {\n this.#maybeDelivered.add(error);\n return error;\n }\n}\n\n/**\n * JSON-RPC error data as text; a revived `bigint` is written as a decimal string, and\n * a top-level one as its bare digits, as a plain number would be.\n */\nfunction stringifyData(data: unknown): string {\n if (typeof data === 'bigint') return data.toString();\n return JSON.stringify(data, (_key, value: unknown) =>\n typeof value === 'bigint' ? value.toString() : value,\n );\n}\n\n/**\n * Whether a quorum read is held to the proof rules (sizing on every endpoint not proven\n * mismatched, and a definitive error decides only when the whole quorum returns it\n * alike): every\n * `quorum: 'proof'` read, whatever its purpose (EVM token metadata is read under 'read'\n * and cached), and any quorum read under a monitor or proof purpose.\n */\nfunction isProofQuorum(purpose: RequestPurpose, options: CallOptions): boolean {\n return options.quorum === 'proof' || purpose === 'monitor' || purpose === 'proof';\n}\n\n/**\n * Whether two definitive errors are the same answer: the same code, the\n * same HTTP status (`details.status`) and the same JSON-RPC code (`details.rpcCode`), each\n * possibly absent from both, and for an implementation-defined JSON-RPC code, the same\n * message text (`details.rpcMessage`). Anything else is a different answer. Only this\n * boolean leaves here: no message text reaches an error, event or log.\n */\nfunction sameRefusal(a: CryptoAioError, b: CryptoAioError): boolean {\n const left = a.details ?? {};\n const right = b.details ?? {};\n if (\n a.code !== b.code ||\n left.status !== right.status ||\n left.rpcCode !== right.rpcCode\n ) {\n return false;\n }\n return !implementationDefined(left.rpcCode) || left.rpcMessage === right.rpcMessage;\n}\n\n/**\n * A JSON-RPC error code whose meaning each server defines (-32000 to -32099, and\n * -32603, \"internal error\"), so one code can stand for unlike errors, such as a revert and\n * a missing header.\n */\nfunction implementationDefined(code: unknown): boolean {\n return (\n typeof code === 'number' && ((code <= -32000 && code >= -32099) || code === -32603)\n );\n}\n\n/** The highest height at least two endpoints have reached (the second-highest). */\nfunction corroboratedHeight(endpoints: readonly Endpoint[]): bigint | undefined {\n const heights = endpoints\n .map((e) => e.height)\n .filter((h): h is bigint => h !== undefined)\n .sort((a, b) => (a > b ? -1 : a < b ? 1 : 0));\n return heights[1];\n}\n\n/** The higher of two optional heights. */\nfunction maxHeight(a: bigint | undefined, b: bigint | undefined): bigint | undefined {\n if (a === undefined) return b;\n return b !== undefined && b > a ? b : a;\n}\n"]}
@@ -0,0 +1,27 @@
1
+ import type { Clock } from '../util/clock';
2
+ export declare class TokenBucket {
3
+ #private;
4
+ private readonly rps;
5
+ private readonly burst;
6
+ private readonly clock;
7
+ constructor(rps: number, burst: number, clock: Clock);
8
+ tryTake(): boolean;
9
+ /**
10
+ * Takes a token only if one is free now and no priority taker is waiting. A recovering
11
+ * endpoint's proof trial uses it: the trial is skipped, never waited for.
12
+ */
13
+ tryTakeNow(): boolean;
14
+ msUntilToken(): number;
15
+ /**
16
+ * Waits for a token. A `priority` taker (a health probe) goes ahead of every waiting
17
+ * ordinary taker, which leaves the next token to it, so a queue of requests never starves
18
+ * a probe past its deadline. Every token is still taken here: priority only reorders.
19
+ * Takers of the same kind (priority or ordinary) are served in wake order, not in a queue.
20
+ */
21
+ take(signal?: AbortSignal, priority?: boolean): Promise<void>;
22
+ /**
23
+ * How long the bucket takes to refill `tokens` tokens. The transport floors a failed
24
+ * health refresh's backoff with it, so failing probes never take every token.
25
+ */
26
+ refillMs(tokens: number): number;
27
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TokenBucket = void 0;
4
+ const error_1 = require("../errors/error");
5
+ class TokenBucket {
6
+ rps;
7
+ burst;
8
+ clock;
9
+ #tokens;
10
+ #updatedAt;
11
+ /** Priority takers (health probes) waiting now. */
12
+ #priorityWaiting = 0;
13
+ constructor(rps, burst, clock) {
14
+ this.rps = rps;
15
+ this.burst = burst;
16
+ this.clock = clock;
17
+ if (!(rps > 0) || !(burst >= 1)) {
18
+ throw new error_1.ConfigError('CONFIG_INVALID', 'rate limit needs rps > 0 and burst >= 1');
19
+ }
20
+ this.#tokens = burst;
21
+ this.#updatedAt = clock.now();
22
+ }
23
+ tryTake() {
24
+ this.#refill();
25
+ if (this.#tokens >= 1) {
26
+ this.#tokens -= 1;
27
+ return true;
28
+ }
29
+ return false;
30
+ }
31
+ /**
32
+ * Takes a token only if one is free now and no priority taker is waiting. A recovering
33
+ * endpoint's proof trial uses it: the trial is skipped, never waited for.
34
+ */
35
+ tryTakeNow() {
36
+ return this.#priorityWaiting === 0 && this.tryTake();
37
+ }
38
+ msUntilToken() {
39
+ this.#refill();
40
+ return this.#tokens >= 1 ? 0 : Math.ceil(((1 - this.#tokens) * 1_000) / this.rps);
41
+ }
42
+ /**
43
+ * Waits for a token. A `priority` taker (a health probe) goes ahead of every waiting
44
+ * ordinary taker, which leaves the next token to it, so a queue of requests never starves
45
+ * a probe past its deadline. Every token is still taken here: priority only reorders.
46
+ * Takers of the same kind (priority or ordinary) are served in wake order, not in a queue.
47
+ */
48
+ async take(signal, priority = false) {
49
+ if (priority)
50
+ this.#priorityWaiting += 1;
51
+ try {
52
+ while ((!priority && this.#priorityWaiting > 0) || !this.tryTake()) {
53
+ await this.clock.sleep(this.msUntilToken(), signal);
54
+ }
55
+ }
56
+ finally {
57
+ if (priority)
58
+ this.#priorityWaiting -= 1;
59
+ }
60
+ }
61
+ /**
62
+ * How long the bucket takes to refill `tokens` tokens. The transport floors a failed
63
+ * health refresh's backoff with it, so failing probes never take every token.
64
+ */
65
+ refillMs(tokens) {
66
+ return Math.ceil((tokens * 1_000) / this.rps);
67
+ }
68
+ #refill() {
69
+ const now = this.clock.now();
70
+ const elapsed = now - this.#updatedAt;
71
+ if (elapsed > 0) {
72
+ this.#tokens = Math.min(this.burst, this.#tokens + (elapsed * this.rps) / 1_000);
73
+ this.#updatedAt = now;
74
+ }
75
+ }
76
+ }
77
+ exports.TokenBucket = TokenBucket;
78
+ //# sourceMappingURL=rate-limit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limit.js","sourceRoot":"","sources":["../../../src/core/transport/rate-limit.ts"],"names":[],"mappings":";;;AAAA,2CAA8C;AAG9C,MAAa,WAAW;IAOH;IACA;IACA;IARnB,OAAO,CAAS;IAChB,UAAU,CAAS;IACnB,mDAAmD;IACnD,gBAAgB,GAAG,CAAC,CAAC;IAErB,YACmB,GAAW,EACX,KAAa,EACb,KAAY;QAFZ,QAAG,GAAH,GAAG,CAAQ;QACX,UAAK,GAAL,KAAK,CAAQ;QACb,UAAK,GAAL,KAAK,CAAO;QAE7B,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,mBAAW,CAAC,gBAAgB,EAAE,yCAAyC,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;IAChC,CAAC;IAED,OAAO;QACL,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,EAAE,CAAC;YACtB,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;;OAGG;IACH,UAAU;QACR,OAAO,IAAI,CAAC,gBAAgB,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;IACvD,CAAC;IAED,YAAY;QACV,IAAI,CAAC,OAAO,EAAE,CAAC;QACf,OAAO,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACpF,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,IAAI,CAAC,MAAoB,EAAE,QAAQ,GAAG,KAAK;QAC/C,IAAI,QAAQ;YAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC;YACH,OAAO,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,CAAC;gBACnE,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,MAAM,CAAC,CAAC;YACtD,CAAC;QACH,CAAC;gBAAS,CAAC;YACT,IAAI,QAAQ;gBAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAC,MAAc;QACrB,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAChD,CAAC;IAED,OAAO;QACL,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC;QACtC,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;YACjF,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC;QACxB,CAAC;IACH,CAAC;CACF;AAzED,kCAyEC","sourcesContent":["import { ConfigError } from '../errors/error';\nimport type { Clock } from '../util/clock';\n\nexport class TokenBucket {\n #tokens: number;\n #updatedAt: number;\n /** Priority takers (health probes) waiting now. */\n #priorityWaiting = 0;\n\n constructor(\n private readonly rps: number,\n private readonly burst: number,\n private readonly clock: Clock,\n ) {\n if (!(rps > 0) || !(burst >= 1)) {\n throw new ConfigError('CONFIG_INVALID', 'rate limit needs rps > 0 and burst >= 1');\n }\n this.#tokens = burst;\n this.#updatedAt = clock.now();\n }\n\n tryTake(): boolean {\n this.#refill();\n if (this.#tokens >= 1) {\n this.#tokens -= 1;\n return true;\n }\n return false;\n }\n\n /**\n * Takes a token only if one is free now and no priority taker is waiting. A recovering\n * endpoint's proof trial uses it: the trial is skipped, never waited for.\n */\n tryTakeNow(): boolean {\n return this.#priorityWaiting === 0 && this.tryTake();\n }\n\n msUntilToken(): number {\n this.#refill();\n return this.#tokens >= 1 ? 0 : Math.ceil(((1 - this.#tokens) * 1_000) / this.rps);\n }\n\n /**\n * Waits for a token. A `priority` taker (a health probe) goes ahead of every waiting\n * ordinary taker, which leaves the next token to it, so a queue of requests never starves\n * a probe past its deadline. Every token is still taken here: priority only reorders.\n * Takers of the same kind (priority or ordinary) are served in wake order, not in a queue.\n */\n async take(signal?: AbortSignal, priority = false): Promise<void> {\n if (priority) this.#priorityWaiting += 1;\n try {\n while ((!priority && this.#priorityWaiting > 0) || !this.tryTake()) {\n await this.clock.sleep(this.msUntilToken(), signal);\n }\n } finally {\n if (priority) this.#priorityWaiting -= 1;\n }\n }\n\n /**\n * How long the bucket takes to refill `tokens` tokens. The transport floors a failed\n * health refresh's backoff with it, so failing probes never take every token.\n */\n refillMs(tokens: number): number {\n return Math.ceil((tokens * 1_000) / this.rps);\n }\n\n #refill(): void {\n const now = this.clock.now();\n const elapsed = now - this.#updatedAt;\n if (elapsed > 0) {\n this.#tokens = Math.min(this.burst, this.#tokens + (elapsed * this.rps) / 1_000);\n this.#updatedAt = now;\n }\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { Transport } from './types';
2
+ /** What the stale-view guard reads from a transport. */
3
+ export type StaleViewSource = Pick<Transport, 'highestHeight' | 'hasProbes' | 'maxLagBlocks'>;
4
+ /**
5
+ * The one stale-view guard of the monitor and the scanner. A view whose `head` is more
6
+ * than the transport's effective `maxLagBlocks` behind its verified high-water mark
7
+ * (`highestHeight()`) is stale, and so is every view while health probes exist but no
8
+ * height was verified yet. A stale view decides nothing: no reorg, drop, expiry or
9
+ * rollback verdict.
10
+ */
11
+ export declare function isStaleView(transport: StaleViewSource, head: bigint): boolean;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isStaleView = isStaleView;
4
+ /**
5
+ * The one stale-view guard of the monitor and the scanner. A view whose `head` is more
6
+ * than the transport's effective `maxLagBlocks` behind its verified high-water mark
7
+ * (`highestHeight()`) is stale, and so is every view while health probes exist but no
8
+ * height was verified yet. A stale view decides nothing: no reorg, drop, expiry or
9
+ * rollback verdict.
10
+ */
11
+ function isStaleView(transport, head) {
12
+ const highest = transport.highestHeight();
13
+ if (highest === undefined)
14
+ return transport.hasProbes();
15
+ return head + BigInt(transport.maxLagBlocks) < highest;
16
+ }
17
+ //# sourceMappingURL=stale-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stale-view.js","sourceRoot":"","sources":["../../../src/core/transport/stale-view.ts"],"names":[],"mappings":";;AAeA,kCAIC;AAXD;;;;;;GAMG;AACH,SAAgB,WAAW,CAAC,SAA0B,EAAE,IAAY;IAClE,MAAM,OAAO,GAAG,SAAS,CAAC,aAAa,EAAE,CAAC;IAC1C,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC,SAAS,EAAE,CAAC;IACxD,OAAO,IAAI,GAAG,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,OAAO,CAAC;AACzD,CAAC","sourcesContent":["import type { Transport } from './types';\n\n/** What the stale-view guard reads from a transport. */\nexport type StaleViewSource = Pick<\n Transport,\n 'highestHeight' | 'hasProbes' | 'maxLagBlocks'\n>;\n\n/**\n * The one stale-view guard of the monitor and the scanner. A view whose `head` is more\n * than the transport's effective `maxLagBlocks` behind its verified high-water mark\n * (`highestHeight()`) is stale, and so is every view while health probes exist but no\n * height was verified yet. A stale view decides nothing: no reorg, drop, expiry or\n * rollback verdict.\n */\nexport function isStaleView(transport: StaleViewSource, head: bigint): boolean {\n const highest = transport.highestHeight();\n if (highest === undefined) return transport.hasProbes();\n return head + BigInt(transport.maxLagBlocks) < highest;\n}\n"]}