Skip to content
This repository was archived by the owner on Jun 19, 2024. It is now read-only.

Commit 3e9bbc0

Browse files
authored
fix: removing algoexplorer (#189)
* fix: migrating to allo * chore: fixing package json * chore: node bump * chore: node fetch
1 parent 1b916e4 commit 3e9bbc0

File tree

13 files changed

+4117
-3205
lines changed

13 files changed

+4117
-3205
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
- name: Set up Node
2626
uses: actions/setup-node@v3
2727
with:
28-
node-version: 16
28+
node-version: 18
2929

3030
- name: Install dependencies (with cache)
3131
uses: bahmutov/npm-install@v1

jest.setup.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
// Used for __tests__/testing-library.js
55
// Learn more: https://github.com/testing-library/jest-dom
66
import '@testing-library/jest-dom/extend-expect';
7+
import fetch from 'node-fetch';
78

89
var localStorageMock = (function () {
910
var store = {};
@@ -30,5 +31,6 @@ if (typeof window !== 'undefined') {
3031
});
3132
}
3233

34+
global.fetch = fetch;
3335
global.dummyContract =
3436
'BiAH6AcBBJmH0wcDAGQmASB6zQMKOJBtxFB4ILNYiiRQngRy5XJoFC96k36qJavhHDIEgQISMwAQIxIQMwEQJBIQQAENMgQhBBIzABAkEhAzARAkEhAzAhAjEhBAAG8yBCEEEjMAECQSEDMBECMSEDMCECMSEEAAAQAzAAEiDjMAIDIDEhAzABMyAxIQMwEBIg4zASAyAxIQEDMAESUSEDMAFCgSEDMAFSgSEDMBBygSEDMBCSgSEDMCACgSEDMCBygSEDMCCCEFEhBCAN4zAAEiDjMAIDIDEhAzABMyAxIQMwAVMgMSEDMBEzIDEhAzABElEhAzABIhBhIQMwERJRIQMwESIQYSEDMAFDMBABIQMwEUKBIQMwIHgCCKaxNJ5pPcb9t1+hmc6CDAgBtvAussZRHPAQiO5V1OjRIQMwIAMwEAEhAzAgiBoMIeEhBCAFozAAEiDjMAIDIDEhAzAAkyAxIQMwEBIg4zASAyAxIQMwETMgMSEDMBFTIDEhAQMwAAKBIQMwAHMwEAEhAzAAiB0OgMDxAzARElEhAzAQAzARQSEDMBEiEFEhBD';

package.json

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "algoworld-swapper",
33
"description": "Free and trustless ASA swapper, powered by Algorand ⚡️",
4-
"version": "1.1.0",
4+
"version": "1.1.1",
55
"private": true,
66
"author": "AlgoWorld <[email protected]>",
77
"license": "GPL-3.0",
@@ -23,7 +23,8 @@
2323
"test:e2e:ci": "playwright test --workers=1",
2424
"test:e2e:ci:local": "E2E_TESTS_BASE_URL=http://localhost:3000 playwright test --workers=1",
2525
"test:e2e:local": "E2E_TESTS_BASE_URL=http://localhost:3000 playwright test --workers=1 --headed",
26-
"commit": "cz"
26+
"commit": "cz",
27+
"pre-commit": "yarn format && yarn lint && yarn type-check && yarn build"
2728
},
2829
"lint-staged": {
2930
"./src/**/*.{ts,js,jsx,tsx}": [
@@ -32,6 +33,9 @@
3233
]
3334
},
3435
"dependencies": {
36+
"@algorandfoundation/algokit-utils": "^2.2.0",
37+
"@blockshake/defly-connect": "^1.1.5",
38+
"@daffiwallet/connect": "^1.0.3",
3539
"@emotion/cache": "11.11.0",
3640
"@emotion/react": "11.11.1",
3741
"@emotion/server": "11.11.0",
@@ -42,15 +46,12 @@
4246
"@mui/lab": "5.0.0-alpha.136",
4347
"@mui/material": "5.14.0",
4448
"@mui/x-data-grid": "6.10.0",
49+
"@perawallet/connect": "1.3.1",
4550
"@reduxjs/toolkit": "1.9.5",
51+
"@txnlab/use-wallet": "^2.1.0",
52+
"@vkruglikov/react-telegram-web-app": "^1.11.0",
4653
"@walletconnect/modal-sign-html": "^2.5.5",
47-
"@algorandfoundation/algokit-utils": "^2.2.0",
48-
"@blockshake/defly-connect": "1.1.5",
49-
"@daffiwallet/connect": "1.0.3",
50-
"@perawallet/connect": "1.3.1",
51-
"@txnlab/use-wallet": "2.1.0",
52-
"@vkruglikov/react-telegram-web-app": "1.11.0",
53-
"algosdk": "2.4.0",
54+
"algosdk": "^2.4.0",
5455
"axios": "1.4.0",
5556
"axios-retry": "3.5.1",
5657
"next": "13.4.13",
@@ -96,6 +97,7 @@
9697
"jest-canvas-mock": "2.5.2",
9798
"jest-environment-jsdom": "29.6.1",
9899
"lint-staged": "13.2.3",
100+
"node-fetch": "3.3.2",
99101
"postcss": "8.4.26",
100102
"prettier": "2.8.8",
101103
"ts-jest": "29.1.1",

src/common/constants.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@ export const ALGONODE_INDEXER_URL = (chain: ChainType) => {
3232
: `https://testnet-idx.algonode.cloud`;
3333
};
3434

35-
export const ALGOEXPLORER_URL = (chain: ChainType) => {
35+
export const ALLO_EXPLORER_URL = (chain: ChainType) => {
3636
return chain.toLowerCase() === `mainnet`
37-
? `https://algoexplorer.io`
38-
: `https://testnet.algoexplorer.io`;
37+
? `https://allo.info`
38+
: `https://testnet.allo.info`;
3939
};
4040

4141
export const EMPTY_ASSET_IMAGE_URL = (gateway: IpfsGateway) => {

src/common/public-swaps.spec.ts

Lines changed: 261 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,261 @@
1+
import { test, expect, Page, BrowserContext } from '@playwright/test';
2+
import {
3+
NAV_BAR_CONNECT_BTN_ID,
4+
NAV_BAR_ICON_HOME_BTN_ID,
5+
NAV_BAR_SETTINGS_BTN_ID,
6+
NAV_BAR_SETTINGS_MENU_ITEM_ID,
7+
} from '@/components/Headers/constants';
8+
import {
9+
CONNECT_PROVIDER_DIALOG_ID,
10+
FROM_ASSET_PICKER_DIALOG_SEARCH_ID,
11+
DIALOG_SELECT_BTN_ID,
12+
FROM_ASSET_PICKER_DIALOG_ID,
13+
TO_ASSET_PICKER_DIALOG_SEARCH_ID,
14+
TO_ASSET_PICKER_DIALOG_ID,
15+
CONFIRM_DIALOG_ID,
16+
SHARE_SWAP_DIALOG_ID,
17+
SHARE_SWAP_COPY_BTN_ID,
18+
DIALOG_CANCEL_BTN_ID,
19+
SWAP_DEACTIVATION_PERFORMED_MESSAGE,
20+
MNEMONIC_DIALOG_ID,
21+
MNEMONIC_DIALOG_TEXT_INPUT_ID,
22+
MNEMONIC_DIALOG_SELECT_BUTTON_ID,
23+
INFO_DIALOG_ID,
24+
INFO_DIALOG_CLOSE_BTN_ID,
25+
CONFIRM_DIALOG_PUBLIC_SWAP_SWITCH_ID,
26+
} from '@/components/Dialogs/constants';
27+
import {
28+
SWAP_TYPE_PICKER_CARD_ID,
29+
FROM_SWAP_OFFERING_ASSET_BTN_ID,
30+
TO_SWAP_REQUESTING_BTN_ID,
31+
} from '@/components/Cards/constants';
32+
import {
33+
ASA_TO_ASA_PAGE_HEADER_ID,
34+
CREATE_SWAP_BTN_ID,
35+
MY_SWAPS_PAGE_HEADER_ID,
36+
PERFORM_SWAP_OPTIN_BUTTON_ID,
37+
PERFORM_SWAP_PERFORM_BUTTON_ID,
38+
PUBLIC_SWAPS_SEARCH_BUTTON_ID,
39+
PUBLIC_SWAPS_SEARCH_FIELD_ID,
40+
} from '@/common/constants';
41+
import {
42+
MY_SWAPS_TABLE_MANAGE_BTN_ID,
43+
PUBLIC_SWAP_OPEN_SWAP_BUTTON_ID,
44+
} from '@/components/Tables/constants';
45+
import { CRYPTO_TEXT_FIELD_ID } from '@/components/TextFields/constants';
46+
import { AW_SWAPPER_BASE_URL, BOB_ADDRESS, delay } from '@/e2e/common';
47+
48+
const DUMMY_ASA_TO_OFFER = `96044943: AWS_TEST`;
49+
const DUMMY_ASA_ID_TO_REQUEST = `96044943`;
50+
const DUMMY_ASA_TO_REQUEST = `${DUMMY_ASA_ID_TO_REQUEST}: AWS_TEST`;
51+
52+
let context: BrowserContext;
53+
let page: Page;
54+
55+
test.beforeAll(async ({ browser }) => {
56+
context = await browser.newContext();
57+
context.grantPermissions([`clipboard-read`, `clipboard-write`]);
58+
page = await context.newPage();
59+
await page.goto(AW_SWAPPER_BASE_URL);
60+
});
61+
62+
test.afterAll(async () => {
63+
await page.close();
64+
});
65+
66+
test.describe(`Public Swaps`, () => {
67+
test(`Bob should be able to load and connect wallet`, async () => {
68+
await page.locator(`id=${NAV_BAR_CONNECT_BTN_ID}`).click();
69+
await expect(
70+
page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`),
71+
).toBeVisible();
72+
await page.locator(`div[role="button"]:has-text("Mnemonic")`).click();
73+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeVisible();
74+
await page
75+
.locator(`id=${MNEMONIC_DIALOG_TEXT_INPUT_ID}`)
76+
.fill(process.env.E2E_TESTS_BOB_MNEMONIC ?? ``);
77+
78+
await page.locator(`id=${MNEMONIC_DIALOG_SELECT_BUTTON_ID}`).click();
79+
80+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeHidden();
81+
await expect(page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`)).toBeHidden();
82+
});
83+
84+
test(`Bob should be able to navigate to Asa to Asa page`, async () => {
85+
await expect(page.locator(`id=${ASA_TO_ASA_PAGE_HEADER_ID}`)).toBeHidden();
86+
await Promise.all([
87+
page.waitForNavigation(),
88+
page.locator(`id=${SWAP_TYPE_PICKER_CARD_ID(`ASA to ASA`)}`).click(),
89+
]);
90+
await expect(page.locator(`id=${ASA_TO_ASA_PAGE_HEADER_ID}`)).toBeVisible();
91+
});
92+
93+
test(`Bob should be able to select offering asset`, async () => {
94+
await expect(
95+
page.locator(`id=${FROM_ASSET_PICKER_DIALOG_ID}`),
96+
).toBeHidden();
97+
await page.locator(`id=${FROM_SWAP_OFFERING_ASSET_BTN_ID}`).click();
98+
await expect(
99+
page.locator(`id=${FROM_ASSET_PICKER_DIALOG_ID}`),
100+
).toBeVisible();
101+
102+
await page.locator(`id=${FROM_ASSET_PICKER_DIALOG_SEARCH_ID}`).click();
103+
await page.locator(`text=${DUMMY_ASA_TO_OFFER}`).click();
104+
105+
await page.locator(`id=${CRYPTO_TEXT_FIELD_ID}`).click();
106+
await page.locator(`id=${CRYPTO_TEXT_FIELD_ID}`).fill(`1`);
107+
await page.locator(`id=${DIALOG_SELECT_BTN_ID}`).click();
108+
await expect(
109+
page.locator(`id=${FROM_ASSET_PICKER_DIALOG_ID}`),
110+
).toBeHidden();
111+
});
112+
113+
test(`Bob should be able to select requesting asset`, async () => {
114+
await expect(page.locator(`id=${TO_ASSET_PICKER_DIALOG_ID}`)).toBeHidden();
115+
await page.locator(`id=${TO_SWAP_REQUESTING_BTN_ID}`).click();
116+
await expect(page.locator(`id=${TO_ASSET_PICKER_DIALOG_ID}`)).toBeVisible();
117+
118+
await page
119+
.locator(`id=${TO_ASSET_PICKER_DIALOG_SEARCH_ID}`)
120+
.fill(DUMMY_ASA_ID_TO_REQUEST);
121+
await delay(2000);
122+
123+
const elements = await page.$$(`text=${DUMMY_ASA_TO_REQUEST}`);
124+
await elements[1].click();
125+
126+
await page.locator(`id=${CRYPTO_TEXT_FIELD_ID}`).click();
127+
await page.locator(`id=${CRYPTO_TEXT_FIELD_ID}`).fill(`1`);
128+
await page.locator(`id=${DIALOG_SELECT_BTN_ID}`).click();
129+
await expect(page.locator(`id=${TO_ASSET_PICKER_DIALOG_ID}`)).toBeHidden();
130+
});
131+
132+
test(`Bob should be able to initiate create public swap`, async () => {
133+
await expect(page.locator(`id=${CONFIRM_DIALOG_ID}`)).toBeHidden();
134+
await page.locator(`id=${CREATE_SWAP_BTN_ID}`).click({ timeout: 120000 });
135+
await expect(page.locator(`id=${CONFIRM_DIALOG_ID}`)).toBeVisible();
136+
await page.locator(`id=${CONFIRM_DIALOG_PUBLIC_SWAP_SWITCH_ID}`).click();
137+
await page.locator(`id=${DIALOG_SELECT_BTN_ID}`).click();
138+
await expect(page.locator(`id=${CONFIRM_DIALOG_ID}`)).toBeHidden();
139+
});
140+
141+
test(`Bob should successfully create swap and display share dialog`, async () => {
142+
await expect(page.locator(`id=${SHARE_SWAP_DIALOG_ID}`)).toBeVisible({
143+
timeout: 100000,
144+
});
145+
await page.locator(`id=${SHARE_SWAP_COPY_BTN_ID}`).click();
146+
expect(
147+
await page.evaluate(() => {
148+
const content = navigator.clipboard.readText();
149+
return content;
150+
}),
151+
).toContain(`/swap/`);
152+
await page.locator(`id=${DIALOG_CANCEL_BTN_ID}`).click();
153+
await expect(page.locator(`id=${SHARE_SWAP_DIALOG_ID}`)).toBeHidden();
154+
155+
await page.locator(`id=${NAV_BAR_ICON_HOME_BTN_ID}`).click();
156+
await page.locator(`id=${NAV_BAR_SETTINGS_BTN_ID}`).click();
157+
await page.locator(`id=${NAV_BAR_SETTINGS_MENU_ITEM_ID(`Logout`)}`).click();
158+
await page.waitForTimeout(1000 * 5);
159+
160+
await page.goto(`${AW_SWAPPER_BASE_URL}/public-swaps`);
161+
});
162+
163+
test(`Anonymous user should find Bob's public swap`, async () => {
164+
await page.waitForTimeout(1000 * 5);
165+
await page.locator(`id=${PUBLIC_SWAPS_SEARCH_FIELD_ID}`).fill(BOB_ADDRESS);
166+
await page.locator(`id=${PUBLIC_SWAPS_SEARCH_BUTTON_ID}`).click();
167+
await page.waitForTimeout(1000 * 5);
168+
await page.locator(`id=${PUBLIC_SWAP_OPEN_SWAP_BUTTON_ID}`).click();
169+
await page.waitForTimeout(5000);
170+
const pages = context.pages();
171+
await pages[0].close();
172+
page = pages[1];
173+
});
174+
175+
test(`Alice should be able to load and connect wallet`, async () => {
176+
await page.locator(`id=${NAV_BAR_CONNECT_BTN_ID}`).click();
177+
await expect(
178+
page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`),
179+
).toBeVisible();
180+
await page.locator(`div[role="button"]:has-text("Mnemonic")`).click();
181+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeVisible();
182+
await page.waitForTimeout(5000);
183+
await page
184+
.locator(`id=${MNEMONIC_DIALOG_TEXT_INPUT_ID}`)
185+
.fill(process.env.E2E_TESTS_ALICE_MNEMONIC ?? ``);
186+
187+
await page.locator(`id=${MNEMONIC_DIALOG_SELECT_BUTTON_ID}`).click();
188+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeHidden();
189+
await expect(page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`)).toBeHidden();
190+
});
191+
192+
test(`Alice should perform swaps`, async () => {
193+
const optInButtonVisible = await page
194+
.locator(`id=${PERFORM_SWAP_OPTIN_BUTTON_ID}`)
195+
.isVisible();
196+
197+
if (optInButtonVisible) {
198+
await page.locator(`id=${PERFORM_SWAP_OPTIN_BUTTON_ID}`).click();
199+
await expect(
200+
page.locator(`id=${PERFORM_SWAP_OPTIN_BUTTON_ID}`),
201+
).toBeHidden({ timeout: 30000 });
202+
}
203+
204+
await page.locator(`id=${PERFORM_SWAP_PERFORM_BUTTON_ID}`).click();
205+
await expect(page.locator(`id=${CONFIRM_DIALOG_ID}`)).toBeVisible();
206+
await page.locator(`id=${DIALOG_SELECT_BTN_ID}`).click();
207+
await expect(page.locator(`id=${CONFIRM_DIALOG_ID}`)).toBeHidden();
208+
209+
await expect(page.locator(`id=${INFO_DIALOG_ID}`)).toBeVisible({
210+
timeout: 100000,
211+
});
212+
213+
await page.locator(`id=${INFO_DIALOG_CLOSE_BTN_ID}`).click();
214+
await expect(page.locator(`id=${INFO_DIALOG_ID}`)).toBeHidden();
215+
216+
await page.locator(`id=${NAV_BAR_ICON_HOME_BTN_ID}`).click();
217+
await page.locator(`id=${NAV_BAR_SETTINGS_BTN_ID}`).click();
218+
await page.locator(`id=${NAV_BAR_SETTINGS_MENU_ITEM_ID(`Logout`)}`).click();
219+
});
220+
221+
test(`Bob should successfully remove created swap`, async () => {
222+
await page.locator(`id=${NAV_BAR_CONNECT_BTN_ID}`).click();
223+
await expect(
224+
page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`),
225+
).toBeVisible();
226+
await page.locator(`div[role="button"]:has-text("Mnemonic")`).click();
227+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeVisible();
228+
await page
229+
.locator(`id=${MNEMONIC_DIALOG_TEXT_INPUT_ID}`)
230+
.fill(process.env.E2E_TESTS_BOB_MNEMONIC ?? ``);
231+
await page.locator(`id=${MNEMONIC_DIALOG_SELECT_BUTTON_ID}`).click();
232+
await expect(page.locator(`id=${MNEMONIC_DIALOG_ID}`)).toBeHidden();
233+
await expect(page.locator(`id=${CONNECT_PROVIDER_DIALOG_ID}`)).toBeHidden();
234+
235+
await page.locator(`id=${NAV_BAR_SETTINGS_BTN_ID}`).click();
236+
await Promise.all([
237+
page.waitForNavigation(),
238+
page.locator(`id=${NAV_BAR_SETTINGS_MENU_ITEM_ID(`My Swaps`)}`).click(),
239+
]);
240+
await expect(page.locator(`id=${MY_SWAPS_PAGE_HEADER_ID}`)).toBeVisible();
241+
242+
const escrowAddress = await page.evaluate(async () => {
243+
const clipboardContent = await navigator.clipboard.readText();
244+
const escrow = clipboardContent
245+
.substring(clipboardContent.lastIndexOf(`/`) + 1)
246+
.split(`?`)[0];
247+
return escrow;
248+
});
249+
250+
await page
251+
.locator(`id=${MY_SWAPS_TABLE_MANAGE_BTN_ID(escrowAddress)}`)
252+
.click();
253+
await page.locator(`text=Delete`).click();
254+
255+
await expect(
256+
page.locator(`text=${SWAP_DEACTIVATION_PERFORMED_MESSAGE}`),
257+
).toBeVisible({
258+
timeout: 120000,
259+
});
260+
});
261+
});

0 commit comments

Comments
 (0)