Merge pull request #47 from mars-protocol/v1.7.2

v1.7.2
This commit is contained in:
Linkie Link 2023-11-14 18:25:07 +01:00 committed by GitHub
commit b493b21e43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
117 changed files with 2007 additions and 1239 deletions

View File

@ -14,4 +14,6 @@ NEXT_PUBLIC_NEUTRON_TEST_GQL=APP_NEXT_NEUTRON_TEST_GQL
# NEUTRON-1 #
NEXT_PUBLIC_NEUTRON_RPC=APP_NEXT_NEUTRON_RPC
NEXT_PUBLIC_NEUTRON_REST=APP_NEXT_NEUTRON_REST
NEXT_PUBLIC_NEUTRON_GQL=APP_NEXT_NEUTRON_GQL
NEXT_PUBLIC_NEUTRON_GQL=APP_NEXT_NEUTRON_GQL
NEXT_PUBLIC_WALLET_CONNECT_ID=APP_NEXT_WALLET_CONNECT_ID

View File

@ -39,6 +39,7 @@ We allow the use of environment variables to be passed to the Docker container t
| URL_NEUTRON_TEST_GQL | The Neutron Testnet Hive GraphQL endpoint to use | https://testnet-neutron-gql.marsprotocol.io/graphql |
| URL_NEUTRON_TEST_REST | The Neutron Testnet node REST endpoint to use | https://rest-palvus.pion-1.ntrn.tech |
| URL_NEUTRON_TEST_RPC | The Neutron Testnet node RPC endpoint to use | https://rpc-palvus.pion-1.ntrn.tech |
| WALLET_CONNECT_ID | Your projecta WalletConnect v2 ID | 0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x |
**Sample Docker run command**
@ -54,7 +55,8 @@ docker run -it -p 3000:3000 \
-e URL_NEUTRON_RPC=https://rpc-kralum.neutron-1.neutron.org \
-e URL_NEUTRON_TEST_GQL=https://testnet-neutron-gql.marsprotocol.io/graphql \
-e URL_NEUTRON_TEST_REST=https://rest-palvus.pion-1.ntrn.tech \
-e URL_NEUTRON_TEST_RPC=https://rpc-palvus.pion-1.ntrn.tech marsprotocol/interface:latest
-e URL_NEUTRON_TEST_RPC=https://rpc-palvus.pion-1.ntrn.tech \
-e WALLET_CONNECT_ID=0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x marsprotocol/interface:latest
```
## 3. Text and translations

View File

@ -13,6 +13,7 @@ echo "APP_NEXT_NEUTRON_GQL=$URL_NEUTRON_GQL" >> $envFilename
echo "APP_NEXT_NEUTRON_TEST_RPC=$URL_NEUTRON_TEST_RPC" >> $envFilename
echo "APP_NEXT_NEUTRON_TEST_REST=$URL_NEUTRON_TEST_REST" >> $envFilename
echo "APP_NEXT_NEUTRON_TEST_GQL=$URL_NEUTRON_TEST_GQL" >> $envFilename
echo "APP_NEXT_WALLET_CONNECT_ID=$WALLET_CONNECT_ID" >> $envFilename
function apply_path {
# read all config file
while read line; do

View File

@ -1,16 +0,0 @@
diff --git a/next.config.js b/next.config.js
index 2801090..4b5fabe 100644
--- a/next.config.js
+++ b/next.config.js
@@ -48,6 +48,11 @@ const moduleExports = {
},
]
},
+ sentry: {
+ disableServerWebpackPlugin: true,
+ disableClientWebpackPlugin: true,
+ },
+ output: 'standalone'
}
const sentryWebpackPluginOptions = {

View File

@ -1,7 +1,7 @@
{
"name": "mars",
"homepage": "./",
"version": "1.7.1",
"version": "1.7.2",
"private": false,
"license": "SEE LICENSE IN LICENSE FILE",
"scripts": {
@ -22,7 +22,8 @@
"@cosmjs/launchpad": "^0.27.1",
"@cosmjs/proto-signing": "^0.31.1",
"@cosmjs/stargate": "^0.31.1",
"@marsprotocol/wallet-connector": "^2.1.3",
"@delphi-labs/shuttle-react": "^3.10.0",
"@keplr-wallet/cosmos": "^0.12.40",
"@material-ui/core": "^4.12.4",
"@material-ui/icons": "^4.11.3",
"@ramonak/react-progress-bar": "^5.0.3",
@ -56,6 +57,7 @@
"react-device-detect": "^2.2.2",
"react-dom": "^18.2.0",
"react-i18next": "^12.1.5",
"react-qr-code": "^2.0.12",
"react-spring": "^9.6.1",
"react-table": "^7.8.0",
"react-use-clipboard": "^1.0.9",

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

View File

@ -18,6 +18,7 @@ interface Props {
text?: string | ReactNode
variant?: 'solid' | 'transparent' | 'round'
onClick?: (e: any) => void
children?: ReactNode
}
export const Button = React.forwardRef<any, Props>(
@ -36,6 +37,7 @@ export const Button = React.forwardRef<any, Props>(
text,
variant = 'solid',
onClick,
children,
},
ref,
) => {
@ -56,6 +58,7 @@ export const Button = React.forwardRef<any, Props>(
ref={ref}
style={styleOverride}
>
{children && !showProgressIndicator && children}
{prefix && !showProgressIndicator && <span className={styles.prefix}>{prefix}</span>}
{text && (
<span className={styles.text}>

View File

@ -1,12 +1,4 @@
import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'
import {
getChainInfo,
getClient,
useWallet,
useWalletManager,
WalletConnectionStatus,
} from '@marsprotocol/wallet-connector'
import { useQueryClient } from '@tanstack/react-query'
import { MigrationInProgress } from 'components/common'
import {
useBlockHeight,
useDepositAndDebt,
@ -21,29 +13,18 @@ import { useAssetParams } from 'hooks/queries/useAssetParams'
import { useMarsPrice } from 'hooks/queries/useMarsPrice'
import { usePythVaa } from 'hooks/queries/usePythVaa'
import { useUserCollaterals } from 'hooks/queries/useUserCollaterals'
import { ReactNode, useEffect, useState } from 'react'
import { getCurrentChainId } from 'libs/chainId'
import { getNetworkConfig, getNetworkVaultConfig } from 'libs/networkConfig'
import { ReactNode, useEffect } from 'react'
import useStore from 'store'
import { State } from 'types/enums'
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
import { MigrationInProgress } from '../MigrationInProgress/MigrationInProgress'
import { ChainInfoID } from 'types/enums/wallet'
interface CommonContainerProps {
children: ReactNode
}
export const CommonContainer = ({ children }: CommonContainerProps) => {
useAssetParams()
// ------------------
// EXTERNAL HOOKS
// ---------------
const { simulate, sign, broadcast } = useWallet()
const { status, connectedWallet } = useWalletManager()
const queryClient = useQueryClient()
const [cosmWasmClient, setCosmWasmClient] = useState<CosmWasmClient | undefined>()
// ------------------
// STORE STATE
// ------------------
@ -52,97 +33,46 @@ export const CommonContainer = ({ children }: CommonContainerProps) => {
const chainId = useStore((s) => s.currentNetwork)
const exchangeRates = useStore((s) => s.exchangeRates)
const exchangeRatesState = useStore((s) => s.exchangeRatesState)
const networkConfig = useStore((s) => s.networkConfig)
const marketDeposits = useStore((s) => s.marketDeposits)
const marketInfo = useStore((s) => s.marketInfo)
const migrationInProgress = useStore((s) => s.migrationInProgress)
const paramsAddress = useStore((s) => s.networkConfig.contracts.params)
const redBankState = useStore((s) => s.redBankState)
const rpc = useStore((s) => s.networkConfig.rpcUrl)
const userBalances = useStore((s) => s.userBalances)
const userBalancesState = useStore((s) => s.userBalancesState)
const userDebts = useStore((s) => s.userDebts)
const currentNetwork = useStore((s) => s.currentNetwork)
const userDeposits = useStore((s) => s.userDeposits)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const setRedBankAssets = useStore((s) => s.setRedBankAssets)
const setLcdClient = useStore((s) => s.setLcdClient)
const setChainInfo = useStore((s) => s.setChainInfo)
const setUserBalancesState = useStore((s) => s.setUserBalancesState)
// ------------------
// SETTERS
// ------------------
useEffect(() => {
if (status !== WalletConnectionStatus.Connected && cosmWasmClient) {
setCosmWasmClient(undefined)
useStore.setState({
client: undefined,
creditManagerClient: undefined,
accountNftClient: undefined,
paramsClient: undefined,
userWalletAddress: '',
})
}
}, [status, cosmWasmClient])
useEffect(() => {
const chainInfo = getChainInfo(chainId, {
rpc: networkConfig.rpcUrl,
rest: networkConfig.restUrl,
})
setChainInfo(chainInfo)
}, [chainId, networkConfig, setChainInfo])
useEffect(() => {
if (!connectedWallet || connectedWallet.network.chainId !== chainId) return
useStore.setState({
userWalletAddress: connectedWallet.account.address,
isLedger: connectedWallet.account.isLedger,
})
}, [connectedWallet, chainId])
useEffect(() => {
if (!rpc || !chainId) return
setLcdClient(rpc, chainId)
}, [rpc, chainId, setLcdClient])
useEffect(() => {
const currentChainId = getCurrentChainId()
useStore.setState({
networkConfig: getNetworkConfig(currentChainId),
vaultConfigs: getNetworkVaultConfig(currentChainId),
currentNetwork: currentChainId as ChainInfoID,
})
}, [])
useEffect(() => {
if (userBalances) {
setUserBalancesState(State.READY)
} else {
setUserBalancesState(State.ERROR)
}
}, [userDebts, userDeposits, userBalances, setUserBalancesState])
useEffect(() => {
if (!connectedWallet || connectedWallet.network.chainId !== chainId) return
if (!cosmWasmClient) {
const getCosmWasmClient = async () => {
const cosmClient = await getClient(networkConfig.rpcUrl)
setCosmWasmClient(cosmClient)
}
getCosmWasmClient()
return
}
useStore.setState({
client: {
broadcast,
cosmWasmClient,
connectedWallet,
sign,
simulate,
},
})
}, [simulate, sign, connectedWallet, cosmWasmClient, broadcast, networkConfig, chainId])
useEffect(() => {
if (!paramsAddress || !cosmWasmClient) return
useStore.setState({ paramsClient: new MarsParamsQueryClient(cosmWasmClient, paramsAddress) })
}, [cosmWasmClient, paramsAddress])
}, [userWalletAddress, userDebts, userDeposits, userBalances, setUserBalancesState])
useEffect(() => {
setRedBankAssets()
@ -153,22 +83,20 @@ export const CommonContainer = ({ children }: CommonContainerProps) => {
redBankState,
userBalancesState,
exchangeRates,
currentNetwork,
marketInfo,
userDebts,
userDeposits,
whitelistedAssets,
marketDeposits,
userWalletAddress,
setRedBankAssets,
])
useEffect(() => {
queryClient.removeQueries()
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [userWalletAddress])
// ------------------
// QUERY RELATED
// ------------------
useAssetParams()
useUsdPrice()
useBlockHeight()
useUserBalance()

View File

@ -2,6 +2,7 @@ import { useVaultParams } from 'hooks/queries/useVaultParams'
import { ReactNode, useEffect } from 'react'
import useStore from 'store'
import { AccountNftClient, CreditManagerClient } from 'types/classes'
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
interface FieldsContainerProps {
children: ReactNode
@ -27,6 +28,9 @@ export const FieldsContainer = ({ children }: FieldsContainerProps) => {
useStore.setState({
creditManagerClient: new CreditManagerClient(creditManagerAddress, client),
accountNftClient: new AccountNftClient(accountNftContractAddress, client),
paramsClient: networkConfig.contracts.params
? new MarsParamsQueryClient(client.cosmWasmClient, networkConfig.contracts.params)
: undefined,
apys: null,
})

View File

@ -1,8 +0,0 @@
@import 'src/styles/master';
.loader {
display: flex;
flex: 0 0 100%;
justify-content: center;
@include margin(4, 0);
}

View File

@ -1,59 +0,0 @@
import { WalletID, WalletManagerProvider } from '@marsprotocol/wallet-connector'
import { CircularProgress, SVG } from 'components/common'
import { SUPPORTED_CHAINS } from 'constants/appConstants'
import { getCurrentChainId } from 'libs/chainId'
import { useEffect } from 'react'
import useStore from 'store'
import styles from './CosmosWalletConnectProvider.module.scss'
type Props = {
children?: React.ReactNode
}
export const CosmosWalletConnectProvider = ({ children }: Props) => {
const currentNetwork = useStore((s) => s.currentNetwork)
const setCurrentNetwork = useStore((s) => s.setCurrentNetwork)
const loadNetworkConfig = useStore((s) => s.loadNetworkConfig)
const networkConfig = useStore((s) => s.networkConfig)
useEffect(() => {
setCurrentNetwork(getCurrentChainId())
loadNetworkConfig()
}, [loadNetworkConfig, setCurrentNetwork])
const supportedChains = SUPPORTED_CHAINS.map((chain) => chain.chainId)
return (
<WalletManagerProvider
chainInfoOverrides={{
rpc: networkConfig.rpcUrl,
rest: networkConfig.restUrl,
}}
walletConnectProjectId='d93fdffb159bae5ec87d8fee4cdbb045'
chainIds={supportedChains}
closeIcon={<SVG.Close />}
defaultChainId={currentNetwork}
enabledWallets={[
WalletID.Keplr,
WalletID.Xdefi,
WalletID.Leap,
WalletID.LeapMetaMaskSnap,
WalletID.Station,
WalletID.Cosmostation,
WalletID.Vectis,
WalletID.KeplrMobile,
WalletID.LeapMobile,
WalletID.CosmostationMobile,
]}
persistent
renderLoader={() => (
<div className={styles.loader}>
<CircularProgress size={30} />
</div>
)}
>
{children}
</WalletManagerProvider>
)
}

View File

@ -1,9 +1,9 @@
import { WalletID } from '@marsprotocol/wallet-connector'
import { SVG } from 'components/common'
import { getCouncilLink } from 'libs/council'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { DocURL } from 'types/enums/docURL'
import { WalletID } from 'types/enums/wallet'
import packageInfo from '../../../../package.json'
import styles from './Footer.module.scss'

View File

@ -1,14 +1,15 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import { useQueryClient } from '@tanstack/react-query'
import classNames from 'classnames'
import { Button } from 'components/common'
import { CHAIN_ID_KEY, SUPPORTED_CHAINS } from 'constants/appConstants'
import useCurrentWallet from 'hooks/wallet/useCurrentWallet'
import { getNetworkConfig } from 'libs/networkConfig'
import Image from 'next/image'
import { useState } from 'react'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { State } from 'types/enums'
import { ChainInfoID, WalletID } from 'types/enums/wallet'
import styles from './ChainSelect.module.scss'
@ -54,6 +55,7 @@ export const ChainSelect = () => {
const networkConfig = useStore((s) => s.networkConfig)
const currentNetwork = useStore((s) => s.currentNetwork)
const loadNetworkConfig = useStore((s) => s.loadNetworkConfig)
const currentWallet = useCurrentWallet()
const queryClient = useQueryClient()
const { t } = useTranslation()
@ -61,6 +63,7 @@ export const ChainSelect = () => {
function handleChainSelect(chainId: ChainInfoID) {
useStore.setState({
userWalletAddress: undefined,
currentNetwork: chainId,
exchangeRates: [],
assetPricesUSD: [],
@ -68,6 +71,7 @@ export const ChainSelect = () => {
marketInfo: [],
userIcns: undefined,
redBankAssets: [],
userUnclaimedRewards: [],
networkConfig: getNetworkConfig(chainId),
redBankState: State.INITIALISING,
userBalancesState: State.INITIALISING,
@ -76,6 +80,7 @@ export const ChainSelect = () => {
priceFeeds: [],
data: [],
},
walletConnecting: { show: true, providerId: currentWallet?.providerId as WalletID },
})
loadNetworkConfig()
localStorage.setItem(CHAIN_ID_KEY, chainId)

View File

@ -1,10 +0,0 @@
import { useWalletManager, WalletConnectionStatus } from '@marsprotocol/wallet-connector'
import { ConnectButton, ConnectedButton } from 'components/common'
export const Connect = () => {
const { status, connectedWallet } = useWalletManager()
if (status === WalletConnectionStatus.Connected && connectedWallet) return <ConnectedButton />
return <ConnectButton />
}

View File

@ -1,14 +1,13 @@
import { WalletID } from '@marsprotocol/wallet-connector'
import classNames from 'classnames'
import { IncentivesButton, Settings, SVG } from 'components/common'
import { IncentivesButton, Settings, SVG, Wallet } from 'components/common'
import { getCouncilLink } from 'libs/council'
import Link from 'next/link'
import { useRouter } from 'next/router'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { WalletID } from 'types/enums/wallet'
import { ChainSelect } from './ChainSelect'
import { Connect } from './Connect'
import styles from './Header.module.scss'
export const Header = () => {
@ -60,7 +59,7 @@ export const Header = () => {
<div className={styles.connector}>
<IncentivesButton />
<ChainSelect />
<Connect />
<Wallet />
<Settings />
</div>
</header>

View File

@ -1,4 +1,4 @@
import { ChainInfoID, SimpleChainInfoList, TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { useQueryClient } from '@tanstack/react-query'
import classNames from 'classnames'
import {
@ -11,6 +11,7 @@ import {
TxLink,
} from 'components/common'
import { MARS_SYMBOL } from 'constants/appConstants'
import { CHAINS } from 'constants/chains'
import { findByDenom } from 'functions'
import { getClaimUserRewardsMsgOptions } from 'functions/messages'
import { useEstimateFee } from 'hooks/queries'
@ -20,6 +21,7 @@ import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { State } from 'types/enums'
import { QUERY_KEYS } from 'types/enums/queryKeys'
import { ChainInfoID } from 'types/enums/wallet'
import styles from './IncentivesButton.module.scss'
@ -34,8 +36,8 @@ export const IncentivesButton = () => {
// STORE STATE
// ---------------
const client = useStore((s) => s.client)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const otherAssets = useStore((s) => s.otherAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const otherAssets = useStore((s) => s.networkConfig.assets.other)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const networkConfig = useStore((s) => s.networkConfig)
const unclaimedRewards = useStore((s) => s.userUnclaimedRewards)
@ -52,7 +54,7 @@ export const IncentivesButton = () => {
const [disabled, setDisabled] = useState(true)
const [fetching, setFetching] = useState(false)
const [submitted, setSubmitted] = useState(false)
const [response, setResponse] = useState<TxBroadcastResult>()
const [response, setResponse] = useState<BroadcastResult>()
const [error, setError] = useState<string>()
const [hasUnclaimedRewards, setHasUnclaimedRewards] = useState(false)
const [unclaimedRewardsValue, setUnclaimedRewardsValue] = useState(0)
@ -60,7 +62,7 @@ export const IncentivesButton = () => {
// ---------------
// LOCAL VARIABLES
// ---------------
const explorerUrl = chainInfo && SimpleChainInfoList[chainInfo.chainId as ChainInfoID].explorer
const explorerUrl = chainInfo && CHAINS[chainInfo.chainId as ChainInfoID].explorer
const assets = [...whitelistedAssets, ...otherAssets]
// ---------------

View File

@ -1,4 +1,3 @@
import { useWalletManager, WalletConnectionStatus } from '@marsprotocol/wallet-connector'
import { useQueryClient } from '@tanstack/react-query'
import BigNumber from 'bignumber.js'
import classNames from 'classnames'
@ -18,14 +17,14 @@ export const Settings = () => {
const [showDetails, setShowDetails] = useState(false)
const slippage = useStore((s) => s.slippage)
const networkConfig = useStore((s) => s.networkConfig)
const currencyAssets = useStore((s) => s.currencyAssets)
const currencyAssets = networkConfig.assets.currencies
const calculateExchangeRates = useStore((s) => s.calculateExchangeRates)
const [customSlippage, setCustomSlippage] = useState<number>(0)
const [inputRef, setInputRef] = useState<React.RefObject<HTMLInputElement>>()
const [isCustom, setIsCustom] = useState(false)
const enableAnimations = useStore((s) => s.enableAnimations)
const { status } = useWalletManager()
const exchangeRates = useStore((s) => s.exchangeRates)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const [displayCurrency, setDisplayCurrency] = useState<DisplayCurrency>(
networkConfig.displayCurrency,
@ -95,7 +94,7 @@ export const Settings = () => {
setDisplayCurrency(networkConfig.displayCurrency)
}, [networkConfig.displayCurrency, displayCurrency])
if (status !== WalletConnectionStatus.Connected) return null
if (!userWalletAddress) return null
return (
<div className={styles.container}>

View File

@ -48,7 +48,7 @@ export const InputSection = ({
// STORE STATE
// ------------------
const baseCurrency = useStore((s) => s.baseCurrency)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
// ------------------
// LOCAL STATE

View File

@ -1,6 +1,13 @@
import { useWallet, useWalletManager, WalletConnectionStatus } from '@marsprotocol/wallet-connector'
import { useShuttle } from '@delphi-labs/shuttle-react'
import classNames from 'classnames'
import { Footer, Header, MobileNav, TermsOfService } from 'components/common'
import {
Footer,
Header,
MobileNav,
TermsOfService,
WalletConnecting,
WalletSelect,
} from 'components/common'
import { FieldsNotConnected } from 'components/fields'
import { RedbankNotConnected } from 'components/redbank'
import { TERMS_OF_SERVICE } from 'constants/appConstants'
@ -16,11 +23,11 @@ type Props = {
export const Layout = ({ children }: Props) => {
const alreadyAcceptedTOS = localStorage.getItem(TERMS_OF_SERVICE)
const currentlyAcceptedROS = useStore((s) => s.acceptedTermsOfService)
const { wallets } = useShuttle()
const router = useRouter()
const { status } = useWalletManager()
const currentNetwork = useStore((s) => s.currentNetwork)
const { wallets } = useWallet()
const userWalletAddress = useStore((s) => s.userWalletAddress)
const client = useStore((s) => s.client)
const [isConnected, setIsConnected] = useState(false)
const [wasConnectedBefore, setWasConnectedBefore] = useState(false)
useAnimations()
@ -30,9 +37,9 @@ export const Layout = ({ children }: Props) => {
const vaultConfigs = useStore((s) => s.vaultConfigs)
useEffect(() => {
setIsConnected(status === WalletConnectionStatus.Connected)
setIsConnected(!!userWalletAddress && !!client)
setWasConnectedBefore(!!wallets.find((w) => w.network.chainId === currentNetwork))
}, [status, wallets, currentNetwork])
}, [client, userWalletAddress, wallets, currentNetwork])
useEffect(() => {
if (!isConnected) {
@ -56,6 +63,8 @@ export const Layout = ({ children }: Props) => {
<RedbankNotConnected />
)}
</div>
<WalletSelect />
<WalletConnecting />
<Footer />
<MobileNav />
</div>

View File

@ -1,4 +1,3 @@
import { WalletID } from '@marsprotocol/wallet-connector'
import classNames from 'classnames'
import { SVG } from 'components/common'
import { getCouncilLink } from 'libs/council'
@ -6,6 +5,7 @@ import Link from 'next/link'
import { useRouter } from 'next/router'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { WalletID } from 'types/enums/wallet'
import styles from './MobileNav.module.scss'

View File

@ -0,0 +1,127 @@
@import 'src/styles/master';
.dialog {
width: 100vw;
border: none;
background: transparent;
color: $colorWhite;
height: 100vh;
max-width: 100vw;
max-height: 100vh;
backdrop-filter: blur(4px);
display: flex;
justify-content: center;
align-items: center;
margin: 0;
padding: 0;
&:focus {
outline: none;
}
&::backdrop {
background-color: $alphaBlack50;
}
}
.container {
@include layoutTile;
position: relative;
width: 100%;
max-height: 100vh;
max-width: 100%;
overflow-y: auto;
width: rem-calc(540);
@include padding(4);
text-align: center;
justify-content: center;
align-items: flex-start;
display: flex;
flex-wrap: wrap;
max-height: 100%;
.copy {
@include padding(0, 0, 4);
@include typoM;
color: $alphaWhite40;
width: 100%;
}
.header {
@include padding(0, 6, 4);
display: grid;
place-items: center;
position: relative;
@include typoXXLcaps;
width: 100%;
.actions {
display: none;
}
.button {
color: $alphaWhite60;
background: none;
border: none;
position: absolute;
cursor: pointer;
top: space(1);
right: space(1);
transition: color linear 0.2s;
&:hover {
color: $colorWhite;
}
svg {
width: rem-calc(24);
height: rem-calc(24);
}
&.back {
top: 50%;
transform: translateY(-50%);
right: unset;
left: space(4);
svg {
width: rem-calc(32);
height: rem-calc(32);
}
}
}
.content {
width: 100%;
color: $colorWhite;
min-height: rem-calc(120);
@include padding(4, 10);
}
&.border {
border-bottom: 1px solid rgba(255, 255, 255, 0.2);
}
}
}
@media screen and (min-width: $bpXSmallLow) {
.container {
.header {
.actions {
display: block;
margin-top: space(2);
}
}
}
}
@media screen and (min-width: $bpLargeLow) {
.container {
.header {
.actions {
position: absolute;
display: block;
right: space(10);
}
}
}
}

View File

@ -0,0 +1,49 @@
import { SVG } from 'components/common/SVG/SVG'
import { ReactNode, useEffect, useRef } from 'react'
import styles from './Modal.module.scss'
interface Props {
title: string | ReactNode
copy?: string
children: ReactNode
onClose: () => void
}
export const Modal = (props: Props) => {
const ref: React.RefObject<HTMLDialogElement> = useRef(null)
function onClose() {
ref.current?.close()
props.onClose()
}
useEffect(() => {
ref.current?.showModal()
document.body.classList.add('modal-open')
}, [])
useEffect(() => {
const dialog = ref.current
return () => {
dialog?.removeAttribute('open')
dialog?.close()
document.body.classList.remove('modal-open')
}
}, [])
return (
<dialog ref={ref} onCancel={onClose} className={styles.dialog}>
<div className={styles.container}>
<div className={styles.header}>
{props.title}
<button className={styles.button} onClick={props.onClose}>
<SVG.Close />
</button>
</div>
{props.copy && <div className={styles.copy}>{props.copy}</div>}
<div className={styles.content}>{props.children}</div>
</div>
</dialog>
)
}

View File

@ -19,7 +19,7 @@ export const TxFee = ({
textStyle = '',
}: Props) => {
const { t } = useTranslation()
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
if (!txFee) return <></>
return (

View File

@ -6,10 +6,10 @@ import {
BorrowCapacity,
Button,
Card,
ConnectButton,
DisplayCurrency,
ErrorMessage,
InputSection,
WalletConnectButton,
} from 'components/common'
import { DEFAULT_SLIPPAGE } from 'constants/appConstants'
import { findByDenom } from 'functions'
@ -81,7 +81,7 @@ export const Action = ({
const marketAssetLiquidity = useStore((s) => s.marketAssetLiquidity)
const userCollateral = useStore((s) => s.userCollateral)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const convertToBaseCurrency = useStore((s) => s.convertToBaseCurrency)
const findUserDebt = useStore((s) => s.findUserDebt)
const enableAnimations = useStore((s) => s.enableAnimations)
@ -437,7 +437,7 @@ export const Action = ({
const barChartHeight = 40 * percentData.length + 10
const actionButton = !userWalletAddress ? (
<ConnectButton color={'secondary'} />
<WalletConnectButton color={'secondary'} />
) : (
produceTabActionButton()
)

View File

@ -1,8 +1,9 @@
import { ChainInfoID, SimpleChainInfoList } from '@marsprotocol/wallet-connector'
import { Button, TxLink } from 'components/common'
import { CHAINS } from 'constants/chains'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { TxStatus } from 'types/enums/RedBankAction'
import { ChainInfoID } from 'types/enums/wallet'
import { InfoTitle } from './InfoTitle'
import styles from './TxFailedContent.module.scss'
@ -15,7 +16,7 @@ interface Props {
export const TxFailedContent = ({ message, hash, handleClose }: Props) => {
const chainInfo = useStore((s) => s.chainInfo)
const explorerUrl = chainInfo && SimpleChainInfoList[chainInfo.chainId as ChainInfoID].explorer
const explorerUrl = chainInfo && CHAINS[chainInfo.chainId as ChainInfoID].explorer
const { t } = useTranslation()
return (

View File

@ -1,5 +1,5 @@
import { Coin } from '@cosmjs/stargate'
import { TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { Card, TxFailedContent, TxSuccessContent } from 'components/common'
import { getFeeFromResponse } from 'functions'
import { useEffect, useMemo, useState } from 'react'
@ -8,7 +8,7 @@ import useStore from 'store'
import { TxStatus } from 'types/enums/RedBankAction'
interface Props {
response?: TxBroadcastResult
response?: BroadcastResult
error?: string
title: string
actions?: FieldsAction[]

View File

@ -1,15 +1,17 @@
import { Coin } from '@cosmjs/stargate'
import { ChainInfoID, SimpleChainInfoList, TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { Button, InfoTitle, TxFee, TxLink } from 'components/common'
import { CHAINS } from 'constants/chains'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { TxStatus } from 'types/enums/RedBankAction'
import { ChainInfoID } from 'types/enums/wallet'
import styles from './TxSuccessContent.module.scss'
interface Props {
title: string
response?: TxBroadcastResult | null
response?: BroadcastResult | null
txFee?: Coin
txStatus: TxStatus
actions: { label: string; values: string[] }[]
@ -26,7 +28,7 @@ export const TxSuccessContent = ({
}: Props) => {
const { t } = useTranslation()
const chainInfo = useStore((s) => s.chainInfo)
const explorerUrl = chainInfo && SimpleChainInfoList[chainInfo.chainId as ChainInfoID].explorer
const explorerUrl = chainInfo && CHAINS[chainInfo.chainId as ChainInfoID].explorer
const transactionHash = response?.hash || ''
return (

View File

@ -0,0 +1,26 @@
import { useQueryClient } from '@tanstack/react-query'
import { WalletConnectButton, WalletConnectedButton } from 'components/common'
import useCurrentWallet from 'hooks/wallet/useCurrentWallet'
import { useEffect } from 'react'
import useStore from 'store'
import { WalletID } from 'types/enums/wallet'
export const Wallet = () => {
const currentWallet = useCurrentWallet()
const userWalletAddress = useStore((s) => s.userWalletAddress)
const queryClient = useQueryClient()
useEffect(() => {
if (!currentWallet) return
if (currentWallet.account.address === userWalletAddress) return
queryClient.removeQueries()
useStore.setState({
userWalletAddress: undefined,
client: undefined,
chainInfo: undefined,
walletConnecting: { show: true, providerId: currentWallet.providerId as WalletID },
})
}, [currentWallet, userWalletAddress, queryClient])
return userWalletAddress ? <WalletConnectedButton /> : <WalletConnectButton />
}

View File

@ -1,10 +1,10 @@
import { useWalletManager } from '@marsprotocol/wallet-connector'
import classNames from 'classnames'
import { Button, SVG } from 'components/common'
import { Button, SVG } from 'components/common/'
import { ReactNode } from 'react'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import styles from './ConnectButton.module.scss'
import styles from './WalletConnectButton.module.scss'
interface Props {
textOverride?: string | ReactNode
@ -12,8 +12,7 @@ interface Props {
color?: 'primary' | 'secondary'
}
export const ConnectButton = ({ textOverride, disabled = false, color }: Props) => {
const { connect } = useWalletManager()
export const WalletConnectButton = ({ textOverride, disabled = false, color }: Props) => {
const { t } = useTranslation()
return (
@ -21,7 +20,9 @@ export const ConnectButton = ({ textOverride, disabled = false, color }: Props)
<Button
color={color ? color : 'quaternary'}
disabled={disabled}
onClick={connect}
onClick={() => {
useStore.setState({ showWalletSelect: true })
}}
className={classNames(styles.button, !color && styles.outline)}
prefix={<SVG.Wallet className={styles.svg} />}
text={<span className='overline'>{textOverride || t('common.connectWallet')}</span>}

View File

@ -0,0 +1,87 @@
import {
CosmostationExtensionProvider,
CosmostationMobileProvider,
KeplrExtensionProvider,
KeplrMobileProvider,
LeapCosmosExtensionProvider,
LeapCosmosMobileProvider,
LeapMetamaskCosmosSnapExtensionProvider,
ShuttleProvider,
StationExtensionProvider,
VectisCosmosExtensionProvider,
WalletExtensionProvider,
WalletMobileProvider,
XDEFICosmosExtensionProvider,
} from '@delphi-labs/shuttle-react'
import { CHAINS } from 'constants/chains'
import { WALLETS } from 'constants/wallets'
import { FC } from 'react'
import { ChainInfoID, WalletID } from 'types/enums/wallet'
type Props = {
children?: React.ReactNode
}
function getSupportedChainsInfos(walletId: WalletID) {
return WALLETS[walletId].supportedChains.map((chain) => {
const chainInfo: ChainInfo = CHAINS[chain]
switch (chainInfo.chainId) {
case ChainInfoID.Osmosis1:
chainInfo.rpc = process.env.NEXT_PUBLIC_OSMOSIS_RPC ?? chainInfo.rpc
chainInfo.rest = process.env.NEXT_PUBLIC_OSMOSIS_REST ?? chainInfo.rpc
break
case ChainInfoID.Neutron1:
chainInfo.rpc = process.env.NEXT_PUBLIC_NEUTRON_RPC ?? chainInfo.rpc
chainInfo.rest = process.env.NEXT_PUBLIC_NEUTRON_REST ?? chainInfo.rpc
break
case ChainInfoID.NeutronTestnet:
chainInfo.rpc = process.env.NEXT_PUBLIC_NEUTRON_TEST_RPC ?? chainInfo.rpc
chainInfo.rest = process.env.NEXT_PUBLIC_NEUTRON_TEST_REST ?? chainInfo.rpc
break
}
return chainInfo
})
}
const mobileProviders: WalletMobileProvider[] = [
new KeplrMobileProvider({
networks: getSupportedChainsInfos(WalletID.KeplrMobile),
}),
new LeapCosmosMobileProvider({
networks: getSupportedChainsInfos(WalletID.LeapMobile),
}),
new CosmostationMobileProvider({
networks: getSupportedChainsInfos(WalletID.CosmostationMobile),
}),
]
const extensionProviders: WalletExtensionProvider[] = [
new KeplrExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Keplr) }),
new LeapCosmosExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Leap) }),
new LeapMetamaskCosmosSnapExtensionProvider({
networks: getSupportedChainsInfos(WalletID.LeapSnap),
}),
new CosmostationExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Cosmostation) }),
new XDEFICosmosExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Xdefi) }),
new StationExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Station) }),
new VectisCosmosExtensionProvider({ networks: getSupportedChainsInfos(WalletID.Vectis) }),
]
export const WalletConnectProvider: FC<Props> = ({ children }) => {
return (
<ShuttleProvider
walletConnectProjectId={
process.env.NEXT_PUBLIC_WALLET_CONNECT_ID ?? '0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x0x'
}
mobileProviders={mobileProviders}
extensionProviders={extensionProviders}
persistent
>
{children}
</ShuttleProvider>
)
}

View File

@ -1,9 +1,12 @@
import { useWalletManager } from '@marsprotocol/wallet-connector'
import { useShuttle } from '@delphi-labs/shuttle-react'
import BigNumber from 'bignumber.js'
import { AnimatedNumber, Button, CircularProgress, DisplayCurrency, SVG } from 'components/common'
import { SUPPORTED_CHAINS } from 'constants/appConstants'
import { CHAINS } from 'constants/chains'
import { findByDenom } from 'functions'
import { useUserBalance } from 'hooks/queries'
import { formatValue, lookup } from 'libs/parse'
import useCurrentWallet from 'hooks/wallet/useCurrentWallet'
import { formatValue } from 'libs/parse'
import { truncate } from 'libs/text'
import { useCallback, useEffect, useMemo, useState } from 'react'
import { useTranslation } from 'react-i18next'
@ -11,87 +14,92 @@ import useClipboard from 'react-use-clipboard'
import useStore from 'store'
import colors from 'styles/_assets.module.scss'
import { State } from 'types/enums'
import { ChainInfoID } from 'types/enums/wallet'
import styles from './ConnectedButton.module.scss'
import styles from './WalletConnectedButton.module.scss'
export const ConnectedButton = () => {
export const WalletConnectedButton = () => {
// ---------------
// EXTERNAL HOOKS
// ---------------
const { disconnect, connectedWallet } = useWalletManager()
const { t } = useTranslation()
// ---------------
// STORE
// ---------------
const baseCurrency = useStore((s) => s.baseCurrency)
const currentWallet = useCurrentWallet()
const chainInfo = useStore((s) => s.chainInfo)
const { disconnectWallet } = useShuttle()
const userWalletAddress = useStore((s) => s.userWalletAddress)
const userIcns = useStore((s) => s.userIcns)
const baseCurrency = useStore((s) => s.baseCurrency)
const network = useStore((s) => s.client?.connectedWallet.network)
const networkConfig = useStore((s) => s.networkConfig)
const [isTestnet, setIsTestnet] = useState(false)
const userIcns = useStore((s) => s.userIcns)
const { data: walletBalances, isLoading } = useUserBalance()
const { t } = useTranslation()
const baseAsset = useMemo(() => networkConfig.assets.base, [networkConfig])
// ---------------
// LOCAL STATE
// ---------------
const [showDetails, setShowDetails] = useState(false)
const [walletAmount, setWalletAmount] = useState(new BigNumber(0))
const [isCopied, setCopied] = useClipboard(userWalletAddress, {
successDuration: 1000 * 5,
})
const { data, isLoading } = useUserBalance()
// ---------------
// VARIABLES
// ---------------
const baseCurrencyBalance = Number(findByDenom(data || [], baseCurrency.denom || '')?.amount || 0)
const explorerName = chainInfo ? chainInfo.explorerName : ''
const [showDetails, setShowDetails] = useState(false)
const explorerName = network && CHAINS[network.chainId as ChainInfoID].explorerName
const viewOnFinder = useCallback(() => {
const explorerUrl = chainInfo ? chainInfo.explorer : ''
const explorerUrl = network && CHAINS[network.chainId as ChainInfoID].explorer
window.open(`${explorerUrl}/account/${userWalletAddress}`, '_blank')
}, [chainInfo, userWalletAddress])
}, [network, userWalletAddress])
const onDisconnectWallet = () => {
if (currentWallet) disconnectWallet(currentWallet)
useStore.setState({
client: undefined,
userWalletAddress: undefined,
chainInfo: undefined,
userIcns: undefined,
marketAssetLiquidity: [],
marketInfo: [],
redBankAssets: [],
redBankState: State.INITIALISING,
userBalancesState: State.INITIALISING,
})
}
const onClickAway = useCallback(() => {
setShowDetails(false)
}, [])
const currentBalanceAmount = lookup(
baseCurrencyBalance,
baseCurrency.denom,
baseCurrency.decimals,
)
const [connectedWalletAddress, connectedWalletIsLedger] = useMemo(() => {
if (!connectedWallet?.account) return ['', false]
return [connectedWallet.account.address, connectedWallet.account.isLedger]
}, [connectedWallet])
useEffect(() => {
if (!chainInfo) return
setIsTestnet(
!!SUPPORTED_CHAINS.find(
(chain) => chain.type === 'testnet' && chain.chainId === chainInfo?.chainId,
(chain) => chain.type === 'testnet' && chain.chainId === networkConfig.name,
),
)
}, [chainInfo])
}, [chainInfo, networkConfig.name])
useEffect(() => {
if (userWalletAddress === connectedWalletAddress) return
useStore.setState({
isLedger: connectedWalletIsLedger,
userWalletAddress: connectedWalletAddress,
marketAssetLiquidity: [],
marketInfo: [],
userIcns: undefined,
redBankAssets: [],
redBankState: State.INITIALISING,
userBalancesState: State.INITIALISING,
})
}, [connectedWalletAddress, connectedWalletIsLedger, userWalletAddress])
if (!walletBalances) return
const newAmount = BigNumber(
walletBalances.find((coin: Coin) => coin.denom === baseAsset.denom)?.amount ?? 0,
).dividedBy(10 ** baseAsset.decimals)
if (walletAmount.isEqualTo(newAmount)) return
setWalletAmount(newAmount)
}, [walletBalances, baseAsset.denom, baseAsset.decimals, walletAmount])
const baseCurrencyBalance = Number(
findByDenom(walletBalances || [], baseCurrency.denom || '')?.amount || 0,
)
return (
<div className={styles.wrapper}>
{isTestnet && <span className={styles.network}>{chainInfo?.chainId}</span>}
{isTestnet && <span className={styles.network}>{networkConfig.name}</span>}
<Button
className={styles.button}
onClick={() => {
@ -105,7 +113,14 @@ export const ConnectedButton = () => {
</span>
<span className={`${styles.balance} number`}>
{!isLoading ? (
`${formatValue(currentBalanceAmount, 2, 2, true, false, ` ${baseCurrency.symbol}`)}`
`${formatValue(
walletAmount.toNumber(),
2,
2,
true,
false,
` ${baseCurrency.symbol}`,
)}`
) : (
<CircularProgress className={styles.circularProgress} size={12} />
)}
@ -120,7 +135,7 @@ export const ConnectedButton = () => {
<div className={styles.detailsBalance}>
<div className={styles.detailsDenom}>{baseCurrency.symbol}</div>
<div className={`${styles.detailsBalanceAmount}`}>
<AnimatedNumber amount={currentBalanceAmount} />
<AnimatedNumber amount={walletAmount.toNumber()} />
<DisplayCurrency
className='s faded'
coin={{
@ -131,7 +146,11 @@ export const ConnectedButton = () => {
</div>
</div>
<div className={styles.detailsButton}>
<Button color='secondary' onClick={disconnect} text={t('common.disconnect')} />
<Button
color='secondary'
onClick={onDisconnectWallet}
text={t('common.disconnect')}
/>
</div>
</div>
<div className={styles.detailsBody}>

View File

@ -0,0 +1,193 @@
import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'
import { useShuttle } from '@delphi-labs/shuttle-react'
import { CircularProgress, Modal } from 'components/common'
import { CHAINS } from 'constants/chains'
import useCurrentWallet from 'hooks/wallet/useCurrentWallet'
import { useCallback, useEffect, useMemo, useState } from 'react'
import useStore from 'store'
import { State } from 'types/enums'
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
export const WalletConnecting = () => {
const {
recentWallet,
connect,
mobileConnect,
simulate,
sign,
broadcast,
mobileProviders,
extensionProviders,
} = useShuttle()
const providers = useMemo(
() => [...mobileProviders, ...extensionProviders],
[mobileProviders, extensionProviders],
)
const [isConnecting, setIsConnecting] = useState(false)
const networkConfig = useStore((s) => s.networkConfig)
const walletConnecting = useStore((s) => s.walletConnecting)
const currentWallet = useCurrentWallet()
const providerId = walletConnecting?.providerId ?? currentWallet?.providerId
const client = useStore((s) => s.client)
const address = useStore((s) => s.userWalletAddress)
const currentChainId = useMemo(() => networkConfig.name, [networkConfig.name])
const handleConnect = useCallback(
(extensionProviderId: string) => {
async function handleConnectAsync() {
if (client || isConnecting) return
setIsConnecting(true)
try {
const response = await connect({ extensionProviderId, chainId: currentChainId })
const cosmClient = await CosmWasmClient.connect(response.network.rpc)
const walletClient: WalletClient = {
broadcast,
cosmWasmClient: cosmClient,
connectedWallet: response,
sign,
simulate,
}
const paramsClient = networkConfig.contracts.params
? new MarsParamsQueryClient(cosmClient, networkConfig.contracts.params)
: undefined
setIsConnecting(false)
useStore.setState({
client: walletClient,
userWalletAddress: response.account.address,
walletConnecting: undefined,
userIcns: undefined,
paramsClient: paramsClient,
chainInfo: CHAINS[currentChainId],
userBalancesState: State.INITIALISING,
})
} catch (error) {
setIsConnecting(false)
if (error instanceof Error) {
useStore.setState({
client: undefined,
userWalletAddress: undefined,
walletConnecting: undefined,
chainInfo: undefined,
})
}
}
}
if (!isConnecting) handleConnectAsync()
},
[
broadcast,
connect,
client,
isConnecting,
setIsConnecting,
sign,
simulate,
currentChainId,
networkConfig.contracts.params,
],
)
const handleMobileConnect = useCallback(
(mobileProviderId: string) => {
async function handleMobileConnectAsync() {
if (client || isConnecting || !recentWallet) return
setIsConnecting(true)
try {
await mobileConnect({ mobileProviderId, chainId: currentChainId })
const cosmClient = await CosmWasmClient.connect(networkConfig.rpcUrl)
const walletClient: WalletClient = {
broadcast,
cosmWasmClient: cosmClient,
connectedWallet: recentWallet,
sign,
simulate,
}
const paramsClient = networkConfig.contracts.params
? new MarsParamsQueryClient(cosmClient, networkConfig.contracts.params)
: undefined
setIsConnecting(false)
useStore.setState({
client: walletClient,
userWalletAddress: recentWallet.account.address,
walletConnecting: undefined,
userIcns: undefined,
paramsClient: paramsClient,
chainInfo: CHAINS[currentChainId],
userBalancesState: State.INITIALISING,
})
} catch (error) {
setIsConnecting(false)
if (error instanceof Error) {
useStore.setState({
client: undefined,
userWalletAddress: undefined,
walletConnecting: undefined,
chainInfo: undefined,
})
}
}
}
if (!isConnecting) handleMobileConnectAsync()
},
[
mobileConnect,
client,
isConnecting,
recentWallet,
sign,
simulate,
currentChainId,
broadcast,
networkConfig.contracts.params,
networkConfig.rpcUrl,
],
)
useEffect(() => {
if (!providerId) {
useStore.setState({
client: undefined,
userWalletAddress: undefined,
walletConnecting: undefined,
chainInfo: undefined,
})
return
}
const provider = providers.find((p) => p.id === providerId)
if (
!provider?.id ||
isConnecting ||
(recentWallet && recentWallet.account.address === address)
) {
return
}
const isMobileProvider = provider.id.split('-')[0] === 'mobile'
if (isMobileProvider) {
handleMobileConnect(provider.id)
return
}
handleConnect(provider.id)
}, [
handleConnect,
isConnecting,
providerId,
providers,
recentWallet,
address,
handleMobileConnect,
])
if (!walletConnecting?.show) return null
return (
<Modal
onClose={() => useStore.setState({ walletConnecting: undefined, showWalletSelect: true })}
title={'Connecting...'}
copy={'Unlock your wallet and approve the connection'}
>
<CircularProgress size={40} />
</Modal>
)
}

View File

@ -0,0 +1,64 @@
@import 'src/styles/master';
.listContainer {
display: flex;
flex-wrap: wrap;
width: 100%;
gap: space(3);
@include padding(2, 0);
}
.qrButton {
min-width: rem-calc(240);
}
.qrCode {
@include padding(2);
@include margin(0, 0, 4);
background: $colorWhite;
border-radius: $borderRadiusS;
}
.walletOption {
display: flex;
width: 100%;
justify-content: flex-start;
@include padding(2);
align-items: center;
appearance: none;
border: none;
width: 100%;
text-decoration: none;
border-radius: $borderRadiusS;
cursor: pointer;
transition: all 0.5s;
color: $colorWhite;
&:hover {
background: $alphaWhite20;
}
.info {
display: flex;
flex: 0 0 calc(100% - 60px);
text-align: left;
@include padding(0, 0, 0, 4);
flex-wrap: wrap;
}
.name {
width: 100%;
@include typoLcaps;
@include margin(0, 0, 1);
}
.description {
@include typoM;
color: $alphaWhite40;
}
.arrow {
width: space(4);
height: space(4);
}
}

View File

@ -0,0 +1,204 @@
import { useShuttle } from '@delphi-labs/shuttle-react'
import { Button, Modal } from 'components/common'
import { WALLETS } from 'constants/wallets'
import { getCurrentChainId } from 'libs/chainId'
import Image from 'next/image'
import React, { useEffect, useState } from 'react'
import { isIOS, isMobile } from 'react-device-detect'
import QRCode from 'react-qr-code'
import useStore from 'store'
import { WalletID } from 'types/enums/wallet'
import styles from './WalletSelect.module.scss'
interface Props {
error?: ErrorObject
}
interface ErrorObject {
title: string
message: string
}
interface WalletOptionProps {
name: string
description?: string
imageSrc: string
handleClick: () => void
showLoader?: boolean
}
function WalletOption(props: WalletOptionProps) {
return (
<div onClick={props.handleClick} className={styles.walletOption}>
<Image
className='rounded-full'
width={60}
height={60}
src={props.imageSrc}
alt={props.name}
/>
<div className={styles.info}>
<p className={styles.name}>{props.name}</p>
{props.description && <p className={styles.description}>{props.description}</p>}
</div>
</div>
)
}
export const WalletSelect = () => {
const { extensionProviders, mobileProviders, mobileConnect } = useShuttle()
const [qrCodeUrl, setQRCodeUrl] = useState('')
const [error, setError] = useState(false)
const [isLoading, setIsLoading] = useState<string | boolean>(false)
const sortedExtensionProviders = extensionProviders.sort((a, b) => +b - +a)
const networkConfig = useStore((s) => s.networkConfig)
const showWalletSelect = useStore((s) => s.showWalletSelect)
const currentChainId = getCurrentChainId()
const handleConnectClick = (extensionProviderId: WalletID) => {
useStore.setState({
walletConnecting: { show: true, providerId: extensionProviderId },
showWalletSelect: false,
})
}
const handleMobileConnectClick = async (mobileProviderId: string, chainId: string) => {
setIsLoading(mobileProviderId)
try {
const urls = await mobileConnect({
mobileProviderId,
chainId,
callback: () => {
setQRCodeUrl('')
setIsLoading(false)
useStore.setState({
showWalletSelect: false,
walletConnecting: { show: true, providerId: mobileProviderId as WalletID },
})
},
})
if (isMobile) {
let mobileUrl = urls.androidUrl
if (isIOS) mobileUrl = urls.iosUrl
window.location.href = mobileUrl
} else {
setQRCodeUrl(urls.qrCodeUrl)
}
} catch (error) {
if (error instanceof Error) {
setQRCodeUrl('')
setIsLoading(false)
console.error('Failed to connect to wallet:', error.message)
setError(true)
}
}
setIsLoading(false)
}
useEffect(() => {
if (error) {
useStore.setState({
walletConnecting: undefined,
showWalletSelect: false,
})
}
}, [error])
if (!showWalletSelect) return null
if (qrCodeUrl)
return (
<Modal
title={'Scan the QR Code'}
copy={
'Open your mobile wallet App and use the QR Scan function to connect via WalletConnect v2'
}
onClose={() => setQRCodeUrl('')}
>
<div className={styles.qrCode}>
<QRCode value={qrCodeUrl} />
</div>
<Button
className={styles.qrButton}
text='Close'
color='primary'
onClick={() => setQRCodeUrl('')}
/>
</Modal>
)
return (
<Modal title={'Select a wallet'} onClose={() => useStore.setState({ showWalletSelect: false })}>
<div className={styles.listContainer}>
{!isMobile && (
<>
{sortedExtensionProviders.map((provider) => {
const walletId = provider.id as WalletID
return (
<React.Fragment key={walletId}>
{Array.from(provider.networks.values())
.filter((network) => network.chainId === currentChainId)
.map((network) => {
if (!provider.initialized && !provider.initializing) {
return (
<WalletOption
key={`${walletId}-${network.chainId}`}
handleClick={() => {
window.open(WALLETS[walletId].installURL ?? '/', '_blank')
}}
imageSrc={WALLETS[walletId].imageURL}
name={WALLETS[walletId].install ?? 'Install Wallet'}
description={WALLETS[walletId]?.installURL}
/>
)
}
return (
<WalletOption
key={`${walletId}-${network.chainId}`}
handleClick={() => handleConnectClick(walletId)}
imageSrc={WALLETS[walletId].imageURL}
name={WALLETS[walletId].name}
description={WALLETS[walletId].description}
/>
)
})}
</React.Fragment>
)
})}
</>
)}
{mobileProviders.map((provider) => {
const walletId = provider.id as WalletID
return (
<React.Fragment key={walletId}>
{Array.from(provider.networks.values())
.filter((network) => network.chainId === currentChainId)
.map((network) => {
return (
<WalletOption
key={`${walletId}-${network.chainId}`}
name={
isMobile
? WALLETS[walletId].name
: WALLETS[walletId].walletConnect ?? 'WalletConnect'
}
imageSrc={
isMobile
? WALLETS[walletId].imageURL
: WALLETS[walletId].mobileImageURL ?? '/'
}
handleClick={() => handleMobileConnectClick(walletId, network.chainId)}
showLoader={isLoading === walletId}
/>
)
})}
</React.Fragment>
)
})}
</div>
</Modal>
)
}

View File

@ -11,14 +11,10 @@ export { CircularProgress } from './CircularProgress/CircularProgress'
export { CollectionHover } from './CollectionHover/CollectionHover'
export { CommonContainer } from './Containers/CommonContainer'
export { FieldsContainer } from './Containers/FieldsContainer'
export { CosmosWalletConnectProvider } from './CosmosWalletConnectProvider/CosmosWalletConnectProvider'
export { DisplayCurrency } from './DisplayCurrency/DisplayCurrency'
export { ErrorMessage } from './ErrorMessage/ErrorMessage'
export { Footer } from './Footer/Footer'
export { ChainSelect } from './Header/ChainSelect'
export { Connect } from './Header/Connect'
export { ConnectButton } from './Header/ConnectButton'
export { ConnectedButton } from './Header/ConnectedButton'
export { Header } from './Header/Header'
export { IncentivesButton } from './Header/IncentivesButton'
export { Settings } from './Header/Settings'
@ -29,6 +25,7 @@ export { Layout } from './Layout/Layout'
export { Loading } from './Loading/Loading'
export { MigrationInProgress } from './MigrationInProgress/MigrationInProgress'
export { MobileNav } from './MobileNav/MobileNav'
export { Modal } from './Modal/Modal'
export { Notification } from './Notification/Notification'
export { NumberInput } from './NumberInput/NumberInput'
export { SVG } from './SVG/SVG'
@ -49,4 +46,10 @@ export { TxFailedContent } from './TxModal/TxFailedContent'
export { TxResponse } from './TxModal/TxResponse'
export { TxSuccessContent } from './TxModal/TxSuccessContent'
export { ValueWithLabel } from './ValueWithLabel/ValueWithLabel'
export { Wallet } from './Wallet/Wallet'
export { WalletConnectButton } from './Wallet/WalletConnectButton'
export { WalletConnectedButton } from './Wallet/WalletConnectedButton'
export { WalletConnecting } from './Wallet/WalletConnecting'
export { WalletConnectProvider } from './Wallet/WalletConnectProvider'
export { WalletSelect } from './Wallet/WalletSelect'
// @endindex

View File

@ -1,6 +1,5 @@
import { TokenBalance } from 'components/common'
import { SWAP_THRESHOLD } from 'constants/appConstants'
import React from 'react'
import { useTranslation } from 'react-i18next'
import useStore from 'store'

View File

@ -1,5 +1,4 @@
import { TokenBalance } from 'components/common'
import React from 'react'
import { useTranslation } from 'react-i18next'
import styles from './Content.module.scss'

View File

@ -1,5 +1,4 @@
import { TokenBalance } from 'components/common'
import React from 'react'
import { useTranslation } from 'react-i18next'
import styles from './Content.module.scss'

View File

@ -34,7 +34,7 @@ export const useActiveVaultsColumns = () => {
const { t } = useTranslation()
const router = useRouter()
const baseCurrency = useStore((s) => s.baseCurrency)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const columnHelper = createColumnHelper<ActiveVault>()
const defaultActiveVaultsColumns: ColumnDef<ActiveVault, any>[] = useMemo(
() => [

View File

@ -1,9 +1,8 @@
import { ConnectButton, SVG } from 'components/common'
import React from 'react'
import { SVG, WalletConnectButton } from 'components/common'
import { AvailableVaults } from 'components/fields'
import { Trans, useTranslation } from 'react-i18next'
import { DocURL } from 'types/enums/docURL'
import AvailableVaults from '../AvailableVaultsTable/AvailableVaults'
import styles from './FieldsNotConnected.module.scss'
export const FieldsNotConnected = () => {
@ -28,7 +27,7 @@ export const FieldsNotConnected = () => {
</Trans>
</div>
</div>
<ConnectButton color={'secondary'} />
<WalletConnectButton color={'secondary'} />
</div>
<div className={styles.vaults}>
<AvailableVaults />

View File

@ -3,7 +3,6 @@ import classNames from 'classnames'
import { InputSlider, Tutorial } from 'components/common'
import { FIELDS_TUTORIAL_KEY } from 'constants/appConstants'
import { formatValue, leverageToLtv, ltvToLeverage } from 'libs/parse'
import React from 'react'
import { useTranslation } from 'react-i18next'
import colors from 'styles/_assets.module.scss'

View File

@ -1,6 +1,5 @@
import { Button, Notification } from 'components/common'
import { useRouter } from 'next/router'
import React from 'react'
import { useTranslation } from 'react-i18next'
import useStore from 'store'
import { NotificationType } from 'types/enums'

View File

@ -8,7 +8,7 @@ interface Props {
}
export const VaultLogo = ({ vault }: Props) => {
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const primaryAsset = whitelistedAssets.find((asset) => asset.denom === vault.denoms.primary)
const secondaryAsset = whitelistedAssets.find((asset) => asset.denom === vault.denoms.secondary)

View File

@ -1,4 +1,4 @@
import { TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { useQueryClient } from '@tanstack/react-query'
import { Action, Notification, TxResponse } from 'components/common'
import { findByDenom } from 'functions'
@ -41,19 +41,19 @@ export const RedbankAction = React.memo(
const client = useStore((s) => s.client)
const marketInfo = useStore((s) => s.marketInfo)
const networkConfig = useStore((s) => s.networkConfig)
const otherAssets = useStore((s) => s.otherAssets)
const redBankAssets = useStore((s) => s.redBankAssets)
const userBalances = useStore((s) => s.userBalances)
const userCollateral = useStore((s) => s.userCollateral)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const executeMsg = useStore((s) => s.executeMsg)
const whitelistedAssets = networkConfig.assets.whitelist
const otherAssets = networkConfig.assets.other
// ------------------
// LOCAL STATE
// ------------------
const [amount, setAmount] = useState(0)
const [submitted, setSubmitted] = useState(false)
const [response, setResponse] = useState<TxBroadcastResult>()
const [response, setResponse] = useState<BroadcastResult>()
const [error, setError] = useState<string>()
const [isMax, setIsMax] = useState<boolean>(false)
const [capHit, setCapHit] = useState<boolean>(false)

View File

@ -43,6 +43,14 @@
&.ntrn {
background-image: $colorGradientNTRN;
}
&.stosmo {
background-image: $colorGradientStOSMO;
}
&.tia {
background-image: $colorGradientTIA;
}
}
.logo {

View File

@ -1,4 +1,4 @@
import { Card, ConnectButton, SVG, Title } from 'components/common'
import { Card, SVG, Title, WalletConnectButton } from 'components/common'
import { AssetTable, useBorrowColumns, useDepositColumns } from 'components/redbank'
import { useEffect, useState } from 'react'
import { Trans, useTranslation } from 'react-i18next'
@ -18,7 +18,7 @@ export const RedbankNotConnected = () => {
// ------------------
// STORE STATE
// ------------------
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const convertToBaseCurrency = useStore((s) => s.convertToBaseCurrency)
// ------------------
// LOCAL STATE
@ -70,7 +70,7 @@ export const RedbankNotConnected = () => {
</Trans>
</div>
</div>
<ConnectButton color={'secondary'} />
<WalletConnectButton color={'secondary'} />
</div>
<Title text={t('common.theMarkets')} />

View File

@ -1,4 +1,3 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import atom from 'images/atom.svg'
import axl from 'images/axl.svg'
import axlusdc from 'images/axlusdc.svg'
@ -7,8 +6,11 @@ import axlweth from 'images/axlweth.svg'
import mars from 'images/mars.svg'
import osmo from 'images/osmo.svg'
import statom from 'images/statom.svg'
import stosmo from 'images/stosmo.svg'
import tia from 'images/tia.svg'
import usdc from 'images/usdc.svg'
import colors from 'styles/_assets.module.scss'
import { ChainInfoID } from 'types/enums/wallet'
const ASSETS: NetworkAssets = {
osmo: {
@ -90,6 +92,25 @@ const ASSETS: NetworkAssets = {
logo: usdc,
priceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',
},
tia: {
symbol: 'TIA',
id: 'TIA',
name: 'Celestia',
denom: 'ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877',
logo: tia,
color: colors.tia,
decimals: 6,
priceFeedId: '09f7c1d7dfbb7df2b8fe3d3d87ee94a2259d212da4f30c1f0540d066dfa44723',
},
stosmo: {
symbol: 'stOSMO',
id: 'stOSMO',
name: 'Stride Osmosis',
denom: 'ibc/D176154B0C63D1F9C6DCFB4F70349EBF2E2B5A87A05902F57A6AE92B863E9AEC',
color: colors.stosmo,
logo: stosmo,
decimals: 6,
},
}
const OTHER_ASSETS: { [denom: string]: OtherAsset } = {
@ -120,7 +141,7 @@ export const NETWORK_CONFIG: NetworkConfig = {
rpcUrl: 'https://rpc.devnet.osmosis.zone/',
restUrl: 'https://lcd.devnet.osmosis.zone/',
vaultAprUrl: 'https://api.marsprotocol.io/v1/vaults/osmosis',
usdPriceUrl: 'https://xc-mainnet.pyth.network/api/',
usdPriceUrl: 'https://hermes.pyth.network/api/',
chainIcon: osmo,
contracts: {
redBank: 'osmo1c3ljch9dfw5kf52nfwpxd2zmj2ese7agnx0p9tenkrryasrle5sqf3ftpg',
@ -129,7 +150,7 @@ export const NETWORK_CONFIG: NetworkConfig = {
creditManager: 'osmo1f2m24wktq0sw3c0lexlg7fv4kngwyttvzws3a3r3al9ld2s2pvds87jqvf',
accountNft: 'osmo1450hrg6dv2l58c0rvdwx8ec2a0r6dd50hn4frk370tpvqjhy8khqw7sw09',
pyth: 'osmo13ge29x4e2s63a8ytz2px8gurtyznmue4a69n5275692v3qn3ks8q7cwck7',
params: 'osmo1aye5qcer5n52crrkaf35jprsad2807q6kg3eeeu7k79h4slxfausfqhc9y',
params: 'osmo1nlmdxt9ctql2jr47qd4fpgzg84cjswxyw6q99u4y4u4q6c2f5ksq7ysent',
},
assets: {
base: ASSETS.osmo,
@ -142,6 +163,8 @@ export const NETWORK_CONFIG: NetworkConfig = {
ASSETS.axlweth,
ASSETS.statom,
ASSETS.usdc,
ASSETS.tia,
ASSETS.stosmo,
],
other: [OTHER_ASSETS.usd, OTHER_ASSETS.mars],
currencies: [
@ -154,6 +177,8 @@ export const NETWORK_CONFIG: NetworkConfig = {
ASSETS.axlweth,
ASSETS.axlwbtc,
ASSETS.statom,
ASSETS.stosmo,
ASSETS.tia,
OTHER_ASSETS.mars,
],
},

View File

@ -1,4 +1,3 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import atom from 'images/atom.svg'
import axlusdc from 'images/axlusdc.svg'
import mars from 'images/mars.svg'
@ -6,6 +5,7 @@ import ntrn from 'images/ntrn.svg'
import osmo from 'images/osmo.svg'
import statom from 'images/statom.svg'
import colors from 'styles/_assets.module.scss'
import { ChainInfoID } from 'types/enums/wallet'
export const ASSETS: NetworkAssets = {
ntrn: {
@ -81,14 +81,14 @@ const OTHER_ASSETS: { [denom: string]: OtherAsset } = {
}
export const NETWORK_CONFIG: NetworkConfig = {
name: ChainInfoID.Neutron,
name: ChainInfoID.Neutron1,
displayName: 'Neutron',
hiveUrl:
process.env.NEXT_PUBLIC_NEUTRON_GQL ??
'https://neutron.rpc.p2p.world/qgrnU6PsQZA8F9S5Fb8Fn3tV3kXmMBl2M9bcc9jWLjQy8p/hive/graphql',
rpcUrl: process.env.NEXT_PUBLIC_NEUTRON_RPC ?? 'https://rpc-kralum.neutron-1.neutron.org',
restUrl: process.env.NEXT_PUBLIC_NEUTRON_REST ?? 'https://rest-kralum.neutron-1.neutron.org',
usdPriceUrl: 'https://xc-mainnet.pyth.network/api/',
usdPriceUrl: 'https://hermes.pyth.network/api/',
chainIcon: ntrn,
contracts: {
redBank: 'neutron1n97wnm7q6d2hrcna3rqlnyqw2we6k0l8uqvmyqq6gsml92epdu7quugyph',

View File

@ -1,4 +1,3 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import atom from 'images/atom.svg'
import axl from 'images/axl.svg'
import axlusdc from 'images/axlusdc.svg'
@ -7,8 +6,11 @@ import axlweth from 'images/axlweth.svg'
import mars from 'images/mars.svg'
import osmo from 'images/osmo.svg'
import statom from 'images/statom.svg'
import stosmo from 'images/stosmo.svg'
import tia from 'images/tia.svg'
import usdc from 'images/usdc.svg'
import colors from 'styles/_assets.module.scss'
import { ChainInfoID } from 'types/enums/wallet'
const ASSETS: NetworkAssets = {
osmo: {
@ -82,7 +84,7 @@ const ASSETS: NetworkAssets = {
},
usdc: {
symbol: 'USDC',
name: 'Noble',
name: 'USDC',
id: 'USDC',
denom: 'ibc/498A0751C798A0D9A389AA3691123DADA57DAA4FE165D5C75894505B876BA6E4',
color: colors.usdc,
@ -90,6 +92,25 @@ const ASSETS: NetworkAssets = {
logo: usdc,
priceFeedId: 'eaa020c61cc479712813461ce153894a96a6c00b21ed0cfc2798d1f9a9e9c94a',
},
tia: {
symbol: 'TIA',
id: 'TIA',
name: 'Celestia',
denom: 'ibc/D79E7D83AB399BFFF93433E54FAA480C191248FC556924A2A8351AE2638B3877',
logo: tia,
color: colors.tia,
decimals: 6,
priceFeedId: '09f7c1d7dfbb7df2b8fe3d3d87ee94a2259d212da4f30c1f0540d066dfa44723',
},
stosmo: {
symbol: 'stOSMO',
id: 'stOSMO',
name: 'Stride Osmosis',
denom: 'ibc/D176154B0C63D1F9C6DCFB4F70349EBF2E2B5A87A05902F57A6AE92B863E9AEC',
color: colors.stosmo,
logo: stosmo,
decimals: 6,
},
}
const OTHER_ASSETS: { [denom: string]: OtherAsset } = {
@ -118,11 +139,11 @@ export const NETWORK_CONFIG: NetworkConfig = {
displayName: 'Osmosis',
hiveUrl:
process.env.NEXT_PUBLIC_OSMOSIS_GQL ??
'https://osmosis.rpc.p2p.world/4dqst8e8Cgd2HMb2HDNkimP7NIkcbjuk/hive/graphql',
'https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-hive-front/graphql/',
rpcUrl: process.env.NEXT_PUBLIC_OSMOSIS_RPC ?? 'https://rpc-osmosis.blockapsis.com/',
restUrl: process.env.NEXT_PUBLIC_OSMOSIS_REST ?? 'https://lcd-osmosis.blockapsis.com/',
vaultAprUrl: 'https://api.marsprotocol.io/v1/vaults/osmosis',
usdPriceUrl: 'https://xc-mainnet.pyth.network/api/',
usdPriceUrl: 'https://hermes.pyth.network/api/',
chainIcon: osmo,
contracts: {
redBank: 'osmo1c3ljch9dfw5kf52nfwpxd2zmj2ese7agnx0p9tenkrryasrle5sqf3ftpg',
@ -144,6 +165,8 @@ export const NETWORK_CONFIG: NetworkConfig = {
ASSETS.axlweth,
ASSETS.statom,
ASSETS.usdc,
ASSETS.tia,
ASSETS.stosmo,
],
other: [OTHER_ASSETS.usd, OTHER_ASSETS.mars],
currencies: [
@ -156,6 +179,8 @@ export const NETWORK_CONFIG: NetworkConfig = {
ASSETS.axlweth,
ASSETS.axlwbtc,
ASSETS.statom,
ASSETS.stosmo,
ASSETS.tia,
OTHER_ASSETS.mars,
],
},

View File

@ -1,10 +1,10 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import atom from 'images/atom.svg'
import axlusdc from 'images/axlusdc.svg'
import mars from 'images/mars.svg'
import ntrn from 'images/ntrn.svg'
import osmo from 'images/osmo.svg'
import colors from 'styles/_assets.module.scss'
import { ChainInfoID } from 'types/enums/wallet'
export const ASSETS: NetworkAssets = {
ntrn: {
@ -78,7 +78,7 @@ export const NETWORK_CONFIG: NetworkConfig = {
'https://testnet-neutron-gql.marsprotocol.io/graphql',
rpcUrl: process.env.NEXT_PUBLIC_NEUTRON_TEST_RPC ?? 'https://rpc-palvus.pion-1.ntrn.tech/',
restUrl: process.env.NEXT_PUBLIC_NEUTRON_TEST_REST ?? 'https://rest-palvus.pion-1.ntrn.tech/',
usdPriceUrl: 'https://xc-mainnet.pyth.network/api/',
usdPriceUrl: 'https://hermes.pyth.network/api/',
chainIcon: ntrn,
contracts: {
redBank: 'neutron1q53jr6wwus0c6g5had2zs6fzzachu5zun0c6etxuyarh5w7phxpq4wf39z',

View File

@ -1,4 +1,4 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import { ChainInfoID } from 'types/enums/wallet'
/* asset:unit */
export const MARS_SYMBOL = 'MARS'
@ -39,7 +39,7 @@ export const TERMS_OF_SERVICE = 'termsOfService'
/* chains */
export const SUPPORTED_CHAINS: { chainId: ChainInfoID; type: 'testnet' | 'mainnet' }[] = [
{ chainId: ChainInfoID.Osmosis1, type: 'mainnet' },
{ chainId: ChainInfoID.Neutron, type: 'mainnet' },
{ chainId: ChainInfoID.Neutron1, type: 'mainnet' },
{ chainId: ChainInfoID.OsmosisDevnet, type: 'testnet' },
{ chainId: ChainInfoID.NeutronTestnet, type: 'testnet' },
]

93
src/constants/chains.ts Normal file
View File

@ -0,0 +1,93 @@
import { Bech32Address } from '@keplr-wallet/cosmos'
import { ChainInfoID } from 'types/enums/wallet'
export const CHAINS: ChainInfos = {
[ChainInfoID.Osmosis1]: {
rpc: 'https://rpc.osmosis.zone',
rest: 'https://lcd.osmosis.zone',
explorer: 'https://www.mintscan.io/osmosis',
explorerName: 'Mintscan',
chainId: ChainInfoID.Osmosis1,
name: 'Osmosis',
gasPrice: '0.025uosmo',
bech32Config: Bech32Address.defaultBech32Config('osmo'),
defaultCurrency: {
coinDenom: 'OSMO',
coinMinimalDenom: 'uosmo',
coinDecimals: 6,
coinGeckoId: 'osmosis',
gasPriceStep: {
low: 0,
average: 0.025,
high: 0.04,
},
},
features: ['ibc-transfer', 'ibc-go'],
},
[ChainInfoID.OsmosisDevnet]: {
rpc: 'https://rpc.devnet.osmosis.zone',
rest: ' https://lcd.devnet.osmosis.zone',
explorer: 'https://www.mintscan.io/osmosis',
explorerName: 'Mintscan',
chainId: ChainInfoID.OsmosisDevnet,
name: 'Osmosis Devnet',
gasPrice: '0.025uosmo',
bech32Config: Bech32Address.defaultBech32Config('osmo'),
defaultCurrency: {
coinDenom: 'OSMO',
coinMinimalDenom: 'uosmo',
coinDecimals: 6,
coinGeckoId: 'osmosis',
gasPriceStep: {
low: 0,
average: 0.025,
high: 0.04,
},
},
features: ['ibc-transfer', 'ibc-go'],
},
[ChainInfoID.Neutron1]: {
rpc: 'https://rpc-neutron.keplr.app/',
rest: 'https://lcd-neutron.keplr.app/',
explorer: 'https://www.mintscan.io/neutron',
explorerName: 'Mintscan',
chainId: ChainInfoID.Neutron1,
name: 'Neutron',
gasPrice: '0.025untrn',
bech32Config: Bech32Address.defaultBech32Config('neutron'),
defaultCurrency: {
coinDenom: 'NTRN',
coinMinimalDenom: 'untrn',
coinDecimals: 6,
coinGeckoId: 'neutron',
gasPriceStep: {
low: 0,
average: 0.025,
high: 0.04,
},
},
features: ['ibc-transfer', 'ibc-go'],
},
[ChainInfoID.NeutronTestnet]: {
rpc: 'https://rpc-palvus.pion-1.ntrn.tech/',
rest: 'https://rest-palvus.pion-1.ntrn.tech/',
explorer: 'https://testnet.mintscan.io/neutron-testnet',
explorerName: 'Mintscan',
chainId: ChainInfoID.NeutronTestnet,
name: 'Neutron Testnet',
gasPrice: '0.025untrn',
bech32Config: Bech32Address.defaultBech32Config('neutron'),
defaultCurrency: {
coinDenom: 'NTRN',
coinMinimalDenom: 'untrn',
coinDecimals: 6,
coinGeckoId: 'neutron',
gasPriceStep: {
low: 0,
average: 0.025,
high: 0.04,
},
},
features: ['ibc-transfer', 'ibc-go'],
},
}

View File

@ -1,4 +0,0 @@
export const NETWORK = process.env.NEXT_PUBLIC_NETWORK
export const URL_GQL = process.env.NEXT_PUBLIC_GQL
export const URL_REST = process.env.NEXT_PUBLIC_REST
export const URL_RPC = process.env.NEXT_PUBLIC_RPC

117
src/constants/wallets.ts Normal file
View File

@ -0,0 +1,117 @@
import { ChainInfoID, WalletID } from 'types/enums/wallet'
export const WALLETS: WalletInfos = {
[WalletID.Cosmostation]: {
name: 'Cosmostation Wallet',
install: 'Install Cosmostation Wallet',
installURL:
'https://chrome.google.com/webstore/detail/cosmostation-wallet/fpkhgmpbidmiogeglndfbkegfdlnajnf',
description: 'Cosmostation Extension',
imageURL: '/images/wallets/cosmostation.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.CosmostationMobile]: {
name: 'Cosmostation Wallet',
walletConnect: 'Cosmostation WalletConnect',
imageURL: '/images/wallets/cosmostation.png',
description: 'Cosmostation Mobile App',
mobileImageURL: '/images/wallets/cosmostation-wc.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.Keplr]: {
name: 'Keplr Wallet',
install: 'Install Keplr Wallet',
installURL: 'https://www.keplr.app/download',
description: 'Keplr Extension',
imageURL: '/images/wallets/keplr.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.KeplrMobile]: {
name: 'Keplr Wallet',
walletConnect: 'Keplr WalletConnect',
imageURL: '/images/wallets/keplr.png',
description: 'Keplr Mobile App',
mobileImageURL: '/images/wallets/keplr-wc.png',
supportedChains: [ChainInfoID.Osmosis1, ChainInfoID.Neutron1],
},
[WalletID.Leap]: {
name: 'Leap Wallet',
install: 'Install Leap Wallet',
installURL:
'https://chrome.google.com/webstore/detail/leap-cosmos-wallet/fcfcfllfndlomdhbehjjcoimbgofdncg',
description: 'Leap Extension',
imageURL: '/images/wallets/leap-cosmos.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.LeapMobile]: {
name: 'Leap Wallet',
walletConnect: 'Leap WalletConnect',
imageURL: '/images/wallets/leap-cosmos.png',
description: 'Leap Mobile App',
mobileImageURL: '/images/wallets/leap-wc.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.LeapSnap]: {
name: 'MetaMask (via Leap Snap)',
install: 'Install MetaMask',
installURL: 'https://metamask.io/download/',
description: 'MetaMask Snap provided by Leap',
imageURL: '/images/wallets/leap-metamask-snap.png',
supportedChains: [
ChainInfoID.Osmosis1,
ChainInfoID.OsmosisDevnet,
ChainInfoID.Neutron1,
ChainInfoID.NeutronTestnet,
],
},
[WalletID.Station]: {
name: 'Station Wallet',
install: 'Install Station Wallet',
installURL:
'https://chrome.google.com/webstore/detail/station-wallet/aiifbnbfobpmeekipheeijimdpnlpgpp',
description: 'Station Wallet Extension',
imageURL: '/images/wallets/station.png',
supportedChains: [ChainInfoID.Osmosis1],
},
[WalletID.Xdefi]: {
name: 'XDEFI Wallet',
install: 'Install XDEFI Wallet',
installURL: 'https://go.xdefi.io/mars',
description: 'XDEFI Extension',
imageURL: '/images/wallets/xdefi.png',
supportedChains: [ChainInfoID.Osmosis1, ChainInfoID.Neutron1],
},
[WalletID.Vectis]: {
name: 'Vectis Wallet',
install: 'Install Vectis Wallet',
installURL: 'https://chrome.google.com/webstore/detail/vectis/cgkaddoglojnmfiblgmlinfaijcdpfjm',
description: 'Vectis Smart Contract Wallet',
imageURL: '/images/wallets/vectis.png',
supportedChains: [ChainInfoID.NeutronTestnet, ChainInfoID.Neutron1],
},
}

View File

@ -1,8 +1,8 @@
import { Coin } from '@cosmjs/launchpad'
import { TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { extractCoinFromLog } from 'libs/parse'
export const getFeeFromResponse = (response: TxBroadcastResult): Coin | null => {
export const getFeeFromResponse = (response: BroadcastResult): Coin | null => {
const stringValue = response?.response.events
.filter((msg: Record<string, string>) => msg.type === 'tx')
.map((msg: Record<string, string>) => msg.attributes)

View File

@ -1,4 +1,4 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import { ChainInfoID } from 'types/enums/wallet'
type Options = {
from: Asset
@ -26,7 +26,7 @@ export const getSwapUrl = (options: Options) => {
return `${baseUrl}?from=${fromName}&to=${toName}`
}
if (chain === ChainInfoID.Neutron || chain === ChainInfoID.NeutronTestnet) {
if (chain === ChainInfoID.Neutron1 || chain === ChainInfoID.NeutronTestnet) {
fromName = from.denom.replace('/', '%2F')
toName = to.denom.replace('/', '%2F')
return `${baseUrl}?from=${fromName}&to=${toName}`

View File

@ -6,8 +6,8 @@ interface Props {
}
export const useAsset = (props: Props) => {
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const otherAssets = useStore((s) => s.otherAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const otherAssets = useStore((s) => s.networkConfig.assets.other)
const assets = [...whitelistedAssets, ...otherAssets]
if (props.denom) {

View File

@ -1,4 +1,4 @@
import { TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import { getTokenValueFromCoins } from 'functions/fields'
import { useUnlockMessages } from 'hooks/queries'
import { extractCoinFromLog, parseActionMessages } from 'libs/parse'
@ -8,7 +8,7 @@ import useStore from 'store'
import { Coin } from 'types/generated/mars-credit-manager/MarsCreditManager.types'
export const useFieldsActionMessages = (
data?: TxBroadcastResult,
data?: BroadcastResult,
vault?: ActiveVault,
): {
depositMessage?: FieldsAction
@ -18,7 +18,7 @@ export const useFieldsActionMessages = (
unlockMessages?: FieldsAction[]
withdrawMessage?: FieldsAction
} => {
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const { t } = useTranslation()
const [vaultTokenAmount, setVaultTokenAmount] = useState('')
const [depositMessage, setDepositMessage] = useState<FieldsAction>()

View File

@ -12,7 +12,7 @@ interface Props {
export const useClosePosition = (props: Props) => {
const getExchangeRate = useStore((s) => s.getExchangeRate)
const slippage = useStore((s) => s.slippage)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const networkConfig = useStore((s) => s.networkConfig)
const isV2 = !!networkConfig.contracts?.params

View File

@ -29,12 +29,16 @@ export interface DepositAndDebtData {
stATOMDebt: string
NTRNDeposits: string
NTRNDebt: string
TIADeposits: string
TIADebt: string
stOSMODeposits: string
stOSMODebt: string
}
}
export const useDepositAndDebt = () => {
const hiveUrl = useStore((s) => s.networkConfig.hiveUrl)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const redBankAddress = useStore((s) => s.networkConfig.contracts.redBank) || ''
const marketInfo = useStore((s) => s.marketInfo)
const processDepositAndDebtQuery = useStore((s) => s.processDepositAndDebtQuery)

View File

@ -1,4 +1,4 @@
import { MsgExecuteContract } from '@marsprotocol/wallet-connector'
import { MsgExecuteContract } from '@delphi-labs/shuttle-react'
import { useQuery } from '@tanstack/react-query'
import BigNumber from 'bignumber.js'
import { GAS_ADJUSTMENT } from 'constants/appConstants'

View File

@ -1,6 +1,6 @@
import { MsgExecuteContractEncodeObject } from '@cosmjs/cosmwasm-stargate'
import { Coin } from '@cosmjs/proto-signing'
import { MsgExecuteContract } from '@marsprotocol/wallet-connector'
import { MsgExecuteContract } from '@delphi-labs/shuttle-react'
import { useQuery } from '@tanstack/react-query'
import BigNumber from 'bignumber.js'
import { GAS_ADJUSTMENT } from 'constants/appConstants'

View File

@ -8,7 +8,7 @@ import { QUERY_KEYS } from 'types/enums/queryKeys'
export const useMarsOracle = () => {
const hiveUrl = useStore((s) => s.networkConfig.hiveUrl)
const oracleAddress = useStore((s) => s.networkConfig.contracts.oracle)
const whitelistedAssets = useStore((s) => s.whitelistedAssets) || []
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist) || []
const processMarsOracleQuery = useStore((s) => s.processMarsOracleQuery)
const setExchangeRatesState = useStore((s) => s.setExchangeRatesState)

View File

@ -9,10 +9,10 @@ import { QUERY_KEYS } from 'types/enums/queryKeys'
export const useRedBank = () => {
const networkConfig = useStore((s) => s.networkConfig)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const processRedBankQuery = useStore((s) => s.processRedBankQuery)
const setRedBankState = useStore((s) => s.setRedBankState)
const { data: assetParams, isLoading } = useAssetParams()
const whitelistedAssets = networkConfig.assets.whitelist
const hiveUrl = networkConfig.hiveUrl
const redbankAddress = networkConfig.contracts.redBank
const incentivesAddress = networkConfig.contracts.incentives

View File

@ -16,7 +16,7 @@ export const useUnlockMessages = (props: Props) => {
const client = useStore((s) => s.client)
const userWalletAddress = useStore((s) => s.userWalletAddress)
const creditManagerClient = useStore((s) => s.creditManagerClient)
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
return useQuery<FieldsAction[] | null>(
[QUERY_KEYS.UNLOCK_MESSAGE],

View File

@ -9,8 +9,8 @@ import { QUERY_KEYS } from 'types/enums/queryKeys'
export const useUsdPrice = () => {
let usdPriceUrl = useStore((s) => s.networkConfig.usdPriceUrl)
let hasPriceFeeds = false
const whitelistedAssets = useStore((s) => s.whitelistedAssets)
const otherAssets = useStore((s) => s.otherAssets)
const whitelistedAssets = useStore((s) => s.networkConfig.assets.whitelist)
const otherAssets = useStore((s) => s.networkConfig.assets.other)
const assetPricesUSD = useStore((s) => s.assetPricesUSD ?? [])
const basePriceState = useStore((s) => s.basePriceState)
const baseAsset = useStore((s) => s.networkConfig.assets.base)

View File

@ -0,0 +1,12 @@
import { useShuttle } from '@delphi-labs/shuttle-react'
import { useMemo } from 'react'
import useStore from 'store'
export default function useCurrentWallet() {
const { wallets } = useShuttle()
const chainId = useStore((s) => s.networkConfig.name)
return useMemo(() => {
return wallets.find((wallet) => wallet.network.chainId === chainId)
}, [wallets, chainId])
}

5
src/images/akt.svg Normal file
View File

@ -0,0 +1,5 @@
<svg width="800" height="800" viewBox="0 0 800 800" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M278.2 77L630.637 686L748 482.977L513.1 77H278.2V77Z" fill="#F34C2D" />
<path d="M278.2 494.6L400.087 686H643.6L521.887 494.6H278.2V494.6Z" fill="#BE312D" />
<path d="M173.8 268.4L52 477.2L173.887 686L417.4 268.4H173.8Z" fill="#F34C2D" />
</svg>

After

Width:  |  Height:  |  Size: 366 B

View File

@ -1,20 +1,30 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500">
<circle cx="1250" cy="1250" r="1250" fill="#2e3148" />
<circle cx="1250" cy="1250" r="725.31" fill="#1b1e36" />
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500">
<circle fill="#2E3148" cx="1250" cy="1250" r="1250" />
<circle fill="#1B1E36" cx="1250.4" cy="1250.4" r="619.2" />
<path
d="M1252.57,159.47c-134.93,0-244.34,489.4-244.34,1093.11s109.41,1093.11,244.34,1093.11,244.34-489.4,244.34-1093.11S1387.5,159.47,1252.57,159.47ZM1269.44,2284c-15.43,20.58-30.86,5.14-30.86,5.14-62.14-72-93.21-205.76-93.21-205.76-108.69-349.79-82.82-1100.82-82.82-1100.82,51.08-596.24,144-737.09,175.62-768.36a19.29,19.29,0,0,1,24.74-2c45.88,32.51,84.36,168.47,84.36,168.47,113.63,421.81,103.34,817.9,103.34,817.9,10.29,344.65-56.94,730.45-56.94,730.45C1341.92,2222.22,1269.44,2284,1269.44,2284Z"
fill="#6f7390"
fill="#6F7390"
d="M1252.6,319.4c-115.2,0-208.6,417.8-208.6,933.1s93.4,933.1,208.6,933.1s208.6-417.8,208.6-933.1
S1367.8,319.4,1252.6,319.4z M1267,2133.1c-13.2,17.6-26.3,4.4-26.3,4.4c-53-61.5-79.6-175.6-79.6-175.6
c-92.8-298.6-70.7-939.7-70.7-939.7c43.6-509,122.9-629.2,149.9-655.9c5.7-5.6,14.6-6.3,21.1-1.7c39.2,27.8,72,143.8,72,143.8
c97,360.1,88.2,698.2,88.2,698.2c8.8,294.2-48.6,623.6-48.6,623.6C1328.8,2080.3,1267,2133.1,1267,2133.1z"
/>
<path
d="M2200.72,708.59c-67.18-117.08-546.09,31.58-1070,332s-893.47,638.89-826.34,755.92,546.09-31.58,1070-332,893.47-638.89,826.34-755.92h0ZM366.36,1780.45c-25.72-3.24-19.91-24.38-19.91-24.38C378,1666.36,478.4,1572.84,478.4,1572.84c249.43-268.36,913.79-619.65,913.79-619.65,542.54-252.42,711.06-241.77,753.81-230a19.29,19.29,0,0,1,14,20.58c-5.14,56-104.17,157-104.17,157C1746.71,1209.36,1398,1397.58,1398,1397.58c-293.83,180.5-661.93,314.09-661.93,314.09-280.09,100.93-369.7,68.78-369.7,68.78h0Z"
fill="#6f7390"
fill="#6F7390"
d="M2062,788.2c-57.3-99.9-466.2,27-913.4,283.4S385.8,1617,443.1,1716.9c57.3,99.9,466.2-27,913.4-283.4
S2119.3,888.1,2062,788.2L2062,788.2z M496,1703.2c-22-2.8-17-20.8-17-20.8C506,1605.8,591.7,1526,591.7,1526
c212.9-229.1,780.1-529,780.1-529c463.1-215.5,607-206.4,643.5-196.3c7.7,2.2,12.8,9.6,12,17.6c-4.4,47.8-88.9,134-88.9,134
c-263.9,263.4-561.6,424.1-561.6,424.1c-250.8,154.1-565.1,268.1-565.1,268.1C572.5,1730.6,496.1,1703.2,496,1703.2L496,1703.2
L496,1703.2z"
/>
<path
d="M2198.35,1800.41c67.7-116.77-300.93-456.79-823-759.47S374.43,587.76,306.79,704.73s300.93,456.79,823.3,759.47S2130.71,1917.39,2198.35,1800.41ZM351.65,749.85c-10-23.71,11.11-29.42,11.11-29.42C456.22,702.78,587.5,743,587.5,743c357.15,81.33,994,480.25,994,480.25,490.33,343.11,565.53,494.24,576.8,537.14a19.29,19.29,0,0,1-10.7,22.43c-51.13,23.41-188.07-11.47-188.07-11.47-422.07-113.17-759.62-320.52-759.62-320.52-303.29-163.58-603.19-415.28-603.19-415.28-227.88-191.87-245-285.44-245-285.44Z"
fill="#6f7390"
fill="#6F7390"
d="M2059.9,1720.2c57.8-99.7-256.9-389.9-702.6-648.3S502.9,685,445.2,784.9s256.9,389.9,702.8,648.3
S2002.2,1820.1,2059.9,1720.2z M483.5,823.4c-8.5-20.2,9.5-25.1,9.5-25.1c79.8-15.1,191.9,19.3,191.9,19.3
c304.9,69.4,848.5,410,848.5,410c418.6,292.9,482.8,421.9,492.4,458.5c2,7.8-1.8,15.8-9.1,19.1c-43.6,20-160.5-9.8-160.5-9.8
c-360.3-96.6-648.5-273.6-648.5-273.6c-258.9-139.6-514.9-354.5-514.9-354.5C498.2,903.5,483.5,823.6,483.5,823.6L483.5,823.4z"
/>
<circle cx="1250" cy="1250" r="128.6" fill="#b7b9c8" />
<ellipse cx="1777.26" cy="756.17" rx="74.59" ry="77.16" fill="#b7b9c8" />
<ellipse cx="552.98" cy="1018.52" rx="74.59" ry="77.16" fill="#b7b9c8" />
<ellipse cx="1098.25" cy="1965.02" rx="74.59" ry="77.16" fill="#b7b9c8" />
<circle fill="#B7B9C8" cx="1250.4" cy="1250.4" r="109.8" />
<ellipse fill="#B7B9C8" cx="1700.5" cy="828.8" rx="63.7" ry="65.9" />
<ellipse fill="#B7B9C8" cx="655.4" cy="1052.8" rx="63.7" ry="65.9" />
<ellipse fill="#B7B9C8" cx="1120.8" cy="1860.8" rx="63.7" ry="65.9" />
</svg>

Before

Width:  |  Height:  |  Size: 2.0 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File

@ -1,15 +1,10 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24">
<path fill="#FFFFFF" d="M12,24c6.6,0,12-5.4,12-12S18.6,0,12,0S0,5.4,0,12S5.4,24,12,24z" />
<svg width="501" height="501" viewBox="0 0 501 501" xmlns="http://www.w3.org/2000/svg">
<path
d="M12.9,10.8l4.5-4.4l-1.7-1.7L12,8.2L8.4,4.7L6.6,6.4l4.5,4.5c0.2,0.2,0.5,0.3,0.9,0.3S12.6,11,12.9,10.8L12.9,10.8z"
d="M250.75 500.75C388.82 500.75 500.75 388.82 500.75 250.75C500.75 112.679 388.82 0.75 250.75 0.75C112.679 0.75 0.75 112.679 0.75 250.75C0.75 388.82 112.679 500.75 250.75 500.75Z"
fill="#FFFFFF"
/>
<path
d="M19.4,15.6L15.8,12l3.6-3.6l-1.7-1.7l-4.5,4.5c-0.4,0.4-0.4,1.2,0,1.7l4.5,4.5L19.4,15.6z"
/>
<path
d="M12,15.7l3.6,3.6l1.7-1.7l-4.5-4.5c-0.4-0.4-1.3-0.4-1.7,0l-4.5,4.4l1.7,1.7L12,15.7L12,15.7z"
/>
<path
d="M10.8,12.9c0.2-0.2,0.3-0.5,0.3-0.9s-0.1-0.6-0.3-0.9L6.3,6.6L4.6,8.4L8.2,12l-3.6,3.6l1.7,1.7L10.8,12.9z"
d="M273.334 220.069L391.959 101.448L346.955 56.4492L250.835 152.568L154.715 56.4492L109.714 101.448L228.336 220.069C234.549 226.281 242.692 229.389 250.835 229.389C258.978 229.389 267.121 226.284 273.334 220.069ZM445.056 346.79L348.936 250.671L445.056 154.549L400.055 109.551L281.436 228.172C269.012 240.598 269.012 260.744 281.436 273.17L400.055 391.792L445.056 346.79ZM250.67 348.934L346.79 445.053L391.788 400.054L273.169 281.433C260.74 269.006 240.598 269.006 228.168 281.433L109.549 400.054L154.55 445.053L250.67 348.934ZM220.069 273.333C226.039 267.364 229.39 259.273 229.39 250.834C229.39 242.395 226.039 234.301 220.069 228.334L101.45 109.713L56.4492 154.715L152.569 250.834L56.4492 346.955L101.45 391.954L220.069 273.333Z"
fill="#000000"
/>
</svg>

Before

Width:  |  Height:  |  Size: 668 B

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,4 +1,4 @@
<svg viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<path
d="M12 24C18.6499 24 24 18.6499 24 12C24 5.3501 18.6499 0 12 0C5.3501 0 0 5.3501 0 12C0 18.6499 5.3501 24 12 24Z"
fill="#2775CA"
@ -15,26 +15,21 @@
d="M20 24C22.2091 24 24 22.2091 24 20C24 17.7909 22.2091 16 20 16C17.7909 16 16 17.7909 16 20C16 22.2091 17.7909 24 20 24Z"
fill="white"
/>
<circle fill="#FFFFFF" cx="20" cy="20" r="3.5" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M20 23.5C21.933 23.5 23.5 21.933 23.5 20C23.5 18.067 21.933 16.5 20 16.5C18.067 16.5 16.5 18.067 16.5 20C16.5 21.933 18.067 23.5 20 23.5ZM24 20C24 22.2091 22.2091 24 20 24C17.7909 24 16 22.2091 16 20C16 17.7909 17.7909 16 20 16C22.2091 16 24 17.7909 24 20Z"
fill="black"
d="M20,16c-2.2,0-4,1.8-4,4s1.8,4,4,4s4-1.8,4-4S22.2,16,20,16z M20,23.5c-1.9,0-3.5-1.6-3.5-3.5s1.6-3.5,3.5-3.5
s3.5,1.6,3.5,3.5S21.9,23.5,20,23.5z"
/>
<path
d="M20.266 19.6405L21.6634 18.2507L21.1332 17.7236L20.0006 18.8499L18.8681 17.7236L18.3379 18.2507L19.7352 19.6405C19.8086 19.7133 19.9046 19.7497 20 19.7497C20.0954 19.7497 20.192 19.7133 20.2648 19.6405H20.266Z"
fill="black"
d="M20.3,19.6l1.4-1.4l-0.5-0.5L20,18.8l-1.1-1.1l-0.5,0.5l1.4,1.4c0.1,0.1,0.2,0.1,0.3,0.1S20.2,19.7,20.3,19.6L20.3,19.6z"
/>
<path
d="M22.2886 21.1251L21.1561 19.9988L22.2886 18.8725L21.7584 18.3455L20.3611 19.7353C20.2149 19.8808 20.2149 20.1168 20.3611 20.2623L21.7584 21.6521L22.2886 21.1251Z"
fill="black"
d="M22.3,21.1L21.2,20l1.1-1.1l-0.5-0.5l-1.4,1.4c-0.1,0.1-0.1,0.4,0,0.5l1.4,1.4L22.3,21.1z"
/>
<path
d="M19.9985 21.1501L21.1311 22.2764L21.6613 21.7493L20.264 20.3595C20.1178 20.214 19.88 20.214 19.7338 20.3595L18.3364 21.7493L18.8666 22.2764L19.9992 21.1501H19.9985Z"
fill="black"
d="M20,21.2l1.1,1.1l0.5-0.5l-1.4-1.4c-0.1-0.1-0.4-0.1-0.5,0l-1.4,1.4l0.5,0.5L20,21.2L20,21.2z"
/>
<path
d="M19.6385 20.2642C19.7087 20.1945 19.7483 20.0991 19.7483 20.0006C19.7483 19.9021 19.7087 19.8067 19.6385 19.7371L18.2411 18.3473L17.7109 18.8743L18.8435 20.0006L17.7109 21.1269L18.2411 21.654L19.6385 20.2642Z"
fill="black"
d="M19.6,20.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1.4-1.4l-0.5,0.5l1.1,1.1L17.7,21l0.5,0.5L19.6,20.3z"
/>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 3.1 KiB

View File

@ -1,38 +1,36 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
<path
fill="#FFFFFF"
d="M23.6,14.9C22,21.3,15.5,25.2,9,23.6C2.6,22-1.3,15.5,0.3,9.1C1.9,2.7,8.4-1.2,14.8,0.4
C21.3,2,25.2,8.5,23.6,14.9L23.6,14.9L23.6,14.9z"
d="M12,0.9C5.9,0.9,0.9,5.9,1,12c0,6.1,5,11.1,11.1,11c6.1,0,11-5,11-11.1C23.1,5.9,18.1,0.9,12,0.9
L12,0.9z"
/>
<path
fill="#282138"
d="M12,24C5.4,24,0,18.6,0,12
S5.4,0,12,0s12,5.4,12,12S18.6,24,12,24L12,24z M12,0.9C5.9,0.9,0.9,5.9,1,12c0,6.1,5,11.1,11.1,11c6.1,0,11-5,11-11.1
C23.1,5.9,18.1,0.9,12,0.9L12,0.9z"
/>
<path
fill="#5A5564"
d="M19.6,5l-0.7,0.7c3.3,3.6,3.3,9,0,12.6l0.7,0.7C23.2,15,23.2,9,19.6,5L19.6,5z"
/>
<path fill="#5A5564" d="M5.7,5.1c3.6-3.3,9-3.3,12.6,0L19,4.4C15,0.8,9,0.8,5,4.4L5.7,5.1z" />
<path fill="#5A5564" d="M5.1,18.3c-3.3-3.6-3.3-9,0-12.6L4.4,5C0.8,9,0.8,15,4.4,19L5.1,18.3z" />
<path fill="#5A5564" d="M5.7,5.1c3.6-3.3,9-3.3,12.6,0L19,4.4c-4-3.6-10-3.6-14,0L5.7,5.1z" />
<path fill="#5A5564" d="M5.1,18.3c-3.3-3.6-3.3-9,0-12.6L4.4,5c-3.6,4-3.6,10,0,14L5.1,18.3z" />
<path
fill="#5A5564"
d="M18.3,18.9c-3.6,3.3-9,3.3-12.6,0L5,19.6c3.9,3.6,10,3.6,13.9,0L18.3,18.9z"
/>
<path
fill="#F09242"
d="M16.2,9.8c-0.1-1.4-1.3-1.8-2.8-2V5.9h-1.2v1.9c-0.3,0-0.6,0-0.9,0V5.9h-1.2v1.9H7.8v1.2
c0,0,0.9,0,0.8,0c0.3,0,0.6,0.2,0.7,0.5v5.2c0,0.1-0.1,0.2-0.1,0.3c-0.1,0.1-0.2,0.1-0.3,0.1c0,0-0.8,0-0.8,0l-0.2,1.4h2.3v1.9
h1.2v-1.9h0.9v1.9h1.2v-1.9c2-0.1,3.3-0.6,3.5-2.4c0.1-1.5-0.6-2.1-1.7-2.4C15.8,11.4,16.3,10.8,16.2,9.8z M14.5,13.9
c0,1.4-2.5,1.3-3.3,1.3v-2.6C12.1,12.6,14.5,12.4,14.5,13.9z M14,10.3c0,1.3-2.1,1.2-2.7,1.2V9.2C11.9,9.2,14,9,14,10.3z"
d="M16.2,9.8c-0.1-1.4-1.3-1.8-2.8-2V5.9h-1.2v1.9c-0.3,0-0.6,0-0.9,0V5.9h-1.2v1.9H7.8V9
c0,0,0.9,0,0.8,0c0.3,0,0.6,0.2,0.7,0.5v5.2c0,0.1-0.1,0.2-0.1,0.3c-0.1,0.1-0.2,0.1-0.3,0.1H8.1l-0.2,1.4h2.3v1.9h1.2v-1.9h0.9v1.9
h1.2v-1.9c2-0.1,3.3-0.6,3.5-2.4c0.1-1.5-0.6-2.1-1.7-2.4C15.8,11.4,16.3,10.8,16.2,9.8z M14.5,13.9c0,1.4-2.5,1.3-3.3,1.3v-2.6
C12.1,12.6,14.5,12.4,14.5,13.9z M14,10.3c0,1.3-2.1,1.2-2.7,1.2V9.2C11.9,9.2,14,9,14,10.3z"
/>
<circle fill="#FFFFFF" cx="20" cy="20" r="3.5" />
<path
fill="#282138"
d="M12,24C5.4,24,0,18.6,0,12S5.4,0,12,0c6.6,0,12,5.4,12,12C24,18.6,18.6,24,12,24
C12,24,12,24,12,24z M12,0.9c-6.1,0-11.1,5-11,11.1c0,6.1,5,11.1,11.1,11c6.1,0,11-5,11-11.1C23.1,5.9,18.1,0.9,12,0.9
C12,0.9,12,0.9,12,0.9z"
/>
<path fill="#FFFFFF" d="M20,24c2.2,0,4-1.8,4-4s-1.8-4-4-4s-4,1.8-4,4S17.8,24,20,24z" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M20,23.5c1.9,0,3.5-1.6,3.5-3.5s-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5
S18.1,23.5,20,23.5z M24,20c0,2.2-1.8,4-4,4s-4-1.8-4-4s1.8-4,4-4S24,17.8,24,20z"
d="M20,16c-2.2,0-4,1.8-4,4s1.8,4,4,4s4-1.8,4-4S22.2,16,20,16z M20,23.5c-1.9,0-3.5-1.6-3.5-3.5s1.6-3.5,3.5-3.5
s3.5,1.6,3.5,3.5S21.9,23.5,20,23.5z"
/>
<path
d="M20.3,19.6l1.4-1.4l-0.5-0.5L20,18.8l-1.1-1.1l-0.5,0.5l1.4,1.4c0.1,0.1,0.2,0.1,0.3,0.1S20.2,19.7,20.3,19.6L20.3,19.6z"
@ -44,6 +42,6 @@
d="M20,21.2l1.1,1.1l0.5-0.5l-1.4-1.4c-0.1-0.1-0.4-0.1-0.5,0l-1.4,1.4l0.5,0.5L20,21.2L20,21.2z"
/>
<path
d="M19.6,20.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1.4-1.4l-0.5,0.5l1.1,1.1l-1.1,1.1l0.5,0.5L19.6,20.3z"
d="M19.6,20.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1.4-1.4l-0.5,0.5l1.1,1.1L17.7,21l0.5,0.5L19.6,20.3z"
/>
</svg>

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

@ -11,11 +11,10 @@
<polygon fill="#141414" points="11.9,16.1 18.5,12.2 11.9,9.2" />
<polygon fill="#393939" points="5.3,12.2 11.9,16.1 11.9,9.2" />
<path fill="#FFFFFF" d="M20,24c2.2,0,4-1.8,4-4s-1.8-4-4-4s-4,1.8-4,4S17.8,24,20,24z" />
<circle fill="#FFFFFF" cx="20" cy="20" r="3.5" />
<path
fill-rule="evenodd"
clip-rule="evenodd"
d="M20,23.5c1.9,0,3.5-1.6,3.5-3.5s-1.6-3.5-3.5-3.5s-3.5,1.6-3.5,3.5
S18.1,23.5,20,23.5z M24,20c0,2.2-1.8,4-4,4s-4-1.8-4-4s1.8-4,4-4S24,17.8,24,20z"
d="M20,16c-2.2,0-4,1.8-4,4s1.8,4,4,4s4-1.8,4-4S22.2,16,20,16z M20,23.5c-1.9,0-3.5-1.6-3.5-3.5s1.6-3.5,3.5-3.5
s3.5,1.6,3.5,3.5S21.9,23.5,20,23.5z"
/>
<path
d="M20.3,19.6l1.4-1.4l-0.5-0.5L20,18.8l-1.1-1.1l-0.5,0.5l1.4,1.4c0.1,0.1,0.2,0.1,0.3,0.1S20.2,19.7,20.3,19.6L20.3,19.6z"
@ -27,6 +26,6 @@
d="M20,21.2l1.1,1.1l0.5-0.5l-1.4-1.4c-0.1-0.1-0.4-0.1-0.5,0l-1.4,1.4l0.5,0.5L20,21.2L20,21.2z"
/>
<path
d="M19.6,20.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1.4-1.4l-0.5,0.5l1.1,1.1l-1.1,1.1l0.5,0.5L19.6,20.3z"
d="M19.6,20.3c0.1-0.1,0.1-0.2,0.1-0.3c0-0.1,0-0.2-0.1-0.3l-1.4-1.4l-0.5,0.5l1.1,1.1L17.7,21l0.5,0.5L19.6,20.3z"
/>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.5 KiB

49
src/images/dydx.svg Normal file
View File

@ -0,0 +1,49 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 183 183">
<linearGradient
id="SVGID_1_"
gradientUnits="userSpaceOnUse"
x1="118.0355"
y1="-18.8161"
x2="77.9251"
y2="147.935"
>
<stop offset="0" style="stop-color: #2c2c3d" />
<stop offset="1" style="stop-color: #1a1a27" />
</linearGradient>
<circle fill="url(#SVGID_1_)" cx="91.5" cy="91.5" r="91.5" />
<path fill="#FFFFFF" d="M115.3,43L45,142h21.6l70.7-99H115.3z" />
<linearGradient
id="SVGID_00000106827002470044673030000001171600924551666862_"
gradientUnits="userSpaceOnUse"
x1="61.8353"
y1="133.1399"
x2="90.8403"
y2="97.5069"
gradientTransform="matrix(1 0 0 -1 0 184)"
>
<stop offset="0" style="stop-color: #ffffff" />
<stop offset="1" style="stop-color: #ffffff; stop-opacity: 0.55" />
</linearGradient>
<path
fill="url(#SVGID_00000106827002470044673030000001171600924551666862_)"
d="M68.8,43l20.7,29.2L78.7,88.1L46.8,43H68.8
z"
/>
<linearGradient
id="SVGID_00000161606561320459564780000007380593092155056794_"
gradientUnits="userSpaceOnUse"
x1="122.9471"
y1="49.9417"
x2="87.3754"
y2="98.7424"
gradientTransform="matrix(1 0 0 -1 0 184)"
>
<stop offset="0" style="stop-color: #6966ff" />
<stop offset="1" style="stop-color: #6966ff; stop-opacity: 0.36" />
</linearGradient>
<path
fill="url(#SVGID_00000161606561320459564780000007380593092155056794_)"
d="M117.4,142l-22.9-32.3l10.8-15.5L139,142
H117.4z"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

34
src/images/inj.svg Normal file
View File

@ -0,0 +1,34 @@
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="600" fill="none" viewBox="0 0 600 600">
<path
fill="url(#paint0_linear)"
d="M148.497 169.135C150.981 166.013 153.613 163.009 156.245 160.005C156.363 159.856 156.63 159.826 156.748 159.677C156.985 159.38 157.37 159.201 157.606 158.903L157.843 158.606C159.678 156.91 161.63 155.064 163.881 153.456C171.845 147.41 180.11 142.817 188.825 139.795C216.778 129.981 247.894 136.029 272.295 159.065C306.366 191.002 303.315 242.451 276.117 276.647C241.748 327.625 182.684 398.748 264.463 462.46C279.167 473.916 290.075 483.361 336.392 496.746C306.1 502.326 278.012 500.59 246.748 492.605C224.634 480.123 189.866 453.397 178.037 417.3C160.159 362.562 209.513 280.732 233.365 249.216C266.113 205.599 213.124 158.382 174.112 211.095C153.72 238.566 118.044 316.303 130.442 373.965C137.691 406.664 147.353 430.499 185.663 463.241C178.559 459.049 171.66 454.294 164.968 448.974C75.957 366.06 86.2838 237.859 148.497 169.135Z"
/>
<path
fill="url(#paint1_linear)"
d="M451.503 430.865C449.019 433.987 446.387 436.991 443.755 439.995C443.637 440.144 443.37 440.174 443.252 440.323C443.015 440.62 442.63 440.799 442.394 441.097L442.157 441.394C440.322 443.09 438.37 444.936 436.119 446.544C428.155 452.59 419.89 457.183 411.175 460.205C383.222 470.019 352.106 463.971 327.705 440.935C293.634 408.998 296.685 357.549 323.883 323.353C358.252 272.375 417.316 201.252 335.537 137.54C320.833 126.084 309.925 116.639 263.608 103.254C293.9 97.6736 321.988 99.4095 353.251 107.395C375.366 119.877 410.134 146.603 421.963 182.7C439.841 237.438 390.487 319.268 366.635 350.784C333.887 394.401 386.876 441.618 425.888 388.905C446.28 361.434 481.956 283.697 469.558 226.035C462.309 193.336 452.647 169.501 414.337 136.759C421.441 140.951 428.34 145.706 435.032 151.026C524.043 233.94 513.716 362.141 451.503 430.865Z"
/>
<defs>
<linearGradient
id="paint0_linear"
x1="100"
x2="500"
y1="300"
y2="300"
gradientUnits="userSpaceOnUse"
>
<stop stop-color="#0082FA" />
<stop offset="1" stop-color="#00F2FE" />
</linearGradient>
<linearGradient
id="paint1_linear"
x1="100"
x2="500"
y1="300"
y2="300"
gradientUnits="userSpaceOnUse"
>
<stop stop-color="#0082FA" />
<stop offset="1" stop-color="#00F2FE" />
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -1,124 +1,29 @@
<svg
viewBox="0 0 24 24"
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xml:space="preserve"
xmlns:serif="http://www.serif.com/"
style="fill-rule: evenodd; clip-rule: evenodd"
>
<path
d="M12.985,0.812C13.949,0.812 14.279,0.928 14.929,1.155C15.091,1.211 15.273,1.275 15.49,1.345C19.947,2.795 23.25,7.071 23.25,12.005C23.25,12.829 23.133,13.721 22.963,14.506C22.196,17.622 20.213,20.269 17.543,21.804C16.213,22.568 14.67,23.131 13.068,23.239C12.8,23.257 11.93,23.249 11.339,23.243C11.126,23.241 10.95,23.239 10.85,23.239C5.061,22.419 0.75,18.142 0.75,12.005C0.75,10.447 1.047,8.887 1.653,7.454C2.282,5.968 3.362,4.699 4.486,3.6C5.476,2.634 6.7,2.1 7.906,1.574C8.081,1.498 8.255,1.422 8.428,1.345C9.05,1.068 9.469,1.008 9.996,0.932C10.214,0.9 10.45,0.866 10.727,0.812C11.214,0.719 11.726,0.75 12.234,0.781C12.486,0.797 12.738,0.812 12.985,0.812Z"
fill="url(#_MarsGradient)"
/>
<path
d="M12.985,0.812C13.949,0.812 14.279,0.928 14.929,1.155C15.091,1.211 15.273,1.275 15.49,1.345C19.947,2.795 23.25,7.071 23.25,12.005C23.25,12.829 23.133,13.721 22.963,14.506C22.196,17.622 20.213,20.269 17.543,21.804C16.213,22.568 14.67,23.131 13.068,23.239C12.8,23.257 11.93,23.249 11.339,23.243C11.126,23.241 10.95,23.239 10.85,23.239C5.061,22.419 0.75,18.142 0.75,12.005C0.75,10.447 1.047,8.887 1.653,7.454C2.282,5.968 3.362,4.699 4.486,3.6C5.476,2.634 6.7,2.1 7.906,1.574C8.081,1.498 8.255,1.422 8.428,1.345C9.05,1.068 9.469,1.008 9.996,0.932C10.214,0.9 10.45,0.866 10.727,0.812C11.214,0.719 11.726,0.75 12.234,0.781C12.486,0.797 12.738,0.812 12.985,0.812Z"
fill="none"
stroke-width="1px"
stroke="#FFFFFF"
/>
<path
d="M11.999,0.166L15.656,0.746L18.955,2.426L21.573,5.044L23.254,8.342L23.834,11.999L23.254,15.656L21.573,18.955L18.955,21.573L15.656,23.254L11.999,23.834L8.343,23.254L5.044,21.573L2.426,18.955L0.746,15.656L0.166,11.999L0.746,8.343L2.426,5.044L5.044,2.426L8.343,0.746L11.999,0.166ZM8.549,1.381L5.436,2.966L2.967,5.436L1.381,8.549L0.834,11.999L1.381,15.45L2.967,18.562L5.436,21.032L8.549,22.619L11.999,23.166L15.45,22.619L18.562,21.032L21.032,18.562L22.619,15.45L23.166,11.999L22.619,8.549L21.032,5.436L18.562,2.966L15.45,1.381L11.999,0.834L8.549,1.381Z"
fill="#FFFFFF"
/>
<path
d="M11.915,3.928C11.993,3.881 12.094,3.907 12.141,3.985L14.738,8.343C14.785,8.421 14.759,8.523 14.681,8.569C14.603,8.616 14.501,8.59 14.455,8.512L11.857,4.154C11.811,4.076 11.836,3.975 11.915,3.928Z"
fill="#FFFFFF"
/>
<path
d="M11.999,3.904L17.36,4.484L17.325,4.812L11.999,4.236L6.674,4.812L6.639,4.484L11.999,3.904Z"
fill="#FFFFFF"
/>
<path
d="M9.237,8.426C9.237,8.334 9.311,8.261 9.402,8.261L14.596,8.261C14.687,8.261 14.761,8.334 14.761,8.426C14.761,8.517 14.687,8.591 14.596,8.591L9.402,8.591C9.311,8.591 9.237,8.517 9.237,8.426Z"
fill="#FFFFFF"
/>
<path
d="M12.083,3.928C12.161,3.975 12.187,4.076 12.14,4.154L9.544,8.512C9.497,8.59 9.396,8.616 9.318,8.569C9.24,8.523 9.214,8.421 9.261,8.343L11.857,3.985C11.903,3.907 12.004,3.881 12.083,3.928Z"
fill="#FFFFFF"
/>
<path
d="M8.392,0.803L11.999,3.853L15.606,0.803L17.49,4.573L17.195,4.721L15.499,1.326L11.999,4.285L8.499,1.326L6.804,4.721L6.509,4.573L8.392,0.803Z"
fill="#FFFFFF"
/>
<path
d="M5.143,2.563C5.217,2.509 5.32,2.525 5.374,2.599L11.999,11.719L18.625,2.599C18.679,2.525 18.782,2.509 18.856,2.563C18.929,2.616 18.946,2.719 18.892,2.793L12.133,12.097C12.102,12.14 12.052,12.165 11.999,12.165C11.947,12.165 11.897,12.14 11.866,12.097L5.107,2.793C5.053,2.719 5.07,2.616 5.143,2.563Z"
fill="#FFFFFF"
/>
<path
d="M9.525,8.314C9.565,8.358 9.578,8.42 9.56,8.476L7.992,13.303L12.081,16.274L16.727,18.266C16.811,18.302 16.85,18.399 16.814,18.482C16.778,18.566 16.681,18.605 16.597,18.569L11.934,16.57C11.923,16.565 11.912,16.559 11.902,16.552L7.701,13.499C7.643,13.457 7.619,13.383 7.641,13.315L9.156,8.651L4.493,9.709C4.404,9.729 4.315,9.674 4.295,9.585C4.275,9.496 4.331,9.408 4.42,9.387L9.367,8.265C9.424,8.251 9.485,8.27 9.525,8.314Z"
fill="#FFFFFF"
/>
<path
d="M4.347,9.426C4.416,9.366 4.52,9.373 4.58,9.442L7.922,13.259C7.982,13.328 7.975,13.432 7.907,13.492C7.838,13.552 7.734,13.545 7.674,13.477L4.332,9.659C4.272,9.591 4.279,9.486 4.347,9.426Z"
fill="#FFFFFF"
/>
<path
d="M6.931,4.439L4.635,9.553L4.661,9.616L4.603,9.652L3.534,14.751L7.435,18.284L12.078,20.948L15.442,22.696L16.535,18.244L21.105,18.581L20.481,14.837L20.807,14.783L21.499,18.941L16.789,18.593L15.662,23.182L11.917,21.236L7.24,18.553L3.238,14.928L0.234,11.971L4.25,9.483L2.464,5.109L6.931,4.439ZM4.215,9.893L0.765,12.03L3.254,14.48L4.215,9.893ZM4.463,9.131L6.382,4.855L2.928,5.373L4.463,9.131Z"
fill="#FFFFFF"
/>
<path
d="M7.814,13.202C7.904,13.211 7.971,13.291 7.963,13.382L7.502,18.433C7.494,18.524 7.414,18.591 7.323,18.583C7.232,18.574 7.165,18.494 7.174,18.403L7.634,13.352C7.642,13.261 7.723,13.194 7.814,13.202Z"
fill="#FFFFFF"
/>
<path
d="M12.151,16.353C12.187,16.436 12.148,16.533 12.065,16.569L7.403,18.569C7.319,18.604 7.222,18.566 7.186,18.482C7.15,18.398 7.189,18.301 7.273,18.265L11.935,16.266C12.018,16.23 12.115,16.269 12.151,16.353Z"
fill="#FFFFFF"
/>
<path
d="M2.893,18.581L3.517,14.837L3.191,14.783L2.499,18.941L7.211,18.594L8.336,23.182L12.075,21.24L11.923,20.947L8.556,22.696L7.465,18.244L2.893,18.581Z"
fill="#FFFFFF"
/>
<path
d="M12.097,11.865C12.14,11.896 12.165,11.946 12.165,11.998L12.165,23.5C12.165,23.591 12.091,23.665 12,23.665C11.909,23.665 11.835,23.591 11.835,23.5L11.835,12.226L1.115,15.709C1.029,15.737 0.936,15.69 0.908,15.603C0.879,15.517 0.927,15.423 1.013,15.395L11.949,11.842C11.999,11.825 12.054,11.834 12.097,11.865Z"
fill="#FFFFFF"
/>
<path
d="M17.212,4.547C17.248,4.499 17.308,4.475 17.368,4.484L21.327,5.078C21.377,5.085 21.421,5.115 21.446,5.159C21.471,5.203 21.474,5.256 21.455,5.303L19.749,9.483L23.587,11.861C23.63,11.887 23.658,11.932 23.664,11.982C23.669,12.033 23.652,12.083 23.616,12.118L20.762,14.926L20.756,14.932L20.755,14.932C20.755,14.933 20.754,14.934 20.753,14.934L16.773,18.541C16.727,18.583 16.661,18.595 16.602,18.572C16.544,18.55 16.504,18.496 16.498,18.434L16.039,13.4L14.44,8.478C14.421,8.421 14.435,8.359 14.475,8.315C14.515,8.272 14.575,8.253 14.633,8.266L19.258,9.315L17.193,4.715C17.168,4.659 17.175,4.595 17.212,4.547ZM19.237,9.649L14.843,8.652L16.269,13.04L19.237,9.649ZM16.372,13.422L16.797,18.074L20.464,14.751L19.45,9.907L16.372,13.422ZM19.784,9.893L20.744,14.48L23.234,12.03L19.784,9.893ZM19.536,9.13L21.07,5.373L17.617,4.855L19.536,9.13Z"
fill="#FFFFFF"
/>
<path
d="M11.842,11.947C11.87,11.861 11.963,11.813 12.05,11.842L22.987,15.395C23.074,15.423 23.121,15.517 23.093,15.603C23.065,15.69 22.972,15.737 22.885,15.709L11.948,12.155C11.861,12.127 11.814,12.034 11.842,11.947Z"
fill="#FFFFFF"
/>
<path
d="M16.335,13.27C16.389,13.343 16.372,13.447 16.298,13.5L12.096,16.552C12.022,16.606 11.919,16.59 11.866,16.516C11.812,16.442 11.828,16.339 11.902,16.285L16.104,13.233C16.178,13.18 16.281,13.196 16.335,13.27Z"
fill="#FFFFFF"
/>
<path
d="M16.58,18.276C16.653,18.234 16.746,18.254 16.796,18.322L18.892,21.208C18.945,21.282 18.929,21.385 18.855,21.439C18.782,21.492 18.678,21.476 18.625,21.402L16.616,18.636L12.081,21.237C12.002,21.282 11.901,21.255 11.856,21.176C11.81,21.097 11.838,20.996 11.917,20.951L16.58,18.276Z"
fill="#FFFFFF"
/>
<path
d="M11.999,0.335C12.09,0.335 12.164,0.409 12.164,0.5L12.164,4.068C12.164,4.159 12.09,4.233 11.999,4.233C11.908,4.233 11.834,4.159 11.834,4.068L11.834,0.5C11.834,0.409 11.908,0.335 11.999,0.335Z"
fill="#FFFFFF"
/>
<path
d="M23.093,8.396C23.121,8.483 23.073,8.576 22.987,8.604L19.594,9.706C19.507,9.735 19.414,9.687 19.386,9.601C19.358,9.514 19.405,9.421 19.492,9.393L22.885,8.29C22.971,8.262 23.064,8.309 23.093,8.396Z"
fill="#FFFFFF"
/>
<path
d="M7.435,18.286C7.509,18.34 7.525,18.443 7.471,18.516L5.374,21.402C5.32,21.476 5.217,21.492 5.143,21.439C5.069,21.385 5.053,21.282 5.107,21.208L7.204,18.322C7.258,18.249 7.361,18.232 7.435,18.286Z"
fill="#FFFFFF"
/>
<path
d="M0.908,8.396C0.936,8.309 1.029,8.262 1.115,8.29L4.508,9.393C4.595,9.421 4.642,9.514 4.614,9.601C4.586,9.687 4.493,9.735 4.406,9.706L1.013,8.604C0.927,8.576 0.879,8.483 0.908,8.396Z"
fill="#FFFFFF"
/>
<defs>
<linearGradient
id="_MarsGradient"
x1="0"
y1="0"
x2="1"
y2="0"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(-14.8673,-14.7971,14.7971,-14.8673,20.4244,16.9042)"
>
<stop offset="0" stop-color="rgb(239,65,54)" stop-opacity="1" />
<stop offset="0.01" stop-color="rgb(239,65,54)" stop-opacity="1" />
<stop offset="0.32" stop-color="rgb(223,81,83)" stop-opacity="1" />
<stop offset="1" stop-color="rgb(172,11,27)" stop-opacity="1" />
</linearGradient>
</defs>
<svg width="100%" height="100%" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;">
<path d="M12.985,0.812C13.949,0.812 14.279,0.928 14.929,1.155C15.091,1.211 15.273,1.275 15.49,1.345C19.947,2.795 23.25,7.071 23.25,12.005C23.25,12.829 23.133,13.721 22.963,14.506C22.196,17.622 20.213,20.269 17.543,21.804C16.213,22.568 14.67,23.131 13.068,23.239C12.8,23.257 11.93,23.249 11.339,23.243C11.126,23.241 10.95,23.239 10.85,23.239C5.061,22.419 0.75,18.142 0.75,12.005C0.75,10.447 1.047,8.887 1.653,7.454C2.282,5.968 3.362,4.699 4.486,3.6C5.476,2.634 6.7,2.1 7.906,1.574C8.081,1.498 8.255,1.422 8.428,1.345C9.05,1.068 9.469,1.008 9.996,0.932C10.214,0.9 10.45,0.866 10.727,0.812C11.214,0.719 11.726,0.75 12.234,0.781C12.486,0.797 12.738,0.812 12.985,0.812Z" style="fill:url(#_Linear1);fill-rule:nonzero;"/>
<path d="M12.985,0.812C13.949,0.812 14.279,0.928 14.929,1.155C15.091,1.211 15.273,1.275 15.49,1.345C19.947,2.795 23.25,7.071 23.25,12.005C23.25,12.829 23.133,13.721 22.963,14.506C22.196,17.622 20.213,20.269 17.543,21.804C16.213,22.568 14.67,23.131 13.068,23.239C12.8,23.257 11.93,23.249 11.339,23.243C11.126,23.241 10.95,23.239 10.85,23.239C5.061,22.419 0.75,18.142 0.75,12.005C0.75,10.447 1.047,8.887 1.653,7.454C2.282,5.968 3.362,4.699 4.486,3.6C5.476,2.634 6.7,2.1 7.906,1.574C8.081,1.498 8.255,1.422 8.428,1.345C9.05,1.068 9.469,1.008 9.996,0.932C10.214,0.9 10.45,0.866 10.727,0.812C11.214,0.719 11.726,0.75 12.234,0.781C12.486,0.797 12.738,0.812 12.985,0.812Z" style="fill:none;fill-rule:nonzero;stroke:white;stroke-width:1px;"/>
<path d="M11.999,0.166L15.656,0.746L18.955,2.426L21.573,5.044L23.254,8.342L23.834,11.999L23.254,15.656L21.573,18.955L18.955,21.573L15.656,23.254L11.999,23.834L8.343,23.254L5.044,21.573L2.426,18.955L0.746,15.656L0.166,11.999L0.746,8.343L2.426,5.044L5.044,2.426L8.343,0.746L11.999,0.166ZM8.549,1.381L5.436,2.966L2.967,5.436L1.381,8.549L0.834,11.999L1.381,15.45L2.967,18.562L5.436,21.032L8.549,22.619L11.999,23.166L15.45,22.619L18.562,21.032L21.032,18.562L22.619,15.45L23.166,11.999L22.619,8.549L21.032,5.436L18.562,2.966L15.45,1.381L11.999,0.834L8.549,1.381Z" style="fill:white;"/>
<path d="M11.915,3.928C11.993,3.881 12.094,3.907 12.141,3.985L14.738,8.343C14.785,8.421 14.759,8.523 14.681,8.569C14.603,8.616 14.501,8.59 14.455,8.512L11.857,4.154C11.811,4.076 11.836,3.975 11.915,3.928Z" style="fill:white;"/>
<path d="M11.999,3.904L17.36,4.484L17.325,4.812L11.999,4.236L6.674,4.812L6.639,4.484L11.999,3.904Z" style="fill:white;"/>
<path d="M9.237,8.426C9.237,8.334 9.311,8.261 9.402,8.261L14.596,8.261C14.687,8.261 14.761,8.334 14.761,8.426C14.761,8.517 14.687,8.591 14.596,8.591L9.402,8.591C9.311,8.591 9.237,8.517 9.237,8.426Z" style="fill:white;"/>
<path d="M12.083,3.928C12.161,3.975 12.187,4.076 12.14,4.154L9.544,8.512C9.497,8.59 9.396,8.616 9.318,8.569C9.24,8.523 9.214,8.421 9.261,8.343L11.857,3.985C11.903,3.907 12.004,3.881 12.083,3.928Z" style="fill:white;"/>
<path d="M8.392,0.803L11.999,3.853L15.606,0.803L17.49,4.573L17.195,4.721L15.499,1.326L11.999,4.285L8.499,1.326L6.804,4.721L6.509,4.573L8.392,0.803Z" style="fill:white;"/>
<path d="M5.143,2.563C5.217,2.509 5.32,2.525 5.374,2.599L11.999,11.719L18.625,2.599C18.679,2.525 18.782,2.509 18.856,2.563C18.929,2.616 18.946,2.719 18.892,2.793L12.133,12.097C12.102,12.14 12.052,12.165 11.999,12.165C11.947,12.165 11.897,12.14 11.866,12.097L5.107,2.793C5.053,2.719 5.07,2.616 5.143,2.563Z" style="fill:white;"/>
<path d="M9.525,8.314C9.565,8.358 9.578,8.42 9.56,8.476L7.992,13.303L12.081,16.274L16.727,18.266C16.811,18.302 16.85,18.399 16.814,18.482C16.778,18.566 16.681,18.605 16.597,18.569L11.934,16.57C11.923,16.565 11.912,16.559 11.902,16.552L7.701,13.499C7.643,13.457 7.619,13.383 7.641,13.315L9.156,8.651L4.493,9.709C4.404,9.729 4.315,9.674 4.295,9.585C4.275,9.496 4.331,9.408 4.42,9.387L9.367,8.265C9.424,8.251 9.485,8.27 9.525,8.314Z" style="fill:white;"/>
<path d="M4.347,9.426C4.416,9.366 4.52,9.373 4.58,9.442L7.922,13.259C7.982,13.328 7.975,13.432 7.907,13.492C7.838,13.552 7.734,13.545 7.674,13.477L4.332,9.659C4.272,9.591 4.279,9.486 4.347,9.426Z" style="fill:white;"/>
<path d="M6.931,4.439L4.635,9.553L4.661,9.616L4.603,9.652L3.534,14.751L7.435,18.284L12.078,20.948L15.442,22.696L16.535,18.244L21.105,18.581L20.481,14.837L20.807,14.783L21.499,18.941L16.789,18.593L15.662,23.182L11.917,21.236L7.24,18.553L3.238,14.928L0.234,11.971L4.25,9.483L2.464,5.109L6.931,4.439ZM4.215,9.893L0.765,12.03L3.254,14.48L4.215,9.893ZM4.463,9.131L6.382,4.855L2.928,5.373L4.463,9.131Z" style="fill:white;"/>
<path d="M7.814,13.202C7.904,13.211 7.971,13.291 7.963,13.382L7.502,18.433C7.494,18.524 7.414,18.591 7.323,18.583C7.232,18.574 7.165,18.494 7.174,18.403L7.634,13.352C7.642,13.261 7.723,13.194 7.814,13.202Z" style="fill:white;"/>
<path d="M12.151,16.353C12.187,16.436 12.148,16.533 12.065,16.569L7.403,18.569C7.319,18.604 7.222,18.566 7.186,18.482C7.15,18.398 7.189,18.301 7.273,18.265L11.935,16.266C12.018,16.23 12.115,16.269 12.151,16.353Z" style="fill:white;"/>
<path d="M2.893,18.581L3.517,14.837L3.191,14.783L2.499,18.941L7.211,18.594L8.336,23.182L12.075,21.24L11.923,20.947L8.556,22.696L7.465,18.244L2.893,18.581Z" style="fill:white;"/>
<path d="M12.097,11.865C12.14,11.896 12.165,11.946 12.165,11.998L12.165,23.5C12.165,23.591 12.091,23.665 12,23.665C11.909,23.665 11.835,23.591 11.835,23.5L11.835,12.226L1.115,15.709C1.029,15.737 0.936,15.69 0.908,15.603C0.879,15.517 0.927,15.423 1.013,15.395L11.949,11.842C11.999,11.825 12.054,11.834 12.097,11.865Z" style="fill:white;"/>
<path d="M17.212,4.547C17.248,4.499 17.308,4.475 17.368,4.484L21.327,5.078C21.377,5.085 21.421,5.115 21.446,5.159C21.471,5.203 21.474,5.256 21.455,5.303L19.749,9.483L23.587,11.861C23.63,11.887 23.658,11.932 23.664,11.982C23.669,12.033 23.652,12.083 23.616,12.118L20.762,14.926L20.756,14.932L20.755,14.932C20.755,14.933 20.754,14.934 20.753,14.934L16.773,18.541C16.727,18.583 16.661,18.595 16.602,18.572C16.544,18.55 16.504,18.496 16.498,18.434L16.039,13.4L14.44,8.478C14.421,8.421 14.435,8.359 14.475,8.315C14.515,8.272 14.575,8.253 14.633,8.266L19.258,9.315L17.193,4.715C17.168,4.659 17.175,4.595 17.212,4.547ZM19.237,9.649L14.843,8.652L16.269,13.04L19.237,9.649ZM16.372,13.422L16.797,18.074L20.464,14.751L19.45,9.907L16.372,13.422ZM19.784,9.893L20.744,14.48L23.234,12.03L19.784,9.893ZM19.536,9.13L21.07,5.373L17.617,4.855L19.536,9.13Z" style="fill:white;"/>
<path d="M11.842,11.947C11.87,11.861 11.963,11.813 12.05,11.842L22.987,15.395C23.074,15.423 23.121,15.517 23.093,15.603C23.065,15.69 22.972,15.737 22.885,15.709L11.948,12.155C11.861,12.127 11.814,12.034 11.842,11.947Z" style="fill:white;"/>
<path d="M16.335,13.27C16.389,13.343 16.372,13.447 16.298,13.5L12.096,16.552C12.022,16.606 11.919,16.59 11.866,16.516C11.812,16.442 11.828,16.339 11.902,16.285L16.104,13.233C16.178,13.18 16.281,13.196 16.335,13.27Z" style="fill:white;"/>
<path d="M16.58,18.276C16.653,18.234 16.746,18.254 16.796,18.322L18.892,21.208C18.945,21.282 18.929,21.385 18.855,21.439C18.782,21.492 18.678,21.476 18.625,21.402L16.616,18.636L12.081,21.237C12.002,21.282 11.901,21.255 11.856,21.176C11.81,21.097 11.838,20.996 11.917,20.951L16.58,18.276Z" style="fill:white;"/>
<path d="M11.999,0.335C12.09,0.335 12.164,0.409 12.164,0.5L12.164,4.068C12.164,4.159 12.09,4.233 11.999,4.233C11.908,4.233 11.834,4.159 11.834,4.068L11.834,0.5C11.834,0.409 11.908,0.335 11.999,0.335Z" style="fill:white;"/>
<path d="M23.093,8.396C23.121,8.483 23.073,8.576 22.987,8.604L19.594,9.706C19.507,9.735 19.414,9.687 19.386,9.601C19.358,9.514 19.405,9.421 19.492,9.393L22.885,8.29C22.971,8.262 23.064,8.309 23.093,8.396Z" style="fill:white;"/>
<path d="M7.435,18.286C7.509,18.34 7.525,18.443 7.471,18.516L5.374,21.402C5.32,21.476 5.217,21.492 5.143,21.439C5.069,21.385 5.053,21.282 5.107,21.208L7.204,18.322C7.258,18.249 7.361,18.232 7.435,18.286Z" style="fill:white;"/>
<path d="M0.908,8.396C0.936,8.309 1.029,8.262 1.115,8.29L4.508,9.393C4.595,9.421 4.642,9.514 4.614,9.601C4.586,9.687 4.493,9.735 4.406,9.706L1.013,8.604C0.927,8.576 0.879,8.483 0.908,8.396Z" style="fill:white;"/>
<defs>
<linearGradient id="_Linear1" x1="0" y1="0" x2="1" y2="0" gradientUnits="userSpaceOnUse" gradientTransform="matrix(-14.8673,-14.7971,14.7971,-14.8673,20.4244,16.9042)"><stop offset="0" style="stop-color:rgb(239,65,54);stop-opacity:1"/><stop offset="0.01" style="stop-color:rgb(239,65,54);stop-opacity:1"/><stop offset="0.32" style="stop-color:rgb(223,81,83);stop-opacity:1"/><stop offset="1" style="stop-color:rgb(172,11,27);stop-opacity:1"/></linearGradient>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 8.6 KiB

View File

@ -1,340 +1,340 @@
<svg fill="none" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg">
<svg fill='none' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>
<path
d="M22.8084 4.42014C22.5667 3.50503 21.7897 2.58992 20.3912 1.57122C19.2689 0.759705 18.0775 0.293518 17.1279 0.293518C16.9379 0.293518 16.7653 0.310784 16.5926 0.345317C16.1609 0.431648 15.7811 0.742439 15.5394 1.20863C15.2458 1.76114 15.1768 2.50359 15.3667 2.95251C15.4358 3.09064 15.5221 3.2633 15.6257 3.4187C14.7106 3.97122 14.1926 4.12661 14.1235 4.14388C16.5063 4.93812 18.4919 6.59568 19.735 8.75395L19.7523 8.54676C19.8041 7.97697 19.9768 7.32086 20.2185 6.64748C20.4602 6.71654 20.702 6.75107 20.9437 6.75107C21.5825 6.75107 22.135 6.49208 22.4804 6.02589C22.8257 5.55971 22.9638 4.93812 22.8084 4.42014Z"
fill="#5E12A0"
d='M22.8084 4.42014C22.5667 3.50503 21.7897 2.58992 20.3912 1.57122C19.2689 0.759705 18.0775 0.293518 17.1279 0.293518C16.9379 0.293518 16.7653 0.310784 16.5926 0.345317C16.1609 0.431648 15.7811 0.742439 15.5394 1.20863C15.2458 1.76114 15.1768 2.50359 15.3667 2.95251C15.4358 3.09064 15.5221 3.2633 15.6257 3.4187C14.7106 3.97122 14.1926 4.12661 14.1235 4.14388C16.5063 4.93812 18.4919 6.59568 19.735 8.75395L19.7523 8.54676C19.8041 7.97697 19.9768 7.32086 20.2185 6.64748C20.4602 6.71654 20.702 6.75107 20.9437 6.75107C21.5825 6.75107 22.135 6.49208 22.4804 6.02589C22.8257 5.55971 22.9638 4.93812 22.8084 4.42014Z'
fill='#5E12A0'
></path>
<path
d="M20.3225 6.14679C21.8937 6.57844 22.5326 5.36981 22.3254 4.5583C22.1009 3.74679 21.3757 2.91801 20.098 1.98564C18.8203 1.05326 17.5254 0.673409 16.6966 0.846071C15.8678 1.01873 15.6261 2.27916 15.8333 2.76262C15.9196 2.95255 16.1096 3.2288 16.3685 3.5396C16.0405 3.76406 15.7297 3.93672 15.4707 4.09211C17.0592 4.80003 18.4405 5.90506 19.4765 7.28636C19.5973 6.82017 19.77 6.40578 19.9254 6.04319C20.0462 6.06046 20.1844 6.09499 20.3225 6.14679Z"
fill="url(#paint0_radial_8766_48743)"
d='M20.3225 6.14679C21.8937 6.57844 22.5326 5.36981 22.3254 4.5583C22.1009 3.74679 21.3757 2.91801 20.098 1.98564C18.8203 1.05326 17.5254 0.673409 16.6966 0.846071C15.8678 1.01873 15.6261 2.27916 15.8333 2.76262C15.9196 2.95255 16.1096 3.2288 16.3685 3.5396C16.0405 3.76406 15.7297 3.93672 15.4707 4.09211C17.0592 4.80003 18.4405 5.90506 19.4765 7.28636C19.5973 6.82017 19.77 6.40578 19.9254 6.04319C20.0462 6.06046 20.1844 6.09499 20.3225 6.14679Z'
fill='url(#paint0_radial_8766_48743)'
></path>
<path
d="M11.3266 23.0676C16.6572 23.0676 20.9784 18.7464 20.9784 13.4158C20.9784 8.08525 16.6572 3.76404 11.3266 3.76404C5.99601 3.76404 1.6748 8.08525 1.6748 13.4158C1.6748 18.7464 5.99601 23.0676 11.3266 23.0676Z"
fill="url(#paint1_radial_8766_48743)"
d='M11.3266 23.0676C16.6572 23.0676 20.9784 18.7464 20.9784 13.4158C20.9784 8.08525 16.6572 3.76404 11.3266 3.76404C5.99601 3.76404 1.6748 8.08525 1.6748 13.4158C1.6748 18.7464 5.99601 23.0676 11.3266 23.0676Z'
fill='url(#paint1_radial_8766_48743)'
></path>
<path
d="M21.5307 3.76403C20.2185 2.38274 19.1134 2.02015 17.784 1.72662C16.748 1.4849 17.0242 0.897845 18.2847 1.01871C17.6804 0.811514 17.1106 0.759716 16.6962 0.846047C15.8674 1.01871 15.6257 2.27914 15.8329 2.76259C15.9192 2.95252 16.1091 3.22878 16.3681 3.53957C15.9019 3.85036 15.5048 4.07482 15.1768 4.24749C15.3322 4.31655 15.5221 4.40288 15.7465 4.52375C16.3336 4.83454 16.9724 5.35252 16.9724 5.35252C16.0055 4.52375 16.2127 4.14389 17.5422 3.21151C17.9566 2.91799 18.7163 2.95252 19.4242 3.31511C20.1322 3.6777 20.9609 4.59281 20.9609 4.59281L20.1667 6.11223C20.2185 6.1295 20.2703 6.14677 20.3221 6.16403C20.8228 6.30216 21.2199 6.26763 21.5307 6.14677C21.8933 5.92231 22.8429 5.16259 21.5307 3.76403Z"
fill="#A98698"
fill-opacity="0.6"
d='M21.5307 3.76403C20.2185 2.38274 19.1134 2.02015 17.784 1.72662C16.748 1.4849 17.0242 0.897845 18.2847 1.01871C17.6804 0.811514 17.1106 0.759716 16.6962 0.846047C15.8674 1.01871 15.6257 2.27914 15.8329 2.76259C15.9192 2.95252 16.1091 3.22878 16.3681 3.53957C15.9019 3.85036 15.5048 4.07482 15.1768 4.24749C15.3322 4.31655 15.5221 4.40288 15.7465 4.52375C16.3336 4.83454 16.9724 5.35252 16.9724 5.35252C16.0055 4.52375 16.2127 4.14389 17.5422 3.21151C17.9566 2.91799 18.7163 2.95252 19.4242 3.31511C20.1322 3.6777 20.9609 4.59281 20.9609 4.59281L20.1667 6.11223C20.2185 6.1295 20.2703 6.14677 20.3221 6.16403C20.8228 6.30216 21.2199 6.26763 21.5307 6.14677C21.8933 5.92231 22.8429 5.16259 21.5307 3.76403Z'
fill='#A98698'
fill-opacity='0.6'
></path>
<path
d="M17.7671 2.55539C18.1124 2.69352 18.5613 2.93525 19.1138 3.29784C19.7699 3.72949 20.3397 4.21295 20.7023 4.5928C20.098 5.38705 19.7009 6.47482 19.4592 7.23453C19.58 7.40719 19.7181 7.57985 19.839 7.75252C19.9599 7.32086 20.1671 6.68201 20.4433 6.04316C20.5124 6.06043 20.5987 6.06043 20.6851 6.06043C20.8922 6.06043 21.134 6.0259 21.3239 5.8705C21.462 5.7669 21.6174 5.57698 21.6002 5.23165C21.6002 4.90359 21.3412 4.48921 20.8059 3.98849C20.4261 3.6259 19.9081 3.22878 19.3901 2.86619C17.9052 1.88201 16.8692 1.60575 16.403 2.07194C16.0922 2.38273 16.1268 2.76259 16.2304 3.03885C15.6779 3.40144 15.2117 3.66043 14.9009 3.83309C15.1081 3.90216 15.298 3.98849 15.5052 4.07482C16.0577 3.78129 16.852 3.28057 17.7671 2.55539ZM21.0304 5.02446C21.0822 5.11079 21.0994 5.19712 21.0994 5.24892C21.0994 5.40431 21.0476 5.45611 21.0131 5.49065C20.944 5.54244 20.8059 5.57698 20.6851 5.57698C20.7886 5.36978 20.9095 5.19712 21.0304 5.02446ZM16.7656 2.4518C16.8174 2.4 16.9556 2.36547 17.18 2.4C17.0074 2.53813 16.8347 2.65899 16.662 2.77985C16.6448 2.65899 16.662 2.53813 16.7656 2.4518Z"
fill="#5E12A0"
d='M17.7671 2.55539C18.1124 2.69352 18.5613 2.93525 19.1138 3.29784C19.7699 3.72949 20.3397 4.21295 20.7023 4.5928C20.098 5.38705 19.7009 6.47482 19.4592 7.23453C19.58 7.40719 19.7181 7.57985 19.839 7.75252C19.9599 7.32086 20.1671 6.68201 20.4433 6.04316C20.5124 6.06043 20.5987 6.06043 20.6851 6.06043C20.8922 6.06043 21.134 6.0259 21.3239 5.8705C21.462 5.7669 21.6174 5.57698 21.6002 5.23165C21.6002 4.90359 21.3412 4.48921 20.8059 3.98849C20.4261 3.6259 19.9081 3.22878 19.3901 2.86619C17.9052 1.88201 16.8692 1.60575 16.403 2.07194C16.0922 2.38273 16.1268 2.76259 16.2304 3.03885C15.6779 3.40144 15.2117 3.66043 14.9009 3.83309C15.1081 3.90216 15.298 3.98849 15.5052 4.07482C16.0577 3.78129 16.852 3.28057 17.7671 2.55539ZM21.0304 5.02446C21.0822 5.11079 21.0994 5.19712 21.0994 5.24892C21.0994 5.40431 21.0476 5.45611 21.0131 5.49065C20.944 5.54244 20.8059 5.57698 20.6851 5.57698C20.7886 5.36978 20.9095 5.19712 21.0304 5.02446ZM16.7656 2.4518C16.8174 2.4 16.9556 2.36547 17.18 2.4C17.0074 2.53813 16.8347 2.65899 16.662 2.77985C16.6448 2.65899 16.662 2.53813 16.7656 2.4518Z'
fill='#5E12A0'
></path>
<path
d="M11.3266 3.19427C5.68052 3.19427 1.10498 7.76981 1.10498 13.4159C1.10498 19.0619 5.68052 23.6374 11.3266 23.6374C16.9726 23.6374 21.5481 19.0619 21.5481 13.4159C21.5481 7.76981 16.9553 3.19427 11.3266 3.19427ZM11.3266 23.0677C5.99131 23.0677 1.67476 18.7511 1.67476 13.4159C1.67476 8.08061 5.99131 3.76406 11.3266 3.76406C16.6618 3.76406 20.9784 8.08061 20.9784 13.4159C20.9784 18.7511 16.6445 23.0677 11.3266 23.0677Z"
fill="#5E12A0"
d='M11.3266 3.19427C5.68052 3.19427 1.10498 7.76981 1.10498 13.4159C1.10498 19.0619 5.68052 23.6374 11.3266 23.6374C16.9726 23.6374 21.5481 19.0619 21.5481 13.4159C21.5481 7.76981 16.9553 3.19427 11.3266 3.19427ZM11.3266 23.0677C5.99131 23.0677 1.67476 18.7511 1.67476 13.4159C1.67476 8.08061 5.99131 3.76406 11.3266 3.76406C16.6618 3.76406 20.9784 8.08061 20.9784 13.4159C20.9784 18.7511 16.6445 23.0677 11.3266 23.0677Z'
fill='#5E12A0'
></path>
<path
d="M11.3266 23.0676C16.6572 23.0676 20.9784 18.7464 20.9784 13.4158C20.9784 8.08525 16.6572 3.76404 11.3266 3.76404C5.99601 3.76404 1.6748 8.08525 1.6748 13.4158C1.6748 18.7464 5.99601 23.0676 11.3266 23.0676Z"
fill="url(#paint2_linear_8766_48743)"
d='M11.3266 23.0676C16.6572 23.0676 20.9784 18.7464 20.9784 13.4158C20.9784 8.08525 16.6572 3.76404 11.3266 3.76404C5.99601 3.76404 1.6748 8.08525 1.6748 13.4158C1.6748 18.7464 5.99601 23.0676 11.3266 23.0676Z'
fill='url(#paint2_linear_8766_48743)'
></path>
<path
d="M11.2577 21.8935C5.99153 21.0475 2.41743 16.0921 3.28074 10.8259C3.6606 8.49494 4.8347 6.50933 6.49225 5.07623C4.07499 6.47479 2.2793 8.90933 1.79585 11.8791C0.949806 17.1453 4.52391 22.1007 9.77283 22.9467C12.7081 23.4302 15.5397 22.5151 17.6289 20.7194C15.7815 21.7899 13.5369 22.2561 11.2577 21.8935Z"
fill="#A98698"
fill-opacity="0.6"
d='M11.2577 21.8935C5.99153 21.0475 2.41743 16.0921 3.28074 10.8259C3.6606 8.49494 4.8347 6.50933 6.49225 5.07623C4.07499 6.47479 2.2793 8.90933 1.79585 11.8791C0.949806 17.1453 4.52391 22.1007 9.77283 22.9467C12.7081 23.4302 15.5397 22.5151 17.6289 20.7194C15.7815 21.7899 13.5369 22.2561 11.2577 21.8935Z'
fill='#A98698'
fill-opacity='0.6'
></path>
<path
d="M12.8631 3.90216C10.4285 3.50504 8.06307 4.05756 6.12926 5.28346C6.09473 5.31799 6.0602 5.35252 6.0602 5.35252C6.80264 4.9036 7.89041 4.50648 7.89041 4.50648C5.09329 6.1295 4.22998 7.97698 4.22998 7.97698C5.31775 5.87051 8.51199 4.38562 11.0156 4.28202C13.5192 4.17842 15.1595 4.92087 17.1624 6.52662C19.1652 8.14964 20.3739 11.4648 20.253 14.0892C20.1494 16.7137 18.7681 18.8374 18.7681 18.8374C19.7177 17.6115 20.2875 16.7137 20.6501 15.7986C20.7192 15.5223 20.7883 15.246 20.8228 14.9525C21.6861 9.7036 18.1293 4.74821 12.8631 3.90216Z"
fill="url(#paint3_linear_8766_48743)"
d='M12.8631 3.90216C10.4285 3.50504 8.06307 4.05756 6.12926 5.28346C6.09473 5.31799 6.0602 5.35252 6.0602 5.35252C6.80264 4.9036 7.89041 4.50648 7.89041 4.50648C5.09329 6.1295 4.22998 7.97698 4.22998 7.97698C5.31775 5.87051 8.51199 4.38562 11.0156 4.28202C13.5192 4.17842 15.1595 4.92087 17.1624 6.52662C19.1652 8.14964 20.3739 11.4648 20.253 14.0892C20.1494 16.7137 18.7681 18.8374 18.7681 18.8374C19.7177 17.6115 20.2875 16.7137 20.6501 15.7986C20.7192 15.5223 20.7883 15.246 20.8228 14.9525C21.6861 9.7036 18.1293 4.74821 12.8631 3.90216Z'
fill='url(#paint3_linear_8766_48743)'
></path>
<path
d="M20.4951 13.3295C20.4951 18.3885 16.3857 22.4978 11.3267 22.4978C6.26773 22.4978 2.14111 18.3885 2.14111 13.3295H20.4951Z"
fill="url(#paint4_linear_8766_48743)"
d='M20.4951 13.3295C20.4951 18.3885 16.3857 22.4978 11.3267 22.4978C6.26773 22.4978 2.14111 18.3885 2.14111 13.3295H20.4951Z'
fill='url(#paint4_linear_8766_48743)'
></path>
<path
d="M19.7696 13.3295C19.7696 18.2676 15.8675 22.3079 10.9639 22.4978H11.3265C16.3855 22.4978 20.4948 18.3885 20.4948 13.3295H19.7696Z"
fill="url(#paint5_linear_8766_48743)"
d='M19.7696 13.3295C19.7696 18.2676 15.8675 22.3079 10.9639 22.4978H11.3265C16.3855 22.4978 20.4948 18.3885 20.4948 13.3295H19.7696Z'
fill='url(#paint5_linear_8766_48743)'
></path>
<path
d="M3.43608 13.3295H2.14111C2.14111 18.3885 6.25047 22.4978 11.3095 22.4978C11.5339 22.4978 11.7411 22.4978 11.9483 22.4805C7.20011 22.1352 3.43608 18.164 3.43608 13.3295Z"
fill="url(#paint6_linear_8766_48743)"
d='M3.43608 13.3295H2.14111C2.14111 18.3885 6.25047 22.4978 11.3095 22.4978C11.5339 22.4978 11.7411 22.4978 11.9483 22.4805C7.20011 22.1352 3.43608 18.164 3.43608 13.3295Z'
fill='url(#paint6_linear_8766_48743)'
></path>
<path
d="M20.4778 13.4158C20.4778 12.3626 18.6476 11.7583 16.2131 11.5511C14.4519 11.413 12.6735 11.5856 10.6361 12.2072C8.87493 12.7252 7.28644 12.6389 6.1296 12.5007C3.55694 12.2072 2.14111 12.1727 2.14111 13.4158C2.14111 15.2115 5.80155 17.4561 11.2922 16.6792C14.072 16.282 15.5051 15.4705 17.1454 14.918C18.9238 14.331 20.4778 14.3482 20.4778 13.4158Z"
fill="url(#paint7_linear_8766_48743)"
d='M20.4778 13.4158C20.4778 12.3626 18.6476 11.7583 16.2131 11.5511C14.4519 11.413 12.6735 11.5856 10.6361 12.2072C8.87493 12.7252 7.28644 12.6389 6.1296 12.5007C3.55694 12.2072 2.14111 12.1727 2.14111 13.4158C2.14111 15.2115 5.80155 17.4561 11.2922 16.6792C14.072 16.282 15.5051 15.4705 17.1454 14.918C18.9238 14.331 20.4778 14.3482 20.4778 13.4158Z'
fill='url(#paint7_linear_8766_48743)'
></path>
<path
d="M14.3308 9.06476C15.1891 9.06476 15.8848 8.36911 15.8848 7.5108C15.8848 6.6525 15.1891 5.95685 14.3308 5.95685C13.4725 5.95685 12.7769 6.6525 12.7769 7.5108C12.7769 8.36911 13.4725 9.06476 14.3308 9.06476Z"
fill="white"
d='M14.3308 9.06476C15.1891 9.06476 15.8848 8.36911 15.8848 7.5108C15.8848 6.6525 15.1891 5.95685 14.3308 5.95685C13.4725 5.95685 12.7769 6.6525 12.7769 7.5108C12.7769 8.36911 13.4725 9.06476 14.3308 9.06476Z'
fill='white'
></path>
<path
d="M16.869 10.2216C17.2314 10.2216 17.5251 9.9279 17.5251 9.56548C17.5251 9.20306 17.2314 8.90936 16.869 8.90936C16.5066 8.90936 16.2129 9.20306 16.2129 9.56548C16.2129 9.9279 16.5066 10.2216 16.869 10.2216Z"
fill="white"
d='M16.869 10.2216C17.2314 10.2216 17.5251 9.9279 17.5251 9.56548C17.5251 9.20306 17.2314 8.90936 16.869 8.90936C16.5066 8.90936 16.2129 9.20306 16.2129 9.56548C16.2129 9.9279 16.5066 10.2216 16.869 10.2216Z'
fill='white'
></path>
<path
d="M19.2175 6.2676H19.1829C19.0793 6.25034 19.0103 6.14674 19.0275 6.02588C19.1829 5.23163 19.8391 4.47192 19.8736 4.43739C19.9427 4.35106 20.0808 4.35106 20.1498 4.42012C20.2362 4.48919 20.2362 4.62732 20.1671 4.69638C20.1498 4.71365 19.5455 5.42156 19.4074 6.11221C19.3901 6.2158 19.3038 6.2676 19.2175 6.2676Z"
fill="url(#paint8_linear_8766_48743)"
d='M19.2175 6.2676H19.1829C19.0793 6.25034 19.0103 6.14674 19.0275 6.02588C19.1829 5.23163 19.8391 4.47192 19.8736 4.43739C19.9427 4.35106 20.0808 4.35106 20.1498 4.42012C20.2362 4.48919 20.2362 4.62732 20.1671 4.69638C20.1498 4.71365 19.5455 5.42156 19.4074 6.11221C19.3901 6.2158 19.3038 6.2676 19.2175 6.2676Z'
fill='url(#paint8_linear_8766_48743)'
></path>
<path
d="M10.6876 20.6158C10.9545 20.6158 11.171 20.3993 11.171 20.1324C11.171 19.8654 10.9545 19.6489 10.6876 19.6489C10.4206 19.6489 10.2041 19.8654 10.2041 20.1324C10.2041 20.3993 10.4206 20.6158 10.6876 20.6158Z"
fill="white"
fill-opacity="0.2"
d='M10.6876 20.6158C10.9545 20.6158 11.171 20.3993 11.171 20.1324C11.171 19.8654 10.9545 19.6489 10.6876 19.6489C10.4206 19.6489 10.2041 19.8654 10.2041 20.1324C10.2041 20.3993 10.4206 20.6158 10.6876 20.6158Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M10.4117 20.4432C10.2218 20.2532 10.2218 19.9425 10.4117 19.7525C10.4462 19.718 10.4808 19.7007 10.5153 19.6662C10.4462 19.6835 10.3944 19.718 10.3426 19.7698C10.1527 19.9597 10.1527 20.2705 10.3426 20.4604C10.498 20.6158 10.7398 20.6504 10.9297 20.5468C10.757 20.6158 10.5498 20.5813 10.4117 20.4432Z"
fill="url(#paint9_linear_8766_48743)"
d='M10.4117 20.4432C10.2218 20.2532 10.2218 19.9425 10.4117 19.7525C10.4462 19.718 10.4808 19.7007 10.5153 19.6662C10.4462 19.6835 10.3944 19.718 10.3426 19.7698C10.1527 19.9597 10.1527 20.2705 10.3426 20.4604C10.498 20.6158 10.7398 20.6504 10.9297 20.5468C10.757 20.6158 10.5498 20.5813 10.4117 20.4432Z'
fill='url(#paint9_linear_8766_48743)'
></path>
<path
d="M10.8604 19.9942C10.9176 19.9942 10.964 19.9478 10.964 19.8906C10.964 19.8335 10.9176 19.787 10.8604 19.787C10.8033 19.787 10.7568 19.8335 10.7568 19.8906C10.7568 19.9478 10.8033 19.9942 10.8604 19.9942Z"
fill="white"
fill-opacity="0.3"
d='M10.8604 19.9942C10.9176 19.9942 10.964 19.9478 10.964 19.8906C10.964 19.8335 10.9176 19.787 10.8604 19.787C10.8033 19.787 10.7568 19.8335 10.7568 19.8906C10.7568 19.9478 10.8033 19.9942 10.8604 19.9942Z'
fill='white'
fill-opacity='0.3'
></path>
<path
d="M13.2086 20.3741C13.4755 20.3741 13.692 20.1576 13.692 19.8906C13.692 19.6237 13.4755 19.4072 13.2086 19.4072C12.9416 19.4072 12.7251 19.6237 12.7251 19.8906C12.7251 20.1576 12.9416 20.3741 13.2086 20.3741Z"
fill="white"
fill-opacity="0.2"
d='M13.2086 20.3741C13.4755 20.3741 13.692 20.1576 13.692 19.8906C13.692 19.6237 13.4755 19.4072 13.2086 19.4072C12.9416 19.4072 12.7251 19.6237 12.7251 19.8906C12.7251 20.1576 12.9416 20.3741 13.2086 20.3741Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M12.9322 20.2014C12.7423 20.0115 12.7423 19.7007 12.9322 19.5108C12.9667 19.4762 13.0013 19.459 13.0358 19.4244C12.9667 19.4417 12.9149 19.4762 12.8631 19.528C12.6732 19.718 12.6732 20.0288 12.8631 20.2187C13.0185 20.3741 13.2603 20.4086 13.4502 20.305C13.2775 20.3741 13.0703 20.3395 12.9322 20.2014Z"
fill="url(#paint10_linear_8766_48743)"
d='M12.9322 20.2014C12.7423 20.0115 12.7423 19.7007 12.9322 19.5108C12.9667 19.4762 13.0013 19.459 13.0358 19.4244C12.9667 19.4417 12.9149 19.4762 12.8631 19.528C12.6732 19.718 12.6732 20.0288 12.8631 20.2187C13.0185 20.3741 13.2603 20.4086 13.4502 20.305C13.2775 20.3741 13.0703 20.3395 12.9322 20.2014Z'
fill='url(#paint10_linear_8766_48743)'
></path>
<path
d="M13.3814 19.7525C13.4386 19.7525 13.485 19.7061 13.485 19.6489C13.485 19.5918 13.4386 19.5453 13.3814 19.5453C13.3243 19.5453 13.2778 19.5918 13.2778 19.6489C13.2778 19.7061 13.3243 19.7525 13.3814 19.7525Z"
fill="white"
fill-opacity="0.3"
d='M13.3814 19.7525C13.4386 19.7525 13.485 19.7061 13.485 19.6489C13.485 19.5918 13.4386 19.5453 13.3814 19.5453C13.3243 19.5453 13.2778 19.5918 13.2778 19.6489C13.2778 19.7061 13.3243 19.7525 13.3814 19.7525Z'
fill='white'
fill-opacity='0.3'
></path>
<path
d="M11.9656 21.4964C12.1659 21.4964 12.3282 21.3341 12.3282 21.1338C12.3282 20.9335 12.1659 20.7712 11.9656 20.7712C11.7653 20.7712 11.603 20.9335 11.603 21.1338C11.603 21.3341 11.7653 21.4964 11.9656 21.4964Z"
fill="white"
fill-opacity="0.2"
d='M11.9656 21.4964C12.1659 21.4964 12.3282 21.3341 12.3282 21.1338C12.3282 20.9335 12.1659 20.7712 11.9656 20.7712C11.7653 20.7712 11.603 20.9335 11.603 21.1338C11.603 21.3341 11.7653 21.4964 11.9656 21.4964Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M11.7584 21.3583C11.6203 21.2202 11.6203 20.9784 11.7584 20.8403C11.7757 20.823 11.8102 20.8058 11.8275 20.7885C11.7757 20.8058 11.7412 20.8403 11.7066 20.8748C11.5685 21.013 11.5685 21.2547 11.7066 21.3928C11.8275 21.5137 12.0002 21.531 12.1555 21.4446C12.0174 21.4964 11.862 21.4619 11.7584 21.3583Z"
fill="url(#paint11_linear_8766_48743)"
d='M11.7584 21.3583C11.6203 21.2202 11.6203 20.9784 11.7584 20.8403C11.7757 20.823 11.8102 20.8058 11.8275 20.7885C11.7757 20.8058 11.7412 20.8403 11.7066 20.8748C11.5685 21.013 11.5685 21.2547 11.7066 21.3928C11.8275 21.5137 12.0002 21.531 12.1555 21.4446C12.0174 21.4964 11.862 21.4619 11.7584 21.3583Z'
fill='url(#paint11_linear_8766_48743)'
></path>
<path
d="M12.0862 21.0129C12.1243 21.0129 12.1552 20.982 12.1552 20.9439C12.1552 20.9057 12.1243 20.8748 12.0862 20.8748C12.048 20.8748 12.0171 20.9057 12.0171 20.9439C12.0171 20.982 12.048 21.0129 12.0862 21.0129Z"
fill="white"
fill-opacity="0.3"
d='M12.0862 21.0129C12.1243 21.0129 12.1552 20.982 12.1552 20.9439C12.1552 20.9057 12.1243 20.8748 12.0862 20.8748C12.048 20.8748 12.0171 20.9057 12.0171 20.9439C12.0171 20.982 12.048 21.0129 12.0862 21.0129Z'
fill='white'
fill-opacity='0.3'
></path>
<path
d="M14.1927 21.2374C14.393 21.2374 14.5553 21.0751 14.5553 20.8748C14.5553 20.6745 14.393 20.5122 14.1927 20.5122C13.9924 20.5122 13.8301 20.6745 13.8301 20.8748C13.8301 21.0751 13.9924 21.2374 14.1927 21.2374Z"
fill="white"
fill-opacity="0.2"
d='M14.1927 21.2374C14.393 21.2374 14.5553 21.0751 14.5553 20.8748C14.5553 20.6745 14.393 20.5122 14.1927 20.5122C13.9924 20.5122 13.8301 20.6745 13.8301 20.8748C13.8301 21.0751 13.9924 21.2374 14.1927 21.2374Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M13.9855 21.0993C13.8473 20.9611 13.8473 20.7194 13.9855 20.5813C14.0027 20.564 14.0373 20.5467 14.0545 20.5295C14.0027 20.5467 13.9682 20.5813 13.9337 20.6158C13.7955 20.7539 13.7955 20.9957 13.9337 21.1338C14.0545 21.2547 14.2272 21.2719 14.3826 21.1856C14.2445 21.2374 14.0891 21.2029 13.9855 21.0993Z"
fill="url(#paint12_linear_8766_48743)"
d='M13.9855 21.0993C13.8473 20.9611 13.8473 20.7194 13.9855 20.5813C14.0027 20.564 14.0373 20.5467 14.0545 20.5295C14.0027 20.5467 13.9682 20.5813 13.9337 20.6158C13.7955 20.7539 13.7955 20.9957 13.9337 21.1338C14.0545 21.2547 14.2272 21.2719 14.3826 21.1856C14.2445 21.2374 14.0891 21.2029 13.9855 21.0993Z'
fill='url(#paint12_linear_8766_48743)'
></path>
<path
d="M14.3137 20.754C14.3519 20.754 14.3828 20.7231 14.3828 20.6849C14.3828 20.6468 14.3519 20.6158 14.3137 20.6158C14.2755 20.6158 14.2446 20.6468 14.2446 20.6849C14.2446 20.7231 14.2755 20.754 14.3137 20.754Z"
fill="white"
fill-opacity="0.3"
d='M14.3137 20.754C14.3519 20.754 14.3828 20.7231 14.3828 20.6849C14.3828 20.6468 14.3519 20.6158 14.3137 20.6158C14.2755 20.6158 14.2446 20.6468 14.2446 20.6849C14.2446 20.7231 14.2755 20.754 14.3137 20.754Z'
fill='white'
fill-opacity='0.3'
></path>
<path
d="M8.63311 20.4432C9.07185 20.4432 9.42736 20.0877 9.42736 19.6489C9.42736 19.2104 9.07185 18.8547 8.63311 18.8547C8.19455 18.8547 7.83887 19.2104 7.83887 19.6489C7.83887 20.0877 8.19455 20.4432 8.63311 20.4432Z"
fill="white"
fill-opacity="0.2"
d='M8.63311 20.4432C9.07185 20.4432 9.42736 20.0877 9.42736 19.6489C9.42736 19.2104 9.07185 18.8547 8.63311 18.8547C8.19455 18.8547 7.83887 19.2104 7.83887 19.6489C7.83887 20.0877 8.19455 20.4432 8.63311 20.4432Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M8.18435 20.1497C7.87356 19.8389 7.87356 19.3381 8.18435 19.0274C8.23615 18.9756 8.28794 18.941 8.35701 18.9065C8.25341 18.941 8.16708 19.0101 8.08075 19.0792C7.76996 19.3899 7.76996 19.8907 8.08075 20.2015C8.33974 20.4605 8.73687 20.5122 9.04766 20.3223C8.75413 20.4432 8.40881 20.3914 8.18435 20.1497Z"
fill="url(#paint13_linear_8766_48743)"
d='M8.18435 20.1497C7.87356 19.8389 7.87356 19.3381 8.18435 19.0274C8.23615 18.9756 8.28794 18.941 8.35701 18.9065C8.25341 18.941 8.16708 19.0101 8.08075 19.0792C7.76996 19.3899 7.76996 19.8907 8.08075 20.2015C8.33974 20.4605 8.73687 20.5122 9.04766 20.3223C8.75413 20.4432 8.40881 20.3914 8.18435 20.1497Z'
fill='url(#paint13_linear_8766_48743)'
></path>
<path
d="M8.90948 19.4072C9.00479 19.4072 9.08214 19.3299 9.08214 19.2346C9.08214 19.1392 9.00479 19.0619 8.90948 19.0619C8.81417 19.0619 8.73682 19.1392 8.73682 19.2346C8.73682 19.3299 8.81417 19.4072 8.90948 19.4072Z"
fill="white"
fill-opacity="0.3"
d='M8.90948 19.4072C9.00479 19.4072 9.08214 19.3299 9.08214 19.2346C9.08214 19.1392 9.00479 19.0619 8.90948 19.0619C8.81417 19.0619 8.73682 19.1392 8.73682 19.2346C8.73682 19.3299 8.81417 19.4072 8.90948 19.4072Z'
fill='white'
fill-opacity='0.3'
></path>
<path
d="M15.7293 18.4921C16.168 18.4921 16.5235 18.1366 16.5235 17.6979C16.5235 17.2593 16.168 16.9036 15.7293 16.9036C15.2907 16.9036 14.9351 17.2593 14.9351 17.6979C14.9351 18.1366 15.2907 18.4921 15.7293 18.4921Z"
fill="white"
fill-opacity="0.2"
d='M15.7293 18.4921C16.168 18.4921 16.5235 18.1366 16.5235 17.6979C16.5235 17.2593 16.168 16.9036 15.7293 16.9036C15.2907 16.9036 14.9351 17.2593 14.9351 17.6979C14.9351 18.1366 15.2907 18.4921 15.7293 18.4921Z'
fill='white'
fill-opacity='0.2'
></path>
<path
d="M15.2634 18.1985C14.9527 17.8878 14.9527 17.387 15.2634 17.0762C15.3152 17.0244 15.367 16.9899 15.4361 16.9554C15.3325 16.9899 15.2462 17.059 15.1599 17.128C14.8491 17.4388 14.8491 17.9396 15.1599 18.2503C15.4188 18.5093 15.816 18.5611 16.1268 18.3712C15.8332 18.4921 15.5052 18.4403 15.2634 18.1985Z"
fill="url(#paint14_linear_8766_48743)"
d='M15.2634 18.1985C14.9527 17.8878 14.9527 17.387 15.2634 17.0762C15.3152 17.0244 15.367 16.9899 15.4361 16.9554C15.3325 16.9899 15.2462 17.059 15.1599 17.128C14.8491 17.4388 14.8491 17.9396 15.1599 18.2503C15.4188 18.5093 15.816 18.5611 16.1268 18.3712C15.8332 18.4921 15.5052 18.4403 15.2634 18.1985Z'
fill='url(#paint14_linear_8766_48743)'
></path>
<path
d="M16.0057 17.4561C16.101 17.4561 16.1783 17.3788 16.1783 17.2834C16.1783 17.1881 16.101 17.1108 16.0057 17.1108C15.9104 17.1108 15.833 17.1881 15.833 17.2834C15.833 17.3788 15.9104 17.4561 16.0057 17.4561Z"
fill="white"
fill-opacity="0.3"
d='M16.0057 17.4561C16.101 17.4561 16.1783 17.3788 16.1783 17.2834C16.1783 17.1881 16.101 17.1108 16.0057 17.1108C15.9104 17.1108 15.833 17.1881 15.833 17.2834C15.833 17.3788 15.9104 17.4561 16.0057 17.4561Z'
fill='white'
fill-opacity='0.3'
></path>
<defs>
<radialGradient
cx="0"
cy="0"
gradientTransform="translate(22.0104 3.47051) scale(7.71702 7.71702)"
gradientUnits="userSpaceOnUse"
id="paint0_radial_8766_48743"
r="1"
cx='0'
cy='0'
gradientTransform='translate(22.0104 3.47051) scale(7.71702 7.71702)'
gradientUnits='userSpaceOnUse'
id='paint0_radial_8766_48743'
r='1'
>
<stop stop-color="#FFEAFF" stop-opacity="0.6"></stop>
<stop offset="0.68" stop-color="#A087C9"></stop>
<stop offset="1" stop-color="#10002F"></stop>
<stop stop-color='#FFEAFF' stop-opacity='0.6'></stop>
<stop offset='0.68' stop-color='#A087C9'></stop>
<stop offset='1' stop-color='#10002F'></stop>
</radialGradient>
<radialGradient
cx="0"
cy="0"
gradientTransform="translate(17.7169 6.76169) scale(18.8808)"
gradientUnits="userSpaceOnUse"
id="paint1_radial_8766_48743"
r="1"
cx='0'
cy='0'
gradientTransform='translate(17.7169 6.76169) scale(18.8808)'
gradientUnits='userSpaceOnUse'
id='paint1_radial_8766_48743'
r='1'
>
<stop stop-color="#FFEAFF" stop-opacity="0.6"></stop>
<stop offset="0.68" stop-color="#A087C9"></stop>
<stop offset="1" stop-color="#10002F"></stop>
<stop stop-color='#FFEAFF' stop-opacity='0.6'></stop>
<stop offset='0.68' stop-color='#A087C9'></stop>
<stop offset='1' stop-color='#10002F'></stop>
</radialGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint2_linear_8766_48743"
x1="9.77838"
x2="12.8655"
y1="22.9307"
y2="3.8849"
gradientUnits='userSpaceOnUse'
id='paint2_linear_8766_48743'
x1='9.77838'
x2='12.8655'
y1='22.9307'
y2='3.8849'
>
<stop stop-color="#81FFFF" stop-opacity="0.6"></stop>
<stop offset="0.62" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='#81FFFF' stop-opacity='0.6'></stop>
<stop offset='0.62' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint3_linear_8766_48743"
x1="18.1284"
x2="10.1473"
y1="6.861"
y2="14.1839"
gradientUnits='userSpaceOnUse'
id='paint3_linear_8766_48743'
x1='18.1284'
x2='10.1473'
y1='6.861'
y2='14.1839'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint4_linear_8766_48743"
x1="2.14889"
x2="20.4906"
y1="17.9083"
y2="17.9083"
gradientUnits='userSpaceOnUse'
id='paint4_linear_8766_48743'
x1='2.14889'
x2='20.4906'
y1='17.9083'
y2='17.9083'
>
<stop stop-color="#0002E9"></stop>
<stop offset="1" stop-color="#FF00C7"></stop>
<stop stop-color='#0002E9'></stop>
<stop offset='1' stop-color='#FF00C7'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint5_linear_8766_48743"
x1="21.3586"
x2="11.3753"
y1="14.134"
y2="23.5688"
gradientUnits='userSpaceOnUse'
id='paint5_linear_8766_48743'
x1='21.3586'
x2='11.3753'
y1='14.134'
y2='23.5688'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint6_linear_8766_48743"
x1="2.14889"
x2="11.9616"
y1="17.9083"
y2="17.9083"
gradientUnits='userSpaceOnUse'
id='paint6_linear_8766_48743'
x1='2.14889'
x2='11.9616'
y1='17.9083'
y2='17.9083'
>
<stop stop-color="#000292" stop-opacity="0.7"></stop>
<stop offset="1" stop-color="#7D00C7" stop-opacity="0.7"></stop>
<stop stop-color='#000292' stop-opacity='0.7'></stop>
<stop offset='1' stop-color='#7D00C7' stop-opacity='0.7'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint7_linear_8766_48743"
x1="2.1612"
x2="20.4784"
y1="14.1775"
y2="14.1775"
gradientUnits='userSpaceOnUse'
id='paint7_linear_8766_48743'
x1='2.1612'
x2='20.4784'
y1='14.1775'
y2='14.1775'
>
<stop stop-color="#000292"></stop>
<stop offset="1" stop-color="#BE00C7"></stop>
<stop stop-color='#000292'></stop>
<stop offset='1' stop-color='#BE00C7'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint8_linear_8766_48743"
x1="20.1778"
x2="18.8614"
y1="4.3533"
y2="6.49258"
gradientUnits='userSpaceOnUse'
id='paint8_linear_8766_48743'
x1='20.1778'
x2='18.8614'
y1='4.3533'
y2='6.49258'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint9_linear_8766_48743"
x1="10.1997"
x2="10.9302"
y1="20.1472"
y2="20.1472"
gradientUnits='userSpaceOnUse'
id='paint9_linear_8766_48743'
x1='10.1997'
x2='10.9302'
y1='20.1472'
y2='20.1472'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint10_linear_8766_48743"
x1="12.7185"
x2="13.449"
y1="19.9022"
y2="19.9022"
gradientUnits='userSpaceOnUse'
id='paint10_linear_8766_48743'
x1='12.7185'
x2='13.449'
y1='19.9022'
y2='19.9022'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint11_linear_8766_48743"
x1="11.6008"
x2="12.1492"
y1="21.138"
y2="21.138"
gradientUnits='userSpaceOnUse'
id='paint11_linear_8766_48743'
x1='11.6008'
x2='12.1492'
y1='21.138'
y2='21.138'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint12_linear_8766_48743"
x1="13.8204"
x2="14.3688"
y1="20.8783"
y2="20.8783"
gradientUnits='userSpaceOnUse'
id='paint12_linear_8766_48743'
x1='13.8204'
x2='14.3688'
y1='20.8783'
y2='20.8783'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint13_linear_8766_48743"
x1="7.83973"
x2="9.03272"
y1="19.6691"
y2="19.6691"
gradientUnits='userSpaceOnUse'
id='paint13_linear_8766_48743'
x1='7.83973'
x2='9.03272'
y1='19.6691'
y2='19.6691'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
<linearGradient
gradientUnits="userSpaceOnUse"
id="paint14_linear_8766_48743"
x1="14.9254"
x2="16.1184"
y1="17.7175"
y2="17.7175"
gradientUnits='userSpaceOnUse'
id='paint14_linear_8766_48743'
x1='14.9254'
x2='16.1184'
y1='17.7175'
y2='17.7175'
>
<stop stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.29" stop-color="white" stop-opacity="0.6"></stop>
<stop offset="0.78" stop-color="white" stop-opacity="0"></stop>
<stop offset="1" stop-color="white" stop-opacity="0"></stop>
<stop stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.29' stop-color='white' stop-opacity='0.6'></stop>
<stop offset='0.78' stop-color='white' stop-opacity='0'></stop>
<stop offset='1' stop-color='white' stop-opacity='0'></stop>
</linearGradient>
</defs>
</svg>
</svg>

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

View File

@ -1,40 +1,40 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 2500 2500">
<circle fill="#e50571" cx="1250" cy="1250" r="1250" />
<circle fill="#ffffff" cx="1250" cy="1250" r="128.6" />
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 2500 2500">
<circle fill="#E50571" cx="1250" cy="1250" r="1250" />
<circle fill="#FFFFFF" cx="1250.4" cy="1250.4" r="109.8" />
<path
fill="#ffffff"
d="M1709.1,1253.5c336.5-233.9,543.2-454.9,491.6-544.9c-33.3-58.1-168.1-50.8-359.4,8.1
c-13-22.6-36.8-37.7-64.1-37.7c-41.2,0-74.6,34.5-74.6,77.2c0,2.8,0.2,5.6,0.4,8.3c-69.8,26.5-144.5,58.1-222.5,94.3
c-35.3-409.1-124.1-699.3-228-699.3c-103.7,0-192.4,289.3-227.8,697.4c-370.9-173.9-665.9-242-718-152.1
c-32.5,56.3,35.9,164.2,173.9,294.7c-1.5,6.1-2.3,12.5-2.3,19.1c0,42.6,33.4,77.2,74.6,77.2c10.5,0,20.5-2.3,29.6-6.3
c62.9,52.3,134.6,106.9,213.5,162.2c-336.6,233.9-543.3,454.9-491.6,544.9c51.7,90.1,347.6,22.7,720.2-150.2
c7.9,91.7,18.5,177.4,31.4,255.2c-19.5,13.9-32.3,37.2-32.3,63.5c0,37.3,25.6,68.4,59.6,75.6c43.9,188.9,103.6,305.1,169.3,305.1
c103.8,0,192.4-289.4,227.8-697.6c371,174,665.9,242.2,717.9,152.3C2250.4,1710.6,2044.5,1488.8,1709.1,1253.5z M1725.6,811.8
c13.4,13.3,31.6,21.5,51.7,21.5c37.1,0,67.9-28,73.6-64.8c190.7-59.8,268.1-52.8,295.1-45.4c9.1,2.5,15,11.2,14,20.6
c-5.1,56-104.2,157-104.2,157c-132.1,131.9-271.4,241.7-387.7,324.4c-54.8-37.5-112.7-75.2-173.3-112.6
c-2-69.4-5.4-136.8-10.2-201.5C1576.7,870.1,1656.5,837.6,1725.6,811.8z M1398,1397.6c-47.4,29.1-96.7,57-146.1,83.3
c-33.6-18.8-52-30.1-52-30.1c-46.3-25-92.5-52-137.6-79.9c-2.2-85.5-2.7-164-2.4-227.6c71-43.2,136.9-81.4,190.9-112.1
c76.2,41.6,145,81.1,199.8,113.2c0.4,34.7-0.1,54.1-0.1,54.1c1.7,55.9,1.3,112.8-0.5,169.1C1417,1387.3,1398,1397.6,1398,1397.6z
M1448,1421.5c-2.5,53.4-6.2,105.5-10.4,154.9c-54.3-25.8-101-49.7-138.3-69.6c24.9-13.7,50-27.8,75.2-42.2
C1399.3,1450.2,1423.8,1435.9,1448,1421.5z M1203.7,1506c-45.2,23.2-90.1,44.9-133,65c-3-49.4-5.2-98.4-6.8-145.8
c21.7,13.1,43.8,26.1,66.1,39C1154.8,1478.5,1179.3,1492.4,1203.7,1506z M1009,1337.3c-43.2-27.8-85-56-124.2-83.4
c41.7-27.4,83.5-53.9,124.1-79.1c-0.4,25.7-0.6,51.7-0.6,77.9C1008.2,1281.1,1008.5,1309.3,1009,1337.3z M1066.8,934.6
c44.8,22.5,88.9,45.4,131.2,68c-22.3,12.4-44.8,25-67.3,37.9c-23.7,13.6-47.2,27.3-70.2,41.1c0.8-61.8,2.1-99.1,2.1-99.1
C1063.9,966.2,1065.4,950.3,1066.8,934.6z M1304.9,1000.9c54.2-30.2,87.3-47.7,87.3-47.7c16.4-7.6,32.4-15,48-22.1
c4.9,59.5,7.5,111.6,9,153.5c-24.3-14.6-48.9-29.2-73.9-43.7C1351.8,1027.3,1328.3,1013.9,1304.9,1000.9z M1496.2,1171.4
c53.4,31.9,85.3,51.8,85.3,51.8c15.2,10.6,30,21.1,44.5,31.4c-49.7,34.2-93.9,62.7-129.8,85c0.5-28.7,0.8-57.8,0.8-87.1
C1496.9,1225.3,1496.7,1198.2,1496.2,1171.4z M1238.2,214.2c6.7-6.6,17.1-7.4,24.7-2c45.9,32.5,84.4,168.5,84.4,168.5
c48.7,180.9,74.7,357.1,88.4,499.3c-59.3,28.4-120.2,59.3-182.3,92.6c-61.6-33.4-122.2-64.5-181.2-93
C1124.6,369.7,1208.5,243.6,1238.2,214.2z M619.2,1054c5.3-10.6,8.4-22.7,8.4-35.5c0-42.6-33.4-77.2-74.6-77.2
c-16.7,0-32,5.7-44.5,15.2C364.1,818,351.7,750.1,351.7,750.1l-0.1-0.3c-10-23.7,11.1-29.4,11.1-29.4
c93.5-17.6,224.7,22.6,224.7,22.6c123.5,28.1,280.4,94.2,432.9,168.6c-4.7,64.4-8.1,131.3-10.1,200.3
c-59.6,36.5-116.7,73.2-170.8,109.8C736.8,1148.2,656.4,1084.2,619.2,1054z M736.1,1711.7c-280.1,100.9-369.7,68.8-369.7,68.8h0
c-25.7-3.2-19.9-24.4-19.9-24.4c31.5-89.7,132-183.2,132-183.2c86.2-92.8,222-195.4,362.8-290c53.6,36.5,110.1,73.2,169,109.7
c2,69.5,5.4,136.9,10.2,201.7C859.5,1666.9,736.1,1711.7,736.1,1711.7z M1393.7,1929c-51.8,293.2-124.2,355-124.2,355
c-15.4,20.6-30.9,5.1-30.9,5.1c-62.1-72-93.2-205.8-93.2-205.8c-4.9-15.7-9.5-32.1-13.8-49.3c24.5-12.7,41.3-38.8,41.3-69
c0-41.1-31-74.7-70.2-77c-12.9-83.4-22.1-174.2-28.5-265.2c57.8-27.8,117.3-58,177.7-90.4c61.7,33.4,122.3,64.5,181.2,93.1
C1416.1,1800.5,1393.7,1929,1393.7,1929z M2147.6,1782.8c-51.1,23.4-188.1-11.5-188.1-11.5c-180.4-48.4-345.3-113.9-475.1-173.2
c4.9-65.8,8.4-134.4,10.5-205.1c59.6-36.5,116.7-73.3,170.8-109.9c414.9,300.9,482,436.8,492.5,477.1
C2160.7,1769.5,2156.1,1778.9,2147.6,1782.8z"
fill="#FFFFFF"
d="M1642.3,1253.4C1929.6,1053.7,2106,865,2062,788.2c-28.4-49.6-143.5-43.4-306.8,6.9
c-11.1-19.3-31.4-32.2-54.7-32.2c-35.2,0-63.7,29.5-63.7,65.9c0,2.4,0.2,4.8,0.3,7.1c-59.6,22.6-123.4,49.6-189.9,80.5
c-30.1-349.2-105.9-597-194.6-597c-88.5,0-164.2,247-194.5,595.4C741.4,766.4,489.6,708.2,445.1,785
c-27.7,48.1,30.6,140.2,148.5,251.6c-1.3,5.2-2,10.7-2,16.3c0,36.4,28.5,65.9,63.7,65.9c9,0,17.5-2,25.3-5.4
c53.7,44.6,114.9,91.3,182.3,138.5C575.5,1451.5,399,1640.2,443.1,1717c44.1,76.9,296.7,19.4,614.8-128.2
c6.7,78.3,15.8,151.4,26.8,217.9c-16.6,11.9-27.6,31.8-27.6,54.2c0,31.8,21.9,58.4,50.9,64.5c37.5,161.3,88.4,260.5,144.5,260.5
c88.6,0,164.2-247.1,194.5-595.5c316.7,148.5,568.5,206.8,612.9,130C2104.4,1643.6,1928.6,1454.2,1642.3,1253.4z M1656.4,876.3
c11.4,11.4,27,18.4,44.1,18.4c31.7,0,58-23.9,62.8-55.3c162.8-51,228.9-45.1,251.9-38.8c7.8,2.1,12.8,9.6,12,17.6
c-4.4,47.8-89,134-89,134c-112.8,112.6-231.7,206.3-331,276.9c-46.8-32-96.2-64.2-147.9-96.1c-1.7-59.2-4.6-116.8-8.7-172
C1529.3,926.1,1597.4,898.3,1656.4,876.3z M1376.7,1376.4c-40.5,24.8-82.6,48.7-124.7,71.1c-28.7-16-44.4-25.7-44.4-25.7
c-39.5-21.3-79-44.4-117.5-68.2c-1.9-73-2.3-140-2-194.3c60.6-36.9,116.9-69.5,163-95.7c65.1,35.5,123.8,69.2,170.6,96.6
c0.3,29.6-0.1,46.2-0.1,46.2c1.5,47.7,1.1,96.3-0.4,144.4C1392.9,1367.6,1376.7,1376.4,1376.7,1376.4z M1419.4,1396.8
c-2.1,45.6-5.3,90.1-8.9,132.2c-46.4-22-86.2-42.4-118.1-59.4c21.3-11.7,42.7-23.7,64.2-36
C1377.8,1421.3,1398.7,1409.1,1419.4,1396.8z M1210.8,1468.9c-38.6,19.8-76.9,38.3-113.5,55.5c-2.6-42.2-4.4-84-5.8-124.5
c18.5,11.2,37.4,22.3,56.4,33.3C1169.1,1445.5,1190,1457.3,1210.8,1468.9z M1044.6,1324.9c-36.9-23.7-72.6-47.8-106-71.2
c35.6-23.4,71.3-46,105.9-67.5c-0.3,21.9-0.5,44.1-0.5,66.5C1044,1276.9,1044.2,1301,1044.6,1324.9z M1094,981.1
c38.2,19.2,75.9,38.8,112,58.1c-19,10.6-38.2,21.3-57.5,32.4c-20.2,11.6-40.3,23.3-59.9,35.1c0.7-52.8,1.8-84.6,1.8-84.6
C1091.5,1008.1,1092.8,994.5,1094,981.1z M1297.2,1037.7c46.3-25.8,74.5-40.7,74.5-40.7c14-6.5,27.7-12.8,41-18.9
c4.2,50.8,6.4,95.3,7.7,131c-20.7-12.5-41.7-24.9-63.1-37.3C1337.3,1060.3,1317.2,1048.8,1297.2,1037.7z M1460.5,1183.3
c45.6,27.2,72.8,44.2,72.8,44.2c13,9,25.6,18,38,26.8c-42.4,29.2-80.2,53.5-110.8,72.6c0.4-24.5,0.7-49.3,0.7-74.4
C1461.1,1229.3,1461,1206.2,1460.5,1183.3z M1240.3,366.1c5.7-5.6,14.6-6.3,21.1-1.7c39.2,27.7,72.1,143.8,72.1,143.8
c41.6,154.4,63.8,304.8,75.5,426.2c-50.6,24.2-102.6,50.6-155.6,79.1c-52.6-28.5-104.3-55.1-154.7-79.4
C1143.3,498.9,1214.9,391.2,1240.3,366.1z M711.9,1083.1c4.5-9,7.2-19.4,7.2-30.3c0-36.4-28.5-65.9-63.7-65.9
c-14.3,0-27.3,4.9-38,13C494.1,881.6,483.5,823.6,483.5,823.6l-0.1-0.3c-8.5-20.2,9.5-25.1,9.5-25.1c79.8-15,191.8,19.3,191.8,19.3
c105.4,24,239.4,80.4,369.6,143.9c-4,55-6.9,112.1-8.6,171c-50.9,31.2-99.6,62.5-145.8,93.7C812.3,1163.5,743.6,1108.8,711.9,1083.1
z M811.7,1644.5c-239.1,86.1-315.6,58.7-315.6,58.7l0,0c-21.9-2.7-17-20.8-17-20.8C506,1605.9,591.8,1526,591.8,1526
c73.6-79.2,189.5-166.8,309.7-247.6c45.8,31.2,94,62.5,144.3,93.6c1.7,59.3,4.6,116.9,8.7,172.2
C917,1606.3,811.7,1644.5,811.7,1644.5z M1373,1830c-44.2,250.3-106,303.1-106,303.1c-13.1,17.6-26.4,4.4-26.4,4.4
c-53-61.5-79.6-175.7-79.6-175.7c-4.2-13.4-8.1-27.4-11.8-42.1c20.9-10.8,35.3-33.1,35.3-58.9c0-35.1-26.5-63.8-59.9-65.7
c-11-71.2-18.9-148.7-24.3-226.4c49.3-23.7,100.1-49.5,151.7-77.2c52.7,28.5,104.4,55.1,154.7,79.5
C1392.2,1720.3,1373,1830,1373,1830z M2016.6,1705.2c-43.6,20-160.6-9.8-160.6-9.8c-154-41.3-294.8-97.2-405.6-147.9
c4.2-56.2,7.2-114.7,9-175.1c50.9-31.2,99.6-62.6,145.8-93.8c354.2,256.9,411.5,372.9,420.4,407.3
C2027.8,1693.9,2023.9,1701.9,2016.6,1705.2z"
/>
</svg>

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

9
src/images/stosmo.svg Normal file
View File

@ -0,0 +1,9 @@
<svg width="500" height="500" viewBox="0 0 500 500" fill="none" xmlns="http://www.w3.org/2000/svg">
<mask id="mask0_207_398" style="mask-type:alpha" maskUnits="userSpaceOnUse" x="0" y="0" width="500" height="500">
<path d="M250 500C388.071 500 500 388.071 500 250C500 111.929 388.071 0 250 0C111.929 0 0 111.929 0 250C0 388.071 111.929 500 250 500Z" fill="#D9D9D9"/>
</mask>
<g mask="url(#mask0_207_398)">
<path d="M500 0H0V500H500V0Z" fill="#E50571"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M355.922 116.063C373.552 128.87 383.346 140.375 386.393 151.879C388.352 158.391 386.611 166.206 382.259 172.067C377.904 177.927 370.941 181.183 362.887 181.183C359.841 181.183 356.57 180.717 353.526 179.849C354.448 177.382 355.467 174.831 356.572 172.28C357.443 172.497 358.533 172.497 359.62 172.497C362.23 172.497 365.278 172.062 367.674 170.109C369.413 168.807 371.374 166.419 371.157 162.077C371.157 157.953 367.891 152.743 361.144 146.448C356.357 141.89 349.826 136.897 343.298 132.339C324.578 119.966 311.52 116.493 305.643 122.354C301.726 126.261 302.161 131.037 303.467 134.51C300.741 136.294 298.183 137.878 295.841 139.276C290.198 130.82 289.907 120.621 294.763 111.505C297.809 105.644 302.598 101.737 308.039 100.651C310.215 100.217 312.391 100 314.787 100C326.757 100 341.774 105.861 355.922 116.063ZM294.241 147.657C301.204 143.967 311.302 137.548 322.837 128.432C327.191 130.168 332.85 133.207 339.815 137.766C348.085 143.192 355.267 149.27 359.839 154.046C352.233 164.014 347.23 177.66 344.183 187.208C360.687 208.796 370.502 235.743 370.502 264.972C370.502 335.952 312.826 393.476 241.657 393.476C170.485 393.476 112.808 335.952 112.808 264.972C112.808 193.99 170.485 136.467 241.657 136.467C260.344 136.467 278.128 140.458 294.185 147.634L294.241 147.657ZM241.657 386.313C174.402 386.313 119.99 332.046 119.99 264.972C119.99 197.898 174.402 143.63 241.657 143.63C308.909 143.63 363.322 197.898 363.322 264.972C363.322 332.046 308.691 386.313 241.657 386.313ZM364.844 162.294C364.844 161.643 364.626 160.558 363.974 159.473C362.45 161.643 360.926 163.814 359.62 166.419C361.144 166.419 362.885 165.985 363.754 165.333C364.191 164.899 364.844 164.248 364.844 162.294ZM315.439 126.478C312.609 126.044 310.867 126.478 310.215 127.129C308.909 128.215 308.691 129.734 308.909 131.253C311.085 129.734 313.261 128.215 315.439 126.478ZM303.248 241.528C333.937 244.13 357.224 250.639 357.224 263.88C357.224 327.48 305.424 379.143 241.654 379.143C178.472 379.143 126.827 328.43 125.878 265.639C125.869 265.415 125.864 265.193 125.864 264.97C125.864 264.861 125.865 264.752 125.867 264.643C125.865 264.389 125.865 264.135 125.865 263.88H125.895C126.724 249.363 144.485 249.863 176.141 253.465C190.724 255.202 210.748 256.287 232.948 249.776C258.63 241.961 281.048 239.789 303.248 241.528ZM235.454 258.165L235.413 258.178C211.591 265.165 190.228 263.959 175.129 262.163C158.617 260.285 147.335 259.463 140.246 260.615C136.818 261.174 135.589 262.026 135.234 262.367L135.223 262.378C135.114 262.478 134.621 262.928 134.621 264.97C134.621 267.6 136.016 271.543 140.491 276.233C144.895 280.85 151.75 285.583 161.037 289.563C179.564 297.507 206.757 302.015 239.989 297.326C264.652 293.811 279.954 287.83 294.907 281.987C300.563 279.776 306.167 277.585 312.211 275.554L312.237 275.546L312.263 275.537C318.22 273.576 323.933 272.139 328.974 270.926C329.88 270.707 330.759 270.498 331.607 270.296L331.676 270.278L331.696 270.274C335.654 269.33 338.978 268.537 341.872 267.661C345.498 266.561 347.309 265.641 348.139 264.98C348.18 264.946 348.217 264.915 348.248 264.889C348.194 264.054 347.263 260.978 338.357 257.378C329.937 253.976 317.504 251.526 302.535 250.254C281.474 248.611 260.161 250.648 235.496 258.152L235.454 258.165ZM279.526 210.272C290.346 210.272 299.113 201.525 299.113 190.735C299.113 179.946 290.346 171.199 279.526 171.199C268.709 171.199 259.937 179.946 259.937 190.735C259.937 201.525 268.709 210.272 279.526 210.272ZM319.791 216.574C319.791 221.13 316.087 224.824 311.52 224.824C306.952 224.824 303.25 221.13 303.25 216.574C303.25 212.02 306.952 208.326 311.52 208.326C316.087 208.326 319.791 212.02 319.791 216.574Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

46
src/images/tia.svg Normal file
View File

@ -0,0 +1,46 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 500 500">
<circle fill="#7B2BF9" cx="250" cy="250" r="250" />
<path
fill="#FFFFFF"
d="M429.7,211.8c-7.2-34.5-24.3-66.1-49.8-91.6C345.2,85.5,299.1,66.4,250,66.4s-95.2,19-129.9,53.7
c-8.5,8.5-15.9,17.6-22.4,27.2c-1.9,2.6-3.7,5.3-5.2,8.2c-17,28.3-26.1,60.6-26.1,94.5c0,49.1,19.1,95.2,53.8,129.9
s80.8,53.8,129.9,53.8s95.2-19.1,129.9-53.8c16.3-16.3,29.3-35.3,38.4-55.8c1.1-2.2,2-4.6,2.9-7c8.3-21,12.6-43.7,12.6-67
c0-12.3-1.2-24-3.6-35.8C430.2,213.7,429.8,212.2,429.7,211.8z M366,127.9c1,1,2.1,2,3.2,3.1c16.2,16.2,28.8,35.2,37.1,55.8
c0.8,2-0.9,4.3-3.2,3.9c-4.8-0.9-10.3-1.2-16.3-1.1c-4.2,0.1-7.9-2.9-8.6-6.9c-3.3-18.4-8.1-35.3-14.1-50.1c-0.3-0.8-0.7-1.6-1-2.6
C362.3,128.1,364.6,126.4,366,127.9z M383.5,235.6c0-1.9,2.4-2.8,3.6-1.2c1.3,1.9,2.7,3.9,4,5.8c1.7,2.6,3.3,5.2,4.7,7.8
c0.9,1.6,0.7,3.6-0.5,5c-1.9,2.1-4.1,4.4-6.4,6.7c-0.8,0.8-1.7,1.7-2.6,2.6c-1.1,1-3,0.2-2.9-1.2c0.1-2.8,0.2-5.5,0.2-8.4
C383.7,246.8,383.7,241.2,383.5,235.6z M152.2,112.8c28.4-20.3,62.2-31.2,97.8-31.2c9.4,0,18.7,0.8,27.8,2.2c2.4,0.4,3.3,3.5,1.3,5
c-8.8,6.9-16.9,17.1-24.2,30.3c-1.7,3.3-5.5,4.8-9.1,3.8c-24-6.7-47.6-9.9-69.4-9.2c-8.1,0.3-15.6,1.1-22.8,2.4
C151.6,116.6,150.6,114,152.2,112.8z M128.2,364.5c-3.6-6.6,1-22.1,24.3-45.7l0,0c2.4-2.4,2.2-6.4-0.5-8.6
c-0.9-0.7-1.8-1.4-2.8-2.2c-2.3-1.8-5.7-1.7-7.8,0.4c-0.5,0.5-0.8,0.8-0.9,0.9c-11.6,11.9-19.8,23-24.3,33
c-1.3,2.9-5.2,3.2-6.9,0.5c-18.1-27.2-27.8-59.2-27.8-92.7c0-11.9,1.2-23.8,3.7-35.2c0.4-1.7,2.8-1.8,3.4-0.1
c3.5,11.5,9.2,23.5,17,35.5c10.6,16.2,24.5,31.8,41.1,46.2l0,0c5.6,4.9,11.6,9.6,17.9,14.2c12.7,9.3,26.3,17.8,40.9,25.3
c6.4,3.4,12.8,6.5,19.2,9.5c3.6,1.6,7.7,1.7,11.3,0.3c3.1-1.2,6.1-2.4,9.2-3.7c3.4-1.4,5.2-5,4.3-8.6c-0.1-0.4-0.2-0.8-0.2-1
c-5.1-21.3-7.9-45.4-8.3-70.5l0,0c0-0.3,0-6,0-11.9s0.2-8.6,0.4-12.9l0,0c1.5-30.4,6.7-58.9,14.9-83c0.7-2.2-0.4-4.6-2.7-5.4
c-2.1-0.7-4.3-1.4-6.5-2.1c-2.1-0.7-4.5,0.5-5.3,2.7c-8.9,26.1-14.4,57-15.8,89.7c-0.2,4.2-2.4,8-6,10.1
c-19.4,11.5-37.1,23.7-52.6,35.9c-3.2,2.6-7.8,2.4-10.9-0.2c-15.4-13.4-28.4-27.9-38.2-43c-19.3-29.6-23.9-57.4-12.9-78.5l0.1-0.1
c1.4-2.3,2.9-4.6,4.4-6.8c12.6-16.6,36-26.3,67.1-27.4c1.9-0.1,4-0.1,5.9-0.1c19.1,0,39.5,3.2,60.3,9.2l0,0c0.4,0.1,3.4,1,4,1.2
c5.3,1.7,14.3,4.8,15.5,5.2c0.5,0.2,3.3,1.3,3.7,1.4l0,0c10.2,4,20.3,8.5,30.3,13.7c19.4,10.1,37.1,21.9,52.7,34.9
c-29.5,6.7-63.8,19.8-98.3,37.3c-1.6,0.8-2.7,2.4-2.8,4.2c-0.1,2.1-0.3,6.4-0.4,9.9c-0.1,2.1,2.2,3.6,4.1,2.6l0,0
c34.2-18,68.3-31.3,97.6-38.5c5.5-1.3,9-6.5,8.3-12.1c-0.5-3.9-1.1-7.8-1.8-11.5c-0.8-4.7-3.5-9-7.2-11.8
c-13.7-10.4-28.8-20-45-28.5c-10.9-5.7-21.9-10.6-33.1-14.9c-2.3-0.9-3.4-3.7-2.1-5.9c11.4-20.4,25-31.8,38.3-31.8
c0.1,0,0.3,0,0.4,0c15.6,0.3,31.1,16.5,42.7,44.6c5.8,14.2,10.3,30.6,13.5,48.4l0,0c0.9,5,1.6,10.1,2.2,15.3
c0.3,2.7,0.8,6.8,1.1,8.6c1.3,13.5,1.8,27.6,1.6,41.9c-0.2,9.1-0.6,18.1-1.4,26.8c-20.9,16.8-46.7,33.7-75.1,48.7
c-7.7,4-15.4,7.9-23,11.5c-1.6,0.8-8.2,3.7-8.6,3.9c-7.2,3.3-14.3,6.2-21.4,9l0,0c-0.4,0.2-8.4,3.2-8.9,3.4
c-0.6,0.2-4.7,1.7-5.2,1.9c-15.3,5.4-30,9.5-43.4,12.1C147.6,376.2,131.7,371.2,128.2,364.5z M174.3,299.1
c14.8-12,32.2-24.2,51.3-35.6c0.4,24.4,3.1,47.9,7.9,69c-7-3.1-14.1-6.3-21.1-10C198.8,315.5,186,307.6,174.3,299.1z M271.7,417.1
c-7.1,0.9-14.4,1.4-21.7,1.4c-32.8,0-64.1-9.3-90.9-26.6c-1.8-1.2-1-4.1,1.1-4.2c0.4,0,0.9,0,1.2-0.1c6.8-0.4,14.3-1.4,22.4-3
c17.2-3.4,36.4-9,56.5-16.7c1.8-0.7,3.8,0.2,4.6,2l0,0c7.8,19,17.3,33.3,28.2,42.4C275,413.9,274.1,416.8,271.7,417.1z M343,372.1
c-12,23.7-26.8,36.9-41.2,36.6c-15.6-0.3-31.1-16.5-42.7-44.6l0,0c-0.7-1.7,0.1-3.8,1.8-4.6c0.1-0.1,0.2-0.1,0.4-0.2
c0.7-0.3,1.6-0.4,2.4-0.2c21.5,6,42.8,9.2,62.7,9.2c2.1,0,4.3,0,6.4-0.1c2.4-0.1,4.9-0.2,7.3-0.4C342.4,367.8,344,370.1,343,372.1z
M348.2,351.7c-5,0.7-10.3,1.2-15.8,1.4c-13.5,0.5-27.8-0.7-42.4-3.4c-1.8-0.3-2.1-2.8-0.5-3.6c3.2-1.6,6.4-3.3,9.6-5
c22.4-11.9,43.4-24.9,61.7-38.2c1.3-1,3.3,0.2,3,1.8c-2.6,15.3-6,29.7-10.5,42.7C352.4,349.8,350.5,351.4,348.2,351.7z
M373.1,365.1c-1.2,1.3-2.6,2.7-3.9,4c-2.2,2.2-4.7,4.5-7,6.6c-1.5,1.3-3.8-0.3-3-2.1c0.2-0.5,0.5-1,0.7-1.6c1-2.2,1.9-4.5,3-6.8
c0.2-0.5,0.7-0.9,1.2-1.1c2.3-0.6,4.7-1.3,6.9-2C373,361.5,374.4,363.8,373.1,365.1z M406.9,311.7c-0.7,1.7-1.3,3.4-2.1,5.1
c-0.2,0.3-1.2,2.4-1.3,2.7c-5.6,10.3-14.8,18.4-26.8,24.1c-2.8,1.3-5.8-1.2-5-4.2c4.2-14.8,7.2-30.8,9.3-47.7
c0.4-3.2,1.9-6,4.3-8.1c5.1-4.4,9.9-8.9,14.3-13.3l0,0c2.1-2.1,5.8-1.2,6.7,1.7C410.6,286.5,410.9,300,406.9,311.7z M410.3,232.8
c-1.2,2.2-4.5,2.3-5.9,0.2c-0.2-0.3-0.4-0.7-0.6-1c-5-7.8-10.8-15.3-17.2-22.7c-1.6-1.8-0.3-4.6,2.1-4.7h0.1
c15.1,0,23,3.8,25.4,8.3C416.1,216.7,415.5,223.4,410.3,232.8z M418.5,255c0,1.1-1.6,1.4-2,0.4c-0.2-0.4-0.4-0.9-0.6-1.3
c-0.4-0.8-0.3-1.8,0.3-2.6c0.1-0.1,0.3-0.4,0.6-0.8c0.7-0.9,1.8-0.8,1.8,0.2C418.5,252.3,418.5,253.6,418.5,255z"
/>
</svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

View File

@ -1,4 +1,13 @@
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 120 120">
<svg
version="1.1"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px"
y="0px"
viewBox="0 0 120 120"
style="enable-background: new 0 0 120 120"
xml:space="preserve"
>
<path fill="#2775CA" d="M60,120c33.2,0,60-26.8,60-60S93.2,0,60,0S0,26.8,0,60S26.8,120,60,120z" />
<path
fill="#FFFFFF"

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

10
src/images/usdt.svg Normal file
View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 339.43 295.27">
<path
d="M62.15,1.45l-61.89,130a2.52,2.52,0,0,0,.54,2.94L167.95,294.56a2.55,2.55,0,0,0,3.53,0L338.63,134.4a2.52,2.52,0,0,0,.54-2.94l-61.89-130A2.5,2.5,0,0,0,275,0H64.45a2.5,2.5,0,0,0-2.3,1.45h0Z"
fill="#50af95"
/>
<path
d="M191.19,144.8v0c-1.2.09-7.4,0.46-21.23,0.46-11,0-18.81-.33-21.55-0.46v0c-42.51-1.87-74.24-9.27-74.24-18.13s31.73-16.25,74.24-18.15v28.91c2.78,0.2,10.74.67,21.74,0.67,13.2,0,19.81-.55,21-0.66v-28.9c42.42,1.89,74.08,9.29,74.08,18.13s-31.65,16.24-74.08,18.12h0Zm0-39.25V79.68h59.2V40.23H89.21V79.68H148.4v25.86c-48.11,2.21-84.29,11.74-84.29,23.16s36.18,20.94,84.29,23.16v82.9h42.78V151.83c48-2.21,84.12-11.73,84.12-23.14s-36.09-20.93-84.12-23.15h0Zm0,0h0Z"
fill="#FFFFFF"
/>
</svg>

After

Width:  |  Height:  |  Size: 795 B

View File

@ -1,5 +1,5 @@
import { ChainInfoID } from '@marsprotocol/wallet-connector'
import { CHAIN_ID_KEY, SUPPORTED_CHAINS } from 'constants/appConstants'
import { ChainInfoID } from 'types/enums/wallet'
export const getCurrentChainId = () => {
let chainId = SUPPORTED_CHAINS[0].chainId
@ -13,7 +13,7 @@ export const getCurrentChainId = () => {
break
case 'neutron':
chainId = ChainInfoID.Neutron
chainId = ChainInfoID.Neutron1
break
case 'testnet-osmosis':

View File

@ -1,6 +1,6 @@
import { ChainInfoID, WalletID } from '@marsprotocol/wallet-connector'
import { SUPPORTED_CHAINS } from 'constants/appConstants'
import { DocURL } from 'types/enums/docURL'
import { ChainInfoID, WalletID } from 'types/enums/wallet'
export function getCouncilLink(currentNetwork: ChainInfoID, currentProvider?: WalletID): string {
const isTestnet =

View File

@ -1,4 +1,4 @@
import { TxBroadcastResult } from '@marsprotocol/wallet-connector'
import { BroadcastResult } from '@delphi-labs/shuttle-react'
import BigNumber from 'bignumber.js'
import { DAY_IN_SECONDS, HOUR_IN_SECONDS, MINUTE_IN_SECONDS } from 'constants/timeConstants'
import moment from 'moment'
@ -287,7 +287,7 @@ export const extractCoinFromLog = (text: string) => {
return { amount: arr[0], denom: arr[1] }
}
export const parseActionMessages = (data: TxBroadcastResult) => {
export const parseActionMessages = (data: BroadcastResult) => {
const wasmEvents: [] = data.response.events
.filter((object: Record<string, string>) => object.type === 'wasm')
.map((event: Record<string, string>) => event?.attributes)

View File

@ -1,4 +1,4 @@
import { MsgExecuteContract } from '@marsprotocol/wallet-connector'
import { MsgExecuteContract } from '@delphi-labs/shuttle-react'
export const getPythVaaMessage = (
pythVaa: VaaInformation,

View File

@ -4,20 +4,22 @@ import 'styles/App.scss'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import BigNumber from 'bignumber.js'
import {
CommonContainer,
CosmosWalletConnectProvider,
FieldsContainer,
Layout,
} from 'components/common'
import { CommonContainer, FieldsContainer, Layout } from 'components/common'
import { WalletConnectProvider } from 'components/common/Wallet/WalletConnectProvider'
import type { AppProps, NextWebVitalsMetric } from 'next/app'
import Head from 'next/head'
import { Suspense } from 'react'
import { Suspense, useEffect, useState } from 'react'
BigNumber.config({ EXPONENTIAL_AT: 1e9 })
const queryClient = new QueryClient()
const App = ({ Component, pageProps }: AppProps) => {
const [isServer, setIsServer] = useState(true)
useEffect(() => {
setIsServer(false)
}, [])
if (isServer) return null
return (
<>
<Head>
@ -25,7 +27,7 @@ const App = ({ Component, pageProps }: AppProps) => {
<title>Mars Protocol</title>
</Head>
<Suspense fallback={null}>
<CosmosWalletConnectProvider>
<WalletConnectProvider>
<QueryClientProvider client={queryClient}>
<CommonContainer>
<FieldsContainer>
@ -35,7 +37,7 @@ const App = ({ Component, pageProps }: AppProps) => {
</FieldsContainer>
</CommonContainer>
</QueryClientProvider>
</CosmosWalletConnectProvider>
</WalletConnectProvider>
</Suspense>
</>
)

View File

@ -5,7 +5,7 @@ import { DEFAULT_POSITION } from 'constants/defaults'
import { useAvailableVault } from 'hooks/data'
import cloneDeep from 'lodash.clonedeep'
import { useRouter } from 'next/router'
import React, { useEffect, useState } from 'react'
import { useEffect, useState } from 'react'
import { useTranslation } from 'react-i18next'
import useStore from 'store'

View File

@ -86,7 +86,10 @@ const RedBank = () => {
const borrowBalance = Number(balanceSum(redBankAssets, 'borrowBalanceBaseCurrency'))
const showLiquidationWarning =
borrowBalance >= maxBorrowLimit && borrowBalance > 0 && redBankState === State.READY
borrowBalance >= maxBorrowLimit &&
maxBorrowLimit !== 0 &&
borrowBalance > 0 &&
redBankState === State.READY
const loader = (
<div className={styles.loader}>

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