tapimo 0.12.0 → 0.14.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 +11333 -9563
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +39 -3
- package/dist/App.js.map +1 -1
- package/dist/Scope.d.ts +2 -0
- package/dist/Scope.d.ts.map +1 -1
- package/dist/Scope.js +17 -0
- package/dist/Scope.js.map +1 -1
- package/dist/Webhooks.js +2 -2
- package/dist/Webhooks.js.map +1 -1
- package/dist/admin/App.d.ts +1064 -924
- package/dist/admin/App.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.d.ts +80 -0
- package/dist/admin/apps/api-keys.d.ts.map +1 -1
- package/dist/admin/apps/api-keys.js +54 -0
- package/dist/admin/apps/api-keys.js.map +1 -1
- package/dist/admin/apps/earn-vaults.d.ts +63 -15
- package/dist/admin/apps/earn-vaults.d.ts.map +1 -1
- package/dist/admin/apps/earn-vaults.js +2 -1
- package/dist/admin/apps/earn-vaults.js.map +1 -1
- package/dist/admin/apps/organizations.d.ts +92 -3
- package/dist/admin/apps/organizations.d.ts.map +1 -1
- package/dist/admin/apps/organizations.js +69 -7
- package/dist/admin/apps/organizations.js.map +1 -1
- package/dist/admin/apps/verified-tokens.d.ts +7 -7
- 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/Zones.d.ts +28 -28
- package/dist/apps/Zones.js +7 -7
- package/dist/apps/data/App.d.ts +2909 -2523
- package/dist/apps/data/App.d.ts.map +1 -1
- package/dist/apps/data/App.js +26 -21
- package/dist/apps/data/App.js.map +1 -1
- package/dist/apps/data/ZoneSelection.d.ts +8 -8
- package/dist/apps/data/ZoneSelection.d.ts.map +1 -1
- package/dist/apps/data/ZoneSelection.js +1 -1
- package/dist/apps/data/ZoneSelection.js.map +1 -1
- package/dist/apps/data/routes/activities.d.ts +588 -584
- package/dist/apps/data/routes/activities.d.ts.map +1 -1
- package/dist/apps/data/routes/activities.js +1561 -1239
- package/dist/apps/data/routes/activities.js.map +1 -1
- package/dist/apps/data/routes/addresses.d.ts +22 -22
- package/dist/apps/data/routes/balances.d.ts +26 -26
- package/dist/apps/data/routes/balances.d.ts.map +1 -1
- package/dist/apps/data/routes/balances.js +43 -16
- package/dist/apps/data/routes/balances.js.map +1 -1
- package/dist/apps/data/routes/blocks.d.ts +44 -44
- package/dist/apps/data/routes/blocks.d.ts.map +1 -1
- package/dist/apps/data/routes/blocks.js +21 -11
- package/dist/apps/data/routes/blocks.js.map +1 -1
- package/dist/apps/data/routes/coingecko.d.ts +3 -3
- package/dist/apps/data/routes/earn.d.ts +201 -25
- package/dist/apps/data/routes/earn.d.ts.map +1 -1
- package/dist/apps/data/routes/earn.js +434 -75
- package/dist/apps/data/routes/earn.js.map +1 -1
- package/dist/apps/data/routes/exchanges.d.ts +160 -145
- package/dist/apps/data/routes/exchanges.d.ts.map +1 -1
- package/dist/apps/data/routes/exchanges.js +180 -114
- package/dist/apps/data/routes/exchanges.js.map +1 -1
- package/dist/apps/data/routes/fee-amm.d.ts +2 -2
- package/dist/apps/data/routes/fee-amm.d.ts.map +1 -1
- package/dist/apps/data/routes/fee-amm.js +18 -19
- package/dist/apps/data/routes/fee-amm.js.map +1 -1
- package/dist/apps/data/routes/receipts.d.ts +155 -55
- package/dist/apps/data/routes/receipts.d.ts.map +1 -1
- package/dist/apps/data/routes/receipts.js +28 -10
- package/dist/apps/data/routes/receipts.js.map +1 -1
- package/dist/apps/data/routes/tokenlist.d.ts +13 -13
- package/dist/apps/data/routes/tokens.d.ts +5 -5
- package/dist/apps/data/routes/tokens.d.ts.map +1 -1
- package/dist/apps/data/routes/tokens.js +51 -20
- package/dist/apps/data/routes/tokens.js.map +1 -1
- package/dist/apps/data/routes/transactions.d.ts +7 -2
- package/dist/apps/data/routes/transactions.d.ts.map +1 -1
- package/dist/apps/data/routes/transactions.js +37 -17
- 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 +18 -12
- package/dist/apps/data/routes/transfers.js.map +1 -1
- package/dist/apps/data/routes/valuation.d.ts +31 -31
- package/dist/apps/data/routes/valuation.d.ts.map +1 -1
- package/dist/apps/data/routes/valuation.js +12 -7
- package/dist/apps/data/routes/valuation.js.map +1 -1
- package/dist/apps/data/routes/verified-tokens.d.ts +8 -8
- package/dist/apps/data/routes/webhooks.d.ts +816 -113
- package/dist/apps/data/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/data/routes/webhooks.js +47 -5
- package/dist/apps/data/routes/webhooks.js.map +1 -1
- package/dist/apps/data/routes/zones.d.ts +14 -14
- package/dist/apps/data/routes/zones.js +1 -1
- package/dist/apps/funding/App.d.ts +466 -44
- package/dist/apps/funding/App.d.ts.map +1 -1
- package/dist/apps/funding/App.js +1 -1
- package/dist/apps/funding/App.js.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.d.ts +17 -17
- package/dist/apps/funding/routes/deposit-addresses.d.ts.map +1 -1
- package/dist/apps/funding/routes/deposit-addresses.js +17 -12
- package/dist/apps/funding/routes/deposit-addresses.js.map +1 -1
- package/dist/apps/funding/routes/transfers.d.ts +650 -57
- package/dist/apps/funding/routes/transfers.d.ts.map +1 -1
- package/dist/apps/funding/routes/transfers.js +238 -24
- package/dist/apps/funding/routes/transfers.js.map +1 -1
- package/dist/apps/management/App.d.ts +5120 -4152
- package/dist/apps/management/App.d.ts.map +1 -1
- package/dist/apps/management/Billing.d.ts +1 -1
- package/dist/apps/management/Billing.d.ts.map +1 -1
- package/dist/apps/management/Billing.js +17 -1
- package/dist/apps/management/Billing.js.map +1 -1
- package/dist/apps/management/routes/api-keys.d.ts +632 -81
- package/dist/apps/management/routes/api-keys.d.ts.map +1 -1
- package/dist/apps/management/routes/api-keys.js +236 -4
- package/dist/apps/management/routes/api-keys.js.map +1 -1
- package/dist/apps/management/routes/billing.d.ts +76 -76
- package/dist/apps/management/routes/faucet.d.ts +6 -6
- package/dist/apps/management/routes/invitations.d.ts +24 -24
- package/dist/apps/management/routes/invite-links.d.ts +4 -4
- package/dist/apps/management/routes/members.d.ts +16 -16
- package/dist/apps/management/routes/orgs.d.ts +20 -20
- package/dist/apps/management/routes/projects.d.ts +4 -4
- package/dist/apps/management/routes/usage.d.ts +8 -8
- package/dist/apps/management/routes/verified-token-requests.d.ts +17 -17
- package/dist/apps/management/routes/webhooks.d.ts +675 -25
- package/dist/apps/management/routes/webhooks.d.ts.map +1 -1
- package/dist/apps/management/routes/webhooks.js +21 -21
- package/dist/apps/management/routes/webhooks.js.map +1 -1
- package/dist/apps/relay/App.d.ts.map +1 -1
- package/dist/apps/relay/App.js +115 -23
- package/dist/apps/relay/App.js.map +1 -1
- package/dist/apps/relay/Sponsorships.d.ts.map +1 -1
- package/dist/apps/relay/Sponsorships.js +27 -1
- package/dist/apps/relay/Sponsorships.js.map +1 -1
- package/dist/db/Db.d.ts.map +1 -1
- package/dist/db/Db.js +34 -1
- package/dist/db/Db.js.map +1 -1
- package/dist/db/Schema.d.ts +11 -5
- package/dist/db/Schema.d.ts.map +1 -1
- package/dist/db/Schema.js +21 -3
- package/dist/db/Schema.js.map +1 -1
- package/dist/db/tables/fundingCatalog.d.ts +4 -2
- package/dist/db/tables/fundingCatalog.d.ts.map +1 -1
- package/dist/db/tables/fundingCatalog.js +5 -1
- package/dist/db/tables/fundingCatalog.js.map +1 -1
- package/dist/db/tables/fundingTransferTransactions.d.ts +38 -0
- package/dist/db/tables/fundingTransferTransactions.d.ts.map +1 -1
- package/dist/db/tables/fundingTransferTransactions.js +44 -3
- package/dist/db/tables/fundingTransferTransactions.js.map +1 -1
- package/dist/db/tables/fundingTransfers.d.ts +17 -0
- package/dist/db/tables/fundingTransfers.d.ts.map +1 -1
- package/dist/db/tables/fundingTransfers.js +21 -0
- package/dist/db/tables/fundingTransfers.js.map +1 -1
- package/dist/db/tables/organizations.d.ts +24 -0
- package/dist/db/tables/organizations.d.ts.map +1 -1
- package/dist/db/tables/organizations.js +27 -0
- package/dist/db/tables/organizations.js.map +1 -1
- package/dist/db/tables/projects.d.ts +25 -1
- package/dist/db/tables/projects.d.ts.map +1 -1
- package/dist/db/tables/projects.js +26 -0
- package/dist/db/tables/projects.js.map +1 -1
- package/dist/db/tables/sponsoredTransactions.d.ts +44 -0
- package/dist/db/tables/sponsoredTransactions.d.ts.map +1 -1
- package/dist/db/tables/sponsoredTransactions.js +146 -13
- package/dist/db/tables/sponsoredTransactions.js.map +1 -1
- package/dist/db/tables/webhookSubscriptions.d.ts +10 -6
- package/dist/db/tables/webhookSubscriptions.d.ts.map +1 -1
- package/dist/db/tables/webhookSubscriptions.js +9 -6
- package/dist/db/tables/webhookSubscriptions.js.map +1 -1
- package/dist/handlers/internal/utils.d.ts.map +1 -1
- package/dist/handlers/internal/utils.js +9 -0
- package/dist/handlers/internal/utils.js.map +1 -1
- package/dist/internal/Auth.d.ts +3 -1
- package/dist/internal/Auth.d.ts.map +1 -1
- package/dist/internal/Auth.js +6 -3
- package/dist/internal/Auth.js.map +1 -1
- package/dist/internal/EarnVaults.d.ts +3 -3
- package/dist/internal/EarnVaults.js +5 -5
- package/dist/internal/EarnVaults.js.map +1 -1
- package/dist/internal/Fetch.d.ts +23 -0
- package/dist/internal/Fetch.d.ts.map +1 -0
- package/dist/internal/Fetch.js +26 -0
- package/dist/internal/Fetch.js.map +1 -0
- package/dist/internal/Log.d.ts +4 -2
- package/dist/internal/Log.d.ts.map +1 -1
- package/dist/internal/Log.js +16 -3
- package/dist/internal/Log.js.map +1 -1
- package/dist/internal/OpenApi.d.ts +5 -3
- package/dist/internal/OpenApi.d.ts.map +1 -1
- package/dist/internal/OpenApi.js +13 -3
- package/dist/internal/OpenApi.js.map +1 -1
- package/dist/internal/Response.d.ts +1 -1
- package/dist/internal/Response.d.ts.map +1 -1
- package/dist/internal/Schema.d.ts +6 -3
- package/dist/internal/Schema.d.ts.map +1 -1
- package/dist/internal/Schema.js +8 -2
- package/dist/internal/Schema.js.map +1 -1
- package/dist/internal/Store.d.ts +16 -3
- package/dist/internal/Store.d.ts.map +1 -1
- package/dist/internal/Store.js +82 -16
- package/dist/internal/Store.js.map +1 -1
- package/dist/internal/Tidx.d.ts.map +1 -1
- package/dist/internal/Tidx.js +7 -2
- package/dist/internal/Tidx.js.map +1 -1
- package/dist/internal/Timeout.d.ts +36 -0
- package/dist/internal/Timeout.d.ts.map +1 -0
- package/dist/internal/Timeout.js +37 -0
- package/dist/internal/Timeout.js.map +1 -0
- package/dist/internal/Timing.d.ts +9 -0
- package/dist/internal/Timing.d.ts.map +1 -1
- package/dist/internal/Timing.js +7 -0
- package/dist/internal/Timing.js.map +1 -1
- package/dist/internal/Viem.d.ts +16 -1
- package/dist/internal/Viem.d.ts.map +1 -1
- package/dist/internal/Viem.js +12 -2
- package/dist/internal/Viem.js.map +1 -1
- package/dist/internal/WebhookDestination.d.ts.map +1 -1
- package/dist/internal/WebhookDestination.js +3 -0
- package/dist/internal/WebhookDestination.js.map +1 -1
- package/dist/internal/funding/Action.d.ts +9 -0
- package/dist/internal/funding/Action.d.ts.map +1 -1
- package/dist/internal/funding/Action.js +16 -8
- package/dist/internal/funding/Action.js.map +1 -1
- package/dist/internal/funding/Catalog.d.ts +9 -2
- package/dist/internal/funding/Catalog.d.ts.map +1 -1
- package/dist/internal/funding/Catalog.js +19 -8
- package/dist/internal/funding/Catalog.js.map +1 -1
- package/dist/internal/funding/DepositWebhook.d.ts.map +1 -1
- package/dist/internal/funding/DepositWebhook.js +2 -1
- package/dist/internal/funding/DepositWebhook.js.map +1 -1
- package/dist/internal/funding/Evidence.d.ts.map +1 -1
- package/dist/internal/funding/Evidence.js +2 -10
- package/dist/internal/funding/Evidence.js.map +1 -1
- package/dist/internal/funding/Provider.d.ts +108 -13
- package/dist/internal/funding/Provider.d.ts.map +1 -1
- package/dist/internal/funding/Provider.js +34 -8
- package/dist/internal/funding/Provider.js.map +1 -1
- package/dist/internal/funding/SourceObservation.d.ts.map +1 -1
- package/dist/internal/funding/SourceObservation.js +5 -7
- package/dist/internal/funding/SourceObservation.js.map +1 -1
- package/dist/internal/funding/Transfer.d.ts +114 -18
- package/dist/internal/funding/Transfer.d.ts.map +1 -1
- package/dist/internal/funding/Transfer.js +185 -55
- package/dist/internal/funding/Transfer.js.map +1 -1
- package/dist/internal/funding/TransferReconciliation.d.ts +52 -0
- package/dist/internal/funding/TransferReconciliation.d.ts.map +1 -0
- package/dist/internal/funding/TransferReconciliation.js +192 -0
- package/dist/internal/funding/TransferReconciliation.js.map +1 -0
- package/dist/internal/funding/TransferWebhook.d.ts +21 -0
- package/dist/internal/funding/TransferWebhook.d.ts.map +1 -0
- package/dist/internal/funding/TransferWebhook.js +43 -0
- package/dist/internal/funding/TransferWebhook.js.map +1 -0
- 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/relay.d.ts.map +1 -1
- package/dist/internal/funding/providers/relay.js +3 -12
- package/dist/internal/funding/providers/relay.js.map +1 -1
- package/dist/internal/funding/providers/stargate.d.ts +127 -9
- package/dist/internal/funding/providers/stargate.d.ts.map +1 -1
- package/dist/internal/funding/providers/stargate.js +548 -112
- package/dist/internal/funding/providers/stargate.js.map +1 -1
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +1 -0
- package/dist/internal/index.js.map +1 -1
- 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/package.json +2 -2
- package/src/App.test.ts +100 -0
- package/src/App.ts +43 -3
- package/src/Client.test-d.ts +129 -2
- package/src/Scope.test.ts +20 -0
- package/src/Scope.ts +16 -0
- package/src/Webhooks.ts +2 -2
- package/src/admin/apps/api-keys.test.ts +75 -0
- package/src/admin/apps/api-keys.ts +64 -0
- package/src/admin/apps/earn-vaults.test.ts +1 -1
- package/src/admin/apps/earn-vaults.ts +2 -1
- package/src/admin/apps/organizations.test.ts +53 -1
- package/src/admin/apps/organizations.ts +90 -5
- package/src/admin/ui/src/lib/api-keys.ts +19 -0
- package/src/admin/ui/src/lib/organizations.test.ts +112 -1
- package/src/admin/ui/src/lib/organizations.ts +55 -0
- package/src/admin/ui/src/routes/api-keys.tsx +89 -2
- package/src/admin/ui/src/routes/organizations_.$orgId.tsx +116 -0
- package/src/admin/ui.generated.ts +189 -151
- package/src/apps/Zones.test.ts +7 -7
- package/src/apps/Zones.ts +7 -7
- package/src/apps/composition.test.ts +2 -1
- package/src/apps/data/App.test.ts +41 -0
- package/src/apps/data/App.ts +30 -21
- package/src/apps/data/ZoneSelection.test.ts +2 -2
- package/src/apps/data/ZoneSelection.ts +8 -8
- package/src/apps/data/routes/activities.test.ts +1526 -12
- package/src/apps/data/routes/activities.ts +1774 -1356
- package/src/apps/data/routes/balances.ts +133 -97
- package/src/apps/data/routes/blocks.test.ts +533 -0
- package/src/apps/data/routes/blocks.ts +35 -16
- package/src/apps/data/routes/earn.test.ts +373 -16
- package/src/apps/data/routes/earn.ts +548 -79
- package/src/apps/data/routes/earn.zone-access.test.ts +6 -6
- package/src/apps/data/routes/exchanges.test.ts +740 -15
- package/src/apps/data/routes/exchanges.ts +954 -753
- package/src/apps/data/routes/fee-amm.ts +17 -18
- package/src/apps/data/routes/receipts.ts +47 -16
- package/src/apps/data/routes/tokens.test.ts +578 -0
- package/src/apps/data/routes/tokens.ts +283 -225
- package/src/apps/data/routes/transactions.ts +68 -29
- package/src/apps/data/routes/transfers.test.ts +421 -0
- package/src/apps/data/routes/transfers.ts +45 -27
- package/src/apps/data/routes/valuation.ts +94 -78
- package/src/apps/data/routes/webhooks.test.ts +21 -5
- package/src/apps/data/routes/webhooks.ts +63 -8
- package/src/apps/data/routes/zones.test.ts +2 -2
- package/src/apps/data/routes/zones.ts +1 -1
- package/src/apps/funding/App.ts +12 -2
- package/src/apps/funding/routes/deposit-addresses.test.ts +29 -7
- package/src/apps/funding/routes/deposit-addresses.ts +19 -14
- package/src/apps/funding/routes/quotes.test.ts +5 -9
- package/src/apps/funding/routes/transfers.test.ts +901 -23
- package/src/apps/funding/routes/transfers.ts +347 -64
- package/src/apps/management/Billing.ts +18 -5
- package/src/apps/management/routes/api-keys.test.ts +220 -0
- package/src/apps/management/routes/api-keys.ts +280 -3
- package/src/apps/management/routes/webhooks.test.ts +3 -3
- package/src/apps/management/routes/webhooks.ts +24 -25
- package/src/apps/relay/App.test.ts +212 -1
- package/src/apps/relay/App.ts +158 -29
- package/src/apps/relay/Sponsorships.ts +24 -1
- package/src/db/Db.ts +48 -1
- package/src/db/Schema.ts +22 -4
- package/src/db/tables/earnVaults.test.ts +9 -9
- package/src/db/tables/fundingCatalog.test.ts +16 -2
- package/src/db/tables/fundingCatalog.ts +9 -3
- package/src/db/tables/fundingTransferTransactions.test.ts +43 -0
- package/src/db/tables/fundingTransferTransactions.ts +79 -3
- package/src/db/tables/fundingTransfers.test.ts +26 -0
- package/src/db/tables/fundingTransfers.ts +36 -0
- package/src/db/tables/organizations.test.ts +41 -0
- package/src/db/tables/organizations.ts +49 -0
- package/src/db/tables/projects.test.ts +55 -0
- package/src/db/tables/projects.ts +46 -1
- package/src/db/tables/sponsoredTransactions.test.ts +338 -0
- package/src/db/tables/sponsoredTransactions.ts +197 -13
- package/src/db/tables/webhookSubscriptions.ts +18 -11
- package/src/handlers/internal/utils.test.ts +53 -0
- package/src/handlers/internal/utils.ts +15 -0
- package/src/internal/Auth.ts +12 -4
- package/src/internal/EarnVaults.capabilities.test.ts +2 -2
- package/src/internal/EarnVaults.test.ts +1 -1
- package/src/internal/EarnVaults.ts +5 -5
- package/src/internal/Fetch.test.ts +46 -0
- package/src/internal/Fetch.ts +56 -0
- package/src/internal/Log.test-d.ts +2 -0
- package/src/internal/Log.test.ts +21 -0
- package/src/internal/Log.ts +22 -5
- package/src/internal/OpenApi.ts +14 -4
- package/src/internal/Response.ts +1 -1
- package/src/internal/Schema.test.ts +2 -0
- package/src/internal/Schema.ts +12 -2
- package/src/internal/Store.test.ts +178 -0
- package/src/internal/Store.ts +104 -18
- package/src/internal/Tidx.test.ts +2 -1
- package/src/internal/Tidx.ts +7 -2
- package/src/internal/Timeout.test.ts +35 -0
- package/src/internal/Timeout.ts +73 -0
- package/src/internal/Timing.ts +16 -0
- package/src/internal/Viem.ts +39 -3
- package/src/internal/WebhookDestination.ts +3 -0
- package/src/internal/Webhooks.test.ts +45 -0
- package/src/internal/funding/Action.test.ts +41 -1
- package/src/internal/funding/Action.ts +69 -41
- package/src/internal/funding/Catalog.test.ts +34 -0
- package/src/internal/funding/Catalog.ts +28 -11
- package/src/internal/funding/DepositWebhook.ts +2 -1
- package/src/internal/funding/Evidence.ts +2 -13
- package/src/internal/funding/Provider.test.ts +73 -0
- package/src/internal/funding/Provider.ts +125 -28
- package/src/internal/funding/SourceObservation.ts +5 -9
- package/src/internal/funding/Transfer.test.ts +155 -0
- package/src/internal/funding/Transfer.ts +387 -147
- package/src/internal/funding/TransferReconciliation.test.ts +147 -0
- package/src/internal/funding/TransferReconciliation.ts +264 -0
- package/src/internal/funding/TransferWebhook.test.ts +128 -0
- package/src/internal/funding/TransferWebhook.ts +67 -0
- 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 +4 -167
- package/src/internal/funding/providers/relay.test.ts +2 -2
- package/src/internal/funding/providers/relay.ts +3 -15
- package/src/internal/funding/providers/stargate.test.ts +328 -0
- package/src/internal/funding/providers/stargate.ts +807 -135
- package/src/internal/index.test.ts +1 -0
- package/src/internal/index.ts +1 -0
- package/src/internal/webhookDestinations/slack.ts +15 -0
|
@@ -216,10 +216,12 @@ export namespace schema {
|
|
|
216
216
|
/** Executable preparation returned by a funding provider. */
|
|
217
217
|
export const PrepareResult = z.object({
|
|
218
218
|
action: Action.schema.Action,
|
|
219
|
-
correlation: z.
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
219
|
+
correlation: z.optional(
|
|
220
|
+
z.object({
|
|
221
|
+
checkEndpoint: z.optional(z.string()),
|
|
222
|
+
requestId: z.string().check(z.minLength(1)),
|
|
223
|
+
}),
|
|
224
|
+
),
|
|
223
225
|
destinationAmount: PositiveInteger,
|
|
224
226
|
destinationAmountMin: PositiveInteger,
|
|
225
227
|
expiresAt: z.optional(z.iso.datetime()),
|
|
@@ -227,8 +229,10 @@ export namespace schema {
|
|
|
227
229
|
z.object({
|
|
228
230
|
amount: Schema.DecimalString,
|
|
229
231
|
side: z.enum(['destination', 'source']),
|
|
232
|
+
token: z.optional(TokenRef),
|
|
230
233
|
}),
|
|
231
234
|
),
|
|
235
|
+
providerState: z.optional(z.record(z.string(), z.unknown())),
|
|
232
236
|
quality: GetQuoteResult.shape.quality,
|
|
233
237
|
sampledAt: z.iso.datetime(),
|
|
234
238
|
})
|
|
@@ -467,6 +471,51 @@ export declare namespace prepareTransfer {
|
|
|
467
471
|
type ReturnType = z.output<typeof schema.PrepareResult>
|
|
468
472
|
}
|
|
469
473
|
|
|
474
|
+
/** Contract for provider-specific executable action validation. */
|
|
475
|
+
export declare namespace validateTransferAction {
|
|
476
|
+
/** Prepared action and its curated route terms. */
|
|
477
|
+
type Parameters = prepareTransfer.Parameters & {
|
|
478
|
+
/** Executable action returned by the provider. */
|
|
479
|
+
action: Action.Action
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
/** Provider-specific constraints established by validation. */
|
|
483
|
+
type ReturnType = {
|
|
484
|
+
/** Exact native values independently validated against provider calldata. */
|
|
485
|
+
nativeValues?: readonly Action.NativeValue[] | undefined
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
/** Contract for provider-specific source transaction verification. */
|
|
490
|
+
export declare namespace verifySourceTransaction {
|
|
491
|
+
/** Stored transfer terms and submitted source transaction. */
|
|
492
|
+
type Parameters = {
|
|
493
|
+
/** Configured chain that receives the provider delivery. */
|
|
494
|
+
destinationChain: Chain
|
|
495
|
+
/** Private provider state captured while preparing the transfer. */
|
|
496
|
+
providerState?: Transfer.ProviderState | undefined
|
|
497
|
+
/** Current configuration for the stored provider route. */
|
|
498
|
+
routeConfiguration?: core_Catalog.Configuration | undefined
|
|
499
|
+
/** Configured chain containing the submitted transaction. */
|
|
500
|
+
sourceChain: Chain
|
|
501
|
+
/** Submitted transaction reference. */
|
|
502
|
+
transactionHash: string
|
|
503
|
+
/** Stored public transfer terms. */
|
|
504
|
+
transfer: Transfer.Snapshot
|
|
505
|
+
}
|
|
506
|
+
|
|
507
|
+
/** Source transaction verification outcome. */
|
|
508
|
+
type ReturnType =
|
|
509
|
+
| { type: 'invalid' }
|
|
510
|
+
| { type: 'pending' }
|
|
511
|
+
| {
|
|
512
|
+
/** Private provider evidence retained for reconciliation. */
|
|
513
|
+
providerState?: Transfer.ProviderState | undefined
|
|
514
|
+
/** The transaction matches the stored transfer terms. */
|
|
515
|
+
type: 'verified'
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
|
|
470
519
|
/** Contract of the provider `createDepositAddress` method. */
|
|
471
520
|
export declare namespace createDepositAddress {
|
|
472
521
|
/** Input passed to a provider provisioning one reusable deposit address. */
|
|
@@ -683,6 +732,15 @@ export type Provider<id extends string = string> = core_Provider.Provider<id, 'f
|
|
|
683
732
|
input: prepareTransfer.Parameters,
|
|
684
733
|
signal: AbortSignal,
|
|
685
734
|
): Promise<prepareTransfer.ReturnType>
|
|
735
|
+
/** Validates provider-specific action semantics before generic persistence checks. */
|
|
736
|
+
validateTransferAction?(
|
|
737
|
+
input: validateTransferAction.Parameters,
|
|
738
|
+
): validateTransferAction.ReturnType
|
|
739
|
+
/** Verifies a submitted source transaction, when supported. */
|
|
740
|
+
verifySourceTransaction?(
|
|
741
|
+
input: verifySourceTransaction.Parameters,
|
|
742
|
+
signal: AbortSignal,
|
|
743
|
+
): Promise<verifySourceTransaction.ReturnType>
|
|
686
744
|
/** Receives authenticated provider status events, when configured. */
|
|
687
745
|
webhook?: Webhook | undefined
|
|
688
746
|
}
|
|
@@ -734,6 +792,13 @@ export function canObserveDepositAddressRequest(provider: Provider): provider is
|
|
|
734
792
|
return typeof provider.observeDepositAddressRequest === 'function'
|
|
735
793
|
}
|
|
736
794
|
|
|
795
|
+
/** Narrows a funding provider to one that verifies submitted source transactions. */
|
|
796
|
+
export function canVerifySourceTransaction(provider: Provider): provider is Provider & {
|
|
797
|
+
verifySourceTransaction: NonNullable<Provider['verifySourceTransaction']>
|
|
798
|
+
} {
|
|
799
|
+
return typeof provider.verifySourceTransaction === 'function'
|
|
800
|
+
}
|
|
801
|
+
|
|
737
802
|
/** Narrows a funding provider to one with authenticated webhook receipt. */
|
|
738
803
|
export function canReceiveWebhook(provider: Provider): provider is Provider & {
|
|
739
804
|
webhook: Webhook
|
|
@@ -952,6 +1017,7 @@ export function getQuoteCandidates(options: getQuoteCandidates.Options) {
|
|
|
952
1017
|
.filter((entry) => provider === undefined || entry.provider.id === provider.id)
|
|
953
1018
|
.map((entry) =>
|
|
954
1019
|
createQuoteCandidate({
|
|
1020
|
+
configuration: entry.configuration,
|
|
955
1021
|
destinationToken: entry.route.destination,
|
|
956
1022
|
provider: entry.provider,
|
|
957
1023
|
route: entry.route,
|
|
@@ -1124,20 +1190,17 @@ export async function prepareTransfer(
|
|
|
1124
1190
|
candidates.map(async ({ candidate, provider }) => {
|
|
1125
1191
|
const start = performance.now()
|
|
1126
1192
|
try {
|
|
1193
|
+
const parameters = {
|
|
1194
|
+
candidate,
|
|
1195
|
+
method: options.method,
|
|
1196
|
+
mode: options.mode,
|
|
1197
|
+
recipient: options.recipient,
|
|
1198
|
+
sender: options.sender,
|
|
1199
|
+
slippageBps: options.slippageBps,
|
|
1200
|
+
}
|
|
1127
1201
|
const parsed = schema.PrepareResult.safeParse(
|
|
1128
1202
|
await withTimeout(
|
|
1129
|
-
(signal) =>
|
|
1130
|
-
provider.prepareTransfer(
|
|
1131
|
-
{
|
|
1132
|
-
candidate,
|
|
1133
|
-
method: options.method,
|
|
1134
|
-
mode: options.mode,
|
|
1135
|
-
recipient: options.recipient,
|
|
1136
|
-
sender: options.sender,
|
|
1137
|
-
slippageBps: options.slippageBps,
|
|
1138
|
-
},
|
|
1139
|
-
signal,
|
|
1140
|
-
),
|
|
1203
|
+
(signal) => provider.prepareTransfer(parameters, signal),
|
|
1141
1204
|
options.providerTimeoutMs ?? defaultPrepareTimeoutMs,
|
|
1142
1205
|
),
|
|
1143
1206
|
)
|
|
@@ -1160,8 +1223,13 @@ export async function prepareTransfer(
|
|
|
1160
1223
|
}
|
|
1161
1224
|
if (result.action.type === 'evm:calls')
|
|
1162
1225
|
try {
|
|
1226
|
+
const constraints = provider.validateTransferAction?.({
|
|
1227
|
+
...parameters,
|
|
1228
|
+
action: result.action,
|
|
1229
|
+
})
|
|
1163
1230
|
Action.validateEvmCalls({
|
|
1164
1231
|
action: result.action,
|
|
1232
|
+
nativeValues: constraints?.nativeValues,
|
|
1165
1233
|
sourceAmount: candidate.sourceAmount.amount,
|
|
1166
1234
|
sourceTokenAddress: candidate.sourceToken.address,
|
|
1167
1235
|
})
|
|
@@ -1275,7 +1343,14 @@ export function getDepositAddressCandidates(options: getDepositAddressCandidates
|
|
|
1275
1343
|
const provider = options.providers.find((candidate) => candidate.id === entry.providerId)
|
|
1276
1344
|
if (!provider || !canCreateDepositAddress(provider)) return []
|
|
1277
1345
|
return [
|
|
1278
|
-
{
|
|
1346
|
+
{
|
|
1347
|
+
candidate: createDepositAddressCandidate({
|
|
1348
|
+
configuration: entry.configuration,
|
|
1349
|
+
provider,
|
|
1350
|
+
route: entry.route,
|
|
1351
|
+
}),
|
|
1352
|
+
provider,
|
|
1353
|
+
},
|
|
1279
1354
|
]
|
|
1280
1355
|
})
|
|
1281
1356
|
}
|
|
@@ -1308,6 +1383,9 @@ export function getPrepareCandidates(options: getPrepareCandidates.Options) {
|
|
|
1308
1383
|
if (!amount.success) throw new InvalidAmountError()
|
|
1309
1384
|
const sourceChain = resolveSourceChain(options.sourceChain, options.catalog)
|
|
1310
1385
|
const destinationChainId = `eip155:${options.destinationChainId}`
|
|
1386
|
+
const selectedProvider = options.provider
|
|
1387
|
+
? resolveProvider(options.provider, options.providers)
|
|
1388
|
+
: undefined
|
|
1311
1389
|
|
|
1312
1390
|
return options.catalog.routes.flatMap((entry) => {
|
|
1313
1391
|
if (entry.route.source.chain.id !== sourceChain.id) return []
|
|
@@ -1315,11 +1393,13 @@ export function getPrepareCandidates(options: getPrepareCandidates.Options) {
|
|
|
1315
1393
|
if (!matchesToken(entry.route.source, options.sourceToken)) return []
|
|
1316
1394
|
if (!matchesToken(entry.route.destination, options.destinationToken)) return []
|
|
1317
1395
|
if (!entry.capabilities?.transfer?.modes.includes(options.mode)) return []
|
|
1318
|
-
const provider =
|
|
1319
|
-
|
|
1396
|
+
const provider =
|
|
1397
|
+
selectedProvider ?? options.providers.find((candidate) => candidate.id === entry.providerId)
|
|
1398
|
+
if (!provider || provider.id !== entry.providerId || !canPrepareTransfer(provider)) return []
|
|
1320
1399
|
return [
|
|
1321
1400
|
{
|
|
1322
1401
|
candidate: createQuoteCandidate({
|
|
1402
|
+
configuration: entry.configuration,
|
|
1323
1403
|
destinationToken: entry.route.destination,
|
|
1324
1404
|
provider,
|
|
1325
1405
|
route: entry.route,
|
|
@@ -1349,6 +1429,8 @@ export declare namespace getPrepareCandidates {
|
|
|
1349
1429
|
method: Transfer.Method
|
|
1350
1430
|
/** Amount mode the caller selected. */
|
|
1351
1431
|
mode: Transfer.Mode
|
|
1432
|
+
/** Funding provider ID selected by the caller. */
|
|
1433
|
+
provider?: string | undefined
|
|
1352
1434
|
/** Funding providers considered by the request. */
|
|
1353
1435
|
providers: readonly Provider[]
|
|
1354
1436
|
/** Source amount in base units. */
|
|
@@ -1572,8 +1654,9 @@ function chainRef(chain: Chain): ChainRef {
|
|
|
1572
1654
|
})
|
|
1573
1655
|
}
|
|
1574
1656
|
|
|
1575
|
-
function createDepositAddressCandidate(options:
|
|
1657
|
+
function createDepositAddressCandidate(options: createDepositAddressCandidate.Options) {
|
|
1576
1658
|
return {
|
|
1659
|
+
...(options.configuration ? { configuration: options.configuration } : {}),
|
|
1577
1660
|
destinationChain: chainRef(options.route.destination.chain),
|
|
1578
1661
|
destinationToken: tokenRef(options.route.destination),
|
|
1579
1662
|
provider: schema.ProviderRef.parse(options.provider),
|
|
@@ -1583,14 +1666,17 @@ function createDepositAddressCandidate(options: { provider: Provider; route: cor
|
|
|
1583
1666
|
} as const
|
|
1584
1667
|
}
|
|
1585
1668
|
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
}
|
|
1669
|
+
declare namespace createDepositAddressCandidate {
|
|
1670
|
+
type Options = {
|
|
1671
|
+
configuration?: core_Catalog.Configuration | undefined
|
|
1672
|
+
provider: Provider
|
|
1673
|
+
route: core_Route.Route
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
function createQuoteCandidate(options: createQuoteCandidate.Options) {
|
|
1593
1678
|
return {
|
|
1679
|
+
...(options.configuration ? { configuration: options.configuration } : {}),
|
|
1594
1680
|
destinationChain: chainRef(options.destinationToken.chain),
|
|
1595
1681
|
destinationToken: tokenRef(options.destinationToken),
|
|
1596
1682
|
id: [
|
|
@@ -1608,6 +1694,17 @@ function createQuoteCandidate(options: {
|
|
|
1608
1694
|
} as const
|
|
1609
1695
|
}
|
|
1610
1696
|
|
|
1697
|
+
declare namespace createQuoteCandidate {
|
|
1698
|
+
type Options = {
|
|
1699
|
+
configuration?: core_Catalog.Configuration | undefined
|
|
1700
|
+
destinationToken: Token
|
|
1701
|
+
provider: Provider
|
|
1702
|
+
route: core_Route.Route
|
|
1703
|
+
sourceAmount: ReturnType<typeof resolveSourceAmount>
|
|
1704
|
+
sourceToken: Token
|
|
1705
|
+
}
|
|
1706
|
+
}
|
|
1707
|
+
|
|
1611
1708
|
function normalizeInput(value: string) {
|
|
1612
1709
|
return value.trim().toLowerCase()
|
|
1613
1710
|
}
|
|
@@ -1807,7 +1904,7 @@ function resolveSourceChain(input: string, catalog: core_Catalog.Snapshot) {
|
|
|
1807
1904
|
|
|
1808
1905
|
function getRoutes(catalog: core_Catalog.Snapshot, providers: readonly Provider[]) {
|
|
1809
1906
|
return providers.flatMap((provider) =>
|
|
1810
|
-
(catalog.routesByProvider.get(provider.id) ?? []).map((
|
|
1907
|
+
(catalog.routesByProvider.get(provider.id) ?? []).map((entry) => ({ ...entry, provider })),
|
|
1811
1908
|
)
|
|
1812
1909
|
}
|
|
1813
1910
|
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { AbiEvent, Address
|
|
2
|
-
import { createClient, custom, fallback } from 'viem'
|
|
1
|
+
import { AbiEvent, Address } from 'ox'
|
|
3
2
|
import { getBlockNumber, getLogs } from 'viem/actions'
|
|
4
3
|
|
|
5
4
|
import type * as Db from '../../db/Db.js'
|
|
6
5
|
import * as FundingDepositAddresses from '../../db/tables/fundingDepositAddresses.js'
|
|
7
6
|
import * as FundingDeposits from '../../db/tables/fundingDeposits.js'
|
|
7
|
+
import * as Viem from '../Viem.js'
|
|
8
8
|
import * as Value from '../Value.js'
|
|
9
9
|
import * as Deposit from './Deposit.js'
|
|
10
10
|
|
|
@@ -52,13 +52,9 @@ export async function scan(options: scan.Options): Promise<scan.Result> {
|
|
|
52
52
|
throw new ConfigurationError('source token address')
|
|
53
53
|
if (options.rpcUrls.length === 0) throw new ConfigurationError('source RPC URL')
|
|
54
54
|
|
|
55
|
-
const client =
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const transport = RpcTransport.fromHttp(url, { fetchFn: options.fetch ?? globalThis.fetch })
|
|
59
|
-
return custom(transport, { retryCount: 0 })
|
|
60
|
-
}),
|
|
61
|
-
),
|
|
55
|
+
const client = Viem.createEvmClient({
|
|
56
|
+
fetch: options.fetch ?? globalThis.fetch,
|
|
57
|
+
urls: options.rpcUrls,
|
|
62
58
|
})
|
|
63
59
|
const head = await getBlockNumber(client, { cacheTime: 0 })
|
|
64
60
|
const confirmations = BigInt(options.confirmations ?? defaultConfirmations)
|
|
@@ -42,6 +42,7 @@ describe('canTransition', () => {
|
|
|
42
42
|
"completed": [],
|
|
43
43
|
"expired": [],
|
|
44
44
|
"processing": [
|
|
45
|
+
"awaiting-source",
|
|
45
46
|
"refunding",
|
|
46
47
|
"completed",
|
|
47
48
|
"action-required",
|
|
@@ -129,6 +130,160 @@ describe('create', () => {
|
|
|
129
130
|
})
|
|
130
131
|
})
|
|
131
132
|
|
|
133
|
+
describe('registerSourceTransaction', () => {
|
|
134
|
+
const transactionHash = `0x${'a2'.repeat(32)}`
|
|
135
|
+
|
|
136
|
+
test('atomically assigns source evidence and starts reconciliation', async () => {
|
|
137
|
+
const record = await Transfer.create(
|
|
138
|
+
db,
|
|
139
|
+
createInput({
|
|
140
|
+
providerState: {
|
|
141
|
+
routeConfiguration: {
|
|
142
|
+
destinationPoolAddress: `0x${'cc'.repeat(20)}`,
|
|
143
|
+
poolAddress: `0x${'dd'.repeat(20)}`,
|
|
144
|
+
sourceEid: 30_184,
|
|
145
|
+
},
|
|
146
|
+
},
|
|
147
|
+
snapshot: TestFunding.transferSnapshot({ provider: { id: 'stargate', name: 'Stargate' } }),
|
|
148
|
+
}),
|
|
149
|
+
)
|
|
150
|
+
vi.setSystemTime(new Date('2026-01-01T00:00:10.000Z'))
|
|
151
|
+
const result = await Transfer.registerSourceTransaction(db, {
|
|
152
|
+
chainId: 'eip155:8453',
|
|
153
|
+
id: record.id,
|
|
154
|
+
providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
|
|
155
|
+
transactionHash: `0x${'a1'.repeat(32)}`,
|
|
156
|
+
})
|
|
157
|
+
expect(result.type).toBe('registered')
|
|
158
|
+
if (result.type !== 'registered') return
|
|
159
|
+
expect({
|
|
160
|
+
providerState: result.record.providerState,
|
|
161
|
+
sourceTransactionHashes: result.record.snapshot.sourceTransactionHashes,
|
|
162
|
+
status: result.record.status,
|
|
163
|
+
version: result.record.version,
|
|
164
|
+
}).toMatchInlineSnapshot(`
|
|
165
|
+
{
|
|
166
|
+
"providerState": {
|
|
167
|
+
"routeConfiguration": {
|
|
168
|
+
"destinationPoolAddress": "0xcccccccccccccccccccccccccccccccccccccccc",
|
|
169
|
+
"poolAddress": "0xdddddddddddddddddddddddddddddddddddddddd",
|
|
170
|
+
"sourceEid": 30184,
|
|
171
|
+
},
|
|
172
|
+
"stargate": {
|
|
173
|
+
"guid": "0xbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
|
|
174
|
+
"sourceEid": 30184,
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
"sourceTransactionHashes": [
|
|
178
|
+
"0xa1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a1",
|
|
179
|
+
],
|
|
180
|
+
"status": "processing",
|
|
181
|
+
"version": 2,
|
|
182
|
+
}
|
|
183
|
+
`)
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
test('replays the same assignment and rejects reuse by another transfer', async () => {
|
|
187
|
+
const first = await Transfer.create(db, createInput())
|
|
188
|
+
const second = await Transfer.create(db, createInput())
|
|
189
|
+
const options = {
|
|
190
|
+
chainId: 'eip155:8453',
|
|
191
|
+
id: first.id,
|
|
192
|
+
providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
|
|
193
|
+
transactionHash,
|
|
194
|
+
}
|
|
195
|
+
await Transfer.registerSourceTransaction(db, options)
|
|
196
|
+
const replayed = await Transfer.registerSourceTransaction(db, options)
|
|
197
|
+
const conflict = await Transfer.registerSourceTransaction(db, { ...options, id: second.id })
|
|
198
|
+
expect({
|
|
199
|
+
conflict: conflict.type,
|
|
200
|
+
replayed: replayed.type,
|
|
201
|
+
replayedVersion: replayed.type === 'replayed' ? replayed.record.version : undefined,
|
|
202
|
+
}).toEqual({ conflict: 'conflict', replayed: 'replayed', replayedVersion: 2 })
|
|
203
|
+
})
|
|
204
|
+
})
|
|
205
|
+
|
|
206
|
+
describe('reopenSourceTransaction', () => {
|
|
207
|
+
test('removes invalidated source evidence and accepts a replacement', async () => {
|
|
208
|
+
const record = await Transfer.create(db, createInput())
|
|
209
|
+
const transactionHash = `0x${'a4'.repeat(32)}`
|
|
210
|
+
await Transfer.registerSourceTransaction(db, {
|
|
211
|
+
chainId: 'eip155:8453',
|
|
212
|
+
id: record.id,
|
|
213
|
+
providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
|
|
214
|
+
transactionHash,
|
|
215
|
+
})
|
|
216
|
+
|
|
217
|
+
const reopened = await Transfer.reopenSourceTransaction(db, {
|
|
218
|
+
chainId: 'eip155:8453',
|
|
219
|
+
id: record.id,
|
|
220
|
+
providerState: { routeConfiguration: { poolAddress: `0x${'cc'.repeat(20)}` } },
|
|
221
|
+
transactionHash: transactionHash.toUpperCase(),
|
|
222
|
+
})
|
|
223
|
+
expect(reopened.type).toBe('reopened')
|
|
224
|
+
if (reopened.type !== 'reopened') return
|
|
225
|
+
expect({
|
|
226
|
+
providerState: reopened.record.providerState,
|
|
227
|
+
sourceTransactionHashes: reopened.record.snapshot.sourceTransactionHashes,
|
|
228
|
+
status: reopened.record.status,
|
|
229
|
+
version: reopened.record.version,
|
|
230
|
+
}).toEqual({
|
|
231
|
+
providerState: { routeConfiguration: { poolAddress: `0x${'cc'.repeat(20)}` } },
|
|
232
|
+
sourceTransactionHashes: undefined,
|
|
233
|
+
status: 'awaiting-source',
|
|
234
|
+
version: 3,
|
|
235
|
+
})
|
|
236
|
+
|
|
237
|
+
const replacement = await Transfer.registerSourceTransaction(db, {
|
|
238
|
+
chainId: 'eip155:8453',
|
|
239
|
+
id: record.id,
|
|
240
|
+
providerState: { stargate: { guid: `0x${'dd'.repeat(32)}`, sourceEid: 30_184 } },
|
|
241
|
+
transactionHash: `0x${'a5'.repeat(32)}`,
|
|
242
|
+
})
|
|
243
|
+
expect(replacement.type).toBe('registered')
|
|
244
|
+
})
|
|
245
|
+
})
|
|
246
|
+
|
|
247
|
+
describe('complete', () => {
|
|
248
|
+
test('records verified destination evidence and completes once', async () => {
|
|
249
|
+
const record = await Transfer.create(db, createInput())
|
|
250
|
+
await Transfer.registerSourceTransaction(db, {
|
|
251
|
+
chainId: 'eip155:8453',
|
|
252
|
+
id: record.id,
|
|
253
|
+
providerState: { stargate: { guid: `0x${'bb'.repeat(32)}`, sourceEid: 30_184 } },
|
|
254
|
+
transactionHash: `0x${'a3'.repeat(32)}`,
|
|
255
|
+
})
|
|
256
|
+
const options = {
|
|
257
|
+
chainId: 'eip155:4217',
|
|
258
|
+
destinationAmount: TestFunding.transferSnapshot().destinationAmount!,
|
|
259
|
+
id: record.id,
|
|
260
|
+
transactionHash: `0x${'cc'.repeat(32)}`,
|
|
261
|
+
}
|
|
262
|
+
const completed = await Transfer.complete(db, options)
|
|
263
|
+
const replayed = await Transfer.complete(db, options)
|
|
264
|
+
expect({
|
|
265
|
+
completed: completed.type,
|
|
266
|
+
destinationTransactionHashes:
|
|
267
|
+
completed.type === 'completed'
|
|
268
|
+
? completed.record.snapshot.destinationTransactionHashes
|
|
269
|
+
: undefined,
|
|
270
|
+
replayed: replayed.type,
|
|
271
|
+
status: completed.type === 'completed' ? completed.record.status : undefined,
|
|
272
|
+
version: completed.type === 'completed' ? completed.record.version : undefined,
|
|
273
|
+
}).toMatchInlineSnapshot(`
|
|
274
|
+
{
|
|
275
|
+
"completed": "completed",
|
|
276
|
+
"destinationTransactionHashes": [
|
|
277
|
+
"0xcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc",
|
|
278
|
+
],
|
|
279
|
+
"replayed": "replayed",
|
|
280
|
+
"status": "completed",
|
|
281
|
+
"version": 3,
|
|
282
|
+
}
|
|
283
|
+
`)
|
|
284
|
+
})
|
|
285
|
+
})
|
|
286
|
+
|
|
132
287
|
describe('transition', () => {
|
|
133
288
|
test('applies a guarded status change and appends an event', async () => {
|
|
134
289
|
const record = await Transfer.create(db, createInput())
|