tapimo 0.7.1 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (786) hide show
  1. package/README.md +10 -7
  2. package/dist/ApiKey.d.ts +3 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +10 -0
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +29 -8
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +24 -5
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +20680 -15487
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +250 -129
  13. package/dist/App.js.map +1 -1
  14. package/dist/Assets.d.ts +10 -0
  15. package/dist/Assets.d.ts.map +1 -1
  16. package/dist/Assets.js +17 -4
  17. package/dist/Assets.js.map +1 -1
  18. package/dist/Scope.d.ts +19 -8
  19. package/dist/Scope.d.ts.map +1 -1
  20. package/dist/Scope.js +25 -9
  21. package/dist/Scope.js.map +1 -1
  22. package/dist/Webhooks.d.ts +1 -1
  23. package/dist/admin/App.d.ts +667 -76
  24. package/dist/admin/App.d.ts.map +1 -1
  25. package/dist/admin/App.js +12 -2
  26. package/dist/admin/App.js.map +1 -1
  27. package/dist/admin/apps/api-keys.d.ts +107 -11
  28. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  29. package/dist/admin/apps/api-keys.js +145 -32
  30. package/dist/admin/apps/api-keys.js.map +1 -1
  31. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  32. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  33. package/dist/admin/apps/earn-vaults.js +409 -0
  34. package/dist/admin/apps/earn-vaults.js.map +1 -0
  35. package/dist/admin/apps/organizations.d.ts +2 -0
  36. package/dist/admin/apps/organizations.d.ts.map +1 -1
  37. package/dist/admin/apps/verified-tokens.d.ts +74 -74
  38. package/dist/admin/ui.generated.d.ts +1 -1
  39. package/dist/admin/ui.generated.d.ts.map +1 -1
  40. package/dist/admin/ui.generated.js +99 -43
  41. package/dist/admin/ui.generated.js.map +1 -1
  42. package/dist/analytics/Analytics.d.ts +4 -0
  43. package/dist/analytics/Analytics.d.ts.map +1 -1
  44. package/dist/analytics/Analytics.js +21 -2
  45. package/dist/analytics/Analytics.js.map +1 -1
  46. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  47. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  48. package/dist/analytics/tables/requestEvents.js +59 -39
  49. package/dist/analytics/tables/requestEvents.js.map +1 -1
  50. package/dist/apps/Zones.d.ts +8335 -0
  51. package/dist/apps/Zones.d.ts.map +1 -0
  52. package/dist/apps/Zones.js +38 -0
  53. package/dist/apps/Zones.js.map +1 -0
  54. package/dist/apps/data/App.d.ts +5666 -3934
  55. package/dist/apps/data/App.d.ts.map +1 -1
  56. package/dist/apps/data/App.js +90 -22
  57. package/dist/apps/data/App.js.map +1 -1
  58. package/dist/apps/data/FxOracle.d.ts +1 -1
  59. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  60. package/dist/apps/data/index.d.ts +0 -1
  61. package/dist/apps/data/index.d.ts.map +1 -1
  62. package/dist/apps/data/index.js +0 -1
  63. package/dist/apps/data/index.js.map +1 -1
  64. package/dist/apps/data/routes/activities.d.ts +56 -56
  65. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  66. package/dist/apps/data/routes/activities.js +130 -65
  67. package/dist/apps/data/routes/activities.js.map +1 -1
  68. package/dist/apps/data/routes/addresses.d.ts +65 -65
  69. package/dist/apps/data/routes/balances.d.ts +14 -14
  70. package/dist/apps/data/routes/balances.js +5 -5
  71. package/dist/apps/data/routes/balances.js.map +1 -1
  72. package/dist/apps/data/routes/blocks.d.ts +39 -39
  73. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  74. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  75. package/dist/apps/data/routes/coingecko.js +62 -35
  76. package/dist/apps/data/routes/coingecko.js.map +1 -1
  77. package/dist/apps/data/routes/earn.d.ts +2574 -0
  78. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  79. package/dist/apps/data/routes/earn.js +1574 -0
  80. package/dist/apps/data/routes/earn.js.map +1 -0
  81. package/dist/apps/data/routes/exchanges.d.ts +1626 -719
  82. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  83. package/dist/apps/data/routes/exchanges.js +656 -193
  84. package/dist/apps/data/routes/exchanges.js.map +1 -1
  85. package/dist/apps/data/routes/fee-amm.d.ts +108 -108
  86. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  87. package/dist/apps/data/routes/fee-amm.js +59 -8
  88. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  89. package/dist/apps/data/routes/indexer.d.ts +35 -35
  90. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  91. package/dist/apps/data/routes/indexer.js +23 -3
  92. package/dist/apps/data/routes/indexer.js.map +1 -1
  93. package/dist/apps/data/routes/receipts.d.ts +33 -33
  94. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  95. package/dist/apps/data/routes/receipts.js +11 -11
  96. package/dist/apps/data/routes/receipts.js.map +1 -1
  97. package/dist/apps/data/routes/rpc.d.ts +6 -6
  98. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  99. package/dist/apps/data/routes/rpc.js +214 -22
  100. package/dist/apps/data/routes/rpc.js.map +1 -1
  101. package/dist/apps/data/routes/tokenlist.d.ts +1 -1
  102. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  103. package/dist/apps/data/routes/tokenlist.js +39 -8
  104. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  105. package/dist/apps/data/routes/tokens.d.ts +115 -87
  106. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  107. package/dist/apps/data/routes/tokens.js +194 -91
  108. package/dist/apps/data/routes/tokens.js.map +1 -1
  109. package/dist/apps/data/routes/transactions.d.ts +54 -54
  110. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  111. package/dist/apps/data/routes/transactions.js +78 -39
  112. package/dist/apps/data/routes/transactions.js.map +1 -1
  113. package/dist/apps/data/routes/transfers.d.ts +76 -27
  114. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  115. package/dist/apps/data/routes/transfers.js +165 -67
  116. package/dist/apps/data/routes/transfers.js.map +1 -1
  117. package/dist/apps/data/routes/valuation.d.ts +42 -42
  118. package/dist/apps/data/routes/valuation.js +2 -2
  119. package/dist/apps/data/routes/valuation.js.map +1 -1
  120. package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
  121. package/dist/apps/data/routes/webhooks.d.ts +370 -368
  122. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  123. package/dist/apps/data/routes/webhooks.js +161 -59
  124. package/dist/apps/data/routes/webhooks.js.map +1 -1
  125. package/dist/apps/data/routes/zones.d.ts +281 -0
  126. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  127. package/dist/apps/data/routes/zones.js +252 -0
  128. package/dist/apps/data/routes/zones.js.map +1 -0
  129. package/dist/apps/docs/reference.js +6 -5
  130. package/dist/apps/docs/reference.js.map +1 -1
  131. package/dist/apps/funding/Access.d.ts +16 -0
  132. package/dist/apps/funding/Access.d.ts.map +1 -0
  133. package/dist/apps/funding/Access.js +22 -0
  134. package/dist/apps/funding/Access.js.map +1 -0
  135. package/dist/apps/funding/App.d.ts +3183 -0
  136. package/dist/apps/funding/App.d.ts.map +1 -0
  137. package/dist/apps/funding/App.js +46 -0
  138. package/dist/apps/funding/App.js.map +1 -0
  139. package/dist/apps/funding/Inventory.d.ts +5 -0
  140. package/dist/apps/funding/Inventory.d.ts.map +1 -0
  141. package/dist/apps/funding/Inventory.js +25 -0
  142. package/dist/apps/funding/Inventory.js.map +1 -0
  143. package/dist/apps/funding/ProviderAttempts.d.ts +5 -0
  144. package/dist/apps/funding/ProviderAttempts.d.ts.map +1 -0
  145. package/dist/apps/funding/ProviderAttempts.js +24 -0
  146. package/dist/apps/funding/ProviderAttempts.js.map +1 -0
  147. package/dist/apps/funding/index.d.ts +2 -0
  148. package/dist/apps/funding/index.d.ts.map +1 -0
  149. package/dist/apps/funding/index.js +2 -0
  150. package/dist/apps/funding/index.js.map +1 -0
  151. package/dist/apps/funding/routes/chains.d.ts +169 -0
  152. package/dist/apps/funding/routes/chains.d.ts.map +1 -0
  153. package/dist/apps/funding/routes/chains.js +80 -0
  154. package/dist/apps/funding/routes/chains.js.map +1 -0
  155. package/dist/apps/funding/routes/deposit-addresses.d.ts +2388 -0
  156. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -0
  157. package/dist/apps/funding/routes/deposit-addresses.js +860 -0
  158. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -0
  159. package/dist/apps/funding/routes/providers.d.ts +91 -0
  160. package/dist/apps/funding/routes/providers.d.ts.map +1 -0
  161. package/dist/apps/funding/routes/providers.js +56 -0
  162. package/dist/apps/funding/routes/providers.js.map +1 -0
  163. package/dist/apps/{data/routes/funding.d.ts → funding/routes/quotes.d.ts} +26 -396
  164. package/dist/apps/funding/routes/quotes.d.ts.map +1 -0
  165. package/dist/apps/funding/routes/quotes.js +188 -0
  166. package/dist/apps/funding/routes/quotes.js.map +1 -0
  167. package/dist/apps/funding/routes/transfers.d.ts +1999 -0
  168. package/dist/apps/funding/routes/transfers.d.ts.map +1 -0
  169. package/dist/apps/funding/routes/transfers.js +614 -0
  170. package/dist/apps/funding/routes/transfers.js.map +1 -0
  171. package/dist/apps/index.d.ts +3 -1
  172. package/dist/apps/index.d.ts.map +1 -1
  173. package/dist/apps/index.js +3 -1
  174. package/dist/apps/index.js.map +1 -1
  175. package/dist/apps/management/App.d.ts +839 -574
  176. package/dist/apps/management/App.d.ts.map +1 -1
  177. package/dist/apps/management/Billing.d.ts +8 -0
  178. package/dist/apps/management/Billing.d.ts.map +1 -1
  179. package/dist/apps/management/Billing.js +12 -0
  180. package/dist/apps/management/Billing.js.map +1 -1
  181. package/dist/apps/management/Error.d.ts +12 -0
  182. package/dist/apps/management/Error.d.ts.map +1 -0
  183. package/dist/apps/management/Error.js +10 -0
  184. package/dist/apps/management/Error.js.map +1 -0
  185. package/dist/apps/management/routes/api-keys.d.ts +296 -19
  186. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  187. package/dist/apps/management/routes/api-keys.js +77 -9
  188. package/dist/apps/management/routes/api-keys.js.map +1 -1
  189. package/dist/apps/management/routes/billing.d.ts +119 -119
  190. package/dist/apps/management/routes/faucet.d.ts +35 -35
  191. package/dist/apps/management/routes/invitations.d.ts +17 -17
  192. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  193. package/dist/apps/management/routes/invitations.js +4 -10
  194. package/dist/apps/management/routes/invitations.js.map +1 -1
  195. package/dist/apps/management/routes/invite-links.d.ts +38 -38
  196. package/dist/apps/management/routes/me.d.ts +6 -6
  197. package/dist/apps/management/routes/members.d.ts +69 -69
  198. package/dist/apps/management/routes/orgs.d.ts +16 -16
  199. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  200. package/dist/apps/management/routes/orgs.js +2 -8
  201. package/dist/apps/management/routes/orgs.js.map +1 -1
  202. package/dist/apps/management/routes/projects.d.ts +19 -19
  203. package/dist/apps/management/routes/scopes.d.ts +1 -1
  204. package/dist/apps/management/routes/scopes.js +2 -2
  205. package/dist/apps/management/routes/scopes.js.map +1 -1
  206. package/dist/apps/management/routes/usage.d.ts +72 -72
  207. package/dist/apps/management/routes/verified-token-requests.d.ts +18 -18
  208. package/dist/apps/management/routes/webhooks.d.ts +122 -122
  209. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  210. package/dist/apps/management/routes/webhooks.js +15 -3
  211. package/dist/apps/management/routes/webhooks.js.map +1 -1
  212. package/dist/apps/mcp.d.ts +2 -3
  213. package/dist/apps/mcp.d.ts.map +1 -1
  214. package/dist/apps/mcp.js +16 -14
  215. package/dist/apps/mcp.js.map +1 -1
  216. package/dist/apps/metadata.d.ts +4 -0
  217. package/dist/apps/metadata.d.ts.map +1 -1
  218. package/dist/apps/metadata.js +10 -0
  219. package/dist/apps/metadata.js.map +1 -1
  220. package/dist/apps/mpp/App.d.ts +57 -58
  221. package/dist/apps/mpp/App.d.ts.map +1 -1
  222. package/dist/apps/mpp/App.js +192 -27
  223. package/dist/apps/mpp/App.js.map +1 -1
  224. package/dist/apps/mpp/Mpp.d.ts +0 -20
  225. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  226. package/dist/apps/mpp/Mpp.js +0 -24
  227. package/dist/apps/mpp/Mpp.js.map +1 -1
  228. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  229. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  230. package/dist/apps/mpp/internal/Adapter.js +66 -0
  231. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  232. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  233. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  234. package/dist/apps/mpp/internal/Error.js +41 -0
  235. package/dist/apps/mpp/internal/Error.js.map +1 -0
  236. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  237. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  238. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  239. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  240. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  241. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  242. package/dist/apps/mpp/internal/Policy.js +57 -0
  243. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  244. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  245. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  246. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  247. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  248. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  249. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  250. package/dist/apps/mpp/internal/Screening.js +20 -0
  251. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  252. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  253. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  254. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  255. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  256. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  257. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  258. package/dist/apps/mpp/internal/Utils.js +24 -0
  259. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  260. package/dist/apps/relay/App.js +183 -23
  261. package/dist/apps/relay/App.js.map +1 -1
  262. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  263. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  264. package/dist/apps/relay/Sponsorships.js +15 -6
  265. package/dist/apps/relay/Sponsorships.js.map +1 -1
  266. package/dist/cloudflare.d.ts +50 -0
  267. package/dist/cloudflare.d.ts.map +1 -1
  268. package/dist/cloudflare.js +178 -0
  269. package/dist/cloudflare.js.map +1 -1
  270. package/dist/db/Db.d.ts +22 -0
  271. package/dist/db/Db.d.ts.map +1 -1
  272. package/dist/db/Db.js +379 -0
  273. package/dist/db/Db.js.map +1 -1
  274. package/dist/db/Schema.d.ts +933 -1
  275. package/dist/db/Schema.d.ts.map +1 -1
  276. package/dist/db/Schema.js +289 -1
  277. package/dist/db/Schema.js.map +1 -1
  278. package/dist/db/tables/earnVaults.d.ts +68 -0
  279. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  280. package/dist/db/tables/earnVaults.js +72 -0
  281. package/dist/db/tables/earnVaults.js.map +1 -0
  282. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  283. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  284. package/dist/db/tables/fundingCatalog.js +85 -0
  285. package/dist/db/tables/fundingCatalog.js.map +1 -0
  286. package/dist/db/tables/fundingDepositAddresses.d.ts +172 -0
  287. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  288. package/dist/db/tables/fundingDepositAddresses.js +218 -0
  289. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  290. package/dist/db/tables/fundingDepositRequestObservations.d.ts +45 -0
  291. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +1 -0
  292. package/dist/db/tables/fundingDepositRequestObservations.js +46 -0
  293. package/dist/db/tables/fundingDepositRequestObservations.js.map +1 -0
  294. package/dist/db/tables/fundingDeposits.d.ts +171 -0
  295. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  296. package/dist/db/tables/fundingDeposits.js +182 -0
  297. package/dist/db/tables/fundingDeposits.js.map +1 -0
  298. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  299. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  300. package/dist/db/tables/fundingIdempotency.js +103 -0
  301. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  302. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  303. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  304. package/dist/db/tables/fundingTransferEvents.js +18 -0
  305. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  306. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  307. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  308. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  309. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  310. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  311. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  312. package/dist/db/tables/fundingTransfers.js +89 -0
  313. package/dist/db/tables/fundingTransfers.js.map +1 -0
  314. package/dist/db/tables/organizations.d.ts +8 -0
  315. package/dist/db/tables/organizations.d.ts.map +1 -1
  316. package/dist/db/tables/organizations.js +16 -0
  317. package/dist/db/tables/organizations.js.map +1 -1
  318. package/dist/db/tables/projects.d.ts +8 -0
  319. package/dist/db/tables/projects.d.ts.map +1 -1
  320. package/dist/db/tables/projects.js +16 -0
  321. package/dist/db/tables/projects.js.map +1 -1
  322. package/dist/db/tables/requestUsage.d.ts +13 -0
  323. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  324. package/dist/db/tables/requestUsage.js +16 -0
  325. package/dist/db/tables/requestUsage.js.map +1 -1
  326. package/dist/db/tables/sponsoredTransactions.d.ts +2 -2
  327. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  328. package/dist/db/tables/sponsoredTransactions.js +1 -1
  329. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  330. package/dist/db/tables/users.d.ts +8 -0
  331. package/dist/db/tables/users.d.ts.map +1 -1
  332. package/dist/db/tables/users.js +16 -0
  333. package/dist/db/tables/users.js.map +1 -1
  334. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  335. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  336. package/dist/db/tables/verifiedTokens.js +9 -7
  337. package/dist/db/tables/verifiedTokens.js.map +1 -1
  338. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  339. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  340. package/dist/db/tables/webhookSubscriptions.js +24 -3
  341. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  342. package/dist/handlers/relay.js +108 -108
  343. package/dist/handlers/relay.js.map +1 -1
  344. package/dist/internal/Auth.d.ts +37 -11
  345. package/dist/internal/Auth.d.ts.map +1 -1
  346. package/dist/internal/Auth.js +75 -16
  347. package/dist/internal/Auth.js.map +1 -1
  348. package/dist/internal/Cache.d.ts.map +1 -1
  349. package/dist/internal/Cache.js +17 -11
  350. package/dist/internal/Cache.js.map +1 -1
  351. package/dist/internal/Cursor.js +1 -1
  352. package/dist/internal/Cursor.js.map +1 -1
  353. package/dist/internal/EarnRates.d.ts +89 -0
  354. package/dist/internal/EarnRates.d.ts.map +1 -0
  355. package/dist/internal/EarnRates.js +266 -0
  356. package/dist/internal/EarnRates.js.map +1 -0
  357. package/dist/internal/EarnVaults.d.ts +171 -0
  358. package/dist/internal/EarnVaults.d.ts.map +1 -0
  359. package/dist/internal/EarnVaults.js +547 -0
  360. package/dist/internal/EarnVaults.js.map +1 -0
  361. package/dist/internal/EdgeCache.d.ts +10 -3
  362. package/dist/internal/EdgeCache.d.ts.map +1 -1
  363. package/dist/internal/EdgeCache.js +43 -11
  364. package/dist/internal/EdgeCache.js.map +1 -1
  365. package/dist/internal/Id.d.ts +11 -0
  366. package/dist/internal/Id.d.ts.map +1 -1
  367. package/dist/internal/Id.js +13 -0
  368. package/dist/internal/Id.js.map +1 -1
  369. package/dist/internal/Idempotency.d.ts +83 -0
  370. package/dist/internal/Idempotency.d.ts.map +1 -0
  371. package/dist/internal/Idempotency.js +113 -0
  372. package/dist/internal/Idempotency.js.map +1 -0
  373. package/dist/internal/IpAllowlist.d.ts +15 -0
  374. package/dist/internal/IpAllowlist.d.ts.map +1 -0
  375. package/dist/internal/IpAllowlist.js +27 -0
  376. package/dist/internal/IpAllowlist.js.map +1 -0
  377. package/dist/internal/Log.d.ts +64 -9
  378. package/dist/internal/Log.d.ts.map +1 -1
  379. package/dist/internal/Log.js +29 -7
  380. package/dist/internal/Log.js.map +1 -1
  381. package/dist/internal/MetricSink.d.ts.map +1 -1
  382. package/dist/internal/MetricSink.js +47 -1
  383. package/dist/internal/MetricSink.js.map +1 -1
  384. package/dist/internal/OpenApi.d.ts +2 -2
  385. package/dist/internal/OpenApi.d.ts.map +1 -1
  386. package/dist/internal/OpenApi.js +4 -1
  387. package/dist/internal/OpenApi.js.map +1 -1
  388. package/dist/internal/Provider.d.ts +14 -0
  389. package/dist/internal/Provider.d.ts.map +1 -0
  390. package/dist/internal/Provider.js +5 -0
  391. package/dist/internal/Provider.js.map +1 -0
  392. package/dist/internal/Schema.d.ts +6 -1
  393. package/dist/internal/Schema.d.ts.map +1 -1
  394. package/dist/internal/Schema.js +20 -11
  395. package/dist/internal/Schema.js.map +1 -1
  396. package/dist/internal/Store.d.ts +6 -0
  397. package/dist/internal/Store.d.ts.map +1 -1
  398. package/dist/internal/Store.js +35 -0
  399. package/dist/internal/Store.js.map +1 -1
  400. package/dist/internal/Tidx.d.ts +49 -24
  401. package/dist/internal/Tidx.d.ts.map +1 -1
  402. package/dist/internal/Tidx.js +90 -12
  403. package/dist/internal/Tidx.js.map +1 -1
  404. package/dist/internal/Viem.d.ts +90 -65
  405. package/dist/internal/Viem.d.ts.map +1 -1
  406. package/dist/internal/Viem.js +90 -12
  407. package/dist/internal/Viem.js.map +1 -1
  408. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  409. package/dist/internal/WebhookDestination.js +34 -28
  410. package/dist/internal/WebhookDestination.js.map +1 -1
  411. package/dist/internal/Webhooks.d.ts +9 -0
  412. package/dist/internal/Webhooks.d.ts.map +1 -1
  413. package/dist/internal/Webhooks.js +15 -10
  414. package/dist/internal/Webhooks.js.map +1 -1
  415. package/dist/internal/exchange/Provider.d.ts +219 -0
  416. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  417. package/dist/internal/exchange/Provider.js +117 -0
  418. package/dist/internal/exchange/Provider.js.map +1 -0
  419. package/dist/internal/exchange/index.d.ts +2 -0
  420. package/dist/internal/exchange/index.d.ts.map +1 -0
  421. package/dist/internal/exchange/index.js +2 -0
  422. package/dist/internal/exchange/index.js.map +1 -0
  423. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  424. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  425. package/dist/internal/exchange/providers/uniswap.js +553 -0
  426. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  427. package/dist/internal/funding/Action.d.ts +55 -0
  428. package/dist/internal/funding/Action.d.ts.map +1 -0
  429. package/dist/internal/funding/Action.js +74 -0
  430. package/dist/internal/funding/Action.js.map +1 -0
  431. package/dist/internal/funding/Catalog.d.ts +107 -0
  432. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  433. package/dist/internal/funding/Catalog.js +270 -0
  434. package/dist/internal/funding/Catalog.js.map +1 -0
  435. package/dist/internal/funding/Chain.d.ts +76 -0
  436. package/dist/internal/funding/Chain.d.ts.map +1 -0
  437. package/dist/internal/funding/Chain.js +38 -0
  438. package/dist/internal/funding/Chain.js.map +1 -0
  439. package/dist/internal/funding/Deposit.d.ts +408 -0
  440. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  441. package/dist/internal/funding/Deposit.js +318 -0
  442. package/dist/internal/funding/Deposit.js.map +1 -0
  443. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  444. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  445. package/dist/internal/funding/DepositAddress.js +189 -0
  446. package/dist/internal/funding/DepositAddress.js.map +1 -0
  447. package/dist/internal/funding/Evidence.d.ts +48 -0
  448. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  449. package/dist/internal/funding/Evidence.js +315 -0
  450. package/dist/internal/funding/Evidence.js.map +1 -0
  451. package/dist/internal/funding/Provider.d.ts +1288 -0
  452. package/dist/internal/funding/Provider.d.ts.map +1 -0
  453. package/dist/internal/funding/Provider.js +1086 -0
  454. package/dist/internal/funding/Provider.js.map +1 -0
  455. package/dist/internal/funding/Reconciliation.d.ts +127 -0
  456. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  457. package/dist/internal/funding/Reconciliation.js +885 -0
  458. package/dist/internal/funding/Reconciliation.js.map +1 -0
  459. package/dist/internal/funding/Route.d.ts +21 -0
  460. package/dist/internal/funding/Route.d.ts.map +1 -0
  461. package/dist/internal/funding/Route.js +5 -0
  462. package/dist/internal/funding/Route.js.map +1 -0
  463. package/dist/internal/funding/SourceObservation.d.ts +108 -0
  464. package/dist/internal/funding/SourceObservation.d.ts.map +1 -0
  465. package/dist/internal/funding/SourceObservation.js +143 -0
  466. package/dist/internal/funding/SourceObservation.js.map +1 -0
  467. package/dist/internal/funding/Subsidy.d.ts +113 -0
  468. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  469. package/dist/internal/funding/Subsidy.js +138 -0
  470. package/dist/internal/funding/Subsidy.js.map +1 -0
  471. package/dist/internal/funding/Token.d.ts +41 -0
  472. package/dist/internal/funding/Token.d.ts.map +1 -0
  473. package/dist/internal/funding/Token.js +22 -0
  474. package/dist/internal/funding/Token.js.map +1 -0
  475. package/dist/internal/funding/Transfer.d.ts +643 -0
  476. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  477. package/dist/internal/funding/Transfer.js +332 -0
  478. package/dist/internal/funding/Transfer.js.map +1 -0
  479. package/dist/internal/funding/index.d.ts +14 -0
  480. package/dist/internal/funding/index.d.ts.map +1 -0
  481. package/dist/internal/funding/index.js +14 -0
  482. package/dist/internal/funding/index.js.map +1 -0
  483. package/dist/internal/funding/providers/across.d.ts +21 -0
  484. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  485. package/dist/internal/funding/providers/across.js +117 -0
  486. package/dist/internal/funding/providers/across.js.map +1 -0
  487. package/dist/internal/funding/providers/relay.d.ts +88 -0
  488. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  489. package/dist/internal/funding/providers/relay.js +871 -0
  490. package/dist/internal/funding/providers/relay.js.map +1 -0
  491. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  492. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  493. package/dist/internal/funding/providers/rhino.js +116 -0
  494. package/dist/internal/funding/providers/rhino.js.map +1 -0
  495. package/dist/internal/funding/providers/squid.d.ts +19 -0
  496. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  497. package/dist/internal/funding/providers/squid.js +120 -0
  498. package/dist/internal/funding/providers/squid.js.map +1 -0
  499. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  500. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  501. package/dist/internal/funding/providers/symbiosis.js +176 -0
  502. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  503. package/dist/internal/index.d.ts +5 -1
  504. package/dist/internal/index.d.ts.map +1 -1
  505. package/dist/internal/index.js +5 -1
  506. package/dist/internal/index.js.map +1 -1
  507. package/dist/internal/webhookDestinations/url.js +61 -57
  508. package/dist/internal/webhookDestinations/url.js.map +1 -1
  509. package/dist/providers/index.d.ts +43 -0
  510. package/dist/providers/index.d.ts.map +1 -0
  511. package/dist/providers/index.js +19 -0
  512. package/dist/providers/index.js.map +1 -0
  513. package/package.json +10 -5
  514. package/src/ApiKey.test.ts +35 -0
  515. package/src/ApiKey.ts +27 -0
  516. package/src/ApiKeys.test.ts +40 -7
  517. package/src/ApiKeys.ts +46 -10
  518. package/src/App.test.ts +108 -15
  519. package/src/App.ts +296 -138
  520. package/src/Assets.ts +29 -4
  521. package/src/Client.test-d.ts +809 -37
  522. package/src/Scope.test.ts +19 -0
  523. package/src/Scope.ts +28 -11
  524. package/src/Webhooks.test.ts +25 -0
  525. package/src/Webhooks.ts +1 -1
  526. package/src/admin/App.test.ts +9 -2
  527. package/src/admin/App.ts +32 -9
  528. package/src/admin/apps/api-keys.test.ts +190 -22
  529. package/src/admin/apps/api-keys.ts +170 -28
  530. package/src/admin/apps/earn-vaults.test.ts +338 -0
  531. package/src/admin/apps/earn-vaults.ts +572 -0
  532. package/src/admin/apps/scopes.test.ts +16 -1
  533. package/src/admin/ui/plugin.ts +2 -2
  534. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  535. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  536. package/src/admin/ui/src/components/Page.tsx +1 -1
  537. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  538. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  539. package/src/admin/ui/src/lib/client.ts +1 -1
  540. package/src/admin/ui/src/lib/config.ts +1 -1
  541. package/src/admin/ui/src/lib/early-access.ts +8 -9
  542. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  543. package/src/admin/ui/src/lib/format.ts +13 -0
  544. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  545. package/src/admin/ui/src/lib/organizations.ts +7 -1
  546. package/src/admin/ui/src/lib/response.ts +22 -0
  547. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  548. package/src/admin/ui/src/lib/scopes.ts +28 -7
  549. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  550. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  551. package/src/admin/ui/src/router.tsx +2 -2
  552. package/src/admin/ui/src/routes/__root.tsx +9 -8
  553. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  554. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  555. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  556. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  557. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  558. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  559. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  560. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  561. package/src/admin/ui/vite.config.ts +4 -1
  562. package/src/admin/ui.generated.ts +113 -43
  563. package/src/analytics/Analytics.test.ts +69 -10
  564. package/src/analytics/Analytics.ts +24 -1
  565. package/src/analytics/tables/requestEvents.ts +79 -37
  566. package/src/apps/Zones.test.ts +33 -0
  567. package/src/apps/Zones.ts +40 -0
  568. package/src/apps/composition.test.ts +184 -3
  569. package/src/apps/data/App.test.ts +28 -23
  570. package/src/apps/data/App.ts +95 -36
  571. package/src/apps/data/FxOracle.ts +1 -1
  572. package/src/apps/data/index.ts +0 -1
  573. package/src/apps/data/routes/activities.test.ts +82 -6
  574. package/src/apps/data/routes/activities.ts +131 -71
  575. package/src/apps/data/routes/balances.test.ts +50 -37
  576. package/src/apps/data/routes/balances.ts +5 -5
  577. package/src/apps/data/routes/blocks.test.ts +2 -0
  578. package/src/apps/data/routes/coingecko.test.ts +22 -0
  579. package/src/apps/data/routes/coingecko.ts +84 -48
  580. package/src/apps/data/routes/earn.test.ts +1391 -0
  581. package/src/apps/data/routes/earn.ts +2188 -0
  582. package/src/apps/data/routes/exchanges.test.ts +82 -33
  583. package/src/apps/data/routes/exchanges.ts +842 -227
  584. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  585. package/src/apps/data/routes/fee-amm.ts +69 -12
  586. package/src/apps/data/routes/indexer.test.ts +43 -34
  587. package/src/apps/data/routes/indexer.ts +21 -3
  588. package/src/apps/data/routes/receipts.test.ts +5 -3
  589. package/src/apps/data/routes/receipts.ts +13 -11
  590. package/src/apps/data/routes/rpc.test.ts +446 -28
  591. package/src/apps/data/routes/rpc.ts +245 -25
  592. package/src/apps/data/routes/tokenlist.ts +72 -19
  593. package/src/apps/data/routes/tokens.test.ts +6 -8
  594. package/src/apps/data/routes/tokens.ts +258 -86
  595. package/src/apps/data/routes/transactions.test.ts +2 -0
  596. package/src/apps/data/routes/transactions.ts +77 -42
  597. package/src/apps/data/routes/transfers.test.ts +166 -4
  598. package/src/apps/data/routes/transfers.ts +216 -78
  599. package/src/apps/data/routes/valuation.test.ts +62 -9
  600. package/src/apps/data/routes/valuation.ts +2 -2
  601. package/src/apps/data/routes/webhooks.test.ts +386 -43
  602. package/src/apps/data/routes/webhooks.ts +172 -71
  603. package/src/apps/data/routes/zones.test.ts +473 -0
  604. package/src/apps/data/routes/zones.ts +338 -0
  605. package/src/apps/docs/reference.ts +8 -6
  606. package/src/apps/funding/Access.ts +26 -0
  607. package/src/apps/funding/App.test.ts +78 -0
  608. package/src/apps/funding/App.ts +63 -0
  609. package/src/apps/funding/Inventory.ts +30 -0
  610. package/src/apps/funding/ProviderAttempts.ts +26 -0
  611. package/src/apps/funding/index.ts +1 -0
  612. package/src/apps/funding/routes/chains.test.ts +78 -0
  613. package/src/apps/funding/routes/chains.ts +101 -0
  614. package/src/apps/funding/routes/deposit-addresses.test.ts +1628 -0
  615. package/src/apps/funding/routes/deposit-addresses.ts +1015 -0
  616. package/src/apps/funding/routes/providers.test.ts +165 -0
  617. package/src/apps/funding/routes/providers.ts +73 -0
  618. package/src/apps/funding/routes/quotes.test.ts +511 -0
  619. package/src/apps/funding/routes/quotes.ts +205 -0
  620. package/src/apps/funding/routes/transfers.test.ts +1255 -0
  621. package/src/apps/funding/routes/transfers.ts +704 -0
  622. package/src/apps/index.ts +3 -1
  623. package/src/apps/management/Billing.test.ts +29 -0
  624. package/src/apps/management/Billing.ts +23 -0
  625. package/src/apps/management/Error.ts +12 -0
  626. package/src/apps/management/routes/api-keys.test.ts +103 -3
  627. package/src/apps/management/routes/api-keys.ts +98 -10
  628. package/src/apps/management/routes/invitations.ts +4 -11
  629. package/src/apps/management/routes/orgs.ts +2 -9
  630. package/src/apps/management/routes/scopes.test.ts +7 -2
  631. package/src/apps/management/routes/scopes.ts +2 -2
  632. package/src/apps/management/routes/webhooks.test.ts +6 -1
  633. package/src/apps/management/routes/webhooks.ts +15 -3
  634. package/src/apps/mcp.test.ts +17 -2
  635. package/src/apps/mcp.ts +18 -13
  636. package/src/apps/metadata.ts +12 -0
  637. package/src/apps/mpp/App.ts +276 -29
  638. package/src/apps/mpp/Mpp.test.ts +631 -26
  639. package/src/apps/mpp/Mpp.ts +0 -42
  640. package/src/apps/mpp/internal/Adapter.ts +108 -3
  641. package/src/apps/mpp/internal/Error.test.ts +33 -0
  642. package/src/apps/mpp/internal/Error.ts +44 -6
  643. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  644. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  645. package/src/apps/mpp/internal/Policy.test.ts +128 -0
  646. package/src/apps/mpp/internal/Policy.ts +98 -0
  647. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  648. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  649. package/src/apps/mpp/internal/Screening.ts +40 -3
  650. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  651. package/src/apps/mpp/internal/Utils.ts +30 -0
  652. package/src/apps/relay/App.test.ts +493 -62
  653. package/src/apps/relay/App.ts +233 -23
  654. package/src/apps/relay/Sponsorships.test.ts +49 -0
  655. package/src/apps/relay/Sponsorships.ts +18 -6
  656. package/src/cloudflare.ts +279 -0
  657. package/src/db/Db.ts +501 -0
  658. package/src/db/Schema.ts +349 -2
  659. package/src/db/tables/earnVaults.test.ts +185 -0
  660. package/src/db/tables/earnVaults.ts +151 -0
  661. package/src/db/tables/fundingCatalog.test.ts +108 -0
  662. package/src/db/tables/fundingCatalog.ts +157 -0
  663. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  664. package/src/db/tables/fundingDepositAddresses.ts +404 -0
  665. package/src/db/tables/fundingDepositRequestObservations.test.ts +106 -0
  666. package/src/db/tables/fundingDepositRequestObservations.ts +99 -0
  667. package/src/db/tables/fundingDeposits.test.ts +399 -0
  668. package/src/db/tables/fundingDeposits.ts +373 -0
  669. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  670. package/src/db/tables/fundingIdempotency.ts +180 -0
  671. package/src/db/tables/fundingTransferEvents.ts +28 -0
  672. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  673. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  674. package/src/db/tables/fundingTransfers.test.ts +89 -0
  675. package/src/db/tables/fundingTransfers.ts +153 -0
  676. package/src/db/tables/organizations.ts +16 -0
  677. package/src/db/tables/projects.ts +16 -0
  678. package/src/db/tables/requestUsage.ts +23 -0
  679. package/src/db/tables/sponsoredTransactions.test.ts +11 -0
  680. package/src/db/tables/sponsoredTransactions.ts +3 -3
  681. package/src/db/tables/users.ts +16 -0
  682. package/src/db/tables/verifiedTokens.ts +19 -14
  683. package/src/db/tables/webhookSubscriptions.ts +58 -3
  684. package/src/handlers/relay.test.ts +2 -0
  685. package/src/handlers/relay.ts +95 -99
  686. package/src/internal/Auth.test.ts +225 -5
  687. package/src/internal/Auth.ts +109 -20
  688. package/src/internal/Cache.test.ts +37 -3
  689. package/src/internal/Cache.ts +14 -10
  690. package/src/internal/Cursor.test.ts +2 -2
  691. package/src/internal/Cursor.ts +1 -1
  692. package/src/internal/EarnRates.test.ts +125 -0
  693. package/src/internal/EarnRates.ts +409 -0
  694. package/src/internal/EarnVaults.test.ts +195 -0
  695. package/src/internal/EarnVaults.ts +876 -0
  696. package/src/internal/EdgeCache.test.ts +26 -7
  697. package/src/internal/EdgeCache.ts +48 -9
  698. package/src/internal/Id.ts +14 -0
  699. package/src/internal/Idempotency.test.ts +109 -0
  700. package/src/internal/Idempotency.ts +237 -0
  701. package/src/internal/IpAllowlist.test.ts +52 -0
  702. package/src/internal/IpAllowlist.ts +39 -0
  703. package/src/internal/Log.test-d.ts +41 -8
  704. package/src/internal/Log.test.ts +196 -9
  705. package/src/internal/Log.ts +124 -17
  706. package/src/internal/MetricSink.test.ts +244 -4
  707. package/src/internal/MetricSink.ts +51 -1
  708. package/src/internal/OpenApi.ts +4 -1
  709. package/src/internal/Provider.test.ts +17 -0
  710. package/src/internal/Provider.ts +17 -0
  711. package/src/internal/Schema.ts +27 -17
  712. package/src/internal/Store.test.ts +25 -0
  713. package/src/internal/Store.ts +46 -0
  714. package/src/internal/Tidx.local.test.ts +78 -3
  715. package/src/internal/Tidx.test.ts +240 -18
  716. package/src/internal/Tidx.ts +129 -33
  717. package/src/internal/VerifiedTokens.test.ts +15 -0
  718. package/src/internal/Viem.test.ts +198 -17
  719. package/src/internal/Viem.ts +127 -28
  720. package/src/internal/WebhookDestination.ts +25 -23
  721. package/src/internal/Webhooks.test.ts +59 -0
  722. package/src/internal/Webhooks.ts +34 -10
  723. package/src/internal/exchange/Provider.test.ts +216 -0
  724. package/src/internal/exchange/Provider.ts +326 -0
  725. package/src/internal/exchange/index.test.ts +6 -0
  726. package/src/internal/exchange/index.ts +1 -0
  727. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  728. package/src/internal/exchange/providers/uniswap.ts +682 -0
  729. package/src/internal/funding/Action.test.ts +138 -0
  730. package/src/internal/funding/Action.ts +117 -0
  731. package/src/internal/funding/Catalog.test.ts +311 -0
  732. package/src/internal/funding/Catalog.ts +347 -0
  733. package/src/internal/funding/Chain.test.ts +79 -0
  734. package/src/internal/funding/Chain.ts +120 -0
  735. package/src/internal/funding/Deposit.test.ts +26 -0
  736. package/src/internal/funding/Deposit.ts +522 -0
  737. package/src/internal/funding/DepositAddress.test.ts +18 -0
  738. package/src/internal/funding/DepositAddress.ts +312 -0
  739. package/src/internal/funding/Evidence.test.ts +297 -0
  740. package/src/internal/funding/Evidence.ts +425 -0
  741. package/src/internal/funding/Provider.test.ts +1328 -0
  742. package/src/internal/funding/Provider.ts +1911 -0
  743. package/src/internal/funding/Reconciliation.local.test.ts +511 -0
  744. package/src/internal/funding/Reconciliation.test.ts +3037 -0
  745. package/src/internal/funding/Reconciliation.ts +1202 -0
  746. package/src/internal/funding/Route.test.ts +66 -0
  747. package/src/internal/funding/Route.ts +29 -0
  748. package/src/internal/funding/SourceObservation.test.ts +301 -0
  749. package/src/internal/funding/SourceObservation.ts +267 -0
  750. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  751. package/src/internal/funding/Subsidy.test.ts +75 -0
  752. package/src/internal/funding/Subsidy.ts +260 -0
  753. package/src/internal/funding/Token.test.ts +47 -0
  754. package/src/internal/funding/Token.ts +59 -0
  755. package/src/internal/funding/Transfer.test.ts +369 -0
  756. package/src/internal/funding/Transfer.ts +522 -0
  757. package/src/internal/funding/index.test.ts +21 -0
  758. package/src/internal/funding/index.ts +13 -0
  759. package/src/internal/funding/providers/across.ts +149 -0
  760. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  761. package/src/internal/funding/providers/relay.test.ts +564 -0
  762. package/src/internal/funding/providers/relay.ts +1060 -0
  763. package/src/internal/funding/providers/rhino.ts +139 -0
  764. package/src/internal/funding/providers/squid.ts +151 -0
  765. package/src/internal/funding/providers/symbiosis.ts +221 -0
  766. package/src/internal/index.test.ts +5 -1
  767. package/src/internal/index.ts +5 -1
  768. package/src/internal/webhookDestinations/url.ts +49 -45
  769. package/src/providers/index.test.ts +14 -0
  770. package/src/providers/index.ts +54 -0
  771. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  772. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  773. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  774. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  775. package/dist/apps/data/routes/funding.d.ts.map +0 -1
  776. package/dist/apps/data/routes/funding.js +0 -410
  777. package/dist/apps/data/routes/funding.js.map +0 -1
  778. package/dist/internal/FundingQuotes.d.ts +0 -864
  779. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  780. package/dist/internal/FundingQuotes.js +0 -672
  781. package/dist/internal/FundingQuotes.js.map +0 -1
  782. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  783. package/src/apps/data/routes/funding.test.ts +0 -503
  784. package/src/apps/data/routes/funding.ts +0 -604
  785. package/src/internal/FundingQuotes.test.ts +0 -456
  786. package/src/internal/FundingQuotes.ts +0 -944
package/src/apps/index.ts CHANGED
@@ -1,5 +1,7 @@
1
- export { data, FundingQuoteProviders, FxOracle } from './data/index.js'
1
+ export { data, FxOracle } from './data/index.js'
2
+ export { funding } from './funding/index.js'
2
3
  export { management } from './management/index.js'
3
4
  export { mcp } from './mcp.js'
4
5
  export { mpp } from './mpp/index.js'
5
6
  export { relay } from './relay/index.js'
7
+ export * as Zones from './Zones.js'
@@ -576,4 +576,33 @@ describe('createRequestUsageReporter', () => {
576
576
  expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
577
577
  await db.close()
578
578
  })
579
+
580
+ test('behavior: exposes the durable retry backlog for alerting', async () => {
581
+ const db = create()
582
+ await db.migrate()
583
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
584
+ await StripeCustomers.setStatus(db, 'org_1', 'active')
585
+ const { stripe } = stubStripe({
586
+ meterEvent() {
587
+ throw new Error('Stripe unavailable')
588
+ },
589
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
590
+ })
591
+ const reporter = Billing.createRequestUsageReporter({
592
+ db,
593
+ now: () => Date.now(),
594
+ readCounts: async () => [{ bucketStart, count: 4, orgId: 'org_1' }],
595
+ stripe,
596
+ })
597
+
598
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
599
+ expect(await reporter.pending()).toEqual([
600
+ {
601
+ count: 1,
602
+ environment: 'production',
603
+ oldestPendingAgeSeconds: expect.any(Number),
604
+ },
605
+ ])
606
+ await db.close()
607
+ })
579
608
  })
@@ -444,6 +444,20 @@ export function createRequestUsageReporter(
444
444
  ...(sandboxStripe ? [{ client: sandboxStripe, environment: 'sandbox' as const }] : []),
445
445
  ]
446
446
  return {
447
+ async pending() {
448
+ return Promise.all(
449
+ clients.map(async ({ environment }) => {
450
+ const status = await RequestUsage.getPendingStatus(Db.get(db), environment)
451
+ return {
452
+ count: status.count,
453
+ environment,
454
+ oldestPendingAgeSeconds: status.oldestAttemptedAt
455
+ ? Math.max(0, Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000))
456
+ : 0,
457
+ }
458
+ }),
459
+ )
460
+ },
447
461
  async tick() {
448
462
  const database = Db.get(db)
449
463
  let failed = 0
@@ -583,9 +597,18 @@ export declare namespace createRequestUsageReporter {
583
597
 
584
598
  /** A scheduled request-metering job. */
585
599
  type Reporter = {
600
+ /** Reads the current retry backlog without sending meter events. */
601
+ pending(): Promise<readonly Pending[]>
586
602
  /** Runs one reporting pass across production (and sandbox when configured). */
587
603
  tick(): Promise<{ failed: number; reported: number; skipped: number }>
588
604
  }
605
+
606
+ /** Current durable retry backlog for one billing environment. */
607
+ type Pending = {
608
+ count: number
609
+ environment: StripeCustomers.Record['environment']
610
+ oldestPendingAgeSeconds: number
611
+ }
589
612
  }
590
613
 
591
614
  /** Composite key for the in-tick blocked-bucket set. */
@@ -0,0 +1,12 @@
1
+ import type { Context } from 'hono'
2
+
3
+ import * as Response from '../../internal/Response.js'
4
+
5
+ /** Returns the standard error for operations that require a user session. */
6
+ export function sessionRequired(c: Context) {
7
+ return Response.error(c, {
8
+ code: 'forbidden',
9
+ message: 'Session required',
10
+ status: 403,
11
+ })
12
+ }
@@ -119,9 +119,11 @@ describe('keys', () => {
119
119
 
120
120
  // Even the org owner cannot self-mint zone access: membership is
121
121
  // controlled zone-side, so zone scopes are super-admin-issued.
122
- const denied = await app.request(base, json('POST', owner, { scopes: ['zone:421700001:read'] }))
123
- expect(denied.status).toBe(403)
124
- expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
122
+ for (const scope of ['zone:421700001:read', 'zone:421700001:write']) {
123
+ const denied = await app.request(base, json('POST', owner, { scopes: [scope] }))
124
+ expect(denied.status).toBe(403)
125
+ expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
126
+ }
125
127
  })
126
128
 
127
129
  test('restricts project management keys without delegating issuance', async () => {
@@ -254,6 +256,99 @@ describe('keys', () => {
254
256
  expect(empty).toEqual({ data: [] })
255
257
  })
256
258
 
259
+ test('creates, reads, updates, enforces, and clears an IP allowlist', async () => {
260
+ const state = TestApp.kvStore()
261
+ const app = TestApp.create({
262
+ // Avoid waiting for the accepted KV and isolate-cache propagation delay.
263
+ auth: { cache: false, superAdmin: { secret } },
264
+ kv: { store: state },
265
+ session: { wallet: { origin } },
266
+ }).get(
267
+ '/custom/allowlist-test',
268
+ Auth.policy({ apiKey: { scopes: ['data:read'] } }),
269
+ OpenApi.describeRoute({
270
+ operationId: 'getAllowlistTest',
271
+ responses: { 200: { description: 'Allowlist test response.' } },
272
+ summary: 'Test allowlist',
273
+ }),
274
+ (c) => c.json({ ok: true }, 200),
275
+ )
276
+ const cookie = await session(app)
277
+ const { org, project } = await fixture(app, cookie)
278
+ const base = `/v1/orgs/${org.id}/projects/${project.id}/api-keys`
279
+ const created = await TestApp.json(
280
+ await app.request(
281
+ base,
282
+ superAdminJson('POST', {
283
+ allowedIps: ['203.0.113.0/24'],
284
+ scopes: ['data:read'],
285
+ }),
286
+ ),
287
+ Keys.schema.createApiKey.Response,
288
+ )
289
+
290
+ expect(created.allowedIps).toEqual(['203.0.113.0/24'])
291
+ const authenticate = (address?: string) =>
292
+ app.request('/custom/allowlist-test', {
293
+ headers: {
294
+ ...(address ? { 'cf-connecting-ip': address } : {}),
295
+ 'tempo-api-key': created.token,
296
+ },
297
+ })
298
+ const listed = await TestApp.json(
299
+ await app.request(base, { headers: { cookie } }),
300
+ Keys.schema.listApiKeys.Response,
301
+ )
302
+ expect(listed.data[0]?.allowedIps).toEqual(['203.0.113.0/24'])
303
+
304
+ expect((await authenticate('203.0.113.7')).status).toBe(200)
305
+ const denied = await authenticate('198.51.100.7')
306
+ expect(denied.status).toBe(403)
307
+ expect(await denied.json()).toMatchObject({ error: { code: 'api_key_ip_forbidden' } })
308
+
309
+ const updated = await TestApp.json(
310
+ await app.request(
311
+ `${base}/${created.id}`,
312
+ json('PATCH', cookie, { allowedIps: ['198.51.100.7'] }),
313
+ ),
314
+ Keys.schema.Key,
315
+ )
316
+ expect(updated.allowedIps).toEqual(['198.51.100.7'])
317
+
318
+ expect((await authenticate('203.0.113.7')).status).toBe(403)
319
+ expect((await authenticate('198.51.100.7')).status).toBe(200)
320
+
321
+ const cleared = await TestApp.json(
322
+ await app.request(`${base}/${created.id}`, json('PATCH', cookie, { allowedIps: [] })),
323
+ Keys.schema.Key,
324
+ )
325
+ expect(cleared.allowedIps).toEqual([])
326
+ expect((await authenticate()).status).toBe(200)
327
+ })
328
+
329
+ test('rejects malformed IP allowlists on create and update', async () => {
330
+ const app = createApp()
331
+ const cookie = await session(app)
332
+ const { org, project } = await fixture(app, cookie)
333
+ const base = `/v1/orgs/${org.id}/projects/${project.id}/api-keys`
334
+
335
+ const invalidCreate = await app.request(
336
+ base,
337
+ json('POST', cookie, { allowedIps: ['203.0.113.0/33'], scopes: ['data:read'] }),
338
+ )
339
+ expect(invalidCreate.status).toBe(400)
340
+
341
+ const created = await TestApp.json(
342
+ await app.request(base, json('POST', cookie, { scopes: ['data:read'] })),
343
+ Keys.schema.createApiKey.Response,
344
+ )
345
+ const invalidUpdate = await app.request(
346
+ `${base}/${created.id}`,
347
+ json('PATCH', cookie, { allowedIps: ['*'] }),
348
+ )
349
+ expect(invalidUpdate.status).toBe(400)
350
+ })
351
+
257
352
  test('rejects the wildcard scope at mint', async () => {
258
353
  const app = createApp()
259
354
  const cookie = await session(app)
@@ -425,6 +520,11 @@ describe('keys', () => {
425
520
  { headers: { cookie: owner }, method: 'DELETE' },
426
521
  )
427
522
  expect(crossRevoke.status).toBe(404)
523
+ const crossUpdate = await app.request(
524
+ `/v1/orgs/${org.id}/projects/${other.id}/api-keys/${minted.id}`,
525
+ json('PATCH', owner, { allowedIps: ['203.0.113.0/24'] }),
526
+ )
527
+ expect(crossUpdate.status).toBe(404)
428
528
 
429
529
  // Foreign session: the whole surface 404s at the org-ownership link.
430
530
  const stranger = await session(app)
@@ -3,6 +3,7 @@ import * as z from 'zod/mini'
3
3
 
4
4
  import * as Analytics from '../../../analytics/Analytics.js'
5
5
  import * as RequestEvents from '../../../analytics/tables/requestEvents.js'
6
+ import * as ApiKey from '../../../ApiKey.js'
6
7
  import * as ApiKeys from '../../../ApiKeys.js'
7
8
  import type * as App from '../../../App.js'
8
9
  import * as Db from '../../../db/Db.js'
@@ -12,12 +13,19 @@ import * as OpenApi from '../../../internal/OpenApi.js'
12
13
  import * as Response from '../../../internal/Response.js'
13
14
  import * as Schema from '../../../internal/Schema.js'
14
15
  import * as Scope from '../../../Scope.js'
16
+ import * as ManagementError from '../Error.js'
15
17
 
16
18
  /** Zod schemas owned by the API-keys resource. */
17
19
  export namespace schema {
18
20
  /** One API key: metadata only — the token appears once, at mint. */
19
21
  export const Key = Schema.describe(
20
22
  z.object({
23
+ allowedIps: ApiKey.schema.AllowedIps.check(
24
+ z.describe(
25
+ 'Client IP addresses and CIDR ranges allowed to use this key. An empty list means unrestricted.',
26
+ ),
27
+ z.meta({ examples: [['203.0.113.0/24', '2001:db8::1']] }),
28
+ ),
21
29
  createdAt: z
22
30
  .string()
23
31
  .check(
@@ -139,6 +147,14 @@ export namespace schema {
139
147
  /** Request body minting a key. The wildcard scope is not issuable here. */
140
148
  export const KeyBody = z
141
149
  .object({
150
+ allowedIps: z
151
+ .optional(ApiKey.schema.AllowedIps)
152
+ .check(
153
+ z.describe(
154
+ 'Client IP addresses and CIDR ranges allowed to use the key. Omit or use an empty list for unrestricted access.',
155
+ ),
156
+ z.meta({ examples: [['203.0.113.0/24']] }),
157
+ ),
142
158
  environment: z
143
159
  ._default(z.enum(['production', 'sandbox']), 'production')
144
160
  .check(z.describe('Key environment.'), z.meta({ examples: ['sandbox'] })),
@@ -223,10 +239,25 @@ export namespace schema {
223
239
  })
224
240
  .check(z.describe('Confirmation that the key was revoked.'))
225
241
  }
242
+
243
+ /** Schemas for the updateApiKey operation. */
244
+ export namespace updateApiKey {
245
+ /** Request body replacing or clearing a key's IP allowlist. */
246
+ export const Body = z
247
+ .object({
248
+ allowedIps: ApiKey.schema.AllowedIps.check(
249
+ z.describe(
250
+ 'Replacement client IP/CIDR allowlist. Use an empty list for unrestricted access.',
251
+ ),
252
+ z.meta({ examples: [['203.0.113.0/24']] }),
253
+ ),
254
+ })
255
+ .check(z.describe("Fields for updating an API key's network access."))
256
+ }
226
257
  }
227
258
 
228
259
  /**
229
- * Mounts project-attributed API key mint, list, and revoke routes plus the org-wide list. Project routes enforce caller organization and project attribution.
260
+ * Mounts project-attributed API key mint, list, update, and revoke routes plus the org-wide list. Project routes enforce caller organization and project attribution.
230
261
  */
231
262
  export function apiKeys(options: apiKeys.Options = {}) {
232
263
  const hidden = !options.enabled
@@ -281,7 +312,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
281
312
  const kv = c.get('kv')
282
313
  if (!kv) return notEnabled(c)
283
314
  const createdBy = mintedBy(c)
284
- if (!createdBy) return sessionRequired(c)
315
+ if (!createdBy) return ManagementError.sessionRequired(c)
285
316
 
286
317
  const body = c.req.valid('json')
287
318
 
@@ -312,6 +343,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
312
343
  {
313
344
  createdBy,
314
345
  environment: body.environment,
346
+ ...(body.allowedIps === undefined ? {} : { allowedIps: body.allowedIps }),
315
347
  ...(billingActive === undefined ? {} : { billingActive }),
316
348
  ...(body.name === undefined ? {} : { name: body.name }),
317
349
  orgId,
@@ -452,6 +484,69 @@ export function apiKeys(options: apiKeys.Options = {}) {
452
484
  }
453
485
  },
454
486
  )
487
+ .patch(
488
+ '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}',
489
+ Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }),
490
+ Auth.ensureOrg({ role: 'admin' }),
491
+ Auth.ensureProject(),
492
+ OpenApi.validate('param', schema.KeyParams, {
493
+ code: 'param_invalid',
494
+ message: 'Check the path parameters and try again.',
495
+ }),
496
+ OpenApi.validate('json', schema.updateApiKey.Body, {
497
+ code: 'body_invalid',
498
+ message: 'Check the request body and try again.',
499
+ }),
500
+ OpenApi.describeRoute({
501
+ description:
502
+ "Replace an API key's client IP/CIDR allowlist. An empty list removes the restriction.",
503
+ hide: hidden,
504
+ operationId: 'updateApiKey',
505
+ responses: OpenApi.responses({
506
+ errors: {
507
+ 404: 'No accessible API key was found for this id.',
508
+ },
509
+ success: {
510
+ description: 'The updated API key metadata.',
511
+ schema: schema.Key,
512
+ },
513
+ }),
514
+ summary: 'Update API key',
515
+ tags: ['API Keys'],
516
+ }),
517
+ async (c) => {
518
+ if (Auth.narrowAccess) return Auth.accessError(c)
519
+ if (Auth.narrowScope) return Auth.ensureProjectError(c)
520
+ if (OpenApi.narrowValidation)
521
+ return OpenApi.validationError(c, {
522
+ code: 'param_invalid',
523
+ message: 'Check the path parameters and try again.',
524
+ })
525
+ if (OpenApi.narrowValidation)
526
+ return OpenApi.validationError(c, {
527
+ code: 'body_invalid',
528
+ message: 'Check the request body and try again.',
529
+ })
530
+
531
+ const kv = c.get('kv')
532
+ if (!kv) return notEnabled(c)
533
+ const { keyId } = c.req.valid('param')
534
+ try {
535
+ const record = await ApiKeys.get(kv.store, keyId, {
536
+ scopeCatalog: c.get('scopeCatalog'),
537
+ })
538
+ if (!record || record.orgId !== Auth.org(c).id || record.projectId !== Auth.project(c).id)
539
+ return keyNotFound(c)
540
+ const updated = await ApiKeys.update(kv.store, keyId, c.req.valid('json'), {
541
+ scopeCatalog: c.get('scopeCatalog'),
542
+ })
543
+ if (!updated) return keyNotFound(c)
544
+ return c.json(Response.validated(schema.Key, serializeKey(updated)), 200)
545
+ } catch (cause) {
546
+ return Response.upstream(c, cause)
547
+ }
548
+ },
549
+ )
455
550
  .delete(
456
551
  '/v1/orgs/:orgId{org_[A-Za-z0-9_-]+}/projects/:projectId{prj_[A-Za-z0-9_-]+}/api-keys/:keyId{key_[A-Za-z0-9_-]+}',
457
552
  Auth.policy({ apiKey: { scopes: ['management:write'] }, session: true }),
@@ -531,6 +626,7 @@ async function serializeKeys(c: Context<App.Environment>, records: readonly ApiK
531
626
  /** Projects a persisted record onto the management key shape (no rate limits, no token). */
532
627
  function serializeKey(record: ApiKeys.Record, lastUsedAt?: string) {
533
628
  return {
629
+ allowedIps: [...record.allowedIps],
534
630
  createdAt: record.createdAt,
535
631
  ...(record.createdBy === undefined ? {} : { createdBy: record.createdBy }),
536
632
  environment: record.environment,
@@ -582,11 +678,3 @@ function notEnabled(c: Context<App.Environment>) {
582
678
  status: 404,
583
679
  })
584
680
  }
585
-
586
- function sessionRequired(c: Context<App.Environment>) {
587
- return Response.error(c, {
588
- code: 'forbidden',
589
- message: 'Session required',
590
- status: 403,
591
- })
592
- }
@@ -8,6 +8,7 @@ import * as Memberships from '../../../db/tables/memberships.js'
8
8
  import * as OpenApi from '../../../internal/OpenApi.js'
9
9
  import * as Response from '../../../internal/Response.js'
10
10
  import * as Schema from '../../../internal/Schema.js'
11
+ import * as ManagementError from '../Error.js'
11
12
 
12
13
  import type { Email, Environment } from '../App.js'
13
14
 
@@ -386,7 +387,7 @@ export function invitations() {
386
387
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
387
388
 
388
389
  const principal = Auth.getPrincipal(c)
389
- if (principal?.type !== 'session') return sessionRequired(c)
390
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
390
391
  // Without a verified email there is nothing to match against.
391
392
  if (!principal.email)
392
393
  return c.json(Response.validated(schema.listMyInvitations.Response, { data: [] }), 200)
@@ -437,7 +438,7 @@ export function invitations() {
437
438
  })
438
439
 
439
440
  const principal = Auth.getPrincipal(c)
440
- if (principal?.type !== 'session') return sessionRequired(c)
441
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
441
442
 
442
443
  const { invitationId } = c.req.valid('param')
443
444
  const db = Db.get(c.get('db'))
@@ -492,7 +493,7 @@ export function invitations() {
492
493
  })
493
494
 
494
495
  const principal = Auth.getPrincipal(c)
495
- if (principal?.type !== 'session') return sessionRequired(c)
496
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
496
497
 
497
498
  const { invitationId } = c.req.valid('param')
498
499
  const db = Db.get(c.get('db'))
@@ -575,11 +576,3 @@ function invitationNotFound(c: Context<Environment>) {
575
576
  status: 404,
576
577
  })
577
578
  }
578
-
579
- function sessionRequired(c: Context<Environment>) {
580
- return Response.error(c, {
581
- code: 'forbidden',
582
- message: 'Session required',
583
- status: 403,
584
- })
585
- }
@@ -11,6 +11,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
11
11
  import * as Organizations from '../../../db/tables/organizations.js'
12
12
  import * as Response from '../../../internal/Response.js'
13
13
  import * as Schema from '../../../internal/Schema.js'
14
+ import * as ManagementError from '../Error.js'
14
15
 
15
16
  /** Zod schemas owned by the organizations resource. */
16
17
  export namespace schema {
@@ -178,7 +179,7 @@ export function orgs() {
178
179
 
179
180
  const principal = Auth.getPrincipal(c)
180
181
  if (principal?.type !== 'session' && principal?.type !== 'super_admin')
181
- return sessionRequired(c)
182
+ return ManagementError.sessionRequired(c)
182
183
 
183
184
  const body = c.req.valid('json')
184
185
  const db = Db.get(c.get('db'))
@@ -380,11 +381,3 @@ function organizationNotFound(c: Context<App.Environment>) {
380
381
  status: 404,
381
382
  })
382
383
  }
383
-
384
- function sessionRequired(c: Context<App.Environment>) {
385
- return Response.error(c, {
386
- code: 'forbidden',
387
- message: 'Session required',
388
- status: 403,
389
- })
390
- }
@@ -14,10 +14,14 @@ describe('scopes', () => {
14
14
  expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
15
15
  `"private, max-age=300, stale-while-revalidate=3600"`,
16
16
  )
17
- expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry].map((entry) => ({ ...entry })))
17
+ expect(body.data).toEqual(
18
+ [...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry].map((entry) => ({ ...entry })),
19
+ )
18
20
  expect(body.data.map((entry) => entry.scope)).toMatchInlineSnapshot(`
19
21
  [
20
22
  "data:read",
23
+ "funding:read",
24
+ "funding:write",
21
25
  "indexer:query",
22
26
  "management:read",
23
27
  "management:write",
@@ -27,6 +31,7 @@ describe('scopes', () => {
27
31
  "webhooks:read",
28
32
  "webhooks:write",
29
33
  "zone:<chainId>:read",
34
+ "zone:<chainId>:write",
30
35
  ]
31
36
  `)
32
37
  })
@@ -42,6 +47,6 @@ describe('scopes', () => {
42
47
  const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
43
48
 
44
49
  expect(response.status).toBe(200)
45
- expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, custom])
50
+ expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry, custom])
46
51
  })
47
52
  })
@@ -24,7 +24,7 @@ export namespace schema {
24
24
  .string()
25
25
  .check(
26
26
  z.describe(
27
- 'Scope identifier used in API-key grants and route policies. `zone:<chainId>:read` is a template: grants carry a concrete zone chain id.',
27
+ 'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
28
28
  ),
29
29
  z.meta({ examples: ['data:read'] }),
30
30
  ),
@@ -66,7 +66,7 @@ export function scopes() {
66
66
  }),
67
67
  Cache.response<App.Environment>({
68
68
  cacheControl: Cache.policies.stable,
69
- name: 'tempo-api:scopes:v3',
69
+ name: 'tempo-api:scopes:v5',
70
70
  key: (c) => {
71
71
  const url = new URL(c.req.url)
72
72
  url.search = ''
@@ -2,6 +2,7 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
2
2
 
3
3
  import * as App from '../../../App.js'
4
4
  import * as Memberships from '../../../db/tables/memberships.js'
5
+ import * as Cursor from '../../../internal/Cursor.js'
5
6
  import * as core_Webhooks from '../../../internal/Webhooks.js'
6
7
  import * as TestApp from '../../../../test/App.js'
7
8
  import { management } from '../App.js'
@@ -47,7 +48,8 @@ async function organization(app: ReturnType<typeof createApp>, cookie: string) {
47
48
 
48
49
  describe('webhooks', () => {
49
50
  test('creates, lists, pauses, and deletes an organization webhook', async () => {
50
- const app = createApp()
51
+ const db = TestApp.database()
52
+ const app = createApp({ db })
51
53
  const cookie = await session(app)
52
54
  const org = await organization(app, cookie)
53
55
  const collection = `/v1/orgs/${org.id}/webhooks`
@@ -65,6 +67,9 @@ describe('webhooks', () => {
65
67
  expect(createdResponse.status).toBe(200)
66
68
  const created = await TestApp.json(createdResponse, Webhooks.schema.createWebhook.Response)
67
69
  expect(created).toHaveProperty('secret', expect.stringMatching(/^whsec_/))
70
+ expect(Cursor.decode((await core_Webhooks.getCursor(db, created.id))!, ['int'])).toEqual([
71
+ expect.any(Number),
72
+ ])
68
73
 
69
74
  const listedResponse = await app.request(collection, { headers: { cookie } })
70
75
  expect(listedResponse.status).toBe(200)
@@ -6,6 +6,7 @@ import * as Db from '../../../db/Db.js'
6
6
  import * as Auth from '../../../internal/Auth.js'
7
7
  import * as OpenApi from '../../../internal/OpenApi.js'
8
8
  import * as Response from '../../../internal/Response.js'
9
+ import * as WebhookDestination from '../../../internal/WebhookDestination.js'
9
10
  import * as Webhooks from '../../../internal/Webhooks.js'
10
11
  import { schema as webhookSchema } from '../../data/routes/webhooks.js'
11
12
  import type { Environment } from '../App.js'
@@ -217,17 +218,28 @@ export function webhooks(options: webhooks.Options = {}) {
217
218
  if (!supportedChainIds.has(chainId))
218
219
  return Response.unsupportedChainId(c, chainId, supportedChainIds)
219
220
  try {
221
+ // Preserve destination errors before the creation-time RPC dependency.
222
+ WebhookDestination.assertDestination(body.destination)
223
+ const db = Db.get(c.get('db'))
224
+ const maxPerOwner = options.webhook.maxPerOwner ?? defaultMaxPerOwner
225
+ const owner_ = owner(Auth.org(c).id)
226
+ if ((await Webhooks.countSubscriptions(db, owner_)) >= maxPerOwner)
227
+ throw new Webhooks.LimitExceededError(maxPerOwner)
228
+ const startBlockNumber = Number(await c.get('getClient')(chainId).getBlockNumber())
220
229
  const subscription = await Webhooks.createSubscription(
221
- Db.get(c.get('db')),
230
+ db,
222
231
  {
223
232
  chainId,
224
233
  ...(body.context === undefined ? {} : { context: body.context }),
225
234
  destination: body.destination,
226
235
  eventType: body.eventType,
227
236
  filters: body.filters,
228
- owner: owner(Auth.org(c).id),
237
+ owner: owner_,
238
+ },
239
+ {
240
+ maxPerOwner,
241
+ startBlockNumber,
229
242
  },
230
- { maxPerOwner: options.webhook.maxPerOwner ?? defaultMaxPerOwner },
231
243
  )
232
244
  return c.json(
233
245
  Response.validated(schema.createWebhook.Response, created(subscription)),
@@ -1,4 +1,6 @@
1
1
  import { Cli as incur_Cli, z } from 'incur'
2
+ import { App } from 'tapimo'
3
+ import { data } from 'tapimo/apps'
2
4
 
3
5
  import * as TestApp from '../../test/App.js'
4
6
  import * as Runtime from '../../test/runtime.js'
@@ -17,7 +19,7 @@ const reader = {
17
19
  /** Composes a test app with the MCP group mounted, dispatching in-process. */
18
20
  function createHost(
19
21
  options: {
20
- app?: ReturnType<typeof TestApp.create> | undefined
22
+ app?: Host | undefined
21
23
  docs?: mcp.Options['docs'] | undefined
22
24
  } = {},
23
25
  ) {
@@ -149,7 +151,7 @@ test('identifies as Tempo MCP', async () => {
149
151
  })
150
152
  })
151
153
 
152
- test('scopes tools to the data domain', async () => {
154
+ test('scopes tools to the data and inbound funding domains', async () => {
153
155
  const { app, host } = createHost({ docs: docsStub() })
154
156
 
155
157
  // The domain filter must drop paths that actually exist in the spec.
@@ -170,6 +172,8 @@ test('scopes tools to the data domain', async () => {
170
172
  const tools = (await toolsSearch(host)).map((tool) => tool.name)
171
173
 
172
174
  expect(tools).toContain('v1_tokens_get')
175
+ expect(tools).toContain('v1_funding_quotes')
176
+ expect(tools).toContain('v1_funding_transfers_post')
173
177
  expect(tools).toContain('docs_search')
174
178
  // RPC is part of the data domain tag group.
175
179
  expect(tools.some((name) => name.startsWith('rpc'))).toBe(true)
@@ -180,6 +184,17 @@ test('scopes tools to the data domain', async () => {
180
184
  expect(tools.some((name) => name.startsWith('v1_me'))).toBe(false)
181
185
  })
182
186
 
187
+ test('keeps the data tools functional when funding is omitted', async () => {
188
+ const app = App.create({ auth: false, db: TestApp.database() }).route('/', data())
189
+ const { host } = createHost({ app })
190
+
191
+ await initialize(host)
192
+ const tools = (await toolsSearch(host)).map((tool) => tool.name)
193
+
194
+ expect(tools).toContain('v1_tokens_get')
195
+ expect(tools.some((name) => name.startsWith('v1_funding_'))).toBe(false)
196
+ })
197
+
183
198
  test('keeps tool input schemas compact', async () => {
184
199
  const { host } = createHost()
185
200
  await initialize(host)