Skip to content

Commit 48972c1

Browse files
authored
Merge branch 'master' into feat/trezor-hardware-support
2 parents d8e2d80 + 6f5ce41 commit 48972c1

93 files changed

Lines changed: 930 additions & 438 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ jobs:
2323

2424
steps:
2525
- name: Checkout
26-
uses: actions/checkout@v4
26+
uses: actions/checkout@v6
2727

2828
- name: Setup Java
29-
uses: actions/setup-java@v4
29+
uses: actions/setup-java@v5
3030
with:
3131
java-version: '17'
3232
distribution: 'adopt'
3333

3434
- name: Setup Gradle
35-
uses: gradle/actions/setup-gradle@v4
35+
uses: gradle/actions/setup-gradle@v5
3636

3737
- name: Decode google-services.json
3838
run: echo "$GOOGLE_SERVICES_JSON_BASE64" | base64 -d > app/google-services.json
@@ -50,7 +50,7 @@ jobs:
5050
run: ./gradlew testDevDebugUnitTest
5151

5252
- name: Upload test report
53-
uses: actions/upload-artifact@v4
53+
uses: actions/upload-artifact@v6
5454
with:
5555
name: unit_test_report_${{ github.run_number }}
5656
path: app/build/reports/tests/testDevDebugUnitTest/

.github/workflows/claude-code-review.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ jobs:
3131

3232
steps:
3333
- name: Checkout repository
34-
uses: actions/checkout@v4
34+
uses: actions/checkout@v6
3535
with:
3636
fetch-depth: 1
3737

.github/workflows/claude.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ jobs:
3030
actions: read # Required for Claude to read CI results on PRs
3131
steps:
3232
- name: Checkout repository
33-
uses: actions/checkout@v4
33+
uses: actions/checkout@v6
3434
with:
3535
fetch-depth: 0 # Full history for git operations
3636

.github/workflows/e2e.yml

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
outputs:
2626
code: ${{ github.event_name == 'workflow_dispatch' || steps.filter.outputs.code == 'true' }}
2727
steps:
28-
- uses: actions/checkout@v4
28+
- uses: actions/checkout@v6
2929
- uses: dorny/paths-filter@v3
3030
if: github.event_name == 'pull_request'
3131
id: filter
@@ -45,16 +45,16 @@ jobs:
4545

4646
steps:
4747
- name: Checkout
48-
uses: actions/checkout@v4
48+
uses: actions/checkout@v6
4949

5050
- name: Setup Java
51-
uses: actions/setup-java@v4
51+
uses: actions/setup-java@v5
5252
with:
5353
java-version: "17"
5454
distribution: "adopt"
5555

5656
- name: Setup Gradle
57-
uses: gradle/actions/setup-gradle@v4
57+
uses: gradle/actions/setup-gradle@v5
5858

5959
- name: Decode google-services.json
6060
run: echo "$GOOGLE_SERVICES_JSON_BASE64" | base64 -d > app/google-services.json
@@ -76,7 +76,7 @@ jobs:
7676
mv "$apk" app/build/outputs/apk/dev/debug/bitkit_e2e.apk
7777
7878
- name: Upload APK (local)
79-
uses: actions/upload-artifact@v4
79+
uses: actions/upload-artifact@v6
8080
with:
8181
name: bitkit-e2e-apk_${{ github.run_number }}
8282
path: app/build/outputs/apk/dev/debug/bitkit_e2e.apk
@@ -88,16 +88,16 @@ jobs:
8888

8989
steps:
9090
- name: Checkout
91-
uses: actions/checkout@v4
91+
uses: actions/checkout@v6
9292

9393
- name: Setup Java
94-
uses: actions/setup-java@v4
94+
uses: actions/setup-java@v5
9595
with:
9696
java-version: "17"
9797
distribution: "adopt"
9898

9999
- name: Setup Gradle
100-
uses: gradle/actions/setup-gradle@v4
100+
uses: gradle/actions/setup-gradle@v5
101101

102102
- name: Decode google-services.json
103103
run: echo "$GOOGLE_SERVICES_JSON_BASE64" | base64 -d > app/google-services.json
@@ -120,7 +120,7 @@ jobs:
120120
mv "$apk" app/build/outputs/apk/dev/debug/bitkit_e2e.apk
121121
122122
- name: Upload APK (regtest)
123-
uses: actions/upload-artifact@v4
123+
uses: actions/upload-artifact@v6
124124
with:
125125
name: bitkit-e2e-apk-regtest_${{ github.run_number }}
126126
path: app/build/outputs/apk/dev/debug/bitkit_e2e.apk
@@ -159,7 +159,7 @@ jobs:
159159
run: echo $E2E_BRANCH
160160

161161
- name: Clone E2E tests
162-
uses: actions/checkout@v4
162+
uses: actions/checkout@v6
163163
with:
164164
repository: synonymdev/bitkit-e2e-tests
165165
path: bitkit-e2e-tests
@@ -172,7 +172,7 @@ jobs:
172172
sudo udevadm trigger --name-match=kvm
173173
174174
- name: AVD cache
175-
uses: actions/cache@v4
175+
uses: actions/cache@v5
176176
id: avd-cache
177177
with:
178178
path: |
@@ -194,7 +194,7 @@ jobs:
194194
script: echo "Generated AVD snapshot for caching."
195195

196196
- name: Download APK
197-
uses: actions/download-artifact@v4
197+
uses: actions/download-artifact@v6
198198
with:
199199
name: bitkit-e2e-apk_${{ github.run_number }}
200200
path: bitkit-e2e-tests/aut
@@ -203,12 +203,12 @@ jobs:
203203
run: ls -l bitkit-e2e-tests/aut
204204

205205
- name: Setup Node.js
206-
uses: actions/setup-node@v4
206+
uses: actions/setup-node@v5
207207
with:
208208
node-version: 22
209209

210210
- name: Cache npm cache
211-
uses: actions/cache@v3
211+
uses: actions/cache@v5
212212
with:
213213
path: ~/.npm
214214
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -286,7 +286,7 @@ jobs:
286286

287287
- name: Upload E2E Artifacts (${{ matrix.shard.name }})
288288
if: failure()
289-
uses: actions/upload-artifact@v4
289+
uses: actions/upload-artifact@v6
290290
with:
291291
name: e2e-artifacts_${{ matrix.shard.name }}_${{ github.run_number }}
292292
path: bitkit-e2e-tests/artifacts/
@@ -315,7 +315,7 @@ jobs:
315315
run: echo $E2E_BRANCH
316316

317317
- name: Clone E2E tests
318-
uses: actions/checkout@v4
318+
uses: actions/checkout@v6
319319
with:
320320
repository: synonymdev/bitkit-e2e-tests
321321
path: bitkit-e2e-tests
@@ -328,7 +328,7 @@ jobs:
328328
sudo udevadm trigger --name-match=kvm
329329
330330
- name: AVD cache
331-
uses: actions/cache@v4
331+
uses: actions/cache@v5
332332
id: avd-cache
333333
with:
334334
path: |
@@ -350,7 +350,7 @@ jobs:
350350
script: echo "Generated AVD snapshot for caching."
351351

352352
- name: Download APK (regtest)
353-
uses: actions/download-artifact@v4
353+
uses: actions/download-artifact@v6
354354
with:
355355
name: bitkit-e2e-apk-regtest_${{ github.run_number }}
356356
path: bitkit-e2e-tests/aut
@@ -359,12 +359,12 @@ jobs:
359359
run: ls -l bitkit-e2e-tests/aut
360360

361361
- name: Setup Node.js
362-
uses: actions/setup-node@v4
362+
uses: actions/setup-node@v5
363363
with:
364364
node-version: 22
365365

366366
- name: Cache npm cache
367-
uses: actions/cache@v3
367+
uses: actions/cache@v5
368368
with:
369369
path: ~/.npm
370370
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -429,7 +429,7 @@ jobs:
429429

430430
- name: Upload E2E Artifacts (${{ matrix.shard.name }})
431431
if: failure()
432-
uses: actions/upload-artifact@v4
432+
uses: actions/upload-artifact@v6
433433
with:
434434
name: e2e-artifacts-regtest_${{ matrix.shard.name }}_${{ github.run_number }}
435435
path: bitkit-e2e-tests/artifacts/

.github/workflows/e2e_migration.yml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,16 @@ jobs:
2525

2626
steps:
2727
- name: Checkout
28-
uses: actions/checkout@v4
28+
uses: actions/checkout@v6
2929

3030
- name: Setup Java
31-
uses: actions/setup-java@v4
31+
uses: actions/setup-java@v5
3232
with:
3333
java-version: "17"
3434
distribution: "adopt"
3535

3636
- name: Setup Gradle
37-
uses: gradle/actions/setup-gradle@v4
37+
uses: gradle/actions/setup-gradle@v5
3838

3939
- name: Decode google-services.json
4040
run: echo "$GOOGLE_SERVICES_JSON_BASE64" | base64 -d > app/google-services.json
@@ -57,7 +57,7 @@ jobs:
5757
mv "$apk" app/build/outputs/apk/dev/debug/bitkit_e2e.apk
5858
5959
- name: Upload APK
60-
uses: actions/upload-artifact@v4
60+
uses: actions/upload-artifact@v6
6161
with:
6262
name: bitkit-e2e-apk_${{ github.run_number }}
6363
path: app/build/outputs/apk/dev/debug/bitkit_e2e.apk
@@ -96,7 +96,7 @@ jobs:
9696
run: echo $E2E_BRANCH
9797

9898
- name: Clone E2E tests
99-
uses: actions/checkout@v4
99+
uses: actions/checkout@v6
100100
with:
101101
repository: synonymdev/bitkit-e2e-tests
102102
path: bitkit-e2e-tests
@@ -109,7 +109,7 @@ jobs:
109109
sudo udevadm trigger --name-match=kvm
110110
111111
- name: AVD cache
112-
uses: actions/cache@v4
112+
uses: actions/cache@v5
113113
id: avd-cache
114114
with:
115115
path: |
@@ -131,7 +131,7 @@ jobs:
131131
script: echo "Generated AVD snapshot for caching."
132132

133133
- name: Download APK
134-
uses: actions/download-artifact@v4
134+
uses: actions/download-artifact@v6
135135
with:
136136
name: bitkit-e2e-apk_${{ github.run_number }}
137137
path: bitkit-e2e-tests/aut
@@ -145,12 +145,12 @@ jobs:
145145
run: ls -l bitkit-e2e-tests/aut
146146

147147
- name: Setup Node.js
148-
uses: actions/setup-node@v4
148+
uses: actions/setup-node@v5
149149
with:
150150
node-version: 22
151151

152152
- name: Cache npm cache
153-
uses: actions/cache@v3
153+
uses: actions/cache@v5
154154
with:
155155
path: ~/.npm
156156
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
@@ -215,7 +215,7 @@ jobs:
215215

216216
- name: Upload E2E Artifacts (${{ matrix.scenario.name }})
217217
if: failure()
218-
uses: actions/upload-artifact@v4
218+
uses: actions/upload-artifact@v6
219219
with:
220220
name: e2e-artifacts_${{ matrix.scenario.name }}_${{ matrix.rn_version }}_${{ github.run_number }}
221221
path: bitkit-e2e-tests/artifacts/

.github/workflows/lint.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@ jobs:
2424

2525
steps:
2626
- name: Checkout
27-
uses: actions/checkout@v4
27+
uses: actions/checkout@v6
2828

2929
- name: Setup Java
30-
uses: actions/setup-java@v4
30+
uses: actions/setup-java@v5
3131
with:
3232
java-version: '17'
3333
distribution: 'adopt'
3434

3535
- name: Setup Gradle
36-
uses: gradle/actions/setup-gradle@v4
36+
uses: gradle/actions/setup-gradle@v5
3737

3838
- name: Run Detekt Analysis
3939
run: |
@@ -48,7 +48,7 @@ jobs:
4848
continue-on-error: true
4949

5050
- name: Upload lint report
51-
uses: actions/upload-artifact@v4
51+
uses: actions/upload-artifact@v6
5252
with:
5353
name: lint_report_${{ github.run_number }}
5454
path: app/build/reports/detekt/

.github/workflows/ui-tests.yml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,16 +16,16 @@ jobs:
1616

1717
steps:
1818
- name: Checkout the code
19-
uses: actions/checkout@v4
19+
uses: actions/checkout@v6
2020

2121
- name: Set up JDK 17
22-
uses: actions/setup-java@v4
22+
uses: actions/setup-java@v5
2323
with:
2424
java-version: '17'
2525
distribution: 'adopt'
2626

2727
- name: Cache gradle
28-
uses: actions/cache@v4
28+
uses: actions/cache@v5
2929
with:
3030
path: |
3131
~/.gradle/caches
@@ -59,7 +59,7 @@ jobs:
5959
sudo udevadm trigger --name-match=kvm
6060
6161
- name: AVD cache
62-
uses: actions/cache@v4
62+
uses: actions/cache@v5
6363
id: avd-cache
6464
with:
6565
path: |
@@ -105,7 +105,7 @@ jobs:
105105
106106
- name: Upload UI test report
107107
if: always()
108-
uses: actions/upload-artifact@v4
108+
uses: actions/upload-artifact@v6
109109
with:
110110
name: compose_test_report
111111
path: |

AGENTS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,10 @@ suspend fun getData(): Result<Data> = withContext(Dispatchers.IO) {
232232
- ALWAYS prefer `when (subject)` with Kotlin guard conditions (`if`) over condition-based `when {}` with `is` type checks, e.g. `when (event) { is Foo if event.x == y -> ... }` instead of `when { event is Foo && event.x == y -> ... }`
233233
- ALWAYS prefer `sealed interface` over `sealed class` when no shared state or constructor is needed
234234
- NEVER duplicate error logging in `.onFailure {}` if the called method already logs the same error internally
235+
- ALWAYS use `ImmutableList`/`ImmutableMap`/`ImmutableSet` instead of `List`/`Map`/`Set` for composable function parameters and UiState data class fields
236+
- ALWAYS annotate UiState data classes with `@Immutable`; use `@Stable` instead when any field holds a non-immutable type (e.g. `Throwable`, external library types from `bitkitcore`/`ldknode`/`vssclient`, or types containing plain `List`/`Map`/`Set`)
237+
- ALWAYS use `.toImmutableList()`, `.toImmutableMap()`, `.toImmutableSet()` when producing collections for UI state
238+
- ALWAYS use `persistentListOf()`, `persistentMapOf()`, `persistentSetOf()` for default values in UiState fields
235239

236240
### Device Debugging (adb)
237241

app/build.gradle.kts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,8 +55,8 @@ android {
5555
applicationId = "to.bitkit"
5656
minSdk = 28
5757
targetSdk = 36
58-
versionCode = 179
59-
versionName = "2.1.1"
58+
versionCode = 180
59+
versionName = "2.1.2"
6060
testInstrumentationRunner = "to.bitkit.test.HiltTestRunner"
6161
vectorDrawables {
6262
useSupportLibrary = true
@@ -225,6 +225,7 @@ dependencies {
225225
implementation(libs.material)
226226
implementation(libs.datastore.preferences)
227227
implementation(libs.kotlinx.datetime)
228+
implementation(libs.kotlinx.collections.immutable)
228229
implementation(libs.biometric)
229230
implementation(libs.zxing)
230231
implementation(libs.barcode.scanning)

0 commit comments

Comments
 (0)