Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
6cca83d
fix(maestro): persist JavaScript state via output
EdgeClaws Aug 14, 2026
7795512
fix(maestro): stabilize C000045 token flow
EdgeClaws Aug 18, 2026
2b26746
fix(maestro): follow wallet settings rename flow
EdgeClaws Aug 19, 2026
de507c9
test(maestro): disable C000035 raw keys flow
EdgeClaws Aug 19, 2026
0dfab85
fix(maestro): skip unavailable GRS and UFO coverage
EdgeClaws Aug 19, 2026
e1bcaa8
fix(maestro): dismiss update sheet on cleared launch
EdgeClaws Aug 19, 2026
6b9d4a5
fix(maestro): update disabled token selectors
EdgeClaws Aug 19, 2026
458bba7
fix(maestro): follow current split wallet flow
EdgeClaws Aug 19, 2026
0da6fd1
fix(maestro): update 2FA login prompts
EdgeClaws Aug 19, 2026
d778760
test(maestro): add Save button testID to Manage Tokens scene
EdgeClaws Aug 20, 2026
bc879eb
fix(maestro): correct C000029a tag to stop silent skip
EdgeClaws Aug 20, 2026
cfd9e72
fix(maestro): repair split wallet selectors
EdgeClaws Aug 20, 2026
e21af30
fix(maestro): remove obsolete launch modal workaround
EdgeClaws Aug 21, 2026
b345569
fix(maestro): restore selector-based 2FA handling
EdgeClaws Aug 21, 2026
6e20640
fix(maestro): assert current split wallet title
EdgeClaws Aug 21, 2026
364fa61
fix(maestro): remove Botanix split expectation
EdgeClaws Aug 21, 2026
e6a0b5d
fix(maestro): update logged-in help flow
EdgeClaws Aug 21, 2026
e938630
fix(maestro): keep help return cross-platform
EdgeClaws Aug 21, 2026
95861af
fix(maestro): select Coreum by stable row id
EdgeClaws Aug 21, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 1 addition & 3 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,6 @@ export default [
'src/components/scenes/Loans/LoanManageScene.tsx',
'src/components/scenes/Loans/LoanStatusScene.tsx',

'src/components/scenes/ManageTokensScene.tsx',

'src/components/scenes/NotificationCenterScene.tsx',
'src/components/scenes/NotificationScene.tsx',

Expand Down Expand Up @@ -359,7 +357,7 @@ export default [

'src/components/themed/LineTextDivider.tsx',
'src/components/themed/MainButton.tsx',
'src/components/themed/ManageTokensRow.tsx',

'src/components/themed/MenuTabs.tsx',
'src/components/themed/ModalParts.tsx',
'src/components/themed/PinDots.tsx',
Expand Down
4 changes: 2 additions & 2 deletions maestro/03-login/C190284-2fa-01.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ tags:
visible: "Username and password are correct. This device cannot log in because\
\ it does not have the right 2-factor code."
timeout: 15000
- assertVisible: "Enter Backup Code"
- tapOn: "Enter Backup Code"
- assertVisible: "Enter 2FA code"
- tapOn: "Enter 2FA code"
- inputText: ${MAESTRO_EDGE_2FA_BACKUP_CODE}
- assertVisible: "Submit"

Expand Down
2 changes: 1 addition & 1 deletion maestro/07-wallets/C000029a-migrate-wallets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ env:
IMPORT_SEED: ${MAESTRO_EDGE_MAX_IMPORT_SEED}
tags:
- android
- C000029
- C000029a
---
- runFlow:
file: ../common/launch-cleared.yaml
Expand Down
36 changes: 18 additions & 18 deletions maestro/07-wallets/C000032-archive-and-restore-wallets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -22,38 +22,38 @@ tags:


# Archive wallets
- evalScript: ${var walletNames = ["My Bitcoin", "My Bitcoin Cash", "My Dash", "My Ether", "My Litecoin"]}
- evalScript: ${var index = 0}
- evalScript: ${output.walletNames = ["My Bitcoin", "My Bitcoin Cash", "My Dash", "My Ether", "My Litecoin"]}
- evalScript: ${output.index = 0}
- tapOn: Assets
- repeat:
times: ${walletNames.length - 1}
times: ${output.walletNames.length - 1}
commands:
- tapOn: ${walletNames[index]}
- tapOn: ${output.walletNames[output.index]}
- tapOn:
id: gearIcon
- tapOn: ".*Archive Wallet"
# Modal
- assertVisible: "Archive Wallet"
- assertVisible: ${"Are you sure you want to archive " + walletNames[index] + "?"}
- assertVisible: ${"Are you sure you want to archive " + output.walletNames[output.index] + "?"}
- assertVisible: Cancel
# Check if "My Ether" wallet
- runFlow:
when:
true: ${walletNames[index] == "My Ether"}
true: ${output.walletNames[output.index] == "My Ether"}
commands:
- assertVisible: "Archiving this wallet will also archive any enabled tokens for this wallet."
label: "Extra message for Ether wallets"
# Archive
- tapOn: Archive
- assertNotVisible: ${walletNames[index]}
- assertNotVisible: ${output.walletNames[output.index]}

- evalScript: ${index++}
- evalScript: ${output.index++}
label: "Archive all wallets except last"

# Unable to archive last wallet
- runFlow:
commands:
- longPressOn: ${walletNames[index]}
- longPressOn: ${output.walletNames[output.index]}
- tapOn: ".*Archive Wallet"
- assertVisible: "Cannot Archive Wallet"
- assertVisible: "At least one wallet required in this account."
Expand All @@ -80,13 +80,13 @@ tags:
- assertVisible: "Restore Wallets"

# Toggle on wallets to restore
- evalScript: ${var walletCurrencyCodes = ["BTC", "BCH", "DASH", "ETH", "LTC"]}
- evalScript: ${var index = 0}
- evalScript: ${output.walletCurrencyCodes = ["BTC", "BCH", "DASH", "ETH", "LTC"]}
- evalScript: ${output.index = 0}
- repeat:
times: ${walletCurrencyCodes.length - 1}
times: ${output.walletCurrencyCodes.length - 1}
commands:
- tapOn: ${walletCurrencyCodes[index]}
- evalScript: ${index++}
- tapOn: ${output.walletCurrencyCodes[output.index]}
- evalScript: ${output.index++}
- tapOn: Restore

# Modal
Expand All @@ -97,14 +97,14 @@ tags:

# Confirm restored and returned to assets screen
- assertVisible: "Total Balance.*"
- evalScript: ${var index = 0}
- evalScript: ${output.index = 0}
- repeat:
times: ${walletNames.length}
times: ${output.walletNames.length}
commands:
- scrollUntilVisible:
element: ${walletNames[index]}
element: ${output.walletNames[output.index]}
direction: DOWN
- evalScript: ${index++}
- evalScript: ${output.index++}

# Ensure restore is not tappable when none left to restore
- tapOn:
Expand Down
5 changes: 2 additions & 3 deletions maestro/07-wallets/C000034-detect-disable-tokens.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,8 @@ tags:
- assertVisible: "Auto Detected Tokens"
- assertVisible: "All Tokens"
- tapOn:
text: ${TOKEN_NAME + ".*"}
index: 1
- tapOn: Done
id: ${"manageTokensRow." + TOKEN_NAME}
- tapOn: Save
- assertNotVisible: ${TOKEN_NAME}

# # Skip testing resync behavior until changed - expected NOT to rediscover tokens from a resync
Expand Down
20 changes: 10 additions & 10 deletions maestro/07-wallets/C000036-autodetect-all-networks.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@ tags:
# All networks that support tokens (and import seed)
# EVMs: Only Sonic and Pulsechain (others tested via regular asset sync)
- evalScript: ${
var wallets = '[
"Coreum",
output.wallets = '[
"COREUM",
"Osmosis",
"Avalanche",
"Solana",
Expand All @@ -40,7 +40,7 @@ tags:
- runFlow:
file: ../common/import-wallets.yaml
env:
ASSET_NAMES: ${wallets}
ASSET_NAMES: ${output.wallets}
# label: "Import wallets"

- runFlow:
Expand All @@ -54,7 +54,7 @@ tags:

# Tokens matching the imported networks
- evalScript: ${
var tokens = [
output.tokens = [
"ATOM",
"JOE",
"PYTH",
Expand Down Expand Up @@ -94,17 +94,17 @@ tags:
# visible: ${".*New tokens were detected and enabled on " + WALLET_NAME + ".*"}
# timeout: 60000

- evalScript: ${var index = 0}
- evalScript: ${output.index = 0}
- repeat:
times: ${tokens.length}
times: ${output.tokens.length}
commands:
- scrollUntilVisible:
element: ${tokens[index]}
element: ${output.tokens[output.index]}
direction: UP
timeout: 20000
optional: true
- scrollUntilVisible:
element: ${tokens[index]}
element: ${output.tokens[output.index]}
direction: DOWN
timeout: 90000
- scrollUntilVisible:
Expand All @@ -114,7 +114,7 @@ tags:
timeout: 10000
optional: true
label: "Scroll to bottom."
- evalScript: ${index++}
- evalScript: ${output.index++}



Expand Down Expand Up @@ -147,4 +147,4 @@ tags:
# XRPL - RLUSD
# Tron - SUN

# Algorand - USDC -- conflict but only default token on algorand and algorand does not support import
# Algorand - USDC -- conflict but only default token on algorand and algorand does not support import
34 changes: 18 additions & 16 deletions maestro/07-wallets/C000037-split-wallets.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -44,41 +44,43 @@ tags:
- longPressOn: "My Base"

# Verify split option is available and tap it
- tapOn: ".*Split Wallet"
- tapOn:
id: walletListMenu_split

# Select Ethereum as target
- assertVisible: Create Wallet From Seed
- assertVisible: Split Wallet
- assertVisible: Search Wallets
- tapOn: ".*Ethereum"
- tapOn: Next
- tapOn:
id: "createWalletRow.create-wallet:ethereum-ethereum"
- tapOn:
id: nextButton

# Next scene
- assertVisible: Split Wallet
- assertVisible: This action creates wallets from pre-existing wallets.
- assertVisible: Tap on wallet to edit name
- evalScript: ${var newETHName = ".*My Ether \\(Split from My Base\\).*"}
- assertVisible: ${newETHName}
- assertVisible: EVM-compatible networks share the.*existing address.
- assertVisible: Tap on wallet to edit settings
- evalScript: ${output.newETHName = ".*My Ether \\(Split from My Base\\).*"}
- assertVisible: ${output.newETHName}

# Rename modal
- tapOn:
text: ${"ETH.*"}
index: 0
- tapOn:
id: "undefined.clearIcon"
id: "walletSettingsNameInput.clearIcon"
- inputRandomText
## Unable to target text input field to test changing name
# - copyTextFrom:
# id: "undefined.textInput"
# - evalScript: ${var newETHName = maestro.copiedText}
# - tapOn: Submit
- assertVisible: Submit
# - tapOn: Done
- assertVisible: Done
- tapOn:
id: "modal-close-button"

# Button shares name with scene title
- tapOn:
text: Split Wallet
index: 1
- tapOn:
id: splitWalletConfirmButton



Expand All @@ -98,7 +100,7 @@ tags:

# - assertVisible: Split Wallet
# - assertVisible: This action creates wallets from pre-existing wallets.
# - assertVisible: Tap on wallet to edit name
# - assertVisible: Tap on wallet to edit settings
# - evalScript: ${var newBTCName = ".*My Bitcoin \\(Split from My Litecoin\\).*"}
# - assertVisible: ${newBTCName}
# - tapOn:
Expand All @@ -109,7 +111,7 @@ tags:
## Verify new wallets and balances
# ETH recovered
- scrollUntilVisible:
element: ${newETHName}
element: ${output.newETHName}
direction: DOWN
centerElement: true
timeout: 10000
Expand Down
20 changes: 10 additions & 10 deletions maestro/07-wallets/C000043-private-view-key.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,20 @@ tags:
# Monero/Zano (CryptoNote): 64-char hex
# Zcash/Pirate (zk-SNARKs): longer alphanumeric strings
- evalScript: ${
var walletFormats = {
output.walletFormats = {
"Monero":"[a-fA-F0-9]{64}",
"Pirate Chain":"[a-zA-Z0-9]{64,}",
"Zcash":"[a-zA-Z0-9]{64,}",
"Zano":"[a-fA-F0-9]{64}"
}
}
- evalScript: ${var walletNames = Object.keys(walletFormats)}
- evalScript: ${output.walletNames = Object.keys(output.walletFormats)}

# Create account with wallets that support private view key
- runFlow:
file: ../common/create-account.yaml
env:
NEW_WALLETS: ${JSON.stringify(walletNames)}
NEW_WALLETS: ${JSON.stringify(output.walletNames)}
label: "Add wallets with private view key support"

- runFlow:
Expand All @@ -43,17 +43,17 @@ tags:
- tapOn: Assets

# Loop over each wallet and test Private View Key
- evalScript: ${var index = 0}
- evalScript: ${output.index = 0}
- repeat:
times: ${walletNames.length}
times: ${output.walletNames.length}
commands:
# Wallet nickname often excludes extra words (e.g. "Pirate Chain" -> "Pirate")
- evalScript: ${var nickName = "My " + walletNames[index].split(" ")[0]}
- evalScript: ${output.nickName = "My " + output.walletNames[output.index].split(" ")[0]}
- scrollUntilVisible:
element: ${nickName}
element: ${output.nickName}
direction: DOWN
centerElement: true
- longPressOn: ${nickName}
- longPressOn: ${output.nickName}
- assertVisible: ".*Private View Key"
- tapOn: ".*Private View Key"
# Private View Key Modal
Expand All @@ -63,9 +63,9 @@ tags:
- assertVisible: "Copy"
# Validate view key format for this network
- assertVisible:
text: ${walletFormats[walletNames[index]]}
text: ${output.walletFormats[output.walletNames[output.index]]}
- tapOn:
id: "modal-close-button"
- evalScript: ${index++}
- evalScript: ${output.index++}

# - stopApp
14 changes: 7 additions & 7 deletions maestro/07-wallets/C000044-create-all-wallet-types.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,10 @@ tags:
file: ../common/no-errors.yaml

# Validate that all wallets were created
- evalScript: ${var index = 0}
- evalScript: ${var walletNames = JSON.parse(output.assetNames)}
- evalScript: ${output.index = 0}
- evalScript: ${output.walletNames = JSON.parse(output.assetNames)}
- repeat:
times: ${walletNames.length}
times: ${output.walletNames.length}
commands:
# option 1
# Preferred quicker method, but iOS wallet search is not currently reliable when maestro types too fast
Expand All @@ -45,9 +45,9 @@ tags:

# Option 2
# Wallet nickname often excludes extra words (e.g. "Pirate Chain" -> "My Pirate")
- evalScript: ${var nickName = "My " + walletNames[index].split(" ")[0] + ".*"}
- evalScript: ${output.nickName = "My " + output.walletNames[output.index].split(" ")[0] + ".*"}
# Hack to address inconsistent wallet name for XRP
- evalScript: ${if (walletNames[index] === "XRPL") { nickName = "My XRP"}}
- evalScript: ${if (output.walletNames[output.index] === "XRPL") { output.nickName = "My XRP"}}
- retry:
maxRetries: 2
commands:
Expand All @@ -57,9 +57,9 @@ tags:
speed: 150
timeout: 30000
- scrollUntilVisible:
element: ${nickName}
element: ${output.nickName}
centerElement: true
timeout: 60000
speed: 5

- evalScript: ${index++}
- evalScript: ${output.index++}
Loading