diff --git a/packages/web/.storybook/main.js b/packages/web/.storybook/main.js index 247f34afc..f52e68e7f 100644 --- a/packages/web/.storybook/main.js +++ b/packages/web/.storybook/main.js @@ -21,6 +21,9 @@ module.exports = { }, }); return merge(config, { + experiments: { + topLevelAwait: true, + }, resolve: { plugins: [new TsconfigPathsPlugin()], }, diff --git a/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.stories.tsx b/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.stories.tsx index 383a3bf02..16f7a4637 100644 --- a/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.stories.tsx +++ b/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.stories.tsx @@ -17,31 +17,33 @@ const Template: ComponentStory = args => ( ); const token = { - path: "1", - name: "HEX", - symbol: "HEX", - logoURI: - "https://raw.githubusercontent.com/Uniswap/assets/master/blockchains/ethereum/assets/0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39/logo.png", + "chainId": "test3", + "address": "0x111111111117dC0aa78b770fA6A738034120C302", + "path": "gno.land/r/demo/1inch", + "name": "1inch", + "symbol": "1INCH", + "decimals": 6, + "logoURI": "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + "priceId": "1inch", + "createdAt": "1999-01-01T00:00:01Z" }; export const Default = Template.bind({}); Default.args = { - token0Input: { + tokenAInput: { token: token, amount: "121", usdValue: "$0.00", balance: "0", changeAmount: action("changeAmount"), - changeBalance: action("changeBalance"), }, - token1Input: { + tokenBInput: { token: token, amount: "121", usdValue: "$0.00", balance: "0", changeAmount: action("changeAmount"), - changeBalance: action("changeBalance"), }, - changeToken0: action("changeToken0"), - changeToken1: action("changeToken1"), + changeTokenA: action("changeTokenA"), + changeTokenB: action("changeTokenB"), }; diff --git a/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.tsx b/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.tsx index ad42f7ad7..f04ccc1d8 100644 --- a/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.tsx +++ b/packages/web/src/components/common/liquidity-enter-amounts/LiquidityEnterAmounts.tsx @@ -3,26 +3,26 @@ import IconAdd from "../icons/IconAdd"; import { LiquidityEnterAmountsWrapper } from "./LiquidityEnterAmounts.styles"; import TokenAmountInput from "../token-amount-input/TokenAmountInput"; import { TokenAmountInputModel } from "@hooks/token/use-token-amount-input"; -import { TokenInfo } from "@models/token/token-info"; +import { TokenModel } from "@models/token/token-model"; interface LiquidityEnterAmountsProps { - token0Input: TokenAmountInputModel; - token1Input: TokenAmountInputModel; - changeToken0: (token: TokenInfo) => void; - changeToken1: (token: TokenInfo) => void; + tokenAInput: TokenAmountInputModel; + tokenBInput: TokenAmountInputModel; + changeTokenA: (token: TokenModel) => void; + changeTokenB: (token: TokenModel) => void; } const LiquidityEnterAmounts: React.FC = ({ - token0Input, - token1Input, - changeToken0, - changeToken1, + tokenAInput, + tokenBInput, + changeTokenA, + changeTokenB, }) => { return ( - - + +
diff --git a/packages/web/src/components/common/modal/Modal.styles.ts b/packages/web/src/components/common/modal/Modal.styles.ts index 21c13b91e..d07bdb840 100644 --- a/packages/web/src/components/common/modal/Modal.styles.ts +++ b/packages/web/src/components/common/modal/Modal.styles.ts @@ -24,6 +24,7 @@ export const ModalWrapper = styled.div` }}; padding: 24px; ${mixins.positionCenter()}; + position: fixed; z-index: ${Z_INDEX.modal}; background-color: ${({ theme }) => theme.color.background06}; border: 1px solid ${({ theme }) => theme.color.border02}; diff --git a/packages/web/src/components/common/pool-graph/PoolGraph.stories.tsx b/packages/web/src/components/common/pool-graph/PoolGraph.stories.tsx index b4c82a3e7..10969c413 100644 --- a/packages/web/src/components/common/pool-graph/PoolGraph.stories.tsx +++ b/packages/web/src/components/common/pool-graph/PoolGraph.stories.tsx @@ -1,4 +1,3 @@ -import { DUMMY_POOL_TICKS } from "@containers/earn-add-liquidity-container/earn-add-liquidity-dummy"; import PoolGraph, { type PoolGraphProps } from "./PoolGraph"; import { Meta, StoryObj } from "@storybook/react"; import { action } from "@storybook/addon-actions"; @@ -10,12 +9,9 @@ export default { export const Default: StoryObj = { args: { - ticks: DUMMY_POOL_TICKS, - currentTick: DUMMY_POOL_TICKS[20], + ticks: [], width: 400, height: 200, - minTick: DUMMY_POOL_TICKS[10], - maxTick: DUMMY_POOL_TICKS[30], onChangeMinTick: action("onChangeMinTick"), onChangeMaxTick: action("onChangeMaxTick"), }, diff --git a/packages/web/src/components/common/select-fee-tier/SelectFeeTier.stories.tsx b/packages/web/src/components/common/select-fee-tier/SelectFeeTier.stories.tsx index 5f10a9fa9..f1193c354 100644 --- a/packages/web/src/components/common/select-fee-tier/SelectFeeTier.stories.tsx +++ b/packages/web/src/components/common/select-fee-tier/SelectFeeTier.stories.tsx @@ -2,7 +2,6 @@ import React from "react"; import { ComponentStory, ComponentMeta } from "@storybook/react"; import SelectFeeTier from "./SelectFeeTier"; import { action } from "@storybook/addon-actions"; -import { DUMMY_FEE_TIERS } from "@containers/earn-add-liquidity-container/earn-add-liquidity-dummy"; export default { title: "common/AddLiquidity/SelectFeeTier", @@ -15,7 +14,6 @@ const Template: ComponentStory = args => ( export const Default = Template.bind({}); Default.args = { - feeTiers: DUMMY_FEE_TIERS, - feeRate: "0.01", + feeTiers: [], selectFeeTier: action("selectFeeTier"), }; diff --git a/packages/web/src/components/common/select-fee-tier/SelectFeeTier.tsx b/packages/web/src/components/common/select-fee-tier/SelectFeeTier.tsx index 3a04f184b..f68beca5f 100644 --- a/packages/web/src/components/common/select-fee-tier/SelectFeeTier.tsx +++ b/packages/web/src/components/common/select-fee-tier/SelectFeeTier.tsx @@ -1,65 +1,77 @@ import React, { useCallback, useMemo } from "react"; import { SelectFeeTierItemWrapper, SelectFeeTierWrapper } from "./SelectFeeTier.styles"; -import { AddLiquidityFeeTier } from "@containers/earn-add-liquidity-container/EarnAddLiquidityContainer"; -import { FEE_RATE_OPTION } from "@constants/option.constant"; +import { SwapFeeTierInfoMap, SwapFeeTierType } from "@constants/option.constant"; +import { PoolModel } from "@models/pool/pool-model"; +import BigNumber from "bignumber.js"; interface SelectFeeTierProps { - feeTiers: AddLiquidityFeeTier[]; - feeRate: string | undefined; - selectFeeTier: (feeRate: FEE_RATE_OPTION) => void; + feeTiers: SwapFeeTierType[]; + feeTier: SwapFeeTierType | null; + pools: PoolModel[], + selectFeeTier: (feeTier: SwapFeeTierType) => void; } const SelectFeeTier: React.FC = ({ feeTiers, - feeRate, + feeTier, + pools, selectFeeTier, }) => { - const onClickFeeTierItem = useCallback((feeRate: string) => { - const feeRateOption = Object.values(FEE_RATE_OPTION).find(option => option === feeRate); - if (feeRateOption) { - selectFeeTier(feeRateOption); - } + const onClickFeeTierItem = useCallback((feeTier: SwapFeeTierType) => { + selectFeeTier(feeTier); }, [selectFeeTier]); return ( - {feeTiers.map((feeTier, index) => ( + {feeTiers.map((item, index) => ( onClickFeeTierItem(feeTier.feeRate)} + selected={feeTier === item} + feeTier={item} + pools={pools} + onClick={() => onClickFeeTierItem(item)} /> ))} ); }; -interface SelectFeeTierItemProps extends AddLiquidityFeeTier { +interface SelectFeeTierItemProps { selected: boolean; + feeTier: SwapFeeTierType; + pools: PoolModel[]; onClick: () => void; } const SelectFeeTierItem: React.FC = ({ selected, - feeRate, - description, - range, + feeTier, + pools, onClick, }) => { const feeRateStr = useMemo(() => { - return `${feeRate}%`; - }, [feeRate]); + return SwapFeeTierInfoMap[feeTier].rateStr; + }, [feeTier]); const rangeStr = useMemo(() => { - if (range === "0") { + const fee = SwapFeeTierInfoMap[feeTier].fee; + const pool = pools.find(pool => pool.fee === fee); + if (!pool || pool.bins.length < 2) { return "Not created"; } - return `${range}% select`; - }, [range]); + const sortedBins = pool.bins.sort((p1, p2) => p1.currentTick - p2.currentTick); + const fullTickRange = 1774545; + const currentTickGap = sortedBins[0].currentTick - sortedBins[sortedBins.length - 1].currentTick; + return BigNumber(currentTickGap) + .dividedBy(fullTickRange) + .multipliedBy(100) + .toFixed(); + }, [feeTier, pools]); + + const description = useMemo(() => { + return SwapFeeTierInfoMap[feeTier].description; + }, [feeTier]); return ( diff --git a/packages/web/src/components/common/select-pair-button/SelectPairButton.stories.tsx b/packages/web/src/components/common/select-pair-button/SelectPairButton.stories.tsx index 8743ca9f0..661a03cd3 100644 --- a/packages/web/src/components/common/select-pair-button/SelectPairButton.stories.tsx +++ b/packages/web/src/components/common/select-pair-button/SelectPairButton.stories.tsx @@ -15,11 +15,15 @@ const Template: ComponentStory = args => ( export const Selected = Template.bind({}); Selected.args = { token: { - path: Math.floor(Math.random() * 50 + 1).toString(), - name: "HEX", - symbol: "HEX", - logoURI: - "https://raw.githubusercontent.com/Uniswap/assets/master/blockchains/ethereum/assets/0x2b591e99afE9f32eAA6214f7B7629768c40Eeb39/logo.png", + chainId: "test3", + address: "0x111111111117dC0aa78b770fA6A738034120C302", + path: "gno.land/r/demo/1inch", + name: "1inch", + symbol: "1INCH", + decimals: 6, + logoURI: "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + priceId: "1inch", + createdAt: "1999-01-01T00:00:01Z" }, }; diff --git a/packages/web/src/components/common/select-pair-button/SelectPairButton.tsx b/packages/web/src/components/common/select-pair-button/SelectPairButton.tsx index 6c4f06662..daad47884 100644 --- a/packages/web/src/components/common/select-pair-button/SelectPairButton.tsx +++ b/packages/web/src/components/common/select-pair-button/SelectPairButton.tsx @@ -1,12 +1,12 @@ import React, { useCallback } from "react"; import IconStrokeArrowDown from "@components/common/icons/IconStrokeArrowDown"; import { wrapper } from "./SelectPairButton.styles"; -import { TokenInfo } from "@models/token/token-info"; import { useSelectTokenModal } from "@hooks/token/use-select-token-modal"; +import { TokenModel } from "@models/token/token-model"; interface SelectPairButtonProps { - token?: TokenInfo; - changeToken?: (token: TokenInfo) => void; + token: TokenModel | null; + changeToken?: (token: TokenModel) => void; disabled?: boolean; } diff --git a/packages/web/src/components/common/select-pair/SelectPair.stories.tsx b/packages/web/src/components/common/select-pair/SelectPair.stories.tsx index 5ec79c943..731d697f3 100644 --- a/packages/web/src/components/common/select-pair/SelectPair.stories.tsx +++ b/packages/web/src/components/common/select-pair/SelectPair.stories.tsx @@ -13,17 +13,28 @@ const Template: ComponentStory = args => ( ); const tokenA = { - path: "0", - name: "HEX", - symbol: "HEX", - logoURI: "", + chainId: "test3", + address: "0x111111111117dC0aa78b770fA6A738034120C302", + path: "gno.land/r/demo/1inch", + name: "1inch", + symbol: "1INCH", + decimals: 6, + logoURI: "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + priceId: "1inch", + createdAt: "1999-01-01T00:00:01Z" }; const tokenB = { - path: "1", - name: "USDCoin", - symbol: "USDC", - logoURI: "", + name: "Wrapped Ether", + address: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", + path: "gno.land/r/demo/weth", + symbol: "WETH", + decimals: 6, + chainId: "test3", + priceId: "weth", + createdAt: "1999-01-01T00:00:02Z", + isWrappedGasToken: true, + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/2396.png" }; export const Default = Template.bind({}); diff --git a/packages/web/src/components/common/select-pair/SelectPair.tsx b/packages/web/src/components/common/select-pair/SelectPair.tsx index 544cda1f0..e1f940429 100644 --- a/packages/web/src/components/common/select-pair/SelectPair.tsx +++ b/packages/web/src/components/common/select-pair/SelectPair.tsx @@ -1,28 +1,28 @@ import React from "react"; import SelectPairButton from "@components/common/select-pair-button/SelectPairButton"; import { SelectPairWrapper } from "./SelectPair.styles"; -import { TokenInfo } from "@models/token/token-info"; +import { TokenModel } from "@models/token/token-model"; interface SelectPairProps { - tokenA: TokenInfo | undefined; - tokenB: TokenInfo | undefined; - changeToken0: (token: TokenInfo) => void; - changeToken1: (token: TokenInfo) => void; + tokenA: TokenModel | null; + tokenB: TokenModel | null; + changeTokenA: (token: TokenModel) => void; + changeTokenB: (token: TokenModel) => void; disabled?: boolean; } const SelectPair: React.FC = ({ tokenA, tokenB, - changeToken0, - changeToken1, + changeTokenA, + changeTokenB, disabled, }) => { return ( - - + + ); }; diff --git a/packages/web/src/components/common/select-price-range/SelectPriceRange.stories.tsx b/packages/web/src/components/common/select-price-range/SelectPriceRange.stories.tsx index 6a2ec1f53..9ae6d48ad 100644 --- a/packages/web/src/components/common/select-price-range/SelectPriceRange.stories.tsx +++ b/packages/web/src/components/common/select-price-range/SelectPriceRange.stories.tsx @@ -1,9 +1,7 @@ import React from "react"; import { ComponentStory, ComponentMeta } from "@storybook/react"; - import SelectPriceRange from "./SelectPriceRange"; import { action } from "@storybook/addon-actions"; -import { DUMMY_PRICE_RANGE_MAP } from "@containers/earn-add-liquidity-container/earn-add-liquidity-dummy"; export default { title: "common/AddLiquidity/SelectPriceRange", @@ -16,7 +14,7 @@ const Template: ComponentStory = args => ( export const Default = Template.bind({}); Default.args = { - priceRangeMap: DUMMY_PRICE_RANGE_MAP, + priceRanges: [], priceRange: undefined, - selectPriceRange: action("selectPriceRange"), + changePriceRange: action("changePriceRange"), }; diff --git a/packages/web/src/components/common/select-price-range/SelectPriceRange.tsx b/packages/web/src/components/common/select-price-range/SelectPriceRange.tsx index 194006299..08d4f94c2 100644 --- a/packages/web/src/components/common/select-price-range/SelectPriceRange.tsx +++ b/packages/web/src/components/common/select-price-range/SelectPriceRange.tsx @@ -1,4 +1,4 @@ -import { PriceRangeTooltip, PriceRangeType } from "@constants/option.constant"; +import { PriceRangeTooltip } from "@constants/option.constant"; import React, { useCallback, useMemo } from "react"; import IconInfo from "@components/common/icons/IconInfo"; import IconStrokeArrowRight from "@components/common/icons/IconStrokeArrowRight"; @@ -7,30 +7,27 @@ import { SelectPriceRangeItemWrapper, SelectPriceRangeWrapper } from "./SelectPr import { AddLiquidityPriceRage } from "@containers/earn-add-liquidity-container/EarnAddLiquidityContainer"; interface SelectPriceRangeProps { - priceRangeMap: { [key in PriceRangeType]: AddLiquidityPriceRage | undefined }; - priceRange: PriceRangeType | undefined; - selectPriceRange: (priceRange: PriceRangeType) => void; + priceRanges: AddLiquidityPriceRage[]; + priceRange: AddLiquidityPriceRage | null; + changePriceRange: (priceRange: AddLiquidityPriceRage) => void; } -const PRICE_RANGE_ORDERS: PriceRangeType[] = ["Active", "Passive", "Custom"]; - const SelectPriceRange: React.FC = ({ - priceRangeMap, + priceRanges, priceRange, - selectPriceRange, + changePriceRange, }) => { return (
- {PRICE_RANGE_ORDERS.map((priceRangeType, index: number) => ( + {priceRanges.map((item, index) => ( ))}
@@ -40,37 +37,36 @@ const SelectPriceRange: React.FC = ({ interface SelectPriceRangeItemProps { selected: boolean; - priceRage: PriceRangeType; + priceRange: AddLiquidityPriceRage; tooltip: string | undefined; - apr: string | undefined; - selectPriceRange: (priceRange: PriceRangeType) => void; + changePriceRange: (priceRange: AddLiquidityPriceRage) => void; } export const SelectPriceRangeItem: React.FC = ({ selected, - priceRage, + priceRange, tooltip, - apr, - selectPriceRange, + changePriceRange, }) => { const aprStr = useMemo(() => { + const apr = priceRange.apr; if (apr) { return `${apr}%`; } - if (priceRage === "Custom") { + if (priceRange.type === "Custom") { return null; } return "-"; - }, [apr, priceRage]); + }, [priceRange]); const onClickItem = useCallback(() => { - selectPriceRange(priceRage); - }, [priceRage, selectPriceRange]); + changePriceRange(priceRange); + }, [priceRange, changePriceRange]); return ( - {priceRage} + {priceRange.type} {tooltip && (
{ keyword: "", defaultTokens: [], tokens: [], - tokenPrices: [], + tokenPrices: {}, changeKeyword: () => { return; }, changeToken: () => { return; }, close: () => { return; }, diff --git a/packages/web/src/components/common/token-amount-input/TokenAmountInput.spec.tsx b/packages/web/src/components/common/token-amount-input/TokenAmountInput.spec.tsx index af0b1e9dc..d02b67481 100644 --- a/packages/web/src/components/common/token-amount-input/TokenAmountInput.spec.tsx +++ b/packages/web/src/components/common/token-amount-input/TokenAmountInput.spec.tsx @@ -4,10 +4,15 @@ import GnoswapThemeProvider from "@providers/gnoswap-theme-provider/GnoswapTheme import TokenAmountInput, { TokenAmountInputProps } from "./TokenAmountInput"; const token = { - path: "1", - name: "Gnoland", - symbol: "GNO.LAND", - logoURI: "https://raw.githubusercontent.com/Uniswap/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; describe("TokenAmountInput Component", () => { @@ -18,7 +23,6 @@ describe("TokenAmountInput Component", () => { balance: "12,211", usdValue: "12.3", changable: true, - changeBalance: () => { return; }, changeAmount: () => { return; }, changeToken: () => { return; }, }; diff --git a/packages/web/src/components/common/token-amount-input/TokenAmountInput.stories.tsx b/packages/web/src/components/common/token-amount-input/TokenAmountInput.stories.tsx index e16b0e090..e230e47e8 100644 --- a/packages/web/src/components/common/token-amount-input/TokenAmountInput.stories.tsx +++ b/packages/web/src/components/common/token-amount-input/TokenAmountInput.stories.tsx @@ -8,10 +8,15 @@ export default { } as Meta; const token = { - path: "1", - name: "Gnoland", - symbol: "GNO.LAND", - logoURI: "https://raw.githubusercontent.com/Uniswap/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; export const Default: StoryObj = { @@ -21,7 +26,6 @@ export const Default: StoryObj = { balance: "12,211", usdValue: "12.3", changable: true, - changeBalance: action("changeBalance"), changeAmount: action("changeAmount"), changeToken: action("changeToken"), }, diff --git a/packages/web/src/components/common/token-amount-input/TokenAmountInput.tsx b/packages/web/src/components/common/token-amount-input/TokenAmountInput.tsx index 58d0e19bd..26a03ac37 100644 --- a/packages/web/src/components/common/token-amount-input/TokenAmountInput.tsx +++ b/packages/web/src/components/common/token-amount-input/TokenAmountInput.tsx @@ -3,11 +3,11 @@ import { TokenAmountInputWrapper } from "./TokenAmountInput.styles"; import SelectPairButton from "../select-pair-button/SelectPairButton"; import BigNumber from "bignumber.js"; import { TokenAmountInputModel } from "@hooks/token/use-token-amount-input"; -import { TokenInfo } from "@models/token/token-info"; +import { TokenModel } from "@models/token/token-model"; export interface TokenAmountInputProps extends TokenAmountInputModel { changable?: boolean; - changeToken: (token: TokenInfo) => void; + changeToken: (token: TokenModel) => void; } const TokenAmountInput: React.FC = ({ diff --git a/packages/web/src/components/common/token-amount/TokenAmount.spec.tsx b/packages/web/src/components/common/token-amount/TokenAmount.spec.tsx index 13ebeb6b0..3bd07b0ac 100644 --- a/packages/web/src/components/common/token-amount/TokenAmount.spec.tsx +++ b/packages/web/src/components/common/token-amount/TokenAmount.spec.tsx @@ -4,10 +4,15 @@ import GnoswapThemeProvider from "@providers/gnoswap-theme-provider/GnoswapTheme import TokenAmount, { TokenAmountProps } from "./TokenAmount"; const token = { - path: "1", - name: "Gnoland", - symbol: "GNO.LAND", - logoURI: "https://raw.githubusercontent.com/Uniswap/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; describe("TokenAmount Component", () => { diff --git a/packages/web/src/components/common/token-amount/TokenAmount.stories.tsx b/packages/web/src/components/common/token-amount/TokenAmount.stories.tsx index 9224b6870..88c16fc8e 100644 --- a/packages/web/src/components/common/token-amount/TokenAmount.stories.tsx +++ b/packages/web/src/components/common/token-amount/TokenAmount.stories.tsx @@ -7,10 +7,15 @@ export default { } as Meta; const token = { - path: "1", - name: "Gnoland", - symbol: "GNO.LAND", - logoURI: "", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; export const Default: StoryObj = { diff --git a/packages/web/src/components/common/token-amount/TokenAmount.tsx b/packages/web/src/components/common/token-amount/TokenAmount.tsx index 51b0d2fbd..5e85a8402 100644 --- a/packages/web/src/components/common/token-amount/TokenAmount.tsx +++ b/packages/web/src/components/common/token-amount/TokenAmount.tsx @@ -1,10 +1,10 @@ import React from "react"; import { TokenAmountWrapper } from "./TokenAmount.styles"; import SelectPairButton from "../select-pair-button/SelectPairButton"; -import { TokenInfo } from "@models/token/token-info"; +import { TokenModel } from "@models/token/token-model"; export interface TokenAmountProps { - token: TokenInfo; + token: TokenModel; usdPrice: string; amount: string; } diff --git a/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.stories.tsx b/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.stories.tsx index b4f847d7f..3691f170c 100644 --- a/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.stories.tsx +++ b/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.stories.tsx @@ -4,10 +4,15 @@ import { Meta, StoryObj } from "@storybook/react"; const token = { info: { - path: "1", - name: "Gnoland", - symbol: "GNO.LAND", - logoURI: "", + chainId: "test3", + address: "0x111111111117dC0aa78b770fA6A738034120C302", + path: "gno.land/r/demo/1inch", + name: "1inch", + symbol: "1INCH", + decimals: 6, + logoURI: "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + priceId: "1inch", + createdAt: "1999-01-01T00:00:01Z" }, amount: "12,211", usdPrice: "$12.3", diff --git a/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.tsx b/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.tsx index 9b4b425d9..768bc6091 100644 --- a/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.tsx +++ b/packages/web/src/components/earn-add/earn-add-confirm-amount-info/EarnAddConfirmAmountInfo.tsx @@ -1,17 +1,17 @@ import React from "react"; import { EarnAddConfirmAmountInfoWrapper, EarnAddConfirmFeeInfoSection } from "./EarnAddConfirmAmountInfo.styles"; -import { TokenInfo } from "@models/token/token-info"; import TokenAmount from "@components/common/token-amount/TokenAmount"; import IconAdd from "@components/common/icons/IconAdd"; +import { TokenModel } from "@models/token/token-model"; export interface EarnAddConfirmAmountInfoProps { tokenA: { - info: TokenInfo; + info: TokenModel; amount: string; usdPrice: string; }; tokenB: { - info: TokenInfo; + info: TokenModel; amount: string; usdPrice: string; }; diff --git a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.stories.tsx b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.stories.tsx index 38d3317e7..459a62463 100644 --- a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.stories.tsx +++ b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.stories.tsx @@ -9,10 +9,15 @@ export default { const tokenA = { info: { - path: "1", - name: "Gnoland", - symbol: "GNOT", - logoURI: "", + chainId: "test3", + address: "0x111111111117dC0aa78b770fA6A738034120C302", + path: "gno.land/r/demo/1inch", + name: "1inch", + symbol: "1INCH", + decimals: 6, + logoURI: "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + priceId: "1inch", + createdAt: "1999-01-01T00:00:01Z" }, amount: "12,211", usdPrice: "$12.3", @@ -20,10 +25,15 @@ const tokenA = { const tokenB = { info: { - path: "2", - name: "Ether", - symbol: "ETH", - logoURI: "", + chainId: "test3", + address: "0x111111111117dC0aa78b770fA6A738034120C302", + path: "gno.land/r/demo/1inch", + name: "1inch", + symbol: "1INCH", + decimals: 6, + logoURI: "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", + priceId: "1inch", + createdAt: "1999-01-01T00:00:01Z" }, amount: "12,211", usdPrice: "$12.3", diff --git a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.styles.ts b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.styles.ts index 1dccc99db..94a30e99b 100644 --- a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.styles.ts +++ b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.styles.ts @@ -4,14 +4,9 @@ import styled from "@emotion/styled"; export const EarnAddConfirmWrapper = styled.div` display: flex; flex-direction: column; - width: 100%; + width: 460px; height: auto; - padding: 24px; gap: 16px; - border-radius: 8px; - border: 1px solid ${({ theme }) => theme.color.border02}; - background-color: ${({ theme }) => theme.color.background06}; - box-shadow: 10px 14px 60px 0px rgba(0, 0, 0, 0.40); .confirm-header { display: flex; diff --git a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.tsx b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.tsx index 2151292db..bad3ed9b9 100644 --- a/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.tsx +++ b/packages/web/src/components/earn-add/earn-add-confirm/EarnAddConfirm.tsx @@ -2,20 +2,20 @@ import React from "react"; import { EarnAddConfirmWrapper } from "./EarnAddConfirm.styles"; import Button, { ButtonHierarchy } from "@components/common/button/Button"; import IconClose from "@components/common/icons/IconCancel"; -import { TokenInfo } from "@models/token/token-info"; import EarnAddConfirmAmountInfo from "../earn-add-confirm-amount-info/EarnAddConfirmAmountInfo"; import EarnAddConfirmPriceRangeInfo from "../earn-add-confirm-price-range-info/EarnAddConfirmPriceRangeInfo"; import EarnAddConfirmFeeInfo from "../earn-add-confirm-fee-info/EarnAddConfirmFeeInfo"; +import { TokenModel } from "@models/token/token-model"; export interface EarnAddConfirmProps { amountInfo: { tokenA: { - info: TokenInfo; + info: TokenModel; amount: string; usdPrice: string; }; tokenB: { - info: TokenInfo; + info: TokenModel; amount: string; usdPrice: string; }; @@ -31,7 +31,7 @@ export interface EarnAddConfirmProps { estimatedAPR: string; }; feeInfo: { - token: TokenInfo; + token: TokenModel; fee: string; }; confirm: () => void; diff --git a/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.stories.tsx b/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.stories.tsx index b6c95f792..94aa4d369 100644 --- a/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.stories.tsx +++ b/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.stories.tsx @@ -3,7 +3,6 @@ import { ComponentStory, ComponentMeta } from "@storybook/react"; import EarnAddLiquidity from "./EarnAddLiquidity"; import { action } from "@storybook/addon-actions"; -import { DUMMY_FEE_TIERS, DUMMY_POOL_TICKS, DUMMY_PRICE_RANGE_MAP } from "@containers/earn-add-liquidity-container/earn-add-liquidity-dummy"; export default { title: "earn-add/EarnAddLiquidity", @@ -14,16 +13,26 @@ const Template: ComponentStory = args => ( ); const tokenA = { - path: "1", - logoURI: "", - name: "Bitcoin", - symbol: "BTC", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; const tokenB = { - path: "2", - logoURI: "", - name: "Ethereum", - symbol: "ETH", + chainId: "dev", + createdAt: "2023-10-10T08:48:46+09:00", + name: "Gnoswap", + address: "g1sqaft388ruvsseu97r04w4rr4szxkh4nn6xpax", + path: "gno.land/r/gnos", + decimals: 4, + symbol: "GNOS", + logoURI: "https://s2.coinmarketcap.com/static/img/coins/64x64/5994.png", + priceId: "gno.land/r/gnos" }; export const Default = Template.bind({}); @@ -31,12 +40,9 @@ Default.args = { mode: "POOL", tokenA: tokenA, tokenB: tokenB, - feeTiers: DUMMY_FEE_TIERS, - feeRate: "0.01", + feeTiers: [], selectFeeTier: action("selectFeeTier"), - priceRangeMap: DUMMY_PRICE_RANGE_MAP, - priceRange: "Custom", - selectPriceRange: action("selectPriceRange"), - ticks: DUMMY_POOL_TICKS, - currentTick: DUMMY_POOL_TICKS[20], + priceRanges: [], + changePriceRange: action("selectPriceRange"), + ticks: [], }; diff --git a/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.tsx b/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.tsx index 05870b31d..e7b5609aa 100644 --- a/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.tsx +++ b/packages/web/src/components/earn-add/earn-add-liquidity/EarnAddLiquidity.tsx @@ -1,96 +1,90 @@ import Button, { ButtonHierarchy } from "@components/common/button/Button"; import SelectFeeTier from "@components/common/select-fee-tier/SelectFeeTier"; -import SelectPriceRange from "@components/common/select-price-range/SelectPriceRange"; import React, { useCallback, useMemo, useState } from "react"; import { EarnAddLiquidityWrapper } from "./EarnAddLiquidity.styles"; -import { AddLiquidityType, FEE_RATE_OPTION, PriceRangeType } from "@constants/option.constant"; -import { AddLiquidityFeeTier, AddLiquidityPriceRage, PoolTick, PriceRangeSummary } from "@containers/earn-add-liquidity-container/EarnAddLiquidityContainer"; +import { AddLiquidityType, SwapFeeTierType, SwapFeeTierInfoMap, AddLiquiditySubmitType } from "@constants/option.constant"; +import { AddLiquidityPriceRage, PoolTick, PriceRangeSummary } from "@containers/earn-add-liquidity-container/EarnAddLiquidityContainer"; import LiquidityEnterAmounts from "@components/common/liquidity-enter-amounts/LiquidityEnterAmounts"; -import { TokenInfo } from "@models/token/token-info"; import SelectPair from "@components/common/select-pair/SelectPair"; import { TokenAmountInputModel } from "@hooks/token/use-token-amount-input"; import DoubleLogo from "@components/common/double-logo/DoubleLogo"; import IconSettings from "@components/common/icons/IconSettings"; import Badge, { BADGE_TYPE } from "@components/common/badge/Badge"; -import SelectPriceRangeCustom from "@components/common/select-price-range-custom/SelectPriceRangeCustom"; +import { TokenModel } from "@models/token/token-model"; +import { PoolModel } from "@models/pool/pool-model"; +import SelectPriceRange from "@components/common/select-price-range/SelectPriceRange"; import SelectPriceRangeSummary from "@components/common/select-price-range-summary/SelectPriceRangeSummary"; interface EarnAddLiquidityProps { mode: AddLiquidityType; - tokenA: TokenInfo | undefined; - tokenB: TokenInfo | undefined; - changeToken0: (token: TokenInfo) => void; - changeToken1: (token: TokenInfo) => void; - token0Input: TokenAmountInputModel; - token1Input: TokenAmountInputModel; - feeTiers: AddLiquidityFeeTier[]; - feeRate: FEE_RATE_OPTION | undefined; - selectFeeTier: (feeRate: FEE_RATE_OPTION) => void; - priceRangeMap: { [key in PriceRangeType]: AddLiquidityPriceRage | undefined }; - priceRange: PriceRangeType | undefined; + tokenA: TokenModel | null; + tokenB: TokenModel | null; + changeTokenA: (token: TokenModel) => void; + changeTokenB: (token: TokenModel) => void; + tokenAInput: TokenAmountInputModel; + tokenBInput: TokenAmountInputModel; + feeTiers: SwapFeeTierType[]; + feeTier: SwapFeeTierType | null; + pools: PoolModel[]; + selectFeeTier: (feeRate: SwapFeeTierType) => void; + priceRanges: AddLiquidityPriceRage[]; + priceRange: AddLiquidityPriceRage | null; + changePriceRange: (priceRange: AddLiquidityPriceRage) => void; priceRangeSummary: PriceRangeSummary; - selectPriceRange: (priceRange: PriceRangeType) => void; ticks: PoolTick[]; - currentTick?: PoolTick; + currentTick: PoolTick | null; + submitType: AddLiquiditySubmitType; + submit: () => void; } const EarnAddLiquidity: React.FC = ({ tokenA, tokenB, - changeToken0, - changeToken1, - token0Input, - token1Input, + changeTokenA, + changeTokenB, + tokenAInput, + tokenBInput, feeTiers, - feeRate, + feeTier, + pools, selectFeeTier, - priceRangeMap, + priceRanges, priceRange, priceRangeSummary, - selectPriceRange, - ticks, - currentTick, + changePriceRange, + submitType, + submit, }) => { const [openedSelectPair, setOpenedSelectPair] = useState(true); const [openedFeeTier, setOpenedFeeTier] = useState(true); const [openedPriceRange, setOpenedPriceRange] = useState(true); const existTokenPair = useMemo(() => { - return tokenA !== undefined && tokenB !== undefined; + return tokenA !== null && tokenB !== null; }, [tokenA, tokenB]); - const token0Logo = useMemo(() => { + const tokenALogo = useMemo(() => { return tokenA?.logoURI || ""; }, [tokenA]); - const token1Logo = useMemo(() => { + const tokenBLogo = useMemo(() => { return tokenB?.logoURI || ""; }, [tokenB]); const selectedFeeRate = useMemo(() => { - if (!feeRate) { + if (!feeTier) { return null; } - return `${feeRate}%`; - }, [feeRate]); + return SwapFeeTierInfoMap[feeTier].rateStr; + }, [feeTier]); const selectedPriceRange = useMemo(() => { if (!priceRange) { return null; } - return `${priceRange}`; + return `${priceRange.type}`; }, [priceRange]); - const selectableCustomPriceRange = useMemo(() => { - if (priceRange !== "Custom") { - return false; - } - if (!tokenA || !tokenB) { - return false; - } - return true; - }, [priceRange, tokenA, tokenB]); - const toggleSelectPair = useCallback(() => { setOpenedSelectPair(!openedSelectPair); }, [openedSelectPair]); @@ -103,6 +97,37 @@ const EarnAddLiquidity: React.FC = ({ setOpenedPriceRange(!openedPriceRange); }, [openedPriceRange]); + const activatedSubmit = useMemo(() => { + switch (submitType) { + case "CREATE_POOL": + case "ADD_LIQUIDITY": + case "CONNECT_WALLET": + return true; + default: + return false; + } + }, [submitType]); + + const submitButtonStr = useMemo(() => { + switch (submitType) { + case "CREATE_POOL": + return "Create Pool"; + case "ADD_LIQUIDITY": + return "Add Liquidity"; + case "CONNECT_WALLET": + return "Connect Wallet"; + case "INVALID_PAIR": + return "Invalid Pair"; + case "INSUFFICIENT_BALANCE": + return "Insufficient Balance"; + case "INVALID_RANGE": + return "Invalid Range"; + case "ENTER_AMOUNT": + default: + return "Enter Amount"; + } + }, [submitType]); + return (

Add Liquidity

@@ -112,8 +137,8 @@ const EarnAddLiquidity: React.FC = ({
1. Select Pair
{existTokenPair && ( )} @@ -122,8 +147,8 @@ const EarnAddLiquidity: React.FC = ({ )} @@ -142,7 +167,8 @@ const EarnAddLiquidity: React.FC = ({ {openedFeeTier && ( )} @@ -161,18 +187,9 @@ const EarnAddLiquidity: React.FC = ({ {openedPriceRange && ( - )} - - {selectableCustomPriceRange && ( - )} @@ -187,18 +204,18 @@ const EarnAddLiquidity: React.FC = ({