tapimo 0.14.0 → 0.15.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 (1141) hide show
  1. package/README.md +7 -4
  2. package/dist/ApiKey.js +1 -1
  3. package/dist/ApiKey.js.map +1 -1
  4. package/dist/ApiKeys.d.ts +95 -14
  5. package/dist/ApiKeys.d.ts.map +1 -1
  6. package/dist/ApiKeys.js +360 -49
  7. package/dist/ApiKeys.js.map +1 -1
  8. package/dist/App.d.ts +12457 -10365
  9. package/dist/App.d.ts.map +1 -1
  10. package/dist/App.js +300 -22
  11. package/dist/App.js.map +1 -1
  12. package/dist/Assets.d.ts.map +1 -1
  13. package/dist/Assets.js +2 -1
  14. package/dist/Assets.js.map +1 -1
  15. package/dist/Handler.d.ts +0 -1
  16. package/dist/Handler.d.ts.map +1 -1
  17. package/dist/Handler.js +0 -1
  18. package/dist/Handler.js.map +1 -1
  19. package/dist/Scope.d.ts +13 -5
  20. package/dist/Scope.d.ts.map +1 -1
  21. package/dist/Scope.js +16 -5
  22. package/dist/Scope.js.map +1 -1
  23. package/dist/Webhooks.js +1 -1
  24. package/dist/Webhooks.js.map +1 -1
  25. package/dist/admin/App.d.ts +3057 -549
  26. package/dist/admin/App.d.ts.map +1 -1
  27. package/dist/admin/App.js +26 -5
  28. package/dist/admin/App.js.map +1 -1
  29. package/dist/admin/apps/api-keys.d.ts +159 -7
  30. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  31. package/dist/admin/apps/api-keys.js +95 -43
  32. package/dist/admin/apps/api-keys.js.map +1 -1
  33. package/dist/admin/apps/earn-vaults.d.ts +1398 -0
  34. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  35. package/dist/admin/apps/earn-vaults.js +463 -7
  36. package/dist/admin/apps/earn-vaults.js.map +1 -1
  37. package/dist/admin/apps/organizations.d.ts +267 -15
  38. package/dist/admin/apps/organizations.d.ts.map +1 -1
  39. package/dist/admin/apps/organizations.js +241 -25
  40. package/dist/admin/apps/organizations.js.map +1 -1
  41. package/dist/admin/apps/routes-support.d.ts +95 -0
  42. package/dist/admin/apps/routes-support.d.ts.map +1 -0
  43. package/dist/admin/apps/routes-support.js +151 -0
  44. package/dist/admin/apps/routes-support.js.map +1 -0
  45. package/dist/admin/apps/routes.d.ts +2764 -0
  46. package/dist/admin/apps/routes.d.ts.map +1 -0
  47. package/dist/admin/apps/routes.js +728 -0
  48. package/dist/admin/apps/routes.js.map +1 -0
  49. package/dist/admin/apps/subsidies.d.ts +501 -0
  50. package/dist/admin/apps/subsidies.d.ts.map +1 -0
  51. package/dist/admin/apps/subsidies.js +384 -0
  52. package/dist/admin/apps/subsidies.js.map +1 -0
  53. package/dist/admin/apps/verified-tokens.d.ts +88 -88
  54. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  55. package/dist/admin/apps/verified-tokens.js +3 -3
  56. package/dist/admin/apps/verified-tokens.js.map +1 -1
  57. package/dist/admin/ui.generated.d.ts +1 -1
  58. package/dist/admin/ui.generated.d.ts.map +1 -1
  59. package/dist/admin/ui.generated.js +129 -69
  60. package/dist/admin/ui.generated.js.map +1 -1
  61. package/dist/analytics/Analytics.d.ts +5 -2
  62. package/dist/analytics/Analytics.d.ts.map +1 -1
  63. package/dist/analytics/Analytics.js +31 -1
  64. package/dist/analytics/Analytics.js.map +1 -1
  65. package/dist/analytics/tables/requestEvents.d.ts +2 -1
  66. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  67. package/dist/analytics/tables/requestEvents.js +10 -1
  68. package/dist/analytics/tables/requestEvents.js.map +1 -1
  69. package/dist/analytics/tables/routesLifecycleIntervals.d.ts +72 -0
  70. package/dist/analytics/tables/routesLifecycleIntervals.d.ts.map +1 -0
  71. package/dist/analytics/tables/routesLifecycleIntervals.js +56 -0
  72. package/dist/analytics/tables/routesLifecycleIntervals.js.map +1 -0
  73. package/dist/apps/Zones.d.ts +21 -12526
  74. package/dist/apps/Zones.d.ts.map +1 -1
  75. package/dist/apps/Zones.js +37 -5
  76. package/dist/apps/Zones.js.map +1 -1
  77. package/dist/apps/data/App.d.ts +3971 -2595
  78. package/dist/apps/data/App.d.ts.map +1 -1
  79. package/dist/apps/data/App.js +76 -21
  80. package/dist/apps/data/App.js.map +1 -1
  81. package/dist/apps/data/routes/activities.d.ts +364 -34
  82. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  83. package/dist/apps/data/routes/activities.js +495 -190
  84. package/dist/apps/data/routes/activities.js.map +1 -1
  85. package/dist/apps/data/routes/addresses.d.ts +72 -0
  86. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  87. package/dist/apps/data/routes/blocks.d.ts +37 -37
  88. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  89. package/dist/apps/data/routes/coingecko.js +47 -21
  90. package/dist/apps/data/routes/coingecko.js.map +1 -1
  91. package/dist/apps/data/routes/earn.d.ts +1450 -337
  92. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  93. package/dist/apps/data/routes/earn.js +1226 -144
  94. package/dist/apps/data/routes/earn.js.map +1 -1
  95. package/dist/apps/data/routes/fee-amm.d.ts +5 -0
  96. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  97. package/dist/apps/data/routes/fee-amm.js +31 -19
  98. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  99. package/dist/apps/data/routes/indexer.d.ts +125 -0
  100. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  101. package/dist/apps/data/routes/indexer.js +83 -27
  102. package/dist/apps/data/routes/indexer.js.map +1 -1
  103. package/dist/apps/data/routes/rpc.d.ts +507 -33
  104. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  105. package/dist/apps/data/routes/rpc.js +266 -156
  106. package/dist/apps/data/routes/rpc.js.map +1 -1
  107. package/dist/apps/data/routes/tokenlist.d.ts +47 -15
  108. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  109. package/dist/apps/data/routes/tokenlist.js +68 -11
  110. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  111. package/dist/apps/data/routes/tokens.d.ts +2 -0
  112. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  113. package/dist/apps/data/routes/tokens.js +26 -14
  114. package/dist/apps/data/routes/tokens.js.map +1 -1
  115. package/dist/apps/data/routes/transfers.d.ts +28 -12
  116. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  117. package/dist/apps/data/routes/transfers.js +9 -7
  118. package/dist/apps/data/routes/transfers.js.map +1 -1
  119. package/dist/apps/data/routes/valuation.d.ts +30 -30
  120. package/dist/apps/data/routes/verified-tokens.d.ts +9 -9
  121. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  122. package/dist/apps/data/routes/verified-tokens.js +64 -20
  123. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  124. package/dist/apps/data/routes/webhooks.d.ts +613 -176
  125. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  126. package/dist/apps/data/routes/webhooks.js +291 -195
  127. package/dist/apps/data/routes/webhooks.js.map +1 -1
  128. package/dist/apps/data/routes/zones.d.ts.map +1 -1
  129. package/dist/apps/data/routes/zones.js +20 -12
  130. package/dist/apps/data/routes/zones.js.map +1 -1
  131. package/dist/apps/docs/reference.js +2 -2
  132. package/dist/apps/docs/reference.js.map +1 -1
  133. package/dist/apps/index.d.ts +1 -1
  134. package/dist/apps/index.d.ts.map +1 -1
  135. package/dist/apps/index.js +1 -1
  136. package/dist/apps/index.js.map +1 -1
  137. package/dist/apps/management/App.d.ts +3763 -3385
  138. package/dist/apps/management/App.d.ts.map +1 -1
  139. package/dist/apps/management/App.js +5 -14
  140. package/dist/apps/management/App.js.map +1 -1
  141. package/dist/apps/management/Billing.d.ts +48 -7
  142. package/dist/apps/management/Billing.d.ts.map +1 -1
  143. package/dist/apps/management/Billing.js +204 -25
  144. package/dist/apps/management/Billing.js.map +1 -1
  145. package/dist/apps/management/routes/api-keys.d.ts +106 -4
  146. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  147. package/dist/apps/management/routes/api-keys.js +43 -15
  148. package/dist/apps/management/routes/api-keys.js.map +1 -1
  149. package/dist/apps/management/routes/billing.d.ts +290 -4
  150. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  151. package/dist/apps/management/routes/billing.js +274 -49
  152. package/dist/apps/management/routes/billing.js.map +1 -1
  153. package/dist/apps/management/routes/faucet.d.ts +6 -6
  154. package/dist/apps/management/routes/faucet.js +1 -1
  155. package/dist/apps/management/routes/faucet.js.map +1 -1
  156. package/dist/apps/management/routes/invitations.d.ts +77 -2
  157. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  158. package/dist/apps/management/routes/invitations.js +117 -13
  159. package/dist/apps/management/routes/invitations.js.map +1 -1
  160. package/dist/apps/management/routes/invite-links.d.ts +4 -4
  161. package/dist/apps/management/routes/me.d.ts.map +1 -1
  162. package/dist/apps/management/routes/me.js +6 -2
  163. package/dist/apps/management/routes/me.js.map +1 -1
  164. package/dist/apps/management/routes/members.d.ts +30 -30
  165. package/dist/apps/management/routes/orgs.d.ts +18 -2
  166. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  167. package/dist/apps/management/routes/orgs.js +52 -12
  168. package/dist/apps/management/routes/orgs.js.map +1 -1
  169. package/dist/apps/management/routes/projects.d.ts +4 -4
  170. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  171. package/dist/apps/management/routes/projects.js +6 -1
  172. package/dist/apps/management/routes/projects.js.map +1 -1
  173. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  174. package/dist/apps/management/routes/scopes.js +4 -1
  175. package/dist/apps/management/routes/scopes.js.map +1 -1
  176. package/dist/apps/management/routes/usage.d.ts +24 -24
  177. package/dist/apps/management/routes/usage.js +21 -4
  178. package/dist/apps/management/routes/usage.js.map +1 -1
  179. package/dist/apps/management/routes/verified-token-requests.d.ts +2 -2
  180. package/dist/apps/management/routes/webhooks.d.ts +280 -214
  181. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  182. package/dist/apps/management/routes/webhooks.js +58 -12
  183. package/dist/apps/management/routes/webhooks.js.map +1 -1
  184. package/dist/apps/mcp.d.ts +1 -1
  185. package/dist/apps/mcp.js +7 -7
  186. package/dist/apps/mcp.js.map +1 -1
  187. package/dist/apps/mpp/App.d.ts.map +1 -1
  188. package/dist/apps/mpp/App.js +35 -7
  189. package/dist/apps/mpp/App.js.map +1 -1
  190. package/dist/apps/mpp/internal/Adapter.d.ts +2 -0
  191. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  192. package/dist/apps/mpp/internal/Adapter.js +30 -1
  193. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  194. package/dist/apps/mpp/internal/Policy.d.ts +22 -4
  195. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  196. package/dist/apps/mpp/internal/Policy.js +24 -6
  197. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  198. package/dist/apps/mpp/internal/Sponsorship.d.ts +3 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  200. package/dist/apps/mpp/internal/Sponsorship.js +6 -3
  201. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  202. package/dist/apps/relay/App.d.ts +2 -0
  203. package/dist/apps/relay/App.d.ts.map +1 -1
  204. package/dist/apps/relay/App.js +134 -75
  205. package/dist/apps/relay/App.js.map +1 -1
  206. package/dist/apps/relay/Sponsorships.d.ts +5 -3
  207. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  208. package/dist/apps/relay/Sponsorships.js +209 -28
  209. package/dist/apps/relay/Sponsorships.js.map +1 -1
  210. package/dist/apps/{funding → routes}/Access.d.ts +4 -4
  211. package/dist/apps/routes/Access.d.ts.map +1 -0
  212. package/dist/apps/{funding → routes}/Access.js +4 -4
  213. package/dist/apps/routes/Access.js.map +1 -0
  214. package/dist/apps/{funding → routes}/App.d.ts +418 -124
  215. package/dist/apps/{funding → routes}/App.d.ts.map +1 -1
  216. package/dist/apps/{funding → routes}/App.js +16 -16
  217. package/dist/apps/routes/App.js.map +1 -0
  218. package/dist/apps/routes/Inventory.d.ts.map +1 -0
  219. package/dist/apps/{funding → routes}/Inventory.js +2 -2
  220. package/dist/apps/routes/Inventory.js.map +1 -0
  221. package/dist/apps/routes/index.d.ts +2 -0
  222. package/dist/apps/routes/index.d.ts.map +1 -0
  223. package/dist/apps/routes/index.js +2 -0
  224. package/dist/apps/routes/index.js.map +1 -0
  225. package/dist/apps/{funding → routes}/routes/chains.d.ts +7 -7
  226. package/dist/apps/routes/routes/chains.d.ts.map +1 -0
  227. package/dist/apps/{funding → routes}/routes/chains.js +25 -25
  228. package/dist/apps/routes/routes/chains.js.map +1 -0
  229. package/dist/apps/{funding → routes}/routes/deposit-addresses.d.ts +107 -43
  230. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -0
  231. package/dist/apps/{funding → routes}/routes/deposit-addresses.js +497 -222
  232. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -0
  233. package/dist/apps/{funding → routes}/routes/providers.d.ts +8 -8
  234. package/dist/apps/routes/routes/providers.d.ts.map +1 -0
  235. package/dist/apps/routes/routes/providers.js +57 -0
  236. package/dist/apps/routes/routes/providers.js.map +1 -0
  237. package/dist/apps/{funding → routes}/routes/quotes.d.ts +19 -16
  238. package/dist/apps/routes/routes/quotes.d.ts.map +1 -0
  239. package/dist/apps/{funding → routes}/routes/quotes.js +55 -38
  240. package/dist/apps/routes/routes/quotes.js.map +1 -0
  241. package/dist/apps/{funding → routes}/routes/transfers.d.ts +379 -74
  242. package/dist/apps/routes/routes/transfers.d.ts.map +1 -0
  243. package/dist/apps/routes/routes/transfers.js +1140 -0
  244. package/dist/apps/routes/routes/transfers.js.map +1 -0
  245. package/dist/cli/Cli.d.ts +30 -0
  246. package/dist/cli/Cli.d.ts.map +1 -1
  247. package/dist/cli/commands/admin.d.ts +36 -0
  248. package/dist/cli/commands/admin.d.ts.map +1 -1
  249. package/dist/cli/commands/admin.js +273 -0
  250. package/dist/cli/commands/admin.js.map +1 -1
  251. package/dist/cloudflare.d.ts +16 -14
  252. package/dist/cloudflare.d.ts.map +1 -1
  253. package/dist/cloudflare.js +26 -21
  254. package/dist/cloudflare.js.map +1 -1
  255. package/dist/db/Db.d.ts +63 -21
  256. package/dist/db/Db.d.ts.map +1 -1
  257. package/dist/db/Db.js +1030 -15
  258. package/dist/db/Db.js.map +1 -1
  259. package/dist/db/Schema.d.ts +780 -133
  260. package/dist/db/Schema.d.ts.map +1 -1
  261. package/dist/db/Schema.js +575 -162
  262. package/dist/db/Schema.js.map +1 -1
  263. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts +4 -0
  264. package/dist/db/tables/apiKeyAdmissionBootstraps.d.ts.map +1 -0
  265. package/dist/db/tables/apiKeyAdmissionBootstraps.js +2 -0
  266. package/dist/db/tables/apiKeyAdmissionBootstraps.js.map +1 -0
  267. package/dist/db/tables/apiKeyAdmissions.d.ts +73 -0
  268. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -0
  269. package/dist/db/tables/apiKeyAdmissions.js +142 -0
  270. package/dist/db/tables/apiKeyAdmissions.js.map +1 -0
  271. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts +4 -0
  272. package/dist/db/tables/apiKeyOwnerAdmissions.d.ts.map +1 -0
  273. package/dist/db/tables/apiKeyOwnerAdmissions.js +2 -0
  274. package/dist/db/tables/apiKeyOwnerAdmissions.js.map +1 -0
  275. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +20 -0
  276. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -0
  277. package/dist/db/tables/apiKeyOwnerTombstones.js +57 -0
  278. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -0
  279. package/dist/db/tables/apiKeyRevocations.d.ts +21 -0
  280. package/dist/db/tables/apiKeyRevocations.d.ts.map +1 -0
  281. package/dist/db/tables/apiKeyRevocations.js +98 -0
  282. package/dist/db/tables/apiKeyRevocations.js.map +1 -0
  283. package/dist/db/tables/authAccounts.d.ts +47 -0
  284. package/dist/db/tables/authAccounts.d.ts.map +1 -0
  285. package/dist/db/tables/authAccounts.js +72 -0
  286. package/dist/db/tables/authAccounts.js.map +1 -0
  287. package/dist/db/tables/authSessions.d.ts +12 -0
  288. package/dist/db/tables/authSessions.d.ts.map +1 -0
  289. package/dist/db/tables/authSessions.js +2 -0
  290. package/dist/db/tables/authSessions.js.map +1 -0
  291. package/dist/db/tables/authVerifications.d.ts +12 -0
  292. package/dist/db/tables/authVerifications.d.ts.map +1 -0
  293. package/dist/db/tables/authVerifications.js +2 -0
  294. package/dist/db/tables/authVerifications.js.map +1 -0
  295. package/dist/db/tables/invitations.d.ts +17 -1
  296. package/dist/db/tables/invitations.d.ts.map +1 -1
  297. package/dist/db/tables/invitations.js +123 -43
  298. package/dist/db/tables/invitations.js.map +1 -1
  299. package/dist/db/tables/memberships.d.ts +8 -0
  300. package/dist/db/tables/memberships.d.ts.map +1 -1
  301. package/dist/db/tables/memberships.js +51 -2
  302. package/dist/db/tables/memberships.js.map +1 -1
  303. package/dist/db/tables/organizations.d.ts +32 -10
  304. package/dist/db/tables/organizations.d.ts.map +1 -1
  305. package/dist/db/tables/organizations.js +110 -49
  306. package/dist/db/tables/organizations.js.map +1 -1
  307. package/dist/db/tables/projects.d.ts +2 -0
  308. package/dist/db/tables/projects.d.ts.map +1 -1
  309. package/dist/db/tables/projects.js +12 -3
  310. package/dist/db/tables/projects.js.map +1 -1
  311. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  312. package/dist/db/tables/requestUsage.js.map +1 -1
  313. package/dist/db/tables/rewardAccounts.d.ts +86 -0
  314. package/dist/db/tables/rewardAccounts.d.ts.map +1 -0
  315. package/dist/db/tables/rewardAccounts.js +88 -0
  316. package/dist/db/tables/rewardAccounts.js.map +1 -0
  317. package/dist/db/tables/rewardCampaignDistributors.d.ts +36 -0
  318. package/dist/db/tables/rewardCampaignDistributors.d.ts.map +1 -0
  319. package/dist/db/tables/rewardCampaignDistributors.js +30 -0
  320. package/dist/db/tables/rewardCampaignDistributors.js.map +1 -0
  321. package/dist/db/tables/rewardCampaigns.d.ts +171 -0
  322. package/dist/db/tables/rewardCampaigns.d.ts.map +1 -0
  323. package/dist/db/tables/rewardCampaigns.js +392 -0
  324. package/dist/db/tables/rewardCampaigns.js.map +1 -0
  325. package/dist/db/tables/rewardCredits.d.ts +53 -0
  326. package/dist/db/tables/rewardCredits.d.ts.map +1 -0
  327. package/dist/db/tables/rewardCredits.js +63 -0
  328. package/dist/db/tables/rewardCredits.js.map +1 -0
  329. package/dist/db/tables/rewardEligibilityAssociations.d.ts +61 -0
  330. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -0
  331. package/dist/db/tables/rewardEligibilityAssociations.js +103 -0
  332. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -0
  333. package/dist/db/tables/rewardRuns.d.ts +188 -0
  334. package/dist/db/tables/rewardRuns.d.ts.map +1 -0
  335. package/dist/db/tables/rewardRuns.js +278 -0
  336. package/dist/db/tables/rewardRuns.js.map +1 -0
  337. package/dist/db/tables/rewardTransactionAttempts.d.ts +100 -0
  338. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -0
  339. package/dist/db/tables/rewardTransactionAttempts.js +163 -0
  340. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -0
  341. package/dist/db/tables/routesCatalog.d.ts +58 -0
  342. package/dist/db/tables/routesCatalog.d.ts.map +1 -0
  343. package/dist/db/tables/{fundingCatalog.js → routesCatalog.js} +19 -19
  344. package/dist/db/tables/routesCatalog.js.map +1 -0
  345. package/dist/db/tables/routesDepositAddresses.d.ts +476 -0
  346. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -0
  347. package/dist/db/tables/routesDepositAddresses.js +587 -0
  348. package/dist/db/tables/routesDepositAddresses.js.map +1 -0
  349. package/dist/db/tables/{fundingDepositRequestObservations.d.ts → routesDepositRequestObservations.d.ts} +6 -6
  350. package/dist/db/tables/routesDepositRequestObservations.d.ts.map +1 -0
  351. package/dist/db/tables/{fundingDepositRequestObservations.js → routesDepositRequestObservations.js} +6 -6
  352. package/dist/db/tables/routesDepositRequestObservations.js.map +1 -0
  353. package/dist/db/tables/{fundingDeposits.d.ts → routesDeposits.d.ts} +210 -22
  354. package/dist/db/tables/routesDeposits.d.ts.map +1 -0
  355. package/dist/db/tables/routesDeposits.js +576 -0
  356. package/dist/db/tables/routesDeposits.js.map +1 -0
  357. package/dist/db/tables/routesIdempotency.d.ts +166 -0
  358. package/dist/db/tables/routesIdempotency.d.ts.map +1 -0
  359. package/dist/db/tables/routesIdempotency.js +330 -0
  360. package/dist/db/tables/routesIdempotency.js.map +1 -0
  361. package/dist/db/tables/routesSubsidies.d.ts +27 -0
  362. package/dist/db/tables/routesSubsidies.d.ts.map +1 -0
  363. package/dist/db/tables/routesSubsidies.js +45 -0
  364. package/dist/db/tables/routesSubsidies.js.map +1 -0
  365. package/dist/db/tables/{fundingTransferEvents.d.ts → routesTransferEvents.d.ts} +3 -3
  366. package/dist/db/tables/routesTransferEvents.d.ts.map +1 -0
  367. package/dist/db/tables/{fundingTransferEvents.js → routesTransferEvents.js} +3 -3
  368. package/dist/db/tables/routesTransferEvents.js.map +1 -0
  369. package/dist/db/tables/routesTransferSubsidies.d.ts +19 -0
  370. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -0
  371. package/dist/db/tables/routesTransferSubsidies.js +17 -0
  372. package/dist/db/tables/routesTransferSubsidies.js.map +1 -0
  373. package/dist/db/tables/routesTransferSubsidyNonces.d.ts +51 -0
  374. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -0
  375. package/dist/db/tables/routesTransferSubsidyNonces.js +82 -0
  376. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -0
  377. package/dist/db/tables/routesTransferTransactions.d.ts +77 -0
  378. package/dist/db/tables/routesTransferTransactions.d.ts.map +1 -0
  379. package/dist/db/tables/{fundingTransferTransactions.js → routesTransferTransactions.js} +31 -13
  380. package/dist/db/tables/routesTransferTransactions.js.map +1 -0
  381. package/dist/db/tables/routesTransfers.d.ts +319 -0
  382. package/dist/db/tables/routesTransfers.d.ts.map +1 -0
  383. package/dist/db/tables/routesTransfers.js +372 -0
  384. package/dist/db/tables/routesTransfers.js.map +1 -0
  385. package/dist/db/tables/sponsoredTransactions.d.ts +75 -20
  386. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  387. package/dist/db/tables/sponsoredTransactions.js +124 -54
  388. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  389. package/dist/db/tables/sponsorshipAttributions.d.ts +69 -0
  390. package/dist/db/tables/sponsorshipAttributions.d.ts.map +1 -0
  391. package/dist/db/tables/sponsorshipAttributions.js +77 -0
  392. package/dist/db/tables/sponsorshipAttributions.js.map +1 -0
  393. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts +22 -0
  394. package/dist/db/tables/sponsorshipReconciliationCursors.d.ts.map +1 -0
  395. package/dist/db/tables/sponsorshipReconciliationCursors.js +45 -0
  396. package/dist/db/tables/sponsorshipReconciliationCursors.js.map +1 -0
  397. package/dist/db/tables/stripeCustomers.d.ts +11 -0
  398. package/dist/db/tables/stripeCustomers.d.ts.map +1 -1
  399. package/dist/db/tables/stripeCustomers.js +13 -0
  400. package/dist/db/tables/stripeCustomers.js.map +1 -1
  401. package/dist/db/tables/users.d.ts +17 -1
  402. package/dist/db/tables/users.d.ts.map +1 -1
  403. package/dist/db/tables/users.js +47 -2
  404. package/dist/db/tables/users.js.map +1 -1
  405. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  406. package/dist/db/tables/webhookQueueEvents.js +5 -1
  407. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  408. package/dist/db/tables/webhookSubscriptions.d.ts +19 -11
  409. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  410. package/dist/db/tables/webhookSubscriptions.js +45 -13
  411. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  412. package/dist/handlers/internal/executionError.d.ts +2 -2
  413. package/dist/handlers/internal/executionError.d.ts.map +1 -1
  414. package/dist/handlers/internal/executionError.js +1 -2
  415. package/dist/handlers/internal/executionError.js.map +1 -1
  416. package/dist/handlers/internal/multisig.d.ts +4 -232
  417. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  418. package/dist/handlers/internal/multisig.js +11 -537
  419. package/dist/handlers/internal/multisig.js.map +1 -1
  420. package/dist/handlers/internal/sponsorship.d.ts +19 -8
  421. package/dist/handlers/internal/sponsorship.d.ts.map +1 -1
  422. package/dist/handlers/internal/sponsorship.js +13 -9
  423. package/dist/handlers/internal/sponsorship.js.map +1 -1
  424. package/dist/handlers/relay.d.ts +9 -12
  425. package/dist/handlers/relay.d.ts.map +1 -1
  426. package/dist/handlers/relay.js +81 -85
  427. package/dist/handlers/relay.js.map +1 -1
  428. package/dist/index.d.ts +0 -17
  429. package/dist/index.d.ts.map +1 -1
  430. package/dist/index.js +0 -17
  431. package/dist/index.js.map +1 -1
  432. package/dist/internal/AssetResponse.d.ts +12 -0
  433. package/dist/internal/AssetResponse.d.ts.map +1 -0
  434. package/dist/internal/AssetResponse.js +21 -0
  435. package/dist/internal/AssetResponse.js.map +1 -0
  436. package/dist/internal/Auth.d.ts +48 -12
  437. package/dist/internal/Auth.d.ts.map +1 -1
  438. package/dist/internal/Auth.js +603 -175
  439. package/dist/internal/Auth.js.map +1 -1
  440. package/dist/internal/BetterAuth.d.ts +1488 -0
  441. package/dist/internal/BetterAuth.d.ts.map +1 -0
  442. package/dist/internal/BetterAuth.js +253 -0
  443. package/dist/internal/BetterAuth.js.map +1 -0
  444. package/dist/internal/Cache.d.ts +2 -0
  445. package/dist/internal/Cache.d.ts.map +1 -1
  446. package/dist/internal/Cache.js +2 -0
  447. package/dist/internal/Cache.js.map +1 -1
  448. package/dist/internal/EarnRates.d.ts +26 -3
  449. package/dist/internal/EarnRates.d.ts.map +1 -1
  450. package/dist/internal/EarnRates.js +84 -19
  451. package/dist/internal/EarnRates.js.map +1 -1
  452. package/dist/internal/EarnSharePrices.d.ts +120 -0
  453. package/dist/internal/EarnSharePrices.d.ts.map +1 -0
  454. package/dist/internal/EarnSharePrices.js +179 -0
  455. package/dist/internal/EarnSharePrices.js.map +1 -0
  456. package/dist/internal/EarnVaults.d.ts +4 -0
  457. package/dist/internal/EarnVaults.d.ts.map +1 -1
  458. package/dist/internal/EarnVaults.js +27 -10
  459. package/dist/internal/EarnVaults.js.map +1 -1
  460. package/dist/internal/Email.d.ts +37 -0
  461. package/dist/internal/Email.d.ts.map +1 -0
  462. package/dist/internal/Email.js +16 -0
  463. package/dist/internal/Email.js.map +1 -0
  464. package/dist/internal/Log.d.ts +32 -28
  465. package/dist/internal/Log.d.ts.map +1 -1
  466. package/dist/internal/Log.js +18 -11
  467. package/dist/internal/Log.js.map +1 -1
  468. package/dist/internal/MetricSink.d.ts +3 -0
  469. package/dist/internal/MetricSink.d.ts.map +1 -1
  470. package/dist/internal/MetricSink.js +67 -8
  471. package/dist/internal/MetricSink.js.map +1 -1
  472. package/dist/internal/Mpp.d.ts.map +1 -1
  473. package/dist/internal/Mpp.js +20 -25
  474. package/dist/internal/Mpp.js.map +1 -1
  475. package/dist/internal/OpenApi.d.ts +26 -3
  476. package/dist/internal/OpenApi.d.ts.map +1 -1
  477. package/dist/internal/OpenApi.js +25 -10
  478. package/dist/internal/OpenApi.js.map +1 -1
  479. package/dist/internal/Provider.d.ts +1 -1
  480. package/dist/internal/Provider.d.ts.map +1 -1
  481. package/dist/internal/RateLimit.d.ts.map +1 -1
  482. package/dist/internal/RateLimit.js +13 -1
  483. package/dist/internal/RateLimit.js.map +1 -1
  484. package/dist/internal/Store.d.ts +16 -0
  485. package/dist/internal/Store.d.ts.map +1 -1
  486. package/dist/internal/Store.js +59 -8
  487. package/dist/internal/Store.js.map +1 -1
  488. package/dist/internal/Tidx.d.ts +9 -2
  489. package/dist/internal/Tidx.d.ts.map +1 -1
  490. package/dist/internal/Tidx.js +78 -11
  491. package/dist/internal/Tidx.js.map +1 -1
  492. package/dist/internal/Timing.d.ts +26 -0
  493. package/dist/internal/Timing.d.ts.map +1 -1
  494. package/dist/internal/Timing.js +63 -5
  495. package/dist/internal/Timing.js.map +1 -1
  496. package/dist/internal/VercelOidc.d.ts +94 -0
  497. package/dist/internal/VercelOidc.d.ts.map +1 -0
  498. package/dist/internal/VercelOidc.js +128 -0
  499. package/dist/internal/VercelOidc.js.map +1 -0
  500. package/dist/internal/VerifiedTokens.d.ts +2 -8
  501. package/dist/internal/VerifiedTokens.d.ts.map +1 -1
  502. package/dist/internal/VerifiedTokens.js +24 -24
  503. package/dist/internal/VerifiedTokens.js.map +1 -1
  504. package/dist/internal/Viem.d.ts +30 -2067
  505. package/dist/internal/Viem.d.ts.map +1 -1
  506. package/dist/internal/Viem.js +167 -17
  507. package/dist/internal/Viem.js.map +1 -1
  508. package/dist/internal/Webhooks.d.ts +12 -4
  509. package/dist/internal/Webhooks.d.ts.map +1 -1
  510. package/dist/internal/Webhooks.js +9 -3
  511. package/dist/internal/Webhooks.js.map +1 -1
  512. package/dist/internal/ZoneRpc.d.ts +7 -0
  513. package/dist/internal/ZoneRpc.d.ts.map +1 -0
  514. package/dist/internal/ZoneRpc.js +49 -0
  515. package/dist/internal/ZoneRpc.js.map +1 -0
  516. package/dist/internal/index.d.ts +3 -1
  517. package/dist/internal/index.d.ts.map +1 -1
  518. package/dist/internal/index.js +3 -1
  519. package/dist/internal/index.js.map +1 -1
  520. package/dist/internal/rewards/Audit.d.ts +88 -0
  521. package/dist/internal/rewards/Audit.d.ts.map +1 -0
  522. package/dist/internal/rewards/Audit.js +134 -0
  523. package/dist/internal/rewards/Audit.js.map +1 -0
  524. package/dist/internal/rewards/Campaigns.d.ts +572 -0
  525. package/dist/internal/rewards/Campaigns.d.ts.map +1 -0
  526. package/dist/internal/rewards/Campaigns.js +531 -0
  527. package/dist/internal/rewards/Campaigns.js.map +1 -0
  528. package/dist/internal/rewards/Credits.d.ts +76 -0
  529. package/dist/internal/rewards/Credits.d.ts.map +1 -0
  530. package/dist/internal/rewards/Credits.js +95 -0
  531. package/dist/internal/rewards/Credits.js.map +1 -0
  532. package/dist/internal/rewards/Events.d.ts +100 -0
  533. package/dist/internal/rewards/Events.d.ts.map +1 -0
  534. package/dist/internal/rewards/Events.js +340 -0
  535. package/dist/internal/rewards/Events.js.map +1 -0
  536. package/dist/internal/rewards/Projection.d.ts +237 -0
  537. package/dist/internal/rewards/Projection.d.ts.map +1 -0
  538. package/dist/internal/rewards/Projection.js +616 -0
  539. package/dist/internal/rewards/Projection.js.map +1 -0
  540. package/dist/internal/rewards/Rates.d.ts +44 -0
  541. package/dist/internal/rewards/Rates.d.ts.map +1 -0
  542. package/dist/internal/rewards/Rates.js +60 -0
  543. package/dist/internal/rewards/Rates.js.map +1 -0
  544. package/dist/internal/rewards/Read.d.ts +158 -0
  545. package/dist/internal/rewards/Read.d.ts.map +1 -0
  546. package/dist/internal/rewards/Read.js +292 -0
  547. package/dist/internal/rewards/Read.js.map +1 -0
  548. package/dist/internal/rewards/Runner.d.ts +164 -0
  549. package/dist/internal/rewards/Runner.d.ts.map +1 -0
  550. package/dist/internal/rewards/Runner.js +1778 -0
  551. package/dist/internal/rewards/Runner.js.map +1 -0
  552. package/dist/internal/rewards/Signer.d.ts +224 -0
  553. package/dist/internal/rewards/Signer.d.ts.map +1 -0
  554. package/dist/internal/rewards/Signer.js +135 -0
  555. package/dist/internal/rewards/Signer.js.map +1 -0
  556. package/dist/internal/rewards/index.d.ts +15 -0
  557. package/dist/internal/rewards/index.d.ts.map +1 -0
  558. package/dist/internal/rewards/index.js +15 -0
  559. package/dist/internal/rewards/index.js.map +1 -0
  560. package/dist/internal/{funding → routes}/Action.d.ts +12 -1
  561. package/dist/internal/routes/Action.d.ts.map +1 -0
  562. package/dist/internal/{funding → routes}/Action.js +17 -9
  563. package/dist/internal/routes/Action.js.map +1 -0
  564. package/dist/internal/{funding → routes}/Catalog.d.ts +20 -20
  565. package/dist/internal/routes/Catalog.d.ts.map +1 -0
  566. package/dist/internal/{funding → routes}/Catalog.js +29 -29
  567. package/dist/internal/routes/Catalog.js.map +1 -0
  568. package/dist/internal/{funding → routes}/Chain.d.ts +10 -10
  569. package/dist/internal/routes/Chain.d.ts.map +1 -0
  570. package/dist/internal/{funding → routes}/Chain.js +3 -3
  571. package/dist/internal/routes/Chain.js.map +1 -0
  572. package/dist/internal/{funding → routes}/Deposit.d.ts +45 -23
  573. package/dist/internal/routes/Deposit.d.ts.map +1 -0
  574. package/dist/internal/{funding → routes}/Deposit.js +60 -27
  575. package/dist/internal/routes/Deposit.js.map +1 -0
  576. package/dist/internal/{funding → routes}/DepositAddress.d.ts +56 -27
  577. package/dist/internal/routes/DepositAddress.d.ts.map +1 -0
  578. package/dist/internal/{funding → routes}/DepositAddress.js +95 -33
  579. package/dist/internal/routes/DepositAddress.js.map +1 -0
  580. package/dist/internal/{funding → routes}/DepositWebhook.d.ts +4 -4
  581. package/dist/internal/routes/DepositWebhook.d.ts.map +1 -0
  582. package/dist/internal/{funding → routes}/DepositWebhook.js +4 -4
  583. package/dist/internal/routes/DepositWebhook.js.map +1 -0
  584. package/dist/internal/routes/Economics.d.ts +25 -0
  585. package/dist/internal/routes/Economics.d.ts.map +1 -0
  586. package/dist/internal/routes/Economics.js +28 -0
  587. package/dist/internal/routes/Economics.js.map +1 -0
  588. package/dist/internal/{funding → routes}/Evidence.d.ts +3 -3
  589. package/dist/internal/routes/Evidence.d.ts.map +1 -0
  590. package/dist/internal/{funding → routes}/Evidence.js +7 -7
  591. package/dist/internal/routes/Evidence.js.map +1 -0
  592. package/dist/internal/routes/Observability.d.ts +154 -0
  593. package/dist/internal/routes/Observability.d.ts.map +1 -0
  594. package/dist/internal/routes/Observability.js +389 -0
  595. package/dist/internal/routes/Observability.js.map +1 -0
  596. package/dist/internal/{funding → routes}/Provider.d.ts +311 -105
  597. package/dist/internal/routes/Provider.d.ts.map +1 -0
  598. package/dist/internal/{funding → routes}/Provider.js +229 -98
  599. package/dist/internal/routes/Provider.js.map +1 -0
  600. package/dist/internal/{funding → routes}/Reconciliation.d.ts +11 -6
  601. package/dist/internal/routes/Reconciliation.d.ts.map +1 -0
  602. package/dist/internal/{funding → routes}/Reconciliation.js +408 -158
  603. package/dist/internal/routes/Reconciliation.js.map +1 -0
  604. package/dist/internal/routes/Route.d.ts +21 -0
  605. package/dist/internal/routes/Route.d.ts.map +1 -0
  606. package/dist/internal/{funding → routes}/Route.js +1 -1
  607. package/dist/internal/routes/Route.js.map +1 -0
  608. package/dist/internal/{funding → routes}/SourceObservation.d.ts +6 -6
  609. package/dist/internal/routes/SourceObservation.d.ts.map +1 -0
  610. package/dist/internal/{funding → routes}/SourceObservation.js +8 -8
  611. package/dist/internal/routes/SourceObservation.js.map +1 -0
  612. package/dist/internal/{funding → routes}/Subsidy.d.ts +48 -3
  613. package/dist/internal/routes/Subsidy.d.ts.map +1 -0
  614. package/dist/internal/{funding → routes}/Subsidy.js +43 -3
  615. package/dist/internal/routes/Subsidy.js.map +1 -0
  616. package/dist/internal/{funding → routes}/Token.d.ts +4 -4
  617. package/dist/internal/routes/Token.d.ts.map +1 -0
  618. package/dist/internal/{funding → routes}/Token.js +3 -3
  619. package/dist/internal/routes/Token.js.map +1 -0
  620. package/dist/internal/{funding → routes}/Transfer.d.ts +241 -46
  621. package/dist/internal/routes/Transfer.d.ts.map +1 -0
  622. package/dist/internal/routes/Transfer.js +728 -0
  623. package/dist/internal/routes/Transfer.js.map +1 -0
  624. package/dist/internal/{funding → routes}/TransferReconciliation.d.ts +13 -10
  625. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -0
  626. package/dist/internal/routes/TransferReconciliation.js +422 -0
  627. package/dist/internal/routes/TransferReconciliation.js.map +1 -0
  628. package/dist/internal/routes/TransferSubsidy.d.ts +201 -0
  629. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -0
  630. package/dist/internal/routes/TransferSubsidy.js +256 -0
  631. package/dist/internal/routes/TransferSubsidy.js.map +1 -0
  632. package/dist/internal/{funding → routes}/TransferWebhook.d.ts +5 -5
  633. package/dist/internal/routes/TransferWebhook.d.ts.map +1 -0
  634. package/dist/internal/{funding → routes}/TransferWebhook.js +3 -3
  635. package/dist/internal/routes/TransferWebhook.js.map +1 -0
  636. package/dist/internal/{funding → routes}/index.d.ts +2 -0
  637. package/dist/internal/routes/index.d.ts.map +1 -0
  638. package/dist/internal/{funding → routes}/index.js +2 -0
  639. package/dist/internal/routes/index.js.map +1 -0
  640. package/dist/internal/{funding → routes}/providers/across.d.ts +4 -4
  641. package/dist/internal/routes/providers/across.d.ts.map +1 -0
  642. package/dist/internal/{funding → routes}/providers/across.js +13 -13
  643. package/dist/internal/routes/providers/across.js.map +1 -0
  644. package/dist/internal/{funding → routes}/providers/relay.d.ts +21 -12
  645. package/dist/internal/routes/providers/relay.d.ts.map +1 -0
  646. package/dist/internal/{funding → routes}/providers/relay.js +194 -110
  647. package/dist/internal/routes/providers/relay.js.map +1 -0
  648. package/dist/internal/{funding → routes}/providers/rhino.d.ts +4 -4
  649. package/dist/internal/routes/providers/rhino.d.ts.map +1 -0
  650. package/dist/internal/{funding → routes}/providers/rhino.js +10 -10
  651. package/dist/internal/routes/providers/rhino.js.map +1 -0
  652. package/dist/internal/{funding → routes}/providers/squid.d.ts +4 -4
  653. package/dist/internal/routes/providers/squid.d.ts.map +1 -0
  654. package/dist/internal/{funding → routes}/providers/squid.js +14 -14
  655. package/dist/internal/routes/providers/squid.js.map +1 -0
  656. package/dist/internal/{funding → routes}/providers/stargate.d.ts +46 -18
  657. package/dist/internal/routes/providers/stargate.d.ts.map +1 -0
  658. package/dist/internal/routes/providers/stargate.js +898 -0
  659. package/dist/internal/routes/providers/stargate.js.map +1 -0
  660. package/dist/internal/{funding → routes}/providers/symbiosis.d.ts +4 -4
  661. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -0
  662. package/dist/internal/{funding → routes}/providers/symbiosis.js +30 -20
  663. package/dist/internal/routes/providers/symbiosis.js.map +1 -0
  664. package/dist/internal/webhookDestinations/slack.js +12 -12
  665. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  666. package/dist/providers/index.d.ts +12 -12
  667. package/dist/providers/index.d.ts.map +1 -1
  668. package/dist/providers/index.js +12 -12
  669. package/dist/providers/index.js.map +1 -1
  670. package/dist/server.d.ts +19 -0
  671. package/dist/server.d.ts.map +1 -0
  672. package/dist/server.js +19 -0
  673. package/dist/server.js.map +1 -0
  674. package/package.json +15 -4
  675. package/src/ApiKey.ts +1 -1
  676. package/src/ApiKeys.test.ts +1033 -3
  677. package/src/ApiKeys.ts +489 -48
  678. package/src/App.test-d.ts +1 -1
  679. package/src/App.test.ts +216 -25
  680. package/src/App.ts +334 -31
  681. package/src/Assets.test.ts +2 -2
  682. package/src/Assets.ts +3 -1
  683. package/src/Auth.test-d.ts +1 -1
  684. package/src/Client.test-d.ts +539 -110
  685. package/src/Handler.ts +0 -1
  686. package/src/OpenApi.contract.test.ts +195 -0
  687. package/src/Scope.ts +17 -5
  688. package/src/Webhooks.ts +1 -1
  689. package/src/admin/App.test.ts +30 -2
  690. package/src/admin/App.ts +42 -6
  691. package/src/admin/apps/api-keys.test.ts +267 -5
  692. package/src/admin/apps/api-keys.ts +100 -50
  693. package/src/admin/apps/earn-vaults.test.ts +158 -0
  694. package/src/admin/apps/earn-vaults.ts +679 -6
  695. package/src/admin/apps/organizations.test.ts +306 -17
  696. package/src/admin/apps/organizations.ts +299 -24
  697. package/src/admin/apps/routes-support.test.ts +200 -0
  698. package/src/admin/apps/routes-support.ts +201 -0
  699. package/src/admin/apps/routes.test.ts +450 -0
  700. package/src/admin/apps/routes.ts +896 -0
  701. package/src/admin/apps/scopes.test.ts +15 -5
  702. package/src/admin/apps/subsidies.test.ts +306 -0
  703. package/src/admin/apps/subsidies.ts +457 -0
  704. package/src/admin/apps/verified-tokens.test.ts +8 -3
  705. package/src/admin/apps/verified-tokens.ts +3 -3
  706. package/src/admin/ui/plugin.ts +1 -2
  707. package/src/admin/ui/src/components/RewardCampaignForm.tsx +1009 -0
  708. package/src/admin/ui/src/lib/config.ts +11 -2
  709. package/src/admin/ui/src/lib/earn-vaults.ts +2 -2
  710. package/src/admin/ui/src/lib/organizations.test.ts +83 -50
  711. package/src/admin/ui/src/lib/organizations.ts +106 -25
  712. package/src/admin/ui/src/lib/query-client.ts +1 -1
  713. package/src/admin/ui/src/lib/reward-campaigns.ts +136 -0
  714. package/src/admin/ui/src/lib/routes.test.ts +88 -0
  715. package/src/admin/ui/src/lib/routes.ts +304 -0
  716. package/src/admin/ui/src/lib/subsidies.ts +75 -0
  717. package/src/admin/ui/src/routeTree.gen.ts +63 -0
  718. package/src/admin/ui/src/routes/__root.tsx +12 -1
  719. package/src/admin/ui/src/routes/api-keys.tsx +196 -84
  720. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +105 -70
  721. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +239 -23
  722. package/src/admin/ui/src/routes/routes.tsx +1615 -0
  723. package/src/admin/ui/src/routes/routes_.support.tsx +248 -0
  724. package/src/admin/ui/src/routes/subsidies.tsx +799 -0
  725. package/src/admin/ui.generated.ts +144 -69
  726. package/src/analytics/Analytics.test.ts +108 -18
  727. package/src/analytics/Analytics.ts +38 -6
  728. package/src/analytics/tables/requestEvents.test.ts +100 -0
  729. package/src/analytics/tables/requestEvents.ts +10 -1
  730. package/src/analytics/tables/routesLifecycleIntervals.ts +140 -0
  731. package/src/apps/Zones.test.ts +15 -0
  732. package/src/apps/Zones.ts +52 -5
  733. package/src/apps/composition.test.ts +68 -60
  734. package/src/apps/data/App.test.ts +154 -2
  735. package/src/apps/data/App.ts +88 -28
  736. package/src/apps/data/routes/activities.test.ts +419 -7
  737. package/src/apps/data/routes/activities.ts +683 -216
  738. package/src/apps/data/routes/balances.test.ts +2 -2
  739. package/src/apps/data/routes/blocks.test.ts +46 -1
  740. package/src/apps/data/routes/coingecko.test.ts +419 -1
  741. package/src/apps/data/routes/coingecko.ts +309 -253
  742. package/src/apps/data/routes/earn.discovery.test.ts +274 -0
  743. package/src/apps/data/routes/earn.test.ts +1294 -17
  744. package/src/apps/data/routes/earn.ts +1838 -321
  745. package/src/apps/data/routes/exchanges.test.ts +12 -15
  746. package/src/apps/data/routes/fee-amm.test.ts +224 -0
  747. package/src/apps/data/routes/fee-amm.ts +191 -160
  748. package/src/apps/data/routes/indexer.test.ts +389 -0
  749. package/src/apps/data/routes/indexer.ts +165 -69
  750. package/src/apps/data/routes/receipts.test.ts +1 -1
  751. package/src/apps/data/routes/rpc.test.ts +352 -8
  752. package/src/apps/data/routes/rpc.ts +407 -219
  753. package/src/apps/data/routes/rpc.zone.test.ts +340 -0
  754. package/src/apps/data/routes/tokenlist.test.ts +285 -0
  755. package/src/apps/data/routes/tokenlist.ts +173 -88
  756. package/src/apps/data/routes/tokens.test.ts +93 -3
  757. package/src/apps/data/routes/tokens.ts +39 -23
  758. package/src/apps/data/routes/transactions.test.ts +1 -1
  759. package/src/apps/data/routes/transfers.test.ts +56 -24
  760. package/src/apps/data/routes/transfers.ts +19 -8
  761. package/src/apps/data/routes/valuation.test.ts +1 -1
  762. package/src/apps/data/routes/verified-tokens.test.ts +345 -0
  763. package/src/apps/data/routes/verified-tokens.ts +99 -29
  764. package/src/apps/data/routes/webhooks.test.ts +645 -83
  765. package/src/apps/data/routes/webhooks.ts +1089 -857
  766. package/src/apps/data/routes/zones.test.ts +148 -71
  767. package/src/apps/data/routes/zones.ts +71 -55
  768. package/src/apps/docs/reference.ts +2 -2
  769. package/src/apps/index.ts +1 -1
  770. package/src/apps/management/App.ts +9 -51
  771. package/src/apps/management/Billing.test.ts +375 -14
  772. package/src/apps/management/Billing.ts +265 -29
  773. package/src/apps/management/routes/api-keys.test.ts +269 -7
  774. package/src/apps/management/routes/api-keys.ts +61 -20
  775. package/src/apps/management/routes/billing.test.ts +477 -15
  776. package/src/apps/management/routes/billing.ts +377 -50
  777. package/src/apps/management/routes/faucet.test.ts +1 -1
  778. package/src/apps/management/routes/faucet.ts +1 -1
  779. package/src/apps/management/routes/invitations.test.ts +270 -3
  780. package/src/apps/management/routes/invitations.ts +185 -15
  781. package/src/apps/management/routes/invoicePreview.test.ts +549 -0
  782. package/src/apps/management/routes/me.test.ts +246 -5
  783. package/src/apps/management/routes/me.ts +7 -2
  784. package/src/apps/management/routes/members.test.ts +108 -0
  785. package/src/apps/management/routes/orgs.test.ts +191 -3
  786. package/src/apps/management/routes/orgs.ts +58 -11
  787. package/src/apps/management/routes/projects.test.ts +33 -3
  788. package/src/apps/management/routes/projects.ts +6 -1
  789. package/src/apps/management/routes/scopes.test.ts +30 -2
  790. package/src/apps/management/routes/scopes.ts +4 -1
  791. package/src/apps/management/routes/usage.test.ts +32 -0
  792. package/src/apps/management/routes/usage.ts +22 -4
  793. package/src/apps/management/routes/webhooks.test.ts +49 -26
  794. package/src/apps/management/routes/webhooks.ts +78 -22
  795. package/src/apps/mcp.test.ts +6 -6
  796. package/src/apps/mcp.ts +7 -7
  797. package/src/apps/mpp/App.ts +37 -7
  798. package/src/apps/mpp/Mpp.test.ts +49 -8
  799. package/src/apps/mpp/Mpp.zone.test.ts +219 -0
  800. package/src/apps/mpp/internal/Adapter.ts +34 -0
  801. package/src/apps/mpp/internal/Policy.test.ts +86 -31
  802. package/src/apps/mpp/internal/Policy.ts +49 -7
  803. package/src/apps/mpp/internal/Sponsorship.test.ts +207 -0
  804. package/src/apps/mpp/internal/Sponsorship.ts +9 -3
  805. package/src/apps/relay/App.test.ts +839 -64
  806. package/src/apps/relay/App.ts +148 -81
  807. package/src/apps/relay/App.zone-billing.test.ts +257 -0
  808. package/src/apps/relay/Sponsorships.test.ts +67 -4
  809. package/src/apps/relay/Sponsorships.ts +233 -32
  810. package/src/apps/relay/Sponsorships.zone.test.ts +102 -0
  811. package/src/apps/{funding → routes}/Access.ts +6 -6
  812. package/src/apps/routes/App.test.ts +165 -0
  813. package/src/apps/routes/App.ts +96 -0
  814. package/src/apps/{funding → routes}/Inventory.ts +2 -2
  815. package/src/apps/routes/index.ts +1 -0
  816. package/src/apps/{funding → routes}/routes/chains.test.ts +66 -66
  817. package/src/apps/{funding → routes}/routes/chains.ts +23 -23
  818. package/src/apps/{funding → routes}/routes/deposit-addresses.test.ts +1358 -458
  819. package/src/apps/{funding → routes}/routes/deposit-addresses.ts +566 -246
  820. package/src/apps/{funding → routes}/routes/providers.test.ts +27 -33
  821. package/src/apps/{funding → routes}/routes/providers.ts +23 -23
  822. package/src/apps/{funding → routes}/routes/quotes.test.ts +298 -41
  823. package/src/apps/{funding → routes}/routes/quotes.ts +57 -40
  824. package/src/apps/{funding → routes}/routes/transfers.test.ts +1100 -353
  825. package/src/apps/routes/routes/transfers.ts +1332 -0
  826. package/src/cli/Cli.test.ts +1 -1
  827. package/src/cli/commands/admin.test.ts +748 -1
  828. package/src/cli/commands/admin.ts +278 -0
  829. package/src/cloudflare.ts +52 -47
  830. package/src/db/Db.test.ts +245 -2
  831. package/src/db/Db.ts +1476 -34
  832. package/src/db/Schema.ts +729 -228
  833. package/src/db/tables/apiKeyAdmissionBootstraps.ts +4 -0
  834. package/src/db/tables/apiKeyAdmissions.ts +218 -0
  835. package/src/db/tables/apiKeyOwnerAdmissions.ts +4 -0
  836. package/src/db/tables/apiKeyOwnerTombstones.ts +81 -0
  837. package/src/db/tables/apiKeyRevocations.test.ts +74 -0
  838. package/src/db/tables/apiKeyRevocations.ts +121 -0
  839. package/src/db/tables/authAccounts.ts +105 -0
  840. package/src/db/tables/authSessions.ts +13 -0
  841. package/src/db/tables/authVerifications.ts +13 -0
  842. package/src/db/tables/invitations.ts +142 -45
  843. package/src/db/tables/memberships.ts +79 -3
  844. package/src/db/tables/organizations.test.ts +690 -13
  845. package/src/db/tables/organizations.ts +139 -55
  846. package/src/db/tables/projects.test.ts +16 -0
  847. package/src/db/tables/projects.ts +13 -3
  848. package/src/db/tables/requestUsage.ts +4 -1
  849. package/src/db/tables/rewardAccounts.ts +178 -0
  850. package/src/db/tables/rewardCampaignDistributors.ts +68 -0
  851. package/src/db/tables/rewardCampaigns.test.ts +1388 -0
  852. package/src/db/tables/rewardCampaigns.ts +647 -0
  853. package/src/db/tables/rewardCredits.ts +110 -0
  854. package/src/db/tables/rewardEligibilityAssociations.test.ts +271 -0
  855. package/src/db/tables/rewardEligibilityAssociations.ts +184 -0
  856. package/src/db/tables/rewardRuns.ts +514 -0
  857. package/src/db/tables/rewardTransactionAttempts.ts +272 -0
  858. package/src/db/tables/routesCatalog.test.ts +185 -0
  859. package/src/db/tables/routesCatalog.ts +163 -0
  860. package/src/db/tables/routesDepositAddresses.test.ts +1048 -0
  861. package/src/db/tables/routesDepositAddresses.ts +1008 -0
  862. package/src/db/tables/{fundingDepositRequestObservations.test.ts → routesDepositRequestObservations.test.ts} +13 -14
  863. package/src/db/tables/{fundingDepositRequestObservations.ts → routesDepositRequestObservations.ts} +10 -10
  864. package/src/db/tables/{fundingDeposits.test.ts → routesDeposits.test.ts} +316 -46
  865. package/src/db/tables/routesDeposits.ts +1062 -0
  866. package/src/db/tables/routesIdempotency.test.ts +796 -0
  867. package/src/db/tables/routesIdempotency.ts +496 -0
  868. package/src/db/tables/routesSubsidies.test.ts +120 -0
  869. package/src/db/tables/routesSubsidies.ts +71 -0
  870. package/src/db/tables/{fundingTransferEvents.ts → routesTransferEvents.ts} +4 -4
  871. package/src/db/tables/routesTransferSubsidies.ts +38 -0
  872. package/src/db/tables/routesTransferSubsidyNonces.ts +124 -0
  873. package/src/db/tables/routesTransferTransactions.test.ts +195 -0
  874. package/src/db/tables/{fundingTransferTransactions.ts → routesTransferTransactions.ts} +63 -18
  875. package/src/db/tables/routesTransfers.test.ts +338 -0
  876. package/src/db/tables/routesTransfers.ts +662 -0
  877. package/src/db/tables/sponsoredTransactions.test.ts +269 -45
  878. package/src/db/tables/sponsoredTransactions.ts +225 -65
  879. package/src/db/tables/sponsorshipAttributions.test.ts +160 -0
  880. package/src/db/tables/sponsorshipAttributions.ts +168 -0
  881. package/src/db/tables/sponsorshipReconciliationCursors.test.ts +115 -0
  882. package/src/db/tables/sponsorshipReconciliationCursors.ts +67 -0
  883. package/src/db/tables/stripeCustomers.test.ts +85 -0
  884. package/src/db/tables/stripeCustomers.ts +24 -0
  885. package/src/db/tables/users.test.ts +129 -0
  886. package/src/db/tables/users.ts +49 -3
  887. package/src/db/tables/webhookQueueEvents.ts +8 -1
  888. package/src/db/tables/webhookSubscriptions.ts +95 -20
  889. package/src/handlers/internal/executionError.ts +3 -4
  890. package/src/handlers/internal/multisig.ts +13 -816
  891. package/src/handlers/internal/sponsorship.ts +26 -10
  892. package/src/handlers/relay.test-d.ts +9 -1
  893. package/src/handlers/relay.test.ts +823 -3
  894. package/src/handlers/relay.ts +127 -107
  895. package/src/index.test-d.ts +7 -0
  896. package/src/index.ts +0 -17
  897. package/src/internal/AssetResponse.ts +26 -0
  898. package/src/internal/Auth.test.ts +1564 -9
  899. package/src/internal/Auth.ts +833 -239
  900. package/src/internal/BetterAuth.test.ts +242 -0
  901. package/src/internal/BetterAuth.ts +349 -0
  902. package/src/internal/Cache.ts +2 -0
  903. package/src/internal/EarnRates.test.ts +17 -0
  904. package/src/internal/EarnRates.ts +124 -31
  905. package/src/internal/EarnSharePrices.test.ts +182 -0
  906. package/src/internal/EarnSharePrices.ts +313 -0
  907. package/src/internal/EarnVaults.test.ts +21 -0
  908. package/src/internal/EarnVaults.ts +33 -11
  909. package/src/internal/Email.ts +54 -0
  910. package/src/internal/Idempotency.test.ts +2 -2
  911. package/src/internal/Log.test-d.ts +8 -7
  912. package/src/internal/Log.test.ts +114 -16
  913. package/src/internal/Log.ts +53 -40
  914. package/src/internal/MetricSink.test.ts +313 -26
  915. package/src/internal/MetricSink.ts +73 -8
  916. package/src/internal/Mpp.test.ts +31 -0
  917. package/src/internal/Mpp.ts +21 -24
  918. package/src/internal/OpenApi.ts +45 -12
  919. package/src/internal/Provider.test.ts +1 -1
  920. package/src/internal/Provider.ts +1 -1
  921. package/src/internal/RateLimit.test.ts +21 -3
  922. package/src/internal/RateLimit.ts +12 -1
  923. package/src/internal/Store.test-d.ts +1 -1
  924. package/src/internal/Store.test.ts +151 -8
  925. package/src/internal/Store.ts +76 -9
  926. package/src/internal/Tidx.test.ts +59 -8
  927. package/src/internal/Tidx.ts +86 -14
  928. package/src/internal/Timing.test.ts +77 -0
  929. package/src/internal/Timing.ts +83 -6
  930. package/src/internal/VercelOidc.test.ts +188 -0
  931. package/src/internal/VercelOidc.ts +193 -0
  932. package/src/internal/VerifiedTokens.test.ts +60 -6
  933. package/src/internal/VerifiedTokens.ts +21 -24
  934. package/src/internal/Viem.batch.test.ts +80 -0
  935. package/src/internal/Viem.test.ts +201 -2
  936. package/src/internal/Viem.ts +221 -25
  937. package/src/internal/Webhooks.test.ts +85 -6
  938. package/src/internal/Webhooks.ts +22 -4
  939. package/src/internal/ZoneRpc.ts +50 -0
  940. package/src/internal/exchange/Provider.test.ts +2 -2
  941. package/src/internal/index.test.ts +3 -1
  942. package/src/internal/index.ts +3 -1
  943. package/src/internal/rewards/Audit.ts +231 -0
  944. package/src/internal/rewards/Campaigns.test.ts +1234 -0
  945. package/src/internal/rewards/Campaigns.ts +1205 -0
  946. package/src/internal/rewards/Credits.ts +165 -0
  947. package/src/internal/rewards/Events.local.test.ts +113 -0
  948. package/src/internal/rewards/Events.test.ts +152 -0
  949. package/src/internal/rewards/Events.ts +468 -0
  950. package/src/internal/rewards/Projection.test.ts +681 -0
  951. package/src/internal/rewards/Projection.ts +987 -0
  952. package/src/internal/rewards/Rates.test.ts +171 -0
  953. package/src/internal/rewards/Rates.ts +110 -0
  954. package/src/internal/rewards/Read.test.ts +501 -0
  955. package/src/internal/rewards/Read.ts +476 -0
  956. package/src/internal/rewards/Runner.checkpoint.test.ts +80 -0
  957. package/src/internal/rewards/Runner.states.test.ts +188 -0
  958. package/src/internal/rewards/Runner.test.ts +90 -0
  959. package/src/internal/rewards/Runner.ts +2229 -0
  960. package/src/internal/rewards/Signer.test.ts +79 -0
  961. package/src/internal/rewards/Signer.ts +180 -0
  962. package/src/internal/rewards/index.ts +14 -0
  963. package/src/internal/{funding → routes}/Action.test.ts +63 -14
  964. package/src/internal/{funding → routes}/Action.ts +35 -8
  965. package/src/internal/{funding → routes}/Catalog.test.ts +3 -3
  966. package/src/internal/{funding → routes}/Catalog.ts +39 -39
  967. package/src/internal/{funding → routes}/Chain.test.ts +1 -1
  968. package/src/internal/{funding → routes}/Chain.ts +11 -11
  969. package/src/internal/{funding → routes}/Deposit.test.ts +1 -1
  970. package/src/internal/{funding → routes}/Deposit.ts +93 -45
  971. package/src/internal/{funding → routes}/DepositAddress.test.ts +11 -3
  972. package/src/internal/{funding → routes}/DepositAddress.ts +132 -53
  973. package/src/internal/{funding → routes}/DepositWebhook.test.ts +61 -18
  974. package/src/internal/{funding → routes}/DepositWebhook.ts +9 -9
  975. package/src/internal/routes/Economics.test.ts +42 -0
  976. package/src/internal/routes/Economics.ts +47 -0
  977. package/src/internal/{funding → routes}/Evidence.test.ts +6 -6
  978. package/src/internal/{funding → routes}/Evidence.ts +9 -9
  979. package/src/internal/routes/Observability.test.ts +636 -0
  980. package/src/internal/routes/Observability.ts +668 -0
  981. package/src/internal/{funding → routes}/Provider.test.ts +489 -153
  982. package/src/internal/{funding → routes}/Provider.ts +489 -186
  983. package/src/internal/{funding → routes}/Reconciliation.local.test.ts +84 -12
  984. package/src/internal/{funding → routes}/Reconciliation.test.ts +1213 -279
  985. package/src/internal/{funding → routes}/Reconciliation.ts +501 -203
  986. package/src/internal/routes/Reconciliation.unattributed.test.ts +250 -0
  987. package/src/internal/{funding → routes}/Route.ts +7 -7
  988. package/src/internal/{funding → routes}/SourceObservation.test.ts +13 -14
  989. package/src/internal/{funding → routes}/SourceObservation.ts +13 -13
  990. package/src/internal/{funding → routes}/Subsidy.local.test.ts +7 -7
  991. package/src/internal/routes/Subsidy.test.ts +169 -0
  992. package/src/internal/{funding → routes}/Subsidy.ts +86 -6
  993. package/src/internal/{funding → routes}/Token.test.ts +1 -1
  994. package/src/internal/{funding → routes}/Token.ts +5 -5
  995. package/src/internal/routes/Transfer.test.ts +1199 -0
  996. package/src/internal/routes/Transfer.ts +1206 -0
  997. package/src/internal/routes/TransferReconciliation.test.ts +731 -0
  998. package/src/internal/routes/TransferReconciliation.ts +527 -0
  999. package/src/internal/routes/TransferSubsidy.test.ts +172 -0
  1000. package/src/internal/routes/TransferSubsidy.ts +447 -0
  1001. package/src/internal/{funding → routes}/TransferWebhook.test.ts +13 -13
  1002. package/src/internal/{funding → routes}/TransferWebhook.ts +7 -7
  1003. package/src/internal/{funding → routes}/index.test.ts +5 -3
  1004. package/src/internal/{funding → routes}/index.ts +2 -0
  1005. package/src/internal/{funding → routes}/providers/across.ts +16 -16
  1006. package/src/internal/{funding → routes}/providers/index.test.ts +157 -44
  1007. package/src/internal/{funding → routes}/providers/relay.test.ts +165 -32
  1008. package/src/internal/{funding → routes}/providers/relay.ts +228 -121
  1009. package/src/internal/{funding → routes}/providers/rhino.ts +16 -16
  1010. package/src/internal/{funding → routes}/providers/squid.ts +17 -17
  1011. package/src/internal/routes/providers/stargate.test.ts +728 -0
  1012. package/src/internal/routes/providers/stargate.ts +1276 -0
  1013. package/src/internal/{funding → routes}/providers/symbiosis.ts +64 -24
  1014. package/src/internal/webhookDestinations/slack.ts +10 -10
  1015. package/src/providers/index.ts +13 -13
  1016. package/src/server.ts +18 -0
  1017. package/dist/apps/funding/Access.d.ts.map +0 -1
  1018. package/dist/apps/funding/Access.js.map +0 -1
  1019. package/dist/apps/funding/App.js.map +0 -1
  1020. package/dist/apps/funding/Inventory.d.ts.map +0 -1
  1021. package/dist/apps/funding/Inventory.js.map +0 -1
  1022. package/dist/apps/funding/ProviderAttempts.d.ts +0 -5
  1023. package/dist/apps/funding/ProviderAttempts.d.ts.map +0 -1
  1024. package/dist/apps/funding/ProviderAttempts.js +0 -24
  1025. package/dist/apps/funding/ProviderAttempts.js.map +0 -1
  1026. package/dist/apps/funding/index.d.ts +0 -2
  1027. package/dist/apps/funding/index.d.ts.map +0 -1
  1028. package/dist/apps/funding/index.js +0 -2
  1029. package/dist/apps/funding/index.js.map +0 -1
  1030. package/dist/apps/funding/routes/chains.d.ts.map +0 -1
  1031. package/dist/apps/funding/routes/chains.js.map +0 -1
  1032. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +0 -1
  1033. package/dist/apps/funding/routes/deposit-addresses.js.map +0 -1
  1034. package/dist/apps/funding/routes/providers.d.ts.map +0 -1
  1035. package/dist/apps/funding/routes/providers.js +0 -57
  1036. package/dist/apps/funding/routes/providers.js.map +0 -1
  1037. package/dist/apps/funding/routes/quotes.d.ts.map +0 -1
  1038. package/dist/apps/funding/routes/quotes.js.map +0 -1
  1039. package/dist/apps/funding/routes/transfers.d.ts.map +0 -1
  1040. package/dist/apps/funding/routes/transfers.js +0 -828
  1041. package/dist/apps/funding/routes/transfers.js.map +0 -1
  1042. package/dist/db/tables/fundingCatalog.d.ts +0 -58
  1043. package/dist/db/tables/fundingCatalog.d.ts.map +0 -1
  1044. package/dist/db/tables/fundingCatalog.js.map +0 -1
  1045. package/dist/db/tables/fundingDepositAddresses.d.ts +0 -192
  1046. package/dist/db/tables/fundingDepositAddresses.d.ts.map +0 -1
  1047. package/dist/db/tables/fundingDepositAddresses.js +0 -235
  1048. package/dist/db/tables/fundingDepositAddresses.js.map +0 -1
  1049. package/dist/db/tables/fundingDepositRequestObservations.d.ts.map +0 -1
  1050. package/dist/db/tables/fundingDepositRequestObservations.js.map +0 -1
  1051. package/dist/db/tables/fundingDeposits.d.ts.map +0 -1
  1052. package/dist/db/tables/fundingDeposits.js +0 -295
  1053. package/dist/db/tables/fundingDeposits.js.map +0 -1
  1054. package/dist/db/tables/fundingIdempotency.d.ts +0 -91
  1055. package/dist/db/tables/fundingIdempotency.d.ts.map +0 -1
  1056. package/dist/db/tables/fundingIdempotency.js +0 -103
  1057. package/dist/db/tables/fundingIdempotency.js.map +0 -1
  1058. package/dist/db/tables/fundingTransferEvents.d.ts.map +0 -1
  1059. package/dist/db/tables/fundingTransferEvents.js.map +0 -1
  1060. package/dist/db/tables/fundingTransferTransactions.d.ts +0 -53
  1061. package/dist/db/tables/fundingTransferTransactions.d.ts.map +0 -1
  1062. package/dist/db/tables/fundingTransferTransactions.js.map +0 -1
  1063. package/dist/db/tables/fundingTransfers.d.ts +0 -99
  1064. package/dist/db/tables/fundingTransfers.d.ts.map +0 -1
  1065. package/dist/db/tables/fundingTransfers.js +0 -110
  1066. package/dist/db/tables/fundingTransfers.js.map +0 -1
  1067. package/dist/internal/funding/Action.d.ts.map +0 -1
  1068. package/dist/internal/funding/Action.js.map +0 -1
  1069. package/dist/internal/funding/Catalog.d.ts.map +0 -1
  1070. package/dist/internal/funding/Catalog.js.map +0 -1
  1071. package/dist/internal/funding/Chain.d.ts.map +0 -1
  1072. package/dist/internal/funding/Chain.js.map +0 -1
  1073. package/dist/internal/funding/Deposit.d.ts.map +0 -1
  1074. package/dist/internal/funding/Deposit.js.map +0 -1
  1075. package/dist/internal/funding/DepositAddress.d.ts.map +0 -1
  1076. package/dist/internal/funding/DepositAddress.js.map +0 -1
  1077. package/dist/internal/funding/DepositWebhook.d.ts.map +0 -1
  1078. package/dist/internal/funding/DepositWebhook.js.map +0 -1
  1079. package/dist/internal/funding/Evidence.d.ts.map +0 -1
  1080. package/dist/internal/funding/Evidence.js.map +0 -1
  1081. package/dist/internal/funding/Provider.d.ts.map +0 -1
  1082. package/dist/internal/funding/Provider.js.map +0 -1
  1083. package/dist/internal/funding/Reconciliation.d.ts.map +0 -1
  1084. package/dist/internal/funding/Reconciliation.js.map +0 -1
  1085. package/dist/internal/funding/Route.d.ts +0 -21
  1086. package/dist/internal/funding/Route.d.ts.map +0 -1
  1087. package/dist/internal/funding/Route.js.map +0 -1
  1088. package/dist/internal/funding/SourceObservation.d.ts.map +0 -1
  1089. package/dist/internal/funding/SourceObservation.js.map +0 -1
  1090. package/dist/internal/funding/Subsidy.d.ts.map +0 -1
  1091. package/dist/internal/funding/Subsidy.js.map +0 -1
  1092. package/dist/internal/funding/Token.d.ts.map +0 -1
  1093. package/dist/internal/funding/Token.js.map +0 -1
  1094. package/dist/internal/funding/Transfer.d.ts.map +0 -1
  1095. package/dist/internal/funding/Transfer.js +0 -462
  1096. package/dist/internal/funding/Transfer.js.map +0 -1
  1097. package/dist/internal/funding/TransferReconciliation.d.ts.map +0 -1
  1098. package/dist/internal/funding/TransferReconciliation.js +0 -192
  1099. package/dist/internal/funding/TransferReconciliation.js.map +0 -1
  1100. package/dist/internal/funding/TransferWebhook.d.ts.map +0 -1
  1101. package/dist/internal/funding/TransferWebhook.js.map +0 -1
  1102. package/dist/internal/funding/index.d.ts.map +0 -1
  1103. package/dist/internal/funding/index.js.map +0 -1
  1104. package/dist/internal/funding/providers/across.d.ts.map +0 -1
  1105. package/dist/internal/funding/providers/across.js.map +0 -1
  1106. package/dist/internal/funding/providers/relay.d.ts.map +0 -1
  1107. package/dist/internal/funding/providers/relay.js.map +0 -1
  1108. package/dist/internal/funding/providers/rhino.d.ts.map +0 -1
  1109. package/dist/internal/funding/providers/rhino.js.map +0 -1
  1110. package/dist/internal/funding/providers/squid.d.ts.map +0 -1
  1111. package/dist/internal/funding/providers/squid.js.map +0 -1
  1112. package/dist/internal/funding/providers/stargate.d.ts.map +0 -1
  1113. package/dist/internal/funding/providers/stargate.js +0 -579
  1114. package/dist/internal/funding/providers/stargate.js.map +0 -1
  1115. package/dist/internal/funding/providers/symbiosis.d.ts.map +0 -1
  1116. package/dist/internal/funding/providers/symbiosis.js.map +0 -1
  1117. package/src/apps/funding/App.test.ts +0 -78
  1118. package/src/apps/funding/App.ts +0 -88
  1119. package/src/apps/funding/ProviderAttempts.ts +0 -26
  1120. package/src/apps/funding/index.ts +0 -1
  1121. package/src/apps/funding/routes/transfers.ts +0 -987
  1122. package/src/db/tables/fundingCatalog.test.ts +0 -122
  1123. package/src/db/tables/fundingCatalog.ts +0 -163
  1124. package/src/db/tables/fundingDepositAddresses.test.ts +0 -608
  1125. package/src/db/tables/fundingDepositAddresses.ts +0 -443
  1126. package/src/db/tables/fundingDeposits.ts +0 -572
  1127. package/src/db/tables/fundingIdempotency.test.ts +0 -182
  1128. package/src/db/tables/fundingIdempotency.ts +0 -180
  1129. package/src/db/tables/fundingTransferTransactions.test.ts +0 -112
  1130. package/src/db/tables/fundingTransfers.test.ts +0 -115
  1131. package/src/db/tables/fundingTransfers.ts +0 -189
  1132. package/src/handlers/internal/multisig.test.ts +0 -818
  1133. package/src/internal/funding/Subsidy.test.ts +0 -75
  1134. package/src/internal/funding/Transfer.test.ts +0 -524
  1135. package/src/internal/funding/Transfer.ts +0 -762
  1136. package/src/internal/funding/TransferReconciliation.test.ts +0 -147
  1137. package/src/internal/funding/TransferReconciliation.ts +0 -264
  1138. package/src/internal/funding/providers/stargate.test.ts +0 -328
  1139. package/src/internal/funding/providers/stargate.ts +0 -856
  1140. /package/dist/apps/{funding → routes}/Inventory.d.ts +0 -0
  1141. /package/src/internal/{funding → routes}/Route.test.ts +0 -0
@@ -0,0 +1,1615 @@
1
+ import { Collapsible as BaseCollapsible } from '@base-ui/react/collapsible'
2
+ import { Dialog as BaseDialog } from '@base-ui/react/dialog'
3
+ import { Menu as BaseMenu } from '@base-ui/react/menu'
4
+ import { useInfiniteQuery, useQuery } from '@tanstack/react-query'
5
+ import { createFileRoute, Link, useNavigate } from '@tanstack/react-router'
6
+ import { type ReactNode, useCallback, useEffect, useRef, useState } from 'react'
7
+ import { Button, Input, Select, Tabs, Tag, useCopy } from 'regen-ui'
8
+ import {
9
+ ArrowLeftRight,
10
+ ArrowRight,
11
+ Check,
12
+ ChevronDown,
13
+ CircleDollarSign,
14
+ Copy as CopyIcon,
15
+ ExternalLink,
16
+ SlidersHorizontal,
17
+ WalletCards,
18
+ X,
19
+ } from 'lucide-react'
20
+ import { base, mainnet } from 'viem/chains'
21
+ import { tempo } from 'viem/tempo/chains'
22
+
23
+ import { Notice, Page } from '../components/Page.js'
24
+ import * as Routes from '../lib/routes.js'
25
+
26
+ type Resource = NonNullable<Routes.Search['resource']>
27
+ const transferStatuses = [
28
+ 'awaiting-source',
29
+ 'processing',
30
+ 'refunding',
31
+ 'completed',
32
+ 'refunded',
33
+ 'action-required',
34
+ 'expired',
35
+ ] as const satisfies readonly Routes.listTransfers.Item['status'][]
36
+ const defaultTransferStatuses = [
37
+ 'processing',
38
+ 'refunding',
39
+ 'completed',
40
+ 'refunded',
41
+ 'action-required',
42
+ 'expired',
43
+ ] as const satisfies readonly Routes.listTransfers.Item['status'][]
44
+ const depositStatuses = [
45
+ 'detected',
46
+ 'bridging',
47
+ 'settling',
48
+ 'refunding',
49
+ 'completed',
50
+ 'refunded',
51
+ 'action-required',
52
+ ] as const satisfies readonly Routes.listDeposits.Item['status'][]
53
+ const depositAddressStatuses = [
54
+ 'active',
55
+ 'action-required',
56
+ 'deactivated',
57
+ ] as const satisfies readonly Routes.listDepositAddresses.Item['status'][]
58
+ type Explorer = { address: string; tx: string }
59
+ const explorers: Record<string, Explorer> = {
60
+ [`eip155:${base.id}`]: {
61
+ address: `${base.blockExplorers.default.url}/address`,
62
+ tx: `${base.blockExplorers.default.url}/tx`,
63
+ },
64
+ [`eip155:${mainnet.id}`]: {
65
+ address: `${mainnet.blockExplorers.default.url}/address`,
66
+ tx: `${mainnet.blockExplorers.default.url}/tx`,
67
+ },
68
+ [`eip155:${tempo.id}`]: {
69
+ address: `${tempo.blockExplorers.default.url}/address`,
70
+ tx: `${tempo.blockExplorers.default.url}/tx`,
71
+ },
72
+ 'solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp': {
73
+ address: 'https://solscan.io/account',
74
+ tx: 'https://solscan.io/tx',
75
+ },
76
+ 'tron:0x2b6653dc': {
77
+ address: 'https://tronscan.org/address',
78
+ tx: 'https://tronscan.org/transaction',
79
+ },
80
+ }
81
+ const providerItems = [
82
+ { label: 'Across', value: 'across' },
83
+ { label: 'Relay', value: 'relay' },
84
+ { label: 'Rhino', value: 'rhino' },
85
+ { label: 'Squid', value: 'squid' },
86
+ { label: 'Stargate', value: 'stargate' },
87
+ { label: 'Symbiosis', value: 'symbiosis' },
88
+ ] as const
89
+
90
+ export const Route = createFileRoute('/routes')({
91
+ validateSearch: Routes.schema.Search,
92
+ component: PageComponent,
93
+ })
94
+
95
+ function PageComponent() {
96
+ const navigate = useNavigate({ from: Route.fullPath })
97
+ const search = Route.useSearch()
98
+ const resource = search.resource ?? 'transfers'
99
+ const summary = useQuery(Routes.summary.options(summaryFilters(search)))
100
+
101
+ const applyFilters = useCallback(
102
+ (filters: Routes.Search) =>
103
+ void navigate({
104
+ replace: true,
105
+ search: { ...filters, resource, selected: undefined },
106
+ }),
107
+ [navigate, resource],
108
+ )
109
+
110
+ function selectResource(value: string) {
111
+ void navigate({
112
+ search: (current) => ({
113
+ ...current,
114
+ depositAddressId: value === 'deposits' ? current.depositAddressId : undefined,
115
+ methods: value === 'transfers' ? current.methods : undefined,
116
+ resource: value as Resource,
117
+ selected: undefined,
118
+ statuses: undefined,
119
+ }),
120
+ })
121
+ }
122
+
123
+ function select(id: string) {
124
+ void navigate({ search: (current) => ({ ...current, selected: id }) })
125
+ }
126
+
127
+ function closeDetail() {
128
+ void navigate({ replace: true, search: (current) => ({ ...current, selected: undefined }) })
129
+ }
130
+
131
+ function filterByWork(work: 'inProgress' | 'needsAttention') {
132
+ void navigate({
133
+ replace: true,
134
+ search: (current) => ({
135
+ ...current,
136
+ inProgress: work === 'inProgress' && !current.inProgress ? 'true' : undefined,
137
+ needsAttention: work === 'needsAttention' && !current.needsAttention ? 'true' : undefined,
138
+ selected: undefined,
139
+ statuses: undefined,
140
+ }),
141
+ })
142
+ }
143
+
144
+ return (
145
+ <Page
146
+ title="Routes"
147
+ description="Inspect transfers, deposits, and reusable deposit addresses"
148
+ action={<Button render={<Link to="/routes/support" />}>Support matrix</Button>}
149
+ >
150
+ <SummaryCards
151
+ error={summary.error}
152
+ loading={summary.isPending}
153
+ onSelect={filterByWork}
154
+ selected={
155
+ search.inProgress ? 'inProgress' : search.needsAttention ? 'needsAttention' : null
156
+ }
157
+ summary={
158
+ resource === 'transfers'
159
+ ? summary.data?.resources.transfers
160
+ : resource === 'deposits'
161
+ ? summary.data?.resources.deposits
162
+ : summary.data?.resources.depositAddresses
163
+ }
164
+ />
165
+ <div className="flex min-w-0 flex-col">
166
+ <Filters
167
+ onChange={applyFilters}
168
+ resource={resource}
169
+ search={search}
170
+ tabs={
171
+ <Tabs
172
+ active={resource}
173
+ className="min-w-max border-b-0"
174
+ onChange={selectResource}
175
+ tabs={[
176
+ {
177
+ icon: <ArrowLeftRight className="size-4" />,
178
+ id: 'transfers',
179
+ label: 'Transfers',
180
+ },
181
+ {
182
+ icon: <CircleDollarSign className="size-4" />,
183
+ id: 'deposits',
184
+ label: 'Deposits',
185
+ },
186
+ {
187
+ icon: <WalletCards className="size-4" />,
188
+ id: 'deposit-addresses',
189
+ label: 'Deposit addresses',
190
+ },
191
+ ]}
192
+ />
193
+ }
194
+ />
195
+ {search.depositAddressId && resource === 'deposits' ? (
196
+ <div className="flex min-w-0 items-center justify-between gap-3 border-x border-b border-border bg-surface px-3 py-2 text-label-13">
197
+ <span className="min-w-0 truncate text-foreground-secondary">
198
+ Deposits for <code className="text-foreground">{search.depositAddressId}</code>
199
+ </span>
200
+ <Button
201
+ aria-label="Show all deposits"
202
+ onClick={() =>
203
+ void navigate({
204
+ replace: true,
205
+ search: (current) => ({ ...current, depositAddressId: undefined }),
206
+ })
207
+ }
208
+ size="small"
209
+ >
210
+ Clear
211
+ </Button>
212
+ </div>
213
+ ) : null}
214
+ {resource === 'transfers' ? (
215
+ <TransferList onSelect={select} search={search} />
216
+ ) : resource === 'deposits' ? (
217
+ <DepositList onSelect={select} search={search} />
218
+ ) : (
219
+ <DepositAddressList onSelect={select} search={search} />
220
+ )}
221
+ </div>
222
+ {search.selected ? (
223
+ resource === 'transfers' ? (
224
+ <TransferDetail id={search.selected} onClose={closeDetail} />
225
+ ) : resource === 'deposits' ? (
226
+ <DepositDetail id={search.selected} onClose={closeDetail} />
227
+ ) : (
228
+ <DepositAddressDetail
229
+ id={search.selected}
230
+ onClose={closeDetail}
231
+ onViewDeposits={() =>
232
+ void navigate({
233
+ search: (current) => ({
234
+ ...current,
235
+ depositAddressId: search.selected,
236
+ resource: 'deposits',
237
+ selected: undefined,
238
+ statuses: undefined,
239
+ }),
240
+ })
241
+ }
242
+ />
243
+ )
244
+ ) : null}
245
+ </Page>
246
+ )
247
+ }
248
+
249
+ function SummaryCards(options: SummaryCards.Props) {
250
+ if (options.error)
251
+ return (
252
+ <div
253
+ className="border border-negative bg-negative-subtle px-4 py-3 text-copy-14 text-negative"
254
+ role="alert"
255
+ >
256
+ {options.error.message}
257
+ </div>
258
+ )
259
+ return (
260
+ <div className="grid divide-y divide-border border border-border sm:grid-cols-2 sm:divide-x sm:divide-y-0">
261
+ <SummaryCard
262
+ label="In progress"
263
+ loading={options.loading}
264
+ onClick={() => options.onSelect('inProgress')}
265
+ selected={options.selected === 'inProgress'}
266
+ >
267
+ {options.summary?.inProgress.toLocaleString() ?? '0'}
268
+ </SummaryCard>
269
+ <SummaryCard
270
+ label="Needs attention"
271
+ loading={options.loading}
272
+ onClick={() => options.onSelect('needsAttention')}
273
+ selected={options.selected === 'needsAttention'}
274
+ tone="negative"
275
+ >
276
+ {options.summary?.actionRequired.toLocaleString() ?? '0'}
277
+ </SummaryCard>
278
+ </div>
279
+ )
280
+ }
281
+
282
+ declare namespace SummaryCards {
283
+ type Props = {
284
+ error: Error | null
285
+ loading: boolean
286
+ onSelect: (work: 'inProgress' | 'needsAttention') => void
287
+ selected: 'inProgress' | 'needsAttention' | null
288
+ summary: Routes.summary.Data['resources'][keyof Routes.summary.Data['resources']] | undefined
289
+ }
290
+ }
291
+
292
+ function SummaryCard(options: SummaryCard.Props) {
293
+ return (
294
+ <button
295
+ aria-pressed={options.selected}
296
+ className="flex min-h-24 min-w-0 cursor-pointer flex-col justify-between gap-3 bg-surface p-4 text-left transition-colors hover:bg-surface-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus aria-pressed:bg-secondary"
297
+ onClick={options.onClick}
298
+ type="button"
299
+ >
300
+ <span className="text-label-12 text-foreground-secondary">{options.label}</span>
301
+ <span
302
+ className={
303
+ options.tone === 'negative'
304
+ ? 'truncate text-heading-24 text-negative'
305
+ : 'truncate text-heading-24 text-foreground'
306
+ }
307
+ >
308
+ {options.loading ? '—' : options.children}
309
+ </span>
310
+ </button>
311
+ )
312
+ }
313
+
314
+ declare namespace SummaryCard {
315
+ type Props = {
316
+ children: ReactNode
317
+ label: string
318
+ loading: boolean
319
+ onClick: () => void
320
+ selected: boolean
321
+ tone?: 'negative' | undefined
322
+ }
323
+ }
324
+
325
+ function Filters(options: Filters.Props) {
326
+ const [draft, setDraft] = useState<Routes.Search>(options.search)
327
+ const timeout = useRef<ReturnType<typeof setTimeout>>(undefined)
328
+ const statuses = statusItems(options.resource)
329
+ const count = Object.values(filterSearch(options.search, options.resource)).filter(Boolean).length
330
+
331
+ useEffect(() => {
332
+ if (timeout.current) clearTimeout(timeout.current)
333
+ setDraft(options.search)
334
+ }, [options.search])
335
+ useEffect(
336
+ () => () => {
337
+ if (timeout.current) clearTimeout(timeout.current)
338
+ },
339
+ [],
340
+ )
341
+
342
+ function update(next: Routes.Search) {
343
+ setDraft(next)
344
+ if (timeout.current) clearTimeout(timeout.current)
345
+ timeout.current = setTimeout(() => options.onChange(filterSearch(next, options.resource)), 300)
346
+ }
347
+
348
+ return (
349
+ <BaseCollapsible.Root className="min-w-0">
350
+ <div className="flex min-w-0 items-stretch border-b border-border">
351
+ <div className="min-w-0 flex-1 overflow-x-auto overflow-y-hidden">{options.tabs}</div>
352
+ <BaseCollapsible.Trigger className="group flex shrink-0 cursor-pointer items-center gap-2 px-3 text-label-13 text-foreground-secondary hover:text-foreground focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus data-[panel-open]:text-foreground">
353
+ <SlidersHorizontal className="size-4 text-foreground-secondary" />
354
+ <span>Filters</span>
355
+ {count ? <Tag>{count} active</Tag> : null}
356
+ <ChevronDown className="size-4 text-foreground-secondary transition-transform group-data-[panel-open]:rotate-180" />
357
+ </BaseCollapsible.Trigger>
358
+ </div>
359
+ <BaseCollapsible.Panel>
360
+ <div className="flex flex-col gap-3 border-b border-border p-4">
361
+ <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-4">
362
+ <label className="flex min-w-0 flex-col gap-1.5 lg:col-span-2">
363
+ <span className="text-label-12 text-foreground-secondary">Search</span>
364
+ <Input
365
+ aria-label="Search routes"
366
+ onChange={(event) => update({ ...draft, query: event.target.value })}
367
+ placeholder="Resource id, address, or transaction"
368
+ value={draft.query ?? ''}
369
+ />
370
+ </label>
371
+ <FilterMenu
372
+ empty="All environments"
373
+ label="Environment"
374
+ onChange={(environments) =>
375
+ update({
376
+ ...draft,
377
+ environments: environments as Routes.Search['environments'],
378
+ })
379
+ }
380
+ items={[
381
+ { label: 'Production', value: 'production' },
382
+ { label: 'Sandbox', value: 'sandbox' },
383
+ ]}
384
+ value={draft.environments ?? []}
385
+ />
386
+ <FilterMenu
387
+ empty={options.resource === 'transfers' ? 'Default statuses' : 'All statuses'}
388
+ label="Status"
389
+ onChange={(statuses) =>
390
+ update({
391
+ ...draft,
392
+ inProgress: undefined,
393
+ needsAttention: undefined,
394
+ statuses: statuses as Routes.Search['statuses'],
395
+ })
396
+ }
397
+ items={statuses}
398
+ value={draft.statuses ?? []}
399
+ />
400
+ <FilterMenu
401
+ empty="All providers"
402
+ label="Provider"
403
+ onChange={(providers) => update({ ...draft, providers })}
404
+ items={providerItems}
405
+ value={draft.providers ?? []}
406
+ />
407
+ <FilterMenu
408
+ empty="All source chains"
409
+ label="Source chain"
410
+ onChange={(sourceChains) => update({ ...draft, sourceChains })}
411
+ items={[
412
+ { label: 'Ethereum', value: `eip155:${mainnet.id}` },
413
+ { label: 'Base', value: `eip155:${base.id}` },
414
+ { label: 'Tempo', value: `eip155:${tempo.id}` },
415
+ ]}
416
+ value={draft.sourceChains ?? []}
417
+ />
418
+ <label className="flex min-w-0 flex-col gap-1.5">
419
+ <span className="text-label-12 text-foreground-secondary">Organization ID</span>
420
+ <Input
421
+ aria-label="Organization ID"
422
+ onChange={(event) => update({ ...draft, orgId: event.target.value })}
423
+ placeholder="org_…"
424
+ value={draft.orgId ?? ''}
425
+ />
426
+ </label>
427
+ <label className="flex min-w-0 flex-col gap-1.5">
428
+ <span className="text-label-12 text-foreground-secondary">Project ID</span>
429
+ <Input
430
+ aria-label="Project ID"
431
+ onChange={(event) => update({ ...draft, projectId: event.target.value })}
432
+ placeholder="prj_…"
433
+ value={draft.projectId ?? ''}
434
+ />
435
+ </label>
436
+ <FilterSelect
437
+ label="Work"
438
+ onChange={(work) =>
439
+ update({
440
+ ...draft,
441
+ inProgress: work === 'inProgress' ? 'true' : undefined,
442
+ needsAttention: work === 'needsAttention' ? 'true' : undefined,
443
+ statuses: undefined,
444
+ })
445
+ }
446
+ items={[
447
+ { label: 'All work', value: '' },
448
+ { label: 'In progress', value: 'inProgress' },
449
+ { label: 'Needs attention', value: 'needsAttention' },
450
+ ]}
451
+ value={draft.inProgress ? 'inProgress' : draft.needsAttention ? 'needsAttention' : ''}
452
+ />
453
+ {options.resource === 'transfers' ? (
454
+ <FilterMenu
455
+ empty="All methods"
456
+ label="Method"
457
+ onChange={(methods) =>
458
+ update({ ...draft, methods: methods as Routes.Search['methods'] })
459
+ }
460
+ items={[
461
+ { label: 'Wallet transaction', value: 'transaction' },
462
+ { label: 'Deposit address', value: 'depositAddress' },
463
+ ]}
464
+ value={draft.methods ?? []}
465
+ />
466
+ ) : null}
467
+ <div className="flex items-end justify-end lg:col-start-4">
468
+ <Button onClick={() => update({})} type="button">
469
+ Clear filters
470
+ </Button>
471
+ </div>
472
+ </div>
473
+ </div>
474
+ </BaseCollapsible.Panel>
475
+ </BaseCollapsible.Root>
476
+ )
477
+ }
478
+
479
+ declare namespace Filters {
480
+ type Props = {
481
+ onChange: (search: Routes.Search) => void
482
+ resource: Resource
483
+ search: Routes.Search
484
+ tabs: ReactNode
485
+ }
486
+ }
487
+
488
+ function FilterMenu(options: FilterMenu.Props) {
489
+ const selected = options.items.filter((item) => options.value.includes(item.value))
490
+ const value =
491
+ selected.length === 0
492
+ ? options.empty
493
+ : selected.length === 1
494
+ ? selected[0]!.label
495
+ : `${selected.length} selected`
496
+ return (
497
+ <div className="flex min-w-0 flex-col gap-1.5">
498
+ <span className="text-label-12 text-foreground-secondary">{options.label}</span>
499
+ <BaseMenu.Root>
500
+ <BaseMenu.Trigger
501
+ aria-label={options.label}
502
+ className="flex h-10 w-full cursor-pointer items-center gap-2 border-2 border-transparent bg-secondary px-3 text-copy-14 text-foreground outline-none hover:bg-secondary-hover active:bg-secondary-active focus-visible:border-focus focus-visible:bg-secondary-hover"
503
+ >
504
+ <span className="min-w-0 flex-1 truncate text-left">{value}</span>
505
+ <ChevronDown className="size-4 shrink-0 text-foreground-secondary" />
506
+ </BaseMenu.Trigger>
507
+ <BaseMenu.Portal>
508
+ <BaseMenu.Positioner align="start" className="z-50 outline-none" sideOffset={4}>
509
+ <BaseMenu.Popup className="max-h-72 min-w-[var(--anchor-width)] overflow-auto border border-border bg-surface py-1 shadow-lg outline-none">
510
+ {options.items.map((item) => (
511
+ <BaseMenu.CheckboxItem
512
+ checked={options.value.includes(item.value)}
513
+ className="flex cursor-pointer items-center gap-2 px-3 py-2 text-label-14 text-foreground outline-none data-[highlighted]:bg-secondary-hover"
514
+ closeOnClick={false}
515
+ key={item.value}
516
+ label={item.label}
517
+ onCheckedChange={(checked) =>
518
+ options.onChange(
519
+ checked
520
+ ? [...options.value, item.value]
521
+ : options.value.filter((value) => value !== item.value),
522
+ )
523
+ }
524
+ >
525
+ <span className="grid size-4 shrink-0 place-items-center border border-border">
526
+ <BaseMenu.CheckboxItemIndicator>
527
+ <Check className="size-3" />
528
+ </BaseMenu.CheckboxItemIndicator>
529
+ </span>
530
+ {item.label}
531
+ </BaseMenu.CheckboxItem>
532
+ ))}
533
+ </BaseMenu.Popup>
534
+ </BaseMenu.Positioner>
535
+ </BaseMenu.Portal>
536
+ </BaseMenu.Root>
537
+ </div>
538
+ )
539
+ }
540
+
541
+ declare namespace FilterMenu {
542
+ type Props = {
543
+ empty: string
544
+ items: readonly { label: string; value: string }[]
545
+ label: string
546
+ onChange: (value: readonly string[]) => void
547
+ value: readonly string[]
548
+ }
549
+ }
550
+
551
+ function FilterSelect(options: FilterSelect.Props) {
552
+ return (
553
+ <label className="flex min-w-0 flex-col gap-1.5">
554
+ <span className="text-label-12 text-foreground-secondary">{options.label}</span>
555
+ <Select
556
+ aria-label={options.label}
557
+ className="w-full"
558
+ items={options.items}
559
+ onChange={options.onChange}
560
+ value={options.value}
561
+ />
562
+ </label>
563
+ )
564
+ }
565
+
566
+ declare namespace FilterSelect {
567
+ type Props = {
568
+ items: readonly { label: string; value: string }[]
569
+ label: string
570
+ onChange: (value: string) => void
571
+ value: string
572
+ }
573
+ }
574
+
575
+ function TransferList(options: ResourceList.Props) {
576
+ const selectedStatuses = transferStatuses.filter((status) =>
577
+ options.search.statuses?.includes(status),
578
+ )
579
+ const statuses =
580
+ selectedStatuses.length > 0
581
+ ? selectedStatuses
582
+ : options.search.inProgress || options.search.needsAttention
583
+ ? undefined
584
+ : defaultTransferStatuses
585
+ const query = useInfiniteQuery(
586
+ Routes.listTransfers.options({
587
+ ...commonFilters(options.search, 'transfers'),
588
+ query: options.search.query,
589
+ statuses,
590
+ }),
591
+ )
592
+ const records = query.data?.pages.flatMap((page) => page.data) ?? []
593
+ return (
594
+ <ResourceList
595
+ empty="No route transfers match these filters."
596
+ error={query.error}
597
+ hasNextPage={query.hasNextPage}
598
+ loading={query.isPending}
599
+ loadingMore={query.isFetchingNextPage}
600
+ onLoadMore={() => query.fetchNextPage()}
601
+ >
602
+ {records.length ? (
603
+ <table className="w-full min-w-[720px] border-collapse text-left">
604
+ <TableHead
605
+ columns={['Status', 'Route', 'Source amount', 'Provider', 'Organization', 'Updated']}
606
+ />
607
+ <tbody>
608
+ {records.map((record) => (
609
+ <ResourceRow id={record.id} key={record.id} onSelect={options.onSelect}>
610
+ <StatusCell status={record.status} />
611
+ <RouteCell record={record} />
612
+ <td className="px-3 py-3 text-label-13 text-foreground">
613
+ {amountLabel(record.sourceAmount, record.sourceToken.symbol)}
614
+ </td>
615
+ <td className="px-3 py-3 text-label-13 text-foreground-secondary">
616
+ {record.provider.name}
617
+ </td>
618
+ <AttributionCell organization={record.organization} project={record.project} />
619
+ <td className="whitespace-nowrap px-3 py-3 text-label-12 text-foreground-secondary">
620
+ <time dateTime={record.updatedAt} title={dateTime(record.updatedAt)}>
621
+ {age(record.updatedAt)}
622
+ </time>
623
+ </td>
624
+ </ResourceRow>
625
+ ))}
626
+ </tbody>
627
+ </table>
628
+ ) : undefined}
629
+ </ResourceList>
630
+ )
631
+ }
632
+
633
+ function DepositList(options: ResourceList.Props) {
634
+ const statuses = depositStatuses.filter((status) => options.search.statuses?.includes(status))
635
+ const query = useInfiniteQuery(
636
+ Routes.listDeposits.options({
637
+ ...commonFilters(options.search, 'deposits'),
638
+ depositAddressId: options.search.depositAddressId,
639
+ query: options.search.query,
640
+ statuses: statuses.length ? statuses : undefined,
641
+ }),
642
+ )
643
+ const records = query.data?.pages.flatMap((page) => page.data) ?? []
644
+ return (
645
+ <ResourceList
646
+ empty="No route deposits match these filters."
647
+ error={query.error}
648
+ hasNextPage={query.hasNextPage}
649
+ loading={query.isPending}
650
+ loadingMore={query.isFetchingNextPage}
651
+ onLoadMore={() => query.fetchNextPage()}
652
+ >
653
+ {records.length ? (
654
+ <table className="w-full min-w-[720px] border-collapse text-left">
655
+ <TableHead
656
+ columns={['Status', 'Route', 'Source amount', 'Provider', 'Organization', 'Updated']}
657
+ />
658
+ <tbody>
659
+ {records.map((record) => (
660
+ <ResourceRow id={record.id} key={record.id} onSelect={options.onSelect}>
661
+ <StatusCell status={record.status} />
662
+ <RouteCell record={record} />
663
+ <td className="px-3 py-3 text-label-13 text-foreground">
664
+ {record.sourceAmount
665
+ ? amountLabel(record.sourceAmount, record.sourceToken.symbol)
666
+ : 'Pending'}
667
+ </td>
668
+ <td className="px-3 py-3 text-label-13 text-foreground-secondary">
669
+ {record.provider.name}
670
+ </td>
671
+ <AttributionCell organization={record.organization} project={record.project} />
672
+ <td className="whitespace-nowrap px-3 py-3 text-label-12 text-foreground-secondary">
673
+ <time dateTime={record.updatedAt} title={dateTime(record.updatedAt)}>
674
+ {age(record.updatedAt)}
675
+ </time>
676
+ </td>
677
+ </ResourceRow>
678
+ ))}
679
+ </tbody>
680
+ </table>
681
+ ) : undefined}
682
+ </ResourceList>
683
+ )
684
+ }
685
+
686
+ function DepositAddressList(options: ResourceList.Props) {
687
+ const statuses = depositAddressStatuses.filter((status) =>
688
+ options.search.statuses?.includes(status),
689
+ )
690
+ const query = useInfiniteQuery(
691
+ Routes.listDepositAddresses.options({
692
+ ...commonFilters(options.search, 'deposit-addresses'),
693
+ query: options.search.query,
694
+ statuses: statuses.length ? statuses : undefined,
695
+ }),
696
+ )
697
+ const records = query.data?.pages.flatMap((page) => page.data) ?? []
698
+ return (
699
+ <ResourceList
700
+ empty="No route deposit addresses match these filters."
701
+ error={query.error}
702
+ hasNextPage={query.hasNextPage}
703
+ loading={query.isPending}
704
+ loadingMore={query.isFetchingNextPage}
705
+ onLoadMore={() => query.fetchNextPage()}
706
+ >
707
+ {records.length ? (
708
+ <table className="w-full min-w-[820px] border-collapse text-left">
709
+ <TableHead
710
+ columns={[
711
+ 'Status',
712
+ 'Deposit address',
713
+ 'Route',
714
+ 'Provider',
715
+ 'Polling',
716
+ 'Organization',
717
+ 'Updated',
718
+ ]}
719
+ />
720
+ <tbody>
721
+ {records.map((record) => (
722
+ <ResourceRow id={record.id} key={record.id} onSelect={options.onSelect}>
723
+ <StatusCell status={record.status} />
724
+ <td className="px-3 py-3">
725
+ <CopyAddress value={record.address} />
726
+ </td>
727
+ <RouteCell record={record} />
728
+ <td className="px-3 py-3 text-label-13 text-foreground-secondary">
729
+ {record.provider.name}
730
+ </td>
731
+ <td className="whitespace-nowrap px-3 py-3 text-label-12 text-foreground-secondary">
732
+ {record.consecutivePollFailures
733
+ ? `${record.consecutivePollFailures} failed checks`
734
+ : `Next ${age(record.nextPollAt)}`}
735
+ </td>
736
+ <AttributionCell organization={record.organization} project={record.project} />
737
+ <td className="whitespace-nowrap px-3 py-3 text-label-12 text-foreground-secondary">
738
+ <time dateTime={record.updatedAt} title={dateTime(record.updatedAt)}>
739
+ {age(record.updatedAt)}
740
+ </time>
741
+ </td>
742
+ </ResourceRow>
743
+ ))}
744
+ </tbody>
745
+ </table>
746
+ ) : undefined}
747
+ </ResourceList>
748
+ )
749
+ }
750
+
751
+ function ResourceList(options: ResourceList.ContainerProps) {
752
+ if (options.loading) return <Notice>Loading routes records…</Notice>
753
+ if (options.error)
754
+ return (
755
+ <div
756
+ className="flex items-center justify-center gap-3 border-y border-border px-4 py-12 text-copy-14 text-negative"
757
+ role="alert"
758
+ >
759
+ {options.error.message}
760
+ </div>
761
+ )
762
+ return (
763
+ <div className="flex flex-col gap-4">
764
+ <div className="overflow-x-auto border-b border-border">
765
+ {options.children ?? <Notice>{options.empty}</Notice>}
766
+ </div>
767
+ {options.hasNextPage ? (
768
+ <Button className="self-center" loading={options.loadingMore} onClick={options.onLoadMore}>
769
+ Load more
770
+ </Button>
771
+ ) : null}
772
+ </div>
773
+ )
774
+ }
775
+
776
+ declare namespace ResourceList {
777
+ type Props = {
778
+ onSelect: (id: string) => void
779
+ search: Routes.Search
780
+ }
781
+ type ContainerProps = {
782
+ children?: ReactNode | undefined
783
+ empty: string
784
+ error: Error | null
785
+ hasNextPage: boolean
786
+ loading: boolean
787
+ loadingMore: boolean
788
+ onLoadMore: () => unknown
789
+ }
790
+ }
791
+
792
+ function TableHead(options: TableHead.Props) {
793
+ return (
794
+ <thead>
795
+ <tr className="border-b border-border">
796
+ {options.columns.map((column) => (
797
+ <th
798
+ className="whitespace-nowrap px-3 py-2 text-label-12 font-normal text-foreground-secondary"
799
+ key={column}
800
+ scope="col"
801
+ >
802
+ {column}
803
+ </th>
804
+ ))}
805
+ </tr>
806
+ </thead>
807
+ )
808
+ }
809
+
810
+ declare namespace TableHead {
811
+ type Props = { columns: readonly string[] }
812
+ }
813
+
814
+ function ResourceRow(options: ResourceRow.Props) {
815
+ return (
816
+ <tr
817
+ aria-label={`View ${options.id}`}
818
+ className="cursor-pointer border-b border-border transition-colors last:border-b-0 hover:bg-surface-hover focus-visible:bg-surface-hover focus-visible:outline focus-visible:outline-2 focus-visible:-outline-offset-2 focus-visible:outline-focus"
819
+ onClick={() => options.onSelect(options.id)}
820
+ onKeyDown={(event) => {
821
+ if (event.currentTarget !== event.target || !['Enter', ' '].includes(event.key)) return
822
+ event.preventDefault()
823
+ options.onSelect(options.id)
824
+ }}
825
+ tabIndex={0}
826
+ >
827
+ {options.children}
828
+ </tr>
829
+ )
830
+ }
831
+
832
+ declare namespace ResourceRow {
833
+ type Props = {
834
+ children: ReactNode
835
+ id: string
836
+ onSelect: (id: string) => void
837
+ }
838
+ }
839
+
840
+ function CopyAddress(options: CopyAddress.Props) {
841
+ return (
842
+ <span
843
+ className="flex max-w-44 items-center gap-1.5 font-mono text-label-12 text-foreground-secondary"
844
+ title={options.value}
845
+ >
846
+ <span className="truncate">{truncate(options.value)}</span>
847
+ <CopyButton value={options.value} />
848
+ </span>
849
+ )
850
+ }
851
+
852
+ declare namespace CopyAddress {
853
+ type Props = { value: string }
854
+ }
855
+
856
+ function CopyButton(options: CopyButton.Props) {
857
+ const { copy, notifying } = useCopy()
858
+ return (
859
+ <button
860
+ aria-label={`Copy ${options.value}`}
861
+ className="shrink-0 cursor-pointer text-foreground-secondary hover:text-foreground"
862
+ onClick={(event) => {
863
+ event.stopPropagation()
864
+ void copy(options.value)
865
+ }}
866
+ title="Copy address"
867
+ type="button"
868
+ >
869
+ {notifying ? <Check className="size-3 shrink-0" /> : <CopyIcon className="size-3 shrink-0" />}
870
+ </button>
871
+ )
872
+ }
873
+
874
+ declare namespace CopyButton {
875
+ type Props = { value: string }
876
+ }
877
+
878
+ function StatusCell(options: StatusCell.Props) {
879
+ return (
880
+ <td className="px-3 py-3">
881
+ <StatusBadge status={options.status} />
882
+ </td>
883
+ )
884
+ }
885
+
886
+ declare namespace StatusCell {
887
+ type Props = { status: string }
888
+ }
889
+
890
+ function RouteCell(options: RouteCell.Props) {
891
+ const { destinationChain, destinationToken, sourceChain, sourceToken } = options.record
892
+ return (
893
+ <td className="px-3 py-3">
894
+ <span className="flex items-center gap-1.5 whitespace-nowrap">
895
+ <Tag>{sourceChain.name}</Tag>
896
+ <Tag>{sourceToken.symbol}</Tag>
897
+ <ArrowRight className="mx-0.5 size-3.5 shrink-0 text-foreground-secondary" />
898
+ <Tag>{destinationChain.name}</Tag>
899
+ <Tag>{destinationToken.symbol}</Tag>
900
+ </span>
901
+ </td>
902
+ )
903
+ }
904
+
905
+ declare namespace RouteCell {
906
+ type Props = {
907
+ record: Pick<
908
+ Routes.listTransfers.Item,
909
+ 'destinationChain' | 'destinationToken' | 'sourceChain' | 'sourceToken'
910
+ >
911
+ }
912
+ }
913
+
914
+ function AttributionCell(options: AttributionCell.Props) {
915
+ return (
916
+ <td className="px-3 py-3">
917
+ <span className="flex min-w-32 flex-col gap-0.5">
918
+ <Link
919
+ className="truncate text-label-13 text-foreground hover:underline"
920
+ onClick={(event) => event.stopPropagation()}
921
+ params={{ orgId: options.organization.id }}
922
+ search={{}}
923
+ to="/organizations/$orgId"
924
+ >
925
+ {options.organization.name ?? options.organization.id}
926
+ </Link>
927
+ {options.project ? (
928
+ <span className="truncate text-label-12 text-foreground-secondary">
929
+ {options.project.name ?? options.project.id}
930
+ </span>
931
+ ) : null}
932
+ </span>
933
+ </td>
934
+ )
935
+ }
936
+
937
+ declare namespace AttributionCell {
938
+ type Props = Pick<Routes.listTransfers.Item, 'organization' | 'project'>
939
+ }
940
+
941
+ function StatusBadge(options: StatusBadge.Props) {
942
+ const intent =
943
+ options.status === 'completed'
944
+ ? 'positive'
945
+ : options.status === 'active' || options.status === 'awaiting-source'
946
+ ? 'info'
947
+ : options.status === 'action-required'
948
+ ? 'negative'
949
+ : isWorking(options.status)
950
+ ? 'warning'
951
+ : 'neutral'
952
+ return <Tag intent={intent}>{label(options.status)}</Tag>
953
+ }
954
+
955
+ declare namespace StatusBadge {
956
+ type Props = { status: string }
957
+ }
958
+
959
+ function TransferDetail(options: DetailProps) {
960
+ const query = useQuery(Routes.getTransfer.options(options.id))
961
+ const record = query.data
962
+ return (
963
+ <DetailDrawer
964
+ error={query.error}
965
+ loading={query.isPending}
966
+ onClose={options.onClose}
967
+ title="Route transfer"
968
+ >
969
+ {record ? (
970
+ <>
971
+ <DetailHeader id={record.id} status={record.status} />
972
+ {record.statusReason ? <Reason reason={record.statusReason.message} /> : null}
973
+ <DetailSection title="Route">
974
+ <Detail label="Provider">{record.provider.name}</Detail>
975
+ <Detail label="Environment">{label(record.environment)}</Detail>
976
+ <Detail label="Source">{routeSource(record)}</Detail>
977
+ <Detail label="Destination">{routeDestination(record)}</Detail>
978
+ <Detail label="Source amount">
979
+ {amountLabel(record.sourceAmount, record.sourceToken.symbol)}
980
+ </Detail>
981
+ <Detail label="Destination amount">
982
+ {record.destinationAmount
983
+ ? amountLabel(record.destinationAmount, record.destinationToken.symbol)
984
+ : 'Pending'}
985
+ </Detail>
986
+ <Detail label="Method">{label(record.method)}</Detail>
987
+ <Detail label="Mode">{label(record.mode)}</Detail>
988
+ </DetailSection>
989
+ <Ownership organization={record.organization} project={record.project} />
990
+ <DetailSection title="Accounts">
991
+ <Detail label="Sender">
992
+ {record.sender ? (
993
+ <ExplorerLink
994
+ chainId={record.sourceChain.id}
995
+ type="address"
996
+ value={record.sender}
997
+ />
998
+ ) : (
999
+ 'Not recorded'
1000
+ )}
1001
+ </Detail>
1002
+ <Detail label="Recipient">
1003
+ <ExplorerLink
1004
+ chainId={record.destinationChain.id}
1005
+ type="address"
1006
+ value={record.recipient}
1007
+ />
1008
+ </Detail>
1009
+ <Detail label="Refund address">
1010
+ {record.refundAddress ? (
1011
+ <ExplorerLink
1012
+ chainId={record.sourceChain.id}
1013
+ type="address"
1014
+ value={record.refundAddress}
1015
+ />
1016
+ ) : (
1017
+ 'Not configured'
1018
+ )}
1019
+ </Detail>
1020
+ </DetailSection>
1021
+ <DetailSection title="Processing">
1022
+ <Detail label="Subsidies">
1023
+ {record.subsidies.length ? (
1024
+ <ul className="flex flex-col gap-1">
1025
+ {record.subsidies.map((subsidy) => (
1026
+ <li key={`${subsidy.provider}:${subsidy.token.tokenKey}`}>
1027
+ {label(subsidy.provider)}: {amountLabel(subsidy.amount, subsidy.token.symbol)}
1028
+ </li>
1029
+ ))}
1030
+ </ul>
1031
+ ) : (
1032
+ 'None'
1033
+ )}
1034
+ </Detail>
1035
+ </DetailSection>
1036
+ <TransactionList
1037
+ transactions={record.transactions.map(({ chainId, role, transactionRef }) => ({
1038
+ chainId,
1039
+ roles: [role],
1040
+ transactionRef,
1041
+ }))}
1042
+ />
1043
+ <section className="flex flex-col gap-3">
1044
+ <h3 className="text-heading-16 text-foreground">Lifecycle</h3>
1045
+ <ol className="flex flex-col border-l border-border pl-4">
1046
+ {record.events.map((event) => (
1047
+ <li className="relative flex flex-col gap-1 pb-4 last:pb-0" key={event.version}>
1048
+ <span className="absolute -left-[19px] top-1.5 size-2 bg-foreground-secondary" />
1049
+ <span className="text-label-13 text-foreground">{label(event.status)}</span>
1050
+ <time
1051
+ className="text-label-12 text-foreground-secondary"
1052
+ dateTime={event.createdAt}
1053
+ >
1054
+ {dateTime(event.createdAt)}
1055
+ </time>
1056
+ {event.statusReason ? (
1057
+ <span className="text-copy-13 text-foreground-secondary">
1058
+ {event.statusReason.message}
1059
+ </span>
1060
+ ) : null}
1061
+ </li>
1062
+ ))}
1063
+ </ol>
1064
+ </section>
1065
+ </>
1066
+ ) : null}
1067
+ </DetailDrawer>
1068
+ )
1069
+ }
1070
+
1071
+ function DepositDetail(options: DetailProps) {
1072
+ const navigate = useNavigate({ from: Route.fullPath })
1073
+ const query = useQuery(Routes.getDeposit.options(options.id))
1074
+ const record = query.data
1075
+ return (
1076
+ <DetailDrawer
1077
+ error={query.error}
1078
+ loading={query.isPending}
1079
+ onClose={options.onClose}
1080
+ title="Route deposit"
1081
+ >
1082
+ {record ? (
1083
+ <>
1084
+ <DetailHeader id={record.id} status={record.status} />
1085
+ {record.statusReason ? <Reason reason={record.statusReason.message} /> : null}
1086
+ <DetailSection title="Route">
1087
+ <Detail label="Provider">{record.provider.name}</Detail>
1088
+ <Detail label="Environment">{label(record.environment)}</Detail>
1089
+ <Detail label="Source">{routeSource(record)}</Detail>
1090
+ <Detail label="Destination">{routeDestination(record)}</Detail>
1091
+ <Detail label="Source amount">
1092
+ {record.sourceAmount
1093
+ ? amountLabel(record.sourceAmount, record.sourceToken.symbol)
1094
+ : 'Pending'}
1095
+ </Detail>
1096
+ <Detail label="Destination amount">
1097
+ {record.destinationAmount
1098
+ ? amountLabel(record.destinationAmount, record.destinationToken.symbol)
1099
+ : 'Pending'}
1100
+ </Detail>
1101
+ </DetailSection>
1102
+ <Ownership organization={record.organization} project={record.project} />
1103
+ <DetailSection title="Accounts">
1104
+ <Detail label="Sender">
1105
+ {record.sender ? (
1106
+ <ExplorerLink
1107
+ chainId={record.sourceChain.id}
1108
+ type="address"
1109
+ value={record.sender}
1110
+ />
1111
+ ) : (
1112
+ 'Not recorded'
1113
+ )}
1114
+ </Detail>
1115
+ <Detail label="Recipient">
1116
+ <ExplorerLink
1117
+ chainId={record.destinationChain.id}
1118
+ type="address"
1119
+ value={record.recipient}
1120
+ />
1121
+ </Detail>
1122
+ <Detail label="Refund address">
1123
+ <ExplorerLink
1124
+ chainId={record.sourceChain.id}
1125
+ type="address"
1126
+ value={record.refundAddress}
1127
+ />
1128
+ </Detail>
1129
+ </DetailSection>
1130
+ <DetailSection title="Processing">
1131
+ <Detail label="Detected by">
1132
+ {record.detectionTrigger ? label(record.detectionTrigger) : 'Unknown'}
1133
+ </Detail>
1134
+ <Detail label="Poll observed">
1135
+ {record.pollObservedAt ? dateTime(record.pollObservedAt) : 'Not recorded'}
1136
+ </Detail>
1137
+ <Detail label="Provider delivered">
1138
+ {record.providerDeliveredAt ? dateTime(record.providerDeliveredAt) : 'Pending'}
1139
+ </Detail>
1140
+ <Detail label="Subsidies">
1141
+ {record.subsidies.length ? (
1142
+ <ul className="flex flex-col gap-1">
1143
+ {record.subsidies.map((subsidy) => (
1144
+ <li key={`${subsidy.provider}:${subsidy.token.tokenKey}`}>
1145
+ {label(subsidy.provider)}: {amountLabel(subsidy.amount, subsidy.token.symbol)}
1146
+ </li>
1147
+ ))}
1148
+ </ul>
1149
+ ) : (
1150
+ 'None'
1151
+ )}
1152
+ </Detail>
1153
+ <Detail label="Webhook received">
1154
+ {record.webhookReceivedAt ? dateTime(record.webhookReceivedAt) : 'Not received'}
1155
+ </Detail>
1156
+ <Detail label="Retry attempts">{record.retryAttempts ?? 'None'}</Detail>
1157
+ <Detail label="Tempo gas paid">{record.tempoGasPaid ?? 'None'}</Detail>
1158
+ </DetailSection>
1159
+ <button
1160
+ className="w-fit text-label-13 text-foreground-secondary hover:text-foreground hover:underline"
1161
+ onClick={() =>
1162
+ void navigate({
1163
+ search: (current) => ({
1164
+ ...current,
1165
+ resource: 'deposit-addresses',
1166
+ selected: record.depositAddress.id,
1167
+ statuses: undefined,
1168
+ }),
1169
+ })
1170
+ }
1171
+ type="button"
1172
+ >
1173
+ View deposit address
1174
+ </button>
1175
+ <TransactionList transactions={depositTransactions(record)} />
1176
+ </>
1177
+ ) : null}
1178
+ </DetailDrawer>
1179
+ )
1180
+ }
1181
+
1182
+ function DepositAddressDetail(options: DepositAddressDetail.Props) {
1183
+ const query = useQuery(Routes.getDepositAddress.options(options.id))
1184
+ const record = query.data
1185
+ return (
1186
+ <DetailDrawer
1187
+ error={query.error}
1188
+ loading={query.isPending}
1189
+ onClose={options.onClose}
1190
+ title="Deposit address"
1191
+ >
1192
+ {record ? (
1193
+ <>
1194
+ <DetailHeader id={record.id} status={record.status} />
1195
+ <DetailSection title="Route">
1196
+ <Detail label="Provider">{record.provider.name}</Detail>
1197
+ <Detail label="Environment">{label(record.environment)}</Detail>
1198
+ <Detail label="Source">{routeSource(record)}</Detail>
1199
+ <Detail label="Destination">{routeDestination(record)}</Detail>
1200
+ <Detail label="Delivery">{label(record.deliveryStrategy)}</Detail>
1201
+ <Detail label="Subsidized">{record.subsidize ? 'Yes' : 'No'}</Detail>
1202
+ </DetailSection>
1203
+ <Ownership organization={record.organization} project={record.project} />
1204
+ <DetailSection title="Accounts">
1205
+ <Detail label="Deposit address">
1206
+ <span className="flex items-center gap-1.5">
1207
+ <ExplorerLink
1208
+ chainId={record.sourceChain.id}
1209
+ type="address"
1210
+ value={record.address}
1211
+ />
1212
+ <CopyButton value={record.address} />
1213
+ </span>
1214
+ </Detail>
1215
+ <Detail label="Recipient">
1216
+ <ExplorerLink
1217
+ chainId={record.destinationChain.id}
1218
+ type="address"
1219
+ value={record.recipient}
1220
+ />
1221
+ </Detail>
1222
+ <Detail label="Refund address">
1223
+ <ExplorerLink
1224
+ chainId={record.sourceChain.id}
1225
+ type="address"
1226
+ value={record.refundAddress}
1227
+ />
1228
+ </Detail>
1229
+ </DetailSection>
1230
+ <DetailSection title="Polling">
1231
+ <Detail label="Last checked">
1232
+ {record.lastPolledAt ? dateTime(record.lastPolledAt) : 'Never'}
1233
+ </Detail>
1234
+ <Detail label="Next check">{dateTime(record.nextPollAt)}</Detail>
1235
+ <Detail label="Consecutive failures">{record.consecutivePollFailures}</Detail>
1236
+ <Detail label="Lease expires">
1237
+ {record.pollLeaseUntil ? dateTime(record.pollLeaseUntil) : 'No active lease'}
1238
+ </Detail>
1239
+ </DetailSection>
1240
+ <Button onClick={options.onViewDeposits}>View deposits</Button>
1241
+ {record.providerRequestIds.length ? (
1242
+ <DetailSection title="Provider request IDs">
1243
+ {record.providerRequestIds.map((id) => (
1244
+ <Detail key={id} label="Request">
1245
+ {id}
1246
+ </Detail>
1247
+ ))}
1248
+ </DetailSection>
1249
+ ) : null}
1250
+ </>
1251
+ ) : null}
1252
+ </DetailDrawer>
1253
+ )
1254
+ }
1255
+
1256
+ type DetailProps = { id: string; onClose: () => void }
1257
+
1258
+ declare namespace DepositAddressDetail {
1259
+ type Props = DetailProps & { onViewDeposits: () => void }
1260
+ }
1261
+
1262
+ function DetailDrawer(options: DetailDrawer.Props) {
1263
+ return (
1264
+ <BaseDialog.Root onOpenChange={(open) => !open && options.onClose()} open>
1265
+ <BaseDialog.Portal>
1266
+ <BaseDialog.Backdrop className="fixed inset-0 z-40 bg-black/60 transition-opacity duration-150 data-[ending-style]:opacity-0 data-[starting-style]:opacity-0" />
1267
+ <BaseDialog.Popup className="fixed inset-y-0 right-0 z-50 flex w-full max-w-xl flex-col border-l border-border bg-surface outline-none transition-transform duration-200 data-[ending-style]:translate-x-full data-[starting-style]:translate-x-full">
1268
+ <div className="flex shrink-0 items-start justify-between gap-4 border-b border-border px-5 py-4">
1269
+ <div className="min-w-0">
1270
+ <BaseDialog.Title className="text-heading-20 text-foreground">
1271
+ {options.title}
1272
+ </BaseDialog.Title>
1273
+ <BaseDialog.Description className="mt-1 text-copy-13 text-foreground-secondary">
1274
+ Operational details and verified evidence
1275
+ </BaseDialog.Description>
1276
+ </div>
1277
+ <BaseDialog.Close
1278
+ aria-label="Close details"
1279
+ className="flex size-8 shrink-0 items-center justify-center text-foreground-secondary hover:bg-surface-hover hover:text-foreground"
1280
+ >
1281
+ <X className="size-4" />
1282
+ </BaseDialog.Close>
1283
+ </div>
1284
+ <div className="flex min-h-0 flex-1 flex-col gap-6 overflow-y-auto px-5 py-5">
1285
+ {options.loading ? (
1286
+ <Notice>Loading details…</Notice>
1287
+ ) : options.error ? (
1288
+ <div
1289
+ className="border border-negative bg-negative-subtle p-4 text-copy-14 text-negative"
1290
+ role="alert"
1291
+ >
1292
+ {options.error.message}
1293
+ </div>
1294
+ ) : (
1295
+ options.children
1296
+ )}
1297
+ </div>
1298
+ </BaseDialog.Popup>
1299
+ </BaseDialog.Portal>
1300
+ </BaseDialog.Root>
1301
+ )
1302
+ }
1303
+
1304
+ declare namespace DetailDrawer {
1305
+ type Props = {
1306
+ children: ReactNode
1307
+ error: Error | null
1308
+ loading: boolean
1309
+ onClose: () => void
1310
+ title: string
1311
+ }
1312
+ }
1313
+
1314
+ function DetailHeader(options: DetailHeader.Props) {
1315
+ return (
1316
+ <div className="flex min-w-0 items-center justify-between gap-3">
1317
+ <code className="truncate text-label-12 text-foreground-secondary" title={options.id}>
1318
+ {options.id}
1319
+ </code>
1320
+ <StatusBadge status={options.status} />
1321
+ </div>
1322
+ )
1323
+ }
1324
+
1325
+ declare namespace DetailHeader {
1326
+ type Props = { id: string; status: string }
1327
+ }
1328
+
1329
+ function DetailSection(options: DetailSection.Props) {
1330
+ return (
1331
+ <section className="flex flex-col gap-3">
1332
+ <h3 className="text-heading-16 text-foreground">{options.title}</h3>
1333
+ <dl className="grid gap-x-6 gap-y-4 sm:grid-cols-2">{options.children}</dl>
1334
+ </section>
1335
+ )
1336
+ }
1337
+
1338
+ declare namespace DetailSection {
1339
+ type Props = { children: ReactNode; title: string }
1340
+ }
1341
+
1342
+ function Detail(options: Detail.Props) {
1343
+ return (
1344
+ <div className="flex min-w-0 flex-col gap-1">
1345
+ <dt className="text-label-12 text-foreground-secondary">{options.label}</dt>
1346
+ <dd className="min-w-0 break-words text-label-13 text-foreground">{options.children}</dd>
1347
+ </div>
1348
+ )
1349
+ }
1350
+
1351
+ declare namespace Detail {
1352
+ type Props = { children: ReactNode; label: string }
1353
+ }
1354
+
1355
+ function Ownership(options: AttributionCell.Props) {
1356
+ return (
1357
+ <DetailSection title="Ownership">
1358
+ <Detail label="Organization">
1359
+ <Link
1360
+ className="hover:underline"
1361
+ params={{ orgId: options.organization.id }}
1362
+ search={{}}
1363
+ to="/organizations/$orgId"
1364
+ >
1365
+ {options.organization.name ?? options.organization.id}
1366
+ </Link>
1367
+ </Detail>
1368
+ <Detail label="Project">
1369
+ {options.project?.name ?? options.project?.id ?? 'Organization scoped'}
1370
+ </Detail>
1371
+ </DetailSection>
1372
+ )
1373
+ }
1374
+
1375
+ function Reason(options: Reason.Props) {
1376
+ return (
1377
+ <div className="border border-negative bg-negative-subtle p-3 text-copy-13 text-negative">
1378
+ {options.reason}
1379
+ </div>
1380
+ )
1381
+ }
1382
+
1383
+ declare namespace Reason {
1384
+ type Props = { reason: string }
1385
+ }
1386
+
1387
+ function TransactionList(options: TransactionList.Props) {
1388
+ return (
1389
+ <section className="flex flex-col gap-3">
1390
+ <h3 className="text-heading-16 text-foreground">Transactions</h3>
1391
+ {options.transactions.length ? (
1392
+ <ul className="divide-y divide-border border-y border-border">
1393
+ {options.transactions.map((transaction) => (
1394
+ <li
1395
+ className="flex items-center justify-between gap-3 py-3"
1396
+ key={`${transaction.chainId}:${transaction.transactionRef}`}
1397
+ >
1398
+ <span className="text-copy-13 text-foreground-secondary">
1399
+ {transaction.roles.map(label).join(', ')}
1400
+ </span>
1401
+ <ExplorerLink chainId={transaction.chainId} value={transaction.transactionRef} />
1402
+ </li>
1403
+ ))}
1404
+ </ul>
1405
+ ) : (
1406
+ <p className="text-copy-13 text-foreground-secondary">No verified transactions.</p>
1407
+ )}
1408
+ </section>
1409
+ )
1410
+ }
1411
+
1412
+ declare namespace TransactionList {
1413
+ type Props = { transactions: readonly Transaction[] }
1414
+ type Transaction = {
1415
+ chainId: string
1416
+ roles: readonly ('destination' | 'provider' | 'refund' | 'source' | 'subsidizer')[]
1417
+ transactionRef: string
1418
+ }
1419
+ }
1420
+
1421
+ function ExplorerLink(options: ExplorerLink.Props) {
1422
+ const explorer = options.chainId ? explorers[options.chainId] : undefined
1423
+ if (!explorer)
1424
+ return (
1425
+ <code
1426
+ className="max-w-64 truncate text-label-12 text-foreground-secondary"
1427
+ title={options.value}
1428
+ >
1429
+ {truncate(options.value)}
1430
+ </code>
1431
+ )
1432
+ return (
1433
+ <a
1434
+ className="flex min-w-0 items-center gap-1.5 font-mono text-label-12 text-foreground-secondary hover:text-foreground"
1435
+ href={`${explorer[options.type ?? 'tx']}/${options.value}`}
1436
+ rel="noreferrer"
1437
+ target="_blank"
1438
+ title={options.value}
1439
+ >
1440
+ <span className="truncate">{truncate(options.value)}</span>
1441
+ <ExternalLink className="size-3 shrink-0" />
1442
+ </a>
1443
+ )
1444
+ }
1445
+
1446
+ declare namespace ExplorerLink {
1447
+ type Props = {
1448
+ chainId?: string | undefined
1449
+ type?: 'address' | 'tx' | undefined
1450
+ value: string
1451
+ }
1452
+ }
1453
+
1454
+ function depositTransactions(record: Routes.getDeposit.Data): TransactionList.Transaction[] {
1455
+ const destinationHashes = record.destinationTransactionHashes ?? []
1456
+ const destinationTransactions = new Set(destinationHashes.map((hash) => hash.toLowerCase()))
1457
+ const transactions: TransactionList.Transaction[] = [
1458
+ ...record.sourceTransactionHashes.map((transactionRef) => ({
1459
+ chainId: record.sourceChain.id,
1460
+ roles: ['source'] as const,
1461
+ transactionRef,
1462
+ })),
1463
+ ...record.providerTransactionHashes.map((transactionRef) => ({
1464
+ chainId: destinationTransactions.has(transactionRef.toLowerCase())
1465
+ ? record.destinationChain.id
1466
+ : record.sourceChain.id,
1467
+ roles: ['provider'] as const,
1468
+ transactionRef,
1469
+ })),
1470
+ ...destinationHashes.map((transactionRef) => ({
1471
+ chainId: record.destinationChain.id,
1472
+ roles: ['destination'] as const,
1473
+ transactionRef,
1474
+ })),
1475
+ ...(record.settlementTransactionHash
1476
+ ? [
1477
+ {
1478
+ chainId: record.destinationChain.id,
1479
+ roles: ['subsidizer'] as const,
1480
+ transactionRef: record.settlementTransactionHash,
1481
+ },
1482
+ ]
1483
+ : []),
1484
+ ]
1485
+ const unique = new Map<string, TransactionList.Transaction>()
1486
+ for (const transaction of transactions) {
1487
+ const reference = transaction.chainId.startsWith('eip155:')
1488
+ ? transaction.transactionRef.toLowerCase()
1489
+ : transaction.transactionRef
1490
+ const key = `${transaction.chainId}:${reference}`
1491
+ const current = unique.get(key)
1492
+ unique.set(
1493
+ key,
1494
+ current
1495
+ ? {
1496
+ ...current,
1497
+ roles:
1498
+ current.roles.includes('subsidizer') || transaction.roles.includes('subsidizer')
1499
+ ? ['subsidizer']
1500
+ : [...new Set([...current.roles, ...transaction.roles])],
1501
+ }
1502
+ : transaction,
1503
+ )
1504
+ }
1505
+ return [...unique.values()]
1506
+ }
1507
+
1508
+ function commonFilters(search: Routes.Search, resource: Resource) {
1509
+ return {
1510
+ environments: search.environments?.length ? search.environments : undefined,
1511
+ inProgress: search.inProgress,
1512
+ methods: resource === 'transfers' && search.methods?.length ? search.methods : undefined,
1513
+ needsAttention: search.needsAttention,
1514
+ orgId: search.orgId,
1515
+ projectId: search.projectId,
1516
+ providers: search.providers?.length ? search.providers : undefined,
1517
+ sourceChains: search.sourceChains?.length ? search.sourceChains : undefined,
1518
+ }
1519
+ }
1520
+
1521
+ function summaryFilters(search: Routes.Search) {
1522
+ return {
1523
+ environments: search.environments?.length ? search.environments : undefined,
1524
+ methods: search.methods?.length ? search.methods : undefined,
1525
+ orgId: search.orgId,
1526
+ projectId: search.projectId,
1527
+ providers: search.providers?.length ? search.providers : undefined,
1528
+ sourceChains: search.sourceChains?.length ? search.sourceChains : undefined,
1529
+ }
1530
+ }
1531
+
1532
+ function filterSearch(search: Routes.Search, resource: Resource): Routes.Search {
1533
+ return {
1534
+ environments: search.environments?.length ? search.environments : undefined,
1535
+ inProgress: search.inProgress,
1536
+ methods: resource === 'transfers' && search.methods?.length ? search.methods : undefined,
1537
+ needsAttention: search.needsAttention,
1538
+ orgId: search.orgId?.trim() || undefined,
1539
+ projectId: search.projectId?.trim() || undefined,
1540
+ providers: search.providers?.length ? search.providers : undefined,
1541
+ query: search.query?.trim() || undefined,
1542
+ sourceChains: search.sourceChains?.length ? search.sourceChains : undefined,
1543
+ statuses: search.statuses?.length ? search.statuses : undefined,
1544
+ }
1545
+ }
1546
+
1547
+ function statusItems(resource: Resource) {
1548
+ const values =
1549
+ resource === 'transfers'
1550
+ ? transferStatuses
1551
+ : resource === 'deposits'
1552
+ ? depositStatuses
1553
+ : depositAddressStatuses
1554
+ return values.map((status) => ({ label: label(status), value: status }))
1555
+ }
1556
+
1557
+ function isWorking(status: string) {
1558
+ return [
1559
+ 'awaiting-source',
1560
+ 'bridging',
1561
+ 'detected',
1562
+ 'processing',
1563
+ 'refunding',
1564
+ 'settling',
1565
+ ].includes(status)
1566
+ }
1567
+
1568
+ function label(value: string) {
1569
+ return value
1570
+ .replace(/([a-z])([A-Z])/g, '$1 $2')
1571
+ .replaceAll('-', ' ')
1572
+ .replace(/^./, (character) => character.toUpperCase())
1573
+ }
1574
+
1575
+ function routeSource(record: Pick<Routes.listTransfers.Item, 'sourceChain' | 'sourceToken'>) {
1576
+ return `${record.sourceToken.symbol} on ${record.sourceChain.name}`
1577
+ }
1578
+
1579
+ function routeDestination(
1580
+ record: Pick<Routes.listTransfers.Item, 'destinationChain' | 'destinationToken'>,
1581
+ ) {
1582
+ return `${record.destinationToken.symbol} on ${record.destinationChain.name}`
1583
+ }
1584
+
1585
+ function amountLabel(amount: Routes.listTransfers.Item['sourceAmount'], symbol: string) {
1586
+ return `${amount.formatted} ${symbol}`
1587
+ }
1588
+
1589
+ function dateTime(value: string) {
1590
+ return new Intl.DateTimeFormat('en', { dateStyle: 'medium', timeStyle: 'short' }).format(
1591
+ new Date(value),
1592
+ )
1593
+ }
1594
+
1595
+ function age(value: string) {
1596
+ const delta = new Date(value).getTime() - Date.now()
1597
+ const absolute = Math.abs(delta)
1598
+ const [unit, size] =
1599
+ absolute >= 86_400_000
1600
+ ? ['day', 86_400_000]
1601
+ : absolute >= 3_600_000
1602
+ ? ['hour', 3_600_000]
1603
+ : absolute >= 60_000
1604
+ ? ['minute', 60_000]
1605
+ : ['second', 1_000]
1606
+ return new Intl.RelativeTimeFormat('en', { numeric: 'auto' }).format(
1607
+ Math.round(delta / size),
1608
+ unit as Intl.RelativeTimeFormatUnit,
1609
+ )
1610
+ }
1611
+
1612
+ function truncate(value: string) {
1613
+ if (value.length <= 20) return value
1614
+ return `${value.slice(0, 10)}…${value.slice(-8)}`
1615
+ }