Compare commits

...

115 Commits

Author SHA1 Message Date
Zach Pomerantz
963121f19b test: prevent async debounce updates (#6427)
* test: prevent async debounce updates

* lint

* fix: actually fix

* fix: rm unused act

* fix: synchronously update popper

* lint

* way better
2023-04-24 16:26:28 -07:00
Zach Pomerantz
58417412f1 build: tighten tsconfig (to include build cache, exclude watch folders) (#6375)
* build: extend cypress tsconfig from build tsconfig

* build: exclude node_modules from watch to improve typechecking perf

* fix: even tighter tsconfigs

* fix: even tighter

* fix: tailor cypress tsconfig to testing

* fix: split them up again

* fix: pr comments
2023-04-24 16:00:04 -07:00
Charles Bachmeier
cd3cff0202 chore: remove graphql feature flag and old query methods (#6384)
* remove graphql feature flag and old query methods

* remove unused fn

* remove redundant names, simplify import

* explicit var naming

* column

* add comment

* update flag check

* undo

* visit /swap in uni search test

* empty array base

---------

Co-authored-by: Charles Bachmeier <charlie@genie.xyz>
2023-04-24 14:03:24 -07:00
Zach Pomerantz
90546fd803 fix: rm non-serializable data (#6430) 2023-04-24 12:59:23 -07:00
Zach Pomerantz
bee558fa1a test: squelch console.debug (#6429) 2023-04-24 12:59:12 -07:00
Zach Pomerantz
87514742f1 test: shard GH action unit tests (#6428)
* test: shard GH action unit tests

* fix: use percent
2023-04-24 12:59:05 -07:00
eddie
75b0320bbe feat: use codecov flags (#6418) 2023-04-24 12:44:41 -07:00
Zach Pomerantz
4966ee56dd fix: mock useWeb3React (#6422)
* fix: mock useWeb3React

* fix: pr nits

* fix: do not import for perf

* fix: update snaps

* fix: import type

* Revert "fix: import type"

This reverts commit d7da5a04d1.
2023-04-24 12:43:55 -07:00
Tina
545fdd2cbe feat: Update Subhead text to match Figma spec (#6307)
* update font weight and line height to match figma

* remove unnecessary fontWeight and lineHeight props

* revert textSecondary change

* revert SubheadSmall change

* remove lineHeight from Subheader for Success screen

* add Trans wrapper to Sweep text

* reduce gap between name and address to 2px

* update snapshot tests for classnames change

* fix failing snapshot

---------

Co-authored-by: Lynn Yu <lynn.yu@uniswap.org>
2023-04-24 15:06:15 -04:00
Zach Pomerantz
201dc2ce85 refactor: keep constants insular (#6411) 2023-04-24 08:45:38 -07:00
Zach Pomerantz
c36d9c3d3f test: rm flaky retry test (#6431) 2023-04-24 08:32:38 -07:00
Jordan Frankfurt
bc48b4fb0e feat: reduce severity of phishing filter to allow url token names (#6249)
* feat: reduce severity of phishing filter to allow url token names

* fix # positions, prototype progressive risk check w/ list presence

* functional progressive risk check functionality

* better name for tokenList

* remove logs/todos

* make it work for mini-portfolio

* getUniqueAddressesFromPositions

* useTokenContractsConstant

* adds comment documenting the positionInfo->positionDetails type mapping

* safe->filtered positions in the Pool page

* use for loop instead of reduce

* WIP: token constants lookup table consolidating chain data and list data

* remove lookup table to pr#6268

* use NEVER_RELOAD

* use a counter on tokenList inclusion

* pr feedback - code simplification

* add tests

* tinaszheng pr feedback

* fix incorrect undefined fn signature

* forEach -> for loop

* add comment explainer to useFilterPossiblyMaliciousPositions

* simplify and comments re: filtration logic

* fix tests
2023-04-24 10:11:04 -05:00
Vignesh Mohankumar
ffdd311be9 fix: handle other types of chunk error codes (#6423)
* fix: handle other types of chunk error codes

* lint

* change regex

* letters only
2023-04-21 16:34:08 -04:00
Charles Bachmeier
3e5c0bddd7 feat: [DetailsV2] build containers for data page (#6399)
* add page break and placeholder files

* container layout

* description tabs

* add table tabs

* mobile wrap

* remove todo

* adaptive padding

* add extensible tabbed component

* add new file

* add snapshot test for empty data page

* update snapshot

* add new snapshot

* undo unrelated snapshot change

* draft: details v2 containers

* Revert "draft: details v2 containers"

This reverts commit 7c6580c974.

* uniform padding and single tab styling

* update snapshot

* update default tab behaviour

* max width

* convert to map with keys

---------

Co-authored-by: Charles Bachmeier <charlie@genie.xyz>
Co-authored-by: Jack Short <john.short.tj@gmail.com>
2023-04-21 12:38:07 -07:00
Tina
b161022fb1 feat: Use local reducer in Swap flow (#6312)
* test: swap flow cypress tests

* fix: use default parameter

* use local reducer in swap flow

* remove swap from global reducer

* fix: remove comments

* feat: add new test

* move token constant to fixtures file

---------

Co-authored-by: Eddie Dugan <eddie.dugan@uniswap.org>
2023-04-21 14:32:13 -04:00
eddie
a527f00905 feat: add apple store banner (#6412)
* feat: add apple store banner

* feat: make apple meta tag use the current url

* fix: tag error

* fix: lint

* fix: yarn dedup

* feat: back to basic impl

* fix: syntax

* fix: comment
2023-04-21 11:30:06 -07:00
eddie
a05dedd8be fix: remove the info icon popover from the toolbar (#6407)
* fix: remove the info icon popover from the toolbar

* fix: boolean
2023-04-21 11:10:10 -07:00
Vignesh Mohankumar
916ebef480 fix: filter CSS related 499 chunk errors (#6417)
* add in css errors

* rm console

* change code
2023-04-21 13:07:50 -04:00
Jack Short
aa77a7a23a chore: adding snapshot tests for nftCard components (#6410) 2023-04-21 12:28:46 -04:00
Vignesh Mohankumar
67b5896886 fix: ignore ChunkLoadingErrors if related to 499 or missing data (#6365)
* fix: ignore ChunkLoadingErrors if related to 499 or missing data

* add tests

* more tests

* types

* no syntaxerror

* handle undefined performance

* change test name

* comment

* Update src/tracing/errors.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/tracing/errors.test.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/tracing/errors.test.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* rm unnecessary

* change

* rm any

* cast earlier

* fixes

* fix: typings

* fixes

* rm mock

* rm comment

* try polyfill

* fix mocks

* rm stuff

* move mock

---------
2023-04-21 12:03:25 -04:00
cartcrom
9e31756cc6 chore: remove miniportfolio and mgtm flags (#6416)
* chore: remove miniportfolio and mgtm flags

* fix: tiny css fix
2023-04-21 12:00:09 -04:00
Jack Short
3900cdd0dc chore: removing fallback rarity provider (#6408) 2023-04-21 11:56:13 -04:00
Vignesh Mohankumar
fcc6a2d560 fix: filter out all unsafe-eval csp errors (#6409)
* update match

* Update src/tracing/errors.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* lint

* add test

---------
2023-04-21 10:58:49 -04:00
Jack Short
98841c783d chore: removing unused files in nft public folder (#6403) 2023-04-20 20:11:45 -04:00
eddie
820e179560 fix: e2e test coverage reporting (#6286)
* fix: e2e test coverage reporting

* fix: try increasing

* fix: names

* fix: optimize test.yml

* fix: undo last change and add cache
2023-04-20 15:34:09 -07:00
Zach Pomerantz
2268860615 test: web3 (#6299)
* build: upgrade web3-react@^8.2

* test: web3

* fix: update test name
2023-04-20 15:30:30 -07:00
Zach Pomerantz
9c41955e52 build: upgrade web3-react@^8.2 (#6401) 2023-04-20 14:27:50 -07:00
Zach Pomerantz
b6874b8094 build: remove unnecessary webpack plugins (#6386)
* build: remove duplicate file case check

* build: remove unused moment tree-shaking

* fix: nits
2023-04-20 14:12:43 -07:00
Zach Pomerantz
5e090db8b3 build: add yarn-analyze (#6400) 2023-04-20 14:01:28 -07:00
eddie
cf95949406 fix: replace CMC token list URL (#6406) 2023-04-20 13:58:55 -07:00
Zach Pomerantz
2b60961812 build: use ignore-path for craco eslint (#6372)
* build: add caching to eslint

* build: add caching to jest

* build: add caching to tsc

* build: add caching to actions

* fix: upgrade upload-artifact to v3

* build: update craco eslint cacheLocation

* build: use ignore-path for craco eslint
2023-04-20 13:44:57 -07:00
Zach Pomerantz
aed969f38d test: silence CI tests (#6387) 2023-04-20 13:44:29 -07:00
Zach Pomerantz
4e6121d4ab test: restrict test-utils from src (#6392) 2023-04-20 13:43:31 -07:00
eddie
d63bcca539 test: swap flow cypress tests (#6331)
* test: swap flow cypress tests

* fix: use default parameter

* fix: use shared token addresses

* fix: fix test

* fix: nits
2023-04-20 13:00:43 -07:00
Vignesh Mohankumar
671041360d fix: filter CSP unsafe-eval errors (#6397)
* fix: filter CSP errors

* not syntax

* comment
2023-04-20 14:58:45 -04:00
Vignesh Mohankumar
36bdf5dd3e fix: show empty state on /add and /remove (#6346)
* fix: handle invalid chainId on position page

* fix

* add test

* Revert "add test"

This reverts commit d18742aa50.

* fix: prevent crashes on /add and /remove on unsupported chains

* handle v3 rm

* chainId

* lint

* Update src/pages/RemoveLiquidity/V3.tsx

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-04-20 14:54:27 -04:00
lynn
8b1a0e99ee test: swap modal header unit test (#6361)
* init

* init

* use test constants

* use constants

* change address

* more comprehensive tests

* move noop

* add eslint rule

* return null in noop

* merge

* fixes
2023-04-20 11:21:57 -04:00
cartcrom
a68a7e1bb4 fix: updated uniswap wallet images (#6390)
* fix: updated uniswap wallet images

* fix: revert unintended css update

* feat: use updated app icon w/ border
2023-04-20 10:54:33 -04:00
yyip-dev
95b9624bca feat: Update to app store link with tracking params (#6398)
Update to app store link with tracking params
2023-04-19 18:35:05 -04:00
Zach Pomerantz
04a0479236 test: add cypress-hardhat (#6394)
* chore: ignore hardhat cache files

* test: add forking hardhat config

* test: install cypress-hardhat

* build: add cypress-hardhat

* fix: lint

* build: add hardhat

* build: add @sentry/types

* fix: better origin
2023-04-19 10:50:25 -07:00
Jack Short
55f1e35ffc fix: pwat not setting correct spender (#6320)
* fix: pwat not setting correct spender

* todo

* responding to comments
2023-04-19 13:43:37 -04:00
lynn
01a3aa1c92 chore: add constants for testing (#6367)
* init

* use constants

* change address

* move noop

* add eslint rule

* return null in noop

* fixes
2023-04-19 12:21:30 -04:00
Zach Pomerantz
7121b4aa1c test: expand collectCoverageFrom (#6393)
* test: expand collectCoverageFrom

* fix: improve types coverage

* fix: target generated dirs

* fix: glob dirs
2023-04-19 09:04:41 -07:00
Zach Pomerantz
a538bf0b69 build: target ESNext for dev (#6379)
* build: add caching to eslint

* build: add caching to jest

* build: add caching to tsc

* build: add caching to actions

* fix: upgrade upload-artifact to v3

* build: update craco eslint cacheLocation

* build: target ESNext for dev

* merge again
2023-04-17 14:26:00 -07:00
Zach Pomerantz
135cb8fb34 fix: translate "Get started" on landing page (#6371)
* fix: translate "Get started" on landing page

* lint: html
2023-04-17 14:03:38 -07:00
cartcrom
bf50582d38 test: local activity tests (#6341)
* refactor: move MP files into subfolders

* refactor: consolidate MP subfolder file-naming scheme

* test: add tests for parseLocal.ts

* refactor: update existing parseLocal tests
2023-04-17 13:03:43 -07:00
lynn
110e23d6eb fix: fix padding for transaction toast notifications (#6373)
* padding fixes, special casing for txn

* add drop shadow, change width to 348px, remove debug code

* opacity animation

* address comments

* one more change

* respond to tina comments

* name change

* add $ to padding
2023-04-17 14:39:38 -04:00
Zach Pomerantz
7ab6a17b42 build: utilize the node_modules/.cache (#6364)
* build: add caching to eslint

* build: add caching to jest

* build: add caching to tsc

* build: add caching to actions

* fix: upgrade upload-artifact to v3

* build: update craco eslint cacheLocation

* fix: pr nits
2023-04-17 09:28:00 -07:00
lynn
7ad13c96a8 fix: fix slow yarn start (#6369)
init
2023-04-14 11:45:33 -05:00
Vignesh Mohankumar
4e99cc4d93 build: send url without hash to sentry (#6352)
* build: send url without hash to sentry

* comments

* Update src/tracing/index.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/tracing/index.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* add test

* move files around
2023-04-13 17:49:29 -04:00
Vignesh Mohankumar
6d29815f59 fix: ignore error caused by Cloudflare HTML response (#6356)
* fix: ignore error caused by Cloudflare HTML response

* add test

* Update src/tracing/errors.test.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/tracing/errors.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/tracing/errors.ts

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* multiline
2023-04-13 17:48:50 -04:00
Zach Pomerantz
4888fe23df test: add jest.asMock (#6310)
* test: add jest.asMock

* test: use mocked instead

* test: split test-utils to prevent interaction

* test: whoops missed one

* Merge but actually this time
2023-04-13 12:44:06 -07:00
Zach Pomerantz
ef9ecd9ce2 build: optimize build by splitting out typechecking and linting (#6323)
* build: move typecheck/lint out of build

* build: add typecheck to test action

* build: fix lint to use gitignore

* fix: correctly lint/check

* fix: simplify lint

* build: back out eslint array-ification

* test(lint): add comment RE config/typings

* build: clarify craco webpack plugin mods

* build: simplify craco webpack with functional methods

* build: rm unused IgnorePlugin

* test(lint): order imports
2023-04-13 12:43:47 -07:00
Jack Short
f5d0804c46 feat: creating feature flag for details v2 page (#6359)
* feat: creating feature flag for details v2 page

* eslint ignore

* moving details v2 under trace
2023-04-13 15:43:14 -04:00
Vignesh Mohankumar
0bac257254 fix: handle invalid chainId on position page (#6338)
* fix: handle invalid chainId on position page

* fix

* add test

* Revert "add test"

This reverts commit d18742aa50.

* pr comments

* rename

* fix
2023-04-13 15:40:31 -04:00
lynn
a77752ab83 fix: re-implement dark mode for connector icons (#6329)
* init

* init

* Update src/connection/index.test.tsx

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/components/Identicon/StatusIcon.test.tsx

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* Update src/components/Identicon/StatusIcon.test.tsx

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* address comments

* unit test + remove _url in names

---------

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
2023-04-13 11:17:48 -04:00
cartcrom
bf31ca4f06 feat: updated banner (#6355)
* feat: updated banner

* fix: linted

* feat: add download link to overflow menu

* feat: hover animation

* fix: update landing screen hide logic

* feat: added descriptor comment for stopPropogation

* fix: translations & responsiveness of button text

* fix: icon sizing / padding + word casing

* fix: Learn more casing
2023-04-12 22:00:05 -04:00
Charles Bachmeier
ed8afbd851 fix: App crashing when changing sorting or toggling usd price on trneding NFTs table (#6354)
* fix app breaking when changing sorting or toggling usd price

* compare floor change correctly

---------

Co-authored-by: Charles Bachmeier <charlie@genie.xyz>
2023-04-12 15:49:04 -07:00
Vignesh Mohankumar
47b6a7c4d5 build: add chainId as tag in sentry ErrorBoundary (#6345)
* build: add chainId to sentry tags

* set it in web3provider

* set before sending
2023-04-12 14:43:37 -04:00
cartcrom
086fc65457 feat: remove /wallet route (#6350)
* feat: replace internal microsite routes with links to external site

* feat: use updated analytics events from events repo

* fix: remove unnused empty wallet page
2023-04-12 13:55:53 -04:00
cartcrom
7df53f30a0 feat: uniwallet banner (#6344)
* feat: update wallet banner display logic

* fix: linted

* fix: learn more link
2023-04-12 12:03:00 -04:00
Jack Short
66497a0108 fix: last sale nan (#6337)
* fix: last sale nan

* correct formatted price

* responding to comments

* refactoring for readability
2023-04-12 11:45:48 -04:00
cartcrom
e0eb701bc0 feat: log connection activation/errors (#6333)
* feat: log connection activation/errors in console.debug

* fix: remove now-redundant comment
2023-04-12 10:36:01 -04:00
cartcrom
36cb0668a3 fix: use updated wallet links/language (#6343)
fix: use updated links/language
2023-04-11 18:36:34 -04:00
eddie
810f42136e fix: auto-dismiss MP bottom sheet after Buy Crypto click (#6298) 2023-04-11 14:46:28 -07:00
Vignesh Mohankumar
07b7d7f268 test: add test for position page states (#6342) 2023-04-11 17:10:38 -04:00
Charles Bachmeier
39b5bb37cd feat: hide looksrare until we can support their sdk (#6339)
* hide looksrare until we can support their sdk

* remove commented code

---------

Co-authored-by: Charles Bachmeier <charlie@genie.xyz>
2023-04-11 13:13:55 -07:00
cartcrom
feed63b1b3 refactor: reorganize mini-portfolio file names (#6336)
* refactor: move MP files into subfolders

* refactor: consolidate MP subfolder file-naming scheme
2023-04-11 15:26:27 -04:00
Vignesh Mohankumar
ee56382956 fix: ignores "user rejected transaction" errors (#6330)
* ignore user rejected errors

* test

* fix

* use util
2023-04-11 14:28:30 -04:00
lynn
64e396d9e0 fix: update empty state svg icons (#6326)
* update icons

* add snapshot test for empty states

* update failing snapshot
2023-04-11 13:37:05 -04:00
Tina
2ffc8a0bdf chore: Remove SWAP_TRANSACTION_COMPLETED event (#6328)
remove swap completed event
2023-04-10 17:27:02 -07:00
eddie
5ec9cdc5c4 fix: redo MP drawer layout changes with mobile fixed (#6280)
* fix: redo MP drawer layout changes with mobile fixed

* fix: mobile fix and another test

* fix: comments
2023-04-10 12:53:58 -07:00
eddie
4d85775d90 fix: update CurrencyList unit tests (#6321)
* fix: testing snapshot updates

* fix: remove inline style and update snapshots tests
2023-04-10 12:18:54 -07:00
eddie
c1c59ca692 refactor: rename WalletDropdown to AccountDrawer (#6313)
* feat: rename WalletDropdown to Portfolio

* fix: update after rebase

* feat: rename from Portfolio to AccountDrawer

* fix: fix test
2023-04-10 11:26:05 -07:00
Zach Pomerantz
f29d97413e build: use env node for craco lint (#6311) 2023-04-10 10:05:22 -07:00
Zach Pomerantz
a078d94a38 chore: update pr template (#6314) 2023-04-10 10:05:06 -07:00
lynn
c9c3329bc3 fix: switch back buttons in mini portfolio (#6327)
switch back header
2023-04-10 12:57:31 -04:00
eddie
13d0b70fa8 fix: remove "Received Swap Quote" field from Connect Wallet event (#6316) 2023-04-10 09:18:07 -07:00
lynn
b852e4e64a feat: adding analytics for fiat on ramp buy button feature (#6272)
* init

* testing if it works

* wip

* tooltip still not working correctly

* modal still not triggered after initial buy click

* remove invalid import

* region check fixed

* add disabled buy button treatment

* simplify and fix toggle twice bug

* no more state mgmt bugs finally

* rename vars for clarity and add todos

* add feature flag, remove toast

* keep wallet drawer open upon repeated buy clicks

* remove from feature flag modal for now

* unused vars

* first round respond to tina comments

* respond to tina padding comments, fix padding in response to cal feedback

* last round tina comments

* init pending element names being added to analytics events repo

* update event names

* add tooltip delay requested by fred and cal

* middle of revisions, fiat buy flow readability wip

* hook logic refactor done + added basic unit test

* rename enum and add todo for unit tests

* mouseover tooltip disable properly

* fix mouseover tooltip not working, ensure dot working as expected, rename buyFiatClicked to buyFiatFlowCompleted

* change developer doc comment

* respond comments

* update snapshot test

* lint fix

* remove unnecessary changes
2023-04-07 13:02:07 -04:00
lynn
55bd3555be feat: Web 2996 add fiat on ramp buy flow to swap modal on the interface (#6240)
* init

* testing if it works

* wip

* tooltip still not working correctly

* modal still not triggered after initial buy click

* remove invalid import

* region check fixed

* add disabled buy button treatment

* simplify and fix toggle twice bug

* no more state mgmt bugs finally

* rename vars for clarity and add todos

* add feature flag, remove toast

* keep wallet drawer open upon repeated buy clicks

* remove from feature flag modal for now

* unused vars

* first round respond to tina comments

* respond to tina padding comments, fix padding in response to cal feedback

* last round tina comments

* add tooltip delay requested by fred and cal

* middle of revisions, fiat buy flow readability wip

* hook logic refactor done + added basic unit test

* rename enum and add todo for unit tests

* mouseover tooltip disable properly

* fix mouseover tooltip not working, ensure dot working as expected, rename buyFiatClicked to buyFiatFlowCompleted

* change developer doc comment

* respond comments

* update snapshot test

* comments

* small changes + unit tests

* dedup

* remove enzyme

* Remove unecessary line

* simplify

* more cleanup

* add missing await

* more comments

* more comment responses

* more comment responses

* delay show fixes and respond to comments

* fix logic for show

* remove tooltip delay, unit test changes

* Update src/components/Popover/index.tsx

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>

* remove delay on tooltip

* missed one

* Update src/components/swap/SwapBuyFiatButton.test.tsx

Co-authored-by: Tina <59578595+tinaszheng@users.noreply.github.com>

* comments

* .

* lint error

---------

Co-authored-by: Zach Pomerantz <zzmp@uniswap.org>
Co-authored-by: Tina <59578595+tinaszheng@users.noreply.github.com>
2023-04-06 17:06:50 -04:00
Zach Pomerantz
972a65066c fix: do not double-report i18n exception (#6308) 2023-04-06 13:18:01 -07:00
eddie
39a212f762 fix: catch json parse error in fetchTokenList (#6278)
* fix: catch json parse error in fetchTokenList

* fix: refactor fetchTokenList and add more tests

* fix: import in test

* fix: comments and names

* fix: comment format

* fix: comment formatting
2023-04-06 11:15:39 -07:00
Jack Short
c362f4fe39 chore: removing unnecessary data in assets query (#6301)
* chore: removing unnecessary data in assets query

* no smallimageurl

* disabling nft drawer loading initially on nft pages

* removed too much

* renaming

* fix missing rank
2023-04-06 14:04:16 -04:00
eddie
271ef580e1 fix: make token list version bump error quieter (#6271)
* fix: use console.debug for expected transient error

* fix: add tests

* fix: name and lints
2023-04-06 10:26:56 -07:00
Zach Pomerantz
81ced4cb8b test(e2e): configure cypress test retries for CI (#6305)
test: configure retries for cypress CI
2023-04-06 09:30:07 -07:00
cartcrom
ab214a8133 fix: only use local txs for current account (#6284)
* fix: only use local txs for current account

* refactor: remove unecessary try/catch

* fix: add back try/catch
2023-04-06 11:43:39 -04:00
eddie
1b2d86ae3a feat: remove amplitude swap error logging (#6306) 2023-04-05 16:09:07 -07:00
Zach Pomerantz
40cac44e07 docs: use comments for pull_request_template (#6304)
* docs: use comments for pull_request_template

* docs: update
2023-04-05 09:12:38 -07:00
eddie
4e6d28cff4 feat: Update pull_request_template.md (#6302)
Update pull_request_template.md

add notes about testing mobile layouts to the test plan prompts
2023-04-04 14:57:47 -07:00
eddie
709fad0804 test: add unit test coverage to some redux state files (#6285) 2023-04-04 09:46:24 -07:00
Zach Pomerantz
573f4c873a fix: omit failed eth_blockNumber calls from sentry (#6267)
* build: upgrade sentry

* fix: omit failed eth_blockNumber calls from sentry

* test: beforeSend

* fix: bring to parity with #6281

* docs: type filterKnownErrors to beforeSend
2023-04-03 15:12:33 -07:00
eddie
d300db669f fix: z index issue with socks icon (#6295) 2023-04-03 15:12:22 -07:00
eddie
fb8217ddea fix: dont block trade when price impact is favorable (#6261)
* fix: dont block trade when price impact is favorable

* fix: add comment
2023-04-03 14:13:27 -07:00
Jordan Frankfurt
7b9a23d920 feat: reduce severity of phishing filter to allow url token names (#6282)
* feat: reduce severity of phishing filter to allow url token names

* tests

* remove unused var from test

* test rendering mini portfolio pools list

* update owner

* update variable names to match cmcewen's suggestions

* checkStringForURL -> hasURL
2023-03-31 12:59:02 -05:00
Connor McEwen
120ad935fa revert: "fix: mini portfolio layout fixes" (#6279)
Revert "fix: mini portfolio layout fixes (#6260)"

This reverts commit fb05439d32.
2023-03-30 18:47:42 -04:00
cartcrom
4eaf16b624 fix: injection detection bug (#6276)
* fix: use functions to check injection status rather than static vars

* fix: unnused field

* fix: don't prompt mm install for generics

* fix: generic injector function

* fix: display name for MM on cb browser

* fix: re-add ios mobile check for uniswap wallet

* fix: reword comment

* fix: refactor delayed-injection test

* feat: added comments

* fix: revert to minimal changes

* fix: update tests
2023-03-30 17:50:20 -04:00
Connor McEwen
857e2915ab fix: put environment in the wrong place (#6277)
* fix: put environment in the wrong place

* move to proper step
2023-03-30 16:54:45 -04:00
Connor McEwen
7410c81b42 chore: update workflow release env (#6275) 2023-03-30 15:43:18 -04:00
eddie
fb05439d32 fix: mini portfolio layout fixes (#6260)
* fix: mini portfolio layout fixes

* feat: refactor MP drawer CSS
2023-03-30 12:07:02 -07:00
eddie
fb7eade70b fix: l2 icon borders in MP (#6254)
* fix: l2 icon borders in MP

* fix: bool logic

* fix: comments and add test

* fix: change variable name

* fix: split l2 icon into two components
2023-03-30 11:59:46 -07:00
eddie
bd2b2c487a fix: close MP drawer on nft nav (#6251)
* fix: close MP drawer on nft nav

* fix: make callbacks optional, rename props

* fix: improve card API

* fix: add e2e test
2023-03-29 15:08:30 -07:00
eddie
2f004ed1d9 fix: remove deprecated default imports from zustand (#6270)
* fix: replace default imports from zustand

* fix: add eslint rule

* fix: typo

o
2023-03-29 13:25:30 -07:00
Zach Pomerantz
db257c73f2 fix: improve chain id error (#6266)
* build: upgrade sentry

* fix: improve chain id error
2023-03-29 12:38:33 -07:00
Zach Pomerantz
7c37b9d00e build: upgrade sentry (#6264)
* build: upgrade sentry

* chore: comment nits
2023-03-29 11:05:13 -07:00
Connor McEwen
7688c527f0 chore: update codecov yaml (#6262)
chore: set patch coverage to 80%, lower tolerance threshold, remove unused keys
2023-03-29 11:31:27 -04:00
eddie
06dd41a9cd fix: getCurrency crash when token not found (#6263)
* fix: getCurrency crash when token not found

* fix: comments and add test

* fix: remove extra whitespace in unit test

* fix: make e2e test pass
2023-03-28 18:44:48 -07:00
eddie
850fec40a9 fix: remove price tag from nft cards in the side drawer (#6252)
* fix: remove price tag from nft cards in the side drawer

* fix: decouple price from display logic

* fix: missing file chaneg

* fix: add tests
2023-03-28 09:26:32 -07:00
yyip-dev
3c7eabc3d8 docs: Update PR template (#6235)
* Update PR template

* Add screen capture section and simplify descriptions

* Link out to PR title conventions & remove monitoring section
2023-03-28 11:31:11 -04:00
Jordan Frankfurt
048607080c feat: add query param to disable the nft sections of the app (#6225)
* feat: add queryparam to disable the nft sections of the app

* fix

* include mini portfolio

* add comments explaining nft disable atom usage and suggesting future work

* add subtitle exception to landing page and correct the bool

* update comment

* comment syntax nits
2023-03-27 20:54:39 -05:00
eddie
a0f20c54d8 feat: implement new designs for tx notifs (#6232)
* feat: re-add transaction activity popups

* feat: implement new designs for tx notifs

* fix: address comments

* fix: remove color from alert icon

* fix: nits

* fix: remove null check

* fix: fix
2023-03-27 13:56:52 -07:00
Zoltan Arvai
da79abbc0d feat: adds Ledger Connect to non-MetaMask wallet list (#6257)
feat: add Ledger Connect to non-MetaMask wallet list
2023-03-27 16:16:30 -04:00
Vignesh Mohankumar
5ac08e1142 fix: link to lowercase chain name from position page (#6195)
* fix: link to lowercase chain name from position page

* fix: use existing const
2023-03-27 14:41:03 -04:00
eddie
d330eea375 feat: re-add transaction activity popups (#6223) 2023-03-27 10:07:41 -07:00
eddie
35dace7bfe feat: cypress test coverage reporting (#6212)
* wip

* fix: only instrument thru babel in test and dev

* fix: remove unused deps

* fix: yarn dedup

* fix: remove nyc_output dir from git

* fix: remove comment from index.html
2023-03-27 09:48:02 -07:00
Vignesh Mohankumar
8ce8e17f62 fix: Revert to previous Nav menu (#6258)
* fix: revert nav

* lint

* fix

* fix
2023-03-27 12:32:01 -04:00
309 changed files with 9088 additions and 3347 deletions

View File

@@ -1,5 +0,0 @@
*.config.ts
*.d.ts
/src/graphql/data/__generated__/types-and-hooks.ts
/src/graphql/thegraph/__generated__/types-and-hooks.ts
/src/schema/schema.graphql

View File

@@ -4,4 +4,47 @@ require('@uniswap/eslint-config/load')
module.exports = {
extends: '@uniswap/eslint-config/react',
overrides: [
{
// Configuration/typings typically export objects/definitions that are used outside of the transpiled package
// (eg not captured by the tsconfig). Because it's typical and not exceptional, this is turned off entirely.
files: ['**/*.config.*', '**/*.d.ts'],
rules: {
'import/no-unused-modules': 'off',
},
},
{
files: ['**/*.ts', '**/*.tsx'],
rules: {
'import/no-restricted-paths': [
'error',
{
zones: [
{
target: ['src/**/*[!.test].ts', 'src/**/*[!.test].tsx'],
from: 'src/test-utils',
},
],
},
],
'no-restricted-imports': [
'error',
{
paths: [
{
name: 'moment',
// tree-shaking for moment is not configured because it degrades performance - see craco.config.cjs.
message: 'moment is not configured for tree-shaking. If you use it, update the Webpack configuration.',
},
{
name: 'zustand',
importNames: ['default'],
message: 'Default import from zustand is deprecated. Import `{ create }` instead.',
},
],
},
],
},
},
],
}

View File

@@ -1,4 +1,6 @@
name: Setup
description: checkout repo, setup node, and install node_modules
runs:
using: composite
steps:
@@ -8,14 +10,15 @@ runs:
with:
node-version: 14
registry-url: https://registry.npmjs.org
cache: yarn
# node_modules/.cache is intentionally omitted, as this is used for build tool caches.
- uses: actions/cache@v3
id: install-cache
with:
path: node_modules/
path: |
node_modules
!node_modules/.cache
key: ${{ runner.os }}-install-${{ hashFiles('**/yarn.lock') }}
- if: steps.install-cache.outputs.cache-hit != 'true'
run: yarn install --frozen-lockfile --ignore-scripts
shell: bash

View File

@@ -1,24 +1,45 @@
Your PR title must follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/#summary), and should start with one of the following [types](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#type):
<!-- Your PR title must follow conventional commits: https://github.com/Uniswap/interface#pr-title -->
- build: Changes that affect the build system or external dependencies (example scopes: yarn, eslint, typescript)
- ci: Changes to our CI configuration files and scripts (example scopes: vercel, github, cypress)
- docs: Documentation only changes
- feat: A new feature
- fix: A bug fix
- perf: A code change that improves performance
- refactor: A code change that neither fixes a bug nor adds a feature
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- test: Adding missing tests or correcting existing tests
## Description
<!-- Summary of change, including motivation and context. -->
<!-- Use verb-driven language: "Fixes XYZ" instead of "This change fixes XYZ" -->
Example commit messages:
- feat: adds support for gnosis safe wallet
- fix: removes a polling memory leak
- chore: bumps redux version
<!-- Delete inapplicable lines: -->
_JIRA ticket:_
_Slack thread:_
_Relevant docs:_
Other things to note:
- Please describe the change using verb statements (ex: Removes X from Y)
- PRs with multiple changes should use a list of verb statements
- Add any relevant unit / integration tests
- Changes will be previewable via vercel. Non-obvious changes should include instructions for how to reproduce them
<!-- Delete this section if your change does not affect UI. -->
## Screen capture
| Before | After (Desktop) | After (Mobile) |
| ------------ |---------------- | -------------- |
| paste_before | past_after | paste_after |
## Test plan
<!-- Delete this section if your change is not a bug fix. -->
### Reproducing the error
<!-- Include steps to reproduce the bug. -->
1.
### QA (ie manual testing)
<!-- Include steps to test the change, ensuring no regression. -->
- [ ] N/A
#### Devices
<!-- If applicable, include different devices and screen sizes that may be affected, and how you've tested them. -->
### Automated testing
<!-- If N/A, check and note so it is obvious to your reviewers and does not show up as an incomplete task. -->
<!-- eg - [x] Unit test N/A -->
- [ ] Unit test
- [ ] Integration/E2E test

View File

@@ -42,6 +42,8 @@ jobs:
needs: tag
if: ${{ needs.tag.outputs.new_tag != null }}
runs-on: ubuntu-latest
environment:
name: release
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup

View File

@@ -1,5 +1,9 @@
name: Test
# Many build steps have their own caches, so each job has its own cache to improve subsequent build times.
# Build tools are configured to cache cache to node_modules/.cache, so this is cached independently of node_modules.
# See https://jongleberry.medium.com/speed-up-your-ci-and-dx-with-node-modules-cache-ac8df82b7bb0.
on:
push:
branches:
@@ -14,7 +18,27 @@ jobs:
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: eslint-cache
with:
path: node_modules/.cache
key: ${{ runner.os }}-eslint-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-eslint-${{ hashFiles('**/yarn.lock') }}-
- run: yarn lint
typecheck:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: tsc-cache
with:
path: node_modules/.cache
key: ${{ runner.os }}-tsc-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-tsc-${{ hashFiles('**/yarn.lock') }}-
- run: yarn prepare
- run: yarn typecheck
deps-tests:
runs-on: ubuntu-latest
@@ -28,58 +52,76 @@ jobs:
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: jest-cache
with:
path: node_modules/.cache
key: ${{ runner.os }}-jest-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-jest-${{ hashFiles('**/yarn.lock') }}-
- run: yarn prepare
- run: yarn test
- run: yarn test --silent --maxWorkers=100%
- uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
verbose: true
flags: unit-tests
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: build-cache
with:
path: node_modules/.cache
key: ${{ runner.os }}-build-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-build-${{ hashFiles('**/yarn.lock') }}-
- run: yarn prepare
- run: yarn build
- uses: actions/upload-artifact@v2
- uses: actions/upload-artifact@v3
with:
name: build
path: build
if-no-files-found: error
build-e2e:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: build-e2e-cache
with:
path: node_modules/.cache
key: ${{ runner.os }}-build-e2e-${{ hashFiles('**/yarn.lock') }}-${{ github.run_id }}
restore-keys: ${{ runner.os }}-build-e2e-${{ hashFiles('**/yarn.lock') }}-
- run: yarn prepare
- run: yarn build:e2e
env:
NODE_OPTIONS: "--max_old_space_size=4096"
- uses: actions/upload-artifact@v2
with:
name: build-e2e
path: build
if-no-files-found: error
size-tests:
needs: [build]
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/download-artifact@v2
- uses: actions/download-artifact@v3
with:
name: build
path: build
- run: yarn test:size
cypress-build:
runs-on: ubuntu-latest
container: cypress/browsers:node-18.14.1-chrome-111.0.5563.64-1-ff-111.0-edge-111.0.1661.43-1
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/cache@v3
id: cypress-cache
with:
path: /root/.cache/Cypress
key: ${{ runner.os }}-cypress-${{ hashFiles('yarn.lock') }}
- if: steps.cypress-cache.outputs.cache-hit != 'true'
run: |
yarn cypress install
yarn cypress info
cypress-test-matrix:
needs: [build, cypress-build]
needs: [build-e2e]
runs-on: ubuntu-latest
container: cypress/browsers:node-18.14.1-chrome-111.0.5563.64-1-ff-111.0-edge-111.0.1661.43-1
strategy:
@@ -89,17 +131,19 @@ jobs:
steps:
- uses: actions/checkout@v3
- uses: ./.github/actions/setup
- uses: actions/download-artifact@v2
with:
name: build
path: build
- uses: actions/cache@v3
id: cypress-cache
with:
path: /root/.cache/Cypress
key: ${{ runner.os }}-cypress-${{ hashFiles('yarn.lock') }}
- if: steps.cypress-cache.outputs.cache-hit != 'true'
run: yarn cypress install
key: ${{ runner.os }}-cypress
- run: |
yarn cypress install
yarn cypress info
- uses: actions/download-artifact@v3
with:
name: build-e2e
path: build
- uses: cypress-io/github-action@v4
with:
@@ -113,6 +157,13 @@ jobs:
CYPRESS_RECORD_KEY: ${{ secrets.CYPRESS_RECORD_KEY }}
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- uses: codecov/codecov-action@v3
with:
token: ${{ secrets.CODECOV_TOKEN }}
fail_ci_if_error: false
verbose: true
flags: e2e-tests
# Included as a single job to check for cypress-test-matrix success, as a matrix cannot be checked.
cypress-tests:
if: ${{ always() }}

5
.gitignore vendored
View File

@@ -17,6 +17,7 @@ schema.graphql
# testing
/coverage
/cache
# builds
/build
@@ -29,6 +30,10 @@ schema.graphql
.env.test.local
.env.production.local
instrumented
.nyc_output
.nyc_output/**/*
/.netlify
npm-debug.log*

View File

@@ -38,6 +38,33 @@ You can block an entire list of tokens by passing in a tokenlist like [here](./s
For steps on local deployment, development, and code contribution, please see [CONTRIBUTING](./CONTRIBUTING.md).
#### PR Title
Your PR title must follow [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/#summary), and should start with one of the following [types](https://github.com/angular/angular/blob/22b96b9/CONTRIBUTING.md#type):
- build: Changes that affect the build system or external dependencies (example scopes: yarn, eslint, typescript)
- ci: Changes to our CI configuration files and scripts (example scopes: vercel, github, cypress)
- docs: Documentation only changes
- feat: A new feature
- fix: A bug fix
- perf: A code change that improves performance
- refactor: A code change that neither fixes a bug nor adds a feature
- style: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
- test: Adding missing tests or correcting existing tests
Example commit messages:
- feat: adds support for gnosis safe wallet
- fix: removes a polling memory leak
- chore: bumps redux version
Other things to note:
- Please describe the change using verb statements (ex: Removes X from Y)
- PRs with multiple changes should use a list of verb statements
- Add any relevant unit / integration tests
- Changes will be previewable via vercel. Non-obvious changes should include instructions for how to reproduce them
## Accessing Uniswap V2
The Uniswap Interface supports swapping, adding liquidity, removing liquidity and migrating liquidity for Uniswap protocol V2.

25
codecov.yml Normal file
View File

@@ -0,0 +1,25 @@
ignore:
- "**/generated/**/*"
- "**/generated/*"
- "**/cypress/**/*"
- "cypress/**/*"
- "**/instrumented/**/*"
- "**/styles/**/*"
- "styles/**/*"
- "**/constants/**/*"
- "constants/**/*"
flag_management:
default_rules:
statuses:
- type: project
target: auto
threshold: 1%
if_ci_failed: error
- type: patch
target: 80%
individual_flags:
- name: e2e-tests
statuses:
- type: patch
target: 0%

View File

@@ -1,17 +1,61 @@
/* eslint-disable @typescript-eslint/no-var-requires */
/* eslint-env node */
const { VanillaExtractPlugin } = require('@vanilla-extract/webpack-plugin')
const { execSync } = require('child_process')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const { DefinePlugin } = require('webpack')
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin')
const { DefinePlugin, IgnorePlugin } = require('webpack')
const commitHash = require('child_process').execSync('git rev-parse HEAD')
const commitHash = execSync('git rev-parse HEAD').toString().trim()
const isProduction = process.env.NODE_ENV === 'production'
// Linting and type checking are only necessary as part of development and testing.
// Omit them from production builds, as they slow down the feedback loop.
const shouldLintOrTypeCheck = !isProduction
module.exports = {
babel: {
plugins: ['@vanilla-extract/babel-plugin'],
plugins: [
'@vanilla-extract/babel-plugin',
...(process.env.REACT_APP_ADD_COVERAGE_INSTRUMENTATION
? [
[
'istanbul',
{
all: true,
include: ['src/**/*.tsx', 'src/**/*.ts'],
exclude: [
'src/**/*.css',
'src/**/*.css.ts',
'src/**/*.test.ts',
'src/**/*.test.tsx',
'src/**/*.spec.ts',
'src/**/*.spec.tsx',
'src/**/graphql/**/*',
'src/**/*.d.ts',
],
},
],
]
: []),
],
},
eslint: {
enable: shouldLintOrTypeCheck,
pluginOptions(eslintConfig) {
return Object.assign(eslintConfig, {
cache: true,
cacheLocation: 'node_modules/.cache/eslint/',
ignorePath: '.gitignore',
})
},
},
typescript: {
enableTypeChecking: shouldLintOrTypeCheck,
},
jest: {
configure(jestConfig) {
return Object.assign({}, jestConfig, {
return Object.assign(jestConfig, {
cacheDirectory: 'node_modules/.cache/jest',
transformIgnorePatterns: ['@uniswap/conedison/format', '@uniswap/conedison/provider'],
moduleNameMapper: {
'@uniswap/conedison/format': '@uniswap/conedison/dist/format',
@@ -21,25 +65,40 @@ module.exports = {
},
},
webpack: {
plugins: [
new VanillaExtractPlugin({ identifiers: 'short' }),
new DefinePlugin({
'process.env.REACT_APP_GIT_COMMIT_HASH': JSON.stringify(commitHash.toString()),
}),
],
plugins: [new VanillaExtractPlugin({ identifiers: 'short' })],
configure: (webpackConfig) => {
const instanceOfMiniCssExtractPlugin = webpackConfig.plugins.find(
(plugin) => plugin instanceof MiniCssExtractPlugin
)
if (instanceOfMiniCssExtractPlugin !== undefined) instanceOfMiniCssExtractPlugin.options.ignoreOrder = true
webpackConfig.plugins = webpackConfig.plugins
.map((plugin) => {
// Extend process.env with dynamic values (eg commit hash).
// This will make dynamic values available to JavaScript only, not to interpolated HTML (ie index.html).
if (plugin instanceof DefinePlugin) {
Object.assign(plugin.definitions['process.env'], {
REACT_APP_GIT_COMMIT_HASH: JSON.stringify(commitHash),
})
}
// We're currently on Webpack 4.x that doesn't support the `exports` field in package.json.
// CSS ordering is mitigated through scoping / naming conventions, so we can ignore order warnings.
// See https://webpack.js.org/plugins/mini-css-extract-plugin/#remove-order-warnings.
if (plugin instanceof MiniCssExtractPlugin) {
plugin.options.ignoreOrder = true
}
return plugin
})
.filter((plugin) => {
// Case sensitive paths are enforced by TypeScript.
// See https://www.typescriptlang.org/tsconfig#forceConsistentCasingInFileNames.
if (plugin instanceof CaseSensitivePathsPlugin) return false
// IgnorePlugin is used to tree-shake moment locales, but we do not use moment in this project.
if (plugin instanceof IgnorePlugin) return false
return true
})
// We're currently on Webpack 4.x which doesn't support the `exports` field in package.json.
// Instead, we need to manually map the import path to the correct exports path (eg dist or build folder).
// See https://github.com/webpack/webpack/issues/9509.
//
// In case you need to add more modules, make sure to remap them to the correct path.
//
// Map @uniswap/conedison to its dist folder.
// This is required because conedison uses * to redirect all imports to its dist.
webpackConfig.resolve.alias['@uniswap/conedison'] = '@uniswap/conedison/dist'
return webpackConfig

View File

@@ -1,12 +1,17 @@
import codeCoverageTask from '@cypress/code-coverage/task'
import { defineConfig } from 'cypress'
import { setupHardhatEvents } from 'cypress-hardhat'
export default defineConfig({
projectId: 'yp82ef',
videoUploadOnPasses: false,
defaultCommandTimeout: 24000, // 2x average block time
chromeWebSecurity: false,
retries: { runMode: 2 },
e2e: {
setupNodeEvents(on, config) {
async setupNodeEvents(on, config) {
await setupHardhatEvents(on, config)
codeCoverageTask(on, config)
return {
...config,
// Only enable Chrome.

View File

@@ -1,8 +0,0 @@
import { defineConfig } from 'cypress'
export default defineConfig({
projectId: 'yp82ef',
e2e: {
specPattern: 'cypress/release.ts',
},
})

View File

@@ -26,7 +26,15 @@ describe('Landing Page', () => {
it('allows navigation to pool', () => {
cy.viewport(2000, 1600)
cy.visit('/swap')
cy.get(getTestSelector('pool-nav-link')).first().click()
cy.url().should('include', '/pools')
})
it('allows navigation to pool on mobile', () => {
cy.viewport('iphone-6')
cy.visit('/swap')
cy.get(getTestSelector('pool-nav-link')).last().click()
cy.url().should('include', '/pools')
})
})

View File

@@ -53,4 +53,11 @@ describe('Testing nfts', () => {
cy.get(getTestSelector('web3-status-connected')).click()
cy.get(getTestSelector('nft-view-self-nfts')).click()
})
it('should close the sidebar when navigating to NFT details', () => {
cy.get(getTestSelector('web3-status-connected')).click()
cy.get(getTestSelector('mini-portfolio-nav-nfts')).click()
cy.get(getTestSelector('mini-portfolio-nft')).first().click()
cy.contains('Buy crypto').should('not.be.visible')
})
})

View File

@@ -0,0 +1,11 @@
describe('Position', () => {
it('shows an valid state on a supported network', () => {
cy.visit('/pools/1')
cy.contains('UNI / ETH')
})
it('shows an invalid state on a supported network', () => {
cy.visit('/pools/788893')
cy.contains('To view a position, you must be connected to the network it belongs to.')
})
})

View File

@@ -1,4 +1,4 @@
import assert = require('assert')
import assert from 'assert'
describe('Service Worker', () => {
before(() => {

View File

@@ -1,13 +1,56 @@
import { WETH_GOERLI } from '../fixtures/constants'
import { getTestSelector } from '../utils'
describe('Swap', () => {
const verifyAmount = (field: 'input' | 'output', amountText: string | null) => {
if (amountText === null) {
cy.get(`#swap-currency-${field} .token-amount-input`).should('not.have.value')
} else {
cy.get(`#swap-currency-${field} .token-amount-input`).should('have.value', amountText)
}
}
const verifyToken = (field: 'input' | 'output', tokenSymbol: string | null) => {
if (tokenSymbol === null) {
cy.get(`#swap-currency-${field} .token-symbol-container`).should('contain.text', 'Select token')
} else {
cy.get(`#swap-currency-${field} .token-symbol-container`).should('contain.text', tokenSymbol)
}
}
const selectOutput = (tokenSymbol: string) => {
// open token selector...
cy.contains('Select token').click()
// select token...
cy.contains(tokenSymbol).click()
cy.get('body')
.then(($body) => {
if ($body.find(getTestSelector('TokenSafetyWrapper')).length) {
return 'I understand'
}
return 'no-op' // Don't click on anything, a no-op
})
.then((content) => {
if (content !== 'no-op') {
cy.contains(content).click()
}
})
// token selector should close...
cy.contains('Search name or paste address').should('not.exist')
}
before(() => {
cy.visit('/swap')
})
it('starts with ETH selected by default', () => {
cy.get('#swap-currency-input .token-amount-input').should('have.value', '')
cy.get('#swap-currency-input .token-symbol-container').should('contain.text', 'ETH')
cy.get('#swap-currency-output .token-amount-input').should('not.have.value')
cy.get('#swap-currency-output .token-symbol-container').should('contain.text', 'Select token')
verifyAmount('input', '')
verifyToken('input', 'ETH')
verifyAmount('output', null)
verifyToken('output', null)
})
it('can enter an amount into input', () => {
@@ -30,24 +73,73 @@ describe('Swap', () => {
cy.get('#swap-currency-output .token-amount-input').clear().type('0.0').should('have.value', '0.0')
})
it.skip('can swap ETH for DAI', () => {
cy.get('#swap-currency-output .open-currency-select-button').click()
cy.get('.token-item-0xc7AD46e0b8a400Bb3C915120d284AafbA8fc4735').click()
cy.get('#swap-currency-input .token-amount-input').clear().type('0.0000001')
cy.get('#swap-currency-output .token-amount-input').should('not.equal', '')
cy.get('#swap-button').click()
cy.get('#confirm-swap-or-send').should('contain', 'Confirm Swap')
cy.get('[data-cy="confirmation-close-icon"]').click()
it('should have the correct default input/output and token selection should work', () => {
cy.visit('/swap')
verifyToken('input', 'ETH')
verifyToken('output', null)
selectOutput('WETH')
cy.get(getTestSelector('swap-currency-button')).first().click()
verifyToken('input', 'WETH')
verifyToken('output', 'ETH')
})
it('add a recipient does not exist unless in expert mode', () => {
cy.get('#add-recipient-button').should('not.exist')
it('should have the correct default input from URL params ', () => {
cy.visit(`/swap?inputCurrency=${WETH_GOERLI}`)
verifyToken('input', 'WETH')
verifyToken('output', null)
selectOutput('Ether')
cy.get(getTestSelector('swap-currency-button')).first().click()
verifyToken('input', 'ETH')
verifyToken('output', 'WETH')
})
it.skip('ETH to wETH is same value (wrapped swaps have no price impact)', () => {
cy.get('#swap-currency-output .open-currency-select-button').click()
cy.get('.token-item-0xc778417E063141139Fce010982780140Aa0cD5Ab').click()
it('should have the correct default output from URL params ', () => {
cy.visit(`/swap?outputCurrency=${WETH_GOERLI}`)
verifyToken('input', null)
verifyToken('output', 'WETH')
cy.get(getTestSelector('swap-currency-button')).first().click()
verifyToken('input', 'WETH')
verifyToken('output', null)
selectOutput('Ether')
cy.get(getTestSelector('swap-currency-button')).first().click()
verifyToken('input', 'ETH')
verifyToken('output', 'WETH')
})
it('ETH to wETH is same value (wrapped swaps have no price impact)', () => {
cy.visit('/swap')
selectOutput('WETH')
cy.get('#swap-currency-input .token-amount-input').clear().type('0.01')
cy.get('#swap-currency-output .token-amount-input').should('have.value', '0.01')
})
it('Opens and closes the settings menu', () => {
cy.visit('/swap')
cy.contains('Settings').should('not.exist')
cy.get(getTestSelector('swap-settings-button')).click()
cy.contains('Slippage tolerance').should('exist')
cy.contains('Transaction deadline').should('exist')
cy.contains('Auto Router API').should('exist')
cy.contains('Expert Mode').should('exist')
cy.get(getTestSelector('swap-settings-button')).click()
cy.contains('Settings').should('not.exist')
})
it('inputs reset when navigating between pages', () => {
cy.get('#swap-currency-input .token-amount-input').clear().type('0.01')
cy.get('#swap-currency-output .token-amount-input').should('not.equal', '')
cy.visit('/pool')
cy.visit('/swap')
cy.get('#swap-currency-input .token-amount-input').should('have.value', '')
cy.get('#swap-currency-output .token-amount-input').should('not.equal', '')
})
})

View File

@@ -1,4 +1,6 @@
import { getTestSelector } from '../utils'
import { getClassContainsSelector, getTestSelector } from '../utils'
const UNI_ADDRESS = '0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984'
describe('Token details', () => {
before(() => {
@@ -7,7 +9,7 @@ describe('Token details', () => {
it('Uniswap token should have all information populated', () => {
// Uniswap token
cy.visit('/tokens/ethereum/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984')
cy.visit(`/tokens/ethereum/${UNI_ADDRESS}`)
// Price chart should be filled in
cy.get('[data-cy="chart-header"]').should('include.text', '$')
@@ -28,18 +30,16 @@ describe('Token details', () => {
// Links section should link out to Etherscan, More analytics, Website, Twitter
cy.get('[data-cy="resources-container"]').within(() => {
cy.contains('Etherscan')
.should('have.attr', 'href')
.and('include', 'etherscan.io/address/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984')
cy.contains('Etherscan').should('have.attr', 'href').and('include', `etherscan.io/address/${UNI_ADDRESS}`)
cy.contains('More analytics')
.should('have.attr', 'href')
.and('include', 'info.uniswap.org/#/tokens/0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984')
.and('include', `info.uniswap.org/#/tokens/${UNI_ADDRESS}`)
cy.contains('Website').should('have.attr', 'href').and('include', 'uniswap.org')
cy.contains('Twitter').should('have.attr', 'href').and('include', 'twitter.com/Uniswap')
})
// Contract address should be displayed
cy.contains('0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984').should('exist')
cy.contains(UNI_ADDRESS).should('exist')
// Swap widget should have this token pre-selected as the “destination” token
cy.get(getTestSelector('token-select')).should('include.text', 'UNI')
@@ -89,4 +89,28 @@ describe('Token details', () => {
.should('include.text', 'Warning')
.and('include.text', "This token isn't traded on leading U.S. centralized exchanges")
})
describe('Swap on Token Detail Page', () => {
const verifyOutputToken = (outputText: string) => {
cy.get(getClassContainsSelector('TokenButtonRow')).last().contains(outputText)
}
beforeEach(() => {
// On mobile widths, we just link back to /swap instead of rendering the swap component.
cy.viewport(1200, 800)
cy.visit(`/tokens/goerli/${UNI_ADDRESS}`).then(() => {
cy.wait('@eth_blockNumber')
})
})
it('should have the expected output for a tokens detail page', () => {
verifyOutputToken('UNI')
})
it('should not share swap state with the main swap page', () => {
verifyOutputToken('UNI')
cy.visit('/swap')
cy.contains('UNI').should('not.exist')
})
})
})

View File

@@ -7,7 +7,7 @@ describe('Token explore', () => {
it('should load token leaderboard', () => {
cy.visit('/tokens/ethereum')
cy.get(getTestSelectorStartsWith('token-table')).its('length').should('be.eq', 100)
cy.get(getTestSelectorStartsWith('token-table')).its('length').should('be.greaterThan', 0)
// check sorted svg icon is present in volume cell, since tokens are sorted by volume by default
cy.get(getTestSelector('header-row')).find(getTestSelector('volume-cell')).find('svg').should('exist')
cy.get(getTestSelector('token-table-row-ETH')).find(getTestSelector('name-cell')).should('include.text', 'Ether')

View File

@@ -77,4 +77,20 @@ describe('Wallet Dropdown', () => {
cy.get(getTestSelector('theme-auto')).click()
cy.get(getTestSelector('wallet-header')).should('have.css', 'color', 'rgb(119, 128, 160)')
})
it('should dismiss the wallet bottom sheet when clicking buy crypto', () => {
visit(false)
cy.viewport('iphone-6')
cy.get(getTestSelector('web3-status-connected')).click()
cy.get(getTestSelector('wallet-buy-crypto')).click()
cy.contains('Buy crypto').should('not.be.visible')
})
it('should use a bottom sheet and dismiss when on a mobile screen size', () => {
visit(true)
cy.viewport('iphone-6')
cy.get(getTestSelector('web3-status-connected')).click()
cy.root().click(15, 40)
cy.get(getTestSelector('wallet-settings')).should('not.be.visible')
})
})

View File

@@ -0,0 +1 @@
export const WETH_GOERLI = '0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6'

View File

@@ -1,21 +0,0 @@
const ONE_MINUTE = 60_000
describe(
'Release',
{
pageLoadTimeout: ONE_MINUTE,
retries: 30,
},
() => {
it('loads swap page', () => {
// TODO: We *must* wait in order to space out the retry attempts. Find a better way to do this.
// eslint-disable-next-line cypress/no-unnecessary-waiting
cy.wait(ONE_MINUTE)
.visit('/', {
retryOnStatusCodeFailure: true,
retryOnNetworkFailure: true,
})
.get('#swap-page')
})
}
)

View File

@@ -6,10 +6,12 @@
// ***********************************************************
// Import commands.ts using ES2015 syntax:
import { injected } from './ethereum'
import assert = require('assert')
import '@cypress/code-coverage/support'
import assert from 'assert'
import { FeatureFlag } from '../../src/featureFlags/flags/featureFlags'
import { injected } from './ethereum'
declare global {
// eslint-disable-next-line @typescript-eslint/no-namespace

View File

@@ -1,9 +1,17 @@
{
"compilerOptions": {
"esModuleInterop": true,
"incremental": true,
"lib": ["DOM", "DOM.Iterable", "ESNext"],
"noEmit": true,
"strict": true,
"target": "es5",
"lib": ["es5", "dom"],
"types": ["cypress"]
"target": "ES5",
"tsBuildInfoFile": "../node_modules/.cache/tsbuildinfo/cypress", // avoid clobbering the build tsbuildinfo
"types": ["cypress", "node"]
},
"include": ["**/*.ts"]
"exclude": ["node_modules"],
"include": ["**/*.ts"],
"watchOptions": {
"excludeDirectories": ["node_modules"]
}
}

22
hardhat.config.js Normal file
View File

@@ -0,0 +1,22 @@
/* eslint-env node */
require('dotenv').config()
const mainnetFork = {
url: `https://mainnet.infura.io/v3/${process.env.REACT_APP_INFURA_KEY}`,
blockNumber: 17023328,
httpHeaders: {
Origin: 'localhost:3000', // infura allowlists requests by origin
},
}
module.exports = {
networks: {
hardhat: {
chainId: 1,
forking: mainnetFork,
accounts: {
count: 1,
},
},
},
}

View File

@@ -17,27 +17,33 @@
"i18n:compile": "yarn i18n:extract && lingui compile",
"i18n:pseudo": "lingui extract --locale pseudo && lingui compile",
"prepare": "yarn contracts:compile && yarn graphql:fetch && yarn graphql:generate && yarn i18n:compile",
"postinstall": "patch-package",
"start": "craco start",
"build": "craco build",
"build:e2e": "REACT_APP_CSP_ALLOW_UNSAFE_EVAL=true REACT_APP_ADD_COVERAGE_INSTRUMENTATION=true craco build",
"analyze": "source-map-explorer 'build/static/js/*.js'",
"serve": "serve build -l 3000",
"deduplicate": "yarn-deduplicate --strategy=highest",
"lint": "yarn eslint .",
"lint": "yarn eslint --ignore-path .gitignore --cache --cache-location node_modules/.cache/eslint/ .",
"typecheck": "tsc",
"test": "craco test --coverage",
"test:size": "node scripts/test-size.js",
"cypress:open": "cypress open --browser chrome --e2e",
"cypress:run": "cypress run --browser chrome --e2e",
"postinstall": "patch-package"
"deduplicate": "yarn-deduplicate --strategy=highest"
},
"jest": {
"collectCoverageFrom": [
"src/components/**/*.ts*",
"src/hooks/**/*.ts*",
"src/lib/hooks/**/*.ts*",
"src/lib/state/**/*.ts*",
"src/lib/utils/**/*.ts*",
"src/pages/**/*.ts*",
"src/state/**/*.ts*",
"src/utils/**/*.ts*"
"src/**/*.ts*",
"!src/**/*.d.ts",
"!src/abis/types/**",
"!src/constants/**/*.ts",
"!src/graphql/**/__generated__/**",
"!src/locales/**",
"!src/test-utils/**",
"!src/types/v3/**"
],
"coveragePathIgnorePatterns": [
".snap"
],
"coverageThreshold": {
"global": {
@@ -66,6 +72,7 @@
"@lingui/cli": "^3.9.0",
"@testing-library/jest-dom": "^5.16.4",
"@testing-library/react": "^13.1",
"@testing-library/user-event": "^14.4.3",
"@typechain/ethers-v5": "^7.0.0",
"@types/array.prototype.flat": "^1.2.1",
"@types/array.prototype.flatmap": "^1.2.2",
@@ -94,9 +101,13 @@
"@uniswap/eslint-config": "^1.1.1",
"@vanilla-extract/babel-plugin": "^1.1.7",
"@vanilla-extract/webpack-plugin": "^2.1.11",
"cypress": "^10.3.1",
"babel-plugin-istanbul": "^6.1.1",
"cypress": "10.3.1",
"cypress-hardhat": "^1.0.0",
"env-cmd": "^10.1.0",
"eslint": "^7.11.0",
"eslint-plugin-import": "^2.27",
"hardhat": "^2.14.0",
"jest-fetch-mock": "^3.0.3",
"jest-styled-components": "^7.0.8",
"ms.macro": "^2.0.0",
@@ -105,6 +116,7 @@
"prettier": "^2.7.1",
"react-scripts": "^4.0.3",
"serve": "^11.3.2",
"source-map-explorer": "^2.5.3",
"ts-transform-graphql-tag": "^0.2.1",
"typechain": "^5.0.0",
"typescript": "^4.4.3",
@@ -113,6 +125,7 @@
"dependencies": {
"@apollo/client": "^3.7.2",
"@coinbase/wallet-sdk": "^3.6.4",
"@cypress/code-coverage": "^3.10.0",
"@fontsource/ibm-plex-mono": "^4.5.1",
"@fontsource/inter": "^4.5.1",
"@graphql-codegen/cli": "^2.15.0",
@@ -131,11 +144,12 @@
"@reach/dialog": "^0.10.3",
"@reach/portal": "^0.10.3",
"@reduxjs/toolkit": "^1.6.1",
"@sentry/react": "^7.40.0",
"@sentry/tracing": "^7.40.0",
"@sentry/react": "^7.45.0",
"@sentry/tracing": "^7.45.0",
"@sentry/types": "^7.45.0",
"@types/react-window-infinite-loader": "^1.0.6",
"@uniswap/analytics": "^1.3.1",
"@uniswap/analytics-events": "^2.8.0",
"@uniswap/analytics-events": "^2.10.0",
"@uniswap/conedison": "^1.4.0",
"@uniswap/governance": "^1.0.2",
"@uniswap/liquidity-staker": "^1.0.2",
@@ -166,16 +180,16 @@
"@visx/responsive": "^2.10.0",
"@visx/shape": "^2.11.1",
"@walletconnect/ethereum-provider": "^1.8.0",
"@web3-react/coinbase-wallet": "8.1.2-beta.0",
"@web3-react/core": "8.1.2-beta.0",
"@web3-react/eip1193": "8.1.2-beta.0",
"@web3-react/empty": "8.1.2-beta.0",
"@web3-react/gnosis-safe": "8.1.2-beta.0",
"@web3-react/metamask": "8.1.2-beta.0",
"@web3-react/network": "8.1.2-beta.0",
"@web3-react/types": "8.1.2-beta.0",
"@web3-react/url": "8.1.2-beta.0",
"@web3-react/walletconnect": "8.1.2-beta.0",
"@web3-react/coinbase-wallet": "^8.2.0",
"@web3-react/core": "^8.2.0",
"@web3-react/eip1193": "^8.2.0",
"@web3-react/empty": "^8.2.0",
"@web3-react/gnosis-safe": "^8.2.0",
"@web3-react/metamask": "^8.2.0",
"@web3-react/network": "^8.2.0",
"@web3-react/types": "^8.2.0",
"@web3-react/url": "^8.2.0",
"@web3-react/walletconnect": "^8.2.0",
"array.prototype.flat": "^1.2.4",
"array.prototype.flatmap": "^1.2.4",
"cids": "^1.0.0",
@@ -236,6 +250,18 @@
"workbox-routing": "^6.1.0",
"zustand": "^4.3.6"
},
"resolutions": {
"@web3-react/coinbase-wallet": "^8.2.0",
"@web3-react/core": "^8.2.0",
"@web3-react/eip1193": "^8.2.0",
"@web3-react/empty": "^8.2.0",
"@web3-react/gnosis-safe": "^8.2.0",
"@web3-react/metamask": "^8.2.0",
"@web3-react/network": "^8.2.0",
"@web3-react/types": "^8.2.0",
"@web3-react/url": "^8.2.0",
"@web3-react/walletconnect": "^8.2.0"
},
"engines": {
"npm": "please-use-yarn",
"node": "14",

View File

@@ -18,9 +18,19 @@
<meta name="theme-color" content="#FC72FF" />
<meta
http-equiv="Content-Security-Policy"
content="script-src 'self' https://www.google-analytics.com https://www.googletagmanager.com 'unsafe-inline'"
<% if (process.env.REACT_APP_CSP_ALLOW_UNSAFE_EVAL) { %>
content="script-src 'self' https://www.google-analytics.com https://www.googletagmanager.com 'unsafe-inline' 'unsafe-eval'"
<% } else { %>
content="script-src 'self' https://www.google-analytics.com https://www.googletagmanager.com 'unsafe-inline'"
<% } %>
/>
<!--
Apple Smart App Banner for Safari on iOS
https://developer.apple.com/documentation/webkit/promoting_apps_with_smart_app_banners
-->
<meta name="apple-itunes-app" content="app-id=6443944476">
<!--
manifest.json provides metadata used when the app is installed as a PWA.
See https://developers.google.com/web/fundamentals/web-app-manifest/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 245 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.0 KiB

View File

@@ -1,3 +0,0 @@
<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.74219 20.29C6.74219 22.1885 7.71777 23.1729 9.59863 23.1729H18.959C20.8398 23.1729 21.8154 22.1885 21.8154 20.29V7.02734C21.8154 5.1377 20.8398 4.14453 18.959 4.14453H9.59863C7.71777 4.14453 6.74219 5.1377 6.74219 7.02734V20.29ZM8.46484 20.1846V7.13281C8.46484 6.31543 8.88672 5.86719 9.73926 5.86719H18.8096C19.6621 5.86719 20.0928 6.31543 20.0928 7.13281V20.1846C20.0928 21.002 19.6621 21.4502 18.8096 21.4502H9.73926C8.88672 21.4502 8.46484 21.002 8.46484 20.1846ZM10.5391 9.16309C10.9961 9.16309 11.3564 8.79395 11.3564 8.3457C11.3564 7.88867 10.9961 7.52832 10.5391 7.52832C10.0908 7.52832 9.72168 7.89746 9.72168 8.3457C9.72168 8.79395 10.0908 9.16309 10.5391 9.16309ZM12.9561 8.91699H18.2646C18.5811 8.91699 18.8359 8.66211 18.8359 8.3457C18.8359 8.0293 18.5811 7.77441 18.2646 7.77441H12.9561C12.6396 7.77441 12.3848 8.0293 12.3848 8.3457C12.3848 8.66211 12.6396 8.91699 12.9561 8.91699ZM10.5391 11.7822C10.9961 11.7822 11.3564 11.4131 11.3564 10.9648C11.3564 10.5078 10.9961 10.1562 10.5391 10.1562C10.082 10.1562 9.72168 10.5166 9.72168 10.9648C9.72168 11.4131 10.082 11.7822 10.5391 11.7822ZM12.9561 11.5361H18.2646C18.5898 11.5361 18.8359 11.2812 18.8359 10.9648C18.8359 10.6484 18.5898 10.4023 18.2646 10.4023H12.9561C12.6309 10.4023 12.3848 10.6484 12.3848 10.9648C12.3848 11.2812 12.6309 11.5361 12.9561 11.5361ZM10.5391 14.5332C10.9961 14.5332 11.3564 14.1641 11.3564 13.7158C11.3564 13.2588 10.9961 12.8896 10.5391 12.8896C10.0908 12.8896 9.72168 13.2676 9.72168 13.7158C9.72168 14.1553 10.0908 14.5332 10.5391 14.5332ZM12.9561 14.2871H18.2646C18.5811 14.2871 18.8359 14.0234 18.8359 13.7158C18.8359 13.3994 18.5898 13.1445 18.2646 13.1445H12.9561C12.6309 13.1445 12.3848 13.3994 12.3848 13.7158C12.3848 14.0234 12.6396 14.2871 12.9561 14.2871Z" fill="#0A0A3B"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 86 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

View File

@@ -1,4 +0,0 @@
<svg width="30" height="30" viewBox="0 0 30 30" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9.57471 23.4444H20.6489C22.4664 23.4444 23.5211 22.3897 23.5211 20.3745V10.6281C23.5211 8.61286 22.457 7.55818 20.4229 7.55818H19.0951C19.0481 5.4488 17.2494 3.69727 14.9988 3.69727C12.7576 3.69727 10.9496 5.4488 10.9025 7.55818H9.57471C7.54067 7.55818 6.47656 8.61286 6.47656 10.6281V20.3745C6.47656 22.3897 7.54067 23.4444 9.57471 23.4444ZM14.9988 5.36405C16.2889 5.36405 17.24 6.33398 17.2777 7.55818H12.7199C12.7576 6.33398 13.7087 5.36405 14.9988 5.36405Z" fill="#4673FA"/>
<path d="M14.4407 20.3577C14.057 20.3577 13.744 20.1936 13.4613 19.814L10.9875 16.757C10.8057 16.5313 10.7148 16.2851 10.7148 16.0287C10.7148 15.5055 11.1187 15.0746 11.6438 15.0746C11.9568 15.0746 12.1991 15.1977 12.4516 15.526L14.4003 18.0393L18.5806 11.2483C18.7926 10.8995 19.0854 10.7148 19.3985 10.7148C19.9033 10.7148 20.3577 11.0739 20.3577 11.6073C20.3577 11.8433 20.2466 12.0997 20.0952 12.3357L15.3697 19.814C15.1475 20.173 14.8143 20.3577 14.4407 20.3577Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" fill="none" viewBox="0 0 24 24">
<path fill="#4673FA" d="M11.783 18.094c-.315.489-.78.763-1.32.763-.554 0-.988-.229-1.393-.763l-3.537-4.393c-.255-.32-.39-.656-.39-1.022 0-.763.57-1.358 1.304-1.358.45 0 .81.168 1.17.64l2.787 3.616 5.92-9.671c.315-.519.72-.763 1.17-.763.704 0 1.363.503 1.363 1.25 0 .352-.18.718-.374 1.038l-6.7 10.663z"/>
</svg>

Before

Width:  |  Height:  |  Size: 410 B

View File

@@ -1,3 +0,0 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M12.7783 21.1514C12.9805 21.3447 13.2266 21.4502 13.5078 21.4502C14.0967 21.4502 14.5537 20.9932 14.5537 20.4131C14.5537 20.123 14.4395 19.8594 14.2373 19.6572L8.08496 13.6455L14.2373 7.65137C14.4395 7.44922 14.5537 7.17676 14.5537 6.89551C14.5537 6.31543 14.0967 5.8584 13.5078 5.8584C13.2266 5.8584 12.9805 5.96387 12.7871 6.15723L5.94922 12.8369C5.70312 13.0654 5.58008 13.3467 5.58008 13.6543C5.58008 13.9619 5.70312 14.2256 5.94043 14.4629L12.7783 21.1514ZM20.6357 21.1514C20.8379 21.3447 21.0752 21.4502 21.3652 21.4502C21.9541 21.4502 22.4111 20.9932 22.4111 20.4131C22.4111 20.123 22.2881 19.8594 22.0947 19.6572L15.9336 13.6455L22.0947 7.65137C22.2969 7.44922 22.4111 7.17676 22.4111 6.89551C22.4111 6.31543 21.9541 5.8584 21.3652 5.8584C21.0752 5.8584 20.8379 5.96387 20.6357 6.15723L13.7979 12.8369C13.5605 13.0654 13.4375 13.3467 13.4287 13.6543C13.4287 13.9619 13.5518 14.2256 13.7979 14.4629L20.6357 21.1514Z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -1,10 +0,0 @@
<svg width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_564_11230)">
<path d="M7.2207 16.0615L13.9092 9.22363C14.1377 8.97754 14.4102 8.86328 14.7178 8.86328C15.0254 8.86328 15.3066 8.98633 15.5352 9.22363L22.2148 16.0615C22.4082 16.2549 22.5137 16.501 22.5137 16.791C22.5137 17.3799 22.0566 17.8369 21.4766 17.8369C21.1953 17.8369 20.9229 17.7314 20.7207 17.5205L14.7266 11.3594L8.71484 17.5205C8.52148 17.7227 8.24902 17.8369 7.95898 17.8369C7.37891 17.8369 6.92188 17.3799 6.92188 16.791C6.92188 16.5098 7.02734 16.2549 7.2207 16.0615Z" fill="currentColor"/>
</g>
<defs>
<clipPath id="clip0_564_11230">
<rect width="28" height="28" fill="white" transform="translate(0.716797)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 774 B

View File

@@ -1,3 +0,0 @@
<svg width="33" height="32" viewBox="0 0 33 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5.12898 13.5458C4.33545 13.5458 4.13456 14.1484 4.56648 14.7411L7.02741 18.1362C7.35889 18.6083 7.89125 18.5982 8.21268 18.1362L10.6736 14.731C11.0854 14.1585 10.8946 13.5458 10.1111 13.5458H8.66469C9.56871 9.93973 12.8131 7.29799 16.7205 7.29799C19.4024 7.30804 21.7529 8.55357 23.2596 10.5324C23.6714 11.0045 24.2741 11.1551 24.7663 10.7935C25.2283 10.4621 25.3187 9.80915 24.8667 9.26674C23.0185 6.84598 19.9649 5.21875 16.7205 5.21875C11.7283 5.21875 7.49951 8.82478 6.53523 13.5458H5.12898ZM16.3488 9.78906C15.8567 9.78906 15.4649 10.1808 15.4649 10.6629V16.1071C15.4649 16.3482 15.5453 16.5692 15.716 16.8002L18.1167 19.9542C18.4683 20.4263 18.9906 20.5067 19.4225 20.1953C19.8343 19.904 19.8745 19.3717 19.5531 18.9397L17.2227 15.8058V10.6629C17.2227 10.1808 16.831 9.78906 16.3488 9.78906ZM16.7205 25.9911C21.7127 25.9911 25.9415 22.385 26.9058 17.6641H28.312C29.1055 17.6641 29.3064 17.0614 28.8745 16.4688L26.4236 13.0737C26.0821 12.6116 25.5497 12.6116 25.2283 13.0737L22.7674 16.4788C22.3555 17.0614 22.5464 17.6641 23.3299 17.6641H24.7863C23.8723 21.2701 20.6279 23.9219 16.7205 23.9219C14.0386 23.9118 11.6881 22.6563 10.1814 20.6775C9.7696 20.2054 9.17697 20.0547 8.67473 20.4163C8.21268 20.7478 8.12228 21.4007 8.57429 21.9531C10.4225 24.3638 13.4761 25.9911 16.7205 25.9911Z" fill="#4673FA"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.4 KiB

View File

@@ -1,20 +0,0 @@
<svg fill="none" xmlns="http://www.w3.org/2000/svg" viewBox="13.75 11.75 46.5 46.5">
<g filter="url(#filter0_d_12_3296)">
<circle cx="37" cy="35" r="21" fill="#EEEEEE" shape-rendering="crispEdges"/>
<circle cx="37" cy="35" r="21.75" stroke="black" stroke-opacity="0.1" stroke-width="1.5" shape-rendering="crispEdges"/>
</g>
<path d="M30 28L44.5 42.5" stroke="#A6A6A6" stroke-width="3" stroke-linecap="round"/>
<path d="M44.5 28L30 42.5" stroke="#A6A6A6" stroke-width="3" stroke-linecap="round"/>
<defs>
<filter id="filter0_d_12_3296" x="0.5" y="0.5" width="73" height="73" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="2"/>
<feGaussianBlur stdDeviation="7"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.05 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_12_3296"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_12_3296" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,3 +0,0 @@
<svg width="14" height="8" viewBox="0 0 14 8" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M0.880867 0.48089C1.12465 0.237177 1.45525 0.100267 1.79997 0.100267C2.14468 0.100267 2.47528 0.237177 2.71907 0.48089L6.99997 4.76179L11.2809 0.48089C11.4008 0.356727 11.5442 0.25769 11.7028 0.189558C11.8614 0.121426 12.032 0.0855639 12.2046 0.084064C12.3773 0.082564 12.5484 0.115456 12.7082 0.180821C12.868 0.246186 13.0131 0.342715 13.1352 0.464776C13.2572 0.586836 13.3538 0.731984 13.4191 0.891749C13.4845 1.05151 13.5174 1.2227 13.5159 1.39531C13.5144 1.56792 13.4785 1.73851 13.4104 1.89712C13.3423 2.05572 13.2432 2.19917 13.1191 2.31909L7.91907 7.51909C7.67528 7.7628 7.34468 7.89971 6.99997 7.89971C6.65525 7.89971 6.32465 7.7628 6.08087 7.51909L0.880867 2.31909C0.637154 2.0753 0.500244 1.7447 0.500244 1.39999C0.500244 1.05528 0.637154 0.724676 0.880867 0.48089Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 942 B

View File

@@ -1,10 +0,0 @@
<svg width="15" height="24" viewBox="0 0 15 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.5">
<path d="M7.49805 0V8.87184L14.995 12.2225L7.49805 0Z" fill="black" fill-opacity="0.602"/>
<path d="M7.49797 0L0 12.2225L7.49797 8.87184V0Z" fill="black"/>
<path d="M7.49805 17.9718V24L15 13.6189L7.49805 17.9718Z" fill="black" fill-opacity="0.602"/>
<path d="M7.49797 24V17.9708L0 13.6189L7.49797 24Z" fill="black"/>
<path d="M7.49805 16.5766L14.995 12.2227L7.49805 8.87402V16.5766Z" fill="black" fill-opacity="0.2"/>
<path d="M0 12.2227L7.49797 16.5766V8.87402L0 12.2227Z" fill="black" fill-opacity="0.602"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 636 B

View File

@@ -1,4 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.85742 7.95904L8.00028 2.57129L11.1431 7.95904L8.00028 9.75496L4.85742 7.95904Z" fill="currentColor"/>
<path d="M4.85742 8.85742L8.00028 10.6533L11.1431 8.85742L8.00028 13.3472L4.85742 8.85742Z" fill="currentColor"/>
</svg>

Before

Width:  |  Height:  |  Size: 331 B

View File

@@ -1,4 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.85742 7.95904L8.00028 2.57129L11.1431 7.95904L8.00028 9.75496L4.85742 7.95904Z" fill="white"/>
<path d="M4.85742 8.85742L8.00028 10.6533L11.1431 8.85742L8.00028 13.3472L4.85742 8.85742Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 317 B

View File

@@ -1,4 +0,0 @@
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.85742 7.95904L8.00028 2.57129L11.1431 7.95904L8.00028 9.75496L4.85742 7.95904Z" fill="black"/>
<path d="M4.85742 8.85742L8.00028 10.6533L11.1431 8.85742L8.00028 13.3472L4.85742 8.85742Z" fill="black"/>
</svg>

Before

Width:  |  Height:  |  Size: 317 B

View File

@@ -1,8 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10.418 5.06609C10.4704 5.37012 10.5351 5.67294 10.6121 5.97456C10.6213 6.01097 10.6308 6.0473 10.6406 6.08354C10.6907 6.27249 10.7457 6.45997 10.8056 6.64599C10.813 6.66892 10.8213 6.69185 10.8313 6.71453C10.8599 6.78424 10.897 6.85018 10.9416 6.91085C10.9442 6.91446 10.9468 6.91807 10.9496 6.92142C11.0188 7.01331 11.1044 7.09143 11.2022 7.15176L11.2047 7.1533L11.2204 7.16232L11.2307 7.16824L11.7594 7.47485L11.7635 7.47716L11.7758 7.48438L11.7802 7.4867L11.7997 7.49803L11.8061 7.50164L11.8197 7.50808C11.8323 7.51478 11.8454 7.52097 11.8582 7.52689L11.887 7.53926C11.899 7.54415 11.9114 7.54905 11.9234 7.55343C11.9355 7.55781 11.9455 7.56116 11.9565 7.56477L11.9878 7.5743L12.0258 7.58409L12.0618 7.59208L12.0777 7.59543C12.1906 7.61595 12.3064 7.61508 12.4191 7.59285C12.6152 7.55094 12.8094 7.50396 13.0017 7.45192C13.0379 7.44238 13.0741 7.43233 13.11 7.42229C13.5952 7.28706 14.071 7.11965 14.5341 6.92116C14.6408 6.87564 14.7466 6.82841 14.8513 6.77945C15.1314 6.64925 15.4052 6.50823 15.6727 6.35639C15.4639 6.0239 15.2266 5.71035 14.9635 5.41933L14.9581 5.41314L14.9532 5.40773L14.9512 5.40541L14.9478 5.40181L14.9373 5.39021L14.9358 5.38867L14.9334 5.38609C14.9077 5.35861 14.8803 5.3328 14.8513 5.30879C14.7435 5.21963 14.617 5.15611 14.4812 5.123C14.3454 5.08989 14.204 5.08805 14.0674 5.11762L14.0605 5.11942C14.0428 5.12329 14.0253 5.12767 14.0076 5.13282L13.9968 5.13617C13.9812 5.14107 13.9655 5.14596 13.9499 5.15163L13.8698 5.18693L13.8392 5.20032C13.5675 5.31798 13.2895 5.42328 13.0053 5.5162C12.8224 5.57598 12.637 5.63034 12.4491 5.67929C12.3962 5.49379 12.3499 5.30656 12.3102 5.11762C12.3102 5.11427 12.3089 5.11118 12.3082 5.10783C12.3054 5.09443 12.3025 5.08206 12.3 5.06738C12.2433 4.79255 12.1987 4.51601 12.1662 4.23775C12.1614 4.19653 12.1567 4.1553 12.1526 4.11382C12.1388 4.0336 12.1143 3.95561 12.0797 3.88194C12.0205 3.75564 11.9337 3.64435 11.8258 3.55631C11.7178 3.46827 11.5915 3.40573 11.4563 3.37334C11.398 3.36046 11.3397 3.34757 11.281 3.33701C10.9415 3.27093 10.5975 3.23139 10.252 3.21875C10.2557 3.60683 10.2789 3.99447 10.3213 4.38023C10.3468 4.60833 10.379 4.83695 10.418 5.06609Z" fill="#30B465"/>
<path d="M9.74715 3.2151C9.34195 3.22987 8.93894 3.28162 8.54308 3.36969C8.36795 3.41102 8.2087 3.50292 8.085 3.63405C7.96129 3.76518 7.87855 3.9298 7.84698 4.1076C7.8439 4.13748 7.84056 4.16711 7.83723 4.19674C7.83594 4.20937 7.83466 4.22251 7.83312 4.23436C7.8285 4.27533 7.82285 4.31629 7.81746 4.35726C7.78666 4.59344 7.74731 4.8291 7.69939 5.06425C7.6958 5.08099 7.69246 5.09774 7.68887 5.11449C7.64883 5.30343 7.60305 5.49168 7.55155 5.67925C7.36332 5.63047 7.17791 5.57611 6.99533 5.51616L6.95786 5.50354C6.76501 5.43964 6.57499 5.36999 6.38778 5.29458L6.36622 5.28608C6.33825 5.27474 6.31078 5.26289 6.28306 5.2513C6.24174 5.23404 6.20041 5.21729 6.1596 5.19977C6.12315 5.18397 6.08688 5.16799 6.05077 5.15185C6.03948 5.14772 6.02818 5.14437 6.01689 5.14077L5.99276 5.13278C5.97916 5.12892 5.96555 5.12582 5.95221 5.12247L5.93296 5.11784C5.91627 5.11397 5.89959 5.11114 5.8829 5.10856L5.87315 5.10676C5.74517 5.08773 5.61464 5.09582 5.48998 5.13053C5.36531 5.16523 5.24926 5.22577 5.14933 5.30824C5.12035 5.33224 5.09292 5.35806 5.06719 5.38553L5.06386 5.38914L5.05821 5.39532L5.04794 5.40666L5.03767 5.41826C4.77372 5.70935 4.53564 6.02308 4.32617 6.35584C4.59346 6.50768 4.86724 6.6487 5.14753 6.7789C5.25225 6.82785 5.358 6.87509 5.46478 6.9206C5.92737 7.11929 6.40258 7.28696 6.88727 7.4225C6.92321 7.43255 6.9594 7.4426 6.99559 7.45213L7.04487 7.46502C7.22061 7.51191 7.39831 7.55485 7.57799 7.59384C7.69062 7.61607 7.80641 7.61695 7.91936 7.59642C7.92809 7.59487 7.93682 7.59255 7.94503 7.59075L7.96608 7.58611C7.98225 7.5825 7.99791 7.57812 8.01382 7.57374L8.03949 7.56601L8.07516 7.5539L8.11059 7.53999L8.13831 7.52814C8.15242 7.5217 8.16654 7.51474 8.1804 7.50779L8.19093 7.50263L8.19632 7.4998L8.21018 7.49181H8.21146L8.21377 7.49052L8.23764 7.47661L8.75099 7.1798L8.79334 7.15532L8.79591 7.15378C8.89417 7.09278 8.98005 7.01366 9.04899 6.9206C9.05181 6.91725 9.05438 6.91365 9.05695 6.91004C9.11592 6.82962 9.16159 6.74019 9.19221 6.64518C9.20299 6.61168 9.21326 6.57819 9.22378 6.54469C9.27153 6.39131 9.31602 6.23732 9.35726 6.08273C9.36701 6.04632 9.37651 6.00999 9.38575 5.97375C9.46292 5.6723 9.5276 5.36947 9.57979 5.06528C9.61898 4.83631 9.65132 4.60666 9.67682 4.37632C9.7192 3.99057 9.74233 3.60292 9.74612 3.21484L9.74715 3.2151Z" fill="#30B465"/>
<path d="M5.57074 12.0222C5.81355 11.8202 6.04866 11.6074 6.27608 11.3838C6.30303 11.358 6.32947 11.3322 6.35616 11.3047C6.40596 11.2549 6.45472 11.2039 6.50349 11.1532C6.52762 11.1274 6.55175 11.1032 6.57562 11.0779C6.6344 11.0156 6.69292 10.9527 6.75041 10.8891C6.90195 10.7247 6.98935 10.511 6.99656 10.2872V10.2246C6.99656 10.2055 6.99451 10.1862 6.99246 10.1671H6.99656V9.70337H6.99271C6.99477 9.68327 6.99605 9.66292 6.99656 9.64256V9.57995C6.98858 9.36819 6.90901 9.16546 6.77095 9.00514C6.7635 8.99664 6.7558 8.98839 6.7481 8.97937L6.73014 8.96005C6.67298 8.89684 6.61515 8.8344 6.55662 8.77274L6.54713 8.76269C6.48398 8.69622 6.42007 8.63052 6.35539 8.56559C6.32972 8.53983 6.30226 8.51277 6.27531 8.48649C6.04824 8.2632 5.81312 8.05038 5.56997 7.84804C5.4317 7.73278 5.29096 7.62114 5.14774 7.5131C4.8683 7.30182 4.58048 7.10429 4.28428 6.9205C4.21481 6.87722 4.14482 6.83471 4.07432 6.79297C4.05191 6.83522 4.03009 6.87773 4.00887 6.9205C3.85905 7.21965 3.73189 7.52971 3.62848 7.84804H3.63412C3.59393 7.95218 3.57297 8.0628 3.57227 8.17448C3.57227 8.18221 3.57227 8.1902 3.57227 8.19793C3.57227 8.2005 3.57227 8.20308 3.57227 8.20566C3.57741 8.44434 3.67425 8.6718 3.84254 8.8405L3.85743 8.85416C3.87001 8.86627 3.8831 8.87838 3.89593 8.88997C3.91621 8.90466 3.93649 8.91986 3.95676 8.9348C3.97114 8.94537 3.98551 8.95567 3.99963 8.96649C4.17708 9.09927 4.35025 9.23831 4.51914 9.38363C4.57527 9.43241 4.63113 9.48179 4.68675 9.53177L4.72859 9.56991C4.76127 9.59979 4.79378 9.62994 4.82612 9.66034L4.87027 9.70182C4.94984 9.77757 5.0283 9.85486 5.10564 9.93371C5.0283 10.0125 4.94984 10.0898 4.87027 10.1656C4.8097 10.2233 4.74852 10.28 4.68675 10.3356C4.46549 10.5356 4.23645 10.724 3.99963 10.9009L3.9465 10.9403C3.92956 10.9527 3.91287 10.9661 3.89516 10.9774C3.79706 11.0615 3.71762 11.1653 3.662 11.2821C3.60638 11.3989 3.57581 11.5261 3.57227 11.6556C3.57227 11.6602 3.57227 11.6646 3.57227 11.6692C3.57227 11.6739 3.57227 11.6829 3.57227 11.6896C3.57232 11.8033 3.59329 11.9161 3.63412 12.0222H3.63053C3.73394 12.3405 3.8611 12.6506 4.01092 12.9497C4.03231 12.9925 4.05413 13.0355 4.07637 13.0786C4.1467 13.0368 4.21669 12.9939 4.28634 12.9497C4.58202 12.7661 4.86984 12.5686 5.14979 12.3571C5.29199 12.2493 5.4323 12.1376 5.57074 12.0222Z" fill="#30B465"/>
<path d="M16.4283 11.6721C16.4283 11.6695 16.4283 11.6669 16.4283 11.6643C16.4232 11.4256 16.3263 11.1982 16.158 11.0295C16.1534 11.0248 16.148 11.0205 16.1434 11.0158C16.1306 11.0037 16.1177 10.9916 16.1046 10.98L16.0438 10.9352L16.0009 10.9035C15.8235 10.7707 15.6503 10.6317 15.4814 10.4864C15.4253 10.4376 15.3694 10.3882 15.3138 10.3382L15.2715 10.2996C15.2391 10.2699 15.207 10.2403 15.1752 10.2102L15.1282 10.1669C15.0487 10.0911 14.9702 10.0138 14.8929 9.93499C14.9701 9.85615 15.0485 9.77886 15.1282 9.70311C15.1888 9.6454 15.25 9.58871 15.3118 9.53306C15.533 9.33313 15.7621 9.1447 15.9989 8.96778L16.052 8.92836C16.069 8.91599 16.0856 8.9026 16.1034 8.89126C16.2015 8.80719 16.2809 8.7034 16.3366 8.58659C16.3922 8.46978 16.4229 8.34256 16.4265 8.21313C16.4265 8.20849 16.4265 8.20411 16.4265 8.19947C16.4265 8.19484 16.4265 8.18582 16.4265 8.17912C16.4266 8.06595 16.406 7.95373 16.3657 7.84804H16.3693C16.2659 7.52971 16.1387 7.21966 15.9889 6.92051C15.9675 6.87774 15.9457 6.83522 15.9234 6.79297C15.8531 6.83471 15.7831 6.87722 15.7135 6.92051C15.4178 7.10429 15.13 7.30182 14.85 7.5131C14.707 7.62097 14.5662 7.73261 14.4278 7.84804C14.185 8.05004 13.9499 8.26285 13.7224 8.48649C13.6955 8.51226 13.6691 8.53802 13.6424 8.56559C13.591 8.61712 13.5417 8.66865 13.4917 8.72018C13.4691 8.74388 13.4463 8.76733 13.4239 8.79103C13.3649 8.85356 13.3063 8.91685 13.2481 8.98092C13.0965 9.14533 13.0091 9.35913 13.002 9.58305V9.64565C13.002 9.66472 13.004 9.68404 13.0061 9.70311H13.002V10.1669H13.0058C13.0038 10.187 13.0025 10.2073 13.002 10.2277V10.2903C13.0101 10.502 13.0896 10.7047 13.2276 10.8651C13.235 10.8736 13.2427 10.8819 13.2504 10.8909L13.2684 10.9102C13.3257 10.9734 13.3835 11.0358 13.4419 11.0975L13.4514 11.1076C13.5148 11.174 13.5784 11.2397 13.6431 11.3047C13.6688 11.3304 13.6963 11.3575 13.7232 11.3838C13.9503 11.607 14.1854 11.8199 14.4286 12.0222C14.567 12.1375 14.7077 12.2491 14.8508 12.3571C15.1304 12.5684 15.4182 12.766 15.7142 12.9497C15.7839 12.993 15.8539 13.036 15.9242 13.0786C15.9464 13.0363 15.9683 12.9934 15.9896 12.9497C16.1395 12.6506 16.2666 12.3405 16.37 12.0222H16.3664C16.4067 11.9181 16.4278 11.8075 16.4286 11.6958C16.4278 11.687 16.4283 11.6798 16.4283 11.6721Z" fill="#30B465"/>
<path d="M9.58082 14.8058C9.52846 14.5018 9.46377 14.199 9.38677 13.8974C9.37753 13.8609 9.36803 13.8246 9.35828 13.7884C9.30814 13.5994 9.25313 13.4119 9.19324 13.2259C9.18579 13.203 9.17758 13.1801 9.16757 13.1574C9.13871 13.0877 9.10156 13.0218 9.05694 12.9611C9.05438 12.9575 9.05181 12.9538 9.04899 12.9505C8.97982 12.8586 8.89416 12.7805 8.79642 12.7202L8.79385 12.7186L8.7782 12.7096L8.76793 12.7037L8.23918 12.3971L8.23507 12.3948L8.22275 12.3875L8.21864 12.3852L8.19888 12.3739L8.19246 12.3703L8.17912 12.3638C8.16628 12.3571 8.15345 12.351 8.14036 12.345L8.11161 12.3327C8.09955 12.3278 8.08748 12.3229 8.07516 12.3185L8.04205 12.3072L8.01074 12.2976L7.97301 12.2878L7.93682 12.2798L7.9209 12.2765C7.80795 12.256 7.69216 12.2568 7.57952 12.2791C7.38342 12.321 7.18921 12.368 6.99687 12.42C6.96068 12.4295 6.92449 12.4396 6.88856 12.4496C6.40344 12.5849 5.9278 12.7523 5.46478 12.9508C5.358 12.9963 5.25225 13.0435 5.14753 13.0925C4.86741 13.2225 4.59363 13.3635 4.32617 13.5155C4.53493 13.848 4.77223 14.1616 5.03536 14.4526L5.04101 14.4588L5.04563 14.4642L5.04768 14.4665L5.05102 14.4701L5.06154 14.4817L5.06309 14.4832L5.0654 14.4858C5.09112 14.5133 5.11856 14.5391 5.14753 14.5631C5.25539 14.6523 5.38197 14.7158 5.51777 14.7489C5.65357 14.7821 5.79507 14.7839 5.93167 14.7543L5.93835 14.7525C5.95606 14.7486 5.97377 14.7442 5.99122 14.7391L6.002 14.7357C6.01766 14.7309 6.03332 14.726 6.04897 14.7203L6.12906 14.685L6.1596 14.6716C6.4315 14.5538 6.70948 14.4485 6.99354 14.3557C7.17646 14.2959 7.36186 14.2416 7.54975 14.1926C7.60108 14.3802 7.64686 14.5684 7.68707 14.7574C7.68707 14.7607 7.68835 14.7638 7.68912 14.7672C7.69195 14.7806 7.69477 14.7942 7.69734 14.8076C7.75398 15.0833 7.79855 15.3599 7.83107 15.6373C7.83594 15.6785 7.84056 15.7197 7.84467 15.7612C7.85853 15.8414 7.88305 15.9194 7.91757 15.9931C7.97682 16.1194 8.06362 16.2307 8.17155 16.3187C8.27947 16.4067 8.40575 16.4693 8.54103 16.5017V16.503C8.59929 16.5158 8.65781 16.5287 8.71634 16.5393C9.05578 16.6053 9.39981 16.6449 9.74535 16.6575C9.74156 16.2695 9.71843 15.8818 9.67604 15.4961C9.65157 15.265 9.61983 15.035 9.58082 14.8058Z" fill="#30B465"/>
<path d="M14.5333 12.9504C14.0707 12.7517 13.5955 12.584 13.1108 12.4485C13.0749 12.4384 13.0387 12.4284 13.0025 12.4188L12.9532 12.4059C12.7773 12.359 12.5996 12.3161 12.4201 12.2771C12.3074 12.2549 12.1917 12.254 12.0787 12.2745C12.07 12.2761 12.0613 12.2784 12.053 12.2802L12.032 12.2848C12.0161 12.2885 12.0002 12.2928 11.9843 12.2972L11.9586 12.3049L11.9229 12.3171C11.9111 12.3214 11.8993 12.3261 11.8877 12.331L11.8598 12.3428C11.8456 12.3493 11.8315 12.3562 11.8177 12.3632L11.8071 12.3683L11.8018 12.3712L11.7879 12.3791H11.7866L11.7843 12.3804L11.7604 12.3943L11.2473 12.6927L11.205 12.7185L11.2024 12.72C11.1043 12.7801 11.0184 12.8583 10.9491 12.9504C10.9463 12.9537 10.9437 12.9573 10.9411 12.9609C10.8822 13.0413 10.8365 13.1308 10.8059 13.2258C10.7951 13.2593 10.7848 13.2928 10.7743 13.3263C10.7265 13.4795 10.6821 13.6335 10.6408 13.7882C10.6311 13.8246 10.6216 13.861 10.6123 13.8972C10.5352 14.1987 10.4705 14.5015 10.4183 14.8057C10.3791 15.0348 10.3468 15.2645 10.3213 15.4946C10.2789 15.8804 10.2557 16.268 10.252 16.6561C10.6571 16.6413 11.0602 16.5896 11.456 16.5015V16.5002C11.6312 16.4589 11.7904 16.367 11.9141 16.2359C12.0378 16.1047 12.1205 15.9401 12.1521 15.7623C12.1552 15.7324 12.1585 15.7028 12.1619 15.6732C12.1632 15.6606 12.1644 15.6474 12.166 15.6356C12.1709 15.5946 12.1762 15.5536 12.1816 15.5127C12.2124 15.2763 12.2518 15.0407 12.2997 14.8057C12.3033 14.7889 12.3066 14.7722 12.3102 14.7541C12.3503 14.5652 12.396 14.377 12.4475 14.1894C12.6358 14.238 12.8212 14.2924 13.0038 14.3525L13.0412 14.3651C13.2339 14.429 13.4239 14.4986 13.6113 14.5741L13.6331 14.5826L13.7163 14.6173C13.7574 14.6346 13.7987 14.6513 13.8395 14.6689C13.8759 14.6845 13.9122 14.7005 13.9483 14.7168H13.9496C13.9609 14.7209 13.9722 14.7243 13.9835 14.7279L14.0079 14.7359C14.0212 14.7397 14.0348 14.7428 14.0482 14.7462L14.0674 14.7508C14.0841 14.7547 14.1008 14.7575 14.1188 14.7601L14.1283 14.7619C14.2562 14.7809 14.3868 14.7728 14.5114 14.7381C14.6361 14.7034 14.7521 14.6429 14.8521 14.5604C14.8811 14.5364 14.9085 14.5106 14.9342 14.4831L14.9376 14.4795L14.9432 14.4733L14.9535 14.462L14.9637 14.4504C15.2264 14.1599 15.4634 13.8469 15.6719 13.5151C15.4046 13.3634 15.1308 13.2224 14.8505 13.0921C14.7458 13.0431 14.6401 12.9959 14.5333 12.9504Z" fill="#30B465"/>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,3 +0,0 @@
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.91211 12.6289H10.5146C11.877 12.6289 12.5801 11.9258 12.5801 10.5823V2.9421C12.5801 1.59863 11.877 0.895508 10.5146 0.895508H2.91211C1.55608 0.895508 0.84668 1.59235 0.84668 2.9421V10.5823C0.84668 11.9258 1.55608 12.6289 2.91211 12.6289ZM8.76939 8.46666C8.43666 8.46666 8.22321 8.24065 8.22321 7.87653V6.84696L8.31111 5.91155L7.44475 6.86579L5.18471 9.12584C5.05915 9.2514 4.90848 9.31417 4.72642 9.31417C4.39369 9.31417 4.14886 9.08189 4.14886 8.73033C4.14886 8.57338 4.21791 8.41643 4.33719 8.30343L6.60979 6.03083L7.57031 5.1582L6.68513 5.25865H5.59277C5.23493 5.25865 4.99637 5.0452 4.99637 4.71247C4.99637 4.37974 5.22866 4.16629 5.5865 4.16629H8.63756C9.0519 4.16629 9.30929 4.37974 9.30929 4.83803V7.86398C9.30929 8.22182 9.09584 8.46666 8.76939 8.46666Z" fill="#30B465"/>
</svg>

Before

Width:  |  Height:  |  Size: 895 B

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="52" height="52" fill="none" viewBox="0 0 52 52">
<path fill="#70757A" d="M12.949 18.023h26.085c.882 0 1.591-.776 1.591-1.7 0-.96-.71-1.698-1.591-1.698H12.949c-.882 0-1.574.757-1.574 1.699 0 .923.692 1.699 1.574 1.699zm0 9.676h26.085c.882 0 1.591-.776 1.591-1.699 0-.96-.71-1.699-1.591-1.699H12.949c-.882 0-1.574.757-1.574 1.699 0 .923.692 1.699 1.574 1.699zm0 9.676h26.085c.882 0 1.591-.776 1.591-1.699 0-.942-.71-1.699-1.591-1.699H12.949c-.882 0-1.574.757-1.574 1.7 0 .922.692 1.698 1.574 1.698z"/>
</svg>

Before

Width:  |  Height:  |  Size: 556 B

View File

@@ -1,5 +0,0 @@
<svg width="26" height="26" viewBox="0 0 26 26" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M13 3C10.5597 3 8.3102 3.20126 6.50463 3.43972C4.87965 3.65433 3.65433 4.87965 3.43972 6.50463C3.20126 8.3102 3 10.5597 3 13C3 15.4403 3.20126 17.6898 3.43972 19.4954C3.65433 21.1203 4.87965 22.3457 6.50463 22.5603C8.3102 22.7987 10.5597 23 13 23C15.4403 23 17.6898 22.7987 19.4954 22.5603C21.1203 22.3457 22.3457 21.1203 22.5603 19.4954C22.7987 17.6898 23 15.4403 23 13C23 10.5597 22.7987 8.3102 22.5603 6.50463C22.3457 4.87965 21.1203 3.65433 19.4954 3.43972C17.6898 3.20126 15.4403 3 13 3ZM6.1773 0.961241C3.4313 1.32391 1.32391 3.4313 0.961241 6.1773C0.711918 8.0651 0.5 10.4266 0.5 13C0.5 15.5734 0.711918 17.9349 0.961241 19.8227C1.32391 22.5687 3.4313 24.6761 6.1773 25.0388C8.0651 25.2881 10.4266 25.5 13 25.5C15.5734 25.5 17.9349 25.2881 19.8227 25.0388C22.5687 24.6761 24.6761 22.5687 25.0388 19.8227C25.2881 17.9349 25.5 15.5734 25.5 13C25.5 10.4266 25.2881 8.0651 25.0388 6.1773C24.6761 3.4313 22.5687 1.32391 19.8227 0.961241C17.9349 0.711918 15.5734 0.5 13 0.5C10.4266 0.5 8.0651 0.711918 6.1773 0.961241Z" fill="#B1B5C3"/>
<path d="M9.25022 11.75C10.6309 11.75 11.7502 10.6307 11.7502 9.25C11.7502 7.86929 10.6309 6.75 9.25022 6.75C7.86951 6.75 6.75022 7.86929 6.75022 9.25C6.75022 10.6307 7.86951 11.75 9.25022 11.75Z" fill="#B1B5C3"/>
<path d="M20.6519 13.8841L22.8948 16.127C22.8174 17.2973 22.7044 18.3832 22.5798 19.3476L18.8841 15.6519C18.3959 15.1637 17.6045 15.1637 17.1163 15.6519L14.4019 18.3663C12.9374 19.8308 10.563 19.8308 9.09856 18.3663L8.8841 18.1519C8.39594 17.6637 7.60449 17.6637 7.11633 18.1519L4.105 21.1632C3.75616 20.6902 3.52255 20.1226 3.43972 19.4954C3.39454 19.1533 3.3509 18.7954 3.30952 18.4232L5.34857 16.3841C6.81303 14.9196 9.1874 14.9197 10.6519 16.3841L10.8663 16.5986C11.3545 17.0867 12.1459 17.0867 12.6341 16.5986L15.3486 13.8841C16.813 12.4196 19.1874 12.4197 20.6519 13.8841Z" fill="#B1B5C3"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

View File

@@ -1 +0,0 @@
<svg role="img" width="29" height="28" viewBox="0 0 29 28" fill="none" xmlns="http://www.w3.org/2000/svg" > <path d="M6.74219 20.29C6.74219 22.1885 7.71777 23.1729 9.59863 23.1729H18.959C20.8398 23.1729 21.8154 22.1885 21.8154 20.29V7.02734C21.8154 5.1377 20.8398 4.14453 18.959 4.14453H9.59863C7.71777 4.14453 6.74219 5.1377 6.74219 7.02734V20.29ZM8.46484 20.1846V7.13281C8.46484 6.31543 8.88672 5.86719 9.73926 5.86719H18.8096C19.6621 5.86719 20.0928 6.31543 20.0928 7.13281V20.1846C20.0928 21.002 19.6621 21.4502 18.8096 21.4502H9.73926C8.88672 21.4502 8.46484 21.002 8.46484 20.1846ZM10.5391 9.16309C10.9961 9.16309 11.3564 8.79395 11.3564 8.3457C11.3564 7.88867 10.9961 7.52832 10.5391 7.52832C10.0908 7.52832 9.72168 7.89746 9.72168 8.3457C9.72168 8.79395 10.0908 9.16309 10.5391 9.16309ZM12.9561 8.91699H18.2646C18.5811 8.91699 18.8359 8.66211 18.8359 8.3457C18.8359 8.0293 18.5811 7.77441 18.2646 7.77441H12.9561C12.6396 7.77441 12.3848 8.0293 12.3848 8.3457C12.3848 8.66211 12.6396 8.91699 12.9561 8.91699ZM10.5391 11.7822C10.9961 11.7822 11.3564 11.4131 11.3564 10.9648C11.3564 10.5078 10.9961 10.1562 10.5391 10.1562C10.082 10.1562 9.72168 10.5166 9.72168 10.9648C9.72168 11.4131 10.082 11.7822 10.5391 11.7822ZM12.9561 11.5361H18.2646C18.5898 11.5361 18.8359 11.2812 18.8359 10.9648C18.8359 10.6484 18.5898 10.4023 18.2646 10.4023H12.9561C12.6309 10.4023 12.3848 10.6484 12.3848 10.9648C12.3848 11.2812 12.6309 11.5361 12.9561 11.5361ZM10.5391 14.5332C10.9961 14.5332 11.3564 14.1641 11.3564 13.7158C11.3564 13.2588 10.9961 12.8896 10.5391 12.8896C10.0908 12.8896 9.72168 13.2676 9.72168 13.7158C9.72168 14.1553 10.0908 14.5332 10.5391 14.5332ZM12.9561 14.2871H18.2646C18.5811 14.2871 18.8359 14.0234 18.8359 13.7158C18.8359 13.3994 18.5898 13.1445 18.2646 13.1445H12.9561C12.6309 13.1445 12.3848 13.3994 12.3848 13.7158C12.3848 14.0234 12.6396 14.2871 12.9561 14.2871Z" fill="currentColor" /> </svg>

Before

Width:  |  Height:  |  Size: 1.9 KiB

View File

@@ -1,6 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin: auto; background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; display: block; shape-rendering: auto;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
<circle cx="50" cy="50" fill="none" stroke="#ffffff" stroke-width="10" r="35" stroke-dasharray="164.93361431346415 56.97787143782138">
<animateTransform attributeName="transform" type="rotate" repeatCount="indefinite" dur="1s" values="0 50 50;360 50 50" keyTimes="0;1"></animateTransform>
</circle>
<!-- [ldio] generated by https://loading.io/ --></svg>

Before

Width:  |  Height:  |  Size: 676 B

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.2 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.3 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 7.3 KiB

View File

@@ -1,12 +0,0 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_5348_11251)">
<path d="M13.75 22.5C18.5825 22.5 22.5 18.5825 22.5 13.75C22.5 8.91751 18.5825 5 13.75 5C8.91751 5 5 8.91751 5 13.75C5 18.5825 8.91751 22.5 13.75 22.5Z" fill="#0CE466"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M13.7501 14.6959C12.7492 14.6959 11.937 13.8845 11.937 12.8828C11.937 11.8811 12.7492 11.0697 13.7501 11.0697C14.751 11.0697 15.5631 11.8811 15.5631 12.8828C15.5631 13.8845 14.751 14.6959 13.7501 14.6959ZM12.9618 12.8828C12.9618 13.3183 13.3149 13.6711 13.7501 13.6711C14.1853 13.6711 14.5384 13.3183 14.5384 12.8828C14.5384 12.4473 14.1853 12.0945 13.7501 12.0945C13.3149 12.0945 12.9618 12.4473 12.9618 12.8828Z" fill="black"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.91675 12.8852L11.3852 9.41434H16.1149L19.5834 12.8852L13.7501 18.7161L7.91675 12.8852ZM16.4302 11.6215C14.9565 10.1413 12.5436 10.1413 11.0699 11.6215L9.80864 12.8828L11.0699 14.1441C12.5436 15.6243 14.9565 15.6243 16.4302 14.1441L17.6915 12.8828L16.4302 11.6215Z" fill="black"/>
</g>
<defs>
<clipPath id="clip0_5348_11251">
<rect width="17.5" height="17.5" fill="white" transform="translate(5 5)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="34" height="32" fill="none" viewBox="0 0 34 32">
<path fill="#0A0A3B" d="M15.228 21.753a7.952 7.952 0 004.37-1.306l4.431 4.41a1.52 1.52 0 001.073.421c.84 0 1.456-.653 1.456-1.476 0-.382-.131-.754-.414-1.035l-4.401-4.39a7.802 7.802 0 001.447-4.53c0-4.349-3.582-7.905-7.962-7.905-4.37 0-7.962 3.556-7.962 7.905 0 4.35 3.581 7.906 7.962 7.906zm0-2.11c-3.207 0-5.838-2.611-5.838-5.796 0-3.184 2.63-5.795 5.838-5.795 3.207 0 5.837 2.611 5.837 5.796 0 3.184-2.63 5.795-5.837 5.795z"/>
</svg>

Before

Width:  |  Height:  |  Size: 535 B

View File

@@ -1,3 +0,0 @@
<svg xmlns="http://www.w3.org/2000/svg" width="33" height="32" fill="none" viewBox="0 0 33 32">
<path fill="#FDFEFF" d="M15.04 21.752a7.856 7.856 0 004.339-1.306l4.4 4.41c.29.28.662.421 1.064.421.834 0 1.446-.653 1.446-1.476 0-.382-.13-.754-.411-1.035l-4.37-4.39a7.84 7.84 0 001.437-4.53c0-4.349-3.556-7.905-7.906-7.905-4.339 0-7.905 3.556-7.905 7.906 0 4.349 3.556 7.905 7.905 7.905zm0-2.11c-3.185 0-5.796-2.611-5.796-5.795 0-3.185 2.611-5.796 5.795-5.796 3.185 0 5.796 2.611 5.796 5.796 0 3.184-2.611 5.795-5.796 5.795z"/>
</svg>

Before

Width:  |  Height:  |  Size: 534 B

View File

@@ -1,4 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M25.9972 16.101C25.9972 21.5098 21.5205 25.9872 16.101 25.9872C10.6919 25.9872 6.21484 21.5101 6.21484 16.101C6.21484 10.6913 10.6825 6.21484 16.091 6.21484C21.5111 6.21484 25.9972 10.6928 25.9972 16.101Z" fill="#F95E14" stroke="white"/>
<path d="M11.4277 16.0118C11.4277 16.716 11.9415 17.1431 12.6608 17.1431H19.349C20.0682 17.1431 20.5706 16.716 20.5706 16.0118C20.5706 15.3076 20.0911 14.8574 19.349 14.8574H12.6608C11.9187 14.8574 11.4277 15.3076 11.4277 16.0118Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 597 B

View File

@@ -1,3 +0,0 @@
<svg width="13" height="12" viewBox="0 0 13 12" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.371094 2.19531L0.371093 9.79785C0.371093 11.1602 1.07422 11.8633 2.41769 11.8633L10.0579 11.8633C11.4014 11.8633 12.1045 11.1602 12.1045 9.79785L12.1045 2.19531C12.1045 0.839286 11.4076 0.129883 10.0579 0.129883L2.41769 0.129882C1.07422 0.129882 0.371094 0.839285 0.371094 2.19531ZM4.53334 8.05259C4.53334 7.71987 4.75935 7.50642 5.12346 7.50642L6.15304 7.50642L7.08845 7.59431L6.13421 6.72796L3.87416 4.46791C3.7486 4.34235 3.68583 4.19168 3.68583 4.00963C3.68583 3.6769 3.91811 3.43206 4.26967 3.43206C4.42662 3.43206 4.58357 3.50112 4.69657 3.6204L6.96917 5.893L7.8418 6.85352L7.74135 5.96833L7.74135 4.87598C7.74135 4.51814 7.9548 4.27958 8.28753 4.27958C8.62026 4.27958 8.8337 4.51186 8.8337 4.8697L8.8337 7.92076C8.8337 8.3351 8.62026 8.59249 8.16197 8.59249L5.13602 8.59249C4.77818 8.59249 4.53334 8.37905 4.53334 8.05259Z" fill="#F95E14"/>
</svg>

Before

Width:  |  Height:  |  Size: 963 B

View File

@@ -1,3 +0,0 @@
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" color="inherit" xmlns="http://www.w3.org/2000/svg">
<path d="M7 2V12M2 7H12" stroke="currentColor" stroke-opacity="0.5" stroke-width="2.5" stroke-linecap="round"/>
</svg>

Before

Width:  |  Height:  |  Size: 231 B

View File

@@ -1,3 +0,0 @@
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.1829 9.95313H7.67718V15.4474C7.67718 16.1679 8.26794 16.7709 9.0007 16.7709C9.73345 16.7709 10.3242 16.1679 10.3242 15.4474V9.95313H15.8185C16.539 9.95313 17.142 9.36236 17.142 8.6296C17.142 7.89685 16.539 7.30608 15.8185 7.30608H10.3242V1.8118C10.3242 1.09131 9.73345 0.488281 9.0007 0.488281C8.26794 0.488281 7.67718 1.09131 7.67718 1.8118V7.30608H2.1829C1.46241 7.30608 0.859375 7.89685 0.859375 8.6296C0.859375 9.36236 1.46241 9.95313 2.1829 9.95313Z" fill="white" stroke="white" stroke-width="0.5"/>
</svg>

Before

Width:  |  Height:  |  Size: 620 B

View File

@@ -1,4 +0,0 @@
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M33.1653 10.6536L51.6412 29.1107C54.4662 31.9357 54.485 34.9114 51.6411 37.7742L38.211 51.2043C35.3671 54.0858 32.3726 54.0482 29.5475 51.2231L11.0905 32.7284C9.60263 31.2594 9.45197 30.393 9.45197 28.2648V21.108C9.45197 19.0363 9.94164 18.3206 11.4672 16.7763L17.1943 11.0491C18.7198 9.52361 19.4355 9.03394 21.5261 9.03394H28.664C30.8111 9.03394 31.6774 9.1846 33.1653 10.6536ZM20.5 24C22.433 24 24 22.433 24 20.5C24 18.567 22.433 17 20.5 17C18.567 17 17 18.567 17 20.5C17 22.433 18.567 24 20.5 24Z" fill="#4673FA"/>
<path d="M39.5483 35.5323C39.4754 35.6084 39.3784 35.6569 39.2737 35.6696C38.2369 35.7822 37.3633 35.9138 36.6532 36.0643C35.943 36.2149 35.3624 36.4234 34.9112 36.6898C34.4643 36.9528 34.0918 37.3254 33.8288 37.7724C33.5584 38.2269 33.3442 38.8132 33.1864 39.5313C33.0285 40.2494 32.8857 41.1382 32.7581 42.1977C32.7415 42.3019 32.6923 42.3981 32.6174 42.4723C32.5384 42.5423 32.4352 42.5785 32.3298 42.5732C32.2802 42.5756 32.2307 42.5679 32.1842 42.5506C32.1377 42.5332 32.0952 42.5066 32.0594 42.4723C31.9879 42.3976 31.9441 42.3007 31.9351 42.1977C31.7979 41.1377 31.6476 40.2507 31.4842 39.5368C31.3209 38.8228 31.1028 38.2401 30.8301 37.7889C30.5671 37.3438 30.1962 36.9722 29.7518 36.7083C29.3043 36.441 28.7275 36.2305 28.0215 36.0767C27.3155 35.9229 26.4436 35.7856 25.4058 35.6648C25.2953 35.6536 25.192 35.6052 25.1127 35.5275C25.0758 35.4905 25.0468 35.4465 25.0274 35.398C25.0081 35.3495 24.9988 35.2975 25.0001 35.2453C24.9988 35.1931 25.0081 35.1412 25.0274 35.0927C25.0468 35.0442 25.0758 35.0001 25.1127 34.9632C25.192 34.8855 25.2953 34.8371 25.4058 34.8259C26.2838 34.7445 27.157 34.6166 28.0215 34.4428C28.7275 34.2922 29.308 34.0862 29.7628 33.8249C30.2138 33.5654 30.5889 33.1921 30.8507 32.7423C31.1211 32.2846 31.3373 31.6962 31.4993 30.9772C31.6613 30.2582 31.8059 29.3657 31.9331 28.2998C31.9452 28.2005 31.9887 28.1076 32.0573 28.0348C32.0923 27.9989 32.1344 27.9707 32.181 27.9523C32.2277 27.9338 32.2777 27.9254 32.3277 27.9277C32.3804 27.9252 32.4331 27.9333 32.4825 27.9518C32.532 27.9702 32.5771 27.9984 32.6153 28.0348C32.6873 28.1073 32.7363 28.1995 32.756 28.2998C32.8837 29.3671 33.0264 30.2596 33.1843 30.9772C33.3422 31.6949 33.5563 32.2832 33.8268 32.7423C34.0878 33.1908 34.4608 33.5638 34.9092 33.8249C35.3603 34.0876 35.941 34.2936 36.6511 34.4428C37.5173 34.6164 38.392 34.7442 39.2717 34.8259C39.3763 34.8385 39.4733 34.887 39.5462 34.9632C39.6176 35.0395 39.6561 35.1408 39.6533 35.2453C39.6556 35.2977 39.6475 35.35 39.6295 35.3993C39.6114 35.4485 39.5838 35.4937 39.5483 35.5323ZM42.7742 27.7121C42.3569 27.7663 41.9428 27.8433 41.5339 27.9428C41.2333 28.022 41.0059 28.1364 40.8517 28.2861C40.6979 28.4371 40.5847 28.6602 40.5133 28.9575C40.4251 29.3537 40.3593 29.7546 40.3163 30.1582C40.3085 30.301 40.2371 30.3724 40.1022 30.3724C39.9745 30.3724 39.8992 30.3037 39.8763 30.1664C39.8282 29.7666 39.7595 29.3695 39.6704 28.9767C39.5986 28.6879 39.4876 28.4701 39.3376 28.3231C39.1875 28.1762 38.9621 28.0618 38.6615 27.9799C38.3609 27.8975 37.9475 27.8073 37.4212 27.7094C37.2785 27.6792 37.2071 27.6002 37.2071 27.4725C37.2071 27.3352 37.2785 27.2599 37.4212 27.2467C37.8373 27.187 38.2498 27.1043 38.6567 26.9988C38.9537 26.9165 39.1754 26.7961 39.3218 26.6377C39.4682 26.4794 39.5773 26.254 39.6492 25.9615C39.7206 25.6686 39.7974 25.2702 39.8798 24.7663C39.8816 24.7387 39.8889 24.7118 39.9013 24.6871C39.9138 24.6624 39.931 24.6405 39.9521 24.6226C39.9732 24.6047 39.9976 24.5913 40.024 24.5831C40.0504 24.5748 40.0781 24.572 40.1056 24.5747C40.2333 24.5747 40.3047 24.6434 40.3198 24.7807C40.4021 25.2841 40.481 25.6771 40.5565 25.9594C40.6113 26.2028 40.7278 26.4279 40.8949 26.613C41.0455 26.7677 41.269 26.8863 41.5655 26.9686C41.862 27.051 42.2697 27.1448 42.7886 27.2501C42.9314 27.2652 43.0027 27.3405 43.0027 27.476C43.0027 27.603 42.9272 27.6819 42.7776 27.7149L42.7742 27.7121Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.9 KiB

View File

@@ -1,4 +0,0 @@
<svg width="15" height="16" viewBox="0 0 15 16" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4.5686 4.46908C4.74662 4.26563 5.0038 4.14893 5.27414 4.14893L10.1451 4.14893C10.4154 4.14893 10.6726 4.26563 10.8506 4.46908L13.0437 6.97546C13.3654 7.34308 13.3509 7.89609 13.0104 8.24632L8.38181 13.0071C8.01367 13.3858 7.40558 13.3858 7.03744 13.0071L2.40887 8.24632C2.06836 7.89609 2.05385 7.34308 2.37552 6.97546L4.5686 4.46908Z" fill="#4673FA"/>
<path d="M7.50864 10.6846C7.31466 10.6846 7.15641 10.6016 7.01348 10.4097L5.76283 8.86422C5.67094 8.75013 5.625 8.62566 5.625 8.49601C5.625 8.23151 5.82919 8.01369 6.09463 8.01369C6.25288 8.01369 6.37539 8.07593 6.50301 8.24188L7.48822 9.51249L9.60157 6.07925C9.70877 5.90292 9.85681 5.80957 10.0151 5.80957C10.2703 5.80957 10.5 5.99109 10.5 6.26077C10.5 6.38005 10.4438 6.5097 10.3673 6.62898L7.97827 10.4097C7.86597 10.5912 7.69751 10.6846 7.50864 10.6846Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 940 B

View File

@@ -1,8 +0,0 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M26.967 7.78458C27.2959 8.11906 27.4495 8.46808 27.4279 8.83162C27.4063 9.19516 27.201 9.54618 26.812 9.88465L18.4399 17.2592L16.2344 15.0429L23.6132 6.67857C23.954 6.29337 24.305 6.08767 24.6661 6.06146C25.0273 6.03524 25.374 6.18909 25.7063 6.523L26.967 7.78458Z" fill="white"/>
<path d="M17.7447 18.4454C18.006 18.7086 18.1369 18.9893 18.1374 19.2873C18.138 19.5853 18.0111 19.8617 17.7567 20.1164L17.4159 20.4514C17.1581 20.7107 16.8843 20.8381 16.5947 20.8335C16.3051 20.8289 16.0276 20.6956 15.7624 20.4335L12.8661 17.5214C12.6003 17.2548 12.4666 16.9753 12.4649 16.6829C12.4632 16.3906 12.5909 16.1151 12.8482 15.8564L13.1762 15.5214C13.43 15.2667 13.7046 15.1384 13.9999 15.1367C14.2952 15.135 14.5758 15.2672 14.8416 15.5333L17.7447 18.4454Z" fill="white"/>
<path d="M8.62826 20.1654C8.65085 20.1626 8.6714 20.1509 8.68537 20.1329C8.69935 20.1148 8.70562 20.092 8.7028 20.0693C8.69997 20.0466 8.68829 20.026 8.67032 20.012C8.65234 19.998 8.62956 19.9917 8.60696 19.9945C8.41018 19.9945 7.01738 19.9945 5.89036 19.8595C4.91853 19.7421 3.95842 19.5419 3.02042 19.2612C2.97243 19.2422 2.93221 19.2076 2.90627 19.1629C2.58256 18.3329 2.48033 17.7397 2.30996 16.9765C2.26566 16.8243 2.2614 16.6867 2.37896 16.5653C2.49652 16.444 2.64815 16.4482 2.80064 16.4961C4.58189 17.0508 6.20129 17.4201 8.05836 17.6192C9.70672 17.7961 11.3474 17.7842 12.9677 17.3808C13.0443 17.3507 13.124 17.3295 13.2053 17.3175L16.0557 19.8766C16.0557 20.0142 16.0557 20.0125 16.0557 20.1484C16.0455 21.288 15.9787 22.4276 15.8555 23.5673C15.7724 24.3723 15.6404 25.1716 15.4602 25.9605C15.3078 26.6144 15.1195 27.346 14.7941 27.9401C14.6084 28.2768 14.3238 28.3973 13.9499 28.3213C13.3323 28.2418 12.6056 28.1452 12.1916 27.9392C12.8314 27.046 13.3561 25.7126 13.6781 24.6015C13.7849 24.2073 13.8719 23.8079 13.9388 23.4049C13.9455 23.383 13.9432 23.3594 13.9325 23.3392C13.9218 23.319 13.9035 23.3039 13.8817 23.2972C13.8599 23.2905 13.8364 23.2928 13.8162 23.3035C13.7961 23.3142 13.7811 23.3326 13.7744 23.3544C13.5393 23.8912 13.1781 24.6673 12.7973 25.34C12.3986 26.0391 10.9334 27.5512 10.6676 27.4067C9.34468 26.858 8.30285 26.2477 7.2772 25.3631C7.26272 25.3511 8.64956 24.5938 9.71524 23.91C10.0032 23.7245 11.4914 22.4724 11.7597 22.0903C11.7677 22.0823 11.774 22.0728 11.7782 22.0623C11.7825 22.0518 11.7847 22.0406 11.7846 22.0293C11.7846 22.018 11.7823 22.0068 11.778 21.9964C11.7736 21.9859 11.7673 21.9765 11.7593 21.9685C11.7513 21.9605 11.7418 21.9542 11.7314 21.9499C11.721 21.9456 11.7098 21.9435 11.6985 21.9435C11.6872 21.9435 11.6761 21.9458 11.6657 21.9502C11.6553 21.9545 11.6459 21.9609 11.6379 21.9689L11.5527 22.0313C10.9147 22.4843 9.46309 23.1835 8.1674 23.6066C7.53983 23.8026 6.89568 23.9405 6.24303 24.0186C5.8878 24.0391 5.87758 24.0288 5.60754 23.7536C4.70182 22.8202 3.97731 21.7257 3.47106 20.5261C3.45317 20.4996 5.00442 20.6048 6.387 20.5261C7.14314 20.4717 7.89308 20.351 8.62826 20.1654Z" fill="white"/>
<path d="M10.3219 5.94445C10.2502 5.6248 10.1886 5.37125 10.1405 5.18652C10.1013 5.02768 10.0252 4.88031 9.91824 4.75638C9.80011 4.64129 9.65419 4.55863 9.49463 4.51641C9.30595 4.45755 9.04108 4.39417 8.70637 4.32625C8.61566 4.30542 8.56667 4.25743 8.56667 4.18137C8.56548 4.16328 8.56827 4.14514 8.57486 4.12824C8.58144 4.11134 8.59165 4.09609 8.60477 4.08356C8.6336 4.05859 8.66874 4.04199 8.70637 4.03558C8.97256 3.9862 9.23574 3.9218 9.49463 3.8427C9.65397 3.79851 9.79964 3.71505 9.91824 3.60001C10.0252 3.47608 10.1013 3.32871 10.1405 3.16987C10.1931 2.98393 10.2536 2.73311 10.3219 2.41737C10.3391 2.32682 10.3854 2.28516 10.4616 2.28516C10.5378 2.28516 10.5859 2.32954 10.6076 2.41737C10.6748 2.73311 10.7352 2.98393 10.789 3.16987C10.8294 3.3288 10.9065 3.4761 11.014 3.60001C11.133 3.71506 11.2789 3.7985 11.4385 3.8427C11.6973 3.92214 11.9605 3.98654 12.2268 4.03558C12.2636 4.03768 12.2981 4.05415 12.3229 4.08142C12.3477 4.10869 12.3607 4.14458 12.3592 4.18137C12.3592 4.25743 12.3148 4.30542 12.2268 4.32625C11.961 4.37636 11.6979 4.43983 11.4385 4.51641C11.2787 4.55864 11.1325 4.64129 11.014 4.75638C10.9065 4.88029 10.8294 5.02759 10.789 5.18652C10.7337 5.36762 10.6729 5.6248 10.6076 5.94445C10.5859 6.03501 10.5378 6.07757 10.4616 6.07757C10.3854 6.07757 10.3373 6.0332 10.3219 5.94445Z" fill="white"/>
<path d="M15.2461 8.99394C15.1709 8.60453 15.1005 8.29414 15.0367 8.06373C14.9893 7.86568 14.8946 7.68207 14.7607 7.52865C14.6127 7.38592 14.4309 7.28307 14.2323 7.22971C13.9127 7.13653 13.5878 7.06213 13.2594 7.00691C13.1443 6.98977 13.0862 6.92979 13.0862 6.82791C13.0849 6.80474 13.0884 6.78156 13.0964 6.75978C13.1045 6.73801 13.1168 6.7181 13.1328 6.70129C13.1678 6.66887 13.2121 6.64823 13.2594 6.64226C13.5875 6.58682 13.9123 6.51339 14.2323 6.42232C14.4318 6.37127 14.6142 6.2681 14.7607 6.12337C14.8942 5.96858 14.9888 5.78416 15.0367 5.58543C15.1005 5.35502 15.1709 5.04463 15.2461 4.65427C15.2465 4.63147 15.2515 4.60898 15.2607 4.58815C15.27 4.56733 15.2834 4.54861 15.3002 4.53312C15.3169 4.51763 15.3366 4.50571 15.3581 4.49806C15.3796 4.49041 15.4024 4.48719 15.4251 4.48861C15.5203 4.48861 15.5822 4.54383 15.605 4.65427C15.6805 5.04463 15.7504 5.35502 15.8145 5.58543C15.8615 5.78371 15.9548 5.96804 16.0867 6.12337C16.2326 6.26885 16.4152 6.37214 16.615 6.42232C16.9364 6.51321 17.2624 6.58664 17.5917 6.64226C17.6159 6.64242 17.6397 6.64759 17.6618 6.65746C17.6838 6.66733 17.7035 6.68167 17.7197 6.69958C17.7359 6.71748 17.7483 6.73855 17.7559 6.76147C17.7635 6.78438 17.7663 6.80863 17.764 6.83268C17.764 6.93455 17.7069 6.99453 17.5917 7.01167C17.2622 7.06708 16.936 7.14146 16.615 7.23446C16.4161 7.28692 16.2341 7.3899 16.0867 7.53342C15.9544 7.68741 15.8611 7.87092 15.8145 8.0685C15.751 8.29891 15.6812 8.60898 15.605 8.9987C15.5822 9.1101 15.5232 9.16532 15.4251 9.16532C15.4019 9.16663 15.3787 9.16314 15.3569 9.15509C15.3351 9.14704 15.3152 9.1346 15.2984 9.11853C15.2816 9.10245 15.2683 9.08309 15.2593 9.06166C15.2503 9.04023 15.2458 9.01718 15.2461 8.99394Z" fill="white"/>
<path d="M8.7807 15.7704C8.74441 15.7714 8.70831 15.7651 8.67449 15.7519C8.64068 15.7387 8.60984 15.7188 8.58378 15.6936C8.5297 15.6411 8.49302 15.5732 8.4787 15.4992C8.37979 14.9102 8.28207 14.4179 8.18552 14.0221C8.1113 13.6824 7.98879 13.3551 7.82171 13.0502C7.68254 12.8056 7.48313 12.6006 7.24244 12.4548C6.94981 12.2894 6.63262 12.1718 6.30288 12.1067C5.91611 12.0201 5.43338 11.938 4.85469 11.8602C4.77608 11.8515 4.70299 11.8156 4.64806 11.7586C4.59716 11.7044 4.5693 11.6325 4.57035 11.5581C4.56912 11.4836 4.597 11.4117 4.64806 11.3575C4.70276 11.3003 4.77597 11.2643 4.85469 11.2559C5.43397 11.1817 5.91758 11.1004 6.30553 11.0121C6.63932 10.9437 6.96065 10.8245 7.25833 10.6587C7.50305 10.5146 7.70746 10.311 7.85262 10.0668C8.02255 9.76573 8.14526 9.44035 8.21643 9.10203C8.30886 8.70682 8.39716 8.21326 8.48134 7.62134C8.49212 7.54612 8.52789 7.47672 8.58289 7.42432C8.60926 7.39823 8.64058 7.37767 8.675 7.36387C8.70943 7.35006 8.74626 7.34328 8.78334 7.34393C8.8206 7.34261 8.85775 7.34873 8.89262 7.36192C8.92749 7.37512 8.95938 7.39513 8.98644 7.42079C9.04039 7.47339 9.07704 7.54119 9.09153 7.61516C9.19396 8.20708 9.29345 8.70064 9.38999 9.09585C9.46517 9.43524 9.58763 9.76237 9.75381 10.0677C9.89378 10.3115 10.093 10.516 10.3331 10.6622C10.625 10.8284 10.9411 10.9476 11.27 11.0156C11.655 11.104 12.1368 11.1852 12.7155 11.2595C12.7942 11.2678 12.8675 11.3038 12.9222 11.3611C12.973 11.4153 13.0006 11.4873 12.999 11.5616C13 11.6366 12.9726 11.7093 12.9222 11.7648C12.8686 11.8232 12.7946 11.8586 12.7155 11.8637C12.2276 11.8971 11.742 11.9588 11.2612 12.0484C10.9248 12.1073 10.6008 12.2229 10.3031 12.3903C10.0542 12.541 9.84898 12.7542 9.70789 13.0087C9.5398 13.3212 9.41841 13.6567 9.34761 14.0044C9.25459 14.4096 9.16923 14.9082 9.09153 15.5001C9.08237 15.5763 9.04747 15.647 8.99263 15.7006C8.96369 15.7258 8.93005 15.7449 8.89367 15.7568C8.85729 15.7688 8.81888 15.7734 8.7807 15.7704Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 7.8 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 72 KiB

View File

@@ -1,4 +0,0 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.33909 19.3278C6.33802 20.166 6.53963 20.7864 6.94391 21.1889C7.34713 21.5926 7.95889 21.7911 8.77923 21.7847H10.6049C10.6812 21.7818 10.7573 21.7946 10.8284 21.8222C10.8996 21.8498 10.9644 21.8917 11.0188 21.9453L12.3183 23.23C12.9087 23.8199 13.4873 24.1132 14.0542 24.11C14.621 24.1068 15.1996 23.8134 15.79 23.23L17.0735 21.9453C17.1297 21.8911 17.1965 21.8489 17.2695 21.8213C17.3426 21.7937 17.4206 21.7812 17.4986 21.7847H19.3131C20.142 21.7858 20.7596 21.584 21.166 21.1793C21.5725 20.7746 21.7757 20.1542 21.7757 19.3181V17.5019C21.7715 17.3445 21.8291 17.1918 21.9361 17.0764L23.2196 15.7917C23.8174 15.204 24.1142 14.6253 24.11 14.0558C24.1057 13.4863 23.8089 12.9071 23.2196 12.3183L21.9361 11.0336C21.8288 10.9184 21.7712 10.7655 21.7757 10.6081V8.79185C21.7746 7.95467 21.573 7.33429 21.1709 6.93069C20.7687 6.52709 20.1494 6.32528 19.3131 6.32528H17.4986C17.4206 6.32849 17.3427 6.31593 17.2697 6.28834C17.1966 6.26075 17.1299 6.21869 17.0735 6.1647L15.79 4.88002C15.1996 4.29015 14.621 3.99681 14.0542 4.00003C13.4873 4.00324 12.9087 4.29657 12.3183 4.88002L11.0188 6.1647C10.9642 6.21806 10.8995 6.25981 10.8283 6.28741C10.7572 6.31501 10.6812 6.32789 10.6049 6.32528H8.77923C7.95141 6.32635 7.33589 6.52655 6.93267 6.92586C6.52946 7.32518 6.32785 7.94718 6.32785 8.79185V10.6129C6.33235 10.7703 6.27471 10.9232 6.16742 11.0384L4.88397 12.3231C4.29466 12.9108 4 13.49 4 14.0606C4 14.6312 4.29841 15.2115 4.89521 15.8014L6.17866 17.086C6.28565 17.2014 6.34324 17.3542 6.33909 17.5116V19.3278Z" fill="#4673FA"/>
<path d="M13.9964 17.491C13.8069 17.7797 13.5273 17.942 13.2025 17.942C12.8687 17.942 12.6071 17.8067 12.3635 17.491L10.2345 14.8929C10.0812 14.7034 10 14.505 10 14.2885C10 13.8374 10.3428 13.4856 10.7848 13.4856C11.0555 13.4856 11.272 13.5848 11.4885 13.8645L13.1664 16.0025L16.7298 10.2831C16.9192 9.97637 17.1628 9.83203 17.4334 9.83203C17.8574 9.83203 18.2543 10.1297 18.2543 10.5718C18.2543 10.7793 18.1461 10.9958 18.0288 11.1852L13.9964 17.491Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 558 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 306 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

View File

@@ -1,88 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_12510_20313)">
<rect width="24" height="24" rx="8" fill="white"/>
<g filter="url(#filter0_f_12510_20313)">
<circle cx="13.0526" cy="14.3159" r="14.7368" fill="url(#paint0_radial_12510_20313)"/>
</g>
<g filter="url(#filter1_d_12510_20313)">
<path d="M17.3968 5.20882C17.422 4.76813 17.482 4.47745 17.6027 4.21199C17.6505 4.10692 17.6952 4.02092 17.7021 4.02092C17.709 4.02092 17.6883 4.09848 17.656 4.19325C17.5682 4.45088 17.5538 4.80325 17.6143 5.21322C17.691 5.7334 17.7346 5.80845 18.2868 6.37036C18.5459 6.63392 18.8472 6.96633 18.9564 7.10904L19.155 7.36853L18.9564 7.18308C18.7135 6.9563 18.155 6.51402 18.0316 6.4508C17.9489 6.40839 17.9366 6.40913 17.8856 6.45969C17.8385 6.50629 17.8286 6.5763 17.8221 6.90727C17.812 7.4231 17.7413 7.7542 17.5709 8.08526C17.4787 8.26432 17.4642 8.2261 17.5476 8.02399C17.6099 7.87309 17.6162 7.80675 17.6157 7.30739C17.6148 6.30405 17.4951 6.06284 16.7935 5.64963C16.6157 5.54495 16.3229 5.39399 16.1427 5.31414C15.9625 5.23428 15.8193 5.16473 15.8245 5.15954C15.8444 5.13985 16.5287 5.33869 16.8041 5.44416C17.2138 5.60105 17.2814 5.62138 17.3311 5.60246C17.3645 5.58977 17.3806 5.49307 17.3968 5.20882Z" fill="url(#paint1_linear_12510_20313)"/>
<path d="M8.74107 3.74916C8.49804 3.7117 8.48779 3.7073 8.60216 3.68984C8.82133 3.65634 9.33884 3.70199 9.69547 3.78626C10.528 3.98291 11.2856 4.48669 12.0943 5.38141L12.3091 5.6191L12.6165 5.57C13.9112 5.36324 15.2284 5.52756 16.3301 6.0333C16.6331 6.17243 17.111 6.44939 17.1707 6.52056C17.1897 6.54324 17.2246 6.68925 17.2483 6.84505C17.3301 7.38407 17.2892 7.79723 17.1233 8.10582C17.033 8.27375 17.0279 8.32696 17.0886 8.47068C17.1371 8.58536 17.2722 8.67024 17.4059 8.67005C17.6797 8.66969 17.9744 8.2299 18.1109 7.61798L18.1651 7.37491L18.2726 7.49585C18.8619 8.15934 19.3248 9.06419 19.4043 9.70827L19.425 9.87619L19.326 9.72353C19.1555 9.46083 18.9842 9.28201 18.7648 9.13777C18.3694 8.87779 17.9514 8.78931 16.8441 8.73133C15.8441 8.67897 15.2782 8.59409 14.717 8.41224C13.7621 8.10289 13.2808 7.69089 12.1466 6.21216C11.6428 5.55535 11.3314 5.19195 11.0217 4.8993C10.3179 4.23435 9.62632 3.88561 8.74107 3.74916Z" fill="url(#paint2_linear_12510_20313)"/>
<path d="M9.21314 6.92984C8.71977 6.25487 8.41451 5.21998 8.4806 4.44636L8.50103 4.20696L8.61333 4.22732C8.82423 4.26555 9.18786 4.40004 9.35813 4.50281C9.82539 4.78481 10.0277 5.15608 10.2335 6.10945C10.2938 6.38869 10.3729 6.7047 10.4092 6.81168C10.4678 6.98388 10.6892 7.38612 10.8692 7.64735C10.9989 7.83549 10.9127 7.92464 10.6262 7.89893C10.1885 7.85967 9.59561 7.45307 9.21314 6.92984Z" fill="url(#paint3_linear_12510_20313)"/>
<path d="M16.7978 11.9533C14.4921 11.0308 13.6801 10.2301 13.6801 8.87901C13.6801 8.68019 13.687 8.51751 13.6954 8.51751C13.7038 8.51751 13.793 8.58313 13.8936 8.66334C14.3611 9.03598 14.8847 9.19514 16.3341 9.40526C17.187 9.52892 17.667 9.62879 18.1097 9.7747C19.517 10.2385 20.3877 11.1797 20.5953 12.4616C20.6557 12.8341 20.6203 13.5327 20.5225 13.9008C20.4452 14.1916 20.2096 14.7157 20.1471 14.7358C20.1298 14.7414 20.1128 14.6754 20.1083 14.5856C20.0846 14.1043 19.8398 13.6356 19.4287 13.2846C18.9613 12.8854 18.3333 12.5677 16.7978 11.9533Z" fill="url(#paint4_linear_12510_20313)"/>
<path d="M15.1791 12.3366C15.1503 12.1657 15.1002 11.9476 15.0678 11.8518L15.009 11.6776L15.1182 11.7995C15.2695 11.9681 15.389 12.184 15.4902 12.4714C15.5675 12.6908 15.5762 12.7561 15.5757 13.1126C15.5751 13.4626 15.5654 13.536 15.494 13.7335C15.3815 14.0449 15.2418 14.2657 15.0074 14.5027C14.5863 14.9286 14.0448 15.1645 13.2633 15.2623C13.1275 15.2793 12.7316 15.3079 12.3836 15.3259C11.5065 15.3712 10.9292 15.4649 10.4105 15.6459C10.3359 15.6719 10.2693 15.6877 10.2626 15.681C10.2416 15.6603 10.5947 15.4511 10.8864 15.3114C11.2978 15.1145 11.7072 15.0071 12.6246 14.8553C13.0778 14.7803 13.5458 14.6893 13.6646 14.6531C14.7869 14.3111 15.3638 13.4288 15.1791 12.3366Z" fill="url(#paint5_linear_12510_20313)"/>
<path d="M16.2361 14.2019C15.9298 13.5475 15.8594 12.9156 16.0272 12.3264C16.0452 12.2634 16.0741 12.2119 16.0914 12.2119C16.1088 12.2119 16.1811 12.2507 16.2521 12.2982C16.3932 12.3926 16.6763 12.5517 17.4306 12.9603C18.3719 13.4703 18.9085 13.8652 19.2735 14.3163C19.5931 14.7114 19.7909 15.1614 19.8861 15.7101C19.94 16.0209 19.9084 16.7688 19.8281 17.0818C19.5751 18.0686 18.9869 18.8438 18.148 19.2961C18.0251 19.3624 17.9147 19.4168 17.9028 19.4171C17.8908 19.4173 17.9356 19.3041 18.0023 19.1656C18.2845 18.5794 18.3167 18.0092 18.1033 17.3745C17.9727 16.9858 17.7063 16.5116 17.1685 15.7102C16.5432 14.7784 16.3899 14.5304 16.2361 14.2019Z" fill="url(#paint6_linear_12510_20313)"/>
<path d="M7.57574 17.7327C8.43136 17.0148 9.49596 16.5048 10.4657 16.3482C10.8836 16.2808 11.5799 16.3075 11.9669 16.406C12.5872 16.5637 13.1421 16.9171 13.4307 17.3381C13.7128 17.7495 13.8338 18.1081 13.9597 18.9058C14.0094 19.2205 14.0635 19.5365 14.0799 19.608C14.1745 20.0215 14.3586 20.3519 14.5867 20.5179C14.9491 20.7815 15.5731 20.7979 16.1869 20.5599C16.2911 20.5195 16.3815 20.4916 16.3879 20.4979C16.4101 20.5199 16.101 20.7255 15.883 20.8337C15.5896 20.9794 15.3563 21.0357 15.0463 21.0357C14.4841 21.0357 14.0173 20.7515 13.6279 20.172C13.5512 20.058 13.379 19.7164 13.2451 19.413C12.8339 18.481 12.6308 18.1971 12.1534 17.8863C11.7379 17.616 11.202 17.5675 10.7989 17.764C10.2694 18.0219 10.1216 18.6944 10.5009 19.1205C10.6516 19.2899 10.9327 19.436 11.1626 19.4644C11.5926 19.5175 11.9621 19.1925 11.9621 18.761C11.9621 18.4809 11.8538 18.3211 11.581 18.1988C11.2085 18.0317 10.808 18.227 10.81 18.5747C10.8108 18.723 10.8758 18.8162 11.0254 18.8834C11.1213 18.9266 11.1235 18.93 11.0453 18.9138C10.7035 18.8434 10.6234 18.4339 10.8982 18.1621C11.2282 17.8357 11.9105 17.9797 12.1448 18.4252C12.2432 18.6123 12.2546 18.9849 12.1688 19.2099C11.9768 19.7136 11.4167 19.9784 10.8486 19.8343C10.4618 19.7361 10.3044 19.6299 9.83802 19.1526C9.02768 18.3231 8.7131 18.1624 7.54487 17.9811L7.32101 17.9464L7.57574 17.7327Z" fill="url(#paint7_linear_12510_20313)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.77354 2.88677C6.47968 6.15059 8.34354 7.49719 8.55067 7.78169C8.72168 8.0166 8.65732 8.2278 8.36434 8.39331C8.20142 8.48533 7.86646 8.57858 7.69875 8.57858C7.50906 8.57858 7.44394 8.50586 7.44394 8.50586C7.33395 8.40221 7.27201 8.42033 6.70721 7.42408C5.92308 6.215 5.26687 5.21202 5.24896 5.19523C5.20757 5.15639 5.20828 5.15771 6.62725 7.68067C6.85652 8.20652 6.67286 8.39954 6.67286 8.47443C6.67286 8.62679 6.63103 8.70687 6.4419 8.91651C6.1266 9.26604 5.98566 9.65877 5.88391 10.4716C5.76985 11.3827 5.44913 12.0263 4.56029 13.1279C4.04 13.7727 3.95486 13.8909 3.82358 14.1508C3.65821 14.478 3.61274 14.6613 3.59431 15.0746C3.57484 15.5116 3.61277 15.7938 3.74711 16.2116C3.86472 16.5774 3.98749 16.8189 4.30133 17.3019C4.57217 17.7188 4.72812 18.0285 4.72812 18.1497C4.72812 18.2461 4.74665 18.2463 5.16634 18.1521C6.17072 17.9267 6.98627 17.5303 7.44495 17.0446C7.72882 16.7439 7.79546 16.5778 7.79762 16.1658C7.79904 15.8963 7.7895 15.8399 7.71619 15.6848C7.59685 15.4325 7.3796 15.2227 6.90076 14.8974C6.27336 14.4712 6.00538 14.1281 5.93136 13.6562C5.87064 13.269 5.94108 12.9958 6.28817 12.273C6.64742 11.5247 6.73645 11.2059 6.79667 10.4517C6.83557 9.9644 6.88943 9.77223 7.03032 9.61798C7.17725 9.45714 7.30953 9.40267 7.67316 9.3533C8.266 9.27282 8.64349 9.1204 8.95378 8.83627C9.22296 8.58978 9.3356 8.35227 9.35288 7.99474L9.366 7.72374L9.21558 7.54946C8.67084 6.9183 3.40873 2.39062 3.37521 2.39062C3.36805 2.39062 3.5473 2.61391 3.77354 2.88677ZM5.03391 15.569C5.15708 15.3523 5.09164 15.0736 4.88562 14.9375C4.69096 14.8089 4.38857 14.8694 4.38857 15.0371C4.38857 15.0882 4.41703 15.1254 4.48117 15.1583C4.58918 15.2135 4.59702 15.2756 4.51204 15.4025C4.42598 15.531 4.43293 15.6441 4.53164 15.7209C4.69074 15.8447 4.91596 15.7766 5.03391 15.569Z" fill="url(#paint8_linear_12510_20313)"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.74013 9.49546C9.46182 9.5804 9.19129 9.87351 9.10754 10.1808C9.05645 10.3683 9.08544 10.6972 9.16196 10.7988C9.28559 10.9629 9.40515 11.0061 9.72887 11.0038C10.3627 10.9994 10.9136 10.7293 10.9777 10.3916C11.0302 10.1148 10.7882 9.73123 10.4549 9.56281C10.2829 9.47595 9.91711 9.44148 9.74013 9.49546ZM10.481 10.0712C10.5788 9.93317 10.536 9.78402 10.3698 9.68314C10.0532 9.49106 9.57452 9.65001 9.57452 9.94718C9.57452 10.0951 9.82416 10.2565 10.053 10.2565C10.2053 10.2565 10.4137 10.1662 10.481 10.0712Z" fill="url(#paint9_linear_12510_20313)"/>
</g>
</g>
<defs>
<filter id="filter0_f_12510_20313" x="-72.277" y="-71.0137" width="170.659" height="170.659" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="35.2964" result="effect1_foregroundBlur_12510_20313"/>
</filter>
<filter id="filter1_d_12510_20313" x="-20.2828" y="-21.2671" width="64.5655" height="65.9605" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset/>
<feGaussianBlur stdDeviation="11.8289"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 1 0 0 0 0 0 0 0 0 0 0.605405 0 0 0 0.15 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_12510_20313"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_12510_20313" result="shape"/>
</filter>
<radialGradient id="paint0_radial_12510_20313" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(13.0719 14.2967) rotate(42.4693) scale(16.2421)">
<stop stop-color="white"/>
<stop offset="1" stop-color="#FFD8EF" stop-opacity="0.4"/>
</radialGradient>
<linearGradient id="paint1_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint2_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint3_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint4_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint5_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint6_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint7_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint8_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<linearGradient id="paint9_linear_12510_20313" x1="19.7578" y1="18.1172" x2="4.89844" y2="3.67969" gradientUnits="userSpaceOnUse">
<stop stop-color="#FFCDF1"/>
<stop offset="0.380969" stop-color="#F436DA"/>
<stop offset="1" stop-color="#F356EF"/>
</linearGradient>
<clipPath id="clip0_12510_20313">
<rect width="24" height="24" rx="8" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 KiB

View File

@@ -12,12 +12,14 @@ import { formatDelta } from 'components/Tokens/TokenDetails/PriceChart'
import Tooltip from 'components/Tooltip'
import { useGetConnection } from 'connection'
import { usePortfolioBalancesQuery } from 'graphql/data/__generated__/types-and-hooks'
import { useAtomValue } from 'jotai/utils'
import { useProfilePageState, useSellAsset, useWalletCollections } from 'nft/hooks'
import { useIsNftClaimAvailable } from 'nft/hooks/useIsNftClaimAvailable'
import { ProfilePageStateType } from 'nft/types'
import { useCallback, useState } from 'react'
import { ArrowDownRight, ArrowUpRight, Copy, CreditCard, IconProps, Info, Power, Settings } from 'react-feather'
import { useNavigate } from 'react-router-dom'
import { shouldDisableNFTRoutesAtom } from 'state/application/atoms'
import { useAppDispatch } from 'state/hooks'
import { updateSelectedWallet } from 'state/user/reducer'
import styled, { useTheme } from 'styled-components/macro'
@@ -28,13 +30,13 @@ import { useCloseModal, useFiatOnrampAvailability, useOpenModal, useToggleModal
import { ApplicationModal } from '../../state/application/reducer'
import { useUserHasAvailableClaim, useUserUnclaimedAmount } from '../../state/claim/hooks'
import StatusIcon from '../Identicon/StatusIcon'
import { useToggleWalletDrawer } from '.'
import { useToggleAccountDrawer } from '.'
import IconButton, { IconHoverText } from './IconButton'
import MiniPortfolio from './MiniPortfolio'
import { portfolioFadeInAnimation } from './MiniPortfolio/PortfolioRow'
const AuthenticatedHeaderWrapper = styled.div`
padding: 14px 12px 16px 16px;
padding: 20px 16px;
display: flex;
flex-direction: column;
flex: 1;
@@ -112,7 +114,7 @@ const AccountNamesWrapper = styled.div`
width: 100%;
flex-direction: column;
justify-content: center;
gap: 4px;
gap: 2px;
`
const StyledInfoIcon = styled(Info)`
@@ -166,6 +168,8 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
const clearCollectionFilters = useWalletCollections((state) => state.clearCollectionFilters)
const isClaimAvailable = useIsNftClaimAvailable((state) => state.isClaimAvailable)
const shouldDisableNFTRoutes = useAtomValue(shouldDisableNFTRoutesAtom)
const unclaimedAmount: CurrencyAmount<Token> | undefined = useUserUnclaimedAmount(account)
const isUnclaimed = useUserHasAvailableClaim(account)
const getConnection = useGetConnection()
@@ -180,7 +184,7 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
dispatch(updateSelectedWallet({ wallet: undefined }))
}, [connector, dispatch])
const toggleWalletDrawer = useToggleWalletDrawer()
const toggleWalletDrawer = useToggleAccountDrawer()
const navigateToProfile = useCallback(() => {
toggleWalletDrawer()
@@ -193,9 +197,10 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
const openFiatOnrampModal = useOpenModal(ApplicationModal.FIAT_ONRAMP)
const openFoRModalWithAnalytics = useCallback(() => {
toggleWalletDrawer()
sendAnalyticsEvent(InterfaceEventName.FIAT_ONRAMP_WIDGET_OPENED)
openFiatOnrampModal()
}, [openFiatOnrampModal])
}, [openFiatOnrampModal, toggleWalletDrawer])
const [shouldCheck, setShouldCheck] = useState(false)
const {
@@ -235,7 +240,7 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
<StatusIcon connection={connection} size={40} />
{account && (
<AccountNamesWrapper>
<ThemedText.SubHeader color="textPrimary" fontWeight={500}>
<ThemedText.SubHeader>
<CopyText toCopy={ENSName ?? account}>{ENSName ?? shortenAddress(account, 4, 4)}</CopyText>
</ThemedText.SubHeader>
{/* Displays smaller view of account if ENS name was rendered above */}
@@ -283,11 +288,22 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
<LoadingBubble height="16px" width="100px" margin="4px 0 20px 0" />
</Column>
)}
{!shouldDisableNFTRoutes && (
<HeaderButton
data-testid="nft-view-self-nfts"
onClick={navigateToProfile}
size={ButtonSize.medium}
emphasis={ButtonEmphasis.medium}
>
<Trans>View and sell NFTs</Trans>
</HeaderButton>
)}
<HeaderButton
size={ButtonSize.medium}
emphasis={ButtonEmphasis.medium}
onClick={handleBuyCryptoClick}
disabled={disableBuyCryptoButton}
data-testid="wallet-buy-crypto"
>
{error ? (
<ThemedText.BodyPrimary>{error}</ThemedText.BodyPrimary>
@@ -302,14 +318,6 @@ export default function AuthenticatedHeader({ account, openSettings }: { account
</>
)}
</HeaderButton>
<HeaderButton
data-testid="nft-view-self-nfts"
onClick={navigateToProfile}
size={ButtonSize.medium}
emphasis={ButtonEmphasis.medium}
>
<Trans>View and sell NFTs</Trans>
</HeaderButton>
{Boolean(!fiatOnrampAvailable && fiatOnrampAvailabilityChecked) && (
<FiatOnrampNotAvailableText marginTop="8px">
<Trans>Not available in your region</Trans>

View File

@@ -1,7 +1,6 @@
import { sendAnalyticsEvent } from '@uniswap/analytics'
import { useMGTMMicrositeEnabled } from 'featureFlags/flags/mgtm'
import { InterfaceElementName, InterfaceEventName, SharedEventName } from '@uniswap/analytics-events'
import { PropsWithChildren, useCallback } from 'react'
import { useNavigate } from 'react-router-dom'
import styled from 'styled-components/macro'
import { ClickableStyle } from 'theme'
import { isIOS } from 'utils/userAgent'
@@ -33,22 +32,38 @@ function BaseButton({ onClick, branded, children }: PropsWithChildren<{ onClick?
)
}
export const APP_STORE_LINK = 'https://apps.apple.com/us/app/uniswap-wallet-defi-nfts/id6443944476'
const APP_STORE_LINK = 'https://apps.apple.com/app/apple-store/id6443944476?pt=123625782&ct=In-App-Banners&mt=8'
const MICROSITE_LINK = 'https://wallet.uniswap.org/'
const openAppStore = () => {
window.open(APP_STORE_LINK, /* target = */ 'uniswap_wallet_appstore')
}
export const openWalletMicrosite = () => {
sendAnalyticsEvent(InterfaceEventName.UNISWAP_WALLET_MICROSITE_OPENED)
window.open(MICROSITE_LINK, /* target = */ 'uniswap_wallet_microsite')
}
export function openDownloadApp(element: InterfaceElementName) {
sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, { element })
if (isIOS) openAppStore()
else openWalletMicrosite()
}
// Launches App Store if on an iOS device, else navigates to Uniswap Wallet microsite
export function DownloadButton({ onClick, text = 'Download' }: { onClick?: () => void; text?: string }) {
const navigate = useNavigate()
const micrositeEnabled = useMGTMMicrositeEnabled()
export function DownloadButton({
onClick,
text = 'Download',
element,
}: {
onClick?: () => void
text?: string
element: InterfaceElementName
}) {
const onButtonClick = useCallback(() => {
// handles any actions required by the parent, i.e. cancelling wallet connection attempt or dismissing an ad
onClick?.()
if (isIOS || !micrositeEnabled) {
sendAnalyticsEvent('Uniswap wallet download clicked')
window.open(APP_STORE_LINK)
} else navigate('/wallet')
}, [onClick, micrositeEnabled, navigate])
openDownloadApp(element)
}, [element, onClick])
return (
<BaseButton branded onClick={onButtonClick}>
@@ -56,8 +71,3 @@ export function DownloadButton({ onClick, text = 'Download' }: { onClick?: () =>
</BaseButton>
)
}
export function LearnMoreButton() {
const navigate = useNavigate()
return <BaseButton onClick={() => navigate('/wallet')}>Learn More</BaseButton>
}

View File

@@ -0,0 +1,71 @@
import { TraceEvent } from '@uniswap/analytics'
import { BrowserEvent, InterfaceElementName, SharedEventName } from '@uniswap/analytics-events'
import Column from 'components/Column'
import AlertTriangleFilled from 'components/Icons/AlertTriangleFilled'
import { LoaderV2 } from 'components/Icons/LoadingSpinner'
import { TransactionStatus } from 'graphql/data/__generated__/types-and-hooks'
import useENSName from 'hooks/useENSName'
import styled from 'styled-components/macro'
import { EllipsisStyle, ThemedText } from 'theme'
import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink'
import { PortfolioLogo } from '../PortfolioLogo'
import PortfolioRow from '../PortfolioRow'
import { useTimeSince } from './parseRemote'
import { Activity } from './types'
const ActivityRowDescriptor = styled(ThemedText.BodySmall)`
color: ${({ theme }) => theme.textSecondary};
${EllipsisStyle}
`
const StyledTimestamp = styled(ThemedText.Caption)`
color: ${({ theme }) => theme.textSecondary};
font-variant: small;
font-feature-settings: 'tnum' on, 'lnum' on, 'ss02' on;
`
export function ActivityRow({
activity: { chainId, status, title, descriptor, logos, otherAccount, currencies, timestamp, hash },
}: {
activity: Activity
}) {
const { ENSName } = useENSName(otherAccount)
const timeSince = useTimeSince(timestamp)
const explorerUrl = getExplorerLink(chainId, hash, ExplorerDataType.TRANSACTION)
return (
<TraceEvent
events={[BrowserEvent.onClick]}
name={SharedEventName.ELEMENT_CLICKED}
element={InterfaceElementName.MINI_PORTFOLIO_ACTIVITY_ROW}
properties={{ hash, chain_id: chainId, explorer_url: explorerUrl }}
>
<PortfolioRow
left={
<Column>
<PortfolioLogo chainId={chainId} currencies={currencies} images={logos} accountAddress={otherAccount} />
</Column>
}
title={<ThemedText.SubHeader>{title}</ThemedText.SubHeader>}
descriptor={
<ActivityRowDescriptor color="textSecondary">
{descriptor}
{ENSName ?? otherAccount}
</ActivityRowDescriptor>
}
right={
status === TransactionStatus.Pending ? (
<LoaderV2 />
) : status === TransactionStatus.Confirmed ? (
<StyledTimestamp>{timeSince}</StyledTimestamp>
) : (
<AlertTriangleFilled />
)
}
onClick={() => window.open(explorerUrl, '_blank')}
/>
</TraceEvent>
)
}

View File

@@ -1,26 +1,20 @@
import { t } from '@lingui/macro'
import { TraceEvent } from '@uniswap/analytics'
import { BrowserEvent, InterfaceElementName, SharedEventName } from '@uniswap/analytics-events'
import { useAccountDrawer } from 'components/AccountDrawer'
import Column from 'components/Column'
import AlertTriangleFilled from 'components/Icons/AlertTriangleFilled'
import { LoaderV2 } from 'components/Icons/LoadingSpinner'
import { LoadingBubble } from 'components/Tokens/loading'
import { useWalletDrawer } from 'components/WalletDropdown'
import { getYear, isSameDay, isSameMonth, isSameWeek, isSameYear } from 'date-fns'
import { TransactionStatus, useTransactionListQuery } from 'graphql/data/__generated__/types-and-hooks'
import { PollingInterval } from 'graphql/data/util'
import useENSName from 'hooks/useENSName'
import { atom, useAtom } from 'jotai'
import { EmptyWalletModule } from 'nft/components/profile/view/EmptyWalletContent'
import { useEffect, useMemo } from 'react'
import styled from 'styled-components/macro'
import { EllipsisStyle, ThemedText } from 'theme'
import { ExplorerDataType, getExplorerLink } from 'utils/getExplorerLink'
import { ThemedText } from 'theme'
import { PortfolioLogo } from '../PortfolioLogo'
import PortfolioRow, { PortfolioSkeleton, PortfolioTabWrapper } from '../PortfolioRow'
import { PortfolioSkeleton, PortfolioTabWrapper } from '../PortfolioRow'
import { ActivityRow } from './ActivityRow'
import { useLocalActivities } from './parseLocal'
import { parseRemoteActivities, useTimeSince } from './parseRemote'
import { parseRemoteActivities } from './parseRemote'
import { Activity, ActivityMap } from './types'
interface ActivityGroup {
@@ -103,11 +97,11 @@ function combineActivities(localMap: ActivityMap = {}, remoteMap: ActivityMap =
const lastFetchedAtom = atom<number | undefined>(0)
export default function ActivityTab({ account }: { account: string }) {
const [drawerOpen, toggleWalletDrawer] = useWalletDrawer()
export function ActivityTab({ account }: { account: string }) {
const [drawerOpen, toggleWalletDrawer] = useAccountDrawer()
const [lastFetched, setLastFetched] = useAtom(lastFetchedAtom)
const localMap = useLocalActivities()
const localMap = useLocalActivities(account)
const { data, loading, refetch } = useTransactionListQuery({
variables: { account },
@@ -146,7 +140,7 @@ export default function ActivityTab({ account }: { account: string }) {
<PortfolioTabWrapper>
{activityGroups.map((activityGroup) => (
<ActivityGroupWrapper key={activityGroup.title}>
<ThemedText.SubHeader color="textSecondary" fontWeight={500} marginLeft="16px">
<ThemedText.SubHeader color="textSecondary" marginLeft="16px">
{activityGroup.title}
</ThemedText.SubHeader>
<Column>
@@ -160,56 +154,3 @@ export default function ActivityTab({ account }: { account: string }) {
)
}
}
const StyledDescriptor = styled(ThemedText.BodySmall)`
color: ${({ theme }) => theme.textSecondary};
${EllipsisStyle}
`
const StyledTimestamp = styled(ThemedText.Caption)`
color: ${({ theme }) => theme.textSecondary};
font-variant: small;
font-feature-settings: 'tnum' on, 'lnum' on, 'ss02' on;
`
function ActivityRow({ activity }: { activity: Activity }) {
const { chainId, status, title, descriptor, logos, otherAccount, currencies } = activity
const { ENSName } = useENSName(otherAccount)
const explorerUrl = getExplorerLink(activity.chainId, activity.hash, ExplorerDataType.TRANSACTION)
const timeSince = useTimeSince(activity.timestamp)
return (
<TraceEvent
events={[BrowserEvent.onClick]}
name={SharedEventName.ELEMENT_CLICKED}
element={InterfaceElementName.MINI_PORTFOLIO_ACTIVITY_ROW}
properties={{ hash: activity.hash, chain_id: chainId, explorer_url: explorerUrl }}
>
<PortfolioRow
left={
<Column>
<PortfolioLogo chainId={chainId} currencies={currencies} images={logos} accountAddress={otherAccount} />
</Column>
}
title={<ThemedText.SubHeader fontWeight={500}>{title}</ThemedText.SubHeader>}
descriptor={
<StyledDescriptor color="textSecondary">
{descriptor}
{ENSName ?? otherAccount}
</StyledDescriptor>
}
right={
status === TransactionStatus.Pending ? (
<LoaderV2 />
) : status === TransactionStatus.Confirmed ? (
<StyledTimestamp>{timeSince}</StyledTimestamp>
) : (
<AlertTriangleFilled />
)
}
onClick={() => window.open(explorerUrl, '_blank')}
/>
</TraceEvent>
)
}

View File

@@ -0,0 +1,512 @@
import { SupportedChainId, Token, TradeType as MockTradeType } from '@uniswap/sdk-core'
import { PERMIT2_ADDRESS } from '@uniswap/universal-router-sdk'
import { DAI as MockDAI, nativeOnChain, USDC_MAINNET as MockUSDC_MAINNET } from 'constants/tokens'
import { TransactionStatus as MockTxStatus } from 'graphql/data/__generated__/types-and-hooks'
import { TokenAddressMap } from 'state/lists/hooks'
import {
ExactInputSwapTransactionInfo,
ExactOutputSwapTransactionInfo,
TransactionDetails,
TransactionInfo,
TransactionType as MockTxType,
} from 'state/transactions/types'
import { renderHook } from 'test-utils/render'
import { parseLocalActivity, useLocalActivities } from './parseLocal'
function mockSwapInfo(
type: MockTradeType,
inputCurrency: Token,
inputCurrencyAmountRaw: string,
outputCurrency: Token,
outputCurrencyAmountRaw: string
): ExactInputSwapTransactionInfo | ExactOutputSwapTransactionInfo {
if (type === MockTradeType.EXACT_INPUT) {
return {
type: MockTxType.SWAP,
tradeType: MockTradeType.EXACT_INPUT,
inputCurrencyId: inputCurrency.address,
inputCurrencyAmountRaw,
outputCurrencyId: outputCurrency.address,
expectedOutputCurrencyAmountRaw: outputCurrencyAmountRaw,
minimumOutputCurrencyAmountRaw: outputCurrencyAmountRaw,
}
} else {
return {
type: MockTxType.SWAP,
tradeType: MockTradeType.EXACT_OUTPUT,
inputCurrencyId: inputCurrency.address,
expectedInputCurrencyAmountRaw: inputCurrencyAmountRaw,
maximumInputCurrencyAmountRaw: inputCurrencyAmountRaw,
outputCurrencyId: outputCurrency.address,
outputCurrencyAmountRaw,
}
}
}
const mockAccount1 = '0x000000000000000000000000000000000000000001'
const mockAccount2 = '0x000000000000000000000000000000000000000002'
const mockChainId = SupportedChainId.MAINNET
const mockSpenderAddress = PERMIT2_ADDRESS[mockChainId]
const mockCurrencyAmountRaw = '1000000000000000000'
const mockCurrencyAmountRawUSDC = '1000000'
function mockHash(id: string, status: MockTxStatus = MockTxStatus.Confirmed) {
return id + status
}
function mockCommonFields(id: string, account = mockAccount2, status: MockTxStatus) {
const hash = mockHash(id, status)
return {
hash,
from: account,
receipt:
status === MockTxStatus.Pending
? undefined
: {
transactionHash: hash,
status: status === MockTxStatus.Confirmed ? 1 : 0,
},
addedTime: 0,
}
}
function mockMultiStatus(info: TransactionInfo, id: string): [TransactionDetails, number][] {
// Mocks a transaction with multiple statuses
return [
[
{ info, ...mockCommonFields(id, mockAccount2, MockTxStatus.Pending) } as unknown as TransactionDetails,
mockChainId,
],
[
{ info, ...mockCommonFields(id, mockAccount2, MockTxStatus.Confirmed) } as unknown as TransactionDetails,
mockChainId,
],
[
{ info, ...mockCommonFields(id, mockAccount2, MockTxStatus.Failed) } as unknown as TransactionDetails,
mockChainId,
],
]
}
const mockTokenAddressMap: TokenAddressMap = {
[mockChainId]: {
[MockDAI.address]: { token: MockDAI },
[MockUSDC_MAINNET.address]: { token: MockUSDC_MAINNET },
} as TokenAddressMap[number],
}
jest.mock('../../../../state/lists/hooks', () => ({
useCombinedActiveList: () => mockTokenAddressMap,
}))
jest.mock('../../../../state/transactions/hooks', () => {
return {
useMultichainTransactions: (): [TransactionDetails, number][] => {
return [
[
{
info: mockSwapInfo(
MockTradeType.EXACT_INPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
...mockCommonFields('0x123', mockAccount1, MockTxStatus.Confirmed),
} as TransactionDetails,
mockChainId,
],
...mockMultiStatus(
mockSwapInfo(
MockTradeType.EXACT_OUTPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
'0xswap_exact_input'
),
...mockMultiStatus(
mockSwapInfo(
MockTradeType.EXACT_INPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
'0xswap_exact_output'
),
...mockMultiStatus(
{
type: MockTxType.APPROVAL,
tokenAddress: MockDAI.address,
spender: mockSpenderAddress,
},
'0xapproval'
),
...mockMultiStatus(
{
type: MockTxType.WRAP,
unwrapped: false,
currencyAmountRaw: mockCurrencyAmountRaw,
chainId: mockChainId,
},
'0xwrap'
),
...mockMultiStatus(
{
type: MockTxType.WRAP,
unwrapped: true,
currencyAmountRaw: mockCurrencyAmountRaw,
chainId: mockChainId,
},
'0xunwrap'
),
...mockMultiStatus(
{
type: MockTxType.ADD_LIQUIDITY_V3_POOL,
createPool: false,
baseCurrencyId: MockUSDC_MAINNET.address,
quoteCurrencyId: MockDAI.address,
feeAmount: 500,
expectedAmountBaseRaw: mockCurrencyAmountRawUSDC,
expectedAmountQuoteRaw: mockCurrencyAmountRaw,
},
'0xadd_liquidity_v3'
),
...mockMultiStatus(
{
type: MockTxType.REMOVE_LIQUIDITY_V3,
baseCurrencyId: MockUSDC_MAINNET.address,
quoteCurrencyId: MockDAI.address,
expectedAmountBaseRaw: mockCurrencyAmountRawUSDC,
expectedAmountQuoteRaw: mockCurrencyAmountRaw,
},
'0xremove_liquidity_v3'
),
...mockMultiStatus(
{
type: MockTxType.ADD_LIQUIDITY_V2_POOL,
baseCurrencyId: MockUSDC_MAINNET.address,
quoteCurrencyId: MockDAI.address,
expectedAmountBaseRaw: mockCurrencyAmountRawUSDC,
expectedAmountQuoteRaw: mockCurrencyAmountRaw,
},
'0xadd_liquidity_v2'
),
...mockMultiStatus(
{
type: MockTxType.COLLECT_FEES,
currencyId0: MockUSDC_MAINNET.address,
currencyId1: MockDAI.address,
expectedCurrencyOwed0: mockCurrencyAmountRawUSDC,
expectedCurrencyOwed1: mockCurrencyAmountRaw,
},
'0xcollect_fees'
),
...mockMultiStatus(
{
type: MockTxType.MIGRATE_LIQUIDITY_V3,
baseCurrencyId: MockUSDC_MAINNET.address,
quoteCurrencyId: MockDAI.address,
isFork: false,
},
'0xmigrate_v3_liquidity'
),
]
},
}
})
describe('parseLocalActivity', () => {
it('returns swap activity fields with known tokens, exact input', () => {
const details = {
info: mockSwapInfo(
MockTradeType.EXACT_INPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
receipt: {
transactionHash: '0x123',
status: 1,
},
} as TransactionDetails
const chainId = SupportedChainId.MAINNET
expect(parseLocalActivity(details, chainId, mockTokenAddressMap)).toEqual({
chainId: 1,
currencies: [MockUSDC_MAINNET, MockDAI],
descriptor: '1.00 USDC for 1.00 DAI',
hash: undefined,
receipt: {
id: '0x123',
info: {
type: 1,
tradeType: MockTradeType.EXACT_INPUT,
inputCurrencyId: MockUSDC_MAINNET.address,
inputCurrencyAmountRaw: mockCurrencyAmountRawUSDC,
outputCurrencyId: MockDAI.address,
expectedOutputCurrencyAmountRaw: mockCurrencyAmountRaw,
minimumOutputCurrencyAmountRaw: mockCurrencyAmountRaw,
},
receipt: { status: 1, transactionHash: '0x123' },
status: 'CONFIRMED',
transactionHash: '0x123',
},
status: 'CONFIRMED',
timestamp: NaN,
title: 'Swapped',
})
})
it('returns swap activity fields with known tokens, exact output', () => {
const details = {
info: mockSwapInfo(
MockTradeType.EXACT_OUTPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
receipt: {
transactionHash: '0x123',
status: 1,
},
} as TransactionDetails
const chainId = SupportedChainId.MAINNET
expect(parseLocalActivity(details, chainId, mockTokenAddressMap)).toMatchObject({
chainId: 1,
currencies: [MockUSDC_MAINNET, MockDAI],
descriptor: '1.00 USDC for 1.00 DAI',
status: 'CONFIRMED',
title: 'Swapped',
})
})
it('returns swap activity fields with unknown tokens', () => {
const details = {
info: mockSwapInfo(
MockTradeType.EXACT_INPUT,
MockUSDC_MAINNET,
mockCurrencyAmountRawUSDC,
MockDAI,
mockCurrencyAmountRaw
),
receipt: {
transactionHash: '0x123',
status: 1,
},
} as TransactionDetails
const chainId = SupportedChainId.MAINNET
const tokens = {} as TokenAddressMap
expect(parseLocalActivity(details, chainId, tokens)).toMatchObject({
chainId: 1,
currencies: [undefined, undefined],
descriptor: 'Unknown for Unknown',
status: 'CONFIRMED',
title: 'Swapped',
})
})
it('only returns activity for the current account', () => {
const account1Activites = renderHook(() => useLocalActivities(mockAccount1)).result.current
const account2Activites = renderHook(() => useLocalActivities(mockAccount2)).result.current
expect(Object.values(account1Activites)).toHaveLength(1)
expect(Object.values(account2Activites)).toHaveLength(30)
})
it('Properly uses correct tense of activity title based on tx status', () => {
const activities = renderHook(() => useLocalActivities(mockAccount2)).result.current
expect(activities[mockHash('0xswap_exact_input', MockTxStatus.Pending)]?.title).toEqual('Swapping')
expect(activities[mockHash('0xswap_exact_input', MockTxStatus.Confirmed)]?.title).toEqual('Swapped')
expect(activities[mockHash('0xswap_exact_input', MockTxStatus.Failed)]?.title).toEqual('Swap failed')
})
it('Adapts Swap exact input to Activity type', () => {
const hash = mockHash('0xswap_exact_input')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Swapped',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} for 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts Swap exact output to Activity type', () => {
const hash = mockHash('0xswap_exact_output')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Swapped',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} for 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts Approval to Activity type', () => {
const hash = mockHash('0xapproval')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockDAI],
title: 'Approved',
descriptor: MockDAI.symbol,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts Wrap to Activity type', () => {
const hash = mockHash('0xwrap')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
const native = nativeOnChain(mockChainId)
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [native, native.wrapped],
title: 'Wrapped',
descriptor: `1.00 ${native.symbol} for 1.00 ${native.wrapped.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts Unwrap to Activity type', () => {
const hash = mockHash('0xunwrap')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
const native = nativeOnChain(mockChainId)
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [native.wrapped, native],
title: 'Unwrapped',
descriptor: `1.00 ${native.wrapped.symbol} for 1.00 ${native.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts AddLiquidityV3 to Activity type', () => {
const hash = mockHash('0xadd_liquidity_v3')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Added liquidity',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} and 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts RemoveLiquidityV3 to Activity type', () => {
const hash = mockHash('0xremove_liquidity_v3')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Removed liquidity',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} and 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts RemoveLiquidityV2 to Activity type', () => {
const hash = mockHash('0xadd_liquidity_v2')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Added V2 liquidity',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} and 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts CollectFees to Activity type', () => {
const hash = mockHash('0xcollect_fees')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Collected fees',
descriptor: `1.00 ${MockUSDC_MAINNET.symbol} and 1.00 ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
it('Adapts MigrateLiquidityV3 to Activity type', () => {
const hash = mockHash('0xmigrate_v3_liquidity')
const activity = renderHook(() => useLocalActivities(mockAccount2)).result.current[hash]
expect(activity).toMatchObject({
chainId: mockChainId,
currencies: [MockUSDC_MAINNET, MockDAI],
title: 'Migrated liquidity',
descriptor: `${MockUSDC_MAINNET.symbol} and ${MockDAI.symbol}`,
hash,
status: MockTxStatus.Confirmed,
receipt: {
id: hash,
status: MockTxStatus.Confirmed,
},
})
})
})

View File

@@ -2,7 +2,6 @@ import { t } from '@lingui/macro'
import { formatCurrencyAmount } from '@uniswap/conedison/format'
import { Currency, CurrencyAmount, TradeType } from '@uniswap/sdk-core'
import { nativeOnChain } from '@uniswap/smart-order-router'
import { useWeb3React } from '@web3-react/core'
import { SupportedChainId } from 'constants/chains'
import { TransactionPartsFragment, TransactionStatus } from 'graphql/data/__generated__/types-and-hooks'
import { useMemo } from 'react'
@@ -26,20 +25,22 @@ import {
import { getActivityTitle } from '../constants'
import { Activity, ActivityMap } from './types'
function getCurrency(currencyId: string, chainId: SupportedChainId, tokens: TokenAddressMap) {
return currencyId === 'ETH' ? nativeOnChain(chainId) : tokens[chainId][currencyId].token
function getCurrency(currencyId: string, chainId: SupportedChainId, tokens: TokenAddressMap): Currency | undefined {
return currencyId === 'ETH' ? nativeOnChain(chainId) : tokens[chainId]?.[currencyId]?.token
}
function buildCurrencyDescriptor(
currencyA: Currency,
currencyA: Currency | undefined,
amtA: string,
currencyB: Currency,
currencyB: Currency | undefined,
amtB: string,
delimiter = t`for`
) {
const formattedA = formatCurrencyAmount(CurrencyAmount.fromRawAmount(currencyA, amtA))
const formattedB = formatCurrencyAmount(CurrencyAmount.fromRawAmount(currencyB, amtB))
return `${formattedA} ${currencyA.symbol} ${delimiter} ${formattedB} ${currencyB.symbol}`
const formattedA = currencyA ? formatCurrencyAmount(CurrencyAmount.fromRawAmount(currencyA, amtA)) : t`Unknown`
const symbolA = currencyA?.symbol ?? ''
const formattedB = currencyB ? formatCurrencyAmount(CurrencyAmount.fromRawAmount(currencyB, amtB)) : t`Unknown`
const symbolB = currencyB?.symbol ?? ''
return [formattedA, symbolA, delimiter, formattedB, symbolB].filter(Boolean).join(' ')
}
function parseSwap(
@@ -79,7 +80,7 @@ function parseApproval(
): Partial<Activity> {
// TODO: Add 'amount' approved to ApproveTransactionInfo so we can distinguish between revoke and approve
const currency = getCurrency(approval.tokenAddress, chainId, tokens)
const descriptor = t`${currency.symbol ?? currency.name}`
const descriptor = currency?.symbol ?? currency?.name ?? t`Unknown`
return {
descriptor,
currencies: [currency],
@@ -120,82 +121,82 @@ function parseMigrateCreateV3(
tokens: TokenAddressMap
): Partial<Activity> {
const baseCurrency = getCurrency(lp.baseCurrencyId, chainId, tokens)
const quoteCurrency = getCurrency(lp.baseCurrencyId, chainId, tokens)
const descriptor = t`${baseCurrency.symbol} and ${quoteCurrency.symbol}`
const baseSymbol = baseCurrency?.symbol ?? t`Unknown`
const quoteCurrency = getCurrency(lp.quoteCurrencyId, chainId, tokens)
const quoteSymbol = quoteCurrency?.symbol ?? t`Unknown`
const descriptor = t`${baseSymbol} and ${quoteSymbol}`
return { descriptor, currencies: [baseCurrency, quoteCurrency] }
}
function parseLocalActivity(
export function parseLocalActivity(
details: TransactionDetails,
chainId: SupportedChainId,
tokens: TokenAddressMap
): Activity | undefined {
const status = !details.receipt
? TransactionStatus.Pending
: details.receipt.status === 1 || details.receipt?.status === undefined
? TransactionStatus.Confirmed
: TransactionStatus.Failed
try {
const status = !details.receipt
? TransactionStatus.Pending
: details.receipt.status === 1 || details.receipt?.status === undefined
? TransactionStatus.Confirmed
: TransactionStatus.Failed
const receipt: TransactionPartsFragment | undefined = details.receipt
? {
id: details.receipt.transactionHash,
...details.receipt,
...details,
status,
}
: undefined
const receipt: TransactionPartsFragment | undefined = details.receipt
? {
id: details.receipt.transactionHash,
...details.receipt,
...details,
status,
}
: undefined
const defaultFields = {
hash: details.hash,
chainId,
title: getActivityTitle(details.info.type, status),
status,
timestamp: (details.confirmedTime ?? details.addedTime) / 1000,
receipt,
const defaultFields = {
hash: details.hash,
chainId,
title: getActivityTitle(details.info.type, status),
status,
timestamp: (details.confirmedTime ?? details.addedTime) / 1000,
receipt,
}
let additionalFields: Partial<Activity> = {}
const info = details.info
if (info.type === TransactionType.SWAP) {
additionalFields = parseSwap(info, chainId, tokens)
} else if (info.type === TransactionType.APPROVAL) {
additionalFields = parseApproval(info, chainId, tokens)
} else if (info.type === TransactionType.WRAP) {
additionalFields = parseWrap(info, chainId, status)
} else if (
info.type === TransactionType.ADD_LIQUIDITY_V3_POOL ||
info.type === TransactionType.REMOVE_LIQUIDITY_V3 ||
info.type === TransactionType.ADD_LIQUIDITY_V2_POOL
) {
additionalFields = parseLP(info, chainId, tokens)
} else if (info.type === TransactionType.COLLECT_FEES) {
additionalFields = parseCollectFees(info, chainId, tokens)
} else if (info.type === TransactionType.MIGRATE_LIQUIDITY_V3 || info.type === TransactionType.CREATE_V3_POOL) {
additionalFields = parseMigrateCreateV3(info, chainId, tokens)
}
return { ...defaultFields, ...additionalFields }
} catch (error) {
console.debug(`Failed to parse transaction ${details.hash}`, error)
return undefined
}
let additionalFields: Partial<Activity> = {}
const info = details.info
if (info.type === TransactionType.SWAP) {
additionalFields = parseSwap(info, chainId, tokens)
} else if (info.type === TransactionType.APPROVAL) {
additionalFields = parseApproval(info, chainId, tokens)
} else if (info.type === TransactionType.WRAP) {
additionalFields = parseWrap(info, chainId, status)
} else if (
info.type === TransactionType.ADD_LIQUIDITY_V3_POOL ||
info.type === TransactionType.REMOVE_LIQUIDITY_V3 ||
info.type === TransactionType.ADD_LIQUIDITY_V2_POOL
) {
additionalFields = parseLP(info, chainId, tokens)
} else if (info.type === TransactionType.COLLECT_FEES) {
additionalFields = parseCollectFees(info, chainId, tokens)
} else if (info.type === TransactionType.MIGRATE_LIQUIDITY_V3 || info.type === TransactionType.CREATE_V3_POOL) {
additionalFields = parseMigrateCreateV3(info, chainId, tokens)
}
return { ...defaultFields, ...additionalFields }
}
export function useLocalActivities(): ActivityMap | undefined {
export function useLocalActivities(account: string): ActivityMap {
const allTransactions = useMultichainTransactions()
const { chainId } = useWeb3React()
const tokens = useCombinedActiveList()
return useMemo(
() =>
chainId
? allTransactions.reduce((acc: { [hash: string]: Activity }, [transaction, chainId]) => {
try {
const localActivity = parseLocalActivity(transaction, chainId, tokens)
if (localActivity) acc[localActivity.hash] = localActivity
} catch (error) {
console.error('Failed to parse local activity', transaction)
}
return acc
}, {})
: undefined,
[allTransactions, chainId, tokens]
)
return useMemo(() => {
const activityByHash: ActivityMap = {}
for (const [transaction, chainId] of allTransactions) {
if (transaction.from !== account) continue
activityByHash[transaction.hash] = parseLocalActivity(transaction, chainId, tokens)
}
return activityByHash
}, [account, allTransactions, tokens])
}

View File

@@ -12,7 +12,7 @@ export type Activity = {
title: string
descriptor?: string
logos?: Array<string | undefined>
currencies?: Array<Currency>
currencies?: Array<Currency | undefined>
otherAccount?: string
receipt?: Receipt
}

View File

@@ -1,10 +1,11 @@
import { sendAnalyticsEvent, useTrace } from '@uniswap/analytics'
import { InterfaceElementName, SharedEventName } from '@uniswap/analytics-events'
import { useToggleAccountDrawer } from 'components/AccountDrawer'
import Column from 'components/Column'
import Row from 'components/Row'
import { useToggleWalletDrawer } from 'components/WalletDropdown'
import { Box } from 'nft/components/Box'
import { NftCard } from 'nft/components/card'
import { detailsHref } from 'nft/components/card/utils'
import { VerifiedIcon } from 'nft/components/icons'
import { WalletAsset } from 'nft/types'
import { floorFormatter } from 'nft/utils'
@@ -45,13 +46,13 @@ export function NFT({
mediaShouldBePlaying: boolean
setCurrentTokenPlayingMedia: (tokenId: string | undefined) => void
}) {
const toggleWalletDrawer = useToggleWalletDrawer()
const toggleWalletDrawer = useToggleAccountDrawer()
const navigate = useNavigate()
const trace = useTrace()
const navigateToNFTDetails = () => {
navigate(`/nfts/asset/${asset.asset_contract.address}/${asset.tokenId}`)
toggleWalletDrawer()
navigate(detailsHref(asset))
}
return (
@@ -62,10 +63,7 @@ export function NFT({
display={{ disabledInfo: true }}
isSelected={false}
isDisabled={false}
selectAsset={navigateToNFTDetails}
unselectAsset={() => {
/* */
}}
onCardClick={navigateToNFTDetails}
sendAnalyticsEvent={() =>
sendAnalyticsEvent(SharedEventName.ELEMENT_CLICKED, {
element: InterfaceElementName.MINI_PORTFOLIO_NFT_ITEM,
@@ -77,6 +75,7 @@ export function NFT({
}
mediaShouldBePlaying={mediaShouldBePlaying}
setCurrentTokenPlayingMedia={setCurrentTokenPlayingMedia}
testId="mini-portfolio-nft"
/>
<NFTDetails asset={asset} />
</NFTContainer>

View File

@@ -5,13 +5,22 @@ import { useState } from 'react'
import InfiniteScroll from 'react-infinite-scroll-component'
import styled from 'styled-components/macro'
import { useToggleWalletDrawer } from '..'
import { DEFAULT_NFT_QUERY_AMOUNT } from './constants'
import { NFT } from './NFT'
import { useAccountDrawer } from '../..'
import { DEFAULT_NFT_QUERY_AMOUNT } from '../constants'
import { NFT } from './NFTItem'
export default function NFTs({ account }: { account: string }) {
const { walletAssets, loading, hasNext, loadMore } = useNftBalance(account, [], [], DEFAULT_NFT_QUERY_AMOUNT)
const toggleWalletDrawer = useToggleWalletDrawer()
const [walletDrawerOpen, toggleWalletDrawer] = useAccountDrawer()
const { walletAssets, loading, hasNext, loadMore } = useNftBalance(
account,
[],
[],
DEFAULT_NFT_QUERY_AMOUNT,
undefined,
undefined,
undefined,
!walletDrawerOpen
)
const [currentTokenPlayingMedia, setCurrentTokenPlayingMedia] = useState<string | undefined>()

View File

@@ -0,0 +1,67 @@
import { BigNumber } from '@ethersproject/bignumber'
import { SupportedChainId, WETH9 } from '@uniswap/sdk-core'
import { FeeAmount, Pool, Position } from '@uniswap/v3-sdk'
import { USDC_MAINNET } from 'constants/tokens'
import { mocked } from 'test-utils/mocked'
import { render } from 'test-utils/render'
import Pools from '.'
import useMultiChainPositions from './useMultiChainPositions'
jest.mock('./useMultiChainPositions')
const owner = '0xf5b6bb25f5beaea03dd014c6ef9fa9f3926bf36c'
const pool = new Pool(
USDC_MAINNET,
WETH9[SupportedChainId.MAINNET],
FeeAmount.MEDIUM,
'1851127709498178402383049949138810',
'7076437181775065414',
201189
)
const position = new Position({
pool,
liquidity: 1341008833950736,
tickLower: 200040,
tickUpper: 202560,
})
const details = {
nonce: BigNumber.from('0'),
tokenId: BigNumber.from('0'),
operator: '0x0',
token0: USDC_MAINNET.address,
token1: WETH9[SupportedChainId.MAINNET].address,
fee: FeeAmount.MEDIUM,
tickLower: -100,
tickUpper: 100,
liquidity: BigNumber.from('9000'),
feeGrowthInside0LastX128: BigNumber.from('0'),
feeGrowthInside1LastX128: BigNumber.from('0'),
tokensOwed0: BigNumber.from('0'),
tokensOwed1: BigNumber.from('0'),
}
const useMultiChainPositionsReturnValue = {
positions: [
{
owner,
chainId: SupportedChainId.MAINNET,
position,
pool,
details,
inRange: true,
closed: false,
},
],
loading: false,
}
beforeEach(() => {
mocked(useMultiChainPositions).mockReturnValue(useMultiChainPositionsReturnValue)
})
test('Pools should render LP positions', () => {
const props = { account: owner }
const { container } = render(<Pools {...props} />)
expect(container).not.toBeEmptyDOMElement()
})

View File

@@ -4,16 +4,16 @@ import { BrowserEvent, InterfaceElementName, SharedEventName } from '@uniswap/an
import { formatNumber, NumberType } from '@uniswap/conedison/format'
import { Position } from '@uniswap/v3-sdk'
import { useWeb3React } from '@web3-react/core'
import { useToggleAccountDrawer } from 'components/AccountDrawer'
import Row from 'components/Row'
import { MouseoverTooltip } from 'components/Tooltip'
import { useToggleWalletDrawer } from 'components/WalletDropdown'
import { useFilterPossiblyMaliciousPositions } from 'hooks/useFilterPossiblyMaliciousPositions'
import { EmptyWalletModule } from 'nft/components/profile/view/EmptyWalletContent'
import { useCallback, useMemo, useReducer } from 'react'
import { useNavigate } from 'react-router-dom'
import styled from 'styled-components/macro'
import { ThemedText } from 'theme'
import { switchChain } from 'utils/switchChain'
import { hasURL } from 'utils/urlChecks'
import { ExpandoRow } from '../ExpandoRow'
import { PortfolioLogo } from '../PortfolioLogo'
@@ -22,24 +22,55 @@ import { PositionInfo } from './cache'
import { useFeeValues } from './hooks'
import useMultiChainPositions from './useMultiChainPositions'
/*
This hook takes an array of PositionInfo objects (format used by the Uniswap Labs gql API).
The hook access PositionInfo.details (format used by the NFT position contract),
filters the PositionDetails data for malicious content,
and then returns the original data in its original format.
*/
function useFilterPossiblyMaliciousPositionInfo(positions: PositionInfo[] | undefined): PositionInfo[] {
const tokenIdsToPositionInfo: Record<string, PositionInfo> = useMemo(
() =>
positions
? positions.reduce((acc, position) => ({ ...acc, [position.details.tokenId.toString()]: position }), {})
: {},
[positions]
)
const positionDetails = useMemo(() => positions?.map((position) => position.details) ?? [], [positions])
const filteredPositionDetails = useFilterPossiblyMaliciousPositions(positionDetails)
return useMemo(
() => filteredPositionDetails.map((positionDetails) => tokenIdsToPositionInfo[positionDetails.tokenId.toString()]),
[filteredPositionDetails, tokenIdsToPositionInfo]
)
}
export default function Pools({ account }: { account: string }) {
const { positions, loading } = useMultiChainPositions(account)
const filteredPositions = useFilterPossiblyMaliciousPositionInfo(positions)
const [showClosed, toggleShowClosed] = useReducer((showClosed) => !showClosed, false)
const [openPositions, closedPositions] = useMemo(() => {
const openPositions: PositionInfo[] = []
const closedPositions: PositionInfo[] = []
positions?.forEach((position) => (position.closed ? closedPositions : openPositions).push(position))
for (let i = 0; i < filteredPositions.length; i++) {
const position = filteredPositions[i]
if (position.closed) {
closedPositions.push(position)
} else {
openPositions.push(position)
}
}
return [openPositions, closedPositions]
}, [positions])
}, [filteredPositions])
const toggleWalletDrawer = useToggleWalletDrawer()
const toggleWalletDrawer = useToggleAccountDrawer()
if (!positions || loading) {
if (!filteredPositions || loading) {
return <PortfolioSkeleton />
}
if (positions?.length === 0) {
if (filteredPositions.length === 0) {
return <EmptyWalletModule type="pool" onNavigateClick={toggleWalletDrawer} />
}
@@ -93,7 +124,7 @@ function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) {
const liquidityValue = calculcateLiquidityValue(priceA, priceB, position)
const navigate = useNavigate()
const toggleWalletDrawer = useToggleWalletDrawer()
const toggleWalletDrawer = useToggleAccountDrawer()
const { chainId: walletChainId, connector } = useWeb3React()
const onClick = useCallback(async () => {
if (walletChainId !== chainId) await switchChain(connector, chainId)
@@ -111,18 +142,6 @@ function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) {
[chainId, pool.token0.address, pool.token0.symbol, pool.token1.address, pool.token1.symbol]
)
const containsURL = useMemo(
() =>
[pool.token0.name, pool.token0.symbol, pool.token1.name, pool.token1.symbol].some((testString) =>
hasURL(testString)
),
[pool]
)
if (containsURL) {
return null
}
return (
<TraceEvent
events={[BrowserEvent.onClick]}
@@ -135,7 +154,7 @@ function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) {
left={<PortfolioLogo chainId={chainId} currencies={[pool.token0, pool.token1]} />}
title={
<Row>
<ThemedText.SubHeader fontWeight={500}>
<ThemedText.SubHeader>
{pool.token0.symbol} / {pool.token1?.symbol}
</ThemedText.SubHeader>
</Row>
@@ -154,7 +173,7 @@ function PositionListItem({ positionInfo }: { positionInfo: PositionInfo }) {
</div>
}
>
<ThemedText.SubHeader fontWeight={500}>
<ThemedText.SubHeader>
{formatNumber((liquidityValue ?? 0) + (feeValue ?? 0), NumberType.PortfolioBalance)}
</ThemedText.SubHeader>
</MouseoverTooltip>

Some files were not shown because too many files have changed in this diff Show More