tapimo 0.15.0 → 0.18.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 (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -1,5 +1,5 @@
1
1
  import { nanoid } from 'nanoid'
2
- import type Stripe from 'stripe'
2
+ import Stripe from 'stripe'
3
3
 
4
4
  import * as Runtime from '../../../test/runtime.js'
5
5
  import * as ApiKeys from '../../ApiKeys.js'
@@ -33,16 +33,23 @@ const input = {
33
33
  /** Inserts and finalizes one billable row; `seed` derives a unique sign payload. */
34
34
  async function finalized(
35
35
  db: Db.Db,
36
- options: { feeAmount: string; orgId?: string; seed: string },
36
+ options: {
37
+ chainId?: number
38
+ feeAmount: string
39
+ finalizedAt?: string
40
+ orgId?: string
41
+ seed: string
42
+ },
37
43
  ): Promise<SponsoredTransactions.Record> {
38
44
  const row = await SponsoredTransactions.upsert(db, {
39
45
  ...input,
46
+ ...(options.chainId === undefined ? {} : { chainId: options.chainId }),
40
47
  ...(options.orgId ? { orgId: options.orgId } : {}),
41
48
  signPayload: `0x${options.seed.repeat(32)}`,
42
49
  })
43
50
  await SponsoredTransactions.finalize(db, row.id, {
44
51
  feeAmount: options.feeAmount,
45
- finalizedAt: new Date().toISOString(),
52
+ finalizedAt: options.finalizedAt ?? new Date().toISOString(),
46
53
  })
47
54
  return row
48
55
  }
@@ -178,6 +185,7 @@ type StubSubscription = {
178
185
  * item/subscription creation are captured for assertions.
179
186
  */
180
187
  function stubStripe(options: {
188
+ createdAt?: number | undefined
181
189
  meterEvent?: ((params: { identifier: string }) => void) | undefined
182
190
  subscriptions?: readonly StubSubscription[] | undefined
183
191
  subscriptionsList?: (() => Promise<void>) | undefined
@@ -239,7 +247,7 @@ function stubStripe(options: {
239
247
  subscriptionItems: {
240
248
  create: async (params: { price: string; subscription: string }) => {
241
249
  itemsCreated.push(params)
242
- return { created: Math.floor(Date.now() / 1_000) }
250
+ return { created: options.createdAt ?? Math.floor(Date.now() / 1_000) }
243
251
  },
244
252
  },
245
253
  subscriptions: {
@@ -248,7 +256,7 @@ function stubStripe(options: {
248
256
  return {
249
257
  items: {
250
258
  data: params.items.map(({ price }) => ({
251
- created: Math.floor(Date.now() / 1_000),
259
+ created: options.createdAt ?? Math.floor(Date.now() / 1_000),
252
260
  price: { id: price },
253
261
  })),
254
262
  },
@@ -315,6 +323,89 @@ describe('status', () => {
315
323
  })
316
324
 
317
325
  describe('createReporter', () => {
326
+ test('retries an explicitly rejected Stripe event after its configuration is corrected', async () => {
327
+ const db = create()
328
+ await db.migrate()
329
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
330
+ const row = await finalized(db, { feeAmount: '100000', seed: '42' })
331
+ let reject = true
332
+ const { meterEvents, stripe } = stubStripe({
333
+ meterEvent: () => {
334
+ if (reject)
335
+ throw new Stripe.errors.StripeInvalidRequestError({
336
+ message: 'Meter configuration is invalid.',
337
+ statusCode: 400,
338
+ type: 'invalid_request_error',
339
+ })
340
+ },
341
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
342
+ })
343
+ const reporter = Billing.createReporter({ db, stripe })
344
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
345
+ expect((await SponsoredTransactions.get(db, row.id))?.meterEventFirstAttemptedAt).toBeNull()
346
+
347
+ reject = false
348
+ expect(await reporter.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
349
+ expect(meterEvents.map(({ identifier }) => identifier)).toStrictEqual([row.id])
350
+ await db.close()
351
+ })
352
+
353
+ test('stops an uncertain Stripe resend after its identifier window', async () => {
354
+ const db = create()
355
+ await db.migrate()
356
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
357
+ const row = await finalized(db, { feeAmount: '100000', seed: '41' })
358
+ await SponsoredTransactions.beginMeterEvent(
359
+ db,
360
+ row.id,
361
+ new Date(Date.now() - 24 * 60 * 60 * 1_000).toISOString(),
362
+ )
363
+
364
+ const { meterEvents, stripe } = stubStripe({
365
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
366
+ })
367
+ expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
368
+ failed: 1,
369
+ reported: 0,
370
+ skipped: 0,
371
+ })
372
+ expect(meterEvents).toHaveLength(0)
373
+ expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).toBeNull()
374
+ await db.close()
375
+ })
376
+
377
+ test('rotates unavailable sponsorships behind healthy rows', async () => {
378
+ const db = create()
379
+ await db.migrate()
380
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
381
+ const unavailable = await finalized(db, {
382
+ feeAmount: '100000',
383
+ finalizedAt: '2026-01-01T00:00:00.000Z',
384
+ orgId: 'org_missing',
385
+ seed: '39',
386
+ })
387
+ const healthy = await finalized(db, {
388
+ chainId: 421700099,
389
+ feeAmount: '250000',
390
+ finalizedAt: '2026-01-02T00:00:00.000Z',
391
+ seed: '40',
392
+ })
393
+
394
+ const { meterEvents, stripe } = stubStripe({
395
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
396
+ })
397
+ const reporter = Billing.createReporter({ batchSize: 1, db, stripe })
398
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
399
+ expect(await reporter.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
400
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
401
+ expect(meterEvents.map(({ identifier }) => identifier)).toStrictEqual([healthy.id])
402
+ expect(
403
+ (await SponsoredTransactions.get(db, unavailable.id))?.meterEventFirstAttemptedAt,
404
+ ).toBeNull()
405
+ expect((await SponsoredTransactions.get(db, unavailable.id))?.meterReportedAt).toBeNull()
406
+ await db.close()
407
+ })
408
+
318
409
  test('behavior: a poisoned row never stalls the queue', async () => {
319
410
  const db = create()
320
411
  await db.migrate()
@@ -387,6 +478,7 @@ describe('createReporter', () => {
387
478
  skipped: 0,
388
479
  })
389
480
  expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).not.toBeNull()
481
+ expect((await SponsoredTransactions.get(db, row.id))?.meterEventFirstAttemptedAt).not.toBeNull()
390
482
  expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
391
483
  failed: 0,
392
484
  reported: 0,
@@ -395,24 +487,35 @@ describe('createReporter', () => {
395
487
  await db.close()
396
488
  })
397
489
 
398
- test('behavior: canceled customers skip without meter events', async () => {
399
- const db = create()
400
- await db.migrate()
401
- await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
402
- await StripeCustomers.setStatus(db, 'org_1', 'canceled')
403
- const row = await finalized(db, { feeAmount: '100000', seed: '03' })
404
-
405
- const { meterEvents, stripe } = stubStripe({ subscriptions: [{ status: 'active' }] })
406
- expect(await Billing.createReporter({ db, stripe }).tick()).toStrictEqual({
407
- failed: 0,
408
- reported: 0,
409
- skipped: 1,
410
- })
411
- expect(meterEvents).toHaveLength(0)
412
- // Skipped rows still mark: nobody remains to invoice, ever.
413
- expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).not.toBeNull()
414
- await db.close()
415
- })
490
+ test.each(['canceled', 'missing'] as const)(
491
+ 'behavior: retains sponsorship liability for %s customers',
492
+ async (status) => {
493
+ const db = create()
494
+ await db.migrate()
495
+ if (status === 'canceled') {
496
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
497
+ await StripeCustomers.setStatus(db, 'org_1', 'canceled')
498
+ }
499
+ const row = await finalized(db, { feeAmount: '100000', seed: '03' })
500
+
501
+ // No provider call is needed until a billing identity is available.
502
+ const stripe = new Stripe('sk_test_unavailable_customer', { maxNetworkRetries: 0 })
503
+ const reporter = Billing.createReporter({ db, stripe })
504
+ expect(await reporter.tick()).toStrictEqual({
505
+ failed: 1,
506
+ reported: 0,
507
+ skipped: 0,
508
+ })
509
+ expect((await SponsoredTransactions.get(db, row.id))?.meterReportedAt).toBeNull()
510
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
511
+ expect(
512
+ (await SponsoredTransactions.listUnreported(db, { chainIds: [Viem.chainId.mainnet] })).map(
513
+ ({ id }) => id,
514
+ ),
515
+ ).toEqual([row.id])
516
+ await db.close()
517
+ },
518
+ )
416
519
 
417
520
  test('behavior: ensures the metered subscription once and stamps its backlog at now', async () => {
418
521
  const db = create()
@@ -779,7 +882,8 @@ describe('createRequestUsageReporter', () => {
779
882
 
780
883
  // Tick 1: fresh customer, initial seal of 5. The just-created item bills at
781
884
  // now (no backdate).
782
- const first = stubStripe({ subscriptions: [] })
885
+ const createdAt = Math.floor(now() / 1_000)
886
+ const first = stubStripe({ createdAt, subscriptions: [] })
783
887
  const reporter1 = Billing.createRequestUsageReporter({
784
888
  db,
785
889
  now,
@@ -788,9 +892,9 @@ describe('createRequestUsageReporter', () => {
788
892
  })
789
893
  expect(await reporter1.tick()).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
790
894
  expect(first.meterEvents).toEqual([
791
- { event_name: 'api_request_count', identifier: expect.any(String), payload: expect.objectContaining({ value: '5' }) }, // prettier-ignore
895
+ { event_name: 'api_request_count', identifier: expect.any(String), payload: expect.objectContaining({ value: '5' }), timestamp: createdAt }, // prettier-ignore
792
896
  ])
793
- expect(first.meterEvents[0]!.timestamp).toBeUndefined()
897
+ expect(first.meterEvents[0]!.timestamp).toBe(createdAt)
794
898
  expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(5) // prettier-ignore
795
899
 
796
900
  // Tick 2: count grows to 8; only the delta of 3 bills, backdated (item exists).
@@ -824,6 +928,30 @@ describe('createRequestUsageReporter', () => {
824
928
  await db.close()
825
929
  })
826
930
 
931
+ test('behavior: clamps initial backlog to an item provisioned by another reporter', async () => {
932
+ const db = create()
933
+ await db.migrate()
934
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
935
+ await StripeCustomers.setStatus(db, 'org_1', 'active')
936
+ const createdAt = Math.floor(Date.parse('2026-01-01T18:00:00.000Z') / 1_000)
937
+ const { meterEvents, stripe } = stubStripe({
938
+ subscriptions: [
939
+ { createdAt, items: ['feePayerSpend', 'routeSubsidy', 'apiRequests'], status: 'active' },
940
+ ],
941
+ })
942
+
943
+ expect(
944
+ await Billing.createRequestUsageReporter({
945
+ db,
946
+ now,
947
+ readCounts: async () => [{ bucketStart, count: 5, orgId: 'org_1' }],
948
+ stripe,
949
+ }).tick(),
950
+ ).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
951
+ expect(meterEvents[0]?.timestamp).toBe(createdAt)
952
+ await db.close()
953
+ })
954
+
827
955
  test('behavior: overlapping ticks cannot claim the same observed watermark twice', async () => {
828
956
  const db = create()
829
957
  await db.migrate()
@@ -941,6 +1069,7 @@ describe('createRequestUsageReporter', () => {
941
1069
  bucketStart,
942
1070
  deltaCount: 6,
943
1071
  environment: 'production',
1072
+ eventTimestamp: bucketStart,
944
1073
  identifier: 'rq_production_deadbeef0001_0_0',
945
1074
  orgId: 'org_1',
946
1075
  sequence: 0,
@@ -969,11 +1098,12 @@ describe('createRequestUsageReporter', () => {
969
1098
  await db.migrate()
970
1099
  await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
971
1100
  await StripeCustomers.setStatus(db, 'org_1', 'active')
1101
+ const createdAt = Math.floor(Date.parse('2026-01-01T18:00:00.000Z') / 1_000)
972
1102
  const { stripe } = stubStripe({
973
1103
  meterEvent() {
974
1104
  throw new Error('Stripe unavailable')
975
1105
  },
976
- subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
1106
+ subscriptions: [{ createdAt, items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
977
1107
  })
978
1108
  const reporter = Billing.createRequestUsageReporter({
979
1109
  db,
@@ -990,6 +1120,102 @@ describe('createRequestUsageReporter', () => {
990
1120
  oldestPendingAgeSeconds: expect.any(Number),
991
1121
  },
992
1122
  ])
1123
+
1124
+ const pending = (await RequestUsage.listPending(db, 'production'))[0]!
1125
+ await db.kysely
1126
+ .updateTable('request_usage_meter_events')
1127
+ .set({ eventTimestamp: pending.firstAttemptedAt })
1128
+ .where('identifier', '=', pending.identifier)
1129
+ .execute()
1130
+ const retryAt = new Date(pending.firstAttemptedAt).getTime() + 23 * 60 * 60 * 1_000
1131
+ const failedRetry = stubStripe({ subscriptions: [] })
1132
+ expect(
1133
+ await Billing.createRequestUsageReporter({
1134
+ db,
1135
+ now: () => retryAt,
1136
+ readCounts: async () => [],
1137
+ stripe: failedRetry.stripe,
1138
+ }).tick(),
1139
+ ).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
1140
+ expect(failedRetry.meterEvents).toHaveLength(0)
1141
+ expect(await RequestUsage.listPending(db, 'production')).toHaveLength(1)
1142
+ expect(await reporter.pending()).toMatchObject([{ count: 1, environment: 'production' }])
1143
+
1144
+ const retry = stubStripe({ subscriptions: [] })
1145
+ expect(
1146
+ await Billing.createRequestUsageReporter({
1147
+ db,
1148
+ now: () => retryAt + 24 * 60 * 60 * 1_000,
1149
+ readCounts: async () => [],
1150
+ stripe: retry.stripe,
1151
+ }).tick(),
1152
+ ).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
1153
+ expect(retry.meterEvents).toHaveLength(0)
1154
+ await db.close()
1155
+ })
1156
+
1157
+ test('behavior: stops retrying a legacy event after identifier uniqueness expires', async () => {
1158
+ const db = create()
1159
+ await db.migrate()
1160
+ await RequestUsage.insertPending(db, {
1161
+ bucketStart,
1162
+ deltaCount: 6,
1163
+ environment: 'production',
1164
+ eventTimestamp: new Date().toISOString(),
1165
+ identifier: 'rq_production_deadbeef0003_0_0',
1166
+ orgId: 'org_1',
1167
+ sequence: 0,
1168
+ stripeCustomerId: 'cus_1',
1169
+ })
1170
+ await db.kysely
1171
+ .updateTable('request_usage_meter_events')
1172
+ .set({ eventTimestamp: null })
1173
+ .where('identifier', '=', 'rq_production_deadbeef0003_0_0')
1174
+ .execute()
1175
+ const pending = (await RequestUsage.listPending(db, 'production'))[0]!
1176
+ expect(pending).not.toHaveProperty('eventTimestamp')
1177
+ const stripe = stubStripe({ subscriptions: [] })
1178
+ expect(
1179
+ await Billing.createRequestUsageReporter({
1180
+ db,
1181
+ now: () => new Date(pending.firstAttemptedAt).getTime() + 23 * 60 * 60 * 1_000,
1182
+ readCounts: async () => [],
1183
+ stripe: stripe.stripe,
1184
+ }).tick(),
1185
+ ).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
1186
+ expect(stripe.meterEvents).toHaveLength(0)
1187
+ expect(await RequestUsage.listPending(db, 'production')).toHaveLength(1)
1188
+ await db.close()
1189
+ })
1190
+
1191
+ test('behavior: settles a retry when Stripe confirms the identifier already exists', async () => {
1192
+ const db = create()
1193
+ await db.migrate()
1194
+ await RequestUsage.insertPending(db, {
1195
+ bucketStart,
1196
+ deltaCount: 6,
1197
+ environment: 'production',
1198
+ eventTimestamp: bucketStart,
1199
+ identifier: 'rq_production_deadbeef0002_0_0',
1200
+ orgId: 'org_1',
1201
+ sequence: 0,
1202
+ stripeCustomerId: 'cus_1',
1203
+ })
1204
+ const { stripe } = stubStripe({
1205
+ meterEvent({ identifier }) {
1206
+ throw new Error(`An event already exists with identifier ${identifier}.`)
1207
+ },
1208
+ subscriptions: [],
1209
+ })
1210
+ expect(
1211
+ await Billing.createRequestUsageReporter({
1212
+ db,
1213
+ now,
1214
+ readCounts: async () => [],
1215
+ stripe,
1216
+ }).tick(),
1217
+ ).toStrictEqual({ failed: 0, reported: 1, skipped: 0 })
1218
+ expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
993
1219
  await db.close()
994
1220
  })
995
1221
  })
@@ -13,7 +13,6 @@ import type * as Scope from '../../Scope.js'
13
13
  import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js'
14
14
  import type * as Store from '../../internal/Store.js'
15
15
  import * as StripeCustomers from '../../db/tables/stripeCustomers.js'
16
- import * as Viem from '../../internal/Viem.js'
17
16
 
18
17
  /**
19
18
  * Whether the organization has any active billing source — the production
@@ -449,12 +448,18 @@ export class DuplicateSubscriptionError extends Error {
449
448
  }
450
449
  }
451
450
 
451
+ /** Safe Stripe meter-event ingestion window below its documented 35-day limit. */
452
+ const meterEventIngestionWindowMs = 34 * 24 * 60 * 60 * 1_000
453
+
454
+ /** Safe retry window below Stripe's documented 24-hour identifier uniqueness period. */
455
+ const meterEventRetryWindowMs = 23 * 60 * 60 * 1_000
456
+
452
457
  /**
453
458
  * Creates the sponsorship and Route Subsidy metering job. Each tick reports
454
459
  * finalized usage, then marks each row after Stripe acknowledges it.
455
460
  */
456
461
  export function createReporter(options: createReporter.Options): createReporter.Reporter {
457
- const { batchSize = 100, chainIds = [Viem.chainId.mainnet], db, stripe } = options
462
+ const { batchSize = 100, db, stripe } = options
458
463
  return {
459
464
  async tick() {
460
465
  // Resolve per tick so Workers factories build a fresh Hyperdrive-pooled
@@ -462,7 +467,10 @@ export function createReporter(options: createReporter.Options): createReporter.
462
467
  const database = Db.get(db)
463
468
  const [depositSubsidies, sponsorships, transferSubsidies] = await Promise.all([
464
469
  RoutesDeposits.listUnreportedSubsidies(database, { limit: batchSize }),
465
- SponsoredTransactions.listUnreported(database, { chainIds, limit: batchSize }),
470
+ SponsoredTransactions.claimUnreported(database, {
471
+ attemptedAt: new Date().toISOString(),
472
+ limit: batchSize,
473
+ }),
466
474
  RoutesTransfers.listUnreportedSubsidies(database, { limit: batchSize }),
467
475
  ])
468
476
  const rows: UsageRow[] = [
@@ -532,7 +540,7 @@ export function createReporter(options: createReporter.Options): createReporter.
532
540
  // just-created meter item bills nothing before its start, so
533
541
  // its backlog stamps at now too.
534
542
  const finalizedAt = new Date(row.finalizedAt!).getTime()
535
- const recent = Date.now() - finalizedAt < 34 * 24 * 60 * 60 * 1000
543
+ const recent = Date.now() - finalizedAt < meterEventIngestionWindowMs
536
544
  const item = subscription.items[kind]
537
545
  const stamp =
538
546
  recent && item !== undefined && !item.created && finalizedAt >= item.createdAt * 1_000
@@ -540,6 +548,19 @@ export function createReporter(options: createReporter.Options): createReporter.
540
548
  meteredAt = new Date(
541
549
  (timestamp ?? Math.floor(Date.now() / 1_000)) * 1_000,
542
550
  ).toISOString()
551
+ if (row.source === 'sponsorship') {
552
+ const firstAttemptedAt = await SponsoredTransactions.beginMeterEvent(
553
+ database,
554
+ row.id,
555
+ new Date().toISOString(),
556
+ )
557
+ // Stripe only deduplicates identifiers for 24 hours. An older
558
+ // uncertain acknowledgment requires reconciliation before resend.
559
+ if (Date.now() - new Date(firstAttemptedAt).getTime() >= meterEventRetryWindowMs)
560
+ throw new Error(
561
+ `Stripe acknowledgement is ambiguous after the safe meter-event retry window for ${row.id}`,
562
+ )
563
+ }
543
564
  // The row id makes short-window retries idempotent on Stripe's
544
565
  // side; `meter_reported_at` is the durable exactly-once guard.
545
566
  try {
@@ -556,7 +577,20 @@ export function createReporter(options: createReporter.Options): createReporter.
556
577
  } catch (error) {
557
578
  // Stripe may persist the event before the Worker records its ack.
558
579
  // Its duplicate response proves this exact row was already metered.
559
- if (!isDuplicateMeterEvent(error, row.id)) throw error
580
+ if (!isDuplicateMeterEvent(error, row.id)) {
581
+ // An explicit client error rejects this submission. Only
582
+ // uncertain outcomes retain the first-send retry clock.
583
+ if (
584
+ row.source === 'sponsorship' &&
585
+ error instanceof Stripe.errors.StripeError &&
586
+ error.statusCode !== undefined &&
587
+ error.statusCode >= 400 &&
588
+ error.statusCode < 500 &&
589
+ error.statusCode !== 409
590
+ )
591
+ await SponsoredTransactions.clearRejectedMeterEventAttempt(database, row.id)
592
+ throw error
593
+ }
560
594
  }
561
595
  reported++
562
596
  } else if (row.source === 'routes-deposit' && row.orgId.startsWith('key_')) {
@@ -564,16 +598,11 @@ export function createReporter(options: createReporter.Options): createReporter.
564
598
  // Stripe customer. Provider subsidies on those routes are non-billable.
565
599
  meteredAt = new Date().toISOString()
566
600
  skipped++
567
- } else if (row.source !== 'sponsorship') {
568
- // Production Routes subsidies were authorized against active billing.
569
- // Keep the liability durable if that customer disappears before reporting.
570
- throw new Error(`Stripe customer unavailable for Routes subsidy ${row.id}`)
571
601
  } else {
572
- // Deleted orgs and Stripe-deleted (canceled) customers keep their
573
- // ledger rows; nobody remains to invoice.
574
- skipped++
602
+ // Missing billing identity cannot discharge a committed liability; preserve it for retry and alert through the scheduled-task failure counter.
603
+ throw new Error(`Stripe customer unavailable for ${row.source} ${row.id}`)
575
604
  }
576
- // Mark only after the Stripe ack (or a definitive no-customer skip).
605
+ // Mark only after the Stripe ack or the non-billable one-off-key exemption.
577
606
  const reportedAt = new Date().toISOString()
578
607
  if (row.source !== 'sponsorship') {
579
608
  if (!meteredAt) throw new Error(`Routes subsidy ${row.id} has no meter timestamp`)
@@ -635,10 +664,8 @@ function isDuplicateMeterEvent(error: unknown, identifier: string): boolean {
635
664
  export declare namespace createReporter {
636
665
  /** Options for {@link createReporter}. */
637
666
  type Options = {
638
- /** Maximum rows reported per source per tick. @default 100 */
667
+ /** Maximum rows attempted per source per tick. @default 100 */
639
668
  batchSize?: number | undefined
640
- /** Chains whose spend is metered. @default mainnet */
641
- chainIds?: readonly number[] | undefined
642
669
  /** Database holding sponsorship rows, or a factory resolved per tick (Workers/Hyperdrive). */
643
670
  db: Db.Source
644
671
  /** Stripe client used to send meter events. */
@@ -647,7 +674,7 @@ export declare namespace createReporter {
647
674
 
648
675
  /** A scheduled metering job. */
649
676
  type Reporter = {
650
- /** Runs one reporting pass. Failed rows stay unmarked and retry next tick. */
677
+ /** Runs one reporting pass. Failed rows stay unmarked and retry on later ticks. */
651
678
  tick(): Promise<{ failed: number; reported: number; skipped: number }>
652
679
  }
653
680
  }
@@ -729,14 +756,36 @@ export function createRequestUsageReporter(
729
756
  const blocked = new Set<string>()
730
757
  for (const event of await RequestUsage.listPending(database, environment)) {
731
758
  try {
732
- await client.billing.meterEvents.create({
733
- event_name: meters.apiRequests.eventName,
734
- identifier: event.identifier,
735
- payload: {
736
- stripe_customer_id: event.stripeCustomerId,
737
- value: String(event.deltaCount),
738
- },
739
- })
759
+ const eventTimestamp = event.eventTimestamp
760
+ if (
761
+ nowMs - new Date(event.firstAttemptedAt).getTime() >= meterEventRetryWindowMs ||
762
+ (eventTimestamp !== undefined &&
763
+ nowMs - new Date(eventTimestamp).getTime() >= meterEventIngestionWindowMs)
764
+ ) {
765
+ failed++
766
+ blocked.add(bucketKey(event.orgId, event.bucketStart))
767
+ await RequestUsage.markError(
768
+ database,
769
+ event.identifier,
770
+ 'Stripe acknowledgement is ambiguous after the safe meter-event retry window.',
771
+ )
772
+ continue
773
+ }
774
+ try {
775
+ await client.billing.meterEvents.create({
776
+ event_name: meters.apiRequests.eventName,
777
+ identifier: event.identifier,
778
+ payload: {
779
+ stripe_customer_id: event.stripeCustomerId,
780
+ value: String(event.deltaCount),
781
+ },
782
+ ...(eventTimestamp === undefined
783
+ ? {}
784
+ : { timestamp: Math.floor(new Date(eventTimestamp).getTime() / 1_000) }),
785
+ })
786
+ } catch (error) {
787
+ if (!isDuplicateMeterEvent(error, event.identifier)) throw error
788
+ }
740
789
  if (await RequestUsage.settle(database, event.identifier, new Date().toISOString()))
741
790
  reported++
742
791
  } catch (error) {
@@ -781,9 +830,17 @@ export function createRequestUsageReporter(
781
830
  // The observed watermark is stable for every tick claiming this delta.
782
831
  const sequence = watermark?.reportedCount ?? 0
783
832
  const identifier = usageIdentifier(environment, orgId, bucketStart, sequence)
833
+ const item = subscription.items.apiRequests
834
+ if (!item) throw new Error(`API request meter item unavailable for ${orgId}`)
835
+ // Meter events before the subscription item's creation are accepted
836
+ // but not invoiced, so clamp backlog to its billing eligibility window.
837
+ const eventTimestamp = new Date(
838
+ Math.max(new Date(bucketStart).getTime(), item.createdAt * 1_000),
839
+ ).toISOString()
784
840
  const inserted = await RequestUsage.insertPending(database, {
785
841
  ...key,
786
842
  deltaCount: delta,
843
+ eventTimestamp,
787
844
  identifier,
788
845
  sequence,
789
846
  stripeCustomerId: customer.stripeCustomerId,
@@ -791,14 +848,11 @@ export function createRequestUsageReporter(
791
848
  // A concurrent tick already claimed this delta; leave it to that run.
792
849
  if (!inserted) continue
793
850
 
794
- // Backdate to the bucket hour unless the item was just created (it
795
- // bills nothing before its start, so its backlog stamps at now).
796
- const stamp = !subscription.items.apiRequests?.created
797
851
  await client.billing.meterEvents.create({
798
852
  event_name: meters.apiRequests.eventName,
799
853
  identifier,
800
854
  payload: { stripe_customer_id: customer.stripeCustomerId, value: String(delta) },
801
- ...(stamp ? { timestamp: Math.floor(new Date(bucketStart).getTime() / 1000) } : {}),
855
+ timestamp: Math.floor(new Date(eventTimestamp).getTime() / 1_000),
802
856
  })
803
857
  if (await RequestUsage.settle(database, identifier, new Date().toISOString()))
804
858
  reported++
@@ -1010,7 +1010,7 @@ describe('keys', () => {
1010
1010
  {
1011
1011
  "error": {
1012
1012
  "code": "api_key_forbidden",
1013
- "message": "API key missing required scope",
1013
+ "message": "API key is missing required permissions: data:read. Use an API key with these scopes.",
1014
1014
  },
1015
1015
  }
1016
1016
  `)