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/Scope.test.ts CHANGED
@@ -1,5 +1,23 @@
1
1
  import * as Scope from './Scope.js'
2
2
 
3
+ describe('schema.Zone', () => {
4
+ test('accepts concrete read and write scopes', () => {
5
+ expect(
6
+ ['zone:421700005:read', 'zone:421700005:write'].map((scope) =>
7
+ Scope.schema.Zone.safeParse(scope),
8
+ ),
9
+ ).toMatchObject([{ success: true }, { success: true }])
10
+ })
11
+
12
+ test('rejects templates and unsupported access levels', () => {
13
+ expect(
14
+ ['zone:<chainId>:read', 'zone:421700005:admin'].map((scope) =>
15
+ Scope.schema.Zone.safeParse(scope),
16
+ ),
17
+ ).toMatchObject([{ success: false }, { success: false }])
18
+ })
19
+ })
20
+
3
21
  describe('extend', () => {
4
22
  test('appends host scopes to the built-in catalog', () => {
5
23
  expect(
@@ -13,6 +31,7 @@ describe('extend', () => {
13
31
  ).toEqual([
14
32
  ...Scope.catalog,
15
33
  Scope.zoneEntry,
34
+ Scope.zoneWriteEntry,
16
35
  {
17
36
  description: 'Read project accounts.',
18
37
  scope: 'accounts:read',
package/src/Scope.ts CHANGED
@@ -33,6 +33,16 @@ export const catalog = [
33
33
  scope: 'data:read',
34
34
  selfServe: true,
35
35
  },
36
+ {
37
+ description: 'Read organization funding transfers, deposit addresses, and deposits.',
38
+ scope: 'funding:read',
39
+ selfServe: false,
40
+ },
41
+ {
42
+ description: 'Create funding transfers and register their source transactions.',
43
+ scope: 'funding:write',
44
+ selfServe: false,
45
+ },
36
46
  {
37
47
  description: 'Run ad-hoc queries against the raw indexer passthrough.',
38
48
  scope: 'indexer:query',
@@ -50,7 +60,7 @@ export const catalog = [
50
60
  selfServe: true,
51
61
  },
52
62
  {
53
- description: 'Validate and broadcast MPP payment credentials through the Tempo relay.',
63
+ description: 'Validate and broadcast MPP credentials through Tempo.',
54
64
  scope: 'mpp:write',
55
65
  selfServe: true,
56
66
  },
@@ -76,28 +86,35 @@ export const catalog = [
76
86
  },
77
87
  ] as const satisfies readonly Entry[]
78
88
 
79
- /**
80
- * Templated `/v1/scopes` entry for per-zone read scopes. Concrete grants use
81
- * `zone:<chainId>:read` and are never self-serve.
82
- */
89
+ /** Templated `/v1/scopes` entry for per-zone read scopes. */
83
90
  export const zoneEntry = {
84
91
  description: 'Read RPC and indexed data for one zone chain id.',
85
92
  scope: 'zone:<chainId>:read',
86
93
  selfServe: false,
87
94
  } as const satisfies Entry
88
95
 
96
+ /** Templated `/v1/scopes` entry for per-zone transaction broadcast scopes. */
97
+ export const zoneWriteEntry = {
98
+ description: 'Broadcast signed transactions to one zone chain id.',
99
+ scope: 'zone:<chainId>:write',
100
+ selfServe: false,
101
+ } as const satisfies Entry
102
+
89
103
  /** Zod schemas owned by the scope vocabulary. */
90
104
  export namespace schema {
91
- /** A concrete per-zone read scope (`zone:421700001:read`). */
105
+ /** A concrete per-zone read or write scope. */
92
106
  export const Zone = z
93
- .templateLiteral(['zone:', z.int(), ':read'])
107
+ .union([
108
+ z.templateLiteral(['zone:', z.int(), ':read']),
109
+ z.templateLiteral(['zone:', z.int(), ':write']),
110
+ ])
94
111
  .check(
95
- z.regex(/^zone:[1-9]\d*:read$/),
96
- z.describe('Per-zone read scope (`zone:<chainId>:read`).'),
112
+ z.regex(/^zone:[1-9]\d*:(read|write)$/),
113
+ z.describe('Per-zone read or write scope (`zone:<chainId>:read|write`).'),
97
114
  )
98
115
  }
99
116
 
100
- /** Per-zone read scope, granting access to one zone chain id. */
117
+ /** Per-zone read or write scope, granting access to one zone chain id. */
101
118
  export type Zone = z.output<typeof schema.Zone>
102
119
 
103
120
  /** Issuable API-key scope identifier, including host-defined scopes. */
@@ -123,7 +140,7 @@ export const selfServe: readonly Id[] = catalog
123
140
  */
124
141
  export function extend(entries: readonly Entry[] = []): Catalog {
125
142
  const identifiers = new Set<string>()
126
- const result = [...catalog, zoneEntry, ...entries]
143
+ const result = [...catalog, zoneEntry, zoneWriteEntry, ...entries]
127
144
  for (const entry of result) {
128
145
  if (!entry.scope.trim()) throw new Error('Scope identifier must not be empty.')
129
146
  if (identifiers.has(entry.scope)) throw new Error(`Duplicate scope \`${entry.scope}\`.`)
@@ -47,4 +47,29 @@ describe('createPoller', () => {
47
47
  ]
48
48
  `)
49
49
  })
50
+
51
+ test('clamps a creation checkpoint to genesis', async () => {
52
+ const db = TestApp.database()
53
+ const subscription = await Webhooks.createSubscription(
54
+ db,
55
+ {
56
+ chainId: 42431,
57
+ destination: { type: 'url', url: 'https://hooks.example.com/x' },
58
+ eventType: 'block:created',
59
+ owner: { orgId: 'org_test', type: 'api_key' },
60
+ },
61
+ { startBlockNumber: 1 },
62
+ )
63
+ const poller = Webhooks.createPoller({
64
+ db,
65
+ defaultChainId: 42431,
66
+ })
67
+
68
+ await poller.tick({
69
+ eventTypes: ['block:created'],
70
+ headBlockNumber: 1,
71
+ })
72
+
73
+ expect(decodeCursor(await Webhooks.getCursor(db, subscription.id))).toEqual([0, 2_147_483_647])
74
+ })
50
75
  })
package/src/Webhooks.ts CHANGED
@@ -126,7 +126,7 @@ export declare namespace createPoller {
126
126
 
127
127
  /** Knobs shared by every {@link Poller.tick}; each is overridable per tick. */
128
128
  type Defaults = {
129
- /** Max matching rows scanned per subscription per tick (default 100). */
129
+ /** Max matching rows scanned per subscription per tick (default 200). */
130
130
  batchSize?: number | undefined
131
131
  /** Reorg-safety window: only emit blocks this far behind head (default 2). */
132
132
  confirmations?: number | undefined
@@ -1,4 +1,5 @@
1
1
  import { Hono } from 'hono'
2
+ import * as Organizations from '../db/tables/organizations.js'
2
3
  import * as TestAdmin from '../../test/Admin.js'
3
4
 
4
5
  // Route behavior (mint/list/revoke, the scope catalog) is covered in
@@ -18,6 +19,11 @@ describe('create', () => {
18
19
  method: 'POST',
19
20
  }),
20
21
  new Request('http://admin/api-keys/key_x', { method: 'DELETE' }),
22
+ new Request('http://admin/earn/verified-vaults', {
23
+ body: JSON.stringify({}),
24
+ headers: { 'content-type': 'application/json' },
25
+ method: 'PUT',
26
+ }),
21
27
  new Request('http://admin/organizations'),
22
28
  new Request('http://admin/organizations/org_x'),
23
29
  new Request('http://admin/organizations/org_x/billing-sources/stripe', { method: 'PUT' }),
@@ -61,9 +67,10 @@ describe('create', () => {
61
67
  })
62
68
 
63
69
  test('verified identity is recorded as createdBy on minted keys', async () => {
64
- const { app } = TestAdmin.setup({ identify: () => ({ email: 'ops@tempo.xyz' }) })
70
+ const { app, db } = TestAdmin.setup({ identify: () => ({ email: 'ops@tempo.xyz' }) })
71
+ await Organizations.create(db, { id: 'org', name: 'Operations' })
65
72
  const response = await app.request('http://admin/api-keys', {
66
- body: JSON.stringify({ orgId: 'org', scopes: ['data:read'] }),
73
+ body: JSON.stringify({ name: 'Operations', orgId: 'org', scopes: ['data:read'] }),
67
74
  headers: { 'content-type': 'application/json' },
68
75
  method: 'POST',
69
76
  })
package/src/admin/App.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { type Context, Hono, type Next } from 'hono'
2
2
  import { HTTPException } from 'hono/http-exception'
3
3
  import { requestId, type RequestIdVariables } from 'hono/request-id'
4
+ import type { Chain } from 'viem'
4
5
 
5
6
  import * as ApiKey from '../ApiKey.js'
6
7
  import type * as Assets from '../Assets.js'
@@ -9,9 +10,12 @@ import * as Db from '../db/Db.js'
9
10
  import * as AdminAuditLogs from '../db/tables/adminAuditLogs.js'
10
11
  import type * as Store from '../internal/Store.js'
11
12
  import * as Response from '../internal/Response.js'
13
+ import * as Viem from '../internal/Viem.js'
14
+ import * as Zones from '../apps/Zones.js'
12
15
 
13
16
  import { apiKeys } from './apps/api-keys.js'
14
17
  import { earlyAccess } from './apps/early-access.js'
18
+ import { earnVaults } from './apps/earn-vaults.js'
15
19
  import { organizations } from './apps/organizations.js'
16
20
  import { scopes } from './apps/scopes.js'
17
21
  import { verifiedTokens } from './apps/verified-tokens.js'
@@ -30,12 +34,18 @@ export type Environment = {
30
34
  analytics: Analytics.Source
31
35
  /** Static-asset writer (e.g. the R2 icon bucket), when configured. */
32
36
  assets: create.Assets | undefined
37
+ /** Path where the admin app is mounted. */
38
+ basePath: string
33
39
  /** Authoritative Postgres store, or a per-request factory. Resolve at the leaf with `Db.get`. */
34
40
  db: Db.Source
35
- /** KV state store backing API-key records (mint/list/revoke). */
36
- kv: { store: Store.State }
41
+ /** Gets a Tempo RPC client for a chain id. */
42
+ getClient: Viem.GetClient
37
43
  /** The admin identity, or `null` when unauthenticated (gated routes reject). */
38
44
  identity: Identity | null
45
+ /** KV state store backing API-key records (mint/list/revoke). */
46
+ kv: { store: Store.State }
47
+ /** Zone chains available to admin routes. */
48
+ zones: readonly Chain[]
39
49
  }
40
50
  }
41
51
 
@@ -45,6 +55,10 @@ export type App = ReturnType<typeof create>
45
55
  /** Creates the admin portal Hono app. */
46
56
  export function create(options: create.Options) {
47
57
  const { identify } = options
58
+
59
+ const zones = options.zones === true ? Zones.chains : (options.zones ?? [])
60
+ const getClient = Viem.createGetClient({ rpc: options.rpc, zones })
61
+
48
62
  // `false` (disabled) collapses to `undefined` so only a real config surfaces
49
63
  // `loginUrl`/`logoutUrl` in `/config.json`.
50
64
  const ui = options.ui || undefined
@@ -62,8 +76,11 @@ export function create(options: create.Options) {
62
76
  c.header('Cache-Control', 'no-store')
63
77
  c.set('analytics', options.analytics)
64
78
  c.set('assets', options.assets)
79
+ c.set('basePath', c.req.routePath.replace(/\*$/, '').replace(/\/$/, ''))
65
80
  c.set('db', options.db)
81
+ c.set('getClient', getClient)
66
82
  c.set('kv', options.kv)
83
+ c.set('zones', zones)
67
84
  c.set('identity', await identify(c.req.raw))
68
85
  return next()
69
86
  })
@@ -83,13 +100,12 @@ export function create(options: create.Options) {
83
100
  // Renders the public SPA shell: stamps its hydration-safe base and auth
84
101
  // placeholders with request values. `<` is escaped to keep the config script.
85
102
  const serveShell = (c: Context<Environment>) => {
86
- const mount = c.req.routePath.replace(/\*$/, '').replace(/\/$/, '')
87
103
  const config = JSON.stringify(authConfig(c.get('identity'))).replaceAll('<', '\\u003c')
88
104
  return c.html(
89
105
  Ui.shell
90
106
  .replace(
91
107
  '<base data-tempo-base="true" href="/"/>',
92
- `<base data-tempo-base="true" href="${mount}/"/>`,
108
+ `<base data-tempo-base="true" href="${c.get('basePath')}/"/>`,
93
109
  )
94
110
  .replace('window.__TEMPO_API_CONFIG__=undefined', `window.__TEMPO_API_CONFIG__=${config}`),
95
111
  )
@@ -120,6 +136,8 @@ export function create(options: create.Options) {
120
136
  '/api-keys/*',
121
137
  '/early-access',
122
138
  '/early-access/*',
139
+ '/earn/verified-vaults',
140
+ '/earn/verified-vaults/*',
123
141
  '/organizations',
124
142
  '/organizations/*',
125
143
  '/scopes',
@@ -156,6 +174,7 @@ export function create(options: create.Options) {
156
174
  .get('/config.json', (c) => c.json(authConfig(c.get('identity')), 200))
157
175
  .route('/api-keys', apiKeys())
158
176
  .route('/early-access', earlyAccess())
177
+ .route('/earn/verified-vaults', earnVaults())
159
178
  .route('/organizations', organizations())
160
179
  .route('/scopes', scopes())
161
180
  .route('/verified-tokens', verifiedTokens())
@@ -222,22 +241,26 @@ export declare namespace create {
222
241
  * (`() => Db.postgres(...)`) on Workers.
223
242
  */
224
243
  db: Db.Source
225
- /**
226
- * KV state store backing API-key records (shared with the main API's
227
- * `kv` option), provisioned against by the `/api-keys` routes.
228
- */
229
- kv: { store: Store.State }
230
244
  /**
231
245
  * Extracts the verified admin identity from a request, or `null` to deny.
232
246
  * Must only return an identity for an already-authenticated request (a
233
247
  * verified Access JWT, or a header set by a trusted proxy).
234
248
  */
235
249
  identify: (request: Request) => Identity | null | Promise<Identity | null>
250
+ /**
251
+ * KV state store backing API-key records (shared with the main API's
252
+ * `kv` option), provisioned against by the `/api-keys` routes.
253
+ */
254
+ kv: { store: Store.State }
255
+ /** Tempo RPC options used by onchain verification. */
256
+ rpc?: Viem.getClient.Rpc | undefined
236
257
  /**
237
258
  * Admin UI options, or `false` to disable the bundled UI (JSON API only).
238
259
  * `loginUrl`/`logoutUrl` are surfaced in `GET /config.json`.
239
260
  */
240
261
  ui?: Ui | false | undefined
262
+ /** Zone chains available to admin routes. Pass true to use the hosted Zone list. */
263
+ zones?: true | readonly Chain[] | undefined
241
264
  }
242
265
 
243
266
  /** Admin UI options surfaced to the SPA via `GET /config.json`. */
@@ -1,16 +1,19 @@
1
1
  import * as ApiKey from '../../ApiKey.js'
2
2
  import * as core_ApiKeys from '../../ApiKeys.js'
3
+ import * as Organizations from '../../db/tables/organizations.js'
4
+ import * as Projects from '../../db/tables/projects.js'
5
+ import * as Users from '../../db/tables/users.js'
3
6
 
4
7
  import * as TestAdmin from '../../../test/Admin.js'
5
8
  import * as TestApp from '../../../test/App.js'
6
9
  import * as ApiKeys from './api-keys.js'
7
10
 
8
11
  /** Minimal valid mint payload. */
9
- const validBody = { orgId: 'org_test', scopes: ['data:read'] } as const
12
+ const validBody = { name: 'CI', orgId: 'org_test', scopes: ['data:read'] } as const
10
13
 
11
14
  describe('POST /api-keys', () => {
12
15
  test('mints a key, returns the token once, persists a hashed record', async () => {
13
- const { client, store } = TestAdmin.setup()
16
+ const { client, store } = await setup()
14
17
  const response = await client['api-keys'].$post({ json: { ...validBody, name: 'CI' } })
15
18
  const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
16
19
 
@@ -21,6 +24,7 @@ describe('POST /api-keys', () => {
21
24
  expect(body.createdBy).toBe(TestAdmin.identity.email)
22
25
  expect(TestAdmin.redact(body)).toMatchInlineSnapshot(`
23
26
  {
27
+ "allowedIps": [],
24
28
  "createdAt": "<createdAt>",
25
29
  "createdBy": "admin@tempo.xyz",
26
30
  "environment": "production",
@@ -44,7 +48,7 @@ describe('POST /api-keys', () => {
44
48
  })
45
49
 
46
50
  test('defaults to the production environment', async () => {
47
- const { client, store } = TestAdmin.setup()
51
+ const { client, store } = await setup()
48
52
  const response = await client['api-keys'].$post({ json: validBody })
49
53
  const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
50
54
 
@@ -53,8 +57,17 @@ describe('POST /api-keys', () => {
53
57
  expect((await core_ApiKeys.list(store))[0]?.environment).toBe('production')
54
58
  })
55
59
 
60
+ test('requires a human-readable name', async () => {
61
+ const { client } = await setup()
62
+ const response = await client['api-keys'].$post({
63
+ json: { orgId: 'org_test', scopes: ['data:read'] } as never,
64
+ })
65
+
66
+ expect(response.status).toBe(400)
67
+ })
68
+
56
69
  test('persists a sandbox environment when provided', async () => {
57
- const { client, store } = TestAdmin.setup()
70
+ const { client, store } = await setup()
58
71
  const response = await client['api-keys'].$post({
59
72
  json: { ...validBody, environment: 'sandbox' },
60
73
  })
@@ -68,21 +81,21 @@ describe('POST /api-keys', () => {
68
81
  expect(resolved?.environment).toBe('sandbox')
69
82
  })
70
83
 
71
- test('mints a key with a concrete Zone read scope', async () => {
72
- const { client, store } = TestAdmin.setup()
73
- const scope = 'zone:421700001:read' as const
84
+ test('mints a key with concrete Zone read and write scopes', async () => {
85
+ const { client, store } = await setup()
86
+ const scopes = ['zone:421700001:read', 'zone:421700001:write'] as const
74
87
  const response = await client['api-keys'].$post({
75
- json: { ...validBody, scopes: [scope] },
88
+ json: { ...validBody, scopes },
76
89
  })
77
90
  const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
78
91
 
79
92
  expect(response.status).toBe(200)
80
- expect(body.scopes).toEqual([scope])
81
- expect((await core_ApiKeys.resolve(store, body.token))?.scopes).toEqual([scope])
93
+ expect(body.scopes).toEqual(scopes)
94
+ expect((await core_ApiKeys.resolve(store, body.token))?.scopes).toEqual(scopes)
82
95
  })
83
96
 
84
97
  test('records the expiry when provided', async () => {
85
- const { client, store } = TestAdmin.setup()
98
+ const { client, store } = await setup()
86
99
  const expiresAt = '2100-01-01T00:00:00.000Z'
87
100
  const response = await client['api-keys'].$post({ json: { ...validBody, expiresAt } })
88
101
  const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
@@ -93,7 +106,7 @@ describe('POST /api-keys', () => {
93
106
  })
94
107
 
95
108
  test('rejects an unknown scope with 400', async () => {
96
- const { client } = TestAdmin.setup()
109
+ const { client } = await setup()
97
110
  const response = await client['api-keys'].$post({
98
111
  // Cast past the typed client to exercise runtime validation.
99
112
  json: { ...validBody, scopes: ['nope:read'] } as never,
@@ -105,8 +118,13 @@ describe('POST /api-keys', () => {
105
118
  })
106
119
 
107
120
  test('rejects non-concrete or non-canonical Zone scopes with 400', async () => {
108
- for (const scope of ['zone:<chainId>:read', 'zone:0:read', 'zone:000421700001:read']) {
109
- const { client } = TestAdmin.setup()
121
+ for (const scope of [
122
+ 'zone:<chainId>:read',
123
+ 'zone:0:read',
124
+ 'zone:0:write',
125
+ 'zone:000421700001:read',
126
+ ]) {
127
+ const { client } = await setup()
110
128
  const response = await client['api-keys'].$post({
111
129
  // Cast past the typed client to exercise runtime validation.
112
130
  json: { ...validBody, scopes: [scope] } as never,
@@ -119,7 +137,7 @@ describe('POST /api-keys', () => {
119
137
  })
120
138
 
121
139
  test('ignores a client-supplied createdBy (audit trail is server-set)', async () => {
122
- const { client } = TestAdmin.setup()
140
+ const { client } = await setup()
123
141
  const response = await client['api-keys'].$post({
124
142
  // Cast past the typed client: the body schema omits createdBy, so an
125
143
  // unknown key is stripped and the server records the verified identity.
@@ -130,8 +148,68 @@ describe('POST /api-keys', () => {
130
148
  expect(response.status).toBe(200)
131
149
  expect(body.createdBy).toBe(TestAdmin.identity.email)
132
150
  })
151
+
152
+ test('allows a one-off key without organization attribution', async () => {
153
+ const { client, store } = TestAdmin.setup()
154
+ const response = await client['api-keys'].$post({
155
+ json: { name: 'Trial', scopes: ['data:read'] },
156
+ })
157
+ const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
158
+
159
+ expect(response.status).toBe(200)
160
+ expect(body.orgId).toBe(body.id)
161
+ expect((await core_ApiKeys.resolve(store, body.token))?.orgId).toBe(body.id)
162
+ })
163
+
164
+ test('rejects an unknown organization', async () => {
165
+ const { client } = TestAdmin.setup()
166
+ const response = await client['api-keys'].$post({ json: validBody })
167
+
168
+ expect(response.status).toBe(404)
169
+ })
170
+
171
+ test('infers organization attribution from a project', async () => {
172
+ const { client, db, store } = TestAdmin.setup()
173
+ const organization = await Organizations.create(db, { name: 'Project owner' })
174
+ const project = await Projects.create(db, { name: 'Project', orgId: organization.id })
175
+ const response = await client['api-keys'].$post({
176
+ json: { name: 'Project key', projectId: project.id, scopes: ['data:read'] },
177
+ })
178
+ const body = await TestApp.json(response, ApiKeys.schema.createApiKey.Response)
179
+
180
+ expect(response.status).toBe(200)
181
+ expect(body.orgId).toBe(organization.id)
182
+ expect(body.projectId).toBe(project.id)
183
+ expect((await core_ApiKeys.resolve(store, body.token))?.orgId).toBe(organization.id)
184
+ })
185
+
186
+ test('rejects an unknown project', async () => {
187
+ const { client } = await setup()
188
+ const response = await client['api-keys'].$post({
189
+ json: { ...validBody, projectId: 'prj_missing' },
190
+ })
191
+
192
+ expect(response.status).toBe(404)
193
+ })
194
+
195
+ test('rejects a project owned by another organization', async () => {
196
+ const { client, db } = await setup()
197
+ const other = await Organizations.create(db, { name: 'Other' })
198
+ const project = await Projects.create(db, { name: 'Other project', orgId: other.id })
199
+ const response = await client['api-keys'].$post({
200
+ json: { ...validBody, projectId: project.id },
201
+ })
202
+
203
+ expect(response.status).toBe(404)
204
+ })
133
205
  })
134
206
 
207
+ async function setup() {
208
+ const context = TestAdmin.setup()
209
+ await Organizations.create(context.db, { id: validBody.orgId, name: 'Test' })
210
+ return context
211
+ }
212
+
135
213
  describe('GET /api-keys', () => {
136
214
  test('lists records as metadata only (never the token)', async () => {
137
215
  const { client, store } = TestAdmin.setup()
@@ -142,6 +220,11 @@ describe('GET /api-keys', () => {
142
220
 
143
221
  expect(response.status).toBe(200)
144
222
  expect(body.data).toHaveLength(1)
223
+ expect(body.data[0]).toMatchObject({
224
+ createdByLabel: null,
225
+ organizationName: null,
226
+ projectName: null,
227
+ })
145
228
  // No record (and no serialized response) may carry the plaintext token.
146
229
  expect(body.data[0]).not.toHaveProperty('token')
147
230
  expect(JSON.stringify(body)).not.toContain(token)
@@ -157,6 +240,30 @@ describe('GET /api-keys', () => {
157
240
 
158
241
  expect(body.data.map((record) => record.orgId)).toEqual(['org_a'])
159
242
  })
243
+
244
+ test('resolves organization, project, and creator display labels', async () => {
245
+ const { client, db, store } = TestAdmin.setup()
246
+ const user = await Users.upsertByAddress(db, { address: `0x${'aa'.repeat(20)}` })
247
+ await Users.setEmail(db, user.id, 'alex@tempo.xyz')
248
+ const organization = await Organizations.create(db, { name: 'Tempo' })
249
+ const project = await Projects.create(db, { name: 'Explorer', orgId: organization.id })
250
+ await core_ApiKeys.mint(store, {
251
+ createdBy: user.id,
252
+ name: 'Explorer testnet',
253
+ orgId: organization.id,
254
+ projectId: project.id,
255
+ scopes: ['data:read'],
256
+ })
257
+
258
+ const response = await client['api-keys'].$get({ query: {} })
259
+ const body = await TestApp.json(response, ApiKeys.schema.listApiKeys.Response)
260
+
261
+ expect(body.data[0]).toMatchObject({
262
+ createdByLabel: 'alex@tempo.xyz',
263
+ organizationName: 'Tempo',
264
+ projectName: 'Explorer',
265
+ })
266
+ })
160
267
  })
161
268
 
162
269
  describe('DELETE /api-keys/:id', () => {
@@ -184,22 +291,83 @@ describe('DELETE /api-keys/:id', () => {
184
291
  })
185
292
 
186
293
  describe('PATCH /api-keys/:id', () => {
187
- test('re-attributes a key to an org and project', async () => {
294
+ test('preserves the allowlist when omitted', async () => {
188
295
  const { client, store } = TestAdmin.setup()
189
- const { record, token } = await core_ApiKeys.mint(store, validBody)
296
+ const { record } = await core_ApiKeys.mint(store, {
297
+ allowedIps: ['203.0.113.0/24'],
298
+ name: 'Restricted',
299
+ scopes: ['data:read'],
300
+ })
301
+
302
+ const response = await client['api-keys'][':id'].$patch({
303
+ json: { name: 'Renamed' },
304
+ param: { id: record.id },
305
+ })
306
+
307
+ expect(response.status).toBe(200)
308
+ expect((await core_ApiKeys.get(store, record.id))?.allowedIps).toEqual(['203.0.113.0/24'])
309
+ })
310
+
311
+ test('renames and associates a one-off key without changing its token', async () => {
312
+ const { client, db, store } = TestAdmin.setup()
313
+ const organization = await Organizations.create(db, { name: 'Tempo' })
314
+ const { record, token } = await core_ApiKeys.mint(store, {
315
+ name: 'Trial',
316
+ scopes: ['data:read'],
317
+ })
190
318
 
191
319
  const response = await client['api-keys'][':id'].$patch({
192
- json: { orgId: 'org_real', projectId: 'prj_real' },
320
+ json: {
321
+ allowedIps: ['203.0.113.0/24'],
322
+ name: 'Explorer',
323
+ orgId: organization.id,
324
+ projectId: 'prj_real',
325
+ },
193
326
  param: { id: record.id },
194
327
  })
195
328
  expect(response.status).toBe(200)
196
329
  const body = await TestApp.json(response, core_ApiKeys.schema.Record)
197
- expect(body.orgId).toBe('org_real')
330
+ expect(body.name).toBe('Explorer')
331
+ expect(body.allowedIps).toEqual(['203.0.113.0/24'])
332
+ expect(body.orgId).toBe(organization.id)
198
333
  expect(body.projectId).toBe('prj_real')
199
334
 
200
- // The original token keeps resolving, now carrying the attribution.
201
- const resolved = await core_ApiKeys.resolve(store, token)
202
- expect(resolved?.projectId).toBe('prj_real')
335
+ expect((await core_ApiKeys.resolve(store, token))?.orgId).toBe(organization.id)
336
+ expect(await core_ApiKeys.listByOrg(store, record.id)).toEqual([])
337
+ expect((await core_ApiKeys.listByOrg(store, organization.id)).map(({ id }) => id)).toEqual([
338
+ record.id,
339
+ ])
340
+ })
341
+
342
+ test('rejects an unknown organization without changing the key', async () => {
343
+ const { client, store } = TestAdmin.setup()
344
+ const { record } = await core_ApiKeys.mint(store, { scopes: ['data:read'] })
345
+ const response = await client['api-keys'][':id'].$patch({
346
+ json: { orgId: 'org_missing' },
347
+ param: { id: record.id },
348
+ })
349
+
350
+ expect(response.status).toBe(404)
351
+ expect((await core_ApiKeys.get(store, record.id))?.orgId).toBe(record.id)
352
+ })
353
+
354
+ test('rejects changing an assigned organization', async () => {
355
+ const { client, db, store } = TestAdmin.setup()
356
+ const organization = await Organizations.create(db, { name: 'Tempo' })
357
+ const other = await Organizations.create(db, { name: 'Other' })
358
+ const { record, token } = await core_ApiKeys.mint(store, {
359
+ orgId: organization.id,
360
+ scopes: ['data:read'],
361
+ })
362
+ const response = await client['api-keys'][':id'].$patch({
363
+ json: { orgId: other.id },
364
+ param: { id: record.id },
365
+ })
366
+ const body = (await response.json()) as { error?: { code?: string } }
367
+
368
+ expect(response.status).toBe(409)
369
+ expect(body.error?.code).toBe('organization_already_assigned')
370
+ expect((await core_ApiKeys.resolve(store, token))?.orgId).toBe(organization.id)
203
371
  })
204
372
 
205
373
  test('unknown id → 404', async () => {