tapimo 0.11.0 → 0.13.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 (443) hide show
  1. package/dist/App.d.ts +6396 -4575
  2. package/dist/App.d.ts.map +1 -1
  3. package/dist/App.js +39 -4
  4. package/dist/App.js.map +1 -1
  5. package/dist/Assets.d.ts +15 -0
  6. package/dist/Assets.d.ts.map +1 -1
  7. package/dist/Assets.js +7 -0
  8. package/dist/Assets.js.map +1 -1
  9. package/dist/Scope.d.ts +2 -0
  10. package/dist/Scope.d.ts.map +1 -1
  11. package/dist/Scope.js +17 -0
  12. package/dist/Scope.js.map +1 -1
  13. package/dist/admin/App.d.ts +176 -78
  14. package/dist/admin/App.d.ts.map +1 -1
  15. package/dist/admin/apps/api-keys.d.ts +84 -4
  16. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  17. package/dist/admin/apps/api-keys.js +54 -0
  18. package/dist/admin/apps/api-keys.js.map +1 -1
  19. package/dist/admin/apps/earn-vaults.d.ts +123 -9
  20. package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
  21. package/dist/admin/apps/earn-vaults.js +60 -7
  22. package/dist/admin/apps/earn-vaults.js.map +1 -1
  23. package/dist/admin/apps/organizations.d.ts.map +1 -1
  24. package/dist/admin/apps/organizations.js +4 -2
  25. package/dist/admin/apps/organizations.js.map +1 -1
  26. package/dist/admin/apps/verified-tokens.d.ts +90 -90
  27. package/dist/admin/ui.generated.d.ts +1 -1
  28. package/dist/admin/ui.generated.js +71 -71
  29. package/dist/admin/ui.generated.js.map +1 -1
  30. package/dist/apps/Zones.d.ts +16 -16
  31. package/dist/apps/Zones.js +4 -4
  32. package/dist/apps/data/App.d.ts +1699 -749
  33. package/dist/apps/data/App.d.ts.map +1 -1
  34. package/dist/apps/data/App.js +58 -9
  35. package/dist/apps/data/App.js.map +1 -1
  36. package/dist/apps/data/ZoneSelection.d.ts +62 -0
  37. package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
  38. package/dist/apps/data/ZoneSelection.js +44 -0
  39. package/dist/apps/data/ZoneSelection.js.map +1 -0
  40. package/dist/apps/data/routes/activities.d.ts +2417 -50
  41. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  42. package/dist/apps/data/routes/activities.js +1896 -1293
  43. package/dist/apps/data/routes/activities.js.map +1 -1
  44. package/dist/apps/data/routes/addresses.d.ts +471 -340
  45. package/dist/apps/data/routes/addresses.d.ts.map +1 -1
  46. package/dist/apps/data/routes/balances.d.ts +12 -12
  47. package/dist/apps/data/routes/balances.d.ts.map +1 -1
  48. package/dist/apps/data/routes/balances.js +44 -17
  49. package/dist/apps/data/routes/balances.js.map +1 -1
  50. package/dist/apps/data/routes/blocks.d.ts +42 -42
  51. package/dist/apps/data/routes/blocks.d.ts.map +1 -1
  52. package/dist/apps/data/routes/blocks.js +22 -12
  53. package/dist/apps/data/routes/blocks.js.map +1 -1
  54. package/dist/apps/data/routes/coingecko.d.ts +179 -179
  55. package/dist/apps/data/routes/earn.d.ts +144 -19
  56. package/dist/apps/data/routes/earn.d.ts.map +1 -1
  57. package/dist/apps/data/routes/earn.js +160 -28
  58. package/dist/apps/data/routes/earn.js.map +1 -1
  59. package/dist/apps/data/routes/exchanges.d.ts +719 -13
  60. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  61. package/dist/apps/data/routes/exchanges.js +16 -13
  62. package/dist/apps/data/routes/exchanges.js.map +1 -1
  63. package/dist/apps/data/routes/fee-amm.d.ts +2 -2
  64. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  65. package/dist/apps/data/routes/fee-amm.js +9 -11
  66. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  67. package/dist/apps/data/routes/indexer.d.ts +34 -34
  68. package/dist/apps/data/routes/receipts.d.ts +363 -263
  69. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  70. package/dist/apps/data/routes/receipts.js +29 -11
  71. package/dist/apps/data/routes/receipts.js.map +1 -1
  72. package/dist/apps/data/routes/rpc.js +24 -10
  73. package/dist/apps/data/routes/rpc.js.map +1 -1
  74. package/dist/apps/data/routes/tokenlist.d.ts +13 -13
  75. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  76. package/dist/apps/data/routes/tokenlist.js +16 -15
  77. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  78. package/dist/apps/data/routes/tokens.d.ts +112 -98
  79. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  80. package/dist/apps/data/routes/tokens.js +85 -35
  81. package/dist/apps/data/routes/tokens.js.map +1 -1
  82. package/dist/apps/data/routes/transactions.d.ts +7 -2
  83. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  84. package/dist/apps/data/routes/transactions.js +38 -18
  85. package/dist/apps/data/routes/transactions.js.map +1 -1
  86. package/dist/apps/data/routes/transfers.d.ts +1 -1
  87. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  88. package/dist/apps/data/routes/transfers.js +25 -21
  89. package/dist/apps/data/routes/transfers.js.map +1 -1
  90. package/dist/apps/data/routes/valuation.d.ts +1 -1
  91. package/dist/apps/data/routes/valuation.d.ts.map +1 -1
  92. package/dist/apps/data/routes/valuation.js +12 -7
  93. package/dist/apps/data/routes/valuation.js.map +1 -1
  94. package/dist/apps/data/routes/verified-tokens.d.ts +3 -3
  95. package/dist/apps/data/routes/webhooks.d.ts +15 -15
  96. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  97. package/dist/apps/data/routes/webhooks.js +2 -2
  98. package/dist/apps/data/routes/webhooks.js.map +1 -1
  99. package/dist/apps/data/routes/zones.d.ts +32 -32
  100. package/dist/apps/data/routes/zones.js +1 -1
  101. package/dist/apps/funding/App.d.ts +38 -27
  102. package/dist/apps/funding/App.d.ts.map +1 -1
  103. package/dist/apps/funding/routes/chains.d.ts.map +1 -1
  104. package/dist/apps/funding/routes/chains.js +5 -4
  105. package/dist/apps/funding/routes/chains.js.map +1 -1
  106. package/dist/apps/funding/routes/deposit-addresses.d.ts +16 -16
  107. package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
  108. package/dist/apps/funding/routes/deposit-addresses.js +24 -19
  109. package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
  110. package/dist/apps/funding/routes/providers.d.ts +13 -13
  111. package/dist/apps/funding/routes/providers.d.ts.map +1 -1
  112. package/dist/apps/funding/routes/providers.js +3 -2
  113. package/dist/apps/funding/routes/providers.js.map +1 -1
  114. package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
  115. package/dist/apps/funding/routes/quotes.js +2 -2
  116. package/dist/apps/funding/routes/quotes.js.map +1 -1
  117. package/dist/apps/funding/routes/transfers.d.ts +60 -48
  118. package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
  119. package/dist/apps/funding/routes/transfers.js +27 -19
  120. package/dist/apps/funding/routes/transfers.js.map +1 -1
  121. package/dist/apps/management/App.d.ts +4558 -3700
  122. package/dist/apps/management/App.d.ts.map +1 -1
  123. package/dist/apps/management/Billing.d.ts.map +1 -1
  124. package/dist/apps/management/Billing.js +19 -6
  125. package/dist/apps/management/Billing.js.map +1 -1
  126. package/dist/apps/management/routes/api-keys.d.ts +786 -175
  127. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  128. package/dist/apps/management/routes/api-keys.js +312 -34
  129. package/dist/apps/management/routes/api-keys.js.map +1 -1
  130. package/dist/apps/management/routes/billing.d.ts +103 -30
  131. package/dist/apps/management/routes/billing.d.ts.map +1 -1
  132. package/dist/apps/management/routes/billing.js +91 -32
  133. package/dist/apps/management/routes/billing.js.map +1 -1
  134. package/dist/apps/management/routes/faucet.d.ts +35 -35
  135. package/dist/apps/management/routes/faucet.d.ts.map +1 -1
  136. package/dist/apps/management/routes/faucet.js +23 -12
  137. package/dist/apps/management/routes/faucet.js.map +1 -1
  138. package/dist/apps/management/routes/invitations.d.ts +46 -13
  139. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  140. package/dist/apps/management/routes/invitations.js +79 -29
  141. package/dist/apps/management/routes/invitations.js.map +1 -1
  142. package/dist/apps/management/routes/invite-links.d.ts +120 -75
  143. package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
  144. package/dist/apps/management/routes/invite-links.js +100 -41
  145. package/dist/apps/management/routes/invite-links.js.map +1 -1
  146. package/dist/apps/management/routes/me.d.ts +5 -5
  147. package/dist/apps/management/routes/me.d.ts.map +1 -1
  148. package/dist/apps/management/routes/me.js +14 -10
  149. package/dist/apps/management/routes/me.js.map +1 -1
  150. package/dist/apps/management/routes/members.d.ts +99 -78
  151. package/dist/apps/management/routes/members.d.ts.map +1 -1
  152. package/dist/apps/management/routes/members.js +37 -18
  153. package/dist/apps/management/routes/members.js.map +1 -1
  154. package/dist/apps/management/routes/orgs.d.ts +48 -8
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +48 -19
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +108 -46
  159. package/dist/apps/management/routes/projects.d.ts.map +1 -1
  160. package/dist/apps/management/routes/projects.js +72 -21
  161. package/dist/apps/management/routes/projects.js.map +1 -1
  162. package/dist/apps/management/routes/scopes.d.ts.map +1 -1
  163. package/dist/apps/management/routes/scopes.js +8 -5
  164. package/dist/apps/management/routes/scopes.js.map +1 -1
  165. package/dist/apps/management/routes/usage.d.ts +82 -82
  166. package/dist/apps/management/routes/usage.d.ts.map +1 -1
  167. package/dist/apps/management/routes/usage.js +41 -31
  168. package/dist/apps/management/routes/usage.js.map +1 -1
  169. package/dist/apps/management/routes/verified-token-requests.d.ts +35 -7
  170. package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
  171. package/dist/apps/management/routes/verified-token-requests.js +36 -17
  172. package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
  173. package/dist/apps/management/routes/webhooks.d.ts +200 -183
  174. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  175. package/dist/apps/management/routes/webhooks.js +80 -35
  176. package/dist/apps/management/routes/webhooks.js.map +1 -1
  177. package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
  178. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
  179. package/dist/apps/mpp/internal/Adapter.js +12 -0
  180. package/dist/apps/mpp/internal/Adapter.js.map +1 -1
  181. package/dist/db/Db.d.ts +2 -0
  182. package/dist/db/Db.d.ts.map +1 -1
  183. package/dist/db/Db.js +52 -1
  184. package/dist/db/Db.js.map +1 -1
  185. package/dist/db/Schema.d.ts +26 -3
  186. package/dist/db/Schema.d.ts.map +1 -1
  187. package/dist/db/Schema.js +24 -5
  188. package/dist/db/Schema.js.map +1 -1
  189. package/dist/db/tables/earnVaults.d.ts +5 -1
  190. package/dist/db/tables/earnVaults.d.ts.map +1 -1
  191. package/dist/db/tables/earnVaults.js +5 -0
  192. package/dist/db/tables/earnVaults.js.map +1 -1
  193. package/dist/db/tables/fundingCatalog.d.ts +4 -2
  194. package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
  195. package/dist/db/tables/fundingCatalog.js +5 -1
  196. package/dist/db/tables/fundingCatalog.js.map +1 -1
  197. package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
  198. package/dist/db/tables/webhookDeliveries.js +10 -0
  199. package/dist/db/tables/webhookDeliveries.js.map +1 -1
  200. package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
  201. package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
  202. package/dist/db/tables/webhookQueueCompletions.js +32 -0
  203. package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
  204. package/dist/db/tables/webhookQueueEvents.d.ts +14 -20
  205. package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
  206. package/dist/db/tables/webhookQueueEvents.js +68 -47
  207. package/dist/db/tables/webhookQueueEvents.js.map +1 -1
  208. package/dist/db/tables/webhookSubscriptions.d.ts +16 -5
  209. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  210. package/dist/db/tables/webhookSubscriptions.js +29 -5
  211. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  212. package/dist/handlers/internal/utils.d.ts.map +1 -1
  213. package/dist/handlers/internal/utils.js +9 -0
  214. package/dist/handlers/internal/utils.js.map +1 -1
  215. package/dist/internal/Auth.d.ts +11 -2
  216. package/dist/internal/Auth.d.ts.map +1 -1
  217. package/dist/internal/Auth.js +19 -6
  218. package/dist/internal/Auth.js.map +1 -1
  219. package/dist/internal/Cache.d.ts.map +1 -1
  220. package/dist/internal/Cache.js +11 -7
  221. package/dist/internal/Cache.js.map +1 -1
  222. package/dist/internal/EarnVaults.d.ts +43 -4
  223. package/dist/internal/EarnVaults.d.ts.map +1 -1
  224. package/dist/internal/EarnVaults.js +167 -0
  225. package/dist/internal/EarnVaults.js.map +1 -1
  226. package/dist/internal/Fetch.d.ts +23 -0
  227. package/dist/internal/Fetch.d.ts.map +1 -0
  228. package/dist/internal/Fetch.js +26 -0
  229. package/dist/internal/Fetch.js.map +1 -0
  230. package/dist/internal/Log.d.ts +3 -1
  231. package/dist/internal/Log.d.ts.map +1 -1
  232. package/dist/internal/Log.js +16 -3
  233. package/dist/internal/Log.js.map +1 -1
  234. package/dist/internal/OpenApi.d.ts +30 -24
  235. package/dist/internal/OpenApi.d.ts.map +1 -1
  236. package/dist/internal/OpenApi.js +140 -41
  237. package/dist/internal/OpenApi.js.map +1 -1
  238. package/dist/internal/Response.d.ts +14 -9
  239. package/dist/internal/Response.d.ts.map +1 -1
  240. package/dist/internal/Response.js +16 -5
  241. package/dist/internal/Response.js.map +1 -1
  242. package/dist/internal/Schema.d.ts +11 -10
  243. package/dist/internal/Schema.d.ts.map +1 -1
  244. package/dist/internal/Schema.js +14 -9
  245. package/dist/internal/Schema.js.map +1 -1
  246. package/dist/internal/Store.d.ts +28 -6
  247. package/dist/internal/Store.d.ts.map +1 -1
  248. package/dist/internal/Store.js +121 -25
  249. package/dist/internal/Store.js.map +1 -1
  250. package/dist/internal/Tidx.d.ts +2 -0
  251. package/dist/internal/Tidx.d.ts.map +1 -1
  252. package/dist/internal/Tidx.js +23 -6
  253. package/dist/internal/Tidx.js.map +1 -1
  254. package/dist/internal/Timeout.d.ts +36 -0
  255. package/dist/internal/Timeout.d.ts.map +1 -0
  256. package/dist/internal/Timeout.js +37 -0
  257. package/dist/internal/Timeout.js.map +1 -0
  258. package/dist/internal/Timing.d.ts +9 -0
  259. package/dist/internal/Timing.d.ts.map +1 -1
  260. package/dist/internal/Timing.js +7 -0
  261. package/dist/internal/Timing.js.map +1 -1
  262. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  263. package/dist/internal/WebhookDestination.js +3 -0
  264. package/dist/internal/WebhookDestination.js.map +1 -1
  265. package/dist/internal/Webhooks.d.ts +29 -12
  266. package/dist/internal/Webhooks.d.ts.map +1 -1
  267. package/dist/internal/Webhooks.js +37 -20
  268. package/dist/internal/Webhooks.js.map +1 -1
  269. package/dist/internal/funding/Action.d.ts +9 -0
  270. package/dist/internal/funding/Action.d.ts.map +1 -1
  271. package/dist/internal/funding/Action.js +16 -8
  272. package/dist/internal/funding/Action.js.map +1 -1
  273. package/dist/internal/funding/Catalog.d.ts +9 -2
  274. package/dist/internal/funding/Catalog.d.ts.map +1 -1
  275. package/dist/internal/funding/Catalog.js +19 -8
  276. package/dist/internal/funding/Catalog.js.map +1 -1
  277. package/dist/internal/funding/Deposit.d.ts +2 -2
  278. package/dist/internal/funding/Deposit.d.ts.map +1 -1
  279. package/dist/internal/funding/Deposit.js +9 -8
  280. package/dist/internal/funding/Deposit.js.map +1 -1
  281. package/dist/internal/funding/DepositAddress.d.ts +4 -4
  282. package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
  283. package/dist/internal/funding/DepositAddress.js +9 -8
  284. package/dist/internal/funding/DepositAddress.js.map +1 -1
  285. package/dist/internal/funding/Provider.d.ts +68 -13
  286. package/dist/internal/funding/Provider.d.ts.map +1 -1
  287. package/dist/internal/funding/Provider.js +42 -20
  288. package/dist/internal/funding/Provider.js.map +1 -1
  289. package/dist/internal/funding/Transfer.d.ts +13 -12
  290. package/dist/internal/funding/Transfer.d.ts.map +1 -1
  291. package/dist/internal/funding/Transfer.js +23 -21
  292. package/dist/internal/funding/Transfer.js.map +1 -1
  293. package/dist/internal/funding/providers/stargate.d.ts +38 -0
  294. package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
  295. package/dist/internal/funding/providers/stargate.js +277 -0
  296. package/dist/internal/funding/providers/stargate.js.map +1 -0
  297. package/dist/internal/index.d.ts +1 -0
  298. package/dist/internal/index.d.ts.map +1 -1
  299. package/dist/internal/index.js +1 -0
  300. package/dist/internal/index.js.map +1 -1
  301. package/dist/providers/index.d.ts +7 -0
  302. package/dist/providers/index.d.ts.map +1 -1
  303. package/dist/providers/index.js +3 -0
  304. package/dist/providers/index.js.map +1 -1
  305. package/package.json +3 -3
  306. package/src/App.test.ts +148 -0
  307. package/src/App.ts +45 -4
  308. package/src/Assets.test.ts +18 -0
  309. package/src/Assets.ts +22 -0
  310. package/src/Client.test-d.ts +311 -16
  311. package/src/Scope.test.ts +20 -0
  312. package/src/Scope.ts +16 -0
  313. package/src/admin/apps/api-keys.test.ts +75 -0
  314. package/src/admin/apps/api-keys.ts +64 -0
  315. package/src/admin/apps/earn-vaults.test.ts +143 -0
  316. package/src/admin/apps/earn-vaults.ts +84 -7
  317. package/src/admin/apps/organizations.ts +6 -2
  318. package/src/admin/ui/src/lib/api-keys.ts +19 -0
  319. package/src/admin/ui/src/routes/api-keys.tsx +125 -2
  320. package/src/admin/ui.generated.ts +71 -71
  321. package/src/apps/Zones.test.ts +4 -4
  322. package/src/apps/Zones.ts +4 -4
  323. package/src/apps/composition.test.ts +1 -1
  324. package/src/apps/data/App.test.ts +72 -0
  325. package/src/apps/data/App.ts +58 -10
  326. package/src/apps/data/ZoneSelection.test.ts +196 -0
  327. package/src/apps/data/ZoneSelection.ts +108 -0
  328. package/src/apps/data/routes/activities.test.ts +1843 -2
  329. package/src/apps/data/routes/activities.ts +2211 -1388
  330. package/src/apps/data/routes/balances.ts +134 -98
  331. package/src/apps/data/routes/blocks.test.ts +533 -0
  332. package/src/apps/data/routes/blocks.ts +36 -17
  333. package/src/apps/data/routes/earn.test.ts +187 -25
  334. package/src/apps/data/routes/earn.ts +228 -32
  335. package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
  336. package/src/apps/data/routes/exchanges.test.ts +31 -1
  337. package/src/apps/data/routes/exchanges.ts +19 -15
  338. package/src/apps/data/routes/fee-amm.ts +18 -11
  339. package/src/apps/data/routes/receipts.ts +48 -17
  340. package/src/apps/data/routes/rpc.test.ts +75 -0
  341. package/src/apps/data/routes/rpc.ts +23 -9
  342. package/src/apps/data/routes/tokenlist.ts +21 -18
  343. package/src/apps/data/routes/tokens.test.ts +607 -0
  344. package/src/apps/data/routes/tokens.ts +312 -231
  345. package/src/apps/data/routes/transactions.ts +69 -30
  346. package/src/apps/data/routes/transfers.test.ts +424 -3
  347. package/src/apps/data/routes/transfers.ts +57 -36
  348. package/src/apps/data/routes/valuation.ts +94 -78
  349. package/src/apps/data/routes/webhooks.ts +6 -2
  350. package/src/apps/data/routes/zones.test.ts +21 -15
  351. package/src/apps/data/routes/zones.ts +1 -1
  352. package/src/apps/funding/routes/chains.test.ts +211 -7
  353. package/src/apps/funding/routes/chains.ts +19 -12
  354. package/src/apps/funding/routes/deposit-addresses.test.ts +416 -0
  355. package/src/apps/funding/routes/deposit-addresses.ts +101 -84
  356. package/src/apps/funding/routes/providers.ts +9 -5
  357. package/src/apps/funding/routes/quotes.test.ts +42 -0
  358. package/src/apps/funding/routes/quotes.ts +8 -5
  359. package/src/apps/funding/routes/transfers.test.ts +430 -40
  360. package/src/apps/funding/routes/transfers.ts +76 -59
  361. package/src/apps/management/Billing.test.ts +26 -0
  362. package/src/apps/management/Billing.ts +24 -7
  363. package/src/apps/management/routes/api-keys.test.ts +398 -0
  364. package/src/apps/management/routes/api-keys.ts +481 -145
  365. package/src/apps/management/routes/billing.test.ts +209 -0
  366. package/src/apps/management/routes/billing.ts +254 -177
  367. package/src/apps/management/routes/faucet.test.ts +39 -0
  368. package/src/apps/management/routes/faucet.ts +75 -41
  369. package/src/apps/management/routes/invitations.test.ts +216 -0
  370. package/src/apps/management/routes/invitations.ts +186 -109
  371. package/src/apps/management/routes/invite-links.test.ts +263 -1
  372. package/src/apps/management/routes/invite-links.ts +295 -214
  373. package/src/apps/management/routes/me.test.ts +49 -0
  374. package/src/apps/management/routes/me.ts +42 -32
  375. package/src/apps/management/routes/members.test.ts +124 -1
  376. package/src/apps/management/routes/members.ts +81 -51
  377. package/src/apps/management/routes/orgs.test.ts +176 -0
  378. package/src/apps/management/routes/orgs.ts +101 -59
  379. package/src/apps/management/routes/projects.test.ts +183 -0
  380. package/src/apps/management/routes/projects.ts +124 -60
  381. package/src/apps/management/routes/scopes.test.ts +44 -0
  382. package/src/apps/management/routes/scopes.ts +37 -28
  383. package/src/apps/management/routes/usage.test.ts +92 -0
  384. package/src/apps/management/routes/usage.ts +186 -151
  385. package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
  386. package/src/apps/management/routes/verified-token-requests.ts +166 -133
  387. package/src/apps/management/routes/webhooks.test.ts +234 -0
  388. package/src/apps/management/routes/webhooks.ts +191 -78
  389. package/src/apps/mpp/internal/Adapter.ts +13 -1
  390. package/src/db/Db.test.ts +41 -0
  391. package/src/db/Db.ts +75 -1
  392. package/src/db/Schema.ts +33 -5
  393. package/src/db/tables/earnVaults.test.ts +22 -0
  394. package/src/db/tables/earnVaults.ts +11 -1
  395. package/src/db/tables/fundingCatalog.test.ts +16 -2
  396. package/src/db/tables/fundingCatalog.ts +9 -3
  397. package/src/db/tables/webhookDeliveries.ts +13 -0
  398. package/src/db/tables/webhookQueueCompletions.ts +55 -0
  399. package/src/db/tables/webhookQueueEvents.ts +95 -61
  400. package/src/db/tables/webhookSubscriptions.ts +45 -6
  401. package/src/handlers/internal/utils.test.ts +53 -0
  402. package/src/handlers/internal/utils.ts +15 -0
  403. package/src/internal/Auth.ts +35 -9
  404. package/src/internal/Cache.ts +14 -7
  405. package/src/internal/EarnVaults.capabilities.test.ts +33 -0
  406. package/src/internal/EarnVaults.test.ts +79 -0
  407. package/src/internal/EarnVaults.ts +277 -0
  408. package/src/internal/Fetch.test.ts +46 -0
  409. package/src/internal/Fetch.ts +56 -0
  410. package/src/internal/Log.test.ts +21 -0
  411. package/src/internal/Log.ts +20 -5
  412. package/src/internal/OpenApi.ts +177 -51
  413. package/src/internal/Response.test.ts +95 -0
  414. package/src/internal/Response.ts +41 -3
  415. package/src/internal/Schema.test.ts +18 -0
  416. package/src/internal/Schema.ts +19 -9
  417. package/src/internal/Store.test.ts +364 -0
  418. package/src/internal/Store.ts +153 -27
  419. package/src/internal/Tidx.test.ts +21 -1
  420. package/src/internal/Tidx.ts +23 -6
  421. package/src/internal/Timeout.test.ts +35 -0
  422. package/src/internal/Timeout.ts +73 -0
  423. package/src/internal/Timing.ts +16 -0
  424. package/src/internal/WebhookDestination.ts +3 -0
  425. package/src/internal/Webhooks.test.ts +122 -8
  426. package/src/internal/Webhooks.ts +59 -29
  427. package/src/internal/funding/Action.test.ts +41 -1
  428. package/src/internal/funding/Action.ts +69 -41
  429. package/src/internal/funding/Catalog.test.ts +34 -0
  430. package/src/internal/funding/Catalog.ts +28 -11
  431. package/src/internal/funding/Deposit.ts +71 -64
  432. package/src/internal/funding/DepositAddress.ts +50 -43
  433. package/src/internal/funding/Provider.test.ts +73 -0
  434. package/src/internal/funding/Provider.ts +246 -170
  435. package/src/internal/funding/Transfer.ts +133 -110
  436. package/src/internal/funding/providers/index.test.ts +22 -0
  437. package/src/internal/funding/providers/relay.test.ts +2 -2
  438. package/src/internal/funding/providers/stargate.test.ts +163 -0
  439. package/src/internal/funding/providers/stargate.ts +409 -0
  440. package/src/internal/index.test.ts +1 -0
  441. package/src/internal/index.ts +1 -0
  442. package/src/providers/index.test.ts +1 -0
  443. package/src/providers/index.ts +9 -0
@@ -16,6 +16,8 @@ import * as Idempotency from '../../../internal/Idempotency.js'
16
16
 
17
17
  import * as Relay from '../../../internal/funding/providers/relay.js'
18
18
 
19
+ import * as Stargate from '../../../internal/funding/providers/stargate.js'
20
+
19
21
  import * as TestApp from '../../../../test/App.js'
20
22
 
21
23
  import * as TestFunding from '../../../../test/Funding.js'
@@ -29,8 +31,14 @@ const executableProviders = [
29
31
  {
30
32
  create: (_sender: string) =>
31
33
  Relay.relay(process.env.RELAY_API_KEY ? { apiKey: process.env.RELAY_API_KEY } : {}),
34
+ destinationToken: 'pathusd',
32
35
  id: 'relay',
33
36
  },
37
+ {
38
+ create: (_sender: string) => Stargate.stargate(),
39
+ destinationToken: 'usdce',
40
+ id: 'stargate',
41
+ },
34
42
  ] as const
35
43
 
36
44
  beforeAll(() => TestFunding.publish(db))
@@ -39,6 +47,29 @@ function create(options: TestApp.create.Options = {}) {
39
47
  return TestApp.create({ ...options, db })
40
48
  }
41
49
 
50
+ type ContractResponse = {
51
+ $ref?: string | undefined
52
+ content?: Record<string, { schema: unknown }> | undefined
53
+ }
54
+
55
+ type JsonSchema = {
56
+ $ref?: string | undefined
57
+ additionalProperties?: boolean | undefined
58
+ examples?: readonly unknown[] | undefined
59
+ properties?: Record<string, JsonSchema> | undefined
60
+ required?: readonly string[] | undefined
61
+ }
62
+
63
+ type ComponentSpec = {
64
+ components: { schemas: Record<string, JsonSchema> }
65
+ }
66
+
67
+ function dereference(spec: ComponentSpec, schema: JsonSchema): JsonSchema {
68
+ if (!schema.$ref) return schema
69
+ const name = schema.$ref.split('/').at(-1)!
70
+ return spec.components.schemas[name]!
71
+ }
72
+
42
73
  describe('GET /funding/transfers', () => {
43
74
  test('requires the funding:read scope', async () => {
44
75
  const app = transfersApp()
@@ -359,6 +390,69 @@ describe('POST /funding/transfers', () => {
359
390
  expect(row.providerState).toEqual({ requestId: `0x${'ab'.repeat(32)}` })
360
391
  })
361
392
 
393
+ test('creates a transfer with the requested provider', async () => {
394
+ const app = transfersApp({ providers: [provider()] })
395
+ const response = await postTransfer(app, {
396
+ body: { ...createBody, provider: 'relay' },
397
+ idempotencyKey: nextIdempotencyKey(),
398
+ })
399
+
400
+ expect(response.status).toBe(200)
401
+ const body = await TestApp.json(response, Funding.schema.createFundingTransfer.Response)
402
+ expect(body.provider.id).toBe('relay')
403
+ })
404
+
405
+ test('rejects an unsupported provider', async () => {
406
+ const app = transfersApp({ providers: [provider()] })
407
+ const response = await postTransfer(app, {
408
+ body: { ...createBody, provider: 'bridge' },
409
+ idempotencyKey: nextIdempotencyKey(),
410
+ })
411
+
412
+ expect(response.status).toBe(400)
413
+ expect(((await response.json()) as { error: { code: string } }).error.code).toBe('body_invalid')
414
+ })
415
+
416
+ test('preserves a provider-specified native fee token', async () => {
417
+ const app = transfersApp({
418
+ providers: [
419
+ provider(async () => ({
420
+ ...providerResponse(),
421
+ fees: [
422
+ {
423
+ amount: '1000000000000000',
424
+ side: 'source',
425
+ token: {
426
+ address: '0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee',
427
+ currency: 'ETH',
428
+ decimals: 18,
429
+ name: 'Ether',
430
+ standard: 'native',
431
+ symbol: 'ETH',
432
+ tokenKey: 'eip155:8453/slip44:60',
433
+ verified: true,
434
+ },
435
+ },
436
+ ],
437
+ })),
438
+ ],
439
+ })
440
+ const response = await postTransfer(app, {
441
+ body: { ...createBody, destinationToken: 'pathusd', sourceToken: 'usdc' },
442
+ idempotencyKey: nextIdempotencyKey(),
443
+ })
444
+ expect(response.status).toBe(200)
445
+ const body = await TestApp.json(response, Funding.schema.createFundingTransfer.Response)
446
+
447
+ expect(body.fees).toMatchObject([
448
+ {
449
+ amount: { baseUnits: '1000000000000000', formatted: '0.001' },
450
+ side: 'source',
451
+ token: { standard: 'native', symbol: 'ETH' },
452
+ },
453
+ ])
454
+ })
455
+
362
456
  test('resolves token identifiers through the composed route', async () => {
363
457
  const app = transfersApp({ providers: [provider()] })
364
458
  const identifiers = [
@@ -590,7 +684,7 @@ describe.skipIf(!Anvil.available)('POST /funding/transfers (forked localnet)', (
590
684
  (entry) =>
591
685
  entry.route.source.chain.id === `eip155:${base.id}` &&
592
686
  entry.route.source.symbol === 'USDC' &&
593
- entry.route.destination.slug === 'pathusd',
687
+ entry.route.destination.slug === executable.destinationToken,
594
688
  )!
595
689
  const usdc = route.route.source
596
690
  const amount = Value.from('10', usdc.decimals)
@@ -609,7 +703,12 @@ describe.skipIf(!Anvil.available)('POST /funding/transfers (forked localnet)', (
609
703
  function createTransfer(idempotencyKey: string) {
610
704
  const app = transfersApp({ providers: [executable.create(sender.address)] })
611
705
  return postTransfer(app, {
612
- body: { ...createBody, amount: amount.toString(), sender: sender.address },
706
+ body: {
707
+ ...createBody,
708
+ amount: amount.toString(),
709
+ destinationToken: executable.destinationToken,
710
+ sender: sender.address,
711
+ },
613
712
  idempotencyKey,
614
713
  })
615
714
  }
@@ -629,6 +728,14 @@ describe.skipIf(!Anvil.available)('POST /funding/transfers (forked localnet)', (
629
728
  expect(transfer.action.type).toBe('evm:calls')
630
729
  if (transfer.action.type !== 'evm:calls') return
631
730
  expect(transfer.action.calls.length).toBeGreaterThan(0)
731
+ if (executable.id === 'stargate')
732
+ expect(transfer.fees).toMatchObject([
733
+ {
734
+ amount: { baseUnits: BigInt(transfer.action.calls.at(-1)!.value).toString() },
735
+ side: 'source',
736
+ token: { standard: 'native', symbol: 'ETH' },
737
+ },
738
+ ])
632
739
 
633
740
  const receipts = []
634
741
  for (const call of transfer.action.calls) {
@@ -738,24 +845,318 @@ describe('POST /funding/transfers/{destination}', () => {
738
845
  })
739
846
 
740
847
  describe('funding transfers OpenAPI', () => {
848
+ test('publishes generator-ready transfer contracts', async () => {
849
+ const spec = await (await create({ auth: false }).request('/openapi.json')).json()
850
+ const detailPath = Object.keys(spec.paths).find((path) =>
851
+ path.includes('/v1/funding/transfers/{'),
852
+ )!
853
+ const operations = {
854
+ create: spec.paths['/v1/funding/transfers'].post,
855
+ createVault: spec.paths['/v1/funding/transfers/vault'].post,
856
+ createZone: spec.paths['/v1/funding/transfers/zone'].post,
857
+ get: spec.paths[detailPath].get,
858
+ list: spec.paths['/v1/funding/transfers'].get,
859
+ }
860
+ const summarize = (operation: (typeof operations)[keyof typeof operations]) => ({
861
+ errors: Object.fromEntries(
862
+ (Object.entries(operation.responses) as [string, ContractResponse][])
863
+ .filter(([status]) => Number(status) >= 400)
864
+ .map(([status, response]) => [
865
+ status,
866
+ response.$ref ?? response.content?.['application/json']?.schema,
867
+ ]),
868
+ ),
869
+ operationId: operation.operationId,
870
+ request: operation.requestBody?.content['application/json'].schema,
871
+ response: operation.responses[200]?.content?.['application/json']?.schema,
872
+ })
873
+
874
+ expect({
875
+ components: [
876
+ 'CreateFundingTransferRequest',
877
+ 'CreateFundingTransferVaultRequest',
878
+ 'CreateFundingTransferZoneRequest',
879
+ 'CreatedFundingTransfer',
880
+ 'FundingAction',
881
+ 'FundingActionCall',
882
+ 'FundingEvmCallsAction',
883
+ 'FundingTransfer',
884
+ 'FundingTransferFee',
885
+ 'FundingTransferList',
886
+ 'FundingTransferQuote',
887
+ 'FundingTransferStatusReason',
888
+ ].filter((name) => spec.components.schemas[name]),
889
+ formats: {
890
+ createdAt: spec.components.schemas.FundingTransfer.properties.createdAt.format,
891
+ quoteExpiresAt: spec.components.schemas.FundingTransferQuote.properties.expiresAt.format,
892
+ quoteSampledAt: spec.components.schemas.FundingTransferQuote.properties.sampledAt.format,
893
+ updatedAt: spec.components.schemas.FundingTransfer.properties.updatedAt.format,
894
+ },
895
+ models: {
896
+ action: spec.components.schemas.FundingAction.oneOf,
897
+ createdAction: spec.components.schemas.CreatedFundingTransfer.properties.action,
898
+ evmCall: spec.components.schemas.FundingEvmCallsAction.properties.calls.items,
899
+ feeToken: spec.components.schemas.FundingTransferFee.properties.token,
900
+ list: spec.components.schemas.FundingTransferList.properties.data.items,
901
+ quote: spec.components.schemas.FundingTransfer.properties.quote,
902
+ statusReason: spec.components.schemas.FundingTransfer.properties.statusReason,
903
+ },
904
+ operations: {
905
+ create: summarize(operations.create),
906
+ createVault: summarize(operations.createVault),
907
+ createZone: summarize(operations.createZone),
908
+ get: summarize(operations.get),
909
+ list: summarize(operations.list),
910
+ },
911
+ operationErrorCodes: {
912
+ createInvalid:
913
+ spec.components.schemas.ApiKeyMalformedOrBodyInvalidOrIdempotencyKeyRequiredError
914
+ .properties.error.properties.code.enum,
915
+ idempotencyConflict:
916
+ spec.components.schemas.IdempotencyConflictOrIdempotencyInProgressError.properties.error
917
+ .properties.code.enum,
918
+ notImplemented:
919
+ spec.components.schemas.NotImplemented501Error.properties.error.properties.code.enum,
920
+ parametersInvalid:
921
+ spec.components.schemas.ApiKeyMalformedOrParamInvalidError.properties.error.properties
922
+ .code.enum,
923
+ queryInvalid:
924
+ spec.components.schemas.ApiKeyMalformedOrQueryInvalidError.properties.error.properties
925
+ .code.enum,
926
+ quoteNotAvailable:
927
+ spec.components.schemas.QuoteNotAvailableError.properties.error.properties.code.enum,
928
+ transferNotFound:
929
+ spec.components.schemas.FundingTransferNotFoundError.properties.error.properties.code
930
+ .enum,
931
+ },
932
+ }).toMatchInlineSnapshot(`
933
+ {
934
+ "components": [
935
+ "CreateFundingTransferRequest",
936
+ "CreateFundingTransferVaultRequest",
937
+ "CreateFundingTransferZoneRequest",
938
+ "CreatedFundingTransfer",
939
+ "FundingAction",
940
+ "FundingActionCall",
941
+ "FundingEvmCallsAction",
942
+ "FundingTransfer",
943
+ "FundingTransferFee",
944
+ "FundingTransferList",
945
+ "FundingTransferQuote",
946
+ "FundingTransferStatusReason",
947
+ ],
948
+ "formats": {
949
+ "createdAt": "date-time",
950
+ "quoteExpiresAt": "date-time",
951
+ "quoteSampledAt": "date-time",
952
+ "updatedAt": "date-time",
953
+ },
954
+ "models": {
955
+ "action": [
956
+ {
957
+ "$ref": "#/components/schemas/FundingEvmCallsAction",
958
+ },
959
+ ],
960
+ "createdAction": {
961
+ "$ref": "#/components/schemas/FundingAction",
962
+ },
963
+ "evmCall": {
964
+ "$ref": "#/components/schemas/FundingActionCall",
965
+ },
966
+ "feeToken": {
967
+ "$ref": "#/components/schemas/FundingToken",
968
+ },
969
+ "list": {
970
+ "$ref": "#/components/schemas/FundingTransfer",
971
+ },
972
+ "quote": {
973
+ "$ref": "#/components/schemas/FundingTransferQuote",
974
+ },
975
+ "statusReason": {
976
+ "$ref": "#/components/schemas/FundingTransferStatusReason",
977
+ },
978
+ },
979
+ "operationErrorCodes": {
980
+ "createInvalid": [
981
+ "api_key_malformed",
982
+ "body_invalid",
983
+ "idempotency_key_required",
984
+ ],
985
+ "idempotencyConflict": [
986
+ "idempotency_conflict",
987
+ "idempotency_in_progress",
988
+ ],
989
+ "notImplemented": [
990
+ "not_implemented",
991
+ ],
992
+ "parametersInvalid": [
993
+ "api_key_malformed",
994
+ "param_invalid",
995
+ ],
996
+ "queryInvalid": [
997
+ "api_key_malformed",
998
+ "query_invalid",
999
+ ],
1000
+ "quoteNotAvailable": [
1001
+ "quote_not_available",
1002
+ ],
1003
+ "transferNotFound": [
1004
+ "funding_transfer_not_found",
1005
+ ],
1006
+ },
1007
+ "operations": {
1008
+ "create": {
1009
+ "errors": {
1010
+ "400": {
1011
+ "$ref": "#/components/schemas/ApiKeyMalformedOrBodyInvalidOrIdempotencyKeyRequiredError",
1012
+ },
1013
+ "401": {
1014
+ "$ref": "#/components/schemas/AuthenticationError",
1015
+ },
1016
+ "403": {
1017
+ "$ref": "#/components/schemas/ForbiddenError",
1018
+ },
1019
+ "404": {
1020
+ "$ref": "#/components/schemas/QuoteNotAvailableError",
1021
+ },
1022
+ "409": {
1023
+ "$ref": "#/components/schemas/IdempotencyConflictOrIdempotencyInProgressError",
1024
+ },
1025
+ "429": "#/components/responses/RateLimited",
1026
+ "500": "#/components/responses/InternalError",
1027
+ "502": {
1028
+ "$ref": "#/components/schemas/UpstreamError",
1029
+ },
1030
+ "504": "#/components/responses/RequestTimeout",
1031
+ },
1032
+ "operationId": "createFundingTransfer",
1033
+ "request": {
1034
+ "$ref": "#/components/schemas/CreateFundingTransferRequest",
1035
+ },
1036
+ "response": {
1037
+ "$ref": "#/components/schemas/CreatedFundingTransfer",
1038
+ },
1039
+ },
1040
+ "createVault": {
1041
+ "errors": {
1042
+ "400": {
1043
+ "$ref": "#/components/schemas/ApiKeyMalformedOrBodyInvalidOrIdempotencyKeyRequiredError",
1044
+ },
1045
+ "401": {
1046
+ "$ref": "#/components/schemas/AuthenticationError",
1047
+ },
1048
+ "403": {
1049
+ "$ref": "#/components/schemas/ForbiddenError",
1050
+ },
1051
+ "429": "#/components/responses/RateLimited",
1052
+ "500": "#/components/responses/InternalError",
1053
+ "501": {
1054
+ "$ref": "#/components/schemas/NotImplemented501Error",
1055
+ },
1056
+ "504": "#/components/responses/RequestTimeout",
1057
+ },
1058
+ "operationId": "createFundingTransferVault",
1059
+ "request": {
1060
+ "$ref": "#/components/schemas/CreateFundingTransferVaultRequest",
1061
+ },
1062
+ "response": undefined,
1063
+ },
1064
+ "createZone": {
1065
+ "errors": {
1066
+ "400": {
1067
+ "$ref": "#/components/schemas/ApiKeyMalformedOrBodyInvalidOrIdempotencyKeyRequiredError",
1068
+ },
1069
+ "401": {
1070
+ "$ref": "#/components/schemas/AuthenticationError",
1071
+ },
1072
+ "403": {
1073
+ "$ref": "#/components/schemas/ForbiddenError",
1074
+ },
1075
+ "429": "#/components/responses/RateLimited",
1076
+ "500": "#/components/responses/InternalError",
1077
+ "501": {
1078
+ "$ref": "#/components/schemas/NotImplemented501Error",
1079
+ },
1080
+ "504": "#/components/responses/RequestTimeout",
1081
+ },
1082
+ "operationId": "createFundingTransferZone",
1083
+ "request": {
1084
+ "$ref": "#/components/schemas/CreateFundingTransferZoneRequest",
1085
+ },
1086
+ "response": undefined,
1087
+ },
1088
+ "get": {
1089
+ "errors": {
1090
+ "400": {
1091
+ "$ref": "#/components/schemas/ApiKeyMalformedOrParamInvalidError",
1092
+ },
1093
+ "401": {
1094
+ "$ref": "#/components/schemas/AuthenticationError",
1095
+ },
1096
+ "403": {
1097
+ "$ref": "#/components/schemas/ForbiddenError",
1098
+ },
1099
+ "404": {
1100
+ "$ref": "#/components/schemas/FundingTransferNotFoundError",
1101
+ },
1102
+ "429": "#/components/responses/RateLimited",
1103
+ "500": "#/components/responses/InternalError",
1104
+ "502": {
1105
+ "$ref": "#/components/schemas/UpstreamError",
1106
+ },
1107
+ "504": "#/components/responses/RequestTimeout",
1108
+ },
1109
+ "operationId": "getFundingTransfer",
1110
+ "request": undefined,
1111
+ "response": {
1112
+ "$ref": "#/components/schemas/FundingTransfer",
1113
+ },
1114
+ },
1115
+ "list": {
1116
+ "errors": {
1117
+ "400": {
1118
+ "$ref": "#/components/schemas/ApiKeyMalformedOrQueryInvalidError",
1119
+ },
1120
+ "401": {
1121
+ "$ref": "#/components/schemas/AuthenticationError",
1122
+ },
1123
+ "403": {
1124
+ "$ref": "#/components/schemas/ForbiddenError",
1125
+ },
1126
+ "429": "#/components/responses/RateLimited",
1127
+ "500": "#/components/responses/InternalError",
1128
+ "502": {
1129
+ "$ref": "#/components/schemas/UpstreamError",
1130
+ },
1131
+ "504": "#/components/responses/RequestTimeout",
1132
+ },
1133
+ "operationId": "listFundingTransfers",
1134
+ "request": undefined,
1135
+ "response": {
1136
+ "$ref": "#/components/schemas/FundingTransferList",
1137
+ },
1138
+ },
1139
+ },
1140
+ }
1141
+ `)
1142
+ })
1143
+
741
1144
  test('publishes an executable account transfer example', async () => {
742
1145
  const app = create({ auth: false })
743
- type TokenSchema = { examples: string[] }
744
1146
  type TransferExample = { destinationToken: { address: string } }
745
1147
  type Operation = {
746
1148
  requestBody: {
747
- content: Record<string, { schema: { properties: { destinationToken: TokenSchema } } }>
1149
+ content: Record<string, { schema: JsonSchema }>
748
1150
  }
749
1151
  responses: Record<string, { content: Record<string, { example: TransferExample }> }>
750
1152
  }
751
- type Spec = { paths: Record<string, { post: Operation }> }
1153
+ type Spec = ComponentSpec & { paths: Record<string, { post: Operation }> }
752
1154
  const spec = (await (await app.request('/openapi.json')).json()) as Spec
753
1155
  const operation = spec.paths['/v1/funding/transfers']!.post
1156
+ const request = dereference(spec, operation.requestBody.content['application/json']!.schema)
754
1157
 
755
1158
  expect({
756
- request:
757
- operation.requestBody.content['application/json']!.schema.properties.destinationToken
758
- .examples,
1159
+ request: request.properties!['destinationToken']!.examples,
759
1160
  response:
760
1161
  operation.responses['200']!.content['application/json']!.example.destinationToken.address,
761
1162
  }).toEqual({
@@ -766,33 +1167,23 @@ describe('funding transfers OpenAPI', () => {
766
1167
 
767
1168
  test('publishes human-readable deposit address route examples', async () => {
768
1169
  const app = create({ auth: false })
769
- type Property = { examples: string[] }
770
1170
  type Operation = {
771
1171
  requestBody: {
772
- content: Record<
773
- string,
774
- {
775
- schema: {
776
- properties: {
777
- destinationToken: Property
778
- sourceChain: Property
779
- sourceToken: Property
780
- }
781
- }
782
- }
783
- >
1172
+ content: Record<string, { schema: JsonSchema }>
784
1173
  }
785
1174
  }
786
- type Spec = { paths: Record<string, { post: Operation }> }
1175
+ type Spec = ComponentSpec & { paths: Record<string, { post: Operation }> }
787
1176
  const spec = (await (await app.request('/openapi.json')).json()) as Spec
788
- const properties =
1177
+ const properties = dereference(
1178
+ spec,
789
1179
  spec.paths['/v1/funding/deposit-addresses']!.post.requestBody.content['application/json']!
790
- .schema.properties
1180
+ .schema,
1181
+ ).properties!
791
1182
 
792
1183
  expect({
793
- destinationToken: properties.destinationToken.examples,
794
- sourceChain: properties.sourceChain.examples,
795
- sourceToken: properties.sourceToken.examples,
1184
+ destinationToken: properties['destinationToken']!.examples,
1185
+ sourceChain: properties['sourceChain']!.examples,
1186
+ sourceToken: properties['sourceToken']!.examples,
796
1187
  }).toMatchInlineSnapshot(`
797
1188
  {
798
1189
  "destinationToken": [
@@ -949,30 +1340,22 @@ describe('funding transfers OpenAPI', () => {
949
1340
 
950
1341
  test('publishes concrete creation schemas', async () => {
951
1342
  const app = create({ auth: false })
952
- const spec = (await (await app.request('/openapi.json')).json()) as {
1343
+ type Spec = ComponentSpec & {
953
1344
  paths: Record<
954
1345
  string,
955
1346
  {
956
1347
  post?: {
957
1348
  requestBody: {
958
- content: Record<
959
- string,
960
- {
961
- schema: {
962
- additionalProperties?: boolean
963
- properties: object
964
- required?: readonly string[] | undefined
965
- }
966
- }
967
- >
1349
+ content: Record<string, { schema: JsonSchema }>
968
1350
  }
969
1351
  responses: Record<string, unknown>
970
1352
  }
971
1353
  }
972
1354
  >
973
1355
  }
1356
+ const spec = (await (await app.request('/openapi.json')).json()) as Spec
974
1357
  const creationSchema = (path: string) =>
975
- spec.paths[path]!.post!.requestBody.content['application/json']!.schema
1358
+ dereference(spec, spec.paths[path]!.post!.requestBody.content['application/json']!.schema)
976
1359
  expect(
977
1360
  creationSchema('/v1/funding/deposit-addresses').required?.includes('subsidize') ?? false,
978
1361
  ).toMatchInlineSnapshot(`false`)
@@ -980,7 +1363,7 @@ describe('funding transfers OpenAPI', () => {
980
1363
  const schema = creationSchema(path)
981
1364
  return {
982
1365
  additionalProperties: schema.additionalProperties,
983
- properties: Object.keys(schema.properties),
1366
+ properties: Object.keys(schema.properties!),
984
1367
  }
985
1368
  }
986
1369
 
@@ -1002,6 +1385,7 @@ describe('funding transfers OpenAPI', () => {
1002
1385
  "amount",
1003
1386
  "destinationToken",
1004
1387
  "mode",
1388
+ "provider",
1005
1389
  "recipient",
1006
1390
  "sender",
1007
1391
  "slippageBps",
@@ -1025,11 +1409,13 @@ describe('funding transfers OpenAPI', () => {
1025
1409
  "200",
1026
1410
  "400",
1027
1411
  "401",
1412
+ "403",
1028
1413
  "404",
1029
1414
  "409",
1030
1415
  "429",
1031
1416
  "500",
1032
1417
  "502",
1418
+ "504",
1033
1419
  ],
1034
1420
  "vault": {
1035
1421
  "additionalProperties": false,
@@ -1047,9 +1433,11 @@ describe('funding transfers OpenAPI', () => {
1047
1433
  "vaultResponses": [
1048
1434
  "400",
1049
1435
  "401",
1436
+ "403",
1050
1437
  "429",
1051
1438
  "500",
1052
1439
  "501",
1440
+ "504",
1053
1441
  ],
1054
1442
  "zone": {
1055
1443
  "additionalProperties": false,
@@ -1069,9 +1457,11 @@ describe('funding transfers OpenAPI', () => {
1069
1457
  "zoneResponses": [
1070
1458
  "400",
1071
1459
  "401",
1460
+ "403",
1072
1461
  "429",
1073
1462
  "500",
1074
1463
  "501",
1464
+ "504",
1075
1465
  ],
1076
1466
  }
1077
1467
  `)