73
.env.example
Normal file
@ -0,0 +1,73 @@
|
||||
NEXT_PUBLIC_NETWORK=devnet
|
||||
NEXT_PUBLIC_CHAIN_ID=devnet
|
||||
NEXT_PUBLIC_RPC=https://rpc.devnet.osmosis.zone/
|
||||
NEXT_PUBLIC_GQL=https://devnet-osmosis-gql.marsprotocol.io/graphql
|
||||
NEXT_PUBLIC_REST=https://lcd.devnet.osmosis.zone/
|
||||
NEXT_PUBLIC_SWAP=https://testnet.osmosis.zone
|
||||
NEXT_PUBLIC_VAULT_APR=https://api.marsprotocol.io/v1/vaults/osmosis
|
||||
NEXT_PUBLIC_ACCOUNT_NFT=osmo1pdr8mvj2ky9hzj5pjp026apfmd0pacd3xrzx3mzazy7lulnsdrkq96gzk3
|
||||
NEXT_PUBLIC_ORACLE=osmo156elt2tp5455q9a6vfrvnpncxyd33cxm9z2lgguwg6dgws9tedps5tq3rc
|
||||
NEXT_PUBLIC_RED_BANK=osmo1vxpdcw092n9rngvekve8g324c2yjx56496ck98ag4sdxr4p4zd4q0wr7x6
|
||||
NEXT_PUBLIC_CREDIT_MANAGER=osmo1m83kw2vehyt9urxf79qa9rxk8chgs4464e5h8s37yhnw3pwauuqq7lux8r
|
||||
NEXT_PUBLIC_INCENTIVES=osmo1r9w7k774vcxeuvq6ctq0z2j6wkkxpskucgjkqt0uu7u07l03s3js6ukge4
|
||||
NEXT_PUBLIC_ZAPPER=osmo1q4kkvuy8wc9fs8sfm7zyeh4k25vssd0l68nrph8s7unvq5jdq67swrepj4
|
||||
NEXT_PUBLIC_SWAPPER=osmo1wee0z8c7tcawyl647eapqs4a88q8jpa7ddy6nn2nrs7t47p2zhxswetwla
|
||||
NEXT_PUBLIC_PARAMS=osmo1pzszwkyy0x9cu6p2uknwa3wccr79xwmqn9gj66fnjnayr28tzp6qh2n4qg
|
||||
NEXT_PUBLIC_PYTH=osmo13ge29x4e2s63a8ytz2px8gurtyznmue4a69n5275692v3qn3ks8q7cwck7
|
||||
NEXT_PUBLIC_API=http://localhost:3000/api
|
||||
NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
|
||||
NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
||||
NEXT_PUBLIC_CANDLES_ENDPOINT=https://api.thegraph.com/subgraphs/name/donovansolms/osmosis-tv-candles-test
|
||||
NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045
|
||||
CHARTING_LIBRARY_REPOSITORY=github.com/tradingview/charting_library
|
||||
CHARTING_LIBRARY_ACCESS_TOKEN=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
|
||||
CHARTING_LIBRARY_USERNAME=mars-git-demo
|
||||
|
||||
# TESTNET #
|
||||
# NEXT_PUBLIC_NETWORK=testnet
|
||||
# NEXT_PUBLIC_CHAIN_ID=osmo-test-5
|
||||
# NEXT_PUBLIC_RPC=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-rpc-front/
|
||||
# NEXT_PUBLIC_GQL=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-hive-front/graphql
|
||||
# NEXT_PUBLIC_REST=https://testnet-osmosis-node.marsprotocol.io/XF32UOOU55CX/osmosis-lcd-front/
|
||||
# NEXT_PUBLIC_SWAP=https://testnet.osmosis.zone
|
||||
# NEXT_PUBLIC_VAULT_APR=https://testnet-api.marsprotocol.io/v1/vaults/osmosis
|
||||
# NEXT_PUBLIC_ACCOUNT_NFT=osmo1hdk6nps2l2tdfgly0tegcgwl239l45etuae7nsc6s93u0yrqk4rqv489kl
|
||||
# NEXT_PUBLIC_ORACLE=osmo1dxu93scjdnx42txdp9d4hm3snffvnzmkp4jpc9sml8xlu3ncgamsl2lx58
|
||||
# NEXT_PUBLIC_RED_BANK=osmo1hs4sm0fah9rk4mz8e56v4n76g0q9fffdkkjm3f8tjagkdx78pqcq75pk0a
|
||||
# NEXT_PUBLIC_CREDIT_MANAGER=osmo1zwugj8tz9nq63m3lxcfpunp0xr5lnlxdr0yyn4gpftx3ham09m4skn73ew
|
||||
# NEXT_PUBLIC_INCENTIVES=osmo1nu0k6g294jela67vyth6nwr3l42gutq2m07pg9927f7v7tuv0d4sre9fr7
|
||||
# NEXT_PUBLIC_ZAPPER=osmo1jwtmujld4ew2vt67qnmpdxr3fmmle2yg823de5ygvf47uvhpu76qlhf82q
|
||||
# NEXT_PUBLIC_SWAPPER=osmo1ee9cq8dcknmw43znznx6vuupx5ku0tt505agccgaz5gn48mhe45s3kwwfm
|
||||
# NEXT_PUBLIC_PARAMS=osmo1h334tvddn82m4apm08rm9k6kt32ws7vy0c4n30ngrvu6h6yxh8eq9l9jfh
|
||||
# NEXT_PUBLIC_API=http://localhost:3000/api
|
||||
# NEXT_PUBLIC_CANDLES_ENDPOINT="https://api.thegraph.com/subgraphs/name/{NAME}/{GRAPH_NAME}"
|
||||
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
|
||||
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
|
||||
# CHARTING_LIBRARY_REPOSITORY="github.com/username/charting_library/"
|
||||
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
|
||||
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
||||
# NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045
|
||||
|
||||
# MAINNET #
|
||||
# NEXT_PUBLIC_NETWORK=mainnet
|
||||
# NEXT_PUBLIC_CHAIN_ID=osmosis-1
|
||||
# NEXT_PUBLIC_RPC=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-rpc-front/
|
||||
# NEXT_PUBLIC_GQL=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-hive-front/graphql
|
||||
# NEXT_PUBLIC_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
||||
# NEXT_PUBLIC_SWAP=https://app.osmosis.zone
|
||||
# NEXT_PUBLIC_VAULT_APR=https://api.marsprotocol.io/v1/vaults/osmosis
|
||||
# NEXT_PUBLIC_ACCOUNT_NFT=osmo1450hrg6dv2l58c0rvdwx8ec2a0r6dd50hn4frk370tpvqjhy8khqw7sw09
|
||||
# NEXT_PUBLIC_ORACLE=osmo1mhznfr60vjdp2gejhyv2gax9nvyyzhd3z0qcwseyetkfustjauzqycsy2g
|
||||
# NEXT_PUBLIC_RED_BANK=osmo1c3ljch9dfw5kf52nfwpxd2zmj2ese7agnx0p9tenkrryasrle5sqf3ftpg
|
||||
# NEXT_PUBLIC_CREDIT_MANAGER=osmo1f2m24wktq0sw3c0lexlg7fv4kngwyttvzws3a3r3al9ld2s2pvds87jqvf
|
||||
# NEXT_PUBLIC_INCENTIVES=osmo1nkahswfr8shg8rlxqwup0vgahp0dk4x8w6tkv3rra8rratnut36sk22vrm
|
||||
# NEXT_PUBLIC_ZAPPER=osmo17qwvc70pzc9mudr8t02t3pl74hhqsgwnskl734p4hug3s8mkerdqzduf7c
|
||||
# NEXT_PUBLIC_SWAPPER=osmo1wee0z8c7tcawyl647eapqs4a88q8jpa7ddy6nn2nrs7t47p2zhxswetwla
|
||||
# NEXT_PUBLIC_API=http://localhost:3000/api
|
||||
# CHARTING_LIBRARY_USERNAME="username_with_access_to_charting_library"
|
||||
# CHARTING_LIBRARY_ACCESS_TOKEN="access_token_with_access_to_charting_library"
|
||||
# CHARTING_LIBRARY_REPOSITORY="username/charting_library"
|
||||
# NEXT_PUBLIC_PYTH_ENDPOINT=https://xc-mainnet.pyth.network/api
|
||||
# NEXT_PUBLIC_MAINNET_REST=https://osmosis-node.marsprotocol.io/GGSFGSFGFG34/osmosis-lcd-front/
|
||||
# NEXT_PUBLIC_WALLET_CONNECT_ID=d93fdffb159bae5ec87d8fee4cdbb045
|
||||
|
3
.eslintignore
Normal file
@ -0,0 +1,3 @@
|
||||
src/utils/charting_library
|
||||
src/utils/datafeeds
|
||||
src/types/generated
|
@ -1,3 +1,20 @@
|
||||
{
|
||||
"extends": "next/core-web-vitals"
|
||||
"extends": "next/core-web-vitals",
|
||||
"rules": {
|
||||
"linebreak-style": ["warn", "unix"],
|
||||
"sort-imports": [
|
||||
"warn",
|
||||
{
|
||||
"ignoreCase": true,
|
||||
"ignoreDeclarationSort": true
|
||||
}
|
||||
],
|
||||
"import/order": [
|
||||
"warn",
|
||||
{
|
||||
"newlines-between": "always",
|
||||
"groups": ["external", "builtin", "internal", "sibling", "parent", "index"]
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
|
1
.github/CODEOWNERS
vendored
Normal file
@ -0,0 +1 @@
|
||||
* @bobthebuidlr @linkielink
|
8
.github/dependabot.yml
vendored
@ -5,8 +5,8 @@
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "npm" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
- package-ecosystem: 'npm' # See documentation for possible values
|
||||
directory: '/' # Location of package manifests
|
||||
schedule:
|
||||
interval: "weekly"
|
||||
target-branch: "develop"
|
||||
interval: 'weekly'
|
||||
target-branch: 'develop'
|
||||
|
26
.github/workflows/code-coverage.yaml
vendored
Normal file
@ -0,0 +1,26 @@
|
||||
name: Jest Coverage Diff
|
||||
|
||||
on: pull_request
|
||||
|
||||
jobs:
|
||||
coverage-check:
|
||||
if: github.actor != 'dependabot[bot]'
|
||||
name: Code Coverage Diff Check
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.x'
|
||||
cache: yarn
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
- name: Test Coverage
|
||||
id: testCoverage
|
||||
uses: anuraag016/Jest-Coverage-Diff@V1.4
|
||||
with:
|
||||
fullCoverageDiff: false
|
||||
runCommand: "yarn jest --coverage --collectCoverage=true --coverageDirectory='./' --coverageReporters='json-summary' --forceExit --detectOpenHandles"
|
||||
delta: 0.1
|
19
.github/workflows/test.yaml
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
name: Unit Tests
|
||||
|
||||
on: pull_request
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: '20.x'
|
||||
cache: yarn
|
||||
- name: Install dependencies
|
||||
run: yarn
|
||||
- name: Run tests
|
||||
run: yarn test --coverage false
|
19
.gitignore
vendored
@ -7,6 +7,7 @@
|
||||
|
||||
# testing
|
||||
/coverage
|
||||
coverage-summary.json
|
||||
|
||||
# next.js
|
||||
/.next/
|
||||
@ -18,6 +19,8 @@
|
||||
# misc
|
||||
.DS_Store
|
||||
*.pem
|
||||
charting_library/
|
||||
datafeeds/
|
||||
|
||||
# debug
|
||||
npm-debug.log*
|
||||
@ -25,12 +28,22 @@ yarn-debug.log*
|
||||
yarn-error.log*
|
||||
.pnpm-debug.log*
|
||||
|
||||
# local env files
|
||||
.env*.local
|
||||
|
||||
# vercel
|
||||
.vercel
|
||||
|
||||
# typescript
|
||||
*.tsbuildinfo
|
||||
next-env.d.ts
|
||||
|
||||
# Sentry
|
||||
.sentryclirc
|
||||
|
||||
# Environment variables
|
||||
.env.local
|
||||
.env.local.testnet
|
||||
.env.local.mainnet
|
||||
.env.production
|
||||
.env
|
||||
|
||||
# IDE
|
||||
.idea
|
3
.prettierignore
Normal file
@ -0,0 +1,3 @@
|
||||
src/utils/charting_library
|
||||
src/utils/datafeeds
|
||||
src/types/generated
|
8
.prettierrc
Normal file
@ -0,0 +1,8 @@
|
||||
{
|
||||
"singleQuote": true,
|
||||
"jsxSingleQuote": true,
|
||||
"semi": false,
|
||||
"printWidth": 100,
|
||||
"trailingComma": "all",
|
||||
"endOfLine": "lf"
|
||||
}
|
4
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
{
|
||||
"typescript.tsdk": "node_modules/typescript/lib",
|
||||
"typescript.enablePromptUseWorkspaceTsdk": true
|
||||
}
|
59
Dockerfile
Normal file
@ -0,0 +1,59 @@
|
||||
FROM node:18-alpine AS base
|
||||
|
||||
# Install dependencies only when needed
|
||||
FROM base AS deps
|
||||
# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed.
|
||||
RUN apk add --no-cache libc6-compat
|
||||
WORKDIR /app
|
||||
|
||||
# Install dependencies based on the preferred package manager
|
||||
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
|
||||
RUN \
|
||||
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
|
||||
elif [ -f package-lock.json ]; then npm ci; \
|
||||
elif [ -f pnpm-lock.yaml ]; then yarn global add pnpm && pnpm i --frozen-lockfile; \
|
||||
else echo "Lockfile not found." && exit 1; \
|
||||
fi
|
||||
|
||||
|
||||
# Rebuild the source code only when needed
|
||||
FROM base AS builder
|
||||
WORKDIR /app
|
||||
COPY --from=deps /app/node_modules ./node_modules
|
||||
COPY . .
|
||||
|
||||
# Next.js collects completely anonymous telemetry data about general usage.
|
||||
# Learn more here: https://nextjs.org/telemetry
|
||||
# Uncomment the following line in case you want to disable telemetry during the build.
|
||||
# ENV NEXT_TELEMETRY_DISABLED 1
|
||||
|
||||
RUN yarn build
|
||||
|
||||
# If using npm comment out above and use below instead
|
||||
# RUN npm run build
|
||||
|
||||
# Production image, copy all the files and run next
|
||||
FROM base AS runner
|
||||
WORKDIR /app
|
||||
|
||||
ENV NODE_ENV production
|
||||
# Uncomment the following line in case you want to disable telemetry during runtime.
|
||||
# ENV NEXT_TELEMETRY_DISABLED 1
|
||||
|
||||
RUN addgroup --system --gid 1001 nodejs
|
||||
RUN adduser --system --uid 1001 nextjs
|
||||
|
||||
COPY --from=builder /app/public ./public
|
||||
|
||||
# Automatically leverage output traces to reduce image size
|
||||
# https://nextjs.org/docs/advanced-features/output-file-tracing
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./
|
||||
COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
|
||||
|
||||
USER nextjs
|
||||
|
||||
EXPOSE 3000
|
||||
|
||||
ENV PORT 3000
|
||||
|
||||
CMD ["node", "server.js"]
|
38
README.md
@ -2,33 +2,31 @@ This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next
|
||||
|
||||
## Getting Started
|
||||
|
||||
First, run the development server:
|
||||
First, install the dependencies:
|
||||
|
||||
```
|
||||
yarn install
|
||||
```
|
||||
|
||||
Then, run the development server:
|
||||
|
||||
```bash
|
||||
npm run dev
|
||||
# or
|
||||
yarn dev
|
||||
```
|
||||
|
||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
||||
|
||||
You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
|
||||
## Trading charts
|
||||
|
||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
|
||||
The trade charts are sourced with the TradingView [charting_library](https://www.tradingview.com/charting-library-docs/). In order to enable the charts, request has to be requested from TradingView. This allows the charting_library package to be pulled-in during the application build process. For this, it is recommended to do the following:
|
||||
|
||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
||||
1. Request access to the TradingView repository
|
||||
2. Create a private fork
|
||||
3. Generate a Personal Access Token from Github
|
||||
4. Add the following to the environment variables:
|
||||
a. CHARTING_LIBRARY_USERNAME -> the username of the account with access
|
||||
b. CHARTING_LIBRARY_ACCESS_TOKEN -> the access token
|
||||
c. CHARTING_LIBRARY_REPOSITORY -> the URI of the Github repository
|
||||
5. Build the application by executing the `install_charting_library.sh` script prior.
|
||||
|
||||
## Learn More
|
||||
|
||||
To learn more about Next.js, take a look at the following resources:
|
||||
|
||||
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
|
||||
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
|
||||
|
||||
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
|
||||
|
||||
## Deploy on Vercel
|
||||
|
||||
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
|
||||
|
||||
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
|
||||
For development on localhost, run `yarn install-charting-library`. Ensure that you have a `.env.local` file defined with the variables mentioned above.
|
||||
|
6
__mocks__/fileMock.js
Normal file
@ -0,0 +1,6 @@
|
||||
module.exports = {
|
||||
src: '/img.jpg',
|
||||
height: 24,
|
||||
width: 24,
|
||||
blurDataURL: 'data:image/png;base64,imagedata',
|
||||
}
|
17
__mocks__/helmet.js
Normal file
@ -0,0 +1,17 @@
|
||||
jest.mock('react-helmet-async', () => {
|
||||
const React = require('react')
|
||||
const plugin = jest.requireActual('react-helmet-async')
|
||||
const mockHelmet = ({ children, ...props }) =>
|
||||
React.createElement(
|
||||
'div',
|
||||
{
|
||||
...props,
|
||||
className: 'mock-helmet',
|
||||
},
|
||||
children,
|
||||
)
|
||||
return {
|
||||
...plugin,
|
||||
Helmet: jest.fn().mockImplementation(mockHelmet),
|
||||
}
|
||||
})
|
23
__mocks__/store.js
Normal file
@ -0,0 +1,23 @@
|
||||
jest.mock('store', () => {
|
||||
let state = {}
|
||||
|
||||
const mockUseStore = (selectorFn) => {
|
||||
return selectorFn(state)
|
||||
}
|
||||
|
||||
mockUseStore.setState = (newState) => {
|
||||
state = {
|
||||
...state,
|
||||
...newState,
|
||||
}
|
||||
}
|
||||
|
||||
mockUseStore.clearState = () => {
|
||||
state = {}
|
||||
}
|
||||
|
||||
return {
|
||||
__esModule: true,
|
||||
default: mockUseStore,
|
||||
}
|
||||
})
|
1
__mocks__/styleMock.js
Normal file
@ -0,0 +1 @@
|
||||
module.exports = {}
|
7
__mocks__/svgMock.js
Normal file
@ -0,0 +1,7 @@
|
||||
/* eslint-disable react/display-name */
|
||||
import React from 'react'
|
||||
|
||||
const SvgrMock = React.forwardRef((props, ref) => <svg ref={ref} {...props} />)
|
||||
|
||||
export const ReactComponent = SvgrMock
|
||||
export default SvgrMock
|
14
__tests__/Footer.test.tsx
Normal file
@ -0,0 +1,14 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import Footer from 'components/Footer'
|
||||
|
||||
import packageJSON from '../package.json'
|
||||
|
||||
describe('<Footer />', () => {
|
||||
it('should render package version correctly', () => {
|
||||
const { getByText, container } = render(<Footer />)
|
||||
const versionText = getByText(`v${packageJSON.version}`)
|
||||
|
||||
expect(versionText).toBeInTheDocument()
|
||||
})
|
||||
})
|
48
__tests__/components/Account/AccountDetails.test.tsx
Normal file
@ -0,0 +1,48 @@
|
||||
import { render, screen } from '@testing-library/react'
|
||||
|
||||
import AccountDetails from 'components/Account/AccountDetails'
|
||||
import useCurrentAccount from 'hooks/useCurrentAccount'
|
||||
import useStore from 'store'
|
||||
|
||||
jest.mock('hooks/useCurrentAccount', () => jest.fn(() => null))
|
||||
jest.mock('hooks/useHealthComputer', () =>
|
||||
jest.fn(() => ({
|
||||
health: 0,
|
||||
})),
|
||||
)
|
||||
// AccountBalancesTable component has wallet provider dependency, so we mock it
|
||||
jest.mock('components/Account/AccountBalancesTable', () => jest.fn(() => null))
|
||||
|
||||
const mockedUseCurrentAccount = useCurrentAccount as jest.Mock
|
||||
const mockedAccount = { id: '1', deposits: [], lends: [], debts: [], vaults: [] }
|
||||
jest.mock('hooks/useAccountId', () => jest.fn(() => '1'))
|
||||
jest.mock('hooks/useAccounts', () => jest.fn(() => [mockedAccount]))
|
||||
|
||||
describe('<AccountDetails />', () => {
|
||||
beforeAll(() => {
|
||||
useStore.setState({
|
||||
address: 'walletAddress',
|
||||
accounts: [mockedAccount],
|
||||
})
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
useStore.clearState()
|
||||
})
|
||||
|
||||
it('renders account details WHEN account is selected', () => {
|
||||
mockedUseCurrentAccount.mockReturnValue(mockedAccount)
|
||||
render(<AccountDetails />)
|
||||
|
||||
const container = screen.queryByTestId('account-details')
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('does not render WHEN account is NOT selected', () => {
|
||||
mockedUseCurrentAccount.mockReturnValue(null)
|
||||
render(<AccountDetails />)
|
||||
|
||||
const container = screen.queryByTestId('account-details')
|
||||
expect(container).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
157
__tests__/components/Button/Button.test.tsx
Normal file
@ -0,0 +1,157 @@
|
||||
import { cleanup, render } from '@testing-library/react'
|
||||
|
||||
import Button from 'components/Button'
|
||||
import {
|
||||
buttonColorClasses,
|
||||
buttonSizeClasses,
|
||||
buttonVariantClasses,
|
||||
focusClasses,
|
||||
} from 'components/Button/constants'
|
||||
import { parseMockComponentProps } from 'utils/testing'
|
||||
|
||||
jest.mock('components/CircularProgress', () => {
|
||||
return {
|
||||
CircularProgress: (props: any) =>
|
||||
require('utils/testing').createMockComponent('circular-progress-component', props),
|
||||
}
|
||||
})
|
||||
|
||||
describe('<Button />', () => {
|
||||
afterAll(() => {
|
||||
jest.unmock('components/CircularProgress')
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<Button />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render `children` when its passed', () => {
|
||||
const children = <span data-testid='test-id'>Hello World!</span>
|
||||
const { getByTestId } = render(<Button>{children}</Button>)
|
||||
|
||||
expect(getByTestId('test-id')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `className` prop correctly', () => {
|
||||
const testClass = 'test-class'
|
||||
const { container } = render(<Button className={testClass} />)
|
||||
|
||||
expect(container.querySelector('button')).toHaveClass(testClass)
|
||||
})
|
||||
|
||||
it('should handle `color` prop correctly', () => {
|
||||
const colors = Object.keys(buttonColorClasses) as [keyof typeof buttonColorClasses]
|
||||
|
||||
colors.forEach((color) => {
|
||||
const { container } = render(<Button color={color} />)
|
||||
|
||||
expect(container.querySelector('button')).toHaveClass(buttonColorClasses[color])
|
||||
})
|
||||
})
|
||||
|
||||
it('should handle `disabled=true` prop correctly', () => {
|
||||
const testFunction = jest.fn()
|
||||
const { container } = render(<Button disabled={true} onClick={testFunction} />)
|
||||
const button = container.querySelector('button')
|
||||
|
||||
button?.click()
|
||||
|
||||
expect(button).toHaveClass('pointer-events-none')
|
||||
expect(testFunction).not.toBeCalled()
|
||||
})
|
||||
|
||||
it('should handle `disabled=false` prop correctly', () => {
|
||||
const testFunction = jest.fn()
|
||||
const { container } = render(<Button disabled={false} onClick={testFunction} />)
|
||||
const button = container.querySelector('button')
|
||||
|
||||
button?.click()
|
||||
|
||||
expect(button).not.toHaveClass('pointer-events-none')
|
||||
expect(testFunction).toBeCalled()
|
||||
})
|
||||
|
||||
it('should show progress indicator when `showProgressIndicator=true`', () => {
|
||||
const { getByTestId } = render(<Button showProgressIndicator={true} />)
|
||||
const circularProgressComponent = getByTestId('circular-progress-component')
|
||||
|
||||
expect(circularProgressComponent).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should set correct values for progress indicator size', () => {
|
||||
const sizeValues = { xs: 8, sm: 10, md: 12, lg: 18 }
|
||||
|
||||
Object.entries(sizeValues).forEach(([size, value]) => {
|
||||
const { getByTestId } = render(
|
||||
<Button showProgressIndicator={true} size={size as keyof typeof buttonSizeClasses} />,
|
||||
)
|
||||
const circularProgressComponent = getByTestId('circular-progress-component')
|
||||
const sizeProp = parseMockComponentProps(circularProgressComponent).size
|
||||
|
||||
expect(sizeProp).toBe(value)
|
||||
cleanup()
|
||||
})
|
||||
})
|
||||
|
||||
it('should handle `size` prop correctly', () => {
|
||||
const sizes = Object.keys(buttonSizeClasses) as [keyof typeof buttonSizeClasses]
|
||||
|
||||
sizes.forEach((size) => {
|
||||
const { container } = render(<Button size={size} />)
|
||||
|
||||
expect(container.querySelector('button')).toHaveClass(buttonSizeClasses[size])
|
||||
})
|
||||
})
|
||||
|
||||
it('should show `text` when its passed', () => {
|
||||
const text = 'Hello!'
|
||||
const { getByText } = render(<Button text={text} />)
|
||||
|
||||
expect(getByText(text)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `variant` prop correctly', () => {
|
||||
const variants = Object.keys(buttonVariantClasses) as [keyof typeof buttonVariantClasses]
|
||||
|
||||
variants.forEach((variant) => {
|
||||
const { container } = render(<Button variant={variant} />)
|
||||
|
||||
expect(container.querySelector('button')).toHaveClass(buttonVariantClasses[variant])
|
||||
})
|
||||
})
|
||||
|
||||
it('should show left icon when `leftIcon` prop is passed', () => {
|
||||
const icon = <span data-testid='left-icon'>this is the left icon</span>
|
||||
const { getByTestId } = render(<Button leftIcon={icon} />)
|
||||
|
||||
expect(getByTestId('left-icon')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should show right icon when `rightIcon` prop is passed', () => {
|
||||
const icon = <span data-testid='right-icon'>this is the right icon</span>
|
||||
const { getByTestId } = render(<Button rightIcon={icon} />)
|
||||
|
||||
expect(getByTestId('right-icon')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `iconClassName` prop correctly', () => {
|
||||
const icon = <span data-testid='icon'>just an icon</span>
|
||||
const { getByTestId } = render(<Button rightIcon={icon} iconClassName='test-icon-class' />)
|
||||
|
||||
expect(getByTestId('icon').parentElement).toHaveClass('test-icon-class')
|
||||
})
|
||||
|
||||
it('should show submenu indicator when `hasSubmenu=true`', () => {
|
||||
const { getByTestId } = render(<Button hasSubmenu={true} />)
|
||||
|
||||
expect(getByTestId('button-submenu-indicator')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should set focus classes when `hasFocus=true`', () => {
|
||||
const { container } = render(<Button hasFocus={true} color='primary' />)
|
||||
const button = container.querySelector('button')
|
||||
|
||||
expect(button).toHaveClass(focusClasses['primary'])
|
||||
})
|
||||
})
|
60
__tests__/components/Card.test.tsx
Normal file
@ -0,0 +1,60 @@
|
||||
import { render, screen } from '@testing-library/react'
|
||||
|
||||
import Card from 'components/Card'
|
||||
|
||||
jest.mock('components/Text', () => {
|
||||
return {
|
||||
__esModule: true,
|
||||
default: (props: any) =>
|
||||
require('utils/testing').createMockComponent('mock-text-component', props),
|
||||
}
|
||||
})
|
||||
|
||||
describe('<Card />', () => {
|
||||
const defaultProps = {
|
||||
children: <></>,
|
||||
}
|
||||
|
||||
afterAll(() => {
|
||||
jest.unmock('components/Text')
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<Card {...defaultProps} />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `className` prop correctly', () => {
|
||||
const testClass = 'test-class'
|
||||
const { container } = render(<Card {...defaultProps} className={testClass} />)
|
||||
expect(container.querySelector('section')).toHaveClass(testClass)
|
||||
})
|
||||
|
||||
it('should handle `contentClassName` prop correctly', () => {
|
||||
const testClass = 'test-class'
|
||||
const { container } = render(<Card {...defaultProps} contentClassName={testClass} />)
|
||||
|
||||
expect(container.querySelector('div')).toHaveClass(testClass)
|
||||
})
|
||||
|
||||
it('should handle `title` prop as string correctly', () => {
|
||||
const testTitle = 'this-is-the-test-title'
|
||||
const { queryByText } = render(<Card {...defaultProps} title={testTitle} />)
|
||||
|
||||
expect(queryByText(testTitle)).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `title` prop as element correctly', () => {
|
||||
const testTitle = <p data-testid='test-title'>Test title</p>
|
||||
const { queryByTestId } = render(<Card {...defaultProps} title={testTitle} />)
|
||||
|
||||
expect(queryByTestId('test-title')).toBeInTheDocument()
|
||||
expect(queryByTestId('mock-text-component')).not.toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `id` prop as element correctly', () => {
|
||||
const testId = 'test-id'
|
||||
const { container } = render(<Card {...defaultProps} id={testId} />)
|
||||
expect(container.querySelector(`section#${testId}`)).toBeInTheDocument()
|
||||
})
|
||||
})
|
34
__tests__/components/CircularProgress.test.tsx
Normal file
@ -0,0 +1,34 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import { CircularProgress } from 'components/CircularProgress'
|
||||
import { REDUCE_MOTION_KEY } from 'constants/localStore'
|
||||
|
||||
describe('<CircularProgress />', () => {
|
||||
afterAll(() => {
|
||||
localStorage.removeItem(REDUCE_MOTION_KEY)
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<CircularProgress />)
|
||||
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render `...` when animations disabled', () => {
|
||||
localStorage.setItem(REDUCE_MOTION_KEY, 'true')
|
||||
|
||||
const { getByText } = render(<CircularProgress />)
|
||||
const threeDots = getByText('...')
|
||||
|
||||
expect(threeDots).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render the component with animation classes when animations enabled', () => {
|
||||
localStorage.setItem(REDUCE_MOTION_KEY, 'false')
|
||||
|
||||
const { container } = render(<CircularProgress />)
|
||||
const progressWithAnimations = container.querySelector('.animate-progress')
|
||||
|
||||
expect(progressWithAnimations).toBeInTheDocument()
|
||||
})
|
||||
})
|
38
__tests__/components/MarketAssetTable/MarketDetails.test.tsx
Normal file
@ -0,0 +1,38 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import MarketDetails from 'components/MarketAssetTable/MarketDetails'
|
||||
import { ASSETS } from 'constants/assets'
|
||||
import { BN } from 'utils/helpers'
|
||||
|
||||
const data: LendingMarketTableData = {
|
||||
asset: ASSETS[0],
|
||||
marketDepositAmount: BN('890546916'),
|
||||
accountLentValue: BN('0.5498406009348686811'),
|
||||
marketLiquidityAmount: BN('629396551'),
|
||||
marketDepositCap: BN('2500000000000'),
|
||||
marketLiquidityRate: 0.017,
|
||||
marketLiquidationThreshold: 0.61,
|
||||
marketMaxLtv: 0.59,
|
||||
borrowEnabled: true,
|
||||
}
|
||||
|
||||
jest.mock('hooks/useDisplayCurrencyPrice', () => () => {
|
||||
const { BN } = require('utils/helpers')
|
||||
|
||||
return {
|
||||
getConversionRate: () => BN(1),
|
||||
convertAmount: () => BN(1),
|
||||
symbol: 'MARS',
|
||||
}
|
||||
})
|
||||
|
||||
describe('<LendingDetails />', () => {
|
||||
afterAll(() => {
|
||||
jest.unmock('hooks/usePrices')
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<MarketDetails type='lend' data={data} />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
})
|
64
__tests__/components/Modals/Unlock/UnlockModal.test.tsx
Normal file
@ -0,0 +1,64 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import Modal from 'components/Modal'
|
||||
import UnlockModal from 'components/Modals/Unlock'
|
||||
import { BN_ONE, BN_ZERO } from 'constants/math'
|
||||
import { TESTNET_VAULTS_META_DATA } from 'constants/vaults'
|
||||
import useStore from 'store'
|
||||
import { BN } from 'utils/helpers'
|
||||
|
||||
jest.mock('components/Modal')
|
||||
const mockedModal = jest.mocked(Modal).mockImplementation(() => <div>Mock</div>)
|
||||
|
||||
const mockedDepositedVault: DepositedVault = {
|
||||
...TESTNET_VAULTS_META_DATA[0],
|
||||
status: 'active',
|
||||
apy: 1,
|
||||
ltv: {
|
||||
max: 0.65,
|
||||
liq: 0.7,
|
||||
},
|
||||
amounts: {
|
||||
primary: BN_ONE,
|
||||
secondary: BN_ONE,
|
||||
locked: BN_ONE,
|
||||
unlocked: BN_ONE,
|
||||
unlocking: BN_ONE,
|
||||
},
|
||||
values: {
|
||||
primary: BN_ZERO,
|
||||
secondary: BN_ZERO,
|
||||
unlocked: BN_ZERO,
|
||||
unlocking: BN_ZERO,
|
||||
},
|
||||
cap: {
|
||||
denom: 'mock',
|
||||
max: BN(10),
|
||||
used: BN_ONE,
|
||||
},
|
||||
}
|
||||
|
||||
describe('<UnlockModal />', () => {
|
||||
afterAll(() => {
|
||||
useStore.clearState()
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<UnlockModal />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
describe('should set content correctly', () => {
|
||||
it('should have no content when no modal is present in store', () => {
|
||||
useStore.setState({ unlockModal: null })
|
||||
render(<UnlockModal />)
|
||||
expect(mockedModal).toHaveBeenCalledTimes(0)
|
||||
})
|
||||
|
||||
it('should have content when modal is present in store', () => {
|
||||
useStore.setState({ unlockModal: { vault: mockedDepositedVault } })
|
||||
render(<UnlockModal />)
|
||||
expect(mockedModal).toHaveBeenCalledTimes(1)
|
||||
})
|
||||
})
|
||||
})
|
88
__tests__/components/Modals/vault/VaultBorrowings.test.tsx
Normal file
@ -0,0 +1,88 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import DisplayCurrency from 'components/DisplayCurrency'
|
||||
import VaultBorrowings, { VaultBorrowingsProps } from 'components/Modals/Vault/VaultBorrowings'
|
||||
import { ASSETS } from 'constants/assets'
|
||||
import { TESTNET_VAULTS_META_DATA } from 'constants/vaults'
|
||||
import useStore from 'store'
|
||||
import { BNCoin } from 'types/classes/BNCoin'
|
||||
import { BN } from 'utils/helpers'
|
||||
|
||||
jest.mock('hooks/usePrices', () =>
|
||||
jest.fn(() => ({
|
||||
data: [],
|
||||
})),
|
||||
)
|
||||
|
||||
jest.mock('hooks/usePrice', () => jest.fn(() => '1'))
|
||||
|
||||
jest.mock('hooks/useMarketAssets', () =>
|
||||
jest.fn(() => ({
|
||||
data: [],
|
||||
})),
|
||||
)
|
||||
|
||||
jest.mock('hooks/broadcast/useDepositVault', () => jest.fn(() => ({ actions: [] })))
|
||||
|
||||
jest.mock('components/DisplayCurrency')
|
||||
|
||||
jest.mock('hooks/useHealthComputer', () =>
|
||||
jest.fn(() => ({
|
||||
computeMaxBorrowAmount: () => {},
|
||||
})),
|
||||
)
|
||||
|
||||
const mockedDisplayCurrency = jest
|
||||
.mocked(DisplayCurrency)
|
||||
.mockImplementation(() => <div>Display currency</div>)
|
||||
|
||||
const mockedVault: Vault = {
|
||||
...TESTNET_VAULTS_META_DATA[0],
|
||||
apy: 0,
|
||||
ltv: {
|
||||
liq: 0.2,
|
||||
max: 0.1,
|
||||
},
|
||||
cap: {
|
||||
denom: 'test',
|
||||
max: BN(10),
|
||||
used: BN(2),
|
||||
},
|
||||
}
|
||||
describe('<VaultBorrowings />', () => {
|
||||
const defaultProps: VaultBorrowingsProps = {
|
||||
primaryAsset: ASSETS[0],
|
||||
secondaryAsset: ASSETS[1],
|
||||
vault: mockedVault,
|
||||
borrowings: [],
|
||||
deposits: [],
|
||||
onChangeBorrowings: jest.fn(),
|
||||
depositActions: [],
|
||||
depositCapReachedCoins: [],
|
||||
displayCurrency: 'uosmo',
|
||||
}
|
||||
|
||||
beforeAll(() => {
|
||||
useStore.setState({
|
||||
baseCurrency: ASSETS[0],
|
||||
})
|
||||
})
|
||||
|
||||
afterAll(() => {
|
||||
useStore.clearState()
|
||||
mockedDisplayCurrency.mockClear()
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<VaultBorrowings {...defaultProps} />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should render DisplayCurrency correctly', () => {
|
||||
expect(mockedDisplayCurrency).toHaveBeenCalledTimes(1)
|
||||
expect(mockedDisplayCurrency).toHaveBeenCalledWith(
|
||||
{ coin: new BNCoin({ denom: 'usd', amount: '0' }) },
|
||||
expect.anything(),
|
||||
)
|
||||
})
|
||||
})
|
32
__tests__/components/PageMetadata.test.tsx
Normal file
@ -0,0 +1,32 @@
|
||||
import { render } from '@testing-library/react'
|
||||
import * as rrd from 'react-router-dom'
|
||||
|
||||
import PageMetadata from 'components/PageMetadata'
|
||||
import PAGE_METADATA from 'constants/pageMetadata'
|
||||
|
||||
jest.mock('react-router-dom')
|
||||
const mockedUseLocation = rrd.useLocation as jest.Mock
|
||||
|
||||
describe('<PageMetadata />', () => {
|
||||
afterAll(() => {
|
||||
jest.clearAllMocks()
|
||||
})
|
||||
|
||||
Object.keys(PAGE_METADATA).forEach((page) => {
|
||||
it(`should render correct ${page} metadata`, () => {
|
||||
const pageKey = page as keyof typeof PAGE_METADATA
|
||||
const pageMetadata = PAGE_METADATA[pageKey]
|
||||
|
||||
mockedUseLocation.mockReturnValue({ pathname: pageKey })
|
||||
|
||||
const { container } = render(<PageMetadata />)
|
||||
const titleElement = container.querySelector('title')
|
||||
const descriptionElement = container.querySelector('meta[name="description"]')
|
||||
const keywordsElement = container.querySelector('meta[name="keywords"]')
|
||||
|
||||
expect(titleElement).toHaveTextContent(pageMetadata.title)
|
||||
expect(descriptionElement).toHaveAttribute('content', pageMetadata.description)
|
||||
expect(keywordsElement).toHaveAttribute('content', pageMetadata.keywords)
|
||||
})
|
||||
})
|
||||
})
|
87
__tests__/components/TokenInput.test.tsx
Normal file
@ -0,0 +1,87 @@
|
||||
import { fireEvent, render, screen } from '@testing-library/react'
|
||||
import BigNumber from 'bignumber.js'
|
||||
|
||||
import TokenInput from 'components/TokenInput'
|
||||
import { ASSETS } from 'constants/assets'
|
||||
|
||||
jest.mock('components/DisplayCurrency', () => {
|
||||
return {
|
||||
__esModule: true,
|
||||
default: (props: any) =>
|
||||
require('utils/testing').createMockComponent('mock-display-currency-component', props),
|
||||
}
|
||||
})
|
||||
|
||||
describe('<TokenInput />', () => {
|
||||
const asset = ASSETS[0]
|
||||
const defaultProps = {
|
||||
amount: new BigNumber(1),
|
||||
asset,
|
||||
max: new BigNumber(100),
|
||||
onChangeAsset: jest.fn(),
|
||||
onChange: jest.fn(),
|
||||
}
|
||||
|
||||
afterAll(() => {
|
||||
jest.unmock('components/DisplayCurrency')
|
||||
})
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<TokenInput {...defaultProps} />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `className` prop correctly', () => {
|
||||
const testClass = 'test-class'
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} className={testClass} />)
|
||||
expect(getByTestId('token-input-component')).toHaveClass(testClass)
|
||||
})
|
||||
|
||||
it('should handle `disabled` prop correctly', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} disabled={true} />)
|
||||
expect(getByTestId('token-input-component')).toHaveClass('pointer-events-none', 'opacity-50')
|
||||
})
|
||||
|
||||
it('should handle `maxText` prop correctly', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} maxText='Max' />)
|
||||
expect(getByTestId('token-input-max-button')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `warning` prop correctly', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} warning='Warning' />)
|
||||
expect(getByTestId('token-input-wrapper')).toHaveClass('border-warning')
|
||||
})
|
||||
|
||||
describe('should render the max button', () => {
|
||||
it('when `maxText` prop is defined', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} maxText='Max' />)
|
||||
expect(getByTestId('token-input-max-button')).toBeInTheDocument()
|
||||
})
|
||||
it('not when `maxText` prop is undefined', () => {
|
||||
const { queryByTestId } = render(<TokenInput {...defaultProps} />)
|
||||
expect(queryByTestId('token-input-max-button')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
describe('should render <Select />', () => {
|
||||
it('when `hasSelect` prop is true and balances is defined', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} balances={[]} hasSelect />)
|
||||
expect(getByTestId('select-component')).toBeInTheDocument()
|
||||
})
|
||||
it('not when `hasSelect` prop is true and balances is not defined', () => {
|
||||
const { queryByTestId } = render(<TokenInput {...defaultProps} hasSelect />)
|
||||
expect(queryByTestId('select-component')).not.toBeInTheDocument()
|
||||
})
|
||||
it('not when `hasSelect` prop is false and balances is defined', () => {
|
||||
const { queryByTestId } = render(<TokenInput {...defaultProps} balances={[]} />)
|
||||
expect(queryByTestId('select-component')).not.toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
|
||||
it('should call onMaxBtnClick when the user clicks on max button', () => {
|
||||
const { getByTestId } = render(<TokenInput {...defaultProps} maxText='max' />)
|
||||
const maxBtn = getByTestId('token-input-max-button')
|
||||
fireEvent.click(maxBtn)
|
||||
expect(defaultProps.onChange).toBeCalledWith(defaultProps.max)
|
||||
})
|
||||
})
|
45
__tests__/components/Tooltip/Tooltip.test.tsx
Normal file
@ -0,0 +1,45 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import { Tooltip } from 'components/Tooltip'
|
||||
|
||||
describe('<Tooltip />', () => {
|
||||
const defaultProps = {
|
||||
content: <></>,
|
||||
}
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<Tooltip {...defaultProps} type='info' />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `children` prop correctly', () => {
|
||||
const { getByTestId } = render(
|
||||
<Tooltip {...defaultProps} type='info'>
|
||||
<p data-testid='test-child'>Test text</p>
|
||||
</Tooltip>,
|
||||
)
|
||||
expect(getByTestId('test-child')).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `className` prop correctly', () => {
|
||||
const testClass = 'test-class'
|
||||
const { container } = render(<Tooltip {...defaultProps} type='info' className={testClass} />)
|
||||
expect(container.getElementsByClassName(testClass)).toHaveLength(1)
|
||||
})
|
||||
|
||||
describe('should handle `underline` prop correctly', () => {
|
||||
it('should have border class when children are passed', () => {
|
||||
const { container } = render(
|
||||
<Tooltip {...defaultProps} type='info' underline>
|
||||
<></>
|
||||
</Tooltip>,
|
||||
)
|
||||
expect(container.getElementsByClassName('border-b-1')).toHaveLength(1)
|
||||
})
|
||||
|
||||
it('should not have border class when children are passed', () => {
|
||||
const { container } = render(<Tooltip {...defaultProps} type='info' underline />)
|
||||
expect(container.getElementsByClassName('border-b-1')).toHaveLength(0)
|
||||
})
|
||||
})
|
||||
})
|
44
__tests__/components/Tooltip/TooltipContent.test.tsx
Normal file
@ -0,0 +1,44 @@
|
||||
import { render } from '@testing-library/react'
|
||||
|
||||
import { TooltipType } from 'components/Tooltip'
|
||||
import TooltipContent from 'components/Tooltip/TooltipContent'
|
||||
|
||||
describe('<Tooltip />', () => {
|
||||
const defaultProps = {
|
||||
content: <></>,
|
||||
}
|
||||
|
||||
it('should render', () => {
|
||||
const { container } = render(<TooltipContent {...defaultProps} type='info' />)
|
||||
expect(container).toBeInTheDocument()
|
||||
})
|
||||
|
||||
it('should handle `type` prop correctly', () => {
|
||||
const types = { info: 'bg-white/20', warning: 'bg-warning', error: 'bg-error' }
|
||||
Object.entries(types).forEach(([key, value]) => {
|
||||
const { container } = render(<TooltipContent {...defaultProps} type={key as TooltipType} />)
|
||||
expect(container.getElementsByClassName(value)).toHaveLength(1)
|
||||
})
|
||||
})
|
||||
|
||||
describe('should handle `content` props correctly', () => {
|
||||
it('should render Text component when type is string', () => {
|
||||
const testText = 'testText'
|
||||
const { getByTestId } = render(
|
||||
<TooltipContent {...defaultProps} type='info' content={testText} />,
|
||||
)
|
||||
const textComponent = getByTestId('text-component')
|
||||
expect(textComponent).toHaveTextContent(testText)
|
||||
})
|
||||
|
||||
it('should render content when type is ReactNode', () => {
|
||||
const testNode = <p data-testid='test-node'>Test node</p>
|
||||
const { queryByTestId } = render(
|
||||
<TooltipContent {...defaultProps} type='info' content={testNode} />,
|
||||
)
|
||||
|
||||
expect(queryByTestId('text-component')).not.toBeInTheDocument()
|
||||
expect(queryByTestId('test-node')).toBeInTheDocument()
|
||||
})
|
||||
})
|
||||
})
|
@ -1,9 +0,0 @@
|
||||
.container {
|
||||
background: linear-gradient(
|
||||
132.82deg,
|
||||
rgba(11, 14, 32, 0.64) 5.03%,
|
||||
rgba(52, 20, 33, 0.9) 73.08%
|
||||
);
|
||||
border-radius: 16px;
|
||||
padding: 16px;
|
||||
}
|
@ -1,13 +0,0 @@
|
||||
import React from "react";
|
||||
import styles from "./Container.module.css";
|
||||
|
||||
type Props = {
|
||||
children: React.ReactNode;
|
||||
className?: string;
|
||||
};
|
||||
|
||||
const Container = ({ children, className = "" }: Props) => {
|
||||
return <div className={`${styles.container} ${className}`}>{children}</div>;
|
||||
};
|
||||
|
||||
export default Container;
|
@ -1,25 +0,0 @@
|
||||
.background {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
width: 100%;
|
||||
min-height: 100vh;
|
||||
background-repeat: no-repeat;
|
||||
|
||||
background-color: #562a3b;
|
||||
background-size: 100% auto;
|
||||
background-image: url("/background.svg");
|
||||
background-position: center top;
|
||||
|
||||
filter: brightness(1) hue-rotate(0deg);
|
||||
transition: 3s filter linear, 3s -webkit-filter linear;
|
||||
}
|
||||
|
||||
.night {
|
||||
filter: brightness(0.3) hue-rotate(-82deg);
|
||||
}
|
||||
|
||||
.container {
|
||||
padding: 2rem;
|
||||
flex: 1;
|
||||
}
|
@ -1,15 +0,0 @@
|
||||
import Navigation from "components/Navigation";
|
||||
import React from "react";
|
||||
|
||||
import styles from "./Layout.module.css";
|
||||
|
||||
const Layout = ({ children }: { children: React.ReactNode }) => {
|
||||
return (
|
||||
<div className={styles.background}>
|
||||
<Navigation />
|
||||
<div className={styles.container}>{children}</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Layout;
|
@ -1,23 +0,0 @@
|
||||
import React from "react";
|
||||
import Link from "next/link";
|
||||
|
||||
const Navigation = () => {
|
||||
return (
|
||||
<div className="flex items-center px-6 py-2">
|
||||
<Link href="/" passHref>
|
||||
<a>
|
||||
<img src="/logo.svg" alt="mars" />
|
||||
</a>
|
||||
</Link>
|
||||
<div className="flex px-12 gap-5">
|
||||
<Link href="/trade">Trade</Link>
|
||||
<Link href="/yield">Yield</Link>
|
||||
<Link href="/borrow">Borrow</Link>
|
||||
<Link href="/portfolio">Portfolio</Link>
|
||||
<Link href="/council">Council</Link>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Navigation;
|
19
generate_types.sh
Executable file
@ -0,0 +1,19 @@
|
||||
# generates smart contracts type definitions and copies respective files to types directory
|
||||
# Usage: ./generate-types.sh
|
||||
|
||||
R='\033[0;31m' #'0;31' is Red's ANSI color code
|
||||
G='\033[0;32m' #'0;32' is Green's ANSI color code
|
||||
|
||||
dir=$(pwd)
|
||||
echo $dir
|
||||
|
||||
if [ -d "../rover" ]; then
|
||||
echo "Fetching latest changes from rover repo"
|
||||
cd ../rover && git fetch && git checkout master && git pull
|
||||
cd $dir
|
||||
echo "Generating types for rover..."
|
||||
cp -r ../rover/scripts/types/generated ./types
|
||||
echo "${G}Success"
|
||||
else
|
||||
echo "${R}Directory rover not found..."
|
||||
fi
|
10
install_charting_library.js
Normal file
@ -0,0 +1,10 @@
|
||||
require('dotenv').config()
|
||||
const shell = require('shelljs')
|
||||
const path = require('path')
|
||||
|
||||
shell.exec(
|
||||
`CHARTING_LIBRARY_USERNAME=${process.env.CHARTING_LIBRARY_USERNAME} ` +
|
||||
`CHARTING_LIBRARY_ACCESS_TOKEN=${process.env.CHARTING_LIBRARY_ACCESS_TOKEN} ` +
|
||||
`CHARTING_LIBRARY_REPOSITORY=${process.env.CHARTING_LIBRARY_REPOSITORY} sh ` +
|
||||
path.join(__dirname, 'install_charting_library.sh'),
|
||||
)
|
27
install_charting_library.sh
Normal file
@ -0,0 +1,27 @@
|
||||
#!/bin/sh
|
||||
|
||||
remove_if_directory_exists() {
|
||||
if [ -d "$1" ]; then rm -Rf "$1"; fi
|
||||
}
|
||||
|
||||
BRANCH="master"
|
||||
|
||||
REPOSITORY="https://$CHARTING_LIBRARY_USERNAME:$CHARTING_LIBRARY_ACCESS_TOKEN@$CHARTING_LIBRARY_REPOSITORY"
|
||||
|
||||
LATEST_HASH=$(git ls-remote $REPOSITORY $BRANCH | grep -Eo '^[[:alnum:]]+')
|
||||
|
||||
remove_if_directory_exists "$LATEST_HASH"
|
||||
|
||||
git clone -q --depth 1 -b "$BRANCH" $REPOSITORY "$LATEST_HASH"
|
||||
|
||||
remove_if_directory_exists "public/static/charting_library"
|
||||
remove_if_directory_exists "public/static/datafeeds"
|
||||
remove_if_directory_exists "src/utils/charting_library"
|
||||
remove_if_directory_exists "src/utils/datafeeds"
|
||||
|
||||
cp -r "$LATEST_HASH/charting_library" public/
|
||||
cp -r "$LATEST_HASH/charting_library" src/utils/
|
||||
cp -r "$LATEST_HASH/datafeeds" public/
|
||||
cp -r "$LATEST_HASH/datafeeds" src/utils/
|
||||
|
||||
remove_if_directory_exists "$LATEST_HASH"
|
60
jest.config.js
Normal file
@ -0,0 +1,60 @@
|
||||
module.exports = {
|
||||
collectCoverage: true,
|
||||
coverageProvider: 'v8',
|
||||
collectCoverageFrom: [
|
||||
'**/*.{js,jsx,ts,tsx}',
|
||||
'!**/*.d.ts',
|
||||
'!**/node_modules/**',
|
||||
'!<rootDir>/out/**',
|
||||
'!<rootDir>/.next/**',
|
||||
'!<rootDir>/*.config.js',
|
||||
'!<rootDir>/coverage/**',
|
||||
'!<rootDir>/src/types/**',
|
||||
'!<rootDir>/src/utils/charting_library/**',
|
||||
'!<rootDir>/src/utils/datafeeds/**',
|
||||
'!<rootDir>/public/charting_library/**',
|
||||
'!<rootDir>/public/datafeeds/**',
|
||||
'!<rootDir>/src/utils/health_computer/**',
|
||||
],
|
||||
moduleNameMapper: {
|
||||
// Handle CSS imports (with CSS modules)
|
||||
// https://jestjs.io/docs/webpack#mocking-css-modules
|
||||
'^.+\\.module\\.(css|sass|scss)$': 'identity-obj-proxy',
|
||||
|
||||
// Handle CSS imports (without CSS modules)
|
||||
'^.+\\.(css|sass|scss)$': '<rootDir>/__mocks__/styleMock.js',
|
||||
|
||||
// Handle image imports
|
||||
// https://jestjs.io/docs/webpack#handling-static-assets
|
||||
'^.+\\.(png|jpg|jpeg|gif|webp|avif|ico|bmp)$/i': `<rootDir>/__mocks__/fileMock.js`,
|
||||
'^.+\\.svg$': `<rootDir>/__mocks__/svgMock.js`,
|
||||
|
||||
// Handle module aliases
|
||||
'^app/(.*)$': '<rootDir>/src/app/$1',
|
||||
'^api/(.*)$': '<rootDir>/src/api/$1',
|
||||
'^components/(.*)$': '<rootDir>/src/components/$1',
|
||||
'^constants/(.*)$': '<rootDir>/src/constants/$1',
|
||||
'^fonts/(.*)$': '<rootDir>/src/fonts/$1',
|
||||
'^hooks/(.*)$': '<rootDir>/src/hooks/$1',
|
||||
'^pages/(.*)$': '<rootDir>/src/pages/$1',
|
||||
'^store/(.*)$': '<rootDir>/src/store/$1',
|
||||
'^styles/(.*)$': '<rootDir>/src/styles/$1',
|
||||
'^types/(.*)$': '<rootDir>/src/types/$1',
|
||||
'^utils/(.*)$': '<rootDir>/src/utils/$1',
|
||||
'^store': '<rootDir>/src/store',
|
||||
},
|
||||
// Add more setup options before each test is run
|
||||
setupFilesAfterEnv: [
|
||||
'<rootDir>/jest.setup.js',
|
||||
'<rootDir>/__mocks__/store.js',
|
||||
'<rootDir>/__mocks__/helmet.js',
|
||||
],
|
||||
testPathIgnorePatterns: ['<rootDir>/node_modules/', '<rootDir>/.next/'],
|
||||
testEnvironment: 'jsdom',
|
||||
transform: {
|
||||
// Use babel-jest to transpile tests with the next/babel preset
|
||||
// https://jestjs.io/docs/configuration#transform-objectstring-pathtotransformer--pathtotransformer-object
|
||||
'^.+\\.(js|jsx|ts|tsx)$': ['babel-jest', { presets: ['next/babel'] }],
|
||||
},
|
||||
transformIgnorePatterns: ['/node_modules/', '^.+\\.module\\.(css|sass|scss)$'],
|
||||
}
|
1
jest.setup.js
Normal file
@ -0,0 +1 @@
|
||||
import '@testing-library/jest-dom/extend-expect'
|
@ -1,7 +1,62 @@
|
||||
/** @type {import('next').NextConfig} */
|
||||
|
||||
const nextConfig = {
|
||||
productionBrowserSourceMaps: true,
|
||||
reactStrictMode: true,
|
||||
swcMinify: true,
|
||||
images: {
|
||||
domains: [
|
||||
'assets.leapwallet.io',
|
||||
'raw.githubusercontent.com',
|
||||
'xdefi-static.s3.eu-west-1.amazonaws.com',
|
||||
],
|
||||
},
|
||||
async redirects() {
|
||||
return [
|
||||
{
|
||||
source: '/((?!_next|mobile).*)',
|
||||
has: [
|
||||
{
|
||||
type: 'header',
|
||||
key: 'User-Agent',
|
||||
value: '.*(Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop).*',
|
||||
},
|
||||
],
|
||||
permanent: true,
|
||||
destination: '/mobile',
|
||||
},
|
||||
]
|
||||
},
|
||||
async rewrites() {
|
||||
return [
|
||||
{
|
||||
source: '/:any*',
|
||||
destination: '/',
|
||||
},
|
||||
]
|
||||
},
|
||||
webpack(config) {
|
||||
config.module.rules.push({
|
||||
test: /\.svg$/i,
|
||||
issuer: /\.[jt]sx?$/,
|
||||
use: ['@svgr/webpack'],
|
||||
})
|
||||
|
||||
return config
|
||||
},
|
||||
}
|
||||
|
||||
const sentryWebpackPluginOptions = {
|
||||
// Additional config options for the Sentry Webpack plugin. Keep in mind that
|
||||
// the following options are set automatically, and overriding them is not
|
||||
// recommended:
|
||||
// release, url, org, project, authToken, configFile, stripPrefix,
|
||||
// urlPrefix, include, ignore
|
||||
|
||||
silent: true, // Suppresses all logs
|
||||
// For all available options, see:
|
||||
// https://github.com/getsentry/sentry-webpack-plugin#options.
|
||||
}
|
||||
|
||||
// Make sure adding Sentry options is the last code to run before exporting, to
|
||||
// ensure that your source maps include changes from all other Webpack plugins
|
||||
module.exports = nextConfig
|
||||
|
78
package.json
@ -1,27 +1,75 @@
|
||||
{
|
||||
"name": "mars-v2-frontend",
|
||||
"version": "0.1.0",
|
||||
"version": "2.0.0",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "yarn validate-env && next build",
|
||||
"dev": "next dev",
|
||||
"build": "next build",
|
||||
"test": "jest",
|
||||
"test:cov": "jest --coverage",
|
||||
"lint": "eslint ./src/ && yarn prettier-check",
|
||||
"format": "eslint ./src/ ./__tests__/ --fix && prettier --write ./src/ ./__tests__/",
|
||||
"prettier-check": "prettier --ignore-path .gitignore --check ./src/",
|
||||
"start": "next start",
|
||||
"lint": "next lint"
|
||||
"validate-env": "node ./validate-env",
|
||||
"install-charting-library": "dotenv -e .env.local node install_charting_library.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"next": "12.2.5",
|
||||
"react": "18.2.0",
|
||||
"react-dom": "18.2.0"
|
||||
"@cosmjs/cosmwasm-stargate": "^0.31.1",
|
||||
"@delphi-labs/shuttle-react": "^3.9.0",
|
||||
"@keplr-wallet/cosmos": "^0.12.28",
|
||||
"@sentry/nextjs": "^7.73.0",
|
||||
"@splinetool/react-spline": "^2.2.6",
|
||||
"@splinetool/runtime": "^0.9.473",
|
||||
"@tanstack/react-table": "^8.10.3",
|
||||
"@tippyjs/react": "^4.2.6",
|
||||
"bignumber.js": "^9.1.2",
|
||||
"classnames": "^2.3.2",
|
||||
"debounce-promise": "^3.1.2",
|
||||
"lodash.debounce": "^4.0.8",
|
||||
"lodash.throttle": "^4.1.1",
|
||||
"moment": "^2.29.4",
|
||||
"next": "13.5.3",
|
||||
"react": "^18.2.0",
|
||||
"react-device-detect": "^2.2.3",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-draggable": "^4.4.6",
|
||||
"react-helmet-async": "^1.3.0",
|
||||
"react-qr-code": "^2.0.12",
|
||||
"react-router-dom": "^6.16.0",
|
||||
"react-spring": "^9.7.3",
|
||||
"react-toastify": "^9.1.3",
|
||||
"react-use-clipboard": "^1.0.9",
|
||||
"recharts": "^2.8.0",
|
||||
"swr": "^2.2.4",
|
||||
"tailwind-scrollbar-hide": "^1.1.7",
|
||||
"zustand": "^4.4.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "18.7.14",
|
||||
"@types/react": "18.0.18",
|
||||
"@types/react-dom": "18.0.6",
|
||||
"autoprefixer": "^10.4.8",
|
||||
"eslint": "8.23.0",
|
||||
"eslint-config-next": "12.2.5",
|
||||
"postcss": "^8.4.16",
|
||||
"tailwindcss": "^3.1.8",
|
||||
"typescript": "4.8.2"
|
||||
"@svgr/webpack": "^8.1.0",
|
||||
"@testing-library/jest-dom": "^5.17.0",
|
||||
"@testing-library/react": "^14.0.0",
|
||||
"@types/debounce-promise": "^3.1.7",
|
||||
"@types/lodash.debounce": "^4.0.7",
|
||||
"@types/lodash.throttle": "^4.1.7",
|
||||
"@types/node": "^20.7.0",
|
||||
"@types/react": "18.2.23",
|
||||
"@types/react-dom": "18.2.11",
|
||||
"@types/react-helmet": "^6.1.7",
|
||||
"autoprefixer": "^10.4.16",
|
||||
"babel-jest": "^29.7.0",
|
||||
"dotenv": "^16.3.1",
|
||||
"dotenv-cli": "^7.3.0",
|
||||
"eslint": "8.51.0",
|
||||
"eslint-config-next": "^13.5.3",
|
||||
"eslint-plugin-import": "^2.28.1",
|
||||
"identity-obj-proxy": "^3.0.0",
|
||||
"jest": "^29.7.0",
|
||||
"jest-environment-jsdom": "^29.7.0",
|
||||
"prettier": "^3.0.3",
|
||||
"prettier-plugin-tailwindcss": "^0.5.5",
|
||||
"shelljs": "^0.8.5",
|
||||
"tailwindcss": "^3.3.3",
|
||||
"typescript": "5.2.2"
|
||||
}
|
||||
}
|
||||
|
@ -1,22 +0,0 @@
|
||||
import type { AppProps } from "next/app";
|
||||
import Head from "next/head";
|
||||
|
||||
import "../styles/globals.css";
|
||||
import Layout from "components/Layout";
|
||||
|
||||
function MyApp({ Component, pageProps }: AppProps) {
|
||||
return (
|
||||
<>
|
||||
<Head>
|
||||
<title>Mars V2</title>
|
||||
{/* <meta name="description" content="Generated by create next app" /> */}
|
||||
<link rel="icon" href="/favicon.ico" />
|
||||
</Head>
|
||||
<Layout>
|
||||
<Component {...pageProps} />
|
||||
</Layout>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default MyApp;
|
@ -1,13 +0,0 @@
|
||||
import React from "react";
|
||||
import Container from "components/Container";
|
||||
|
||||
const Borrow = () => {
|
||||
return (
|
||||
<div className="flex gap-4">
|
||||
<Container className="flex-1">Borrow Module</Container>
|
||||
<Container className="w-[450px]">Placeholder</Container>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Borrow;
|
@ -1,12 +0,0 @@
|
||||
import React from "react";
|
||||
import Container from "components/Container";
|
||||
|
||||
const Council = () => {
|
||||
return (
|
||||
<div>
|
||||
<Container>Council Placeholder</Container>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Council;
|
@ -1,65 +0,0 @@
|
||||
import type { NextPage } from "next";
|
||||
import Head from "next/head";
|
||||
import Image from "next/image";
|
||||
import styles from "../styles/Home.module.css";
|
||||
|
||||
import Container from "components/Container";
|
||||
|
||||
const Home: NextPage = () => {
|
||||
return (
|
||||
<div className={styles.container}>
|
||||
<main className={styles.main}>
|
||||
<h1 className={styles.title}>
|
||||
Welcome to <a href="https://nextjs.org">Next.js!</a>
|
||||
</h1>
|
||||
|
||||
<div className={styles.grid}>
|
||||
<Container className={styles.card}>
|
||||
<a href="https://nextjs.org/docs">
|
||||
<h2>Documentation →</h2>
|
||||
<p>Find in-depth information about Next.js features and API.</p>
|
||||
</a>
|
||||
</Container>
|
||||
|
||||
<Container className={styles.card}>
|
||||
<a href="https://nextjs.org/learn">
|
||||
<h2>Learn →</h2>
|
||||
<p>Learn about Next.js in an interactive course with quizzes!</p>
|
||||
</a>
|
||||
</Container>
|
||||
|
||||
<Container className={styles.card}>
|
||||
<a href="https://github.com/vercel/next.js/tree/canary/examples">
|
||||
<h2>Examples →</h2>
|
||||
<p>Discover and deploy boilerplate example Next.js projects.</p>
|
||||
</a>
|
||||
</Container>
|
||||
|
||||
<Container className={styles.card}>
|
||||
<a href="https://vercel.com/new?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app">
|
||||
<h2>Deploy →</h2>
|
||||
<p>
|
||||
Instantly deploy your Next.js site to a public URL with Vercel.
|
||||
</p>
|
||||
</a>
|
||||
</Container>
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer className={styles.footer}>
|
||||
<a
|
||||
href="https://vercel.com?utm_source=create-next-app&utm_medium=default-template&utm_campaign=create-next-app"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
>
|
||||
Powered by{" "}
|
||||
<span className={styles.logo}>
|
||||
<Image src="/vercel.svg" alt="Vercel Logo" width={72} height={16} />
|
||||
</span>
|
||||
</a>
|
||||
</footer>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Home;
|
@ -1,18 +0,0 @@
|
||||
import React from "react";
|
||||
import Container from "components/Container";
|
||||
|
||||
const Portfolio = () => {
|
||||
return (
|
||||
<div className="flex flex-col gap-4">
|
||||
<Container className="flex-1">Portfolio Module</Container>
|
||||
<div className="grid grid-cols-2 gap-4">
|
||||
<Container>Subaccount 1</Container>
|
||||
<Container>Subaccount 2</Container>
|
||||
<Container>Subaccount 3</Container>
|
||||
<Container>Subaccount 4</Container>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Portfolio;
|
@ -1,20 +0,0 @@
|
||||
import React from "react";
|
||||
import Container from "components/Container";
|
||||
|
||||
const Trade = () => {
|
||||
return (
|
||||
<div>
|
||||
<div className="flex gap-4 mb-4">
|
||||
<Container className="flex-1">Graph/Tradingview Module</Container>
|
||||
<div className="flex flex-col gap-4">
|
||||
<Container>Buy/Sell module</Container>
|
||||
<Container>Orderbook module (optional)</Container>
|
||||
</div>
|
||||
<Container>Credit Account essential module</Container>
|
||||
</div>
|
||||
<Container>Trader order overview</Container>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Trade;
|
@ -1,13 +0,0 @@
|
||||
import React from "react";
|
||||
import Container from "components/Container";
|
||||
|
||||
const Yield = () => {
|
||||
return (
|
||||
<div className="flex gap-4">
|
||||
<Container className="flex-1">Yield Module</Container>
|
||||
<Container className="w-[450px]">Placeholder</Container>
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Yield;
|
BIN
public/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 41 KiB |
BIN
public/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 114 KiB |
BIN
public/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 27 KiB |
@ -1,88 +0,0 @@
|
||||
<svg width="1440" height="4655" viewBox="0 0 1440 4655" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<g clip-path="url(#clip0)">
|
||||
<rect width="1440" height="4655" fill="white"/>
|
||||
<rect x="-95" width="1630" height="4655" fill="white"/>
|
||||
<rect x="-95" width="1630" height="4655" fill="url(#paint0_linear)" fill-opacity="0.9"/>
|
||||
<g style="mix-blend-mode:hard-light" opacity="0.2" filter="url(#filter0_f)">
|
||||
<path d="M-95 81H-41.5427C-21.4963 98.2997 20.9354 132.416 30.2904 130.485C39.6454 128.554 57.9471 143.762 65.9286 151.607C85.2326 168.303 124.843 201.454 128.852 200.488C130.084 200.192 133.976 200.223 139.641 200.269C157.018 200.41 191.081 200.687 216.277 192.04C249.688 180.574 266.95 185.402 278.087 192.04C289.224 198.678 349.92 229.455 360.5 227.041C364.049 226.232 374.49 226.916 387.221 227.75C412.442 229.403 446.649 231.644 454.05 224.024C465.187 212.558 658.97 204.713 677.346 214.368C692.047 222.093 711.462 222.214 720 222.214C728.538 222.214 747.953 222.093 762.654 214.368C781.03 204.713 974.812 212.558 985.949 224.024C993.351 231.644 1027.56 229.403 1052.78 227.75C1065.51 226.916 1075.95 226.232 1079.5 227.041C1090.08 229.455 1150.78 198.678 1161.91 192.04C1173.05 185.402 1190.31 180.574 1223.72 192.04C1248.92 200.687 1282.98 200.41 1300.36 200.269C1306.02 200.223 1309.92 200.192 1311.15 200.488C1315.16 201.454 1354.77 168.303 1374.07 151.607C1382.05 143.762 1400.35 128.554 1409.71 130.485C1419.06 132.416 1461.5 98.2997 1481.54 81H1535V5699H-95V81Z" fill="url(#paint1_linear)"/>
|
||||
</g>
|
||||
<g style="mix-blend-mode:hard-light" opacity="0.2" filter="url(#filter1_b)">
|
||||
<path d="M-94.4432 513.757L-95 340.635C-79.1818 340.214 -58.0175 340.376 -39.8412 340.516C-31.7833 340.577 -24.3126 340.635 -18.1552 340.635C0.777557 340.635 41.9842 351.569 77.0655 371.007C80.0141 371.713 82.7676 372.389 85.3812 373.03C103.005 377.355 114.269 380.119 136.091 380.119L288.11 383.156C290.709 382.751 297.02 380.604 301.475 375.259C305.929 369.913 317.066 360.882 322.078 357.035C325.605 354.808 335.665 350.353 347.693 350.353C357.225 350.353 369.218 351.086 377.998 351.622C383.067 351.932 387.065 352.176 388.899 352.176C393.911 352.176 406.162 349.138 410.616 344.279C414.18 340.391 449.967 297.303 467.415 276.245C473.54 269.36 489.8 256.928 505.837 262.274C525.884 268.955 581.011 268.955 589.921 262.274C598.831 255.592 619.434 244.051 639.48 247.696C641.661 248.092 644.286 248.57 647.239 249.108C671.427 253.515 717.519 261.913 720 261.913C722.481 261.913 768.573 253.515 792.761 249.108C795.714 248.57 798.339 248.092 800.52 247.696C820.566 244.051 841.169 255.592 850.079 262.274C858.989 268.955 914.116 268.955 934.163 262.274C950.2 256.928 966.46 269.36 972.585 276.245C990.033 297.303 1025.82 340.391 1029.38 344.279C1033.84 349.138 1046.09 352.176 1051.1 352.176C1052.93 352.176 1056.93 351.932 1062 351.622C1070.78 351.086 1082.78 350.353 1092.31 350.353C1104.34 350.353 1114.4 354.808 1117.92 357.035C1122.93 360.882 1134.07 369.913 1138.53 375.259C1142.98 380.604 1149.29 382.751 1151.89 383.156L1303.91 380.119C1325.73 380.119 1336.99 377.355 1354.62 373.03C1357.23 372.389 1359.99 371.713 1362.93 371.007C1398.02 351.569 1439.22 340.635 1458.16 340.635C1464.31 340.635 1471.78 340.577 1479.84 340.516C1498.02 340.376 1519.18 340.214 1535 340.635L1534.44 513.757L1535 5735H-95L-94.4432 513.757Z" fill="url(#paint2_linear)"/>
|
||||
</g>
|
||||
<g style="mix-blend-mode:hard-light" opacity="0.2" filter="url(#filter2_b)">
|
||||
<path d="M-94.4432 564.916L-95 459.824C-83.4012 458.344 -70.3203 456.725 -56.3558 454.996C23.3155 445.133 131.749 431.709 157.808 420.338C174.83 417.587 251.452 426.321 319.591 434.089C371.82 440.042 419.065 445.428 430.663 444.637C438.9 444.075 458.907 436.012 485.925 425.125C546.58 400.681 642.565 362 720 362C797.435 362 893.42 400.681 954.075 425.125C981.093 436.012 1001.1 444.075 1009.34 444.637C1020.94 445.428 1068.18 440.042 1120.41 434.089C1188.55 426.321 1265.17 417.587 1282.19 420.338C1308.25 431.709 1416.68 445.133 1496.36 454.996C1510.32 456.725 1523.4 458.344 1535 459.824L1534.44 564.916L1535 5694H-95L-94.4432 564.916Z" fill="url(#paint3_linear)"/>
|
||||
</g>
|
||||
<g style="mix-blend-mode:hard-light" opacity="0.2" filter="url(#filter3_f)">
|
||||
<path d="M-95 474.713C-74.9535 467.22 -31.8536 452.843 -22.0531 455.273C-9.80252 458.311 30.2904 476.535 41.9842 492.33C53.678 508.124 75.3046 507.008 77.0655 505.087C78.736 503.265 93.7709 492.127 101.567 486.862C106.207 484.432 118.384 481.03 129.966 486.862C141.548 492.694 209.409 526.552 241.892 542.751C246.161 545.181 255.034 550.041 256.37 550.041C256.615 550.041 257.181 550.093 257.983 550.167C262.657 550.596 275.317 551.76 278.644 547.611C281.762 543.723 299.247 530.197 307.6 523.919C313.725 519.869 328.537 511.769 338.783 511.769C349.029 511.769 421.382 515.819 456.278 517.844C476.51 517.439 518.088 516.508 522.542 516.022C525.854 515.66 557.031 517.663 583.224 519.345C601.072 520.491 616.606 521.489 619.434 521.489C622.857 521.489 633.093 514.341 646.164 505.215C669.243 489.1 701.158 466.815 720 466.815C738.842 466.815 770.757 489.1 793.836 505.215C806.907 514.341 817.143 521.489 820.566 521.489C823.394 521.489 838.928 520.491 856.776 519.345C882.969 517.663 914.146 515.66 917.458 516.022C921.912 516.508 963.49 517.439 983.722 517.844C1018.62 515.819 1090.97 511.769 1101.22 511.769C1111.46 511.769 1126.27 519.869 1132.4 523.919C1140.75 530.197 1158.24 543.723 1161.36 547.611C1164.68 551.76 1177.34 550.596 1182.02 550.167C1182.82 550.093 1183.39 550.041 1183.63 550.041C1184.97 550.041 1193.84 545.181 1198.11 542.751C1230.59 526.552 1298.45 492.694 1310.03 486.862C1321.62 481.03 1333.79 484.432 1338.43 486.862C1346.23 492.127 1361.26 503.265 1362.93 505.087C1364.7 507.008 1386.32 508.124 1398.02 492.33C1409.71 476.535 1449.8 458.311 1462.05 455.273C1471.85 452.843 1514.95 467.22 1535 474.713V5633H-95V474.713Z" fill="url(#paint4_linear)"/>
|
||||
</g>
|
||||
<g style="mix-blend-mode:hard-light" opacity="0.2" filter="url(#filter4_f)">
|
||||
<path d="M-48.7082 749.921C-44.5423 750.554 -40.9302 751.102 -38.2017 751.102C-34.8768 751.102 -32.6091 748.668 -30.2117 746.094C-27.3895 743.063 -24.3874 739.84 -19.2689 740.168C-11.6958 740.654 56.2766 740.371 89.3161 740.168L101.01 742.597L154.467 778.437L160.592 789.371L195.117 792.408L230.755 805.165C243.748 808.607 270.959 815.248 275.86 814.276C278.968 813.66 288.245 806.784 297.502 799.923C306.484 793.266 315.446 786.624 318.737 785.726C325.419 783.904 346.022 774.185 349.363 771.148C349.667 770.872 350.104 770.455 350.656 769.929C356.186 764.659 373.307 748.342 384.445 751.102C389.517 752.36 394.495 755.18 399.337 757.923C406.189 761.805 412.77 765.533 418.969 764.466C426.043 763.247 448.304 744.104 463.112 731.37C470.451 725.06 475.959 720.323 476.881 720.122C479.109 719.636 515.304 681.043 533.123 661.807C539.062 655.53 556.733 646.986 575.443 655.733C594.153 664.48 621.476 664.844 633.355 664.844L701.29 670.918L720 670.86L738.71 670.918L806.645 664.844C818.524 664.844 845.847 664.48 864.557 655.733C883.267 646.986 900.938 655.53 906.877 661.807C924.696 681.043 960.891 719.636 963.119 720.122C964.041 720.323 969.549 725.06 976.888 731.37C991.696 744.104 1013.96 763.247 1021.03 764.466C1027.23 765.533 1033.81 761.805 1040.66 757.923C1045.51 755.18 1050.48 752.36 1055.56 751.102C1066.69 748.342 1083.81 764.659 1089.34 769.929C1089.9 770.455 1090.33 770.872 1090.64 771.148C1093.98 774.185 1114.58 783.904 1121.26 785.726C1124.55 786.624 1133.52 793.266 1142.5 799.923C1151.75 806.784 1161.03 813.66 1164.14 814.276C1169.04 815.248 1196.25 808.607 1209.24 805.165L1244.88 792.408L1279.41 789.371L1285.53 778.437L1338.99 742.597L1350.68 740.168C1383.72 740.371 1451.7 740.654 1459.27 740.168C1464.39 739.84 1467.39 743.063 1470.21 746.094C1472.61 748.668 1474.88 751.102 1478.2 751.102C1480.93 751.102 1484.54 750.554 1488.71 749.921C1502.07 747.89 1521.13 744.994 1535 756.571V5699H-95V756.571C-81.1327 744.994 -62.0716 747.89 -48.7082 749.921Z" fill="url(#paint5_linear)" fill-opacity="0.55"/>
|
||||
</g>
|
||||
<ellipse opacity="0.2" cx="720.5" cy="532.5" rx="1003.5" ry="1123.5" transform="rotate(-90 720.5 532.5)" fill="url(#paint6_radial)"/>
|
||||
</g>
|
||||
<defs>
|
||||
<filter id="filter0_f" x="-102" y="74" width="1644" height="5632" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="3.5" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<filter id="filter1_b" x="-103" y="239" width="1646" height="5504" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feGaussianBlur in="BackgroundImage" stdDeviation="4"/>
|
||||
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter2_b" x="-98" y="359" width="1636" height="5338" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feGaussianBlur in="BackgroundImage" stdDeviation="1.5"/>
|
||||
<feComposite in2="SourceAlpha" operator="in" result="effect1_backgroundBlur"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="effect1_backgroundBlur" result="shape"/>
|
||||
</filter>
|
||||
<filter id="filter3_f" x="-98.5" y="451.5" width="1637" height="5185" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="1.75" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<filter id="filter4_f" x="-97" y="650" width="1634" height="5051" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
|
||||
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
|
||||
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
|
||||
<feGaussianBlur stdDeviation="1" result="effect1_foregroundBlur"/>
|
||||
</filter>
|
||||
<linearGradient id="paint0_linear" x1="709.247" y1="-90.5139" x2="709.247" y2="4655" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#EB9E49"/>
|
||||
<stop offset="0.078125" stop-color="#CD4E59"/>
|
||||
<stop offset="0.151042" stop-color="#6E3D6E"/>
|
||||
<stop offset="0.437386" stop-color="#582B3F"/>
|
||||
<stop offset="0.750045" stop-color="#46172C"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint1_linear" x1="718.886" y1="234.273" x2="719.05" y2="554.095" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#202020"/>
|
||||
<stop offset="1" stop-color="#807575"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint2_linear" x1="720" y1="331.517" x2="720.166" y2="784.035" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#610409" stop-opacity="0.35"/>
|
||||
<stop offset="0.40625" stop-color="#524C4C"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint3_linear" x1="720.557" y1="362" x2="720.557" y2="816.963" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#5A0013" stop-opacity="0.54"/>
|
||||
<stop offset="1" stop-color="#AEAEAE"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint4_linear" x1="720.556" y1="455" x2="720.556" y2="5633" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#2B0109" stop-opacity="0.37"/>
|
||||
<stop offset="0.25" stop-color="#610D32"/>
|
||||
<stop offset="1" stop-color="#610D32"/>
|
||||
</linearGradient>
|
||||
<linearGradient id="paint5_linear" x1="720" y1="621.113" x2="720" y2="5830.2" gradientUnits="userSpaceOnUse">
|
||||
<stop stop-color="#545454" stop-opacity="0.08"/>
|
||||
<stop offset="0.0001" stop-color="#390013"/>
|
||||
<stop offset="1" stop-color="#582B3F"/>
|
||||
</linearGradient>
|
||||
<radialGradient id="paint6_radial" cx="0" cy="0" r="1" gradientUnits="userSpaceOnUse" gradientTransform="translate(720.5 636.394) rotate(90) scale(1019.61 910.703)">
|
||||
<stop stop-color="#C85658"/>
|
||||
<stop offset="1" stop-color="#FF0707" stop-opacity="0"/>
|
||||
</radialGradient>
|
||||
<clipPath id="clip0">
|
||||
<rect width="1440" height="4655" fill="white"/>
|
||||
</clipPath>
|
||||
</defs>
|
||||
</svg>
|
Before Width: | Height: | Size: 12 KiB |
BIN
public/banner.png
Normal file
After Width: | Height: | Size: 326 KiB |
9
public/browserconfig.xml
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<browserconfig>
|
||||
<msapplication>
|
||||
<tile>
|
||||
<square150x150logo src="/mstile-150x150.png"/>
|
||||
<TileColor>#ffffff</TileColor>
|
||||
</tile>
|
||||
</msapplication>
|
||||
</browserconfig>
|
Before Width: | Height: | Size: 25 KiB |
29
public/favicon.svg
Normal file
@ -0,0 +1,29 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.6 KiB |
BIN
public/images/bg-intro.png
Normal file
After Width: | Height: | Size: 54 KiB |
BIN
public/images/bg-intro.webp
Normal file
After Width: | Height: | Size: 35 KiB |
BIN
public/images/bridges/gravity.png
Normal file
After Width: | Height: | Size: 872 B |
BIN
public/images/bridges/satellite.png
Normal file
After Width: | Height: | Size: 649 B |
BIN
public/images/bridges/tfm.png
Normal file
After Width: | Height: | Size: 1.7 KiB |
44
public/images/tokens/atom.svg
Normal file
@ -0,0 +1,44 @@
|
||||
<svg
|
||||
id='Layer_1'
|
||||
data-name='Layer 1'
|
||||
xmlns='http://www.w3.org/2000/svg'
|
||||
viewBox='0 0 2500 2500'
|
||||
>
|
||||
<title>cosmos-atom-logo</title>
|
||||
<circle cx='1250' cy='1250' r='1250' style='fill:#2e3148' />
|
||||
<circle cx='1250' cy='1250' r='725.31' style='fill:#1b1e36' />
|
||||
<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'
|
||||
style='fill:#6f7390'
|
||||
/>
|
||||
<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'
|
||||
style='fill:#6f7390'
|
||||
/>
|
||||
<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'
|
||||
style='fill:#6f7390'
|
||||
/>
|
||||
<circle cx='1250' cy='1250' r='128.6' style='fill:#b7b9c8' />
|
||||
<ellipse
|
||||
cx='1777.26'
|
||||
cy='756.17'
|
||||
rx='74.59'
|
||||
ry='77.16'
|
||||
style='fill:#b7b9c8'
|
||||
/>
|
||||
<ellipse
|
||||
cx='552.98'
|
||||
cy='1018.52'
|
||||
rx='74.59'
|
||||
ry='77.16'
|
||||
style='fill:#b7b9c8'
|
||||
/>
|
||||
<ellipse
|
||||
cx='1098.25'
|
||||
cy='1965.02'
|
||||
rx='74.59'
|
||||
ry='77.16'
|
||||
style='fill:#b7b9c8'
|
||||
/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
15
public/images/tokens/axl.svg
Normal file
@ -0,0 +1,15 @@
|
||||
<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" />
|
||||
<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"
|
||||
/>
|
||||
<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"
|
||||
/>
|
||||
</svg>
|
After Width: | Height: | Size: 668 B |
11
public/images/tokens/axlusdc.svg
Normal file
@ -0,0 +1,11 @@
|
||||
<svg viewBox="0 0 24 24" fill="none" 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"/>
|
||||
<path d="M15.2997 13.8998C15.2997 12.1497 14.2494 11.5497 12.1501 11.2996C10.6501 11.0994 10.3501 10.6996 10.3501 9.99977C10.3501 9.29998 10.8503 8.84967 11.8501 8.84967C12.7501 8.84967 13.2503 9.14967 13.4997 9.89998C13.5496 10.0503 13.7 10.1501 13.8496 10.1501H14.6498C14.8501 10.1501 14.9997 9.99977 14.9997 9.80019V9.7503C14.7995 8.65009 13.8995 7.80061 12.7501 7.70019V6.50019C12.7501 6.29998 12.5997 6.1503 12.3503 6.1004H11.6C11.3997 6.1004 11.2501 6.25009 11.2002 6.50019V7.6503C9.70016 7.85051 8.75027 8.8503 8.75027 10.1002C8.75027 11.7499 9.75006 12.4004 11.8501 12.6499C13.2503 12.9 13.7 13.2 13.7 13.9996C13.7 14.7991 13.0002 15.3492 12.0503 15.3492C10.7505 15.3492 10.3002 14.7991 10.1505 14.0495C10.1006 13.8492 9.95027 13.7495 9.80059 13.7495H8.95048C8.75027 13.7495 8.60059 13.8998 8.60059 14.0993V14.1492C8.8008 15.3991 9.60037 16.2991 11.2507 16.5492V17.7492C11.2507 17.9495 11.401 18.0991 11.6505 18.149H12.4008C12.601 18.149 12.7507 17.9987 12.8006 17.7492V16.5492C14.3006 16.2991 15.3004 15.2495 15.3004 13.8991L15.2997 13.8998Z" fill="white"/>
|
||||
<path d="M9.45047 19.1501C5.55047 17.7499 3.55026 13.4002 5.00036 9.55014C5.75068 7.45014 7.40036 5.85035 9.45047 5.10003C9.65068 5.00024 9.75047 4.84993 9.75047 4.59982V3.90003C9.75047 3.69982 9.65068 3.55014 9.45047 3.50024C9.40057 3.50024 9.30015 3.50024 9.25026 3.55014C4.50015 5.05014 1.89994 10.1002 3.39994 14.8503C4.29994 17.6501 6.44984 19.8 9.24963 20.7C9.44984 20.7998 9.64941 20.7 9.69994 20.4998C9.74984 20.4499 9.74984 20.4 9.74984 20.2996V19.5998C9.74984 19.4495 9.60015 19.2499 9.44984 19.1501H9.45047ZM14.75 3.55014C14.5498 3.45035 14.3503 3.55014 14.2997 3.75035C14.2498 3.80024 14.2498 3.85014 14.2498 3.95056V4.65035C14.2498 4.85056 14.4002 5.05014 14.5498 5.15056C18.4498 6.55077 20.45 10.9005 18.9999 14.7506C18.2496 16.8506 16.5999 18.4503 14.5498 19.2007C14.3496 19.3005 14.2498 19.4508 14.2498 19.7009V20.4007C14.2498 20.6009 14.3496 20.7506 14.5498 20.8005C14.5997 20.8005 14.7002 20.8005 14.75 20.7506C19.5002 19.2506 22.0997 14.2005 20.5997 9.45035C19.6997 6.60067 17.4999 4.45014 14.75 3.55014V3.55014Z" fill="white"/>
|
||||
<path 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"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.6 KiB |
23
public/images/tokens/axlwbtc.svg
Normal file
@ -0,0 +1,23 @@
|
||||
<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"/>
|
||||
<path id="Shape" 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 id="Shape-2" 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 id="Shape-3" 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 id="Shape-4" 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 id="Shape-5" 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"/>
|
||||
<path id="Shape-6" 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"/>
|
||||
<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"
|
||||
/>
|
||||
<path 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="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"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
18
public/images/tokens/axlweth.svg
Normal file
@ -0,0 +1,18 @@
|
||||
<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"/>
|
||||
<polygon fill="#343434" points="11.9,1.2 11.8,1.7 11.8,15.9 11.9,16.1 18.5,12.2"/>
|
||||
<polygon fill="#8C8C8C" points="11.9,1.2 5.3,12.2 11.9,16.1 11.9,9.2"/>
|
||||
<polygon fill="#3C3C3B" points="11.9,17.3 11.8,17.4 11.8,22.5 11.9,22.7 18.5,13.4"/>
|
||||
<polygon fill="#8C8C8C" points="11.9,22.7 11.9,17.3 5.3,13.4"/>
|
||||
<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"/>
|
||||
<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"/>
|
||||
<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"
|
||||
/>
|
||||
<path 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="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"/>
|
||||
</svg>
|
After Width: | Height: | Size: 1.4 KiB |
29
public/images/tokens/mars.svg
Normal file
@ -0,0 +1,29 @@
|
||||
<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>
|
After Width: | Height: | Size: 8.6 KiB |
25
public/images/tokens/nusdc.svg
Normal file
@ -0,0 +1,25 @@
|
||||
<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" d="M76.5,69.5c0-8.8-5.3-11.8-15.7-13c-7.5-1-9-3-9-6.5c0-3.5,2.5-5.8,7.5-5.8c4.5,0,7,1.5,8.2,5.3
|
||||
c0.2,0.8,1,1.3,1.7,1.3h4c1,0,1.7-0.8,1.7-1.7v-0.2c-1-5.5-5.5-9.7-11.2-10.3v-6c0-1-0.8-1.7-2-2H58c-1,0-1.7,0.7-2,2v5.8
|
||||
c-7.5,1-12.2,6-12.2,12.2c0,8.2,5,11.5,15.5,12.7c7,1.3,9.2,2.8,9.2,6.7c0,4-3.5,6.7-8.2,6.7c-6.5,0-8.8-2.8-9.5-6.5
|
||||
c-0.2-1-1-1.5-1.7-1.5h-4.3c-1,0-1.7,0.8-1.7,1.7v0.2c1,6.2,5,10.7,13.3,12v6c0,1,0.8,1.7,2,2H62c1,0,1.7-0.8,2-2v-6
|
||||
C71.5,81.5,76.5,76.2,76.5,69.5L76.5,69.5z"/>
|
||||
<path fill="#FFFFFF" d="M47.3,95.8c-19.5-7-29.5-28.7-22.3-48c3.8-10.5,12-18.5,22.3-22.3c1-0.5,1.5-1.3,1.5-2.5v-3.5
|
||||
c0-1-0.5-1.7-1.5-2c-0.2,0-0.8,0-1,0.2C22.5,25.3,9.5,50.5,17,74.3c4.5,14,15.2,24.7,29.2,29.2c1,0.5,2,0,2.3-1
|
||||
c0.2-0.2,0.2-0.5,0.2-1V98C48.7,97.2,48,96.2,47.3,95.8L47.3,95.8z M73.8,17.8c-1-0.5-2,0-2.3,1c-0.2,0.2-0.2,0.5-0.2,1v3.5
|
||||
c0,1,0.8,2,1.5,2.5c19.5,7,29.5,28.7,22.3,48C91.2,84.3,83,92.3,72.7,96c-1,0.5-1.5,1.3-1.5,2.5v3.5c0,1,0.5,1.7,1.5,2
|
||||
c0.2,0,0.8,0,1-0.2C97.5,96.3,110.5,71,103,47.3C98.5,33,87.5,22.3,73.8,17.8L73.8,17.8z"/>
|
||||
<path d="M100,120c11,0,20-9,20-20s-9-20-20-20s-20,9-20,20S89,120,100,120z"/>
|
||||
<path fill="#FFFFFF" d="M109.3,87c-2,0-3.5,1.6-3.5,3.6c0,0.5,0,1.1,0,1.6c-0.3-0.2-0.5-0.5-0.6-0.7
|
||||
c-2.3-3.5-6.5-5.2-10.5-4.2c-4.3,1.1-7.4,4.5-7.6,8.8c-0.2,4.5-0.1,9.1,0,13.6c0,1.9,1.8,3.4,3.7,3.3c1.9-0.1,3.4-1.6,3.5-3.5
|
||||
c0-0.6,0-1.1,0-1.7c0,0,0.1,0,0.1,0c0.2,0.3,0.3,0.5,0.5,0.8c2.3,3.6,6.8,5.2,10.9,4.1c4.1-1.1,7.1-4.9,7.2-9c0.1-4.3,0-8.7,0-13
|
||||
C113,88.6,111.3,87,109.3,87z M93.4,95.9c-0.1,0.4-0.1,0.9-0.1,1.3c0,4,0,7.9,0,11.9c0,1.6-1,2.8-2.5,2.8c-1.6,0.1-2.7-1-2.7-2.7
|
||||
c0-2.1,0-4.2,0-6.3c0,0,0,0,0.1,0c0-2.3-0.1-4.7,0-7c0.2-4,3.9-7.5,7.9-7.9c5.4-0.5,9.9,3.7,9.8,9.2c-0.1,2,0,3.9,0,5.9
|
||||
c0,1.3-1,2.4-2.3,2.6c-1.2,0.2-2.4-0.6-2.8-1.8c-0.1-0.3-0.1-0.6-0.1-1c0-2,0-4.1,0-6.1c0-1.8-1.4-3.3-3-3.5
|
||||
C95.6,93.1,93.9,94.1,93.4,95.9z M111.9,104c-0.1,4-3.5,7.4-7.5,7.9c-4.7,0.6-8.9-2.3-9.9-6.9c-0.2-1.1-0.2-2.2-0.2-3.3
|
||||
c0-1.6,0-3.1,0-4.7c0-1.6,1.1-2.8,2.6-2.8c1.5,0,2.6,1.2,2.6,2.8c0,2,0,4,0,6.1c0,1.7,1,3,2.7,3.5c1.5,0.4,3.2-0.2,4-1.6
|
||||
c0.3-0.6,0.5-1.3,0.5-1.9c0.1-2,0-4,0-6c0-2.1,0-4.2,0-6.3c0-1.1,0.5-2,1.5-2.5c1-0.4,1.9-0.3,2.7,0.3c0.7,0.5,1,1.3,1,2.1
|
||||
C112,95.1,112.1,99.5,111.9,104z"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
340
public/images/tokens/osmo.svg
Normal file
@ -0,0 +1,340 @@
|
||||
<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'
|
||||
></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)'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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)'
|
||||
></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)'
|
||||
></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)'
|
||||
></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)'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
></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)'
|
||||
></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'
|
||||
></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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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'
|
||||
>
|
||||
<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>
|
After Width: | Height: | Size: 18 KiB |
38
public/images/tokens/statom.svg
Normal file
@ -0,0 +1,38 @@
|
||||
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 2500 2500" style="enable-background:new 0 0 2500 2500;" xml:space="preserve">
|
||||
<circle style="fill:#E50571;" cx="1250" cy="1250" r="1250"/>
|
||||
<circle style="fill:#FFFFFF;" cx="1250" cy="1250" r="128.6"/>
|
||||
<path style="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"/>
|
||||
</svg>
|
After Width: | Height: | Size: 3.9 KiB |
BIN
public/images/wallets/cosmostation-wc.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
public/images/wallets/cosmostation.png
Normal file
After Width: | Height: | Size: 5.1 KiB |
BIN
public/images/wallets/keplr-wc.png
Normal file
After Width: | Height: | Size: 7.7 KiB |
BIN
public/images/wallets/keplr.png
Normal file
After Width: | Height: | Size: 8.0 KiB |
BIN
public/images/wallets/leap-snap.png
Normal file
After Width: | Height: | Size: 4.9 KiB |
BIN
public/images/wallets/leap-wc.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
public/images/wallets/leap.png
Normal file
After Width: | Height: | Size: 4.5 KiB |
BIN
public/images/wallets/station.png
Normal file
After Width: | Height: | Size: 5.4 KiB |
BIN
public/images/wallets/xdefi.png
Normal file
After Width: | Height: | Size: 7.9 KiB |
@ -1,39 +1,24 @@
|
||||
<svg width="58" height="58" viewBox="0 0 58 58" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M51.3649 12.7475L45.2491 6.63174L37.5416 2.70662L28.9983 1.35181L20.455 2.70662L12.7475 6.63174L6.63174 12.7475L2.70662 20.455L1.35181 28.9983L2.70662 37.5416L6.63174 45.2491L12.7475 51.3649L20.455 55.2935L28.9983 56.6483L37.5416 55.2935L45.2491 51.3649L51.3649 45.2491L55.2935 37.5416L56.6483 28.9983L55.2935 20.455L51.3649 12.7475Z" stroke="white" stroke-width="1.05" stroke-miterlimit="10"/>
|
||||
<path d="M45.2491 6.63171L28.9983 28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M12.7476 6.63171L28.9983 28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M2.70654 37.5416L28.9982 28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9983 56.6448V28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M55.2935 37.5416L28.9983 28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9981 36.7127L36.3329 31.384L33.5327 22.7606H24.4635L21.6633 31.384L28.9981 36.7127Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M20.4548 2.70667L28.9982 14.7049L37.5415 2.70667" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9983 4.51768V1.35181L21.7471 4.51768H28.9983ZM28.9983 4.51768L24.5403 8.4428H33.4563L28.9983 4.51768Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9983 1.35181L36.253 4.51768H28.9983" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M24.4636 22.7606L28.9982 14.7048L33.5328 22.7606" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9983 14.7049L19.2709 15.6069L24.5403 8.44282L15.3806 10.2574L21.7471 4.5177L12.7476 6.63176" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9983 14.7049L38.7292 15.6069L33.4563 8.44282L42.6161 10.2574L36.253 4.5177L45.2491 6.63176" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M1.35181 28.9983L15.4049 24.5821L6.63174 12.7476" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M2.70312 20.455L5.71227 21.4337L8.07012 26.8877L10.825 18.4071L5.71227 21.4337L3.47282 28.3296L2.70312 20.455Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M2.70312 20.4549L7.95519 14.5342L5.71227 21.4336" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M21.6634 31.384L15.4048 24.5821L24.4636 22.7606" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M15.4049 24.582L13.256 34.1145L8.07013 26.8877L6.96608 36.1589L3.47282 28.3295L2.70312 37.5416" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M15.4013 24.5821L19.2672 15.6069L10.8249 18.4071L15.3804 10.2538L7.95508 14.5342L12.7474 6.63171" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M20.4514 55.2936L20.5942 40.5613L6.62817 45.2491" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M12.7476 51.3648L14.6039 48.8049L20.5212 48.2477L13.3083 43.0095L14.6039 48.8049L20.4759 53.0679L12.7476 51.3648Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M12.7475 51.3648L8.73535 44.542L14.6039 48.8049" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M28.9982 36.7127L20.5942 40.5612L21.6635 31.384" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M20.5942 40.5613L28.9982 45.5521L20.5211 48.2478L28.9982 52.166L20.4758 53.068L28.9982 56.6449" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M20.5943 40.5647L13.256 34.1145L13.3083 43.0096L6.96259 36.1589L8.73882 44.542L2.70312 37.5416" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M51.3612 45.2526L37.3987 40.5647L37.5415 55.2935" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M45.2455 51.3682L43.3857 48.8084L44.6848 43.0095L37.4719 48.2511L43.3857 48.8084L49.2542 44.5454L45.2455 51.3682Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M45.2454 51.3685L37.5171 53.0715L43.3856 48.8086" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M36.3331 31.384L37.3988 40.5647L28.9983 36.7127" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M37.3987 40.5647L44.7404 34.1145L44.6847 43.0096L51.0304 36.1589L49.2541 44.5455L55.2898 37.5451" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M37.3988 40.5647L28.9983 45.5521L37.472 48.2512L28.9983 52.1694L37.5207 53.0714L28.9983 56.6483" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M51.3647 12.751L42.5916 24.5855L56.6447 29.0017" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M55.2933 20.4585L52.2841 21.4372L47.1714 18.4071L49.9263 26.8877L52.2841 21.4372L50.0412 14.5377L55.2933 20.4585Z" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M55.2933 20.4585L54.5236 28.3331L52.2842 21.4372" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M33.533 22.7606L42.5917 24.5856L36.3331 31.384" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M42.5917 24.5856L38.7292 15.6104L47.1716 18.4071L42.6161 10.2574L50.0414 14.5377L45.2491 6.63525" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<path d="M42.5916 24.582L44.7404 34.1145L49.9263 26.8876L51.0339 36.1589L54.5236 28.333L55.2899 37.545" stroke="white" stroke-width="0.525" stroke-miterlimit="10"/>
|
||||
<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M13.6386 3.90217L12.0968 2.36037L10.1538 1.37085L7.99998 1.0293L5.8462 1.37085L3.90315 2.36037L2.36135 3.90217L1.37182 5.84523L1.03027 7.999L1.37182 10.1528L2.36135 12.0958L3.90315 13.6376L5.8462 14.628L7.99998 14.9696L10.1538 14.628L12.0968 13.6376L13.6386 12.0958L14.629 10.1528L14.9706 7.999L14.629 5.84523L13.6386 3.90217Z" stroke="white" stroke-width="0.8" stroke-miterlimit="10"/>
|
||||
<path d="M9.5738 5.83309L7.99951 3.19202" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.76147 3.54235L7.9996 3.19202L11.2386 3.54235" stroke="white" stroke-width="0.4" stroke-miterlimit="10"/>
|
||||
<path d="M6.4259 5.83167H9.5736" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99931 3.19202L6.4259 5.83309" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M4.76147 3.54158L5.84583 1.37024L7.9996 3.19125L10.1534 1.37024L11.2386 3.54158" stroke="white" stroke-width="0.4" stroke-miterlimit="10"/>
|
||||
<path d="M12.0966 2.35925L7.99978 7.99788L3.90295 2.35925" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3.42786 6.51213L6.42629 5.83167L5.45344 8.82571L7.9997 10.6757L10.826 11.8874" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3.42786 6.51355L5.45344 8.82713" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M2.75948 9.70068L1.02979 7.9982L3.42765 6.51259L2.36086 3.90137L4.76136 3.54138L3.42765 6.51259L2.75948 9.70068ZM2.75948 9.70068L5.17403 11.8878L7.99949 13.5086L10.1533 14.6272L10.8258 11.8878L13.6381 12.095L13.2395 9.70068" stroke="white" stroke-width="0.4" stroke-miterlimit="10"/>
|
||||
<path d="M5.45328 8.82605L5.17407 11.8877" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5.17407 11.8871L7.99953 10.6754" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99923 13.509L5.84545 14.6276L5.17376 11.8882L2.3606 12.0954L2.75922 9.70105" stroke="white" stroke-width="0.4" stroke-miterlimit="10"/>
|
||||
<path d="M1.3717 10.151L7.99986 7.99719V14.9678" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M10.5468 8.82617L10.826 11.8878L13.2397 9.70068L14.9703 7.9982L12.5724 6.51259L13.6383 3.90137L11.2387 3.54138L12.5724 6.51259L9.57397 5.83213L10.5468 8.82617ZM10.5468 8.82617L12.5724 6.51259L13.2397 9.70068" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99951 7.99719L14.6285 10.151" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99951 10.676L10.5466 8.82605" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99951 13.5094L10.8259 11.8885L12.0963 13.6376" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M7.99951 3.191V1.02844" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M12.572 6.51278L14.6283 5.8446" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M5.17432 11.8885L3.90295 13.6376" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
<path d="M3.42802 6.51278L1.3717 5.8446" stroke="white" stroke-width="0.4" stroke-linecap="round" stroke-linejoin="round"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 3.5 KiB |
BIN
public/mstile-144x144.png
Normal file
After Width: | Height: | Size: 29 KiB |
BIN
public/mstile-150x150.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
public/mstile-310x150.png
Normal file
After Width: | Height: | Size: 26 KiB |
BIN
public/mstile-310x310.png
Normal file
After Width: | Height: | Size: 62 KiB |
BIN
public/mstile-70x70.png
Normal file
After Width: | Height: | Size: 17 KiB |
2
public/robots.txt
Normal file
@ -0,0 +1,2 @@
|
||||
User-agent: *
|
||||
Disallow:
|
247
public/safari-pinned-tab.svg
Normal file
@ -0,0 +1,247 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
|
||||
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
|
||||
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
|
||||
width="700.000000pt" height="700.000000pt" viewBox="0 0 700.000000 700.000000"
|
||||
preserveAspectRatio="xMidYMid meet">
|
||||
<metadata>
|
||||
Created by potrace 1.14, written by Peter Selinger 2001-2017
|
||||
</metadata>
|
||||
<g transform="translate(0.000000,700.000000) scale(0.100000,-0.100000)"
|
||||
fill="#000000" stroke="none">
|
||||
<path d="M3405 6875 c-44 -12 -642 -268 -654 -280 -2 -3 158 -5 357 -5 l362 0
|
||||
0 150 c0 83 -3 150 -7 149 -5 0 -30 -6 -58 -14z"/>
|
||||
<path d="M3530 6739 l0 -149 363 0 c209 0 356 4 347 9 -53 31 -642 279 -672
|
||||
284 l-38 6 0 -150z"/>
|
||||
<path d="M3865 6832 c10 -9 519 -232 529 -232 7 0 99 130 95 134 -2 2 -139 25
|
||||
-304 51 -165 25 -307 48 -315 51 -9 3 -11 2 -5 -4z"/>
|
||||
<path d="M2795 6783 c-154 -25 -282 -47 -284 -49 -4 -4 88 -134 95 -134 4 0
|
||||
351 150 499 216 l30 13 -30 0 c-16 -1 -156 -21 -310 -46z"/>
|
||||
<path d="M2148 6573 c-158 -81 -285 -149 -284 -151 5 -4 660 150 668 157 7 6
|
||||
-81 141 -92 141 -3 0 -134 -67 -292 -147z"/>
|
||||
<path d="M4511 6656 c-25 -35 -44 -67 -43 -72 1 -8 649 -165 665 -161 7 2
|
||||
-564 297 -574 297 -2 0 -24 -29 -48 -64z"/>
|
||||
<path d="M2797 6325 c80 -113 148 -205 152 -205 8 0 461 398 461 405 0 3 -171
|
||||
5 -379 5 l-380 0 146 -205z"/>
|
||||
<path d="M3811 6325 c128 -113 236 -205 239 -205 7 0 290 394 290 404 0 3
|
||||
-171 6 -380 6 l-381 0 232 -205z"/>
|
||||
<path d="M3261 6312 l-234 -207 237 -3 c130 -1 342 -1 473 0 l236 3 -233 205
|
||||
c-128 113 -235 206 -239 207 -3 1 -111 -91 -240 -205z"/>
|
||||
<path d="M2246 6208 c-185 -167 -332 -304 -326 -306 11 -4 927 175 952 186 14
|
||||
6 -9 43 -130 214 -81 114 -150 208 -154 208 -4 0 -158 -136 -342 -302z"/>
|
||||
<path d="M4258 6302 c-121 -171 -144 -208 -130 -214 24 -10 943 -189 953 -186
|
||||
9 3 -643 596 -664 603 -7 3 -76 -86 -159 -203z"/>
|
||||
<path d="M2040 6401 c-405 -97 -500 -124 -500 -143 0 -10 247 -355 260 -363 5
|
||||
-3 534 466 679 601 12 11 -67 -6 -439 -95z"/>
|
||||
<path d="M4521 6496 c174 -161 674 -604 679 -601 13 8 260 353 260 363 0 20
|
||||
-92 46 -503 143 -394 93 -446 105 -436 95z"/>
|
||||
<path d="M1448 6182 c-33 -33 -490 -773 -483 -780 4 -4 755 426 773 443 11 10
|
||||
-10 45 -113 186 -70 96 -130 177 -134 181 -4 5 -23 -9 -43 -30z"/>
|
||||
<path d="M5381 6039 c-107 -147 -130 -184 -119 -194 18 -16 769 -447 773 -443
|
||||
7 8 -451 747 -484 781 l-38 39 -132 -183z"/>
|
||||
<path d="M3022 6008 c14 -18 124 -174 247 -345 122 -172 226 -313 231 -313 5
|
||||
0 109 141 231 313 122 171 233 327 247 345 l24 32 -502 0 -502 0 24 -32z"/>
|
||||
<path d="M2350 5924 c-261 -52 -481 -97 -487 -99 -11 -4 355 -524 407 -578 17
|
||||
-18 24 -10 185 210 430 582 416 563 392 562 -12 -1 -236 -44 -497 -95z"/>
|
||||
<path d="M4213 5908 c45 -62 177 -241 291 -396 200 -272 209 -283 226 -265 51
|
||||
54 418 574 407 578 -22 8 -975 195 -991 195 -11 0 12 -38 67 -112z"/>
|
||||
<path d="M2643 5613 c-161 -219 -291 -399 -289 -400 4 -5 1078 96 1083 101 6
|
||||
6 -486 696 -495 696 -4 0 -139 -179 -299 -397z"/>
|
||||
<path d="M3805 5665 c-136 -191 -245 -348 -243 -351 5 -5 1080 -105 1084 -101
|
||||
5 4 -576 791 -586 795 -5 2 -119 -153 -255 -343z"/>
|
||||
<path d="M995 5730 l-229 -229 38 -55 c37 -54 64 -83 70 -75 1 2 76 126 166
|
||||
274 90 149 170 280 178 293 8 12 13 22 11 22 -2 0 -107 -103 -234 -230z"/>
|
||||
<path d="M5782 5940 c8 -14 90 -150 183 -302 l168 -278 48 65 c27 35 49 68 49
|
||||
72 0 5 -104 112 -232 238 -127 127 -225 219 -216 205z"/>
|
||||
<path d="M1546 5334 c-136 -245 -246 -447 -244 -449 5 -5 910 294 921 305 8 7
|
||||
-409 590 -422 590 -3 0 -118 -201 -255 -446z"/>
|
||||
<path d="M4981 5489 c-116 -159 -211 -293 -211 -297 1 -8 922 -313 928 -307 5
|
||||
5 -491 895 -499 895 -4 0 -101 -131 -218 -291z"/>
|
||||
<path d="M1313 5531 c-216 -124 -393 -230 -393 -234 0 -4 68 -100 152 -212
|
||||
130 -176 153 -202 163 -187 28 42 477 853 474 856 -2 1 -181 -99 -396 -223z"/>
|
||||
<path d="M5294 5743 c8 -19 452 -816 471 -845 10 -16 32 9 163 186 84 113 152
|
||||
208 152 213 0 4 -80 54 -178 109 -97 56 -275 159 -396 228 -136 79 -216 120
|
||||
-212 109z"/>
|
||||
<path d="M583 5158 c-78 -155 -141 -283 -140 -284 1 -1 52 55 113 125 61 69
|
||||
148 168 194 218 l82 93 -48 65 c-26 36 -50 65 -53 65 -3 0 -70 -127 -148 -282z"/>
|
||||
<path d="M6216 5375 l-48 -65 139 -157 c76 -86 163 -184 193 -219 30 -34 56
|
||||
-61 57 -60 4 4 -282 566 -288 566 -3 0 -27 -29 -53 -65z"/>
|
||||
<path d="M2868 5200 c-278 -26 -511 -49 -517 -51 -9 -4 567 -808 579 -809 5 0
|
||||
501 879 508 900 5 14 -6 13 -570 -40z"/>
|
||||
<path d="M3562 5240 c10 -29 504 -899 509 -897 9 3 588 801 585 805 -3 3
|
||||
-1047 102 -1079 102 -10 0 -17 -4 -15 -10z"/>
|
||||
<path d="M877 5233 c-4 -8 -166 -501 -213 -651 l-23 -74 22 15 c12 7 128 76
|
||||
257 152 129 76 241 144 249 150 11 11 -11 46 -130 206 -167 228 -155 213 -162
|
||||
202z"/>
|
||||
<path d="M5967 5038 c-84 -112 -145 -204 -140 -209 17 -17 516 -309 521 -305
|
||||
5 5 -217 697 -227 708 -3 3 -73 -84 -154 -194z"/>
|
||||
<path d="M3243 4771 c-139 -248 -253 -452 -253 -455 0 -3 230 -6 510 -6 281 0
|
||||
510 3 510 6 0 9 -505 904 -510 904 -3 0 -119 -202 -257 -449z"/>
|
||||
<path d="M555 4910 c-198 -224 -276 -324 -263 -335 2 -1 65 -23 140 -48 l138
|
||||
-45 111 340 c61 187 109 341 107 343 -2 2 -107 -113 -233 -255z"/>
|
||||
<path d="M6210 5165 c0 -5 50 -161 110 -346 l110 -337 138 45 c75 25 138 47
|
||||
140 48 14 11 -69 117 -263 335 -264 296 -235 265 -235 255z"/>
|
||||
<path d="M1745 4965 c-258 -86 -459 -158 -458 -164 2 -8 477 -655 499 -680 2
|
||||
-2 6 -2 9 1 16 16 431 998 422 997 -7 -1 -219 -70 -472 -154z"/>
|
||||
<path d="M4804 5043 c19 -43 116 -269 216 -503 100 -234 183 -426 184 -427 1
|
||||
-2 118 153 259 344 142 191 254 350 250 354 -8 6 -925 309 -937 309 -3 0 10
|
||||
-35 28 -77z"/>
|
||||
<path d="M2286 5101 c-11 -17 -436 -1005 -433 -1007 3 -3 1017 203 1022 208 3
|
||||
2 -562 788 -580 806 -2 2 -6 -1 -9 -7z"/>
|
||||
<path d="M4413 4707 c-160 -221 -290 -403 -288 -406 4 -3 1019 -210 1022 -207
|
||||
3 2 -428 1000 -435 1008 -4 4 -139 -174 -299 -395z"/>
|
||||
<path d="M896 4595 c-142 -85 -261 -156 -264 -159 -6 -6 239 -576 247 -576 5
|
||||
0 278 830 289 876 2 8 0 14 -5 13 -4 0 -124 -70 -267 -154z"/>
|
||||
<path d="M1083 4283 c-84 -257 -151 -469 -150 -470 4 -4 801 248 809 255 6 7
|
||||
-483 674 -499 679 -5 2 -77 -207 -160 -464z"/>
|
||||
<path d="M5504 4414 c-137 -185 -249 -339 -249 -342 0 -7 806 -264 811 -259 5
|
||||
5 -301 937 -307 937 -3 0 -118 -151 -255 -336z"/>
|
||||
<path d="M5832 4733 c21 -75 284 -873 289 -873 7 0 253 570 247 575 -8 8 -528
|
||||
315 -534 315 -4 0 -4 -8 -2 -17z"/>
|
||||
<path d="M266 4503 c-11 -28 -5 -131 24 -428 17 -165 30 -307 30 -314 0 -9 3
|
||||
-11 9 -5 12 13 224 665 217 671 -2 3 -65 24 -140 48 -111 35 -136 40 -140 28z"/>
|
||||
<path d="M6591 4473 c-73 -23 -136 -44 -138 -47 -6 -5 206 -658 218 -670 6 -6
|
||||
9 -2 9 10 0 10 14 154 30 319 30 305 36 402 22 421 -5 7 -51 -4 -141 -33z"/>
|
||||
<path d="M6282 4074 c-68 -157 -121 -288 -118 -291 7 -8 470 -152 474 -148 4
|
||||
3 -215 689 -227 712 -4 7 -62 -116 -129 -273z"/>
|
||||
<path d="M588 4343 c-11 -18 -230 -705 -226 -708 4 -4 467 141 475 148 5 5
|
||||
-224 544 -238 560 -4 5 -9 5 -11 0z"/>
|
||||
<path d="M3000 4244 c0 -11 492 -684 500 -684 8 0 500 673 500 684 0 3 -225 6
|
||||
-500 6 -275 0 -500 -3 -500 -6z"/>
|
||||
<path d="M2367 4137 c-329 -66 -497 -104 -495 -112 5 -19 693 -763 699 -756 4
|
||||
3 66 191 139 416 184 568 180 555 167 554 -7 -1 -236 -46 -510 -102z"/>
|
||||
<path d="M4124 4199 c54 -176 300 -925 305 -930 7 -7 694 737 699 756 2 8
|
||||
-155 43 -485 109 -268 54 -498 100 -510 103 -22 5 -22 4 -9 -38z"/>
|
||||
<path d="M2830 3869 c-61 -189 -131 -404 -155 -478 -25 -74 -43 -136 -42 -138
|
||||
3 -3 809 256 815 262 4 3 -470 658 -493 684 -11 11 -33 -48 -125 -330z"/>
|
||||
<path d="M3800 3864 c-138 -190 -250 -347 -248 -349 6 -5 812 -265 814 -262 4
|
||||
3 -303 947 -309 953 -3 3 -118 -151 -257 -342z"/>
|
||||
<path d="M166 3874 c-27 -168 -46 -307 -43 -311 7 -6 144 34 150 45 5 8 -48
|
||||
561 -55 567 -2 2 -26 -133 -52 -301z"/>
|
||||
<path d="M6776 4150 c-3 -19 -15 -134 -26 -255 -11 -121 -23 -236 -26 -256
|
||||
l-5 -35 75 -24 c42 -13 79 -21 82 -17 5 5 -79 576 -90 612 -2 6 -6 -6 -10 -25z"/>
|
||||
<path d="M1346 3879 c-225 -71 -410 -130 -412 -131 -1 -2 19 -32 45 -68 27
|
||||
-36 158 -218 292 -404 198 -277 244 -336 250 -320 10 23 240 1046 237 1049 -2
|
||||
2 -187 -55 -412 -126z"/>
|
||||
<path d="M5243 3987 c3 -12 56 -245 117 -517 61 -272 114 -504 118 -514 7 -16
|
||||
61 54 299 385 159 222 289 405 289 406 -1 1 -175 57 -387 123 -211 66 -397
|
||||
125 -413 130 -26 9 -28 8 -23 -13z"/>
|
||||
<path d="M1694 3448 c-66 -293 -117 -534 -113 -536 3 -1 215 65 470 148 255
|
||||
83 468 151 472 153 9 3 -691 767 -702 767 -4 0 -61 -240 -127 -532z"/>
|
||||
<path d="M4844 3623 c-345 -375 -369 -401 -362 -409 8 -7 930 -305 937 -302 9
|
||||
4 -231 1068 -240 1068 -3 0 -154 -161 -335 -357z"/>
|
||||
<path d="M590 3643 c-129 -41 -236 -76 -237 -77 -3 -3 348 -791 365 -822 14
|
||||
-24 12 -32 72 476 27 234 52 442 56 463 4 27 2 37 -8 36 -7 -1 -119 -35 -248
|
||||
-76z"/>
|
||||
<path d="M6154 3684 c3 -22 28 -230 56 -464 27 -234 52 -441 56 -460 5 -31 7
|
||||
-32 17 -15 17 31 367 818 364 820 -2 2 -423 134 -481 152 -16 4 -17 1 -12 -33z"/>
|
||||
<path d="M900 3669 c0 -8 -27 -240 -60 -514 -32 -275 -58 -501 -56 -502 3 -4
|
||||
687 216 695 223 4 3 -539 767 -565 794 -12 12 -14 12 -14 -1z"/>
|
||||
<path d="M5810 3288 c-157 -219 -286 -401 -288 -406 -2 -7 687 -236 694 -229
|
||||
3 2 -110 968 -119 1017 -1 8 -130 -164 -287 -382z"/>
|
||||
<path d="M188 3516 c-37 -12 -70 -25 -73 -28 -5 -5 90 -629 99 -653 3 -5 5 1
|
||||
5 14 1 30 49 604 55 654 5 43 5 43 -86 13z"/>
|
||||
<path d="M6726 3503 c5 -43 54 -627 55 -658 0 -11 2 -15 5 -10 7 18 105 647
|
||||
101 651 -5 5 -148 54 -158 54 -4 0 -5 -17 -3 -37z"/>
|
||||
<path d="M3058 3327 c-219 -72 -398 -134 -398 -138 0 -7 782 -579 802 -587 4
|
||||
-2 8 190 8 427 0 237 -3 431 -7 430 -5 -1 -187 -60 -405 -132z"/>
|
||||
<path d="M3530 3029 c0 -236 2 -429 5 -429 3 0 537 386 764 553 l53 39 -363
|
||||
119 c-200 66 -385 126 -411 133 l-48 15 0 -430z"/>
|
||||
<path d="M326 3428 c-9 -44 -66 -784 -66 -853 0 -38 4 -75 8 -81 5 -7 73 10
|
||||
215 56 114 37 211 70 214 74 5 5 -355 826 -363 826 -2 0 -6 -10 -8 -22z"/>
|
||||
<path d="M6480 3040 c-100 -226 -180 -413 -177 -416 3 -4 100 -37 214 -74 142
|
||||
-46 210 -63 215 -56 4 6 8 45 8 86 -1 88 -64 858 -72 865 -3 3 -88 -179 -188
|
||||
-405z"/>
|
||||
<path d="M2070 3006 c-256 -84 -465 -156 -465 -161 1 -11 814 -729 820 -724 2
|
||||
2 28 222 59 489 31 267 58 500 61 518 3 17 2 32 -2 31 -4 0 -217 -69 -473
|
||||
-153z"/>
|
||||
<path d="M4454 3123 c3 -21 31 -254 61 -517 31 -264 57 -482 60 -484 6 -6 819
|
||||
712 818 723 -1 7 -917 314 -941 315 -2 0 -1 -17 2 -37z"/>
|
||||
<path d="M2545 2630 c-32 -280 -56 -512 -53 -515 5 -6 923 409 940 424 6 6
|
||||
-794 593 -817 599 -7 2 -31 -175 -70 -508z"/>
|
||||
<path d="M3968 2842 c-224 -163 -404 -300 -400 -303 16 -15 934 -430 939 -425
|
||||
10 10 -111 1026 -122 1025 -5 0 -193 -134 -417 -297z"/>
|
||||
<path d="M1152 2707 c-189 -62 -343 -116 -343 -120 0 -4 157 -177 348 -384
|
||||
l348 -376 2 289 c2 159 0 382 -5 496 l-7 206 -343 -111z"/>
|
||||
<path d="M5495 2617 c-3 -111 -5 -334 -3 -495 l3 -294 348 376 c191 206 348
|
||||
379 348 383 1 6 -442 156 -642 217 l-47 14 -7 -201z"/>
|
||||
<path d="M1561 2498 c1 -161 5 -386 8 -499 l6 -206 409 137 409 136 -404 355
|
||||
c-222 195 -410 358 -416 362 -10 7 -13 -53 -12 -285z"/>
|
||||
<path d="M5020 2429 l-412 -362 409 -139 c224 -76 409 -138 409 -138 5 0 16
|
||||
992 11 996 -2 3 -190 -158 -417 -357z"/>
|
||||
<path d="M495 2494 c-110 -37 -202 -68 -204 -70 -13 -12 82 -133 323 -413 152
|
||||
-176 282 -323 288 -327 7 -5 9 1 5 17 -3 13 -45 212 -93 442 -70 329 -92 417
|
||||
-104 417 -8 0 -105 -30 -215 -66z"/>
|
||||
<path d="M6181 2124 c-50 -240 -90 -438 -87 -441 7 -8 575 656 597 699 11 22
|
||||
19 41 17 43 -7 6 -407 135 -420 135 -11 0 -37 -108 -107 -436z"/>
|
||||
<path d="M802 2480 c21 -115 183 -867 189 -874 7 -8 465 138 483 154 4 5 -137
|
||||
165 -314 357 -402 433 -363 394 -358 363z"/>
|
||||
<path d="M5856 2134 c-186 -201 -334 -369 -330 -374 15 -13 475 -162 481 -156
|
||||
7 7 193 877 190 888 -1 4 -154 -158 -341 -358z"/>
|
||||
<path d="M2993 2272 c-260 -119 -473 -219 -473 -222 1 -8 941 -563 946 -558 2
|
||||
3 3 228 2 500 l-3 495 -472 -215z"/>
|
||||
<path d="M3530 1990 c0 -275 3 -500 6 -500 10 0 943 554 944 560 0 4 -803 376
|
||||
-922 427 l-28 12 0 -499z"/>
|
||||
<path d="M451 2105 c6 -15 291 -579 295 -584 6 -6 154 41 160 51 3 4 -95 124
|
||||
-217 265 -245 284 -243 282 -238 268z"/>
|
||||
<path d="M6316 1843 c-125 -146 -224 -268 -220 -273 16 -14 143 -52 154 -45 9
|
||||
6 301 577 297 581 -1 1 -105 -117 -231 -263z"/>
|
||||
<path d="M2008 1877 c-212 -73 -389 -135 -392 -138 -4 -3 172 -135 390 -293
|
||||
217 -158 397 -286 399 -284 2 2 7 194 11 426 6 360 5 422 -7 421 -8 0 -188
|
||||
-59 -401 -132z"/>
|
||||
<path d="M4583 1589 c3 -232 8 -423 11 -426 2 -3 183 125 400 283 218 158 393
|
||||
291 389 294 -9 7 -785 270 -798 270 -5 0 -5 -190 -2 -421z"/>
|
||||
<path d="M2477 1798 c-9 -274 -9 -658 1 -658 14 -1 942 295 942 300 0 4 -622
|
||||
376 -901 539 l-36 21 -6 -202z"/>
|
||||
<path d="M4048 1722 c-258 -152 -468 -279 -468 -282 0 -5 929 -301 943 -300 8
|
||||
0 7 355 -2 657 l-6 203 -467 -278z"/>
|
||||
<path d="M1278 1632 c-126 -42 -229 -81 -230 -87 -1 -10 594 -447 600 -440 2
|
||||
2 -26 136 -62 299 -36 163 -66 298 -66 301 0 8 -6 7 -242 -73z"/>
|
||||
<path d="M5477 1688 c-27 -108 -127 -573 -125 -579 4 -9 600 422 602 435 1 7
|
||||
-247 95 -455 161 -11 4 -19 -2 -22 -17z"/>
|
||||
<path d="M1590 1662 c0 -16 131 -596 136 -601 6 -6 624 52 624 58 0 6 -669
|
||||
494 -731 534 -16 11 -29 14 -29 9z"/>
|
||||
<path d="M5023 1397 c-205 -150 -373 -275 -373 -278 0 -6 618 -65 624 -58 4 4
|
||||
136 588 136 602 0 4 -3 7 -7 6 -5 0 -176 -123 -380 -272z"/>
|
||||
<path d="M873 1497 c-34 -12 -64 -24 -67 -27 -3 -3 96 -107 220 -230 l226
|
||||
-225 -44 75 c-204 348 -254 430 -263 429 -5 0 -38 -10 -72 -22z"/>
|
||||
<path d="M5922 1313 c-67 -115 -134 -228 -148 -253 -20 -33 32 13 199 180 125
|
||||
123 225 225 224 227 -5 4 -137 53 -145 53 -5 0 -63 -93 -130 -207z"/>
|
||||
<path d="M1081 1419 c9 -13 88 -148 177 -299 89 -152 177 -290 195 -308 l34
|
||||
-33 63 88 c35 48 74 102 87 120 l24 31 -287 209 c-158 114 -292 210 -298 212
|
||||
-6 2 -3 -7 5 -20z"/>
|
||||
<path d="M5635 1234 c-154 -112 -283 -208 -287 -212 -4 -4 31 -60 79 -125 l85
|
||||
-119 34 33 c40 39 392 632 373 628 -2 0 -130 -92 -284 -205z"/>
|
||||
<path d="M2998 1242 c-251 -81 -459 -149 -462 -152 -3 -3 194 -97 437 -210
|
||||
243 -112 454 -209 470 -217 l27 -14 0 371 c0 203 -3 370 -7 369 -5 -1 -214
|
||||
-67 -465 -147z"/>
|
||||
<path d="M3530 1021 c0 -351 1 -371 18 -363 9 5 221 103 470 217 248 115 449
|
||||
212 445 216 -5 4 -210 71 -458 149 -247 79 -456 145 -462 147 -10 4 -13 -73
|
||||
-13 -366z"/>
|
||||
<path d="M2065 1031 c-148 -14 -270 -29 -270 -33 0 -5 560 -416 603 -442 9 -6
|
||||
12 47 12 248 l0 256 -37 -1 c-21 -1 -159 -13 -308 -28z"/>
|
||||
<path d="M4590 805 c0 -213 2 -255 14 -248 7 4 147 105 310 223 225 163 292
|
||||
217 279 222 -14 5 -560 58 -595 58 -5 0 -8 -115 -8 -255z"/>
|
||||
<path d="M2467 792 c-4 -140 -5 -258 -2 -261 3 -6 880 82 907 91 10 4 -145 77
|
||||
-738 351 l-161 74 -6 -255z"/>
|
||||
<path d="M4071 836 c-250 -116 -449 -212 -442 -214 24 -8 902 -98 905 -92 1 3
|
||||
0 120 -3 260 l-6 256 -454 -210z"/>
|
||||
<path d="M1622 866 c-45 -62 -82 -118 -82 -123 0 -6 20 -18 43 -27 51 -19 676
|
||||
-158 690 -153 9 3 -553 417 -565 417 -3 0 -41 -51 -86 -114z"/>
|
||||
<path d="M5010 780 c-271 -198 -321 -236 -290 -226 8 3 161 37 339 76 321 71
|
||||
401 93 401 112 0 11 -162 238 -170 238 -3 -1 -129 -91 -280 -200z"/>
|
||||
<path d="M1960 524 c69 -36 196 -101 283 -145 l157 -79 0 85 c0 80 -1 85 -22
|
||||
90 -181 41 -524 115 -532 115 -6 0 45 -30 114 -66z"/>
|
||||
<path d="M4871 529 c-146 -32 -269 -63 -274 -68 -6 -6 -7 -40 -2 -85 l7 -75
|
||||
156 79 c258 130 408 210 392 209 -8 0 -134 -27 -279 -60z"/>
|
||||
<path d="M3205 545 c-115 -13 -306 -33 -422 -46 -117 -12 -213 -25 -213 -28 0
|
||||
-3 62 -32 138 -63 75 -31 261 -108 412 -171 151 -63 292 -117 313 -120 l37 -6
|
||||
0 230 0 229 -27 -1 c-16 -1 -122 -12 -238 -24z"/>
|
||||
<path d="M3530 340 l0 -230 25 5 c14 3 37 8 52 11 24 5 811 331 822 340 2 2 2
|
||||
6 0 8 -3 3 -868 96 -891 96 -5 0 -8 -104 -8 -230z"/>
|
||||
<path d="M2460 359 c0 -49 3 -89 6 -89 3 0 148 -23 321 -50 174 -28 318 -49
|
||||
320 -47 3 4 -98 47 -519 223 l-128 53 0 -90z"/>
|
||||
<path d="M4203 308 c-172 -73 -311 -133 -309 -135 2 -2 146 19 321 47 174 27
|
||||
319 50 321 50 2 0 4 38 4 85 0 62 -3 85 -12 85 -7 -1 -154 -60 -325 -132z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 15 KiB |
19
public/site.webmanifest
Normal file
@ -0,0 +1,19 @@
|
||||
{
|
||||
"name": "Mars V2",
|
||||
"short_name": "MarsV2",
|
||||
"icons": [
|
||||
{
|
||||
"src": "/android-chrome-192x192.png",
|
||||
"sizes": "192x192",
|
||||
"type": "image/png"
|
||||
},
|
||||
{
|
||||
"src": "/android-chrome-512x512.png",
|
||||
"sizes": "512x512",
|
||||
"type": "image/png"
|
||||
}
|
||||
],
|
||||
"theme_color": "#ffffff",
|
||||
"background_color": "#ffffff",
|
||||
"display": "standalone"
|
||||
}
|
310
public/tradingview.css
Normal file
@ -0,0 +1,310 @@
|
||||
:root {
|
||||
--tv-background: #220e1d;
|
||||
--tv-form-background: #7f78e8;
|
||||
--tv-button-background: linear-gradient(180deg, #7f78e8 0%, #926ac8 100%);
|
||||
--tv-button-background-hover: linear-gradient(180deg, #926ac8 0%, #7f78e8 100%);
|
||||
--tv-menu-background: #31142a;
|
||||
--tv-menu-text: rgba(255, 255, 255, 0.3);
|
||||
--tv-menu-text-hover: rgba(255, 255, 255, 1);
|
||||
}
|
||||
|
||||
.theme-dark:root {
|
||||
--tv-color-pane-background: var(--tv-background);
|
||||
--tv-color-platform-background: var(--tv-background);
|
||||
--tv-color-toolbar-button-text: var(--tv-menu-text);
|
||||
--tv-color-toolbar-button-text-hover: var(--tv-menu-text-hover);
|
||||
--tv-color-toolbar-button-text-active: var(--tv-menu-text-hover);
|
||||
--tv-color-toolbar-button-text-active-hover: var(--tv-menu-text-hover);
|
||||
--tv-color-toolbar-button-background-hover: var(--tv-background);
|
||||
--tv-color-toolbar-button-background-expanded: var(--tv-background);
|
||||
--tv-color-toolbar-button-background-active: var(--tv-background);
|
||||
--tv-color-toolbar-button-background-active-hover: var(--tv-background);
|
||||
--tv-color-toolbar-toggle-button-background-active: rgba(255, 255, 255, 0.2);
|
||||
--tv-color-toolbar-toggle-button-background-active-hover: rgba(255, 255, 255, 0.2);
|
||||
--tv-color-toolbar-divider-background: var(--tv-menu-text);
|
||||
--ui-lib-button-default-color-content: #fff;
|
||||
--ui-lib-button-default-color-border: var(--tv-form-background);
|
||||
--ui-lib-button-default-color-bg: var(--tv-button-background);
|
||||
}
|
||||
|
||||
/* Favorited menus */
|
||||
.tv-floating-toolbar__widget-wrapper > div {
|
||||
background: var(--tv-menu-background) !important;
|
||||
}
|
||||
.tv-floating-toolbar__widget:hover,
|
||||
.tv-favorited-drawings-toolbar__widget:hover *,
|
||||
.tv-favorited-drawings-toolbar__widget:hover:before {
|
||||
background: var(--tv-menu-background) !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
border-color: var(--tv-menu-background) !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* Floating menu */
|
||||
.floating-toolbar-react-widgets__button:hover,
|
||||
[class^='button-']:hover:before {
|
||||
background: var(--tv-menu-background) !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
border-color: var(--tv-menu-background) !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.layout__area--left {
|
||||
min-width: 10px !important;
|
||||
}
|
||||
|
||||
div[data-role='button']:hover,
|
||||
/* Indiator dialog list items */
|
||||
div[data-role="dialog-content"] div[data-role="list-item"]:hover,
|
||||
/* Series left sidebar */
|
||||
[class^='active-'] {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
/* General pop-up menus */
|
||||
div[data-name='popup-menu-container'] div:not([class^='swatch-'], [class^='opacitySliderGradient-']),
|
||||
/* Indicator dialog */
|
||||
div[data-name='indicators-dialog'] *,
|
||||
/* Layers dialog */
|
||||
div[data-name="object-tree-dialog"] * ,
|
||||
/* Layers dialog */
|
||||
div[data-name="series-properties-dialog"],
|
||||
/* Checkbox */
|
||||
[class^='close-'],
|
||||
/* Close buton series popup */
|
||||
[class^='close-']:hover {
|
||||
background: var(--tv-menu-background) !important;
|
||||
outline: white !important;
|
||||
}
|
||||
|
||||
/* Element Highlighting */
|
||||
[class^='highlight-'] {
|
||||
border-color: transparent !important;
|
||||
}
|
||||
|
||||
/* Element Highlighting */
|
||||
[class^='wrap-'] [class^='title-'],
|
||||
[class^='label-'] [class^='title-'] {
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
}
|
||||
|
||||
/* Range Slider */
|
||||
[class^='opacitySliderGradient-'] {
|
||||
background: linear-gradient(90deg, transparent, rgb(255, 160, 187)) !important;
|
||||
}
|
||||
|
||||
[class^='opacitySlider-'] {
|
||||
color: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='rangeSliderMiddle-'] {
|
||||
background-color: var(--tv-form-background) !important;
|
||||
}
|
||||
|
||||
/* Devider Lines */
|
||||
[class^='content-'],
|
||||
[class^='container-'],
|
||||
[class^='footer-'] {
|
||||
border-color: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
/* General toolbar popup list items */
|
||||
[class^='item-'],
|
||||
/* Emoji topbar items */
|
||||
/* Emoji items */
|
||||
[class^='wrapper-'],
|
||||
[class^='categories-'],
|
||||
/* Indiator dialog list items */
|
||||
div[data-role="dialog-content"] div[data-role="list-item"] span,
|
||||
/* Layers dialog list item */
|
||||
[class^='wrap-'],
|
||||
/* Series proerties */
|
||||
div[data-name="series-properties-dialog"],
|
||||
/* Series left sidetabs */
|
||||
[class^='tab-'],
|
||||
/* Close buton series popup */
|
||||
[class^='close-'] {
|
||||
color: var(--tv-menu-text) !important;
|
||||
}
|
||||
/* General toolbar popup list items */
|
||||
[class^='item-']:hover,
|
||||
[class^='item-'][class*='interactive-'][class*='hovered-'],
|
||||
/* Sub headers for inteval popup */
|
||||
[class^='section-']:hover,
|
||||
/* Emoji topbar items */
|
||||
[class^='isActive-'],
|
||||
[class^='categories-'],
|
||||
[class^='categories-']:hover,
|
||||
/* Indiator dialog list items */
|
||||
div[data-role="dialog-content"] div[data-role="list-item"]:hover span,
|
||||
/* Layers dialog list item */
|
||||
[class^='wrap-'] [class^='dropdown-']:hover span,
|
||||
[class^='wrap-'] [class^='dropdown-']:hover [class^='arrowIcon-'],
|
||||
[class^='menuItem-']:hover,
|
||||
/* Close buton series popup */
|
||||
[class^='close-']:hover {
|
||||
cursor: pointer !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
[class^='scroll-wrap-']:before {
|
||||
background-color: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='underline-tabs-']:before {
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
/* Series left sidetabs */
|
||||
[class^='tab-'][class*='active-'],
|
||||
[class^='tab-'][class*='active-'] svg,
|
||||
[class^='tab-']:hover,
|
||||
[class^='tab-'][class*='active-']:hover,
|
||||
[class^='tab-'][class*='active-']:hover svg {
|
||||
background-color: transparent !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
/* Top info bar */
|
||||
[class^='legendMainSourceWrapper-'] [class^='item-'],
|
||||
[class^='legendMainSourceWrapper-'] [class^='item-']:hover {
|
||||
color: transparent !important;
|
||||
}
|
||||
|
||||
/* Menu Boxes */
|
||||
[class^='menuBox-'],
|
||||
[class^='dialog'] {
|
||||
background: var(--tv-menu-background) !important;
|
||||
}
|
||||
|
||||
/* Top and bottom scroll indicator for toolbar */
|
||||
[class^='scrollBot-'],
|
||||
[class^='scrollTop-'] {
|
||||
cursor: pointer;
|
||||
background: var(--tv-menu-background) !important;
|
||||
}
|
||||
|
||||
/* Buttons for series popup */
|
||||
button,
|
||||
button:hover {
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
[class^='button-'] {
|
||||
background-color: transparent !important;
|
||||
border-radius: 4px !important;
|
||||
}
|
||||
|
||||
[class^='button-']:hover {
|
||||
cursor: pointer !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
button[class^='button-'][class*='primary-'] {
|
||||
border: none !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
background: var(--tv-button-background) !important;
|
||||
}
|
||||
|
||||
button[class^='button-'][class*='primary-']:hover {
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
background: var(--tv-button-background-hover) !important;
|
||||
}
|
||||
|
||||
button[class^='button-'][class*='secondary-'] {
|
||||
border: 1px solid var(--tv-menu-text) !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
button[class^='button-'][class*='secondary-']:hover {
|
||||
border: 1px solid var(--tv-menu-text-hover) !important;
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
background: none !important;
|
||||
}
|
||||
|
||||
/* Checkbox */
|
||||
[class^='check-'] {
|
||||
border-color: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-'] + [class^='box-'] {
|
||||
border-color: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:hover + [class^='box-'] {
|
||||
border-color: var(--tv-form-background) !important;
|
||||
cursor: pointer !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:checked + [class^='box-'] {
|
||||
border-color: var(--tv-form-background) !important;
|
||||
background-color: var(--tv-form-background) !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:disabled + [class^='box-'] {
|
||||
opacity: 0.5 !important;
|
||||
border-color: var(--tv-menu-text) !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:disabled + [class^='box-'] {
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:checked:disabled + [class^='box-'] {
|
||||
border-color: var(--tv-menu-text) !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:checked:disabled + [class^='box-'] svg {
|
||||
color: var(--tv-menu-text) !important;
|
||||
stroke: var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='checkbox-'] [class^='wrapper-'] [class^='input-']:checked + [class^='box-'] svg {
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
stroke: var(--tv-menu-text-hover) !important;
|
||||
}
|
||||
|
||||
/* Input */
|
||||
[class^='container-'][class*='disabled-'] {
|
||||
background-color: transparent !important;
|
||||
opacity: 0.5 !important;
|
||||
}
|
||||
|
||||
/* Select */
|
||||
[class^='container-'][class*='button-'] {
|
||||
border: 1px solid var(--tv-menu-text) !important;
|
||||
}
|
||||
|
||||
[class^='container-'][class*='button-'][class*='disabled-'] {
|
||||
opacity: 0.5 !important;
|
||||
border: 1px solid var(--tv-menu-text) !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
[class^='button-children-'] span {
|
||||
color: var(--tv-menu-text-hover) !important;
|
||||
}
|
||||
|
||||
/* Scrollbars */
|
||||
[class^='scrollWrap-']::-webkit-scrollbar,
|
||||
[class^='tabContent-']::-webkit-scrollbar {
|
||||
height: 4px;
|
||||
width: 4px;
|
||||
}
|
||||
|
||||
[class^='scrollWrap-']::-webkit-scrollbar-thumb,
|
||||
[class^='tabContent-']::-webkit-scrollbar-thumb {
|
||||
background-color: var(--tv-menu-text) !important;
|
||||
border: transparent !important;
|
||||
border-radius: 2px;
|
||||
}
|
||||
|
||||
[class^='scrollWrap-']::-webkit-scrollbar-track,
|
||||
[class^='tabContent-']::-webkit-scrollbar-track {
|
||||
border-radius: 2px;
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
<svg width="283" height="64" viewBox="0 0 283 64" fill="none"
|
||||
xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M141.04 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.46 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM248.72 16c-11.04 0-19 7.2-19 18s8.96 18 20 18c6.67 0 12.55-2.64 16.19-7.09l-7.65-4.42c-2.02 2.21-5.09 3.5-8.54 3.5-4.79 0-8.86-2.5-10.37-6.5h28.02c.22-1.12.35-2.28.35-3.5 0-10.79-7.96-17.99-19-17.99zm-9.45 14.5c1.25-3.99 4.67-6.5 9.45-6.5 4.79 0 8.21 2.51 9.45 6.5h-18.9zM200.24 34c0 6 3.92 10 10 10 4.12 0 7.21-1.87 8.8-4.92l7.68 4.43c-3.18 5.3-9.14 8.49-16.48 8.49-11.05 0-19-7.2-19-18s7.96-18 19-18c7.34 0 13.29 3.19 16.48 8.49l-7.68 4.43c-1.59-3.05-4.68-4.92-8.8-4.92-6.07 0-10 4-10 10zm82.48-29v46h-9V5h9zM36.95 0L73.9 64H0L36.95 0zm92.38 5l-27.71 48L73.91 5H84.3l17.32 30 17.32-30h10.39zm58.91 12v9.69c-1-.29-2.06-.49-3.2-.49-5.81 0-10 4-10 10V51h-9V17h9v9.2c0-5.08 5.91-9.2 13.2-9.2z" fill="#000"/>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
19
sentry.client.config.js
Normal file
@ -0,0 +1,19 @@
|
||||
// This file configures the initialization of Sentry on the browser.
|
||||
// The config you add here will be used whenever a page is visited.
|
||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||
|
||||
import * as Sentry from '@sentry/nextjs'
|
||||
|
||||
const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN
|
||||
|
||||
Sentry.init({
|
||||
dsn: SENTRY_DSN,
|
||||
environment: process.env.NEXT_PUBLIC_SENTRY_ENV,
|
||||
// Adjust this value in production, or use tracesSampler for greater control
|
||||
tracesSampleRate: 0.5,
|
||||
enabled: process.env.NODE_ENV !== 'development',
|
||||
// ...
|
||||
// Note: if you want to override the automatic release value, do not set a
|
||||
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
|
||||
// that it will also get attached to your source maps
|
||||
})
|
4
sentry.properties
Normal file
@ -0,0 +1,4 @@
|
||||
defaults.url=https://sentry.io/
|
||||
defaults.org=delphi-mars
|
||||
defaults.project=mars-v2
|
||||
cli.executable=../../../.npm/_npx/a8388072043b4cbc/node_modules/@sentry/cli/bin/sentry-cli
|
19
sentry.server.config.js
Normal file
@ -0,0 +1,19 @@
|
||||
// This file configures the initialization of Sentry on the server.
|
||||
// The config you add here will be used whenever the server handles a request.
|
||||
// https://docs.sentry.io/platforms/javascript/guides/nextjs/
|
||||
|
||||
import * as Sentry from '@sentry/nextjs'
|
||||
|
||||
const SENTRY_DSN = process.env.SENTRY_DSN || process.env.NEXT_PUBLIC_SENTRY_DSN
|
||||
|
||||
Sentry.init({
|
||||
dsn: SENTRY_DSN,
|
||||
environment: process.env.NEXT_PUBLIC_SENTRY_ENV,
|
||||
// Adjust this value in production, or use tracesSampler for greater control
|
||||
tracesSampleRate: 0.5,
|
||||
enabled: process.env.NODE_ENV !== 'development',
|
||||
// ...
|
||||
// Note: if you want to override the automatic release value, do not set a
|
||||
// `release` value here - use the environment variable `SENTRY_RELEASE`, so
|
||||
// that it will also get attached to your source maps
|
||||
})
|
29
src/api/accounts/getAccount.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import { cacheFn, positionsCache } from 'api/cache'
|
||||
import { getCreditManagerQueryClient } from 'api/cosmwasm-client'
|
||||
import getDepositedVaults from 'api/vaults/getDepositedVaults'
|
||||
import { BNCoin } from 'types/classes/BNCoin'
|
||||
import { Positions } from 'types/generated/mars-credit-manager/MarsCreditManager.types'
|
||||
|
||||
export default async function getAccount(accountId: string): Promise<Account> {
|
||||
const creditManagerQueryClient = await getCreditManagerQueryClient()
|
||||
|
||||
const accountPosition: Positions = await cacheFn(
|
||||
() => creditManagerQueryClient.positions({ accountId }),
|
||||
positionsCache,
|
||||
`account/${accountId}`,
|
||||
)
|
||||
|
||||
const depositedVaults = await getDepositedVaults(accountId, accountPosition)
|
||||
|
||||
if (accountPosition) {
|
||||
return {
|
||||
id: accountPosition.account_id,
|
||||
debts: accountPosition.debts.map((debt) => new BNCoin(debt)),
|
||||
lends: accountPosition.lends.map((lend) => new BNCoin(lend)),
|
||||
deposits: accountPosition.deposits.map((deposit) => new BNCoin(deposit)),
|
||||
vaults: depositedVaults,
|
||||
}
|
||||
}
|
||||
|
||||
return new Promise((_, reject) => reject('No account found'))
|
||||
}
|
62
src/api/cache.ts
Normal file
@ -0,0 +1,62 @@
|
||||
import {
|
||||
ArrayOfCoin,
|
||||
Positions,
|
||||
VaultUtilizationResponse,
|
||||
} from 'types/generated/mars-credit-manager/MarsCreditManager.types'
|
||||
import { ArrayOfActiveEmission } from 'types/generated/mars-incentives/MarsIncentives.types'
|
||||
import { PriceResponse } from 'types/generated/mars-oracle-osmosis/MarsOracleOsmosis.types'
|
||||
import {
|
||||
AssetParamsBaseForAddr,
|
||||
TotalDepositResponse,
|
||||
VaultConfigBaseForAddr,
|
||||
} from 'types/generated/mars-params/MarsParams.types'
|
||||
import { ArrayOfMarket } from 'types/generated/mars-red-bank/MarsRedBank.types'
|
||||
|
||||
interface Cache<T> extends Map<string, { data: T | null; timestamp: number }> {}
|
||||
|
||||
let totalRequests: number = 0
|
||||
let cachedRequests: number = 0
|
||||
|
||||
export async function cacheFn<T>(
|
||||
fn: () => Promise<T>,
|
||||
cache: Cache<T>,
|
||||
key: string,
|
||||
staleAfter: number = 5,
|
||||
) {
|
||||
const cachedData = cache.get(key)?.data
|
||||
const isStale = (cache.get(key)?.timestamp || 0) + 1000 * staleAfter < new Date().getTime()
|
||||
|
||||
totalRequests += 1
|
||||
|
||||
if (cachedData && !isStale) {
|
||||
cachedRequests += 1
|
||||
return cachedData
|
||||
}
|
||||
|
||||
const data = await fn()
|
||||
cache.set(key, { data, timestamp: new Date().getTime() })
|
||||
|
||||
return data
|
||||
}
|
||||
|
||||
export const positionsCache: Cache<Positions> = new Map()
|
||||
export const aprsCacheResponse: Cache<Response> = new Map()
|
||||
export const aprsCache: Cache<AprResponse> = new Map()
|
||||
export const vaultConfigsCache: Cache<VaultConfigBaseForAddr[]> = new Map()
|
||||
export const vaultUtilizationCache: Cache<VaultUtilizationResponse> = new Map()
|
||||
export const unlockPositionsCache: Cache<VaultExtensionResponse> = new Map()
|
||||
export const estimateWithdrawCache: Cache<Coin[]> = new Map()
|
||||
export const previewRedeemCache: Cache<string> = new Map()
|
||||
export const priceCache: Cache<BigNumber> = new Map()
|
||||
export const pythPriceCache: Cache<PythConfidenceData> = new Map()
|
||||
export const oraclePriceCache: Cache<PriceResponse[]> = new Map()
|
||||
export const poolPriceCache: Cache<PriceResponse[]> = new Map()
|
||||
export const emissionsCache: Cache<ArrayOfActiveEmission> = new Map()
|
||||
export const marketCache: Cache<Market> = new Map()
|
||||
export const marketsCache: Cache<ArrayOfMarket> = new Map()
|
||||
export const underlyingLiquidityAmountCache: Cache<string> = new Map()
|
||||
export const unclaimedRewardsCache: Cache<ArrayOfCoin> = new Map()
|
||||
export const totalDepositCache: Cache<TotalDepositResponse> = new Map()
|
||||
export const allParamsCache: Cache<AssetParamsBaseForAddr[]> = new Map()
|
||||
export const underlyingDebtCache: Cache<string> = new Map()
|
||||
export const previewDepositCache: Cache<{ vaultAddress: string; amount: string }> = new Map()
|
147
src/api/cosmwasm-client.ts
Normal file
@ -0,0 +1,147 @@
|
||||
import { CosmWasmClient } from '@cosmjs/cosmwasm-stargate'
|
||||
|
||||
import { ENV } from 'constants/env'
|
||||
import { MarsAccountNftQueryClient } from 'types/generated/mars-account-nft/MarsAccountNft.client'
|
||||
import { MarsCreditManagerQueryClient } from 'types/generated/mars-credit-manager/MarsCreditManager.client'
|
||||
import { MarsIncentivesQueryClient } from 'types/generated/mars-incentives/MarsIncentives.client'
|
||||
import { MarsOracleOsmosisQueryClient } from 'types/generated/mars-oracle-osmosis/MarsOracleOsmosis.client'
|
||||
import { MarsRedBankQueryClient } from 'types/generated/mars-red-bank/MarsRedBank.client'
|
||||
import { MarsMockVaultQueryClient } from 'types/generated/mars-mock-vault/MarsMockVault.client'
|
||||
import { MarsParamsQueryClient } from 'types/generated/mars-params/MarsParams.client'
|
||||
import { MarsSwapperOsmosisQueryClient } from 'types/generated/mars-swapper-osmosis/MarsSwapperOsmosis.client'
|
||||
|
||||
let _cosmWasmClient: CosmWasmClient
|
||||
let _accountNftQueryClient: MarsAccountNftQueryClient
|
||||
let _creditManagerQueryClient: MarsCreditManagerQueryClient
|
||||
let _oracleQueryClient: MarsOracleOsmosisQueryClient
|
||||
let _redBankQueryClient: MarsRedBankQueryClient
|
||||
let _paramsQueryClient: MarsParamsQueryClient
|
||||
let _incentivesQueryClient: MarsIncentivesQueryClient
|
||||
let _swapperOsmosisClient: MarsSwapperOsmosisQueryClient
|
||||
|
||||
const getClient = async () => {
|
||||
try {
|
||||
if (!_cosmWasmClient) {
|
||||
_cosmWasmClient = await CosmWasmClient.connect(ENV.URL_RPC)
|
||||
}
|
||||
|
||||
return _cosmWasmClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getAccountNftQueryClient = async () => {
|
||||
try {
|
||||
if (!_accountNftQueryClient) {
|
||||
const client = await getClient()
|
||||
_accountNftQueryClient = new MarsAccountNftQueryClient(client, ENV.ADDRESS_ACCOUNT_NFT)
|
||||
}
|
||||
|
||||
return _accountNftQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getCreditManagerQueryClient = async () => {
|
||||
try {
|
||||
if (!_creditManagerQueryClient) {
|
||||
const client = await getClient()
|
||||
_creditManagerQueryClient = new MarsCreditManagerQueryClient(
|
||||
client,
|
||||
ENV.ADDRESS_CREDIT_MANAGER,
|
||||
)
|
||||
}
|
||||
|
||||
return _creditManagerQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getParamsQueryClient = async () => {
|
||||
try {
|
||||
if (!_paramsQueryClient) {
|
||||
const client = await getClient()
|
||||
_paramsQueryClient = new MarsParamsQueryClient(client, ENV.ADDRESS_PARAMS)
|
||||
}
|
||||
|
||||
return _paramsQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getOracleQueryClient = async () => {
|
||||
try {
|
||||
if (!_oracleQueryClient) {
|
||||
const client = await getClient()
|
||||
_oracleQueryClient = new MarsOracleOsmosisQueryClient(client, ENV.ADDRESS_ORACLE)
|
||||
}
|
||||
|
||||
return _oracleQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getRedBankQueryClient = async () => {
|
||||
try {
|
||||
if (!_redBankQueryClient) {
|
||||
const client = await getClient()
|
||||
_redBankQueryClient = new MarsRedBankQueryClient(client, ENV.ADDRESS_RED_BANK)
|
||||
}
|
||||
|
||||
return _redBankQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getVaultQueryClient = async (address: string) => {
|
||||
try {
|
||||
const client = await getClient()
|
||||
return new MarsMockVaultQueryClient(client, address)
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getIncentivesQueryClient = async () => {
|
||||
try {
|
||||
if (!_incentivesQueryClient) {
|
||||
const client = await getClient()
|
||||
_incentivesQueryClient = new MarsIncentivesQueryClient(client, ENV.ADDRESS_INCENTIVES)
|
||||
}
|
||||
|
||||
return _incentivesQueryClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
const getSwapperQueryClient = async () => {
|
||||
try {
|
||||
if (!_swapperOsmosisClient) {
|
||||
const client = await getClient()
|
||||
_swapperOsmosisClient = new MarsSwapperOsmosisQueryClient(client, ENV.ADDRESS_SWAPPER)
|
||||
}
|
||||
|
||||
return _swapperOsmosisClient
|
||||
} catch (error) {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
export {
|
||||
getClient,
|
||||
getAccountNftQueryClient,
|
||||
getCreditManagerQueryClient,
|
||||
getParamsQueryClient,
|
||||
getOracleQueryClient,
|
||||
getRedBankQueryClient,
|
||||
getVaultQueryClient,
|
||||
getIncentivesQueryClient,
|
||||
getSwapperQueryClient,
|
||||
}
|
41
src/api/incentives/calculateAssetIncentivesApy.ts
Normal file
@ -0,0 +1,41 @@
|
||||
import getMarket from 'api/markets/getMarket'
|
||||
import getTotalActiveEmissionValue from 'api/incentives/getTotalActiveEmissionValue'
|
||||
import getUnderlyingLiquidityAmount from 'api/markets/getMarketUnderlyingLiquidityAmount'
|
||||
import { BN } from 'utils/helpers'
|
||||
import { SECONDS_IN_A_YEAR } from 'utils/constants'
|
||||
import getPrice from 'api/prices/getPrice'
|
||||
import { ASSETS } from 'constants/assets'
|
||||
import { byDenom } from 'utils/array'
|
||||
|
||||
export default async function calculateAssetIncentivesApy(
|
||||
denom: string,
|
||||
): Promise<BigNumber | null> {
|
||||
try {
|
||||
const [totalActiveEmissionValue, market] = await Promise.all([
|
||||
getTotalActiveEmissionValue(denom),
|
||||
getMarket(denom),
|
||||
])
|
||||
|
||||
if (!totalActiveEmissionValue) return null
|
||||
|
||||
const [marketLiquidityAmount, assetPrice] = await Promise.all([
|
||||
getUnderlyingLiquidityAmount(market),
|
||||
getPrice(denom),
|
||||
])
|
||||
|
||||
const assetDecimals = (ASSETS.find(byDenom(denom)) as Asset).decimals
|
||||
|
||||
const marketLiquidityValue = BN(marketLiquidityAmount)
|
||||
.shiftedBy(-assetDecimals)
|
||||
.multipliedBy(assetPrice)
|
||||
|
||||
const marketReturns = BN(market.liquidityRate).multipliedBy(marketLiquidityValue)
|
||||
const annualEmission = totalActiveEmissionValue.multipliedBy(SECONDS_IN_A_YEAR)
|
||||
|
||||
const totalAnnualReturnsValue = annualEmission.plus(marketReturns)
|
||||
return totalAnnualReturnsValue.dividedBy(marketLiquidityValue).multipliedBy(100)
|
||||
} catch (ex) {
|
||||
console.error(ex)
|
||||
return null
|
||||
}
|
||||
}
|
42
src/api/incentives/getTotalActiveEmissionValue.ts
Normal file
@ -0,0 +1,42 @@
|
||||
import { cacheFn, emissionsCache } from 'api/cache'
|
||||
import { getIncentivesQueryClient } from 'api/cosmwasm-client'
|
||||
import getPrice from 'api/prices/getPrice'
|
||||
import { ASSETS } from 'constants/assets'
|
||||
import { BN_ZERO } from 'constants/math'
|
||||
import { byDenom } from 'utils/array'
|
||||
import { BN } from 'utils/helpers'
|
||||
|
||||
export default async function getTotalActiveEmissionValue(
|
||||
denom: string,
|
||||
): Promise<BigNumber | null> {
|
||||
try {
|
||||
const client = await getIncentivesQueryClient()
|
||||
const activeEmissions = await cacheFn(
|
||||
() =>
|
||||
client.activeEmissions({
|
||||
collateralDenom: denom,
|
||||
}),
|
||||
emissionsCache,
|
||||
`emission/${denom}`,
|
||||
60,
|
||||
)
|
||||
|
||||
if (activeEmissions.length === 0) {
|
||||
throw 'Asset has no active incentive emission.'
|
||||
}
|
||||
|
||||
const prices = await Promise.all(
|
||||
activeEmissions.map((activeEmission) => getPrice(activeEmission.denom)),
|
||||
)
|
||||
|
||||
return activeEmissions.reduce((accumulation, current, index) => {
|
||||
const price = prices[index]
|
||||
const decimals = ASSETS.find(byDenom(current.denom))?.decimals as number
|
||||
const emissionValue = BN(current.emission_rate).shiftedBy(-decimals).multipliedBy(price)
|
||||
|
||||
return accumulation.plus(emissionValue)
|
||||
}, BN_ZERO)
|
||||
} catch (ex) {
|
||||
return null
|
||||
}
|
||||
}
|
31
src/api/incentives/getUnclaimedRewards.ts
Normal file
@ -0,0 +1,31 @@
|
||||
import { cacheFn, unclaimedRewardsCache } from 'api/cache'
|
||||
import { getIncentivesQueryClient } from 'api/cosmwasm-client'
|
||||
import { ENV } from 'constants/env'
|
||||
import { BNCoin } from 'types/classes/BNCoin'
|
||||
import iterateContractQuery from 'utils/iterateContractQuery'
|
||||
|
||||
export default async function getUnclaimedRewards(accountId: string): Promise<BNCoin[]> {
|
||||
try {
|
||||
const client = await getIncentivesQueryClient()
|
||||
const unclaimedRewards = await cacheFn(
|
||||
() =>
|
||||
iterateContractQuery(() =>
|
||||
client.userUnclaimedRewards({
|
||||
user: ENV.ADDRESS_CREDIT_MANAGER,
|
||||
accountId,
|
||||
}),
|
||||
),
|
||||
unclaimedRewardsCache,
|
||||
`incentives/${accountId}`,
|
||||
60,
|
||||
)
|
||||
|
||||
if (unclaimedRewards.length === 0) return []
|
||||
|
||||
return await Promise.all(
|
||||
unclaimedRewards.map((reward) => new BNCoin({ denom: reward.denom, amount: reward.amount })),
|
||||
)
|
||||
} catch (ex) {
|
||||
return []
|
||||
}
|
||||
}
|