tapimo 0.10.2 → 0.12.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 +4896 -2166
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +2 -2
- package/dist/App.js.map +1 -1
- package/dist/Assets.d.ts +15 -0
- package/dist/Assets.d.ts.map +1 -1
- package/dist/Assets.js +7 -0
- package/dist/Assets.js.map +1 -1
- package/dist/Webhooks.d.ts +0 -75
- package/dist/Webhooks.d.ts.map +1 -1
- package/dist/Webhooks.js +1 -143
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +127 -78
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +115 -1
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +59 -6
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +3 -3
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +4 -2
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +83 -83
- 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 +151 -151
- package/dist/admin/ui.generated.js.map +1 -1
- package/dist/apps/data/App.d.ts +5924 -4310
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +61 -9
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +62 -0
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -0
- package/dist/apps/data/ZoneSelection.js +44 -0
- package/dist/apps/data/ZoneSelection.js.map +1 -0
- package/dist/apps/data/routes/activities.d.ts +2368 -5
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +423 -114
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +131 -0
- package/dist/apps/data/routes/addresses.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.d.ts +25 -25
- package/dist/apps/data/routes/balances.js +1 -1
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +1 -1
- package/dist/apps/data/routes/blocks.js +1 -1
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/earn.d.ts +135 -10
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +157 -25
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +829 -123
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +16 -13
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +26 -26
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +9 -11
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +54 -54
- package/dist/apps/data/routes/receipts.js +1 -1
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/rpc.js +24 -10
- package/dist/apps/data/routes/rpc.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +12 -12
- package/dist/apps/data/routes/tokenlist.d.ts.map +1 -1
- package/dist/apps/data/routes/tokenlist.js +16 -15
- package/dist/apps/data/routes/tokenlist.js.map +1 -1
- package/dist/apps/data/routes/tokens.d.ts +17 -3
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +34 -15
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +1 -1
- package/dist/apps/data/routes/transactions.js +1 -1
- package/dist/apps/data/routes/transactions.js.map +1 -1
- package/dist/apps/data/routes/transfers.d.ts +13 -13
- package/dist/apps/data/routes/transfers.d.ts.map +1 -1
- package/dist/apps/data/routes/transfers.js +7 -9
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +21 -21
- package/dist/apps/data/routes/verified-tokens.d.ts +5 -5
- package/dist/apps/data/routes/webhooks.d.ts +1011 -151
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +126 -739
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +15 -15
- package/dist/apps/funding/App.d.ts +27 -27
- package/dist/apps/funding/routes/chains.d.ts.map +1 -1
- package/dist/apps/funding/routes/chains.js +5 -4
- package/dist/apps/funding/routes/chains.js.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts +18 -18
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.js +8 -8
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/funding/routes/providers.d.ts.map +1 -1
- package/dist/apps/funding/routes/providers.js +3 -2
- package/dist/apps/funding/routes/providers.js.map +1 -1
- package/dist/apps/funding/routes/quotes.d.ts.map +1 -1
- package/dist/apps/funding/routes/quotes.js +2 -2
- package/dist/apps/funding/routes/quotes.js.map +1 -1
- package/dist/apps/funding/routes/transfers.d.ts +33 -33
- package/dist/apps/management/App.d.ts +1433 -322
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +19 -6
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +154 -94
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +76 -30
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +103 -30
- package/dist/apps/management/routes/billing.d.ts.map +1 -1
- package/dist/apps/management/routes/billing.js +91 -32
- package/dist/apps/management/routes/billing.js.map +1 -1
- package/dist/apps/management/routes/faucet.d.ts +12 -12
- package/dist/apps/management/routes/faucet.d.ts.map +1 -1
- package/dist/apps/management/routes/faucet.js +23 -12
- package/dist/apps/management/routes/faucet.js.map +1 -1
- package/dist/apps/management/routes/invitations.d.ts +46 -13
- package/dist/apps/management/routes/invitations.d.ts.map +1 -1
- package/dist/apps/management/routes/invitations.js +79 -29
- package/dist/apps/management/routes/invitations.js.map +1 -1
- package/dist/apps/management/routes/invite-links.d.ts +128 -83
- package/dist/apps/management/routes/invite-links.d.ts.map +1 -1
- package/dist/apps/management/routes/invite-links.js +100 -41
- package/dist/apps/management/routes/invite-links.js.map +1 -1
- package/dist/apps/management/routes/me.d.ts +5 -5
- package/dist/apps/management/routes/me.d.ts.map +1 -1
- package/dist/apps/management/routes/me.js +14 -10
- package/dist/apps/management/routes/me.js.map +1 -1
- package/dist/apps/management/routes/members.d.ts +68 -47
- package/dist/apps/management/routes/members.d.ts.map +1 -1
- package/dist/apps/management/routes/members.js +37 -18
- package/dist/apps/management/routes/members.js.map +1 -1
- package/dist/apps/management/routes/orgs.d.ts +48 -8
- package/dist/apps/management/routes/orgs.d.ts.map +1 -1
- package/dist/apps/management/routes/orgs.js +48 -19
- package/dist/apps/management/routes/orgs.js.map +1 -1
- package/dist/apps/management/routes/projects.d.ts +130 -68
- package/dist/apps/management/routes/projects.d.ts.map +1 -1
- package/dist/apps/management/routes/projects.js +72 -21
- package/dist/apps/management/routes/projects.js.map +1 -1
- package/dist/apps/management/routes/scopes.d.ts.map +1 -1
- package/dist/apps/management/routes/scopes.js +8 -5
- package/dist/apps/management/routes/scopes.js.map +1 -1
- package/dist/apps/management/routes/usage.d.ts +38 -38
- package/dist/apps/management/routes/usage.d.ts.map +1 -1
- package/dist/apps/management/routes/usage.js +41 -31
- package/dist/apps/management/routes/usage.js.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.d.ts +34 -6
- package/dist/apps/management/routes/verified-token-requests.d.ts.map +1 -1
- package/dist/apps/management/routes/verified-token-requests.js +36 -17
- package/dist/apps/management/routes/verified-token-requests.js.map +1 -1
- package/dist/apps/management/routes/webhooks.d.ts +1186 -197
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +106 -38
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts +1 -1
- package/dist/apps/mpp/internal/Adapter.d.ts.map +1 -1
- package/dist/apps/mpp/internal/Adapter.js +12 -0
- package/dist/apps/mpp/internal/Adapter.js.map +1 -1
- package/dist/db/Db.d.ts +2 -0
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +61 -0
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +30 -2
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +28 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/earnVaults.d.ts +5 -1
- package/dist/db/tables/earnVaults.d.ts.map +1 -1
- package/dist/db/tables/earnVaults.js +5 -0
- package/dist/db/tables/earnVaults.js.map +1 -1
- package/dist/db/tables/webhookDeliveries.d.ts.map +1 -1
- package/dist/db/tables/webhookDeliveries.js +10 -0
- package/dist/db/tables/webhookDeliveries.js.map +1 -1
- package/dist/db/tables/webhookQueueCompletions.d.ts +15 -0
- package/dist/db/tables/webhookQueueCompletions.d.ts.map +1 -0
- package/dist/db/tables/webhookQueueCompletions.js +32 -0
- package/dist/db/tables/webhookQueueCompletions.js.map +1 -0
- package/dist/db/tables/webhookQueueEvents.d.ts +16 -20
- package/dist/db/tables/webhookQueueEvents.d.ts.map +1 -1
- package/dist/db/tables/webhookQueueEvents.js +68 -43
- package/dist/db/tables/webhookQueueEvents.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +47 -72
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +92 -105
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/internal/Auth.d.ts +8 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +13 -3
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/Cache.d.ts.map +1 -1
- package/dist/internal/Cache.js +11 -7
- package/dist/internal/Cache.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +41 -2
- package/dist/internal/EarnVaults.d.ts.map +1 -1
- package/dist/internal/EarnVaults.js +167 -0
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/MetricSink.d.ts +35 -125
- package/dist/internal/MetricSink.d.ts.map +1 -1
- package/dist/internal/MetricSink.js +50 -121
- package/dist/internal/MetricSink.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +26 -22
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +128 -39
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +13 -8
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Response.js +16 -5
- package/dist/internal/Response.js.map +1 -1
- package/dist/internal/Schema.d.ts +8 -8
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +10 -9
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +15 -6
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +45 -15
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts +2 -0
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +16 -4
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/WebhookTransfer.d.ts +1 -55
- package/dist/internal/WebhookTransfer.d.ts.map +1 -1
- package/dist/internal/WebhookTransfer.js +1 -239
- package/dist/internal/WebhookTransfer.js.map +1 -1
- package/dist/internal/Webhooks.d.ts +112 -56
- package/dist/internal/Webhooks.d.ts.map +1 -1
- package/dist/internal/Webhooks.js +124 -93
- package/dist/internal/Webhooks.js.map +1 -1
- package/dist/internal/funding/Deposit.d.ts +2 -2
- package/dist/internal/funding/Deposit.d.ts.map +1 -1
- package/dist/internal/funding/Deposit.js +9 -8
- package/dist/internal/funding/Deposit.js.map +1 -1
- package/dist/internal/funding/DepositAddress.d.ts +4 -4
- package/dist/internal/funding/DepositAddress.d.ts.map +1 -1
- package/dist/internal/funding/DepositAddress.js +9 -8
- package/dist/internal/funding/DepositAddress.js.map +1 -1
- package/dist/internal/funding/DepositWebhook.d.ts +25 -0
- package/dist/internal/funding/DepositWebhook.d.ts.map +1 -0
- package/dist/internal/funding/DepositWebhook.js +74 -0
- package/dist/internal/funding/DepositWebhook.js.map +1 -0
- package/dist/internal/funding/Provider.d.ts.map +1 -1
- package/dist/internal/funding/Provider.js +13 -12
- package/dist/internal/funding/Provider.js.map +1 -1
- package/dist/internal/funding/Reconciliation.d.ts +6 -0
- package/dist/internal/funding/Reconciliation.d.ts.map +1 -1
- package/dist/internal/funding/Reconciliation.js +42 -10
- package/dist/internal/funding/Reconciliation.js.map +1 -1
- package/dist/internal/funding/index.d.ts +1 -0
- package/dist/internal/funding/index.d.ts.map +1 -1
- package/dist/internal/funding/index.js +1 -0
- package/dist/internal/funding/index.js.map +1 -1
- package/dist/internal/funding/providers/stargate.d.ts +19 -0
- package/dist/internal/funding/providers/stargate.d.ts.map +1 -0
- package/dist/internal/funding/providers/stargate.js +143 -0
- package/dist/internal/funding/providers/stargate.js.map +1 -0
- package/dist/internal/webhookDestinations/slack.d.ts.map +1 -1
- package/dist/internal/webhookDestinations/slack.js +16 -0
- package/dist/internal/webhookDestinations/slack.js.map +1 -1
- package/dist/providers/index.d.ts +7 -0
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +3 -0
- package/dist/providers/index.js.map +1 -1
- package/package.json +2 -2
- package/src/App.test.ts +48 -0
- package/src/App.ts +7 -2
- package/src/Assets.test.ts +18 -0
- package/src/Assets.ts +22 -0
- package/src/Client.test-d.ts +287 -17
- package/src/Webhooks.ts +1 -220
- package/src/admin/apps/earn-vaults.test.ts +143 -0
- package/src/admin/apps/earn-vaults.ts +83 -6
- package/src/admin/apps/organizations.ts +6 -2
- package/src/admin/ui/src/routes/api-keys.tsx +36 -0
- package/src/admin/ui.generated.ts +151 -189
- package/src/apps/data/App.test.ts +31 -0
- package/src/apps/data/App.ts +64 -10
- package/src/apps/data/ZoneSelection.test.ts +196 -0
- package/src/apps/data/ZoneSelection.ts +108 -0
- package/src/apps/data/routes/activities.test.ts +435 -12
- package/src/apps/data/routes/activities.ts +562 -125
- package/src/apps/data/routes/balances.ts +1 -1
- package/src/apps/data/routes/blocks.ts +1 -1
- package/src/apps/data/routes/earn.test.ts +183 -23
- package/src/apps/data/routes/earn.ts +225 -29
- package/src/apps/data/routes/earn.zone-access.test.ts +46 -0
- package/src/apps/data/routes/exchanges.test.ts +31 -1
- package/src/apps/data/routes/exchanges.ts +19 -15
- package/src/apps/data/routes/fee-amm.ts +18 -11
- package/src/apps/data/routes/receipts.ts +1 -1
- package/src/apps/data/routes/rpc.test.ts +75 -0
- package/src/apps/data/routes/rpc.ts +23 -9
- package/src/apps/data/routes/tokenlist.ts +21 -18
- package/src/apps/data/routes/tokens.test.ts +29 -0
- package/src/apps/data/routes/tokens.ts +38 -15
- package/src/apps/data/routes/transactions.ts +1 -1
- package/src/apps/data/routes/transfers.test.ts +3 -3
- package/src/apps/data/routes/transfers.ts +12 -9
- package/src/apps/data/routes/webhooks.test.ts +179 -1497
- package/src/apps/data/routes/webhooks.ts +156 -976
- package/src/apps/data/routes/zones.test.ts +19 -13
- package/src/apps/funding/routes/chains.test.ts +211 -7
- package/src/apps/funding/routes/chains.ts +19 -12
- package/src/apps/funding/routes/deposit-addresses.test.ts +394 -0
- package/src/apps/funding/routes/deposit-addresses.ts +84 -72
- package/src/apps/funding/routes/providers.ts +9 -5
- package/src/apps/funding/routes/quotes.test.ts +46 -0
- package/src/apps/funding/routes/quotes.ts +8 -5
- package/src/apps/funding/routes/transfers.test.ts +35 -32
- package/src/apps/management/Billing.test.ts +26 -0
- package/src/apps/management/Billing.ts +24 -7
- package/src/apps/management/routes/api-keys.test.ts +178 -0
- package/src/apps/management/routes/api-keys.ts +203 -144
- package/src/apps/management/routes/billing.test.ts +209 -0
- package/src/apps/management/routes/billing.ts +254 -177
- package/src/apps/management/routes/faucet.test.ts +39 -0
- package/src/apps/management/routes/faucet.ts +75 -41
- package/src/apps/management/routes/invitations.test.ts +216 -0
- package/src/apps/management/routes/invitations.ts +186 -109
- package/src/apps/management/routes/invite-links.test.ts +263 -1
- package/src/apps/management/routes/invite-links.ts +295 -214
- package/src/apps/management/routes/me.test.ts +49 -0
- package/src/apps/management/routes/me.ts +42 -32
- package/src/apps/management/routes/members.test.ts +124 -1
- package/src/apps/management/routes/members.ts +81 -51
- package/src/apps/management/routes/orgs.test.ts +176 -0
- package/src/apps/management/routes/orgs.ts +101 -59
- package/src/apps/management/routes/projects.test.ts +183 -0
- package/src/apps/management/routes/projects.ts +124 -60
- package/src/apps/management/routes/scopes.test.ts +44 -0
- package/src/apps/management/routes/scopes.ts +37 -28
- package/src/apps/management/routes/usage.test.ts +92 -0
- package/src/apps/management/routes/usage.ts +186 -151
- package/src/apps/management/routes/verified-token-requests.test.ts +114 -0
- package/src/apps/management/routes/verified-token-requests.ts +166 -133
- package/src/apps/management/routes/webhooks.test.ts +313 -1
- package/src/apps/management/routes/webhooks.ts +220 -71
- package/src/apps/mpp/internal/Adapter.ts +13 -1
- package/src/db/Db.test.ts +42 -5
- package/src/db/Db.ts +85 -0
- package/src/db/Schema.ts +41 -3
- package/src/db/tables/earnVaults.test.ts +22 -0
- package/src/db/tables/earnVaults.ts +11 -1
- package/src/db/tables/organizations.test.ts +5 -2
- package/src/db/tables/webhookDeliveries.ts +13 -0
- package/src/db/tables/webhookQueueCompletions.ts +55 -0
- package/src/db/tables/webhookQueueEvents.ts +97 -57
- package/src/db/tables/webhookSubscriptions.ts +134 -144
- package/src/internal/Auth.ts +23 -5
- package/src/internal/Cache.ts +14 -7
- package/src/internal/EarnVaults.capabilities.test.ts +33 -0
- package/src/internal/EarnVaults.test.ts +79 -0
- package/src/internal/EarnVaults.ts +277 -0
- package/src/internal/MetricSink.test.ts +41 -373
- package/src/internal/MetricSink.ts +92 -273
- package/src/internal/OpenApi.ts +165 -49
- package/src/internal/Response.test.ts +95 -0
- package/src/internal/Response.ts +40 -2
- package/src/internal/Schema.test.ts +34 -0
- package/src/internal/Schema.ts +20 -9
- package/src/internal/Store.test.ts +186 -0
- package/src/internal/Store.ts +57 -17
- package/src/internal/Tidx.test.ts +19 -0
- package/src/internal/Tidx.ts +16 -4
- package/src/internal/WebhookTransfer.ts +1 -351
- package/src/internal/Webhooks.test.ts +222 -145
- package/src/internal/Webhooks.ts +234 -135
- package/src/internal/funding/Deposit.ts +71 -64
- package/src/internal/funding/DepositAddress.ts +50 -43
- package/src/internal/funding/DepositWebhook.test.ts +131 -0
- package/src/internal/funding/DepositWebhook.ts +101 -0
- package/src/internal/funding/Provider.ts +164 -142
- package/src/internal/funding/Reconciliation.test.ts +14 -0
- package/src/internal/funding/Reconciliation.ts +161 -86
- package/src/internal/funding/index.test.ts +1 -0
- package/src/internal/funding/index.ts +1 -0
- package/src/internal/funding/providers/index.test.ts +185 -0
- package/src/internal/funding/providers/stargate.ts +184 -0
- package/src/internal/webhookDestinations/slack.ts +15 -0
- package/src/providers/index.test.ts +1 -0
- package/src/providers/index.ts +9 -0
- package/src/Webhooks.bench.ts +0 -714
- package/src/Webhooks.memory.bench.ts +0 -250
- package/src/Webhooks.test.ts +0 -146
|
@@ -62,32 +62,39 @@ export namespace schema {
|
|
|
62
62
|
*/
|
|
63
63
|
export const PoolToken = Schema.describe(
|
|
64
64
|
z.object({
|
|
65
|
-
address: Schema.
|
|
65
|
+
address: Schema.tokenAddress(Tokens.tokenExample.address).check(
|
|
66
66
|
z.describe('TIP-20 token contract address used by this fee pool.'),
|
|
67
67
|
),
|
|
68
68
|
currency: z
|
|
69
69
|
.optional(z.string())
|
|
70
70
|
.check(
|
|
71
71
|
z.describe('Display currency for the token, when available.'),
|
|
72
|
-
z.meta({ examples: [
|
|
72
|
+
z.meta({ examples: [Tokens.tokenExample.currency] }),
|
|
73
73
|
),
|
|
74
74
|
decimals: z
|
|
75
75
|
.optional(z.number().check(z.int(), z.nonnegative()))
|
|
76
|
-
.check(
|
|
76
|
+
.check(
|
|
77
|
+
z.describe('Number of decimal places the token uses.'),
|
|
78
|
+
z.meta({ examples: [Tokens.tokenExample.decimals] }),
|
|
79
|
+
),
|
|
77
80
|
logoUri: z.optional(z.string()).check(
|
|
78
|
-
z.describe('URL for the token logo
|
|
81
|
+
z.describe('URL for the token logo image, when available.'),
|
|
79
82
|
z.meta({
|
|
80
|
-
examples: [
|
|
81
|
-
'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
|
|
82
|
-
],
|
|
83
|
+
examples: [Tokens.tokenExample.logoUri],
|
|
83
84
|
}),
|
|
84
85
|
),
|
|
85
86
|
name: z
|
|
86
87
|
.optional(z.string())
|
|
87
|
-
.check(
|
|
88
|
+
.check(
|
|
89
|
+
z.describe('Human-readable token name.'),
|
|
90
|
+
z.meta({ examples: [Tokens.tokenExample.name] }),
|
|
91
|
+
),
|
|
88
92
|
symbol: z
|
|
89
93
|
.optional(z.string())
|
|
90
|
-
.check(
|
|
94
|
+
.check(
|
|
95
|
+
z.describe('Short token ticker symbol.'),
|
|
96
|
+
z.meta({ examples: [Tokens.tokenExample.symbol] }),
|
|
97
|
+
),
|
|
91
98
|
verified: z
|
|
92
99
|
.optional(z.boolean())
|
|
93
100
|
.check(
|
|
@@ -403,7 +410,7 @@ export function feeAmm() {
|
|
|
403
410
|
200,
|
|
404
411
|
)
|
|
405
412
|
} catch (cause) {
|
|
406
|
-
return Response.upstream(c, cause)
|
|
413
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
407
414
|
}
|
|
408
415
|
},
|
|
409
416
|
)
|
|
@@ -498,7 +505,7 @@ export function feeAmm() {
|
|
|
498
505
|
200,
|
|
499
506
|
)
|
|
500
507
|
} catch (cause) {
|
|
501
|
-
return Response.upstream(c, cause)
|
|
508
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
502
509
|
}
|
|
503
510
|
},
|
|
504
511
|
)
|
|
@@ -594,7 +594,7 @@ export function receipts(options: receipts.Options = {}) {
|
|
|
594
594
|
} catch (cause) {
|
|
595
595
|
if (cause instanceof Valuation.UnsupportedDenominationError)
|
|
596
596
|
return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 })
|
|
597
|
-
return Response.upstream(c, cause)
|
|
597
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
598
598
|
}
|
|
599
599
|
},
|
|
600
600
|
)
|
|
@@ -286,6 +286,81 @@ describe('POST /rpc', () => {
|
|
|
286
286
|
},
|
|
287
287
|
)
|
|
288
288
|
|
|
289
|
+
test('keeps RPC method-filter responses out of upstream alerts', async () => {
|
|
290
|
+
const entries: Log.Entry[] = []
|
|
291
|
+
const body = {
|
|
292
|
+
error: { code: -32_601, message: 'method not allowed: tempo_sponsor' },
|
|
293
|
+
id: null,
|
|
294
|
+
jsonrpc: '2.0',
|
|
295
|
+
}
|
|
296
|
+
const server = await Relay.createServer(
|
|
297
|
+
RequestListener.fromFetchHandler(() => Response.json(body, { status: 403 })),
|
|
298
|
+
)
|
|
299
|
+
|
|
300
|
+
try {
|
|
301
|
+
const app = TestApp.create({
|
|
302
|
+
auth: false,
|
|
303
|
+
logger: (entry) => void entries.push(entry),
|
|
304
|
+
rpc: { url: server.url },
|
|
305
|
+
})
|
|
306
|
+
const response = await app.fetch(
|
|
307
|
+
new Request('http://tempo-api.test/rpc', {
|
|
308
|
+
body: JSON.stringify({ id: 1, jsonrpc: '2.0', method: 'tempo_sponsor' }),
|
|
309
|
+
method: 'POST',
|
|
310
|
+
}),
|
|
311
|
+
)
|
|
312
|
+
|
|
313
|
+
expect(response.status).toBe(403)
|
|
314
|
+
expect(await response.json()).toEqual(body)
|
|
315
|
+
expect(entries[0]?.provider).toBeUndefined()
|
|
316
|
+
} finally {
|
|
317
|
+
await server.closeAsync()
|
|
318
|
+
}
|
|
319
|
+
})
|
|
320
|
+
|
|
321
|
+
test('attributes RPC authorization responses to the upstream', async () => {
|
|
322
|
+
const entries: Log.Entry[] = []
|
|
323
|
+
const server = await Relay.createServer(
|
|
324
|
+
RequestListener.fromFetchHandler(() =>
|
|
325
|
+
Response.json(
|
|
326
|
+
{
|
|
327
|
+
error: { code: -32_001, message: 'unauthorized: invalid credentials' },
|
|
328
|
+
id: null,
|
|
329
|
+
jsonrpc: '2.0',
|
|
330
|
+
},
|
|
331
|
+
{ status: 403 },
|
|
332
|
+
),
|
|
333
|
+
),
|
|
334
|
+
)
|
|
335
|
+
|
|
336
|
+
try {
|
|
337
|
+
const app = TestApp.create({
|
|
338
|
+
auth: false,
|
|
339
|
+
logger: (entry) => void entries.push(entry),
|
|
340
|
+
rpc: { url: server.url },
|
|
341
|
+
})
|
|
342
|
+
const response = await app.fetch(
|
|
343
|
+
new Request('http://tempo-api.test/rpc', {
|
|
344
|
+
body: JSON.stringify({ id: 1, jsonrpc: '2.0', method: 'eth_chainId' }),
|
|
345
|
+
method: 'POST',
|
|
346
|
+
}),
|
|
347
|
+
)
|
|
348
|
+
|
|
349
|
+
expect(response.status).toBe(403)
|
|
350
|
+
expect(entries[0]).toMatchObject({
|
|
351
|
+
provider: {
|
|
352
|
+
chainId: runtime.chainId,
|
|
353
|
+
failure: 'http',
|
|
354
|
+
id: 'rpc',
|
|
355
|
+
operation: 'request',
|
|
356
|
+
status: 403,
|
|
357
|
+
},
|
|
358
|
+
})
|
|
359
|
+
} finally {
|
|
360
|
+
await server.closeAsync()
|
|
361
|
+
}
|
|
362
|
+
})
|
|
363
|
+
|
|
289
364
|
test('attributes RPC transport failures to the upstream', async () => {
|
|
290
365
|
const entries: Log.Entry[] = []
|
|
291
366
|
const server = await Relay.createServer(
|
|
@@ -411,14 +411,14 @@ async function passthrough(
|
|
|
411
411
|
|
|
412
412
|
try {
|
|
413
413
|
const response = await fetch(new Request(upstream, init))
|
|
414
|
-
|
|
414
|
+
// Malformed requests and public Zone authentication failures are caused
|
|
415
|
+
// by caller input, not by the RPC provider.
|
|
416
|
+
if (!response.ok && !(await isCallerRpcFailure(response, usePublicZoneUrl)))
|
|
417
|
+
c.set('providerFailure', rpcProviderFailure(response, alertChainId))
|
|
415
418
|
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
if (!isCallerRpcFailure(response.status, usePublicZoneUrl))
|
|
420
|
-
c.set('providerFailure', rpcProviderFailure(response, alertChainId))
|
|
421
|
-
} else if (response.status === 200) {
|
|
419
|
+
// `Response.clone()` replaces the body stream, so capture it after classifying errors.
|
|
420
|
+
let body = response.body
|
|
421
|
+
if (response.status === 200) {
|
|
422
422
|
const inspection = await inspectRpcResponse(response)
|
|
423
423
|
body = inspection.body
|
|
424
424
|
if (inspection.result?.ok === false && !(inspection.result.empty && options.notificationOnly))
|
|
@@ -455,14 +455,28 @@ async function passthrough(
|
|
|
455
455
|
}
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
function isCallerRpcFailure(
|
|
459
|
-
|
|
458
|
+
async function isCallerRpcFailure(response: globalThis.Response, usePublicZoneUrl: boolean) {
|
|
459
|
+
const { status } = response
|
|
460
|
+
if (
|
|
460
461
|
status === 400 ||
|
|
461
462
|
status === 413 ||
|
|
462
463
|
status === 415 ||
|
|
463
464
|
status === 422 ||
|
|
464
465
|
(usePublicZoneUrl && (status === 401 || status === 403))
|
|
465
466
|
)
|
|
467
|
+
return true
|
|
468
|
+
if (status !== 403) return false
|
|
469
|
+
|
|
470
|
+
// Orchestra returns HTTP 403 with JSON-RPC -32601 when its method filter
|
|
471
|
+
// rejects caller input. Other 403s, including RPC auth failures, stay upstream failures.
|
|
472
|
+
const body = await response
|
|
473
|
+
.clone()
|
|
474
|
+
.json()
|
|
475
|
+
.catch(() => undefined)
|
|
476
|
+
const parsed = schema.ResponseBody.safeParse(body)
|
|
477
|
+
if (!parsed.success) return false
|
|
478
|
+
const responses = Array.isArray(parsed.data) ? parsed.data : [parsed.data]
|
|
479
|
+
return responses.every((response) => response.error?.code === -32_601)
|
|
466
480
|
}
|
|
467
481
|
|
|
468
482
|
declare namespace passthrough {
|
|
@@ -11,7 +11,7 @@ import * as Schema from '../../../internal/Schema.js'
|
|
|
11
11
|
import * as Timing from '../../../internal/Timing.js'
|
|
12
12
|
import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
|
|
13
13
|
import * as Viem from '../../../internal/Viem.js'
|
|
14
|
-
import
|
|
14
|
+
import * as Tokens from './tokens.js'
|
|
15
15
|
|
|
16
16
|
/** Zod schemas owned by the tokenlist resource. */
|
|
17
17
|
export namespace schema {
|
|
@@ -26,15 +26,20 @@ export namespace schema {
|
|
|
26
26
|
z.describe('The Tempo chain ID where this token lives.'),
|
|
27
27
|
z.meta({ examples: [4217] }),
|
|
28
28
|
),
|
|
29
|
-
address: Schema.
|
|
29
|
+
address: Schema.tokenAddress(Tokens.tokenExample.address).check(
|
|
30
|
+
z.describe('The TIP-20 token contract address on Tempo.'),
|
|
31
|
+
),
|
|
30
32
|
name: z
|
|
31
33
|
.string()
|
|
32
|
-
.check(
|
|
34
|
+
.check(
|
|
35
|
+
z.describe('The token’s human-readable name.'),
|
|
36
|
+
z.meta({ examples: [Tokens.tokenExample.name] }),
|
|
37
|
+
),
|
|
33
38
|
symbol: z
|
|
34
39
|
.string()
|
|
35
40
|
.check(
|
|
36
41
|
z.describe('The short ticker symbol wallets and apps show for this token.'),
|
|
37
|
-
z.meta({ examples: [
|
|
42
|
+
z.meta({ examples: [Tokens.tokenExample.symbol] }),
|
|
38
43
|
),
|
|
39
44
|
decimals: z
|
|
40
45
|
.number()
|
|
@@ -45,14 +50,12 @@ export namespace schema {
|
|
|
45
50
|
z.describe(
|
|
46
51
|
'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
|
|
47
52
|
),
|
|
48
|
-
z.meta({ examples: [
|
|
53
|
+
z.meta({ examples: [Tokens.tokenExample.decimals] }),
|
|
49
54
|
),
|
|
50
55
|
logoURI: z.optional(z.string()).check(
|
|
51
56
|
z.describe('The curated HTTPS URL for this token’s logo image, when one is set.'),
|
|
52
57
|
z.meta({
|
|
53
|
-
examples: [
|
|
54
|
-
'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
|
|
55
|
-
],
|
|
58
|
+
examples: [Tokens.tokenExample.logoUri],
|
|
56
59
|
}),
|
|
57
60
|
),
|
|
58
61
|
})
|
|
@@ -145,13 +148,12 @@ export function tokenlist() {
|
|
|
145
148
|
version: { major: 1, minor: 0, patch: 2 },
|
|
146
149
|
tokens: [
|
|
147
150
|
{
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
'https://api.tempo.xyz/assets/4217/tokens/0x20c0000000000000000000000000000000000000/logo',
|
|
151
|
+
address: Tokens.tokenExample.address,
|
|
152
|
+
chainId: Tokens.tokenExampleChainId,
|
|
153
|
+
decimals: Tokens.tokenExample.decimals,
|
|
154
|
+
logoURI: Tokens.tokenExample.logoUri,
|
|
155
|
+
name: Tokens.tokenExample.name,
|
|
156
|
+
symbol: Tokens.tokenExample.symbol,
|
|
155
157
|
},
|
|
156
158
|
],
|
|
157
159
|
},
|
|
@@ -239,9 +241,10 @@ async function getTokenLogos(
|
|
|
239
241
|
async (token) =>
|
|
240
242
|
[
|
|
241
243
|
token.address,
|
|
242
|
-
await getTokenLogo(c, {
|
|
243
|
-
|
|
244
|
-
|
|
244
|
+
await Tokens.getTokenLogo(c, {
|
|
245
|
+
address: token.address,
|
|
246
|
+
chainId: options.chainId,
|
|
247
|
+
}).catch(() => undefined),
|
|
245
248
|
] as const,
|
|
246
249
|
),
|
|
247
250
|
)
|
|
@@ -18,6 +18,35 @@ function app(options: TestApp.create.Options = {}) {
|
|
|
18
18
|
|
|
19
19
|
const verifiedTokenCount = 6
|
|
20
20
|
|
|
21
|
+
describe('OpenAPI', () => {
|
|
22
|
+
test('uses coherent token responses and canonical asset URLs', async () => {
|
|
23
|
+
const application = TestApp.create({ auth: false })
|
|
24
|
+
const spec = (await (await application.request('/openapi.json')).json()) as {
|
|
25
|
+
paths: Record<
|
|
26
|
+
string,
|
|
27
|
+
{
|
|
28
|
+
get?: {
|
|
29
|
+
operationId?: string
|
|
30
|
+
responses?: Record<string, { content?: { 'application/json'?: { example?: unknown } } }>
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
>
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
for (const operationId of ['getToken', 'getTokenBySymbol']) {
|
|
37
|
+
const operation = Object.values(spec.paths).find(
|
|
38
|
+
(path) => path.get?.operationId === operationId,
|
|
39
|
+
)
|
|
40
|
+
expect(operation?.get?.responses?.['200']?.content?.['application/json']?.example).toEqual(
|
|
41
|
+
Tokens.tokenExample,
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const assetUrls = JSON.stringify(spec).match(/https:\/\/api\.tempo\.xyz\/assets\/[^"\\]+/g)
|
|
46
|
+
expect(new Set(assetUrls)).toEqual(new Set([Tokens.tokenExample.logoUri]))
|
|
47
|
+
})
|
|
48
|
+
})
|
|
49
|
+
|
|
21
50
|
describe('GET /tokens', () => {
|
|
22
51
|
test.runIf(runtime.mode === 'testnet')(
|
|
23
52
|
'serves a bounded positional page via `page` (indexed mode)',
|
|
@@ -4,6 +4,7 @@ import { type Address, ContractFunctionExecutionError } from 'viem'
|
|
|
4
4
|
import { Abis } from 'viem/tempo'
|
|
5
5
|
import * as z from 'zod/mini'
|
|
6
6
|
|
|
7
|
+
import * as Assets from '../../../Assets.js'
|
|
7
8
|
import type * as App from '../../../App.js'
|
|
8
9
|
import * as Auth from '../../../internal/Auth.js'
|
|
9
10
|
import * as Cache from '../../../internal/Cache.js'
|
|
@@ -20,6 +21,26 @@ import * as Value from '../../../internal/Value.js'
|
|
|
20
21
|
import * as VerifiedTokens from '../../../internal/VerifiedTokens.js'
|
|
21
22
|
import * as Transactions from './transactions.js'
|
|
22
23
|
|
|
24
|
+
/** Mainnet chain id used by the coherent token OpenAPI example. */
|
|
25
|
+
export const tokenExampleChainId = 4217
|
|
26
|
+
|
|
27
|
+
/** Coherent mainnet token metadata used by generated OpenAPI examples. */
|
|
28
|
+
export const tokenExample = {
|
|
29
|
+
address: '0x20c000000000000000000000b9537d11c60e8b50',
|
|
30
|
+
currency: 'USD',
|
|
31
|
+
decimals: 6,
|
|
32
|
+
id: '0x20c000000000000000000000b9537d11c60e8b50',
|
|
33
|
+
logoUri: Assets.url({
|
|
34
|
+
chainId: tokenExampleChainId,
|
|
35
|
+
origin: 'https://api.tempo.xyz',
|
|
36
|
+
path: 'icons/0x20c000000000000000000000b9537d11c60e8b50',
|
|
37
|
+
}),
|
|
38
|
+
name: 'Bridged USDC (Stargate)',
|
|
39
|
+
symbol: 'USDC.e',
|
|
40
|
+
totalSupply: '10850791186630',
|
|
41
|
+
verified: true,
|
|
42
|
+
} as const
|
|
43
|
+
|
|
23
44
|
const tokenCreatedSignature =
|
|
24
45
|
'event TokenCreated(address indexed token, string name, string symbol, string currency, address quoteToken, address admin, bytes32 salt)'
|
|
25
46
|
|
|
@@ -53,7 +74,9 @@ export namespace schema {
|
|
|
53
74
|
/** Path parameters for token metadata requests. */
|
|
54
75
|
export const Params = z
|
|
55
76
|
.object({
|
|
56
|
-
token: Schema.
|
|
77
|
+
token: Schema.tokenAddress(tokenExample.address).check(
|
|
78
|
+
z.describe('The TIP-20 token contract address on Tempo.'),
|
|
79
|
+
),
|
|
57
80
|
})
|
|
58
81
|
.check(z.describe('Path parameters for looking up one token’s metadata.'))
|
|
59
82
|
|
|
@@ -86,7 +109,7 @@ export namespace schema {
|
|
|
86
109
|
/** TIP-20 token metadata returned by token endpoints. */
|
|
87
110
|
export const Response = Schema.describe(
|
|
88
111
|
z.object({
|
|
89
|
-
address: Schema.
|
|
112
|
+
address: Schema.tokenAddress(tokenExample.address).check(
|
|
90
113
|
z.describe('The TIP-20 token contract address on Tempo.'),
|
|
91
114
|
),
|
|
92
115
|
admin: z
|
|
@@ -103,7 +126,7 @@ export namespace schema {
|
|
|
103
126
|
z.describe(
|
|
104
127
|
'The currency label for this token, such as `USD` for USD-denominated stablecoins.',
|
|
105
128
|
),
|
|
106
|
-
z.meta({ examples: [
|
|
129
|
+
z.meta({ examples: [tokenExample.currency] }),
|
|
107
130
|
),
|
|
108
131
|
createdAt: z
|
|
109
132
|
.optional(z.iso.datetime())
|
|
@@ -122,7 +145,7 @@ export namespace schema {
|
|
|
122
145
|
z.describe(
|
|
123
146
|
'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
|
|
124
147
|
),
|
|
125
|
-
z.meta({ examples: [
|
|
148
|
+
z.meta({ examples: [tokenExample.decimals] }),
|
|
126
149
|
),
|
|
127
150
|
holderCount: z
|
|
128
151
|
.optional(z.number().check(z.int(), z.nonnegative()))
|
|
@@ -136,21 +159,19 @@ export namespace schema {
|
|
|
136
159
|
.string()
|
|
137
160
|
.check(
|
|
138
161
|
z.describe('A stable resource ID for this token, equal to its contract address.'),
|
|
139
|
-
z.meta({ examples: [
|
|
162
|
+
z.meta({ examples: [tokenExample.id] }),
|
|
140
163
|
),
|
|
141
164
|
logoUri: z.optional(z.string()).check(
|
|
142
165
|
z.describe('A URL for the token’s logo image, when one is available.'),
|
|
143
166
|
z.meta({
|
|
144
|
-
examples: [
|
|
145
|
-
'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
|
|
146
|
-
],
|
|
167
|
+
examples: [tokenExample.logoUri],
|
|
147
168
|
}),
|
|
148
169
|
),
|
|
149
170
|
name: z
|
|
150
171
|
.string()
|
|
151
172
|
.check(
|
|
152
173
|
z.describe('The token’s human-readable name.'),
|
|
153
|
-
z.meta({ examples: [
|
|
174
|
+
z.meta({ examples: [tokenExample.name] }),
|
|
154
175
|
),
|
|
155
176
|
quoteToken: z
|
|
156
177
|
.optional(Schema.Address)
|
|
@@ -164,7 +185,7 @@ export namespace schema {
|
|
|
164
185
|
.string()
|
|
165
186
|
.check(
|
|
166
187
|
z.describe('The short ticker symbol wallets and apps show for this token.'),
|
|
167
|
-
z.meta({ examples: [
|
|
188
|
+
z.meta({ examples: [tokenExample.symbol] }),
|
|
168
189
|
),
|
|
169
190
|
totalSupply: z
|
|
170
191
|
.optional(z.string().check(z.regex(/^\d+$/)))
|
|
@@ -172,7 +193,7 @@ export namespace schema {
|
|
|
172
193
|
z.describe(
|
|
173
194
|
'The token’s total supply as a decimal string in the smallest unit, so large values keep full precision.',
|
|
174
195
|
),
|
|
175
|
-
z.meta({ examples: [
|
|
196
|
+
z.meta({ examples: [tokenExample.totalSupply] }),
|
|
176
197
|
),
|
|
177
198
|
transferStats: z
|
|
178
199
|
.optional(
|
|
@@ -213,7 +234,7 @@ export namespace schema {
|
|
|
213
234
|
.boolean()
|
|
214
235
|
.check(
|
|
215
236
|
z.describe('Whether this token is in Tempo’s curated verified token list.'),
|
|
216
|
-
z.meta({ examples: [
|
|
237
|
+
z.meta({ examples: [tokenExample.verified] }),
|
|
217
238
|
),
|
|
218
239
|
}),
|
|
219
240
|
'Token metadata for a TIP-20 token, including name, symbol, decimals, supply, and optional indexed details.',
|
|
@@ -624,7 +645,7 @@ export function tokens() {
|
|
|
624
645
|
200,
|
|
625
646
|
)
|
|
626
647
|
} catch (cause) {
|
|
627
|
-
return Response.upstream(c, cause)
|
|
648
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
628
649
|
}
|
|
629
650
|
},
|
|
630
651
|
)
|
|
@@ -653,6 +674,7 @@ export function tokens() {
|
|
|
653
674
|
},
|
|
654
675
|
success: {
|
|
655
676
|
description: 'Metadata for one TIP-20 token.',
|
|
677
|
+
example: tokenExample,
|
|
656
678
|
schema: schema.getToken.Response,
|
|
657
679
|
},
|
|
658
680
|
}),
|
|
@@ -725,6 +747,7 @@ export function tokens() {
|
|
|
725
747
|
},
|
|
726
748
|
success: {
|
|
727
749
|
description: 'Metadata for one TIP-20 token.',
|
|
750
|
+
example: tokenExample,
|
|
728
751
|
schema: schema.getToken.Response,
|
|
729
752
|
},
|
|
730
753
|
}),
|
|
@@ -932,7 +955,7 @@ export function tokens() {
|
|
|
932
955
|
200,
|
|
933
956
|
)
|
|
934
957
|
} catch (cause) {
|
|
935
|
-
return Response.upstream(c, cause)
|
|
958
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
936
959
|
}
|
|
937
960
|
},
|
|
938
961
|
)
|
|
@@ -1051,7 +1074,7 @@ export function tokens() {
|
|
|
1051
1074
|
200,
|
|
1052
1075
|
)
|
|
1053
1076
|
} catch (cause) {
|
|
1054
|
-
return Response.upstream(c, cause)
|
|
1077
|
+
return Response.upstream(c, cause, { page: query.page })
|
|
1055
1078
|
}
|
|
1056
1079
|
},
|
|
1057
1080
|
)
|
|
@@ -1058,16 +1058,16 @@ describe('GET /transfers', () => {
|
|
|
1058
1058
|
expect(empty.data).toEqual([])
|
|
1059
1059
|
})
|
|
1060
1060
|
|
|
1061
|
-
test('
|
|
1061
|
+
test('accepts the largest positional window', async () => {
|
|
1062
1062
|
const client = TestApp.client()
|
|
1063
1063
|
const response = await client.v1.transfers.$get(
|
|
1064
|
-
{ query: { limit: '
|
|
1064
|
+
{ query: { limit: '50', order: 'desc', page: '10' } },
|
|
1065
1065
|
TestApp.auth,
|
|
1066
1066
|
)
|
|
1067
1067
|
const page = await TestApp.json(response, Transfers.schema.getTransfers.Response)
|
|
1068
1068
|
|
|
1069
1069
|
expect(response.status).toBe(200)
|
|
1070
|
-
expect(page.data.length).toBeLessThanOrEqual(
|
|
1070
|
+
expect(page.data.length).toBeLessThanOrEqual(50)
|
|
1071
1071
|
})
|
|
1072
1072
|
})
|
|
1073
1073
|
|
|
@@ -69,14 +69,16 @@ export namespace schema {
|
|
|
69
69
|
/** A transfer token reference with RPC metadata. Inlined to avoid the `transfers`/`tokens` module cycle. */
|
|
70
70
|
export const SourceToken = z
|
|
71
71
|
.object({
|
|
72
|
-
address: Schema.
|
|
72
|
+
address: Schema.tokenAddress(Tokens.tokenExample.address).check(
|
|
73
|
+
z.describe('The TIP-20 token contract address on Tempo.'),
|
|
74
|
+
),
|
|
73
75
|
currency: z
|
|
74
76
|
.string()
|
|
75
77
|
.check(
|
|
76
78
|
z.describe(
|
|
77
79
|
'The currency label for this token, such as `USD` for USD-denominated stablecoins.',
|
|
78
80
|
),
|
|
79
|
-
z.meta({ examples: [
|
|
81
|
+
z.meta({ examples: [Tokens.tokenExample.currency] }),
|
|
80
82
|
),
|
|
81
83
|
decimals: z
|
|
82
84
|
.number()
|
|
@@ -85,24 +87,25 @@ export namespace schema {
|
|
|
85
87
|
z.describe(
|
|
86
88
|
'The number of decimal places the token uses; Tempo stablecoins typically use 6.',
|
|
87
89
|
),
|
|
88
|
-
z.meta({ examples: [
|
|
90
|
+
z.meta({ examples: [Tokens.tokenExample.decimals] }),
|
|
89
91
|
),
|
|
90
92
|
logoUri: z.optional(z.string()).check(
|
|
91
93
|
z.describe('A URL for the token’s logo image, returned with `include=token.logoUri`.'),
|
|
92
94
|
z.meta({
|
|
93
|
-
examples: [
|
|
94
|
-
'https://api.tempo.xyz/data/4217/icons/0x20c0000000000000000000008f5425160ebe5525.svg',
|
|
95
|
-
],
|
|
95
|
+
examples: [Tokens.tokenExample.logoUri],
|
|
96
96
|
}),
|
|
97
97
|
),
|
|
98
98
|
name: z
|
|
99
99
|
.string()
|
|
100
|
-
.check(
|
|
100
|
+
.check(
|
|
101
|
+
z.describe('The token’s human-readable name.'),
|
|
102
|
+
z.meta({ examples: [Tokens.tokenExample.name] }),
|
|
103
|
+
),
|
|
101
104
|
symbol: z
|
|
102
105
|
.string()
|
|
103
106
|
.check(
|
|
104
107
|
z.describe('The short ticker symbol wallets and apps show for this token.'),
|
|
105
|
-
z.meta({ examples: [
|
|
108
|
+
z.meta({ examples: [Tokens.tokenExample.symbol] }),
|
|
106
109
|
),
|
|
107
110
|
verified: z
|
|
108
111
|
.optional(z.boolean())
|
|
@@ -659,7 +662,7 @@ export function transfers(options: transfers.Options = {}) {
|
|
|
659
662
|
} catch (cause) {
|
|
660
663
|
if (cause instanceof Valuation.UnsupportedDenominationError)
|
|
661
664
|
return Response.error(c, { code: 'query_invalid', message: cause.message, status: 400 })
|
|
662
|
-
return Response.upstream(c, cause)
|
|
665
|
+
return Response.upstream(c, cause, { page: options.page })
|
|
663
666
|
}
|
|
664
667
|
},
|
|
665
668
|
)
|