tapimo 0.7.0 → 0.7.2

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 (689) hide show
  1. package/dist/ApiKeys.d.ts +24 -7
  2. package/dist/ApiKeys.d.ts.map +1 -1
  3. package/dist/ApiKeys.js +17 -5
  4. package/dist/ApiKeys.js.map +1 -1
  5. package/dist/App.d.ts +12104 -7861
  6. package/dist/App.d.ts.map +1 -1
  7. package/dist/App.js +191 -128
  8. package/dist/App.js.map +1 -1
  9. package/dist/Assets.d.ts +10 -0
  10. package/dist/Assets.d.ts.map +1 -1
  11. package/dist/Assets.js +17 -4
  12. package/dist/Assets.js.map +1 -1
  13. package/dist/Scope.d.ts +19 -8
  14. package/dist/Scope.d.ts.map +1 -1
  15. package/dist/Scope.js +25 -9
  16. package/dist/Scope.js.map +1 -1
  17. package/dist/Webhooks.d.ts +1 -1
  18. package/dist/admin/App.d.ts +601 -20
  19. package/dist/admin/App.d.ts.map +1 -1
  20. package/dist/admin/App.js +12 -2
  21. package/dist/admin/App.js.map +1 -1
  22. package/dist/admin/apps/api-keys.d.ts +94 -11
  23. package/dist/admin/apps/api-keys.d.ts.map +1 -1
  24. package/dist/admin/apps/api-keys.js +141 -32
  25. package/dist/admin/apps/api-keys.js.map +1 -1
  26. package/dist/admin/apps/earn-vaults.d.ts +1069 -0
  27. package/dist/admin/apps/earn-vaults.d.ts.map +1 -0
  28. package/dist/admin/apps/earn-vaults.js +409 -0
  29. package/dist/admin/apps/earn-vaults.js.map +1 -0
  30. package/dist/admin/apps/verified-tokens.d.ts +166 -166
  31. package/dist/admin/ui.generated.d.ts +1 -1
  32. package/dist/admin/ui.generated.d.ts.map +1 -1
  33. package/dist/admin/ui.generated.js +151 -95
  34. package/dist/admin/ui.generated.js.map +1 -1
  35. package/dist/analytics/Analytics.d.ts +2 -0
  36. package/dist/analytics/Analytics.d.ts.map +1 -1
  37. package/dist/analytics/Analytics.js +18 -2
  38. package/dist/analytics/Analytics.js.map +1 -1
  39. package/dist/analytics/tables/requestEvents.d.ts +22 -1
  40. package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
  41. package/dist/analytics/tables/requestEvents.js +59 -39
  42. package/dist/analytics/tables/requestEvents.js.map +1 -1
  43. package/dist/apps/Zones.d.ts +8335 -0
  44. package/dist/apps/Zones.d.ts.map +1 -0
  45. package/dist/apps/Zones.js +38 -0
  46. package/dist/apps/Zones.js.map +1 -0
  47. package/dist/apps/data/App.d.ts +14377 -10165
  48. package/dist/apps/data/App.d.ts.map +1 -1
  49. package/dist/apps/data/App.js +91 -19
  50. package/dist/apps/data/App.js.map +1 -1
  51. package/dist/apps/data/FxOracle.d.ts +1 -1
  52. package/dist/apps/data/FxOracle.d.ts.map +1 -1
  53. package/dist/apps/data/index.d.ts +0 -1
  54. package/dist/apps/data/index.d.ts.map +1 -1
  55. package/dist/apps/data/index.js +0 -1
  56. package/dist/apps/data/index.js.map +1 -1
  57. package/dist/apps/data/routes/activities.d.ts +32 -32
  58. package/dist/apps/data/routes/activities.d.ts.map +1 -1
  59. package/dist/apps/data/routes/activities.js +130 -65
  60. package/dist/apps/data/routes/activities.js.map +1 -1
  61. package/dist/apps/data/routes/addresses.d.ts +312 -312
  62. package/dist/apps/data/routes/balances.d.ts +18 -18
  63. package/dist/apps/data/routes/balances.js +5 -5
  64. package/dist/apps/data/routes/balances.js.map +1 -1
  65. package/dist/apps/data/routes/coingecko.d.ts +176 -176
  66. package/dist/apps/data/routes/coingecko.d.ts.map +1 -1
  67. package/dist/apps/data/routes/coingecko.js +62 -35
  68. package/dist/apps/data/routes/coingecko.js.map +1 -1
  69. package/dist/apps/data/routes/earn.d.ts +2144 -0
  70. package/dist/apps/data/routes/earn.d.ts.map +1 -0
  71. package/dist/apps/data/routes/earn.js +947 -0
  72. package/dist/apps/data/routes/earn.js.map +1 -0
  73. package/dist/apps/data/routes/exchanges.d.ts +1231 -324
  74. package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
  75. package/dist/apps/data/routes/exchanges.js +656 -193
  76. package/dist/apps/data/routes/exchanges.js.map +1 -1
  77. package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
  78. package/dist/apps/data/routes/fee-amm.js +59 -8
  79. package/dist/apps/data/routes/fee-amm.js.map +1 -1
  80. package/dist/apps/data/routes/funding.d.ts +4092 -387
  81. package/dist/apps/data/routes/funding.d.ts.map +1 -1
  82. package/dist/apps/data/routes/funding.js +1403 -256
  83. package/dist/apps/data/routes/funding.js.map +1 -1
  84. package/dist/apps/data/routes/indexer.d.ts +5 -5
  85. package/dist/apps/data/routes/indexer.d.ts.map +1 -1
  86. package/dist/apps/data/routes/indexer.js +19 -2
  87. package/dist/apps/data/routes/indexer.js.map +1 -1
  88. package/dist/apps/data/routes/receipts.d.ts +265 -265
  89. package/dist/apps/data/routes/receipts.d.ts.map +1 -1
  90. package/dist/apps/data/routes/receipts.js +11 -11
  91. package/dist/apps/data/routes/receipts.js.map +1 -1
  92. package/dist/apps/data/routes/rpc.d.ts +5 -5
  93. package/dist/apps/data/routes/rpc.d.ts.map +1 -1
  94. package/dist/apps/data/routes/rpc.js +211 -22
  95. package/dist/apps/data/routes/rpc.js.map +1 -1
  96. package/dist/apps/data/routes/tokenlist.d.ts +36 -36
  97. package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
  98. package/dist/apps/data/routes/tokenlist.js +49 -9
  99. package/dist/apps/data/routes/tokenlist.js.map +1 -1
  100. package/dist/apps/data/routes/tokens.d.ts +116 -88
  101. package/dist/apps/data/routes/tokens.d.ts.map +1 -1
  102. package/dist/apps/data/routes/tokens.js +198 -91
  103. package/dist/apps/data/routes/tokens.js.map +1 -1
  104. package/dist/apps/data/routes/transactions.d.ts +55 -55
  105. package/dist/apps/data/routes/transactions.d.ts.map +1 -1
  106. package/dist/apps/data/routes/transactions.js +78 -39
  107. package/dist/apps/data/routes/transactions.js.map +1 -1
  108. package/dist/apps/data/routes/transfers.d.ts +78 -29
  109. package/dist/apps/data/routes/transfers.d.ts.map +1 -1
  110. package/dist/apps/data/routes/transfers.js +165 -67
  111. package/dist/apps/data/routes/transfers.js.map +1 -1
  112. package/dist/apps/data/routes/valuation.d.ts +10 -10
  113. package/dist/apps/data/routes/valuation.js +2 -2
  114. package/dist/apps/data/routes/valuation.js.map +1 -1
  115. package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
  116. package/dist/apps/data/routes/verified-tokens.js +34 -9
  117. package/dist/apps/data/routes/verified-tokens.js.map +1 -1
  118. package/dist/apps/data/routes/webhooks.d.ts +5 -3
  119. package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
  120. package/dist/apps/data/routes/webhooks.js +175 -65
  121. package/dist/apps/data/routes/webhooks.js.map +1 -1
  122. package/dist/apps/data/routes/zones.d.ts +281 -0
  123. package/dist/apps/data/routes/zones.d.ts.map +1 -0
  124. package/dist/apps/data/routes/zones.js +252 -0
  125. package/dist/apps/data/routes/zones.js.map +1 -0
  126. package/dist/apps/docs/reference.js +6 -5
  127. package/dist/apps/docs/reference.js.map +1 -1
  128. package/dist/apps/index.d.ts +2 -1
  129. package/dist/apps/index.d.ts.map +1 -1
  130. package/dist/apps/index.js +2 -1
  131. package/dist/apps/index.js.map +1 -1
  132. package/dist/apps/management/App.d.ts +670 -670
  133. package/dist/apps/management/Billing.d.ts +8 -0
  134. package/dist/apps/management/Billing.d.ts.map +1 -1
  135. package/dist/apps/management/Billing.js +12 -0
  136. package/dist/apps/management/Billing.js.map +1 -1
  137. package/dist/apps/management/Error.d.ts +12 -0
  138. package/dist/apps/management/Error.d.ts.map +1 -0
  139. package/dist/apps/management/Error.js +10 -0
  140. package/dist/apps/management/Error.js.map +1 -0
  141. package/dist/apps/management/routes/api-keys.d.ts +5 -5
  142. package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
  143. package/dist/apps/management/routes/api-keys.js +2 -8
  144. package/dist/apps/management/routes/api-keys.js.map +1 -1
  145. package/dist/apps/management/routes/billing.d.ts +119 -119
  146. package/dist/apps/management/routes/faucet.d.ts +35 -35
  147. package/dist/apps/management/routes/invitations.d.ts +62 -62
  148. package/dist/apps/management/routes/invitations.d.ts.map +1 -1
  149. package/dist/apps/management/routes/invitations.js +4 -10
  150. package/dist/apps/management/routes/invitations.js.map +1 -1
  151. package/dist/apps/management/routes/invite-links.d.ts +30 -30
  152. package/dist/apps/management/routes/me.d.ts +6 -6
  153. package/dist/apps/management/routes/members.d.ts +78 -78
  154. package/dist/apps/management/routes/orgs.d.ts +48 -48
  155. package/dist/apps/management/routes/orgs.d.ts.map +1 -1
  156. package/dist/apps/management/routes/orgs.js +2 -8
  157. package/dist/apps/management/routes/orgs.js.map +1 -1
  158. package/dist/apps/management/routes/projects.d.ts +9 -9
  159. package/dist/apps/management/routes/scopes.js +2 -2
  160. package/dist/apps/management/routes/scopes.js.map +1 -1
  161. package/dist/apps/management/routes/usage.d.ts +80 -80
  162. package/dist/apps/management/routes/verified-token-requests.d.ts +36 -36
  163. package/dist/apps/management/routes/webhooks.d.ts +50 -50
  164. package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
  165. package/dist/apps/management/routes/webhooks.js +15 -3
  166. package/dist/apps/management/routes/webhooks.js.map +1 -1
  167. package/dist/apps/mpp/App.d.ts +55 -56
  168. package/dist/apps/mpp/App.d.ts.map +1 -1
  169. package/dist/apps/mpp/App.js +192 -27
  170. package/dist/apps/mpp/App.js.map +1 -1
  171. package/dist/apps/mpp/Mpp.d.ts +0 -20
  172. package/dist/apps/mpp/Mpp.d.ts.map +1 -1
  173. package/dist/apps/mpp/Mpp.js +0 -24
  174. package/dist/apps/mpp/Mpp.js.map +1 -1
  175. package/dist/apps/mpp/internal/Adapter.d.ts +40 -0
  176. package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -0
  177. package/dist/apps/mpp/internal/Adapter.js +66 -0
  178. package/dist/apps/mpp/internal/Adapter.js.map +1 -0
  179. package/dist/apps/mpp/internal/Error.d.ts +4 -0
  180. package/dist/apps/mpp/internal/Error.d.ts.map +1 -0
  181. package/dist/apps/mpp/internal/Error.js +41 -0
  182. package/dist/apps/mpp/internal/Error.js.map +1 -0
  183. package/dist/apps/mpp/internal/Idempotency.d.ts +33 -0
  184. package/dist/apps/mpp/internal/Idempotency.d.ts.map +1 -0
  185. package/dist/apps/mpp/internal/Idempotency.js +28 -0
  186. package/dist/apps/mpp/internal/Idempotency.js.map +1 -0
  187. package/dist/apps/mpp/internal/Policy.d.ts +46 -0
  188. package/dist/apps/mpp/internal/Policy.d.ts.map +1 -0
  189. package/dist/apps/mpp/internal/Policy.js +57 -0
  190. package/dist/apps/mpp/internal/Policy.js.map +1 -0
  191. package/dist/apps/mpp/internal/ScreenManager.d.ts +27 -0
  192. package/dist/apps/mpp/internal/ScreenManager.d.ts.map +1 -0
  193. package/dist/apps/mpp/internal/ScreenManager.js +18 -0
  194. package/dist/apps/mpp/internal/ScreenManager.js.map +1 -0
  195. package/dist/apps/mpp/internal/Screening.d.ts +35 -0
  196. package/dist/apps/mpp/internal/Screening.d.ts.map +1 -0
  197. package/dist/apps/mpp/internal/Screening.js +20 -0
  198. package/dist/apps/mpp/internal/Screening.js.map +1 -0
  199. package/dist/apps/mpp/internal/Sponsorship.d.ts +36 -0
  200. package/dist/apps/mpp/internal/Sponsorship.d.ts.map +1 -0
  201. package/dist/apps/mpp/internal/Sponsorship.js +103 -0
  202. package/dist/apps/mpp/internal/Sponsorship.js.map +1 -0
  203. package/dist/apps/mpp/internal/Utils.d.ts +7 -0
  204. package/dist/apps/mpp/internal/Utils.d.ts.map +1 -0
  205. package/dist/apps/mpp/internal/Utils.js +24 -0
  206. package/dist/apps/mpp/internal/Utils.js.map +1 -0
  207. package/dist/apps/relay/App.js +184 -24
  208. package/dist/apps/relay/App.js.map +1 -1
  209. package/dist/apps/relay/Sponsorships.d.ts +4 -0
  210. package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
  211. package/dist/apps/relay/Sponsorships.js +16 -7
  212. package/dist/apps/relay/Sponsorships.js.map +1 -1
  213. package/dist/db/Db.d.ts +20 -0
  214. package/dist/db/Db.d.ts.map +1 -1
  215. package/dist/db/Db.js +342 -0
  216. package/dist/db/Db.js.map +1 -1
  217. package/dist/db/Schema.d.ts +921 -1
  218. package/dist/db/Schema.d.ts.map +1 -1
  219. package/dist/db/Schema.js +269 -1
  220. package/dist/db/Schema.js.map +1 -1
  221. package/dist/db/tables/earnVaults.d.ts +68 -0
  222. package/dist/db/tables/earnVaults.d.ts.map +1 -0
  223. package/dist/db/tables/earnVaults.js +72 -0
  224. package/dist/db/tables/earnVaults.js.map +1 -0
  225. package/dist/db/tables/fundingCatalog.d.ts +56 -0
  226. package/dist/db/tables/fundingCatalog.d.ts.map +1 -0
  227. package/dist/db/tables/fundingCatalog.js +85 -0
  228. package/dist/db/tables/fundingCatalog.js.map +1 -0
  229. package/dist/db/tables/fundingDepositAddresses.d.ts +159 -0
  230. package/dist/db/tables/fundingDepositAddresses.d.ts.map +1 -0
  231. package/dist/db/tables/fundingDepositAddresses.js +206 -0
  232. package/dist/db/tables/fundingDepositAddresses.js.map +1 -0
  233. package/dist/db/tables/fundingDeposits.d.ts +115 -0
  234. package/dist/db/tables/fundingDeposits.d.ts.map +1 -0
  235. package/dist/db/tables/fundingDeposits.js +100 -0
  236. package/dist/db/tables/fundingDeposits.js.map +1 -0
  237. package/dist/db/tables/fundingIdempotency.d.ts +91 -0
  238. package/dist/db/tables/fundingIdempotency.d.ts.map +1 -0
  239. package/dist/db/tables/fundingIdempotency.js +103 -0
  240. package/dist/db/tables/fundingIdempotency.js.map +1 -0
  241. package/dist/db/tables/fundingTransferEvents.d.ts +12 -0
  242. package/dist/db/tables/fundingTransferEvents.d.ts.map +1 -0
  243. package/dist/db/tables/fundingTransferEvents.js +18 -0
  244. package/dist/db/tables/fundingTransferEvents.js.map +1 -0
  245. package/dist/db/tables/fundingTransferTransactions.d.ts +15 -0
  246. package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -0
  247. package/dist/db/tables/fundingTransferTransactions.js +27 -0
  248. package/dist/db/tables/fundingTransferTransactions.js.map +1 -0
  249. package/dist/db/tables/fundingTransfers.d.ts +82 -0
  250. package/dist/db/tables/fundingTransfers.d.ts.map +1 -0
  251. package/dist/db/tables/fundingTransfers.js +89 -0
  252. package/dist/db/tables/fundingTransfers.js.map +1 -0
  253. package/dist/db/tables/organizations.d.ts +8 -0
  254. package/dist/db/tables/organizations.d.ts.map +1 -1
  255. package/dist/db/tables/organizations.js +35 -0
  256. package/dist/db/tables/organizations.js.map +1 -1
  257. package/dist/db/tables/projects.d.ts +8 -0
  258. package/dist/db/tables/projects.d.ts.map +1 -1
  259. package/dist/db/tables/projects.js +16 -0
  260. package/dist/db/tables/projects.js.map +1 -1
  261. package/dist/db/tables/requestUsage.d.ts +13 -0
  262. package/dist/db/tables/requestUsage.d.ts.map +1 -1
  263. package/dist/db/tables/requestUsage.js +16 -0
  264. package/dist/db/tables/requestUsage.js.map +1 -1
  265. package/dist/db/tables/sponsoredTransactions.d.ts +4 -2
  266. package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
  267. package/dist/db/tables/sponsoredTransactions.js +14 -4
  268. package/dist/db/tables/sponsoredTransactions.js.map +1 -1
  269. package/dist/db/tables/users.d.ts +8 -0
  270. package/dist/db/tables/users.d.ts.map +1 -1
  271. package/dist/db/tables/users.js +16 -0
  272. package/dist/db/tables/users.js.map +1 -1
  273. package/dist/db/tables/verifiedTokens.d.ts +14 -7
  274. package/dist/db/tables/verifiedTokens.d.ts.map +1 -1
  275. package/dist/db/tables/verifiedTokens.js +9 -7
  276. package/dist/db/tables/verifiedTokens.js.map +1 -1
  277. package/dist/db/tables/webhookSubscriptions.d.ts +31 -1
  278. package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
  279. package/dist/db/tables/webhookSubscriptions.js +24 -3
  280. package/dist/db/tables/webhookSubscriptions.js.map +1 -1
  281. package/dist/handlers/relay.js +108 -108
  282. package/dist/handlers/relay.js.map +1 -1
  283. package/dist/internal/Auth.d.ts +26 -0
  284. package/dist/internal/Auth.d.ts.map +1 -1
  285. package/dist/internal/Auth.js +35 -2
  286. package/dist/internal/Auth.js.map +1 -1
  287. package/dist/internal/Cache.d.ts.map +1 -1
  288. package/dist/internal/Cache.js +16 -10
  289. package/dist/internal/Cache.js.map +1 -1
  290. package/dist/internal/Cursor.js +1 -1
  291. package/dist/internal/Cursor.js.map +1 -1
  292. package/dist/internal/EarnRates.d.ts +89 -0
  293. package/dist/internal/EarnRates.d.ts.map +1 -0
  294. package/dist/internal/EarnRates.js +266 -0
  295. package/dist/internal/EarnRates.js.map +1 -0
  296. package/dist/internal/EarnVaults.d.ts +171 -0
  297. package/dist/internal/EarnVaults.d.ts.map +1 -0
  298. package/dist/internal/EarnVaults.js +547 -0
  299. package/dist/internal/EarnVaults.js.map +1 -0
  300. package/dist/internal/EdgeCache.d.ts +9 -2
  301. package/dist/internal/EdgeCache.d.ts.map +1 -1
  302. package/dist/internal/EdgeCache.js +36 -9
  303. package/dist/internal/EdgeCache.js.map +1 -1
  304. package/dist/internal/Id.d.ts +11 -0
  305. package/dist/internal/Id.d.ts.map +1 -1
  306. package/dist/internal/Id.js +13 -0
  307. package/dist/internal/Id.js.map +1 -1
  308. package/dist/internal/Idempotency.d.ts +83 -0
  309. package/dist/internal/Idempotency.d.ts.map +1 -0
  310. package/dist/internal/Idempotency.js +113 -0
  311. package/dist/internal/Idempotency.js.map +1 -0
  312. package/dist/internal/Log.d.ts +64 -9
  313. package/dist/internal/Log.d.ts.map +1 -1
  314. package/dist/internal/Log.js +29 -7
  315. package/dist/internal/Log.js.map +1 -1
  316. package/dist/internal/MetricSink.d.ts.map +1 -1
  317. package/dist/internal/MetricSink.js +47 -1
  318. package/dist/internal/MetricSink.js.map +1 -1
  319. package/dist/internal/OpenApi.d.ts +1 -1
  320. package/dist/internal/OpenApi.d.ts.map +1 -1
  321. package/dist/internal/OpenApi.js +3 -0
  322. package/dist/internal/OpenApi.js.map +1 -1
  323. package/dist/internal/Provider.d.ts +14 -0
  324. package/dist/internal/Provider.d.ts.map +1 -0
  325. package/dist/internal/Provider.js +5 -0
  326. package/dist/internal/Provider.js.map +1 -0
  327. package/dist/internal/Schema.d.ts +8 -3
  328. package/dist/internal/Schema.d.ts.map +1 -1
  329. package/dist/internal/Schema.js +24 -13
  330. package/dist/internal/Schema.js.map +1 -1
  331. package/dist/internal/Store.d.ts +6 -0
  332. package/dist/internal/Store.d.ts.map +1 -1
  333. package/dist/internal/Store.js +35 -0
  334. package/dist/internal/Store.js.map +1 -1
  335. package/dist/internal/Tidx.d.ts +43 -24
  336. package/dist/internal/Tidx.d.ts.map +1 -1
  337. package/dist/internal/Tidx.js +79 -11
  338. package/dist/internal/Tidx.js.map +1 -1
  339. package/dist/internal/Viem.d.ts +82 -65
  340. package/dist/internal/Viem.d.ts.map +1 -1
  341. package/dist/internal/Viem.js +83 -12
  342. package/dist/internal/Viem.js.map +1 -1
  343. package/dist/internal/WebhookDestination.d.ts.map +1 -1
  344. package/dist/internal/WebhookDestination.js +34 -28
  345. package/dist/internal/WebhookDestination.js.map +1 -1
  346. package/dist/internal/Webhooks.d.ts +9 -0
  347. package/dist/internal/Webhooks.d.ts.map +1 -1
  348. package/dist/internal/Webhooks.js +15 -10
  349. package/dist/internal/Webhooks.js.map +1 -1
  350. package/dist/internal/exchange/Provider.d.ts +219 -0
  351. package/dist/internal/exchange/Provider.d.ts.map +1 -0
  352. package/dist/internal/exchange/Provider.js +117 -0
  353. package/dist/internal/exchange/Provider.js.map +1 -0
  354. package/dist/internal/exchange/index.d.ts +2 -0
  355. package/dist/internal/exchange/index.d.ts.map +1 -0
  356. package/dist/internal/exchange/index.js +2 -0
  357. package/dist/internal/exchange/index.js.map +1 -0
  358. package/dist/internal/exchange/providers/uniswap.d.ts +57 -0
  359. package/dist/internal/exchange/providers/uniswap.d.ts.map +1 -0
  360. package/dist/internal/exchange/providers/uniswap.js +553 -0
  361. package/dist/internal/exchange/providers/uniswap.js.map +1 -0
  362. package/dist/internal/funding/Action.d.ts +55 -0
  363. package/dist/internal/funding/Action.d.ts.map +1 -0
  364. package/dist/internal/funding/Action.js +74 -0
  365. package/dist/internal/funding/Action.js.map +1 -0
  366. package/dist/internal/funding/Catalog.d.ts +107 -0
  367. package/dist/internal/funding/Catalog.d.ts.map +1 -0
  368. package/dist/internal/funding/Catalog.js +270 -0
  369. package/dist/internal/funding/Catalog.js.map +1 -0
  370. package/dist/internal/funding/Chain.d.ts +76 -0
  371. package/dist/internal/funding/Chain.d.ts.map +1 -0
  372. package/dist/internal/funding/Chain.js +38 -0
  373. package/dist/internal/funding/Chain.js.map +1 -0
  374. package/dist/internal/funding/Deposit.d.ts +366 -0
  375. package/dist/internal/funding/Deposit.d.ts.map +1 -0
  376. package/dist/internal/funding/Deposit.js +286 -0
  377. package/dist/internal/funding/Deposit.js.map +1 -0
  378. package/dist/internal/funding/DepositAddress.d.ts +345 -0
  379. package/dist/internal/funding/DepositAddress.d.ts.map +1 -0
  380. package/dist/internal/funding/DepositAddress.js +189 -0
  381. package/dist/internal/funding/DepositAddress.js.map +1 -0
  382. package/dist/internal/funding/Evidence.d.ts +52 -0
  383. package/dist/internal/funding/Evidence.d.ts.map +1 -0
  384. package/dist/internal/funding/Evidence.js +314 -0
  385. package/dist/internal/funding/Evidence.js.map +1 -0
  386. package/dist/internal/funding/Provider.d.ts +1186 -0
  387. package/dist/internal/funding/Provider.d.ts.map +1 -0
  388. package/dist/internal/funding/Provider.js +1081 -0
  389. package/dist/internal/funding/Provider.js.map +1 -0
  390. package/dist/internal/funding/Reconciliation.d.ts +113 -0
  391. package/dist/internal/funding/Reconciliation.d.ts.map +1 -0
  392. package/dist/internal/funding/Reconciliation.js +676 -0
  393. package/dist/internal/funding/Reconciliation.js.map +1 -0
  394. package/dist/internal/funding/Route.d.ts +21 -0
  395. package/dist/internal/funding/Route.d.ts.map +1 -0
  396. package/dist/internal/funding/Route.js +5 -0
  397. package/dist/internal/funding/Route.js.map +1 -0
  398. package/dist/internal/funding/Subsidy.d.ts +113 -0
  399. package/dist/internal/funding/Subsidy.d.ts.map +1 -0
  400. package/dist/internal/funding/Subsidy.js +138 -0
  401. package/dist/internal/funding/Subsidy.js.map +1 -0
  402. package/dist/internal/funding/Token.d.ts +41 -0
  403. package/dist/internal/funding/Token.d.ts.map +1 -0
  404. package/dist/internal/funding/Token.js +22 -0
  405. package/dist/internal/funding/Token.js.map +1 -0
  406. package/dist/internal/funding/Transfer.d.ts +643 -0
  407. package/dist/internal/funding/Transfer.d.ts.map +1 -0
  408. package/dist/internal/funding/Transfer.js +332 -0
  409. package/dist/internal/funding/Transfer.js.map +1 -0
  410. package/dist/internal/funding/index.d.ts +13 -0
  411. package/dist/internal/funding/index.d.ts.map +1 -0
  412. package/dist/internal/funding/index.js +13 -0
  413. package/dist/internal/funding/index.js.map +1 -0
  414. package/dist/internal/funding/providers/across.d.ts +21 -0
  415. package/dist/internal/funding/providers/across.d.ts.map +1 -0
  416. package/dist/internal/funding/providers/across.js +117 -0
  417. package/dist/internal/funding/providers/across.js.map +1 -0
  418. package/dist/internal/funding/providers/relay.d.ts +46 -0
  419. package/dist/internal/funding/providers/relay.d.ts.map +1 -0
  420. package/dist/internal/funding/providers/relay.js +464 -0
  421. package/dist/internal/funding/providers/relay.js.map +1 -0
  422. package/dist/internal/funding/providers/rhino.d.ts +15 -0
  423. package/dist/internal/funding/providers/rhino.d.ts.map +1 -0
  424. package/dist/internal/funding/providers/rhino.js +116 -0
  425. package/dist/internal/funding/providers/rhino.js.map +1 -0
  426. package/dist/internal/funding/providers/squid.d.ts +19 -0
  427. package/dist/internal/funding/providers/squid.d.ts.map +1 -0
  428. package/dist/internal/funding/providers/squid.js +120 -0
  429. package/dist/internal/funding/providers/squid.js.map +1 -0
  430. package/dist/internal/funding/providers/symbiosis.d.ts +20 -0
  431. package/dist/internal/funding/providers/symbiosis.d.ts.map +1 -0
  432. package/dist/internal/funding/providers/symbiosis.js +176 -0
  433. package/dist/internal/funding/providers/symbiosis.js.map +1 -0
  434. package/dist/internal/index.d.ts +5 -1
  435. package/dist/internal/index.d.ts.map +1 -1
  436. package/dist/internal/index.js +5 -1
  437. package/dist/internal/index.js.map +1 -1
  438. package/dist/internal/webhookDestinations/url.js +61 -57
  439. package/dist/internal/webhookDestinations/url.js.map +1 -1
  440. package/dist/providers/index.d.ts +43 -0
  441. package/dist/providers/index.d.ts.map +1 -0
  442. package/dist/providers/index.js +19 -0
  443. package/dist/providers/index.js.map +1 -0
  444. package/package.json +9 -4
  445. package/src/ApiKeys.test.ts +11 -7
  446. package/src/ApiKeys.ts +37 -9
  447. package/src/App.test.ts +85 -10
  448. package/src/App.ts +224 -137
  449. package/src/Assets.ts +29 -4
  450. package/src/Client.test-d.ts +650 -30
  451. package/src/Scope.test.ts +19 -0
  452. package/src/Scope.ts +28 -11
  453. package/src/Webhooks.test.ts +25 -0
  454. package/src/Webhooks.ts +1 -1
  455. package/src/admin/App.test.ts +9 -2
  456. package/src/admin/App.ts +32 -9
  457. package/src/admin/apps/api-keys.test.ts +167 -23
  458. package/src/admin/apps/api-keys.ts +166 -28
  459. package/src/admin/apps/earn-vaults.test.ts +338 -0
  460. package/src/admin/apps/earn-vaults.ts +572 -0
  461. package/src/admin/apps/scopes.test.ts +16 -1
  462. package/src/admin/ui/plugin.ts +2 -2
  463. package/src/admin/ui/src/components/EarnVaultForm.tsx +137 -0
  464. package/src/admin/ui/src/components/MobileProfile.tsx +2 -2
  465. package/src/admin/ui/src/components/Page.tsx +1 -1
  466. package/src/admin/ui/src/components/ThemeToggle.tsx +1 -1
  467. package/src/admin/ui/src/lib/api-keys.ts +37 -7
  468. package/src/admin/ui/src/lib/client.ts +1 -1
  469. package/src/admin/ui/src/lib/config.ts +1 -1
  470. package/src/admin/ui/src/lib/early-access.ts +8 -9
  471. package/src/admin/ui/src/lib/earn-vaults.ts +207 -0
  472. package/src/admin/ui/src/lib/format.ts +13 -0
  473. package/src/admin/ui/src/lib/organizations.test.ts +14 -4
  474. package/src/admin/ui/src/lib/organizations.ts +7 -1
  475. package/src/admin/ui/src/lib/response.ts +22 -0
  476. package/src/admin/ui/src/lib/scopes.test.ts +19 -11
  477. package/src/admin/ui/src/lib/scopes.ts +28 -7
  478. package/src/admin/ui/src/lib/verified-tokens.ts +10 -9
  479. package/src/admin/ui/src/routeTree.gen.ts +70 -7
  480. package/src/admin/ui/src/router.tsx +2 -2
  481. package/src/admin/ui/src/routes/__root.tsx +9 -8
  482. package/src/admin/ui/src/routes/api-keys.tsx +475 -64
  483. package/src/admin/ui/src/routes/early-access.tsx +5 -12
  484. package/src/admin/ui/src/routes/earn.vaults.tsx +348 -0
  485. package/src/admin/ui/src/routes/earn.vaults_.$vaultId.edit.tsx +154 -0
  486. package/src/admin/ui/src/routes/earn.vaults_.new.tsx +190 -0
  487. package/src/admin/ui/src/routes/organizations.tsx +4 -7
  488. package/src/admin/ui/src/routes/organizations_.$orgId.tsx +56 -54
  489. package/src/admin/ui/src/routes/verified-tokens.tsx +4 -4
  490. package/src/admin/ui/vite.config.ts +4 -1
  491. package/src/admin/ui.generated.ts +189 -95
  492. package/src/analytics/Analytics.test.ts +69 -10
  493. package/src/analytics/Analytics.ts +20 -1
  494. package/src/analytics/tables/requestEvents.ts +79 -37
  495. package/src/apps/Zones.test.ts +33 -0
  496. package/src/apps/Zones.ts +40 -0
  497. package/src/apps/composition.test.ts +84 -1
  498. package/src/apps/data/App.test.ts +38 -9
  499. package/src/apps/data/App.ts +96 -33
  500. package/src/apps/data/FxOracle.ts +1 -1
  501. package/src/apps/data/index.ts +0 -1
  502. package/src/apps/data/routes/activities.test.ts +82 -6
  503. package/src/apps/data/routes/activities.ts +131 -71
  504. package/src/apps/data/routes/balances.test.ts +50 -37
  505. package/src/apps/data/routes/balances.ts +5 -5
  506. package/src/apps/data/routes/blocks.test.ts +2 -0
  507. package/src/apps/data/routes/coingecko.test.ts +22 -0
  508. package/src/apps/data/routes/coingecko.ts +84 -48
  509. package/src/apps/data/routes/earn.test.ts +1108 -0
  510. package/src/apps/data/routes/earn.ts +1391 -0
  511. package/src/apps/data/routes/exchanges.test.ts +82 -33
  512. package/src/apps/data/routes/exchanges.ts +842 -227
  513. package/src/apps/data/routes/fee-amm.test.ts +4 -6
  514. package/src/apps/data/routes/fee-amm.ts +69 -12
  515. package/src/apps/data/routes/funding.test.ts +2712 -221
  516. package/src/apps/data/routes/funding.ts +1604 -387
  517. package/src/apps/data/routes/indexer.test.ts +43 -34
  518. package/src/apps/data/routes/indexer.ts +19 -2
  519. package/src/apps/data/routes/receipts.test.ts +5 -3
  520. package/src/apps/data/routes/receipts.ts +13 -11
  521. package/src/apps/data/routes/rpc.test.ts +446 -28
  522. package/src/apps/data/routes/rpc.ts +243 -25
  523. package/src/apps/data/routes/tokenlist.test.ts +15 -0
  524. package/src/apps/data/routes/tokenlist.ts +88 -22
  525. package/src/apps/data/routes/tokens.ts +262 -86
  526. package/src/apps/data/routes/transactions.test.ts +2 -0
  527. package/src/apps/data/routes/transactions.ts +77 -42
  528. package/src/apps/data/routes/transfers.test.ts +166 -4
  529. package/src/apps/data/routes/transfers.ts +216 -78
  530. package/src/apps/data/routes/valuation.test.ts +62 -9
  531. package/src/apps/data/routes/valuation.ts +2 -2
  532. package/src/apps/data/routes/verified-tokens.test.ts +51 -0
  533. package/src/apps/data/routes/verified-tokens.ts +52 -15
  534. package/src/apps/data/routes/webhooks.test.ts +432 -33
  535. package/src/apps/data/routes/webhooks.ts +189 -79
  536. package/src/apps/data/routes/zones.test.ts +473 -0
  537. package/src/apps/data/routes/zones.ts +338 -0
  538. package/src/apps/docs/reference.ts +8 -6
  539. package/src/apps/index.ts +2 -1
  540. package/src/apps/management/Billing.test.ts +29 -0
  541. package/src/apps/management/Billing.ts +23 -0
  542. package/src/apps/management/Error.ts +12 -0
  543. package/src/apps/management/routes/api-keys.test.ts +5 -3
  544. package/src/apps/management/routes/api-keys.ts +2 -9
  545. package/src/apps/management/routes/invitations.ts +4 -11
  546. package/src/apps/management/routes/orgs.ts +2 -9
  547. package/src/apps/management/routes/scopes.test.ts +7 -2
  548. package/src/apps/management/routes/scopes.ts +2 -2
  549. package/src/apps/management/routes/webhooks.test.ts +6 -1
  550. package/src/apps/management/routes/webhooks.ts +15 -3
  551. package/src/apps/mpp/App.ts +276 -29
  552. package/src/apps/mpp/Mpp.test.ts +631 -26
  553. package/src/apps/mpp/Mpp.ts +0 -42
  554. package/src/apps/mpp/internal/Adapter.ts +108 -3
  555. package/src/apps/mpp/internal/Error.test.ts +33 -0
  556. package/src/apps/mpp/internal/Error.ts +44 -6
  557. package/src/apps/mpp/internal/Idempotency.test.ts +213 -0
  558. package/src/apps/mpp/internal/Idempotency.ts +59 -5
  559. package/src/apps/mpp/internal/Policy.test.ts +122 -0
  560. package/src/apps/mpp/internal/Policy.ts +98 -0
  561. package/src/apps/mpp/internal/ScreenManager.test.ts +68 -0
  562. package/src/apps/mpp/internal/ScreenManager.ts +41 -0
  563. package/src/apps/mpp/internal/Screening.ts +40 -3
  564. package/src/apps/mpp/internal/Sponsorship.ts +144 -0
  565. package/src/apps/mpp/internal/Utils.ts +30 -0
  566. package/src/apps/relay/App.test.ts +495 -64
  567. package/src/apps/relay/App.ts +234 -24
  568. package/src/apps/relay/Sponsorships.test.ts +51 -0
  569. package/src/apps/relay/Sponsorships.ts +19 -7
  570. package/src/db/Db.ts +439 -0
  571. package/src/db/Schema.ts +325 -2
  572. package/src/db/tables/earnVaults.test.ts +185 -0
  573. package/src/db/tables/earnVaults.ts +151 -0
  574. package/src/db/tables/fundingCatalog.test.ts +108 -0
  575. package/src/db/tables/fundingCatalog.ts +157 -0
  576. package/src/db/tables/fundingDepositAddresses.test.ts +580 -0
  577. package/src/db/tables/fundingDepositAddresses.ts +376 -0
  578. package/src/db/tables/fundingDeposits.test.ts +261 -0
  579. package/src/db/tables/fundingDeposits.ts +229 -0
  580. package/src/db/tables/fundingIdempotency.test.ts +182 -0
  581. package/src/db/tables/fundingIdempotency.ts +180 -0
  582. package/src/db/tables/fundingTransferEvents.ts +28 -0
  583. package/src/db/tables/fundingTransferTransactions.test.ts +69 -0
  584. package/src/db/tables/fundingTransferTransactions.ts +37 -0
  585. package/src/db/tables/fundingTransfers.test.ts +89 -0
  586. package/src/db/tables/fundingTransfers.ts +153 -0
  587. package/src/db/tables/organizations.test.ts +88 -0
  588. package/src/db/tables/organizations.ts +42 -1
  589. package/src/db/tables/projects.ts +16 -0
  590. package/src/db/tables/requestUsage.ts +23 -0
  591. package/src/db/tables/sponsoredTransactions.test.ts +52 -2
  592. package/src/db/tables/sponsoredTransactions.ts +18 -6
  593. package/src/db/tables/users.ts +16 -0
  594. package/src/db/tables/verifiedTokens.ts +19 -14
  595. package/src/db/tables/webhookSubscriptions.ts +58 -3
  596. package/src/handlers/relay.test.ts +2 -0
  597. package/src/handlers/relay.ts +95 -99
  598. package/src/internal/Auth.test.ts +48 -0
  599. package/src/internal/Auth.ts +61 -2
  600. package/src/internal/Cache.ts +13 -9
  601. package/src/internal/Cursor.test.ts +2 -2
  602. package/src/internal/Cursor.ts +1 -1
  603. package/src/internal/EarnRates.test.ts +125 -0
  604. package/src/internal/EarnRates.ts +409 -0
  605. package/src/internal/EarnVaults.test.ts +195 -0
  606. package/src/internal/EarnVaults.ts +876 -0
  607. package/src/internal/EdgeCache.test.ts +37 -5
  608. package/src/internal/EdgeCache.ts +39 -7
  609. package/src/internal/Id.ts +14 -0
  610. package/src/internal/Idempotency.test.ts +109 -0
  611. package/src/internal/Idempotency.ts +237 -0
  612. package/src/internal/Log.test-d.ts +41 -8
  613. package/src/internal/Log.test.ts +189 -8
  614. package/src/internal/Log.ts +124 -17
  615. package/src/internal/MetricSink.test.ts +244 -4
  616. package/src/internal/MetricSink.ts +51 -1
  617. package/src/internal/OpenApi.ts +3 -0
  618. package/src/internal/Provider.test.ts +17 -0
  619. package/src/internal/Provider.ts +17 -0
  620. package/src/internal/Schema.test.ts +13 -0
  621. package/src/internal/Schema.ts +41 -24
  622. package/src/internal/Store.test.ts +25 -0
  623. package/src/internal/Store.ts +46 -0
  624. package/src/internal/Tidx.local.test.ts +78 -3
  625. package/src/internal/Tidx.test.ts +212 -18
  626. package/src/internal/Tidx.ts +112 -32
  627. package/src/internal/VerifiedTokens.test.ts +15 -0
  628. package/src/internal/Viem.test.ts +170 -17
  629. package/src/internal/Viem.ts +111 -28
  630. package/src/internal/WebhookDestination.ts +25 -23
  631. package/src/internal/Webhooks.test.ts +59 -0
  632. package/src/internal/Webhooks.ts +34 -10
  633. package/src/internal/exchange/Provider.test.ts +216 -0
  634. package/src/internal/exchange/Provider.ts +326 -0
  635. package/src/internal/exchange/index.test.ts +6 -0
  636. package/src/internal/exchange/index.ts +1 -0
  637. package/src/internal/exchange/providers/uniswap.test.ts +122 -0
  638. package/src/internal/exchange/providers/uniswap.ts +682 -0
  639. package/src/internal/funding/Action.test.ts +138 -0
  640. package/src/internal/funding/Action.ts +117 -0
  641. package/src/internal/funding/Catalog.test.ts +311 -0
  642. package/src/internal/funding/Catalog.ts +347 -0
  643. package/src/internal/funding/Chain.test.ts +79 -0
  644. package/src/internal/funding/Chain.ts +120 -0
  645. package/src/internal/funding/Deposit.test.ts +26 -0
  646. package/src/internal/funding/Deposit.ts +453 -0
  647. package/src/internal/funding/DepositAddress.test.ts +18 -0
  648. package/src/internal/funding/DepositAddress.ts +312 -0
  649. package/src/internal/funding/Evidence.test.ts +297 -0
  650. package/src/internal/funding/Evidence.ts +430 -0
  651. package/src/internal/funding/Provider.test.ts +1328 -0
  652. package/src/internal/funding/Provider.ts +1796 -0
  653. package/src/internal/funding/Reconciliation.local.test.ts +504 -0
  654. package/src/internal/funding/Reconciliation.test.ts +2020 -0
  655. package/src/internal/funding/Reconciliation.ts +930 -0
  656. package/src/internal/funding/Route.test.ts +66 -0
  657. package/src/internal/funding/Route.ts +29 -0
  658. package/src/internal/funding/Subsidy.local.test.ts +152 -0
  659. package/src/internal/funding/Subsidy.test.ts +75 -0
  660. package/src/internal/funding/Subsidy.ts +260 -0
  661. package/src/internal/funding/Token.test.ts +47 -0
  662. package/src/internal/funding/Token.ts +59 -0
  663. package/src/internal/funding/Transfer.test.ts +369 -0
  664. package/src/internal/funding/Transfer.ts +522 -0
  665. package/src/internal/funding/index.test.ts +20 -0
  666. package/src/internal/funding/index.ts +12 -0
  667. package/src/internal/funding/providers/across.ts +149 -0
  668. package/src/{apps/data/FundingQuoteProviders.test.ts → internal/funding/providers/index.test.ts} +178 -157
  669. package/src/internal/funding/providers/relay.test.ts +474 -0
  670. package/src/internal/funding/providers/relay.ts +559 -0
  671. package/src/internal/funding/providers/rhino.ts +139 -0
  672. package/src/internal/funding/providers/squid.ts +151 -0
  673. package/src/internal/funding/providers/symbiosis.ts +221 -0
  674. package/src/internal/index.test.ts +5 -1
  675. package/src/internal/index.ts +5 -1
  676. package/src/internal/webhookDestinations/url.ts +49 -45
  677. package/src/providers/index.test.ts +14 -0
  678. package/src/providers/index.ts +54 -0
  679. package/dist/apps/data/FundingQuoteProviders.d.ts +0 -174
  680. package/dist/apps/data/FundingQuoteProviders.d.ts.map +0 -1
  681. package/dist/apps/data/FundingQuoteProviders.js +0 -775
  682. package/dist/apps/data/FundingQuoteProviders.js.map +0 -1
  683. package/dist/internal/FundingQuotes.d.ts +0 -864
  684. package/dist/internal/FundingQuotes.d.ts.map +0 -1
  685. package/dist/internal/FundingQuotes.js +0 -672
  686. package/dist/internal/FundingQuotes.js.map +0 -1
  687. package/src/apps/data/FundingQuoteProviders.ts +0 -1043
  688. package/src/internal/FundingQuotes.test.ts +0 -456
  689. package/src/internal/FundingQuotes.ts +0 -944
@@ -0,0 +1,338 @@
1
+ import { Hono } from 'hono'
2
+ import { AbiEvent, AbiFunction, type Hex } from 'ox'
3
+ import * as z from 'zod/mini'
4
+
5
+ import type * as App from '../../../App.js'
6
+ import * as Auth from '../../../internal/Auth.js'
7
+ import * as Cache from '../../../internal/Cache.js'
8
+ import * as OpenApi from '../../../internal/OpenApi.js'
9
+ import * as Response from '../../../internal/Response.js'
10
+ import * as Schema from '../../../internal/Schema.js'
11
+ import * as Timing from '../../../internal/Timing.js'
12
+ import * as Value from '../../../internal/Value.js'
13
+
14
+ const exampleSenderTag = '0x61fc42a734cb44acef497ea0bed612c691195623244136e0739e1929569e2487'
15
+ const exampleTransactionHash = '0x515801d7f9a5ac705e793e85904c9c69b3f1694b465cc8fb6ba3f0298dc82665'
16
+ const exampleWithdrawalId = `${exampleTransactionHash}-4`
17
+
18
+ const withdrawalProcessedEvent = AbiEvent.from(
19
+ 'event WithdrawalProcessed(address indexed to, bytes32 indexed senderTag, address token, uint128 amount, bool callbackSuccess)',
20
+ )
21
+ const withdrawalProcessedSelector = AbiEvent.getSelector(withdrawalProcessedEvent)
22
+ const lastSyncedTempoBlockNumberFunction = AbiFunction.from(
23
+ 'function lastSyncedTempoBlockNumber() view returns (uint64)',
24
+ )
25
+
26
+ /** Zod schemas owned by Zone handlers. */
27
+ export namespace schema {
28
+ /** Schemas for the listZoneWithdrawals operation. */
29
+ export namespace listZoneWithdrawals {
30
+ /** Path parameters for a Zone withdrawal list request. */
31
+ export const Params = z
32
+ .object({
33
+ senderTag: Schema.hash(exampleSenderTag).check(
34
+ z.describe(
35
+ 'The 32-byte correlation tag shared by withdrawals from one sender in one Zone transaction.',
36
+ ),
37
+ ),
38
+ })
39
+ .check(z.describe('Path parameters used to correlate Zone withdrawals.'))
40
+
41
+ /** Query parameters for a Zone withdrawal list request. */
42
+ export const Query = z
43
+ .strictObject({
44
+ chainId: Schema.ChainId.check(
45
+ z.describe('The chain id of the Zone where the withdrawal originated.'),
46
+ z.meta({ examples: [421_700_001] }),
47
+ ),
48
+ })
49
+ .check(z.describe('Query parameters used to select the originating Zone.'))
50
+
51
+ /** Indexed Zone withdrawal after parent-chain processing. */
52
+ export const Withdrawal = z
53
+ .object({
54
+ blockNumber: z
55
+ .number()
56
+ .check(
57
+ z.int(),
58
+ z.nonnegative(),
59
+ z.describe('Parent-chain block containing the withdrawal processing event.'),
60
+ z.meta({ examples: [123] }),
61
+ ),
62
+ id: z
63
+ .string()
64
+ .check(
65
+ z.describe(
66
+ 'Stable withdrawal id built from the parent transaction hash and log index (`${transactionHash}-${logIndex}`).',
67
+ ),
68
+ z.meta({ examples: [exampleWithdrawalId] }),
69
+ ),
70
+ logIndex: z
71
+ .number()
72
+ .check(
73
+ z.int(),
74
+ z.nonnegative(),
75
+ z.describe('Event position within the parent-chain block.'),
76
+ z.meta({ examples: [4] }),
77
+ ),
78
+ status: z
79
+ .enum(['failed', 'completed'])
80
+ .check(
81
+ z.describe('Whether parent-chain delivery or processing failed or completed.'),
82
+ z.meta({ examples: ['failed', 'completed'] }),
83
+ ),
84
+ transactionHash: Schema.hash(exampleTransactionHash).check(
85
+ z.describe('Parent-chain transaction that processed the withdrawal.'),
86
+ ),
87
+ zoneStatus: z
88
+ .enum(['pending', 'completed'])
89
+ .check(
90
+ z.describe(
91
+ 'Completed once the Zone has proven it imported the parent-chain `blockNumber` containing this withdrawal.',
92
+ ),
93
+ z.meta({ examples: ['pending', 'completed'] }),
94
+ ),
95
+ })
96
+ .check(z.describe('A Zone withdrawal processed on its parent chain.'))
97
+
98
+ /** Non-paginated list of indexed Zone withdrawal outcomes. */
99
+ export const Response = Schema.describe(
100
+ z.object({
101
+ data: z
102
+ .array(Withdrawal)
103
+ .check(
104
+ z.describe(
105
+ 'Indexed parent-chain withdrawal outcomes sharing the sender tag. The list may grow while matching withdrawals are processed.',
106
+ ),
107
+ ),
108
+ }),
109
+ 'A non-paginated list of parent-chain withdrawal outcomes correlated by sender tag.',
110
+ )
111
+ }
112
+ }
113
+
114
+ /** Creates Zone handlers. */
115
+ export function zones() {
116
+ return new Hono<App.Environment>().get(
117
+ '/v1/zones/withdrawals/:senderTag',
118
+ Auth.policy({ apiKey: { scopes: ['data:read'] } }),
119
+ OpenApi.validate('param', schema.listZoneWithdrawals.Params, {
120
+ code: 'sender_tag_invalid',
121
+ message: 'Invalid sender tag',
122
+ }),
123
+ OpenApi.validate('query', schema.listZoneWithdrawals.Query, {
124
+ code: 'query_invalid',
125
+ message: 'Invalid query parameters',
126
+ }),
127
+ OpenApi.describeRoute({
128
+ description:
129
+ 'Lists L1 withdrawal outcomes by Zone sender tag. L1 success requires every `status` completed; Zone success also requires every `zoneStatus` completed. Empty lists remain pending.',
130
+ operationId: 'listZoneWithdrawals',
131
+ responses: OpenApi.responses({
132
+ errors: {
133
+ 400: {
134
+ codes: [
135
+ 'api_key_malformed',
136
+ 'chain_id_invalid',
137
+ 'chain_id_unsupported',
138
+ 'query_invalid',
139
+ 'sender_tag_invalid',
140
+ ],
141
+ },
142
+ 403: 'The API key does not grant read access to the originating Zone.',
143
+ 502: 'The parent-chain indexer or RPC returned unavailable or malformed data.',
144
+ },
145
+ success: {
146
+ description: 'Indexed parent-chain withdrawal outcomes correlated by sender tag.',
147
+ examples: {
148
+ empty: {
149
+ summary: 'Not indexed',
150
+ value: { data: [] },
151
+ },
152
+ processed: {
153
+ summary: 'Processed',
154
+ value: {
155
+ data: [
156
+ {
157
+ blockNumber: 123,
158
+ id: exampleWithdrawalId,
159
+ logIndex: 4,
160
+ status: 'completed',
161
+ transactionHash: exampleTransactionHash,
162
+ zoneStatus: 'pending',
163
+ },
164
+ ],
165
+ },
166
+ },
167
+ },
168
+ schema: schema.listZoneWithdrawals.Response,
169
+ },
170
+ }),
171
+ summary: 'List Zone withdrawals',
172
+ tags: ['Zones'],
173
+ }),
174
+ Cache.response<App.Environment>({
175
+ cacheControl: Cache.policies.noStore,
176
+ name: 'tempo-api:zone-withdrawals:v1',
177
+ key: (c) => {
178
+ const principal = Auth.getPrincipal(c)
179
+ return `${principal?.type ?? 'unknown'}:${principal?.id ?? 'unknown'}:${Cache.urlKey(c, schema.listZoneWithdrawals.Query)}`
180
+ },
181
+ }),
182
+ async (c) => {
183
+ if (Auth.narrowAccess) return Auth.accessError(c)
184
+ if (OpenApi.narrowValidation)
185
+ return OpenApi.validationError(c, {
186
+ code: 'sender_tag_invalid',
187
+ message: 'Invalid sender tag',
188
+ })
189
+ if (OpenApi.narrowValidation)
190
+ return OpenApi.validationError(c, {
191
+ code: 'query_invalid',
192
+ message: 'Invalid query parameters',
193
+ })
194
+ if (OpenApi.narrowValidation)
195
+ return OpenApi.validationError(c, {
196
+ code: 'chain_id_invalid',
197
+ message: 'Invalid chain id',
198
+ })
199
+
200
+ const { senderTag } = c.req.valid('param')
201
+ const { chainId } = c.req.valid('query')
202
+ const zone = c.get('zones').get(chainId)
203
+ if (!zone) return Response.unsupportedChainId(c, chainId, c.get('zones').keys())
204
+
205
+ try {
206
+ const parentChainId = Schema.ChainId.parse(zone.sourceId)
207
+ const portalContract = zone.contracts?.['portal']
208
+ const portal = Schema.Address.parse(
209
+ portalContract && 'address' in portalContract
210
+ ? portalContract.address
211
+ : portalContract?.[parentChainId]?.address,
212
+ )
213
+ const tidx = c.get('getTidx')(parentChainId)
214
+ const result = await Timing.time(c, 'zone_withdrawal', () =>
215
+ tidx.fetch({
216
+ chainId: parentChainId,
217
+ engine: 'clickhouse',
218
+ // Dynamic raw-log query, constrained to schema-validated hex literals.
219
+ // FINAL collapses replayed physical rows before returning distinct events.
220
+ query: `
221
+ SELECT block_num, log_idx, tx_hash, address, selector, topic1, topic2, data
222
+ FROM logs FINAL
223
+ WHERE address = '${portal}'
224
+ AND selector = '${withdrawalProcessedSelector}'
225
+ AND topic2 = '${senderTag}'
226
+ ORDER BY block_num ASC, log_idx ASC
227
+ ` as string,
228
+ }),
229
+ )
230
+ if (result.rows.length === 0)
231
+ return c.json(Response.validated(schema.listZoneWithdrawals.Response, { data: [] }), 200)
232
+
233
+ // TODO: Use `zone_getZoneInfo` once Zone RPC versions stabilize.
234
+ const tempoBlockNumber = await Timing.time(c, 'zone_status', () =>
235
+ c
236
+ .get('getClient')(parentChainId)
237
+ .readContract({
238
+ abi: [lastSyncedTempoBlockNumberFunction],
239
+ address: portal,
240
+ functionName: 'lastSyncedTempoBlockNumber',
241
+ }),
242
+ )
243
+ const data = resolveWithdrawalProcessed({
244
+ portal,
245
+ rows: result.rows,
246
+ senderTag,
247
+ tempoBlockNumber,
248
+ })
249
+ return c.json(Response.validated(schema.listZoneWithdrawals.Response, data), 200)
250
+ } catch (cause) {
251
+ return Response.upstream(c, cause)
252
+ }
253
+ },
254
+ )
255
+ }
256
+
257
+ /**
258
+ * Resolves indexed `WithdrawalProcessed` rows into public withdrawal outcomes
259
+ * and rejects malformed upstream data.
260
+ */
261
+ export function resolveWithdrawalProcessed(
262
+ options: resolveWithdrawalProcessed.Options,
263
+ ): z.output<typeof schema.listZoneWithdrawals.Response> {
264
+ const { portal, rows, senderTag, tempoBlockNumber } = options
265
+ return {
266
+ data: rows.map((row) => {
267
+ const address = Schema.Address.safeParse(row['address'])
268
+ const blockNumber = Value.toNumber(row['block_num'])
269
+ const data = Schema.Hex.safeParse(row['data'])
270
+ const logIndex = Value.toNumber(row['log_idx'])
271
+ const selector = Schema.Hash.safeParse(row['selector'])
272
+ const topic1 = Schema.Hash.safeParse(row['topic1'])
273
+ const topic2 = Schema.Hash.safeParse(row['topic2'])
274
+ const transactionHash = Schema.Hash.safeParse(row['tx_hash'])
275
+ if (
276
+ !address.success ||
277
+ address.data !== portal ||
278
+ blockNumber === undefined ||
279
+ !Number.isSafeInteger(blockNumber) ||
280
+ blockNumber < 0 ||
281
+ !data.success ||
282
+ logIndex === undefined ||
283
+ !Number.isSafeInteger(logIndex) ||
284
+ logIndex < 0 ||
285
+ !selector.success ||
286
+ selector.data !== withdrawalProcessedSelector ||
287
+ !topic1.success ||
288
+ !topic2.success ||
289
+ topic2.data !== senderTag ||
290
+ !transactionHash.success
291
+ )
292
+ throw new Error('Upstream returned a malformed WithdrawalProcessed event')
293
+
294
+ const decoded = (() => {
295
+ try {
296
+ return AbiEvent.decode(withdrawalProcessedEvent, {
297
+ data: data.data,
298
+ topics: [selector.data, topic1.data, topic2.data],
299
+ })
300
+ } catch {
301
+ return undefined
302
+ }
303
+ })()
304
+ if (
305
+ !decoded ||
306
+ !Schema.Address.safeParse(decoded.to).success ||
307
+ decoded.senderTag.toLowerCase() !== senderTag ||
308
+ !Schema.Address.safeParse(decoded.token).success ||
309
+ typeof decoded.amount !== 'bigint' ||
310
+ typeof decoded.callbackSuccess !== 'boolean'
311
+ )
312
+ throw new Error('Upstream returned a malformed WithdrawalProcessed event')
313
+
314
+ return {
315
+ blockNumber,
316
+ id: `${transactionHash.data}-${logIndex}`,
317
+ logIndex,
318
+ status: decoded.callbackSuccess ? 'completed' : 'failed',
319
+ transactionHash: transactionHash.data,
320
+ zoneStatus: tempoBlockNumber >= BigInt(blockNumber) ? 'completed' : 'pending',
321
+ }
322
+ }),
323
+ }
324
+ }
325
+
326
+ export declare namespace resolveWithdrawalProcessed {
327
+ /** Inputs for resolving indexed Zone withdrawal processing rows. */
328
+ type Options = {
329
+ /** Configured ZonePortal address on the parent Tempo chain. */
330
+ portal: z.output<typeof Schema.Address>
331
+ /** Matching raw TIDX log rows ordered by parent-chain position. */
332
+ rows: readonly Record<string, unknown>[]
333
+ /** Sender tag supplied by the caller. */
334
+ senderTag: Hex.Hex
335
+ /** Latest parent-chain block the originating Zone proved it imported. */
336
+ tempoBlockNumber: bigint
337
+ }
338
+ }
@@ -113,7 +113,7 @@ function inlineOpenrpc<spec extends { paths: Record<string, unknown> }>(spec: sp
113
113
  const paths: Record<string, unknown> = {}
114
114
  for (const [pathname, item] of Object.entries(spec.paths)) {
115
115
  let next = item
116
- if (isRecord(item))
116
+ if (item && typeof item === 'object' && !Array.isArray(item))
117
117
  for (const [method, op] of Object.entries(item))
118
118
  if (isRpcOperation(op)) next = { ...item, [method]: { ...op, 'x-openrpc': openrpcSpec } }
119
119
  paths[pathname] = next
@@ -124,9 +124,11 @@ function inlineOpenrpc<spec extends { paths: Record<string, unknown> }>(spec: sp
124
124
  // The JSON-RPC passthrough's operation id, set by its route definition and
125
125
  // targeted by `App.create`'s `applyOpenrpcLink`.
126
126
  function isRpcOperation(op: unknown): op is Record<string, unknown> {
127
- return isRecord(op) && op['operationId'] === 'rpcRequest'
128
- }
129
-
130
- function isRecord(value: unknown): value is Record<string, unknown> {
131
- return !!value && typeof value === 'object' && !Array.isArray(value)
127
+ return (
128
+ !!op &&
129
+ typeof op === 'object' &&
130
+ !Array.isArray(op) &&
131
+ 'operationId' in op &&
132
+ op.operationId === 'rpcRequest'
133
+ )
132
134
  }
package/src/apps/index.ts CHANGED
@@ -1,5 +1,6 @@
1
- export { data, FundingQuoteProviders, FxOracle } from './data/index.js'
1
+ export { data, FxOracle } from './data/index.js'
2
2
  export { management } from './management/index.js'
3
3
  export { mcp } from './mcp.js'
4
4
  export { mpp } from './mpp/index.js'
5
5
  export { relay } from './relay/index.js'
6
+ export * as Zones from './Zones.js'
@@ -576,4 +576,33 @@ describe('createRequestUsageReporter', () => {
576
576
  expect((await RequestUsage.getBucket(db, { bucketStart, environment: 'production', orgId: 'org_1' }))?.reportedCount).toBe(6) // prettier-ignore
577
577
  await db.close()
578
578
  })
579
+
580
+ test('behavior: exposes the durable retry backlog for alerting', async () => {
581
+ const db = create()
582
+ await db.migrate()
583
+ await StripeCustomers.create(db, { orgId: 'org_1', stripeCustomerId: 'cus_1' })
584
+ await StripeCustomers.setStatus(db, 'org_1', 'active')
585
+ const { stripe } = stubStripe({
586
+ meterEvent() {
587
+ throw new Error('Stripe unavailable')
588
+ },
589
+ subscriptions: [{ items: ['feePayerSpend', 'apiRequests'], status: 'active' }],
590
+ })
591
+ const reporter = Billing.createRequestUsageReporter({
592
+ db,
593
+ now: () => Date.now(),
594
+ readCounts: async () => [{ bucketStart, count: 4, orgId: 'org_1' }],
595
+ stripe,
596
+ })
597
+
598
+ expect(await reporter.tick()).toStrictEqual({ failed: 1, reported: 0, skipped: 0 })
599
+ expect(await reporter.pending()).toEqual([
600
+ {
601
+ count: 1,
602
+ environment: 'production',
603
+ oldestPendingAgeSeconds: expect.any(Number),
604
+ },
605
+ ])
606
+ await db.close()
607
+ })
579
608
  })
@@ -444,6 +444,20 @@ export function createRequestUsageReporter(
444
444
  ...(sandboxStripe ? [{ client: sandboxStripe, environment: 'sandbox' as const }] : []),
445
445
  ]
446
446
  return {
447
+ async pending() {
448
+ return Promise.all(
449
+ clients.map(async ({ environment }) => {
450
+ const status = await RequestUsage.getPendingStatus(Db.get(db), environment)
451
+ return {
452
+ count: status.count,
453
+ environment,
454
+ oldestPendingAgeSeconds: status.oldestAttemptedAt
455
+ ? Math.max(0, Math.floor((now() - new Date(status.oldestAttemptedAt).getTime()) / 1_000))
456
+ : 0,
457
+ }
458
+ }),
459
+ )
460
+ },
447
461
  async tick() {
448
462
  const database = Db.get(db)
449
463
  let failed = 0
@@ -583,9 +597,18 @@ export declare namespace createRequestUsageReporter {
583
597
 
584
598
  /** A scheduled request-metering job. */
585
599
  type Reporter = {
600
+ /** Reads the current retry backlog without sending meter events. */
601
+ pending(): Promise<readonly Pending[]>
586
602
  /** Runs one reporting pass across production (and sandbox when configured). */
587
603
  tick(): Promise<{ failed: number; reported: number; skipped: number }>
588
604
  }
605
+
606
+ /** Current durable retry backlog for one billing environment. */
607
+ type Pending = {
608
+ count: number
609
+ environment: StripeCustomers.Record['environment']
610
+ oldestPendingAgeSeconds: number
611
+ }
589
612
  }
590
613
 
591
614
  /** Composite key for the in-tick blocked-bucket set. */
@@ -0,0 +1,12 @@
1
+ import type { Context } from 'hono'
2
+
3
+ import * as Response from '../../internal/Response.js'
4
+
5
+ /** Returns the standard error for operations that require a user session. */
6
+ export function sessionRequired(c: Context) {
7
+ return Response.error(c, {
8
+ code: 'forbidden',
9
+ message: 'Session required',
10
+ status: 403,
11
+ })
12
+ }
@@ -119,9 +119,11 @@ describe('keys', () => {
119
119
 
120
120
  // Even the org owner cannot self-mint zone access: membership is
121
121
  // controlled zone-side, so zone scopes are super-admin-issued.
122
- const denied = await app.request(base, json('POST', owner, { scopes: ['zone:421700001:read'] }))
123
- expect(denied.status).toBe(403)
124
- expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
122
+ for (const scope of ['zone:421700001:read', 'zone:421700001:write']) {
123
+ const denied = await app.request(base, json('POST', owner, { scopes: [scope] }))
124
+ expect(denied.status).toBe(403)
125
+ expect(await denied.json()).toMatchObject({ error: { code: 'scope_not_issuable' } })
126
+ }
125
127
  })
126
128
 
127
129
  test('restricts project management keys without delegating issuance', async () => {
@@ -12,6 +12,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
12
12
  import * as Response from '../../../internal/Response.js'
13
13
  import * as Schema from '../../../internal/Schema.js'
14
14
  import * as Scope from '../../../Scope.js'
15
+ import * as ManagementError from '../Error.js'
15
16
 
16
17
  /** Zod schemas owned by the API-keys resource. */
17
18
  export namespace schema {
@@ -281,7 +282,7 @@ export function apiKeys(options: apiKeys.Options = {}) {
281
282
  const kv = c.get('kv')
282
283
  if (!kv) return notEnabled(c)
283
284
  const createdBy = mintedBy(c)
284
- if (!createdBy) return sessionRequired(c)
285
+ if (!createdBy) return ManagementError.sessionRequired(c)
285
286
 
286
287
  const body = c.req.valid('json')
287
288
 
@@ -582,11 +583,3 @@ function notEnabled(c: Context<App.Environment>) {
582
583
  status: 404,
583
584
  })
584
585
  }
585
-
586
- function sessionRequired(c: Context<App.Environment>) {
587
- return Response.error(c, {
588
- code: 'forbidden',
589
- message: 'Session required',
590
- status: 403,
591
- })
592
- }
@@ -8,6 +8,7 @@ import * as Memberships from '../../../db/tables/memberships.js'
8
8
  import * as OpenApi from '../../../internal/OpenApi.js'
9
9
  import * as Response from '../../../internal/Response.js'
10
10
  import * as Schema from '../../../internal/Schema.js'
11
+ import * as ManagementError from '../Error.js'
11
12
 
12
13
  import type { Email, Environment } from '../App.js'
13
14
 
@@ -386,7 +387,7 @@ export function invitations() {
386
387
  if (Auth.narrowAccess) return Auth.superAdminAccessError(c)
387
388
 
388
389
  const principal = Auth.getPrincipal(c)
389
- if (principal?.type !== 'session') return sessionRequired(c)
390
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
390
391
  // Without a verified email there is nothing to match against.
391
392
  if (!principal.email)
392
393
  return c.json(Response.validated(schema.listMyInvitations.Response, { data: [] }), 200)
@@ -437,7 +438,7 @@ export function invitations() {
437
438
  })
438
439
 
439
440
  const principal = Auth.getPrincipal(c)
440
- if (principal?.type !== 'session') return sessionRequired(c)
441
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
441
442
 
442
443
  const { invitationId } = c.req.valid('param')
443
444
  const db = Db.get(c.get('db'))
@@ -492,7 +493,7 @@ export function invitations() {
492
493
  })
493
494
 
494
495
  const principal = Auth.getPrincipal(c)
495
- if (principal?.type !== 'session') return sessionRequired(c)
496
+ if (principal?.type !== 'session') return ManagementError.sessionRequired(c)
496
497
 
497
498
  const { invitationId } = c.req.valid('param')
498
499
  const db = Db.get(c.get('db'))
@@ -575,11 +576,3 @@ function invitationNotFound(c: Context<Environment>) {
575
576
  status: 404,
576
577
  })
577
578
  }
578
-
579
- function sessionRequired(c: Context<Environment>) {
580
- return Response.error(c, {
581
- code: 'forbidden',
582
- message: 'Session required',
583
- status: 403,
584
- })
585
- }
@@ -11,6 +11,7 @@ import * as OpenApi from '../../../internal/OpenApi.js'
11
11
  import * as Organizations from '../../../db/tables/organizations.js'
12
12
  import * as Response from '../../../internal/Response.js'
13
13
  import * as Schema from '../../../internal/Schema.js'
14
+ import * as ManagementError from '../Error.js'
14
15
 
15
16
  /** Zod schemas owned by the organizations resource. */
16
17
  export namespace schema {
@@ -178,7 +179,7 @@ export function orgs() {
178
179
 
179
180
  const principal = Auth.getPrincipal(c)
180
181
  if (principal?.type !== 'session' && principal?.type !== 'super_admin')
181
- return sessionRequired(c)
182
+ return ManagementError.sessionRequired(c)
182
183
 
183
184
  const body = c.req.valid('json')
184
185
  const db = Db.get(c.get('db'))
@@ -380,11 +381,3 @@ function organizationNotFound(c: Context<App.Environment>) {
380
381
  status: 404,
381
382
  })
382
383
  }
383
-
384
- function sessionRequired(c: Context<App.Environment>) {
385
- return Response.error(c, {
386
- code: 'forbidden',
387
- message: 'Session required',
388
- status: 403,
389
- })
390
- }
@@ -14,10 +14,14 @@ describe('scopes', () => {
14
14
  expect(response.headers.get('cache-control')).toMatchInlineSnapshot(
15
15
  `"private, max-age=300, stale-while-revalidate=3600"`,
16
16
  )
17
- expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry].map((entry) => ({ ...entry })))
17
+ expect(body.data).toEqual(
18
+ [...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry].map((entry) => ({ ...entry })),
19
+ )
18
20
  expect(body.data.map((entry) => entry.scope)).toMatchInlineSnapshot(`
19
21
  [
20
22
  "data:read",
23
+ "funding:read",
24
+ "funding:write",
21
25
  "indexer:query",
22
26
  "management:read",
23
27
  "management:write",
@@ -27,6 +31,7 @@ describe('scopes', () => {
27
31
  "webhooks:read",
28
32
  "webhooks:write",
29
33
  "zone:<chainId>:read",
34
+ "zone:<chainId>:write",
30
35
  ]
31
36
  `)
32
37
  })
@@ -42,6 +47,6 @@ describe('scopes', () => {
42
47
  const body = await TestApp.json(response, Scopes.schema.getScopes.Response)
43
48
 
44
49
  expect(response.status).toBe(200)
45
- expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, custom])
50
+ expect(body.data).toEqual([...Scope.catalog, Scope.zoneEntry, Scope.zoneWriteEntry, custom])
46
51
  })
47
52
  })
@@ -24,7 +24,7 @@ export namespace schema {
24
24
  .string()
25
25
  .check(
26
26
  z.describe(
27
- 'Scope identifier used in API-key grants and route policies. `zone:<chainId>:read` is a template: grants carry a concrete zone chain id.',
27
+ 'Scope identifier used in API-key grants and route policies. Zone templates carry a concrete chain id and access level in grants.',
28
28
  ),
29
29
  z.meta({ examples: ['data:read'] }),
30
30
  ),
@@ -66,7 +66,7 @@ export function scopes() {
66
66
  }),
67
67
  Cache.response<App.Environment>({
68
68
  cacheControl: Cache.policies.stable,
69
- name: 'tempo-api:scopes:v3',
69
+ name: 'tempo-api:scopes:v5',
70
70
  key: (c) => {
71
71
  const url = new URL(c.req.url)
72
72
  url.search = ''
@@ -2,6 +2,7 @@ import { generatePrivateKey, privateKeyToAccount } from 'viem/accounts'
2
2
 
3
3
  import * as App from '../../../App.js'
4
4
  import * as Memberships from '../../../db/tables/memberships.js'
5
+ import * as Cursor from '../../../internal/Cursor.js'
5
6
  import * as core_Webhooks from '../../../internal/Webhooks.js'
6
7
  import * as TestApp from '../../../../test/App.js'
7
8
  import { management } from '../App.js'
@@ -47,7 +48,8 @@ async function organization(app: ReturnType<typeof createApp>, cookie: string) {
47
48
 
48
49
  describe('webhooks', () => {
49
50
  test('creates, lists, pauses, and deletes an organization webhook', async () => {
50
- const app = createApp()
51
+ const db = TestApp.database()
52
+ const app = createApp({ db })
51
53
  const cookie = await session(app)
52
54
  const org = await organization(app, cookie)
53
55
  const collection = `/v1/orgs/${org.id}/webhooks`
@@ -65,6 +67,9 @@ describe('webhooks', () => {
65
67
  expect(createdResponse.status).toBe(200)
66
68
  const created = await TestApp.json(createdResponse, Webhooks.schema.createWebhook.Response)
67
69
  expect(created).toHaveProperty('secret', expect.stringMatching(/^whsec_/))
70
+ expect(Cursor.decode((await core_Webhooks.getCursor(db, created.id))!, ['int'])).toEqual([
71
+ expect.any(Number),
72
+ ])
68
73
 
69
74
  const listedResponse = await app.request(collection, { headers: { cookie } })
70
75
  expect(listedResponse.status).toBe(200)