tapimo 0.7.1 → 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 (681) 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 +99 -43
  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 +12125 -7913
  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 +1625 -718
  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 +108 -108
  78. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  79. package/dist/apps/data/routes/fee-amm.js +59 -8
  80. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  81. package/dist/apps/data/routes/funding.d.ts +4092 -387
  82. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  83. package/dist/apps/data/routes/funding.js +1403 -256
  84. package/dist/apps/data/routes/funding.js.map +1 -1
  85. package/dist/apps/data/routes/indexer.d.ts +30 -30
  86. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  87. package/dist/apps/data/routes/indexer.js +19 -2
  88. package/dist/apps/data/routes/indexer.js.map +1 -1
  89. package/dist/apps/data/routes/receipts.d.ts +263 -263
  90. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  91. package/dist/apps/data/routes/receipts.js +11 -11
  92. package/dist/apps/data/routes/receipts.js.map +1 -1
  93. package/dist/apps/data/routes/rpc.d.ts +5 -5
  94. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  95. package/dist/apps/data/routes/rpc.js +211 -22
  96. package/dist/apps/data/routes/rpc.js.map +1 -1
  97. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  98. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  99. package/dist/apps/data/routes/tokenlist.js +39 -8
  100. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  101. package/dist/apps/data/routes/tokens.d.ts +114 -86
  102. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokens.js +194 -91
  104. package/dist/apps/data/routes/tokens.js.map +1 -1
  105. package/dist/apps/data/routes/transactions.d.ts +53 -53
  106. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  107. package/dist/apps/data/routes/transactions.js +78 -39
  108. package/dist/apps/data/routes/transactions.js.map +1 -1
  109. package/dist/apps/data/routes/transfers.d.ts +76 -27
  110. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transfers.js +165 -67
  112. package/dist/apps/data/routes/transfers.js.map +1 -1
  113. package/dist/apps/data/routes/valuation.d.ts +42 -42
  114. package/dist/apps/data/routes/valuation.js +2 -2
  115. package/dist/apps/data/routes/valuation.js.map +1 -1
  116. package/dist/apps/data/routes/webhooks.d.ts +369 -367
  117. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  118. package/dist/apps/data/routes/webhooks.js +161 -59
  119. package/dist/apps/data/routes/webhooks.js.map +1 -1
  120. package/dist/apps/data/routes/zones.d.ts +281 -0
  121. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  122. package/dist/apps/data/routes/zones.js +252 -0
  123. package/dist/apps/data/routes/zones.js.map +1 -0
  124. package/dist/apps/docs/reference.js +6 -5
  125. package/dist/apps/docs/reference.js.map +1 -1
  126. package/dist/apps/index.d.ts +2 -1
  127. package/dist/apps/index.d.ts.map +1 -1
  128. package/dist/apps/index.js +2 -1
  129. package/dist/apps/index.js.map +1 -1
  130. package/dist/apps/management/App.d.ts +670 -670
  131. package/dist/apps/management/Billing.d.ts +8 -0
  132. package/dist/apps/management/Billing.d.ts.map +1 -1
  133. package/dist/apps/management/Billing.js +12 -0
  134. package/dist/apps/management/Billing.js.map +1 -1
  135. package/dist/apps/management/Error.d.ts +12 -0
  136. package/dist/apps/management/Error.d.ts.map +1 -0
  137. package/dist/apps/management/Error.js +10 -0
  138. package/dist/apps/management/Error.js.map +1 -0
  139. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  140. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  141. package/dist/apps/management/routes/api-keys.js +2 -8
  142. package/dist/apps/management/routes/api-keys.js.map +1 -1
  143. package/dist/apps/management/routes/billing.d.ts +119 -119
  144. package/dist/apps/management/routes/faucet.d.ts +2 -2
  145. package/dist/apps/management/routes/invitations.d.ts +62 -62
  146. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  147. package/dist/apps/management/routes/invitations.js +4 -10
  148. package/dist/apps/management/routes/invitations.js.map +1 -1
  149. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  150. package/dist/apps/management/routes/me.d.ts +6 -6
  151. package/dist/apps/management/routes/members.d.ts +2 -2
  152. package/dist/apps/management/routes/orgs.d.ts +48 -48
  153. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  154. package/dist/apps/management/routes/orgs.js +2 -8
  155. package/dist/apps/management/routes/orgs.js.map +1 -1
  156. package/dist/apps/management/routes/projects.d.ts +9 -9
  157. package/dist/apps/management/routes/scopes.js +2 -2
  158. package/dist/apps/management/routes/scopes.js.map +1 -1
  159. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  160. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  161. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  162. package/dist/apps/management/routes/webhooks.js +15 -3
  163. package/dist/apps/management/routes/webhooks.js.map +1 -1
  164. package/dist/apps/mpp/App.d.ts +55 -56
  165. package/dist/apps/mpp/App.d.ts.map +1 -1
  166. package/dist/apps/mpp/App.js +192 -27
  167. package/dist/apps/mpp/App.js.map +1 -1
  168. package/dist/apps/mpp/Mpp.d.ts +0 -20
  169. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  170. package/dist/apps/mpp/Mpp.js +0 -24
  171. package/dist/apps/mpp/Mpp.js.map +1 -1
  172. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  173. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  174. package/dist/apps/mpp/internal/Adapter.js +66 -0
  175. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  176. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  177. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  178. package/dist/apps/mpp/internal/Error.js +41 -0
  179. package/dist/apps/mpp/internal/Error.js.map +1 -0
  180. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  181. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  182. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  183. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  184. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  185. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  186. package/dist/apps/mpp/internal/Policy.js +57 -0
  187. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  188. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  189. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  190. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  191. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  192. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  193. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  194. package/dist/apps/mpp/internal/Screening.js +20 -0
  195. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  196. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  197. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  198. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  199. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  200. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  201. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  202. package/dist/apps/mpp/internal/Utils.js +24 -0
  203. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  204. package/dist/apps/relay/App.js +183 -23
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +15 -6
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/db/Db.d.ts +20 -0
  211. package/dist/db/Db.d.ts.map +1 -1
  212. package/dist/db/Db.js +342 -0
  213. package/dist/db/Db.js.map +1 -1
  214. package/dist/db/Schema.d.ts +921 -1
  215. package/dist/db/Schema.d.ts.map +1 -1
  216. package/dist/db/Schema.js +269 -1
  217. package/dist/db/Schema.js.map +1 -1
  218. package/dist/db/tables/earnVaults.d.ts +68 -0
  219. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  220. package/dist/db/tables/earnVaults.js +72 -0
  221. package/dist/db/tables/earnVaults.js.map +1 -0
  222. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  223. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  224. package/dist/db/tables/fundingCatalog.js +85 -0
  225. package/dist/db/tables/fundingCatalog.js.map +1 -0
  226. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  227. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  228. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  229. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  230. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  231. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  232. package/dist/db/tables/fundingDeposits.js +100 -0
  233. package/dist/db/tables/fundingDeposits.js.map +1 -0
  234. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  235. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  236. package/dist/db/tables/fundingIdempotency.js +103 -0
  237. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  238. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  239. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  240. package/dist/db/tables/fundingTransferEvents.js +18 -0
  241. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  242. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  243. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  244. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  245. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  246. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  247. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  248. package/dist/db/tables/fundingTransfers.js +89 -0
  249. package/dist/db/tables/fundingTransfers.js.map +1 -0
  250. package/dist/db/tables/organizations.d.ts +8 -0
  251. package/dist/db/tables/organizations.d.ts.map +1 -1
  252. package/dist/db/tables/organizations.js +16 -0
  253. package/dist/db/tables/organizations.js.map +1 -1
  254. package/dist/db/tables/projects.d.ts +8 -0
  255. package/dist/db/tables/projects.d.ts.map +1 -1
  256. package/dist/db/tables/projects.js +16 -0
  257. package/dist/db/tables/projects.js.map +1 -1
  258. package/dist/db/tables/requestUsage.d.ts +13 -0
  259. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  260. package/dist/db/tables/requestUsage.js +16 -0
  261. package/dist/db/tables/requestUsage.js.map +1 -1
  262. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  263. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  264. package/dist/db/tables/sponsoredTransactions.js +1 -1
  265. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  266. package/dist/db/tables/users.d.ts +8 -0
  267. package/dist/db/tables/users.d.ts.map +1 -1
  268. package/dist/db/tables/users.js +16 -0
  269. package/dist/db/tables/users.js.map +1 -1
  270. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  271. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  272. package/dist/db/tables/verifiedTokens.js +9 -7
  273. package/dist/db/tables/verifiedTokens.js.map +1 -1
  274. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  275. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  276. package/dist/db/tables/webhookSubscriptions.js +24 -3
  277. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  278. package/dist/handlers/relay.js +108 -108
  279. package/dist/handlers/relay.js.map +1 -1
  280. package/dist/internal/Auth.d.ts +26 -0
  281. package/dist/internal/Auth.d.ts.map +1 -1
  282. package/dist/internal/Auth.js +35 -2
  283. package/dist/internal/Auth.js.map +1 -1
  284. package/dist/internal/Cache.d.ts.map +1 -1
  285. package/dist/internal/Cache.js +16 -10
  286. package/dist/internal/Cache.js.map +1 -1
  287. package/dist/internal/Cursor.js +1 -1
  288. package/dist/internal/Cursor.js.map +1 -1
  289. package/dist/internal/EarnRates.d.ts +89 -0
  290. package/dist/internal/EarnRates.d.ts.map +1 -0
  291. package/dist/internal/EarnRates.js +266 -0
  292. package/dist/internal/EarnRates.js.map +1 -0
  293. package/dist/internal/EarnVaults.d.ts +171 -0
  294. package/dist/internal/EarnVaults.d.ts.map +1 -0
  295. package/dist/internal/EarnVaults.js +547 -0
  296. package/dist/internal/EarnVaults.js.map +1 -0
  297. package/dist/internal/EdgeCache.d.ts +8 -1
  298. package/dist/internal/EdgeCache.d.ts.map +1 -1
  299. package/dist/internal/EdgeCache.js +33 -7
  300. package/dist/internal/EdgeCache.js.map +1 -1
  301. package/dist/internal/Id.d.ts +11 -0
  302. package/dist/internal/Id.d.ts.map +1 -1
  303. package/dist/internal/Id.js +13 -0
  304. package/dist/internal/Id.js.map +1 -1
  305. package/dist/internal/Idempotency.d.ts +83 -0
  306. package/dist/internal/Idempotency.d.ts.map +1 -0
  307. package/dist/internal/Idempotency.js +113 -0
  308. package/dist/internal/Idempotency.js.map +1 -0
  309. package/dist/internal/Log.d.ts +64 -9
  310. package/dist/internal/Log.d.ts.map +1 -1
  311. package/dist/internal/Log.js +29 -7
  312. package/dist/internal/Log.js.map +1 -1
  313. package/dist/internal/MetricSink.d.ts.map +1 -1
  314. package/dist/internal/MetricSink.js +47 -1
  315. package/dist/internal/MetricSink.js.map +1 -1
  316. package/dist/internal/OpenApi.d.ts +1 -1
  317. package/dist/internal/OpenApi.d.ts.map +1 -1
  318. package/dist/internal/OpenApi.js +3 -0
  319. package/dist/internal/OpenApi.js.map +1 -1
  320. package/dist/internal/Provider.d.ts +14 -0
  321. package/dist/internal/Provider.d.ts.map +1 -0
  322. package/dist/internal/Provider.js +5 -0
  323. package/dist/internal/Provider.js.map +1 -0
  324. package/dist/internal/Schema.d.ts +6 -1
  325. package/dist/internal/Schema.d.ts.map +1 -1
  326. package/dist/internal/Schema.js +20 -11
  327. package/dist/internal/Schema.js.map +1 -1
  328. package/dist/internal/Store.d.ts +6 -0
  329. package/dist/internal/Store.d.ts.map +1 -1
  330. package/dist/internal/Store.js +35 -0
  331. package/dist/internal/Store.js.map +1 -1
  332. package/dist/internal/Tidx.d.ts +43 -24
  333. package/dist/internal/Tidx.d.ts.map +1 -1
  334. package/dist/internal/Tidx.js +79 -11
  335. package/dist/internal/Tidx.js.map +1 -1
  336. package/dist/internal/Viem.d.ts +82 -65
  337. package/dist/internal/Viem.d.ts.map +1 -1
  338. package/dist/internal/Viem.js +83 -12
  339. package/dist/internal/Viem.js.map +1 -1
  340. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  341. package/dist/internal/WebhookDestination.js +34 -28
  342. package/dist/internal/WebhookDestination.js.map +1 -1
  343. package/dist/internal/Webhooks.d.ts +9 -0
  344. package/dist/internal/Webhooks.d.ts.map +1 -1
  345. package/dist/internal/Webhooks.js +15 -10
  346. package/dist/internal/Webhooks.js.map +1 -1
  347. package/dist/internal/exchange/Provider.d.ts +219 -0
  348. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  349. package/dist/internal/exchange/Provider.js +117 -0
  350. package/dist/internal/exchange/Provider.js.map +1 -0
  351. package/dist/internal/exchange/index.d.ts +2 -0
  352. package/dist/internal/exchange/index.d.ts.map +1 -0
  353. package/dist/internal/exchange/index.js +2 -0
  354. package/dist/internal/exchange/index.js.map +1 -0
  355. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  356. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  357. package/dist/internal/exchange/providers/uniswap.js +553 -0
  358. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  359. package/dist/internal/funding/Action.d.ts +55 -0
  360. package/dist/internal/funding/Action.d.ts.map +1 -0
  361. package/dist/internal/funding/Action.js +74 -0
  362. package/dist/internal/funding/Action.js.map +1 -0
  363. package/dist/internal/funding/Catalog.d.ts +107 -0
  364. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  365. package/dist/internal/funding/Catalog.js +270 -0
  366. package/dist/internal/funding/Catalog.js.map +1 -0
  367. package/dist/internal/funding/Chain.d.ts +76 -0
  368. package/dist/internal/funding/Chain.d.ts.map +1 -0
  369. package/dist/internal/funding/Chain.js +38 -0
  370. package/dist/internal/funding/Chain.js.map +1 -0
  371. package/dist/internal/funding/Deposit.d.ts +366 -0
  372. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  373. package/dist/internal/funding/Deposit.js +286 -0
  374. package/dist/internal/funding/Deposit.js.map +1 -0
  375. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  376. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  377. package/dist/internal/funding/DepositAddress.js +189 -0
  378. package/dist/internal/funding/DepositAddress.js.map +1 -0
  379. package/dist/internal/funding/Evidence.d.ts +52 -0
  380. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  381. package/dist/internal/funding/Evidence.js +314 -0
  382. package/dist/internal/funding/Evidence.js.map +1 -0
  383. package/dist/internal/funding/Provider.d.ts +1186 -0
  384. package/dist/internal/funding/Provider.d.ts.map +1 -0
  385. package/dist/internal/funding/Provider.js +1081 -0
  386. package/dist/internal/funding/Provider.js.map +1 -0
  387. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  388. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  389. package/dist/internal/funding/Reconciliation.js +676 -0
  390. package/dist/internal/funding/Reconciliation.js.map +1 -0
  391. package/dist/internal/funding/Route.d.ts +21 -0
  392. package/dist/internal/funding/Route.d.ts.map +1 -0
  393. package/dist/internal/funding/Route.js +5 -0
  394. package/dist/internal/funding/Route.js.map +1 -0
  395. package/dist/internal/funding/Subsidy.d.ts +113 -0
  396. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  397. package/dist/internal/funding/Subsidy.js +138 -0
  398. package/dist/internal/funding/Subsidy.js.map +1 -0
  399. package/dist/internal/funding/Token.d.ts +41 -0
  400. package/dist/internal/funding/Token.d.ts.map +1 -0
  401. package/dist/internal/funding/Token.js +22 -0
  402. package/dist/internal/funding/Token.js.map +1 -0
  403. package/dist/internal/funding/Transfer.d.ts +643 -0
  404. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  405. package/dist/internal/funding/Transfer.js +332 -0
  406. package/dist/internal/funding/Transfer.js.map +1 -0
  407. package/dist/internal/funding/index.d.ts +13 -0
  408. package/dist/internal/funding/index.d.ts.map +1 -0
  409. package/dist/internal/funding/index.js +13 -0
  410. package/dist/internal/funding/index.js.map +1 -0
  411. package/dist/internal/funding/providers/across.d.ts +21 -0
  412. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  413. package/dist/internal/funding/providers/across.js +117 -0
  414. package/dist/internal/funding/providers/across.js.map +1 -0
  415. package/dist/internal/funding/providers/relay.d.ts +46 -0
  416. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  417. package/dist/internal/funding/providers/relay.js +464 -0
  418. package/dist/internal/funding/providers/relay.js.map +1 -0
  419. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  420. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  421. package/dist/internal/funding/providers/rhino.js +116 -0
  422. package/dist/internal/funding/providers/rhino.js.map +1 -0
  423. package/dist/internal/funding/providers/squid.d.ts +19 -0
  424. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  425. package/dist/internal/funding/providers/squid.js +120 -0
  426. package/dist/internal/funding/providers/squid.js.map +1 -0
  427. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  428. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  429. package/dist/internal/funding/providers/symbiosis.js +176 -0
  430. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  431. package/dist/internal/index.d.ts +5 -1
  432. package/dist/internal/index.d.ts.map +1 -1
  433. package/dist/internal/index.js +5 -1
  434. package/dist/internal/index.js.map +1 -1
  435. package/dist/internal/webhookDestinations/url.js +61 -57
  436. package/dist/internal/webhookDestinations/url.js.map +1 -1
  437. package/dist/providers/index.d.ts +43 -0
  438. package/dist/providers/index.d.ts.map +1 -0
  439. package/dist/providers/index.js +19 -0
  440. package/dist/providers/index.js.map +1 -0
  441. package/package.json +9 -4
  442. package/src/ApiKeys.test.ts +11 -7
  443. package/src/ApiKeys.ts +37 -9
  444. package/src/App.test.ts +85 -10
  445. package/src/App.ts +224 -137
  446. package/src/Assets.ts +29 -4
  447. package/src/Client.test-d.ts +650 -30
  448. package/src/Scope.test.ts +19 -0
  449. package/src/Scope.ts +28 -11
  450. package/src/Webhooks.test.ts +25 -0
  451. package/src/Webhooks.ts +1 -1
  452. package/src/admin/App.test.ts +9 -2
  453. package/src/admin/App.ts +32 -9
  454. package/src/admin/apps/api-keys.test.ts +167 -23
  455. package/src/admin/apps/api-keys.ts +166 -28
  456. package/src/admin/apps/earn-vaults.test.ts +338 -0
  457. package/src/admin/apps/earn-vaults.ts +572 -0
  458. package/src/admin/apps/scopes.test.ts +16 -1
  459. package/src/admin/ui/plugin.ts +2 -2
  460. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  461. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  462. package/src/admin/ui/src/components/Page.tsx +1 -1
  463. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  464. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  465. package/src/admin/ui/src/lib/client.ts +1 -1
  466. package/src/admin/ui/src/lib/config.ts +1 -1
  467. package/src/admin/ui/src/lib/early-access.ts +8 -9
  468. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  469. package/src/admin/ui/src/lib/format.ts +13 -0
  470. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  471. package/src/admin/ui/src/lib/organizations.ts +7 -1
  472. package/src/admin/ui/src/lib/response.ts +22 -0
  473. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  474. package/src/admin/ui/src/lib/scopes.ts +28 -7
  475. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  476. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  477. package/src/admin/ui/src/router.tsx +2 -2
  478. package/src/admin/ui/src/routes/__root.tsx +9 -8
  479. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  480. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  481. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  482. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  483. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  484. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  485. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  486. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  487. package/src/admin/ui/vite.config.ts +4 -1
  488. package/src/admin/ui.generated.ts +113 -43
  489. package/src/analytics/Analytics.test.ts +69 -10
  490. package/src/analytics/Analytics.ts +20 -1
  491. package/src/analytics/tables/requestEvents.ts +79 -37
  492. package/src/apps/Zones.test.ts +33 -0
  493. package/src/apps/Zones.ts +40 -0
  494. package/src/apps/composition.test.ts +84 -1
  495. package/src/apps/data/App.test.ts +28 -11
  496. package/src/apps/data/App.ts +96 -33
  497. package/src/apps/data/FxOracle.ts +1 -1
  498. package/src/apps/data/index.ts +0 -1
  499. package/src/apps/data/routes/activities.test.ts +82 -6
  500. package/src/apps/data/routes/activities.ts +131 -71
  501. package/src/apps/data/routes/balances.test.ts +50 -37
  502. package/src/apps/data/routes/balances.ts +5 -5
  503. package/src/apps/data/routes/blocks.test.ts +2 -0
  504. package/src/apps/data/routes/coingecko.test.ts +22 -0
  505. package/src/apps/data/routes/coingecko.ts +84 -48
  506. package/src/apps/data/routes/earn.test.ts +1108 -0
  507. package/src/apps/data/routes/earn.ts +1391 -0
  508. package/src/apps/data/routes/exchanges.test.ts +82 -33
  509. package/src/apps/data/routes/exchanges.ts +842 -227
  510. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  511. package/src/apps/data/routes/fee-amm.ts +69 -12
  512. package/src/apps/data/routes/funding.test.ts +2712 -221
  513. package/src/apps/data/routes/funding.ts +1604 -387
  514. package/src/apps/data/routes/indexer.test.ts +43 -34
  515. package/src/apps/data/routes/indexer.ts +19 -2
  516. package/src/apps/data/routes/receipts.test.ts +5 -3
  517. package/src/apps/data/routes/receipts.ts +13 -11
  518. package/src/apps/data/routes/rpc.test.ts +446 -28
  519. package/src/apps/data/routes/rpc.ts +243 -25
  520. package/src/apps/data/routes/tokenlist.ts +72 -19
  521. package/src/apps/data/routes/tokens.ts +258 -86
  522. package/src/apps/data/routes/transactions.test.ts +2 -0
  523. package/src/apps/data/routes/transactions.ts +77 -42
  524. package/src/apps/data/routes/transfers.test.ts +166 -4
  525. package/src/apps/data/routes/transfers.ts +216 -78
  526. package/src/apps/data/routes/valuation.test.ts +62 -9
  527. package/src/apps/data/routes/valuation.ts +2 -2
  528. package/src/apps/data/routes/webhooks.test.ts +386 -43
  529. package/src/apps/data/routes/webhooks.ts +172 -71
  530. package/src/apps/data/routes/zones.test.ts +473 -0
  531. package/src/apps/data/routes/zones.ts +338 -0
  532. package/src/apps/docs/reference.ts +8 -6
  533. package/src/apps/index.ts +2 -1
  534. package/src/apps/management/Billing.test.ts +29 -0
  535. package/src/apps/management/Billing.ts +23 -0
  536. package/src/apps/management/Error.ts +12 -0
  537. package/src/apps/management/routes/api-keys.test.ts +5 -3
  538. package/src/apps/management/routes/api-keys.ts +2 -9
  539. package/src/apps/management/routes/invitations.ts +4 -11
  540. package/src/apps/management/routes/orgs.ts +2 -9
  541. package/src/apps/management/routes/scopes.test.ts +7 -2
  542. package/src/apps/management/routes/scopes.ts +2 -2
  543. package/src/apps/management/routes/webhooks.test.ts +6 -1
  544. package/src/apps/management/routes/webhooks.ts +15 -3
  545. package/src/apps/mpp/App.ts +276 -29
  546. package/src/apps/mpp/Mpp.test.ts +631 -26
  547. package/src/apps/mpp/Mpp.ts +0 -42
  548. package/src/apps/mpp/internal/Adapter.ts +108 -3
  549. package/src/apps/mpp/internal/Error.test.ts +33 -0
  550. package/src/apps/mpp/internal/Error.ts +44 -6
  551. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  552. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  553. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  554. package/src/apps/mpp/internal/Policy.ts +98 -0
  555. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  556. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  557. package/src/apps/mpp/internal/Screening.ts +40 -3
  558. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  559. package/src/apps/mpp/internal/Utils.ts +30 -0
  560. package/src/apps/relay/App.test.ts +493 -62
  561. package/src/apps/relay/App.ts +233 -23
  562. package/src/apps/relay/Sponsorships.test.ts +49 -0
  563. package/src/apps/relay/Sponsorships.ts +18 -6
  564. package/src/db/Db.ts +439 -0
  565. package/src/db/Schema.ts +325 -2
  566. package/src/db/tables/earnVaults.test.ts +185 -0
  567. package/src/db/tables/earnVaults.ts +151 -0
  568. package/src/db/tables/fundingCatalog.test.ts +108 -0
  569. package/src/db/tables/fundingCatalog.ts +157 -0
  570. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  571. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  572. package/src/db/tables/fundingDeposits.test.ts +261 -0
  573. package/src/db/tables/fundingDeposits.ts +229 -0
  574. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  575. package/src/db/tables/fundingIdempotency.ts +180 -0
  576. package/src/db/tables/fundingTransferEvents.ts +28 -0
  577. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  578. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  579. package/src/db/tables/fundingTransfers.test.ts +89 -0
  580. package/src/db/tables/fundingTransfers.ts +153 -0
  581. package/src/db/tables/organizations.ts +16 -0
  582. package/src/db/tables/projects.ts +16 -0
  583. package/src/db/tables/requestUsage.ts +23 -0
  584. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  585. package/src/db/tables/sponsoredTransactions.ts +3 -3
  586. package/src/db/tables/users.ts +16 -0
  587. package/src/db/tables/verifiedTokens.ts +19 -14
  588. package/src/db/tables/webhookSubscriptions.ts +58 -3
  589. package/src/handlers/relay.test.ts +2 -0
  590. package/src/handlers/relay.ts +95 -99
  591. package/src/internal/Auth.test.ts +48 -0
  592. package/src/internal/Auth.ts +61 -2
  593. package/src/internal/Cache.ts +13 -9
  594. package/src/internal/Cursor.test.ts +2 -2
  595. package/src/internal/Cursor.ts +1 -1
  596. package/src/internal/EarnRates.test.ts +125 -0
  597. package/src/internal/EarnRates.ts +409 -0
  598. package/src/internal/EarnVaults.test.ts +195 -0
  599. package/src/internal/EarnVaults.ts +876 -0
  600. package/src/internal/EdgeCache.test.ts +19 -0
  601. package/src/internal/EdgeCache.ts +35 -5
  602. package/src/internal/Id.ts +14 -0
  603. package/src/internal/Idempotency.test.ts +109 -0
  604. package/src/internal/Idempotency.ts +237 -0
  605. package/src/internal/Log.test-d.ts +41 -8
  606. package/src/internal/Log.test.ts +189 -8
  607. package/src/internal/Log.ts +124 -17
  608. package/src/internal/MetricSink.test.ts +244 -4
  609. package/src/internal/MetricSink.ts +51 -1
  610. package/src/internal/OpenApi.ts +3 -0
  611. package/src/internal/Provider.test.ts +17 -0
  612. package/src/internal/Provider.ts +17 -0
  613. package/src/internal/Schema.ts +27 -17
  614. package/src/internal/Store.test.ts +25 -0
  615. package/src/internal/Store.ts +46 -0
  616. package/src/internal/Tidx.local.test.ts +78 -3
  617. package/src/internal/Tidx.test.ts +212 -18
  618. package/src/internal/Tidx.ts +112 -32
  619. package/src/internal/VerifiedTokens.test.ts +15 -0
  620. package/src/internal/Viem.test.ts +170 -17
  621. package/src/internal/Viem.ts +111 -28
  622. package/src/internal/WebhookDestination.ts +25 -23
  623. package/src/internal/Webhooks.test.ts +59 -0
  624. package/src/internal/Webhooks.ts +34 -10
  625. package/src/internal/exchange/Provider.test.ts +216 -0
  626. package/src/internal/exchange/Provider.ts +326 -0
  627. package/src/internal/exchange/index.test.ts +6 -0
  628. package/src/internal/exchange/index.ts +1 -0
  629. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  630. package/src/internal/exchange/providers/uniswap.ts +682 -0
  631. package/src/internal/funding/Action.test.ts +138 -0
  632. package/src/internal/funding/Action.ts +117 -0
  633. package/src/internal/funding/Catalog.test.ts +311 -0
  634. package/src/internal/funding/Catalog.ts +347 -0
  635. package/src/internal/funding/Chain.test.ts +79 -0
  636. package/src/internal/funding/Chain.ts +120 -0
  637. package/src/internal/funding/Deposit.test.ts +26 -0
  638. package/src/internal/funding/Deposit.ts +453 -0
  639. package/src/internal/funding/DepositAddress.test.ts +18 -0
  640. package/src/internal/funding/DepositAddress.ts +312 -0
  641. package/src/internal/funding/Evidence.test.ts +297 -0
  642. package/src/internal/funding/Evidence.ts +430 -0
  643. package/src/internal/funding/Provider.test.ts +1328 -0
  644. package/src/internal/funding/Provider.ts +1796 -0
  645. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  646. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  647. package/src/internal/funding/Reconciliation.ts +930 -0
  648. package/src/internal/funding/Route.test.ts +66 -0
  649. package/src/internal/funding/Route.ts +29 -0
  650. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  651. package/src/internal/funding/Subsidy.test.ts +75 -0
  652. package/src/internal/funding/Subsidy.ts +260 -0
  653. package/src/internal/funding/Token.test.ts +47 -0
  654. package/src/internal/funding/Token.ts +59 -0
  655. package/src/internal/funding/Transfer.test.ts +369 -0
  656. package/src/internal/funding/Transfer.ts +522 -0
  657. package/src/internal/funding/index.test.ts +20 -0
  658. package/src/internal/funding/index.ts +12 -0
  659. package/src/internal/funding/providers/across.ts +149 -0
  660. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  661. package/src/internal/funding/providers/relay.test.ts +474 -0
  662. package/src/internal/funding/providers/relay.ts +559 -0
  663. package/src/internal/funding/providers/rhino.ts +139 -0
  664. package/src/internal/funding/providers/squid.ts +151 -0
  665. package/src/internal/funding/providers/symbiosis.ts +221 -0
  666. package/src/internal/index.test.ts +5 -1
  667. package/src/internal/index.ts +5 -1
  668. package/src/internal/webhookDestinations/url.ts +49 -45
  669. package/src/providers/index.test.ts +14 -0
  670. package/src/providers/index.ts +54 -0
  671. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  672. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  673. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  674. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  675. package/dist/internal/FundingQuotes.d.ts +0 -864
  676. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  677. package/dist/internal/FundingQuotes.js +0 -672
  678. package/dist/internal/FundingQuotes.js.map +0 -1
  679. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  680. package/src/internal/FundingQuotes.test.ts +0 -456
  681. package/src/internal/FundingQuotes.ts +0 -944
@@ -152,7 +152,7 @@ export function relay(options: relay.Options = {}): Handler {
152
152
  : undefined
153
153
  const externalFeePayerUrl =
154
154
  typeof parameters['feePayer'] === 'string'
155
- ? normalizeExternalFeePayerUrl(parameters['feePayer'], {
155
+ ? ExternalFeePayerUrl.normalize(parameters['feePayer'], {
156
156
  allowUnsafe: internal_allowUnsafeUrls,
157
157
  })
158
158
  : undefined
@@ -1563,118 +1563,114 @@ function mergeCallsFromRequest(
1563
1563
  return merged
1564
1564
  }
1565
1565
 
1566
- /** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
1567
- function normalizeExternalFeePayerUrl(
1568
- value: string,
1569
- options: normalizeExternalFeePayerUrl.Options = {},
1570
- ): string {
1571
- let url: URL
1572
- try {
1573
- url = new URL(value)
1574
- } catch {
1575
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
1576
- }
1577
-
1578
- const allowUnsafe = options.allowUnsafe === true
1579
- if (url.protocol !== 'http:' && url.protocol !== 'https:')
1580
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1581
- if (!allowUnsafe && url.protocol !== 'https:')
1582
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1583
- if (!allowUnsafe && isUnsafeHostname(url.hostname))
1584
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
1585
-
1586
- url.username = ''
1587
- url.password = ''
1588
- url.hash = ''
1589
- return url.href
1590
- }
1591
-
1592
- declare namespace normalizeExternalFeePayerUrl {
1566
+ namespace ExternalFeePayerUrl {
1593
1567
  type Options = {
1594
1568
  /** Whether to allow non-HTTPS or local/private external fee payer URLs. */
1595
1569
  allowUnsafe?: boolean | undefined
1596
1570
  }
1597
- }
1598
1571
 
1599
- function isUnsafeHostname(hostname: string): boolean {
1600
- const host = normalizeHostname(hostname)
1601
- if (host === 'localhost' || host.endsWith('.localhost')) return true
1602
- const ipv4 = parseIpv4(host)
1603
- if (ipv4) return isUnsafeIpv4(ipv4)
1604
- if (!host.includes(':')) return false
1605
- const ipv6 = parseIpv6(host)
1606
- if (!ipv6) return true
1607
- return isUnsafeIpv6(ipv6)
1608
- }
1572
+ /** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
1573
+ export function normalize(value: string, options: Options = {}): string {
1574
+ let url: URL
1575
+ try {
1576
+ url = new URL(value)
1577
+ } catch {
1578
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
1579
+ }
1609
1580
 
1610
- function normalizeHostname(hostname: string): string {
1611
- return hostname
1612
- .toLowerCase()
1613
- .replace(/^\[|\]$/g, '')
1614
- .split('%')[0]!
1615
- }
1581
+ const allowUnsafe = options.allowUnsafe === true
1582
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
1583
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1584
+ if (!allowUnsafe && url.protocol !== 'https:')
1585
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1586
+ if (!allowUnsafe && isUnsafeHostname(url.hostname))
1587
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
1588
+
1589
+ url.username = ''
1590
+ url.password = ''
1591
+ url.hash = ''
1592
+ return url.href
1593
+ }
1616
1594
 
1617
- function parseIpv4(value: string): [number, number, number, number] | undefined {
1618
- const parts = value.split('.')
1619
- if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part))) return undefined
1620
- const numbers = parts.map((part) => Number(part))
1621
- if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return undefined
1622
- return numbers as [number, number, number, number]
1623
- }
1595
+ function isUnsafeHostname(hostname: string): boolean {
1596
+ const host = normalizeHostname(hostname)
1597
+ if (host === 'localhost' || host.endsWith('.localhost')) return true
1598
+ const ipv4 = parseIpv4(host)
1599
+ if (ipv4) return isUnsafeIpv4(ipv4)
1600
+ if (!host.includes(':')) return false
1601
+ const ipv6 = parseIpv6(host)
1602
+ if (!ipv6) return true
1603
+ return isUnsafeIpv6(ipv6)
1604
+ }
1624
1605
 
1625
- function isUnsafeIpv4(parts: [number, number, number, number]): boolean {
1626
- const [a, b] = parts
1627
- if (a === 0 || a === 10 || a === 127) return true
1628
- if (a === 100 && b >= 64 && b <= 127) return true
1629
- if (a === 169 && b === 254) return true
1630
- if (a === 172 && b >= 16 && b <= 31) return true
1631
- if (a === 192 && b === 168) return true
1632
- if (a >= 224) return true
1633
- return false
1634
- }
1606
+ function normalizeHostname(hostname: string): string {
1607
+ return hostname
1608
+ .toLowerCase()
1609
+ .replace(/^\[|\]$/g, '')
1610
+ .split('%')[0]!
1611
+ }
1635
1612
 
1636
- function parseIpv6(
1637
- value: string,
1638
- ): [number, number, number, number, number, number, number, number] | undefined {
1639
- const halves = value.split('::')
1640
- if (halves.length > 2) return undefined
1613
+ function parseIpv4(value: string): [number, number, number, number] | undefined {
1614
+ const parts = value.split('.')
1615
+ if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part))) return undefined
1616
+ const numbers = parts.map((part) => Number(part))
1617
+ if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return undefined
1618
+ return numbers as [number, number, number, number]
1619
+ }
1641
1620
 
1642
- const left = halves[0] ? halves[0].split(':') : []
1643
- const right = halves[1] ? halves[1].split(':') : []
1644
- const missing = halves.length === 2 ? 8 - left.length - right.length : 0
1645
- if (missing < 0) return undefined
1621
+ function isUnsafeIpv4(parts: [number, number, number, number]): boolean {
1622
+ const [a, b] = parts
1623
+ if (a === 0 || a === 10 || a === 127) return true
1624
+ if (a === 100 && b >= 64 && b <= 127) return true
1625
+ if (a === 169 && b === 254) return true
1626
+ if (a === 172 && b >= 16 && b <= 31) return true
1627
+ if (a === 192 && b === 168) return true
1628
+ return a >= 224
1629
+ }
1646
1630
 
1647
- const parts = [...left, ...Array(missing).fill('0'), ...right]
1648
- if (parts.length !== 8) return undefined
1631
+ function parseIpv6(
1632
+ value: string,
1633
+ ): [number, number, number, number, number, number, number, number] | undefined {
1634
+ const halves = value.split('::')
1635
+ if (halves.length > 2) return undefined
1649
1636
 
1650
- const numbers = parts.map((part) =>
1651
- /^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN,
1652
- )
1653
- if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff)) return undefined
1654
- return numbers as [number, number, number, number, number, number, number, number]
1655
- }
1637
+ const left = halves[0] ? halves[0].split(':') : []
1638
+ const right = halves[1] ? halves[1].split(':') : []
1639
+ const missing = halves.length === 2 ? 8 - left.length - right.length : 0
1640
+ if (missing < 0) return undefined
1656
1641
 
1657
- function isUnsafeIpv6(parts: [number, number, number, number, number, number, number, number]) {
1658
- const [a] = parts
1659
- if (parts.every((part) => part === 0)) return true
1660
- if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
1661
- if ((a & 0xfe00) === 0xfc00) return true
1662
- if ((a & 0xffc0) === 0xfe80) return true
1663
- if ((a & 0xffc0) === 0xfec0) return true
1664
- if ((a & 0xff00) === 0xff00) return true
1665
-
1666
- const ipv4 = ipv4FromIpv6(parts)
1667
- if (ipv4) return isUnsafeIpv4(ipv4)
1668
- return false
1669
- }
1642
+ const parts = [...left, ...Array(missing).fill('0'), ...right]
1643
+ if (parts.length !== 8) return undefined
1670
1644
 
1671
- function ipv4FromIpv6(
1672
- parts: [number, number, number, number, number, number, number, number],
1673
- ): [number, number, number, number] | undefined {
1674
- const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff
1675
- const compatible = parts.slice(0, 6).every((part) => part === 0)
1676
- if (!mapped && !compatible) return undefined
1677
- return [parts[6]! >> 8, parts[6]! & 0xff, parts[7]! >> 8, parts[7]! & 0xff]
1645
+ const numbers = parts.map((part) =>
1646
+ /^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN,
1647
+ )
1648
+ if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff))
1649
+ return undefined
1650
+ return numbers as [number, number, number, number, number, number, number, number]
1651
+ }
1652
+
1653
+ function isUnsafeIpv6(parts: [number, number, number, number, number, number, number, number]) {
1654
+ const [a] = parts
1655
+ if (parts.every((part) => part === 0)) return true
1656
+ if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
1657
+ if ((a & 0xfe00) === 0xfc00) return true
1658
+ if ((a & 0xffc0) === 0xfe80) return true
1659
+ if ((a & 0xffc0) === 0xfec0) return true
1660
+ if ((a & 0xff00) === 0xff00) return true
1661
+
1662
+ const ipv4 = ipv4FromIpv6(parts)
1663
+ return ipv4 ? isUnsafeIpv4(ipv4) : false
1664
+ }
1665
+
1666
+ function ipv4FromIpv6(
1667
+ parts: [number, number, number, number, number, number, number, number],
1668
+ ): [number, number, number, number] | undefined {
1669
+ const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff
1670
+ const compatible = parts.slice(0, 6).every((part) => part === 0)
1671
+ if (!mapped && !compatible) return undefined
1672
+ return [parts[6]! >> 8, parts[6]! & 0xff, parts[7]! >> 8, parts[7]! & 0xff]
1673
+ }
1678
1674
  }
1679
1675
 
1680
1676
  /**
@@ -1889,6 +1889,54 @@ describe('ensureProject', () => {
1889
1889
  })
1890
1890
  })
1891
1891
 
1892
+ describe('parseCredential', () => {
1893
+ test('parses credentials keyed by chain id', () => {
1894
+ const credential = Auth.parseCredential(
1895
+ JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone:secret' }),
1896
+ )
1897
+
1898
+ expect(credential).toEqual({ 4217: 'mainnet:secret', 421700001: 'zone:secret' })
1899
+ })
1900
+
1901
+ test('supports a shared credential', () => {
1902
+ expect(Auth.parseCredential('shared:secret')).toBe('shared:secret')
1903
+ })
1904
+
1905
+ test('rejects malformed credential maps', () => {
1906
+ expect(() => Auth.parseCredential('{"4217":1}')).toThrowErrorMatchingInlineSnapshot(
1907
+ `[Error: Expected a credential or a chain-id-to-credential JSON object.]`,
1908
+ )
1909
+ })
1910
+ })
1911
+
1912
+ describe('resolveCredential', () => {
1913
+ test('infers Basic auth from a credential containing a colon', () => {
1914
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'user:password' })).toEqual({
1915
+ basicAuth: 'user:password',
1916
+ })
1917
+ })
1918
+
1919
+ test('infers Bearer auth from a credential without a colon', () => {
1920
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'bearer-token' })).toEqual({
1921
+ basicAuth: undefined,
1922
+ bearerAuth: 'bearer-token',
1923
+ })
1924
+ })
1925
+
1926
+ test('selects a credential by chain id', () => {
1927
+ const value = JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone-token' })
1928
+
1929
+ expect(Auth.resolveCredential({ chainId: 4217, value })).toEqual({
1930
+ basicAuth: 'mainnet:secret',
1931
+ })
1932
+ expect(Auth.resolveCredential({ chainId: 421700001, value })).toEqual({
1933
+ basicAuth: undefined,
1934
+ bearerAuth: 'zone-token',
1935
+ })
1936
+ expect(Auth.resolveCredential({ chainId: 42431, value })).toEqual({ basicAuth: undefined })
1937
+ })
1938
+ })
1939
+
1892
1940
  function createScopedApp(options: {
1893
1941
  auth?: Auth.Context | undefined
1894
1942
  routes: readonly { path: string; policy: Auth.require.Policy }[]
@@ -9,6 +9,7 @@ import { findTargetHandler } from 'hono/utils/handler'
9
9
  import { Challenge, Credential, type Method } from 'mppx'
10
10
  import { Mppx, tempo } from 'mppx/hono'
11
11
  import { Addresses } from 'viem/tempo'
12
+ import { tempoMainnet } from 'viem/tempo/chains'
12
13
  import * as z from 'zod/mini'
13
14
 
14
15
  import type * as App from '../App.js'
@@ -26,7 +27,6 @@ import * as Response from './Response.js'
26
27
  import * as Schema from './Schema.js'
27
28
  import * as Scope from '../Scope.js'
28
29
  import * as Users from '../db/tables/users.js'
29
- import * as Viem from './Viem.js'
30
30
 
31
31
  const policySymbol = Symbol('tempo-api.auth.policy')
32
32
  const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management')
@@ -1451,7 +1451,7 @@ export function require<environment extends Environment = Environment>(
1451
1451
  if (
1452
1452
  apiKey.environment === 'sandbox' &&
1453
1453
  explicitChain !== undefined &&
1454
- Viem.isMainnet(explicitChain)
1454
+ explicitChain === tempoMainnet.id
1455
1455
  )
1456
1456
  return jsonError(c, {
1457
1457
  code: 'api_key_forbidden',
@@ -1644,6 +1644,65 @@ type RateLimitAccess = PaymentAccess & {
1644
1644
  rateLimit: RateLimit.Result
1645
1645
  }
1646
1646
 
1647
+ /** Shared or per-chain credentials. */
1648
+ export type ChainCredential = string | Record<number, string>
1649
+
1650
+ /** Parses shared or per-chain credentials from an environment value. */
1651
+ export function parseCredential(value: ChainCredential | undefined): parseCredential.ReturnType {
1652
+ if (!value) return undefined
1653
+ if (typeof value !== 'string') return value
1654
+ const credentials = (() => {
1655
+ try {
1656
+ return JSON.parse(value) as unknown
1657
+ } catch {
1658
+ return value
1659
+ }
1660
+ })()
1661
+ if (typeof credentials === 'string') return credentials
1662
+ if (
1663
+ !credentials ||
1664
+ typeof credentials !== 'object' ||
1665
+ Array.isArray(credentials) ||
1666
+ Object.values(credentials).some((credential) => typeof credential !== 'string')
1667
+ )
1668
+ throw new Error('Expected a credential or a chain-id-to-credential JSON object.')
1669
+ return credentials as Record<number, string>
1670
+ }
1671
+
1672
+ export declare namespace parseCredential {
1673
+ /** Parsed shared or per-chain credentials. */
1674
+ type ReturnType = ChainCredential | undefined
1675
+ }
1676
+
1677
+ /** Resolves a chain credential and infers its HTTP authorization scheme. */
1678
+ export function resolveCredential(
1679
+ options: resolveCredential.Options,
1680
+ ): resolveCredential.ReturnType {
1681
+ const credentials = parseCredential(options.value)
1682
+ const credential = typeof credentials === 'string' ? credentials : credentials?.[options.chainId]
1683
+ if (!credential) return { basicAuth: undefined }
1684
+ if (credential.includes(':')) return { basicAuth: credential }
1685
+ return { basicAuth: undefined, bearerAuth: credential }
1686
+ }
1687
+
1688
+ export declare namespace resolveCredential {
1689
+ /** Options for resolving a chain credential. */
1690
+ type Options = {
1691
+ /** Chain id selecting a per-chain credential. */
1692
+ chainId: number
1693
+ /** Shared or per-chain credentials. */
1694
+ value?: ChainCredential | undefined
1695
+ }
1696
+
1697
+ /** Resolved HTTP authorization credentials. */
1698
+ type ReturnType = {
1699
+ /** Basic credentials inferred from a value containing a colon. */
1700
+ basicAuth: string | undefined
1701
+ /** Bearer credential inferred from a value without a colon. */
1702
+ bearerAuth?: string | undefined
1703
+ }
1704
+ }
1705
+
1647
1706
  /**
1648
1707
  * How long to wait for the rate-limit counter before failing open. A hot
1649
1708
  * counter backend (e.g. a single Durable Object serving one busy quota bucket)
@@ -140,7 +140,7 @@ export function response<environment extends Env>(
140
140
  let res = result instanceof Response ? new Response(result.body, result) : c.res
141
141
  if (
142
142
  result instanceof Response &&
143
- etagMatches(res.headers.get('ETag'), c.req.header('If-None-Match'))
143
+ Etag.matches(res.headers.get('ETag'), c.req.header('If-None-Match'))
144
144
  )
145
145
  res = notModified(res)
146
146
 
@@ -158,7 +158,9 @@ export function response<environment extends Env>(
158
158
 
159
159
  // `markCacheable` lets the edge layer pay its store lookup only on routes
160
160
  // that mount this middleware; everything else skips the read.
161
- return EdgeCache.markCacheable(middleware)
161
+ return EdgeCache.markCacheable(middleware, {
162
+ key: options.key as (c: Context) => Promise<string> | string,
163
+ })
162
164
  }
163
165
 
164
166
  export declare namespace response {
@@ -214,9 +216,15 @@ export function urlKey<
214
216
  return url.toString()
215
217
  }
216
218
 
217
- function etagMatches(etag: string | null, ifNoneMatch: string | undefined) {
218
- if (!etag || !ifNoneMatch) return false
219
- return ifNoneMatch.split(/,\s*/).some((tag) => stripWeak(tag) === stripWeak(etag))
219
+ namespace Etag {
220
+ export function matches(etag: string | null, ifNoneMatch: string | undefined) {
221
+ if (!etag || !ifNoneMatch) return false
222
+ return ifNoneMatch.split(/,\s*/).some((tag) => stripWeak(tag) === stripWeak(etag))
223
+ }
224
+
225
+ function stripWeak(etag: string) {
226
+ return etag.replace(/^W\//, '')
227
+ }
220
228
  }
221
229
 
222
230
  function notModified(response: Response) {
@@ -248,10 +256,6 @@ function setCacheHeaders(
248
256
  headers.set('Vary', Array.from(vary.values()).join(', '))
249
257
  }
250
258
 
251
- function stripWeak(etag: string) {
252
- return etag.replace(/^W\//, '')
253
- }
254
-
255
259
  // Derive the shared-cache policy from a route's client `Cache-Control`. A
256
260
  // positive `s-maxage`/`max-age` (and no `no-store`/`no-cache`) is what makes a
257
261
  // route eligible for the anonymous edge cache; the `private` directive only
@@ -19,10 +19,10 @@ describe('Cursor', () => {
19
19
  })
20
20
 
21
21
  test('round-trips a timestamp/id tuple', () => {
22
- const token = Cursor.encode(['2026-01-01T00:00:00.000Z', 'org_abc123'])
22
+ const token = Cursor.encode(['2026-01-01T00:00:00.000Z', 'source:transaction-0'])
23
23
  expect(Cursor.decode(token, ['timestamp', 'id'])).toEqual([
24
24
  '2026-01-01T00:00:00.000Z',
25
- 'org_abc123',
25
+ 'source:transaction-0',
26
26
  ])
27
27
  })
28
28
 
@@ -138,7 +138,7 @@ function isValid(value: unknown, field: Field): boolean {
138
138
  case 'address':
139
139
  return typeof value === 'string' && /^0x[0-9a-fA-F]{40}$/.test(value)
140
140
  case 'id':
141
- return typeof value === 'string' && /^[A-Za-z0-9_-]+$/.test(value)
141
+ return typeof value === 'string' && /^[A-Za-z0-9:_-]+$/.test(value)
142
142
  case 'timestamp':
143
143
  return typeof value === 'string' && !Number.isNaN(Date.parse(value))
144
144
  }
@@ -0,0 +1,125 @@
1
+ import * as EarnRates from './EarnRates.js'
2
+
3
+ describe('schema.Window', () => {
4
+ test('stays absent when omitted', () => {
5
+ expect(EarnRates.schema.Window.parse(undefined)).toBeUndefined()
6
+ })
7
+
8
+ test('accepts every selectable window and nothing else', () => {
9
+ expect(
10
+ ['1h', '1d', '7d', '30d'].map((value) => EarnRates.schema.Window.parse(value)),
11
+ ).toStrictEqual(['1h', '1d', '7d', '30d'])
12
+ })
13
+
14
+ test('rejects windows outside the selectable set', () => {
15
+ expect(
16
+ ['0h', '24h', '36h', '168h', '7x', '1w', '-1d', '1.5d', '721h', '31d', '90d', ''].map(
17
+ (value) => EarnRates.schema.Window.safeParse(value).success,
18
+ ),
19
+ ).toStrictEqual([
20
+ false,
21
+ false,
22
+ false,
23
+ false,
24
+ false,
25
+ false,
26
+ false,
27
+ false,
28
+ false,
29
+ false,
30
+ false,
31
+ false,
32
+ ])
33
+ })
34
+ })
35
+
36
+ describe('asOf', () => {
37
+ test('rounds down to a fifteen-minute UTC bucket', () => {
38
+ vi.useFakeTimers()
39
+ try {
40
+ vi.setSystemTime(new Date('2026-07-21T09:14:59.999Z'))
41
+ const inBucket = EarnRates.asOf()
42
+ vi.setSystemTime(new Date('2026-07-21T09:29:59.000Z'))
43
+ expect([inBucket, EarnRates.asOf()]).toMatchInlineSnapshot(`
44
+ [
45
+ "2026-07-21T09:00:00.000Z",
46
+ "2026-07-21T09:15:00.000Z",
47
+ ]
48
+ `)
49
+ } finally {
50
+ vi.useRealTimers()
51
+ }
52
+ })
53
+
54
+ test('withholds the newest thirty seconds', () => {
55
+ vi.useFakeTimers()
56
+ try {
57
+ vi.setSystemTime(new Date('2026-07-21T09:15:20.000Z'))
58
+ expect(EarnRates.asOf()).toMatchInlineSnapshot(`"2026-07-21T09:00:00.000Z"`)
59
+ } finally {
60
+ vi.useRealTimers()
61
+ }
62
+ })
63
+ })
64
+
65
+ describe('annualize', () => {
66
+ const day = 24 * 60 * 60
67
+
68
+ test('annualizes share-price growth over the measured window', () => {
69
+ expect([
70
+ EarnRates.annualize({
71
+ end: { price: 1_010_000n, timestamp: 7 * day },
72
+ start: { price: 1_000_000n, timestamp: 0 },
73
+ }),
74
+ EarnRates.annualize({
75
+ end: { price: 1_000_500n, timestamp: 30 * day },
76
+ start: { price: 1_000_000n, timestamp: 0 },
77
+ }),
78
+ ]).toMatchInlineSnapshot(`
79
+ [
80
+ "0.680075",
81
+ "0.006100",
82
+ ]
83
+ `)
84
+ })
85
+
86
+ test('reports a drawdown as a negative ratio', () => {
87
+ expect(
88
+ EarnRates.annualize({
89
+ end: { price: 990_000n, timestamp: 30 * day },
90
+ start: { price: 1_000_000n, timestamp: 0 },
91
+ }),
92
+ ).toMatchInlineSnapshot(`"-0.115099"`)
93
+ })
94
+
95
+ test('leaves an unmeasurable window unannualized', () => {
96
+ expect([
97
+ // Reversed and zero-length windows.
98
+ EarnRates.annualize({
99
+ end: { price: 1_000_000n, timestamp: 0 },
100
+ start: { price: 1_000_000n, timestamp: day },
101
+ }),
102
+ EarnRates.annualize({
103
+ end: { price: 1_000_000n, timestamp: 0 },
104
+ start: { price: 1_000_000n, timestamp: 0 },
105
+ }),
106
+ // A vault with no starting price has no growth to measure.
107
+ EarnRates.annualize({
108
+ end: { price: 1_000_000n, timestamp: day },
109
+ start: { price: 0n, timestamp: 0 },
110
+ }),
111
+ // Growth too steep to express as a decimal ratio.
112
+ EarnRates.annualize({
113
+ end: { price: 1_010_000n, timestamp: 3600 },
114
+ start: { price: 1_000_000n, timestamp: 0 },
115
+ }),
116
+ ]).toMatchInlineSnapshot(`
117
+ [
118
+ null,
119
+ null,
120
+ null,
121
+ null,
122
+ ]
123
+ `)
124
+ })
125
+ })