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,8 +1,5 @@
1
- import type { Context, TypedResponse } from 'hono'
2
1
  import * as z from 'zod/mini'
3
2
 
4
- import type * as App from '../../App.js'
5
- import * as Response from '../../internal/Response.js'
6
3
  import * as Schema from '../../internal/Schema.js'
7
4
 
8
5
  /** Stable MPP relay failure codes. */
@@ -92,12 +89,6 @@ export type BroadcastResponse =
92
89
  | { receipt: Receipt; success: true }
93
90
  | { error: RelayError; success: false }
94
91
 
95
- /** Retryable response returned while relay settlement is disabled. */
96
- export type Unavailable = {
97
- error: { code: 'temporarily_unavailable'; message: 'MPP relay is not enabled yet.' }
98
- success: false
99
- }
100
-
101
92
  function errorCode<const code extends RelayErrorCode>(value: code, description: string) {
102
93
  return z.literal(value).check(z.describe(description), z.meta({ examples: [value] }))
103
94
  }
@@ -317,37 +308,4 @@ export namespace schema {
317
308
  ]),
318
309
  'The result of broadcasting an MPP credential.',
319
310
  )
320
-
321
- /** Temporary response returned while MPP relay settlement is disabled. */
322
- export const Unavailable = Schema.describe(
323
- z.object({
324
- error: z.object({
325
- code: z
326
- .literal(relayErrorCode.temporarilyUnavailable)
327
- .check(z.describe('The retryable relay failure code.')),
328
- message: z
329
- .literal('MPP relay is not enabled yet.')
330
- .check(z.describe('The retryable relay failure message.')),
331
- }),
332
- success: z.literal(false).check(z.describe('Whether the relay processed the credential.')),
333
- }),
334
- 'A retryable response returned while MPP relay settlement is disabled.',
335
- )
336
- }
337
-
338
- /** Returns the relay-disabled response while retaining its published success contract. */
339
- export function unavailable<success>(
340
- c: Context<App.Environment>,
341
- ): TypedResponse<success, 200> | TypedResponse<Unavailable, 503> {
342
- c.header('Retry-After', '60')
343
- return c.json(
344
- Response.validated(schema.Unavailable, {
345
- error: {
346
- code: relayErrorCode.temporarilyUnavailable,
347
- message: 'MPP relay is not enabled yet.',
348
- },
349
- success: false,
350
- }),
351
- 503,
352
- )
353
311
  }
@@ -1,6 +1,16 @@
1
- import type * as Mpp from '../Mpp.js'
1
+ import * as Mppx from 'mppx'
2
+ import { tempo } from 'mppx/server'
3
+ import type { LocalAccount } from 'viem/accounts'
2
4
 
3
- /** Future MPPX lifecycle adapter. */
5
+ import type * as Viem from '../../../internal/Viem.js'
6
+ import * as Store from '../../../internal/Store.js'
7
+ import * as Mpp from '../Mpp.js'
8
+ import * as MppError from './Error.js'
9
+ import * as Screening from './Screening.js'
10
+ import * as ScreenManager from './ScreenManager.js'
11
+ import * as Utils from './Utils.js'
12
+
13
+ /** MPPX lifecycle adapter. */
4
14
  export type Adapter = {
5
15
  /** Broadcasts a validated MPP credential. */
6
16
  broadcast(input: Mpp.RelayInput): Promise<Mpp.BroadcastResponse>
@@ -8,4 +18,99 @@ export type Adapter = {
8
18
  verify(input: Mpp.RelayInput): Promise<Mpp.VerifyResponse>
9
19
  }
10
20
 
11
- // TODO(mppx#597): implement with validateCredential and broadcastCredential.
21
+ /** Creates an adapter for Tempo charge credentials. */
22
+ export function create(options: create.Options): Adapter {
23
+ const {
24
+ chainId,
25
+ feePayer,
26
+ getClient,
27
+ provider = Screening.allowAll,
28
+ reportUnknown,
29
+ screeningStore,
30
+ screeningTtl = Screening.defaultTtl,
31
+ state,
32
+ time = (_, fn) => fn(),
33
+ } = options
34
+ const screenManager = ScreenManager.create({
35
+ chainId,
36
+ provider,
37
+ store: screeningStore,
38
+ ttl: screeningTtl,
39
+ })
40
+ const methods = [
41
+ tempo.charge({
42
+ ...(feePayer ? { feePayer } : {}),
43
+ getClient: ({ chainId: chainId_option }) =>
44
+ getClient(chainId_option as Viem.ChainId | undefined),
45
+ store: Utils.mppxStore(state),
46
+ }),
47
+ ] as const
48
+
49
+ /** Validates and screens a credential, rejecting when either check fails. */
50
+ async function validateOrThrow(input: Mpp.RelayInput) {
51
+ const result = await time('mpp_validate', () =>
52
+ Mppx.Method.validateCredential(methods, Mppx.Credential.from(input)),
53
+ )
54
+ await time('mpp_screen', () => screenManager.screen(Utils.addresses(result)))
55
+ }
56
+
57
+ function failure(cause: unknown, operation: 'broadcast' | 'verify') {
58
+ const error = MppError.map(cause)
59
+ if (error.code === Mpp.relayErrorCode.unknown) reportUnknown?.({ operation })
60
+ return { error, success: false } as const
61
+ }
62
+
63
+ return {
64
+ async broadcast(input) {
65
+ try {
66
+ await validateOrThrow(input)
67
+ const result = await time('mpp_broadcast', () =>
68
+ Mppx.Method.broadcastCredential(methods, Mppx.Credential.from(input)),
69
+ )
70
+ return {
71
+ receipt: {
72
+ ...(result.externalId ? { externalId: result.externalId } : {}),
73
+ method: result.method,
74
+ reference: result.reference,
75
+ timestamp: result.timestamp,
76
+ },
77
+ success: true,
78
+ }
79
+ } catch (cause) {
80
+ return failure(cause, 'broadcast')
81
+ }
82
+ },
83
+ async verify(input) {
84
+ try {
85
+ await validateOrThrow(input)
86
+ return { success: true }
87
+ } catch (cause) {
88
+ return failure(cause, 'verify')
89
+ }
90
+ },
91
+ }
92
+ }
93
+
94
+ export declare namespace create {
95
+ /** Dependencies used to validate and broadcast Tempo credentials. */
96
+ type Options = {
97
+ /** Default Tempo chain for challenges that omit a chain id. */
98
+ chainId: number
99
+ /** Optional account used to sponsor Tempo pull transactions. */
100
+ feePayer?: LocalAccount | undefined
101
+ /** Resolves a Tempo client for each credential chain. */
102
+ getClient: Viem.GetClient
103
+ /** Address-screening provider. */
104
+ provider?: Screening.Provider | undefined
105
+ /** Reports an unexpected relay failure without passing through its cause. */
106
+ reportUnknown?: ((options: { operation: 'broadcast' | 'verify' }) => void) | undefined
107
+ /** Cache used for screening results. */
108
+ screeningStore: Store.Store
109
+ /** Screening-cache duration. @default `Ttl.days(1)` */
110
+ screeningTtl?: number | undefined
111
+ /** Durable state used for MPPX replay protection. */
112
+ state: Store.State
113
+ /** Measures a named relay operation. */
114
+ time?: (<value>(name: string, fn: () => Promise<value>) => Promise<value>) | undefined
115
+ }
116
+ }
@@ -0,0 +1,33 @@
1
+ import * as Mppx from 'mppx'
2
+
3
+ import * as Mpp from '../Mpp.js'
4
+ import * as MppError from './Error.js'
5
+ import * as ScreenManager from './ScreenManager.js'
6
+
7
+ describe('map', () => {
8
+ test.each([
9
+ [new Mppx.Errors.PaymentMethodUnsupportedError(), Mpp.relayErrorCode.unsupported],
10
+ [new Mppx.Errors.PaymentExpiredError(), Mpp.relayErrorCode.expired],
11
+ [new Mppx.Errors.InsufficientBalanceError(), Mpp.relayErrorCode.insufficientFunds],
12
+ [new Mppx.Errors.PaymentInsufficientError(), Mpp.relayErrorCode.insufficientFunds],
13
+ [
14
+ new Mppx.Errors.InvalidChallengeError({ reason: 'already used' }),
15
+ Mpp.relayErrorCode.alreadyUsed,
16
+ ],
17
+ [new Mppx.Errors.InvalidChallengeError(), Mpp.relayErrorCode.invalidPayment],
18
+ [new Mppx.Errors.InvalidPayloadError(), Mpp.relayErrorCode.invalidPayment],
19
+ [new Mppx.Errors.InvalidSignatureError(), Mpp.relayErrorCode.invalidPayment],
20
+ [new Mppx.Errors.MalformedCredentialError(), Mpp.relayErrorCode.invalidPayment],
21
+ [new Mppx.Errors.VerificationFailedError(), Mpp.relayErrorCode.invalidPayment],
22
+ [
23
+ new Mppx.Errors.VerificationFailedError({ reason: 'Transaction hash has already been used' }),
24
+ Mpp.relayErrorCode.alreadyUsed,
25
+ ],
26
+ [new ScreenManager.RejectedError(), Mpp.relayErrorCode.screenRejected],
27
+ [new Error('Transaction simulation failed.'), Mpp.relayErrorCode.simulationFailed],
28
+ [new Error('Transaction broadcast failed.'), Mpp.relayErrorCode.broadcastFailed],
29
+ [new Error('Unexpected failure.'), Mpp.relayErrorCode.unknown],
30
+ ] as const)('maps %s', (cause, code) => {
31
+ expect(MppError.map(cause)).toMatchObject({ code })
32
+ })
33
+ })
@@ -1,9 +1,47 @@
1
- import type * as Mpp from '../Mpp.js'
1
+ import * as Mppx from 'mppx'
2
2
 
3
- /** Future MPPX failure mapper. */
4
- export type Mapper = {
5
- /** Maps an MPPX failure to the stable public relay error contract. */
6
- map(cause: unknown): Mpp.RelayError
3
+ import * as Mpp from '../Mpp.js'
4
+ import * as Policy from './Policy.js'
5
+ import * as ScreenManager from './ScreenManager.js'
6
+
7
+ /** Maps an MPPX failure to the public relay error contract. */
8
+ export function map(cause: unknown): Mpp.RelayError {
9
+ const message = cause instanceof Error ? cause.message : undefined
10
+
11
+ switch (true) {
12
+ case cause instanceof ScreenManager.RejectedError:
13
+ return error(Mpp.relayErrorCode.screenRejected, 'Address screening rejected the payment.')
14
+ case cause instanceof Policy.UnsupportedChainError:
15
+ case cause instanceof Mppx.Errors.PaymentMethodUnsupportedError:
16
+ return error(Mpp.relayErrorCode.unsupported, message)
17
+ case cause instanceof Policy.PolicyDeniedError:
18
+ return error(Mpp.relayErrorCode.policyDenied, message)
19
+ case cause instanceof Mppx.Errors.PaymentExpiredError:
20
+ return error(Mpp.relayErrorCode.expired, message)
21
+ case cause instanceof Mppx.Errors.InsufficientBalanceError:
22
+ case cause instanceof Mppx.Errors.PaymentInsufficientError:
23
+ return error(Mpp.relayErrorCode.insufficientFunds, message)
24
+ case cause instanceof Mppx.Errors.InvalidChallengeError:
25
+ case cause instanceof Mppx.Errors.VerificationFailedError:
26
+ return error(
27
+ /\balready (?:been )?used\b/i.test(message ?? '')
28
+ ? Mpp.relayErrorCode.alreadyUsed
29
+ : Mpp.relayErrorCode.invalidPayment,
30
+ message,
31
+ )
32
+ case cause instanceof Mppx.Errors.InvalidPayloadError:
33
+ case cause instanceof Mppx.Errors.InvalidSignatureError:
34
+ case cause instanceof Mppx.Errors.MalformedCredentialError:
35
+ return error(Mpp.relayErrorCode.invalidPayment, message)
36
+ case message?.toLowerCase().includes('simulation'):
37
+ return error(Mpp.relayErrorCode.simulationFailed, message)
38
+ case message?.toLowerCase().includes('broadcast'):
39
+ return error(Mpp.relayErrorCode.broadcastFailed, message)
40
+ default:
41
+ return error(Mpp.relayErrorCode.unknown, message)
42
+ }
7
43
  }
8
44
 
9
- // TODO(mppx#597): map validation, replay, simulation, and broadcast failures.
45
+ function error(code: Mpp.RelayErrorCode, message: string | undefined): Mpp.RelayError {
46
+ return message === undefined ? { code } : { code, message }
47
+ }
@@ -0,0 +1,213 @@
1
+ import * as Store from '../../../internal/Store.js'
2
+ import * as Ttl from '../../../internal/Ttl.js'
3
+ import * as Mpp from '../Mpp.js'
4
+ import * as Idempotency from './Idempotency.js'
5
+
6
+ const identity = {
7
+ apiKeyId: 'key_mpp',
8
+ idempotencyKey: 'mpp_broadcast_01j3j1k2l3m4n5p6q7r8s9t0u',
9
+ inputHash: `0x${'11'.repeat(32)}`,
10
+ }
11
+
12
+ const credential = {
13
+ challenge: {
14
+ id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
15
+ intent: 'charge',
16
+ method: 'tempo',
17
+ realm: 'merchant.example',
18
+ request: { amount: '1', currency: 'USD' },
19
+ },
20
+ payload: { hash: `0x${'22'.repeat(32)}`, type: 'hash' },
21
+ } satisfies Mpp.RelayInput
22
+
23
+ describe('inputHash', () => {
24
+ test('binds semantic credential content instead of JSON property order', () => {
25
+ const reordered = {
26
+ payload: { hash: `0x${'22'.repeat(32)}`, type: 'hash' },
27
+ challenge: {
28
+ method: 'tempo',
29
+ realm: 'merchant.example',
30
+ request: { currency: 'USD', amount: '1' },
31
+ intent: 'charge',
32
+ id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
33
+ },
34
+ } satisfies Mpp.RelayInput
35
+
36
+ expect(Idempotency.inputHash(reordered)).toBe(Idempotency.inputHash(credential))
37
+ expect(
38
+ Idempotency.inputHash({
39
+ ...credential,
40
+ challenge: { ...credential.challenge, id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0v' },
41
+ }),
42
+ ).not.toBe(Idempotency.inputHash(credential))
43
+ })
44
+ })
45
+
46
+ describe('claim', () => {
47
+ test('coordinates concurrent broadcasts and replays terminal results', async () => {
48
+ const state = Store.memory()
49
+ const claims = await Promise.all([
50
+ Idempotency.claim({ identity, state }),
51
+ Idempotency.claim({ identity, state }),
52
+ ])
53
+ const claimed = claims.find((result) => result.type === 'claimed')
54
+ const pending = claims.find((result) => result.type === 'pending')
55
+
56
+ expect(claimed?.type).toBe('claimed')
57
+ expect(pending).toEqual({ type: 'pending' })
58
+ if (!claimed || claimed.type !== 'claimed') throw new Error('Expected a claimed challenge.')
59
+
60
+ const response = {
61
+ receipt: {
62
+ method: 'tempo',
63
+ reference: `0x${'22'.repeat(32)}`,
64
+ timestamp: '2026-07-20T18:30:00.000Z',
65
+ },
66
+ success: true,
67
+ } satisfies Mpp.BroadcastResponse
68
+ await Idempotency.complete({ identity, response, state, token: claimed.token })
69
+
70
+ await expect(Idempotency.claim({ identity, state })).resolves.toEqual({
71
+ response,
72
+ type: 'replay',
73
+ })
74
+ })
75
+
76
+ test('reclaims a pending request after its confirmation lease expires', async () => {
77
+ vi.useFakeTimers({ now: new Date('2026-07-22T00:00:00.000Z') })
78
+ try {
79
+ const state = Store.memory()
80
+ await Idempotency.claim({ identity, state })
81
+ vi.advanceTimersByTime(Ttl.seconds(5) + 1)
82
+
83
+ await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
84
+
85
+ vi.advanceTimersByTime(Ttl.minutes(1) - Ttl.seconds(5))
86
+
87
+ await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({
88
+ type: 'claimed',
89
+ })
90
+ } finally {
91
+ vi.useRealTimers()
92
+ }
93
+ })
94
+
95
+ test('retains a successful receipt beyond the MPP request', async () => {
96
+ vi.useFakeTimers({ now: new Date('2026-07-22T00:00:00.000Z') })
97
+ try {
98
+ const state = Store.memory()
99
+ const claim = await Idempotency.claim({ identity, state })
100
+ if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
101
+ await Idempotency.complete({
102
+ identity,
103
+ response: {
104
+ receipt: {
105
+ method: 'tempo',
106
+ reference: `0x${'22'.repeat(32)}`,
107
+ timestamp: '2026-07-22T00:00:00.000Z',
108
+ },
109
+ success: true,
110
+ },
111
+ state,
112
+ token: claim.token,
113
+ })
114
+ vi.advanceTimersByTime(Ttl.seconds(5) + 1)
115
+
116
+ await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({
117
+ type: 'replay',
118
+ })
119
+ } finally {
120
+ vi.useRealTimers()
121
+ }
122
+ })
123
+
124
+ test('rejects a reused key for a different credential', async () => {
125
+ const state = Store.memory()
126
+ const claim = await Idempotency.claim({ identity, state })
127
+ if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
128
+ await Idempotency.complete({
129
+ identity,
130
+ response: {
131
+ receipt: {
132
+ method: 'tempo',
133
+ reference: `0x${'22'.repeat(32)}`,
134
+ timestamp: '2026-07-22T00:00:00.000Z',
135
+ },
136
+ success: true,
137
+ },
138
+ state,
139
+ token: claim.token,
140
+ })
141
+
142
+ await expect(
143
+ Idempotency.claim({
144
+ identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
145
+ state,
146
+ }),
147
+ ).resolves.toEqual({ type: 'mismatch' })
148
+ })
149
+
150
+ test('does not replay a legacy receipt without an input hash', async () => {
151
+ const state = Store.memory()
152
+ const claim = await Idempotency.claim({ identity, state })
153
+ if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
154
+ const key = (await state.list()).keys[0]?.name
155
+ if (!key) throw new Error('Expected an idempotency record.')
156
+ await state.put(
157
+ key,
158
+ JSON.stringify({
159
+ response: {
160
+ receipt: {
161
+ method: 'tempo',
162
+ reference: `0x${'22'.repeat(32)}`,
163
+ timestamp: '2026-07-22T00:00:00.000Z',
164
+ },
165
+ success: true,
166
+ },
167
+ type: 'complete',
168
+ }),
169
+ )
170
+
171
+ await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'mismatch' })
172
+ })
173
+
174
+ test('rejects a different credential while the original request is pending', async () => {
175
+ const state = Store.memory()
176
+ const claim = await Idempotency.claim({ identity, state })
177
+ if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
178
+
179
+ await expect(
180
+ Idempotency.claim({
181
+ identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
182
+ state,
183
+ }),
184
+ ).resolves.toEqual({ type: 'mismatch' })
185
+ await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
186
+ })
187
+ })
188
+
189
+ describe('release', () => {
190
+ test('permits a retry after a retryable failure', async () => {
191
+ const state = Store.memory()
192
+ const result = await Idempotency.claim({ identity, state })
193
+ if (result.type !== 'claimed') throw new Error('Expected a claimed challenge.')
194
+
195
+ await Idempotency.release({ identity, state, token: result.token })
196
+
197
+ await expect(Idempotency.claim({ identity, state })).resolves.toMatchObject({ type: 'claimed' })
198
+ })
199
+
200
+ test("does not release another credential's pending claim", async () => {
201
+ const state = Store.memory()
202
+ const claim = await Idempotency.claim({ identity, state })
203
+ if (claim.type !== 'claimed') throw new Error('Expected an idempotency key claim.')
204
+
205
+ await Idempotency.release({
206
+ identity: { ...identity, inputHash: `0x${'33'.repeat(32)}` },
207
+ state,
208
+ token: claim.token,
209
+ })
210
+
211
+ await expect(Idempotency.claim({ identity, state })).resolves.toEqual({ type: 'pending' })
212
+ })
213
+ })
@@ -1,7 +1,61 @@
1
- /** Future challenge-derived broadcast idempotency identity. */
2
- export type Identity = {
3
- /** MPP challenge identifier. */
4
- challengeId: string
1
+ import * as core_Idempotency from '../../../internal/Idempotency.js'
2
+ import * as Ttl from '../../../internal/Ttl.js'
3
+ import type * as Mpp from '../Mpp.js'
4
+
5
+ /**
6
+ * API-level retry coordination for `POST /v1/mpp/broadcast`, backed by the
7
+ * shared coordinator in `internal/Idempotency.ts`.
8
+ *
9
+ * MPPX consumes payment proofs, preventing settlement replay. This module instead lets a caller recover a successful receipt after a transport timeout.
10
+ */
11
+
12
+ /** Identity for one caller-supplied idempotent broadcast request. */
13
+ export type Identity = core_Idempotency.Identity
14
+
15
+ const broadcast = core_Idempotency.create<Mpp.BroadcastResponse>({
16
+ namespace: 'mpp:relay:v1',
17
+ // Covers the confirmation wait after a credential has passed its
18
+ // five-second validity window.
19
+ pendingTtl: Ttl.minutes(1),
20
+ // Retains a successful settlement receipt for client recovery after
21
+ // transport failures.
22
+ receiptTtl: Ttl.days(1),
23
+ })
24
+
25
+ /** Returns a stable digest without retaining credential contents in durable state. */
26
+ export function inputHash(input: Mpp.RelayInput) {
27
+ return core_Idempotency.inputHash(input)
28
+ }
29
+
30
+ /** Claims a broadcast request or returns its current outcome. */
31
+ export function claim(options: claim.Options): Promise<claim.Result> {
32
+ return broadcast.claim(options)
33
+ }
34
+
35
+ export declare namespace claim {
36
+ /** Outcome from attempting to claim an idempotency key. */
37
+ type Result = core_Idempotency.claim.Result<Mpp.BroadcastResponse>
38
+
39
+ /** Dependencies for claiming one idempotency key. */
40
+ type Options = core_Idempotency.claim.Options
41
+ }
42
+
43
+ /** Persists a successful response for an owned request claim. */
44
+ export function complete(options: complete.Options): Promise<void> {
45
+ return broadcast.complete(options)
46
+ }
47
+
48
+ export declare namespace complete {
49
+ /** Dependencies for persisting one terminal broadcast response. */
50
+ type Options = core_Idempotency.complete.Options<Mpp.BroadcastResponse>
51
+ }
52
+
53
+ /** Releases an owned retryable request claim. */
54
+ export function release(options: release.Options): Promise<void> {
55
+ return broadcast.release(options)
5
56
  }
6
57
 
7
- // TODO(mppx#597): persist terminal broadcast results in Durable Object state.
58
+ export declare namespace release {
59
+ /** Dependencies for releasing one idempotency claim. */
60
+ type Options = core_Idempotency.release.Options
61
+ }
@@ -0,0 +1,122 @@
1
+ import { privateKeyToAccount } from 'viem/accounts'
2
+
3
+ import * as StripeCustomers from '../../../db/tables/stripeCustomers.js'
4
+ import * as TestApp from '../../../../test/App.js'
5
+ import * as Auth from '../../../internal/Auth.js'
6
+ import * as Mpp from '../Mpp.js'
7
+ import * as Policy from './Policy.js'
8
+
9
+ const feePayer = privateKeyToAccount(`0x${'11'.repeat(32)}`)
10
+
11
+ const input = {
12
+ challenge: {
13
+ id: 'ch_01j3j1k2l3m4n5p6q7r8s9t0u',
14
+ intent: 'charge',
15
+ method: 'tempo',
16
+ realm: 'merchant.example',
17
+ request: { chainId: 4217, methodDetails: { chainId: 42431, feePayer: true } },
18
+ },
19
+ payload: {},
20
+ } satisfies Mpp.RelayInput
21
+
22
+ const principal = {
23
+ apiKey: { environment: 'production', id: 'key_mpp', orgId: 'org_mpp', scopes: ['mpp:write'] },
24
+ environment: 'production',
25
+ id: 'key_mpp',
26
+ orgId: 'org_mpp',
27
+ projectId: 'prj_mpp',
28
+ type: 'api_key',
29
+ } satisfies Auth.Principal
30
+ const { projectId: _, ...principal_projectless } = principal
31
+
32
+ describe('chainId', () => {
33
+ test('uses the method-specific chain before the request fallback', () => {
34
+ expect(Policy.chainId(input)).toBe(42431)
35
+ })
36
+ })
37
+
38
+ describe('requiresFeePayer', () => {
39
+ test('requires both a fee-payer method detail and an enabled request', () => {
40
+ expect(Policy.requiresFeePayer(input)).toBe(true)
41
+ expect(
42
+ Policy.requiresFeePayer({
43
+ ...input,
44
+ challenge: {
45
+ ...input.challenge,
46
+ request: { methodDetails: { feePayer: true }, feePayer: false },
47
+ },
48
+ }),
49
+ ).toBe(false)
50
+ })
51
+ })
52
+
53
+ describe('assertSupportedChain', () => {
54
+ test('rejects chains outside the deployment allowlist', () => {
55
+ expect(() =>
56
+ Policy.assertSupportedChain({ chainId: 1, supportedChainIds: new Set([4217]) }),
57
+ ).toThrowErrorMatchingInlineSnapshot(
58
+ `[Mpp.Policy.UnsupportedChainError: Unsupported chain id 1.]`,
59
+ )
60
+ })
61
+ })
62
+
63
+ describe('authorizeFeePayer', () => {
64
+ test('allows organization attribution for sponsored credentials', async () => {
65
+ await expect(
66
+ Policy.authorizeFeePayer({
67
+ chainId: 42431,
68
+ db: TestApp.database(),
69
+ feePayer,
70
+ input,
71
+ principal: principal_projectless,
72
+ }),
73
+ ).resolves.toBe(feePayer)
74
+ })
75
+
76
+ test('bills a projectless mainnet sponsored credential to its organization', async () => {
77
+ const db = TestApp.database()
78
+
79
+ await expect(
80
+ Policy.authorizeFeePayer({
81
+ chainId: 4217,
82
+ db,
83
+ feePayer,
84
+ input,
85
+ principal: principal_projectless,
86
+ }),
87
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
88
+ `[Mpp.Policy.PolicyDeniedError: Active billing is required for mainnet fee sponsorship.]`,
89
+ )
90
+
91
+ await StripeCustomers.create(db, {
92
+ orgId: principal_projectless.orgId,
93
+ stripeCustomerId: 'cus_mpp',
94
+ })
95
+ await StripeCustomers.setStatus(db, principal_projectless.orgId, 'active')
96
+
97
+ await expect(
98
+ Policy.authorizeFeePayer({
99
+ chainId: 4217,
100
+ db,
101
+ feePayer,
102
+ input,
103
+ principal: principal_projectless,
104
+ }),
105
+ ).resolves.toBe(feePayer)
106
+ })
107
+
108
+ test('does not require billing when the credential pays its own fee', async () => {
109
+ await expect(
110
+ Policy.authorizeFeePayer({
111
+ chainId: 4217,
112
+ db: TestApp.database(),
113
+ feePayer,
114
+ input: {
115
+ ...input,
116
+ challenge: { ...input.challenge, request: { methodDetails: { feePayer: false } } },
117
+ },
118
+ principal,
119
+ }),
120
+ ).resolves.toBe(feePayer)
121
+ })
122
+ })