tapimo 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. package/README.md +10 -7
  2. package/dist/ApiKey.d.ts +3 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +10 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +29 -8
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +24 -5
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +20680 -15487
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +250 -129
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +17 -4
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Scope.d.ts +19 -8
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +25 -9
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +1 -1
  23. package/dist/admin/App.d.ts +667 -76
  24. package/dist/admin/App.d.ts.map +1 -1
  25. package/dist/admin/App.js +12 -2
  26. package/dist/admin/App.js.map +1 -1
  27. package/dist/admin/apps/api-keys.d.ts +107 -11
  28. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  29. package/dist/admin/apps/api-keys.js +145 -32
  30. package/dist/admin/apps/api-keys.js.map +1 -1
  31. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  32. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  33. package/dist/admin/apps/earn-vaults.js +409 -0
  34. package/dist/admin/apps/earn-vaults.js.map +1 -0
  35. package/dist/admin/apps/organizations.d.ts +2 -0
  36. package/dist/admin/apps/organizations.d.ts.map +1 -1
  37. package/dist/admin/apps/verified-tokens.d.ts +74 -74
  38. package/dist/admin/ui.generated.d.ts +1 -1
  39. package/dist/admin/ui.generated.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.js +99 -43
  41. package/dist/admin/ui.generated.js.map +1 -1
  42. package/dist/analytics/Analytics.d.ts +4 -0
  43. package/dist/analytics/Analytics.d.ts.map +1 -1
  44. package/dist/analytics/Analytics.js +21 -2
  45. package/dist/analytics/Analytics.js.map +1 -1
  46. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  47. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  48. package/dist/analytics/tables/requestEvents.js +59 -39
  49. package/dist/analytics/tables/requestEvents.js.map +1 -1
  50. package/dist/apps/Zones.d.ts +8335 -0
  51. package/dist/apps/Zones.d.ts.map +1 -0
  52. package/dist/apps/Zones.js +38 -0
  53. package/dist/apps/Zones.js.map +1 -0
  54. package/dist/apps/data/App.d.ts +5666 -3934
  55. package/dist/apps/data/App.d.ts.map +1 -1
  56. package/dist/apps/data/App.js +90 -22
  57. package/dist/apps/data/App.js.map +1 -1
  58. package/dist/apps/data/FxOracle.d.ts +1 -1
  59. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  60. package/dist/apps/data/index.d.ts +0 -1
  61. package/dist/apps/data/index.d.ts.map +1 -1
  62. package/dist/apps/data/index.js +0 -1
  63. package/dist/apps/data/index.js.map +1 -1
  64. package/dist/apps/data/routes/activities.d.ts +56 -56
  65. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  66. package/dist/apps/data/routes/activities.js +130 -65
  67. package/dist/apps/data/routes/activities.js.map +1 -1
  68. package/dist/apps/data/routes/addresses.d.ts +65 -65
  69. package/dist/apps/data/routes/balances.d.ts +14 -14
  70. package/dist/apps/data/routes/balances.js +5 -5
  71. package/dist/apps/data/routes/balances.js.map +1 -1
  72. package/dist/apps/data/routes/blocks.d.ts +39 -39
  73. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  74. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  75. package/dist/apps/data/routes/coingecko.js +62 -35
  76. package/dist/apps/data/routes/coingecko.js.map +1 -1
  77. package/dist/apps/data/routes/earn.d.ts +2574 -0
  78. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  79. package/dist/apps/data/routes/earn.js +1574 -0
  80. package/dist/apps/data/routes/earn.js.map +1 -0
  81. package/dist/apps/data/routes/exchanges.d.ts +1626 -719
  82. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  83. package/dist/apps/data/routes/exchanges.js +656 -193
  84. package/dist/apps/data/routes/exchanges.js.map +1 -1
  85. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  86. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  87. package/dist/apps/data/routes/fee-amm.js +59 -8
  88. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  89. package/dist/apps/data/routes/indexer.d.ts +35 -35
  90. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  91. package/dist/apps/data/routes/indexer.js +23 -3
  92. package/dist/apps/data/routes/indexer.js.map +1 -1
  93. package/dist/apps/data/routes/receipts.d.ts +33 -33
  94. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  95. package/dist/apps/data/routes/receipts.js +11 -11
  96. package/dist/apps/data/routes/receipts.js.map +1 -1
  97. package/dist/apps/data/routes/rpc.d.ts +6 -6
  98. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  99. package/dist/apps/data/routes/rpc.js +214 -22
  100. package/dist/apps/data/routes/rpc.js.map +1 -1
  101. package/dist/apps/data/routes/tokenlist.d.ts +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokenlist.js +39 -8
  104. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  105. package/dist/apps/data/routes/tokens.d.ts +115 -87
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +194 -91
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +54 -54
  110. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transactions.js +78 -39
  112. package/dist/apps/data/routes/transactions.js.map +1 -1
  113. package/dist/apps/data/routes/transfers.d.ts +76 -27
  114. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  115. package/dist/apps/data/routes/transfers.js +165 -67
  116. package/dist/apps/data/routes/transfers.js.map +1 -1
  117. package/dist/apps/data/routes/valuation.d.ts +42 -42
  118. package/dist/apps/data/routes/valuation.js +2 -2
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  121. package/dist/apps/data/routes/webhooks.d.ts +370 -368
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +161 -59
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zones.d.ts +281 -0
  126. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  127. package/dist/apps/data/routes/zones.js +252 -0
  128. package/dist/apps/data/routes/zones.js.map +1 -0
  129. package/dist/apps/docs/reference.js +6 -5
  130. package/dist/apps/docs/reference.js.map +1 -1
  131. package/dist/apps/funding/Access.d.ts +16 -0
  132. package/dist/apps/funding/Access.d.ts.map +1 -0
  133. package/dist/apps/funding/Access.js +22 -0
  134. package/dist/apps/funding/Access.js.map +1 -0
  135. package/dist/apps/funding/App.d.ts +3183 -0
  136. package/dist/apps/funding/App.d.ts.map +1 -0
  137. package/dist/apps/funding/App.js +46 -0
  138. package/dist/apps/funding/App.js.map +1 -0
  139. package/dist/apps/funding/Inventory.d.ts +5 -0
  140. package/dist/apps/funding/Inventory.d.ts.map +1 -0
  141. package/dist/apps/funding/Inventory.js +25 -0
  142. package/dist/apps/funding/Inventory.js.map +1 -0
  143. package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
  144. package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
  145. package/dist/apps/funding/ProviderAttempts.js +24 -0
  146. package/dist/apps/funding/ProviderAttempts.js.map +1 -0
  147. package/dist/apps/funding/index.d.ts +2 -0
  148. package/dist/apps/funding/index.d.ts.map +1 -0
  149. package/dist/apps/funding/index.js +2 -0
  150. package/dist/apps/funding/index.js.map +1 -0
  151. package/dist/apps/funding/routes/chains.d.ts +169 -0
  152. package/dist/apps/funding/routes/chains.d.ts.map +1 -0
  153. package/dist/apps/funding/routes/chains.js +80 -0
  154. package/dist/apps/funding/routes/chains.js.map +1 -0
  155. package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
  156. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
  157. package/dist/apps/funding/routes/deposit-addresses.js +860 -0
  158. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
  159. package/dist/apps/funding/routes/providers.d.ts +91 -0
  160. package/dist/apps/funding/routes/providers.d.ts.map +1 -0
  161. package/dist/apps/funding/routes/providers.js +56 -0
  162. package/dist/apps/funding/routes/providers.js.map +1 -0
  163. package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
  164. package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
  165. package/dist/apps/funding/routes/quotes.js +188 -0
  166. package/dist/apps/funding/routes/quotes.js.map +1 -0
  167. package/dist/apps/funding/routes/transfers.d.ts +1999 -0
  168. package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
  169. package/dist/apps/funding/routes/transfers.js +614 -0
  170. package/dist/apps/funding/routes/transfers.js.map +1 -0
  171. package/dist/apps/index.d.ts +3 -1
  172. package/dist/apps/index.d.ts.map +1 -1
  173. package/dist/apps/index.js +3 -1
  174. package/dist/apps/index.js.map +1 -1
  175. package/dist/apps/management/App.d.ts +839 -574
  176. package/dist/apps/management/App.d.ts.map +1 -1
  177. package/dist/apps/management/Billing.d.ts +8 -0
  178. package/dist/apps/management/Billing.d.ts.map +1 -1
  179. package/dist/apps/management/Billing.js +12 -0
  180. package/dist/apps/management/Billing.js.map +1 -1
  181. package/dist/apps/management/Error.d.ts +12 -0
  182. package/dist/apps/management/Error.d.ts.map +1 -0
  183. package/dist/apps/management/Error.js +10 -0
  184. package/dist/apps/management/Error.js.map +1 -0
  185. package/dist/apps/management/routes/api-keys.d.ts +296 -19
  186. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  187. package/dist/apps/management/routes/api-keys.js +77 -9
  188. package/dist/apps/management/routes/api-keys.js.map +1 -1
  189. package/dist/apps/management/routes/billing.d.ts +119 -119
  190. package/dist/apps/management/routes/faucet.d.ts +35 -35
  191. package/dist/apps/management/routes/invitations.d.ts +17 -17
  192. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  193. package/dist/apps/management/routes/invitations.js +4 -10
  194. package/dist/apps/management/routes/invitations.js.map +1 -1
  195. package/dist/apps/management/routes/invite-links.d.ts +38 -38
  196. package/dist/apps/management/routes/me.d.ts +6 -6
  197. package/dist/apps/management/routes/members.d.ts +69 -69
  198. package/dist/apps/management/routes/orgs.d.ts +16 -16
  199. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  200. package/dist/apps/management/routes/orgs.js +2 -8
  201. package/dist/apps/management/routes/orgs.js.map +1 -1
  202. package/dist/apps/management/routes/projects.d.ts +19 -19
  203. package/dist/apps/management/routes/scopes.d.ts +1 -1
  204. package/dist/apps/management/routes/scopes.js +2 -2
  205. package/dist/apps/management/routes/scopes.js.map +1 -1
  206. package/dist/apps/management/routes/usage.d.ts +72 -72
  207. package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
  208. package/dist/apps/management/routes/webhooks.d.ts +122 -122
  209. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  210. package/dist/apps/management/routes/webhooks.js +15 -3
  211. package/dist/apps/management/routes/webhooks.js.map +1 -1
  212. package/dist/apps/mcp.d.ts +2 -3
  213. package/dist/apps/mcp.d.ts.map +1 -1
  214. package/dist/apps/mcp.js +16 -14
  215. package/dist/apps/mcp.js.map +1 -1
  216. package/dist/apps/metadata.d.ts +4 -0
  217. package/dist/apps/metadata.d.ts.map +1 -1
  218. package/dist/apps/metadata.js +10 -0
  219. package/dist/apps/metadata.js.map +1 -1
  220. package/dist/apps/mpp/App.d.ts +57 -58
  221. package/dist/apps/mpp/App.d.ts.map +1 -1
  222. package/dist/apps/mpp/App.js +192 -27
  223. package/dist/apps/mpp/App.js.map +1 -1
  224. package/dist/apps/mpp/Mpp.d.ts +0 -20
  225. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  226. package/dist/apps/mpp/Mpp.js +0 -24
  227. package/dist/apps/mpp/Mpp.js.map +1 -1
  228. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  229. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  230. package/dist/apps/mpp/internal/Adapter.js +66 -0
  231. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  232. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  233. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  234. package/dist/apps/mpp/internal/Error.js +41 -0
  235. package/dist/apps/mpp/internal/Error.js.map +1 -0
  236. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  237. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  238. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  239. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  240. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  241. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  242. package/dist/apps/mpp/internal/Policy.js +57 -0
  243. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  244. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  245. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  246. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  247. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  248. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  249. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  250. package/dist/apps/mpp/internal/Screening.js +20 -0
  251. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  252. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  253. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  254. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  255. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  256. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  257. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  258. package/dist/apps/mpp/internal/Utils.js +24 -0
  259. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  260. package/dist/apps/relay/App.js +183 -23
  261. package/dist/apps/relay/App.js.map +1 -1
  262. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  263. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  264. package/dist/apps/relay/Sponsorships.js +15 -6
  265. package/dist/apps/relay/Sponsorships.js.map +1 -1
  266. package/dist/cloudflare.d.ts +50 -0
  267. package/dist/cloudflare.d.ts.map +1 -1
  268. package/dist/cloudflare.js +178 -0
  269. package/dist/cloudflare.js.map +1 -1
  270. package/dist/db/Db.d.ts +22 -0
  271. package/dist/db/Db.d.ts.map +1 -1
  272. package/dist/db/Db.js +379 -0
  273. package/dist/db/Db.js.map +1 -1
  274. package/dist/db/Schema.d.ts +933 -1
  275. package/dist/db/Schema.d.ts.map +1 -1
  276. package/dist/db/Schema.js +289 -1
  277. package/dist/db/Schema.js.map +1 -1
  278. package/dist/db/tables/earnVaults.d.ts +68 -0
  279. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  280. package/dist/db/tables/earnVaults.js +72 -0
  281. package/dist/db/tables/earnVaults.js.map +1 -0
  282. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  283. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  284. package/dist/db/tables/fundingCatalog.js +85 -0
  285. package/dist/db/tables/fundingCatalog.js.map +1 -0
  286. package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
  287. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  288. package/dist/db/tables/fundingDepositAddresses.js +218 -0
  289. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  290. package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
  291. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
  292. package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
  293. package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
  294. package/dist/db/tables/fundingDeposits.d.ts +171 -0
  295. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  296. package/dist/db/tables/fundingDeposits.js +182 -0
  297. package/dist/db/tables/fundingDeposits.js.map +1 -0
  298. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  299. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  300. package/dist/db/tables/fundingIdempotency.js +103 -0
  301. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  302. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  303. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  304. package/dist/db/tables/fundingTransferEvents.js +18 -0
  305. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  306. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  307. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  308. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  309. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  310. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  311. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  312. package/dist/db/tables/fundingTransfers.js +89 -0
  313. package/dist/db/tables/fundingTransfers.js.map +1 -0
  314. package/dist/db/tables/organizations.d.ts +8 -0
  315. package/dist/db/tables/organizations.d.ts.map +1 -1
  316. package/dist/db/tables/organizations.js +16 -0
  317. package/dist/db/tables/organizations.js.map +1 -1
  318. package/dist/db/tables/projects.d.ts +8 -0
  319. package/dist/db/tables/projects.d.ts.map +1 -1
  320. package/dist/db/tables/projects.js +16 -0
  321. package/dist/db/tables/projects.js.map +1 -1
  322. package/dist/db/tables/requestUsage.d.ts +13 -0
  323. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  324. package/dist/db/tables/requestUsage.js +16 -0
  325. package/dist/db/tables/requestUsage.js.map +1 -1
  326. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  327. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  328. package/dist/db/tables/sponsoredTransactions.js +1 -1
  329. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  330. package/dist/db/tables/users.d.ts +8 -0
  331. package/dist/db/tables/users.d.ts.map +1 -1
  332. package/dist/db/tables/users.js +16 -0
  333. package/dist/db/tables/users.js.map +1 -1
  334. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  335. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  336. package/dist/db/tables/verifiedTokens.js +9 -7
  337. package/dist/db/tables/verifiedTokens.js.map +1 -1
  338. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  339. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  340. package/dist/db/tables/webhookSubscriptions.js +24 -3
  341. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  342. package/dist/handlers/relay.js +108 -108
  343. package/dist/handlers/relay.js.map +1 -1
  344. package/dist/internal/Auth.d.ts +37 -11
  345. package/dist/internal/Auth.d.ts.map +1 -1
  346. package/dist/internal/Auth.js +75 -16
  347. package/dist/internal/Auth.js.map +1 -1
  348. package/dist/internal/Cache.d.ts.map +1 -1
  349. package/dist/internal/Cache.js +17 -11
  350. package/dist/internal/Cache.js.map +1 -1
  351. package/dist/internal/Cursor.js +1 -1
  352. package/dist/internal/Cursor.js.map +1 -1
  353. package/dist/internal/EarnRates.d.ts +89 -0
  354. package/dist/internal/EarnRates.d.ts.map +1 -0
  355. package/dist/internal/EarnRates.js +266 -0
  356. package/dist/internal/EarnRates.js.map +1 -0
  357. package/dist/internal/EarnVaults.d.ts +171 -0
  358. package/dist/internal/EarnVaults.d.ts.map +1 -0
  359. package/dist/internal/EarnVaults.js +547 -0
  360. package/dist/internal/EarnVaults.js.map +1 -0
  361. package/dist/internal/EdgeCache.d.ts +10 -3
  362. package/dist/internal/EdgeCache.d.ts.map +1 -1
  363. package/dist/internal/EdgeCache.js +43 -11
  364. package/dist/internal/EdgeCache.js.map +1 -1
  365. package/dist/internal/Id.d.ts +11 -0
  366. package/dist/internal/Id.d.ts.map +1 -1
  367. package/dist/internal/Id.js +13 -0
  368. package/dist/internal/Id.js.map +1 -1
  369. package/dist/internal/Idempotency.d.ts +83 -0
  370. package/dist/internal/Idempotency.d.ts.map +1 -0
  371. package/dist/internal/Idempotency.js +113 -0
  372. package/dist/internal/Idempotency.js.map +1 -0
  373. package/dist/internal/IpAllowlist.d.ts +15 -0
  374. package/dist/internal/IpAllowlist.d.ts.map +1 -0
  375. package/dist/internal/IpAllowlist.js +27 -0
  376. package/dist/internal/IpAllowlist.js.map +1 -0
  377. package/dist/internal/Log.d.ts +64 -9
  378. package/dist/internal/Log.d.ts.map +1 -1
  379. package/dist/internal/Log.js +29 -7
  380. package/dist/internal/Log.js.map +1 -1
  381. package/dist/internal/MetricSink.d.ts.map +1 -1
  382. package/dist/internal/MetricSink.js +47 -1
  383. package/dist/internal/MetricSink.js.map +1 -1
  384. package/dist/internal/OpenApi.d.ts +2 -2
  385. package/dist/internal/OpenApi.d.ts.map +1 -1
  386. package/dist/internal/OpenApi.js +4 -1
  387. package/dist/internal/OpenApi.js.map +1 -1
  388. package/dist/internal/Provider.d.ts +14 -0
  389. package/dist/internal/Provider.d.ts.map +1 -0
  390. package/dist/internal/Provider.js +5 -0
  391. package/dist/internal/Provider.js.map +1 -0
  392. package/dist/internal/Schema.d.ts +6 -1
  393. package/dist/internal/Schema.d.ts.map +1 -1
  394. package/dist/internal/Schema.js +20 -11
  395. package/dist/internal/Schema.js.map +1 -1
  396. package/dist/internal/Store.d.ts +6 -0
  397. package/dist/internal/Store.d.ts.map +1 -1
  398. package/dist/internal/Store.js +35 -0
  399. package/dist/internal/Store.js.map +1 -1
  400. package/dist/internal/Tidx.d.ts +49 -24
  401. package/dist/internal/Tidx.d.ts.map +1 -1
  402. package/dist/internal/Tidx.js +90 -12
  403. package/dist/internal/Tidx.js.map +1 -1
  404. package/dist/internal/Viem.d.ts +90 -65
  405. package/dist/internal/Viem.d.ts.map +1 -1
  406. package/dist/internal/Viem.js +90 -12
  407. package/dist/internal/Viem.js.map +1 -1
  408. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  409. package/dist/internal/WebhookDestination.js +34 -28
  410. package/dist/internal/WebhookDestination.js.map +1 -1
  411. package/dist/internal/Webhooks.d.ts +9 -0
  412. package/dist/internal/Webhooks.d.ts.map +1 -1
  413. package/dist/internal/Webhooks.js +15 -10
  414. package/dist/internal/Webhooks.js.map +1 -1
  415. package/dist/internal/exchange/Provider.d.ts +219 -0
  416. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  417. package/dist/internal/exchange/Provider.js +117 -0
  418. package/dist/internal/exchange/Provider.js.map +1 -0
  419. package/dist/internal/exchange/index.d.ts +2 -0
  420. package/dist/internal/exchange/index.d.ts.map +1 -0
  421. package/dist/internal/exchange/index.js +2 -0
  422. package/dist/internal/exchange/index.js.map +1 -0
  423. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  424. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  425. package/dist/internal/exchange/providers/uniswap.js +553 -0
  426. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  427. package/dist/internal/funding/Action.d.ts +55 -0
  428. package/dist/internal/funding/Action.d.ts.map +1 -0
  429. package/dist/internal/funding/Action.js +74 -0
  430. package/dist/internal/funding/Action.js.map +1 -0
  431. package/dist/internal/funding/Catalog.d.ts +107 -0
  432. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  433. package/dist/internal/funding/Catalog.js +270 -0
  434. package/dist/internal/funding/Catalog.js.map +1 -0
  435. package/dist/internal/funding/Chain.d.ts +76 -0
  436. package/dist/internal/funding/Chain.d.ts.map +1 -0
  437. package/dist/internal/funding/Chain.js +38 -0
  438. package/dist/internal/funding/Chain.js.map +1 -0
  439. package/dist/internal/funding/Deposit.d.ts +408 -0
  440. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  441. package/dist/internal/funding/Deposit.js +318 -0
  442. package/dist/internal/funding/Deposit.js.map +1 -0
  443. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  444. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  445. package/dist/internal/funding/DepositAddress.js +189 -0
  446. package/dist/internal/funding/DepositAddress.js.map +1 -0
  447. package/dist/internal/funding/Evidence.d.ts +48 -0
  448. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  449. package/dist/internal/funding/Evidence.js +315 -0
  450. package/dist/internal/funding/Evidence.js.map +1 -0
  451. package/dist/internal/funding/Provider.d.ts +1288 -0
  452. package/dist/internal/funding/Provider.d.ts.map +1 -0
  453. package/dist/internal/funding/Provider.js +1086 -0
  454. package/dist/internal/funding/Provider.js.map +1 -0
  455. package/dist/internal/funding/Reconciliation.d.ts +127 -0
  456. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  457. package/dist/internal/funding/Reconciliation.js +885 -0
  458. package/dist/internal/funding/Reconciliation.js.map +1 -0
  459. package/dist/internal/funding/Route.d.ts +21 -0
  460. package/dist/internal/funding/Route.d.ts.map +1 -0
  461. package/dist/internal/funding/Route.js +5 -0
  462. package/dist/internal/funding/Route.js.map +1 -0
  463. package/dist/internal/funding/SourceObservation.d.ts +108 -0
  464. package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
  465. package/dist/internal/funding/SourceObservation.js +143 -0
  466. package/dist/internal/funding/SourceObservation.js.map +1 -0
  467. package/dist/internal/funding/Subsidy.d.ts +113 -0
  468. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  469. package/dist/internal/funding/Subsidy.js +138 -0
  470. package/dist/internal/funding/Subsidy.js.map +1 -0
  471. package/dist/internal/funding/Token.d.ts +41 -0
  472. package/dist/internal/funding/Token.d.ts.map +1 -0
  473. package/dist/internal/funding/Token.js +22 -0
  474. package/dist/internal/funding/Token.js.map +1 -0
  475. package/dist/internal/funding/Transfer.d.ts +643 -0
  476. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  477. package/dist/internal/funding/Transfer.js +332 -0
  478. package/dist/internal/funding/Transfer.js.map +1 -0
  479. package/dist/internal/funding/index.d.ts +14 -0
  480. package/dist/internal/funding/index.d.ts.map +1 -0
  481. package/dist/internal/funding/index.js +14 -0
  482. package/dist/internal/funding/index.js.map +1 -0
  483. package/dist/internal/funding/providers/across.d.ts +21 -0
  484. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  485. package/dist/internal/funding/providers/across.js +117 -0
  486. package/dist/internal/funding/providers/across.js.map +1 -0
  487. package/dist/internal/funding/providers/relay.d.ts +88 -0
  488. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  489. package/dist/internal/funding/providers/relay.js +871 -0
  490. package/dist/internal/funding/providers/relay.js.map +1 -0
  491. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  492. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  493. package/dist/internal/funding/providers/rhino.js +116 -0
  494. package/dist/internal/funding/providers/rhino.js.map +1 -0
  495. package/dist/internal/funding/providers/squid.d.ts +19 -0
  496. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  497. package/dist/internal/funding/providers/squid.js +120 -0
  498. package/dist/internal/funding/providers/squid.js.map +1 -0
  499. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  500. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  501. package/dist/internal/funding/providers/symbiosis.js +176 -0
  502. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  503. package/dist/internal/index.d.ts +5 -1
  504. package/dist/internal/index.d.ts.map +1 -1
  505. package/dist/internal/index.js +5 -1
  506. package/dist/internal/index.js.map +1 -1
  507. package/dist/internal/webhookDestinations/url.js +61 -57
  508. package/dist/internal/webhookDestinations/url.js.map +1 -1
  509. package/dist/providers/index.d.ts +43 -0
  510. package/dist/providers/index.d.ts.map +1 -0
  511. package/dist/providers/index.js +19 -0
  512. package/dist/providers/index.js.map +1 -0
  513. package/package.json +10 -5
  514. package/src/ApiKey.test.ts +35 -0
  515. package/src/ApiKey.ts +27 -0
  516. package/src/ApiKeys.test.ts +40 -7
  517. package/src/ApiKeys.ts +46 -10
  518. package/src/App.test.ts +108 -15
  519. package/src/App.ts +296 -138
  520. package/src/Assets.ts +29 -4
  521. package/src/Client.test-d.ts +809 -37
  522. package/src/Scope.test.ts +19 -0
  523. package/src/Scope.ts +28 -11
  524. package/src/Webhooks.test.ts +25 -0
  525. package/src/Webhooks.ts +1 -1
  526. package/src/admin/App.test.ts +9 -2
  527. package/src/admin/App.ts +32 -9
  528. package/src/admin/apps/api-keys.test.ts +190 -22
  529. package/src/admin/apps/api-keys.ts +170 -28
  530. package/src/admin/apps/earn-vaults.test.ts +338 -0
  531. package/src/admin/apps/earn-vaults.ts +572 -0
  532. package/src/admin/apps/scopes.test.ts +16 -1
  533. package/src/admin/ui/plugin.ts +2 -2
  534. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  535. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  536. package/src/admin/ui/src/components/Page.tsx +1 -1
  537. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  538. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  539. package/src/admin/ui/src/lib/client.ts +1 -1
  540. package/src/admin/ui/src/lib/config.ts +1 -1
  541. package/src/admin/ui/src/lib/early-access.ts +8 -9
  542. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  543. package/src/admin/ui/src/lib/format.ts +13 -0
  544. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  545. package/src/admin/ui/src/lib/organizations.ts +7 -1
  546. package/src/admin/ui/src/lib/response.ts +22 -0
  547. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  548. package/src/admin/ui/src/lib/scopes.ts +28 -7
  549. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  550. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  551. package/src/admin/ui/src/router.tsx +2 -2
  552. package/src/admin/ui/src/routes/__root.tsx +9 -8
  553. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  554. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  555. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  556. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  557. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  558. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  559. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  560. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  561. package/src/admin/ui/vite.config.ts +4 -1
  562. package/src/admin/ui.generated.ts +113 -43
  563. package/src/analytics/Analytics.test.ts +69 -10
  564. package/src/analytics/Analytics.ts +24 -1
  565. package/src/analytics/tables/requestEvents.ts +79 -37
  566. package/src/apps/Zones.test.ts +33 -0
  567. package/src/apps/Zones.ts +40 -0
  568. package/src/apps/composition.test.ts +184 -3
  569. package/src/apps/data/App.test.ts +28 -23
  570. package/src/apps/data/App.ts +95 -36
  571. package/src/apps/data/FxOracle.ts +1 -1
  572. package/src/apps/data/index.ts +0 -1
  573. package/src/apps/data/routes/activities.test.ts +82 -6
  574. package/src/apps/data/routes/activities.ts +131 -71
  575. package/src/apps/data/routes/balances.test.ts +50 -37
  576. package/src/apps/data/routes/balances.ts +5 -5
  577. package/src/apps/data/routes/blocks.test.ts +2 -0
  578. package/src/apps/data/routes/coingecko.test.ts +22 -0
  579. package/src/apps/data/routes/coingecko.ts +84 -48
  580. package/src/apps/data/routes/earn.test.ts +1391 -0
  581. package/src/apps/data/routes/earn.ts +2188 -0
  582. package/src/apps/data/routes/exchanges.test.ts +82 -33
  583. package/src/apps/data/routes/exchanges.ts +842 -227
  584. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  585. package/src/apps/data/routes/fee-amm.ts +69 -12
  586. package/src/apps/data/routes/indexer.test.ts +43 -34
  587. package/src/apps/data/routes/indexer.ts +21 -3
  588. package/src/apps/data/routes/receipts.test.ts +5 -3
  589. package/src/apps/data/routes/receipts.ts +13 -11
  590. package/src/apps/data/routes/rpc.test.ts +446 -28
  591. package/src/apps/data/routes/rpc.ts +245 -25
  592. package/src/apps/data/routes/tokenlist.ts +72 -19
  593. package/src/apps/data/routes/tokens.test.ts +6 -8
  594. package/src/apps/data/routes/tokens.ts +258 -86
  595. package/src/apps/data/routes/transactions.test.ts +2 -0
  596. package/src/apps/data/routes/transactions.ts +77 -42
  597. package/src/apps/data/routes/transfers.test.ts +166 -4
  598. package/src/apps/data/routes/transfers.ts +216 -78
  599. package/src/apps/data/routes/valuation.test.ts +62 -9
  600. package/src/apps/data/routes/valuation.ts +2 -2
  601. package/src/apps/data/routes/webhooks.test.ts +386 -43
  602. package/src/apps/data/routes/webhooks.ts +172 -71
  603. package/src/apps/data/routes/zones.test.ts +473 -0
  604. package/src/apps/data/routes/zones.ts +338 -0
  605. package/src/apps/docs/reference.ts +8 -6
  606. package/src/apps/funding/Access.ts +26 -0
  607. package/src/apps/funding/App.test.ts +78 -0
  608. package/src/apps/funding/App.ts +63 -0
  609. package/src/apps/funding/Inventory.ts +30 -0
  610. package/src/apps/funding/ProviderAttempts.ts +26 -0
  611. package/src/apps/funding/index.ts +1 -0
  612. package/src/apps/funding/routes/chains.test.ts +78 -0
  613. package/src/apps/funding/routes/chains.ts +101 -0
  614. package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
  615. package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
  616. package/src/apps/funding/routes/providers.test.ts +165 -0
  617. package/src/apps/funding/routes/providers.ts +73 -0
  618. package/src/apps/funding/routes/quotes.test.ts +511 -0
  619. package/src/apps/funding/routes/quotes.ts +205 -0
  620. package/src/apps/funding/routes/transfers.test.ts +1255 -0
  621. package/src/apps/funding/routes/transfers.ts +704 -0
  622. package/src/apps/index.ts +3 -1
  623. package/src/apps/management/Billing.test.ts +29 -0
  624. package/src/apps/management/Billing.ts +23 -0
  625. package/src/apps/management/Error.ts +12 -0
  626. package/src/apps/management/routes/api-keys.test.ts +103 -3
  627. package/src/apps/management/routes/api-keys.ts +98 -10
  628. package/src/apps/management/routes/invitations.ts +4 -11
  629. package/src/apps/management/routes/orgs.ts +2 -9
  630. package/src/apps/management/routes/scopes.test.ts +7 -2
  631. package/src/apps/management/routes/scopes.ts +2 -2
  632. package/src/apps/management/routes/webhooks.test.ts +6 -1
  633. package/src/apps/management/routes/webhooks.ts +15 -3
  634. package/src/apps/mcp.test.ts +17 -2
  635. package/src/apps/mcp.ts +18 -13
  636. package/src/apps/metadata.ts +12 -0
  637. package/src/apps/mpp/App.ts +276 -29
  638. package/src/apps/mpp/Mpp.test.ts +631 -26
  639. package/src/apps/mpp/Mpp.ts +0 -42
  640. package/src/apps/mpp/internal/Adapter.ts +108 -3
  641. package/src/apps/mpp/internal/Error.test.ts +33 -0
  642. package/src/apps/mpp/internal/Error.ts +44 -6
  643. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  644. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  645. package/src/apps/mpp/internal/Policy.test.ts +128 -0
  646. package/src/apps/mpp/internal/Policy.ts +98 -0
  647. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  648. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  649. package/src/apps/mpp/internal/Screening.ts +40 -3
  650. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  651. package/src/apps/mpp/internal/Utils.ts +30 -0
  652. package/src/apps/relay/App.test.ts +493 -62
  653. package/src/apps/relay/App.ts +233 -23
  654. package/src/apps/relay/Sponsorships.test.ts +49 -0
  655. package/src/apps/relay/Sponsorships.ts +18 -6
  656. package/src/cloudflare.ts +279 -0
  657. package/src/db/Db.ts +501 -0
  658. package/src/db/Schema.ts +349 -2
  659. package/src/db/tables/earnVaults.test.ts +185 -0
  660. package/src/db/tables/earnVaults.ts +151 -0
  661. package/src/db/tables/fundingCatalog.test.ts +108 -0
  662. package/src/db/tables/fundingCatalog.ts +157 -0
  663. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  664. package/src/db/tables/fundingDepositAddresses.ts +404 -0
  665. package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
  666. package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
  667. package/src/db/tables/fundingDeposits.test.ts +399 -0
  668. package/src/db/tables/fundingDeposits.ts +373 -0
  669. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  670. package/src/db/tables/fundingIdempotency.ts +180 -0
  671. package/src/db/tables/fundingTransferEvents.ts +28 -0
  672. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  673. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  674. package/src/db/tables/fundingTransfers.test.ts +89 -0
  675. package/src/db/tables/fundingTransfers.ts +153 -0
  676. package/src/db/tables/organizations.ts +16 -0
  677. package/src/db/tables/projects.ts +16 -0
  678. package/src/db/tables/requestUsage.ts +23 -0
  679. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  680. package/src/db/tables/sponsoredTransactions.ts +3 -3
  681. package/src/db/tables/users.ts +16 -0
  682. package/src/db/tables/verifiedTokens.ts +19 -14
  683. package/src/db/tables/webhookSubscriptions.ts +58 -3
  684. package/src/handlers/relay.test.ts +2 -0
  685. package/src/handlers/relay.ts +95 -99
  686. package/src/internal/Auth.test.ts +225 -5
  687. package/src/internal/Auth.ts +109 -20
  688. package/src/internal/Cache.test.ts +37 -3
  689. package/src/internal/Cache.ts +14 -10
  690. package/src/internal/Cursor.test.ts +2 -2
  691. package/src/internal/Cursor.ts +1 -1
  692. package/src/internal/EarnRates.test.ts +125 -0
  693. package/src/internal/EarnRates.ts +409 -0
  694. package/src/internal/EarnVaults.test.ts +195 -0
  695. package/src/internal/EarnVaults.ts +876 -0
  696. package/src/internal/EdgeCache.test.ts +26 -7
  697. package/src/internal/EdgeCache.ts +48 -9
  698. package/src/internal/Id.ts +14 -0
  699. package/src/internal/Idempotency.test.ts +109 -0
  700. package/src/internal/Idempotency.ts +237 -0
  701. package/src/internal/IpAllowlist.test.ts +52 -0
  702. package/src/internal/IpAllowlist.ts +39 -0
  703. package/src/internal/Log.test-d.ts +41 -8
  704. package/src/internal/Log.test.ts +196 -9
  705. package/src/internal/Log.ts +124 -17
  706. package/src/internal/MetricSink.test.ts +244 -4
  707. package/src/internal/MetricSink.ts +51 -1
  708. package/src/internal/OpenApi.ts +4 -1
  709. package/src/internal/Provider.test.ts +17 -0
  710. package/src/internal/Provider.ts +17 -0
  711. package/src/internal/Schema.ts +27 -17
  712. package/src/internal/Store.test.ts +25 -0
  713. package/src/internal/Store.ts +46 -0
  714. package/src/internal/Tidx.local.test.ts +78 -3
  715. package/src/internal/Tidx.test.ts +240 -18
  716. package/src/internal/Tidx.ts +129 -33
  717. package/src/internal/VerifiedTokens.test.ts +15 -0
  718. package/src/internal/Viem.test.ts +198 -17
  719. package/src/internal/Viem.ts +127 -28
  720. package/src/internal/WebhookDestination.ts +25 -23
  721. package/src/internal/Webhooks.test.ts +59 -0
  722. package/src/internal/Webhooks.ts +34 -10
  723. package/src/internal/exchange/Provider.test.ts +216 -0
  724. package/src/internal/exchange/Provider.ts +326 -0
  725. package/src/internal/exchange/index.test.ts +6 -0
  726. package/src/internal/exchange/index.ts +1 -0
  727. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  728. package/src/internal/exchange/providers/uniswap.ts +682 -0
  729. package/src/internal/funding/Action.test.ts +138 -0
  730. package/src/internal/funding/Action.ts +117 -0
  731. package/src/internal/funding/Catalog.test.ts +311 -0
  732. package/src/internal/funding/Catalog.ts +347 -0
  733. package/src/internal/funding/Chain.test.ts +79 -0
  734. package/src/internal/funding/Chain.ts +120 -0
  735. package/src/internal/funding/Deposit.test.ts +26 -0
  736. package/src/internal/funding/Deposit.ts +522 -0
  737. package/src/internal/funding/DepositAddress.test.ts +18 -0
  738. package/src/internal/funding/DepositAddress.ts +312 -0
  739. package/src/internal/funding/Evidence.test.ts +297 -0
  740. package/src/internal/funding/Evidence.ts +425 -0
  741. package/src/internal/funding/Provider.test.ts +1328 -0
  742. package/src/internal/funding/Provider.ts +1911 -0
  743. package/src/internal/funding/Reconciliation.local.test.ts +511 -0
  744. package/src/internal/funding/Reconciliation.test.ts +3037 -0
  745. package/src/internal/funding/Reconciliation.ts +1202 -0
  746. package/src/internal/funding/Route.test.ts +66 -0
  747. package/src/internal/funding/Route.ts +29 -0
  748. package/src/internal/funding/SourceObservation.test.ts +301 -0
  749. package/src/internal/funding/SourceObservation.ts +267 -0
  750. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  751. package/src/internal/funding/Subsidy.test.ts +75 -0
  752. package/src/internal/funding/Subsidy.ts +260 -0
  753. package/src/internal/funding/Token.test.ts +47 -0
  754. package/src/internal/funding/Token.ts +59 -0
  755. package/src/internal/funding/Transfer.test.ts +369 -0
  756. package/src/internal/funding/Transfer.ts +522 -0
  757. package/src/internal/funding/index.test.ts +21 -0
  758. package/src/internal/funding/index.ts +13 -0
  759. package/src/internal/funding/providers/across.ts +149 -0
  760. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  761. package/src/internal/funding/providers/relay.test.ts +564 -0
  762. package/src/internal/funding/providers/relay.ts +1060 -0
  763. package/src/internal/funding/providers/rhino.ts +139 -0
  764. package/src/internal/funding/providers/squid.ts +151 -0
  765. package/src/internal/funding/providers/symbiosis.ts +221 -0
  766. package/src/internal/index.test.ts +5 -1
  767. package/src/internal/index.ts +5 -1
  768. package/src/internal/webhookDestinations/url.ts +49 -45
  769. package/src/providers/index.test.ts +14 -0
  770. package/src/providers/index.ts +54 -0
  771. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  772. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  773. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  774. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  775. package/dist/apps/data/routes/funding.d.ts.map +0 -1
  776. package/dist/apps/data/routes/funding.js +0 -410
  777. package/dist/apps/data/routes/funding.js.map +0 -1
  778. package/dist/internal/FundingQuotes.d.ts +0 -864
  779. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  780. package/dist/internal/FundingQuotes.js +0 -672
  781. package/dist/internal/FundingQuotes.js.map +0 -1
  782. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  783. package/src/apps/data/routes/funding.test.ts +0 -503
  784. package/src/apps/data/routes/funding.ts +0 -604
  785. package/src/internal/FundingQuotes.test.ts +0 -456
  786. package/src/internal/FundingQuotes.ts +0 -944
@@ -21,6 +21,7 @@ import * as TestStore from '../../test/Store.js'
21
21
  import * as Tempo from '../../test/Tempo.js'
22
22
 
23
23
  const key = {
24
+ allowedIps: [],
24
25
  environment: 'production',
25
26
  id: 'key_test',
26
27
  name: 'Test key',
@@ -295,6 +296,135 @@ describe('require', () => {
295
296
  }
296
297
  `)
297
298
  })
299
+
300
+ test.each([
301
+ ['tempo-api-key', '/protected', { 'tempo-api-key': token }],
302
+ ['Bearer', '/protected', { authorization: `Bearer ${token}` }],
303
+ ['x-api-key', '/protected', { 'x-api-key': token }],
304
+ ['query key', `/protected?key=${token}`, {}],
305
+ ] as const)('enforces an allowlist for the %s credential', async (_name, path, credential) => {
306
+ const app = createApp({
307
+ auth: {
308
+ apiKey: {
309
+ resolve: TestApp.resolver({
310
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
311
+ }),
312
+ },
313
+ rateLimit: RateLimit.memory(),
314
+ },
315
+ })
316
+ const response = await app.request(path, {
317
+ headers: { ...credential, 'cf-connecting-ip': '198.51.100.7' },
318
+ })
319
+
320
+ expect(response.status).toBe(403)
321
+ expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
322
+ })
323
+
324
+ test('rejects a missing client IP', async () => {
325
+ const app = createApp({
326
+ auth: {
327
+ apiKey: {
328
+ resolve: TestApp.resolver({
329
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
330
+ }),
331
+ },
332
+ rateLimit: RateLimit.memory(),
333
+ },
334
+ })
335
+ const response = await app.request('/protected', {
336
+ headers: { 'tempo-api-key': token },
337
+ })
338
+
339
+ expect(response.status).toBe(403)
340
+ expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
341
+ })
342
+
343
+ test('does not trust a Cloudflare IP header outside Cloudflare', async () => {
344
+ const app = createApp({
345
+ auth: {
346
+ apiKey: {
347
+ resolve: TestApp.resolver({
348
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
349
+ }),
350
+ },
351
+ rateLimit: RateLimit.memory(),
352
+ },
353
+ })
354
+ const response = await app.request('/protected', {
355
+ headers: {
356
+ 'cf-connecting-ip': '203.0.113.7',
357
+ 'tempo-api-key': token,
358
+ },
359
+ })
360
+
361
+ expect(response.status).toBe(403)
362
+ expect(await response.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
363
+ })
364
+
365
+ test('uses the Cloudflare IP header with Cloudflare request metadata', async () => {
366
+ const app = createApp({
367
+ auth: {
368
+ apiKey: {
369
+ resolve: TestApp.resolver({
370
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
371
+ }),
372
+ },
373
+ rateLimit: RateLimit.memory(),
374
+ },
375
+ })
376
+ const request = Object.assign(
377
+ new Request('http://localhost/protected', {
378
+ headers: {
379
+ 'cf-connecting-ip': '203.0.113.7',
380
+ 'tempo-api-key': token,
381
+ },
382
+ }),
383
+ { cf: {} },
384
+ )
385
+ const response = await app.fetch(request)
386
+
387
+ expect(response.status).toBe(200)
388
+ })
389
+
390
+ test('uses the configured trusted client-IP resolver', async () => {
391
+ const app = createApp({
392
+ auth: {
393
+ apiKey: {
394
+ resolve: TestApp.resolver({
395
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
396
+ }),
397
+ },
398
+ publicClientIp: (request) => request.headers.get('x-real-ip') ?? undefined,
399
+ rateLimit: RateLimit.memory(),
400
+ },
401
+ })
402
+ const response = await app.request('/protected', {
403
+ headers: {
404
+ 'cf-connecting-ip': '198.51.100.7',
405
+ 'tempo-api-key': token,
406
+ 'x-real-ip': '203.0.113.7',
407
+ },
408
+ })
409
+
410
+ expect(response.status).toBe(200)
411
+ })
412
+
413
+ test('treats an empty allowlist as unrestricted', async () => {
414
+ const app = createApp({
415
+ auth: {
416
+ apiKey: {
417
+ resolve: TestApp.resolver({ keys: [{ ...key, allowedIps: [], token }] }),
418
+ },
419
+ rateLimit: RateLimit.memory(),
420
+ },
421
+ })
422
+ const response = await app.request('/protected', {
423
+ headers: { 'tempo-api-key': token },
424
+ })
425
+
426
+ expect(response.status).toBe(200)
427
+ })
298
428
  })
299
429
 
300
430
  describe('session', () => {
@@ -383,6 +513,37 @@ describe('require', () => {
383
513
  `)
384
514
  })
385
515
 
516
+ test('applies the session-only route error before key restrictions', async () => {
517
+ const app = createApp({
518
+ auth: {
519
+ apiKey: {
520
+ resolve: TestApp.resolver({
521
+ keys: [{ ...key, allowedIps: ['203.0.113.0/24'], token }],
522
+ }),
523
+ },
524
+ publicClientIp: (request) => request.headers.get('x-real-ip') ?? undefined,
525
+ rateLimit: RateLimit.memory(),
526
+ },
527
+ policy: { session: true },
528
+ })
529
+ const response = await app.request('/protected', {
530
+ headers: {
531
+ 'tempo-api-key': token,
532
+ 'x-real-ip': '198.51.100.7',
533
+ },
534
+ })
535
+
536
+ expect(response.status).toBe(403)
537
+ expect(await response.json()).toMatchInlineSnapshot(`
538
+ {
539
+ "error": {
540
+ "code": "forbidden",
541
+ "message": "API key not permitted for this route",
542
+ },
543
+ }
544
+ `)
545
+ })
546
+
386
547
  test('is not consulted on lane-less routes', async () => {
387
548
  const app = createSessionApp({
388
549
  policy: {},
@@ -1228,7 +1389,7 @@ describe('require', () => {
1228
1389
  })
1229
1390
  })
1230
1391
 
1231
- test('rejects a voucher that exceeds the channel deposit', async () => {
1392
+ test('tops up the channel before signing a voucher that exceeds its deposit', async () => {
1232
1393
  const mpp = createMppServer()
1233
1394
  const app = createApp({
1234
1395
  auth: {
@@ -1243,14 +1404,25 @@ describe('require', () => {
1243
1404
  })
1244
1405
  const client = createMppClient(app)
1245
1406
 
1246
- // The opening deposit covers one request; the second voucher overruns
1247
- // it and the low-level client cannot top up, so the server re-challenges.
1407
+ // The opening deposit covers one request. The client tops up the channel
1408
+ // before signing the second voucher.
1248
1409
  const first = await client.fetch('http://tempo-api.test/protected')
1249
1410
  const second = await client.fetch('http://tempo-api.test/protected')
1250
1411
 
1251
1412
  expect(first.status).toBe(200)
1252
- expect(second.status).toBe(402)
1253
- expect(second.headers.get('www-authenticate')?.startsWith('Payment ')).toBe(true)
1413
+ expect(second.status).toBe(200)
1414
+
1415
+ const receipt1 = sessionReceipt(first)
1416
+ const receipt2 = sessionReceipt(second)
1417
+ expect(receipt2).toMatchObject({
1418
+ channelId: receipt1.channelId,
1419
+ spent: '2000000',
1420
+ })
1421
+
1422
+ const state = await Actions.channel.getStates(Tempo.client, {
1423
+ channel: receipt1.channelId,
1424
+ })
1425
+ expect(state.deposit).toBe(2_000_000n)
1254
1426
  })
1255
1427
 
1256
1428
  test('rejects a malformed payment credential with a fresh challenge', async () => {
@@ -1889,6 +2061,54 @@ describe('ensureProject', () => {
1889
2061
  })
1890
2062
  })
1891
2063
 
2064
+ describe('parseCredential', () => {
2065
+ test('parses credentials keyed by chain id', () => {
2066
+ const credential = Auth.parseCredential(
2067
+ JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone:secret' }),
2068
+ )
2069
+
2070
+ expect(credential).toEqual({ 4217: 'mainnet:secret', 421700001: 'zone:secret' })
2071
+ })
2072
+
2073
+ test('supports a shared credential', () => {
2074
+ expect(Auth.parseCredential('shared:secret')).toBe('shared:secret')
2075
+ })
2076
+
2077
+ test('rejects malformed credential maps', () => {
2078
+ expect(() => Auth.parseCredential('{"4217":1}')).toThrowErrorMatchingInlineSnapshot(
2079
+ `[Error: Expected a credential or a chain-id-to-credential JSON object.]`,
2080
+ )
2081
+ })
2082
+ })
2083
+
2084
+ describe('resolveCredential', () => {
2085
+ test('infers Basic auth from a credential containing a colon', () => {
2086
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'user:password' })).toEqual({
2087
+ basicAuth: 'user:password',
2088
+ })
2089
+ })
2090
+
2091
+ test('infers Bearer auth from a credential without a colon', () => {
2092
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'bearer-token' })).toEqual({
2093
+ basicAuth: undefined,
2094
+ bearerAuth: 'bearer-token',
2095
+ })
2096
+ })
2097
+
2098
+ test('selects a credential by chain id', () => {
2099
+ const value = JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone-token' })
2100
+
2101
+ expect(Auth.resolveCredential({ chainId: 4217, value })).toEqual({
2102
+ basicAuth: 'mainnet:secret',
2103
+ })
2104
+ expect(Auth.resolveCredential({ chainId: 421700001, value })).toEqual({
2105
+ basicAuth: undefined,
2106
+ bearerAuth: 'zone-token',
2107
+ })
2108
+ expect(Auth.resolveCredential({ chainId: 42431, value })).toEqual({ basicAuth: undefined })
2109
+ })
2110
+ })
2111
+
1892
2112
  function createScopedApp(options: {
1893
2113
  auth?: Auth.Context | undefined
1894
2114
  routes: readonly { path: string; policy: Auth.require.Policy }[]
@@ -9,6 +9,7 @@ import { findTargetHandler } from 'hono/utils/handler'
9
9
  import { Challenge, Credential, type Method } from 'mppx'
10
10
  import { Mppx, tempo } from 'mppx/hono'
11
11
  import { Addresses } from 'viem/tempo'
12
+ import { tempoMainnet } from 'viem/tempo/chains'
12
13
  import * as z from 'zod/mini'
13
14
 
14
15
  import type * as App from '../App.js'
@@ -17,6 +18,7 @@ import * as ApiKeys from '../ApiKeys.js'
17
18
  import * as Db from '../db/Db.js'
18
19
  import type * as Store from './Store.js'
19
20
  import * as Memberships from '../db/tables/memberships.js'
21
+ import * as IpAllowlist from './IpAllowlist.js'
20
22
  import * as Metadata from '../apps/metadata.js'
21
23
  import * as OpenApi from './OpenApi.js'
22
24
  import * as Organizations from '../db/tables/organizations.js'
@@ -26,7 +28,6 @@ import * as Response from './Response.js'
26
28
  import * as Schema from './Schema.js'
27
29
  import * as Scope from '../Scope.js'
28
30
  import * as Users from '../db/tables/users.js'
29
- import * as Viem from './Viem.js'
30
31
 
31
32
  const policySymbol = Symbol('tempo-api.auth.policy')
32
33
  const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management')
@@ -438,12 +439,16 @@ export function accessError(c: hono_Context) {
438
439
  status: 401,
439
440
  })
440
441
  }
441
- if (status === 403)
442
+ if (status === 403) {
443
+ const ipForbidden = c.req.header('tempo-narrow-access-code') === 'api_key_ip_forbidden'
442
444
  return Response.error(c, {
443
- code: 'api_key_forbidden',
444
- message: 'API key missing required scope',
445
+ code: ipForbidden ? 'api_key_ip_forbidden' : 'api_key_forbidden',
446
+ message: ipForbidden
447
+ ? 'API key not permitted from this IP address'
448
+ : 'API key missing required scope',
445
449
  status: 403,
446
450
  })
451
+ }
447
452
  const code =
448
453
  c.req.header('tempo-narrow-access-code') === 'rate_limit_exceeded'
449
454
  ? 'rate_limit_exceeded'
@@ -511,8 +516,8 @@ export function middleware<
511
516
  // store is configured, every token resolves to `null` (closed).
512
517
  // Resolution is cached per isolate by default (positive 60s / negative 10s,
513
518
  // keyed by token sha256) so hot keys skip the backend read on the auth path
514
- // of every request. Pass `apiKey.cache: false` when instant revocation
515
- // matters more than the per-request read.
519
+ // of every request. Pass `apiKey.cache: false` when immediate key updates
520
+ // matter more than the per-request read.
516
521
  const resolve = (() => {
517
522
  const uncached = (c: hono_Context, token: string) => {
518
523
  const kv = contextKv(c)
@@ -606,8 +611,8 @@ export declare namespace middleware {
606
611
  /**
607
612
  * Resolve-cache tuning (per-isolate, positive 60s / negative 10s by
608
613
  * default), or `false` to resolve uncached on every request — e.g.
609
- * when instant revocation matters more than the per-request backend
610
- * read.
614
+ * when immediate key updates matter more than the per-request
615
+ * backend read.
611
616
  */
612
617
  cache?: Cache | false | undefined
613
618
  /** API-key quotas keyed by quota scope (reserved `'*'` is the config default). */
@@ -624,7 +629,7 @@ export declare namespace middleware {
624
629
  /** Default public access policy. Pass false to disable anonymous access. */
625
630
  public?:
626
631
  | {
627
- /** Resolves the client IP from trusted runtime or proxy metadata. Defaults to `cf-connecting-ip`. */
632
+ /** Resolves the client IP from trusted runtime or proxy metadata. Required outside Cloudflare for API-key allowlists. */
628
633
  clientIp?: ((request: Request) => string | undefined) | undefined
629
634
  /** Anonymous public quota for protected routes. */
630
635
  rateLimit?: RateLimit.Limit | undefined
@@ -1448,10 +1453,32 @@ export function require<environment extends Environment = Environment>(
1448
1453
  const principal = principalFromApiKey(apiKey)
1449
1454
  c.set('principal', principal)
1450
1455
 
1456
+ // Default-deny: routes with no API-key lane allow only the super admin.
1457
+ // A valid key is authenticated but forbidden.
1458
+ if (!policy.apiKey)
1459
+ return jsonError(c, {
1460
+ code: 'forbidden',
1461
+ message: 'API key not permitted for this route',
1462
+ status: 403,
1463
+ })
1464
+
1465
+ if (
1466
+ apiKey.allowedIps.length &&
1467
+ !(await IpAllowlist.allows(c, {
1468
+ address: trustedClientIp(c, auth),
1469
+ rules: apiKey.allowedIps,
1470
+ }))
1471
+ )
1472
+ return jsonError(c, {
1473
+ code: 'api_key_ip_forbidden',
1474
+ message: 'API key not permitted from this IP address',
1475
+ status: 403,
1476
+ })
1477
+
1451
1478
  if (
1452
1479
  apiKey.environment === 'sandbox' &&
1453
1480
  explicitChain !== undefined &&
1454
- Viem.isMainnet(explicitChain)
1481
+ explicitChain === tempoMainnet.id
1455
1482
  )
1456
1483
  return jsonError(c, {
1457
1484
  code: 'api_key_forbidden',
@@ -1459,14 +1486,6 @@ export function require<environment extends Environment = Environment>(
1459
1486
  status: 403,
1460
1487
  })
1461
1488
 
1462
- // Default-deny: routes with no API-key lane allow only the super admin.
1463
- // A valid key is authenticated but forbidden.
1464
- if (!policy.apiKey)
1465
- return jsonError(c, {
1466
- code: 'forbidden',
1467
- message: 'API key not permitted for this route',
1468
- status: 403,
1469
- })
1470
1489
  const missing = apiKey.scopes.includes(Scope.wildcard)
1471
1490
  ? []
1472
1491
  : (policy.apiKey?.scopes.filter((scope) => !apiKey.scopes.includes(scope)) ?? [])
@@ -1644,6 +1663,65 @@ type RateLimitAccess = PaymentAccess & {
1644
1663
  rateLimit: RateLimit.Result
1645
1664
  }
1646
1665
 
1666
+ /** Shared or per-chain credentials. */
1667
+ export type ChainCredential = string | Record<number, string>
1668
+
1669
+ /** Parses shared or per-chain credentials from an environment value. */
1670
+ export function parseCredential(value: ChainCredential | undefined): parseCredential.ReturnType {
1671
+ if (!value) return undefined
1672
+ if (typeof value !== 'string') return value
1673
+ const credentials = (() => {
1674
+ try {
1675
+ return JSON.parse(value) as unknown
1676
+ } catch {
1677
+ return value
1678
+ }
1679
+ })()
1680
+ if (typeof credentials === 'string') return credentials
1681
+ if (
1682
+ !credentials ||
1683
+ typeof credentials !== 'object' ||
1684
+ Array.isArray(credentials) ||
1685
+ Object.values(credentials).some((credential) => typeof credential !== 'string')
1686
+ )
1687
+ throw new Error('Expected a credential or a chain-id-to-credential JSON object.')
1688
+ return credentials as Record<number, string>
1689
+ }
1690
+
1691
+ export declare namespace parseCredential {
1692
+ /** Parsed shared or per-chain credentials. */
1693
+ type ReturnType = ChainCredential | undefined
1694
+ }
1695
+
1696
+ /** Resolves a chain credential and infers its HTTP authorization scheme. */
1697
+ export function resolveCredential(
1698
+ options: resolveCredential.Options,
1699
+ ): resolveCredential.ReturnType {
1700
+ const credentials = parseCredential(options.value)
1701
+ const credential = typeof credentials === 'string' ? credentials : credentials?.[options.chainId]
1702
+ if (!credential) return { basicAuth: undefined }
1703
+ if (credential.includes(':')) return { basicAuth: credential }
1704
+ return { basicAuth: undefined, bearerAuth: credential }
1705
+ }
1706
+
1707
+ export declare namespace resolveCredential {
1708
+ /** Options for resolving a chain credential. */
1709
+ type Options = {
1710
+ /** Chain id selecting a per-chain credential. */
1711
+ chainId: number
1712
+ /** Shared or per-chain credentials. */
1713
+ value?: ChainCredential | undefined
1714
+ }
1715
+
1716
+ /** Resolved HTTP authorization credentials. */
1717
+ type ReturnType = {
1718
+ /** Basic credentials inferred from a value containing a colon. */
1719
+ basicAuth: string | undefined
1720
+ /** Bearer credential inferred from a value without a colon. */
1721
+ bearerAuth?: string | undefined
1722
+ }
1723
+ }
1724
+
1647
1725
  /**
1648
1726
  * How long to wait for the rate-limit counter before failing open. A hot
1649
1727
  * counter backend (e.g. a single Durable Object serving one busy quota bucket)
@@ -1762,6 +1840,17 @@ function getApiKeyCredential(c: hono_Context): ApiKeyCredential | false | null {
1762
1840
  return null
1763
1841
  }
1764
1842
 
1843
+ function clientIp(c: hono_Context, auth: Context): string | undefined {
1844
+ return auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')
1845
+ }
1846
+
1847
+ function trustedClientIp(c: hono_Context, auth: Context): string | undefined {
1848
+ if (auth.publicClientIp) return auth.publicClientIp(c.req.raw)
1849
+ // Cloudflare supplies both the request metadata and this header.
1850
+ if (!('cf' in c.req.raw)) return undefined
1851
+ return c.req.header('cf-connecting-ip')
1852
+ }
1853
+
1765
1854
  /** Removes the reserved auth query parameter before route validation. */
1766
1855
  function stripApiKeyQuery(c: hono_Context) {
1767
1856
  const url = new URL(c.req.url)
@@ -1877,7 +1966,7 @@ function principalFromApiKey(apiKey: ApiKey.ApiKey): Principal {
1877
1966
  }
1878
1967
 
1879
1968
  function principalFromPublic(c: hono_Context, auth: Context): Principal {
1880
- const ip = auth.publicClientIp ? auth.publicClientIp(c.req.raw) : c.req.header('cf-connecting-ip')
1969
+ const ip = clientIp(c, auth)
1881
1970
  return {
1882
1971
  id: ip ? RateLimit.normalizeIp(ip) : 'anonymous',
1883
1972
  type: 'public',
@@ -1997,7 +2086,7 @@ const cachedMaxEntries = 10_000
1997
2086
  * (default 60s), negative for `negativeTtl` (default 10s) so a freshly minted
1998
2087
  * key is usable quickly; concurrent misses for one token are single-flighted.
1999
2088
  * Entries are keyed by the token's sha256 (`ApiKey.hash`) — never the
2000
- * plaintext. A revoked key may stay resolvable for up to `ttl` the accepted
2089
+ * plaintext. Key updates may remain stale for up to `ttl`, the accepted
2001
2090
  * trade-off for removing a backend read from the auth path.
2002
2091
  */
2003
2092
  function cachedResolve(
@@ -52,7 +52,7 @@ describe('response', () => {
52
52
  expect(etag(first)).toMatchInlineSnapshot(`"<etag>"`)
53
53
  expect(first.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"9"`)
54
54
  expect(first.headers.get('vary')).toMatchInlineSnapshot(
55
- `"Accept-Encoding, Authorization, Tempo-API-Key"`,
55
+ `"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
56
56
  )
57
57
 
58
58
  expect(await second.json()).toMatchInlineSnapshot(`
@@ -66,7 +66,7 @@ describe('response', () => {
66
66
  expect(second.headers.get('etag') === first.headers.get('etag')).toMatchInlineSnapshot(`true`)
67
67
  expect(second.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"8"`)
68
68
  expect(second.headers.get('vary')).toMatchInlineSnapshot(
69
- `"Accept-Encoding, Authorization, Tempo-API-Key"`,
69
+ `"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
70
70
  )
71
71
 
72
72
  expect(third.status).toMatchInlineSnapshot(`304`)
@@ -77,11 +77,45 @@ describe('response', () => {
77
77
  expect(third.headers.get('etag') === first.headers.get('etag')).toMatchInlineSnapshot(`true`)
78
78
  expect(third.headers.get('ratelimit-remaining')).toMatchInlineSnapshot(`"8"`)
79
79
  expect(third.headers.get('vary')).toMatchInlineSnapshot(
80
- `"Accept-Encoding, Authorization, Tempo-API-Key"`,
80
+ `"Accept-Encoding, Authorization, Tempo-API-Key, X-API-Key"`,
81
81
  )
82
82
  })
83
83
  })
84
84
 
85
+ test('varies cached responses by the legacy API-key header', async () => {
86
+ await withCaches(async () => {
87
+ let calls = 0
88
+ const app = new Hono()
89
+ app.get('/', Cache.response({ key: (c) => c.req.url, name: 'test' }), (c) =>
90
+ c.json({ calls: ++calls, token: c.req.header('x-api-key') }),
91
+ )
92
+
93
+ const first = await app.request('/', { headers: { 'x-api-key': 'one' } })
94
+ const second = await app.request('/', { headers: { 'x-api-key': 'two' } })
95
+ const hit = await app.request('/', { headers: { 'x-api-key': 'one' } })
96
+
97
+ expect(calls).toMatchInlineSnapshot(`2`)
98
+ expect(await first.json()).toMatchInlineSnapshot(`
99
+ {
100
+ "calls": 1,
101
+ "token": "one",
102
+ }
103
+ `)
104
+ expect(await second.json()).toMatchInlineSnapshot(`
105
+ {
106
+ "calls": 2,
107
+ "token": "two",
108
+ }
109
+ `)
110
+ expect(await hit.json()).toMatchInlineSnapshot(`
111
+ {
112
+ "calls": 1,
113
+ "token": "one",
114
+ }
115
+ `)
116
+ })
117
+ })
118
+
85
119
  test('stores entries with the shared policy form, not the client form', async () => {
86
120
  await withCaches(async (stores) => {
87
121
  const app = new Hono()
@@ -57,7 +57,7 @@ export function response<environment extends Env>(
57
57
  options: response.Options<environment>,
58
58
  ): MiddlewareHandler<environment> {
59
59
  const defaultCacheControl = options.cacheControl ?? policies.default
60
- const vary = options.vary ?? ['Accept-Encoding', 'Authorization', 'Tempo-API-Key']
60
+ const vary = options.vary ?? ['Accept-Encoding', 'Authorization', 'Tempo-API-Key', 'X-API-Key']
61
61
  // hono/cache suffixes its key with `::<directive>=<value>` for every
62
62
  // configured vary directive (trimmed, lowercased, deduped). Mirror that
63
63
  // normalization so the `no-cache` purge below deletes exactly the entry the
@@ -140,7 +140,7 @@ export function response<environment extends Env>(
140
140
  let res = result instanceof Response ? new Response(result.body, result) : c.res
141
141
  if (
142
142
  result instanceof Response &&
143
- etagMatches(res.headers.get('ETag'), c.req.header('If-None-Match'))
143
+ Etag.matches(res.headers.get('ETag'), c.req.header('If-None-Match'))
144
144
  )
145
145
  res = notModified(res)
146
146
 
@@ -158,7 +158,9 @@ export function response<environment extends Env>(
158
158
 
159
159
  // `markCacheable` lets the edge layer pay its store lookup only on routes
160
160
  // that mount this middleware; everything else skips the read.
161
- return EdgeCache.markCacheable(middleware)
161
+ return EdgeCache.markCacheable(middleware, {
162
+ key: options.key as (c: Context) => Promise<string> | string,
163
+ })
162
164
  }
163
165
 
164
166
  export declare namespace response {
@@ -214,9 +216,15 @@ export function urlKey<
214
216
  return url.toString()
215
217
  }
216
218
 
217
- function etagMatches(etag: string | null, ifNoneMatch: string | undefined) {
218
- if (!etag || !ifNoneMatch) return false
219
- return ifNoneMatch.split(/,\s*/).some((tag) => stripWeak(tag) === stripWeak(etag))
219
+ namespace Etag {
220
+ export function matches(etag: string | null, ifNoneMatch: string | undefined) {
221
+ if (!etag || !ifNoneMatch) return false
222
+ return ifNoneMatch.split(/,\s*/).some((tag) => stripWeak(tag) === stripWeak(etag))
223
+ }
224
+
225
+ function stripWeak(etag: string) {
226
+ return etag.replace(/^W\//, '')
227
+ }
220
228
  }
221
229
 
222
230
  function notModified(response: Response) {
@@ -248,10 +256,6 @@ function setCacheHeaders(
248
256
  headers.set('Vary', Array.from(vary.values()).join(', '))
249
257
  }
250
258
 
251
- function stripWeak(etag: string) {
252
- return etag.replace(/^W\//, '')
253
- }
254
-
255
259
  // Derive the shared-cache policy from a route's client `Cache-Control`. A
256
260
  // positive `s-maxage`/`max-age` (and no `no-store`/`no-cache`) is what makes a
257
261
  // route eligible for the anonymous edge cache; the `private` directive only
@@ -19,10 +19,10 @@ describe('Cursor', () => {
19
19
  })
20
20
 
21
21
  test('round-trips a timestamp/id tuple', () => {
22
- const token = Cursor.encode(['2026-01-01T00:00:00.000Z', 'org_abc123'])
22
+ const token = Cursor.encode(['2026-01-01T00:00:00.000Z', 'source:transaction-0'])
23
23
  expect(Cursor.decode(token, ['timestamp', 'id'])).toEqual([
24
24
  '2026-01-01T00:00:00.000Z',
25
- 'org_abc123',
25
+ 'source:transaction-0',
26
26
  ])
27
27
  })
28
28
 
@@ -138,7 +138,7 @@ function isValid(value: unknown, field: Field): boolean {
138
138
  case 'address':
139
139
  return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value)
140
140
  case 'id':
141
- return typeof value === 'string' && /^[A-Za-z0-9_-]+$/.test(value)
141
+ return typeof value === 'string' && /^[A-Za-z0-9:_-]+$/.test(value)
142
142
  case 'timestamp':
143
143
  return typeof value === 'string' && !Number.isNaN(Date.parse(value))
144
144
  }