/** @module-tag localnet */ import { Hash, Hex } from 'ox' import { parseEventLogs } from 'viem' import { waitForTransactionReceipt } from 'viem/actions' import { Abis, Actions, Addresses } from 'viem/tempo' import * as FundingCatalog from '../../db/tables/fundingCatalog.js' import * as FundingDeposits from '../../db/tables/fundingDeposits.js' import * as TestApp from '../../../test/App.js' import * as Runtime from '../../../test/runtime.js' import * as TestTempo from '../../../test/Tempo.js' import type * as Viem from '../Viem.js' import * as Chain from './Chain.js' import * as DepositAddress from './DepositAddress.js' import * as Evidence from './Evidence.js' import * as Reconciliation from './Reconciliation.js' import * as Subsidy from './Subsidy.js' const runtime = Runtime.get() const chain = { addressFormat: 'hex', id: `eip155:${runtime.chainId}`, kind: 'evm', name: 'Tempo Localnet', } as const describe.skipIf(runtime.mode !== 'localnet')('reconcileRequest', () => { test('settles an underfilled deposit through the native DEX', async () => { // Vitest retries reuse module state, so each attempt needs a fresh database. const db = TestApp.database() const destinationTokenAddress = runtime.fixtures?.crossTokenTransfer?.destinationToken if (!destinationTokenAddress) throw new Error('Expected a seeded local DEX pair.') const rpcUrl = runtime.rpcUrl if (!rpcUrl) throw new Error('Expected a local Tempo RPC URL.') const depositAccount = TestTempo.accounts[5]! const providerAccount = TestTempo.accounts[0]! const recipient = TestTempo.accounts[7]! const sourceAccount = TestTempo.accounts[4]! const subsidyAccount = TestTempo.accounts[6]! const client = TestTempo.getClient() const destinationToken = { address: destinationTokenAddress, currency: 'USD', decimals: 6, name: 'Local Activity USD', standard: 'TIP-20', symbol: 'LAUSD', tokenKey: `${chain.id}/erc20:${destinationTokenAddress}`, verified: true, } as const const sourceToken = { address: Addresses.pathUsd, currency: 'USD', decimals: 6, name: 'pathUSD', standard: 'TIP-20', symbol: 'pathUSD', tokenKey: `${chain.id}/erc20:${Addresses.pathUsd}`, verified: true, } as const await Actions.faucet.fundSync(client, { account: sourceAccount, timeout: 60_000 }) await Actions.faucet.fundSync(client, { account: subsidyAccount, timeout: 60_000 }) const [sourceReceipt, destinationReceipt] = await Promise.all([ Actions.token.transferSync(TestTempo.getClient({ account: sourceAccount }), { amount: 1_000_000n, to: depositAccount.address, token: sourceToken.address, }), Actions.token.transferSync(TestTempo.getClient({ account: providerAccount }), { amount: 950_000n, to: recipient.address, token: destinationToken.address, }), ]) await FundingCatalog.publish(db, { chainTokens: [], chains: [ { aliases: [], id: chain.id as Chain.Id, name: chain.name, parentChainId: null, rpcUrls: [rpcUrl], slug: 'tempo-localnet', }, ], routes: [], tokens: [], }) const address = await DepositAddress.create(db, { apiKeyId: 'key_local_subsidy', deliveryStrategy: 'provider', environment: 'production', orgId: 'org_local_subsidy', providerOutputToken: destinationToken, snapshot: { address: depositAccount.address, destinationChain: chain, destinationToken, provider: { id: 'local', name: 'Local' }, recipient: recipient.address, refundAddress: sourceAccount.address, sourceChain: chain, sourceToken, subsidize: true, }, }) const verifyTransfers = Evidence.createVerifier({ confirmations: { [chain.id]: 1 }, db, defaultChainId: runtime.chainId as Viem.ChainId, }) const settler = Subsidy.create({ account: subsidyAccount, getClient: TestTempo.readClient(), policy: { maxAmount: '10' }, }) const request = { createdAt: new Date().toISOString(), destinationTransactionHashes: [destinationReceipt.receipt.transactionHash], id: 'local-deposit-request', refundTransactionHashes: [], sourceTransactionHashes: [sourceReceipt.receipt.transactionHash], status: 'success', updatedAt: new Date().toISOString(), } const incompleteRequest = { ...request, destinationTransactionHashes: [ ...request.destinationTransactionHashes, `0x${'cc'.repeat(32)}`, ], } const first = await Reconciliation.reconcileRequest(db, { address, request: incompleteRequest, subsidies: settler, verifyTransfers, }) const [awaitingEvidence] = await FundingDeposits.listByAddress( db, { environment: 'production', orgId: 'org_local_subsidy' }, address.id, { limit: 1 }, ) const second = await Reconciliation.reconcileRequest(db, { address, request, subsidies: settler, verifyTransfers, }) const [pending] = await FundingDeposits.listByAddress( db, { environment: 'production', orgId: 'org_local_subsidy' }, address.id, { limit: 1 }, ) if (!pending?.settlementTransactionHash) throw new Error('Expected a persisted subsidy transaction.') const settlementReceipt = await waitForTransactionReceipt(client, { hash: pending.settlementTransactionHash as Hex.Hex, }) const third = await Reconciliation.reconcileRequest(db, { address, request, subsidies: settler, verifyTransfers, }) const [completed] = await FundingDeposits.listByAddress( db, { environment: 'production', orgId: 'org_local_subsidy' }, address.id, { limit: 1 }, ) const memo = parseEventLogs({ abi: Abis.tip20, eventName: 'TransferWithMemo', logs: settlementReceipt.logs, strict: true, })[0]?.args.memo expect(awaitingEvidence).toMatchInlineSnapshot( { createdAt: expect.any(String), depositAddressId: expect.any(String), id: expect.any(String), providerOutputToken: { address: expect.any(String), tokenKey: expect.any(String), }, providerTransactionHashes: [expect.any(String), expect.any(String)], snapshot: { depositAddressId: expect.any(String), destinationToken: { address: expect.any(String), tokenKey: expect.any(String), }, destinationTransactionHashes: [expect.any(String)], recipient: expect.any(String), refundAddress: expect.any(String), sender: expect.any(String), sourceTransactionHashes: [expect.any(String)], }, sourceTransactionHash: expect.any(String), sourceTransferIndex: expect.any(Number), updatedAt: expect.any(String), }, ` { "createdAt": Any, "depositAddressId": Any, "detectionTrigger": "poll", "environment": "production", "id": Any, "orgId": "org_local_subsidy", "pollObservedAt": null, "projectId": null, "providerOutputAmount": { "baseUnits": "950000", "currency": "USD", "decimals": 6, "formatted": "0.95", }, "providerOutputToken": { "address": Any, "currency": "USD", "decimals": 6, "name": "Local Activity USD", "standard": "TIP-20", "symbol": "LAUSD", "tokenKey": Any, "verified": true, }, "providerRequestId": "local-deposit-request", "providerRequestIds": [ "local-deposit-request", ], "providerState": null, "providerTransactionHashes": [ Any, Any, ], "providerTransferIndex": 0, "retryState": null, "settlementTransaction": null, "settlementTransactionHash": null, "snapshot": { "depositAddressId": Any, "destinationAmount": { "baseUnits": "950000", "currency": "USD", "decimals": 6, "formatted": "0.95", }, "destinationAmountRequired": { "baseUnits": "1000000", "currency": "USD", "decimals": 6, "formatted": "1", }, "destinationChain": { "addressFormat": "hex", "id": "eip155:1337", "kind": "evm", "name": "Tempo Localnet", }, "destinationToken": { "address": Any, "currency": "USD", "decimals": 6, "name": "Local Activity USD", "standard": "TIP-20", "symbol": "LAUSD", "tokenKey": Any, "verified": true, }, "destinationTransactionHashes": [ Any, ], "provider": { "id": "local", "name": "Local", }, "recipient": Any, "refundAddress": Any, "sender": Any, "sourceAmount": { "baseUnits": "1000000", "currency": "USD", "decimals": 6, "formatted": "1", }, "sourceChain": { "addressFormat": "hex", "id": "eip155:1337", "kind": "evm", "name": "Tempo Localnet", }, "sourceToken": { "address": "0x20c0000000000000000000000000000000000000", "currency": "USD", "decimals": 6, "name": "pathUSD", "standard": "TIP-20", "symbol": "pathUSD", "tokenKey": "eip155:1337/erc20:0x20c0000000000000000000000000000000000000", "verified": true, }, "sourceTransactionHashes": [ Any, ], }, "sourceChainId": "eip155:1337", "sourceTransactionHash": Any, "sourceTransferIndex": Any, "status": "bridging", "statusReason": null, "subsidyAmount": null, "tempoGasPaid": null, "updatedAt": Any, "version": 3, "webhookReceivedAt": null, } `, ) expect({ completed, first, memoMatchesDeposit: completed !== undefined && memo !== undefined && Hex.isEqual(memo, Hash.keccak256(Hex.fromString(completed.id))), second, third, }).toMatchInlineSnapshot( { completed: { createdAt: expect.any(String), depositAddressId: expect.any(String), id: expect.any(String), providerOutputToken: { address: expect.any(String), tokenKey: expect.any(String), }, providerTransactionHashes: [expect.any(String), expect.any(String)], settlementTransaction: expect.any(String), settlementTransactionHash: expect.any(String), snapshot: { depositAddressId: expect.any(String), destinationToken: { address: expect.any(String), tokenKey: expect.any(String), }, destinationTransactionHashes: [expect.any(String), expect.any(String)], recipient: expect.any(String), refundAddress: expect.any(String), sender: expect.any(String), sourceTransactionHashes: [expect.any(String)], }, sourceTransactionHash: expect.any(String), sourceTransferIndex: expect.any(Number), tempoGasPaid: expect.any(String), updatedAt: expect.any(String), }, }, ` { "completed": { "createdAt": Any, "depositAddressId": Any, "detectionTrigger": "poll", "environment": "production", "id": Any, "orgId": "org_local_subsidy", "pollObservedAt": null, "projectId": null, "providerOutputAmount": { "baseUnits": "950000", "currency": "USD", "decimals": 6, "formatted": "0.95", }, "providerOutputToken": { "address": Any, "currency": "USD", "decimals": 6, "name": "Local Activity USD", "standard": "TIP-20", "symbol": "LAUSD", "tokenKey": Any, "verified": true, }, "providerRequestId": "local-deposit-request", "providerRequestIds": [ "local-deposit-request", ], "providerState": null, "providerTransactionHashes": [ Any, Any, ], "providerTransferIndex": 0, "retryState": null, "settlementTransaction": Any, "settlementTransactionHash": Any, "snapshot": { "depositAddressId": Any, "destinationAmount": { "baseUnits": "1000000", "currency": "USD", "decimals": 6, "formatted": "1", }, "destinationAmountRequired": { "baseUnits": "1000000", "currency": "USD", "decimals": 6, "formatted": "1", }, "destinationChain": { "addressFormat": "hex", "id": "eip155:1337", "kind": "evm", "name": "Tempo Localnet", }, "destinationToken": { "address": Any, "currency": "USD", "decimals": 6, "name": "Local Activity USD", "standard": "TIP-20", "symbol": "LAUSD", "tokenKey": Any, "verified": true, }, "destinationTransactionHashes": [ Any, Any, ], "provider": { "id": "local", "name": "Local", }, "recipient": Any, "refundAddress": Any, "sender": Any, "sourceAmount": { "baseUnits": "1000000", "currency": "USD", "decimals": 6, "formatted": "1", }, "sourceChain": { "addressFormat": "hex", "id": "eip155:1337", "kind": "evm", "name": "Tempo Localnet", }, "sourceToken": { "address": "0x20c0000000000000000000000000000000000000", "currency": "USD", "decimals": 6, "name": "pathUSD", "standard": "TIP-20", "symbol": "pathUSD", "tokenKey": "eip155:1337/erc20:0x20c0000000000000000000000000000000000000", "verified": true, }, "sourceTransactionHashes": [ Any, ], }, "sourceChainId": "eip155:1337", "sourceTransactionHash": Any, "sourceTransferIndex": Any, "status": "completed", "statusReason": null, "subsidyAmount": { "baseUnits": "50000", "currency": "USD", "decimals": 6, "formatted": "0.05", }, "tempoGasPaid": Any, "updatedAt": Any, "version": 7, "webhookReceivedAt": null, }, "first": { "created": 1, "terminal": false, "updated": 1, }, "memoMatchesDeposit": true, "second": { "created": 0, "followUp": "settlement", "terminal": false, "updated": 1, }, "third": { "created": 0, "terminal": true, "updated": 1, }, } `, ) }) })