Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
3757 commits
Select commit Hold shift + click to select a range
d2982c6
Add test
Oct 24, 2023
49e640b
Fix CodeFactor
yahiheb Oct 24, 2023
4e234be
Fix CodeFactor
yahiheb Oct 24, 2023
f3f6fee
Order elements
yahiheb Oct 24, 2023
1546b60
Remove unused parameter
yahiheb Oct 24, 2023
d8c3ff5
Fix broken server
nopara73 Oct 25, 2023
5ae1d50
Merge pull request #11768 from wieslawsoltes/vdg/fixes/11728-fix-dial…
RolandUI Oct 25, 2023
c472362
Merge pull request #11793 from yahiheb/unused-param
RolandUI Oct 25, 2023
3a80063
Merge pull request #11792 from yahiheb/codefactor
RolandUI Oct 25, 2023
9e7808a
cleanup
RolandUI Oct 25, 2023
2f8e13a
Merge pull request #11778 from SuperJMN/improvements/change-next-button
RolandUI Oct 25, 2023
de88fbd
Fix up
kiminuo Oct 25, 2023
c99dc02
Merge pull request #11767 from wieslawsoltes/vdg/fixes/11726-fix-NavB…
RolandUI Oct 25, 2023
29772dd
revert
adamPetho Oct 25, 2023
0b1850f
proper fix
adamPetho Oct 25, 2023
a399659
Merge pull request #11787 from adamPetho/fix_copy_amount_on_tx_preview
RolandUI Oct 25, 2023
dde6f98
Fix History update issues
SuperJMN Oct 25, 2023
a9c9f42
Merge branch 'UI-Decoupling50' of https://github.com/ichthus1604/Wall…
SuperJMN Oct 25, 2023
322e573
Don't skip blame rounds
nopara73 Oct 25, 2023
04f9151
Merge from master
SuperJMN Oct 25, 2023
f9b2acc
Fix inability to remove items
SuperJMN Oct 25, 2023
09d22ea
Update and move up the check into foreach
Szpoti Oct 25, 2023
0f00a6c
Set PreferPsbtWorkflow true when importing ColdCard
Szpoti Oct 25, 2023
ae98028
Merge pull request #11789 from Szpoti/fixChangelessSuggestion
RolandUI Oct 25, 2023
f0b884d
Merge pull request #11797 from Szpoti/preferPSBTOnImportColdcard
RolandUI Oct 25, 2023
5bad2e3
Reverse order of SpeedUp Children
SuperJMN Oct 25, 2023
98f8f15
remove exception for null parent of CPFP
Oct 25, 2023
d998765
Merge pull request #11644 from ichthus1604/UI-Decoupling50
RolandUI Oct 25, 2023
bd1d52a
Merge pull request #11791 from turbolay/fixAmountCR
yahiheb Oct 25, 2023
70431f2
Merge branch 'UI-Decoupling50' into UI-Decoupling51
Oct 25, 2023
0172d20
Merge branch 'UI-Decoupling51' into UI-Decoupling52
Oct 25, 2023
3ddb375
Merge branch 'UI-Decoupling52' into UI-Decoupling53
Oct 25, 2023
801d05e
Update DynamicData to latest version
Oct 25, 2023
ff91a38
Remove duplicated method
Oct 25, 2023
742b02b
Bind IsCoinjoining
Oct 25, 2023
7a0723c
Compile fix
Oct 25, 2023
e199002
Remove one `WithAwaitCancellationAsync` overload (#11780)
kiminuo Oct 25, 2023
69ac7cf
Fix TextBox revealPasswordButton style for ToggleButton
wieslawsoltes Oct 25, 2023
6ecabf7
Merge branch 'zkSNACKs:master' into vdg/fixes/11730-fix-labels-column…
wieslawsoltes Oct 25, 2023
4812846
Edit error message
yahiheb Oct 26, 2023
bc85609
Move ViewModel Registration out of MainViewModel
Oct 26, 2023
43fa668
Remove unused method
Oct 26, 2023
1326757
compile fix
Oct 26, 2023
cc7e501
Remove unused method
Oct 26, 2023
76c8f67
Merge pull request #11753 from soosr/fix-11668-message
RolandUI Oct 26, 2023
25bf1bf
Merge pull request #11772 from wieslawsoltes/vdg/fixes/11749-fix-pass…
RolandUI Oct 26, 2023
3067865
Merge branch 'master' into UI-Decoupling51
RolandUI Oct 26, 2023
9f95ca3
Merge pull request #11665 from ichthus1604/UI-Decoupling51
RolandUI Oct 26, 2023
7114c70
Merge branch 'master' into UI-Decoupling52
RolandUI Oct 26, 2023
8ceafe8
remove leftover
RolandUI Oct 26, 2023
aded5c0
Do it in leftover place as well
nopara73 Oct 26, 2023
e506dc7
Merge pull request #11805 from soosr/remove-leftover-mainviewmodel
RolandUI Oct 26, 2023
06be804
Merge branch 'master' into UI-Decoupling52
RolandUI Oct 26, 2023
7d64127
unused usings
RolandUI Oct 26, 2023
12f35d0
Merge pull request #11800 from ichthus1604/UI-Decoupling52
RolandUI Oct 26, 2023
8470b31
Merge branch 'master' into UI-Decoupling53
RolandUI Oct 26, 2023
6533923
remove leftover
RolandUI Oct 26, 2023
83386cb
Remove unused usings
Oct 26, 2023
0dca9e4
Use fetcher for addresses
SuperJMN Oct 26, 2023
ea25161
Update Directory.Packages.props
Oct 26, 2023
f33d546
remove leftover code
Oct 26, 2023
1ed4fdd
Merge branch 'UI-Decoupling53' into UI-Decoupling54
Oct 26, 2023
6af4243
Remove leftover code from WalletRepository
Oct 26, 2023
fce44a9
Fix Codefactor (#11799)
yahiheb Oct 26, 2023
dad024a
Merge pull request #11795 from nopara73/1698224620
nopara73 Oct 26, 2023
0c93231
Optimize Address use cases
SuperJMN Oct 26, 2023
cfa9832
Remove leftovers
SuperJMN Oct 26, 2023
1c31adf
Merge from master
SuperJMN Oct 26, 2023
7c67621
Merge pull request #11807 from SuperJMN/improvements/addresses-use-fe…
RolandUI Oct 26, 2023
848a56e
Cleanup
SuperJMN Oct 26, 2023
8bd77c1
remove disposable
RolandUI Oct 26, 2023
a9fcbcd
Remove usings
SuperJMN Oct 26, 2023
3b5ab4c
Apply minor modifications
SuperJMN Oct 26, 2023
97912f7
Decouple Notifications
Oct 26, 2023
68ca8e1
remove unneeded usings
Oct 26, 2023
e247da9
Remove unneeded usings
Oct 26, 2023
95505c9
Fix empty wallet history.
SuperJMN Oct 26, 2023
0459c8b
Merge branch 'master' into UI-Decoupling53
Oct 26, 2023
2d1a098
Merge branch 'UI-Decoupling53' of https://github.com/ichthus1604/Wall…
Oct 26, 2023
da6dc6b
Merge branch 'UI-Decoupling53' into UI-Decoupling54
Oct 26, 2023
3b8fcdc
Merge branch 'UI-Decoupling54' into UI-Decoupling55
Oct 26, 2023
ac951c0
Merge from master
SuperJMN Oct 26, 2023
4f8414a
Attempt to fix lockup
SuperJMN Oct 26, 2023
e8b2aaa
Merge branch 'UI-Decoupling55' of https://github.com/ichthus1604/Wall…
Oct 26, 2023
8279c9b
fix cf
Oct 26, 2023
1b2f003
Add Wallet State filter
Oct 26, 2023
a0d23b0
Fix test compilation
Oct 26, 2023
eb6b09a
Prison inheritance performance improvement (#11813)
lontivero Oct 26, 2023
a1bbe26
Fix shift by 1
SuperJMN Oct 26, 2023
93a9379
Fix Wallet Dialogs
Oct 27, 2023
3c60ae3
Merge branch 'master' into UI-Decoupling56
Oct 27, 2023
3225874
Decouple Coinjoin Details
Oct 27, 2023
6ef9927
Do not ban coinjoin outputs (#11820)
lontivero Oct 27, 2023
c9df89f
Fix CodeFactor (#11815)
yahiheb Oct 27, 2023
7e533ea
Fix ban double spenders (#11822)
lontivero Oct 27, 2023
fcc87d8
Merge pull request #11816 from ichthus1604/FixWalletDialogs
RolandUI Oct 28, 2023
d91e15c
Merge branch 'master' into UI-Decoupling53
RolandUI Oct 28, 2023
aa4968d
cleanup
RolandUI Oct 28, 2023
b7ae48e
Decouple LegalDocumentsViewModel
Oct 28, 2023
4a939da
fix tests compilation
Oct 28, 2023
fa549fb
Fix FadeInBehavior property registration
wieslawsoltes Oct 28, 2023
ee24f4b
Fix PrivacyRing loading animation showing twice when opened
wieslawsoltes Oct 28, 2023
fb881df
Use AdornerLayer.SetAdorner to add and remove adorner in AdorningCont…
wieslawsoltes Oct 28, 2023
fc1d9a0
Simplify if/else condition
wieslawsoltes Oct 28, 2023
9a75392
Fix usd formatting in tiles
wieslawsoltes Oct 28, 2023
68df121
Fix setting classes for history items
wieslawsoltes Oct 28, 2023
114ea6a
ShuttingDownViewModel
Oct 30, 2023
9bb086b
Merge pull request #11828 from wieslawsoltes/vdg/fixes/11823-fix-save…
RolandUI Oct 30, 2023
2b27da9
Merge pull request #11827 from wieslawsoltes/vdg/fixes/9338-fix-anima…
RolandUI Oct 30, 2023
767b1eb
Merge pull request #11829 from wieslawsoltes/vdg/fixes/11776-fix-usd-…
RolandUI Oct 30, 2023
109fade
Merge pull request #11831 from wieslawsoltes/vdg/fixes/9920-fix-setti…
RolandUI Oct 30, 2023
b04f19f
Merge pull request #11826 from wieslawsoltes/vdg/fixes/FixFadeInBehav…
RolandUI Oct 30, 2023
3620916
naming
RolandUI Oct 30, 2023
5dc77e4
Merge pull request #11810 from SuperJMN/performance/receive-button
RolandUI Oct 30, 2023
9800942
fix aura
RolandUI Oct 30, 2023
13a852b
Merge branch 'master' into UI-Decoupling53
RolandUI Oct 30, 2023
b2b1a5e
Merge pull request #11801 from ichthus1604/UI-Decoupling53
RolandUI Oct 30, 2023
85e1fc0
Merge branch 'master' into UI-Decoupling54
RolandUI Oct 30, 2023
31254c7
Merge pull request #11808 from ichthus1604/UI-Decoupling54
RolandUI Oct 30, 2023
a5815bb
Merge branch 'master' into UI-Decoupling55
RolandUI Oct 30, 2023
d01b0a4
fix is busy
RolandUI Oct 30, 2023
c35266b
fix CF
RolandUI Oct 30, 2023
c9e04ec
fix CF
RolandUI Oct 30, 2023
9269bb3
fix tests
RolandUI Oct 30, 2023
f2b4303
Merge pull request #11811 from ichthus1604/UI-Decoupling55
RolandUI Oct 30, 2023
31f0936
Merge branch 'master' into UI-Decoupling56
RolandUI Oct 30, 2023
d531ff4
`Config`: Remove `converter` (#11834)
kiminuo Oct 30, 2023
50a73a0
StatusIconViewModel decoupling
Oct 31, 2023
4479632
Merge branch 'master' into UI-Decoupling56
Oct 31, 2023
e931e96
Merge branch 'UI-Decoupling56' into UI-Decoupling57
Oct 31, 2023
c85fa6c
Merge branch 'UI-Decoupling57' into UI-Decoupling58
Oct 31, 2023
0b8ac9a
Merge branch 'UI-Decoupling58' into UI-Decoupling59
Oct 31, 2023
a117732
proper disposal
Oct 31, 2023
7638923
fix amount was never be negative (#11839)
RolandUI Oct 31, 2023
207ca50
Merge branch 'master' into UI-Decoupling56
Oct 31, 2023
d44d07b
Fixed update
Oct 31, 2023
8a4e9ca
fix update
RolandUI Oct 31, 2023
92ddeee
CF
RolandUI Oct 31, 2023
a4b49c1
Merge pull request #11817 from ichthus1604/UI-Decoupling56
RolandUI Oct 31, 2023
dd93376
Merge branch 'master' into UI-Decoupling57
RolandUI Oct 31, 2023
e293483
Merge pull request #11825 from ichthus1604/UI-Decoupling57
RolandUI Oct 31, 2023
c98b6bf
Merge branch 'master' into UI-Decoupling58
RolandUI Oct 31, 2023
044db28
fix tests
RolandUI Oct 31, 2023
a9db0f7
Merge pull request #11837 from ichthus1604/UI-Decoupling58
RolandUI Oct 31, 2023
d584e54
Merge branch 'master' into UI-Decoupling59
RolandUI Oct 31, 2023
50a738c
fix test
RolandUI Oct 31, 2023
e0f2857
fix test again
RolandUI Oct 31, 2023
3901e94
remove using
RolandUI Oct 31, 2023
a059cd2
moved State observable last
Oct 31, 2023
b64fa43
fix CodeFactor
Oct 31, 2023
5463580
Fix synchronization issue (#11846)
lontivero Oct 31, 2023
33055a9
Add headless unit testing packages
wieslawsoltes Oct 31, 2023
25d9738
Add VerifyTests ModuleInit
wieslawsoltes Oct 31, 2023
3d774e3
Add test App and TestAppBuilder
wieslawsoltes Oct 31, 2023
964f42d
Disable PathMap as it breaks VerifyXunit
wieslawsoltes Oct 31, 2023
6816ffa
Add helper HeadlessWindowExtensions
wieslawsoltes Oct 31, 2023
a426a3f
Add AnimatedButtonTests
wieslawsoltes Oct 31, 2023
acdb048
Added 1 more Exchange rate provider (#11841)
AlexisKv Oct 31, 2023
94477ae
Move to separate folder AnimatedButtonTests
wieslawsoltes Oct 31, 2023
3b9e147
Add AmountControl control test
wieslawsoltes Oct 31, 2023
3c17d26
Fix Ask me later
SuperJMN Nov 1, 2023
4607176
Fix version display
SuperJMN Nov 1, 2023
13c752f
`CoinsRegistry`: `CoinsByPrevOuts` to `TxidsByInputPrevOuts` (#11790)
Nov 1, 2023
716fe36
fix ask me later button
RolandUI Nov 1, 2023
038df38
uncomment dispose
RolandUI Nov 1, 2023
da51f91
Merge pull request #11842 from ichthus1604/UI-Decoupling59
RolandUI Nov 1, 2023
5516a4b
Use lazy initialization for scripts in `HdPubKey` (#11848)
Nov 1, 2023
fb67910
RPC service refactoring (#11814)
lontivero Nov 1, 2023
36e8cbf
Add some help to the command line (#11739)
lontivero Nov 1, 2023
8da9e33
Simplify balances
SuperJMN Nov 1, 2023
be64c32
Merge pull request #11850 from SuperJMN/improvements/simplify-balances
RolandUI Nov 2, 2023
16df170
Split theme variant resources
wieslawsoltes Nov 2, 2023
5836acf
Remove duplicate reources
wieslawsoltes Nov 2, 2023
d2f8769
Restore TileRegionColor color
wieslawsoltes Nov 2, 2023
fc1657f
Merge pull request #11852 from wieslawsoltes/vdg/refactor/split-theme…
RolandUI Nov 2, 2023
54d8da7
`Constants`: Do not parse keys until needed (#11835)
kiminuo Nov 2, 2023
2845036
Apply separation of concerns
SuperJMN Nov 2, 2023
4168400
Add blur effect to background when dialog is shown
wieslawsoltes Nov 2, 2023
b33d30b
Increase radius
wieslawsoltes Nov 2, 2023
1e43f6d
Don't use PubKey.Hash in HdPubKey equality comparer (#11851)
Nov 2, 2023
e0a4761
Rename
wieslawsoltes Nov 2, 2023
d922175
Add linux verified
wieslawsoltes Nov 2, 2023
3cf8033
Add windows verified
wieslawsoltes Nov 2, 2023
f7f8c88
Renames
SuperJMN Nov 2, 2023
8bcb20e
Use expression body for lambda expressions (#11855)
yahiheb Nov 3, 2023
59860a8
Do not ban our own coinjoin outputs (#11861)
lontivero Nov 3, 2023
eb8fcf0
Add log when we reject an input for been banned (#11862)
lontivero Nov 3, 2023
66dd382
[VDG] Improvements/use caches (#11845)
SuperJMN Nov 3, 2023
a59f3b1
Fix warnings in `WalletPageViewModel` (#11653)
kiminuo Nov 3, 2023
5a26918
[refactor] Client `Config`: Pass path around to prepare for extractio…
kiminuo Nov 4, 2023
51ad2a9
Fix getwalletinfo accounts result
wieslawsoltes Nov 4, 2023
8ae6b7b
Add single lifetime clipboard support
wieslawsoltes Nov 5, 2023
a79ad90
Merge pull request #11874 from wieslawsoltes/vdg/fixes/clipboard-sing…
RolandUI Nov 6, 2023
7325103
Merge pull request #11771 from wieslawsoltes/vdg/fixes/11730-fix-labe…
RolandUI Nov 6, 2023
8395081
Fix
SuperJMN Nov 6, 2023
d505664
Rename
SuperJMN Nov 6, 2023
793a532
Fix CF
SuperJMN Nov 6, 2023
0aca99d
tiny adjustment
RolandUI Nov 6, 2023
4ae102d
Merge pull request #11877 from SuperJMN/fixes/11864-unused-address-no…
RolandUI Nov 6, 2023
b5b2eaa
Reorg
SuperJMN Nov 6, 2023
f55319f
Fix
SuperJMN Nov 6, 2023
402950b
Fix CF
SuperJMN Nov 6, 2023
9f378f5
Use new Toggle method
SuperJMN Nov 6, 2023
e5daff1
Fix wallet info bypass
SuperJMN Nov 6, 2023
079ca8d
animation to have delay
RolandUI Nov 6, 2023
8c089fe
Merge pull request #11879 from SuperJMN/fixes/11804-searchbar-walleti…
RolandUI Nov 6, 2023
4bdd42d
[refactoring] Introduce `ConfigManager` 1/n (#11875)
kiminuo Nov 6, 2023
dd6e283
move fix logic
RolandUI Nov 6, 2023
873417c
only when selected
RolandUI Nov 6, 2023
831d9fa
Merge branch 'master' into fixes/11806-searchbar-send-depends-on-balance
RolandUI Nov 6, 2023
4642a59
use the commands rather
RolandUI Nov 6, 2023
1a3e89f
fix ui lag
RolandUI Nov 6, 2023
00e0a73
Merge pull request #11880 from soosr/fix-ui-lag
RolandUI Nov 6, 2023
cb3884d
Merge branch 'master' into fixes/11806-searchbar-send-depends-on-balance
RolandUI Nov 6, 2023
607608f
remove properties
RolandUI Nov 6, 2023
b589e62
fix CF
RolandUI Nov 6, 2023
559981d
Merge pull request #11878 from SuperJMN/fixes/11806-searchbar-send-de…
RolandUI Nov 6, 2023
ae8e492
Fix speedup & cancel
SuperJMN Nov 6, 2023
9b5f78f
Merge pull request #11884 from SuperJMN/fixes/11881-speedup-cancel
RolandUI Nov 6, 2023
7343220
Change Radius number format to double
wieslawsoltes Nov 7, 2023
2d27f43
Fix the animations
wieslawsoltes Nov 7, 2023
b14fecc
Ctrl+C must work even if a dialog window is open (#11876)
kiminuo Nov 7, 2023
4f6ee00
Fix `UpdateManager` nullability (#11892)
kiminuo Nov 7, 2023
53103e9
Merge pull request #11867 from wieslawsoltes/fixes/rpc/getwalletinfo-…
wieslawsoltes Nov 7, 2023
94161fc
remove leftover
RolandUI Nov 8, 2023
7558eb7
Merge pull request #11899 from soosr/remove-leftover
RolandUI Nov 8, 2023
a1d5eff
Do not animate on dialog closing, just reset effect
wieslawsoltes Nov 8, 2023
21bf1b5
[UI] refactor to remove `TransactionSummary` from `TransactionModel` …
RolandUI Nov 8, 2023
ce9e13e
adjust and temporary disable
RolandUI Nov 8, 2023
7c3e8cc
Merge pull request #11853 from wieslawsoltes/vdg/dialogs-blur-effect
RolandUI Nov 8, 2023
5c736ec
Merge pull request #11856 from SuperJMN/features/advances-cj-options-…
RolandUI Nov 8, 2023
9935ac0
Remove Verify support
wieslawsoltes Nov 8, 2023
d6be580
Merge remote-tracking branch 'upstream/master' into vdg/UiUnitTestsSetup
wieslawsoltes Nov 8, 2023
68c269c
Use EffectTransition instead of Animations for dialog background blur
wieslawsoltes Nov 8, 2023
5826581
Merge pull request #11847 from wieslawsoltes/vdg/UiUnitTestsSetup
RolandUI Nov 9, 2023
08c3951
Merge pull request #11906 from wieslawsoltes/vdg/dialogs-blur-effect-2
RolandUI Nov 9, 2023
46684a5
Introduce `ConfigManager` 2/n (#11863)
kiminuo Nov 9, 2023
ba078ba
Expose poisson scheduling in extension method (#11894)
Nov 9, 2023
b136ed7
Use built-in OnPlatform extension
wieslawsoltes Nov 9, 2023
2cf1518
Merge pull request #11912 from wieslawsoltes/vdg/mobile-use-onplatform
RolandUI Nov 10, 2023
dc57db1
`Logger`: Optimize logging a bit (#11911)
kiminuo Nov 10, 2023
9db68ac
Order elements (#11921)
yahiheb Nov 12, 2023
8d68978
[trivial] Newtonsoft converters: Explicit types (#11928)
kiminuo Nov 13, 2023
1a338c2
remove lefotver
RolandUI Nov 13, 2023
3cc31d5
Merge pull request #11930 from soosr/remove-leftover2
wieslawsoltes Nov 13, 2023
e480732
Quick fix for TreeDataGrid.ShowColumnHeaders=false
wieslawsoltes Nov 13, 2023
e1ce7e6
Merge pull request #11932 from wieslawsoltes/vdg/labelspanel-quickfix
RolandUI Nov 13, 2023
29646fe
Keep offenders grouped by txid. (#11939)
lontivero Nov 14, 2023
3621111
Reduce the punishment by half for offenders who spent. (#11940)
lontivero Nov 14, 2023
7902632
Bump version to v205
molnard Dec 20, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
3 changes: 0 additions & 3 deletions .deepsource.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
version = 1

[[analyzers]]
name = "csharp"

[[analyzers]]
name = "shell"
16 changes: 10 additions & 6 deletions .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ insert_final_newline = true
# Formatting - remove any whitespace characters preceding newline characters
trim_trailing_whitespace = true

[*.{cs,csproj}]
[*.{cs,csproj,props}]

# use hard tabs for indentation
indent_style = tab
Expand All @@ -26,14 +26,15 @@ indent_size = 2

[*.cs]

# Spell Checker rules
spelling_languages = en-us
spelling_checkable_types = strings,identifiers,comments
spelling_error_severity = information
spelling_exclusion_path = .\exclusion.dic

# require braces to be on a new line for all
csharp_new_line_before_open_brace = all

# Formatting - organize using options

# do not place System.* using directives before other using directives
dotnet_sort_system_directives_first = true:error

# Formatting - spacing options

# require NO space between a cast and the value
Expand Down Expand Up @@ -295,3 +296,6 @@ dotnet_diagnostic.CA1827.severity = warning

# CA1822: This complains to make functions static. Static is evil. Don't let it complain.
dotnet_diagnostic.CA1822.severity = none

# CA1868: Unnecessary call to Set.Contains(item)
dotnet_diagnostic.CA1868.severity = warning
1 change: 1 addition & 0 deletions .github/workflows/auto-add-to-projcet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
issues:
types:
- opened
- reopened

permissions: {}
jobs:
Expand Down
44 changes: 44 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
name: "CodeQL"

on:
push:
branches: [ "master" ]
pull_request:
branches: [ "master" ]

jobs:
analyze:
name: Analyze
runs-on: ubuntu-latest
permissions:
actions: read
contents: read
security-events: write
strategy:
fail-fast: false
matrix:
language: [ 'csharp' ]
steps:
- name: Checkout repository
uses: actions/checkout@v3

- name: Initialize CodeQL
uses: github/codeql-action/init@v2
with:
languages: ${{ matrix.language }}

- name: 'Install dotnet'
uses: actions/setup-dotnet@v3
with:
dotnet-version: '7.0.x'

- name: 'Restore packages'
run: dotnet restore

- name: 'Build project'
run: dotnet build --no-restore --configuration Release

- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v2
with:
category: "/language:${{matrix.language}}"
147 changes: 132 additions & 15 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
# Wasabi Coding Conventions
# Contributing to Wasabi Wallet

## How to be useful for the project

- Any issue labelled as [good first issue](https://github.com/zkSNACKs/WalletWasabi/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22) is good to start contributing to Wasabi.
- Always focus on a specific issue in your pull request and avoid unrelated/unnecessary changes.
- Avoid working on complex problems (fees, amount decomposition, coin selection...) without extensive research on the context, either on Github or asking to contributors.
- Avoid working on a UI or UX feature without first seeing a conclusion from a UX meeting.
- Consider filing a new issue or explaining in an opened issue the change that you want to make, and wait for concept ACKs to work on the implementation.
- For backend, the [Relevance Realization Buffet](https://github.com/orgs/zkSNACKs/projects/18/views/48) view is a list of tasks that has to be investigated or tackled. You can assign yourself to an issue or just make the pull request.
- Feel free to join the [zkSNACKs Slack Server](https://join.slack.com/t/tumblebit/shared_invite/enQtNjQ1MTQ2NzQ1ODI0LWIzOTg5YTM3YmNkOTg1NjZmZTQ3NmM1OTAzYmQyYzk1M2M0MTdlZDk2OTQwNzFiNTg1ZmExNzM0NjgzY2M0Yzg) to discuss with other contributors.

## Automatic code clean up

**Visual Studio IDE:**

**DO** use [CodeMaid](http://www.codemaid.net/), a Visual Studio extension to automatically clean up your code on saving the file.
**DO** use [CodeMaid](https://www.codemaid.net/), a Visual Studio extension to automatically clean up your code on saving the file.
CodeMaid is a non-intrusive code cleanup tool.

Wasabi's CodeMaid settings [can be found in the root of the repository](https://github.com/zkSNACKs/WalletWasabi/blob/master/CodeMaid.config). They are automatically picked up by Visual Studio when you open the project, assuming the CodeMaid extension is installed. Unfortunately CodeMaid has no Visual Studio Code extension yet. You can check out the progress on this [under this GitHub issue](https://github.com/codecadwallader/codemaid/issues/273).
Expand Down Expand Up @@ -55,14 +65,14 @@ If you are a new contributor **DO** keep refactoring pull requests short, uncomp

```cs
// GOOD
private AsyncLock AsyncLock { get; } = new AsyncLock();
private AsyncLock AsyncLock { get; } = new();
using (await AsyncLock.LockAsync())
{
...
}

// GOOD
private object Lock { get; } = new object();
private object Lock { get; } = new();
lock (Lock)
{
...
Expand Down Expand Up @@ -131,7 +141,7 @@ private async void Synchronizer_ResponseArrivedAsync(object? sender, EventArgs e
## `ConfigureAwait(false)`

Basically every async library method should use `ConfigureAwait(false)` except:
- Methods that touch objects on the UI Thread, like modifying UI controls.
- Methods that touch objects on the UI Thread, like modifying UI controls.
- Methods that are unit tests, xUnit [Fact].

**Usage:**
Expand All @@ -145,13 +155,26 @@ await MyMethodAsync().ConfigureAwait(false);
// Note: inside MyMethodAsync() you can still use .ConfigureAwait(false);.
var result = await MyMethodAsync();

// At this point we are still on the UI thread, so you can safely touch UI elements.
// At this point we are still on the UI thread, so you can safely touch UI elements.
myUiControl.Text = result;
```

- [ConfigureAwait FAQ](https://devblogs.microsoft.com/dotnet/configureawait-faq/)

## Disposing Subscriptions in ReactiveObjects
## Never throw AggregateException and Exception in a mixed way
It causes confusion and awkward catch clauses.
[Example](https://github.com/zkSNACKs/WalletWasabi/pull/10353/files)

---

# UI Coding Conventions

The following is a list of UI specific coding conventions. Follow these any time you are contributing code in the following projects:
- `WalletWasabi.Fluent`
- `WalletWasabi.Fluent.Desktop`
- `WalletWasabi.Fluent.Generators`

## Disposing Subscriptions in ReactiveObjects

**DO** follow [ReactiveUI's Subscription Disposing Conventions](https://reactiveui.net/docs/guidelines/framework/dispose-your-subscriptions).

Expand All @@ -174,14 +197,14 @@ this.WhenAnyValue(...)

## Subscribe triggered once on initialization

When you subscribe with the usage of `.WhenAnyValue()` right after the creation one call of Subcription will be triggered. This is by design and most of the cases it is fine. Still you can supress this behaviour by adding `Skip(1)`.
When you subscribe with the usage of `.WhenAnyValue()` right after the creation one call of Subcription will be triggered. This is by design and most of the cases it is fine. Still you can supress this behaviour by adding `Skip(1)`.

```cs
this.WhenAnyValue(x => x.PreferPsbtWorkflow)
.Skip(1)
.Subscribe(value =>
{
// Expensive operation, that should not run unnecessary.
// Expensive operation, that should not run unnecessary.
});
```

Expand All @@ -197,13 +220,13 @@ this.WhenAnyValue(x => x.PreferPsbtWorkflow)
public class RepositoryViewModel : ReactiveObject
{
private ObservableAsPropertyHelper<bool> _canDoIt;

public RepositoryViewModel()
{
_canDoIt = this.WhenAnyValue(...)
.ToProperty(this, x => x.CanDoIt, scheduler: RxApp.MainThreadScheduler);
}

public bool CanDoIt => _canDoIt?.Value ?? false;
}
```
Expand Down Expand Up @@ -236,12 +259,106 @@ Some pointers on how to recognise if we are breaking MVVM:

If it seems not possible to implement something without breaking some of this advice please consult with @danwalmsley.

## Avoid using Grid as much as possible, Use Panel instead
## Avoid using Grid as much as possible, Use Panel instead
If you don't need any row or column splitting for your child controls, just use `Panel` as your default container control instead of `Grid` since it is a moderately memory and CPU intensive control.

## Never throw AggregateException and Exception in a mixed way
It causes confusion and awkward catch clauses.
[Example](https://github.com/zkSNACKs/WalletWasabi/pull/10353/files)
## ViewModel Hierarchy

The ViewModel structure should reflect the UI structure as much as possible. This means that ViewModels can have *child* ViewModels directly referenced in their code, just like Views have direct reference to *child* views.

❌ **DO NOT** write ViewModel code that depends on *parent* or *sibling* ViewModels in the logical UI structure. This harms both testability and maintainability.

Examples:

- ✔️ `MainViewModel` represents the Main Wasabi UI and references `NavBarViewModel`.
- ✔️ `NavBarViewModel` represents the left-side navigation bar and references `WalletListViewModel`.
- ❌ `NavBarViewModel` code must NOT reference `MainViewModel` (its logical parent).
- ❌ `WalletListViewModel` code must NOT reference `NavBarViewModel` (its logical parent).
- ❌ `WalletListViewModel` code must NOT reference other ViewModels that are logical children of `NavBarViewModel` (its logical siblings).

## UI Models

The UI Model classes (which comprise the *Model* part of the MVVM pattern) sit as an abstraction layer between the UI and the larger Wasabi Object Model (which lives in the `WalletWasabi` project). This layer is responsible for:

- Exposing Wasabi data and functionality in a UI-friendly manner. Usually in the form of Observables.

- Avoiding tight coupling between UI code and business logic. This is critical for testability of UI code, mainly ViewModels.

❌ **DO NOT** write ViewModel code that depends directly on `WalletWasabi` objects such as `Wallet`, `KeyManager`, `HdPubKey`, etc.

✔️ **DO** write ViewModel code that depends on `IWalletModel`, `IWalletRepository`, `IAddress`, etc.

❌ **DO NOT** convert regular .NET properties from `WalletWasabi` objects into observables or INPC properties in ViewModel code.

❌ **DO NOT** convert regular .NET events from `WalletWasabi` objects into observables in ViewModel code.

✔️ If such conversions are required, **DO** write them into the UI Model layer.

## UiContext

ViewModels that depend on external components (such as Navigation, Clipboard, QR Reader, etc) can access these via the `ViewModelBase.UIContext` property. For instance:

- Get text from clipboard: `var text = await UIContext.Clipboard.GetTextAsync();`

- Generate QR Code: `await UIContext.QrGenerator.Generate(data);`

- Open a popup or navigate to another Viewmodel: `UIContext.Navigate().To(....)`

This is done to facilitate unit testing of viewmodels, since all dependencies that live inside the `UiContext` are designed to be mock-friendly.

❌ **DO NOT** write Viewmodel code that directly depends on external device-specific components or code that might otherwise not work in the context of a unit test.

## Source-Generated ViewModel Constructors

Whenever a ViewModel references its `UiContext` property, the `UiContext` object becomes an actual **dependency** of said ViewModel. It must therefore be initialized, ideally as a constructor parameter.

In order to minimize the amount of boilerplate required for such initialization, several things occur in this case:
- A new constructor is generated for that ViewModel, including all parameters of any existing constructor plus the UiContext.
- This generated constructor initializes the `UiContext` *after* running the code of the manually written constructor (if any).
- A Roslyn Analyzer inspects any manually written constructors in the ViewModel to prevent references to `UiContext` in the constructor body, before the above mentioned initialization can take place, resulting in `NullReferenceException`s.
- The Analyzer demands the manually written constructor to be declared `private`, so that external instatiation of the ViewModel is done by calling the source-generated constructor.

❌ Writing code that directly references `UiContext` in a ViewModel's constructor body will result in a compile-time error.

❌ Writing code that indirectly references `UiContext` in ViewModel's constructor body will result in a run-time `NullReferenceException`.

✔️ Writing code that directly or indirectly references `UiContext` inside a lambda expression in a ViewModel's constructor body is okay, since this code is deferred to a later time at run-time when the `UiContext` property has already been properly initialized.

Example:

```csharp
// ❌ BAD, constructor should be private
public AddressViewModel(IAddress address)
{
if (condition)
{
//❌ BAD, UiContext is null at this point.
UiContext.Navigate().To(someOtherViewModel);
}
}

// ✔️ GOOD, constructor is private
private AddressViewModel(IAddress address)
{
//✔️ GOOD, UiContext is already initialized when the Command runs
NextCommand = ReactiveCommand.Create(() => UiContext.Navigate().To(someOtherViewModel)));
}
```

If you absolutely must reference `UiContext` in the constructor, you can create a public constructor explicitly taking `UiContext` as a parameter:

```csharp
// ✔️ GOOD,
public AddressViewModel(UiContext uiContext, IAddress address)
{
UiContext = uiContext;

// ✔️Other code here can safely use the UiContext since it's explicitly initialized above.
}
```

In this case, no additional constructors will be generated, and the analyzer will be satisfied.




57 changes: 57 additions & 0 deletions Contrib/AffiliationServer/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,60 @@ publicKey: 3059301306072a8648ce3d020106082a8648ce3d0301070342000434117d20172fba2
The `secretKey` must be settled as value in the coordinators `WabiSabiConfig.json` file in the `AffiliationMessageSignerKey` field while the `publicKey` must be
shared with all the partners acting as affiliates (those running an affiliation server).


Revenue Sharing Calculator
--------------

A script to calculate the total amount of bitcoins from affiliate.

This script takes the coinjoin notifications provided by the affiliated which proves the affiliation of unmixed inputs and calculates the total amount of
bitcoins coming from the affiliated. Given Wasabi doesn't store any kind of information related to affiliations, it is the affiliated the one that needs
to prove the affiliation of unmixed inputs by presenting the coinjoin notifications.

### Example

This command runs the revenue.fsx script which parses the coinjoin notifications located in the directory `notification`. It verifies the notification is signed
by the coordinator, that's why we must specify the coordinator's affiliation `pubkey`. The `connection` string is for authenticating agains the bitcoin node's
RPC interface (`user:password`, `cookiefile`) which is required to verify the coinjoin transaction referred in the coinjoin notification really happened and
it is in the blockchain. Finally, `affiliate` is also required because a coinjoin notification is valid only for one specific affiliated.

```bash
$ dotnet fsi revenue.fsx -- --network=TestNet \
--connection=<rpc-connection@> \
--path=notification \
--pubkey=3059301306072a8648ce3d020106082a8648ce3d03010703420004f267804052bd863a1644233b8bfb5b8652ab99bcbfa0fb9c36113a571eb5c0cb7c733dbcf1777c2745c782f96e218bb71d67d15da1a77d37fa3cb96f423e53ba \
--affiliate=WalletWasabi
```

Optional argument `coordinationFeeRate` can also be specified and its default value is `0.003`

The result can be seen below:

```
coinjoin: 25aaef88eec92b18368c52fc3ef5f602f8dac1caea3cd9d5ee2d80ac81e61784 - Total amount: 6669693 satoshis. Share: 20009
4319673 0C155D64B106A6E09853F61726BBEA113A434D5528516CE1058A6FC045666294:0
2350020 38DED71FC19FB8189B8A90CB545CDDCAA9345FBE7ACC0E605347D9ED260FF00C:0
coinjoin: e43ed0cadf6997e96c2412a8cf0a0773fb735a52482f3ddcb7669ba8f7ba7bfc - Total amount: 0 satoshis. Share: 0
coinjoin: fbae1225f9443d88b22551e44fc90c2f9a0c88b33e868de3dd8b481a88e4171f - Total amount: 1062882 satoshis. Share: 3188
1062882 A6AA999F9C07A73BB877D46213801FD77A9324ACD06F137915B7467EB175B18F:1
Total revenue to share: 0.00023197 btc.
```

There were three coinjoins. The first one contained two affiliated coins, the second one contained no affiliated coins and the third one contained one
affiliated coin.

This affiliated contributed a total of 0.00023197 btc in coordination fees.

### Useful tip

In case you don't have an indexed bitcoin node locally you can map the RPC port of one remote node as follow:

```bash
$ ssh -N -L remote-rpc-port:localhost:local-rpc-port server
```

For example, for testnet this would look like:

```bash
$ ssh -N -L 18332:localhost:18332 zk-testing
```
4 changes: 4 additions & 0 deletions Contrib/AffiliationServer/notification/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Coinjoin Notifications
----------------------

This directory contains three real coinjoin notifications for testing and demo.
1 change: 1 addition & 0 deletions Contrib/AffiliationServer/notification/n1.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"body":{"transaction_id":"e43ed0cadf6997e96c2412a8cf0a0773fb735a52482f3ddcb7669ba8f7ba7bfc","inputs":[{"prevout":{"hash":"6026c50adbc7261107dcfcdcc9a1c87bfb9493f74ca149ac120efff50af9283a","index":4},"script_pubkey":"0014916b9271efaacbc0e817747d94a00383157bd148","amount":177147,"is_affiliated":false,"is_no_fee":true},{"prevout":{"hash":"0351cf2e1521db00d325f34945b396ccec0c566e1d630288bb6b97d7959a8d8c","index":4},"script_pubkey":"0014f7b209c71bbb9105c7f4f63583ea0ecc33f7a26a","amount":131072,"is_affiliated":false,"is_no_fee":true},{"prevout":{"hash":"e18149e4e0fa337e7356cd516a8e3b7dbd903ec71daabf7ead1d6fae9dfa1c86","index":5},"script_pubkey":"5120782b768614b5988446ef4939d327496bf3f774c89c11860bb8bccefbf8fd0027","amount":32768,"is_affiliated":false,"is_no_fee":true},{"prevout":{"hash":"c720de168c4c0b5855e740eba8e6712767be28a58485f80be1df911a200f0f48","index":17},"script_pubkey":"5120d7ca470eff5de20d76a1be279cea6fcd63dd485ad22a49f7f8eab6196177097a","amount":5000,"is_affiliated":false,"is_no_fee":true}],"outputs":[{"amount":118098,"script_pubkey":"5120509c76013f4f27cecfdcea5e63de58813a736d7cc8aa5f4d244436f1217d54ad"},{"amount":118098,"script_pubkey":"5120a900c768fa280417e9e675332b8e28fe30965146d620cb9b5a0ac6914dcf9381"},{"amount":78863,"script_pubkey":"001494b43f4c56178a84b933bbb9ead63c89b1a2a7c6"},{"amount":10000,"script_pubkey":"001414ad5509e96c0c400716e2606c8fc2cd68339ef8"},{"amount":10000,"script_pubkey":"00142c951089ca62f4ab9cc25d3d50e5c10115a78f56"},{"amount":10000,"script_pubkey":"0014a15b541be8e779a4160548afa1ac5d809d6fade2"}],"slip44_coin_type":1,"fee_rate":300000,"no_fee_threshold":1000000,"min_registrable_amount":5000,"timestamp":1681413569},"signature":"52b9335cf0a4ab75dbc17a97e4bd8fb868a994d2bfce6d69bfee4b7a8057bb45943c8459ab1bfc5e4838eed62a39357255e6943fa710672e63c629d47a49e9be"}
Loading