tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -179,6 +179,23 @@ describe('middleware', () => {
179
179
  expect(store.gets).toMatchInlineSnapshot(`1`)
180
180
  })
181
181
 
182
+ test('bypasses the cache when its route key cannot be generated', async () => {
183
+ const { app, store, downstreamCalls } = createApp({
184
+ key: () => {
185
+ throw new Error('invalid query')
186
+ },
187
+ })
188
+
189
+ const first = await app.request('/cached')
190
+ const second = await app.request('/cached')
191
+
192
+ expect(first.status).toMatchInlineSnapshot(`200`)
193
+ expect(second.status).toMatchInlineSnapshot(`200`)
194
+ expect(downstreamCalls()).toMatchInlineSnapshot(`2`)
195
+ expect(store.gets).toMatchInlineSnapshot(`0`)
196
+ expect(store.size).toMatchInlineSnapshot(`0`)
197
+ })
198
+
182
199
  test('answers conditional requests from a cached ETag with 304', async () => {
183
200
  const { app } = createApp()
184
201
 
@@ -219,7 +236,7 @@ describe('middleware', () => {
219
236
 
220
237
  test('rechecks route eligibility before every cache lookup', async () => {
221
238
  let eligible = true
222
- const { app, downstreamCalls, store } = createApp({ eligibility: () => eligible })
239
+ const { app, downstreamCalls, store } = createApp({ eligibility: [() => eligible] })
223
240
 
224
241
  await app.request('/cached')
225
242
  eligible = false
@@ -229,6 +246,19 @@ describe('middleware', () => {
229
246
  expect(store.gets).toBe(1)
230
247
  expect(store.size).toBe(1)
231
248
  })
249
+
250
+ test('requires every route eligibility predicate to permit caching', async () => {
251
+ const { app, downstreamCalls, store } = createApp({
252
+ eligibility: [() => true, () => false],
253
+ })
254
+
255
+ await app.request('/cached')
256
+ await app.request('/cached')
257
+
258
+ expect(downstreamCalls()).toBe(2)
259
+ expect(store.gets).toBe(0)
260
+ expect(store.size).toBe(0)
261
+ })
232
262
  })
233
263
 
234
264
  type Environment = { Variables: EdgeCache.Variables }
@@ -263,7 +293,8 @@ function memoryStore() {
263
293
 
264
294
  function createApp(
265
295
  options: {
266
- eligibility?: ((c: Context<Environment>) => boolean) | undefined
296
+ eligibility?: readonly ((c: Context<Environment>) => boolean)[] | undefined
297
+ key?: ((c: Context<Environment>) => Promise<string> | string) | undefined
267
298
  store?: Store.Store | undefined
268
299
  } = {},
269
300
  ) {
@@ -281,10 +312,11 @@ function createApp(
281
312
  // routes do; unmarked routes must skip the lookup entirely.
282
313
  const cacheable_marked = EdgeCache.markCacheable(
283
314
  createMiddleware<Environment>(async (_c, next) => next()),
315
+ { key: options.key as (c: Context) => Promise<string> | string },
284
316
  )
285
- const cacheable = options.eligibility
286
- ? EdgeCache.setEligibility(cacheable_marked, options.eligibility)
287
- : cacheable_marked
317
+ for (const predicate of options.eligibility ?? [])
318
+ EdgeCache.setEligibility(cacheable_marked, predicate)
319
+ const cacheable = cacheable_marked
288
320
  app.get('/cached', cacheable, (c) => {
289
321
  c.set('edgeCache', { maxAge: 30, staleWhileRevalidate: 300 })
290
322
  c.header('Age', '123')
@@ -87,7 +87,13 @@ export function middleware<environment extends Env>(
87
87
  // Query credentials must reach auth and never enter cache keys.
88
88
  !new URL(c.req.url).searchParams.has('key') &&
89
89
  isCacheableRoute(c)
90
- const key = eligible ? cacheKey(c.req.url) : undefined
90
+ const key = eligible
91
+ ? await routeCacheKey(c).catch(() => {
92
+ // Key generators may parse request input before route validation runs.
93
+ // Bypass caching so the validation middleware can return its response.
94
+ return undefined
95
+ })
96
+ : undefined
91
97
 
92
98
  // Honor the standard request `Cache-Control` directives so a caller can
93
99
  // refresh a stale entry on the colo serving them without any out-of-band
@@ -142,6 +148,7 @@ export function middleware<environment extends Env>(
142
148
  // pays the store lookup only when a matched handler carries it.
143
149
  const cacheableSymbol = Symbol('tempoApi.edgeCacheable')
144
150
  const eligibility = new WeakMap<object, (c: Context) => boolean>()
151
+ const keys = new WeakMap<object, (c: Context) => Promise<string> | string>()
145
152
 
146
153
  /**
147
154
  * Marks a route handler/middleware as publishing an edge-cache policy, so
@@ -150,16 +157,28 @@ const eligibility = new WeakMap<object, (c: Context) => boolean>()
150
157
  */
151
158
  export function markCacheable<const handler extends (...args: never[]) => unknown>(
152
159
  handler: handler,
160
+ options: markCacheable.Options = {},
153
161
  ): handler {
162
+ if (options.key) keys.set(handler, options.key)
154
163
  return Object.assign(handler, { [cacheableSymbol]: true })
155
164
  }
156
165
 
157
- /** Adds a request eligibility check to a cacheable route handler. */
166
+ export declare namespace markCacheable {
167
+ /** Options for marking a route as edge-cacheable. */
168
+ type Options = {
169
+ /** Cache key generator. Defaults to the request URL. */
170
+ key?: ((c: Context) => Promise<string> | string) | undefined
171
+ }
172
+ }
173
+
174
+ /** Adds a request eligibility check; every check must permit caching. */
158
175
  export function setEligibility<const handler extends (...args: never[]) => unknown>(
159
176
  handler: handler,
160
177
  predicate: (c: Context) => boolean,
161
178
  ): handler {
162
- if (cacheableSymbol in handler) eligibility.set(handler, predicate)
179
+ const existing = eligibility.get(handler)
180
+ if (cacheableSymbol in handler)
181
+ eligibility.set(handler, existing ? (c) => existing(c) && predicate(c) : predicate)
163
182
  return handler
164
183
  }
165
184
 
@@ -174,6 +193,16 @@ function isCacheableRoute(c: Context): boolean {
174
193
  return cacheable
175
194
  }
176
195
 
196
+ async function routeCacheKey(c: Context) {
197
+ let requestUrl = c.req.url
198
+ for (const route of matchedRoutes(c)) {
199
+ if (!(cacheableSymbol in route.handler)) continue
200
+ const key = keys.get(route.handler)
201
+ if (key) requestUrl = await key(c)
202
+ }
203
+ return cacheKey(requestUrl)
204
+ }
205
+
177
206
  export declare namespace middleware {
178
207
  /** Options for the edge-cache middleware. */
179
208
  type Options = {
@@ -220,7 +249,7 @@ function serveHit(ifNoneMatch: string | undefined, value: string): Response {
220
249
  const { body, encoding, headers, status } = JSON.parse(value) as Stored
221
250
  const responseHeaders = new Headers(headers)
222
251
  const etag = responseHeaders.get('etag')
223
- if (etag && ifNoneMatch && etagMatches(etag, ifNoneMatch)) {
252
+ if (Etag.matches(etag, ifNoneMatch)) {
224
253
  const notModified = new Headers()
225
254
  for (const name of ['Cache-Control', 'ETag', 'Vary']) {
226
255
  const header = responseHeaders.get(name)
@@ -269,9 +298,12 @@ function getWaitUntil(c: { executionCtx?: { waitUntil(promise: Promise<unknown>)
269
298
  }
270
299
  }
271
300
 
272
- function etagMatches(etag: string, ifNoneMatch: string) {
273
- const strip = (tag: string) => tag.trim().replace(/^W\//, '')
274
- return ifNoneMatch.split(',').some((tag) => strip(tag) === strip(etag))
301
+ namespace Etag {
302
+ export function matches(etag: string | null, ifNoneMatch: string | undefined) {
303
+ if (!etag || !ifNoneMatch) return false
304
+ const strip = (tag: string) => tag.trim().replace(/^W\//, '')
305
+ return ifNoneMatch.split(',').some((tag) => strip(tag) === strip(etag))
306
+ }
275
307
  }
276
308
 
277
309
  /**
@@ -22,3 +22,17 @@ export function generate(prefix: string): string {
22
22
  export function random(): string {
23
23
  return segment()
24
24
  }
25
+
26
+ /**
27
+ * Generates a time-prefixed resource id (`{prefix}_{epoch ms}_{24 base62
28
+ * chars}`). The epoch-ms is zero-padded to 15 digits (headroom past the year
29
+ * 5138) so lexical id order is chronological, letting newest-first lists page
30
+ * by keyset on the id alone.
31
+ *
32
+ * @param prefix - The resource-type prefix (e.g. `wh`, `ftr`).
33
+ * @param now - The timestamp to embed.
34
+ * @returns The generated id.
35
+ */
36
+ export function generateSortable(prefix: string, now: Date = new Date()): string {
37
+ return `${prefix}_${now.getTime().toString().padStart(15, '0')}_${random()}`
38
+ }
@@ -0,0 +1,109 @@
1
+ import { Hash, Hex } from 'ox'
2
+
3
+ import * as Idempotency from './Idempotency.js'
4
+ import * as Store from './Store.js'
5
+ import * as Ttl from './Ttl.js'
6
+
7
+ const identity = {
8
+ apiKeyId: 'key_test',
9
+ idempotencyKey: 'req_01j3j1k2l3m4n5p6q7r8s9t0u',
10
+ inputHash: `0x${'11'.repeat(32)}`,
11
+ }
12
+
13
+ function coordinator(namespace = 'test:v1') {
14
+ return Idempotency.create<{ id: string }>({
15
+ namespace,
16
+ pendingTtl: Ttl.minutes(1),
17
+ receiptTtl: Ttl.days(1),
18
+ })
19
+ }
20
+
21
+ describe('inputHash', () => {
22
+ test('binds semantic content instead of JSON property order', () => {
23
+ expect(Idempotency.inputHash({ a: 1, b: [{ d: 2, c: 3 }] })).toBe(
24
+ Idempotency.inputHash({ b: [{ c: 3, d: 2 }], a: 1 }),
25
+ )
26
+ expect(Idempotency.inputHash({ a: 1 })).not.toBe(Idempotency.inputHash({ a: 2 }))
27
+ })
28
+
29
+ test('rejects values JSON cannot represent', () => {
30
+ expect(() => Idempotency.inputHash({ callback: () => {} })).toThrowErrorMatchingInlineSnapshot(
31
+ `[Error: Idempotency inputs must be JSON values.]`,
32
+ )
33
+ expect(() =>
34
+ Idempotency.inputHash({ values: [Number.NaN, Number.POSITIVE_INFINITY] }),
35
+ ).toThrowErrorMatchingInlineSnapshot(`[Error: Idempotency inputs must be JSON values.]`)
36
+ })
37
+ })
38
+
39
+ describe('create', () => {
40
+ test('claims, blocks parallel requests, and replays the completed response', async () => {
41
+ const state = Store.memory()
42
+ const requests = coordinator()
43
+
44
+ const claimed = await requests.claim({ identity, state })
45
+ expect(claimed.type).toBe('claimed')
46
+ if (claimed.type !== 'claimed') return
47
+ await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
48
+ await expect(
49
+ requests.claim({ identity: { ...identity, inputHash: `0x${'22'.repeat(32)}` }, state }),
50
+ ).resolves.toEqual({ type: 'mismatch' })
51
+
52
+ await requests.complete({ identity, response: { id: 'ftr_test' }, state, token: claimed.token })
53
+ await expect(requests.claim({ identity, state })).resolves.toEqual({
54
+ response: { id: 'ftr_test' },
55
+ type: 'replay',
56
+ })
57
+ })
58
+
59
+ test('fences completion and release by claim token', async () => {
60
+ const state = Store.memory()
61
+ const requests = coordinator()
62
+ const claimed = await requests.claim({ identity, state })
63
+ if (claimed.type !== 'claimed') throw new Error('Expected a claimed request.')
64
+
65
+ // A stale token can neither complete nor release the live claim.
66
+ await requests.complete({ identity, response: { id: 'stale' }, state, token: 'stale-token' })
67
+ await requests.release({ identity, state, token: 'stale-token' })
68
+ await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
69
+
70
+ await requests.release({ identity, state, token: claimed.token })
71
+ await expect(requests.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
72
+ })
73
+
74
+ test('rejects responses JSON cannot represent before completing', async () => {
75
+ const state = Store.memory()
76
+ const requests = Idempotency.create<void>({
77
+ namespace: 'test:v1',
78
+ pendingTtl: Ttl.minutes(1),
79
+ receiptTtl: Ttl.days(1),
80
+ })
81
+ const claimed = await requests.claim({ identity, state })
82
+ if (claimed.type !== 'claimed') throw new Error('Expected a claimed request.')
83
+
84
+ await expect(
85
+ requests.complete({ identity, response: undefined, state, token: claimed.token }),
86
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
87
+ `[Error: Idempotency responses must be JSON values.]`,
88
+ )
89
+ await expect(requests.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
90
+ })
91
+
92
+ test('isolates coordinators by namespace over one store', async () => {
93
+ const state = Store.memory()
94
+ const first = coordinator('first:v1')
95
+ const second = coordinator('second:v1')
96
+
97
+ await expect(first.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
98
+ await expect(second.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
99
+ })
100
+
101
+ test('preserves the durable key format consumers already stored', async () => {
102
+ const state = Store.memory()
103
+ await coordinator('mpp:relay:v1').claim({ identity, state })
104
+ const digest = Hash.sha256(Hex.fromString(identity.idempotencyKey)).slice(2)
105
+ expect((await state.list()).keys.map((key) => key.name)).toEqual([
106
+ `mpp:relay:v1:${identity.apiKeyId}:${digest}`,
107
+ ])
108
+ })
109
+ })
@@ -0,0 +1,237 @@
1
+ import { Hash, Hex } from 'ox'
2
+
3
+ import * as Store from './Store.js'
4
+
5
+ /**
6
+ * API-level retry coordination for idempotent write endpoints, letting a
7
+ * caller recover a successful response after a transport timeout.
8
+ *
9
+ * A key moves from missing to pending to complete. Only the claim token may
10
+ * finish or release pending state, preventing an older request from
11
+ * overwriting a newer owner.
12
+ */
13
+
14
+ /** Identity for one caller-supplied idempotent request. */
15
+ export type Identity = {
16
+ /** API key that submitted the request. */
17
+ apiKeyId: string
18
+ /** Opaque caller-supplied idempotency key. */
19
+ idempotencyKey: string
20
+ /** Hash of the request content bound to this idempotency key. */
21
+ inputHash: string
22
+ }
23
+
24
+ /** Returns a stable digest without retaining request contents in durable state. */
25
+ export function inputHash(input: unknown): string {
26
+ return Hash.sha256(Hex.fromString(canonicalJson(input)))
27
+ }
28
+
29
+ /** Creates an idempotency coordinator over one durable-store key namespace. */
30
+ export function create<response>(options: create.Options) {
31
+ const { namespace, pendingTtl, receiptTtl } = options
32
+
33
+ function keyFor(identity: Identity) {
34
+ // Scope keys to the authenticated API key so different tenants can reuse
35
+ // the same client-generated value. Hashing keeps that opaque value out of
36
+ // durable-store key names and enumeration output.
37
+ const digest = Hash.sha256(Hex.fromString(identity.idempotencyKey)).slice(2)
38
+ return `${namespace}:${identity.apiKeyId}:${digest}`
39
+ }
40
+
41
+ /** Claims a request or returns its current outcome. */
42
+ async function claim(options: claim.Options): Promise<claim.Result<response>> {
43
+ const { identity, state } = options
44
+ const token = crypto.randomUUID()
45
+
46
+ return Store.change<claim.Result<response>>(
47
+ state,
48
+ keyFor(identity),
49
+ (current) => {
50
+ const currentRecord = record<response>(current)
51
+ // A completed request is the only cacheable terminal outcome. Failed
52
+ // attempts must be retried with the same input. Legacy records lack
53
+ // an input hash, so cannot be safely replayed.
54
+ if (currentRecord && currentRecord.inputHash !== identity.inputHash)
55
+ return { op: 'noop', result: { type: 'mismatch' } }
56
+ if (currentRecord?.type === 'complete')
57
+ return { op: 'noop', result: { response: currentRecord.response, type: 'replay' } }
58
+ // A parallel request must not settle the same caller operation while
59
+ // the first request still owns its pending claim.
60
+ if (currentRecord?.type === 'pending') return { op: 'noop', result: { type: 'pending' } }
61
+ return {
62
+ op: 'set',
63
+ result: { token, type: 'claimed' },
64
+ value: encode({ inputHash: identity.inputHash, token, type: 'pending' }),
65
+ }
66
+ },
67
+ { ttl: pendingTtl },
68
+ )
69
+ }
70
+
71
+ /** Persists a successful response for an owned request claim. */
72
+ async function complete(options: complete.Options<response>): Promise<void> {
73
+ const { identity, response, state, token } = options
74
+
75
+ await Store.change(
76
+ state,
77
+ keyFor(identity),
78
+ (current) => {
79
+ const currentRecord = record<response>(current)
80
+ // Claim tokens fence delayed requests: a request cannot complete a
81
+ // claim it no longer owns after expiry or a later retry.
82
+ if (
83
+ currentRecord?.type !== 'pending' ||
84
+ currentRecord.inputHash !== identity.inputHash ||
85
+ currentRecord.token !== token
86
+ )
87
+ return { op: 'noop', result: undefined }
88
+ canonicalJson(response, 'Idempotency responses must be JSON values.')
89
+ return {
90
+ op: 'set',
91
+ result: undefined,
92
+ value: encode({ inputHash: identity.inputHash, response, type: 'complete' }),
93
+ }
94
+ },
95
+ { ttl: receiptTtl },
96
+ )
97
+ }
98
+
99
+ /** Releases an owned retryable request claim. */
100
+ async function release(options: release.Options): Promise<void> {
101
+ const { identity, state, token } = options
102
+
103
+ await Store.change(state, keyFor(identity), (current) => {
104
+ const currentRecord = record<response>(current)
105
+ // Never delete a newer pending claim after this request has lost
106
+ // ownership through expiry and another caller has retried.
107
+ if (
108
+ currentRecord?.type !== 'pending' ||
109
+ currentRecord.inputHash !== identity.inputHash ||
110
+ currentRecord.token !== token
111
+ )
112
+ return { op: 'noop', result: undefined }
113
+ return { op: 'delete', result: undefined }
114
+ })
115
+ }
116
+
117
+ return { claim, complete, release }
118
+ }
119
+
120
+ export declare namespace create {
121
+ /** Coordinator configuration bound at creation. */
122
+ type Options = {
123
+ /** Durable-store key namespace (e.g. `mpp:relay:v1`). */
124
+ namespace: string
125
+ /** How long a pending claim blocks equivalent requests, in milliseconds. */
126
+ pendingTtl: number
127
+ /** How long a completed response replays, in milliseconds. */
128
+ receiptTtl: number
129
+ }
130
+ }
131
+
132
+ export declare namespace claim {
133
+ /** Dependencies for claiming one idempotency key. */
134
+ type Options = {
135
+ /** API-key-scoped idempotency identity. */
136
+ identity: Identity
137
+ /** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
138
+ state: Store.State
139
+ }
140
+
141
+ /** Outcome from attempting to claim an idempotency key. */
142
+ type Result<response> =
143
+ | { token: string; type: 'claimed' }
144
+ | { type: 'mismatch' }
145
+ | { response: response; type: 'replay' }
146
+ | { type: 'pending' }
147
+ }
148
+
149
+ export declare namespace complete {
150
+ /** Dependencies for persisting one terminal response. */
151
+ type Options<response> = {
152
+ /** API-key-scoped idempotency identity. */
153
+ identity: Identity
154
+ /** Terminal successful response to replay. */
155
+ response: response
156
+ /** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
157
+ state: Store.State
158
+ /** Token returned by the successful claim. */
159
+ token: string
160
+ }
161
+ }
162
+
163
+ export declare namespace release {
164
+ /** Dependencies for releasing one idempotency claim. */
165
+ type Options = {
166
+ /** API-key-scoped idempotency identity. */
167
+ identity: Identity
168
+ /** Authoritative state with atomic compare-and-swap, normally a Durable Object. */
169
+ state: Store.State
170
+ /** Token returned by the successful claim. */
171
+ token: string
172
+ }
173
+ }
174
+
175
+ /** A completed request whose response may be replayed until expiry. */
176
+ type CompleteRecord<response> = {
177
+ inputHash?: string
178
+ response: response
179
+ type: 'complete'
180
+ }
181
+
182
+ /** An in-flight request owned by the opaque claim token. */
183
+ type PendingRecord = {
184
+ inputHash?: string
185
+ token: string
186
+ type: 'pending'
187
+ }
188
+
189
+ type ParsedRecord = {
190
+ inputHash?: unknown
191
+ response?: unknown
192
+ token?: unknown
193
+ type?: unknown
194
+ }
195
+
196
+ type JsonRecord = { [key: string]: unknown }
197
+
198
+ function encode(record: CompleteRecord<unknown> | PendingRecord) {
199
+ return JSON.stringify(record)
200
+ }
201
+
202
+ function canonicalJson(
203
+ value: unknown,
204
+ errorMessage = 'Idempotency inputs must be JSON values.',
205
+ ): string {
206
+ if (value === null) return 'null'
207
+ if (typeof value === 'number' && !Number.isFinite(value)) throw new Error(errorMessage)
208
+ if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string')
209
+ return JSON.stringify(value)
210
+ if (Array.isArray(value))
211
+ return `[${value.map((item) => canonicalJson(item, errorMessage)).join(',')}]`
212
+ if (typeof value === 'object') {
213
+ const record = value as JsonRecord
214
+ return `{${Object.keys(record)
215
+ .sort()
216
+ .map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key], errorMessage)}`)
217
+ .join(',')}}`
218
+ }
219
+ throw new Error(errorMessage)
220
+ }
221
+
222
+ function record<response>(
223
+ value: null | string,
224
+ ): CompleteRecord<response> | PendingRecord | undefined {
225
+ if (value === null) return undefined
226
+
227
+ try {
228
+ const parsed: unknown = JSON.parse(value)
229
+ if (!parsed || typeof parsed !== 'object') return undefined
230
+ const candidate = parsed as ParsedRecord
231
+ if (candidate.type === 'pending' && typeof candidate.token === 'string')
232
+ return candidate as PendingRecord
233
+ if (candidate.type === 'complete' && candidate.response !== undefined)
234
+ return candidate as CompleteRecord<response>
235
+ } catch {}
236
+ return undefined
237
+ }
@@ -1,21 +1,54 @@
1
- import type * as FundingQuotes from './FundingQuotes.js'
1
+ import type * as FundingProvider from './funding/Provider.js'
2
2
  import type * as Log from './Log.js'
3
3
 
4
- test('bounds funding provider metric identifiers', () => {
5
- const provider = null as never as FundingQuotes.ProviderId
4
+ test('accepts deployment-supplied funding provider identifiers', () => {
5
+ const provider = null as never as FundingProvider.ProviderId
6
6
  const id: Log.FundingProviderAttempt['id'] = provider
7
- const provider_roundTrip: FundingQuotes.ProviderId = id
7
+ const provider_roundTrip: FundingProvider.ProviderId = id
8
8
  void provider_roundTrip
9
9
 
10
10
  const attempt = {
11
11
  durationMs: 1,
12
12
  id: 'relay',
13
- operation: 'quote/v2',
13
+ operation: 'getQuote',
14
14
  outcome: 'available',
15
15
  } satisfies Log.FundingProviderAttempt
16
16
  void attempt
17
17
 
18
- // @ts-expect-error arbitrary provider names would create unbounded metric tags
19
- const invalid: Log.FundingProviderAttempt['id'] = 'user-controlled-provider'
20
- void invalid
18
+ const custom: Log.FundingProviderAttempt['id'] = 'custom-bridge'
19
+ void custom
20
+ })
21
+
22
+ test('bounds sponsorship diagnostics', () => {
23
+ const reasons = [
24
+ 'api_key_forbidden',
25
+ 'api_key_required',
26
+ 'billing_past_due',
27
+ 'billing_required',
28
+ 'chain_id_unsupported',
29
+ 'fee_token_unsupported',
30
+ 'internal_error',
31
+ 'production_api_key_required',
32
+ 'spend_limit_exceeded',
33
+ 'tx_fee_limit_exceeded',
34
+ ] as const satisfies readonly Log.SponsorshipReason[]
35
+ expectTypeOf<(typeof reasons)[number]>().toEqualTypeOf<Log.SponsorshipReason>()
36
+
37
+ const sponsorship = {
38
+ chainId: 4217,
39
+ method: 'eth_signRawTransaction',
40
+ outcome: 'rejected',
41
+ payloadHash: `0x${'aa'.repeat(32)}`,
42
+ reason: 'production_api_key_required',
43
+ rejections: 1,
44
+ } satisfies Log.Sponsorship
45
+ void sponsorship
46
+
47
+ // @ts-expect-error arbitrary method names would create unbounded log values
48
+ const method: Log.SponsorshipMethod = 'wallet_userControlled'
49
+ void method
50
+
51
+ // @ts-expect-error arbitrary reasons would create unbounded log values
52
+ const reason: Log.SponsorshipReason = 'user_controlled_reason'
53
+ void reason
21
54
  })