tapimo 0.7.1 → 0.8.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 (786) hide show
  1. package/README.md +10 -7
  2. package/dist/ApiKey.d.ts +3 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +10 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +29 -8
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +24 -5
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +20680 -15487
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +250 -129
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +17 -4
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Scope.d.ts +19 -8
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +25 -9
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +1 -1
  23. package/dist/admin/App.d.ts +667 -76
  24. package/dist/admin/App.d.ts.map +1 -1
  25. package/dist/admin/App.js +12 -2
  26. package/dist/admin/App.js.map +1 -1
  27. package/dist/admin/apps/api-keys.d.ts +107 -11
  28. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  29. package/dist/admin/apps/api-keys.js +145 -32
  30. package/dist/admin/apps/api-keys.js.map +1 -1
  31. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  32. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  33. package/dist/admin/apps/earn-vaults.js +409 -0
  34. package/dist/admin/apps/earn-vaults.js.map +1 -0
  35. package/dist/admin/apps/organizations.d.ts +2 -0
  36. package/dist/admin/apps/organizations.d.ts.map +1 -1
  37. package/dist/admin/apps/verified-tokens.d.ts +74 -74
  38. package/dist/admin/ui.generated.d.ts +1 -1
  39. package/dist/admin/ui.generated.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.js +99 -43
  41. package/dist/admin/ui.generated.js.map +1 -1
  42. package/dist/analytics/Analytics.d.ts +4 -0
  43. package/dist/analytics/Analytics.d.ts.map +1 -1
  44. package/dist/analytics/Analytics.js +21 -2
  45. package/dist/analytics/Analytics.js.map +1 -1
  46. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  47. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  48. package/dist/analytics/tables/requestEvents.js +59 -39
  49. package/dist/analytics/tables/requestEvents.js.map +1 -1
  50. package/dist/apps/Zones.d.ts +8335 -0
  51. package/dist/apps/Zones.d.ts.map +1 -0
  52. package/dist/apps/Zones.js +38 -0
  53. package/dist/apps/Zones.js.map +1 -0
  54. package/dist/apps/data/App.d.ts +5666 -3934
  55. package/dist/apps/data/App.d.ts.map +1 -1
  56. package/dist/apps/data/App.js +90 -22
  57. package/dist/apps/data/App.js.map +1 -1
  58. package/dist/apps/data/FxOracle.d.ts +1 -1
  59. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  60. package/dist/apps/data/index.d.ts +0 -1
  61. package/dist/apps/data/index.d.ts.map +1 -1
  62. package/dist/apps/data/index.js +0 -1
  63. package/dist/apps/data/index.js.map +1 -1
  64. package/dist/apps/data/routes/activities.d.ts +56 -56
  65. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  66. package/dist/apps/data/routes/activities.js +130 -65
  67. package/dist/apps/data/routes/activities.js.map +1 -1
  68. package/dist/apps/data/routes/addresses.d.ts +65 -65
  69. package/dist/apps/data/routes/balances.d.ts +14 -14
  70. package/dist/apps/data/routes/balances.js +5 -5
  71. package/dist/apps/data/routes/balances.js.map +1 -1
  72. package/dist/apps/data/routes/blocks.d.ts +39 -39
  73. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  74. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  75. package/dist/apps/data/routes/coingecko.js +62 -35
  76. package/dist/apps/data/routes/coingecko.js.map +1 -1
  77. package/dist/apps/data/routes/earn.d.ts +2574 -0
  78. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  79. package/dist/apps/data/routes/earn.js +1574 -0
  80. package/dist/apps/data/routes/earn.js.map +1 -0
  81. package/dist/apps/data/routes/exchanges.d.ts +1626 -719
  82. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  83. package/dist/apps/data/routes/exchanges.js +656 -193
  84. package/dist/apps/data/routes/exchanges.js.map +1 -1
  85. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  86. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  87. package/dist/apps/data/routes/fee-amm.js +59 -8
  88. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  89. package/dist/apps/data/routes/indexer.d.ts +35 -35
  90. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  91. package/dist/apps/data/routes/indexer.js +23 -3
  92. package/dist/apps/data/routes/indexer.js.map +1 -1
  93. package/dist/apps/data/routes/receipts.d.ts +33 -33
  94. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  95. package/dist/apps/data/routes/receipts.js +11 -11
  96. package/dist/apps/data/routes/receipts.js.map +1 -1
  97. package/dist/apps/data/routes/rpc.d.ts +6 -6
  98. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  99. package/dist/apps/data/routes/rpc.js +214 -22
  100. package/dist/apps/data/routes/rpc.js.map +1 -1
  101. package/dist/apps/data/routes/tokenlist.d.ts +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokenlist.js +39 -8
  104. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  105. package/dist/apps/data/routes/tokens.d.ts +115 -87
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +194 -91
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +54 -54
  110. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transactions.js +78 -39
  112. package/dist/apps/data/routes/transactions.js.map +1 -1
  113. package/dist/apps/data/routes/transfers.d.ts +76 -27
  114. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  115. package/dist/apps/data/routes/transfers.js +165 -67
  116. package/dist/apps/data/routes/transfers.js.map +1 -1
  117. package/dist/apps/data/routes/valuation.d.ts +42 -42
  118. package/dist/apps/data/routes/valuation.js +2 -2
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  121. package/dist/apps/data/routes/webhooks.d.ts +370 -368
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +161 -59
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zones.d.ts +281 -0
  126. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  127. package/dist/apps/data/routes/zones.js +252 -0
  128. package/dist/apps/data/routes/zones.js.map +1 -0
  129. package/dist/apps/docs/reference.js +6 -5
  130. package/dist/apps/docs/reference.js.map +1 -1
  131. package/dist/apps/funding/Access.d.ts +16 -0
  132. package/dist/apps/funding/Access.d.ts.map +1 -0
  133. package/dist/apps/funding/Access.js +22 -0
  134. package/dist/apps/funding/Access.js.map +1 -0
  135. package/dist/apps/funding/App.d.ts +3183 -0
  136. package/dist/apps/funding/App.d.ts.map +1 -0
  137. package/dist/apps/funding/App.js +46 -0
  138. package/dist/apps/funding/App.js.map +1 -0
  139. package/dist/apps/funding/Inventory.d.ts +5 -0
  140. package/dist/apps/funding/Inventory.d.ts.map +1 -0
  141. package/dist/apps/funding/Inventory.js +25 -0
  142. package/dist/apps/funding/Inventory.js.map +1 -0
  143. package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
  144. package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
  145. package/dist/apps/funding/ProviderAttempts.js +24 -0
  146. package/dist/apps/funding/ProviderAttempts.js.map +1 -0
  147. package/dist/apps/funding/index.d.ts +2 -0
  148. package/dist/apps/funding/index.d.ts.map +1 -0
  149. package/dist/apps/funding/index.js +2 -0
  150. package/dist/apps/funding/index.js.map +1 -0
  151. package/dist/apps/funding/routes/chains.d.ts +169 -0
  152. package/dist/apps/funding/routes/chains.d.ts.map +1 -0
  153. package/dist/apps/funding/routes/chains.js +80 -0
  154. package/dist/apps/funding/routes/chains.js.map +1 -0
  155. package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
  156. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
  157. package/dist/apps/funding/routes/deposit-addresses.js +860 -0
  158. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
  159. package/dist/apps/funding/routes/providers.d.ts +91 -0
  160. package/dist/apps/funding/routes/providers.d.ts.map +1 -0
  161. package/dist/apps/funding/routes/providers.js +56 -0
  162. package/dist/apps/funding/routes/providers.js.map +1 -0
  163. package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
  164. package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
  165. package/dist/apps/funding/routes/quotes.js +188 -0
  166. package/dist/apps/funding/routes/quotes.js.map +1 -0
  167. package/dist/apps/funding/routes/transfers.d.ts +1999 -0
  168. package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
  169. package/dist/apps/funding/routes/transfers.js +614 -0
  170. package/dist/apps/funding/routes/transfers.js.map +1 -0
  171. package/dist/apps/index.d.ts +3 -1
  172. package/dist/apps/index.d.ts.map +1 -1
  173. package/dist/apps/index.js +3 -1
  174. package/dist/apps/index.js.map +1 -1
  175. package/dist/apps/management/App.d.ts +839 -574
  176. package/dist/apps/management/App.d.ts.map +1 -1
  177. package/dist/apps/management/Billing.d.ts +8 -0
  178. package/dist/apps/management/Billing.d.ts.map +1 -1
  179. package/dist/apps/management/Billing.js +12 -0
  180. package/dist/apps/management/Billing.js.map +1 -1
  181. package/dist/apps/management/Error.d.ts +12 -0
  182. package/dist/apps/management/Error.d.ts.map +1 -0
  183. package/dist/apps/management/Error.js +10 -0
  184. package/dist/apps/management/Error.js.map +1 -0
  185. package/dist/apps/management/routes/api-keys.d.ts +296 -19
  186. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  187. package/dist/apps/management/routes/api-keys.js +77 -9
  188. package/dist/apps/management/routes/api-keys.js.map +1 -1
  189. package/dist/apps/management/routes/billing.d.ts +119 -119
  190. package/dist/apps/management/routes/faucet.d.ts +35 -35
  191. package/dist/apps/management/routes/invitations.d.ts +17 -17
  192. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  193. package/dist/apps/management/routes/invitations.js +4 -10
  194. package/dist/apps/management/routes/invitations.js.map +1 -1
  195. package/dist/apps/management/routes/invite-links.d.ts +38 -38
  196. package/dist/apps/management/routes/me.d.ts +6 -6
  197. package/dist/apps/management/routes/members.d.ts +69 -69
  198. package/dist/apps/management/routes/orgs.d.ts +16 -16
  199. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  200. package/dist/apps/management/routes/orgs.js +2 -8
  201. package/dist/apps/management/routes/orgs.js.map +1 -1
  202. package/dist/apps/management/routes/projects.d.ts +19 -19
  203. package/dist/apps/management/routes/scopes.d.ts +1 -1
  204. package/dist/apps/management/routes/scopes.js +2 -2
  205. package/dist/apps/management/routes/scopes.js.map +1 -1
  206. package/dist/apps/management/routes/usage.d.ts +72 -72
  207. package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
  208. package/dist/apps/management/routes/webhooks.d.ts +122 -122
  209. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  210. package/dist/apps/management/routes/webhooks.js +15 -3
  211. package/dist/apps/management/routes/webhooks.js.map +1 -1
  212. package/dist/apps/mcp.d.ts +2 -3
  213. package/dist/apps/mcp.d.ts.map +1 -1
  214. package/dist/apps/mcp.js +16 -14
  215. package/dist/apps/mcp.js.map +1 -1
  216. package/dist/apps/metadata.d.ts +4 -0
  217. package/dist/apps/metadata.d.ts.map +1 -1
  218. package/dist/apps/metadata.js +10 -0
  219. package/dist/apps/metadata.js.map +1 -1
  220. package/dist/apps/mpp/App.d.ts +57 -58
  221. package/dist/apps/mpp/App.d.ts.map +1 -1
  222. package/dist/apps/mpp/App.js +192 -27
  223. package/dist/apps/mpp/App.js.map +1 -1
  224. package/dist/apps/mpp/Mpp.d.ts +0 -20
  225. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  226. package/dist/apps/mpp/Mpp.js +0 -24
  227. package/dist/apps/mpp/Mpp.js.map +1 -1
  228. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  229. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  230. package/dist/apps/mpp/internal/Adapter.js +66 -0
  231. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  232. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  233. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  234. package/dist/apps/mpp/internal/Error.js +41 -0
  235. package/dist/apps/mpp/internal/Error.js.map +1 -0
  236. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  237. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  238. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  239. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  240. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  241. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  242. package/dist/apps/mpp/internal/Policy.js +57 -0
  243. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  244. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  245. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  246. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  247. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  248. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  249. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  250. package/dist/apps/mpp/internal/Screening.js +20 -0
  251. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  252. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  253. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  254. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  255. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  256. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  257. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  258. package/dist/apps/mpp/internal/Utils.js +24 -0
  259. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  260. package/dist/apps/relay/App.js +183 -23
  261. package/dist/apps/relay/App.js.map +1 -1
  262. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  263. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  264. package/dist/apps/relay/Sponsorships.js +15 -6
  265. package/dist/apps/relay/Sponsorships.js.map +1 -1
  266. package/dist/cloudflare.d.ts +50 -0
  267. package/dist/cloudflare.d.ts.map +1 -1
  268. package/dist/cloudflare.js +178 -0
  269. package/dist/cloudflare.js.map +1 -1
  270. package/dist/db/Db.d.ts +22 -0
  271. package/dist/db/Db.d.ts.map +1 -1
  272. package/dist/db/Db.js +379 -0
  273. package/dist/db/Db.js.map +1 -1
  274. package/dist/db/Schema.d.ts +933 -1
  275. package/dist/db/Schema.d.ts.map +1 -1
  276. package/dist/db/Schema.js +289 -1
  277. package/dist/db/Schema.js.map +1 -1
  278. package/dist/db/tables/earnVaults.d.ts +68 -0
  279. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  280. package/dist/db/tables/earnVaults.js +72 -0
  281. package/dist/db/tables/earnVaults.js.map +1 -0
  282. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  283. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  284. package/dist/db/tables/fundingCatalog.js +85 -0
  285. package/dist/db/tables/fundingCatalog.js.map +1 -0
  286. package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
  287. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  288. package/dist/db/tables/fundingDepositAddresses.js +218 -0
  289. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  290. package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
  291. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
  292. package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
  293. package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
  294. package/dist/db/tables/fundingDeposits.d.ts +171 -0
  295. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  296. package/dist/db/tables/fundingDeposits.js +182 -0
  297. package/dist/db/tables/fundingDeposits.js.map +1 -0
  298. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  299. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  300. package/dist/db/tables/fundingIdempotency.js +103 -0
  301. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  302. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  303. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  304. package/dist/db/tables/fundingTransferEvents.js +18 -0
  305. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  306. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  307. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  308. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  309. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  310. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  311. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  312. package/dist/db/tables/fundingTransfers.js +89 -0
  313. package/dist/db/tables/fundingTransfers.js.map +1 -0
  314. package/dist/db/tables/organizations.d.ts +8 -0
  315. package/dist/db/tables/organizations.d.ts.map +1 -1
  316. package/dist/db/tables/organizations.js +16 -0
  317. package/dist/db/tables/organizations.js.map +1 -1
  318. package/dist/db/tables/projects.d.ts +8 -0
  319. package/dist/db/tables/projects.d.ts.map +1 -1
  320. package/dist/db/tables/projects.js +16 -0
  321. package/dist/db/tables/projects.js.map +1 -1
  322. package/dist/db/tables/requestUsage.d.ts +13 -0
  323. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  324. package/dist/db/tables/requestUsage.js +16 -0
  325. package/dist/db/tables/requestUsage.js.map +1 -1
  326. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  327. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  328. package/dist/db/tables/sponsoredTransactions.js +1 -1
  329. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  330. package/dist/db/tables/users.d.ts +8 -0
  331. package/dist/db/tables/users.d.ts.map +1 -1
  332. package/dist/db/tables/users.js +16 -0
  333. package/dist/db/tables/users.js.map +1 -1
  334. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  335. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  336. package/dist/db/tables/verifiedTokens.js +9 -7
  337. package/dist/db/tables/verifiedTokens.js.map +1 -1
  338. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  339. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  340. package/dist/db/tables/webhookSubscriptions.js +24 -3
  341. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  342. package/dist/handlers/relay.js +108 -108
  343. package/dist/handlers/relay.js.map +1 -1
  344. package/dist/internal/Auth.d.ts +37 -11
  345. package/dist/internal/Auth.d.ts.map +1 -1
  346. package/dist/internal/Auth.js +75 -16
  347. package/dist/internal/Auth.js.map +1 -1
  348. package/dist/internal/Cache.d.ts.map +1 -1
  349. package/dist/internal/Cache.js +17 -11
  350. package/dist/internal/Cache.js.map +1 -1
  351. package/dist/internal/Cursor.js +1 -1
  352. package/dist/internal/Cursor.js.map +1 -1
  353. package/dist/internal/EarnRates.d.ts +89 -0
  354. package/dist/internal/EarnRates.d.ts.map +1 -0
  355. package/dist/internal/EarnRates.js +266 -0
  356. package/dist/internal/EarnRates.js.map +1 -0
  357. package/dist/internal/EarnVaults.d.ts +171 -0
  358. package/dist/internal/EarnVaults.d.ts.map +1 -0
  359. package/dist/internal/EarnVaults.js +547 -0
  360. package/dist/internal/EarnVaults.js.map +1 -0
  361. package/dist/internal/EdgeCache.d.ts +10 -3
  362. package/dist/internal/EdgeCache.d.ts.map +1 -1
  363. package/dist/internal/EdgeCache.js +43 -11
  364. package/dist/internal/EdgeCache.js.map +1 -1
  365. package/dist/internal/Id.d.ts +11 -0
  366. package/dist/internal/Id.d.ts.map +1 -1
  367. package/dist/internal/Id.js +13 -0
  368. package/dist/internal/Id.js.map +1 -1
  369. package/dist/internal/Idempotency.d.ts +83 -0
  370. package/dist/internal/Idempotency.d.ts.map +1 -0
  371. package/dist/internal/Idempotency.js +113 -0
  372. package/dist/internal/Idempotency.js.map +1 -0
  373. package/dist/internal/IpAllowlist.d.ts +15 -0
  374. package/dist/internal/IpAllowlist.d.ts.map +1 -0
  375. package/dist/internal/IpAllowlist.js +27 -0
  376. package/dist/internal/IpAllowlist.js.map +1 -0
  377. package/dist/internal/Log.d.ts +64 -9
  378. package/dist/internal/Log.d.ts.map +1 -1
  379. package/dist/internal/Log.js +29 -7
  380. package/dist/internal/Log.js.map +1 -1
  381. package/dist/internal/MetricSink.d.ts.map +1 -1
  382. package/dist/internal/MetricSink.js +47 -1
  383. package/dist/internal/MetricSink.js.map +1 -1
  384. package/dist/internal/OpenApi.d.ts +2 -2
  385. package/dist/internal/OpenApi.d.ts.map +1 -1
  386. package/dist/internal/OpenApi.js +4 -1
  387. package/dist/internal/OpenApi.js.map +1 -1
  388. package/dist/internal/Provider.d.ts +14 -0
  389. package/dist/internal/Provider.d.ts.map +1 -0
  390. package/dist/internal/Provider.js +5 -0
  391. package/dist/internal/Provider.js.map +1 -0
  392. package/dist/internal/Schema.d.ts +6 -1
  393. package/dist/internal/Schema.d.ts.map +1 -1
  394. package/dist/internal/Schema.js +20 -11
  395. package/dist/internal/Schema.js.map +1 -1
  396. package/dist/internal/Store.d.ts +6 -0
  397. package/dist/internal/Store.d.ts.map +1 -1
  398. package/dist/internal/Store.js +35 -0
  399. package/dist/internal/Store.js.map +1 -1
  400. package/dist/internal/Tidx.d.ts +49 -24
  401. package/dist/internal/Tidx.d.ts.map +1 -1
  402. package/dist/internal/Tidx.js +90 -12
  403. package/dist/internal/Tidx.js.map +1 -1
  404. package/dist/internal/Viem.d.ts +90 -65
  405. package/dist/internal/Viem.d.ts.map +1 -1
  406. package/dist/internal/Viem.js +90 -12
  407. package/dist/internal/Viem.js.map +1 -1
  408. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  409. package/dist/internal/WebhookDestination.js +34 -28
  410. package/dist/internal/WebhookDestination.js.map +1 -1
  411. package/dist/internal/Webhooks.d.ts +9 -0
  412. package/dist/internal/Webhooks.d.ts.map +1 -1
  413. package/dist/internal/Webhooks.js +15 -10
  414. package/dist/internal/Webhooks.js.map +1 -1
  415. package/dist/internal/exchange/Provider.d.ts +219 -0
  416. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  417. package/dist/internal/exchange/Provider.js +117 -0
  418. package/dist/internal/exchange/Provider.js.map +1 -0
  419. package/dist/internal/exchange/index.d.ts +2 -0
  420. package/dist/internal/exchange/index.d.ts.map +1 -0
  421. package/dist/internal/exchange/index.js +2 -0
  422. package/dist/internal/exchange/index.js.map +1 -0
  423. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  424. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  425. package/dist/internal/exchange/providers/uniswap.js +553 -0
  426. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  427. package/dist/internal/funding/Action.d.ts +55 -0
  428. package/dist/internal/funding/Action.d.ts.map +1 -0
  429. package/dist/internal/funding/Action.js +74 -0
  430. package/dist/internal/funding/Action.js.map +1 -0
  431. package/dist/internal/funding/Catalog.d.ts +107 -0
  432. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  433. package/dist/internal/funding/Catalog.js +270 -0
  434. package/dist/internal/funding/Catalog.js.map +1 -0
  435. package/dist/internal/funding/Chain.d.ts +76 -0
  436. package/dist/internal/funding/Chain.d.ts.map +1 -0
  437. package/dist/internal/funding/Chain.js +38 -0
  438. package/dist/internal/funding/Chain.js.map +1 -0
  439. package/dist/internal/funding/Deposit.d.ts +408 -0
  440. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  441. package/dist/internal/funding/Deposit.js +318 -0
  442. package/dist/internal/funding/Deposit.js.map +1 -0
  443. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  444. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  445. package/dist/internal/funding/DepositAddress.js +189 -0
  446. package/dist/internal/funding/DepositAddress.js.map +1 -0
  447. package/dist/internal/funding/Evidence.d.ts +48 -0
  448. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  449. package/dist/internal/funding/Evidence.js +315 -0
  450. package/dist/internal/funding/Evidence.js.map +1 -0
  451. package/dist/internal/funding/Provider.d.ts +1288 -0
  452. package/dist/internal/funding/Provider.d.ts.map +1 -0
  453. package/dist/internal/funding/Provider.js +1086 -0
  454. package/dist/internal/funding/Provider.js.map +1 -0
  455. package/dist/internal/funding/Reconciliation.d.ts +127 -0
  456. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  457. package/dist/internal/funding/Reconciliation.js +885 -0
  458. package/dist/internal/funding/Reconciliation.js.map +1 -0
  459. package/dist/internal/funding/Route.d.ts +21 -0
  460. package/dist/internal/funding/Route.d.ts.map +1 -0
  461. package/dist/internal/funding/Route.js +5 -0
  462. package/dist/internal/funding/Route.js.map +1 -0
  463. package/dist/internal/funding/SourceObservation.d.ts +108 -0
  464. package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
  465. package/dist/internal/funding/SourceObservation.js +143 -0
  466. package/dist/internal/funding/SourceObservation.js.map +1 -0
  467. package/dist/internal/funding/Subsidy.d.ts +113 -0
  468. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  469. package/dist/internal/funding/Subsidy.js +138 -0
  470. package/dist/internal/funding/Subsidy.js.map +1 -0
  471. package/dist/internal/funding/Token.d.ts +41 -0
  472. package/dist/internal/funding/Token.d.ts.map +1 -0
  473. package/dist/internal/funding/Token.js +22 -0
  474. package/dist/internal/funding/Token.js.map +1 -0
  475. package/dist/internal/funding/Transfer.d.ts +643 -0
  476. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  477. package/dist/internal/funding/Transfer.js +332 -0
  478. package/dist/internal/funding/Transfer.js.map +1 -0
  479. package/dist/internal/funding/index.d.ts +14 -0
  480. package/dist/internal/funding/index.d.ts.map +1 -0
  481. package/dist/internal/funding/index.js +14 -0
  482. package/dist/internal/funding/index.js.map +1 -0
  483. package/dist/internal/funding/providers/across.d.ts +21 -0
  484. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  485. package/dist/internal/funding/providers/across.js +117 -0
  486. package/dist/internal/funding/providers/across.js.map +1 -0
  487. package/dist/internal/funding/providers/relay.d.ts +88 -0
  488. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  489. package/dist/internal/funding/providers/relay.js +871 -0
  490. package/dist/internal/funding/providers/relay.js.map +1 -0
  491. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  492. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  493. package/dist/internal/funding/providers/rhino.js +116 -0
  494. package/dist/internal/funding/providers/rhino.js.map +1 -0
  495. package/dist/internal/funding/providers/squid.d.ts +19 -0
  496. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  497. package/dist/internal/funding/providers/squid.js +120 -0
  498. package/dist/internal/funding/providers/squid.js.map +1 -0
  499. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  500. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  501. package/dist/internal/funding/providers/symbiosis.js +176 -0
  502. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  503. package/dist/internal/index.d.ts +5 -1
  504. package/dist/internal/index.d.ts.map +1 -1
  505. package/dist/internal/index.js +5 -1
  506. package/dist/internal/index.js.map +1 -1
  507. package/dist/internal/webhookDestinations/url.js +61 -57
  508. package/dist/internal/webhookDestinations/url.js.map +1 -1
  509. package/dist/providers/index.d.ts +43 -0
  510. package/dist/providers/index.d.ts.map +1 -0
  511. package/dist/providers/index.js +19 -0
  512. package/dist/providers/index.js.map +1 -0
  513. package/package.json +10 -5
  514. package/src/ApiKey.test.ts +35 -0
  515. package/src/ApiKey.ts +27 -0
  516. package/src/ApiKeys.test.ts +40 -7
  517. package/src/ApiKeys.ts +46 -10
  518. package/src/App.test.ts +108 -15
  519. package/src/App.ts +296 -138
  520. package/src/Assets.ts +29 -4
  521. package/src/Client.test-d.ts +809 -37
  522. package/src/Scope.test.ts +19 -0
  523. package/src/Scope.ts +28 -11
  524. package/src/Webhooks.test.ts +25 -0
  525. package/src/Webhooks.ts +1 -1
  526. package/src/admin/App.test.ts +9 -2
  527. package/src/admin/App.ts +32 -9
  528. package/src/admin/apps/api-keys.test.ts +190 -22
  529. package/src/admin/apps/api-keys.ts +170 -28
  530. package/src/admin/apps/earn-vaults.test.ts +338 -0
  531. package/src/admin/apps/earn-vaults.ts +572 -0
  532. package/src/admin/apps/scopes.test.ts +16 -1
  533. package/src/admin/ui/plugin.ts +2 -2
  534. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  535. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  536. package/src/admin/ui/src/components/Page.tsx +1 -1
  537. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  538. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  539. package/src/admin/ui/src/lib/client.ts +1 -1
  540. package/src/admin/ui/src/lib/config.ts +1 -1
  541. package/src/admin/ui/src/lib/early-access.ts +8 -9
  542. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  543. package/src/admin/ui/src/lib/format.ts +13 -0
  544. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  545. package/src/admin/ui/src/lib/organizations.ts +7 -1
  546. package/src/admin/ui/src/lib/response.ts +22 -0
  547. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  548. package/src/admin/ui/src/lib/scopes.ts +28 -7
  549. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  550. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  551. package/src/admin/ui/src/router.tsx +2 -2
  552. package/src/admin/ui/src/routes/__root.tsx +9 -8
  553. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  554. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  555. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  556. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  557. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  558. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  559. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  560. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  561. package/src/admin/ui/vite.config.ts +4 -1
  562. package/src/admin/ui.generated.ts +113 -43
  563. package/src/analytics/Analytics.test.ts +69 -10
  564. package/src/analytics/Analytics.ts +24 -1
  565. package/src/analytics/tables/requestEvents.ts +79 -37
  566. package/src/apps/Zones.test.ts +33 -0
  567. package/src/apps/Zones.ts +40 -0
  568. package/src/apps/composition.test.ts +184 -3
  569. package/src/apps/data/App.test.ts +28 -23
  570. package/src/apps/data/App.ts +95 -36
  571. package/src/apps/data/FxOracle.ts +1 -1
  572. package/src/apps/data/index.ts +0 -1
  573. package/src/apps/data/routes/activities.test.ts +82 -6
  574. package/src/apps/data/routes/activities.ts +131 -71
  575. package/src/apps/data/routes/balances.test.ts +50 -37
  576. package/src/apps/data/routes/balances.ts +5 -5
  577. package/src/apps/data/routes/blocks.test.ts +2 -0
  578. package/src/apps/data/routes/coingecko.test.ts +22 -0
  579. package/src/apps/data/routes/coingecko.ts +84 -48
  580. package/src/apps/data/routes/earn.test.ts +1391 -0
  581. package/src/apps/data/routes/earn.ts +2188 -0
  582. package/src/apps/data/routes/exchanges.test.ts +82 -33
  583. package/src/apps/data/routes/exchanges.ts +842 -227
  584. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  585. package/src/apps/data/routes/fee-amm.ts +69 -12
  586. package/src/apps/data/routes/indexer.test.ts +43 -34
  587. package/src/apps/data/routes/indexer.ts +21 -3
  588. package/src/apps/data/routes/receipts.test.ts +5 -3
  589. package/src/apps/data/routes/receipts.ts +13 -11
  590. package/src/apps/data/routes/rpc.test.ts +446 -28
  591. package/src/apps/data/routes/rpc.ts +245 -25
  592. package/src/apps/data/routes/tokenlist.ts +72 -19
  593. package/src/apps/data/routes/tokens.test.ts +6 -8
  594. package/src/apps/data/routes/tokens.ts +258 -86
  595. package/src/apps/data/routes/transactions.test.ts +2 -0
  596. package/src/apps/data/routes/transactions.ts +77 -42
  597. package/src/apps/data/routes/transfers.test.ts +166 -4
  598. package/src/apps/data/routes/transfers.ts +216 -78
  599. package/src/apps/data/routes/valuation.test.ts +62 -9
  600. package/src/apps/data/routes/valuation.ts +2 -2
  601. package/src/apps/data/routes/webhooks.test.ts +386 -43
  602. package/src/apps/data/routes/webhooks.ts +172 -71
  603. package/src/apps/data/routes/zones.test.ts +473 -0
  604. package/src/apps/data/routes/zones.ts +338 -0
  605. package/src/apps/docs/reference.ts +8 -6
  606. package/src/apps/funding/Access.ts +26 -0
  607. package/src/apps/funding/App.test.ts +78 -0
  608. package/src/apps/funding/App.ts +63 -0
  609. package/src/apps/funding/Inventory.ts +30 -0
  610. package/src/apps/funding/ProviderAttempts.ts +26 -0
  611. package/src/apps/funding/index.ts +1 -0
  612. package/src/apps/funding/routes/chains.test.ts +78 -0
  613. package/src/apps/funding/routes/chains.ts +101 -0
  614. package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
  615. package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
  616. package/src/apps/funding/routes/providers.test.ts +165 -0
  617. package/src/apps/funding/routes/providers.ts +73 -0
  618. package/src/apps/funding/routes/quotes.test.ts +511 -0
  619. package/src/apps/funding/routes/quotes.ts +205 -0
  620. package/src/apps/funding/routes/transfers.test.ts +1255 -0
  621. package/src/apps/funding/routes/transfers.ts +704 -0
  622. package/src/apps/index.ts +3 -1
  623. package/src/apps/management/Billing.test.ts +29 -0
  624. package/src/apps/management/Billing.ts +23 -0
  625. package/src/apps/management/Error.ts +12 -0
  626. package/src/apps/management/routes/api-keys.test.ts +103 -3
  627. package/src/apps/management/routes/api-keys.ts +98 -10
  628. package/src/apps/management/routes/invitations.ts +4 -11
  629. package/src/apps/management/routes/orgs.ts +2 -9
  630. package/src/apps/management/routes/scopes.test.ts +7 -2
  631. package/src/apps/management/routes/scopes.ts +2 -2
  632. package/src/apps/management/routes/webhooks.test.ts +6 -1
  633. package/src/apps/management/routes/webhooks.ts +15 -3
  634. package/src/apps/mcp.test.ts +17 -2
  635. package/src/apps/mcp.ts +18 -13
  636. package/src/apps/metadata.ts +12 -0
  637. package/src/apps/mpp/App.ts +276 -29
  638. package/src/apps/mpp/Mpp.test.ts +631 -26
  639. package/src/apps/mpp/Mpp.ts +0 -42
  640. package/src/apps/mpp/internal/Adapter.ts +108 -3
  641. package/src/apps/mpp/internal/Error.test.ts +33 -0
  642. package/src/apps/mpp/internal/Error.ts +44 -6
  643. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  644. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  645. package/src/apps/mpp/internal/Policy.test.ts +128 -0
  646. package/src/apps/mpp/internal/Policy.ts +98 -0
  647. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  648. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  649. package/src/apps/mpp/internal/Screening.ts +40 -3
  650. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  651. package/src/apps/mpp/internal/Utils.ts +30 -0
  652. package/src/apps/relay/App.test.ts +493 -62
  653. package/src/apps/relay/App.ts +233 -23
  654. package/src/apps/relay/Sponsorships.test.ts +49 -0
  655. package/src/apps/relay/Sponsorships.ts +18 -6
  656. package/src/cloudflare.ts +279 -0
  657. package/src/db/Db.ts +501 -0
  658. package/src/db/Schema.ts +349 -2
  659. package/src/db/tables/earnVaults.test.ts +185 -0
  660. package/src/db/tables/earnVaults.ts +151 -0
  661. package/src/db/tables/fundingCatalog.test.ts +108 -0
  662. package/src/db/tables/fundingCatalog.ts +157 -0
  663. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  664. package/src/db/tables/fundingDepositAddresses.ts +404 -0
  665. package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
  666. package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
  667. package/src/db/tables/fundingDeposits.test.ts +399 -0
  668. package/src/db/tables/fundingDeposits.ts +373 -0
  669. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  670. package/src/db/tables/fundingIdempotency.ts +180 -0
  671. package/src/db/tables/fundingTransferEvents.ts +28 -0
  672. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  673. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  674. package/src/db/tables/fundingTransfers.test.ts +89 -0
  675. package/src/db/tables/fundingTransfers.ts +153 -0
  676. package/src/db/tables/organizations.ts +16 -0
  677. package/src/db/tables/projects.ts +16 -0
  678. package/src/db/tables/requestUsage.ts +23 -0
  679. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  680. package/src/db/tables/sponsoredTransactions.ts +3 -3
  681. package/src/db/tables/users.ts +16 -0
  682. package/src/db/tables/verifiedTokens.ts +19 -14
  683. package/src/db/tables/webhookSubscriptions.ts +58 -3
  684. package/src/handlers/relay.test.ts +2 -0
  685. package/src/handlers/relay.ts +95 -99
  686. package/src/internal/Auth.test.ts +225 -5
  687. package/src/internal/Auth.ts +109 -20
  688. package/src/internal/Cache.test.ts +37 -3
  689. package/src/internal/Cache.ts +14 -10
  690. package/src/internal/Cursor.test.ts +2 -2
  691. package/src/internal/Cursor.ts +1 -1
  692. package/src/internal/EarnRates.test.ts +125 -0
  693. package/src/internal/EarnRates.ts +409 -0
  694. package/src/internal/EarnVaults.test.ts +195 -0
  695. package/src/internal/EarnVaults.ts +876 -0
  696. package/src/internal/EdgeCache.test.ts +26 -7
  697. package/src/internal/EdgeCache.ts +48 -9
  698. package/src/internal/Id.ts +14 -0
  699. package/src/internal/Idempotency.test.ts +109 -0
  700. package/src/internal/Idempotency.ts +237 -0
  701. package/src/internal/IpAllowlist.test.ts +52 -0
  702. package/src/internal/IpAllowlist.ts +39 -0
  703. package/src/internal/Log.test-d.ts +41 -8
  704. package/src/internal/Log.test.ts +196 -9
  705. package/src/internal/Log.ts +124 -17
  706. package/src/internal/MetricSink.test.ts +244 -4
  707. package/src/internal/MetricSink.ts +51 -1
  708. package/src/internal/OpenApi.ts +4 -1
  709. package/src/internal/Provider.test.ts +17 -0
  710. package/src/internal/Provider.ts +17 -0
  711. package/src/internal/Schema.ts +27 -17
  712. package/src/internal/Store.test.ts +25 -0
  713. package/src/internal/Store.ts +46 -0
  714. package/src/internal/Tidx.local.test.ts +78 -3
  715. package/src/internal/Tidx.test.ts +240 -18
  716. package/src/internal/Tidx.ts +129 -33
  717. package/src/internal/VerifiedTokens.test.ts +15 -0
  718. package/src/internal/Viem.test.ts +198 -17
  719. package/src/internal/Viem.ts +127 -28
  720. package/src/internal/WebhookDestination.ts +25 -23
  721. package/src/internal/Webhooks.test.ts +59 -0
  722. package/src/internal/Webhooks.ts +34 -10
  723. package/src/internal/exchange/Provider.test.ts +216 -0
  724. package/src/internal/exchange/Provider.ts +326 -0
  725. package/src/internal/exchange/index.test.ts +6 -0
  726. package/src/internal/exchange/index.ts +1 -0
  727. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  728. package/src/internal/exchange/providers/uniswap.ts +682 -0
  729. package/src/internal/funding/Action.test.ts +138 -0
  730. package/src/internal/funding/Action.ts +117 -0
  731. package/src/internal/funding/Catalog.test.ts +311 -0
  732. package/src/internal/funding/Catalog.ts +347 -0
  733. package/src/internal/funding/Chain.test.ts +79 -0
  734. package/src/internal/funding/Chain.ts +120 -0
  735. package/src/internal/funding/Deposit.test.ts +26 -0
  736. package/src/internal/funding/Deposit.ts +522 -0
  737. package/src/internal/funding/DepositAddress.test.ts +18 -0
  738. package/src/internal/funding/DepositAddress.ts +312 -0
  739. package/src/internal/funding/Evidence.test.ts +297 -0
  740. package/src/internal/funding/Evidence.ts +425 -0
  741. package/src/internal/funding/Provider.test.ts +1328 -0
  742. package/src/internal/funding/Provider.ts +1911 -0
  743. package/src/internal/funding/Reconciliation.local.test.ts +511 -0
  744. package/src/internal/funding/Reconciliation.test.ts +3037 -0
  745. package/src/internal/funding/Reconciliation.ts +1202 -0
  746. package/src/internal/funding/Route.test.ts +66 -0
  747. package/src/internal/funding/Route.ts +29 -0
  748. package/src/internal/funding/SourceObservation.test.ts +301 -0
  749. package/src/internal/funding/SourceObservation.ts +267 -0
  750. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  751. package/src/internal/funding/Subsidy.test.ts +75 -0
  752. package/src/internal/funding/Subsidy.ts +260 -0
  753. package/src/internal/funding/Token.test.ts +47 -0
  754. package/src/internal/funding/Token.ts +59 -0
  755. package/src/internal/funding/Transfer.test.ts +369 -0
  756. package/src/internal/funding/Transfer.ts +522 -0
  757. package/src/internal/funding/index.test.ts +21 -0
  758. package/src/internal/funding/index.ts +13 -0
  759. package/src/internal/funding/providers/across.ts +149 -0
  760. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  761. package/src/internal/funding/providers/relay.test.ts +564 -0
  762. package/src/internal/funding/providers/relay.ts +1060 -0
  763. package/src/internal/funding/providers/rhino.ts +139 -0
  764. package/src/internal/funding/providers/squid.ts +151 -0
  765. package/src/internal/funding/providers/symbiosis.ts +221 -0
  766. package/src/internal/index.test.ts +5 -1
  767. package/src/internal/index.ts +5 -1
  768. package/src/internal/webhookDestinations/url.ts +49 -45
  769. package/src/providers/index.test.ts +14 -0
  770. package/src/providers/index.ts +54 -0
  771. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  772. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  773. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  774. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  775. package/dist/apps/data/routes/funding.d.ts.map +0 -1
  776. package/dist/apps/data/routes/funding.js +0 -410
  777. package/dist/apps/data/routes/funding.js.map +0 -1
  778. package/dist/internal/FundingQuotes.d.ts +0 -864
  779. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  780. package/dist/internal/FundingQuotes.js +0 -672
  781. package/dist/internal/FundingQuotes.js.map +0 -1
  782. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  783. package/src/apps/data/routes/funding.test.ts +0 -503
  784. package/src/apps/data/routes/funding.ts +0 -604
  785. package/src/internal/FundingQuotes.test.ts +0 -456
  786. package/src/internal/FundingQuotes.ts +0 -944
@@ -1,12 +1,12 @@
1
1
  import { ZoneRpcAuthentication } from 'ox/tempo'
2
2
  import { createClient, http, publicActions } from 'viem'
3
- import type { Client as core_Client, HttpTransport, PublicActions } from 'viem'
3
+ import type { Chain as core_Chain, Client as core_Client, HttpTransport, PublicActions } from 'viem'
4
4
  import { tempoActions } from 'viem/tempo'
5
5
  import type { TempoActions } from 'viem/tempo'
6
6
  import { tempoMainnet, tempoTestnet } from 'viem/tempo/chains'
7
7
  import type * as z from 'zod/mini'
8
8
 
9
- import type * as Auth from './Auth.js'
9
+ import * as Auth from './Auth.js'
10
10
  import type * as Schema from './Schema.js'
11
11
 
12
12
  /** Known Tempo chains keyed by id, for metadata lookups. */
@@ -41,22 +41,32 @@ export type Chain = Omit<typeof tempoMainnet, 'id'> & { id: ChainId }
41
41
  /** Gets a Tempo viem client for a chain id. */
42
42
  export type GetClient = (chainId?: ChainId) => getClient.ReturnType
43
43
 
44
- /**
45
- * Resolves an RPC URL for a Tempo chain id. May return `undefined` to fall back
46
- * to the built-in {@link url} map (e.g. for a chain the resolver doesn't serve).
47
- */
48
- export type UrlResolver = (chainId: ChainId) => string | undefined
44
+ /** Shared, per-chain, or dynamically resolved RPC URLs. */
45
+ export type UrlResolver =
46
+ | string
47
+ | Record<number, string>
48
+ | ((chainId: ChainId) => string | undefined)
49
+
50
+ /** Headers required when connecting to a Zone upstream. */
51
+ export type ZoneHeaders = Record<string, string>
52
+
53
+ /** Returns chain ids declared by a static chain-id-to-URL map. */
54
+ export function configuredChainIds(value: UrlResolver | undefined): number[] {
55
+ const urls = parseUrls(value)
56
+ if (!urls || typeof urls === 'string' || typeof urls === 'function') return []
57
+ return Object.keys(urls).map(Number)
58
+ }
49
59
 
50
60
  /**
51
61
  * Resolves the effective RPC config for a single request.
52
62
  *
53
63
  * Accepts either a static config object or a per-request resolver function. The
54
- * resolver receives a {@link resolve.Context} (`chainId` plus the request
64
+ * resolver receives a {@link resolveRpc.Context} (`chainId` plus the request
55
65
  * `principal`), so callers can route traffic per caller — e.g. send anonymous
56
66
  * (`principal.type === 'public'`) traffic to a separate, no-auth upstream. A
57
67
  * `null` principal denotes a trusted, non-request caller (the scheduled
58
68
  * webhook poller). A missing `url` falls back to the built-in public host map
59
- * ({@link url}); a missing `basicAuth` means no Basic auth is sent.
69
+ * ({@link url}); missing `auth` means no Authorization header is sent.
60
70
  *
61
71
  * Memoization is keyed on the resolved output (see {@link createGetClient} and
62
72
  * {@link Tidx.createGetClient}), not the context, so a resolver may branch on
@@ -64,20 +74,28 @@ export type UrlResolver = (chainId: ChainId) => string | undefined
64
74
  * resolve to the same upstream share a client. Pass the result to
65
75
  * {@link getClient} (or let `getClient` resolve for you) to build a client.
66
76
  */
67
- export function resolve(
77
+ export function resolveRpc(
68
78
  rpc: getClient.Rpc | undefined,
69
- context: resolve.Context,
70
- ): resolve.Resolved {
79
+ context: resolveRpc.Context,
80
+ ): resolveRpc.Resolved {
71
81
  const config = typeof rpc === 'function' ? rpc(context) : rpc
82
+ const auth = Auth.resolveCredential({ chainId: context.chainId, value: config?.auth })
83
+ const publicZoneUrl = context.zone
84
+ ? (resolveUrl(config?.publicZoneUrl, context.chainId) ?? context.zone.rpcUrls.default.http[0])
85
+ : undefined
72
86
  return {
73
- basicAuth: config?.basicAuth,
87
+ ...auth,
88
+ ...(publicZoneUrl ? { publicZoneUrl } : {}),
89
+ ...(context.zone && config?.zoneHeaders ? { zoneHeaders: config.zoneHeaders } : {}),
74
90
  url:
75
- (typeof config?.url === 'function' ? config.url(context.chainId) : config?.url) ??
91
+ resolveUrl(config?.url, context.chainId) ??
92
+ context.zone?.rpcUrls['internal']?.http[0] ??
93
+ context.zone?.rpcUrls.default.http[0] ??
76
94
  url[context.chainId],
77
95
  }
78
96
  }
79
97
 
80
- export declare namespace resolve {
98
+ export declare namespace resolveRpc {
81
99
  /** RPC resolution context. */
82
100
  type Context = {
83
101
  /** Tempo chain id. */
@@ -88,12 +106,20 @@ export declare namespace resolve {
88
106
  * `type: 'public'` principal; authenticated requests a `type: 'api_key'` one.
89
107
  */
90
108
  principal: Auth.Principal | null
109
+ /** Zone chain selected for this request, when applicable. */
110
+ zone?: core_Chain | undefined
91
111
  }
92
112
 
93
113
  /** Resolved RPC config for a single request. */
94
114
  type Resolved = {
95
115
  /** Basic auth credentials, or undefined to send no Basic auth. */
96
116
  basicAuth?: string | undefined
117
+ /** Bearer auth credential, or undefined to send no Bearer auth. */
118
+ bearerAuth?: string | undefined
119
+ /** Public Zone RPC URL that accepts a caller-provided authorization token. */
120
+ publicZoneUrl?: string | undefined
121
+ /** Headers sent to Zone RPC upstreams. */
122
+ zoneHeaders?: ZoneHeaders | undefined
97
123
  /**
98
124
  * Resolved RPC URL, or `undefined` when neither a configured `rpc` nor the
99
125
  * built-in {@link url} map covers the chain (e.g. an unconfigured localnet).
@@ -104,13 +130,28 @@ export declare namespace resolve {
104
130
  }
105
131
 
106
132
  export function getClient(options: getClient.Options): getClient.ReturnType {
107
- const { chainId = defaultChainId, principal = null, rpc, zoneToken } = options
108
- const { basicAuth, url: rpcUrl } = resolve(rpc, { chainId, principal })
133
+ const { chainId = defaultChainId, principal = null, rpc, zone, zoneToken } = options
134
+ const { basicAuth, bearerAuth, publicZoneUrl, url, zoneHeaders } = resolveRpc(rpc, {
135
+ chainId,
136
+ principal,
137
+ zone,
138
+ })
139
+ const usePublicZoneUrl = Boolean(zoneToken && publicZoneUrl)
140
+ const rpcUrl = usePublicZoneUrl ? publicZoneUrl : url
141
+ // Public Zone endpoints authenticate with the caller's token, never internal RPC credentials.
142
+ const authorization = usePublicZoneUrl
143
+ ? undefined
144
+ : basicAuth
145
+ ? `Basic ${btoa(basicAuth)}`
146
+ : bearerAuth
147
+ ? `Bearer ${bearerAuth}`
148
+ : undefined
109
149
  const fetchOptions =
110
- basicAuth || zoneToken
150
+ authorization || zoneToken || zoneHeaders
111
151
  ? {
112
152
  headers: {
113
- ...(basicAuth ? { Authorization: `Basic ${btoa(basicAuth)}` } : {}),
153
+ ...(zoneHeaders ? Object.fromEntries(new Headers(zoneHeaders)) : {}),
154
+ ...(authorization ? { Authorization: authorization } : {}),
114
155
  ...(zoneToken ? { [ZoneRpcAuthentication.headerName]: zoneToken } : {}),
115
156
  },
116
157
  }
@@ -134,16 +175,26 @@ export function getClient(options: getClient.Options): getClient.ReturnType {
134
175
  export function createGetClient(options: createGetClient.Options = {}): createGetClient.ReturnType {
135
176
  const { defaultChainId: defaultChainId_option = defaultChainId, rpc } = options
136
177
  const clients = new Map<string, getClient.ReturnType>()
178
+ const zones = new Map((options.zones ?? []).map((zone) => [zone.id, zone]))
137
179
 
138
180
  return (chainId = defaultChainId_option, principal = null) => {
139
- const { basicAuth, url } = resolve(rpc, { chainId, principal })
140
- const cacheKey = JSON.stringify([url, basicAuth, chainId])
181
+ const { basicAuth, bearerAuth, url, zoneHeaders } = resolveRpc(rpc, {
182
+ chainId,
183
+ principal,
184
+ zone: zones.get(chainId),
185
+ })
186
+ const cacheKey = JSON.stringify([url, basicAuth, bearerAuth, zoneHeaders, chainId])
141
187
  const existing = clients.get(cacheKey)
142
188
  if (existing) return existing
143
189
 
144
190
  const client = getClient({
145
191
  chainId,
146
- rpc: { basicAuth, url: () => url },
192
+ rpc: {
193
+ auth: basicAuth ?? bearerAuth,
194
+ url: () => url,
195
+ ...(zoneHeaders ? { zoneHeaders } : {}),
196
+ },
197
+ zone: zones.get(chainId),
147
198
  })
148
199
  clients.set(cacheKey, client)
149
200
  return client
@@ -157,6 +208,8 @@ export declare namespace createGetClient {
157
208
  defaultChainId?: ChainId | undefined
158
209
  /** Tempo RPC options applied to every constructed client. */
159
210
  rpc?: getClient.Rpc | undefined
211
+ /** Zone chains whose internal RPC URLs serve as per-chain defaults. */
212
+ zones?: readonly core_Chain[] | undefined
160
213
  }
161
214
 
162
215
  /** Memoized Tempo client resolver. */
@@ -182,26 +235,72 @@ export declare namespace getClient {
182
235
  principal?: Auth.Principal | null | undefined
183
236
  /** Tempo RPC options. */
184
237
  rpc?: Rpc | undefined
238
+ /** Zone chain metadata used for RPC URL resolution. */
239
+ zone?: core_Chain | undefined
185
240
  /** Zone authorization token forwarded to the RPC node. */
186
241
  zoneToken?: string | undefined
187
242
  }
188
243
 
189
244
  /**
190
245
  * Tempo RPC options: either a static config, or a per-request resolver
191
- * function that receives a {@link resolve.Context} and returns the config to
246
+ * function that receives a {@link resolveRpc.Context} and returns the config to
192
247
  * use (e.g. routing anonymous callers to a public, no-auth RPC).
193
248
  */
194
249
  type Rpc =
195
250
  | {
196
- /** Basic auth credentials for RPC requests. */
197
- basicAuth?: string | undefined
251
+ /** Shared or per-chain RPC credentials. Values containing `:` use Basic auth; others use Bearer auth. */
252
+ auth?: Auth.ChainCredential | undefined
253
+ /** Resolves the public Zone RPC URL used with caller-provided authorization. */
254
+ publicZoneUrl?: UrlResolver | undefined
255
+ /** Headers sent to Zone RPC upstreams. */
256
+ zoneHeaders?: ZoneHeaders | undefined
198
257
  /** Resolves the RPC URL for a Tempo chain id. */
199
258
  url?: UrlResolver | undefined
200
259
  }
201
- | ((context: resolve.Context) => {
202
- /** Basic auth credentials for RPC requests, or undefined for none. */
203
- basicAuth?: string | undefined
260
+ | ((context: resolveRpc.Context) => {
261
+ /** Shared or per-chain RPC credentials, or undefined for none. */
262
+ auth?: Auth.ChainCredential | undefined
263
+ /** Public Zone RPC URL used with caller-provided authorization. */
264
+ publicZoneUrl?: string | undefined
265
+ /** Headers sent to Zone RPC upstreams. */
266
+ zoneHeaders?: ZoneHeaders | undefined
204
267
  /** RPC URL to use; falls back to the built-in public host when omitted. */
205
268
  url?: string | undefined
206
269
  })
207
270
  }
271
+
272
+ /** Resolves a shared or per-chain URL for one chain id. */
273
+ export function resolveUrl(value: UrlResolver | undefined, chainId: ChainId) {
274
+ if (typeof value === 'function') return value(chainId)
275
+ const urls = parseUrls(value)
276
+ if (!urls) return undefined
277
+ if (typeof urls === 'string') return urls
278
+ return urls[chainId]
279
+ }
280
+
281
+ function parseUrls(value: UrlResolver | undefined): Record<number, string> | string | undefined {
282
+ if (!value || typeof value === 'function') return undefined
283
+ const urls =
284
+ typeof value === 'string'
285
+ ? (() => {
286
+ try {
287
+ return JSON.parse(value) as unknown
288
+ } catch {
289
+ return value
290
+ }
291
+ })()
292
+ : value
293
+ if (typeof urls === 'string') return urls
294
+ if (
295
+ !urls ||
296
+ typeof urls !== 'object' ||
297
+ Array.isArray(urls) ||
298
+ Object.keys(urls).some((chainId) => {
299
+ const id = Number(chainId)
300
+ return !Number.isSafeInteger(id) || id <= 0 || String(id) !== chainId
301
+ }) ||
302
+ Object.values(urls).some((url) => typeof url !== 'string')
303
+ )
304
+ throw new Error('Expected a URL or a chain-id-to-URL JSON object.')
305
+ return urls as Record<number, string>
306
+ }
@@ -232,7 +232,7 @@ export const eventTypeHeader = 'tempo-event-type'
232
232
  */
233
233
  export function sign(options: sign.Options): string {
234
234
  const timestamp = options.timestamp ?? Math.floor(Date.now() / 1_000)
235
- const v1 = hmac(options.secret, `${timestamp}.${options.body}`)
235
+ const v1 = Signature.hmac(options.secret, `${timestamp}.${options.body}`)
236
236
  return `t=${timestamp},v1=${v1}`
237
237
  }
238
238
 
@@ -253,15 +253,15 @@ export declare namespace sign {
253
253
  * rejects signatures older than `tolerance` seconds (default 300).
254
254
  */
255
255
  export function verify(options: verify.Options): boolean {
256
- const parsed = parseSignature(options.signature)
256
+ const parsed = Signature.parse(options.signature)
257
257
  if (!parsed) return false
258
258
 
259
259
  const tolerance = options.tolerance ?? 300
260
260
  const now = options.now ?? Math.floor(Date.now() / 1_000)
261
261
  if (Math.abs(now - parsed.timestamp) > tolerance) return false
262
262
 
263
- const expected = hmac(options.secret, `${parsed.timestamp}.${options.body}`)
264
- return timingSafeEqual(expected, parsed.v1)
263
+ const expected = Signature.hmac(options.secret, `${parsed.timestamp}.${options.body}`)
264
+ return Signature.timingSafeEqual(expected, parsed.v1)
265
265
  }
266
266
 
267
267
  export declare namespace verify {
@@ -280,28 +280,30 @@ export declare namespace verify {
280
280
  }
281
281
  }
282
282
 
283
- function hmac(secret: string, message: string): string {
284
- return Hash.hmac256(Hex.fromString(secret), Hex.fromString(message)).slice(2)
285
- }
283
+ namespace Signature {
284
+ export function hmac(secret: string, message: string): string {
285
+ return Hash.hmac256(Hex.fromString(secret), Hex.fromString(message)).slice(2)
286
+ }
286
287
 
287
- function parseSignature(signature: string): { timestamp: number; v1: string } | null {
288
- let timestamp: number | undefined
289
- let v1: string | undefined
290
- for (const part of signature.split(',')) {
291
- const [key, value] = part.split('=', 2)
292
- if (key === 't' && value) timestamp = Number(value)
293
- else if (key === 'v1' && value) v1 = value
288
+ export function parse(signature: string): { timestamp: number; v1: string } | null {
289
+ let timestamp: number | undefined
290
+ let v1: string | undefined
291
+ for (const part of signature.split(',')) {
292
+ const [key, value] = part.split('=', 2)
293
+ if (key === 't' && value) timestamp = Number(value)
294
+ else if (key === 'v1' && value) v1 = value
295
+ }
296
+ if (timestamp === undefined || Number.isNaN(timestamp) || !v1) return null
297
+ return { timestamp, v1 }
294
298
  }
295
- if (timestamp === undefined || Number.isNaN(timestamp) || !v1) return null
296
- return { timestamp, v1 }
297
- }
298
299
 
299
- function timingSafeEqual(a: string, b: string): boolean {
300
- if (a.length !== b.length) return false
301
- let mismatch = 0
302
- for (let index = 0; index < a.length; index++)
303
- mismatch |= a.charCodeAt(index) ^ b.charCodeAt(index)
304
- return mismatch === 0
300
+ export function timingSafeEqual(left: string, right: string): boolean {
301
+ if (left.length !== right.length) return false
302
+ let mismatch = 0
303
+ for (let index = 0; index < left.length; index++)
304
+ mismatch |= left.charCodeAt(index) ^ right.charCodeAt(index)
305
+ return mismatch === 0
306
+ }
305
307
  }
306
308
 
307
309
  /** Thrown when a subscriber URL fails SSRF/format validation. */
@@ -1,5 +1,6 @@
1
1
  import { Webhooks } from 'tapimo'
2
2
  import * as TestApp from '../../test/App.js'
3
+ import * as Cursor from './Cursor.js'
3
4
 
4
5
  const apiKeyOwner = { orgId: 'org_1', type: 'api_key' } as const
5
6
  const mppOwner = { payer: 'did:pkh:eip155:1:0xabc', type: 'mpp' } as const
@@ -56,6 +57,42 @@ describe('createSubscription', () => {
56
57
  expect(read).toEqual(subscription)
57
58
  })
58
59
 
60
+ test('commits an initial poller cursor through both insert paths', async () => {
61
+ const db = TestApp.database()
62
+ const direct = await Webhooks.createSubscription(db, createInput(), {
63
+ startBlockNumber: 123,
64
+ })
65
+ const capped = await Webhooks.createSubscription(db, createInput({ owner: mppOwner }), {
66
+ maxPerOwner: 1,
67
+ startBlockNumber: 456,
68
+ })
69
+
70
+ expect(Cursor.decode((await Webhooks.getCursor(db, direct.id))!, ['int']))
71
+ .toMatchInlineSnapshot(`
72
+ [
73
+ 123,
74
+ ]
75
+ `)
76
+ expect(Cursor.decode((await Webhooks.getCursor(db, capped.id))!, ['int']))
77
+ .toMatchInlineSnapshot(`
78
+ [
79
+ 456,
80
+ ]
81
+ `)
82
+ })
83
+
84
+ test('rejects an invalid initial block number before persisting', async () => {
85
+ const db = TestApp.database()
86
+
87
+ for (const startBlockNumber of [-1, 1.5, Number.MAX_SAFE_INTEGER + 1])
88
+ await expect(
89
+ Webhooks.createSubscription(db, createInput(), { startBlockNumber }),
90
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
91
+ `[RangeError: startBlockNumber must be a non-negative safe integer.]`,
92
+ )
93
+ expect(await Webhooks.listSubscriptions(db, apiKeyOwner)).toEqual([])
94
+ })
95
+
59
96
  test('sets expiresAt from ttl for MPP-owned subscriptions', async () => {
60
97
  const db = TestApp.database()
61
98
  const subscription = await Webhooks.createSubscription(
@@ -301,6 +338,28 @@ describe('cursors', () => {
301
338
  await Webhooks.setCursor(db, created.id, '12345:7')
302
339
  expect(await Webhooks.getCursor(db, created.id)).toMatchInlineSnapshot(`"12345:7"`)
303
340
  })
341
+
342
+ test('atomically rejects a stale cursor write', async () => {
343
+ const db = TestApp.database()
344
+ const created = await Webhooks.createSubscription(db, createInput())
345
+ const a = Cursor.encode([100, 1])
346
+ const b = Cursor.encode([100, 2])
347
+ const results = await Promise.all([
348
+ Webhooks.compareAndSetCursor(db, {
349
+ cursor: a,
350
+ expectedCursor: null,
351
+ subscriptionId: created.id,
352
+ }),
353
+ Webhooks.compareAndSetCursor(db, {
354
+ cursor: b,
355
+ expectedCursor: null,
356
+ subscriptionId: created.id,
357
+ }),
358
+ ])
359
+
360
+ expect(results.toSorted((a, b) => Number(a) - Number(b))).toEqual([false, true])
361
+ expect([a, b]).toContain(await Webhooks.getCursor(db, created.id))
362
+ })
304
363
  })
305
364
 
306
365
  describe('recordSuccess / recordFailure', () => {
@@ -5,6 +5,7 @@ import type * as Db from '../db/Db.js'
5
5
  import * as WebhookDeliveries from '../db/tables/webhookDeliveries.js'
6
6
  import * as WebhookSubscriptions from '../db/tables/webhookSubscriptions.js'
7
7
  import type * as Metrics from '../Metrics.js'
8
+ import * as Cursor from './Cursor.js'
8
9
  import * as Id from './Id.js'
9
10
  import * as MetricSink from './MetricSink.js'
10
11
  import * as WebhookDestination from './WebhookDestination.js'
@@ -170,9 +171,18 @@ export async function createSubscription(
170
171
  options: createSubscription.Options = {},
171
172
  ): Promise<Subscription> {
172
173
  WebhookDestination.assertDestination(input.destination)
174
+ if (
175
+ options.startBlockNumber !== undefined &&
176
+ (!Number.isSafeInteger(options.startBlockNumber) || options.startBlockNumber < 0)
177
+ )
178
+ throw new RangeError('startBlockNumber must be a non-negative safe integer.')
173
179
 
174
180
  const now = (options.now ?? (() => new Date()))()
175
181
  const iso = now.toISOString()
182
+ // A one-field checkpoint records the live creation head without claiming it
183
+ // was scanned. The poller expands it using its confirmation depth.
184
+ const pollerCursor =
185
+ options.startBlockNumber === undefined ? undefined : Cursor.encode([options.startBlockNumber])
176
186
 
177
187
  const subscription: Subscription = {
178
188
  chainId: input.chainId,
@@ -196,9 +206,15 @@ export async function createSubscription(
196
206
  const inserted = await WebhookSubscriptions.insertWithinLimit(db, subscription, {
197
207
  maxPerOwner: options.maxPerOwner,
198
208
  now: iso,
209
+ ...(pollerCursor === undefined ? {} : { pollerCursor }),
199
210
  })
200
211
  if (!inserted) throw new LimitExceededError(options.maxPerOwner)
201
- } else await WebhookSubscriptions.insert(db, subscription)
212
+ } else
213
+ await WebhookSubscriptions.insert(
214
+ db,
215
+ subscription,
216
+ pollerCursor === undefined ? {} : { pollerCursor },
217
+ )
202
218
  return subscription
203
219
  }
204
220
 
@@ -209,6 +225,8 @@ export declare namespace createSubscription {
209
225
  maxPerOwner?: number | undefined
210
226
  /** Clock used for timestamps (injectable for tests). */
211
227
  now?: (() => Date) | undefined
228
+ /** Chain head observed immediately before the subscription becomes visible. */
229
+ startBlockNumber?: number | undefined
212
230
  }
213
231
  }
214
232
 
@@ -316,6 +334,19 @@ export async function getCursor(db: Db.Db, subscriptionId: string): Promise<stri
316
334
  return WebhookSubscriptions.getCursor(db, subscriptionId)
317
335
  }
318
336
 
337
+ /** Writes a cursor only when its stored value matches the expected cursor. */
338
+ export async function compareAndSetCursor(
339
+ db: Db.Db,
340
+ options: compareAndSetCursor.Options,
341
+ ): Promise<boolean> {
342
+ return WebhookSubscriptions.compareAndSetCursor(db, options)
343
+ }
344
+
345
+ export declare namespace compareAndSetCursor {
346
+ /** Options for {@link compareAndSetCursor}. */
347
+ type Options = WebhookSubscriptions.compareAndSetCursor.Options
348
+ }
349
+
319
350
  /** Writes a subscription's keyset cursor. */
320
351
  export async function setCursor(db: Db.Db, subscriptionId: string, cursor: string): Promise<void> {
321
352
  await WebhookSubscriptions.setCursor(db, subscriptionId, cursor)
@@ -790,18 +821,11 @@ export declare namespace ping {
790
821
  }
791
822
 
792
823
  function generateId(now: Date): string {
793
- // Zero-pad the epoch-ms so ids sort chronologically by string comparison
794
- // (mirroring delivery ids), letting listSubscriptions page newest-first; 15
795
- // digits leaves headroom well past the year 5138.
796
- const timestamp = now.getTime().toString().padStart(15, '0')
797
- return `wh_${timestamp}_${Id.random()}`
824
+ return Id.generateSortable('wh', now)
798
825
  }
799
826
 
800
827
  function generateDeliveryId(now: Date): string {
801
- // Zero-pad the epoch-ms so ids sort chronologically by string comparison; 15
802
- // digits leaves headroom well past the year 5138.
803
- const timestamp = now.getTime().toString().padStart(15, '0')
804
- return `whd_${timestamp}_${Id.random()}`
828
+ return Id.generateSortable('whd', now)
805
829
  }
806
830
 
807
831
  function generateSecret(): string {