Skip to content
This repository was archived by the owner on Nov 10, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 22 additions & 29 deletions src/logic/wallets/__tests__/getWeb3.test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Web3 from 'web3'
import { isTxPendingError, isSmartContractWallet } from 'src/logic/wallets/getWeb3'
import { isTxPendingError, isSmartContractWallet, getWeb3ReadOnly } from 'src/logic/wallets/getWeb3'

describe('src/logic/wallets/getWeb3', () => {
describe('isTxPendingError', () => {
Expand All @@ -14,51 +14,44 @@ describe('src/logic/wallets/getWeb3', () => {
})
})

jest.mock('src/logic/wallets/getWeb3', () => ({
getWeb3ReadOnly: jest.fn(),
}))

describe('isSmartContractWallet', () => {
const web3ReadOnly = getWeb3ReadOnly()
const address = '0x66fb75feC6b40119e023564dF954c8794Cd876F0'

it('checks if an address is a contract', async () => {
const web3Provider = {
eth: {
getCode: jest.fn(() => Promise.resolve('Solidity code')),
},
} as unknown as Web3
const result = await isSmartContractWallet(web3Provider, address)
expect(web3Provider.eth.getCode).toHaveBeenCalledWith(address)
web3ReadOnly.eth.getCode = jest.fn(() => Promise.resolve('Solidity code'))

const result = await isSmartContractWallet(address)
expect(web3ReadOnly.eth.getCode).toHaveBeenCalledWith(address)
expect(result).toBe(true)
})

it('returns false for EoA addresses', async () => {
const web3Provider = {
eth: {
getCode: jest.fn(() => Promise.resolve('0x00000000000000000000')),
},
} as unknown as Web3
const result = await isSmartContractWallet(web3Provider, address)
expect(web3Provider.eth.getCode).toHaveBeenCalledWith(address)
web3ReadOnly.eth.getCode = jest.fn(() => Promise.resolve('0x00000000000000000000'))

const result = await isSmartContractWallet(address)
expect(web3ReadOnly.eth.getCode).toHaveBeenCalledWith(address)
expect(result).toBe(false)
})

it('returns false for empty addresses', async () => {
const web3Provider = {
eth: {
getCode: jest.fn(() => Promise.resolve('Solidity code')),
},
} as unknown as Web3
web3ReadOnly.eth.getCode = jest.fn(() => Promise.resolve('Solidity code'))

const emptyAddress = ''
const result = await isSmartContractWallet(web3Provider, emptyAddress)
expect(web3Provider.eth.getCode).not.toHaveBeenCalled()
const result = await isSmartContractWallet(emptyAddress)
expect(web3ReadOnly.eth.getCode).not.toHaveBeenCalled()
expect(result).toBe(false)
})

it('returns false if contract code cannot be fetched', async () => {
const web3Provider = {
eth: {
getCode: jest.fn(() => Promise.reject('No code')),
},
} as unknown as Web3
const result = await isSmartContractWallet(web3Provider, address)
expect(web3Provider.eth.getCode).toHaveBeenCalledWith(address)
web3ReadOnly.eth.getCode = jest.fn(() => Promise.reject('No code'))

const result = await isSmartContractWallet(address)
expect(web3ReadOnly.eth.getCode).toHaveBeenCalledWith(address)
expect(result).toBe(false)
})
})
Expand Down
6 changes: 3 additions & 3 deletions src/logic/wallets/getWeb3.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,13 @@ export const getChainIdFrom = (web3Provider: Web3): Promise<number> => {
const isHardwareWallet = (walletName: string) =>
sameAddress(WALLET_PROVIDER.LEDGER, walletName) || sameAddress(WALLET_PROVIDER.TREZOR, walletName)

export const isSmartContractWallet = async (web3Provider: Web3, account: string): Promise<boolean> => {
export const isSmartContractWallet = async (account: string): Promise<boolean> => {
if (!account) {
return false
}
let contractCode = ''
try {
contractCode = await web3Provider.eth.getCode(account)
contractCode = await getWeb3ReadOnly().eth.getCode(account)
} catch (e) {
// ignore
}
Expand All @@ -96,7 +96,7 @@ export const getProviderInfo = async (web3Instance: Web3, providerName = 'Wallet
const account = (await getAccountFrom(web3Instance)) || ''
const ensDomain = account ? await reverseENSLookup(account) : ''
const network = await getChainIdFrom(web3Instance)
const smartContractWallet = await isSmartContractWallet(web3Instance, account)
const smartContractWallet = await isSmartContractWallet(account)
const hardwareWallet = isHardwareWallet(providerName)
const available = Boolean(account)

Expand Down