tapimo 0.12.0 → 0.14.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 (398) hide show
  1. package/dist/App.d.ts +11333 -9563
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +39 -3
  4. package/dist/App.js.map +1 -1
  5. package/dist/Scope.d.ts +2 -0
  6. package/dist/Scope.d.ts.map +1 -1
  7. package/dist/Scope.js +17 -0
  8. package/dist/Scope.js.map +1 -1
  9. package/dist/Webhooks.js +2 -2
  10. package/dist/Webhooks.js.map +1 -1
  11. package/dist/admin/App.d.ts +1064 -924
  12. package/dist/admin/App.d.ts.map +1 -1
  13. package/dist/admin/apps/api-keys.d.ts +80 -0
  14. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  15. package/dist/admin/apps/api-keys.js +54 -0
  16. package/dist/admin/apps/api-keys.js.map +1 -1
  17. package/dist/admin/apps/earn-vaults.d.ts +63 -15
  18. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  19. package/dist/admin/apps/earn-vaults.js +2 -1
  20. package/dist/admin/apps/earn-vaults.js.map +1 -1
  21. package/dist/admin/apps/organizations.d.ts +92 -3
  22. package/dist/admin/apps/organizations.d.ts.map +1 -1
  23. package/dist/admin/apps/organizations.js +69 -7
  24. package/dist/admin/apps/organizations.js.map +1 -1
  25. package/dist/admin/apps/verified-tokens.d.ts +7 -7
  26. package/dist/admin/ui.generated.d.ts +1 -1
  27. package/dist/admin/ui.generated.d.ts.map +1 -1
  28. package/dist/admin/ui.generated.js +151 -151
  29. package/dist/admin/ui.generated.js.map +1 -1
  30. package/dist/apps/Zones.d.ts +28 -28
  31. package/dist/apps/Zones.js +7 -7
  32. package/dist/apps/data/App.d.ts +2909 -2523
  33. package/dist/apps/data/App.d.ts.map +1 -1
  34. package/dist/apps/data/App.js +26 -21
  35. package/dist/apps/data/App.js.map +1 -1
  36. package/dist/apps/data/ZoneSelection.d.ts +8 -8
  37. package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
  38. package/dist/apps/data/ZoneSelection.js +1 -1
  39. package/dist/apps/data/ZoneSelection.js.map +1 -1
  40. package/dist/apps/data/routes/activities.d.ts +588 -584
  41. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  42. package/dist/apps/data/routes/activities.js +1561 -1239
  43. package/dist/apps/data/routes/activities.js.map +1 -1
  44. package/dist/apps/data/routes/addresses.d.ts +22 -22
  45. package/dist/apps/data/routes/balances.d.ts +26 -26
  46. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  47. package/dist/apps/data/routes/balances.js +43 -16
  48. package/dist/apps/data/routes/balances.js.map +1 -1
  49. package/dist/apps/data/routes/blocks.d.ts +44 -44
  50. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  51. package/dist/apps/data/routes/blocks.js +21 -11
  52. package/dist/apps/data/routes/blocks.js.map +1 -1
  53. package/dist/apps/data/routes/coingecko.d.ts +3 -3
  54. package/dist/apps/data/routes/earn.d.ts +201 -25
  55. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  56. package/dist/apps/data/routes/earn.js +434 -75
  57. package/dist/apps/data/routes/earn.js.map +1 -1
  58. package/dist/apps/data/routes/exchanges.d.ts +160 -145
  59. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  60. package/dist/apps/data/routes/exchanges.js +180 -114
  61. package/dist/apps/data/routes/exchanges.js.map +1 -1
  62. package/dist/apps/data/routes/fee-amm.d.ts +2 -2
  63. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  64. package/dist/apps/data/routes/fee-amm.js +18 -19
  65. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  66. package/dist/apps/data/routes/receipts.d.ts +155 -55
  67. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  68. package/dist/apps/data/routes/receipts.js +28 -10
  69. package/dist/apps/data/routes/receipts.js.map +1 -1
  70. package/dist/apps/data/routes/tokenlist.d.ts +13 -13
  71. package/dist/apps/data/routes/tokens.d.ts +5 -5
  72. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  73. package/dist/apps/data/routes/tokens.js +51 -20
  74. package/dist/apps/data/routes/tokens.js.map +1 -1
  75. package/dist/apps/data/routes/transactions.d.ts +7 -2
  76. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  77. package/dist/apps/data/routes/transactions.js +37 -17
  78. package/dist/apps/data/routes/transactions.js.map +1 -1
  79. package/dist/apps/data/routes/transfers.d.ts +13 -13
  80. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  81. package/dist/apps/data/routes/transfers.js +18 -12
  82. package/dist/apps/data/routes/transfers.js.map +1 -1
  83. package/dist/apps/data/routes/valuation.d.ts +31 -31
  84. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  85. package/dist/apps/data/routes/valuation.js +12 -7
  86. package/dist/apps/data/routes/valuation.js.map +1 -1
  87. package/dist/apps/data/routes/verified-tokens.d.ts +8 -8
  88. package/dist/apps/data/routes/webhooks.d.ts +816 -113
  89. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  90. package/dist/apps/data/routes/webhooks.js +47 -5
  91. package/dist/apps/data/routes/webhooks.js.map +1 -1
  92. package/dist/apps/data/routes/zones.d.ts +14 -14
  93. package/dist/apps/data/routes/zones.js +1 -1
  94. package/dist/apps/funding/App.d.ts +466 -44
  95. package/dist/apps/funding/App.d.ts.map +1 -1
  96. package/dist/apps/funding/App.js +1 -1
  97. package/dist/apps/funding/App.js.map +1 -1
  98. package/dist/apps/funding/routes/deposit-addresses.d.ts +17 -17
  99. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  100. package/dist/apps/funding/routes/deposit-addresses.js +17 -12
  101. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  102. package/dist/apps/funding/routes/transfers.d.ts +650 -57
  103. package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
  104. package/dist/apps/funding/routes/transfers.js +238 -24
  105. package/dist/apps/funding/routes/transfers.js.map +1 -1
  106. package/dist/apps/management/App.d.ts +5120 -4152
  107. package/dist/apps/management/App.d.ts.map +1 -1
  108. package/dist/apps/management/Billing.d.ts +1 -1
  109. package/dist/apps/management/Billing.d.ts.map +1 -1
  110. package/dist/apps/management/Billing.js +17 -1
  111. package/dist/apps/management/Billing.js.map +1 -1
  112. package/dist/apps/management/routes/api-keys.d.ts +632 -81
  113. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  114. package/dist/apps/management/routes/api-keys.js +236 -4
  115. package/dist/apps/management/routes/api-keys.js.map +1 -1
  116. package/dist/apps/management/routes/billing.d.ts +76 -76
  117. package/dist/apps/management/routes/faucet.d.ts +6 -6
  118. package/dist/apps/management/routes/invitations.d.ts +24 -24
  119. package/dist/apps/management/routes/invite-links.d.ts +4 -4
  120. package/dist/apps/management/routes/members.d.ts +16 -16
  121. package/dist/apps/management/routes/orgs.d.ts +20 -20
  122. package/dist/apps/management/routes/projects.d.ts +4 -4
  123. package/dist/apps/management/routes/usage.d.ts +8 -8
  124. package/dist/apps/management/routes/verified-token-requests.d.ts +17 -17
  125. package/dist/apps/management/routes/webhooks.d.ts +675 -25
  126. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  127. package/dist/apps/management/routes/webhooks.js +21 -21
  128. package/dist/apps/management/routes/webhooks.js.map +1 -1
  129. package/dist/apps/relay/App.d.ts.map +1 -1
  130. package/dist/apps/relay/App.js +115 -23
  131. package/dist/apps/relay/App.js.map +1 -1
  132. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  133. package/dist/apps/relay/Sponsorships.js +27 -1
  134. package/dist/apps/relay/Sponsorships.js.map +1 -1
  135. package/dist/db/Db.d.ts.map +1 -1
  136. package/dist/db/Db.js +34 -1
  137. package/dist/db/Db.js.map +1 -1
  138. package/dist/db/Schema.d.ts +11 -5
  139. package/dist/db/Schema.d.ts.map +1 -1
  140. package/dist/db/Schema.js +21 -3
  141. package/dist/db/Schema.js.map +1 -1
  142. package/dist/db/tables/fundingCatalog.d.ts +4 -2
  143. package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
  144. package/dist/db/tables/fundingCatalog.js +5 -1
  145. package/dist/db/tables/fundingCatalog.js.map +1 -1
  146. package/dist/db/tables/fundingTransferTransactions.d.ts +38 -0
  147. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -1
  148. package/dist/db/tables/fundingTransferTransactions.js +44 -3
  149. package/dist/db/tables/fundingTransferTransactions.js.map +1 -1
  150. package/dist/db/tables/fundingTransfers.d.ts +17 -0
  151. package/dist/db/tables/fundingTransfers.d.ts.map +1 -1
  152. package/dist/db/tables/fundingTransfers.js +21 -0
  153. package/dist/db/tables/fundingTransfers.js.map +1 -1
  154. package/dist/db/tables/organizations.d.ts +24 -0
  155. package/dist/db/tables/organizations.d.ts.map +1 -1
  156. package/dist/db/tables/organizations.js +27 -0
  157. package/dist/db/tables/organizations.js.map +1 -1
  158. package/dist/db/tables/projects.d.ts +25 -1
  159. package/dist/db/tables/projects.d.ts.map +1 -1
  160. package/dist/db/tables/projects.js +26 -0
  161. package/dist/db/tables/projects.js.map +1 -1
  162. package/dist/db/tables/sponsoredTransactions.d.ts +44 -0
  163. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  164. package/dist/db/tables/sponsoredTransactions.js +146 -13
  165. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  166. package/dist/db/tables/webhookSubscriptions.d.ts +10 -6
  167. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  168. package/dist/db/tables/webhookSubscriptions.js +9 -6
  169. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  170. package/dist/handlers/internal/utils.d.ts.map +1 -1
  171. package/dist/handlers/internal/utils.js +9 -0
  172. package/dist/handlers/internal/utils.js.map +1 -1
  173. package/dist/internal/Auth.d.ts +3 -1
  174. package/dist/internal/Auth.d.ts.map +1 -1
  175. package/dist/internal/Auth.js +6 -3
  176. package/dist/internal/Auth.js.map +1 -1
  177. package/dist/internal/EarnVaults.d.ts +3 -3
  178. package/dist/internal/EarnVaults.js +5 -5
  179. package/dist/internal/EarnVaults.js.map +1 -1
  180. package/dist/internal/Fetch.d.ts +23 -0
  181. package/dist/internal/Fetch.d.ts.map +1 -0
  182. package/dist/internal/Fetch.js +26 -0
  183. package/dist/internal/Fetch.js.map +1 -0
  184. package/dist/internal/Log.d.ts +4 -2
  185. package/dist/internal/Log.d.ts.map +1 -1
  186. package/dist/internal/Log.js +16 -3
  187. package/dist/internal/Log.js.map +1 -1
  188. package/dist/internal/OpenApi.d.ts +5 -3
  189. package/dist/internal/OpenApi.d.ts.map +1 -1
  190. package/dist/internal/OpenApi.js +13 -3
  191. package/dist/internal/OpenApi.js.map +1 -1
  192. package/dist/internal/Response.d.ts +1 -1
  193. package/dist/internal/Response.d.ts.map +1 -1
  194. package/dist/internal/Schema.d.ts +6 -3
  195. package/dist/internal/Schema.d.ts.map +1 -1
  196. package/dist/internal/Schema.js +8 -2
  197. package/dist/internal/Schema.js.map +1 -1
  198. package/dist/internal/Store.d.ts +16 -3
  199. package/dist/internal/Store.d.ts.map +1 -1
  200. package/dist/internal/Store.js +82 -16
  201. package/dist/internal/Store.js.map +1 -1
  202. package/dist/internal/Tidx.d.ts.map +1 -1
  203. package/dist/internal/Tidx.js +7 -2
  204. package/dist/internal/Tidx.js.map +1 -1
  205. package/dist/internal/Timeout.d.ts +36 -0
  206. package/dist/internal/Timeout.d.ts.map +1 -0
  207. package/dist/internal/Timeout.js +37 -0
  208. package/dist/internal/Timeout.js.map +1 -0
  209. package/dist/internal/Timing.d.ts +9 -0
  210. package/dist/internal/Timing.d.ts.map +1 -1
  211. package/dist/internal/Timing.js +7 -0
  212. package/dist/internal/Timing.js.map +1 -1
  213. package/dist/internal/Viem.d.ts +16 -1
  214. package/dist/internal/Viem.d.ts.map +1 -1
  215. package/dist/internal/Viem.js +12 -2
  216. package/dist/internal/Viem.js.map +1 -1
  217. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  218. package/dist/internal/WebhookDestination.js +3 -0
  219. package/dist/internal/WebhookDestination.js.map +1 -1
  220. package/dist/internal/funding/Action.d.ts +9 -0
  221. package/dist/internal/funding/Action.d.ts.map +1 -1
  222. package/dist/internal/funding/Action.js +16 -8
  223. package/dist/internal/funding/Action.js.map +1 -1
  224. package/dist/internal/funding/Catalog.d.ts +9 -2
  225. package/dist/internal/funding/Catalog.d.ts.map +1 -1
  226. package/dist/internal/funding/Catalog.js +19 -8
  227. package/dist/internal/funding/Catalog.js.map +1 -1
  228. package/dist/internal/funding/DepositWebhook.d.ts.map +1 -1
  229. package/dist/internal/funding/DepositWebhook.js +2 -1
  230. package/dist/internal/funding/DepositWebhook.js.map +1 -1
  231. package/dist/internal/funding/Evidence.d.ts.map +1 -1
  232. package/dist/internal/funding/Evidence.js +2 -10
  233. package/dist/internal/funding/Evidence.js.map +1 -1
  234. package/dist/internal/funding/Provider.d.ts +108 -13
  235. package/dist/internal/funding/Provider.d.ts.map +1 -1
  236. package/dist/internal/funding/Provider.js +34 -8
  237. package/dist/internal/funding/Provider.js.map +1 -1
  238. package/dist/internal/funding/SourceObservation.d.ts.map +1 -1
  239. package/dist/internal/funding/SourceObservation.js +5 -7
  240. package/dist/internal/funding/SourceObservation.js.map +1 -1
  241. package/dist/internal/funding/Transfer.d.ts +114 -18
  242. package/dist/internal/funding/Transfer.d.ts.map +1 -1
  243. package/dist/internal/funding/Transfer.js +185 -55
  244. package/dist/internal/funding/Transfer.js.map +1 -1
  245. package/dist/internal/funding/TransferReconciliation.d.ts +52 -0
  246. package/dist/internal/funding/TransferReconciliation.d.ts.map +1 -0
  247. package/dist/internal/funding/TransferReconciliation.js +192 -0
  248. package/dist/internal/funding/TransferReconciliation.js.map +1 -0
  249. package/dist/internal/funding/TransferWebhook.d.ts +21 -0
  250. package/dist/internal/funding/TransferWebhook.d.ts.map +1 -0
  251. package/dist/internal/funding/TransferWebhook.js +43 -0
  252. package/dist/internal/funding/TransferWebhook.js.map +1 -0
  253. package/dist/internal/funding/index.d.ts +1 -0
  254. package/dist/internal/funding/index.d.ts.map +1 -1
  255. package/dist/internal/funding/index.js +1 -0
  256. package/dist/internal/funding/index.js.map +1 -1
  257. package/dist/internal/funding/providers/relay.d.ts.map +1 -1
  258. package/dist/internal/funding/providers/relay.js +3 -12
  259. package/dist/internal/funding/providers/relay.js.map +1 -1
  260. package/dist/internal/funding/providers/stargate.d.ts +127 -9
  261. package/dist/internal/funding/providers/stargate.d.ts.map +1 -1
  262. package/dist/internal/funding/providers/stargate.js +548 -112
  263. package/dist/internal/funding/providers/stargate.js.map +1 -1
  264. package/dist/internal/index.d.ts +1 -0
  265. package/dist/internal/index.d.ts.map +1 -1
  266. package/dist/internal/index.js +1 -0
  267. package/dist/internal/index.js.map +1 -1
  268. package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
  269. package/dist/internal/webhookDestinations/slack.js +16 -0
  270. package/dist/internal/webhookDestinations/slack.js.map +1 -1
  271. package/package.json +2 -2
  272. package/src/App.test.ts +100 -0
  273. package/src/App.ts +43 -3
  274. package/src/Client.test-d.ts +129 -2
  275. package/src/Scope.test.ts +20 -0
  276. package/src/Scope.ts +16 -0
  277. package/src/Webhooks.ts +2 -2
  278. package/src/admin/apps/api-keys.test.ts +75 -0
  279. package/src/admin/apps/api-keys.ts +64 -0
  280. package/src/admin/apps/earn-vaults.test.ts +1 -1
  281. package/src/admin/apps/earn-vaults.ts +2 -1
  282. package/src/admin/apps/organizations.test.ts +53 -1
  283. package/src/admin/apps/organizations.ts +90 -5
  284. package/src/admin/ui/src/lib/api-keys.ts +19 -0
  285. package/src/admin/ui/src/lib/organizations.test.ts +112 -1
  286. package/src/admin/ui/src/lib/organizations.ts +55 -0
  287. package/src/admin/ui/src/routes/api-keys.tsx +89 -2
  288. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +116 -0
  289. package/src/admin/ui.generated.ts +189 -151
  290. package/src/apps/Zones.test.ts +7 -7
  291. package/src/apps/Zones.ts +7 -7
  292. package/src/apps/composition.test.ts +2 -1
  293. package/src/apps/data/App.test.ts +41 -0
  294. package/src/apps/data/App.ts +30 -21
  295. package/src/apps/data/ZoneSelection.test.ts +2 -2
  296. package/src/apps/data/ZoneSelection.ts +8 -8
  297. package/src/apps/data/routes/activities.test.ts +1526 -12
  298. package/src/apps/data/routes/activities.ts +1774 -1356
  299. package/src/apps/data/routes/balances.ts +133 -97
  300. package/src/apps/data/routes/blocks.test.ts +533 -0
  301. package/src/apps/data/routes/blocks.ts +35 -16
  302. package/src/apps/data/routes/earn.test.ts +373 -16
  303. package/src/apps/data/routes/earn.ts +548 -79
  304. package/src/apps/data/routes/earn.zone-access.test.ts +6 -6
  305. package/src/apps/data/routes/exchanges.test.ts +740 -15
  306. package/src/apps/data/routes/exchanges.ts +954 -753
  307. package/src/apps/data/routes/fee-amm.ts +17 -18
  308. package/src/apps/data/routes/receipts.ts +47 -16
  309. package/src/apps/data/routes/tokens.test.ts +578 -0
  310. package/src/apps/data/routes/tokens.ts +283 -225
  311. package/src/apps/data/routes/transactions.ts +68 -29
  312. package/src/apps/data/routes/transfers.test.ts +421 -0
  313. package/src/apps/data/routes/transfers.ts +45 -27
  314. package/src/apps/data/routes/valuation.ts +94 -78
  315. package/src/apps/data/routes/webhooks.test.ts +21 -5
  316. package/src/apps/data/routes/webhooks.ts +63 -8
  317. package/src/apps/data/routes/zones.test.ts +2 -2
  318. package/src/apps/data/routes/zones.ts +1 -1
  319. package/src/apps/funding/App.ts +12 -2
  320. package/src/apps/funding/routes/deposit-addresses.test.ts +29 -7
  321. package/src/apps/funding/routes/deposit-addresses.ts +19 -14
  322. package/src/apps/funding/routes/quotes.test.ts +5 -9
  323. package/src/apps/funding/routes/transfers.test.ts +901 -23
  324. package/src/apps/funding/routes/transfers.ts +347 -64
  325. package/src/apps/management/Billing.ts +18 -5
  326. package/src/apps/management/routes/api-keys.test.ts +220 -0
  327. package/src/apps/management/routes/api-keys.ts +280 -3
  328. package/src/apps/management/routes/webhooks.test.ts +3 -3
  329. package/src/apps/management/routes/webhooks.ts +24 -25
  330. package/src/apps/relay/App.test.ts +212 -1
  331. package/src/apps/relay/App.ts +158 -29
  332. package/src/apps/relay/Sponsorships.ts +24 -1
  333. package/src/db/Db.ts +48 -1
  334. package/src/db/Schema.ts +22 -4
  335. package/src/db/tables/earnVaults.test.ts +9 -9
  336. package/src/db/tables/fundingCatalog.test.ts +16 -2
  337. package/src/db/tables/fundingCatalog.ts +9 -3
  338. package/src/db/tables/fundingTransferTransactions.test.ts +43 -0
  339. package/src/db/tables/fundingTransferTransactions.ts +79 -3
  340. package/src/db/tables/fundingTransfers.test.ts +26 -0
  341. package/src/db/tables/fundingTransfers.ts +36 -0
  342. package/src/db/tables/organizations.test.ts +41 -0
  343. package/src/db/tables/organizations.ts +49 -0
  344. package/src/db/tables/projects.test.ts +55 -0
  345. package/src/db/tables/projects.ts +46 -1
  346. package/src/db/tables/sponsoredTransactions.test.ts +338 -0
  347. package/src/db/tables/sponsoredTransactions.ts +197 -13
  348. package/src/db/tables/webhookSubscriptions.ts +18 -11
  349. package/src/handlers/internal/utils.test.ts +53 -0
  350. package/src/handlers/internal/utils.ts +15 -0
  351. package/src/internal/Auth.ts +12 -4
  352. package/src/internal/EarnVaults.capabilities.test.ts +2 -2
  353. package/src/internal/EarnVaults.test.ts +1 -1
  354. package/src/internal/EarnVaults.ts +5 -5
  355. package/src/internal/Fetch.test.ts +46 -0
  356. package/src/internal/Fetch.ts +56 -0
  357. package/src/internal/Log.test-d.ts +2 -0
  358. package/src/internal/Log.test.ts +21 -0
  359. package/src/internal/Log.ts +22 -5
  360. package/src/internal/OpenApi.ts +14 -4
  361. package/src/internal/Response.ts +1 -1
  362. package/src/internal/Schema.test.ts +2 -0
  363. package/src/internal/Schema.ts +12 -2
  364. package/src/internal/Store.test.ts +178 -0
  365. package/src/internal/Store.ts +104 -18
  366. package/src/internal/Tidx.test.ts +2 -1
  367. package/src/internal/Tidx.ts +7 -2
  368. package/src/internal/Timeout.test.ts +35 -0
  369. package/src/internal/Timeout.ts +73 -0
  370. package/src/internal/Timing.ts +16 -0
  371. package/src/internal/Viem.ts +39 -3
  372. package/src/internal/WebhookDestination.ts +3 -0
  373. package/src/internal/Webhooks.test.ts +45 -0
  374. package/src/internal/funding/Action.test.ts +41 -1
  375. package/src/internal/funding/Action.ts +69 -41
  376. package/src/internal/funding/Catalog.test.ts +34 -0
  377. package/src/internal/funding/Catalog.ts +28 -11
  378. package/src/internal/funding/DepositWebhook.ts +2 -1
  379. package/src/internal/funding/Evidence.ts +2 -13
  380. package/src/internal/funding/Provider.test.ts +73 -0
  381. package/src/internal/funding/Provider.ts +125 -28
  382. package/src/internal/funding/SourceObservation.ts +5 -9
  383. package/src/internal/funding/Transfer.test.ts +155 -0
  384. package/src/internal/funding/Transfer.ts +387 -147
  385. package/src/internal/funding/TransferReconciliation.test.ts +147 -0
  386. package/src/internal/funding/TransferReconciliation.ts +264 -0
  387. package/src/internal/funding/TransferWebhook.test.ts +128 -0
  388. package/src/internal/funding/TransferWebhook.ts +67 -0
  389. package/src/internal/funding/index.test.ts +1 -0
  390. package/src/internal/funding/index.ts +1 -0
  391. package/src/internal/funding/providers/index.test.ts +4 -167
  392. package/src/internal/funding/providers/relay.test.ts +2 -2
  393. package/src/internal/funding/providers/relay.ts +3 -15
  394. package/src/internal/funding/providers/stargate.test.ts +328 -0
  395. package/src/internal/funding/providers/stargate.ts +807 -135
  396. package/src/internal/index.test.ts +1 -0
  397. package/src/internal/index.ts +1 -0
  398. package/src/internal/webhookDestinations/slack.ts +15 -0
@@ -216,10 +216,12 @@ export namespace schema {
216
216
  /** Executable preparation returned by a funding provider. */
217
217
  export const PrepareResult = z.object({
218
218
  action: Action.schema.Action,
219
- correlation: z.object({
220
- checkEndpoint: z.optional(z.string()),
221
- requestId: z.string().check(z.minLength(1)),
222
- }),
219
+ correlation: z.optional(
220
+ z.object({
221
+ checkEndpoint: z.optional(z.string()),
222
+ requestId: z.string().check(z.minLength(1)),
223
+ }),
224
+ ),
223
225
  destinationAmount: PositiveInteger,
224
226
  destinationAmountMin: PositiveInteger,
225
227
  expiresAt: z.optional(z.iso.datetime()),
@@ -227,8 +229,10 @@ export namespace schema {
227
229
  z.object({
228
230
  amount: Schema.DecimalString,
229
231
  side: z.enum(['destination', 'source']),
232
+ token: z.optional(TokenRef),
230
233
  }),
231
234
  ),
235
+ providerState: z.optional(z.record(z.string(), z.unknown())),
232
236
  quality: GetQuoteResult.shape.quality,
233
237
  sampledAt: z.iso.datetime(),
234
238
  })
@@ -467,6 +471,51 @@ export declare namespace prepareTransfer {
467
471
  type ReturnType = z.output<typeof schema.PrepareResult>
468
472
  }
469
473
 
474
+ /** Contract for provider-specific executable action validation. */
475
+ export declare namespace validateTransferAction {
476
+ /** Prepared action and its curated route terms. */
477
+ type Parameters = prepareTransfer.Parameters & {
478
+ /** Executable action returned by the provider. */
479
+ action: Action.Action
480
+ }
481
+
482
+ /** Provider-specific constraints established by validation. */
483
+ type ReturnType = {
484
+ /** Exact native values independently validated against provider calldata. */
485
+ nativeValues?: readonly Action.NativeValue[] | undefined
486
+ }
487
+ }
488
+
489
+ /** Contract for provider-specific source transaction verification. */
490
+ export declare namespace verifySourceTransaction {
491
+ /** Stored transfer terms and submitted source transaction. */
492
+ type Parameters = {
493
+ /** Configured chain that receives the provider delivery. */
494
+ destinationChain: Chain
495
+ /** Private provider state captured while preparing the transfer. */
496
+ providerState?: Transfer.ProviderState | undefined
497
+ /** Current configuration for the stored provider route. */
498
+ routeConfiguration?: core_Catalog.Configuration | undefined
499
+ /** Configured chain containing the submitted transaction. */
500
+ sourceChain: Chain
501
+ /** Submitted transaction reference. */
502
+ transactionHash: string
503
+ /** Stored public transfer terms. */
504
+ transfer: Transfer.Snapshot
505
+ }
506
+
507
+ /** Source transaction verification outcome. */
508
+ type ReturnType =
509
+ | { type: 'invalid' }
510
+ | { type: 'pending' }
511
+ | {
512
+ /** Private provider evidence retained for reconciliation. */
513
+ providerState?: Transfer.ProviderState | undefined
514
+ /** The transaction matches the stored transfer terms. */
515
+ type: 'verified'
516
+ }
517
+ }
518
+
470
519
  /** Contract of the provider `createDepositAddress` method. */
471
520
  export declare namespace createDepositAddress {
472
521
  /** Input passed to a provider provisioning one reusable deposit address. */
@@ -683,6 +732,15 @@ export type Provider<id extends string = string> = core_Provider.Provider<id, 'f
683
732
  input: prepareTransfer.Parameters,
684
733
  signal: AbortSignal,
685
734
  ): Promise<prepareTransfer.ReturnType>
735
+ /** Validates provider-specific action semantics before generic persistence checks. */
736
+ validateTransferAction?(
737
+ input: validateTransferAction.Parameters,
738
+ ): validateTransferAction.ReturnType
739
+ /** Verifies a submitted source transaction, when supported. */
740
+ verifySourceTransaction?(
741
+ input: verifySourceTransaction.Parameters,
742
+ signal: AbortSignal,
743
+ ): Promise<verifySourceTransaction.ReturnType>
686
744
  /** Receives authenticated provider status events, when configured. */
687
745
  webhook?: Webhook | undefined
688
746
  }
@@ -734,6 +792,13 @@ export function canObserveDepositAddressRequest(provider: Provider): provider is
734
792
  return typeof provider.observeDepositAddressRequest === 'function'
735
793
  }
736
794
 
795
+ /** Narrows a funding provider to one that verifies submitted source transactions. */
796
+ export function canVerifySourceTransaction(provider: Provider): provider is Provider & {
797
+ verifySourceTransaction: NonNullable<Provider['verifySourceTransaction']>
798
+ } {
799
+ return typeof provider.verifySourceTransaction === 'function'
800
+ }
801
+
737
802
  /** Narrows a funding provider to one with authenticated webhook receipt. */
738
803
  export function canReceiveWebhook(provider: Provider): provider is Provider & {
739
804
  webhook: Webhook
@@ -952,6 +1017,7 @@ export function getQuoteCandidates(options: getQuoteCandidates.Options) {
952
1017
  .filter((entry) => provider === undefined || entry.provider.id === provider.id)
953
1018
  .map((entry) =>
954
1019
  createQuoteCandidate({
1020
+ configuration: entry.configuration,
955
1021
  destinationToken: entry.route.destination,
956
1022
  provider: entry.provider,
957
1023
  route: entry.route,
@@ -1124,20 +1190,17 @@ export async function prepareTransfer(
1124
1190
  candidates.map(async ({ candidate, provider }) => {
1125
1191
  const start = performance.now()
1126
1192
  try {
1193
+ const parameters = {
1194
+ candidate,
1195
+ method: options.method,
1196
+ mode: options.mode,
1197
+ recipient: options.recipient,
1198
+ sender: options.sender,
1199
+ slippageBps: options.slippageBps,
1200
+ }
1127
1201
  const parsed = schema.PrepareResult.safeParse(
1128
1202
  await withTimeout(
1129
- (signal) =>
1130
- provider.prepareTransfer(
1131
- {
1132
- candidate,
1133
- method: options.method,
1134
- mode: options.mode,
1135
- recipient: options.recipient,
1136
- sender: options.sender,
1137
- slippageBps: options.slippageBps,
1138
- },
1139
- signal,
1140
- ),
1203
+ (signal) => provider.prepareTransfer(parameters, signal),
1141
1204
  options.providerTimeoutMs ?? defaultPrepareTimeoutMs,
1142
1205
  ),
1143
1206
  )
@@ -1160,8 +1223,13 @@ export async function prepareTransfer(
1160
1223
  }
1161
1224
  if (result.action.type === 'evm:calls')
1162
1225
  try {
1226
+ const constraints = provider.validateTransferAction?.({
1227
+ ...parameters,
1228
+ action: result.action,
1229
+ })
1163
1230
  Action.validateEvmCalls({
1164
1231
  action: result.action,
1232
+ nativeValues: constraints?.nativeValues,
1165
1233
  sourceAmount: candidate.sourceAmount.amount,
1166
1234
  sourceTokenAddress: candidate.sourceToken.address,
1167
1235
  })
@@ -1275,7 +1343,14 @@ export function getDepositAddressCandidates(options: getDepositAddressCandidates
1275
1343
  const provider = options.providers.find((candidate) => candidate.id === entry.providerId)
1276
1344
  if (!provider || !canCreateDepositAddress(provider)) return []
1277
1345
  return [
1278
- { candidate: createDepositAddressCandidate({ provider, route: entry.route }), provider },
1346
+ {
1347
+ candidate: createDepositAddressCandidate({
1348
+ configuration: entry.configuration,
1349
+ provider,
1350
+ route: entry.route,
1351
+ }),
1352
+ provider,
1353
+ },
1279
1354
  ]
1280
1355
  })
1281
1356
  }
@@ -1308,6 +1383,9 @@ export function getPrepareCandidates(options: getPrepareCandidates.Options) {
1308
1383
  if (!amount.success) throw new InvalidAmountError()
1309
1384
  const sourceChain = resolveSourceChain(options.sourceChain, options.catalog)
1310
1385
  const destinationChainId = `eip155:${options.destinationChainId}`
1386
+ const selectedProvider = options.provider
1387
+ ? resolveProvider(options.provider, options.providers)
1388
+ : undefined
1311
1389
 
1312
1390
  return options.catalog.routes.flatMap((entry) => {
1313
1391
  if (entry.route.source.chain.id !== sourceChain.id) return []
@@ -1315,11 +1393,13 @@ export function getPrepareCandidates(options: getPrepareCandidates.Options) {
1315
1393
  if (!matchesToken(entry.route.source, options.sourceToken)) return []
1316
1394
  if (!matchesToken(entry.route.destination, options.destinationToken)) return []
1317
1395
  if (!entry.capabilities?.transfer?.modes.includes(options.mode)) return []
1318
- const provider = options.providers.find((candidate) => candidate.id === entry.providerId)
1319
- if (!provider || !canPrepareTransfer(provider)) return []
1396
+ const provider =
1397
+ selectedProvider ?? options.providers.find((candidate) => candidate.id === entry.providerId)
1398
+ if (!provider || provider.id !== entry.providerId || !canPrepareTransfer(provider)) return []
1320
1399
  return [
1321
1400
  {
1322
1401
  candidate: createQuoteCandidate({
1402
+ configuration: entry.configuration,
1323
1403
  destinationToken: entry.route.destination,
1324
1404
  provider,
1325
1405
  route: entry.route,
@@ -1349,6 +1429,8 @@ export declare namespace getPrepareCandidates {
1349
1429
  method: Transfer.Method
1350
1430
  /** Amount mode the caller selected. */
1351
1431
  mode: Transfer.Mode
1432
+ /** Funding provider ID selected by the caller. */
1433
+ provider?: string | undefined
1352
1434
  /** Funding providers considered by the request. */
1353
1435
  providers: readonly Provider[]
1354
1436
  /** Source amount in base units. */
@@ -1572,8 +1654,9 @@ function chainRef(chain: Chain): ChainRef {
1572
1654
  })
1573
1655
  }
1574
1656
 
1575
- function createDepositAddressCandidate(options: { provider: Provider; route: core_Route.Route }) {
1657
+ function createDepositAddressCandidate(options: createDepositAddressCandidate.Options) {
1576
1658
  return {
1659
+ ...(options.configuration ? { configuration: options.configuration } : {}),
1577
1660
  destinationChain: chainRef(options.route.destination.chain),
1578
1661
  destinationToken: tokenRef(options.route.destination),
1579
1662
  provider: schema.ProviderRef.parse(options.provider),
@@ -1583,14 +1666,17 @@ function createDepositAddressCandidate(options: { provider: Provider; route: cor
1583
1666
  } as const
1584
1667
  }
1585
1668
 
1586
- function createQuoteCandidate(options: {
1587
- destinationToken: Token
1588
- provider: Provider
1589
- route: core_Route.Route
1590
- sourceAmount: ReturnType<typeof resolveSourceAmount>
1591
- sourceToken: Token
1592
- }) {
1669
+ declare namespace createDepositAddressCandidate {
1670
+ type Options = {
1671
+ configuration?: core_Catalog.Configuration | undefined
1672
+ provider: Provider
1673
+ route: core_Route.Route
1674
+ }
1675
+ }
1676
+
1677
+ function createQuoteCandidate(options: createQuoteCandidate.Options) {
1593
1678
  return {
1679
+ ...(options.configuration ? { configuration: options.configuration } : {}),
1594
1680
  destinationChain: chainRef(options.destinationToken.chain),
1595
1681
  destinationToken: tokenRef(options.destinationToken),
1596
1682
  id: [
@@ -1608,6 +1694,17 @@ function createQuoteCandidate(options: {
1608
1694
  } as const
1609
1695
  }
1610
1696
 
1697
+ declare namespace createQuoteCandidate {
1698
+ type Options = {
1699
+ configuration?: core_Catalog.Configuration | undefined
1700
+ destinationToken: Token
1701
+ provider: Provider
1702
+ route: core_Route.Route
1703
+ sourceAmount: ReturnType<typeof resolveSourceAmount>
1704
+ sourceToken: Token
1705
+ }
1706
+ }
1707
+
1611
1708
  function normalizeInput(value: string) {
1612
1709
  return value.trim().toLowerCase()
1613
1710
  }
@@ -1807,7 +1904,7 @@ function resolveSourceChain(input: string, catalog: core_Catalog.Snapshot) {
1807
1904
 
1808
1905
  function getRoutes(catalog: core_Catalog.Snapshot, providers: readonly Provider[]) {
1809
1906
  return providers.flatMap((provider) =>
1810
- (catalog.routesByProvider.get(provider.id) ?? []).map((route) => ({ provider, route })),
1907
+ (catalog.routesByProvider.get(provider.id) ?? []).map((entry) => ({ ...entry, provider })),
1811
1908
  )
1812
1909
  }
1813
1910
 
@@ -1,10 +1,10 @@
1
- import { AbiEvent, Address, RpcTransport } from 'ox'
2
- import { createClient, custom, fallback } from 'viem'
1
+ import { AbiEvent, Address } from 'ox'
3
2
  import { getBlockNumber, getLogs } from 'viem/actions'
4
3
 
5
4
  import type * as Db from '../../db/Db.js'
6
5
  import * as FundingDepositAddresses from '../../db/tables/fundingDepositAddresses.js'
7
6
  import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
7
+ import * as Viem from '../Viem.js'
8
8
  import * as Value from '../Value.js'
9
9
  import * as Deposit from './Deposit.js'
10
10
 
@@ -52,13 +52,9 @@ export async function scan(options: scan.Options): Promise<scan.Result> {
52
52
  throw new ConfigurationError('source token address')
53
53
  if (options.rpcUrls.length === 0) throw new ConfigurationError('source RPC URL')
54
54
 
55
- const client = createClient({
56
- transport: fallback(
57
- options.rpcUrls.map((url) => {
58
- const transport = RpcTransport.fromHttp(url, { fetchFn: options.fetch ?? globalThis.fetch })
59
- return custom(transport, { retryCount: 0 })
60
- }),
61
- ),
55
+ const client = Viem.createEvmClient({
56
+ fetch: options.fetch ?? globalThis.fetch,
57
+ urls: options.rpcUrls,
62
58
  })
63
59
  const head = await getBlockNumber(client, { cacheTime: 0 })
64
60
  const confirmations = BigInt(options.confirmations ?? defaultConfirmations)
@@ -42,6 +42,7 @@ describe('canTransition', () => {
42
42
  "completed": [],
43
43
  "expired": [],
44
44
  "processing": [
45
+ "awaiting-source",
45
46
  "refunding",
46
47
  "completed",
47
48
  "action-required",
@@ -129,6 +130,160 @@ describe('create', () => {
129
130
  })
130
131
  })
131
132
 
133
+ describe('registerSourceTransaction', () => {
134
+ const transactionHash = `0x${'a2'.repeat(32)}`
135
+
136
+ test('atomically assigns source evidence and starts reconciliation', async () => {
137
+ const record = await Transfer.create(
138
+ db,
139
+ createInput({
140
+ providerState: {
141
+ routeConfiguration: {
142
+ destinationPoolAddress: `0x${'cc'.repeat(20)}`,
143
+ poolAddress: `0x${'dd'.repeat(20)}`,
144
+ sourceEid: 30_184,
145
+ },
146
+ },
147
+ snapshot: TestFunding.transferSnapshot({ provider: { id: 'stargate', name: 'Stargate' } }),
148
+ }),
149
+ )
150
+ vi.setSystemTime(new Date('2026-01-01T00:00:10.000Z'))
151
+ const result = await Transfer.registerSourceTransaction(db, {
152
+ chainId: 'eip155:8453',
153
+ id: record.id,
154
+ providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
155
+ transactionHash: `0x${'a1'.repeat(32)}`,
156
+ })
157
+ expect(result.type).toBe('registered')
158
+ if (result.type !== 'registered') return
159
+ expect({
160
+ providerState: result.record.providerState,
161
+ sourceTransactionHashes: result.record.snapshot.sourceTransactionHashes,
162
+ status: result.record.status,
163
+ version: result.record.version,
164
+ }).toMatchInlineSnapshot(`
165
+ {
166
+ "providerState": {
167
+ "routeConfiguration": {
168
+ "destinationPoolAddress": "0xcccccccccccccccccccccccccccccccccccccccc",
169
+ "poolAddress": "0xdddddddddddddddddddddddddddddddddddddddd",
170
+ "sourceEid": 30184,
171
+ },
172
+ "stargate": {
173
+ "guid": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
174
+ "sourceEid": 30184,
175
+ },
176
+ },
177
+ "sourceTransactionHashes": [
178
+ "0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1",
179
+ ],
180
+ "status": "processing",
181
+ "version": 2,
182
+ }
183
+ `)
184
+ })
185
+
186
+ test('replays the same assignment and rejects reuse by another transfer', async () => {
187
+ const first = await Transfer.create(db, createInput())
188
+ const second = await Transfer.create(db, createInput())
189
+ const options = {
190
+ chainId: 'eip155:8453',
191
+ id: first.id,
192
+ providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
193
+ transactionHash,
194
+ }
195
+ await Transfer.registerSourceTransaction(db, options)
196
+ const replayed = await Transfer.registerSourceTransaction(db, options)
197
+ const conflict = await Transfer.registerSourceTransaction(db, { ...options, id: second.id })
198
+ expect({
199
+ conflict: conflict.type,
200
+ replayed: replayed.type,
201
+ replayedVersion: replayed.type === 'replayed' ? replayed.record.version : undefined,
202
+ }).toEqual({ conflict: 'conflict', replayed: 'replayed', replayedVersion: 2 })
203
+ })
204
+ })
205
+
206
+ describe('reopenSourceTransaction', () => {
207
+ test('removes invalidated source evidence and accepts a replacement', async () => {
208
+ const record = await Transfer.create(db, createInput())
209
+ const transactionHash = `0x${'a4'.repeat(32)}`
210
+ await Transfer.registerSourceTransaction(db, {
211
+ chainId: 'eip155:8453',
212
+ id: record.id,
213
+ providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
214
+ transactionHash,
215
+ })
216
+
217
+ const reopened = await Transfer.reopenSourceTransaction(db, {
218
+ chainId: 'eip155:8453',
219
+ id: record.id,
220
+ providerState: { routeConfiguration: { poolAddress: `0x${'cc'.repeat(20)}` } },
221
+ transactionHash: transactionHash.toUpperCase(),
222
+ })
223
+ expect(reopened.type).toBe('reopened')
224
+ if (reopened.type !== 'reopened') return
225
+ expect({
226
+ providerState: reopened.record.providerState,
227
+ sourceTransactionHashes: reopened.record.snapshot.sourceTransactionHashes,
228
+ status: reopened.record.status,
229
+ version: reopened.record.version,
230
+ }).toEqual({
231
+ providerState: { routeConfiguration: { poolAddress: `0x${'cc'.repeat(20)}` } },
232
+ sourceTransactionHashes: undefined,
233
+ status: 'awaiting-source',
234
+ version: 3,
235
+ })
236
+
237
+ const replacement = await Transfer.registerSourceTransaction(db, {
238
+ chainId: 'eip155:8453',
239
+ id: record.id,
240
+ providerState: { stargate: { guid: `0x${'dd'.repeat(32)}`, sourceEid: 30_184 } },
241
+ transactionHash: `0x${'a5'.repeat(32)}`,
242
+ })
243
+ expect(replacement.type).toBe('registered')
244
+ })
245
+ })
246
+
247
+ describe('complete', () => {
248
+ test('records verified destination evidence and completes once', async () => {
249
+ const record = await Transfer.create(db, createInput())
250
+ await Transfer.registerSourceTransaction(db, {
251
+ chainId: 'eip155:8453',
252
+ id: record.id,
253
+ providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
254
+ transactionHash: `0x${'a3'.repeat(32)}`,
255
+ })
256
+ const options = {
257
+ chainId: 'eip155:4217',
258
+ destinationAmount: TestFunding.transferSnapshot().destinationAmount!,
259
+ id: record.id,
260
+ transactionHash: `0x${'cc'.repeat(32)}`,
261
+ }
262
+ const completed = await Transfer.complete(db, options)
263
+ const replayed = await Transfer.complete(db, options)
264
+ expect({
265
+ completed: completed.type,
266
+ destinationTransactionHashes:
267
+ completed.type === 'completed'
268
+ ? completed.record.snapshot.destinationTransactionHashes
269
+ : undefined,
270
+ replayed: replayed.type,
271
+ status: completed.type === 'completed' ? completed.record.status : undefined,
272
+ version: completed.type === 'completed' ? completed.record.version : undefined,
273
+ }).toMatchInlineSnapshot(`
274
+ {
275
+ "completed": "completed",
276
+ "destinationTransactionHashes": [
277
+ "0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
278
+ ],
279
+ "replayed": "replayed",
280
+ "status": "completed",
281
+ "version": 3,
282
+ }
283
+ `)
284
+ })
285
+ })
286
+
132
287
  describe('transition', () => {
133
288
  test('applies a guarded status change and appends an event', async () => {
134
289
  const record = await Transfer.create(db, createInput())