stacker.news/public/wallets/npub-cash-dark.svg
ekzyis d89a4a429a
Wallet v2 (#2169)
* Migrate vault entries to new schema (#2092)

* Migrate existing vault entries to new schema

* Read+write new vault schema

* Drop VaultEntry table

* Refactor vaultPrismaFragments

* Remove wrong comment

* Remove TODO

* Fix possible race condition on update of vault key

* Remove lib/object.js

* Wallet schema v2 (#2146)

* Add wallet-v2 TODOs

* Update checkWallet

* Wallet list

* Delete almost all wallet v1 code

and add some code for wallet protocol forms

* Define protocol display name in JSON

* Show form per protocol

* Increase max-height of image in form

* Add JSdoc for protocols, form validation

* Use wallet cards again

My wallet list was quite ugly and I couldn't look at it anymore.

* Refactor hooks in wallet provider

* Fix PasswordInput not used

* Read encrypted wallets

* Decrypt wallets

* useWalletQuery now returns decrypted wallets
* Refactor useIndexedDB because its only purpose will be to store the key, so no need for pagination code etc.
* There is still a bug: if the wallet is not decrypted on first render, the form will not see the decrypted value. See TODO.

* Rename protocolJson to protocol

it no longer uses a JSON file

* Fix form not updated with decrypted API key

* Fix wallet template forms

* Fix optional shown as hint

* Rename to mapUserWalletResolveTypes

* Save LNbits send and recv

TODO:

* implement resolvers for other protocols
* fix double update required for trigger?
* add missing validation on server
* add missing network tests
* don't import from wallets/client on server

* Move definitions to lib/wallets.json and lib/protocols

* Fix ProtocolWallet.updated_at not updated by trigger

* Move wallet fragments into wallets/client/fragments/

* move invoice fragments to fragments/invoice.js
* remove some unused fragments that I don't think I also will not use
* move fragments that will be generated in own file

* Move wallet resolvers into wallets/server/resolvers

* Fix missing authorization check on wallet update

* Run all shared code in generic wallet update function

* Fix 'encrypt' flag not set for blink send currency

* Add mutations for all protocols

* Fix macaroon validation

* Fix CLN socket value not set

* Add server-side schema validation

* Fix JSDoc typedef for protocols

* Don't put JSDoc into separate file

* Create test invoices on save

* Also move type resolvers into wallets/server/resolvers

* Fix unconfigured protocols of UserWallet not found

* Fix Blink API key in wallet seed

* Test send payment on save (except LNC)

This does not include LNC because LNC cannot be saved yet

* Check if window.webln is defined on save

* Create new wallets from templates

* Separate protocols in wallets/lib into individual files

* Use justify-content-start for protocol tabs

and larger margin at the top

* Add LNC to client protocols

* Only return wallets from useWallets

* Query decrypted wallets

* Payments with new wallets

* More wallet logos

* Fix TypeError in useIndexedDB

* Add protocol attach docs

* Fix undefined useWalletRecvPrompt import

* Remove outdated TODOs

* First successful zap to new wallets

* Fix walletLogger imports

* Fix sequences

* the sequences for InvoiceForward and DirectPayment were still starting at 1
* when using setval() with two arguments, nextval() will return the second argument+1 (see https://www.postgresql.org/docs/current/functions-sequence.html)

* Rename ProtocolWallet columns

* Remove more outdated TODOs

* Update wallet indicator

* Fix page reset on route change

* Refactor __typename checks into functions

* Refactor protocol selection into own hook

* Add button to detach protocol

* Refetch wallet on save and detach

* Refetch wallets on change

* Always show all templates

* Refactor WalletLink component

* Also put wallet into forms context

* Remove outdated TODOs

* Use useMemo in wallets hooks

* Passphrase modals

* prompt for password if decryption failed
* add button to reveal passphrase on wallet page

TODO:
* remove button if passphrase was revealed or imported
* encrypt wallets with new key on passphrase reveal

* Fix protocol missing as callback dependency

* Encrypt wallets with new key on passphrase export

* Update 'unlock wallets' text

* Rename wallet mutation hooks

* Remove 'removeWallet' mutation

Wallets are automatically deleted when all protocols are deleted

* Passphrase reset

* Use 110px as minimum width for bip39 words

longest bip39 words are 8 characters and they fit into 103px so I rounded up to 110px.

* Also disable passphrase export on save

* Wallet settings

* Fix wallet receive prompt

* Remove unused parameters from postgres function

* Rename UserWallet to Wallet, ProtocolWallet to WalletProtocol

* Use danger variant for button to show passphrase

* Fix inconsistent imports and exports

* Remove outdated TODOs

* wallet logs

* Remove outdated comment

* Make sure wallets are used in priority order

* Separate wallets from templates in reducer

* Fix missing useCallback dependencies

* Refactor with useWalletLogger hook

* Move enabled to WalletProtocol

* Add checkbox to enable/disable protocol

* Fix migration with prod db dump

* Parse Coinos relay URLs

* Skip network tests if only enabled changed

* Allow IndexedDB calls without session

* Add code to migrate old CryptoKey

* first try to use existing CryptoKey before generating a new one
* bump IDB version to delete old object stores and create new ones
* return IDB callbacks with useMemo
* don't delete old IDB right away, wait until next release

* Fix ghost import error

*Sometimes*, I get import errors because it tries to resolve @/wallets/server to wallets/server.js instead of wallets/server/index.js.

For the files in wallets/server, it kind of makes sense because it's a circular import.

But I don't know why the files in worker/ have this problem.

Interestingly, it only seems to happen with walletLogger imports, so I guess its related to its import chain.

Anyway, this commit should make sure this never happens again ...

* Skip wallets queries if not logged in

* Split CUSTOM wallet into NWC and LN_ADDR

* Migrate local wallets

* Link to /wallets/:id/receive if send not supported

* Hide separator if there are no configured wallets

* Save LNC

* Add one-liner to attach LNC

* Update wallet priorities via DnD

* Wallet logs are part of protocol resolvers

* Fix logging to deleted protocol

* Fix trying to fetch logs for template

* also change type to Int so GraphQL layer can catch trying to fetch string IDs as is the case for templates

* Fix embedded flag for wallets logs not set

* Remove TODO

* Decrease max-height for embedded wallet logs on big screens

* Fix missing refetch on wallet priority update

* Set priorities of all wallets in one tx

* Fix nested state update

* Add DragIcon

* DnD mobile support and refactor

* Add CancelButton to wallet settings

* Remount form if path changes

This fixes the following warning in the console:

"""
Warning: A component is changing an uncontrolled input to be controlled. This is likely caused by the value changing from undefined to a defined value, which should not happen. Decide between using a controlled or uncontrolled input element for the lifetime of the component.
"""

* Support string and object for wallet.image JSON

* Append domain to lightning address inputs

* Remove outdated TODOs

* Add template IDs to wallet JSON

* Fix missing callback dependency

* Implement lightning address save in receive prompt

* Update TODOs

* Fix missing check for enabled

* Pay QR codes with WebLN as anon

* Add logo for NWC

* Fix trying to save logs for template

* Add template logs

* Fix inconsistent margin

* Always throw on missing key

* Remove misleading comment

Wallets are returned even if decryption fails so we can show the unlock page if a wallet is stored as encrypted in the context.

Maybe I should rethink this.

* Check for existing wallets on local wallet migration

* Fix local wallet migration causing duplicates

* Fix protocol reattached on detach due to migration

* Fix form not centered

* Fix ZEUS lightning address domain

* Add placeholder, help, hints etc. to wallet form inputs

* Fix wallet badges not updated

* Remove unused declared variables

* Rename to ATTACH_PAGE

* Fix 500 error if no amount was given to LNURLp endpoint

* Tag log messages with wallet name

* Only skip network tests if we're disabling the wallet

* Rename var to networkTests

* Continue to store key hash in IndexedDB

* Rethink wallet state management

If decryption failed, the function to decrypt the wallets didn't throw but simply returned wallets that were still encrypted.

This was bad because it meant we could not rely on the wallets in the state being decrypted, even though this was the original idea behind the query hooks: hide the details of encryption and decryption inside them.

Because of this, we had to check if the wallets were still encrypted before we ran the wallet migration since we want to check if a protocol already exists.

This commit fixes this by making encryption and decryption always throw (and catching the errors), as well as returning a ready state from hooks. A hook might not be ready because it still needs to load something (in the case of the crypto hooks, it's loading the key from IndexedDB). Callers check that ready state before they call the function returned by the hook.

So now, the wallet migration hook can itself simply check if the hook to encrypt wallets is ready and if the wallets are no longer loading to let callers know if it itself is ready.

Since we also relied on wallets stored as encrypted in the context to show the unlock page, this was also changed by comparing the local and remote key hash.

* Add empty line

* Save new key hash during wallet reset

* Only receive protocol upserts require networkTests param

* Compare key hashes on server on each save

* Delete old code

* Fix card shows attach instead of configure

* Fix empty wallets created during migration

The old schema can contain '' instead of NULL in the columns of wallets for receiving.

* Update reset passphrase text

* Wrap passphrase reset in try/catch

* Fix migrate called multiple times

* Update key hash on migration if not set

* Fetch local wallets in migrate

* Fix missing await on setKey

* Let first device set key hash

* Fix indicator not shown if wallets locked

* Check if IndexedDB is available

* Fix inconsistent WebLN error message

* Disable WebLN if not available

* Remove outdated TODO

* Cursor-based pagination for wallet logs

* Fix log message x-overflow

* Add context to wallet logs

* Wrap errors are warnings in logs

* Rename wallet v2 migrations

* Update wallet status during logging

* Fix wallet logs loading state

The loading state would go from false -> true -> false because it's false when the lazy query wasn't called yet.

* Add wallet search

* Add Alby Go wallet

* Revert "Add Alby Go wallet"

This reverts commit 926c70638f1673756480c848237e52d5889dc037.

* Fix wallet logs sent by client don't update protocol status

* Fix mutation name

* put drag icon on opposite corner

* Add wallets/README.md

* Fix inconsistent case in wallets/README.md

* Fix autoprefixer warning about mixed support

This warning was in the app logs:

app     | Warning
app     |
app     | (31:3) autoprefixer: end value has mixed support, consider using flex-end instead
app     |
app     | Import trace for requested module:
app     | ./styles/wallet.module.css
app     | ./wallets/client/hooks/prompt.js
app     | ./wallets/client/hooks/index.js
app     | ./wallets/client/context/hooks.js
app     | ./wallets/client/context/provider.js
app     | ./wallets/client/context/index.js

* fix effect of wallet indicators on logo

* Fix deleting wallet template logs

* Use name as primary key of WalletTemplate

* Fix wallet_clear_vault trigger not mentioned in README

* Fix wallet receive prompt

Also remove no longer needed templateId from wallets.json and helper functions

* Use findUnique since name is now primary key

* Merge Alby wallets into one

* Remove unused name parameter from WalletsForm component

* Fix number check to decide if wallet or template

* Update wallet encryption on click, not as effect

* add cashu.me and lightning address logos

* add images

* Use recommended typeof to check if IDB available

* Also check if IDB available on delete

* Use constraint triggers

* Add indices on columns used for joins

* Fix inconsistent CLEAR OR REPLACE TRIGGER

* Attach wallet_check_support trigger to WalletProtocol table

* Update wallets/README.md

* Remove debugging code

* Refactor reducer: replace page with status

* Show 'wallets unavailable' if device does not support IndexedDB

* Remove duplicate ELSIF condition

* Fix hasSendWallet

The useSendWallets hook was not checking if the returned send wallets are enabled.

Since the components that used that hook only need to know if there is a send wallet, I replaced the useSendWallets hook with a useHasSendWallet hook.

* Add Cash App wallet

* fix changes loglevel enum

* Fix key init race condition in strict mode if no key exists yet

* Formatting

* Fix key init race condition via transactions in readwrite mode

* Replace Promise.withResolvers with regular promises

* replace generic spinner with our usual

---------

Co-authored-by: k00b <k00b@stacker.news>
2025-07-15 16:36:43 -05:00

23 lines
23 KiB
XML

<svg width="1098" height="194" viewBox="0 0 1098 194" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="317" height="194" fill="url(#pattern0_4238_1199)"/>
<path d="M1056.85 116.072V152.532H1039.36V68.4448H1056.36V100.593H1057.1C1058.52 96.8708 1060.82 93.9557 1064 91.848C1067.17 89.713 1071.15 88.6455 1075.94 88.6455C1080.32 88.6455 1084.14 89.6035 1087.4 91.5196C1090.68 93.4083 1093.23 96.1318 1095.04 99.6902C1096.87 103.221 1097.77 107.45 1097.75 112.377V152.532H1080.26V115.498C1080.28 111.611 1079.3 108.586 1077.3 106.424C1075.33 104.261 1072.56 103.18 1069.01 103.18C1066.62 103.18 1064.52 103.687 1062.68 104.699C1060.88 105.712 1059.45 107.19 1058.41 109.134C1057.4 111.05 1056.88 113.363 1056.85 116.072Z" fill="white"/>
<path d="M1032.69 107.45L1016.68 108.436C1016.41 107.067 1015.82 105.835 1014.91 104.74C1014.01 103.618 1012.82 102.728 1011.34 102.072C1009.89 101.387 1008.15 101.045 1006.13 101.045C1003.42 101.045 1001.13 101.62 999.27 102.77C997.409 103.892 996.478 105.397 996.478 107.286C996.478 108.791 997.08 110.064 998.285 111.104C999.489 112.145 1001.56 112.979 1004.48 113.609L1015.9 115.908C1022.03 117.167 1026.6 119.193 1029.61 121.985C1032.62 124.777 1034.13 128.445 1034.13 132.988C1034.13 137.122 1032.91 140.748 1030.47 143.869C1028.07 146.989 1024.75 149.425 1020.54 151.177C1016.35 152.902 1011.52 153.764 1006.04 153.764C997.696 153.764 991.045 152.026 986.091 148.55C981.164 145.046 978.276 140.283 977.427 134.261L994.631 133.358C995.151 135.904 996.41 137.847 998.408 139.188C1000.41 140.502 1002.97 141.159 1006.09 141.159C1009.15 141.159 1011.62 140.571 1013.48 139.394C1015.37 138.189 1016.32 136.643 1016.35 134.754C1016.32 133.166 1015.65 131.866 1014.34 130.853C1013.02 129.813 1011 129.019 1008.26 128.472L997.341 126.296C991.182 125.064 986.597 122.929 983.586 119.891C980.602 116.853 979.111 112.979 979.111 108.271C979.111 104.22 980.206 100.73 982.395 97.8015C984.612 94.8727 987.719 92.6145 991.716 91.0269C995.739 89.4393 1000.45 88.6455 1005.84 88.6455C1013.8 88.6455 1020.07 90.3289 1024.64 93.6957C1029.24 97.0624 1031.93 101.647 1032.69 107.45Z" fill="white"/>
<path d="M936.915 153.723C932.892 153.723 929.306 153.025 926.158 151.629C923.01 150.206 920.519 148.112 918.685 145.347C916.879 142.555 915.976 139.079 915.976 134.918C915.976 131.415 916.619 128.472 917.905 126.091C919.192 123.709 920.944 121.793 923.161 120.343C925.378 118.892 927.896 117.797 930.715 117.058C933.562 116.319 936.546 115.799 939.666 115.498C943.334 115.114 946.29 114.759 948.535 114.43C950.779 114.074 952.408 113.554 953.421 112.87C954.433 112.186 954.94 111.173 954.94 109.832V109.585C954.94 106.985 954.119 104.973 952.476 103.55C950.861 102.126 948.562 101.415 945.579 101.415C942.431 101.415 939.926 102.113 938.065 103.509C936.204 104.877 934.972 106.602 934.37 108.682L918.193 107.368C919.014 103.536 920.629 100.224 923.038 97.432C925.446 94.6126 928.553 92.4502 932.358 90.9448C936.19 89.4119 940.624 88.6455 945.661 88.6455C949.164 88.6455 952.517 89.0561 955.72 89.8772C958.95 90.6984 961.81 91.9712 964.301 93.6957C966.819 95.4201 968.804 97.6373 970.255 100.347C971.705 103.03 972.431 106.246 972.431 109.996V152.532H955.843V143.787H955.35C954.338 145.758 952.983 147.496 951.286 149.001C949.589 150.479 947.549 151.643 945.168 152.491C942.787 153.312 940.036 153.723 936.915 153.723ZM941.924 141.652C944.497 141.652 946.769 141.145 948.74 140.133C950.711 139.092 952.257 137.696 953.38 135.945C954.502 134.193 955.063 132.208 955.063 129.991V123.299C954.516 123.655 953.763 123.983 952.805 124.284C951.874 124.558 950.82 124.818 949.643 125.064C948.466 125.283 947.289 125.488 946.112 125.68C944.935 125.844 943.868 125.995 942.91 126.132C940.857 126.433 939.064 126.912 937.531 127.569C935.998 128.226 934.808 129.115 933.959 130.238C933.111 131.332 932.686 132.701 932.686 134.343C932.686 136.725 933.548 138.545 935.273 139.804C937.025 141.036 939.242 141.652 941.924 141.652Z" fill="white"/>
<path d="M885.348 153.764C878.888 153.764 873.332 152.395 868.678 149.658C864.053 146.894 860.494 143.061 858.003 138.162C855.54 133.262 854.308 127.623 854.308 121.246C854.308 114.786 855.554 109.12 858.044 104.248C860.563 99.348 864.135 95.5296 868.761 92.7924C873.387 90.0278 878.888 88.6455 885.266 88.6455C890.768 88.6455 895.585 89.6446 899.719 91.6428C903.852 93.6409 907.123 96.4466 909.531 100.06C911.94 103.673 913.268 107.916 913.514 112.788H897.009C896.543 109.64 895.312 107.108 893.313 105.192C891.343 103.249 888.756 102.277 885.553 102.277C882.844 102.277 880.476 103.016 878.45 104.494C876.452 105.945 874.892 108.066 873.77 110.858C872.647 113.65 872.086 117.03 872.086 120.999C872.086 125.023 872.634 128.445 873.729 131.264C874.851 134.083 876.425 136.232 878.45 137.71C880.476 139.188 882.844 139.927 885.553 139.927C887.552 139.927 889.345 139.517 890.932 138.696C892.547 137.874 893.875 136.684 894.915 135.123C895.982 133.536 896.68 131.634 897.009 129.416H913.514C913.24 134.234 911.927 138.477 909.573 142.144C907.246 145.785 904.03 148.632 899.924 150.685C895.818 152.737 890.959 153.764 885.348 153.764Z" fill="white"/>
<path d="M838.42 153.599C835.71 153.599 833.383 152.641 831.44 150.725C829.524 148.782 828.566 146.455 828.566 143.746C828.566 141.063 829.524 138.764 831.44 136.848C833.383 134.932 835.71 133.974 838.42 133.974C841.048 133.974 843.347 134.932 845.318 136.848C847.289 138.764 848.274 141.063 848.274 143.746C848.274 145.552 847.809 147.208 846.878 148.714C845.975 150.192 844.784 151.382 843.306 152.286C841.828 153.162 840.199 153.599 838.42 153.599Z" fill="white"/>
<path d="M715.284 152.532V5.09131H745.953V60.5256H746.888C748.232 57.5499 750.176 54.5262 752.72 51.4545C755.312 48.3349 758.671 45.7431 762.799 43.6793C766.974 41.5676 772.158 40.5117 778.349 40.5117C786.412 40.5117 793.852 42.6234 800.667 46.847C807.482 51.0226 812.93 57.3339 817.009 65.7811C821.089 74.1802 823.129 84.7151 823.129 97.3858C823.129 109.721 821.137 120.135 817.153 128.631C813.218 137.078 807.842 143.485 801.027 147.853C794.26 152.172 786.676 154.332 778.277 154.332C772.326 154.332 767.262 153.348 763.087 151.38C758.959 149.412 755.576 146.941 752.936 143.965C750.296 140.941 748.28 137.894 746.888 134.822H745.521V152.532H715.284ZM745.305 97.2418C745.305 103.817 746.216 109.553 748.04 114.448C749.864 119.344 752.504 123.159 755.959 125.895C759.415 128.583 763.615 129.926 768.558 129.926C773.55 129.926 777.773 128.559 781.229 125.823C784.685 123.039 787.3 119.2 789.076 114.304C790.9 109.361 791.812 103.673 791.812 97.2418C791.812 90.8585 790.924 85.2431 789.148 80.3956C787.372 75.5481 784.757 71.7564 781.301 69.0207C777.845 66.285 773.598 64.9171 768.558 64.9171C763.567 64.9171 759.343 66.237 755.888 68.8767C752.48 71.5165 749.864 75.2601 748.04 80.1076C746.216 84.9551 745.305 90.6665 745.305 97.2418Z" fill="white"/>
<path d="M669.644 105.449V41.9512H700.312V152.532H670.868V132.446H669.716C667.22 138.925 663.068 144.133 657.261 148.068C651.502 152.004 644.47 153.972 636.167 153.972C628.776 153.972 622.273 152.292 616.657 148.932C611.042 145.573 606.65 140.797 603.482 134.606C600.363 128.414 598.779 120.999 598.731 112.36V41.9512H629.4V106.888C629.448 113.416 631.2 118.575 634.655 122.367C638.111 126.159 642.742 128.054 648.55 128.054C652.245 128.054 655.701 127.214 658.917 125.535C662.132 123.807 664.724 121.263 666.692 117.903C668.708 114.544 669.692 110.392 669.644 105.449Z" fill="white"/>
<path d="M480.577 194V41.9516H510.814V60.5257H512.181C513.525 57.55 515.469 54.5263 518.013 51.4546C520.605 48.3349 523.964 45.7432 528.092 43.6794C532.267 41.5676 537.451 40.5117 543.642 40.5117C551.705 40.5117 559.145 42.6235 565.96 46.8471C572.775 51.0226 578.223 57.334 582.302 65.7811C586.382 74.1802 588.422 84.7152 588.422 97.3859C588.422 109.721 586.43 120.136 582.446 128.631C578.511 137.078 573.135 143.485 566.32 147.853C559.553 152.172 551.969 154.332 543.57 154.332C537.619 154.332 532.555 153.348 528.38 151.38C524.252 149.413 520.869 146.941 518.229 143.965C515.589 140.941 513.573 137.894 512.181 134.822H511.246V194H480.577ZM510.598 97.2419C510.598 103.817 511.509 109.553 513.333 114.448C515.157 119.344 517.797 123.159 521.252 125.895C524.708 128.583 528.908 129.927 533.851 129.927C538.843 129.927 543.066 128.559 546.522 125.823C549.978 123.039 552.593 119.2 554.369 114.304C556.193 109.361 557.105 103.673 557.105 97.2419C557.105 90.8585 556.217 85.2431 554.441 80.3956C552.665 75.5481 550.05 71.7565 546.594 69.0208C543.138 66.2851 538.891 64.9172 533.851 64.9172C528.86 64.9172 524.636 66.2371 521.18 68.8768C517.773 71.5165 515.157 75.2601 513.333 80.1076C511.509 84.9551 510.598 90.6666 510.598 97.2419Z" fill="white"/>
<path d="M395.269 88.6028V152.532H364.6V41.9516H393.829V61.4616H395.125C397.573 55.0302 401.676 49.9427 407.436 46.1991C413.195 42.4075 420.178 40.5117 428.386 40.5117C436.065 40.5117 442.76 42.1915 448.471 45.5512C454.183 48.9108 458.622 53.7104 461.79 59.9497C464.958 66.1411 466.542 73.5323 466.542 82.1234V152.532H435.873V87.5949C435.921 80.8276 434.193 75.5481 430.689 71.7565C427.186 67.9169 422.362 65.9971 416.219 65.9971C412.091 65.9971 408.444 66.885 405.276 68.6608C402.156 70.4366 399.708 73.0284 397.933 76.436C396.205 79.7957 395.317 83.8513 395.269 88.6028Z" fill="url(#paint0_linear_4238_1199)"/>
<defs>
<pattern id="pattern0_4238_1199" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_4238_1199" transform="scale(0.00315457 0.00515464)"/>
</pattern>
<linearGradient id="paint0_linear_4238_1199" x1="460" y1="35" x2="365" y2="137.5" gradientUnits="userSpaceOnUse">
<stop stop-color="#E74B95"/>
<stop offset="1" stop-color="#7B5CA4"/>
</linearGradient>
<image id="image0_4238_1199" width="317" height="194" preserveAspectRatio="none" xlink:href="data:image/png;base64,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"/>
</defs>
</svg>