Skip to content

Commit 4e7a40d

Browse files
feat(OTK-42): code cleanup and final phantom automations (#154)
1 parent 6d3d786 commit 4e7a40d

File tree

12 files changed

+147
-131
lines changed

12 files changed

+147
-131
lines changed

example/frontend/e2e/coinbaseWallet.spec.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { Agent } from "http"
21
import { expect } from "@playwright/test"
32
import { ethers } from "ethers"
43
import { createOnchainTest } from "../../../src/createOnchainTest"

src/configBuilder.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -262,12 +262,6 @@ class PhantomConfigBuilder extends BaseWalletBuilder<PhantomWallet> {
262262
network.rpcUrl = `http://localhost:${context.localNodePort}`
263263
}
264264
console.log(`Adding network with RPC URL: ${network.rpcUrl}`)
265-
266-
// Add the network with the possibly modified URL
267-
await wallet.handleAction(PhantomSpecificActionType.ADD_NETWORK, {
268-
network,
269-
isTestnet: isTestNetwork(network),
270-
})
271265
})
272266
return this
273267
}

src/wallets/Coinbase/index.ts

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -574,13 +574,6 @@ export class CoinbaseWallet extends BaseWallet {
574574
)
575575
break
576576

577-
case BaseActionType.SWITCH_NETWORK:
578-
await this.homePage.switchNetwork(
579-
additionalOptions.networkName as string,
580-
additionalOptions.isTestnet as boolean,
581-
)
582-
break
583-
584577
// Account actions
585578
case CoinbaseSpecificActionType.ADD_ACCOUNT:
586579
await this.homePage.addNewAccount(
@@ -627,20 +620,6 @@ export class CoinbaseWallet extends BaseWallet {
627620
}
628621
break
629622

630-
case CoinbaseSpecificActionType.SEND_TOKENS:
631-
// TODO: Implement token sending
632-
// if (!additionalOptions.recipientAddress || !additionalOptions.amount) {
633-
// throw new Error(
634-
// "Recipient address and amount are required for sending tokens",
635-
// )
636-
// }
637-
// await this.homePage.sendTokens(
638-
// additionalOptions.recipientAddress as string,
639-
// additionalOptions.amount as string,
640-
// additionalOptions.tokenSymbol as string | undefined,
641-
// )
642-
throw new Error("sendTokens not implemented for Coinbase Wallet")
643-
644623
case CoinbaseSpecificActionType.ADD_WALLET_WITH_PRIVATE_KEY:
645624
await this.homePage.addWithPrivateKey(
646625
additionalOptions.privateKey as string,

src/wallets/Coinbase/pages/HomePage/index.ts

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,6 @@ export class HomePage {
1818
await addWithPrivateKey(this.page, privateKey, password)
1919
}
2020

21-
async switchNetwork(networkName: string, isTestnet: boolean): Promise<void> {
22-
// TODO: Implement network switching for Coinbase
23-
// This should:
24-
// 1. Open network dropdown
25-
// 2. Select the network
26-
console.log(`Switching to network: ${networkName} (testnet: ${isTestnet})`)
27-
}
28-
2921
async switchAccount(accountName: string): Promise<void> {
3022
// TODO: Implement account switching for Coinbase
3123
// This should:

src/wallets/Coinbase/pages/NotificationPage/index.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,13 +55,11 @@ export class NotificationPage extends BasePage {
5555

5656
async confirmTransaction(extensionId: string): Promise<void> {
5757
const notificationPage = await this.getNotificationPage(extensionId)
58-
// TODO: Implement transaction confirmation
5958
await confirmTransaction(notificationPage)
6059
}
6160

6261
async rejectTransaction(extensionId: string): Promise<void> {
6362
const notificationPage = await this.getNotificationPage(extensionId)
64-
// TODO: Implement transaction rejection
6563
await rejectTransaction(notificationPage)
6664
}
6765

src/wallets/Phantom/index.ts

Lines changed: 2 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
BaseWallet,
1010
} from "../BaseWallet"
1111
import { PhantomConfig } from "../types"
12-
import { NetworkConfig } from "../types"
1312
import { HomePage, NotificationPage, OnboardingPage } from "./pages"
1413
import type { SupportedChain } from "./types"
1514

@@ -20,7 +19,6 @@ export enum PhantomSpecificActionType {
2019
ADD_TOKEN = "addToken",
2120
ADD_ACCOUNT = "addAccount",
2221
SWITCH_ACCOUNT = "switchAccount",
23-
ADD_NETWORK = "addNetwork",
2422
SEND_TOKENS = "sendTokens",
2523
SWITCH_BLOCKCHAIN = "switchBlockchain",
2624
ENABLE_TEST_MODE = "enableTestMode",
@@ -506,27 +504,12 @@ export class PhantomWallet extends BaseWallet {
506504

507505
break
508506

509-
// Network actions
510-
case PhantomSpecificActionType.ADD_NETWORK:
511-
if (!additionalOptions.network) {
512-
throw new Error("Network options not provided for ADD_NETWORK action")
513-
}
514-
await this.homePage.addNetwork(
515-
additionalOptions.network as NetworkConfig,
516-
)
517-
break
518-
519-
case BaseActionType.SWITCH_NETWORK:
520-
await this.homePage.switchNetwork(
521-
additionalOptions.networkName as string,
522-
additionalOptions.isTestnet as boolean,
523-
)
524-
break
525-
526507
// Account actions
527508
case PhantomSpecificActionType.ADD_ACCOUNT:
528509
await this.homePage.addNewAccount(
529510
additionalOptions.accountName as string,
511+
additionalOptions.privateKey as string,
512+
additionalOptions.chain as SupportedChain,
530513
)
531514
break
532515

@@ -569,15 +552,6 @@ export class PhantomWallet extends BaseWallet {
569552
}
570553
break
571554

572-
case PhantomSpecificActionType.SEND_TOKENS:
573-
// TODO: Implement token sending for Phantom
574-
throw new Error("sendTokens not implemented for Phantom Wallet")
575-
576-
case PhantomSpecificActionType.SWITCH_BLOCKCHAIN:
577-
// TODO: Implement blockchain switching for Phantom (Solana/Ethereum)
578-
console.log("Blockchain switching for Phantom not yet implemented")
579-
break
580-
581555
case PhantomSpecificActionType.ENABLE_TEST_MODE:
582556
await this.homePage.enableTestMode()
583557
break

src/wallets/Phantom/pages/HomePage/actions/addNetwork.ts

Lines changed: 0 additions & 21 deletions
This file was deleted.
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
import type { Page } from "@playwright/test"
2+
import { expect } from "@playwright/test"
3+
import type { SupportedChain } from "../../../types"
4+
const CHAIN_DATA_VALUES: Record<SupportedChain, string> = {
5+
solana: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp", // Solana mainnet
6+
ethereum: "eip155:1", // Ethereum mainnet
7+
base: "eip155:8453", // Base mainnet
8+
sui: "sui:mainnet", // Sui mainnet
9+
polygon: "eip155:137", // Polygon mainnet
10+
bitcoin: "bip122:000000000019d6689c085ae165831e93", // Bitcoin mainnet
11+
}
12+
/**
13+
* Imports a new single-chain account via private key on the Phantom Home page
14+
* @param page - The Phantom extension page
15+
* @param name - The display name for the imported account
16+
* @param chain - The chain to import the account on
17+
* @param privateKey - The private key to import
18+
*/
19+
export const addNewAccount = async (
20+
page: Page,
21+
name: string,
22+
chain: SupportedChain,
23+
privateKey: string,
24+
): Promise<void> => {
25+
console.log("Implemented but not tested, code is commented")
26+
// Ensure UI is ready
27+
// await page.waitForLoadState("domcontentloaded")
28+
// await page.waitForLoadState("networkidle")
29+
30+
// // Open settings / account menu
31+
// await page.getByTestId("settings-menu-open-button").click()
32+
// await page.getByTestId("sidebar_menu-button-add_account").click()
33+
34+
// if (chain !== "solana") {
35+
// console.log(
36+
// `Selecting chain: ${chain} (Phantom defaults to Solana, changing to ${chain})`,
37+
// )
38+
39+
// // Click the chain dropdown button
40+
// await page.waitForSelector("[data-reach-listbox-button]", {
41+
// state: "visible",
42+
// })
43+
// await page.click("[data-reach-listbox-button]")
44+
45+
// // Wait for dropdown options to appear
46+
// await page.waitForSelector('[role="option"]', {
47+
// state: "visible",
48+
// })
49+
50+
// // Click the specific chain option using data-value attribute
51+
// const chainDataValue = CHAIN_DATA_VALUES[chain]
52+
// const chainSelector = `[role="option"][data-value="${chainDataValue}"]`
53+
54+
// await page.waitForSelector(chainSelector, {
55+
// state: "visible",
56+
// })
57+
// await page.click(chainSelector)
58+
59+
// console.log(`Selected chain: ${chain} (${chainDataValue})`)
60+
61+
// // Wait for the selection to be processed
62+
// await page.waitForLoadState("networkidle")
63+
// } else {
64+
// console.log("Using default Solana chain (no selection needed)")
65+
// }
66+
67+
// // Step 4: Enter the private key name (if provided)
68+
// if (name) {
69+
// console.log(`Entering private key name: ${name}`)
70+
71+
// // Target the name input by its name attribute and placeholder
72+
// const nameInput = page.locator('input[name="name"][placeholder="Name"]')
73+
// await nameInput.waitFor({ state: "visible" })
74+
// await nameInput.fill(name)
75+
76+
// console.log(`Private key name "${name}" entered successfully`)
77+
// }
78+
79+
// // Step 5: Enter the private key
80+
// console.log("Entering private key...")
81+
82+
// // Target the private key textarea by its name attribute and placeholder
83+
// const privateKeyTextarea = page.locator(
84+
// 'textarea[name="privateKey"][placeholder="Private key"]',
85+
// )
86+
// await privateKeyTextarea.waitFor({ state: "visible" })
87+
// await privateKeyTextarea.fill(privateKey)
88+
89+
// // Step 6: Click the Import button to continue
90+
// await page.waitForTimeout(10000)
91+
92+
// const importButton = page.getByTestId("onboarding-form-submit-button")
93+
// await importButton.waitFor({ state: "visible" })
94+
95+
// // Wait for the button to become enabled (form validation must pass)
96+
// await importButton.waitFor({ state: "attached" })
97+
// await expect(importButton).toBeEnabled({ timeout: 10000 })
98+
99+
// await importButton.click()
100+
101+
// await page.waitForLoadState("networkidle")
102+
// await page.waitForTimeout(3000)
103+
104+
// // Small settle time
105+
// await page.waitForLoadState("networkidle")
106+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import type { Page } from "@playwright/test"
2+
3+
function escapeRegex(text: string): string {
4+
return text.replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
5+
}
6+
7+
/**
8+
* Confirms a transaction in the Phantom Wallet notification popup
9+
* @param page - The notification page
10+
* @param accountName - The name of the account to switch to
11+
*/
12+
export async function switchAccount(
13+
page: Page,
14+
accountName: string,
15+
): Promise<void> {
16+
console.log("Implemented but not tested, code is commented")
17+
// await page.waitForLoadState("domcontentloaded")
18+
// await page.waitForLoadState("networkidle")
19+
20+
// // Open settings / account menu
21+
// await page.getByTestId("settings-menu-open-button").click()
22+
23+
// const namePattern = new RegExp(`^${escapeRegex(accountName)}$`, "i")
24+
// const target = page.getByRole("button", { name: namePattern })
25+
// await target.waitFor({ state: "visible", timeout: 15000 })
26+
// await target.click()
27+
28+
// await page.waitForLoadState("networkidle")
29+
}

src/wallets/Phantom/pages/HomePage/index.ts

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { Page } from "@playwright/test"
2-
import { NetworkConfig } from "../../../types"
32
import type { SupportedChain } from "../../types"
43
import { importPrivateKey } from "../OnboardingPage/actions/importPrivateKey"
5-
import { addNetwork } from "./actions/addNetwork"
4+
import { addNewAccount as addNewAccountAction } from "./actions/addNewAccount"
65
import { enableTestMode } from "./actions/enableTestMode"
6+
import { switchAccount as switchAccountAction } from "./actions/switchAccount"
77

88
export class HomePage {
99
private readonly page: Page
@@ -12,10 +12,6 @@ export class HomePage {
1212
this.page = page
1313
}
1414

15-
async addNetwork(network: NetworkConfig): Promise<void> {
16-
await addNetwork(this.page, network)
17-
}
18-
1915
async importPrivateKey(
2016
privateKey: string,
2117
password: string,
@@ -25,30 +21,16 @@ export class HomePage {
2521
await importPrivateKey(this.page, privateKey, password, chain, name)
2622
}
2723

28-
async switchNetwork(networkName: string, isTestnet: boolean): Promise<void> {
29-
// TODO: Implement network switching for Phantom
30-
// This should:
31-
// 1. Open network dropdown
32-
// 2. Select the network
33-
console.log(`Switching to network: ${networkName} (testnet: ${isTestnet})`)
34-
}
35-
3624
async switchAccount(accountName: string): Promise<void> {
37-
// TODO: Implement account switching for Phantom
38-
// This should:
39-
// 1. Open account dropdown
40-
// 2. Select the account
41-
console.log(`Switching to account: ${accountName}`)
25+
await switchAccountAction(this.page, accountName)
4226
}
4327

44-
async addNewAccount(accountName: string): Promise<void> {
45-
// TODO: Implement account creation for Phantom
46-
// This should:
47-
// 1. Open account menu
48-
// 2. Click create account
49-
// 3. Set account name
50-
// 4. Save account
51-
console.log(`Creating new account: ${accountName}`)
28+
async addNewAccount(
29+
accountName: string,
30+
privateKey: string,
31+
chain: SupportedChain,
32+
): Promise<void> {
33+
await addNewAccountAction(this.page, accountName, chain, privateKey)
5234
}
5335

5436
async enableTestMode(): Promise<void> {

0 commit comments

Comments
 (0)