stacker.news/public/wallets/speed-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

10 lines
11 KiB
XML

<svg width="193" height="36" viewBox="0 0 193 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M10 0H31.2C33.851 0 36 2.14903 36 4.8V26C36 31.5228 31.5228 36 26 36H4.8C2.14903 36 0 33.851 0 31.2V10C0 4.47715 4.47715 0 10 0Z" fill="#2A67FF"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.0561 15.1338H31.1261L18.0564 28.2039H4.98633L18.0561 15.1338Z" fill="#F9DF00"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M18.0259 15.1179H31.096L18 20.4641H4.92993L18.0259 15.1179Z" fill="#B3A000"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.9994 7.39453H31.0695L17.9998 20.4646H4.92969L17.9994 7.39453Z" fill="white"/>
<path d="M55.9836 8C57.0081 8 57.9915 8.11406 58.9337 8.34218C59.8758 8.5703 60.7128 8.93985 61.4446 9.45083C62.1764 9.96182 62.7573 10.6142 63.1872 11.4081C63.5089 12.002 63.7102 12.6903 63.7912 13.4731L59.535 13.4729C59.4739 13.2401 59.3923 13.0309 59.2904 12.8452C59.08 12.462 58.801 12.1609 58.4534 11.9419C58.1058 11.7229 57.7079 11.5678 57.2597 11.4765C56.8114 11.3853 56.3221 11.3397 55.7915 11.3397C55.4439 11.3397 55.0963 11.3762 54.7487 11.4492C54.4011 11.5222 54.0855 11.6499 53.8019 11.8324C53.5184 12.0149 53.2851 12.243 53.1021 12.5167C52.9192 12.7905 52.8277 13.1372 52.8277 13.557C52.8277 13.9402 52.9009 14.2504 53.0473 14.4877C53.1936 14.7249 53.4818 14.9439 53.9117 15.1447C54.3416 15.3454 54.9362 15.5462 55.6954 15.7469C56.4547 15.9477 57.4472 16.2031 58.673 16.5134C59.0388 16.5864 59.5465 16.7187 60.196 16.9103C60.8455 17.1019 61.4904 17.4076 62.1307 17.8273C62.771 18.2471 63.3244 18.8083 63.791 19.5109C64.2575 20.2135 64.4907 21.1123 64.4907 22.2072C64.4907 23.1014 64.3169 23.9318 63.9693 24.6983C63.6217 25.4648 63.1049 26.1263 62.4188 26.6829C61.7328 27.2395 60.8821 27.6729 59.8667 27.9832C58.8513 28.2934 57.6759 28.4485 56.3403 28.4485C55.2609 28.4485 54.2136 28.3162 53.1982 28.0516C52.1828 27.787 51.2864 27.3718 50.5088 26.8061C49.7313 26.2404 49.1138 25.5195 48.6565 24.6435C48.2473 23.86 48.0285 22.945 48 21.8986L52.183 21.8998C52.2206 22.3955 52.3349 22.8264 52.5258 23.1927C52.7637 23.6489 53.0793 24.0185 53.4726 24.3014C53.866 24.5842 54.3279 24.7941 54.8585 24.931C55.389 25.0678 55.9379 25.1363 56.505 25.1363C56.8892 25.1363 57.3008 25.1043 57.7399 25.0405C58.179 24.9766 58.5906 24.8534 58.9748 24.6709C59.359 24.4884 59.6792 24.2375 59.9353 23.9181C60.1914 23.5987 60.3195 23.1927 60.3195 22.7C60.3195 22.1707 60.1503 21.7419 59.8118 21.4134C59.4734 21.0849 59.0297 20.8111 58.4809 20.5921C57.932 20.3732 57.31 20.1815 56.6148 20.0173C55.9196 19.853 55.2152 19.6705 54.5017 19.4698C53.7699 19.2873 53.0564 19.0638 52.3612 18.7991C51.666 18.5345 51.044 18.1923 50.4951 17.7726C49.9463 17.3529 49.5026 16.8282 49.1642 16.1986C48.8257 15.569 48.6565 14.8071 48.6565 13.9128C48.6565 12.9091 48.8714 12.0377 49.3014 11.2986C49.7313 10.5595 50.2939 9.94357 50.9891 9.45083C51.6843 8.9581 52.471 8.59311 53.3491 8.35586C54.2273 8.11862 55.1054 8 55.9836 8ZM73.2419 25.4861C72.8269 25.4861 71.7373 25.4861 69.9731 25.4861V16.4092C71.7068 16.4092 72.7872 16.4092 73.2144 16.4092C73.8369 16.4092 74.3633 16.5417 74.7936 16.8068C75.2238 17.0719 75.5763 17.4193 75.8509 17.8489C76.1256 18.2785 76.3224 18.7675 76.4414 19.316C76.5604 19.8645 76.6199 20.4221 76.6199 20.9888C76.6199 21.5555 76.565 22.1131 76.4551 22.6616C76.3453 23.21 76.1576 23.6899 75.8921 24.1013C75.6266 24.5126 75.2788 24.8463 74.8485 25.1022C74.4182 25.3582 73.8827 25.4861 73.2419 25.4861ZM66.0739 13.4749V33H69.9737V28.396C72.2623 28.394 73.6996 28.393 74.2855 28.393C75.3291 28.393 76.24 28.1919 77.0181 27.7897C77.7963 27.3875 78.4463 26.8481 78.9681 26.1717C79.4899 25.4953 79.8789 24.7183 80.1353 23.8408C80.3916 22.9632 80.5198 22.0491 80.5198 21.0985C80.5198 20.093 80.3916 19.1286 80.1353 18.2054C79.8789 17.2821 79.4853 16.4732 78.9543 15.7785C78.4234 15.0837 77.7551 14.5261 76.9495 14.1057C76.1439 13.6852 75.1827 13.4749 74.0658 13.4749C73.4799 13.4749 72.0518 13.4749 69.7815 13.4749H66.0739ZM92.3751 19.4216H86.0543C86.0726 19.1475 86.1319 18.8369 86.2322 18.4898C86.3325 18.1427 86.5058 17.8139 86.7521 17.5033C86.9984 17.1927 87.3267 16.9324 87.7371 16.7223C88.1476 16.5122 88.6629 16.4071 89.2831 16.4071C90.2317 16.4071 90.9386 16.6629 91.4037 17.1744C91.8689 17.686 92.1927 18.435 92.3751 19.4216ZM86.0543 21.8879H96.2606C96.3336 20.7917 96.2424 19.7413 95.987 18.7365C95.7316 17.7317 95.3166 16.8365 94.742 16.0509C94.1674 15.2653 93.4331 14.6396 92.5393 14.1737C91.6454 13.7079 90.5965 13.4749 89.3926 13.4749C88.3163 13.4749 87.3358 13.6668 86.4511 14.0504C85.5664 14.4341 84.8048 14.9593 84.1663 15.6261C83.5279 16.293 83.0353 17.0831 82.6887 17.9966C82.3421 18.91 82.1688 19.8966 82.1688 20.9562C82.1688 22.0523 82.3376 23.0571 82.675 23.9706C83.0125 24.884 83.4914 25.6696 84.1116 26.3273C84.7318 26.985 85.4888 27.492 86.3827 27.8482C87.2765 28.2045 88.2798 28.3826 89.3926 28.3826C90.9979 28.3826 92.366 28.0172 93.497 27.2864C94.628 26.5557 95.4671 25.3408 96.0144 23.6417H92.594C92.4663 24.0802 92.1197 24.4958 91.5542 24.8886C90.9887 25.2814 90.3138 25.4778 89.5294 25.4778C88.4349 25.4778 87.5958 25.1946 87.012 24.6283C86.4283 24.0619 86.1091 23.1485 86.0543 21.8879ZM108.14 19.4216H101.82C101.838 19.1475 101.897 18.8369 101.997 18.4898C102.098 18.1427 102.271 17.8139 102.517 17.5033C102.764 17.1927 103.092 16.9324 103.502 16.7223C103.913 16.5122 104.428 16.4071 105.048 16.4071C105.997 16.4071 106.704 16.6629 107.169 17.1744C107.634 17.686 107.958 18.435 108.14 19.4216ZM101.82 21.8879H112.026C112.099 20.7917 112.008 19.7413 111.752 18.7365C111.497 17.7317 111.082 16.8365 110.507 16.0509C109.933 15.2653 109.198 14.6396 108.304 14.1737C107.411 13.7079 106.362 13.4749 105.158 13.4749C104.081 13.4749 103.101 13.6668 102.216 14.0504C101.332 14.4341 100.57 14.9593 99.9315 15.6261C99.293 16.293 98.8005 17.0831 98.4539 17.9966C98.1073 18.91 97.934 19.8966 97.934 20.9562C97.934 22.0523 98.1028 23.0571 98.4402 23.9706C98.7777 24.884 99.2565 25.6696 99.8768 26.3273C100.497 26.985 101.254 27.492 102.148 27.8482C103.042 28.2045 104.045 28.3826 105.158 28.3826C106.763 28.3826 108.131 28.0172 109.262 27.2864C110.393 26.5557 111.232 25.3408 111.78 23.6417H108.359C108.231 24.0802 107.885 24.4958 107.319 24.8886C106.754 25.2814 106.079 25.4778 105.295 25.4778C104.2 25.4778 103.361 25.1946 102.777 24.6283C102.193 24.0619 101.874 23.1485 101.82 21.8879ZM120.977 16.3832C121.392 16.3832 122.482 16.3832 124.246 16.3832V25.4512C122.512 25.4512 121.432 25.4512 121.005 25.4512C120.382 25.4512 119.856 25.3188 119.425 25.054C118.995 24.7892 118.643 24.4421 118.368 24.0129C118.093 23.5837 117.897 23.0952 117.778 22.5472C117.659 21.9993 117.599 21.4423 117.599 20.8761C117.599 20.3099 117.654 19.7529 117.764 19.2049C117.874 18.657 118.061 18.1776 118.327 17.7667C118.592 17.3557 118.94 17.0224 119.37 16.7667C119.801 16.511 120.336 16.3832 120.977 16.3832ZM128.145 28.3826V8H124.245V13.4761C121.957 13.4782 120.519 13.4792 119.933 13.4792C118.89 13.4792 117.979 13.6801 117.201 14.0819C116.423 14.4837 115.773 15.0225 115.251 15.6983C114.729 16.374 114.34 17.1502 114.084 18.0269C113.827 18.9036 113.699 19.8168 113.699 20.7665C113.699 21.771 113.827 22.7345 114.084 23.6568C114.34 24.5791 114.734 25.3873 115.265 26.0813C115.796 26.7754 116.464 27.3324 117.269 27.7525C118.075 28.1726 119.036 28.3826 120.153 28.3826C120.739 28.3826 122.167 28.3826 124.437 28.3826H128.145Z" fill="#2A67FF"/>
<path d="M137 8H138V28.5H137V8Z" fill="#D8DCE1"/>
<path d="M148.557 24L145.33 12.3636H147.176L149.443 21.375H149.551L151.909 12.3636H153.739L156.097 21.3807H156.205L158.466 12.3636H160.318L157.085 24H155.318L152.869 15.2841H152.778L150.33 24H148.557ZM163.463 24.1932C162.91 24.1932 162.41 24.0909 161.963 23.8864C161.516 23.678 161.162 23.3769 160.901 22.983C160.643 22.589 160.514 22.1061 160.514 21.5341C160.514 21.0417 160.609 20.6364 160.798 20.3182C160.988 20 161.243 19.7481 161.565 19.5625C161.887 19.3769 162.247 19.2367 162.645 19.142C163.043 19.0473 163.448 18.9754 163.861 18.9261C164.384 18.8655 164.808 18.8163 165.134 18.7784C165.459 18.7367 165.696 18.6705 165.844 18.5795C165.991 18.4886 166.065 18.3409 166.065 18.1364V18.0966C166.065 17.6004 165.925 17.2159 165.645 16.9432C165.368 16.6705 164.955 16.5341 164.406 16.5341C163.834 16.5341 163.384 16.661 163.054 16.9148C162.728 17.1648 162.503 17.4432 162.378 17.75L160.781 17.3864C160.971 16.8561 161.247 16.428 161.611 16.1023C161.978 15.7727 162.401 15.5341 162.878 15.3864C163.355 15.2348 163.857 15.1591 164.384 15.1591C164.732 15.1591 165.101 15.2008 165.491 15.2841C165.885 15.3636 166.253 15.5114 166.594 15.7273C166.938 15.9432 167.221 16.2519 167.44 16.6534C167.66 17.0511 167.77 17.5682 167.77 18.2045V24H166.111V22.8068H166.043C165.933 23.0265 165.768 23.2424 165.548 23.4545C165.329 23.6667 165.046 23.8428 164.702 23.983C164.357 24.1231 163.944 24.1932 163.463 24.1932ZM163.832 22.8295C164.302 22.8295 164.704 22.7367 165.037 22.5511C165.374 22.3655 165.63 22.1231 165.804 21.8239C165.982 21.5208 166.071 21.197 166.071 20.8523V19.7273C166.01 19.7879 165.893 19.8447 165.719 19.8977C165.548 19.947 165.353 19.9905 165.134 20.0284C164.914 20.0625 164.7 20.0947 164.491 20.125C164.283 20.1515 164.109 20.1742 163.969 20.1932C163.639 20.2348 163.338 20.3049 163.065 20.4034C162.796 20.5019 162.58 20.6439 162.418 20.8295C162.259 21.0114 162.179 21.2538 162.179 21.5568C162.179 21.9773 162.334 22.2955 162.645 22.5114C162.955 22.7235 163.351 22.8295 163.832 22.8295ZM171.732 12.3636V24H170.033V12.3636H171.732ZM175.716 12.3636V24H174.017V12.3636H175.716ZM181.763 24.1761C180.903 24.1761 180.162 23.9924 179.541 23.625C178.924 23.2538 178.446 22.733 178.109 22.0625C177.776 21.3883 177.609 20.5985 177.609 19.6932C177.609 18.7992 177.776 18.0114 178.109 17.3295C178.446 16.6477 178.916 16.1155 179.518 15.733C180.125 15.3504 180.833 15.1591 181.643 15.1591C182.136 15.1591 182.613 15.2405 183.075 15.4034C183.537 15.5663 183.952 15.822 184.32 16.1705C184.687 16.5189 184.977 16.9716 185.189 17.5284C185.401 18.0814 185.507 18.7538 185.507 19.5455V20.1477H178.57V18.875H183.842C183.842 18.428 183.751 18.0322 183.57 17.6875C183.388 17.339 183.132 17.0644 182.803 16.8636C182.477 16.6629 182.094 16.5625 181.655 16.5625C181.178 16.5625 180.761 16.6799 180.405 16.9148C180.053 17.1458 179.78 17.4489 179.587 17.8239C179.397 18.1951 179.303 18.5985 179.303 19.0341V20.0284C179.303 20.6117 179.405 21.108 179.609 21.517C179.818 21.9261 180.107 22.2386 180.479 22.4545C180.85 22.6667 181.284 22.7727 181.78 22.7727C182.102 22.7727 182.395 22.7273 182.661 22.6364C182.926 22.5417 183.155 22.4015 183.348 22.2159C183.541 22.0303 183.689 21.8011 183.791 21.5284L185.399 21.8182C185.27 22.2917 185.039 22.7064 184.706 23.0625C184.376 23.4148 183.962 23.6894 183.462 23.8864C182.965 24.0795 182.399 24.1761 181.763 24.1761ZM191.466 15.2727V16.6364H186.699V15.2727H191.466ZM187.977 13.1818H189.676V21.4375C189.676 21.767 189.725 22.0152 189.824 22.1818C189.922 22.3447 190.049 22.4564 190.205 22.517C190.364 22.5739 190.536 22.6023 190.722 22.6023C190.858 22.6023 190.977 22.5928 191.08 22.5739C191.182 22.5549 191.261 22.5398 191.318 22.5284L191.625 23.9318C191.527 23.9697 191.386 24.0076 191.205 24.0455C191.023 24.0871 190.795 24.1098 190.523 24.1136C190.076 24.1212 189.659 24.0417 189.273 23.875C188.886 23.7083 188.574 23.4508 188.335 23.1023C188.097 22.7538 187.977 22.3163 187.977 21.7898V13.1818Z" fill="#667085"/>
</svg>