diff --git a/cypress/e2e/pages/address_book.page.js b/cypress/e2e/pages/address_book.page.js index 2906d58290..1bc54e3ae9 100644 --- a/cypress/e2e/pages/address_book.page.js +++ b/cypress/e2e/pages/address_book.page.js @@ -11,10 +11,10 @@ export const editEntryBtn = 'button[aria-label="Edit entry"]' export const deleteEntryBtn = 'button[aria-label="Delete entry"]' export const deleteEntryModalBtnSection = '.MuiDialogActions-root' export const delteEntryModaldeleteBtn = 'Delete' -const exportFileModalBtnSection = '.MuiDialogActions-root' const exportFileModalExportBtn = 'Export' const importBtn = 'Import' const exportBtn = 'Export' +const exportModalBtn = '[data-testid="export-modal-btn"]' const whatsNewBtnStr = "What's new" const beamrCookiesStr = 'accept the "Beamer" cookies' @@ -39,11 +39,11 @@ export function verifyDataImported(name, address) { } export function clickOnExportFileBtn() { - cy.contains(exportBtn).click() + cy.contains(exportBtn).should('be.enabled').click() } export function confirmExport() { - cy.get(exportFileModalBtnSection).contains(exportFileModalExportBtn).click() + cy.get(exportModalBtn).click() } export function clickOnCreateEntryBtn() { diff --git a/cypress/e2e/pages/create_tx.pages.js b/cypress/e2e/pages/create_tx.pages.js index ce133801ec..a6d5e5aae6 100644 --- a/cypress/e2e/pages/create_tx.pages.js +++ b/cypress/e2e/pages/create_tx.pages.js @@ -51,7 +51,7 @@ export function clickOnSendTokensBtn() { cy.contains(sendTokensBtnStr).click() } -export function clickOnTokenselectorAndSelectSepolia() { +export function clickOnTokenselectorAndSelectSepoliaEth() { cy.get(tokenAddressInput).prev().click() cy.get('ul[role="listbox"]').contains(constants.tokenNames.sepoliaEther).click() } diff --git a/cypress/e2e/pages/main.page.js b/cypress/e2e/pages/main.page.js index 5cd87d4d05..5e4ec3f219 100644 --- a/cypress/e2e/pages/main.page.js +++ b/cypress/e2e/pages/main.page.js @@ -111,3 +111,36 @@ export function extractDigitsToArray(selector, digitsArray) { } }) } + +export function isItemInLocalstorage(key, expectedValue, maxAttempts = 10, delay = 100) { + return new Promise((resolve, reject) => { + let attempts = 0 + + const isItemInLocalstorage = () => { + attempts++ + const storedValue = JSON.parse(window.localStorage.getItem(key)) + const keyEqualsValue = JSON.stringify(expectedValue) === JSON.stringify(storedValue) + if (keyEqualsValue) { + cy.log('Item retrieved from local storage successfully') + resolve() + } else if (attempts < maxAttempts) { + setTimeout(isItemInLocalstorage, delay) + } else { + cy.log('Error: Key does not equal the expected value in local storage') + reject(error) + } + } + isItemInLocalstorage() + }) +} + +export function addToLocalStorage(key, jsonValue) { + return new Promise((resolve, reject) => { + try { + window.localStorage.setItem(key, JSON.stringify(jsonValue)) + resolve('Item added to local storage successfully') + } catch (error) { + reject('Error adding item to local storage: ' + error) + } + }) +} diff --git a/cypress/e2e/regression/address_book.cy.js b/cypress/e2e/regression/address_book.cy.js index bd7ac23a16..edfbc15ba4 100644 --- a/cypress/e2e/regression/address_book.cy.js +++ b/cypress/e2e/regression/address_book.cy.js @@ -4,6 +4,7 @@ import { format } from 'date-fns' import * as constants from '../../support/constants' import * as addressBook from '../../e2e/pages/address_book.page' import * as main from '../../e2e/pages/main.page' +import * as ls from '../../support/localstorage_data.js' const NAME = 'Owner1' const EDITED_NAME = 'Edited Owner1' @@ -15,14 +16,20 @@ describe('Address book tests', () => { main.acceptCookies() }) - //TODO: Use localstorage for setting up/deleting entries it('Verify entered entry in Name input can be saved', () => { - addressBook.clickOnCreateEntryBtn() - addressBook.addEntry(NAME, constants.RECIPIENT_ADDRESS) - addressBook.clickOnEditEntryBtn() - addressBook.typeInNameInput(EDITED_NAME) - addressBook.clickOnSaveButton() - addressBook.verifyNameWasChanged(NAME, EDITED_NAME) + main + .addToLocalStorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.sepoliaAddress1) + .then(() => { + main + .isItemInLocalstorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.sepoliaAddress1) + .then(() => { + cy.reload() + addressBook.clickOnEditEntryBtn() + addressBook.typeInNameInput(EDITED_NAME) + addressBook.clickOnSaveButton() + addressBook.verifyNameWasChanged(NAME, EDITED_NAME) + }) + }) }) //TODO: Rework to use Polygon. Replace Verify csv file can be imported (Goerli) with this test @@ -44,22 +51,25 @@ describe('Address book tests', () => { cy.contains(constants.GNO_CSV_ENTRY.address).should('exist') }) - // TODO: Rework with localstorage. Change title in Testrail. New title "...exported" + // TODO: Change title in Testrail. New title "...exported" it('Verify the address book file can be downloaded', () => { - addressBook.clickOnImportFileBtn() - addressBook.importFile() - // Download the export file - const date = format(new Date(), 'yyyy-MM-dd', { timeZone: 'UTC' }) - const fileName = `safe-address-book-${date}.csv` //name that is given to the file automatically + main.addToLocalStorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.dataSet).then(() => { + main + .isItemInLocalstorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.dataSet) + .then(() => { + cy.reload() + cy.contains(ls.addressBookData.dataSet[11155111]['0xf405BC611F4a4c89CCB3E4d083099f9C36D966f8']) - addressBook.clickOnExportFileBtn() - //This is the submit button for the Export modal. It requires an actuall class or testId to differentiate - //from the Export button at the top of the AB table - addressBook.confirmExport() + const date = format(new Date(), 'yyyy-MM-dd', { timeZone: 'UTC' }) + const fileName = `safe-address-book-${date}.csv` - const downloadsFolder = Cypress.config('downloadsFolder') - //File reading is failing in the CI. Can be tested locally - cy.readFile(path.join(downloadsFolder, fileName)).should('exist') - // TODO: Add verifications on address and chain from file, import and export files should be equal including all chains from origin + addressBook.clickOnExportFileBtn() + addressBook.confirmExport() + + const downloadsFolder = Cypress.config('downloadsFolder') + //File reading is failing in the CI. Can be tested locally + cy.readFile(path.join(downloadsFolder, fileName)).should('exist') + }) + }) }) }) diff --git a/cypress/e2e/regression/load_safe.cy.js b/cypress/e2e/regression/load_safe.cy.js index 3099d130d6..2930a207ae 100644 --- a/cypress/e2e/regression/load_safe.cy.js +++ b/cypress/e2e/regression/load_safe.cy.js @@ -34,35 +34,6 @@ describe('Load Safe tests', () => { safe.selectSepolia() }) - // TODO: Devide by positive and negative tests - it('Verify only valid Safe name can be accepted', () => { - // alias the address input label - cy.get('input[name="address"]').parent().prev('label').as('addressLabel') - - createwallet.verifyDefaultWalletName(createwallet.defaltSepoliaPlaceholder) - safe.verifyIncorrectAddressErrorMessage() - safe.inputNameAndAddress(testSafeName, constants.SEPOLIA_TEST_SAFE_1) - - // Type an invalid address - // cy.get('input[name="address"]').clear().type(EOA_ADDRESS) - // cy.get('@addressLabel').contains(INVALID_ADDRESS_ERROR_MSG) - - // Type a ENS name - // TODO: register a goerli ENS name for the test Safe - // cy.get('input[name="address"]').clear().type(SAFE_ENS_NAME) - // giving time to the ENS name to be translated - // cy.get('input[name="address"]', { timeout: 10000 }).should('have.value', `rin:${SAFE_ENS_NAME_TRANSLATED}`) - - // Uploading a QR code - // TODO: fix this - // cy.findByTestId('QrCodeIcon').click() - // cy.contains('Upload an image').click() - // cy.get('[type="file"]').attachFile('../fixtures/goerli_safe_QR.png') - - safe.verifyAddressInputValue() - safe.clickOnNextBtn() - }) - it('Verify custom name in the first owner can be set', () => { safe.inputNameAndAddress(testSafeName, constants.SEPOLIA_TEST_SAFE_1) safe.clickOnNextBtn() diff --git a/cypress/e2e/smoke/address_book.cy.js b/cypress/e2e/smoke/address_book.cy.js index 27093faa55..67e0f19a9d 100644 --- a/cypress/e2e/smoke/address_book.cy.js +++ b/cypress/e2e/smoke/address_book.cy.js @@ -2,6 +2,7 @@ import 'cypress-file-upload' import * as constants from '../../support/constants' import * as addressBook from '../../e2e/pages/address_book.page' import * as main from '../../e2e/pages/main.page' +import * as ls from '../../support/localstorage_data.js' const NAME = 'Owner1' const EDITED_NAME = 'Edited Owner1' @@ -19,14 +20,19 @@ describe('[SMOKE] Address book tests', () => { addressBook.addEntry(NAME, constants.RECIPIENT_ADDRESS) }) - //TODO: Use localstorage for setting up/deleting entries it('[SMOKE] Verify entry can be deleted', () => { - addressBook.clickOnCreateEntryBtn() - addressBook.addEntry(NAME, constants.RECIPIENT_ADDRESS) - // Click the delete button in the first entry - addressBook.clickDeleteEntryButton() - addressBook.clickDeleteEntryModalDeleteButton() - addressBook.verifyEditedNameNotExists(EDITED_NAME) + main + .addToLocalStorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.sepoliaAddress1) + .then(() => { + main + .isItemInLocalstorage(constants.localStorageKeys.SAFE_v2__addressBook, ls.addressBookData.sepoliaAddress1) + .then(() => { + cy.reload() + addressBook.clickDeleteEntryButton() + addressBook.clickDeleteEntryModalDeleteButton() + addressBook.verifyEditedNameNotExists(EDITED_NAME) + }) + }) }) it('[SMOKE] Verify csv file can be imported', () => { diff --git a/cypress/e2e/smoke/batch_tx.cy.js b/cypress/e2e/smoke/batch_tx.cy.js index df4caff475..7454c002f7 100644 --- a/cypress/e2e/smoke/batch_tx.cy.js +++ b/cypress/e2e/smoke/batch_tx.cy.js @@ -2,6 +2,7 @@ import * as batch from '../pages/batches.pages' import * as constants from '../../support/constants' import * as main from '../../e2e/pages/main.page' import * as owner from '../../e2e/pages/owners.pages.js' +import * as ls from '../../support/localstorage_data.js' const currentNonce = 3 const funds_first_tx = '0.001' @@ -23,35 +24,36 @@ describe('[SMOKE] Batch transaction tests', () => { it('[SMOKE] Verify a transaction can be added to the batch', () => { batch.addNewTransactionToBatch(constants.EOA, currentNonce, funds_first_tx) cy.contains(batch.transactionAddedToBatchStr).should('be.visible') - //The batch button in the header shows the transaction count batch.verifyBatchIconCount(1) batch.clickOnBatchCounter() batch.verifyAmountTransactionsInBatch(1) }) it('[SMOKE] Verify the batch can be confirmed and related transactions exist in the form', () => { - batch.addNewTransactionToBatch(constants.EOA, currentNonce, funds_first_tx) - cy.wait(1000) - batch.addNewTransactionToBatch(constants.EOA, currentNonce, funds_first_tx) - batch.clickOnBatchCounter() - batch.clickOnConfirmBatchBtn() - batch.clickOnBatchCounter() - batch.clickOnConfirmBatchBtn() - batch.verifyBatchTransactionsCount(2) - batch.clickOnBatchCounter() - cy.contains(funds_first_tx).parents('ul').as('TransactionList') - cy.get('@TransactionList').find('li').eq(0).find('span').eq(0).contains(funds_first_tx) - cy.get('@TransactionList').find('li').eq(1).find('span').eq(0).contains(funds_first_tx) + main.addToLocalStorage(constants.localStorageKeys.SAFE_v2__batch, ls.batchData.entry0).then(() => { + main.isItemInLocalstorage(constants.localStorageKeys.SAFE_v2__batch, ls.batchData.entry0).then(() => { + cy.reload() + batch.clickOnBatchCounter() + batch.clickOnConfirmBatchBtn() + batch.verifyBatchTransactionsCount(2) + batch.clickOnBatchCounter() + cy.contains(funds_first_tx).parents('ul').as('TransactionList') + cy.get('@TransactionList').find('li').eq(0).find('span').eq(0).contains(funds_first_tx) + cy.get('@TransactionList').find('li').eq(1).find('span').eq(0).contains(funds_first_tx) + }) + }) }) it('[SMOKE] Verify a transaction can be removed from the batch', () => { - batch.addNewTransactionToBatch(constants.EOA, currentNonce, funds_first_tx) - cy.wait(1000) - batch.addNewTransactionToBatch(constants.EOA, currentNonce, funds_first_tx) - batch.clickOnBatchCounter() - cy.contains(batch.batchedTransactionsStr).should('be.visible').parents('aside').find('ul > li').as('BatchList') - cy.get('@BatchList').find(batch.deleteTransactionbtn).eq(0).click() - cy.get('@BatchList').should('have.length', 1) - cy.get('@BatchList').contains(funds_second_tx).should('not.exist') + main.addToLocalStorage(constants.localStorageKeys.SAFE_v2__batch, ls.batchData.entry0).then(() => { + main.isItemInLocalstorage(constants.localStorageKeys.SAFE_v2__batch, ls.batchData.entry0).then(() => { + cy.reload() + batch.clickOnBatchCounter() + cy.contains(batch.batchedTransactionsStr).should('be.visible').parents('aside').find('ul > li').as('BatchList') + cy.get('@BatchList').find(batch.deleteTransactionbtn).eq(0).click() + cy.get('@BatchList').should('have.length', 1) + cy.get('@BatchList').contains(funds_second_tx).should('not.exist') + }) + }) }) }) diff --git a/cypress/e2e/smoke/create_tx.cy.js b/cypress/e2e/smoke/create_tx.cy.js index bd403b6433..2398ebc209 100644 --- a/cypress/e2e/smoke/create_tx.cy.js +++ b/cypress/e2e/smoke/create_tx.cy.js @@ -12,18 +12,19 @@ describe('[SMOKE] Create transactions tests', () => { main.acceptCookies() }) + // TODO: Change title to: Verify a new send token transaction can be initiated it('[SMOKE] Verify a new send token transaction can be created', () => { createtx.clickOnNewtransactionBtn() createtx.clickOnSendTokensBtn() createtx.typeRecipientAddress(constants.EOA) - createtx.clickOnTokenselectorAndSelectSepolia() + createtx.clickOnTokenselectorAndSelectSepoliaEth() createtx.setMaxAmount() createtx.verifyMaxAmount(constants.tokenNames.sepoliaEther, constants.tokenAbbreviation.sep) createtx.setSendValue(sendValue) createtx.clickOnNextBtn() }) - it('[SMOKE] Verify a transaction can be reviewed, edited and submitted', () => { + it.skip('[SMOKE] Verify a transaction can be reviewed, edited and submitted', () => { createtx.verifySubmitBtnIsEnabled() cy.wait(1000) createtx.verifyNativeTokenTransfer() @@ -36,7 +37,7 @@ describe('[SMOKE] Create transactions tests', () => { createtx.clickOnSignTransactionBtn() }) - it('[SMOKE] Verify that clicking on notification shows the transaction in queue', () => { + it.skip('[SMOKE] Verify that clicking on notification shows the transaction in queue', () => { createtx.waitForProposeRequest() createtx.clickViewTransaction() createtx.verifySingleTxPage() diff --git a/cypress/e2e/smoke/load_safe.cy.js b/cypress/e2e/smoke/load_safe.cy.js index 3837a21616..9aa586e084 100644 --- a/cypress/e2e/smoke/load_safe.cy.js +++ b/cypress/e2e/smoke/load_safe.cy.js @@ -52,10 +52,10 @@ describe('[SMOKE] Load Safe tests', () => { safe.verifyNameLengthErrorMessage() }) - it('Verify ENS name is translated to a valid address', () => { - cy.visit(constants.loadNewSafeEthUrl) - safe.inputAddress(constants.ENS_TEST_ETH) - safe.verifyAddressInputValue(constants.ETH_ENS_SAFE_ADDRESS_1) + it.skip('Verify ENS name is translated to a valid address', () => { + // cy.visit(constants.loadNewSafeEthUrl) + safe.inputAddress(constants.ENS_TEST_SEPOLIA) + safe.verifyAddressInputValue(constants.ENS_TEST_SEPOLIA) safe.verifyNextButtonStatus('be.enabled') safe.clickOnNextBtn() }) @@ -72,22 +72,6 @@ describe('[SMOKE] Load Safe tests', () => { safe.verifyQRCodeErrorMsg() }) - it('Verify custom name in the first owner an be set', () => { - safe.inputNameAndAddress(testSafeName, constants.SEPOLIA_TEST_SAFE_1) - safe.clickOnNextBtn() - createwallet.typeOwnerName(testOwnerName, 0) - safe.clickOnNextBtn() - }) - - it('Verify Safe and owner names are displayed in the Review step', () => { - safe.inputNameAndAddress(testSafeName, constants.SEPOLIA_TEST_SAFE_1) - safe.clickOnNextBtn() - createwallet.typeOwnerName(testOwnerName, 0) - safe.clickOnNextBtn() - safe.verifyDataInReviewSection(testSafeName, testOwnerName) - safe.clickOnAddBtn() - }) - it('[SMOKE] Verify the custom Safe name is successfully loaded', () => { safe.inputNameAndAddress(testSafeName, constants.SEPOLIA_TEST_SAFE_2) safe.clickOnNextBtn() diff --git a/cypress/support/constants.js b/cypress/support/constants.js index deb4dab3fe..4e69632aa9 100644 --- a/cypress/support/constants.js +++ b/cypress/support/constants.js @@ -11,7 +11,6 @@ export const SEPOLIA_TEST_SAFE_4 = 'sep:0x03042B890b99552b60A073F808100517fb148F export const SEPOLIA_TEST_SAFE_5 = 'sep:0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415' export const SEPOLIA_TEST_SAFE_6 = 'sep:0x6d0b6F96f665Bb4490f9ddb2e450Da2f7e546dC1' export const SEPOLIA_TEST_SAFE_7 = 'sep:0xBf30F749FC027a5d79c4710D988F0D3C8e217A4F' -export const ETH_ENS_SAFE_ADDRESS_1 = 'eth:0x8675B754342754A30A2AeF474D114d8460bca19b' export const GNO_TEST_SAFE = 'gno:0xB8d760a90a5ed54D3c2b3EFC231277e99188642A' export const PAGINATION_TEST_SAFE = 'gor:0x850493a15914aAC05a821A3FAb973b4598889A7b' export const TEST_SAFE = 'gor:0x04f8b1EA3cBB315b87ced0E32deb5a43cC151a91' @@ -27,9 +26,6 @@ export const SIDEBAR_ADDRESS = '0x04f8...1a91' export const ENS_TEST_SEPOLIA = 'testenssepolia.eth' export const ENS_TEST_GOERLI = 'goerli-safe-test.eth' export const ENS_TEST_SEPOLIA_INVALID = 'ivladitestenssepolia.eth' -export const ENS_TEST_ETH = 'mainnetsafe.eth' -export const VALID_QR_CODE_PATH = '../fixtures/sepolia_test_safe_QR.png' //converts to SEPOLIA_TEST_SAFE_6 address -export const INVALID_QR_CODE_PATH = '../fixtures/invalid_image_QR_test.png' //A blank square export const BROWSER_PERMISSIONS_KEY = `${LS_NAMESPACE}SafeApps__browserPermissions` export const SAFE_PERMISSIONS_KEY = `${LS_NAMESPACE}SafeApps__safePermissions` @@ -54,7 +50,6 @@ export const welcomeUrl = '/welcome' export const chainMaticUrl = '/welcome?chain=matic' export const createNewSafeSepoliaUrl = '/new-safe/create?chain=sep' export const loadNewSafeSepoliaUrl = '/new-safe/load?chain=sep' -export const loadNewSafeEthUrl = '/new-safe/load?chain=eth' export const appsUrl = '/apps' export const requestPermissionsUrl = '/request-permissions' export const getPermissionsUrl = '/get-permissions' @@ -70,6 +65,12 @@ export const appsEndpoint = '/**/safe-apps' export const transactionHistoryEndpoint = '**/history' export const safeListEndpoint = '**/safes' +export const VALID_QR_CODE_PATH = '../fixtures/sepolia_test_safe_QR.png' +export const INVALID_QR_CODE_PATH = '../fixtures/invalid_image_QR_test.png' + +export const networkKeys = { + sepolia: '11155111', +} export const mainSideMenuOptions = { home: 'Home', } @@ -155,12 +156,9 @@ export const addresBookContacts = { export const localStorageKeys = { SAFE_v2__addressBook: 'SAFE_v2__addressBook', + SAFE_v2__batch: 'SAFE_v2__batch', } export const connectWalletNames = { e2e: 'E2E Wallet', } - -export const longNames = { - safeName: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit', -} diff --git a/cypress/support/localstorage_data.js b/cypress/support/localstorage_data.js new file mode 100644 index 0000000000..25b662f469 --- /dev/null +++ b/cypress/support/localstorage_data.js @@ -0,0 +1,292 @@ +export const batchData = { + entry0: { + 11155111: { + '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415': [ + { + id: 'vn8dwe0amz', + timestamp: 1701091870022, + txDetails: { + safeAddress: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + txId: 'multisig_0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415_0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executedAt: null, + txStatus: 'AWAITING_CONFIRMATIONS', + txInfo: { + type: 'Transfer', + humanDescription: null, + richDecodedInfo: null, + sender: { + value: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + name: null, + logoUri: null, + }, + recipient: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + direction: 'OUTGOING', + transferInfo: { type: 'NATIVE_COIN', value: '1000000000000000' }, + }, + txData: { + hexData: null, + dataDecoded: null, + to: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + value: '1000000000000000', + operation: 0, + trustedDelegateCallTarget: null, + addressInfoIndex: null, + }, + txHash: null, + detailedExecutionInfo: { + type: 'MULTISIG', + submittedAt: 1698650125722, + nonce: 15, + safeTxGas: '0', + baseGas: '0', + gasPrice: '0', + gasToken: '0x0000000000000000000000000000000000000000', + refundReceiver: { + value: '0x0000000000000000000000000000000000000000', + name: null, + logoUri: null, + }, + safeTxHash: '0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executor: null, + signers: [ + { + value: '0x61a0c717d18232711bC788F19C9Cd56a43cc8872', + name: null, + logoUri: null, + }, + { + value: '0x0D65139Da4B36a8A39BF1b63e950038D42231b2e', + name: null, + logoUri: null, + }, + { + value: '0xC16Db0251654C0a72E91B190d81eAD367d2C6fED', + name: null, + logoUri: null, + }, + { + value: '0x8aEf2f5c3F17261F6F1C4dA058D022BE92776af8', + name: null, + logoUri: null, + }, + ], + confirmationsRequired: 1, + confirmations: [], + rejectors: [], + gasTokenInfo: null, + trusted: false, + }, + safeAppInfo: null, + }, + }, + { + id: 'g30cj4yatap', + timestamp: 1701099937261, + txDetails: { + safeAddress: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + txId: 'multisig_0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415_0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executedAt: null, + txStatus: 'AWAITING_CONFIRMATIONS', + txInfo: { + type: 'Transfer', + humanDescription: null, + richDecodedInfo: null, + sender: { + value: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + name: null, + logoUri: null, + }, + recipient: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + direction: 'OUTGOING', + transferInfo: { type: 'NATIVE_COIN', value: '1000000000000000' }, + }, + txData: { + hexData: null, + dataDecoded: null, + to: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + value: '1000000000000000', + operation: 0, + trustedDelegateCallTarget: null, + addressInfoIndex: null, + }, + txHash: null, + detailedExecutionInfo: { + type: 'MULTISIG', + submittedAt: 1698650125722, + nonce: 15, + safeTxGas: '0', + baseGas: '0', + gasPrice: '0', + gasToken: '0x0000000000000000000000000000000000000000', + refundReceiver: { + value: '0x0000000000000000000000000000000000000000', + name: null, + logoUri: null, + }, + safeTxHash: '0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executor: null, + signers: [ + { + value: '0x61a0c717d18232711bC788F19C9Cd56a43cc8872', + name: null, + logoUri: null, + }, + { + value: '0x0D65139Da4B36a8A39BF1b63e950038D42231b2e', + name: null, + logoUri: null, + }, + { + value: '0xC16Db0251654C0a72E91B190d81eAD367d2C6fED', + name: null, + logoUri: null, + }, + { + value: '0x8aEf2f5c3F17261F6F1C4dA058D022BE92776af8', + name: null, + logoUri: null, + }, + ], + confirmationsRequired: 1, + confirmations: [], + rejectors: [], + gasTokenInfo: null, + trusted: false, + }, + safeAppInfo: null, + }, + }, + ], + }, + }, + entry1: { + 11155111: { + '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415': [ + { + id: 'vn8dwe0amz', + timestamp: 1701091870022, + txDetails: { + safeAddress: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + txId: 'multisig_0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415_0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executedAt: null, + txStatus: 'AWAITING_CONFIRMATIONS', + txInfo: { + type: 'Transfer', + humanDescription: null, + richDecodedInfo: null, + sender: { + value: '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415', + name: null, + logoUri: null, + }, + recipient: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + direction: 'OUTGOING', + transferInfo: { type: 'NATIVE_COIN', value: '1000000000000000' }, + }, + txData: { + hexData: null, + dataDecoded: null, + to: { + value: '0x03042B890b99552b60A073F808100517fb148F60', + name: null, + logoUri: null, + }, + value: '1000000000000000', + operation: 0, + trustedDelegateCallTarget: null, + addressInfoIndex: null, + }, + txHash: null, + detailedExecutionInfo: { + type: 'MULTISIG', + submittedAt: 1698650125722, + nonce: 15, + safeTxGas: '0', + baseGas: '0', + gasPrice: '0', + gasToken: '0x0000000000000000000000000000000000000000', + refundReceiver: { + value: '0x0000000000000000000000000000000000000000', + name: null, + logoUri: null, + }, + safeTxHash: '0xcb83bc36cf4a2998e7fe222e36c458c59c3778f65b4e5bb361c29a73c2de62cc', + executor: null, + signers: [ + { + value: '0x61a0c717d18232711bC788F19C9Cd56a43cc8872', + name: null, + logoUri: null, + }, + { + value: '0x0D65139Da4B36a8A39BF1b63e950038D42231b2e', + name: null, + logoUri: null, + }, + { + value: '0xC16Db0251654C0a72E91B190d81eAD367d2C6fED', + name: null, + logoUri: null, + }, + { + value: '0x8aEf2f5c3F17261F6F1C4dA058D022BE92776af8', + name: null, + logoUri: null, + }, + ], + confirmationsRequired: 1, + confirmations: [], + rejectors: [], + gasTokenInfo: null, + trusted: false, + }, + safeAppInfo: null, + }, + }, + ], + }, + }, +} +export const addressBookData = { + sepoliaAddress1: { + 11155111: { '0x6a5602335a878ADDCa4BF63a050E34946B56B5bC': 'Owner1' }, + }, + dataSet: { + 5: { + '0xD9cA710D531c20117dc74850C5CdebeDA86fbF76': 'qa-automate-tests-1@safe.global', + '0x50564D5f8954f94E8045C59f2c884D7CE203b661': 'Relaxed Goerli Safe', + '0x96D56627215c084649596eaC87bEA4157d6A9304': 'Prominent Goerli Safe', + '0x2FD9a2F6e70E94deB76c54062564C99abFd3237D': 'Peaceful Goerli Safe', + '0xdF9De87c2D4932645813B1d878e45f60a299f3Af': 'Kind Goerli Safe', + '0xc8981a24a4F17b0C92cAF55A2bE30D3D0C689b95': 'Delighted Goerli Safe', + '0x81CC5855C98cfe29a70EAbA3840D9A9B90cA2B60': 'Delightful Goerli Safe', + '0x7C51F1e3948f0B1e4008A913Ed047bC2ED1fe75D': 'Congenial Goerli Safe', + }, + 11155111: { + '0x6E834E9D04ad6b26e1525dE1a37BFd9b215f40B7': 'test-sepolia-3', + '0xf405BC611F4a4c89CCB3E4d083099f9C36D966f8': 'sepolia-test-4', + '0x03042B890b99552b60A073F808100517fb148F60': 'sepolia-test-5', + '0xBd69b0a9DC90eB6F9bAc3E4a5875f437348b6415': 'assets-test-sepolia', + }, + }, +}