From 9259984a7808c38b1821f0f08986da6506f5eefa Mon Sep 17 00:00:00 2001 From: r1n04h Date: Fri, 22 May 2026 16:28:04 +0100 Subject: [PATCH 1/9] fix: test ci 323 mobile --- mobile/.maestro/send-spark.yml | 23 +-------------- mobile/.maestro/send-token.yml | 22 +------------- .../.maestro/subflows/input-spark-address.yml | 29 +++++++++++++++++++ 3 files changed, 31 insertions(+), 43 deletions(-) create mode 100644 mobile/.maestro/subflows/input-spark-address.yml diff --git a/mobile/.maestro/send-spark.yml b/mobile/.maestro/send-spark.yml index 5c8a2425..25f15508 100644 --- a/mobile/.maestro/send-spark.yml +++ b/mobile/.maestro/send-spark.yml @@ -34,29 +34,8 @@ jsEngine: graaljs # ok, balance copied, lets send it so hardcoded address from our 2nd account - tapOn: id: 'SendButton' -- tapOn: - id: 'send-address-input' -# split into chunks - single 68-char inputText hangs iOS WDA (port 7001) on CI -- inputText: 'spark1pgssyjcyyyp' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'uufme5g6n4rg7avcx' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'kx029am5ccpfn63d5' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'ryr6d308m0j4akqhx' - runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 + file: subflows/input-spark-address.yml - tapOn: id: 'send-address-next-button' - waitForAnimationToEnd diff --git a/mobile/.maestro/send-token.yml b/mobile/.maestro/send-token.yml index b74c0dbc..172975e0 100644 --- a/mobile/.maestro/send-token.yml +++ b/mobile/.maestro/send-token.yml @@ -34,28 +34,8 @@ jsEngine: graaljs # ok, balance copied, lets send it so hardcoded address from our 2nd account - tapOn: id: 'token-row-btkn1mjpzcvak0mk9xv4kjdztwl6udk5rkgzetyz4qdz8375mk0wpvpqqe0alhv' -- tapOn: - id: 'send-address-input' -- inputText: 'spark1pgssyjcyyyp' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'uufme5g6n4rg7avcx' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'kx029am5ccpfn63d5' -- runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 -- inputText: 'ryr6d308m0j4akqhx' - runFlow: - file: subflows/sleep.yml - env: - TIMEOUT: 1000 + file: subflows/input-spark-address.yml - tapOn: id: 'send-address-next-button' - waitForAnimationToEnd diff --git a/mobile/.maestro/subflows/input-spark-address.yml b/mobile/.maestro/subflows/input-spark-address.yml new file mode 100644 index 00000000..b441a6b7 --- /dev/null +++ b/mobile/.maestro/subflows/input-spark-address.yml @@ -0,0 +1,29 @@ +appId: com.layerzwallet.mobile +--- +# Chunked entry: one long inputText hangs iOS WDA on CI. eraseText: 1 primes the field after tapOn +# (Maestro/Android can drop leading characters on the first inputText otherwise). +- tapOn: + id: 'send-address-input' +- waitForAnimationToEnd +- eraseText: 1 +- inputText: 'spark1pgssyjcyyyp' +- runFlow: + file: sleep.yml + env: + TIMEOUT: 1000 +- inputText: 'uufme5g6n4rg7avcx' +- runFlow: + file: sleep.yml + env: + TIMEOUT: 1000 +- inputText: 'kx029am5ccpfn63d5' +- runFlow: + file: sleep.yml + env: + TIMEOUT: 1000 +- inputText: 'ryr6d308m0j4akqhx' +- runFlow: + file: sleep.yml + env: + TIMEOUT: 1000 +- assertNotVisible: 'Invalid address' From 280e15fd54af130d6d8a29a68669e04466336996 Mon Sep 17 00:00:00 2001 From: r1n04h Date: Fri, 22 May 2026 21:32:56 +0100 Subject: [PATCH 2/9] fix: test ci e2e mobile --- mobile/app/send/send-address.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/mobile/app/send/send-address.tsx b/mobile/app/send/send-address.tsx index c496ba5c..3fcfba72 100644 --- a/mobile/app/send/send-address.tsx +++ b/mobile/app/send/send-address.tsx @@ -95,10 +95,12 @@ const SendAddress: React.FC = () => { - + To Date: Sat, 23 May 2026 14:32:07 +0100 Subject: [PATCH 3/9] fix: test ci e2e mobile --- mobile/app/send/send-address.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mobile/app/send/send-address.tsx b/mobile/app/send/send-address.tsx index 3fcfba72..f064c23d 100644 --- a/mobile/app/send/send-address.tsx +++ b/mobile/app/send/send-address.tsx @@ -95,7 +95,7 @@ const SendAddress: React.FC = () => { - + To Date: Sun, 24 May 2026 11:01:52 +0100 Subject: [PATCH 4/9] fix: test ci e2e mobile --- mobile/app/send/send-address.tsx | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mobile/app/send/send-address.tsx b/mobile/app/send/send-address.tsx index f064c23d..f9ff9260 100644 --- a/mobile/app/send/send-address.tsx +++ b/mobile/app/send/send-address.tsx @@ -95,8 +95,10 @@ const SendAddress: React.FC = () => { - - To + + + To + { onChangeText={setLocalAddress} value={localAddress} /> - + From a29625540e7d7b66a4831bd8a129a6ce0f0daa92 Mon Sep 17 00:00:00 2001 From: r1n04h Date: Sun, 24 May 2026 16:28:42 +0100 Subject: [PATCH 5/9] fix: test ci e2e mobile --- mobile/app/send/send-address.tsx | 75 ++++++++++++++------------------ 1 file changed, 33 insertions(+), 42 deletions(-) diff --git a/mobile/app/send/send-address.tsx b/mobile/app/send/send-address.tsx index f9ff9260..238bfb9f 100644 --- a/mobile/app/send/send-address.tsx +++ b/mobile/app/send/send-address.tsx @@ -2,7 +2,7 @@ import { Ionicons } from '@expo/vector-icons'; import * as bip21 from 'bip21'; import { Stack, useRouter } from 'expo-router'; import React, { useCallback, useContext, useRef, useState } from 'react'; -import { KeyboardAvoidingView, Platform, StyleSheet, TextInput, View } from 'react-native'; +import { StyleSheet, TextInput, View } from 'react-native'; import Pressable from '../../components/Pressable'; import RadialGradientScreen from '@/components/RadialGradientScreen'; @@ -91,55 +91,46 @@ const SendAddress: React.FC = () => { - - - - - - - To - - - - - - - - - {errorMessage && ( - - - {errorMessage} - - )} + + + + + To + + + + + - - - - Next - + {errorMessage && ( + + + {errorMessage} + + )} - + + + + + Next + + ); }; const styles = StyleSheet.create({ - keyboardAvoidingView: { - flex: 1, - }, container: { flex: 1, paddingHorizontal: 16, From 8a9dce44003f8ecc2a6c874ef597bb43c6258e2e Mon Sep 17 00:00:00 2001 From: r1n04h Date: Mon, 25 May 2026 12:13:05 +0100 Subject: [PATCH 6/9] fix: test ci e2e mobile --- mobile/.maestro/subflows/input-spark-address.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/mobile/.maestro/subflows/input-spark-address.yml b/mobile/.maestro/subflows/input-spark-address.yml index b441a6b7..59b4de44 100644 --- a/mobile/.maestro/subflows/input-spark-address.yml +++ b/mobile/.maestro/subflows/input-spark-address.yml @@ -27,3 +27,8 @@ appId: com.layerzwallet.mobile env: TIMEOUT: 1000 - assertNotVisible: 'Invalid address' +# Dismiss the soft keyboard so the bottom Next button is reachable. +# (Without this the IME covers send-address-next-button on Android, and on iOS the +# button sits below the keyboard since send-address.tsx no longer uses KeyboardAvoidingView.) +- hideKeyboard +- waitForAnimationToEnd From 463a11ae5c6815149041599e6651dd6afe843922 Mon Sep 17 00:00:00 2001 From: r1n04h Date: Mon, 25 May 2026 12:50:01 +0100 Subject: [PATCH 7/9] fix: test ci e2e mobile --- mobile/.maestro/subflows/input-spark-address.yml | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/mobile/.maestro/subflows/input-spark-address.yml b/mobile/.maestro/subflows/input-spark-address.yml index 59b4de44..4835a94f 100644 --- a/mobile/.maestro/subflows/input-spark-address.yml +++ b/mobile/.maestro/subflows/input-spark-address.yml @@ -30,5 +30,13 @@ appId: com.layerzwallet.mobile # Dismiss the soft keyboard so the bottom Next button is reachable. # (Without this the IME covers send-address-next-button on Android, and on iOS the # button sits below the keyboard since send-address.tsx no longer uses KeyboardAvoidingView.) -- hideKeyboard +# We tap an empty area instead of `hideKeyboard` because that command hard-fails on +# iOS when the keyboard has no inputAccessoryView/Done button, even after the keyboard +# successfully dismisses. Mirrors the convention in swap.yml of tapping a non-input area. +# y=22% lands in the padding between the address card (ends ~y=24% of screen) and the +# Tokens section header (starts ~y=32%). Critically, this point is *above* any soft +# keyboard on both iOS (top ~y=65%) and Android (top ~y=55%), so the tap can't accidentally +# land on a keyboard key like 50%,50% would on Android. +- tapOn: + point: '50%,22%' - waitForAnimationToEnd From 2809e42b1f413b8d2845c5ed7b5fdc98cc6e39c2 Mon Sep 17 00:00:00 2001 From: r1n04h Date: Mon, 25 May 2026 18:12:20 +0100 Subject: [PATCH 8/9] chore: migrade electrum server --- CLAUDE.md | 2 +- shared/blue_modules/BlueElectrum.ts | 2 +- shared/tests/integration-vi/blue-electrum.test.ts | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 65d310df..632672f2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -157,7 +157,7 @@ Each Layer2 follows a specific pattern: **Bitcoin (UTXO-based)** - Uses `WatchOnlyWallet` wrapping `HDSegwitBech32Wallet` - BIP84 derivation: `m/84'/0'/{account}'` -- Electrum server (electrum.layerzwallet.com) for balance/tx/UTXO queries +- Electrum server (electrum2.layerzwallet.com:50005) for balance/tx/UTXO queries - Gap limit of 20 for address discovery **EVM Chains (Rootstock, Botanix, Citrea, Alpen)** diff --git a/shared/blue_modules/BlueElectrum.ts b/shared/blue_modules/BlueElectrum.ts index 93cf4532..d20a9911 100644 --- a/shared/blue_modules/BlueElectrum.ts +++ b/shared/blue_modules/BlueElectrum.ts @@ -72,7 +72,7 @@ type Peer = { path?: string; }; -export const hardcodedPeers: Peer[] = [{ host: 'electrum.layerzwallet.com', port: 50004 }]; +export const hardcodedPeers: Peer[] = [{ host: 'electrum2.layerzwallet.com', port: 50005 }]; let mainClient: WsElectrumClient; export let mainConnected: boolean = false; diff --git a/shared/tests/integration-vi/blue-electrum.test.ts b/shared/tests/integration-vi/blue-electrum.test.ts index 39799a8b..9b5f9499 100644 --- a/shared/tests/integration-vi/blue-electrum.test.ts +++ b/shared/tests/integration-vi/blue-electrum.test.ts @@ -18,7 +18,7 @@ beforeAll(async () => { }); test.skip('can do websocket electrum request', async () => { - const socket = new WebSocket('wss://electrum.layerzwallet.com:50004'); + const socket = new WebSocket('wss://electrum2.layerzwallet.com:50005'); let gotMessage = false; socket.addEventListener('open', (event) => { @@ -118,7 +118,7 @@ describe('BlueElectrum', () => { assert.ok(!(await BlueElectrum.testConnection('joyreactor.cc', 443))); assert.ok(!(await BlueElectrum.testConnection('joyreactor.cc', 80))); - assert.ok(await BlueElectrum.testConnection('electrum.layerzwallet.com', 50004)); + assert.ok(await BlueElectrum.testConnection('electrum2.layerzwallet.com', 50005)); }); it('ElectrumClient can estimate fees', async () => { From d2788648ec89a0e46ff4bf069a9a09bdc716b8e3 Mon Sep 17 00:00:00 2001 From: r1n04h Date: Mon, 25 May 2026 21:08:02 +0100 Subject: [PATCH 9/9] chore: migrade electrum server --- mobile/.maestro/subflows/input-spark-address.yml | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/mobile/.maestro/subflows/input-spark-address.yml b/mobile/.maestro/subflows/input-spark-address.yml index 4835a94f..e729415d 100644 --- a/mobile/.maestro/subflows/input-spark-address.yml +++ b/mobile/.maestro/subflows/input-spark-address.yml @@ -5,6 +5,15 @@ appId: com.layerzwallet.mobile - tapOn: id: 'send-address-input' - waitForAnimationToEnd +# Extra wait so the iOS soft keyboard has time to fully present before the first +# eraseText/inputText. Maestro's `Keyboard (First Match)` probe hard-fails after 92s +# when the keyboard isn't up yet; the default ~300ms waitForAnimationToEnd is not +# always enough on CI simulators (especially when the simulator is in a state where +# the hardware keyboard suppresses the soft keyboard on first focus). +- runFlow: + file: sleep.yml + env: + TIMEOUT: 1500 - eraseText: 1 - inputText: 'spark1pgssyjcyyyp' - runFlow: