tapimo 0.15.0 → 0.18.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 (734) hide show
  1. package/README.md +137 -0
  2. package/dist/ApiKey.d.ts +1 -0
  3. package/dist/ApiKey.d.ts.map +1 -1
  4. package/dist/ApiKey.js +4 -2
  5. package/dist/ApiKey.js.map +1 -1
  6. package/dist/ApiKeys.d.ts +37 -11
  7. package/dist/ApiKeys.d.ts.map +1 -1
  8. package/dist/ApiKeys.js +163 -10
  9. package/dist/ApiKeys.js.map +1 -1
  10. package/dist/App.d.ts +13085 -11974
  11. package/dist/App.d.ts.map +1 -1
  12. package/dist/App.js +46 -15
  13. package/dist/App.js.map +1 -1
  14. package/dist/Scope.d.ts +1 -1
  15. package/dist/Scope.d.ts.map +1 -1
  16. package/dist/Scope.js +1 -1
  17. package/dist/Scope.js.map +1 -1
  18. package/dist/admin/App.d.ts +896 -191
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +5 -1
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +33 -33
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +8 -3
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +66 -27
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  28. package/dist/admin/apps/earn-vaults.js +36 -7
  29. package/dist/admin/apps/earn-vaults.js.map +1 -1
  30. package/dist/admin/apps/organizations.d.ts +25 -25
  31. package/dist/admin/apps/organizations.d.ts.map +1 -1
  32. package/dist/admin/apps/organizations.js +5 -4
  33. package/dist/admin/apps/organizations.js.map +1 -1
  34. package/dist/admin/apps/route-policies.d.ts +632 -0
  35. package/dist/admin/apps/route-policies.d.ts.map +1 -0
  36. package/dist/admin/apps/route-policies.js +257 -0
  37. package/dist/admin/apps/route-policies.js.map +1 -0
  38. package/dist/admin/apps/routes-support.js +39 -3
  39. package/dist/admin/apps/routes-support.js.map +1 -1
  40. package/dist/admin/apps/routes.d.ts +454 -1
  41. package/dist/admin/apps/routes.d.ts.map +1 -1
  42. package/dist/admin/apps/routes.js +82 -1
  43. package/dist/admin/apps/routes.js.map +1 -1
  44. package/dist/admin/apps/verified-tokens.d.ts +10 -4
  45. package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
  46. package/dist/admin/apps/verified-tokens.js +24 -4
  47. package/dist/admin/apps/verified-tokens.js.map +1 -1
  48. package/dist/admin/index.d.ts +0 -1
  49. package/dist/admin/index.d.ts.map +1 -1
  50. package/dist/admin/index.js +0 -1
  51. package/dist/admin/index.js.map +1 -1
  52. package/dist/admin/ui.generated.d.ts +1 -1
  53. package/dist/admin/ui.generated.d.ts.map +1 -1
  54. package/dist/admin/ui.generated.js +99 -103
  55. package/dist/admin/ui.generated.js.map +1 -1
  56. package/dist/analytics/Analytics.d.ts.map +1 -1
  57. package/dist/analytics/Analytics.js +65 -1
  58. package/dist/analytics/Analytics.js.map +1 -1
  59. package/dist/analytics/tables/requestEvents.d.ts +1 -1
  60. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  61. package/dist/analytics/tables/requestEvents.js +58 -59
  62. package/dist/analytics/tables/requestEvents.js.map +1 -1
  63. package/dist/apps/data/App.d.ts +2709 -2670
  64. package/dist/apps/data/App.d.ts.map +1 -1
  65. package/dist/apps/data/routes/activities.d.ts +5 -5
  66. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  67. package/dist/apps/data/routes/activities.js +50 -0
  68. package/dist/apps/data/routes/activities.js.map +1 -1
  69. package/dist/apps/data/routes/addresses.d.ts +248 -248
  70. package/dist/apps/data/routes/balances.d.ts +22 -22
  71. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  72. package/dist/apps/data/routes/balances.js +5 -7
  73. package/dist/apps/data/routes/balances.js.map +1 -1
  74. package/dist/apps/data/routes/coingecko.d.ts +54 -54
  75. package/dist/apps/data/routes/earn.d.ts +103 -12
  76. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  77. package/dist/apps/data/routes/earn.js +456 -220
  78. package/dist/apps/data/routes/earn.js.map +1 -1
  79. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  80. package/dist/apps/data/routes/exchanges.js +267 -97
  81. package/dist/apps/data/routes/exchanges.js.map +1 -1
  82. package/dist/apps/data/routes/fee-amm.d.ts +1 -19
  83. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  84. package/dist/apps/data/routes/fee-amm.js +93 -56
  85. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  86. package/dist/apps/data/routes/indexer.d.ts +10 -10
  87. package/dist/apps/data/routes/rpc.d.ts +30 -30
  88. package/dist/apps/data/routes/rpc.js +45 -11
  89. package/dist/apps/data/routes/rpc.js.map +1 -1
  90. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  91. package/dist/apps/data/routes/tokens.js +11 -6
  92. package/dist/apps/data/routes/tokens.js.map +1 -1
  93. package/dist/apps/data/routes/transactions.d.ts +2 -0
  94. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  95. package/dist/apps/data/routes/transactions.js +30 -22
  96. package/dist/apps/data/routes/transactions.js.map +1 -1
  97. package/dist/apps/data/routes/transfers.d.ts +12 -12
  98. package/dist/apps/data/routes/valuation.d.ts +30 -30
  99. package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
  100. package/dist/apps/data/routes/webhooks.d.ts +1 -1
  101. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  102. package/dist/apps/data/routes/webhooks.js +18 -11
  103. package/dist/apps/data/routes/webhooks.js.map +1 -1
  104. package/dist/apps/data/routes/zones.d.ts +3 -3
  105. package/dist/apps/management/App.d.ts +3043 -2198
  106. package/dist/apps/management/App.d.ts.map +1 -1
  107. package/dist/apps/management/App.js +2 -0
  108. package/dist/apps/management/App.js.map +1 -1
  109. package/dist/apps/management/Billing.d.ts +2 -4
  110. package/dist/apps/management/Billing.d.ts.map +1 -1
  111. package/dist/apps/management/Billing.js +65 -26
  112. package/dist/apps/management/Billing.js.map +1 -1
  113. package/dist/apps/management/routes/api-keys.d.ts +16 -4
  114. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  115. package/dist/apps/management/routes/api-keys.js +70 -11
  116. package/dist/apps/management/routes/api-keys.js.map +1 -1
  117. package/dist/apps/management/routes/billing.d.ts +84 -84
  118. package/dist/apps/management/routes/cli.d.ts +912 -0
  119. package/dist/apps/management/routes/cli.d.ts.map +1 -0
  120. package/dist/apps/management/routes/cli.js +416 -0
  121. package/dist/apps/management/routes/cli.js.map +1 -0
  122. package/dist/apps/management/routes/faucet.d.ts +8 -8
  123. package/dist/apps/management/routes/invitations.d.ts +24 -24
  124. package/dist/apps/management/routes/invite-links.d.ts +66 -66
  125. package/dist/apps/management/routes/members.d.ts +16 -16
  126. package/dist/apps/management/routes/orgs.d.ts +20 -20
  127. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  128. package/dist/apps/management/routes/orgs.js +8 -2
  129. package/dist/apps/management/routes/orgs.js.map +1 -1
  130. package/dist/apps/management/routes/projects.d.ts +76 -76
  131. package/dist/apps/management/routes/usage.d.ts +8 -8
  132. package/dist/apps/management/routes/verified-token-requests.d.ts +42 -42
  133. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  134. package/dist/apps/management/routes/verified-token-requests.js +7 -9
  135. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  136. package/dist/apps/management/routes/webhooks.d.ts +119 -119
  137. package/dist/apps/mcp.d.ts.map +1 -1
  138. package/dist/apps/mcp.js +16 -3
  139. package/dist/apps/mcp.js.map +1 -1
  140. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -1
  141. package/dist/apps/mpp/internal/Policy.js +4 -2
  142. package/dist/apps/mpp/internal/Policy.js.map +1 -1
  143. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -1
  144. package/dist/apps/mpp/internal/Sponsorship.js +6 -4
  145. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -1
  146. package/dist/apps/relay/App.d.ts +8 -0
  147. package/dist/apps/relay/App.d.ts.map +1 -1
  148. package/dist/apps/relay/App.js +16 -4
  149. package/dist/apps/relay/App.js.map +1 -1
  150. package/dist/apps/relay/Sponsorships.d.ts +4 -6
  151. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  152. package/dist/apps/relay/Sponsorships.js +71 -60
  153. package/dist/apps/relay/Sponsorships.js.map +1 -1
  154. package/dist/apps/routes/Access.d.ts +53 -0
  155. package/dist/apps/routes/Access.d.ts.map +1 -1
  156. package/dist/apps/routes/Access.js +121 -0
  157. package/dist/apps/routes/Access.js.map +1 -1
  158. package/dist/apps/routes/App.d.ts +397 -158
  159. package/dist/apps/routes/App.d.ts.map +1 -1
  160. package/dist/apps/routes/App.js.map +1 -1
  161. package/dist/apps/routes/routes/deposit-addresses.d.ts +169 -61
  162. package/dist/apps/routes/routes/deposit-addresses.d.ts.map +1 -1
  163. package/dist/apps/routes/routes/deposit-addresses.js +217 -32
  164. package/dist/apps/routes/routes/deposit-addresses.js.map +1 -1
  165. package/dist/apps/routes/routes/quotes.d.ts +90 -0
  166. package/dist/apps/routes/routes/quotes.d.ts.map +1 -1
  167. package/dist/apps/routes/routes/quotes.js +101 -27
  168. package/dist/apps/routes/routes/quotes.js.map +1 -1
  169. package/dist/apps/routes/routes/transfers.d.ts +187 -135
  170. package/dist/apps/routes/routes/transfers.d.ts.map +1 -1
  171. package/dist/apps/routes/routes/transfers.js +182 -37
  172. package/dist/apps/routes/routes/transfers.js.map +1 -1
  173. package/dist/cli/ApiKeys.d.ts +120 -0
  174. package/dist/cli/ApiKeys.d.ts.map +1 -0
  175. package/dist/cli/ApiKeys.js +138 -0
  176. package/dist/cli/ApiKeys.js.map +1 -0
  177. package/dist/cli/Cli.d.ts +92 -34
  178. package/dist/cli/Cli.d.ts.map +1 -1
  179. package/dist/cli/Cli.js +188 -11
  180. package/dist/cli/Cli.js.map +1 -1
  181. package/dist/cli/Credentials.d.ts +95 -0
  182. package/dist/cli/Credentials.d.ts.map +1 -0
  183. package/dist/cli/Credentials.js +110 -0
  184. package/dist/cli/Credentials.js.map +1 -0
  185. package/dist/cli/Spec.d.ts +59 -0
  186. package/dist/cli/Spec.d.ts.map +1 -0
  187. package/dist/cli/Spec.js +77 -0
  188. package/dist/cli/Spec.js.map +1 -0
  189. package/dist/cli/bin.js +5 -1
  190. package/dist/cli/bin.js.map +1 -1
  191. package/dist/cli/commands/admin.d.ts +5 -5
  192. package/dist/cli/commands/admin.d.ts.map +1 -1
  193. package/dist/cli/commands/auth.d.ts +73 -0
  194. package/dist/cli/commands/auth.d.ts.map +1 -0
  195. package/dist/cli/commands/auth.js +204 -0
  196. package/dist/cli/commands/auth.js.map +1 -0
  197. package/dist/cli/commands/keys.d.ts +17 -0
  198. package/dist/cli/commands/keys.d.ts.map +1 -0
  199. package/dist/cli/commands/keys.js +109 -0
  200. package/dist/cli/commands/keys.js.map +1 -0
  201. package/dist/cloudflare.d.ts +27 -2
  202. package/dist/cloudflare.d.ts.map +1 -1
  203. package/dist/cloudflare.js +144 -17
  204. package/dist/cloudflare.js.map +1 -1
  205. package/dist/db/Db.d.ts +23 -0
  206. package/dist/db/Db.d.ts.map +1 -1
  207. package/dist/db/Db.js +418 -1
  208. package/dist/db/Db.js.map +1 -1
  209. package/dist/db/Schema.d.ts +44 -1
  210. package/dist/db/Schema.d.ts.map +1 -1
  211. package/dist/db/Schema.js +56 -3
  212. package/dist/db/Schema.js.map +1 -1
  213. package/dist/db/tables/apiKeyAdmissions.d.ts +28 -2
  214. package/dist/db/tables/apiKeyAdmissions.d.ts.map +1 -1
  215. package/dist/db/tables/apiKeyAdmissions.js +65 -9
  216. package/dist/db/tables/apiKeyAdmissions.js.map +1 -1
  217. package/dist/db/tables/apiKeyOwnerTombstones.d.ts +2 -0
  218. package/dist/db/tables/apiKeyOwnerTombstones.d.ts.map +1 -1
  219. package/dist/db/tables/apiKeyOwnerTombstones.js +2 -2
  220. package/dist/db/tables/apiKeyOwnerTombstones.js.map +1 -1
  221. package/dist/db/tables/authAccounts.d.ts.map +1 -1
  222. package/dist/db/tables/authAccounts.js +1 -0
  223. package/dist/db/tables/authAccounts.js.map +1 -1
  224. package/dist/db/tables/earnVaults.d.ts +5 -1
  225. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  226. package/dist/db/tables/earnVaults.js +12 -1
  227. package/dist/db/tables/earnVaults.js.map +1 -1
  228. package/dist/db/tables/organizations.d.ts +4 -2
  229. package/dist/db/tables/organizations.d.ts.map +1 -1
  230. package/dist/db/tables/organizations.js +8 -34
  231. package/dist/db/tables/organizations.js.map +1 -1
  232. package/dist/db/tables/requestUsage.d.ts +5 -1
  233. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  234. package/dist/db/tables/requestUsage.js +10 -2
  235. package/dist/db/tables/requestUsage.js.map +1 -1
  236. package/dist/db/tables/rewardEligibilityAssociations.d.ts +13 -0
  237. package/dist/db/tables/rewardEligibilityAssociations.d.ts.map +1 -1
  238. package/dist/db/tables/rewardEligibilityAssociations.js +11 -0
  239. package/dist/db/tables/rewardEligibilityAssociations.js.map +1 -1
  240. package/dist/db/tables/rewardRuns.d.ts.map +1 -1
  241. package/dist/db/tables/rewardRuns.js +4 -0
  242. package/dist/db/tables/rewardRuns.js.map +1 -1
  243. package/dist/db/tables/rewardTransactionAttempts.d.ts.map +1 -1
  244. package/dist/db/tables/rewardTransactionAttempts.js +2 -0
  245. package/dist/db/tables/rewardTransactionAttempts.js.map +1 -1
  246. package/dist/db/tables/routesDepositAddresses.d.ts +29 -0
  247. package/dist/db/tables/routesDepositAddresses.d.ts.map +1 -1
  248. package/dist/db/tables/routesDepositAddresses.js +84 -31
  249. package/dist/db/tables/routesDepositAddresses.js.map +1 -1
  250. package/dist/db/tables/routesDeposits.d.ts.map +1 -1
  251. package/dist/db/tables/routesDeposits.js +31 -21
  252. package/dist/db/tables/routesDeposits.js.map +1 -1
  253. package/dist/db/tables/routesIdempotency.d.ts.map +1 -1
  254. package/dist/db/tables/routesIdempotency.js +2 -0
  255. package/dist/db/tables/routesIdempotency.js.map +1 -1
  256. package/dist/db/tables/routesPolicies.d.ts +58 -0
  257. package/dist/db/tables/routesPolicies.d.ts.map +1 -0
  258. package/dist/db/tables/routesPolicies.js +198 -0
  259. package/dist/db/tables/routesPolicies.js.map +1 -0
  260. package/dist/db/tables/routesTransferSubsidies.d.ts +22 -0
  261. package/dist/db/tables/routesTransferSubsidies.d.ts.map +1 -1
  262. package/dist/db/tables/routesTransferSubsidies.js +41 -0
  263. package/dist/db/tables/routesTransferSubsidies.js.map +1 -1
  264. package/dist/db/tables/routesTransferSubsidyNonces.d.ts.map +1 -1
  265. package/dist/db/tables/routesTransferSubsidyNonces.js +12 -4
  266. package/dist/db/tables/routesTransferSubsidyNonces.js.map +1 -1
  267. package/dist/db/tables/routesTransfers.d.ts +26 -1
  268. package/dist/db/tables/routesTransfers.d.ts.map +1 -1
  269. package/dist/db/tables/routesTransfers.js +36 -6
  270. package/dist/db/tables/routesTransfers.js.map +1 -1
  271. package/dist/db/tables/sponsoredTransactions.d.ts +45 -13
  272. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  273. package/dist/db/tables/sponsoredTransactions.js +144 -33
  274. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  275. package/dist/db/tables/users.d.ts +2 -0
  276. package/dist/db/tables/users.d.ts.map +1 -1
  277. package/dist/db/tables/users.js +11 -0
  278. package/dist/db/tables/users.js.map +1 -1
  279. package/dist/db/tables/verifiedTokenRequests.d.ts +21 -4
  280. package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -1
  281. package/dist/db/tables/verifiedTokenRequests.js +65 -44
  282. package/dist/db/tables/verifiedTokenRequests.js.map +1 -1
  283. package/dist/handlers/internal/multisig.d.ts +1 -1
  284. package/dist/handlers/internal/multisig.d.ts.map +1 -1
  285. package/dist/handlers/internal/multisig.js +3 -2
  286. package/dist/handlers/internal/multisig.js.map +1 -1
  287. package/dist/handlers/relay.d.ts +2 -0
  288. package/dist/handlers/relay.d.ts.map +1 -1
  289. package/dist/handlers/relay.js +34 -15
  290. package/dist/handlers/relay.js.map +1 -1
  291. package/dist/internal/Auth.d.ts +73 -6
  292. package/dist/internal/Auth.d.ts.map +1 -1
  293. package/dist/internal/Auth.js +212 -85
  294. package/dist/internal/Auth.js.map +1 -1
  295. package/dist/internal/BetterAuth.d.ts +22 -0
  296. package/dist/internal/BetterAuth.d.ts.map +1 -1
  297. package/dist/internal/BetterAuth.js +17 -14
  298. package/dist/internal/BetterAuth.js.map +1 -1
  299. package/dist/internal/Cache.d.ts +5 -0
  300. package/dist/internal/Cache.d.ts.map +1 -1
  301. package/dist/internal/Cache.js +3 -1
  302. package/dist/internal/Cache.js.map +1 -1
  303. package/dist/internal/CliAuth.d.ts +243 -0
  304. package/dist/internal/CliAuth.d.ts.map +1 -0
  305. package/dist/internal/CliAuth.js +249 -0
  306. package/dist/internal/CliAuth.js.map +1 -0
  307. package/dist/internal/EarnSharePrices.d.ts +1 -1
  308. package/dist/internal/EarnSharePrices.d.ts.map +1 -1
  309. package/dist/internal/EarnSharePrices.js +7 -3
  310. package/dist/internal/EarnSharePrices.js.map +1 -1
  311. package/dist/internal/EarnVaults.d.ts +47 -0
  312. package/dist/internal/EarnVaults.d.ts.map +1 -1
  313. package/dist/internal/EarnVaults.js +188 -4
  314. package/dist/internal/EarnVaults.js.map +1 -1
  315. package/dist/internal/EarnWithdrawals.d.ts +73 -0
  316. package/dist/internal/EarnWithdrawals.d.ts.map +1 -0
  317. package/dist/internal/EarnWithdrawals.js +189 -0
  318. package/dist/internal/EarnWithdrawals.js.map +1 -0
  319. package/dist/internal/ExecutionContext.d.ts +21 -0
  320. package/dist/internal/ExecutionContext.d.ts.map +1 -0
  321. package/dist/internal/ExecutionContext.js +16 -0
  322. package/dist/internal/ExecutionContext.js.map +1 -0
  323. package/dist/internal/Log.d.ts +7 -3
  324. package/dist/internal/Log.d.ts.map +1 -1
  325. package/dist/internal/Log.js +163 -130
  326. package/dist/internal/Log.js.map +1 -1
  327. package/dist/internal/MetricSink.d.ts.map +1 -1
  328. package/dist/internal/MetricSink.js +26 -1
  329. package/dist/internal/MetricSink.js.map +1 -1
  330. package/dist/internal/RateLimit.d.ts +67 -0
  331. package/dist/internal/RateLimit.d.ts.map +1 -1
  332. package/dist/internal/RateLimit.js +174 -27
  333. package/dist/internal/RateLimit.js.map +1 -1
  334. package/dist/internal/Store.d.ts +6 -0
  335. package/dist/internal/Store.d.ts.map +1 -1
  336. package/dist/internal/Store.js +4 -5
  337. package/dist/internal/Store.js.map +1 -1
  338. package/dist/internal/Timing.d.ts +6 -0
  339. package/dist/internal/Timing.d.ts.map +1 -1
  340. package/dist/internal/Timing.js +21 -1
  341. package/dist/internal/Timing.js.map +1 -1
  342. package/dist/internal/Tron.d.ts +124 -0
  343. package/dist/internal/Tron.d.ts.map +1 -0
  344. package/dist/internal/Tron.js +202 -0
  345. package/dist/internal/Tron.js.map +1 -0
  346. package/dist/internal/Viem.d.ts +4 -0
  347. package/dist/internal/Viem.d.ts.map +1 -1
  348. package/dist/internal/Viem.js +25 -6
  349. package/dist/internal/Viem.js.map +1 -1
  350. package/dist/internal/rewards/Read.d.ts +2 -2
  351. package/dist/internal/rewards/Read.d.ts.map +1 -1
  352. package/dist/internal/rewards/Read.js +11 -2
  353. package/dist/internal/rewards/Read.js.map +1 -1
  354. package/dist/internal/routes/Action.d.ts +27 -0
  355. package/dist/internal/routes/Action.d.ts.map +1 -1
  356. package/dist/internal/routes/Action.js +49 -1
  357. package/dist/internal/routes/Action.js.map +1 -1
  358. package/dist/internal/routes/Chain.d.ts +2 -0
  359. package/dist/internal/routes/Chain.d.ts.map +1 -1
  360. package/dist/internal/routes/Chain.js +4 -0
  361. package/dist/internal/routes/Chain.js.map +1 -1
  362. package/dist/internal/routes/DepositAddress.d.ts.map +1 -1
  363. package/dist/internal/routes/DepositAddress.js +5 -0
  364. package/dist/internal/routes/DepositAddress.js.map +1 -1
  365. package/dist/internal/routes/Evidence.d.ts.map +1 -1
  366. package/dist/internal/routes/Evidence.js +6 -2
  367. package/dist/internal/routes/Evidence.js.map +1 -1
  368. package/dist/internal/routes/EvmTransferSettlement.d.ts +17 -0
  369. package/dist/internal/routes/EvmTransferSettlement.d.ts.map +1 -0
  370. package/dist/internal/routes/EvmTransferSettlement.js +196 -0
  371. package/dist/internal/routes/EvmTransferSettlement.js.map +1 -0
  372. package/dist/internal/routes/Policy.d.ts +161 -0
  373. package/dist/internal/routes/Policy.d.ts.map +1 -0
  374. package/dist/internal/routes/Policy.js +249 -0
  375. package/dist/internal/routes/Policy.js.map +1 -0
  376. package/dist/internal/routes/Provider.d.ts +66 -3
  377. package/dist/internal/routes/Provider.d.ts.map +1 -1
  378. package/dist/internal/routes/Provider.js +106 -27
  379. package/dist/internal/routes/Provider.js.map +1 -1
  380. package/dist/internal/routes/Quota.d.ts +57 -0
  381. package/dist/internal/routes/Quota.d.ts.map +1 -0
  382. package/dist/internal/routes/Quota.js +144 -0
  383. package/dist/internal/routes/Quota.js.map +1 -0
  384. package/dist/internal/routes/Reconciliation.d.ts.map +1 -1
  385. package/dist/internal/routes/Reconciliation.js +163 -47
  386. package/dist/internal/routes/Reconciliation.js.map +1 -1
  387. package/dist/internal/routes/SolanaTransferSettlement.d.ts +12 -0
  388. package/dist/internal/routes/SolanaTransferSettlement.d.ts.map +1 -0
  389. package/dist/internal/routes/SolanaTransferSettlement.js +220 -0
  390. package/dist/internal/routes/SolanaTransferSettlement.js.map +1 -0
  391. package/dist/internal/routes/SolanaTransferSubsidy.d.ts +172 -0
  392. package/dist/internal/routes/SolanaTransferSubsidy.d.ts.map +1 -0
  393. package/dist/internal/routes/SolanaTransferSubsidy.js +564 -0
  394. package/dist/internal/routes/SolanaTransferSubsidy.js.map +1 -0
  395. package/dist/internal/routes/Subsidy.d.ts +2 -2
  396. package/dist/internal/routes/Subsidy.d.ts.map +1 -1
  397. package/dist/internal/routes/Subsidy.js +2 -2
  398. package/dist/internal/routes/Subsidy.js.map +1 -1
  399. package/dist/internal/routes/Transfer.d.ts +229 -1
  400. package/dist/internal/routes/Transfer.d.ts.map +1 -1
  401. package/dist/internal/routes/Transfer.js +644 -7
  402. package/dist/internal/routes/Transfer.js.map +1 -1
  403. package/dist/internal/routes/TransferReconciliation.d.ts +6 -0
  404. package/dist/internal/routes/TransferReconciliation.d.ts.map +1 -1
  405. package/dist/internal/routes/TransferReconciliation.js +83 -159
  406. package/dist/internal/routes/TransferReconciliation.js.map +1 -1
  407. package/dist/internal/routes/TransferSettlement.d.ts +45 -0
  408. package/dist/internal/routes/TransferSettlement.d.ts.map +1 -0
  409. package/dist/internal/routes/TransferSettlement.js +2 -0
  410. package/dist/internal/routes/TransferSettlement.js.map +1 -0
  411. package/dist/internal/routes/TransferSubsidy.d.ts +23 -8
  412. package/dist/internal/routes/TransferSubsidy.d.ts.map +1 -1
  413. package/dist/internal/routes/TransferSubsidy.js +64 -5
  414. package/dist/internal/routes/TransferSubsidy.js.map +1 -1
  415. package/dist/internal/routes/TronTransferSettlement.d.ts +12 -0
  416. package/dist/internal/routes/TronTransferSettlement.d.ts.map +1 -0
  417. package/dist/internal/routes/TronTransferSettlement.js +201 -0
  418. package/dist/internal/routes/TronTransferSettlement.js.map +1 -0
  419. package/dist/internal/routes/TronTransferSubsidy.d.ts +174 -0
  420. package/dist/internal/routes/TronTransferSubsidy.d.ts.map +1 -0
  421. package/dist/internal/routes/TronTransferSubsidy.js +439 -0
  422. package/dist/internal/routes/TronTransferSubsidy.js.map +1 -0
  423. package/dist/internal/routes/index.d.ts +3 -0
  424. package/dist/internal/routes/index.d.ts.map +1 -1
  425. package/dist/internal/routes/index.js +3 -0
  426. package/dist/internal/routes/index.js.map +1 -1
  427. package/dist/internal/routes/providers/across.d.ts +3 -0
  428. package/dist/internal/routes/providers/across.d.ts.map +1 -1
  429. package/dist/internal/routes/providers/across.js +11 -0
  430. package/dist/internal/routes/providers/across.js.map +1 -1
  431. package/dist/internal/routes/providers/legacyMesh.d.ts +29 -0
  432. package/dist/internal/routes/providers/legacyMesh.d.ts.map +1 -0
  433. package/dist/internal/routes/providers/legacyMesh.js +474 -0
  434. package/dist/internal/routes/providers/legacyMesh.js.map +1 -0
  435. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts +59 -0
  436. package/dist/internal/routes/providers/legacyMeshDelivery.d.ts.map +1 -0
  437. package/dist/internal/routes/providers/legacyMeshDelivery.js +229 -0
  438. package/dist/internal/routes/providers/legacyMeshDelivery.js.map +1 -0
  439. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts +19 -0
  440. package/dist/internal/routes/providers/legacyMeshOutbound.d.ts.map +1 -0
  441. package/dist/internal/routes/providers/legacyMeshOutbound.js +457 -0
  442. package/dist/internal/routes/providers/legacyMeshOutbound.js.map +1 -0
  443. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts +123 -0
  444. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.d.ts.map +1 -0
  445. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js +333 -0
  446. package/dist/internal/routes/providers/legacyMeshOutboundDelivery.js.map +1 -0
  447. package/dist/internal/routes/providers/propAmm.d.ts +70 -0
  448. package/dist/internal/routes/providers/propAmm.d.ts.map +1 -0
  449. package/dist/internal/routes/providers/propAmm.js +524 -0
  450. package/dist/internal/routes/providers/propAmm.js.map +1 -0
  451. package/dist/internal/routes/providers/relay.d.ts +4 -1
  452. package/dist/internal/routes/providers/relay.d.ts.map +1 -1
  453. package/dist/internal/routes/providers/relay.js +353 -42
  454. package/dist/internal/routes/providers/relay.js.map +1 -1
  455. package/dist/internal/routes/providers/rhino.d.ts +3 -0
  456. package/dist/internal/routes/providers/rhino.d.ts.map +1 -1
  457. package/dist/internal/routes/providers/rhino.js +11 -0
  458. package/dist/internal/routes/providers/rhino.js.map +1 -1
  459. package/dist/internal/routes/providers/squid.d.ts +3 -0
  460. package/dist/internal/routes/providers/squid.d.ts.map +1 -1
  461. package/dist/internal/routes/providers/squid.js +19 -0
  462. package/dist/internal/routes/providers/squid.js.map +1 -1
  463. package/dist/internal/routes/providers/stargate.d.ts.map +1 -1
  464. package/dist/internal/routes/providers/stargate.js +22 -9
  465. package/dist/internal/routes/providers/stargate.js.map +1 -1
  466. package/dist/internal/routes/providers/symbiosis.d.ts.map +1 -1
  467. package/dist/internal/routes/providers/symbiosis.js +13 -17
  468. package/dist/internal/routes/providers/symbiosis.js.map +1 -1
  469. package/dist/providers/index.d.ts +14 -0
  470. package/dist/providers/index.d.ts.map +1 -1
  471. package/dist/providers/index.js +6 -0
  472. package/dist/providers/index.js.map +1 -1
  473. package/package.json +16 -6
  474. package/src/ApiKey.ts +7 -3
  475. package/src/ApiKeys.test.ts +652 -8
  476. package/src/ApiKeys.ts +191 -11
  477. package/src/App.test.ts +405 -18
  478. package/src/App.ts +51 -15
  479. package/src/Client.test-d.ts +157 -10
  480. package/src/Client.test.ts +4 -4
  481. package/src/Scope.ts +1 -2
  482. package/src/admin/App.ts +11 -5
  483. package/src/admin/apps/api-keys.test.ts +98 -2
  484. package/src/admin/apps/api-keys.ts +21 -12
  485. package/src/admin/apps/earn-vaults.test.ts +76 -7
  486. package/src/admin/apps/earn-vaults.ts +47 -8
  487. package/src/admin/apps/organizations.test.ts +147 -31
  488. package/src/admin/apps/organizations.ts +5 -4
  489. package/src/admin/apps/route-policies.test.ts +220 -0
  490. package/src/admin/apps/route-policies.ts +322 -0
  491. package/src/admin/apps/routes-support.test.ts +107 -2
  492. package/src/admin/apps/routes-support.ts +43 -3
  493. package/src/admin/apps/routes.test.ts +150 -0
  494. package/src/admin/apps/routes.ts +97 -1
  495. package/src/admin/apps/scopes.test.ts +1 -1
  496. package/src/admin/apps/verified-tokens.test.ts +32 -0
  497. package/src/admin/apps/verified-tokens.ts +30 -4
  498. package/src/admin/index.ts +0 -1
  499. package/src/admin/ui/plugin.ts +2 -1
  500. package/src/admin/ui/src/components/Dialog.tsx +1 -1
  501. package/src/admin/ui/src/components/EarnVaultForm.tsx +45 -0
  502. package/src/admin/ui/src/components/RoutePicker.tsx +79 -0
  503. package/src/admin/ui/src/lib/earn-vaults.ts +1 -1
  504. package/src/admin/ui/src/lib/route-policies.test.ts +452 -0
  505. package/src/admin/ui/src/lib/route-policies.ts +232 -0
  506. package/src/admin/ui/src/lib/routes.ts +34 -0
  507. package/src/admin/ui/src/lib/verified-tokens.ts +24 -9
  508. package/src/admin/ui/src/routeTree.gen.ts +21 -0
  509. package/src/admin/ui/src/routes/__root.tsx +1 -1
  510. package/src/admin/ui/src/routes/api-keys.tsx +21 -2
  511. package/src/admin/ui/src/routes/early-access.tsx +1 -0
  512. package/src/admin/ui/src/routes/earn.vaults.tsx +1 -0
  513. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +22 -0
  514. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +10 -0
  515. package/src/admin/ui/src/routes/organizations.tsx +35 -4
  516. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +18 -3
  517. package/src/admin/ui/src/routes/route-policies.tsx +678 -0
  518. package/src/admin/ui/src/routes/routes.tsx +85 -2
  519. package/src/admin/ui/src/routes/routes_.support.tsx +6 -22
  520. package/src/admin/ui/src/routes/subsidies.tsx +1 -0
  521. package/src/admin/ui/src/routes/verified-tokens.tsx +65 -20
  522. package/src/admin/ui.generated.ts +99 -104
  523. package/src/analytics/Analytics.test.ts +4 -50
  524. package/src/analytics/Analytics.ts +65 -1
  525. package/src/analytics/tables/requestEvents.test.ts +402 -1
  526. package/src/analytics/tables/requestEvents.ts +62 -93
  527. package/src/apps/data/App.test.ts +26 -0
  528. package/src/apps/data/routes/activities.test.ts +315 -14
  529. package/src/apps/data/routes/activities.ts +60 -0
  530. package/src/apps/data/routes/balances.ts +5 -7
  531. package/src/apps/data/routes/earn.bench.ts +18 -0
  532. package/src/apps/data/routes/earn.local.test.ts +507 -0
  533. package/src/apps/data/routes/earn.test.ts +405 -127
  534. package/src/apps/data/routes/earn.ts +660 -270
  535. package/src/apps/data/routes/exchanges.bench.ts +3 -1
  536. package/src/apps/data/routes/exchanges.test.ts +166 -2
  537. package/src/apps/data/routes/exchanges.ts +308 -101
  538. package/src/apps/data/routes/fee-amm.test.ts +153 -2
  539. package/src/apps/data/routes/fee-amm.ts +132 -62
  540. package/src/apps/data/routes/receipts.test.ts +21 -18
  541. package/src/apps/data/routes/rpc.test.ts +34 -2
  542. package/src/apps/data/routes/rpc.ts +47 -10
  543. package/src/apps/data/routes/tokens.provenance.test.ts +157 -0
  544. package/src/apps/data/routes/tokens.test.ts +4 -4
  545. package/src/apps/data/routes/tokens.ts +11 -6
  546. package/src/apps/data/routes/transactions.test.ts +29 -0
  547. package/src/apps/data/routes/transactions.ts +33 -22
  548. package/src/apps/data/routes/webhooks.scan.test.ts +29 -0
  549. package/src/apps/data/routes/webhooks.test.ts +18 -3
  550. package/src/apps/data/routes/webhooks.ts +27 -13
  551. package/src/apps/management/App.ts +4 -0
  552. package/src/apps/management/Billing.test.ts +253 -27
  553. package/src/apps/management/Billing.ts +83 -29
  554. package/src/apps/management/routes/api-keys.test.ts +1 -1
  555. package/src/apps/management/routes/api-keys.ts +85 -11
  556. package/src/apps/management/routes/billing.test.ts +68 -4
  557. package/src/apps/management/routes/cli.test.ts +370 -0
  558. package/src/apps/management/routes/cli.ts +533 -0
  559. package/src/apps/management/routes/me.test.ts +14 -4
  560. package/src/apps/management/routes/orgs.test.ts +108 -4
  561. package/src/apps/management/routes/orgs.ts +7 -2
  562. package/src/apps/management/routes/usage.test.ts +2 -2
  563. package/src/apps/management/routes/verified-token-requests.test.ts +16 -2
  564. package/src/apps/management/routes/verified-token-requests.ts +7 -10
  565. package/src/apps/mcp.test.ts +108 -25
  566. package/src/apps/mcp.ts +15 -3
  567. package/src/apps/mpp/internal/Policy.test.ts +51 -4
  568. package/src/apps/mpp/internal/Policy.ts +6 -2
  569. package/src/apps/mpp/internal/Sponsorship.test.ts +29 -0
  570. package/src/apps/mpp/internal/Sponsorship.ts +6 -4
  571. package/src/apps/relay/App.test.ts +85 -1
  572. package/src/apps/relay/App.ts +28 -4
  573. package/src/apps/relay/Sponsorships.test.ts +97 -1
  574. package/src/apps/relay/Sponsorships.ts +77 -66
  575. package/src/apps/routes/Access.test.ts +319 -0
  576. package/src/apps/routes/Access.ts +147 -0
  577. package/src/apps/routes/App.ts +10 -0
  578. package/src/apps/routes/routes/chains.test.ts +3 -2
  579. package/src/apps/routes/routes/deposit-addresses.test.ts +978 -34
  580. package/src/apps/routes/routes/deposit-addresses.ts +243 -32
  581. package/src/apps/routes/routes/propAmm.local.test.ts +951 -0
  582. package/src/apps/routes/routes/quotes.test.ts +81 -8
  583. package/src/apps/routes/routes/quotes.ts +109 -27
  584. package/src/apps/routes/routes/transfers.test.ts +252 -15
  585. package/src/apps/routes/routes/transfers.ts +212 -33
  586. package/src/cli/ApiKeys.test.ts +265 -0
  587. package/src/cli/ApiKeys.ts +189 -0
  588. package/src/cli/Cli.test.ts +188 -0
  589. package/src/cli/Cli.ts +280 -12
  590. package/src/cli/Credentials.test.ts +122 -0
  591. package/src/cli/Credentials.ts +144 -0
  592. package/src/cli/Spec.test.ts +133 -0
  593. package/src/cli/Spec.ts +132 -0
  594. package/src/cli/bin.test.ts +49 -0
  595. package/src/cli/bin.ts +5 -1
  596. package/src/cli/commands/auth.test.ts +138 -0
  597. package/src/cli/commands/auth.ts +254 -0
  598. package/src/cli/commands/keys.test.ts +68 -0
  599. package/src/cli/commands/keys.ts +125 -0
  600. package/src/cloudflare.ts +184 -36
  601. package/src/db/Db.test.ts +877 -0
  602. package/src/db/Db.ts +507 -1
  603. package/src/db/Schema.ts +75 -4
  604. package/src/db/tables/apiKeyAdmissions.test.ts +57 -0
  605. package/src/db/tables/apiKeyAdmissions.ts +101 -11
  606. package/src/db/tables/apiKeyOwnerTombstones.ts +2 -2
  607. package/src/db/tables/authAccounts.test.ts +30 -0
  608. package/src/db/tables/authAccounts.ts +1 -0
  609. package/src/db/tables/earnVaults.test.ts +34 -0
  610. package/src/db/tables/earnVaults.ts +17 -2
  611. package/src/db/tables/organizations.test.ts +148 -84
  612. package/src/db/tables/organizations.ts +11 -43
  613. package/src/db/tables/requestUsage.ts +13 -2
  614. package/src/db/tables/rewardCampaigns.test.ts +163 -0
  615. package/src/db/tables/rewardEligibilityAssociations.test.ts +14 -0
  616. package/src/db/tables/rewardEligibilityAssociations.ts +24 -0
  617. package/src/db/tables/rewardRuns.ts +4 -0
  618. package/src/db/tables/rewardTransactionAttempts.ts +2 -0
  619. package/src/db/tables/routesDepositAddresses.test.ts +263 -0
  620. package/src/db/tables/routesDepositAddresses.ts +118 -34
  621. package/src/db/tables/routesDeposits.test.ts +133 -0
  622. package/src/db/tables/routesDeposits.ts +47 -26
  623. package/src/db/tables/routesIdempotency.test.ts +80 -0
  624. package/src/db/tables/routesIdempotency.ts +2 -0
  625. package/src/db/tables/routesPolicies.test.ts +143 -0
  626. package/src/db/tables/routesPolicies.ts +251 -0
  627. package/src/db/tables/routesTransferSubsidies.ts +64 -0
  628. package/src/db/tables/routesTransferSubsidyNonces.ts +16 -4
  629. package/src/db/tables/routesTransfers.test.ts +183 -2
  630. package/src/db/tables/routesTransfers.ts +65 -6
  631. package/src/db/tables/sponsoredTransactions.test.ts +351 -76
  632. package/src/db/tables/sponsoredTransactions.ts +182 -38
  633. package/src/db/tables/users.test.ts +51 -0
  634. package/src/db/tables/users.ts +12 -0
  635. package/src/db/tables/verifiedTokenRequests.test.ts +39 -20
  636. package/src/db/tables/verifiedTokenRequests.ts +80 -44
  637. package/src/handlers/internal/multisig.store.test.ts +120 -0
  638. package/src/handlers/internal/multisig.test.ts +389 -0
  639. package/src/handlers/internal/multisig.ts +13 -10
  640. package/src/handlers/relay.test.ts +259 -83
  641. package/src/handlers/relay.ts +36 -17
  642. package/src/internal/Auth.test.ts +383 -8
  643. package/src/internal/Auth.ts +272 -99
  644. package/src/internal/BetterAuth.test.ts +58 -22
  645. package/src/internal/BetterAuth.ts +23 -17
  646. package/src/internal/Cache.ts +3 -1
  647. package/src/internal/CliAuth.test.ts +279 -0
  648. package/src/internal/CliAuth.ts +319 -0
  649. package/src/internal/EarnSharePrices.test.ts +25 -0
  650. package/src/internal/EarnSharePrices.ts +9 -2
  651. package/src/internal/EarnVaults.test.ts +67 -0
  652. package/src/internal/EarnVaults.ts +299 -4
  653. package/src/internal/EarnWithdrawals.test.ts +315 -0
  654. package/src/internal/EarnWithdrawals.ts +266 -0
  655. package/src/internal/ExecutionContext.ts +31 -0
  656. package/src/internal/Log.test.ts +210 -0
  657. package/src/internal/Log.ts +180 -142
  658. package/src/internal/MetricSink.test.ts +190 -15
  659. package/src/internal/MetricSink.ts +27 -1
  660. package/src/internal/RateLimit.test.ts +144 -8
  661. package/src/internal/RateLimit.ts +254 -26
  662. package/src/internal/Store.ts +4 -5
  663. package/src/internal/Timing.test.ts +32 -0
  664. package/src/internal/Timing.ts +20 -1
  665. package/src/internal/Tron.test-d.ts +22 -0
  666. package/src/internal/Tron.test.ts +94 -0
  667. package/src/internal/Tron.ts +289 -0
  668. package/src/internal/Viem.rpc.test.ts +76 -0
  669. package/src/internal/Viem.ts +29 -6
  670. package/src/internal/rewards/Read.test.ts +109 -0
  671. package/src/internal/rewards/Read.ts +13 -4
  672. package/src/internal/routes/Action.test.ts +70 -0
  673. package/src/internal/routes/Action.ts +76 -1
  674. package/src/internal/routes/Chain.test.ts +18 -0
  675. package/src/internal/routes/Chain.ts +5 -0
  676. package/src/internal/routes/DepositAddress.ts +5 -0
  677. package/src/internal/routes/Evidence.test.ts +64 -0
  678. package/src/internal/routes/Evidence.ts +11 -3
  679. package/src/internal/routes/EvmTransferSettlement.ts +213 -0
  680. package/src/internal/routes/Policy.test.ts +316 -0
  681. package/src/internal/routes/Policy.ts +399 -0
  682. package/src/internal/routes/Provider.test.ts +103 -2
  683. package/src/internal/routes/Provider.ts +149 -27
  684. package/src/internal/routes/Quota.test.ts +149 -0
  685. package/src/internal/routes/Quota.ts +226 -0
  686. package/src/internal/routes/Reconciliation.local.test.ts +285 -0
  687. package/src/internal/routes/Reconciliation.test.ts +371 -13
  688. package/src/internal/routes/Reconciliation.ts +193 -42
  689. package/src/internal/routes/SolanaTransferSettlement.ts +232 -0
  690. package/src/internal/routes/SolanaTransferSubsidy.test.ts +471 -0
  691. package/src/internal/routes/SolanaTransferSubsidy.ts +760 -0
  692. package/src/internal/routes/SourceObservation.test.ts +221 -0
  693. package/src/internal/routes/Subsidy.local.test.ts +46 -0
  694. package/src/internal/routes/Subsidy.ts +4 -2
  695. package/src/internal/routes/Transfer.solana.test.ts +389 -0
  696. package/src/internal/routes/Transfer.test.ts +130 -1
  697. package/src/internal/routes/Transfer.tron.test.ts +172 -0
  698. package/src/internal/routes/Transfer.ts +866 -8
  699. package/src/internal/routes/TransferReconciliation.test.ts +26 -4
  700. package/src/internal/routes/TransferReconciliation.ts +91 -166
  701. package/src/internal/routes/TransferSettlement.ts +48 -0
  702. package/src/internal/routes/TransferSubsidy.local.test.ts +143 -0
  703. package/src/internal/routes/TransferSubsidy.test.ts +34 -4
  704. package/src/internal/routes/TransferSubsidy.ts +87 -12
  705. package/src/internal/routes/TronTransferSettlement.ts +212 -0
  706. package/src/internal/routes/TronTransferSubsidy.test.ts +109 -0
  707. package/src/internal/routes/TronTransferSubsidy.ts +619 -0
  708. package/src/internal/routes/index.test.ts +3 -0
  709. package/src/internal/routes/index.ts +3 -0
  710. package/src/internal/routes/providers/across.ts +13 -0
  711. package/src/internal/routes/providers/index.test.ts +141 -0
  712. package/src/internal/routes/providers/legacyMesh.test.ts +484 -0
  713. package/src/internal/routes/providers/legacyMesh.ts +633 -0
  714. package/src/internal/routes/providers/legacyMeshDelivery.test.ts +306 -0
  715. package/src/internal/routes/providers/legacyMeshDelivery.ts +320 -0
  716. package/src/internal/routes/providers/legacyMeshOutbound.test.ts +401 -0
  717. package/src/internal/routes/providers/legacyMeshOutbound.ts +566 -0
  718. package/src/internal/routes/providers/legacyMeshOutboundDelivery.ts +473 -0
  719. package/src/internal/routes/providers/propAmm.ts +640 -0
  720. package/src/internal/routes/providers/relay.test.ts +1299 -18
  721. package/src/internal/routes/providers/relay.ts +424 -39
  722. package/src/internal/routes/providers/rhino.ts +14 -1
  723. package/src/internal/routes/providers/squid.ts +21 -0
  724. package/src/internal/routes/providers/stargate.test.ts +105 -1
  725. package/src/internal/routes/providers/stargate.ts +22 -9
  726. package/src/internal/routes/providers/symbiosis.ts +13 -47
  727. package/src/providers/index.test.ts +2 -0
  728. package/src/providers/index.ts +18 -0
  729. package/dist/admin/Access.d.ts +0 -39
  730. package/dist/admin/Access.d.ts.map +0 -1
  731. package/dist/admin/Access.js +0 -73
  732. package/dist/admin/Access.js.map +0 -1
  733. package/src/admin/Access.test.ts +0 -130
  734. package/src/admin/Access.ts +0 -85
@@ -355,6 +355,7 @@ export async function latestSummary(
355
355
  .where('chainId', '=', String(options.chainId))
356
356
  .where('vaultAddress', '=', normalize(options.vaultAddress))
357
357
  .orderBy('startsAfter', 'desc')
358
+ .limit(1)
358
359
  .executeTakeFirst()
359
360
  if (!row) return undefined
360
361
  return {
@@ -399,6 +400,7 @@ export async function latestStatement(
399
400
  ]),
400
401
  )
401
402
  .orderBy('endsAt', 'desc')
403
+ .limit(1)
402
404
  .executeTakeFirst()
403
405
  if (!row) return undefined
404
406
  const record = toRecord(row)
@@ -419,6 +421,8 @@ export async function latestDelivered(
419
421
  .where('vaultAddress', '=', normalize(options.vaultAddress))
420
422
  .where('phase', '=', 'delivered')
421
423
  .orderBy('endsAt', 'desc')
424
+ // `executeTakeFirst` adds no LIMIT; without one Postgres returns every run.
425
+ .limit(1)
422
426
  .executeTakeFirst()) as DeliveredSummary | undefined
423
427
  }
424
428
 
@@ -200,6 +200,7 @@ export async function latestForIntent(
200
200
  'asc',
201
201
  )
202
202
  .orderBy('createdAt', 'desc')
203
+ .limit(1)
203
204
  .executeTakeFirst()
204
205
  return row ? toRecord(row) : undefined
205
206
  }
@@ -249,6 +250,7 @@ export async function latestRecoverable(
249
250
  .where('state', 'in', ['created', 'signed', 'broadcast', 'confirmed'])
250
251
  .where(sql<boolean>`intent ->> 'operation' = ${options.operation}`)
251
252
  .orderBy('createdAt', 'desc')
253
+ .limit(1)
252
254
  .executeTakeFirst()
253
255
  return row ? toRecord(row) : undefined
254
256
  }
@@ -75,7 +75,87 @@ describe('getByProviderAddress', () => {
75
75
  })
76
76
  })
77
77
 
78
+ describe('grandfatherLegacySponsored', () => {
79
+ test('preserves fixed-rate identity when pinning enterprise terms', async () => {
80
+ const record = await seed({
81
+ providerState: { fixedRate: '1:1', routePolicyKey: '["","1:1"]' },
82
+ snapshot: TestRoutes.depositAddressSnapshot({
83
+ provider: { id: 'fixed_rate_reviewed', name: 'Fixed rate reviewed' },
84
+ recipient: `0x${'93'.repeat(20)}`,
85
+ subsidize: true,
86
+ }),
87
+ })
88
+ await RoutesDepositAddresses.grandfatherLegacySponsored(db, {
89
+ addressIds: [record.id],
90
+ apply: true,
91
+ commitment: {
92
+ maxAmount: '0.05',
93
+ scope: { environment: 'production', orgId: record.orgId },
94
+ versions: [1],
95
+ },
96
+ })
97
+ const stored = await RoutesDepositAddresses.get(db, record.id)
98
+ expect(stored?.providerState).toMatchInlineSnapshot(`
99
+ {
100
+ "fixedRate": "1:1",
101
+ "routePolicy": {
102
+ "maxAmount": "0.05",
103
+ "scope": {
104
+ "environment": "production",
105
+ "orgId": "org_deposit_addresses",
106
+ },
107
+ "subsidyPayer": "enterprise",
108
+ "versions": [
109
+ 1,
110
+ ],
111
+ },
112
+ "routePolicyKey": "["[\\"enterprise\\",\\"0.050000\\"]","1:1"]",
113
+ }
114
+ `)
115
+ })
116
+ })
117
+
78
118
  describe('routes migration', () => {
119
+ test('reports ambiguous legacy rows and only applies explicitly reviewed enterprise terms', async () => {
120
+ const reviewed = await seed({
121
+ snapshot: TestRoutes.depositAddressSnapshot({
122
+ provider: { id: 'legacy_reviewed', name: 'Legacy reviewed' },
123
+ recipient: `0x${'91'.repeat(20)}`,
124
+ subsidize: true,
125
+ }),
126
+ })
127
+ const ambiguous = await seed({
128
+ snapshot: TestRoutes.depositAddressSnapshot({
129
+ provider: { id: 'legacy_ambiguous', name: 'Legacy ambiguous' },
130
+ recipient: `0x${'92'.repeat(20)}`,
131
+ subsidize: true,
132
+ }),
133
+ })
134
+ const options = {
135
+ addressIds: [reviewed.id, 'rda_missing'],
136
+ commitment: {
137
+ maxAmount: '12.5',
138
+ scope: { environment: 'production', orgId: reviewed.orgId },
139
+ versions: [4] as number[],
140
+ },
141
+ } satisfies RoutesDepositAddresses.grandfatherLegacySponsored.Options
142
+
143
+ const dryRun = await RoutesDepositAddresses.grandfatherLegacySponsored(db, options)
144
+ expect(dryRun).toMatchObject({
145
+ ambiguous: expect.arrayContaining([ambiguous.id]),
146
+ applied: false,
147
+ grandfathered: [reviewed.id],
148
+ missing: ['rda_missing'],
149
+ })
150
+ await RoutesDepositAddresses.grandfatherLegacySponsored(db, { ...options, apply: true })
151
+
152
+ expect((await RoutesDepositAddresses.get(db, reviewed.id))?.providerState).toMatchObject({
153
+ routePolicy: { maxAmount: '12.5', subsidyPayer: 'enterprise', versions: [4] },
154
+ routePolicyKey: '["enterprise","12.500000"]',
155
+ })
156
+ expect((await RoutesDepositAddresses.get(db, ambiguous.id))?.providerState).toBeNull()
157
+ })
158
+
79
159
  test('backfills canonical creator attribution for retained addresses', async () => {
80
160
  const orgId = 'org_deposit_address_creator_backfill'
81
161
  const userId = 'usr_deposit_address_creator_backfill'
@@ -726,6 +806,135 @@ describe('failPoll', () => {
726
806
  })
727
807
 
728
808
  describe('insertOrGet', () => {
809
+ test('keeps legacy reuse and provider state isolated from newer policy addresses', async () => {
810
+ const legacy = await seed({
811
+ providerState: { checkEndpoint: '/intents/status/v3?requestId=legacy' },
812
+ })
813
+ const match: RoutesDepositAddresses.Match = {
814
+ destinationTokenKey: legacy.destinationTokenKey,
815
+ environment: legacy.environment,
816
+ orgId: legacy.orgId,
817
+ recipient: legacy.recipient,
818
+ refundAddress: legacy.refundAddress,
819
+ sourceChainId: legacy.sourceChainId,
820
+ sourceTokenKey: legacy.sourceTokenKey,
821
+ subsidize: legacy.subsidize,
822
+ }
823
+ const pinned = {
824
+ ...legacy,
825
+ address: `0x${'da'.repeat(20)}`,
826
+ id: DepositAddress.generateId(),
827
+ providerState: { routePolicyKey: '["tempo","0.150000"]' },
828
+ snapshot: { ...legacy.snapshot, address: `0x${'da'.repeat(20)}` },
829
+ }
830
+ await RoutesDepositAddresses.insertOrGet(db, {
831
+ match: { ...match, policyKey: '["tempo","0.150000"]', providerId: legacy.providerId },
832
+ record: pinned,
833
+ })
834
+ // A rolling legacy reader supplies neither policyKey nor providerId, even after provider configuration changes.
835
+ expect(await RoutesDepositAddresses.getMatching(db, match)).toEqual(legacy)
836
+ expect(
837
+ await RoutesDepositAddresses.insertOrGet(db, {
838
+ match,
839
+ record: {
840
+ ...legacy,
841
+ address: `0x${'db'.repeat(20)}`,
842
+ id: DepositAddress.generateId(),
843
+ providerId: 'rotated_provider',
844
+ providerState: {},
845
+ },
846
+ }),
847
+ ).toEqual(legacy)
848
+ expect(
849
+ await RoutesDepositAddresses.getMatching(db, {
850
+ ...match,
851
+ policyKey: '["tempo","0.150000"]',
852
+ providerId: legacy.providerId,
853
+ }),
854
+ ).toEqual(pinned)
855
+ expect(await RoutesDepositAddresses.get(db, legacy.id)).toEqual(legacy)
856
+ })
857
+
858
+ test('creates and independently reuses addresses with different pinned caps', async () => {
859
+ const first = await seed({
860
+ providerState: { routePolicyKey: '["tempo","0.050000"]' },
861
+ })
862
+ const record = {
863
+ ...first,
864
+ address: `0x${'ed'.repeat(20)}`,
865
+ id: DepositAddress.generateId(new Date('2027-03-01')),
866
+ providerState: { routePolicyKey: '["tempo","0.150000"]' },
867
+ }
868
+ const match: RoutesDepositAddresses.Match = {
869
+ destinationTokenKey: record.destinationTokenKey,
870
+ environment: record.environment,
871
+ orgId: record.orgId,
872
+ policyKey: '["tempo","0.150000"]',
873
+ providerId: record.providerId,
874
+ recipient: record.recipient,
875
+ refundAddress: record.refundAddress,
876
+ sourceChainId: record.sourceChainId,
877
+ sourceTokenKey: record.sourceTokenKey,
878
+ subsidize: record.subsidize,
879
+ }
880
+
881
+ const results = await Promise.all([
882
+ RoutesDepositAddresses.insertOrGet(db, { match, record }),
883
+ RoutesDepositAddresses.insertOrGet(db, {
884
+ match,
885
+ record: {
886
+ ...record,
887
+ address: `0x${'ee'.repeat(20)}`,
888
+ id: DepositAddress.generateId(new Date('2027-03-02')),
889
+ },
890
+ }),
891
+ ])
892
+ expect(results[0]).toEqual(results[1])
893
+ expect(results[0]?.address).not.toBe(first.address)
894
+ expect(await RoutesDepositAddresses.getMatching(db, match)).toEqual(results[0])
895
+ expect(
896
+ await RoutesDepositAddresses.getMatching(db, {
897
+ ...match,
898
+ policyKey: '["tempo","0.050000"]',
899
+ }),
900
+ ).toEqual(first)
901
+ expect(await RoutesDepositAddresses.get(db, first.id)).toEqual(first)
902
+ })
903
+
904
+ test.each(['provider', 'policy'] as const)(
905
+ 'reports a late %s conflict without assigning the wrong provider or physical address',
906
+ async (difference) => {
907
+ const first = await seed()
908
+ const record = {
909
+ ...first,
910
+ address: difference === 'policy' ? first.address : `0x${'ef'.repeat(20)}`,
911
+ id: DepositAddress.generateId(new Date('2027-02-01')),
912
+ providerId: difference === 'provider' ? 'different_provider' : first.providerId,
913
+ providerState: difference === 'policy' ? { routePolicyKey: '["tempo","0.050000"]' } : {},
914
+ }
915
+ const match: RoutesDepositAddresses.Match = {
916
+ destinationTokenKey: record.destinationTokenKey,
917
+ environment: record.environment,
918
+ orgId: record.orgId,
919
+ policyKey: difference === 'policy' ? '["tempo","0.050000"]' : undefined,
920
+ providerId: record.providerId,
921
+ recipient: record.recipient,
922
+ refundAddress: record.refundAddress,
923
+ sourceChainId: record.sourceChainId,
924
+ sourceTokenKey: record.sourceTokenKey,
925
+ subsidize: record.subsidize,
926
+ }
927
+
928
+ // Both requests passed preflight; the winner is persisted before the loser's insert.
929
+ for (let attempt = 0; attempt < 2; attempt++)
930
+ await expect(
931
+ RoutesDepositAddresses.insertOrGet(db, { match, record }),
932
+ ).rejects.toBeInstanceOf(RoutesDepositAddresses.IdentityConflictError)
933
+ expect(await RoutesDepositAddresses.get(db, record.id)).toBeUndefined()
934
+ expect(await RoutesDepositAddresses.get(db, first.id)).toEqual(first)
935
+ },
936
+ )
937
+
729
938
  test('returns the existing address for an identical reusable identity', async () => {
730
939
  const record = await seed()
731
940
  const match: RoutesDepositAddresses.Match = {
@@ -1020,6 +1229,60 @@ describe('summarize', () => {
1020
1229
  })
1021
1230
 
1022
1231
  describe('checkpointPoll', () => {
1232
+ test.each([
1233
+ {
1234
+ routePolicy: { maxAmount: '0.05', scope: owner, subsidyPayer: 'tempo', versions: [1] },
1235
+ routePolicyKey: '["tempo","0.050000"]',
1236
+ },
1237
+ { fixedRate: '1:1', routePolicyKey: '["","1:1"]' },
1238
+ {
1239
+ fixedRate: '1:1',
1240
+ routePolicy: {
1241
+ maxAmount: '0.05',
1242
+ scope: owner,
1243
+ subsidyPayer: 'enterprise',
1244
+ versions: [0, 0],
1245
+ },
1246
+ routePolicyKey: '["[\\"enterprise\\",\\"0.050000\\"]","1:1"]',
1247
+ },
1248
+ { routePolicy: null, routePolicyKey: 'invalid' },
1249
+ {},
1250
+ ])(
1251
+ 'preserves financial terms across provider cursor replacement and completion: %j',
1252
+ async (providerState) => {
1253
+ const record = await seed({ providerState })
1254
+ const [claim] = await RoutesDepositAddresses.claimDue(db, {
1255
+ leaseUntil: '2027-01-01T00:01:00.000Z',
1256
+ limit: 1,
1257
+ now: '2027-01-01T00:00:00.000Z',
1258
+ providerId: record.providerId,
1259
+ })
1260
+ if (!claim) throw new Error('Expected a claimed address.')
1261
+ const checkpoint = await RoutesDepositAddresses.checkpointPoll(db, {
1262
+ id: record.id,
1263
+ pollLeaseVersion: claim.pollLeaseVersion,
1264
+ providerState: {
1265
+ cursor: 'next',
1266
+ fixedRate: '2:1',
1267
+ routePolicy: { subsidyPayer: 'enterprise' },
1268
+ routePolicyKey: 'replacement',
1269
+ },
1270
+ })
1271
+ expect(checkpoint?.providerState).toEqual({ ...providerState, cursor: 'next' })
1272
+ const completed = await RoutesDepositAddresses.completePoll(db, {
1273
+ id: record.id,
1274
+ pollLeaseVersion: claim.pollLeaseVersion,
1275
+ providerState: null,
1276
+ providerRequestIds: [],
1277
+ lastPolledAt: '2027-01-01T00:00:10.000Z',
1278
+ nextPollAt: '2027-01-01T00:01:10.000Z',
1279
+ })
1280
+ expect(completed?.providerState).toEqual(
1281
+ Object.keys(providerState).length ? providerState : null,
1282
+ )
1283
+ },
1284
+ )
1285
+
1023
1286
  test('retains the lease while saving progress and rejects a stale fence', async () => {
1024
1287
  const record = await seed()
1025
1288
  const [claim] = await RoutesDepositAddresses.claimDue(db, {
@@ -1,8 +1,8 @@
1
1
  import { sql, type JSONColumnType, type Selectable } from 'kysely'
2
- import * as pg from 'pg'
3
2
 
4
3
  import type * as Db from '../Db.js'
5
4
  import type * as db_Schema from '../Schema.js'
5
+ import * as Policy from '../../internal/routes/Policy.js'
6
6
  import * as RoutesIdempotency from './routesIdempotency.js'
7
7
  import * as RoutesSubsidies from './routesSubsidies.js'
8
8
 
@@ -15,6 +15,69 @@ export type Table = Omit<db_Schema.RoutesDepositAddress, 'providerRequestIds'> &
15
15
  /** A stored route deposit address. */
16
16
  export type Record = Selectable<Table>
17
17
 
18
+ /** Reviews and optionally pins explicitly approved legacy sponsored addresses. */
19
+ export async function grandfatherLegacySponsored(
20
+ db: Db.Db,
21
+ options: grandfatherLegacySponsored.Options,
22
+ ): Promise<grandfatherLegacySponsored.Report> {
23
+ let query = db.kysely
24
+ .selectFrom('routes_deposit_addresses')
25
+ .select(['id', 'providerState'])
26
+ .where('orgId', '=', options.commitment.scope.orgId)
27
+ .where('environment', '=', options.commitment.scope.environment)
28
+ .where('subsidize', '=', true)
29
+ .where(sql<boolean>`provider_state->'routePolicy' IS NULL`)
30
+ .orderBy('id')
31
+ query =
32
+ options.commitment.scope.projectId === undefined
33
+ ? query.where('projectId', 'is', null)
34
+ : query.where('projectId', '=', options.commitment.scope.projectId)
35
+ const legacy = await query.execute()
36
+ const known = new Set(options.addressIds)
37
+ const existing = new Set(legacy.map(({ id }) => id))
38
+ const grandfathered = legacy.filter(({ id }) => known.has(id)).map(({ id }) => id)
39
+ const ambiguous = legacy.filter(({ id }) => !known.has(id)).map(({ id }) => id)
40
+ const missing = options.addressIds.filter((id) => !existing.has(id))
41
+ if (options.apply === true && grandfathered.length > 0) {
42
+ const routePolicy = Policy.schema.Commitment.parse({
43
+ ...options.commitment,
44
+ subsidyPayer: 'enterprise',
45
+ })
46
+ await db.kysely
47
+ .updateTable('routes_deposit_addresses')
48
+ .set({
49
+ providerState: sql`coalesce(provider_state, '{}'::jsonb) || jsonb_build_object(
50
+ 'routePolicy', ${JSON.stringify(routePolicy)}::jsonb,
51
+ 'routePolicyKey', CASE WHEN provider_state->>'fixedRate' = '1:1'
52
+ THEN ${Policy.depositKey({ fixedRate: '1:1', routePolicy })}::text
53
+ ELSE ${Policy.commitmentKey(routePolicy)}::text END
54
+ )`,
55
+ })
56
+ .where('id', 'in', grandfathered)
57
+ .where('subsidize', '=', true)
58
+ .where(sql<boolean>`provider_state->'routePolicy' IS NULL`)
59
+ .execute()
60
+ }
61
+ return { ambiguous, applied: options.apply === true, grandfathered, missing }
62
+ }
63
+
64
+ export declare namespace grandfatherLegacySponsored {
65
+ type Options = {
66
+ /** Explicitly reviewed, unambiguous legacy address ids. */
67
+ addressIds: readonly string[]
68
+ /** Current approved limits and provenance; payer is forced to enterprise. */
69
+ commitment: Omit<Policy.Commitment, 'subsidyPayer'>
70
+ /** Writes when true; omitted is a dry run. */
71
+ apply?: boolean | undefined
72
+ }
73
+ type Report = {
74
+ ambiguous: readonly string[]
75
+ applied: boolean
76
+ grandfathered: readonly string[]
77
+ missing: readonly string[]
78
+ }
79
+ }
80
+
18
81
  /** Ownership filter derived from the authenticated API key. */
19
82
  export type Owner = {
20
83
  /** Key environment. */
@@ -27,6 +90,10 @@ export type Owner = {
27
90
 
28
91
  /** Identity fields that make one reusable address match a caller request. */
29
92
  export type Match = Owner & {
93
+ /** Stable immutable financial commitment identity (empty for legacy rows). */
94
+ policyKey?: string | undefined
95
+ /** Provider that provisioned the reusable address. */
96
+ providerId?: string | undefined
30
97
  /** Customer destination token key. */
31
98
  destinationTokenKey: string
32
99
  /** Tempo account that receives completed deposits. */
@@ -123,6 +190,7 @@ export function validateCreationCapacity(
123
190
  return db
124
191
  .transaction(async (tx) => {
125
192
  await RoutesSubsidies.lockOrganization(tx, options.orgId)
193
+ await options.checkPolicy?.(tx)
126
194
  const organization = await getCapacityOwner(tx, options.orgId)
127
195
  if (!organization) throw new OwnerNotFoundError()
128
196
  await lockCapacityOwner(tx, organization)
@@ -143,6 +211,18 @@ export function validateCreationCapacity(
143
211
  })
144
212
  return { allowed: true, result: { record: matching, type: 'existing' } } as const
145
213
  }
214
+ // Different commitments may provision new addresses; the same commitment cannot silently switch providers.
215
+ if (
216
+ await matchingIdentity(tx, options.match)
217
+ .where(
218
+ sql<string>`coalesce(provider_state->>'routePolicyKey', '')`,
219
+ '=',
220
+ options.match.policyKey ?? '',
221
+ )
222
+ .select('id')
223
+ .executeTakeFirst()
224
+ )
225
+ throw new IdentityConflictError()
146
226
  // Old workers cannot prove a checkpoint's owner or match; exact same-key retries attribute it before this fence.
147
227
  if (await RoutesIdempotency.hasUnattributedInFlightClaim(tx)) throw new MatchInProgressError()
148
228
  const reservation = await RoutesIdempotency.reserveDepositAddressMatch(tx, {
@@ -172,6 +252,8 @@ export function validateCreationCapacity(
172
252
  export declare namespace validateCreationCapacity {
173
253
  /** Reusable identity and organization capacity bound. */
174
254
  type Options = {
255
+ /** Validates fresh instructions under the same lock as capacity and reuse. */
256
+ checkPolicy?: ((db: Db.Db) => Promise<void>) | undefined
175
257
  /** Pending claim released atomically when the creator-wide cap is full. */
176
258
  claim: RoutesIdempotency.release.Input
177
259
  /** Maximum durable and in-flight addresses for one canonical creator. */
@@ -312,35 +394,15 @@ export async function insertOrGet(db: Db.Db, options: insertOrGet.Options): Prom
312
394
  ...options.record,
313
395
  providerRequestIds: JSON.stringify(options.record.providerRequestIds),
314
396
  })
315
- .onConflict((oc) =>
316
- oc
317
- .columns([
318
- 'orgId',
319
- 'environment',
320
- 'projectId',
321
- 'sourceChainId',
322
- 'sourceTokenKey',
323
- 'destinationTokenKey',
324
- 'recipient',
325
- 'refundAddress',
326
- 'subsidize',
327
- ])
328
- .doNothing(),
329
- )
397
+ // Handle both financial-identity and physical-provider-address uniqueness without replacing either row.
398
+ .onConflict((oc) => oc.doNothing())
330
399
  .returningAll()
331
400
  .executeTakeFirst()
332
- .catch((cause) => {
333
- if (
334
- cause instanceof pg.DatabaseError &&
335
- cause.code === '23505' &&
336
- cause.constraint === 'routes_deposit_addresses_provider_address_key'
337
- )
338
- throw new ConflictError()
339
- throw cause
340
- })
341
401
  if (record) return record
342
402
  const existing = await getMatching(db, options.match)
343
403
  if (existing) return existing
404
+ if (await matchingIdentity(db, options.match).select('id').executeTakeFirst())
405
+ throw new IdentityConflictError()
344
406
  throw new ConflictError()
345
407
  }
346
408
 
@@ -707,9 +769,17 @@ export declare namespace summarize {
707
769
 
708
770
  /** Gets the reusable address that matches one owner and route identity. */
709
771
  export function getMatching(db: Db.Db, match: Match): Promise<Record | undefined> {
710
- let query = db.kysely
711
- .selectFrom('routes_deposit_addresses')
772
+ let query = matchingIdentity(db, match)
712
773
  .selectAll()
774
+ .where(sql<string>`coalesce(provider_state->>'routePolicyKey', '')`, '=', match.policyKey ?? '')
775
+ if (match.providerId !== undefined) query = query.where('providerId', '=', match.providerId)
776
+ return query.executeTakeFirst()
777
+ }
778
+
779
+ /** Matches route ownership across financial commitments, including deactivated addresses. */
780
+ function matchingIdentity(db: Db.Db, match: Match) {
781
+ const query = db.kysely
782
+ .selectFrom('routes_deposit_addresses')
713
783
  .where('destinationTokenKey', '=', match.destinationTokenKey)
714
784
  .where('environment', '=', match.environment)
715
785
  .where('orgId', '=', match.orgId)
@@ -718,11 +788,9 @@ export function getMatching(db: Db.Db, match: Match): Promise<Record | undefined
718
788
  .where('sourceChainId', '=', match.sourceChainId)
719
789
  .where('sourceTokenKey', '=', match.sourceTokenKey)
720
790
  .where('subsidize', '=', match.subsidize)
721
- query =
722
- match.projectId === undefined
723
- ? query.where('projectId', 'is', null)
724
- : query.where('projectId', '=', match.projectId)
725
- return query.executeTakeFirst()
791
+ return match.projectId === undefined
792
+ ? query.where('projectId', 'is', null)
793
+ : query.where('projectId', '=', match.projectId)
726
794
  }
727
795
 
728
796
  /** Lists active provider addresses for one source-chain token. */
@@ -862,7 +930,7 @@ export declare namespace renewPoll {
862
930
  export function checkpointPoll(db: Db.Db, options: checkpointPoll.Options) {
863
931
  return db.kysely
864
932
  .updateTable('routes_deposit_addresses')
865
- .set({ providerState: options.providerState })
933
+ .set({ providerState: pollState(options.providerState) })
866
934
  .where('id', '=', options.id)
867
935
  .where('pollLeaseVersion', '=', options.pollLeaseVersion)
868
936
  .returningAll()
@@ -887,7 +955,7 @@ export function completePoll(
887
955
  pollFailureCount: 0,
888
956
  pollLeaseUntil: null,
889
957
  providerRequestIds: JSON.stringify(options.providerRequestIds),
890
- providerState: options.providerState,
958
+ providerState: pollState(options.providerState),
891
959
  })
892
960
  .where('id', '=', options.id)
893
961
  .where('pollLeaseVersion', '=', options.pollLeaseVersion)
@@ -895,6 +963,17 @@ export function completePoll(
895
963
  .executeTakeFirst()
896
964
  }
897
965
 
966
+ // Provider cursors may replace private state, but cannot change or erase financial terms.
967
+ function pollState(state: Record['providerState']) {
968
+ const encoded = state === null ? null : JSON.stringify(state)
969
+ return sql<Record['providerState']>`CASE
970
+ WHEN provider_state ?| ARRAY['fixedRate', 'routePolicy', 'routePolicyKey'] THEN
971
+ (coalesce(${encoded}::jsonb, '{}'::jsonb) - 'fixedRate' - 'routePolicy' - 'routePolicyKey') ||
972
+ (SELECT jsonb_object_agg(key, value) FROM jsonb_each(provider_state)
973
+ WHERE key IN ('fixedRate', 'routePolicy', 'routePolicyKey'))
974
+ ELSE (${encoded}::jsonb - 'fixedRate' - 'routePolicy' - 'routePolicyKey') END`
975
+ }
976
+
898
977
  export declare namespace completePoll {
899
978
  /** Successful reconciliation result guarded by the claimed lease version. */
900
979
  type Options = {
@@ -984,6 +1063,11 @@ export class ConflictError extends Error {
984
1063
  override name = 'RoutesDepositAddresses.ConflictError'
985
1064
  }
986
1065
 
1066
+ /** The requested identity conflicts with an existing provider or physical address commitment. */
1067
+ export class IdentityConflictError extends Error {
1068
+ override name = 'RoutesDepositAddresses.IdentityConflictError'
1069
+ }
1070
+
987
1071
  /** Organization deposit-address cap reached. */
988
1072
  export class LimitExceededError extends Error {
989
1073
  override name = 'RoutesDepositAddresses.LimitExceededError'