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
@@ -0,0 +1,226 @@
1
+ import * as Store from '../Store.js'
2
+ import { ProviderRateLimitError, ProviderResponseError } from './Provider.js'
3
+
4
+ type TenantQuota = {
5
+ /** Requests accepted for this tenant in the active window. */
6
+ count: number
7
+ /** Stable non-secret tenant identity. */
8
+ key: string
9
+ }
10
+
11
+ type State = {
12
+ /** Epoch milliseconds before which new requests are rejected. */
13
+ blockedUntil?: number | undefined
14
+ /** Fixed-window number. */
15
+ bucket: number
16
+ /** Requests accepted globally in the active window. */
17
+ count: number
18
+ /** Per-tenant counters for accepted requests. */
19
+ tenants: readonly TenantQuota[]
20
+ }
21
+
22
+ type Native = {
23
+ block(options: block.Options): Promise<void>
24
+ check(options: check.Options): Promise<void>
25
+ consume(options: consume.Options): Promise<void>
26
+ }
27
+
28
+ const nativeStores = new WeakMap<Store.Store, Native>()
29
+ const checks = new WeakMap<Store.Store, Map<string, { blockedUntil?: number; refreshAt: number }>>()
30
+ const updates = new WeakMap<Store.Store, Map<string, Promise<string>>>()
31
+ // Adaptive-only providers refresh shared cooldown state at most once per second per isolate.
32
+ const checkRefreshMs = 1_000
33
+
34
+ /** Creates a quota store whose state transitions execute in one Durable Object RPC. */
35
+ export function durableObject(
36
+ namespace: Store.durableObject.Namespace,
37
+ options: durableObject.Options,
38
+ ) {
39
+ const store = Store.durableObject(namespace, options)
40
+ // Durable Object stubs are request-scoped I/O objects in Workers.
41
+ const stub = () => namespace.getByName(options.name) as NativeStub
42
+ nativeStores.set(store, {
43
+ block: (parameters) => stub().routesQuotaBlock(parameters),
44
+ async check(parameters) {
45
+ if (!(await stub().routesQuotaCheck(parameters))) throw new ProviderRateLimitError()
46
+ },
47
+ async consume(parameters) {
48
+ if (!(await stub().routesQuotaConsume(parameters))) throw new ProviderRateLimitError()
49
+ },
50
+ })
51
+ return store
52
+ }
53
+
54
+ export declare namespace durableObject {
55
+ /** One Durable Object instance dedicated to a provider quota. */
56
+ type Options = { name: string }
57
+ }
58
+
59
+ type NativeStub = Store.durableObject.Stub & {
60
+ routesQuotaBlock(options: block.Options): Promise<void>
61
+ routesQuotaCheck(options: check.Options): Promise<boolean>
62
+ routesQuotaConsume(options: consume.Options): Promise<boolean>
63
+ }
64
+
65
+ /** Rejects while an upstream provider quota is in a reported cooldown. */
66
+ export async function check(store: Store.Store, options: check.Options) {
67
+ const time = options.now.getTime()
68
+ const cache = checks.get(store) ?? new Map()
69
+ if (!checks.has(store)) checks.set(store, cache)
70
+ const cached = cache.get(options.key)
71
+ if (cached?.blockedUntil !== undefined && cached.blockedUntil > time)
72
+ throw new ProviderRateLimitError()
73
+ if (cached !== undefined && cached.refreshAt > time) return
74
+
75
+ const native = nativeStores.get(store)
76
+ if (native) await native.check(options)
77
+ else await checkStored(store, options)
78
+ // A cooldown installed during the check takes precedence over its stale success.
79
+ if (cache.get(options.key) === cached)
80
+ cache.set(options.key, { refreshAt: time + checkRefreshMs })
81
+ }
82
+
83
+ async function checkStored(store: Store.Store, options: check.Options) {
84
+ const current = await store.get(options.key)
85
+ if (current === null) return
86
+ const state = JSON.parse(current) as State
87
+ if (state.blockedUntil !== undefined && state.blockedUntil > options.now.getTime())
88
+ throw new ProviderRateLimitError()
89
+ }
90
+
91
+ export declare namespace check {
92
+ /** One provider cooldown check. */
93
+ type Options = Pick<block.Options, 'key' | 'now'>
94
+ }
95
+
96
+ /** Atomically reserves one request from an upstream provider quota. */
97
+ export async function consume(store: Store.Store, options: consume.Options) {
98
+ const native = nativeStores.get(store)
99
+ if (native) return native.consume(options)
100
+ const bucket = Math.floor(options.now.getTime() / options.windowMs)
101
+ await update(store, options.key, (current) => {
102
+ const stored = current === null ? undefined : (JSON.parse(current) as State)
103
+ const activeBucket = Math.max(bucket, stored?.bucket ?? bucket)
104
+ const quota: State =
105
+ stored?.bucket === activeBucket
106
+ ? stored
107
+ : {
108
+ ...(stored?.blockedUntil === undefined ? {} : { blockedUntil: stored.blockedUntil }),
109
+ bucket: activeBucket,
110
+ count: 0,
111
+ tenants: [],
112
+ }
113
+ if (quota.blockedUntil !== undefined && quota.blockedUntil > options.now.getTime())
114
+ throw new ProviderRateLimitError()
115
+ const tenant = options.tenant
116
+ ? quota.tenants.find((entry) => entry.key === options.tenant?.key)
117
+ : undefined
118
+ if (
119
+ quota.count >= options.limit ||
120
+ (options.tenant && (tenant?.count ?? 0) >= options.tenant.limit)
121
+ )
122
+ throw new ProviderRateLimitError()
123
+ const tenants = !options.tenant
124
+ ? quota.tenants
125
+ : tenant
126
+ ? quota.tenants.map((entry) =>
127
+ entry.key === options.tenant?.key ? { ...entry, count: entry.count + 1 } : entry,
128
+ )
129
+ : [...quota.tenants, { count: 1, key: options.tenant.key }]
130
+ return JSON.stringify({ bucket: activeBucket, count: quota.count + 1, tenants })
131
+ })
132
+ }
133
+
134
+ /** Blocks an upstream quota after a provider reports rate-limit exhaustion. */
135
+ export async function block(store: Store.Store, options: block.Options) {
136
+ const time = options.now.getTime()
137
+ const blockedUntil = time + options.durationMs
138
+ const cache = checks.get(store) ?? new Map()
139
+ if (!checks.has(store)) checks.set(store, cache)
140
+ cache.set(options.key, { blockedUntil, refreshAt: blockedUntil })
141
+ const native = nativeStores.get(store)
142
+ if (native) return native.block(options)
143
+ const bucket = Math.floor(time / options.windowMs)
144
+ await update(store, options.key, (current) => {
145
+ const stored = current === null ? undefined : (JSON.parse(current) as State)
146
+ const activeBucket = Math.max(bucket, stored?.bucket ?? bucket)
147
+ const quota: State =
148
+ stored?.bucket === activeBucket
149
+ ? stored
150
+ : {
151
+ ...(stored?.blockedUntil === undefined ? {} : { blockedUntil: stored.blockedUntil }),
152
+ bucket: activeBucket,
153
+ count: 0,
154
+ tenants: [],
155
+ }
156
+ return JSON.stringify({
157
+ ...quota,
158
+ blockedUntil: Math.max(quota.blockedUntil ?? 0, blockedUntil),
159
+ })
160
+ })
161
+ }
162
+
163
+ export declare namespace block {
164
+ /** One provider-reported quota cooldown. */
165
+ type Options = {
166
+ /** Cooldown duration derived from `Retry-After` or the local window. */
167
+ durationMs: number
168
+ /** Durable key shared by every call that consumes this upstream bucket. */
169
+ key: string
170
+ /** Current wall clock. */
171
+ now: Date
172
+ /** Fixed-window duration in milliseconds. */
173
+ windowMs: number
174
+ }
175
+ }
176
+
177
+ /** Applies a shared cooldown when an upstream provider responds with HTTP 429. */
178
+ export async function blockOnRateLimit(
179
+ store: Store.Store,
180
+ cause: unknown,
181
+ options: blockOnRateLimit.Options,
182
+ ) {
183
+ if (!(cause instanceof ProviderResponseError) || cause.status !== 429) return
184
+ const durationMs = cause.retryAfterMs ?? options.windowMs
185
+ await block(store, {
186
+ ...options,
187
+ durationMs,
188
+ })
189
+ cause.cooldownMs = durationMs
190
+ }
191
+
192
+ export declare namespace blockOnRateLimit {
193
+ /** Provider quota bucket receiving an upstream cooldown. */
194
+ type Options = Omit<block.Options, 'durationMs'>
195
+ }
196
+
197
+ export declare namespace consume {
198
+ /** One upstream quota reservation. */
199
+ type Options = {
200
+ /** Durable key shared by every call that consumes this upstream bucket. */
201
+ key: string
202
+ /** Maximum global count accepted for this operation. */
203
+ limit: number
204
+ /** Current wall clock. */
205
+ now: Date
206
+ /** Optional per-tenant fairness limit within the same window. */
207
+ tenant?: { key: string; limit: number } | undefined
208
+ /** Fixed-window duration in milliseconds. */
209
+ windowMs: number
210
+ }
211
+ }
212
+
213
+ // Serialize local transitions so bursts cannot exhaust the bounded CAS retries.
214
+ // Production runs this queue inside the provider's Durable Object.
215
+ async function update(store: Store.Store, key: string, fn: (current: null | string) => string) {
216
+ const pending = updates.get(store) ?? new Map<string, Promise<string>>()
217
+ if (!updates.has(store)) updates.set(store, pending)
218
+ const previous = pending.get(key) ?? Promise.resolve()
219
+ const next = previous.catch(() => {}).then(() => Store.update(store, key, fn))
220
+ pending.set(key, next)
221
+ try {
222
+ await next
223
+ } finally {
224
+ if (pending.get(key) === next) pending.delete(key)
225
+ }
226
+ }
@@ -8,9 +8,12 @@ import { Abis, Actions, Addresses } from 'viem/tempo'
8
8
 
9
9
  import * as Organizations from '../../db/tables/organizations.js'
10
10
  import * as RoutesCatalog from '../../db/tables/routesCatalog.js'
11
+ import * as RoutesDepositAddresses from '../../db/tables/routesDepositAddresses.js'
11
12
  import * as RoutesDeposits from '../../db/tables/routesDeposits.js'
13
+ import * as RoutesPolicies from '../../db/tables/routesPolicies.js'
12
14
  import * as RoutesSubsidies from '../../db/tables/routesSubsidies.js'
13
15
  import * as StripeCustomers from '../../db/tables/stripeCustomers.js'
16
+ import * as Metrics from '../../Metrics.js'
14
17
  import * as TestApp from '../../../test/App.js'
15
18
  import * as Runtime from '../../../test/runtime.js'
16
19
  import * as TestRelay from '../../../test/Relay.js'
@@ -19,6 +22,7 @@ import * as Viem from '../Viem.js'
19
22
  import * as Chain from './Chain.js'
20
23
  import * as DepositAddress from './DepositAddress.js'
21
24
  import * as Evidence from './Evidence.js'
25
+ import * as Policy from './Policy.js'
22
26
  import * as Reconciliation from './Reconciliation.js'
23
27
  import * as Subsidy from './Subsidy.js'
24
28
 
@@ -31,6 +35,287 @@ const chain = {
31
35
  } as const
32
36
 
33
37
  describe.skipIf(runtime.mode !== 'localnet')('reconcileRequest', () => {
38
+ test.each([
39
+ { subsidyPayer: 'tempo', delivered: 950_000n, lateAt: 'completed' },
40
+ { subsidyPayer: 'enterprise', delivered: 950_000n, lateAt: 'completed' },
41
+ { subsidyPayer: 'enterprise', delivered: 950_000n, lateAt: 'settling' },
42
+ { subsidyPayer: 'enterprise', delivered: 960_000n, lateAt: 'completed' },
43
+ ] as const)(
44
+ 'settles pinned $subsidyPayer terms with $delivered delivery and late expense at $lateAt',
45
+ async ({ subsidyPayer, delivered, lateAt }) => {
46
+ const db = TestApp.database()
47
+ const client = TestTempo.getClient()
48
+ const source = TestTempo.accounts[4]!
49
+ const depositAccount = TestTempo.accounts[5]!
50
+ const subsidyAccount = TestTempo.accounts[6]!
51
+ const recipient = TestTempo.accounts[7]!
52
+ const provider = TestTempo.accounts[0]!
53
+ const org = await Organizations.create(db, { name: `Pinned ${subsidyPayer}` })
54
+ const scope = { environment: 'production', orgId: org.id } as const
55
+ const token = {
56
+ address: Addresses.pathUsd,
57
+ currency: 'USD',
58
+ decimals: 6,
59
+ name: 'pathUSD',
60
+ standard: 'TIP-20',
61
+ symbol: 'pathUSD',
62
+ tokenKey: `${chain.id}/erc20:${Addresses.pathUsd}`,
63
+ verified: true,
64
+ } as const
65
+ const commitment: Policy.Commitment = {
66
+ maxAmount: '0.05',
67
+ scope,
68
+ subsidyPayer,
69
+ versions: [1],
70
+ }
71
+ const grandfathered =
72
+ subsidyPayer === 'enterprise' && lateAt === 'completed' && delivered === 950_000n
73
+ await RoutesPolicies.save(db, {
74
+ policy: { maxAmount: '0.05', subsidyEnabled: true, subsidyPayer },
75
+ scope,
76
+ version: 0,
77
+ })
78
+ await RoutesSubsidies.upsertOrganization(db, {
79
+ frequency: 'tx',
80
+ maxAmount: '0.05',
81
+ orgId: org.id,
82
+ })
83
+ await StripeCustomers.create(db, { orgId: org.id, stripeCustomerId: `cus_${subsidyPayer}` })
84
+ await StripeCustomers.setStatus(db, org.id, 'active')
85
+ await RoutesCatalog.publish(db, {
86
+ chainTokens: [],
87
+ chains: [
88
+ {
89
+ aliases: [],
90
+ id: chain.id as Chain.Id,
91
+ name: chain.name,
92
+ parentChainId: null,
93
+ rpcUrls: [runtime.rpcUrl!],
94
+ slug: 'tempo-localnet',
95
+ },
96
+ ],
97
+ routes: [],
98
+ tokens: [],
99
+ })
100
+ const address = await DepositAddress.create(db, {
101
+ ...scope,
102
+ deliveryStrategy: 'provider',
103
+ providerOutputToken: token,
104
+ ...(grandfathered
105
+ ? {}
106
+ : {
107
+ providerState: {
108
+ routePolicy: commitment,
109
+ routePolicyKey: Policy.commitmentKey(commitment),
110
+ },
111
+ }),
112
+ snapshot: {
113
+ address: depositAccount.address,
114
+ destinationChain: chain,
115
+ destinationToken: token,
116
+ provider: { id: 'local', name: 'Local' },
117
+ recipient: recipient.address,
118
+ refundAddress: source.address,
119
+ sourceChain: chain,
120
+ sourceToken: token,
121
+ subsidize: true,
122
+ },
123
+ })
124
+ if (grandfathered)
125
+ await RoutesDepositAddresses.grandfatherLegacySponsored(db, {
126
+ addressIds: [address.id],
127
+ apply: true,
128
+ commitment,
129
+ })
130
+
131
+ const replacementCommitment: Policy.Commitment = {
132
+ ...commitment,
133
+ maxAmount: '0.15',
134
+ subsidyPayer: subsidyPayer === 'tempo' ? 'enterprise' : 'tempo',
135
+ versions: [2],
136
+ }
137
+ await RoutesPolicies.save(db, {
138
+ policy: {
139
+ maxAmount: '0.15',
140
+ subsidyEnabled: true,
141
+ subsidyPayer: replacementCommitment.subsidyPayer,
142
+ },
143
+ scope,
144
+ version: 1,
145
+ })
146
+ const replacement = await DepositAddress.create(db, {
147
+ ...scope,
148
+ deliveryStrategy: 'provider',
149
+ providerOutputToken: token,
150
+ providerState: {
151
+ routePolicy: replacementCommitment,
152
+ routePolicyKey: Policy.commitmentKey(replacementCommitment),
153
+ },
154
+ snapshot: { ...address.snapshot, address: TestTempo.accounts[8]!.address },
155
+ })
156
+
157
+ // Revoke before a deposit arrives, not just after its settlement has been prepared.
158
+ await RoutesPolicies.save(db, {
159
+ policy: {
160
+ access: [],
161
+ maxAmount: '0.01',
162
+ subsidyEnabled: false,
163
+ subsidyPayer: subsidyPayer === 'tempo' ? 'enterprise' : 'tempo',
164
+ suspended: true,
165
+ },
166
+ scope,
167
+ version: 2,
168
+ })
169
+ await RoutesSubsidies.removeOrganization(db, org.id)
170
+ await StripeCustomers.setStatus(db, org.id, 'past_due')
171
+ await Actions.faucet.fundSync(client, { account: source, timeout: 60_000 })
172
+ await Actions.faucet.fundSync(client, { account: subsidyAccount, timeout: 60_000 })
173
+ const before = await Actions.token.getBalance(client, {
174
+ account: recipient.address,
175
+ decimals: 6,
176
+ token: token.address,
177
+ })
178
+ const sourceReceipt = await Actions.token.transferSync(
179
+ TestTempo.getClient({ account: source }),
180
+ {
181
+ amount: 1_000_000n,
182
+ to: depositAccount.address,
183
+ token: token.address,
184
+ },
185
+ )
186
+ const providerReceipt = await Actions.token.transferSync(
187
+ TestTempo.getClient({ account: provider }),
188
+ {
189
+ amount: delivered,
190
+ to: recipient.address,
191
+ token: token.address,
192
+ },
193
+ )
194
+ const request = {
195
+ createdAt: new Date().toISOString(),
196
+ destinationTransactionHashes: [providerReceipt.receipt.transactionHash],
197
+ id: `pinned-${subsidyPayer}`,
198
+ refundTransactionHashes: [],
199
+ sourceTransactionHashes: [sourceReceipt.receipt.transactionHash],
200
+ status: 'success',
201
+ updatedAt: new Date().toISOString(),
202
+ }
203
+ const subsidy = {
204
+ amount: { baseUnits: '10000', currency: 'USD', decimals: 6, formatted: '0.01' },
205
+ provider: 'relay',
206
+ token,
207
+ }
208
+ const counts: Parameters<Metrics.Metrics['count']>[] = []
209
+ const options = {
210
+ address: (await RoutesDepositAddresses.getByProviderAddress(db, {
211
+ address: depositAccount.address,
212
+ providerId: 'local',
213
+ }))!,
214
+ metrics: Metrics.from({
215
+ count(...parameters) {
216
+ counts.push(parameters)
217
+ },
218
+ flush() {},
219
+ gauge() {},
220
+ histogram() {},
221
+ }),
222
+ request,
223
+ subsidies: Subsidy.create({
224
+ account: subsidyAccount,
225
+ getClient: TestTempo.readClient(),
226
+ policy: { maxAmount: '0.000001' },
227
+ }),
228
+ verifyTransfers: Evidence.createVerifier({ db, confirmations: { [chain.id]: 1 } }),
229
+ }
230
+ await Reconciliation.reconcileRequest(db, options)
231
+ const [prepared] = await RoutesDeposits.listByAddress(db, scope, address.id, { limit: 1 })
232
+ const localExpense = 1_000_000n - delivered
233
+ expect(prepared).toMatchObject({
234
+ depositAddressId: address.id,
235
+ status: 'settling',
236
+ subsidyAmount: { baseUnits: String(localExpense) },
237
+ })
238
+ if (!prepared?.settlementTransactionHash) throw new Error('Expected a prepared settlement.')
239
+ await waitForTransactionReceipt(client, {
240
+ hash: prepared.settlementTransactionHash as Hex.Hex,
241
+ })
242
+ await expect
243
+ .poll(async () => {
244
+ await Reconciliation.reconcileRequest(db, {
245
+ ...options,
246
+ request: { ...request, ...(lateAt === 'settling' ? { subsidy } : {}) },
247
+ })
248
+ return (await RoutesDeposits.get(db, prepared.id))?.status
249
+ })
250
+ .toBe('completed')
251
+ const completed = await RoutesDeposits.get(db, prepared.id)
252
+ expect(completed).toMatchObject({
253
+ settlementTransactionHash: prepared.settlementTransactionHash,
254
+ snapshot: { destinationAmount: { baseUnits: '1000000' } },
255
+ subsidyAmount: { baseUnits: String(localExpense) },
256
+ })
257
+ expect((await RoutesDeposits.listUnreportedSubsidies(db)).map(({ id }) => id)).toEqual(
258
+ subsidyPayer === 'enterprise' ? [prepared.id] : [],
259
+ )
260
+ expect(
261
+ (await RoutesDepositAddresses.get(db, address.id))?.providerState?.['routePolicy'],
262
+ ).toEqual(commitment)
263
+
264
+ await Reconciliation.reconcileRequest(db, options)
265
+ expect(await RoutesDeposits.get(db, prepared.id)).toEqual(completed)
266
+ const after = await Actions.token.getBalance(client, {
267
+ account: recipient.address,
268
+ decimals: 6,
269
+ token: token.address,
270
+ })
271
+ expect(after.amount - before.amount).toBe(1_000_000n)
272
+
273
+ const lateOptions = {
274
+ ...options,
275
+ request: { ...request, subsidy },
276
+ }
277
+ await Reconciliation.reconcileRequest(db, lateOptions)
278
+ const billed = await RoutesDeposits.listUnreportedSubsidies(db)
279
+ const expense = billed
280
+ .flatMap((row) => RoutesDeposits.subsidies(row))
281
+ .reduce((sum, subsidy) => sum + BigInt(subsidy.amount.baseUnits), 0n)
282
+ expect(expense).toBeLessThanOrEqual(50_000n)
283
+ const overCap = localExpense + 10_000n > 50_000n
284
+ const recorded = await RoutesDeposits.get(db, prepared.id)
285
+ expect(recorded).toMatchObject({
286
+ status: 'completed',
287
+ providerSubsidy: overCap ? null : subsidy,
288
+ ...(overCap ? { providerState: { unbilledProviderSubsidy: subsidy } } : {}),
289
+ })
290
+ const rejection = counts.filter(
291
+ ([, , tags]) => tags?.['outcome'] === 'provider_subsidy_unbilled',
292
+ )
293
+ expect(rejection).toHaveLength(overCap ? 1 : 0)
294
+ await Reconciliation.reconcileRequest(db, lateOptions)
295
+ expect(await RoutesDeposits.get(db, prepared.id)).toEqual(recorded)
296
+ expect(
297
+ counts.filter(([, , tags]) => tags?.['outcome'] === 'provider_subsidy_unbilled'),
298
+ ).toHaveLength(overCap ? 1 : 0)
299
+ expect(await RoutesDepositAddresses.get(db, replacement.id)).toEqual(replacement)
300
+ expect(
301
+ await RoutesDeposits.listByDepositAddress(db, {
302
+ depositAddress: replacement.address,
303
+ limit: 10,
304
+ owner: scope,
305
+ }),
306
+ ).toEqual([])
307
+ expect(
308
+ (
309
+ await RoutesDeposits.listByDepositAddress(db, {
310
+ depositAddress: address.address,
311
+ limit: 10,
312
+ owner: scope,
313
+ })
314
+ ).map(({ id }) => id),
315
+ ).toEqual([prepared.id])
316
+ },
317
+ )
318
+
34
319
  test('settles an underfilled deposit through the native DEX', async ({ onTestFinished }) => {
35
320
  // Vitest retries reuse module state, so each attempt needs a fresh database.
36
321
  const db = TestApp.database()