tapimo 0.5.3 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts +15830 -7220
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +9 -1
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +4 -0
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +5 -0
- package/dist/Scope.js.map +1 -1
- package/dist/admin/App.d.ts +1011 -412
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/App.js +4 -0
- package/dist/admin/App.js.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +2 -1
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/early-access.d.ts +148 -0
- package/dist/admin/apps/early-access.d.ts.map +1 -0
- package/dist/admin/apps/early-access.js +133 -0
- package/dist/admin/apps/early-access.js.map +1 -0
- package/dist/admin/apps/organizations.d.ts +124 -1
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +97 -6
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +526 -1
- package/dist/admin/apps/verified-tokens.d.ts.map +1 -1
- package/dist/admin/apps/verified-tokens.js +214 -1
- package/dist/admin/apps/verified-tokens.js.map +1 -1
- package/dist/admin/ui.generated.d.ts +1 -1
- package/dist/admin/ui.generated.d.ts.map +1 -1
- package/dist/admin/ui.generated.js +95 -75
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/analytics/Analytics.d.ts.map +1 -1
- package/dist/analytics/Analytics.js +20 -0
- package/dist/analytics/Analytics.js.map +1 -1
- package/dist/analytics/tables/requestEvents.d.ts +18 -0
- package/dist/analytics/tables/requestEvents.d.ts.map +1 -1
- package/dist/analytics/tables/requestEvents.js +36 -7
- package/dist/analytics/tables/requestEvents.js.map +1 -1
- package/dist/apps/data/App.d.ts +6260 -4924
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +11 -6
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/FundingQuoteProviders.d.ts +34 -1
- package/dist/apps/data/FundingQuoteProviders.d.ts.map +1 -1
- package/dist/apps/data/FundingQuoteProviders.js +194 -16
- package/dist/apps/data/FundingQuoteProviders.js.map +1 -1
- package/dist/apps/data/FxOracle.d.ts +71 -0
- package/dist/apps/data/FxOracle.d.ts.map +1 -0
- package/dist/apps/data/FxOracle.js +97 -0
- package/dist/apps/data/FxOracle.js.map +1 -0
- package/dist/apps/data/index.d.ts +1 -0
- package/dist/apps/data/index.d.ts.map +1 -1
- package/dist/apps/data/index.js +1 -0
- package/dist/apps/data/index.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +3599 -1382
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +250 -88
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +872 -251
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/addresses.js +11 -9
- package/dist/apps/data/routes/addresses.js.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +77 -26
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +88 -45
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +39 -39
- package/dist/apps/data/routes/coingecko.d.ts +54 -54
- package/dist/apps/data/routes/exchanges.d.ts +856 -105
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +518 -76
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +81 -67
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +76 -91
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/funding.d.ts +80 -36
- package/dist/apps/data/routes/funding.d.ts.map +1 -1
- package/dist/apps/data/routes/funding.js +65 -31
- package/dist/apps/data/routes/funding.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +392 -315
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +152 -77
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +167 -174
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +15 -13
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +277 -536
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +96 -77
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +157 -81
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +272 -130
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +307 -0
- package/dist/apps/data/routes/valuation.d.ts.map +1 -0
- package/dist/apps/data/routes/valuation.js +292 -0
- package/dist/apps/data/routes/valuation.js.map +1 -0
- package/dist/apps/data/routes/verified-tokens.d.ts +36 -36
- package/dist/apps/data/routes/verified-tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/verified-tokens.js +7 -5
- package/dist/apps/data/routes/verified-tokens.js.map +1 -1
- package/dist/apps/data/routes/webhooks.d.ts +103 -123
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +124 -25
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/index.d.ts +2 -1
- package/dist/apps/index.d.ts.map +1 -1
- package/dist/apps/index.js +2 -1
- package/dist/apps/index.js.map +1 -1
- package/dist/apps/management/App.d.ts +8554 -1692
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/App.js +12 -1
- package/dist/apps/management/App.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +7 -0
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +17 -3
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +157 -162
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +31 -23
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +232 -0
- package/dist/apps/management/routes/faucet.d.ts.map +1 -0
- package/dist/apps/management/routes/faucet.js +154 -0
- package/dist/apps/management/routes/faucet.js.map +1 -0
- package/dist/apps/management/routes/invitations.d.ts +60 -60
- package/dist/apps/management/routes/invite-links.d.ts +49 -20
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +26 -1
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +6 -6
- package/dist/apps/management/routes/members.d.ts +6 -6
- package/dist/apps/management/routes/orgs.d.ts +42 -42
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +5 -0
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +44 -44
- package/dist/apps/management/routes/usage.d.ts +3 -0
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +4 -0
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +697 -0
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -0
- package/dist/apps/management/routes/verified-token-requests.js +271 -0
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -0
- package/dist/apps/management/routes/webhooks.d.ts +6977 -0
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -0
- package/dist/apps/management/routes/webhooks.js +573 -0
- package/dist/apps/management/routes/webhooks.js.map +1 -0
- package/dist/apps/mpp/App.d.ts +363 -0
- package/dist/apps/mpp/App.d.ts.map +1 -0
- package/dist/apps/mpp/App.js +72 -0
- package/dist/apps/mpp/App.js.map +1 -0
- package/dist/apps/mpp/Mpp.d.ts +178 -0
- package/dist/apps/mpp/Mpp.d.ts.map +1 -0
- package/dist/apps/mpp/Mpp.js +183 -0
- package/dist/apps/mpp/Mpp.js.map +1 -0
- package/dist/apps/mpp/index.d.ts +3 -0
- package/dist/apps/mpp/index.d.ts.map +1 -0
- package/dist/apps/mpp/index.js +3 -0
- package/dist/apps/mpp/index.js.map +1 -0
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +56 -9
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/db/Db.d.ts +6 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +110 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +53 -0
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +56 -0
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earlyAccess.d.ts +50 -0
- package/dist/db/tables/earlyAccess.d.ts.map +1 -0
- package/dist/db/tables/earlyAccess.js +63 -0
- package/dist/db/tables/earlyAccess.js.map +1 -0
- package/dist/db/tables/enabledBillingSources.d.ts +73 -0
- package/dist/db/tables/enabledBillingSources.d.ts.map +1 -0
- package/dist/db/tables/enabledBillingSources.js +69 -0
- package/dist/db/tables/enabledBillingSources.js.map +1 -0
- package/dist/db/tables/invitations.d.ts.map +1 -1
- package/dist/db/tables/invitations.js +3 -0
- package/dist/db/tables/invitations.js.map +1 -1
- package/dist/db/tables/inviteLinks.d.ts +10 -2
- package/dist/db/tables/inviteLinks.d.ts.map +1 -1
- package/dist/db/tables/inviteLinks.js +10 -1
- package/dist/db/tables/inviteLinks.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +5 -2
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +13 -2
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +2 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +2 -0
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/verifiedTokenRequests.d.ts +94 -0
- package/dist/db/tables/verifiedTokenRequests.d.ts.map +1 -0
- package/dist/db/tables/verifiedTokenRequests.js +120 -0
- package/dist/db/tables/verifiedTokenRequests.js.map +1 -0
- package/dist/db/tables/webhookSubscriptions.d.ts +14 -0
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +16 -0
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts +1 -16
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +17 -6
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/handlers/relay.d.ts.map +1 -1
- package/dist/handlers/relay.js +37 -5
- package/dist/handlers/relay.js.map +1 -1
- package/dist/internal/Auth.d.ts +11 -2
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +14 -47
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/FundingQuotes.d.ts +147 -47
- package/dist/internal/FundingQuotes.d.ts.map +1 -1
- package/dist/internal/FundingQuotes.js +119 -33
- package/dist/internal/FundingQuotes.js.map +1 -1
- package/dist/internal/Log.d.ts +37 -5
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +52 -3
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +24 -0
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +2 -2
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +3 -0
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +2 -2
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +12 -4
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +14 -5
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +23 -5
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Value.d.ts +18 -0
- package/dist/internal/Value.d.ts.map +1 -1
- package/dist/internal/Value.js +11 -1
- package/dist/internal/Value.js.map +1 -1
- package/dist/internal/VerifiedTokens.d.ts.map +1 -1
- package/dist/internal/VerifiedTokens.js +10 -1
- package/dist/internal/VerifiedTokens.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +24 -3
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +34 -8
- package/dist/internal/Webhooks.js.map +1 -1
- package/package.json +7 -2
- package/src/App.test.ts +9 -4
- package/src/App.ts +23 -3
- package/src/Client.test-d.ts +733 -20
- package/src/Scope.ts +5 -0
- package/src/admin/App.test.ts +4 -0
- package/src/admin/App.ts +4 -0
- package/src/admin/apps/early-access.test.ts +125 -0
- package/src/admin/apps/early-access.ts +176 -0
- package/src/admin/apps/organizations.test.ts +86 -2
- package/src/admin/apps/organizations.ts +155 -31
- package/src/admin/apps/scopes.test.ts +5 -0
- package/src/admin/apps/verified-tokens.test.ts +201 -0
- package/src/admin/apps/verified-tokens.ts +532 -286
- package/src/admin/ui/plugin.ts +2 -1
- package/src/admin/ui/src/lib/early-access.ts +63 -0
- package/src/admin/ui/src/lib/organizations.test.ts +81 -1
- package/src/admin/ui/src/lib/organizations.ts +92 -0
- package/src/admin/ui/src/lib/verified-tokens.ts +79 -0
- package/src/admin/ui/src/routeTree.gen.ts +33 -2
- package/src/admin/ui/src/routes/__root.tsx +2 -1
- package/src/admin/ui/src/routes/api-keys.tsx +1 -1
- package/src/admin/ui/src/routes/early-access.tsx +162 -0
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +103 -0
- package/src/admin/ui/src/routes/verified-tokens.tsx +230 -19
- package/src/admin/ui.generated.ts +95 -94
- package/src/analytics/Analytics.test.ts +83 -0
- package/src/analytics/Analytics.ts +20 -0
- package/src/analytics/tables/requestEvents.ts +60 -7
- package/src/apps/composition.test.ts +11 -2
- package/src/apps/data/App.test.ts +1 -1
- package/src/apps/data/App.ts +22 -14
- package/src/apps/data/FundingQuoteProviders.test.ts +297 -4
- package/src/apps/data/FundingQuoteProviders.ts +255 -29
- package/src/apps/data/FxOracle.test.ts +118 -0
- package/src/apps/data/FxOracle.ts +153 -0
- package/src/apps/data/index.ts +1 -0
- package/src/apps/data/routes/activities.test.ts +177 -3
- package/src/apps/data/routes/activities.ts +441 -132
- package/src/apps/data/routes/addresses.ts +19 -9
- package/src/apps/data/routes/balances.test.ts +148 -11
- package/src/apps/data/routes/balances.ts +140 -51
- package/src/apps/data/routes/exchanges.test.ts +544 -9
- package/src/apps/data/routes/exchanges.ts +690 -103
- package/src/apps/data/routes/fee-amm.test.ts +47 -23
- package/src/apps/data/routes/fee-amm.ts +98 -119
- package/src/apps/data/routes/funding.test.ts +113 -8
- package/src/apps/data/routes/funding.ts +77 -51
- package/src/apps/data/routes/receipts.test.ts +129 -23
- package/src/apps/data/routes/receipts.ts +205 -100
- package/src/apps/data/routes/tokens.test.ts +43 -0
- package/src/apps/data/routes/tokens.ts +28 -13
- package/src/apps/data/routes/transactions.test.ts +72 -19
- package/src/apps/data/routes/transactions.ts +162 -92
- package/src/apps/data/routes/transfers.test.ts +341 -31
- package/src/apps/data/routes/transfers.ts +358 -158
- package/src/apps/data/routes/valuation.test.ts +437 -0
- package/src/apps/data/routes/valuation.ts +423 -0
- package/src/apps/data/routes/verified-tokens.ts +14 -2
- package/src/apps/data/routes/webhooks.test.ts +56 -8
- package/src/apps/data/routes/webhooks.ts +144 -27
- package/src/apps/index.ts +2 -1
- package/src/apps/management/App.ts +13 -0
- package/src/apps/management/routes/api-keys.test.ts +14 -0
- package/src/apps/management/routes/api-keys.ts +27 -3
- package/src/apps/management/routes/billing.test.ts +152 -20
- package/src/apps/management/routes/billing.ts +34 -18
- package/src/apps/management/routes/faucet.test.ts +87 -0
- package/src/apps/management/routes/faucet.ts +201 -0
- package/src/apps/management/routes/invite-links.test.ts +117 -0
- package/src/apps/management/routes/invite-links.ts +43 -1
- package/src/apps/management/routes/me.test.ts +9 -99
- package/src/apps/management/routes/orgs.test.ts +45 -2
- package/src/apps/management/routes/orgs.ts +6 -0
- package/src/apps/management/routes/scopes.test.ts +1 -0
- package/src/apps/management/routes/usage.test.ts +6 -0
- package/src/apps/management/routes/usage.ts +7 -0
- package/src/apps/management/routes/verified-token-requests.test.ts +377 -0
- package/src/apps/management/routes/verified-token-requests.ts +397 -0
- package/src/apps/management/routes/webhooks.test.ts +426 -0
- package/src/apps/management/routes/webhooks.ts +672 -0
- package/src/apps/mpp/App.ts +86 -0
- package/src/apps/mpp/Mpp.test.ts +193 -0
- package/src/apps/mpp/Mpp.ts +353 -0
- package/src/apps/mpp/index.ts +2 -0
- package/src/apps/mpp/internal/Adapter.ts +11 -0
- package/src/apps/mpp/internal/Error.ts +9 -0
- package/src/apps/mpp/internal/Idempotency.ts +7 -0
- package/src/apps/mpp/internal/Screening.ts +10 -0
- package/src/apps/relay/App.test.ts +88 -6
- package/src/apps/relay/App.ts +61 -9
- package/src/db/Db.test.ts +19 -0
- package/src/db/Db.ts +125 -0
- package/src/db/Schema.ts +68 -0
- package/src/db/tables/earlyAccess.ts +86 -0
- package/src/db/tables/enabledBillingSources.test.ts +303 -0
- package/src/db/tables/enabledBillingSources.ts +118 -0
- package/src/db/tables/invitations.ts +3 -0
- package/src/db/tables/inviteLinks.ts +22 -3
- package/src/db/tables/organizations.test.ts +103 -0
- package/src/db/tables/organizations.ts +18 -2
- package/src/db/tables/sponsoredTransactions.ts +4 -0
- package/src/db/tables/verifiedTokenRequests.test.ts +200 -0
- package/src/db/tables/verifiedTokenRequests.ts +182 -0
- package/src/db/tables/webhookSubscriptions.ts +31 -0
- package/src/handlers/internal/utils.ts +22 -6
- package/src/handlers/relay.errors.test.ts +153 -0
- package/src/handlers/relay.ts +42 -7
- package/src/internal/Auth.test.ts +3 -3
- package/src/internal/Auth.ts +15 -47
- package/src/internal/FundingQuotes.test.ts +161 -6
- package/src/internal/FundingQuotes.ts +141 -39
- package/src/internal/Log.test-d.ts +21 -0
- package/src/internal/Log.test.ts +141 -0
- package/src/internal/Log.ts +93 -6
- package/src/internal/MetricSink.test.ts +215 -0
- package/src/internal/MetricSink.ts +24 -0
- package/src/internal/OpenApi.ts +3 -0
- package/src/internal/Response.test.ts +28 -0
- package/src/internal/Response.ts +12 -4
- package/src/internal/Schema.ts +50 -5
- package/src/internal/Value.test.ts +20 -0
- package/src/internal/Value.ts +24 -1
- package/src/internal/VerifiedTokens.ts +9 -1
- package/src/internal/Webhooks.test.ts +140 -0
- package/src/internal/Webhooks.ts +53 -9
|
@@ -6,6 +6,7 @@ import * as ApiKeys from '../../ApiKeys.js'
|
|
|
6
6
|
import * as core_Billing from '../../apps/management/Billing.js'
|
|
7
7
|
import * as BillingSettings from '../../db/tables/billingSettings.js'
|
|
8
8
|
import * as Db from '../../db/Db.js'
|
|
9
|
+
import * as EnabledBillingSources from '../../db/tables/enabledBillingSources.js'
|
|
9
10
|
import * as Memberships from '../../db/tables/memberships.js'
|
|
10
11
|
import * as Organizations from '../../db/tables/organizations.js'
|
|
11
12
|
import * as Projects from '../../db/tables/projects.js'
|
|
@@ -26,6 +27,21 @@ export namespace schema {
|
|
|
26
27
|
.string()
|
|
27
28
|
.check(z.describe('An ISO 8601 timestamp.'), z.meta({ examples: ['2026-01-01T00:00:00.000Z'] }))
|
|
28
29
|
|
|
30
|
+
const enabledBillingSources = z
|
|
31
|
+
.array(z.enum(EnabledBillingSources.sources))
|
|
32
|
+
.check(
|
|
33
|
+
z.describe('Billing-source types available for new setup.'),
|
|
34
|
+
z.meta({ examples: [['stripe', 'tempo']] }),
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
const organizationId = z
|
|
38
|
+
.string()
|
|
39
|
+
.check(
|
|
40
|
+
z.minLength(1),
|
|
41
|
+
z.describe('Stable organization id.'),
|
|
42
|
+
z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
43
|
+
)
|
|
44
|
+
|
|
29
45
|
const Organization = Schema.describe(
|
|
30
46
|
z.object({
|
|
31
47
|
createdAt: timestamp,
|
|
@@ -118,13 +134,7 @@ export namespace schema {
|
|
|
118
134
|
/** Path parameters identifying an organization. */
|
|
119
135
|
export const Params = z
|
|
120
136
|
.object({
|
|
121
|
-
orgId:
|
|
122
|
-
.string()
|
|
123
|
-
.check(
|
|
124
|
-
z.minLength(1),
|
|
125
|
-
z.describe('Stable organization id.'),
|
|
126
|
-
z.meta({ examples: ['org_1a2b3c4d5e6f7g8h9j0k1m2n'] }),
|
|
127
|
-
),
|
|
137
|
+
orgId: organizationId,
|
|
128
138
|
})
|
|
129
139
|
.check(z.describe('Path parameters for one organization.'))
|
|
130
140
|
|
|
@@ -252,29 +262,58 @@ export namespace schema {
|
|
|
252
262
|
/** Detailed organization lookup response. */
|
|
253
263
|
export const Response = Schema.describe(
|
|
254
264
|
z.extend(listOrganizations.OrganizationSummary, {
|
|
255
|
-
billing: z
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
265
|
+
billing: z
|
|
266
|
+
.object({
|
|
267
|
+
enabledSources: enabledBillingSources,
|
|
268
|
+
production: Billing,
|
|
269
|
+
sandbox: Billing,
|
|
270
|
+
})
|
|
271
|
+
.check(
|
|
272
|
+
z.describe('Organization-wide availability and environment billing state.'),
|
|
273
|
+
z.meta({
|
|
274
|
+
examples: [
|
|
275
|
+
{
|
|
276
|
+
enabledSources: ['stripe', 'tempo'],
|
|
277
|
+
production: {
|
|
278
|
+
settings: null,
|
|
279
|
+
source: {
|
|
280
|
+
status: 'active',
|
|
281
|
+
stripeCustomerId: 'cus_abc123',
|
|
282
|
+
updatedAt: '2026-01-01T00:00:00.000Z',
|
|
283
|
+
},
|
|
266
284
|
},
|
|
285
|
+
sandbox: { settings: null, source: null },
|
|
267
286
|
},
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
}),
|
|
272
|
-
),
|
|
287
|
+
],
|
|
288
|
+
}),
|
|
289
|
+
),
|
|
273
290
|
}),
|
|
274
291
|
'Detailed organization information for administrators.',
|
|
275
292
|
)
|
|
276
293
|
}
|
|
277
294
|
|
|
295
|
+
/** Schemas for the setBillingSource operation. */
|
|
296
|
+
export namespace setBillingSource {
|
|
297
|
+
/** Path parameters identifying an organization billing source. */
|
|
298
|
+
export const Params = z
|
|
299
|
+
.object({
|
|
300
|
+
orgId: organizationId,
|
|
301
|
+
source: z
|
|
302
|
+
.enum(EnabledBillingSources.sources)
|
|
303
|
+
.check(
|
|
304
|
+
z.describe('Billing-source type to enable or disable.'),
|
|
305
|
+
z.meta({ examples: ['stripe'] }),
|
|
306
|
+
),
|
|
307
|
+
})
|
|
308
|
+
.check(z.describe('Path parameters for one organization billing source.'))
|
|
309
|
+
|
|
310
|
+
/** Current enabled billing sources. */
|
|
311
|
+
export const Response = Schema.describe(
|
|
312
|
+
z.object({ data: enabledBillingSources }),
|
|
313
|
+
'Current enabled billing sources for the organization.',
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
|
|
278
317
|
/** Schemas for the listOrganizationMembers operation. */
|
|
279
318
|
export namespace listOrganizationMembers {
|
|
280
319
|
/** Query parameters for paginating organization members. */
|
|
@@ -502,7 +541,7 @@ export namespace schema {
|
|
|
502
541
|
}
|
|
503
542
|
}
|
|
504
543
|
|
|
505
|
-
/**
|
|
544
|
+
/** Organization lookup and support routes for administrators. */
|
|
506
545
|
export function organizations() {
|
|
507
546
|
return new Hono<App.Environment>()
|
|
508
547
|
.get(
|
|
@@ -576,17 +615,24 @@ export function organizations() {
|
|
|
576
615
|
const organization = await Organizations.getSummary(db, orgId)
|
|
577
616
|
if (!organization) return organizationNotFound(c)
|
|
578
617
|
|
|
579
|
-
const [
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
618
|
+
const [
|
|
619
|
+
enabledSources,
|
|
620
|
+
productionSettings,
|
|
621
|
+
productionSource,
|
|
622
|
+
sandboxSettings,
|
|
623
|
+
sandboxSource,
|
|
624
|
+
] = await Promise.all([
|
|
625
|
+
EnabledBillingSources.listByOrg(db, orgId),
|
|
626
|
+
BillingSettings.get(db, orgId, 'production'),
|
|
627
|
+
StripeCustomers.get(db, orgId, 'production'),
|
|
628
|
+
BillingSettings.get(db, orgId, 'sandbox'),
|
|
629
|
+
StripeCustomers.get(db, orgId, 'sandbox'),
|
|
630
|
+
])
|
|
586
631
|
return c.json(
|
|
587
632
|
Response.validated(schema.getOrganization.Response, {
|
|
588
633
|
...organization,
|
|
589
634
|
billing: {
|
|
635
|
+
enabledSources: enabledSources.map((record) => record.source),
|
|
590
636
|
production: serializeBilling(productionSettings, productionSource),
|
|
591
637
|
sandbox: serializeBilling(sandboxSettings, sandboxSource),
|
|
592
638
|
},
|
|
@@ -598,6 +644,84 @@ export function organizations() {
|
|
|
598
644
|
}
|
|
599
645
|
},
|
|
600
646
|
)
|
|
647
|
+
.put(
|
|
648
|
+
'/:orgId/billing-sources/:source',
|
|
649
|
+
OpenApi.validate('param', schema.setBillingSource.Params, {
|
|
650
|
+
code: 'param_invalid',
|
|
651
|
+
message: 'Invalid path parameters',
|
|
652
|
+
}),
|
|
653
|
+
OpenApi.describeRoute({
|
|
654
|
+
operationId: 'enableAdminOrganizationBillingSource',
|
|
655
|
+
responses: OpenApi.responses({
|
|
656
|
+
errors: { 404: 'Organization not found.' },
|
|
657
|
+
success: {
|
|
658
|
+
description: 'Current enabled billing sources.',
|
|
659
|
+
schema: schema.setBillingSource.Response,
|
|
660
|
+
},
|
|
661
|
+
}),
|
|
662
|
+
summary: 'Enable billing source',
|
|
663
|
+
tags: ['Organizations'],
|
|
664
|
+
}),
|
|
665
|
+
async (c) => {
|
|
666
|
+
const { orgId, source } = c.req.valid('param')
|
|
667
|
+
const db = Db.get(c.get('db'))
|
|
668
|
+
try {
|
|
669
|
+
if (!(await Organizations.get(db, orgId))) return organizationNotFound(c)
|
|
670
|
+
await EnabledBillingSources.add(db, {
|
|
671
|
+
createdBy: c.get('identity')!.email,
|
|
672
|
+
orgId,
|
|
673
|
+
source,
|
|
674
|
+
})
|
|
675
|
+
return c.json(
|
|
676
|
+
Response.validated(schema.setBillingSource.Response, {
|
|
677
|
+
data: (await EnabledBillingSources.listByOrg(db, orgId)).map(
|
|
678
|
+
(record) => record.source,
|
|
679
|
+
),
|
|
680
|
+
}),
|
|
681
|
+
200,
|
|
682
|
+
)
|
|
683
|
+
} catch (cause) {
|
|
684
|
+
return Response.upstream(c, cause)
|
|
685
|
+
}
|
|
686
|
+
},
|
|
687
|
+
)
|
|
688
|
+
.delete(
|
|
689
|
+
'/:orgId/billing-sources/:source',
|
|
690
|
+
OpenApi.validate('param', schema.setBillingSource.Params, {
|
|
691
|
+
code: 'param_invalid',
|
|
692
|
+
message: 'Invalid path parameters',
|
|
693
|
+
}),
|
|
694
|
+
OpenApi.describeRoute({
|
|
695
|
+
operationId: 'disableAdminOrganizationBillingSource',
|
|
696
|
+
responses: OpenApi.responses({
|
|
697
|
+
errors: { 404: 'Organization not found.' },
|
|
698
|
+
success: {
|
|
699
|
+
description: 'Current enabled billing sources.',
|
|
700
|
+
schema: schema.setBillingSource.Response,
|
|
701
|
+
},
|
|
702
|
+
}),
|
|
703
|
+
summary: 'Disable billing source',
|
|
704
|
+
tags: ['Organizations'],
|
|
705
|
+
}),
|
|
706
|
+
async (c) => {
|
|
707
|
+
const { orgId, source } = c.req.valid('param')
|
|
708
|
+
const db = Db.get(c.get('db'))
|
|
709
|
+
try {
|
|
710
|
+
if (!(await Organizations.get(db, orgId))) return organizationNotFound(c)
|
|
711
|
+
await EnabledBillingSources.remove(db, { orgId, source })
|
|
712
|
+
return c.json(
|
|
713
|
+
Response.validated(schema.setBillingSource.Response, {
|
|
714
|
+
data: (await EnabledBillingSources.listByOrg(db, orgId)).map(
|
|
715
|
+
(record) => record.source,
|
|
716
|
+
),
|
|
717
|
+
}),
|
|
718
|
+
200,
|
|
719
|
+
)
|
|
720
|
+
} catch (cause) {
|
|
721
|
+
return Response.upstream(c, cause)
|
|
722
|
+
}
|
|
723
|
+
},
|
|
724
|
+
)
|
|
601
725
|
.get(
|
|
602
726
|
'/:orgId/members',
|
|
603
727
|
OpenApi.validate('param', schema.getOrganization.Params, {
|
|
@@ -34,6 +34,11 @@ describe('GET /scopes', () => {
|
|
|
34
34
|
"scope": "management:write",
|
|
35
35
|
"selfServe": true,
|
|
36
36
|
},
|
|
37
|
+
{
|
|
38
|
+
"description": "Validate and broadcast MPP payment credentials through the Tempo relay.",
|
|
39
|
+
"scope": "mpp:write",
|
|
40
|
+
"selfServe": true,
|
|
41
|
+
},
|
|
37
42
|
{
|
|
38
43
|
"description": "Fill and submit transactions through the relay.",
|
|
39
44
|
"scope": "rpc-relay:read",
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import * as TestAdmin from '../../../test/Admin.js'
|
|
2
2
|
import * as TestApp from '../../../test/App.js'
|
|
3
|
+
import * as Organizations from '../../db/tables/organizations.js'
|
|
4
|
+
import * as VerifiedTokenRequests from '../../db/tables/verifiedTokenRequests.js'
|
|
3
5
|
import * as Verified from './verified-tokens.js'
|
|
4
6
|
|
|
5
7
|
/** A token used for write round-trips. */
|
|
@@ -338,6 +340,205 @@ describe('PUT /verified-tokens/:address/logo', () => {
|
|
|
338
340
|
})
|
|
339
341
|
})
|
|
340
342
|
|
|
343
|
+
/** A stored verification request seeded through the repo write boundary. */
|
|
344
|
+
const requestInput = {
|
|
345
|
+
address: '0x20c00000000000000000000000000000000000aa',
|
|
346
|
+
chainId: 42431,
|
|
347
|
+
currency: 'USD',
|
|
348
|
+
decimals: 6,
|
|
349
|
+
name: 'Requested USD',
|
|
350
|
+
orgId: 'org_1a2b3c4d5e6f7g8h9j0k1m2n',
|
|
351
|
+
requestedBy: 'usr_1a2b3c4d5e6f7g8h9j0k1m2n',
|
|
352
|
+
symbol: 'rUSD',
|
|
353
|
+
} as const
|
|
354
|
+
|
|
355
|
+
describe('GET /verified-tokens/requests', () => {
|
|
356
|
+
test('denied identity → 401', async () => {
|
|
357
|
+
const { client } = TestAdmin.setup({ identify: () => null })
|
|
358
|
+
const response = await client['verified-tokens'].requests.$get({ query: {} })
|
|
359
|
+
expect(response.status).toBe(401)
|
|
360
|
+
})
|
|
361
|
+
|
|
362
|
+
test('lists the queue by status with org names', async () => {
|
|
363
|
+
const { client, db } = TestAdmin.setup()
|
|
364
|
+
const org = await Organizations.create(db, { name: 'Acme' })
|
|
365
|
+
const pending = await VerifiedTokenRequests.create(db, {
|
|
366
|
+
...requestInput,
|
|
367
|
+
logo: '<svg xmlns="http://www.w3.org/2000/svg"/>',
|
|
368
|
+
orgId: org.id,
|
|
369
|
+
})
|
|
370
|
+
const denied = await VerifiedTokenRequests.create(db, {
|
|
371
|
+
...requestInput,
|
|
372
|
+
address: '0x20c00000000000000000000000000000000000bb',
|
|
373
|
+
symbol: 'rEUR',
|
|
374
|
+
})
|
|
375
|
+
await VerifiedTokenRequests.review(db, denied!.id, {
|
|
376
|
+
reviewedBy: 'admin@tempo.xyz',
|
|
377
|
+
status: 'denied',
|
|
378
|
+
})
|
|
379
|
+
|
|
380
|
+
const queue = await client['verified-tokens'].requests.$get({ query: {} })
|
|
381
|
+
expect(queue.status).toBe(200)
|
|
382
|
+
const queueBody = await TestApp.json(queue, Verified.schema.listVerifiedTokenRequests.Response)
|
|
383
|
+
expect(queueBody.data.map(({ id, orgName }) => ({ id, orgName }))).toEqual([
|
|
384
|
+
{ id: pending!.id, orgName: 'Acme' },
|
|
385
|
+
])
|
|
386
|
+
// The uploaded SVG surfaces to reviewers.
|
|
387
|
+
expect(queueBody.data[0]?.logo).toBe('<svg xmlns="http://www.w3.org/2000/svg"/>')
|
|
388
|
+
|
|
389
|
+
const reviewed = await client['verified-tokens'].requests.$get({ query: { status: 'denied' } })
|
|
390
|
+
const reviewedBody = await TestApp.json(reviewed, Verified.schema.listVerifiedTokenRequests.Response) // prettier-ignore
|
|
391
|
+
expect(reviewedBody.data.map(({ id }) => id)).toEqual([denied!.id])
|
|
392
|
+
})
|
|
393
|
+
})
|
|
394
|
+
|
|
395
|
+
describe('POST /verified-tokens/requests/:requestId/approve', () => {
|
|
396
|
+
test('publishes the token and stamps the review', async () => {
|
|
397
|
+
const { client, db } = TestAdmin.setup()
|
|
398
|
+
const org = await Organizations.create(db, { name: 'Acme' })
|
|
399
|
+
const request = await VerifiedTokenRequests.create(db, { ...requestInput, orgId: org.id })
|
|
400
|
+
|
|
401
|
+
const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
402
|
+
param: { requestId: request!.id },
|
|
403
|
+
})
|
|
404
|
+
expect(approved.status).toBe(200)
|
|
405
|
+
const body = await TestApp.json(approved, Verified.schema.reviewVerifiedTokenRequest.Response)
|
|
406
|
+
expect(body.data).toMatchObject({
|
|
407
|
+
orgName: 'Acme',
|
|
408
|
+
reviewedBy: TestAdmin.identity.email,
|
|
409
|
+
status: 'approved',
|
|
410
|
+
})
|
|
411
|
+
expect(Date.parse(body.data.reviewedAt!)).not.toBeNaN()
|
|
412
|
+
|
|
413
|
+
const listed = await client['verified-tokens'].$get({ query: { chainId } })
|
|
414
|
+
const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
|
|
415
|
+
expect(listedBody.data.map(({ address }) => address)).toEqual([requestInput.address])
|
|
416
|
+
|
|
417
|
+
const repeat = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
418
|
+
param: { requestId: request!.id },
|
|
419
|
+
})
|
|
420
|
+
expect(repeat.status).toBe(409)
|
|
421
|
+
const repeatBody = (await repeat.json()) as { error?: { code?: string } }
|
|
422
|
+
expect(repeatBody.error?.code).toBe('request_not_pending')
|
|
423
|
+
})
|
|
424
|
+
|
|
425
|
+
test('publishes an uploaded logo to the asset store', async () => {
|
|
426
|
+
const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
|
|
427
|
+
const stored: { key: string; content: { body: ArrayBuffer; contentType: string } }[] = []
|
|
428
|
+
const { client, db } = TestAdmin.setup({
|
|
429
|
+
assets: {
|
|
430
|
+
get: async (key) => stored.find((entry) => entry.key === key)?.content,
|
|
431
|
+
put: async (key, content) => void stored.push({ content, key }),
|
|
432
|
+
},
|
|
433
|
+
})
|
|
434
|
+
const request = await VerifiedTokenRequests.create(db, { ...requestInput, logo: svg })
|
|
435
|
+
|
|
436
|
+
const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
437
|
+
param: { requestId: request!.id },
|
|
438
|
+
})
|
|
439
|
+
expect(approved.status).toBe(200)
|
|
440
|
+
expect(stored).toHaveLength(1)
|
|
441
|
+
expect(stored[0]?.key).toBe(`42431/icons/${requestInput.address}`)
|
|
442
|
+
expect(new TextDecoder().decode(stored[0]?.content.body)).toBe(svg)
|
|
443
|
+
|
|
444
|
+
const listed = await client['verified-tokens'].$get({ query: { chainId } })
|
|
445
|
+
const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
|
|
446
|
+
expect(listedBody.data.map(({ address }) => address)).toEqual([requestInput.address])
|
|
447
|
+
})
|
|
448
|
+
|
|
449
|
+
test('rejects an uploaded logo without an asset writer, keeping the request pending', async () => {
|
|
450
|
+
const { client, db } = TestAdmin.setup()
|
|
451
|
+
const request = await VerifiedTokenRequests.create(db, {
|
|
452
|
+
...requestInput,
|
|
453
|
+
logo: '<svg xmlns="http://www.w3.org/2000/svg"/>',
|
|
454
|
+
})
|
|
455
|
+
|
|
456
|
+
const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
457
|
+
param: { requestId: request!.id },
|
|
458
|
+
})
|
|
459
|
+
expect(approved.status).toBe(404)
|
|
460
|
+
const body = (await approved.json()) as { error?: { code?: string } }
|
|
461
|
+
expect(body.error?.code).toBe('assets_not_enabled')
|
|
462
|
+
|
|
463
|
+
const record = await VerifiedTokenRequests.get(db, request!.id)
|
|
464
|
+
expect(record?.status).toBe('pending')
|
|
465
|
+
})
|
|
466
|
+
|
|
467
|
+
test('converges when the token is already verified', async () => {
|
|
468
|
+
const { client, db } = TestAdmin.setup()
|
|
469
|
+
const request = await VerifiedTokenRequests.create(db, requestInput)
|
|
470
|
+
await client['verified-tokens'].$post({
|
|
471
|
+
json: { ...novel, address: requestInput.address, chainId: 42431, symbol: requestInput.symbol }, // prettier-ignore
|
|
472
|
+
})
|
|
473
|
+
|
|
474
|
+
const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
475
|
+
param: { requestId: request!.id },
|
|
476
|
+
})
|
|
477
|
+
expect(approved.status).toBe(200)
|
|
478
|
+
const body = await TestApp.json(approved, Verified.schema.reviewVerifiedTokenRequest.Response)
|
|
479
|
+
expect(body.data.status).toBe('approved')
|
|
480
|
+
|
|
481
|
+
// The pre-existing entry survives untouched; nothing was re-created.
|
|
482
|
+
const listed = await client['verified-tokens'].$get({ query: { chainId } })
|
|
483
|
+
const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
|
|
484
|
+
expect(listedBody.data).toHaveLength(1)
|
|
485
|
+
})
|
|
486
|
+
|
|
487
|
+
test('rejects a symbol conflict and keeps the request pending', async () => {
|
|
488
|
+
const { client, db } = TestAdmin.setup()
|
|
489
|
+
// Same symbol already verified under a different address.
|
|
490
|
+
await client['verified-tokens'].$post({
|
|
491
|
+
json: { ...novel, chainId: 42431, symbol: requestInput.symbol },
|
|
492
|
+
})
|
|
493
|
+
const request = await VerifiedTokenRequests.create(db, requestInput)
|
|
494
|
+
|
|
495
|
+
const approved = await client['verified-tokens'].requests[':requestId'].approve.$post({
|
|
496
|
+
param: { requestId: request!.id },
|
|
497
|
+
})
|
|
498
|
+
expect(approved.status).toBe(409)
|
|
499
|
+
const body = (await approved.json()) as { error?: { code?: string } }
|
|
500
|
+
expect(body.error?.code).toBe('duplicate_symbol')
|
|
501
|
+
|
|
502
|
+
const record = await VerifiedTokenRequests.get(db, request!.id)
|
|
503
|
+
expect(record?.status).toBe('pending')
|
|
504
|
+
})
|
|
505
|
+
})
|
|
506
|
+
|
|
507
|
+
describe('POST /verified-tokens/requests/:requestId/deny', () => {
|
|
508
|
+
test('records the review note', async () => {
|
|
509
|
+
const { client, db } = TestAdmin.setup()
|
|
510
|
+
const request = await VerifiedTokenRequests.create(db, requestInput)
|
|
511
|
+
|
|
512
|
+
const denied = await client['verified-tokens'].requests[':requestId'].deny.$post({
|
|
513
|
+
json: { reviewNote: 'Logo unreachable.' },
|
|
514
|
+
param: { requestId: request!.id },
|
|
515
|
+
})
|
|
516
|
+
expect(denied.status).toBe(200)
|
|
517
|
+
const body = await TestApp.json(denied, Verified.schema.reviewVerifiedTokenRequest.Response)
|
|
518
|
+
expect(body.data).toMatchObject({
|
|
519
|
+
reviewNote: 'Logo unreachable.',
|
|
520
|
+
reviewedBy: TestAdmin.identity.email,
|
|
521
|
+
status: 'denied',
|
|
522
|
+
})
|
|
523
|
+
|
|
524
|
+
// Nothing was published.
|
|
525
|
+
const listed = await client['verified-tokens'].$get({ query: { chainId } })
|
|
526
|
+
const listedBody = await TestApp.json(listed, Verified.schema.listVerifiedTokens.Response)
|
|
527
|
+
expect(listedBody.data).toEqual([])
|
|
528
|
+
})
|
|
529
|
+
|
|
530
|
+
test('unknown request id → 404', async () => {
|
|
531
|
+
const { client } = TestAdmin.setup()
|
|
532
|
+
const response = await client['verified-tokens'].requests[':requestId'].deny.$post({
|
|
533
|
+
json: {},
|
|
534
|
+
param: { requestId: 'vtr_1a2b3c4d5e6f7g8h9j0k1m2n' },
|
|
535
|
+
})
|
|
536
|
+
expect(response.status).toBe(404)
|
|
537
|
+
const body = (await response.json()) as { error?: { code?: string } }
|
|
538
|
+
expect(body.error?.code).toBe('verified_token_request_not_found')
|
|
539
|
+
})
|
|
540
|
+
})
|
|
541
|
+
|
|
341
542
|
describe('GET /verified-tokens/:address/logo', () => {
|
|
342
543
|
const svg = '<svg xmlns="http://www.w3.org/2000/svg"/>'
|
|
343
544
|
|