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
package/src/App.ts CHANGED
@@ -5,6 +5,7 @@ import { cors as hono_cors } from 'hono/cors'
5
5
  import { HTTPException } from 'hono/http-exception'
6
6
  import { requestId, type RequestIdVariables } from 'hono/request-id'
7
7
  import { generateSpecs } from 'hono-openapi'
8
+ import type { Chain } from 'viem'
8
9
 
9
10
  import type * as Analytics from './analytics/Analytics.js'
10
11
  import * as ApiKey from './ApiKey.js'
@@ -18,6 +19,7 @@ import type * as Metrics from './Metrics.js'
18
19
  import * as OpenApi from './internal/OpenApi.js'
19
20
  import * as Store from './internal/Store.js'
20
21
  import * as Path from './internal/Path.js'
22
+ import type * as Provider from './internal/Provider.js'
21
23
  import * as Response from './internal/Response.js'
22
24
  import * as Scope from './Scope.js'
23
25
  import type * as Tidx from './internal/Tidx.js'
@@ -27,6 +29,7 @@ import * as Viem from './internal/Viem.js'
27
29
  import openrpcSpec from './openrpc.json' with { type: 'json' }
28
30
 
29
31
  import * as Metadata from './apps/metadata.js'
32
+ import * as Zones from './apps/Zones.js'
30
33
  import * as Data from './apps/data/App.js'
31
34
  import * as Management from './apps/management/App.js'
32
35
  import * as Mpp from './apps/mpp/App.js'
@@ -62,6 +65,8 @@ export type Environment = {
62
65
  dbCached: Db.Source
63
66
  /** KV state store backing API-key records, or undefined when key auth is closed. */
64
67
  kv: { store: Store.State } | undefined
68
+ /** Providers registered by the host application. */
69
+ providers: readonly Provider.Provider[]
65
70
  /** Issuable API-key scope catalog, including host-defined entries. */
66
71
  scopeCatalog: Scope.Catalog
67
72
  /** Gets one static API asset. */
@@ -80,8 +85,8 @@ export type Environment = {
80
85
  tidx: Tidx.getClient.Tidx | undefined
81
86
  /** Verified-token feature configuration (refresh window), or undefined when the feature is disabled. Token rows live in `db`. */
82
87
  verifiedTokens: { refreshMs?: number | undefined } | undefined
83
- /** Zone RPC endpoints keyed by chain id; empty when none are configured. */
84
- zones: ReadonlyMap<number, Data.data.Zone>
88
+ /** Zone chains keyed by chain id; empty when none are configured. */
89
+ zones: ReadonlyMap<number, Chain>
85
90
  /** Webhook feature configuration, or undefined when webhooks are disabled. Rows live in `db`. */
86
91
  webhook: Webhook | undefined
87
92
  } & EdgeCache.Variables &
@@ -108,7 +113,7 @@ function compose(options: create.Options) {
108
113
  return create(options)
109
114
  .route('/', data())
110
115
  .route('/', relay())
111
- .route('/', mpp())
116
+ .route('/', mpp({ state: Store.memory() }))
112
117
  .route('/', management())
113
118
  }
114
119
 
@@ -141,10 +146,28 @@ export type Asset = {
141
146
  }
142
147
 
143
148
  /** Gets one static API asset for a chain, or undefined when it is missing. */
144
- export type GetAsset = (
149
+ export type GetAsset = ((
145
150
  chainId: Viem.ChainId,
146
151
  path: string,
147
- ) => Asset | undefined | Promise<Asset | undefined>
152
+ ) => Asset | undefined | Promise<Asset | undefined>) & {
153
+ /** Lists public asset locations under a path prefix, when supported. */
154
+ list?: GetAsset.List | undefined
155
+ }
156
+
157
+ export declare namespace GetAsset {
158
+ /** Lists public asset locations for a chain and path prefix. */
159
+ type List = (
160
+ chainId: Viem.ChainId,
161
+ path: string,
162
+ ) => Promise<
163
+ readonly {
164
+ /** Internal asset-store key. */
165
+ key: string
166
+ /** Absolute public API URL for the asset. */
167
+ uri: string
168
+ }[]
169
+ >
170
+ }
148
171
 
149
172
  /** Top-level OpenAPI `info.description`, rendered above the reference. */
150
173
  const infoDescription = 'REST API for reading and interacting with Tempo'
@@ -170,11 +193,22 @@ export function create<const path extends string = '/'>(options: create.Options<
170
193
  const store = options.cache?.store ?? Store.memory()
171
194
  const scopeCatalog = Scope.extend(options.scopes)
172
195
  const defaultChainId = options.defaultChainId ?? Viem.defaultChainId
173
- const getClient = Viem.createGetClient({ defaultChainId, rpc: options.rpc })
196
+ const zones = new Map(
197
+ (options.zones === true ? Zones.chains : (options.zones ?? [])).map((zone) => [zone.id, zone]),
198
+ )
199
+ const getClient = Viem.createGetClient({
200
+ defaultChainId,
201
+ rpc: options.rpc,
202
+ zones: [...zones.values()],
203
+ })
204
+ const configuredRpcChainIds =
205
+ typeof options.rpc === 'function' ? [] : Viem.configuredChainIds(options.rpc?.url)
174
206
  const supportedChainIds = new Set<number>([
175
207
  ...Object.keys(Viem.url).map(Number),
176
208
  defaultChainId,
209
+ ...configuredRpcChainIds,
177
210
  ...(options.supportedChainIds ?? []),
211
+ ...zones.keys(),
178
212
  ])
179
213
 
180
214
  // Build the app in two phases: register middleware imperatively, then chain
@@ -242,6 +276,18 @@ export function create<const path extends string = '/'>(options: create.Options<
242
276
  // side; `cached` falls back to `source` so consumers never branch.
243
277
  const db = 'source' in options.db ? options.db : { source: options.db }
244
278
 
279
+ const providers = (() => {
280
+ const values = options.providers ?? []
281
+ const ids = new Set<string>()
282
+ for (const provider of values) {
283
+ if (provider.id.length === 0 || provider.id !== provider.id.trim().toLowerCase())
284
+ throw new InvalidProviderIdError(provider.id)
285
+ if (ids.has(provider.id)) throw new DuplicateProviderIdError(provider.id)
286
+ ids.add(provider.id)
287
+ }
288
+ return values
289
+ })()
290
+
245
291
  // Normalize the `analytics` option: accept the bare source or `{ source }`,
246
292
  // mirroring `db`. Undefined leaves usage analytics unconfigured (501).
247
293
  const analytics =
@@ -269,10 +315,12 @@ export function create<const path extends string = '/'>(options: create.Options<
269
315
  c.set('dbCached', db.cached ?? db.source)
270
316
  c.set('getClient', (chainId) => getClient(chainId, Auth.getPrincipal(c)))
271
317
  c.set('kv', options.kv)
318
+ c.set('providers', providers)
272
319
  c.set('rpc', options.rpc)
273
320
  c.set('scopeCatalog', scopeCatalog)
274
321
  c.set('store', store)
275
322
  c.set('supportedChainIds', supportedChainIds)
323
+ c.set('zones', zones)
276
324
  await next()
277
325
  })
278
326
 
@@ -425,15 +473,15 @@ export function create<const path extends string = '/'>(options: create.Options<
425
473
  // from each route's resolved auth policy (the single source of truth), so
426
474
  // the anonymous option and `402` appear only where the public/MPP lanes
427
475
  // are enabled, not on every operation via the document default.
428
- applyAccess(generated.paths, Auth.describeAccess(app))
476
+ OpenApiDocument.applyAccess(generated.paths, Auth.describeAccess(app))
429
477
  // Point the `/rpc` operation at the OpenRPC document via `x-openrpc`.
430
- applyOpenrpcLink(generated.paths, basePath)
478
+ OpenApiDocument.applyOpenrpcLink(generated.paths, basePath)
431
479
  // Re-order paths so list endpoints appear before get endpoints inside each
432
480
  // tag group in the sidebar. We classify by operation summary, which every
433
481
  // handler sets as either "List ..." or "Get ...". The reference groups by
434
482
  // tag and preserves document path order within a tag, so reordering here
435
483
  // drives the sidebar sub-item order.
436
- return { ...generated, ...webhooksDoc, paths: sortPaths(generated.paths) }
484
+ return { ...generated, ...webhooksDoc, paths: OpenApiDocument.sortPaths(generated.paths) }
437
485
  }
438
486
  let finalized = false
439
487
  const finalize = () => {
@@ -474,8 +522,8 @@ export function create<const path extends string = '/'>(options: create.Options<
474
522
  * Hono type (which `testClient` needs); intersecting the listener onto the
475
523
  * app degrades the typed proxy inference.
476
524
  */
477
- export function listener(app: { fetch: NodeFetch }): Listener {
478
- return getRequestListener(app.fetch)
525
+ export function listener(app: { fetch: NodeServer.Fetch }): Listener {
526
+ return NodeServer.getRequestListener(app.fetch)
479
527
  }
480
528
 
481
529
  export declare namespace create {
@@ -507,6 +555,8 @@ export declare namespace create {
507
555
  metrics?: Metrics.Metrics | undefined
508
556
  /** Base path to mount API handlers under. Provided as a literal via the `path` generic so the resulting Hono schema keeps typed route paths for `testClient`. */
509
557
  path?: path | undefined
558
+ /** Providers available to mounted route groups. */
559
+ providers?: readonly Provider.Provider[] | undefined
510
560
  /** Tempo RPC options, including per-request routing by request principal. */
511
561
  rpc?: Viem.getClient.Rpc | undefined
512
562
  /** OpenAPI `servers` for the generated document. Defaults to a single relative server (the host serving the doc), so the reference targets the deployment it is served from. Set the canonical public URL(s) here, e.g. `[{ url: 'https://api.tempo.xyz' }]`. */
@@ -515,6 +565,8 @@ export declare namespace create {
515
565
  scopes?: readonly Scope.Entry[] | undefined
516
566
  /** Extra chain ids served beyond the built-in chains and `defaultChainId`. */
517
567
  supportedChainIds?: readonly number[] | undefined
568
+ /** Zone chains served by this deployment. Pass true to use the hosted Zone list. */
569
+ zones?: true | readonly Chain[] | undefined
518
570
  }
519
571
 
520
572
  /** KV state-store configuration. */
@@ -612,157 +664,192 @@ async function errorFromException(c: Context<Environment>, cause: HTTPException)
612
664
  const response = cause.getResponse()
613
665
  response.headers.set('tempo-request-id', requestId)
614
666
 
615
- if (!isJson(response)) return response
667
+ if (!ResponseBody.isJson(response)) return response
616
668
 
617
669
  const body = await response
618
670
  .clone()
619
671
  .json()
620
672
  .catch(() => null)
621
- if (!isRecord(body)) return response
673
+ if (!body || typeof body !== 'object' || Array.isArray(body)) return response
622
674
 
623
675
  return c.json({ ...body, requestId }, cause.status, Object.fromEntries(response.headers))
624
676
  }
625
677
 
626
- // Reorder OpenAPI `paths` so reads come before writes within each tag group,
627
- // and shallower paths come before deeper paths inside each bucket so root-level
628
- // routes ("List tokens" `/tokens`) win over nested ones ("List address
629
- // tokens" — `/addresses/{address}/tokens`). Tie-break by original document
630
- // order to keep registered grouping.
631
- //
632
- // A path is ranked as a unit because REST groups verbs onto shared paths (and
633
- // the reference renders all methods of a path adjacently, in the fixed canonical
634
- // method order GET→POST→PATCH→DELETE), so two operations on the same path can
635
- // never be separated or reordered relative to each other.
636
- //
637
- // Read-only tags keep lists-before-gets (tiers 0/2). The `Webhooks` tag instead
638
- // groups all reads (lists, then the item GET) ahead of the item writes, scoped
639
- // to that tag so the read tags are untouched. The shared-path constraint means
640
- // the desired "Create, all GETs (lists first), Update, Delete" can only be
641
- // approximated: `Create webhook` shares `/webhooks` with `List webhooks`, and
642
- // vocs renders GET before POST, so "List webhooks" unavoidably precedes
643
- // "Create". `Get`/`Update`/`Delete` all share `/webhooks/{id}`, so they render
644
- // adjacently as GetUpdateDelete. The `{id}` item is tiered right after the
645
- // collection root, so `Get/Update/Delete` sit just below `List webhooks/Create`,
646
- // ahead of the remaining lists and action POSTs. Tiers:
647
- // 0 collection root (`GET`+`POST /webhooks`) → "List webhooks, Create webhook"
648
- // 1 item (`GET`+`PATCH`+`DELETE /webhooks/{id}`) → "Get, Update, Delete"
649
- // 2 other list-only paths (`/event-types`, `/deliveries`)
650
- // 3 other writes/actions (`POST .../ping`, `.../retry`)
651
- function sortPaths(paths: PathsObject): PathsObject {
652
- const entries = Object.entries(paths)
653
- const rank = (entry: [string, PathItem]) => {
654
- const operations = Object.values(entry[1])
655
- const summaries = operations.flatMap((op) =>
656
- isOperation(op) && op.summary ? [op.summary] : [],
657
- )
658
- const has = (prefix: string) => summaries.some((summary) => summary.startsWith(prefix))
659
- if (operations.some((op) => isOperation(op) && op.tags?.includes('Webhooks'))) {
660
- if (has('Create')) return 0
661
- if (has('Get')) return 1
662
- if (has('List')) return 2
663
- return 3
678
+ namespace OpenApiDocument {
679
+ // Reorder OpenAPI `paths` so reads come before writes within each tag group,
680
+ // and shallower paths come before deeper paths inside each bucket so root-level
681
+ // routes ("List tokens" — `/tokens`) win over nested ones ("List address
682
+ // tokens" `/addresses/{address}/tokens`). Tie-break by original document
683
+ // order to keep registered grouping.
684
+ //
685
+ // A path is ranked as a unit because REST groups verbs onto shared paths (and
686
+ // the reference renders all methods of a path adjacently, in the fixed canonical
687
+ // method order GET→POST→PATCH→DELETE), so two operations on the same path can
688
+ // never be separated or reordered relative to each other.
689
+ //
690
+ // Read-only tags keep lists-before-gets (tiers 0/2). The `Webhooks` tag instead
691
+ // groups all reads (lists, then the item GET) ahead of the item writes, scoped
692
+ // to that tag so the read tags are untouched. The shared-path constraint means
693
+ // the desired "Create, all GETs (lists first), Update, Delete" can only be
694
+ // approximated: `Create webhook` shares `/webhooks` with `List webhooks`, and
695
+ // vocs renders GET before POST, so "List webhooks" unavoidably precedes
696
+ // "Create". `Get`/`Update`/`Delete` all share `/webhooks/{id}`, so they render
697
+ // adjacently as GetUpdateDelete. The `{id}` item is tiered right after the
698
+ // collection root, so `Get/Update/Delete` sit just below `List webhooks/Create`,
699
+ // ahead of the remaining lists and action POSTs. Tiers:
700
+ // 0 collection root (`GET`+`POST /webhooks`) → "List webhooks, Create webhook"
701
+ // 1 item (`GET`+`PATCH`+`DELETE /webhooks/{id}`) → "Get, Update, Delete"
702
+ // 2 other list-only paths (`/event-types`, `/deliveries`)
703
+ // 3 other writes/actions (`POST .../ping`, `.../retry`)
704
+ // `Funding` keeps discovery reads first, then groups its three create operations;
705
+ // the collection list precedes create because both share one path.
706
+ export function sortPaths(paths: PathsObject): PathsObject {
707
+ const entries = Object.entries(paths)
708
+ const rank = (entry: [string, PathItem]) => {
709
+ const operations = Object.values(entry[1])
710
+ const summaries = operations.flatMap((op) =>
711
+ isOperation(op) && op.summary ? [op.summary] : [],
712
+ )
713
+ const has = (prefix: string) => summaries.some((summary) => summary.startsWith(prefix))
714
+ if (operations.some((op) => isOperation(op) && op.tags?.includes('Webhooks'))) {
715
+ if (has('Create')) return 0
716
+ if (has('Get')) return 1
717
+ if (has('List')) return 2
718
+ return 3
719
+ }
720
+ if (operations.some((op) => isOperation(op) && op.tags?.includes('Funding'))) {
721
+ if (has('Create')) return 1
722
+ if (has('Get transfer')) return 2
723
+ return 0
724
+ }
725
+ if (has('List')) return has('Create') ? 1 : 0
726
+ if (has('Get')) return 2
727
+ if (has('Create')) return 3
728
+ return 4
664
729
  }
665
- if (has('List')) return has('Create') ? 1 : 0
666
- if (has('Get')) return 2
667
- if (has('Create')) return 3
668
- return 4
730
+ const depth = (path: string) =>
731
+ path.endsWith('/rpc') ? 2 : path.split('/').filter(Boolean).length
732
+ const indexed = entries.map(
733
+ (entry, index) => [entry, index, rank(entry), depth(entry[0])] as const,
734
+ )
735
+ indexed.sort(([, ai, ar, ad], [, bi, br, bd]) => ar - br || ad - bd || ai - bi)
736
+ return Object.fromEntries(indexed.map(([entry]) => entry))
669
737
  }
670
- const depth = (path: string) =>
671
- path.endsWith('/rpc') ? 2 : path.split('/').filter(Boolean).length
672
- const indexed = entries.map(
673
- (entry, index) => [entry, index, rank(entry), depth(entry[0])] as const,
674
- )
675
- indexed.sort(([, ai, ar, ad], [, bi, br, bd]) => ar - br || ad - bd || ai - bi)
676
- return Object.fromEntries(indexed.map(([entry]) => entry))
677
- }
678
738
 
679
- /**
680
- * Applies route security, required scopes, and payment responses from resolved access lanes.
681
- * API keys support header, query, and bearer authentication.
682
- */
683
- function applyAccess(paths: PathsObject, access: Record<string, Auth.OperationAccess>) {
684
- for (const item of Object.values(paths)) {
685
- for (const op of Object.values(item as Record<string, unknown>)) {
686
- if (!isMutableOperation(op)) continue
687
- const lanes = access[op.operationId]
688
- if (!lanes) continue
689
- const security = [
690
- ...(lanes.apiKey ? [{ apiKey: [] }, { queryApiKey: [] }, { bearerAuth: [] }] : []),
691
- ...(lanes.session ? [{ session: [] }, ...(lanes.apiKey ? [] : [{ bearerAuth: [] }])] : []),
692
- ...(lanes.public ? [{}] : []),
693
- ]
694
- if (security.length > 0) op.security = security
695
- if (lanes.scopes.length > 0) op['x-required-scopes'] = [...lanes.scopes]
696
- if (lanes.mpp) op.responses = { ...op.responses, 402: OpenApi.paymentChallengeRef }
697
- else if (op.responses) delete op.responses['402']
739
+ /**
740
+ * Applies route security, required scopes, and payment responses from resolved access lanes.
741
+ * API keys support header, query, and bearer authentication.
742
+ */
743
+ export function applyAccess(paths: PathsObject, access: Record<string, Auth.OperationAccess>) {
744
+ for (const item of Object.values(paths)) {
745
+ for (const op of Object.values(item as Record<string, unknown>)) {
746
+ if (!isMutableOperation(op)) continue
747
+ const lanes = access[op.operationId]
748
+ if (!lanes) continue
749
+ const security = [
750
+ ...(lanes.apiKey ? [{ apiKey: [] }, { queryApiKey: [] }, { bearerAuth: [] }] : []),
751
+ ...(lanes.session
752
+ ? [{ session: [] }, ...(lanes.apiKey ? [] : [{ bearerAuth: [] }])]
753
+ : []),
754
+ ...(lanes.public ? [{}] : []),
755
+ ]
756
+ if (security.length > 0) op.security = security
757
+ if (lanes.scopes.length > 0) op['x-required-scopes'] = [...lanes.scopes]
758
+ if (lanes.mpp) op.responses = { ...op.responses, 402: OpenApi.paymentChallengeRef }
759
+ else if (op.responses) delete op.responses['402']
760
+ }
698
761
  }
699
762
  }
700
- }
701
763
 
702
- /**
703
- * Links the JSON-RPC passthrough operation to the OpenRPC document (served at
704
- * `{basePath}/openrpc.json`) via an `x-openrpc` vendor extension. The raw `/rpc`
705
- * request body is opaque to OpenAPI, so this lets consumers discover the
706
- * method/param/return schemas it accepts.
707
- *
708
- * The public `/openapi.json` keeps a URL reference (small, conventional). The
709
- * docs handler instead inlines the document — see `inlineOpenrpc` in `tapimo/docs`.
710
- */
711
- function applyOpenrpcLink(paths: PathsObject, basePath: string) {
712
- // `basePath` is `/` at the root mount and `/api` etc. otherwise; strip any
713
- // trailing slash so the join never doubles up (`//openrpc.json`).
714
- const url = `${basePath.replace(/\/$/, '')}/openrpc.json`
715
- for (const item of Object.values(paths))
716
- for (const op of Object.values(item as Record<string, unknown>))
717
- if (isMutableOperation(op) && isRpcOperation(op)) op['x-openrpc'] = url
718
- }
764
+ /**
765
+ * Links the JSON-RPC passthrough operation to the OpenRPC document (served at
766
+ * `{basePath}/openrpc.json`) via an `x-openrpc` vendor extension. The raw `/rpc`
767
+ * request body is opaque to OpenAPI, so this lets consumers discover the
768
+ * method/param/return schemas it accepts.
769
+ *
770
+ * The public `/openapi.json` keeps a URL reference (small, conventional). The
771
+ * docs handler instead inlines the document — see `inlineOpenrpc` in `tapimo/docs`.
772
+ */
773
+ export function applyOpenrpcLink(paths: PathsObject, basePath: string) {
774
+ // `basePath` is `/` at the root mount and `/api` etc. otherwise; strip any
775
+ // trailing slash so the join never doubles up (`//openrpc.json`).
776
+ const url = `${basePath.replace(/\/$/, '')}/openrpc.json`
777
+ for (const item of Object.values(paths))
778
+ for (const op of Object.values(item as Record<string, unknown>))
779
+ if (isMutableOperation(op) && isRpcOperation(op)) op['x-openrpc'] = url
780
+ }
719
781
 
720
- type PathsObject = Awaited<ReturnType<typeof generateSpecs>>['paths']
721
- type PathItem = PathsObject[string]
722
- type Operation = { summary?: string | undefined }
723
- type MutableOperation = {
724
- operationId: string
725
- responses?: Record<string, unknown> | undefined
726
- security?: unknown
727
- 'x-openrpc'?: unknown
728
- 'x-required-scopes'?: unknown
729
- }
782
+ type PathsObject = Awaited<ReturnType<typeof generateSpecs>>['paths']
783
+ type PathItem = PathsObject[string]
784
+ type Operation = { summary?: string | undefined }
785
+ type MutableOperation = {
786
+ operationId: string
787
+ responses?: Record<string, unknown> | undefined
788
+ security?: unknown
789
+ 'x-openrpc'?: unknown
790
+ 'x-required-scopes'?: unknown
791
+ }
730
792
 
731
- function isRpcOperation(op: MutableOperation) {
732
- return op.operationId === 'rpcRequest'
733
- }
793
+ function isRpcOperation(op: MutableOperation) {
794
+ return op.operationId === 'rpcRequest'
795
+ }
796
+
797
+ function isOperation(value: unknown): value is Operation {
798
+ return !!value && typeof value === 'object' && 'summary' in value
799
+ }
734
800
 
735
- function isOperation(value: unknown): value is Operation {
736
- return !!value && typeof value === 'object' && 'summary' in value
801
+ function isMutableOperation(value: unknown): value is MutableOperation {
802
+ return (
803
+ !!value &&
804
+ typeof value === 'object' &&
805
+ !Array.isArray(value) &&
806
+ 'operationId' in value &&
807
+ typeof value.operationId === 'string'
808
+ )
809
+ }
737
810
  }
738
811
 
739
- function isMutableOperation(value: unknown): value is MutableOperation {
740
- return isRecord(value) && typeof value['operationId'] === 'string'
812
+ namespace ResponseBody {
813
+ export function isJson(response: globalThis.Response) {
814
+ return response.headers.get('content-type')?.includes('application/json') ?? false
815
+ }
741
816
  }
742
817
 
743
- function isJson(response: globalThis.Response) {
744
- return response.headers.get('content-type')?.includes('application/json') ?? false
818
+ namespace NodeServer {
819
+ type GetRequestListener = (typeof import('@hono/node-server'))['getRequestListener']
820
+ export type Fetch = Parameters<GetRequestListener>[0]
821
+ type NodeRequestListener = ReturnType<GetRequestListener>
822
+
823
+ export function getRequestListener(fetch: Fetch): Listener {
824
+ let listener: NodeRequestListener | undefined
825
+ return async (incoming_, outgoing_) => {
826
+ // Resolve the Node-only adapter at call time. The split specifier keeps
827
+ // Worker bundlers from eagerly including a server adapter they never run.
828
+ if (listener === undefined) {
829
+ const nodeServer = (await import(
830
+ /* @vite-ignore */ ['@hono', 'node-server'].join('/')
831
+ )) as typeof import('@hono/node-server')
832
+ listener = nodeServer.getRequestListener(fetch)
833
+ }
834
+ return listener(incoming_ as never, outgoing_ as never)
835
+ }
836
+ }
745
837
  }
746
838
 
747
- function isRecord(value: unknown): value is Record<string, unknown> {
748
- return !!value && typeof value === 'object' && !Array.isArray(value)
839
+ /** Error thrown when an app registers the same provider identifier more than once. */
840
+ export class DuplicateProviderIdError extends Error {
841
+ override name = 'App.DuplicateProviderIdError'
842
+
843
+ constructor(id: string) {
844
+ super(`Duplicate provider id "${id}".`)
845
+ }
749
846
  }
750
847
 
751
- type GetNodeRequestListener = (typeof import('@hono/node-server'))['getRequestListener']
752
- type NodeFetch = Parameters<GetNodeRequestListener>[0]
753
- type NodeRequestListener = ReturnType<GetNodeRequestListener>
754
-
755
- function getRequestListener(fetch: NodeFetch): Listener {
756
- let listener: NodeRequestListener | undefined
757
- return async (incoming_, outgoing_) => {
758
- // Resolve the Node-only adapter at call time. The split specifier keeps
759
- // Worker bundlers from eagerly including a server adapter they never run.
760
- if (listener === undefined) {
761
- const nodeServer = (await import(
762
- /* @vite-ignore */ ['@hono', 'node-server'].join('/')
763
- )) as typeof import('@hono/node-server')
764
- listener = nodeServer.getRequestListener(fetch)
765
- }
766
- return listener(incoming_ as never, outgoing_ as never)
848
+ /** Error thrown when an app registers a provider with a non-normalized identifier. */
849
+ export class InvalidProviderIdError extends Error {
850
+ override name = 'App.InvalidProviderIdError'
851
+
852
+ constructor(id: string) {
853
+ super(`Invalid provider id "${id}". Provider ids must be lowercase and trimmed.`)
767
854
  }
768
855
  }
package/src/Assets.ts CHANGED
@@ -18,6 +18,8 @@ export type Asset = {
18
18
  export type Assets = {
19
19
  /** Reads an asset by `key`, or `undefined` when absent. */
20
20
  get(key: string): Promise<Asset | undefined>
21
+ /** Lists asset keys matching `prefix`, when the backend supports enumeration. */
22
+ list?: ((prefix: string) => Promise<readonly string[]>) | undefined
21
23
  /** Stores an asset at `key`, replacing any existing object. Omit for read-only stores. */
22
24
  put?: ((key: string, asset: Asset) => Promise<void>) | undefined
23
25
  }
@@ -26,9 +28,6 @@ export type Assets = {
26
28
  export function cloudflareR2(bucket: cloudflareR2.Bucket): Assets {
27
29
  return {
28
30
  async get(key) {
29
- // Legacy source-extension aliases may sort before the extensionless key.
30
- const { objects } = await bucket.list({ limit: 1_000, prefix: key })
31
- if (!objects.some((object) => object.key === key)) return undefined
32
31
  const object = await bucket.get(key)
33
32
  if (!object) return undefined
34
33
  return {
@@ -36,6 +35,21 @@ export function cloudflareR2(bucket: cloudflareR2.Bucket): Assets {
36
35
  contentType: object.httpMetadata?.contentType ?? 'application/octet-stream',
37
36
  }
38
37
  },
38
+ async list(prefix) {
39
+ const keys: string[] = []
40
+ let cursor: string | undefined
41
+ for (;;) {
42
+ const page = await bucket.list({
43
+ ...(cursor === undefined ? {} : { cursor }),
44
+ limit: 1_000,
45
+ prefix,
46
+ })
47
+ keys.push(...page.objects.map((object) => object.key))
48
+ if (!page.truncated) return keys
49
+ if (!page.cursor) throw new Error('R2 returned a truncated asset list without a cursor.')
50
+ cursor = page.cursor
51
+ }
52
+ },
39
53
  put: (key, { body, contentType }) =>
40
54
  bucket.put(key, body, { httpMetadata: { contentType } }).then(() => undefined),
41
55
  }
@@ -52,9 +66,20 @@ export declare namespace cloudflareR2 {
52
66
  httpMetadata?: { contentType?: string | undefined } | undefined
53
67
  } | null>
54
68
  /** Lists objects matching a key prefix. */
55
- list(options: { limit: number; prefix: string }): Promise<{
69
+ list(options: {
70
+ /** Continues a previous truncated listing. */
71
+ cursor?: string | undefined
72
+ /** Maximum objects returned in one page. */
73
+ limit: number
74
+ /** Object-key prefix to match. */
75
+ prefix: string
76
+ }): Promise<{
77
+ /** Cursor for the next page. */
78
+ cursor?: string | undefined
56
79
  /** Matching objects. */
57
80
  objects: readonly { key: string }[]
81
+ /** Whether more matching objects remain. */
82
+ truncated: boolean
58
83
  }>
59
84
  /** Writes an object. */
60
85
  put(