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,4 +1,4 @@
1
- import type { ExpressionBuilder, Selectable } from 'kysely'
1
+ import type { ExpressionBuilder, Selectable, SqlBool } from 'kysely'
2
2
  import { sql } from 'kysely'
3
3
 
4
4
  import * as Id from '../../internal/Id.js'
@@ -11,6 +11,9 @@ export type Table = db_Schema.SponsoredTransaction
11
11
  /** A stored sponsored-transaction row. */
12
12
  export type Record = Selectable<Table>
13
13
 
14
+ /** How long failed fill intents remain eligible for on-chain reconciliation. */
15
+ export const failedIntentRecoveryTtlMs = 86_400_000
16
+
14
17
  /**
15
18
  * Records one sponsorship commitment as `pending`, keyed by its fee-payer
16
19
  * sign payload. Written after fee-payer signing and before any broadcast, so
@@ -37,7 +40,7 @@ export async function upsert(db: Db.Db, input: upsert.Input): Promise<Record> {
37
40
  id: Id.generate('stx'),
38
41
  meterReportedAt: null,
39
42
  orgId: input.orgId,
40
- projectId: input.projectId,
43
+ projectId: input.projectId ?? null,
41
44
  signPayload: input.signPayload,
42
45
  status: 'pending',
43
46
  transaction: input.transaction,
@@ -92,8 +95,8 @@ export declare namespace upsert {
92
95
  feeToken?: string | undefined
93
96
  /** Organization id (`org_…`) the spend attributes to. */
94
97
  orgId: string
95
- /** Project id (`prj_…`) the spend attributes to. */
96
- projectId: string
98
+ /** Project id (`prj_…`) the spend attributes to; omit for organization-level spend. */
99
+ projectId?: string | undefined
97
100
  /** Fee-payer sign payload — a stable identity for the sponsored envelope. */
98
101
  signPayload: string
99
102
  /** Serialized sponsored transaction, kept for observability beyond log retention. */
@@ -199,9 +202,15 @@ export async function assignTransactionHash(
199
202
  !['failed', 'pending'].includes(record.status)
200
203
  )
201
204
  return
205
+ const failedSince = new Date(Date.now() - failedIntentRecoveryTtlMs).toISOString()
206
+ if (
207
+ record.status === 'failed' &&
208
+ (record.finalizedAt === null || record.finalizedAt < failedSince)
209
+ )
210
+ return
202
211
  if (record.status === 'failed' && record.billable && limit)
203
212
  await sql`select pg_advisory_xact_lock(${billingLockClass}, hashtext(${record.orgId}))`.execute(tx.kysely) // prettier-ignore
204
- await tx.kysely
213
+ let query = tx.kysely
205
214
  .updateTable('sponsored_transactions')
206
215
  .set({
207
216
  ...(record.status === 'failed' ? { createdAt: new Date().toISOString() } : {}),
@@ -212,7 +221,10 @@ export async function assignTransactionHash(
212
221
  .where('id', '=', id)
213
222
  .where('status', '=', record.status)
214
223
  .where('transactionHash', 'is', null)
215
- .execute()
224
+ if (record.status === 'failed')
225
+ query = query.where(sql<SqlBool>`exists (select 1 from organizations where organizations.id = sponsored_transactions.org_id)`) // prettier-ignore
226
+ const updated = await query.executeTakeFirst()
227
+ if (updated.numUpdatedRows === 0n) return
216
228
  if (record.status === 'failed' && record.billable && limit) {
217
229
  const committed = await spend(tx, {
218
230
  chainIds: limit.chainIds,
@@ -21,6 +21,22 @@ export function get(db: Db.Db, id: string): Promise<Record | undefined> {
21
21
  return db.kysely.selectFrom('users').selectAll().where('id', '=', id).executeTakeFirst()
22
22
  }
23
23
 
24
+ /**
25
+ * Reads users by id for operational identity displays.
26
+ *
27
+ * @param db - The database.
28
+ * @param ids - User ids to read.
29
+ * @returns Matching user records.
30
+ */
31
+ export function listByIds(db: Db.Db, ids: readonly string[]): Promise<Record[]> {
32
+ if (ids.length === 0) return Promise.resolve([])
33
+ return db.kysely
34
+ .selectFrom('users')
35
+ .selectAll()
36
+ .where('id', 'in', [...ids])
37
+ .execute()
38
+ }
39
+
24
40
  /**
25
41
  * Reads a user by wallet address (compared lowercase).
26
42
  *
@@ -1,21 +1,24 @@
1
- import type { Selectable } from 'kysely'
1
+ import type { ColumnType } from 'kysely'
2
2
  import type { Hex } from 'ox'
3
3
 
4
4
  import type * as VerifiedTokens from '../../internal/VerifiedTokens.js'
5
5
  import type * as Db from '../Db.js'
6
6
  import type * as db_Schema from '../Schema.js'
7
7
 
8
- /** Columns of the `verified_tokens` table, derived from `Schema.VerifiedToken`. */
9
- export type Table = db_Schema.VerifiedToken
8
+ /** A bigint chain id, read as a string from pg and written as a number. */
9
+ type ChainId = ColumnType<string, number, number>
10
10
 
11
- /** Columns of the `verified_token_lists` table, derived from `Schema.VerifiedTokenList`. */
12
- export type ListTable = db_Schema.VerifiedTokenList
11
+ /** Columns of the `verified_tokens` table. */
12
+ export type Table = Omit<db_Schema.VerifiedToken, 'chainId'> & { chainId: ChainId }
13
+
14
+ /** Columns of the `verified_token_lists` table. */
15
+ export type ListTable = Omit<db_Schema.VerifiedTokenList, 'chainId'> & { chainId: ChainId }
13
16
 
14
17
  /** A stored verified-token row. */
15
- export type Row = Selectable<Table>
18
+ export type Row = db_Schema.VerifiedToken
16
19
 
17
20
  /** A chain's list-level metadata. */
18
- export type Meta = Selectable<ListTable>
21
+ export type Meta = db_Schema.VerifiedTokenList
19
22
 
20
23
  /**
21
24
  * Reads a chain's list metadata — the "head" the soft-refresh cache compares
@@ -25,12 +28,13 @@ export type Meta = Selectable<ListTable>
25
28
  * @param chainId - The chain id.
26
29
  * @returns The metadata, or `undefined` when the chain has no list yet.
27
30
  */
28
- export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
29
- return db.kysely
31
+ export async function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
32
+ const row = await db.kysely
30
33
  .selectFrom('verified_token_lists')
31
34
  .selectAll()
32
- .where('chainId', '=', chainId)
35
+ .where('chainId', '=', String(chainId))
33
36
  .executeTakeFirst()
37
+ return row ? { ...row, chainId: Number(row.chainId) } : undefined
34
38
  }
35
39
 
36
40
  /**
@@ -40,13 +44,14 @@ export function head(db: Db.Db, chainId: number): Promise<Meta | undefined> {
40
44
  * @param chainId - The chain id.
41
45
  * @returns The rows.
42
46
  */
43
- export function list(db: Db.Db, chainId: number): Promise<Row[]> {
44
- return db.kysely
47
+ export async function list(db: Db.Db, chainId: number): Promise<Row[]> {
48
+ const rows = await db.kysely
45
49
  .selectFrom('verified_tokens')
46
50
  .selectAll()
47
- .where('chainId', '=', chainId)
51
+ .where('chainId', '=', String(chainId))
48
52
  .orderBy('position')
49
53
  .execute()
54
+ return rows.map((row) => ({ ...row, chainId: Number(row.chainId) }))
50
55
  }
51
56
 
52
57
  /**
@@ -59,7 +64,7 @@ export function list(db: Db.Db, chainId: number): Promise<Row[]> {
59
64
  * @param input - The validated list and its new version metadata.
60
65
  */
61
66
  export async function publish(db: Db.Db, chainId: number, input: publish.Input): Promise<void> {
62
- await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', chainId).execute()
67
+ await db.kysely.deleteFrom('verified_tokens').where('chainId', '=', String(chainId)).execute()
63
68
  if (input.tokens.length > 0)
64
69
  await db.kysely
65
70
  .insertInto('verified_tokens')
@@ -46,8 +46,13 @@ export function toSubscription(row: Record): Webhooks.Subscription {
46
46
  *
47
47
  * @param db - The database.
48
48
  * @param subscription - The subscription to insert.
49
+ * @param options - Initial cursor options.
49
50
  */
50
- export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Promise<void> {
51
+ export async function insert(
52
+ db: Db.Db,
53
+ subscription: Webhooks.Subscription,
54
+ options: insert.Options = {},
55
+ ): Promise<void> {
51
56
  await db.kysely
52
57
  .insertInto('webhook_subscriptions')
53
58
  .values({
@@ -63,7 +68,7 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
63
68
  lastDeliveryAt: subscription.lastDeliveryAt ?? null,
64
69
  ownerId: ownerId(subscription.owner),
65
70
  ownerType: subscription.owner.type,
66
- pollerCursor: null,
71
+ pollerCursor: options.pollerCursor ?? null,
67
72
  secret: subscription.secret,
68
73
  status: subscription.status,
69
74
  updatedAt: subscription.updatedAt,
@@ -71,6 +76,14 @@ export async function insert(db: Db.Db, subscription: Webhooks.Subscription): Pr
71
76
  .execute()
72
77
  }
73
78
 
79
+ export declare namespace insert {
80
+ /** Options for {@link insert}. */
81
+ type Options = {
82
+ /** Initial poller cursor committed with the subscription. */
83
+ pollerCursor?: string | undefined
84
+ }
85
+ }
86
+
74
87
  /**
75
88
  * Inserts a subscription when its owner remains below the configured cap.
76
89
  * An owner-scoped transaction lock serializes the count and insert.
@@ -85,7 +98,11 @@ export async function insertWithinLimit(
85
98
  await sql`select pg_advisory_xact_lock(${subscriptionLimitLockClass}, hashtext(${owner}))`.execute(tx.kysely) // prettier-ignore
86
99
  const existing = await count(tx, subscription.owner, options.now)
87
100
  if (existing >= options.maxPerOwner) return false
88
- await insert(tx, subscription)
101
+ await insert(
102
+ tx,
103
+ subscription,
104
+ options.pollerCursor === undefined ? {} : { pollerCursor: options.pollerCursor },
105
+ )
89
106
  return true
90
107
  })
91
108
  }
@@ -97,6 +114,8 @@ export declare namespace insertWithinLimit {
97
114
  maxPerOwner: number
98
115
  /** ISO timestamp used to exclude expired rows from the count. */
99
116
  now: string
117
+ /** Initial poller cursor committed with the subscription. */
118
+ pollerCursor?: string | undefined
100
119
  }
101
120
  }
102
121
 
@@ -312,6 +331,42 @@ export async function setCursor(db: Db.Db, id: string, cursor: string): Promise<
312
331
  .execute()
313
332
  }
314
333
 
334
+ /**
335
+ * Writes a poller cursor only when the stored cursor still matches the caller's
336
+ * observed value.
337
+ *
338
+ * @param db - The database.
339
+ * @param options - Subscription, expected cursor, and next cursor.
340
+ * @returns Whether the cursor was updated.
341
+ */
342
+ export async function compareAndSetCursor(
343
+ db: Db.Db,
344
+ options: compareAndSetCursor.Options,
345
+ ): Promise<boolean> {
346
+ let query = db.kysely
347
+ .updateTable('webhook_subscriptions')
348
+ .set({ pollerCursor: options.cursor })
349
+ .where('id', '=', options.subscriptionId)
350
+ query =
351
+ options.expectedCursor === null
352
+ ? query.where('pollerCursor', 'is', null)
353
+ : query.where('pollerCursor', '=', options.expectedCursor)
354
+ const result = await query.executeTakeFirst()
355
+ return result.numUpdatedRows > 0n
356
+ }
357
+
358
+ export declare namespace compareAndSetCursor {
359
+ /** Options for {@link compareAndSetCursor}. */
360
+ type Options = {
361
+ /** Next keyset cursor. */
362
+ cursor: string
363
+ /** Cursor observed before scanning, or null for an uninitialized subscription. */
364
+ expectedCursor: string | null
365
+ /** Subscription whose cursor advances. */
366
+ subscriptionId: string
367
+ }
368
+ }
369
+
315
370
  /**
316
371
  * Records a successful delivery: resets the consecutive-failure counter and
317
372
  * stamps `lastDeliveryAt`.
@@ -1,3 +1,5 @@
1
+ /** @module-tag localnet */
2
+
1
3
  import type { RpcRequest } from 'ox'
2
4
  import { SignatureEnvelope, TxEnvelopeTempo } from 'ox/tempo'
3
5
  import { parseUnits, type Address, type BaseError } from 'viem'
@@ -152,7 +152,7 @@ export function relay(options: relay.Options = {}): Handler {
152
152
  : undefined
153
153
  const externalFeePayerUrl =
154
154
  typeof parameters['feePayer'] === 'string'
155
- ? normalizeExternalFeePayerUrl(parameters['feePayer'], {
155
+ ? ExternalFeePayerUrl.normalize(parameters['feePayer'], {
156
156
  allowUnsafe: internal_allowUnsafeUrls,
157
157
  })
158
158
  : undefined
@@ -1563,118 +1563,114 @@ function mergeCallsFromRequest(
1563
1563
  return merged
1564
1564
  }
1565
1565
 
1566
- /** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
1567
- function normalizeExternalFeePayerUrl(
1568
- value: string,
1569
- options: normalizeExternalFeePayerUrl.Options = {},
1570
- ): string {
1571
- let url: URL
1572
- try {
1573
- url = new URL(value)
1574
- } catch {
1575
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
1576
- }
1577
-
1578
- const allowUnsafe = options.allowUnsafe === true
1579
- if (url.protocol !== 'http:' && url.protocol !== 'https:')
1580
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1581
- if (!allowUnsafe && url.protocol !== 'https:')
1582
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1583
- if (!allowUnsafe && isUnsafeHostname(url.hostname))
1584
- throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
1585
-
1586
- url.username = ''
1587
- url.password = ''
1588
- url.hash = ''
1589
- return url.href
1590
- }
1591
-
1592
- declare namespace normalizeExternalFeePayerUrl {
1566
+ namespace ExternalFeePayerUrl {
1593
1567
  type Options = {
1594
1568
  /** Whether to allow non-HTTPS or local/private external fee payer URLs. */
1595
1569
  allowUnsafe?: boolean | undefined
1596
1570
  }
1597
- }
1598
1571
 
1599
- function isUnsafeHostname(hostname: string): boolean {
1600
- const host = normalizeHostname(hostname)
1601
- if (host === 'localhost' || host.endsWith('.localhost')) return true
1602
- const ipv4 = parseIpv4(host)
1603
- if (ipv4) return isUnsafeIpv4(ipv4)
1604
- if (!host.includes(':')) return false
1605
- const ipv6 = parseIpv6(host)
1606
- if (!ipv6) return true
1607
- return isUnsafeIpv6(ipv6)
1608
- }
1572
+ /** Normalizes external fee-payer relay URLs before forwarding fill payloads. */
1573
+ export function normalize(value: string, options: Options = {}): string {
1574
+ let url: URL
1575
+ try {
1576
+ url = new URL(value)
1577
+ } catch {
1578
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL.' })
1579
+ }
1609
1580
 
1610
- function normalizeHostname(hostname: string): string {
1611
- return hostname
1612
- .toLowerCase()
1613
- .replace(/^\[|\]$/g, '')
1614
- .split('%')[0]!
1615
- }
1581
+ const allowUnsafe = options.allowUnsafe === true
1582
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
1583
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1584
+ if (!allowUnsafe && url.protocol !== 'https:')
1585
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL protocol.' })
1586
+ if (!allowUnsafe && isUnsafeHostname(url.hostname))
1587
+ throw new RpcResponse.InvalidParamsError({ message: 'Invalid fee payer URL host.' })
1588
+
1589
+ url.username = ''
1590
+ url.password = ''
1591
+ url.hash = ''
1592
+ return url.href
1593
+ }
1616
1594
 
1617
- function parseIpv4(value: string): [number, number, number, number] | undefined {
1618
- const parts = value.split('.')
1619
- if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part))) return undefined
1620
- const numbers = parts.map((part) => Number(part))
1621
- if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return undefined
1622
- return numbers as [number, number, number, number]
1623
- }
1595
+ function isUnsafeHostname(hostname: string): boolean {
1596
+ const host = normalizeHostname(hostname)
1597
+ if (host === 'localhost' || host.endsWith('.localhost')) return true
1598
+ const ipv4 = parseIpv4(host)
1599
+ if (ipv4) return isUnsafeIpv4(ipv4)
1600
+ if (!host.includes(':')) return false
1601
+ const ipv6 = parseIpv6(host)
1602
+ if (!ipv6) return true
1603
+ return isUnsafeIpv6(ipv6)
1604
+ }
1624
1605
 
1625
- function isUnsafeIpv4(parts: [number, number, number, number]): boolean {
1626
- const [a, b] = parts
1627
- if (a === 0 || a === 10 || a === 127) return true
1628
- if (a === 100 && b >= 64 && b <= 127) return true
1629
- if (a === 169 && b === 254) return true
1630
- if (a === 172 && b >= 16 && b <= 31) return true
1631
- if (a === 192 && b === 168) return true
1632
- if (a >= 224) return true
1633
- return false
1634
- }
1606
+ function normalizeHostname(hostname: string): string {
1607
+ return hostname
1608
+ .toLowerCase()
1609
+ .replace(/^\[|\]$/g, '')
1610
+ .split('%')[0]!
1611
+ }
1635
1612
 
1636
- function parseIpv6(
1637
- value: string,
1638
- ): [number, number, number, number, number, number, number, number] | undefined {
1639
- const halves = value.split('::')
1640
- if (halves.length > 2) return undefined
1613
+ function parseIpv4(value: string): [number, number, number, number] | undefined {
1614
+ const parts = value.split('.')
1615
+ if (parts.length !== 4 || parts.some((part) => !/^\d+$/.test(part))) return undefined
1616
+ const numbers = parts.map((part) => Number(part))
1617
+ if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 255)) return undefined
1618
+ return numbers as [number, number, number, number]
1619
+ }
1641
1620
 
1642
- const left = halves[0] ? halves[0].split(':') : []
1643
- const right = halves[1] ? halves[1].split(':') : []
1644
- const missing = halves.length === 2 ? 8 - left.length - right.length : 0
1645
- if (missing < 0) return undefined
1621
+ function isUnsafeIpv4(parts: [number, number, number, number]): boolean {
1622
+ const [a, b] = parts
1623
+ if (a === 0 || a === 10 || a === 127) return true
1624
+ if (a === 100 && b >= 64 && b <= 127) return true
1625
+ if (a === 169 && b === 254) return true
1626
+ if (a === 172 && b >= 16 && b <= 31) return true
1627
+ if (a === 192 && b === 168) return true
1628
+ return a >= 224
1629
+ }
1646
1630
 
1647
- const parts = [...left, ...Array(missing).fill('0'), ...right]
1648
- if (parts.length !== 8) return undefined
1631
+ function parseIpv6(
1632
+ value: string,
1633
+ ): [number, number, number, number, number, number, number, number] | undefined {
1634
+ const halves = value.split('::')
1635
+ if (halves.length > 2) return undefined
1649
1636
 
1650
- const numbers = parts.map((part) =>
1651
- /^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN,
1652
- )
1653
- if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff)) return undefined
1654
- return numbers as [number, number, number, number, number, number, number, number]
1655
- }
1637
+ const left = halves[0] ? halves[0].split(':') : []
1638
+ const right = halves[1] ? halves[1].split(':') : []
1639
+ const missing = halves.length === 2 ? 8 - left.length - right.length : 0
1640
+ if (missing < 0) return undefined
1656
1641
 
1657
- function isUnsafeIpv6(parts: [number, number, number, number, number, number, number, number]) {
1658
- const [a] = parts
1659
- if (parts.every((part) => part === 0)) return true
1660
- if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
1661
- if ((a & 0xfe00) === 0xfc00) return true
1662
- if ((a & 0xffc0) === 0xfe80) return true
1663
- if ((a & 0xffc0) === 0xfec0) return true
1664
- if ((a & 0xff00) === 0xff00) return true
1665
-
1666
- const ipv4 = ipv4FromIpv6(parts)
1667
- if (ipv4) return isUnsafeIpv4(ipv4)
1668
- return false
1669
- }
1642
+ const parts = [...left, ...Array(missing).fill('0'), ...right]
1643
+ if (parts.length !== 8) return undefined
1670
1644
 
1671
- function ipv4FromIpv6(
1672
- parts: [number, number, number, number, number, number, number, number],
1673
- ): [number, number, number, number] | undefined {
1674
- const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff
1675
- const compatible = parts.slice(0, 6).every((part) => part === 0)
1676
- if (!mapped && !compatible) return undefined
1677
- return [parts[6]! >> 8, parts[6]! & 0xff, parts[7]! >> 8, parts[7]! & 0xff]
1645
+ const numbers = parts.map((part) =>
1646
+ /^[\da-f]{1,4}$/i.test(part) ? Number.parseInt(part, 16) : NaN,
1647
+ )
1648
+ if (numbers.some((part) => !Number.isInteger(part) || part < 0 || part > 0xffff))
1649
+ return undefined
1650
+ return numbers as [number, number, number, number, number, number, number, number]
1651
+ }
1652
+
1653
+ function isUnsafeIpv6(parts: [number, number, number, number, number, number, number, number]) {
1654
+ const [a] = parts
1655
+ if (parts.every((part) => part === 0)) return true
1656
+ if (parts.slice(0, 7).every((part) => part === 0) && parts[7] === 1) return true
1657
+ if ((a & 0xfe00) === 0xfc00) return true
1658
+ if ((a & 0xffc0) === 0xfe80) return true
1659
+ if ((a & 0xffc0) === 0xfec0) return true
1660
+ if ((a & 0xff00) === 0xff00) return true
1661
+
1662
+ const ipv4 = ipv4FromIpv6(parts)
1663
+ return ipv4 ? isUnsafeIpv4(ipv4) : false
1664
+ }
1665
+
1666
+ function ipv4FromIpv6(
1667
+ parts: [number, number, number, number, number, number, number, number],
1668
+ ): [number, number, number, number] | undefined {
1669
+ const mapped = parts.slice(0, 5).every((part) => part === 0) && parts[5] === 0xffff
1670
+ const compatible = parts.slice(0, 6).every((part) => part === 0)
1671
+ if (!mapped && !compatible) return undefined
1672
+ return [parts[6]! >> 8, parts[6]! & 0xff, parts[7]! >> 8, parts[7]! & 0xff]
1673
+ }
1678
1674
  }
1679
1675
 
1680
1676
  /**
@@ -1889,6 +1889,54 @@ describe('ensureProject', () => {
1889
1889
  })
1890
1890
  })
1891
1891
 
1892
+ describe('parseCredential', () => {
1893
+ test('parses credentials keyed by chain id', () => {
1894
+ const credential = Auth.parseCredential(
1895
+ JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone:secret' }),
1896
+ )
1897
+
1898
+ expect(credential).toEqual({ 4217: 'mainnet:secret', 421700001: 'zone:secret' })
1899
+ })
1900
+
1901
+ test('supports a shared credential', () => {
1902
+ expect(Auth.parseCredential('shared:secret')).toBe('shared:secret')
1903
+ })
1904
+
1905
+ test('rejects malformed credential maps', () => {
1906
+ expect(() => Auth.parseCredential('{"4217":1}')).toThrowErrorMatchingInlineSnapshot(
1907
+ `[Error: Expected a credential or a chain-id-to-credential JSON object.]`,
1908
+ )
1909
+ })
1910
+ })
1911
+
1912
+ describe('resolveCredential', () => {
1913
+ test('infers Basic auth from a credential containing a colon', () => {
1914
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'user:password' })).toEqual({
1915
+ basicAuth: 'user:password',
1916
+ })
1917
+ })
1918
+
1919
+ test('infers Bearer auth from a credential without a colon', () => {
1920
+ expect(Auth.resolveCredential({ chainId: 4217, value: 'bearer-token' })).toEqual({
1921
+ basicAuth: undefined,
1922
+ bearerAuth: 'bearer-token',
1923
+ })
1924
+ })
1925
+
1926
+ test('selects a credential by chain id', () => {
1927
+ const value = JSON.stringify({ 4217: 'mainnet:secret', 421700001: 'zone-token' })
1928
+
1929
+ expect(Auth.resolveCredential({ chainId: 4217, value })).toEqual({
1930
+ basicAuth: 'mainnet:secret',
1931
+ })
1932
+ expect(Auth.resolveCredential({ chainId: 421700001, value })).toEqual({
1933
+ basicAuth: undefined,
1934
+ bearerAuth: 'zone-token',
1935
+ })
1936
+ expect(Auth.resolveCredential({ chainId: 42431, value })).toEqual({ basicAuth: undefined })
1937
+ })
1938
+ })
1939
+
1892
1940
  function createScopedApp(options: {
1893
1941
  auth?: Auth.Context | undefined
1894
1942
  routes: readonly { path: string; policy: Auth.require.Policy }[]
@@ -9,6 +9,7 @@ import { findTargetHandler } from 'hono/utils/handler'
9
9
  import { Challenge, Credential, type Method } from 'mppx'
10
10
  import { Mppx, tempo } from 'mppx/hono'
11
11
  import { Addresses } from 'viem/tempo'
12
+ import { tempoMainnet } from 'viem/tempo/chains'
12
13
  import * as z from 'zod/mini'
13
14
 
14
15
  import type * as App from '../App.js'
@@ -26,7 +27,6 @@ import * as Response from './Response.js'
26
27
  import * as Schema from './Schema.js'
27
28
  import * as Scope from '../Scope.js'
28
29
  import * as Users from '../db/tables/users.js'
29
- import * as Viem from './Viem.js'
30
30
 
31
31
  const policySymbol = Symbol('tempo-api.auth.policy')
32
32
  const mppManagementSymbol = Symbol('tempo-api.auth.mpp-management')
@@ -1451,7 +1451,7 @@ export function require<environment extends Environment = Environment>(
1451
1451
  if (
1452
1452
  apiKey.environment === 'sandbox' &&
1453
1453
  explicitChain !== undefined &&
1454
- Viem.isMainnet(explicitChain)
1454
+ explicitChain === tempoMainnet.id
1455
1455
  )
1456
1456
  return jsonError(c, {
1457
1457
  code: 'api_key_forbidden',
@@ -1644,6 +1644,65 @@ type RateLimitAccess = PaymentAccess & {
1644
1644
  rateLimit: RateLimit.Result
1645
1645
  }
1646
1646
 
1647
+ /** Shared or per-chain credentials. */
1648
+ export type ChainCredential = string | Record<number, string>
1649
+
1650
+ /** Parses shared or per-chain credentials from an environment value. */
1651
+ export function parseCredential(value: ChainCredential | undefined): parseCredential.ReturnType {
1652
+ if (!value) return undefined
1653
+ if (typeof value !== 'string') return value
1654
+ const credentials = (() => {
1655
+ try {
1656
+ return JSON.parse(value) as unknown
1657
+ } catch {
1658
+ return value
1659
+ }
1660
+ })()
1661
+ if (typeof credentials === 'string') return credentials
1662
+ if (
1663
+ !credentials ||
1664
+ typeof credentials !== 'object' ||
1665
+ Array.isArray(credentials) ||
1666
+ Object.values(credentials).some((credential) => typeof credential !== 'string')
1667
+ )
1668
+ throw new Error('Expected a credential or a chain-id-to-credential JSON object.')
1669
+ return credentials as Record<number, string>
1670
+ }
1671
+
1672
+ export declare namespace parseCredential {
1673
+ /** Parsed shared or per-chain credentials. */
1674
+ type ReturnType = ChainCredential | undefined
1675
+ }
1676
+
1677
+ /** Resolves a chain credential and infers its HTTP authorization scheme. */
1678
+ export function resolveCredential(
1679
+ options: resolveCredential.Options,
1680
+ ): resolveCredential.ReturnType {
1681
+ const credentials = parseCredential(options.value)
1682
+ const credential = typeof credentials === 'string' ? credentials : credentials?.[options.chainId]
1683
+ if (!credential) return { basicAuth: undefined }
1684
+ if (credential.includes(':')) return { basicAuth: credential }
1685
+ return { basicAuth: undefined, bearerAuth: credential }
1686
+ }
1687
+
1688
+ export declare namespace resolveCredential {
1689
+ /** Options for resolving a chain credential. */
1690
+ type Options = {
1691
+ /** Chain id selecting a per-chain credential. */
1692
+ chainId: number
1693
+ /** Shared or per-chain credentials. */
1694
+ value?: ChainCredential | undefined
1695
+ }
1696
+
1697
+ /** Resolved HTTP authorization credentials. */
1698
+ type ReturnType = {
1699
+ /** Basic credentials inferred from a value containing a colon. */
1700
+ basicAuth: string | undefined
1701
+ /** Bearer credential inferred from a value without a colon. */
1702
+ bearerAuth?: string | undefined
1703
+ }
1704
+ }
1705
+
1647
1706
  /**
1648
1707
  * How long to wait for the rate-limit counter before failing open. A hot
1649
1708
  * counter backend (e.g. a single Durable Object serving one busy quota bucket)