Skip to content

Commit

Permalink
feat: dapp initiated token transfer
Browse files Browse the repository at this point in the history
  • Loading branch information
pedronfigueiredo committed Oct 17, 2024
1 parent 147e2d9 commit 70eff50
Show file tree
Hide file tree
Showing 12 changed files with 331 additions and 131 deletions.
3 changes: 3 additions & 0 deletions app/_locales/en/messages.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ import Confirmation from './confirmation';
class TransactionConfirmation extends Confirmation {
private walletInitiatedHeadingTitle: RawLocator;

private dappInitiatedHeadingTitle: RawLocator;

constructor(driver: Driver) {
super(driver);

Expand All @@ -15,11 +17,19 @@ class TransactionConfirmation extends Confirmation {
css: 'h3',
text: tEn('review') as string,
};
this.dappInitiatedHeadingTitle = {
css: 'h3',
text: tEn('transferRequest') as string,
};
}

async check_walletInitiatedHeadingTitle() {
await this.driver.waitForSelector(this.walletInitiatedHeadingTitle);
}

async check_dappInitiatedHeadingTitle() {
await this.driver.waitForSelector(this.dappInitiatedHeadingTitle);
}
}

export default TransactionConfirmation;
7 changes: 7 additions & 0 deletions test/e2e/page-objects/pages/test-dapp.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ class TestDapp {

private erc20WatchAssetButton: RawLocator;

private erc20TokenTransferButton: RawLocator;

constructor(driver: Driver) {
this.driver = driver;

Expand All @@ -94,6 +96,7 @@ class TestDapp {
this.erc721RevokeSetApprovalForAllButton = '#revokeButton';
this.erc1155RevokeSetApprovalForAllButton = '#revokeERC1155Button';
this.erc20WatchAssetButton = '#watchAssets';
this.erc20TokenTransferButton = '#transferTokens';
}

async check_pageIsLoaded(): Promise<void> {
Expand Down Expand Up @@ -156,6 +159,10 @@ class TestDapp {
await this.driver.clickElement(this.erc20WatchAssetButton);
}

public async clickERC20TokenTransferButton() {
await this.driver.clickElement(this.erc20TokenTransferButton);
}

/**
* Verify the failed personal sign signature.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,28 +16,68 @@ import { TestSuiteArguments } from './shared';
const { SMART_CONTRACTS } = require('../../../seeder/smart-contracts');

describe('Confirmation Redesign ERC20 Token Send @no-mmi', function () {
it('Sends a type 0 transaction (Legacy)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.legacy,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createTransactionAndAssertDetails(driver, contractRegistry);
},
mocks,
SMART_CONTRACTS.HST,
);
describe('Wallet initiated', async function () {
it('Sends a type 0 transaction (Legacy)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.legacy,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createWalletInitiatedTransactionAndAssertDetails(
driver,
contractRegistry,
);
},
mocks,
SMART_CONTRACTS.HST,
);
});

it('Sends a type 2 transaction (EIP1559)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.feeMarket,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createWalletInitiatedTransactionAndAssertDetails(
driver,
contractRegistry,
);
},
mocks,
SMART_CONTRACTS.HST,
);
});
});

it('Sends a type 2 transaction (EIP1559)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.feeMarket,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createTransactionAndAssertDetails(driver, contractRegistry);
},
mocks,
SMART_CONTRACTS.HST,
);
describe('dApp initiated', async function () {
it('Sends a type 0 transaction (Legacy)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.legacy,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createDAppInitiatedTransactionAndAssertDetails(
driver,
contractRegistry,
);
},
mocks,
SMART_CONTRACTS.HST,
);
});

it('Sends a type 2 transaction (EIP1559)', async function () {
await withRedesignConfirmationFixtures(
this.test?.fullTitle(),
TransactionEnvelopeType.feeMarket,
async ({ driver, contractRegistry }: TestSuiteArguments) => {
await createDAppInitiatedTransactionAndAssertDetails(
driver,
contractRegistry,
);
},
mocks,
SMART_CONTRACTS.HST,
);
});
});
});

Expand Down Expand Up @@ -69,7 +109,7 @@ export async function mockedSourcifyTokenSend(mockServer: Mockttp) {
}));
}

async function createTransactionAndAssertDetails(
async function createWalletInitiatedTransactionAndAssertDetails(
driver: Driver,
contractRegistry?: GanacheContractAddressRegistry,
) {
Expand Down Expand Up @@ -113,3 +153,37 @@ async function createTransactionAndAssertDetails(

await tokenTransferTransactionConfirmation.clickFooterConfirmButton();
}

async function createDAppInitiatedTransactionAndAssertDetails(
driver: Driver,
contractRegistry?: GanacheContractAddressRegistry,
) {
await unlockWallet(driver);

const contractAddress = await (
contractRegistry as GanacheContractAddressRegistry
).getContractAddress(SMART_CONTRACTS.HST);

const testDapp = new TestDapp(driver);

await testDapp.openTestDappPage({ contractAddress, url: DAPP_URL });

await testDapp.clickERC20WatchAssetButton();

await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
const watchAssetConfirmation = new WatchAssetConfirmation(driver);
await watchAssetConfirmation.clickFooterConfirmButton();

await driver.switchToWindowWithTitle(WINDOW_TITLES.TestDApp);
await testDapp.clickERC20TokenTransferButton();

await driver.switchToWindowWithTitle(WINDOW_TITLES.Dialog);
const tokenTransferTransactionConfirmation =
new TokenTransferTransactionConfirmation(driver);
await tokenTransferTransactionConfirmation.check_dappInitiatedHeadingTitle();
await tokenTransferTransactionConfirmation.check_networkParagraph();
await tokenTransferTransactionConfirmation.check_interactingWithParagraph();
await tokenTransferTransactionConfirmation.check_networkFeeParagraph();

await tokenTransferTransactionConfirmation.clickFooterConfirmButton();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP

exports[`<DAppInitiatedHeader /> should match snapshot 1`] = `
<div>
<div
class="mm-box mm-box--padding-3 mm-box--display-flex mm-box--flex-direction-row mm-box--justify-content-center mm-box--align-items-center mm-box--background-color-background-default"
style="z-index: 2; position: relative;"
>
<h3
class="mm-box mm-text mm-text--heading-md mm-box--color-inherit"
>
Transfer request
</h3>
<div
class="mm-box mm-box--padding-right-3"
style="margin-left: auto; position: absolute; right: 0px;"
>
<div
class="mm-box mm-box--margin-right-1 mm-box--background-color-transparent mm-box--rounded-md"
>
<button
aria-label="Advanced tx details"
class="mm-box mm-button-icon mm-button-icon--size-md mm-box--display-inline-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-icon-default mm-box--background-color-transparent mm-box--rounded-lg"
data-testid="header-advanced-details-button"
>
<span
class="mm-box mm-icon mm-icon--size-md mm-box--display-inline-block mm-box--color-inherit"
style="mask-image: url('./images/icons/customize.svg');"
/>
</button>
</div>
</div>
</div>
</div>
`;
Original file line number Diff line number Diff line change
Expand Up @@ -116,122 +116,31 @@ exports[`Header should match snapshot with signature confirmation 1`] = `
exports[`Header should match snapshot with token transfer confirmation initiated in a dApp 1`] = `
<div>
<div
class="mm-box confirm_header__wrapper mm-box--display-flex mm-box--justify-content-space-between mm-box--align-items-center"
data-testid="confirm-header"
class="mm-box mm-box--padding-3 mm-box--display-flex mm-box--flex-direction-row mm-box--justify-content-center mm-box--align-items-center mm-box--background-color-background-default"
style="z-index: 2; position: relative;"
>
<div
class="mm-box mm-box--padding-4 mm-box--display-flex mm-box--align-items-flex-start"
<h3
class="mm-box mm-text mm-text--heading-md mm-box--color-inherit"
>
<div
class="mm-box mm-box--margin-top-2 mm-box--display-flex"
>
<div
class=""
>
<div
class="identicon"
style="height: 32px; width: 32px; border-radius: 16px;"
>
<div
style="border-radius: 50px; overflow: hidden; padding: 0px; margin: 0px; width: 32px; height: 32px; display: inline-block; background: rgb(24, 100, 242);"
>
<svg
height="32"
width="32"
x="0"
y="0"
>
<rect
fill="#C81420"
height="32"
transform="translate(-5.505236904904678 -5.265123363737541) rotate(385.9 16 16)"
width="32"
x="0"
y="0"
/>
<rect
fill="#E9F500"
height="32"
transform="translate(10.674469406726399 12.429928159193388) rotate(184.5 16 16)"
width="32"
x="0"
y="0"
/>
<rect
fill="#FAB300"
height="32"
transform="translate(1.815455199236231 -26.03028190637629) rotate(431.3 16 16)"
width="32"
x="0"
y="0"
/>
</svg>
</div>
</div>
</div>
<div
class="mm-box mm-text mm-avatar-base mm-avatar-base--size-xs mm-avatar-network confirm_header__avatar-network mm-text--body-xs mm-text--text-transform-uppercase mm-box--display-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-text-default mm-box--background-color-goerli mm-box--rounded-full mm-box--border-color-transparent box--border-style-solid box--border-width-1"
>
G
</div>
</div>
<div
class="mm-box mm-box--margin-inline-start-4"
>
<p
class="mm-box mm-text mm-text--body-md-medium mm-box--color-text-default"
data-testid="header-account-name"
/>
<p
class="mm-box mm-text mm-text--body-md mm-box--color-text-alternative"
data-testid="header-network-display-name"
>
Goerli
</p>
</div>
</div>
Transfer request
</h3>
<div
class="mm-box mm-box--padding-4 mm-box--display-flex mm-box--align-items-flex-end"
class="mm-box mm-box--padding-right-3"
style="margin-left: auto; position: absolute; right: 0px;"
>
<div
class="mm-box mm-box--display-flex mm-box--justify-content-flex-end"
style="align-self: flex-end;"
class="mm-box mm-box--margin-right-1 mm-box--background-color-transparent mm-box--rounded-md"
>
<div>
<div
aria-describedby="tippy-tooltip-3"
class=""
data-original-title="Account details"
data-tooltipped=""
style="display: inline;"
tabindex="0"
>
<button
aria-label="Account details"
class="mm-box mm-button-icon mm-button-icon--size-md mm-box--display-inline-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-icon-default mm-box--background-color-transparent mm-box--rounded-lg"
data-testid="header-info__account-details-button"
>
<span
class="mm-box mm-icon mm-icon--size-md mm-box--display-inline-block mm-box--color-inherit"
style="mask-image: url('./images/icons/info.svg');"
/>
</button>
</div>
</div>
<div
class="mm-box mm-box--margin-right-1 mm-box--background-color-transparent mm-box--rounded-md"
<button
aria-label="Advanced tx details"
class="mm-box mm-button-icon mm-button-icon--size-md mm-box--display-inline-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-icon-default mm-box--background-color-transparent mm-box--rounded-lg"
data-testid="header-advanced-details-button"
>
<button
aria-label="Advanced tx details"
class="mm-box mm-button-icon mm-button-icon--size-md mm-box--display-inline-flex mm-box--justify-content-center mm-box--align-items-center mm-box--color-icon-default mm-box--background-color-transparent mm-box--rounded-lg"
data-testid="header-advanced-details-button"
>
<span
class="mm-box mm-icon mm-icon--size-md mm-box--display-inline-block mm-box--color-inherit"
style="mask-image: url('./images/icons/customize.svg');"
/>
</button>
</div>
<span
class="mm-box mm-icon mm-icon--size-md mm-box--display-inline-block mm-box--color-inherit"
style="mask-image: url('./images/icons/customize.svg');"
/>
</button>
</div>
</div>
</div>
Expand Down
Loading

0 comments on commit 70eff50

Please sign in to comment.