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
@@ -1,6 +1,6 @@
1
1
  import { Hono } from 'hono'
2
2
  import { createMiddleware } from 'hono/factory'
3
- import { RpcResponse } from 'ox'
3
+ import { Hash, Hex, RpcResponse } from 'ox'
4
4
  import { ZoneRpcAuthentication } from 'ox/tempo'
5
5
  import { Addresses, TokenId, Transaction } from 'viem/tempo'
6
6
 
@@ -88,16 +88,48 @@ function middleware(options: middleware.Options) {
88
88
  const verifiedTokens = c.get('verifiedTokens')
89
89
  const zoneToken_header = c.req.header(ZoneRpcAuthentication.headerName)
90
90
  const zoneToken = zoneToken_header?.trim() ? zoneToken_header : undefined
91
+ let chainId: number | null | undefined
92
+ let internalErrors = 0
93
+ let reason: Log.SponsorshipReason | null | undefined
94
+ let rejections = 0
95
+ const reasons = new Set<Log.SponsorshipReason>()
96
+ const requests: rejectionDiagnostics.Request[] = []
97
+
98
+ const recordRejection = (options: middleware.Rejection) => {
99
+ const id =
100
+ Number.isSafeInteger(options.chainId) && options.chainId >= 0 ? options.chainId : null
101
+ if (chainId !== null) chainId = chainId === undefined || chainId === id ? id : null
102
+ if (options.reason === 'internal_error') internalErrors = Math.min(internalErrors + 1, 65_535)
103
+ if (reason !== null)
104
+ reason = reason === undefined || reason === options.reason ? options.reason : null
105
+ reasons.add(options.reason)
106
+ rejections = Math.min(rejections + 1, 65_535)
107
+ }
108
+
109
+ const rejectSponsorship = (options: middleware.Refusal): never => {
110
+ recordRejection({ chainId: options.chainId, reason: options.reason })
111
+ throw new RpcResponse.InvalidParamsError({
112
+ data: { code: options.reason },
113
+ message: options.message,
114
+ })
115
+ }
116
+
117
+ const failSponsorship = (options: middleware.Failure): never => {
118
+ recordRejection({ chainId: options.chainId, reason: 'internal_error' })
119
+ // Capability-form fills serialize `Error.message`, so retain the
120
+ // internal detail only as a cause.
121
+ throw new Error('Internal error', { cause: new Error(options.message) })
122
+ }
91
123
 
92
124
  const feePayer = (() => {
93
125
  if (!options.feePayer) return undefined
94
126
  const attribution =
95
- principal?.type === 'api_key' && principal.projectId !== undefined
127
+ principal?.type === 'api_key'
96
128
  ? {
97
129
  apiKeyId: principal.id,
98
130
  environment: principal.environment,
99
131
  orgId: principal.orgId,
100
- projectId: principal.projectId,
132
+ ...(principal.projectId === undefined ? {} : { projectId: principal.projectId }),
101
133
  }
102
134
  : undefined
103
135
  const sponsorable =
@@ -115,9 +147,30 @@ function middleware(options: middleware.Options) {
115
147
  // only mainnet: the relay resolves chainId from the request body, so
116
148
  // the query-string chain guard never sees it.
117
149
  const id = Number(transaction.chainId)
118
- if (!attribution || !sponsorable || !c.get('supportedChainIds').has(id)) {
150
+ if (!attribution) {
151
+ if (sponsorshipRequired)
152
+ rejectSponsorship({
153
+ chainId: id,
154
+ message: 'Sponsorship rejected.',
155
+ reason: 'api_key_required',
156
+ })
157
+ return false
158
+ }
159
+ if (!sponsorable) {
119
160
  if (sponsorshipRequired)
120
- throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' })
161
+ failSponsorship({
162
+ chainId: id,
163
+ message: 'Sponsor route accepted an ineligible API key.',
164
+ })
165
+ return false
166
+ }
167
+ if (!c.get('supportedChainIds').has(id)) {
168
+ if (sponsorshipRequired)
169
+ rejectSponsorship({
170
+ chainId: id,
171
+ message: 'Sponsorship rejected.',
172
+ reason: 'chain_id_unsupported',
173
+ })
121
174
  return false
122
175
  }
123
176
  if (!Viem.isMainnet(id)) return true
@@ -126,7 +179,11 @@ function middleware(options: middleware.Options) {
126
179
  // it. Refuse here, or sandbox spend would sponsor mainnet unbilled.
127
180
  if (attribution.environment !== 'production') {
128
181
  if (sponsorshipRequired)
129
- throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' })
182
+ rejectSponsorship({
183
+ chainId: id,
184
+ message: 'Sponsorship rejected.',
185
+ reason: 'production_api_key_required',
186
+ })
130
187
  return false
131
188
  }
132
189
 
@@ -141,17 +198,19 @@ function middleware(options: middleware.Options) {
141
198
  const billing = await Billing.status(db, attribution.orgId)
142
199
  if (billing === 'past_due') {
143
200
  if (sponsorshipRequired)
144
- throw new RpcResponse.InvalidParamsError({
145
- data: { code: 'billing_past_due' },
201
+ rejectSponsorship({
202
+ chainId: id,
146
203
  message: 'Billing past due.',
204
+ reason: 'billing_past_due',
147
205
  })
148
206
  return 'billing_past_due'
149
207
  }
150
208
  if (billing !== 'active') {
151
209
  if (sponsorshipRequired)
152
- throw new RpcResponse.InvalidParamsError({
153
- data: { code: 'billing_required' },
210
+ rejectSponsorship({
211
+ chainId: id,
154
212
  message: 'Billing required.',
213
+ reason: 'billing_required',
155
214
  })
156
215
  return 'billing_required'
157
216
  }
@@ -172,9 +231,10 @@ function middleware(options: middleware.Options) {
172
231
  verified.decimals !== Fees.tokenDecimals
173
232
  ) {
174
233
  if (sponsorshipRequired)
175
- throw new RpcResponse.InvalidParamsError({
176
- data: { code: 'fee_token_unsupported' },
234
+ rejectSponsorship({
235
+ chainId: id,
177
236
  message: 'Fee token unsupported.',
237
+ reason: 'fee_token_unsupported',
178
238
  })
179
239
  return 'fee_token_unsupported'
180
240
  }
@@ -184,9 +244,10 @@ function middleware(options: middleware.Options) {
184
244
  const feeMax = Fees.maxOf(transaction)
185
245
  if (feeMax === undefined) {
186
246
  if (sponsorshipRequired)
187
- throw new RpcResponse.InvalidParamsError({
188
- data: { code: 'tx_fee_limit_exceeded' },
247
+ rejectSponsorship({
248
+ chainId: id,
189
249
  message: 'Transaction fee limit exceeded.',
250
+ reason: 'tx_fee_limit_exceeded',
190
251
  })
191
252
  return 'tx_fee_limit_exceeded'
192
253
  }
@@ -198,9 +259,10 @@ function middleware(options: middleware.Options) {
198
259
  })()
199
260
  if (feeMax > cap) {
200
261
  if (sponsorshipRequired)
201
- throw new RpcResponse.InvalidParamsError({
202
- data: { code: 'tx_fee_limit_exceeded' },
262
+ rejectSponsorship({
263
+ chainId: id,
203
264
  message: 'Transaction fee limit exceeded.',
265
+ reason: 'tx_fee_limit_exceeded',
204
266
  })
205
267
  return 'tx_fee_limit_exceeded'
206
268
  }
@@ -215,7 +277,10 @@ function middleware(options: middleware.Options) {
215
277
  // Defense in depth: `validate` already refuses non-production
216
278
  // mainnet, so reaching here with that pair is a wiring bug.
217
279
  if (mainnet && attribution.environment !== 'production')
218
- throw new RpcResponse.InvalidParamsError({ message: 'Sponsorship rejected.' })
280
+ failSponsorship({
281
+ chainId: event.chainId,
282
+ message: 'Non-production key reached mainnet sponsorship recording.',
283
+ })
219
284
 
220
285
  // The cap recomputes from canonical envelope bytes, mirroring the
221
286
  // reconciliation convention; pending rows charge it to spend limits.
@@ -238,11 +303,11 @@ function middleware(options: middleware.Options) {
238
303
 
239
304
  const input = {
240
305
  apiKeyId: attribution.apiKeyId,
241
- billable: attribution.environment === 'production',
306
+ billable: mainnet && attribution.environment === 'production',
242
307
  chainId: event.chainId,
243
308
  environment: attribution.environment,
244
309
  orgId: attribution.orgId,
245
- projectId: attribution.projectId,
310
+ ...(attribution.projectId === undefined ? {} : { projectId: attribution.projectId }),
246
311
  signPayload: event.signPayload,
247
312
  transaction: event.transaction,
248
313
  ...(currency ? { currency } : {}),
@@ -262,9 +327,10 @@ function middleware(options: middleware.Options) {
262
327
  })
263
328
  } catch (error) {
264
329
  if (error instanceof SponsoredTransactions.PeriodSpendLimitError)
265
- throw new RpcResponse.InvalidParamsError({
266
- data: { code: 'spend_limit_exceeded' },
330
+ rejectSponsorship({
331
+ chainId: event.chainId,
267
332
  message: 'Spend limit exceeded.',
333
+ reason: 'spend_limit_exceeded',
268
334
  })
269
335
  throw error
270
336
  }
@@ -274,8 +340,15 @@ function middleware(options: middleware.Options) {
274
340
 
275
341
  const authorizeChainId = (chainId: number | undefined) => {
276
342
  const resolved = chainId ?? c.get('chainId')
277
- if (!c.get('supportedChainIds').has(resolved))
343
+ if (!c.get('supportedChainIds').has(resolved)) {
344
+ if (sponsorshipRequired)
345
+ rejectSponsorship({
346
+ chainId: resolved,
347
+ message: 'Unsupported chain id.',
348
+ reason: 'chain_id_unsupported',
349
+ })
278
350
  throw new RpcResponse.InvalidParamsError({ message: 'Unsupported chain id.' })
351
+ }
279
352
  if (c.get('zones').has(resolved)) {
280
353
  const scopes = principal?.type === 'api_key' ? principal.apiKey.scopes : undefined
281
354
  const allowed =
@@ -283,9 +356,16 @@ function middleware(options: middleware.Options) {
283
356
  scopes?.includes(`zone:${resolved}:read`) ||
284
357
  zoneToken !== undefined
285
358
  if (allowed) return resolved
359
+ const message = `Chain id ${resolved} is a zone. Use an API key granting \`zone:${resolved}:read\`, or pass a Zone token via \`X-Authorization-Token\`.`
360
+ if (sponsorshipRequired)
361
+ rejectSponsorship({
362
+ chainId: resolved,
363
+ message,
364
+ reason: 'api_key_forbidden',
365
+ })
286
366
  throw new RpcResponse.InvalidParamsError({
287
367
  data: { code: 'api_key_forbidden' },
288
- message: `Chain id ${resolved} is a zone. Use an API key granting \`zone:${resolved}:read\`, or pass a Zone token via \`X-Authorization-Token\`.`,
368
+ message,
289
369
  })
290
370
  }
291
371
  return resolved
@@ -300,7 +380,8 @@ function middleware(options: middleware.Options) {
300
380
  const client = Viem.getClient({
301
381
  chainId: resolved,
302
382
  principal,
303
- rpc: { url: () => zone.forwardRpcUrl },
383
+ rpc: c.get('rpc'),
384
+ zone,
304
385
  zoneToken,
305
386
  })
306
387
  zoneClients.set(resolved, client)
@@ -312,6 +393,21 @@ function middleware(options: middleware.Options) {
312
393
  cache: c.get('store'),
313
394
  ...(options.features ? { features: options.features } : {}),
314
395
  getClient,
396
+ onRequest: async (request) => {
397
+ const method = sponsorshipMethod(request.method)
398
+ const params = 'params' in request && Array.isArray(request.params) ? request.params : []
399
+ const transaction = params[0]
400
+ requests.push({
401
+ id: rpcId('id' in request ? request.id : undefined),
402
+ ...(method === undefined ? {} : { method }),
403
+ ...(method !== undefined &&
404
+ requests.length === 0 &&
405
+ method !== 'eth_fillTransaction' &&
406
+ Hex.validate(transaction, { strict: true })
407
+ ? { payloadHash: Hash.keccak256(transaction) }
408
+ : {}),
409
+ })
410
+ },
315
411
  path: Path.join(c.get('basePath'), options.path),
316
412
  ...(feePayer ? { feePayer } : {}),
317
413
  ...(verifiedTokens
@@ -330,11 +426,107 @@ function middleware(options: middleware.Options) {
330
426
  .catch(() => undefined)
331
427
  const rpc = Log.rpcErrors(body)
332
428
  if (rpc) c.set('rpcResponse', rpc)
429
+ if (rejections > 0) {
430
+ const matched = rejectionDiagnostics({
431
+ body,
432
+ reasons,
433
+ requests,
434
+ })
435
+ // Capability-form fill refusals are successful JSON-RPC responses, so
436
+ // only a non-batch request can be attributed without error matching.
437
+ const rejected =
438
+ matched.length === 0 && !Array.isArray(body) && requests.length === 1 ? requests : matched
439
+ const methods = new Set(rejected.map((request) => request.method))
440
+ const method = methods.size === 1 ? rejected[0]?.method : undefined
441
+ const payloadHash =
442
+ !Array.isArray(body) && rejected.length === 1 ? rejected[0]?.payloadHash : undefined
443
+ c.set('sponsorship', {
444
+ ...(chainId === null || chainId === undefined ? {} : { chainId }),
445
+ ...(internalErrors === 0 ? {} : { internalErrors }),
446
+ ...(method === undefined ? {} : { method }),
447
+ outcome: 'rejected',
448
+ ...(payloadHash === undefined ? {} : { payloadHash }),
449
+ ...(reason === null || reason === undefined ? {} : { reason }),
450
+ rejections,
451
+ })
452
+ }
333
453
  return response
334
454
  })
335
455
  }
336
456
 
457
+ function rejectionDiagnostics(options: rejectionDiagnostics.Options) {
458
+ const requests = new Map<rejectionDiagnostics.Id, rejectionDiagnostics.Request | null>()
459
+ for (const request of options.requests) {
460
+ if (requests.has(request.id)) requests.set(request.id, null)
461
+ else requests.set(request.id, request)
462
+ }
463
+ const responses = Array.isArray(options.body) ? options.body : [options.body]
464
+ return responses.flatMap((response) => {
465
+ if (!response || typeof response !== 'object' || Array.isArray(response)) return []
466
+ const record = response as Record<string, unknown>
467
+ if (record['jsonrpc'] !== '2.0') return []
468
+ const error = record['error']
469
+ if (!error || typeof error !== 'object' || Array.isArray(error)) return []
470
+ const data = (error as Record<string, unknown>)['data']
471
+ if (!data || typeof data !== 'object' || Array.isArray(data)) return []
472
+ const code = (data as Record<string, unknown>)['code']
473
+ if (typeof code !== 'string' || !options.reasons.has(code as Log.SponsorshipReason)) return []
474
+ const request = requests.get(rpcId(record['id']))
475
+ return request?.method === undefined ? [] : [request]
476
+ })
477
+ }
478
+
479
+ declare namespace rejectionDiagnostics {
480
+ /** JSON-RPC request id used only for request-response matching. */
481
+ type Id = number | string | null | undefined
482
+
483
+ /** Inputs for matching request metadata to sponsorship rejection responses. */
484
+ type Options = {
485
+ /** Parsed single or batch JSON-RPC response. */
486
+ body: unknown
487
+ /** Sponsorship codes recorded while handling the request. */
488
+ reasons: ReadonlySet<Log.SponsorshipReason>
489
+ /** Bounded request metadata in request order. */
490
+ requests: readonly Request[]
491
+ }
492
+
493
+ /** Bounded metadata for one valid JSON-RPC request. */
494
+ type Request = {
495
+ /** JSON-RPC request id, retained only for response matching. */
496
+ id: Id
497
+ /** Sponsorship-capable JSON-RPC method. */
498
+ method?: Log.SponsorshipMethod | undefined
499
+ /** Raw transaction hash, captured only for the first valid request. */
500
+ payloadHash?: Hex.Hex | undefined
501
+ }
502
+ }
503
+
504
+ function rpcId(value: unknown): rejectionDiagnostics.Id {
505
+ if (typeof value === 'number' || typeof value === 'string' || value === null) return value
506
+ return undefined
507
+ }
508
+
509
+ function sponsorshipMethod(value: unknown): Log.SponsorshipMethod | undefined {
510
+ switch (value) {
511
+ case 'eth_fillTransaction':
512
+ case 'eth_sendRawTransaction':
513
+ case 'eth_sendRawTransactionSync':
514
+ case 'eth_signRawTransaction':
515
+ return value
516
+ default:
517
+ return undefined
518
+ }
519
+ }
520
+
337
521
  declare namespace middleware {
522
+ /** One invariant sponsorship failure. */
523
+ type Failure = {
524
+ /** Candidate transaction chain. */
525
+ chainId: number
526
+ /** Internal error message hidden from the client. */
527
+ message: string
528
+ }
529
+
338
530
  /** Internal relay mount configuration. */
339
531
  type Options = relay.Options & {
340
532
  /** Optional wallet feature bundle. */
@@ -342,4 +534,22 @@ declare namespace middleware {
342
534
  /** RPC mount path. */
343
535
  path: 'rpc/relay' | 'rpc/sponsor'
344
536
  }
537
+
538
+ /** One sponsorship rejection recorded for request logging. */
539
+ type Rejection = {
540
+ /** Candidate transaction chain, validated before it enters the log entry. */
541
+ chainId: number
542
+ /** Stable client error code. */
543
+ reason: Log.SponsorshipReason
544
+ }
545
+
546
+ /** One client-visible sponsorship refusal. */
547
+ type Refusal = {
548
+ /** Candidate transaction chain. */
549
+ chainId: number
550
+ /** Client-safe error message. */
551
+ message: string
552
+ /** Stable client error code. */
553
+ reason: Exclude<Log.SponsorshipReason, 'internal_error'>
554
+ }
345
555
  }
@@ -4,6 +4,7 @@ import type { Client } from 'viem'
4
4
 
5
5
  import * as Runtime from '../../../test/runtime.js'
6
6
  import * as Db from '../../db/Db.js'
7
+ import * as Organizations from '../../db/tables/organizations.js'
7
8
  import * as SponsoredTransactions from '../../db/tables/sponsoredTransactions.js'
8
9
  import * as Sponsorships from './Sponsorships.js'
9
10
 
@@ -41,6 +42,7 @@ describe('finalize', () => {
41
42
  })
42
43
  expect(result).toMatchInlineSnapshot(`
43
44
  {
45
+ "errors": 0,
44
46
  "failed": 0,
45
47
  "finalized": 1,
46
48
  "pending": 0,
@@ -62,6 +64,7 @@ describe('finalize', () => {
62
64
  const result = await Sponsorships.finalize(db, { getClient: () => client({}) })
63
65
  expect(result).toMatchInlineSnapshot(`
64
66
  {
67
+ "errors": 0,
65
68
  "failed": 0,
66
69
  "finalized": 0,
67
70
  "pending": 1,
@@ -87,6 +90,7 @@ describe('finalize', () => {
87
90
  })
88
91
  expect(young).toMatchInlineSnapshot(`
89
92
  {
93
+ "errors": 0,
90
94
  "failed": 0,
91
95
  "finalized": 0,
92
96
  "pending": 1,
@@ -102,6 +106,7 @@ describe('finalize', () => {
102
106
  })
103
107
  expect(settled).toMatchInlineSnapshot(`
104
108
  {
109
+ "errors": 0,
105
110
  "failed": 1,
106
111
  "finalized": 0,
107
112
  "pending": 0,
@@ -124,6 +129,7 @@ describe('finalize', () => {
124
129
  })
125
130
  expect(result).toMatchInlineSnapshot(`
126
131
  {
132
+ "errors": 0,
127
133
  "failed": 1,
128
134
  "finalized": 0,
129
135
  "pending": 0,
@@ -151,6 +157,7 @@ describe('finalize', () => {
151
157
  })
152
158
  expect(result).toMatchInlineSnapshot(`
153
159
  {
160
+ "errors": 1,
154
161
  "failed": 0,
155
162
  "finalized": 0,
156
163
  "pending": 1,
@@ -178,6 +185,7 @@ describe('finalize', () => {
178
185
  })
179
186
  expect(result).toMatchInlineSnapshot(`
180
187
  {
188
+ "errors": 1,
181
189
  "failed": 1,
182
190
  "finalized": 0,
183
191
  "pending": 0,
@@ -206,6 +214,7 @@ describe('finalize', () => {
206
214
  })
207
215
  expect(result).toMatchInlineSnapshot(`
208
216
  {
217
+ "errors": 0,
209
218
  "failed": 0,
210
219
  "finalized": 1,
211
220
  "pending": 0,
@@ -256,6 +265,7 @@ describe('reconcile', () => {
256
265
  })
257
266
  expect(result).toMatchInlineSnapshot(`
258
267
  {
268
+ "errors": 0,
259
269
  "matched": 1,
260
270
  "scanned": 1,
261
271
  }
@@ -269,6 +279,7 @@ describe('reconcile', () => {
269
279
  test('behavior: recovers recently failed intents by sign payload', async () => {
270
280
  const db = create()
271
281
  await db.migrate()
282
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
272
283
  const { transactionHash: _, ...rest } = input
273
284
  const intent = await SponsoredTransactions.upsert(db, { ...rest, signPayload })
274
285
  await SponsoredTransactions.fail(db, intent.id, '2026-01-01T00:00:00.000Z')
@@ -287,6 +298,7 @@ describe('reconcile', () => {
287
298
  })()
288
299
  expect(result).toMatchInlineSnapshot(`
289
300
  {
301
+ "errors": 0,
290
302
  "matched": 1,
291
303
  "scanned": 1,
292
304
  }
@@ -298,6 +310,43 @@ describe('reconcile', () => {
298
310
  await db.close()
299
311
  })
300
312
 
313
+ test('behavior: spend-limit refusals are not operational errors', async () => {
314
+ const db = create()
315
+ await db.migrate()
316
+ await Organizations.create(db, { id: 'org_1', name: 'One' })
317
+ const { transactionHash: _, ...rest } = input
318
+ const intent = await SponsoredTransactions.upsert(db, { ...rest, signPayload })
319
+ await SponsoredTransactions.fail(db, intent.id, '2026-01-01T00:00:00.000Z')
320
+
321
+ vi.useFakeTimers({ now: new Date('2026-01-01T00:01:00.000Z') })
322
+ const result = await (async () => {
323
+ try {
324
+ return await Sponsorships.reconcile(db, {
325
+ feePayer: '0xFee0000000000000000000000000000000000000',
326
+ getClient: () => rpc,
327
+ getTidx: () => tidx([{ from: sender, hash: minedHash }]),
328
+ limitFor: async () => ({
329
+ chainIds: [42431],
330
+ max: -1n,
331
+ since: '2025-01-01T00:00:00.000Z',
332
+ }),
333
+ })
334
+ } finally {
335
+ vi.useRealTimers()
336
+ }
337
+ })()
338
+
339
+ expect(result).toMatchInlineSnapshot(`
340
+ {
341
+ "errors": 0,
342
+ "matched": 0,
343
+ "scanned": 1,
344
+ }
345
+ `)
346
+ expect((await SponsoredTransactions.get(db, intent.id))?.transactionHash).toBeNull()
347
+ await db.close()
348
+ })
349
+
301
350
  test('behavior: unmatched candidates leave intents pending', async () => {
302
351
  const db = create()
303
352
  await db.migrate()
@@ -311,6 +360,7 @@ describe('reconcile', () => {
311
360
  })
312
361
  expect(result).toMatchInlineSnapshot(`
313
362
  {
363
+ "errors": 0,
314
364
  "matched": 0,
315
365
  "scanned": 1,
316
366
  }
@@ -365,6 +415,7 @@ describe('reconcile', () => {
365
415
  })
366
416
  expect(result).toMatchInlineSnapshot(`
367
417
  {
418
+ "errors": 1,
368
419
  "matched": 0,
369
420
  "scanned": 0,
370
421
  }
@@ -38,7 +38,7 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
38
38
  } = options
39
39
 
40
40
  const rows = await SponsoredTransactions.listPending(db, { limit: batchSize })
41
- const result = { failed: 0, finalized: 0, pending: 0 }
41
+ const result = { errors: 0, failed: 0, finalized: 0, pending: 0 }
42
42
 
43
43
  for (const row of rows) {
44
44
  // Fill intents carry no hash until reconciliation matches them on-chain;
@@ -60,6 +60,7 @@ export async function finalize(db: Db.Db, options: finalize.Options): Promise<fi
60
60
  // Unmined transactions surface as a typed not-found; let the TTL decide.
61
61
  if (error instanceof TransactionReceiptNotFoundError) receipt = null
62
62
  else {
63
+ result.errors++
63
64
  if (Date.parse(row.createdAt) + receiptErrorTtlMs <= now().getTime()) {
64
65
  await SponsoredTransactions.fail(db, row.id, now().toISOString())
65
66
  result.failed++
@@ -102,6 +103,8 @@ export declare namespace finalize {
102
103
 
103
104
  /** Counters returned by one finalization pass. */
104
105
  type Result = {
106
+ /** Receipt lookup errors that prevented finalization work. */
107
+ errors: number
105
108
  /** Rows marked failed (unmined past the pending TTL). */
106
109
  failed: number
107
110
  /** Rows finalized with an actual fee. */
@@ -126,7 +129,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
126
129
  const {
127
130
  batchSize = 100,
128
131
  candidateCap = 500,
129
- failedIntentTtlMs = 86_400_000,
132
+ failedIntentTtlMs = SponsoredTransactions.failedIntentRecoveryTtlMs,
130
133
  feePayer,
131
134
  getClient,
132
135
  getTidx,
@@ -137,7 +140,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
137
140
  failedSince: new Date(Date.now() - failedIntentTtlMs).toISOString(),
138
141
  limit: batchSize,
139
142
  })
140
- const result = { matched: 0, scanned: 0 }
143
+ const result = { errors: 0, matched: 0, scanned: 0 }
141
144
  if (intents.length === 0) return result
142
145
 
143
146
  const chains = new Map<number, SponsoredTransactions.Record[]>()
@@ -161,6 +164,7 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
161
164
  candidates = fetched.rows
162
165
  } catch {
163
166
  // Indexer outage must not fail intents; retry on the next pass.
167
+ result.errors++
164
168
  continue
165
169
  }
166
170
 
@@ -187,8 +191,10 @@ export async function reconcile(db: Db.Db, options: reconcile.Options): Promise<
187
191
  )
188
192
  bySignPayload.delete(signPayload)
189
193
  result.matched++
190
- } catch {
191
- // Unresolvable candidate (lookup error, malformed envelope): skip it.
194
+ } catch (error) {
195
+ // Spend-limit enforcement is an expected policy refusal; dependency,
196
+ // lookup, and malformed-envelope failures remain operational errors.
197
+ if (!(error instanceof SponsoredTransactions.PeriodSpendLimitError)) result.errors++
192
198
  }
193
199
  }
194
200
  }
@@ -223,6 +229,8 @@ export declare namespace reconcile {
223
229
 
224
230
  /** Counters returned by one reconciliation pass. */
225
231
  type Result = {
232
+ /** Dependency or candidate errors that prevented reconciliation work. */
233
+ errors: number
226
234
  /** Intents matched to an on-chain transaction. */
227
235
  matched: number
228
236
  /** On-chain candidates inspected. */
@@ -294,14 +302,18 @@ export function createFinalizer(options: createFinalizer.Options): createFinaliz
294
302
  }
295
303
  },
296
304
  })
297
- : { matched: 0, scanned: 0 }
305
+ : { errors: 0, matched: 0, scanned: 0 }
298
306
  const finalized = await finalize(db, {
299
307
  batchSize: options.batchSize,
300
308
  getClient,
301
309
  now: options.now,
302
310
  pendingTtlMs: options.pendingTtlMs,
303
311
  })
304
- return { ...finalized, ...reconciled }
312
+ return {
313
+ ...finalized,
314
+ ...reconciled,
315
+ errors: finalized.errors + reconciled.errors,
316
+ }
305
317
  },
306
318
  }
307
319
  }