tapimo 0.15.1 → 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 (709) 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 +893 -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 +70 -70
  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 +529 -76
  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 +157 -157
  45. package/dist/admin/index.d.ts +0 -1
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +0 -1
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/ui.generated.d.ts +1 -1
  50. package/dist/admin/ui.generated.d.ts.map +1 -1
  51. package/dist/admin/ui.generated.js +205 -201
  52. package/dist/admin/ui.generated.js.map +1 -1
  53. package/dist/analytics/Analytics.d.ts.map +1 -1
  54. package/dist/analytics/Analytics.js +65 -1
  55. package/dist/analytics/Analytics.js.map +1 -1
  56. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  57. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  58. package/dist/analytics/tables/requestEvents.js +58 -59
  59. package/dist/analytics/tables/requestEvents.js.map +1 -1
  60. package/dist/apps/data/App.d.ts +2709 -2670
  61. package/dist/apps/data/App.d.ts.map +1 -1
  62. package/dist/apps/data/routes/activities.d.ts +357 -357
  63. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  64. package/dist/apps/data/routes/activities.js +50 -0
  65. package/dist/apps/data/routes/activities.js.map +1 -1
  66. package/dist/apps/data/routes/addresses.d.ts +248 -248
  67. package/dist/apps/data/routes/balances.d.ts +22 -22
  68. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  69. package/dist/apps/data/routes/balances.js +5 -7
  70. package/dist/apps/data/routes/balances.js.map +1 -1
  71. package/dist/apps/data/routes/blocks.d.ts +125 -125
  72. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  73. package/dist/apps/data/routes/earn.d.ts +103 -12
  74. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  75. package/dist/apps/data/routes/earn.js +456 -220
  76. package/dist/apps/data/routes/earn.js.map +1 -1
  77. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  78. package/dist/apps/data/routes/exchanges.js +267 -97
  79. package/dist/apps/data/routes/exchanges.js.map +1 -1
  80. package/dist/apps/data/routes/fee-amm.d.ts +109 -127
  81. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.js +83 -54
  83. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +43 -43
  85. package/dist/apps/data/routes/receipts.d.ts +235 -235
  86. package/dist/apps/data/routes/rpc.d.ts +30 -30
  87. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  88. package/dist/apps/data/routes/tokens.js +11 -6
  89. package/dist/apps/data/routes/tokens.js.map +1 -1
  90. package/dist/apps/data/routes/transactions.d.ts +2 -0
  91. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  92. package/dist/apps/data/routes/transactions.js +30 -22
  93. package/dist/apps/data/routes/transactions.js.map +1 -1
  94. package/dist/apps/data/routes/transfers.d.ts +77 -77
  95. package/dist/apps/data/routes/valuation.d.ts +32 -32
  96. package/dist/apps/data/routes/verified-tokens.d.ts +86 -86
  97. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  98. package/dist/apps/data/routes/webhooks.js +1 -1
  99. package/dist/apps/data/routes/webhooks.js.map +1 -1
  100. package/dist/apps/data/routes/zones.d.ts +31 -31
  101. package/dist/apps/management/App.d.ts +2909 -2064
  102. package/dist/apps/management/App.d.ts.map +1 -1
  103. package/dist/apps/management/App.js +2 -0
  104. package/dist/apps/management/App.js.map +1 -1
  105. package/dist/apps/management/Billing.d.ts +2 -4
  106. package/dist/apps/management/Billing.d.ts.map +1 -1
  107. package/dist/apps/management/Billing.js +65 -26
  108. package/dist/apps/management/Billing.js.map +1 -1
  109. package/dist/apps/management/routes/api-keys.d.ts +257 -245
  110. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  111. package/dist/apps/management/routes/api-keys.js +70 -11
  112. package/dist/apps/management/routes/api-keys.js.map +1 -1
  113. package/dist/apps/management/routes/billing.d.ts +84 -84
  114. package/dist/apps/management/routes/cli.d.ts +912 -0
  115. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  116. package/dist/apps/management/routes/cli.js +416 -0
  117. package/dist/apps/management/routes/cli.js.map +1 -0
  118. package/dist/apps/management/routes/faucet.d.ts +8 -8
  119. package/dist/apps/management/routes/invitations.d.ts +138 -138
  120. package/dist/apps/management/routes/invite-links.d.ts +172 -172
  121. package/dist/apps/management/routes/members.d.ts +16 -16
  122. package/dist/apps/management/routes/orgs.d.ts +104 -104
  123. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  124. package/dist/apps/management/routes/orgs.js +8 -2
  125. package/dist/apps/management/routes/orgs.js.map +1 -1
  126. package/dist/apps/management/routes/projects.d.ts +125 -125
  127. package/dist/apps/management/routes/usage.d.ts +8 -8
  128. package/dist/apps/management/routes/verified-token-requests.d.ts +86 -86
  129. package/dist/apps/management/routes/webhooks.d.ts +485 -485
  130. package/dist/apps/mpp/App.d.ts +44 -44
  131. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  132. package/dist/apps/mpp/internal/Policy.js +4 -2
  133. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  134. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  135. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  136. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  137. package/dist/apps/relay/App.d.ts +8 -0
  138. package/dist/apps/relay/App.d.ts.map +1 -1
  139. package/dist/apps/relay/App.js +16 -4
  140. package/dist/apps/relay/App.js.map +1 -1
  141. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  142. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  143. package/dist/apps/relay/Sponsorships.js +71 -60
  144. package/dist/apps/relay/Sponsorships.js.map +1 -1
  145. package/dist/apps/routes/Access.d.ts +53 -0
  146. package/dist/apps/routes/Access.d.ts.map +1 -1
  147. package/dist/apps/routes/Access.js +121 -0
  148. package/dist/apps/routes/Access.js.map +1 -1
  149. package/dist/apps/routes/App.d.ts +397 -158
  150. package/dist/apps/routes/App.d.ts.map +1 -1
  151. package/dist/apps/routes/App.js.map +1 -1
  152. package/dist/apps/routes/routes/chains.d.ts +25 -25
  153. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  154. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  155. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  156. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  157. package/dist/apps/routes/routes/quotes.d.ts +171 -81
  158. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  159. package/dist/apps/routes/routes/quotes.js +101 -27
  160. package/dist/apps/routes/routes/quotes.js.map +1 -1
  161. package/dist/apps/routes/routes/transfers.d.ts +532 -480
  162. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/transfers.js +182 -37
  164. package/dist/apps/routes/routes/transfers.js.map +1 -1
  165. package/dist/cli/ApiKeys.d.ts +120 -0
  166. package/dist/cli/ApiKeys.d.ts.map +1 -0
  167. package/dist/cli/ApiKeys.js +138 -0
  168. package/dist/cli/ApiKeys.js.map +1 -0
  169. package/dist/cli/Cli.d.ts +92 -34
  170. package/dist/cli/Cli.d.ts.map +1 -1
  171. package/dist/cli/Cli.js +188 -11
  172. package/dist/cli/Cli.js.map +1 -1
  173. package/dist/cli/Credentials.d.ts +95 -0
  174. package/dist/cli/Credentials.d.ts.map +1 -0
  175. package/dist/cli/Credentials.js +110 -0
  176. package/dist/cli/Credentials.js.map +1 -0
  177. package/dist/cli/Spec.d.ts +59 -0
  178. package/dist/cli/Spec.d.ts.map +1 -0
  179. package/dist/cli/Spec.js +77 -0
  180. package/dist/cli/Spec.js.map +1 -0
  181. package/dist/cli/bin.js +5 -1
  182. package/dist/cli/bin.js.map +1 -1
  183. package/dist/cli/commands/admin.d.ts +5 -5
  184. package/dist/cli/commands/admin.d.ts.map +1 -1
  185. package/dist/cli/commands/auth.d.ts +73 -0
  186. package/dist/cli/commands/auth.d.ts.map +1 -0
  187. package/dist/cli/commands/auth.js +204 -0
  188. package/dist/cli/commands/auth.js.map +1 -0
  189. package/dist/cli/commands/keys.d.ts +17 -0
  190. package/dist/cli/commands/keys.d.ts.map +1 -0
  191. package/dist/cli/commands/keys.js +109 -0
  192. package/dist/cli/commands/keys.js.map +1 -0
  193. package/dist/cloudflare.d.ts +27 -2
  194. package/dist/cloudflare.d.ts.map +1 -1
  195. package/dist/cloudflare.js +144 -17
  196. package/dist/cloudflare.js.map +1 -1
  197. package/dist/db/Db.d.ts +23 -0
  198. package/dist/db/Db.d.ts.map +1 -1
  199. package/dist/db/Db.js +413 -1
  200. package/dist/db/Db.js.map +1 -1
  201. package/dist/db/Schema.d.ts +44 -1
  202. package/dist/db/Schema.d.ts.map +1 -1
  203. package/dist/db/Schema.js +56 -3
  204. package/dist/db/Schema.js.map +1 -1
  205. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  206. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  207. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  208. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  209. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  210. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  211. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  212. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  213. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  214. package/dist/db/tables/authAccounts.js +1 -0
  215. package/dist/db/tables/authAccounts.js.map +1 -1
  216. package/dist/db/tables/earnVaults.d.ts +5 -1
  217. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  218. package/dist/db/tables/earnVaults.js +12 -1
  219. package/dist/db/tables/earnVaults.js.map +1 -1
  220. package/dist/db/tables/organizations.d.ts +4 -2
  221. package/dist/db/tables/organizations.d.ts.map +1 -1
  222. package/dist/db/tables/organizations.js +8 -34
  223. package/dist/db/tables/organizations.js.map +1 -1
  224. package/dist/db/tables/requestUsage.d.ts +5 -1
  225. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  226. package/dist/db/tables/requestUsage.js +10 -2
  227. package/dist/db/tables/requestUsage.js.map +1 -1
  228. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  229. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  230. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  231. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  232. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  233. package/dist/db/tables/rewardRuns.js +4 -0
  234. package/dist/db/tables/rewardRuns.js.map +1 -1
  235. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  236. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  237. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  238. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  239. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  240. package/dist/db/tables/routesDepositAddresses.js +84 -31
  241. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  242. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  243. package/dist/db/tables/routesDeposits.js +31 -21
  244. package/dist/db/tables/routesDeposits.js.map +1 -1
  245. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  246. package/dist/db/tables/routesIdempotency.js +2 -0
  247. package/dist/db/tables/routesIdempotency.js.map +1 -1
  248. package/dist/db/tables/routesPolicies.d.ts +58 -0
  249. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  250. package/dist/db/tables/routesPolicies.js +198 -0
  251. package/dist/db/tables/routesPolicies.js.map +1 -0
  252. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  253. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  254. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  255. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  256. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  257. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  258. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  259. package/dist/db/tables/routesTransfers.d.ts +26 -1
  260. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  261. package/dist/db/tables/routesTransfers.js +36 -6
  262. package/dist/db/tables/routesTransfers.js.map +1 -1
  263. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  264. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js +144 -33
  266. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  267. package/dist/db/tables/users.d.ts +2 -0
  268. package/dist/db/tables/users.d.ts.map +1 -1
  269. package/dist/db/tables/users.js +11 -0
  270. package/dist/db/tables/users.js.map +1 -1
  271. package/dist/handlers/internal/multisig.d.ts +1 -1
  272. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  273. package/dist/handlers/internal/multisig.js +3 -2
  274. package/dist/handlers/internal/multisig.js.map +1 -1
  275. package/dist/handlers/relay.d.ts +2 -0
  276. package/dist/handlers/relay.d.ts.map +1 -1
  277. package/dist/handlers/relay.js +34 -15
  278. package/dist/handlers/relay.js.map +1 -1
  279. package/dist/internal/Auth.d.ts +57 -6
  280. package/dist/internal/Auth.d.ts.map +1 -1
  281. package/dist/internal/Auth.js +182 -78
  282. package/dist/internal/Auth.js.map +1 -1
  283. package/dist/internal/BetterAuth.d.ts +22 -0
  284. package/dist/internal/BetterAuth.d.ts.map +1 -1
  285. package/dist/internal/BetterAuth.js +17 -14
  286. package/dist/internal/BetterAuth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts +5 -0
  288. package/dist/internal/Cache.d.ts.map +1 -1
  289. package/dist/internal/Cache.js +3 -1
  290. package/dist/internal/Cache.js.map +1 -1
  291. package/dist/internal/CliAuth.d.ts +243 -0
  292. package/dist/internal/CliAuth.d.ts.map +1 -0
  293. package/dist/internal/CliAuth.js +249 -0
  294. package/dist/internal/CliAuth.js.map +1 -0
  295. package/dist/internal/EarnSharePrices.d.ts +1 -1
  296. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  297. package/dist/internal/EarnSharePrices.js +7 -3
  298. package/dist/internal/EarnSharePrices.js.map +1 -1
  299. package/dist/internal/EarnVaults.d.ts +47 -0
  300. package/dist/internal/EarnVaults.d.ts.map +1 -1
  301. package/dist/internal/EarnVaults.js +188 -4
  302. package/dist/internal/EarnVaults.js.map +1 -1
  303. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  304. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  305. package/dist/internal/EarnWithdrawals.js +189 -0
  306. package/dist/internal/EarnWithdrawals.js.map +1 -0
  307. package/dist/internal/ExecutionContext.d.ts +21 -0
  308. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  309. package/dist/internal/ExecutionContext.js +16 -0
  310. package/dist/internal/ExecutionContext.js.map +1 -0
  311. package/dist/internal/Log.d.ts +7 -3
  312. package/dist/internal/Log.d.ts.map +1 -1
  313. package/dist/internal/Log.js +163 -130
  314. package/dist/internal/Log.js.map +1 -1
  315. package/dist/internal/MetricSink.d.ts.map +1 -1
  316. package/dist/internal/MetricSink.js +26 -1
  317. package/dist/internal/MetricSink.js.map +1 -1
  318. package/dist/internal/RateLimit.d.ts +67 -0
  319. package/dist/internal/RateLimit.d.ts.map +1 -1
  320. package/dist/internal/RateLimit.js +174 -27
  321. package/dist/internal/RateLimit.js.map +1 -1
  322. package/dist/internal/Store.d.ts +6 -0
  323. package/dist/internal/Store.d.ts.map +1 -1
  324. package/dist/internal/Store.js +4 -5
  325. package/dist/internal/Store.js.map +1 -1
  326. package/dist/internal/Timing.d.ts +6 -0
  327. package/dist/internal/Timing.d.ts.map +1 -1
  328. package/dist/internal/Timing.js +21 -1
  329. package/dist/internal/Timing.js.map +1 -1
  330. package/dist/internal/Tron.d.ts +124 -0
  331. package/dist/internal/Tron.d.ts.map +1 -0
  332. package/dist/internal/Tron.js +202 -0
  333. package/dist/internal/Tron.js.map +1 -0
  334. package/dist/internal/Viem.d.ts +4 -0
  335. package/dist/internal/Viem.d.ts.map +1 -1
  336. package/dist/internal/Viem.js +25 -6
  337. package/dist/internal/Viem.js.map +1 -1
  338. package/dist/internal/rewards/Read.d.ts +2 -2
  339. package/dist/internal/rewards/Read.d.ts.map +1 -1
  340. package/dist/internal/rewards/Read.js +11 -2
  341. package/dist/internal/rewards/Read.js.map +1 -1
  342. package/dist/internal/routes/Action.d.ts +27 -0
  343. package/dist/internal/routes/Action.d.ts.map +1 -1
  344. package/dist/internal/routes/Action.js +49 -1
  345. package/dist/internal/routes/Action.js.map +1 -1
  346. package/dist/internal/routes/Chain.d.ts +2 -0
  347. package/dist/internal/routes/Chain.d.ts.map +1 -1
  348. package/dist/internal/routes/Chain.js +4 -0
  349. package/dist/internal/routes/Chain.js.map +1 -1
  350. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  351. package/dist/internal/routes/DepositAddress.js +5 -0
  352. package/dist/internal/routes/DepositAddress.js.map +1 -1
  353. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  354. package/dist/internal/routes/Evidence.js +6 -2
  355. package/dist/internal/routes/Evidence.js.map +1 -1
  356. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  357. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  358. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  359. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  360. package/dist/internal/routes/Policy.d.ts +161 -0
  361. package/dist/internal/routes/Policy.d.ts.map +1 -0
  362. package/dist/internal/routes/Policy.js +249 -0
  363. package/dist/internal/routes/Policy.js.map +1 -0
  364. package/dist/internal/routes/Provider.d.ts +66 -3
  365. package/dist/internal/routes/Provider.d.ts.map +1 -1
  366. package/dist/internal/routes/Provider.js +106 -27
  367. package/dist/internal/routes/Provider.js.map +1 -1
  368. package/dist/internal/routes/Quota.d.ts +57 -0
  369. package/dist/internal/routes/Quota.d.ts.map +1 -0
  370. package/dist/internal/routes/Quota.js +144 -0
  371. package/dist/internal/routes/Quota.js.map +1 -0
  372. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  373. package/dist/internal/routes/Reconciliation.js +163 -47
  374. package/dist/internal/routes/Reconciliation.js.map +1 -1
  375. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  376. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  377. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  378. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  379. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  380. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  381. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  382. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  383. package/dist/internal/routes/Subsidy.d.ts +2 -2
  384. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  385. package/dist/internal/routes/Subsidy.js +2 -2
  386. package/dist/internal/routes/Subsidy.js.map +1 -1
  387. package/dist/internal/routes/Transfer.d.ts +229 -1
  388. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  389. package/dist/internal/routes/Transfer.js +644 -7
  390. package/dist/internal/routes/Transfer.js.map +1 -1
  391. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  392. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  393. package/dist/internal/routes/TransferReconciliation.js +83 -159
  394. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  395. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  396. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  397. package/dist/internal/routes/TransferSettlement.js +2 -0
  398. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  399. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  400. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  401. package/dist/internal/routes/TransferSubsidy.js +64 -5
  402. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  403. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  404. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  405. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  406. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  407. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  408. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  409. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  410. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  411. package/dist/internal/routes/index.d.ts +3 -0
  412. package/dist/internal/routes/index.d.ts.map +1 -1
  413. package/dist/internal/routes/index.js +3 -0
  414. package/dist/internal/routes/index.js.map +1 -1
  415. package/dist/internal/routes/providers/across.d.ts +3 -0
  416. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  417. package/dist/internal/routes/providers/across.js +11 -0
  418. package/dist/internal/routes/providers/across.js.map +1 -1
  419. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  420. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  421. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  422. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  423. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  424. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  425. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  426. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  427. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  428. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  429. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  430. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  431. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  432. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  434. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  435. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  436. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/propAmm.js +524 -0
  438. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  439. package/dist/internal/routes/providers/relay.d.ts +3 -0
  440. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  441. package/dist/internal/routes/providers/relay.js +352 -41
  442. package/dist/internal/routes/providers/relay.js.map +1 -1
  443. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  444. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  445. package/dist/internal/routes/providers/rhino.js +11 -0
  446. package/dist/internal/routes/providers/rhino.js.map +1 -1
  447. package/dist/internal/routes/providers/squid.d.ts +3 -0
  448. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  449. package/dist/internal/routes/providers/squid.js +19 -0
  450. package/dist/internal/routes/providers/squid.js.map +1 -1
  451. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  452. package/dist/internal/routes/providers/stargate.js +22 -9
  453. package/dist/internal/routes/providers/stargate.js.map +1 -1
  454. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  455. package/dist/internal/routes/providers/symbiosis.js +13 -17
  456. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  457. package/dist/providers/index.d.ts +14 -0
  458. package/dist/providers/index.d.ts.map +1 -1
  459. package/dist/providers/index.js +6 -0
  460. package/dist/providers/index.js.map +1 -1
  461. package/package.json +16 -6
  462. package/src/ApiKey.ts +7 -3
  463. package/src/ApiKeys.test.ts +652 -8
  464. package/src/ApiKeys.ts +191 -11
  465. package/src/App.test.ts +405 -18
  466. package/src/App.ts +51 -15
  467. package/src/Client.test-d.ts +157 -10
  468. package/src/Client.test.ts +4 -4
  469. package/src/Scope.ts +1 -2
  470. package/src/admin/App.ts +11 -5
  471. package/src/admin/apps/api-keys.test.ts +98 -2
  472. package/src/admin/apps/api-keys.ts +21 -12
  473. package/src/admin/apps/earn-vaults.test.ts +76 -7
  474. package/src/admin/apps/earn-vaults.ts +47 -8
  475. package/src/admin/apps/organizations.test.ts +147 -31
  476. package/src/admin/apps/organizations.ts +5 -4
  477. package/src/admin/apps/route-policies.test.ts +220 -0
  478. package/src/admin/apps/route-policies.ts +322 -0
  479. package/src/admin/apps/routes-support.test.ts +107 -2
  480. package/src/admin/apps/routes-support.ts +43 -3
  481. package/src/admin/apps/routes.test.ts +150 -0
  482. package/src/admin/apps/routes.ts +97 -1
  483. package/src/admin/apps/scopes.test.ts +1 -1
  484. package/src/admin/index.ts +0 -1
  485. package/src/admin/ui/plugin.ts +2 -1
  486. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  487. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  488. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  489. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  490. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  491. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  492. package/src/admin/ui/src/lib/routes.ts +34 -0
  493. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  494. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  495. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  496. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  497. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  498. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  499. package/src/admin/ui/src/routes/organizations.tsx +1 -0
  500. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  501. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  502. package/src/admin/ui/src/routes/routes.tsx +85 -2
  503. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  504. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  505. package/src/admin/ui/src/routes/verified-tokens.tsx +1 -0
  506. package/src/admin/ui.generated.ts +258 -202
  507. package/src/analytics/Analytics.test.ts +4 -50
  508. package/src/analytics/Analytics.ts +65 -1
  509. package/src/analytics/tables/requestEvents.test.ts +402 -1
  510. package/src/analytics/tables/requestEvents.ts +62 -93
  511. package/src/apps/data/routes/activities.test.ts +315 -14
  512. package/src/apps/data/routes/activities.ts +60 -0
  513. package/src/apps/data/routes/balances.ts +5 -7
  514. package/src/apps/data/routes/earn.bench.ts +18 -0
  515. package/src/apps/data/routes/earn.local.test.ts +507 -0
  516. package/src/apps/data/routes/earn.test.ts +405 -127
  517. package/src/apps/data/routes/earn.ts +660 -270
  518. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  519. package/src/apps/data/routes/exchanges.test.ts +166 -2
  520. package/src/apps/data/routes/exchanges.ts +308 -101
  521. package/src/apps/data/routes/fee-amm.test.ts +134 -2
  522. package/src/apps/data/routes/fee-amm.ts +122 -60
  523. package/src/apps/data/routes/receipts.test.ts +21 -18
  524. package/src/apps/data/routes/rpc.test.ts +2 -2
  525. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  526. package/src/apps/data/routes/tokens.test.ts +4 -4
  527. package/src/apps/data/routes/tokens.ts +11 -6
  528. package/src/apps/data/routes/transactions.test.ts +29 -0
  529. package/src/apps/data/routes/transactions.ts +33 -22
  530. package/src/apps/data/routes/webhooks.test.ts +12 -3
  531. package/src/apps/data/routes/webhooks.ts +2 -1
  532. package/src/apps/management/App.ts +4 -0
  533. package/src/apps/management/Billing.test.ts +253 -27
  534. package/src/apps/management/Billing.ts +83 -29
  535. package/src/apps/management/routes/api-keys.test.ts +1 -1
  536. package/src/apps/management/routes/api-keys.ts +85 -11
  537. package/src/apps/management/routes/billing.test.ts +68 -4
  538. package/src/apps/management/routes/cli.test.ts +370 -0
  539. package/src/apps/management/routes/cli.ts +533 -0
  540. package/src/apps/management/routes/me.test.ts +14 -4
  541. package/src/apps/management/routes/orgs.test.ts +108 -4
  542. package/src/apps/management/routes/orgs.ts +7 -2
  543. package/src/apps/management/routes/usage.test.ts +2 -2
  544. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  545. package/src/apps/mpp/internal/Policy.ts +6 -2
  546. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  547. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  548. package/src/apps/relay/App.test.ts +85 -1
  549. package/src/apps/relay/App.ts +28 -4
  550. package/src/apps/relay/Sponsorships.test.ts +97 -1
  551. package/src/apps/relay/Sponsorships.ts +77 -66
  552. package/src/apps/routes/Access.test.ts +319 -0
  553. package/src/apps/routes/Access.ts +147 -0
  554. package/src/apps/routes/App.ts +10 -0
  555. package/src/apps/routes/routes/chains.test.ts +3 -2
  556. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  557. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  558. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  559. package/src/apps/routes/routes/quotes.test.ts +81 -8
  560. package/src/apps/routes/routes/quotes.ts +109 -27
  561. package/src/apps/routes/routes/transfers.test.ts +252 -15
  562. package/src/apps/routes/routes/transfers.ts +212 -33
  563. package/src/cli/ApiKeys.test.ts +265 -0
  564. package/src/cli/ApiKeys.ts +189 -0
  565. package/src/cli/Cli.test.ts +188 -0
  566. package/src/cli/Cli.ts +280 -12
  567. package/src/cli/Credentials.test.ts +122 -0
  568. package/src/cli/Credentials.ts +144 -0
  569. package/src/cli/Spec.test.ts +133 -0
  570. package/src/cli/Spec.ts +132 -0
  571. package/src/cli/bin.test.ts +49 -0
  572. package/src/cli/bin.ts +5 -1
  573. package/src/cli/commands/auth.test.ts +138 -0
  574. package/src/cli/commands/auth.ts +254 -0
  575. package/src/cli/commands/keys.test.ts +68 -0
  576. package/src/cli/commands/keys.ts +125 -0
  577. package/src/cloudflare.ts +184 -36
  578. package/src/db/Db.test.ts +877 -0
  579. package/src/db/Db.ts +498 -1
  580. package/src/db/Schema.ts +75 -4
  581. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  582. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  583. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  584. package/src/db/tables/authAccounts.test.ts +30 -0
  585. package/src/db/tables/authAccounts.ts +1 -0
  586. package/src/db/tables/earnVaults.test.ts +34 -0
  587. package/src/db/tables/earnVaults.ts +17 -2
  588. package/src/db/tables/organizations.test.ts +148 -84
  589. package/src/db/tables/organizations.ts +11 -43
  590. package/src/db/tables/requestUsage.ts +13 -2
  591. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  592. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  593. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  594. package/src/db/tables/rewardRuns.ts +4 -0
  595. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  596. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  597. package/src/db/tables/routesDepositAddresses.ts +118 -34
  598. package/src/db/tables/routesDeposits.test.ts +66 -5
  599. package/src/db/tables/routesDeposits.ts +47 -26
  600. package/src/db/tables/routesIdempotency.test.ts +80 -0
  601. package/src/db/tables/routesIdempotency.ts +2 -0
  602. package/src/db/tables/routesPolicies.test.ts +143 -0
  603. package/src/db/tables/routesPolicies.ts +251 -0
  604. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  605. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  606. package/src/db/tables/routesTransfers.test.ts +183 -2
  607. package/src/db/tables/routesTransfers.ts +65 -6
  608. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  609. package/src/db/tables/sponsoredTransactions.ts +182 -38
  610. package/src/db/tables/users.test.ts +51 -0
  611. package/src/db/tables/users.ts +12 -0
  612. package/src/handlers/internal/multisig.store.test.ts +120 -0
  613. package/src/handlers/internal/multisig.test.ts +389 -0
  614. package/src/handlers/internal/multisig.ts +13 -10
  615. package/src/handlers/relay.test.ts +259 -83
  616. package/src/handlers/relay.ts +36 -17
  617. package/src/internal/Auth.test.ts +291 -8
  618. package/src/internal/Auth.ts +227 -96
  619. package/src/internal/BetterAuth.test.ts +58 -22
  620. package/src/internal/BetterAuth.ts +23 -17
  621. package/src/internal/Cache.ts +3 -1
  622. package/src/internal/CliAuth.test.ts +279 -0
  623. package/src/internal/CliAuth.ts +319 -0
  624. package/src/internal/EarnSharePrices.test.ts +25 -0
  625. package/src/internal/EarnSharePrices.ts +9 -2
  626. package/src/internal/EarnVaults.test.ts +67 -0
  627. package/src/internal/EarnVaults.ts +299 -4
  628. package/src/internal/EarnWithdrawals.test.ts +315 -0
  629. package/src/internal/EarnWithdrawals.ts +266 -0
  630. package/src/internal/ExecutionContext.ts +31 -0
  631. package/src/internal/Log.test.ts +210 -0
  632. package/src/internal/Log.ts +180 -142
  633. package/src/internal/MetricSink.test.ts +190 -15
  634. package/src/internal/MetricSink.ts +27 -1
  635. package/src/internal/RateLimit.test.ts +144 -8
  636. package/src/internal/RateLimit.ts +254 -26
  637. package/src/internal/Store.ts +4 -5
  638. package/src/internal/Timing.test.ts +32 -0
  639. package/src/internal/Timing.ts +20 -1
  640. package/src/internal/Tron.test-d.ts +22 -0
  641. package/src/internal/Tron.test.ts +94 -0
  642. package/src/internal/Tron.ts +289 -0
  643. package/src/internal/Viem.rpc.test.ts +76 -0
  644. package/src/internal/Viem.ts +29 -6
  645. package/src/internal/rewards/Read.test.ts +109 -0
  646. package/src/internal/rewards/Read.ts +13 -4
  647. package/src/internal/routes/Action.test.ts +70 -0
  648. package/src/internal/routes/Action.ts +76 -1
  649. package/src/internal/routes/Chain.test.ts +18 -0
  650. package/src/internal/routes/Chain.ts +5 -0
  651. package/src/internal/routes/DepositAddress.ts +5 -0
  652. package/src/internal/routes/Evidence.test.ts +64 -0
  653. package/src/internal/routes/Evidence.ts +11 -3
  654. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  655. package/src/internal/routes/Policy.test.ts +316 -0
  656. package/src/internal/routes/Policy.ts +399 -0
  657. package/src/internal/routes/Provider.test.ts +103 -2
  658. package/src/internal/routes/Provider.ts +149 -27
  659. package/src/internal/routes/Quota.test.ts +149 -0
  660. package/src/internal/routes/Quota.ts +226 -0
  661. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  662. package/src/internal/routes/Reconciliation.test.ts +371 -13
  663. package/src/internal/routes/Reconciliation.ts +193 -42
  664. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  665. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  666. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  667. package/src/internal/routes/SourceObservation.test.ts +221 -0
  668. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  669. package/src/internal/routes/Subsidy.ts +4 -2
  670. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  671. package/src/internal/routes/Transfer.test.ts +130 -1
  672. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  673. package/src/internal/routes/Transfer.ts +866 -8
  674. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  675. package/src/internal/routes/TransferReconciliation.ts +91 -166
  676. package/src/internal/routes/TransferSettlement.ts +48 -0
  677. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  678. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  679. package/src/internal/routes/TransferSubsidy.ts +87 -12
  680. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  681. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  682. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  683. package/src/internal/routes/index.test.ts +3 -0
  684. package/src/internal/routes/index.ts +3 -0
  685. package/src/internal/routes/providers/across.ts +13 -0
  686. package/src/internal/routes/providers/index.test.ts +141 -0
  687. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  688. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  689. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  690. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  691. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  692. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  693. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  694. package/src/internal/routes/providers/propAmm.ts +640 -0
  695. package/src/internal/routes/providers/relay.test.ts +1263 -41
  696. package/src/internal/routes/providers/relay.ts +423 -38
  697. package/src/internal/routes/providers/rhino.ts +14 -1
  698. package/src/internal/routes/providers/squid.ts +21 -0
  699. package/src/internal/routes/providers/stargate.test.ts +105 -1
  700. package/src/internal/routes/providers/stargate.ts +22 -9
  701. package/src/internal/routes/providers/symbiosis.ts +13 -47
  702. package/src/providers/index.test.ts +2 -0
  703. package/src/providers/index.ts +18 -0
  704. package/dist/admin/Access.d.ts +0 -39
  705. package/dist/admin/Access.d.ts.map +0 -1
  706. package/dist/admin/Access.js +0 -73
  707. package/dist/admin/Access.js.map +0 -1
  708. package/src/admin/Access.test.ts +0 -130
  709. package/src/admin/Access.ts +0 -85
@@ -13,6 +13,7 @@ import * as Response from '../../../internal/Response.js'
13
13
  import * as Schema from '../../../internal/Schema.js'
14
14
  import * as Store from '../../../internal/Store.js'
15
15
  import * as Tidx from '../../../internal/Tidx.js'
16
+ import * as Timeout from '../../../internal/Timeout.js'
16
17
  import * as Timing from '../../../internal/Timing.js'
17
18
  import * as Ttl from '../../../internal/Ttl.js'
18
19
  import * as Value from '../../../internal/Value.js'
@@ -1072,8 +1073,8 @@ export function getTransactions(c: Context<App.Environment>, options: getTransac
1072
1073
 
1073
1074
  return Timing.time(c, 'transactions', () =>
1074
1075
  Store.memoize(
1075
- async () => {
1076
- const page = await scanTransactions({ tidx }, options)
1076
+ async (signal) => {
1077
+ const page = await scanTransactions({ signal, tidx }, options)
1077
1078
  return {
1078
1079
  data: page.items.map((item) => item.data),
1079
1080
  nextCursor: page.nextCursor,
@@ -1115,7 +1116,7 @@ export async function scanTransactions(
1115
1116
  toBlock,
1116
1117
  toTimestamp,
1117
1118
  } = options
1118
- const { tidx } = deps
1119
+ const { signal: flight, tidx } = deps
1119
1120
  const sortDirection = order === 'asc' ? 'ASC' : 'DESC'
1120
1121
  // Keyset pagination: anchor the page below the previous row's `(block, idx)`
1121
1122
  // position instead of a numeric offset, so rows arriving at the head can't
@@ -1177,35 +1178,43 @@ export async function scanTransactions(
1177
1178
  feePayer !== undefined ||
1178
1179
  feeToken !== undefined
1179
1180
  const fetchRows = async (where: readonly string[]) => {
1181
+ // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
1182
+ // to `string`.
1183
+ const query = (block: string) =>
1184
+ `
1185
+ SELECT ${transactionColumns}
1186
+ FROM txs
1187
+ ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
1188
+ ORDER BY ${block} ${sortDirection}, idx ${sortDirection}
1189
+ LIMIT ${queryLimit}${skip}
1190
+ ` as string
1191
+ if (!filtered)
1192
+ return await tidx.fetch({
1193
+ chainId,
1194
+ query: query('block_num'),
1195
+ ...(flight ? { signal: flight } : {}),
1196
+ })
1197
+ // TIDX reports statement kills as 408 timeouts, which the client retries until
1198
+ // the deadline; half the deadline bounds the walk so the fenced retry still runs.
1199
+ const timeout = AbortSignal.timeout(Timeout.duration / 2)
1180
1200
  try {
1181
1201
  return await tidx.fetch({
1182
1202
  chainId,
1183
- // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
1184
- // to `string`.
1185
- query: `
1186
- SELECT ${transactionColumns}
1187
- FROM txs
1188
- ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
1189
- ORDER BY block_num ${sortDirection}, idx ${sortDirection}
1190
- LIMIT ${queryLimit}${skip}
1191
- ` as string,
1203
+ query: query('block_num'),
1204
+ signal: flight ? AbortSignal.any([flight, timeout]) : timeout,
1192
1205
  })
1193
1206
  } catch (error) {
1207
+ // An expired flight means the memoized caller already gave up.
1208
+ if (flight?.aborted) throw error
1194
1209
  // Planner mis-selectivity turns these top-N scans into a block-ordered
1195
1210
  // walk that times out when matches sit far from the scan boundary;
1196
1211
  // `block_num + 0` blocks that walk, forcing the filter index plus a sort.
1197
- if (!filtered || !Tidx.isDeterministicError(error)) throw error
1212
+ if (!timeout.aborted && !Tidx.isQueryTimeout(error) && !Tidx.isDeterministicError(error))
1213
+ throw error
1198
1214
  return await tidx.fetch({
1199
1215
  chainId,
1200
- // Raw-table query (no signature-decoded CTE), so the inline SQL is cast
1201
- // to `string`.
1202
- query: `
1203
- SELECT ${transactionColumns}
1204
- FROM txs
1205
- ${where.length > 0 ? `WHERE ${where.join(' AND ')}` : ''}
1206
- ORDER BY block_num + 0 ${sortDirection}, idx ${sortDirection}
1207
- LIMIT ${queryLimit}${skip}
1208
- ` as string,
1216
+ query: query('block_num + 0'),
1217
+ ...(flight ? { signal: flight } : {}),
1209
1218
  })
1210
1219
  }
1211
1220
  }
@@ -1395,6 +1404,8 @@ export declare namespace countTransactions {
1395
1404
  export declare namespace scanTransactions {
1396
1405
  /** Dependencies for {@link scanTransactions}. */
1397
1406
  type Deps = {
1407
+ /** Optional deadline signal bounding every TIDX read in the scan. */
1408
+ signal?: AbortSignal | undefined
1398
1409
  /** TIDX query client for the target chain. */
1399
1410
  tidx: Tidx.Client
1400
1411
  }
@@ -307,10 +307,19 @@ describe('CRUD lifecycle', () => {
307
307
  },
308
308
  as(webhookWriter),
309
309
  )
310
- const body = (await response.json()) as { error?: { code?: string } }
310
+ expect(response.status).toMatchInlineSnapshot(`403`)
311
+ if (response.status !== 403) throw new Error('Expected a forbidden response')
312
+ const { requestId, ...body } = await response.json()
311
313
 
312
- expect(response.status).toBe(403)
313
- expect(body.error?.code).toBe('api_key_forbidden')
314
+ expect(requestId).toBeDefined()
315
+ expect(body).toMatchInlineSnapshot(`
316
+ {
317
+ "error": {
318
+ "code": "api_key_forbidden",
319
+ "message": "API key is missing required permissions: routes:read. Use an API key with these scopes.",
320
+ },
321
+ }
322
+ `)
314
323
  })
315
324
 
316
325
  test('captures route transfer ownership scope without reading the RPC head', async () => {
@@ -1670,7 +1670,8 @@ export function webhooks(options: webhooks.Options = {}) {
1670
1670
  )
1671
1671
  return Response.error(c, {
1672
1672
  code: 'api_key_forbidden',
1673
- message: 'API key missing required scope',
1673
+ message:
1674
+ 'API key is missing required permissions: routes:read. Use an API key with these scopes.',
1674
1675
  status: 403,
1675
1676
  })
1676
1677
  }
@@ -7,6 +7,7 @@ import * as Metadata from '../metadata.js'
7
7
 
8
8
  import { apiKeys } from './routes/api-keys.js'
9
9
  import { billing } from './routes/billing.js'
10
+ import { cli } from './routes/cli.js'
10
11
  import { faucet } from './routes/faucet.js'
11
12
  import { invitations } from './routes/invitations.js'
12
13
  import { inviteLinks } from './routes/invite-links.js'
@@ -75,6 +76,7 @@ export function management(options: management.Options = {}) {
75
76
  })
76
77
  .route('/', apiKeys({ enabled: options.apiKeys !== false }))
77
78
  .route('/', billing())
79
+ .route('/', cli({ consoleUrl: options.consoleUrl }))
78
80
  .route('/', faucet())
79
81
  .route('/', invitations())
80
82
  .route('/', inviteLinks())
@@ -96,6 +98,8 @@ export declare namespace management {
96
98
  apiKeys?: boolean | undefined
97
99
  /** Stripe billing capability; omit to disable billing routes (501) and keep production sponsorship closed. */
98
100
  billing?: Billing | undefined
101
+ /** Console origin hosting the CLI sign-in approval page. @default 'https://console.tempo.xyz' */
102
+ consoleUrl?: string | undefined
99
103
  /** Legacy group-level transactional email sender. Prefer `App.create({ email })`. */
100
104
  email?: Email.Sender | undefined
101
105
  /** Webhook capability shared with the data group and host poller; omit or pass false to disable management. */
@@ -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
  })