///
// ***********************************************
// This example commands.ts shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
import type { Anvil, CreateAnvilOptions } from '@viem/anvil'
import type { SettingsSidebarMenus } from '../../selectors/pages/HomePage/settings'
import type { GasSettings } from '../../type/GasSettings'
import type { Network } from '../../type/Network'
declare global {
namespace Cypress {
interface Chainable {
importWallet(seedPhrase: string): Chainable
importWalletFromPrivateKey(privateKey: string): Chainable
getAccount(): Chainable
getNetwork(): Chainable
connectToDapp(accounts?: string[]): Chainable
addNewAccount(accountName: string): Chainable
switchAccount(accountName: string): Chainable
renameAccount(currentAccountName: string, newAccountName: string): Chainable
getAccountAddress(): Chainable
resetAccount(): Chainable
switchNetwork(networkName: string, isTestnet?: boolean): Chainable
createAnvilNode(options?: CreateAnvilOptions): Chainable<{
anvil: Anvil
rpcUrl: string
chainId: number
}>
connectToAnvil(): Chainable
emptyAnvilNode(): Chainable
addNetwork(network: Network): Chainable
approveNewNetwork(): Chainable
approveSwitchNetwork(): Chainable
approveNewEthereumRPC(): Chainable
rejectNewNetwork(): Chainable
rejectSwitchNetwork(): Chainable
rejectNewEthereumRPC(): Chainable
deployToken(): Chainable
addNewToken(): Chainable
approveTokenPermission(options?: {
spendLimit?: number | 'max'
gasSetting?: GasSettings
}): Chainable
rejectTokenPermission(): Chainable
providePublicEncryptionKey(): Chainable
decrypt(): Chainable
confirmSignature(): Chainable
rejectSignature(): Chainable
confirmTransaction(options?: { gasSetting?: GasSettings }): Chainable
rejectTransaction(): Chainable
confirmTransactionAndWaitForMining(): Chainable
openTransactionDetails(txIndex: number): Chainable
closeTransactionDetails(): Chainable
lock(): Chainable
unlock(): Chainable
toggleShowTestNetworks(): Chainable
toggleDismissSecretRecoveryPhraseReminder(): Chainable
goBackToHomePage(): Chainable
openSettings(): Chainable
openSidebarMenu(menu: SettingsSidebarMenus): Chainable
}
}
}
/**
* Synpress Commands for MetaMask
*
* This module extends Cypress with custom commands for interacting with MetaMask and Ethereum networks.
* It provides a wide range of functionalities including wallet management, account operations,
* network interactions, token handling, transaction management, and MetaMask UI interactions.
*
* @module SynpressCommandsForMetaMask
*
* Key features:
* - Wallet: Import wallet, connect to dApps
* - Account: Add, switch, rename, reset accounts
* - Network: Switch networks, create and manage Anvil nodes, add custom networks
* - Tokens: Deploy tokens, add new tokens, approve token permissions
* - Transactions: Confirm, reject, and view transaction details
* - MetaMask UI: Lock/unlock, toggle settings, navigate UI
*
* These commands enhance the testing capabilities for Ethereum-based applications,
* allowing for comprehensive end-to-end testing of dApps integrated with MetaMask.
*/
/**
* Initializes Synpress commands for MetaMask
*/
export default function synpressCommandsForMetaMask(): void {
// Wallet
/**
* Imports a wallet using a seed phrase
* @param seedPhrase - The seed phrase to import
*/
Cypress.Commands.add('importWallet', (seedPhrase: string) => {
return cy.task('importWallet', seedPhrase)
})
/**
* Imports a wallet using a private key
* @param privateKey - The private key to import
*/
Cypress.Commands.add('importWalletFromPrivateKey', (privateKey: string) => {
return cy.task('importWalletFromPrivateKey', privateKey)
})
/**
* Connects to a dApp
*/
Cypress.Commands.add('connectToDapp', () => {
return cy.task('connectToDapp')
})
// Account
/**
* Gets the current account
*/
Cypress.Commands.add('getAccount', () => {
return cy.task('getAccount')
})
/**
* Adds a new account
* @param accountName - The name of the new account
*/
Cypress.Commands.add('addNewAccount', (accountName: string) => {
return cy.task('addNewAccount', accountName)
})
/**
* Switches to a different account
* @param accountName - The name of the account to switch to
*/
Cypress.Commands.add('switchAccount', (accountName: string) => {
return cy.task('switchAccount', accountName)
})
/**
* Renames an account
* @param currentAccountName - The current name of the account
* @param newAccountName - The new name for the account
*/
Cypress.Commands.add('renameAccount', (currentAccountName: string, newAccountName: string) => {
return cy.task('renameAccount', { currentAccountName, newAccountName })
})
/**
* Gets the address of the current account
* @returns The account address
*/
Cypress.Commands.add('getAccountAddress', () => {
return cy.task('getAccountAddress')
})
/**
* Resets the current account
*/
Cypress.Commands.add('resetAccount', () => {
return cy.task('resetAccount')
})
// Network
/**
* Gets the current network
*/
Cypress.Commands.add('getNetwork', () => {
return cy.task('getNetwork')
})
/**
* Switches to a different network
* @param networkName - The name of the network to switch to
* @param isTestnet - Whether the network is a testnet
*/
Cypress.Commands.add('switchNetwork', (networkName: string, isTestnet = false) => {
return cy.task('switchNetwork', { networkName, isTestnet })
})
/**
* Creates an Anvil node
* @param options - Options for creating the Anvil node
* @returns An object containing the Anvil instance, RPC URL, and chain ID
*/
Cypress.Commands.add('createAnvilNode', (options?: CreateAnvilOptions) => {
return cy.task('createAnvilNode', options)
})
/**
* Connects to an Anvil node
*/
Cypress.Commands.add('connectToAnvil', () => {
return cy.task('createAnvilNode').then((anvilNetwork) => {
const anvilNetworkDetails = anvilNetwork as {
anvil: Anvil
rpcUrl: string
chainId: number
}
const network = {
name: 'Anvil',
rpcUrl: anvilNetworkDetails.rpcUrl,
chainId: anvilNetworkDetails.chainId,
symbol: 'ETH',
blockExplorerUrl: 'https://etherscan.io/'
}
return cy.task('addNetwork', network)
})
})
/**
* Empties the Anvil node
*/
Cypress.Commands.add('emptyAnvilNode', () => {
return cy.task('emptyAnvilNode')
})
/**
* Adds a new network
* @param network - The network to add
*/
Cypress.Commands.add('addNetwork', (network: Network) => {
return cy.task('addNetwork', network)
})
/**
* Approves adding a new network
*/
Cypress.Commands.add('approveNewNetwork', () => {
return cy.task('approveNewNetwork')
})
/**
* Approves switching to a new network
*/
Cypress.Commands.add('approveSwitchNetwork', () => {
return cy.task('approveSwitchNetwork')
})
/**
* Rejects adding a new network
*/
Cypress.Commands.add('rejectNewNetwork', () => {
return cy.task('rejectNewNetwork')
})
/**
* Rejects switching to a new network
*/
Cypress.Commands.add('rejectSwitchNetwork', () => {
return cy.task('rejectSwitchNetwork')
})
/**
* Approves adding a new RPC provider for Ethereum Mainnet
*/
Cypress.Commands.add('approveNewEthereumRPC', () => {
return cy.task('approveNewEthereumRPC')
})
/**
* Rejects adding a new RPC provider for Ethereum Mainnet
*/
Cypress.Commands.add('rejectNewEthereumRPC', () => {
return cy.task('rejectNewEthereumRPC')
})
// Token
/**
* Deploys a token
*/
Cypress.Commands.add('deployToken', () => {
return cy.task('deployToken')
})
/**
* Adds a new token
*/
Cypress.Commands.add('addNewToken', () => {
return cy.task('addNewToken')
})
/**
* Approves token permission
* @param options - Options for approving token permission
* @param options.spendLimit - The spend limit for the token
* @param options.gasSetting - Gas settings for the transaction
*/
Cypress.Commands.add(
'approveTokenPermission',
(options?: {
spendLimit?: number | 'max'
gasSetting?: GasSettings
}) => {
return cy.task('approveTokenPermission', options)
}
)
/**
* Rejects token permission
*/
Cypress.Commands.add('rejectTokenPermission', () => {
return cy.task('rejectTokenPermission')
})
// Lock/Unlock
/**
* Locks MetaMask
*/
Cypress.Commands.add('lock', () => {
return cy.task('lock')
})
/**
* Unlocks MetaMask
*/
Cypress.Commands.add('unlock', () => {
return cy.task('unlock')
})
// Toggles
/**
* Toggles showing test networks
*/
Cypress.Commands.add('toggleShowTestNetworks', () => {
return cy.task('toggleShowTestNetworks')
})
/**
* Toggles dismissing the secret recovery phrase reminder
*/
Cypress.Commands.add('toggleDismissSecretRecoveryPhraseReminder', () => {
return cy.task('toggleDismissSecretRecoveryPhraseReminder')
})
// Others
/**
* Provides a public encryption key
*/
Cypress.Commands.add('providePublicEncryptionKey', () => {
return cy.task('providePublicEncryptionKey')
})
/**
* Decrypts a message
*/
Cypress.Commands.add('decrypt', () => {
return cy.task('decrypt')
})
/**
* Confirms a signature
*/
Cypress.Commands.add('confirmSignature', () => {
return cy.task('confirmSignature')
})
/**
* Rejects a signature
*/
Cypress.Commands.add('rejectSignature', () => {
return cy.task('rejectSignature')
})
/**
* Confirms a transaction
* @param options - Options for confirming the transaction
* @param options.gasSetting - Gas settings for the transaction
*/
Cypress.Commands.add('confirmTransaction', (options?: { gasSetting?: GasSettings }) => {
return cy.task('confirmTransaction', options)
})
/**
* Rejects a transaction
*/
Cypress.Commands.add('rejectTransaction', () => {
return cy.task('rejectTransaction')
})
/**
* Confirms a transaction and waits for mining
*/
Cypress.Commands.add('confirmTransactionAndWaitForMining', () => {
return cy.task('confirmTransactionAndWaitForMining')
})
/**
* Opens transaction details
* @param txIndex - The index of the transaction to open
*/
Cypress.Commands.add('openTransactionDetails', (txIndex = 0) => {
return cy.task('openTransactionDetails', txIndex)
})
/**
* Closes transaction details
*/
Cypress.Commands.add('closeTransactionDetails', () => {
return cy.task('closeTransactionDetails')
})
/**
* Goes back to the home page
*/
Cypress.Commands.add('goBackToHomePage', () => {
return cy.task('goBackToHomePage')
})
/**
* Opens settings
*/
Cypress.Commands.add('openSettings', () => {
return cy.task('openSettings')
})
/**
* Opens a sidebar menu
* @param menu - The menu to open
*/
Cypress.Commands.add('openSidebarMenu', (menu: SettingsSidebarMenus) => {
return cy.task('openSidebarMenu', menu)
})
}