import {describe, it} from 'node:test' import assert from 'node:assert' import {ethers} from 'ethers' describe('Token Approval Functionality', () => { // Define a mock for the Privy client const mockPrivyClient = { walletApi: { ethereum: { sendTransaction: async (params: any) => { // Verify parameters assert.equal(params.address, 'test-address') assert.equal(params.chainType, 'ethereum') assert.equal(params.caip2, 'eip155:42161') assert.ok(params.transaction.data.startsWith('0x095ea7b3'), 'Data should be the approve function signature') // Return mock transaction hash return { hash: 'mock-tx-hash' } } } } } it('should encode approval data correctly', () => { // Create contract interface for ERC20 token const tokenABI = ["function approve(address spender, uint256 amount) public returns (bool)"] const contractInterface = new ethers.Interface(tokenABI) // Set up parameters const spenderAddress = '0xTestSpender' const amount = 100 const decimals = 8 // Encode with specific amount const approveAmount = ethers.parseUnits(amount.toString(), decimals) const data = contractInterface.encodeFunctionData("approve", [spenderAddress, approveAmount]) // Verify the data starts with the approve function selector assert.ok(data.startsWith('0x095ea7b3'), 'Should start with the approve function selector') // Test with max amount const maxData = contractInterface.encodeFunctionData("approve", [spenderAddress, ethers.MaxUint256]) assert.ok(maxData.startsWith('0x095ea7b3'), 'Should start with the approve function selector') }) it('should format token data correctly for different tickers', () => { // Test a few mappings similar to getTokenDataFromTicker const testCases = [ { ticker: 'BTC', expected: { address: '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f', decimals: 8 } }, { ticker: 'ETH', expected: { address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', decimals: 18 } } ] for (const testCase of testCases) { let result = { address: '', decimals: 0 } // Simple implementation of the ticker mapping logic if (testCase.ticker === 'BTC') { result = { address: '0x2f2a2543B76A4166549F7aaB2e75Bef0aefC5B0f', decimals: 8 } } else if (testCase.ticker === 'ETH') { result = { address: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1', decimals: 18 } } assert.deepEqual(result, testCase.expected, `Token data for ${testCase.ticker} should match expected values`) } }) it('should generate chain name correctly', () => { // Test chain name generation const testCases = [ { chainId: 1, expected: 'eip155:1' }, { chainId: 42161, expected: 'eip155:42161' } ] for (const testCase of testCases) { const result = `eip155:${testCase.chainId}` assert.equal(result, testCase.expected, `Chain name for ${testCase.chainId} should match expected value`) } }) })