1
0
mirror of https://github.com/oceanprotocol/market.git synced 2024-12-02 05:57:29 +01:00

add/remove baseToken only

This commit is contained in:
Matthias Kretschmann 2022-01-24 14:27:28 +00:00
parent c140cdc82c
commit 4dc188d3e4
Signed by: m
GPG Key ID: 606EEEF3C479A91F
7 changed files with 44 additions and 156 deletions

View File

@ -50,7 +50,7 @@ export default function Actions({
<TokenApproval <TokenApproval
actionButton={actionButton} actionButton={actionButton}
amount={amount} amount={amount}
coin={coin} coin={coin || 'OCEAN'}
disabled={isDisabled} disabled={isDisabled}
/> />
) : ( ) : (

View File

@ -8,11 +8,9 @@ import {
useFormikContext useFormikContext
} from 'formik' } from 'formik'
import Button from '@shared/atoms/Button' import Button from '@shared/atoms/Button'
import CoinSelect from '../CoinSelect'
import { FormAddLiquidity } from '.' import { FormAddLiquidity } from '.'
import UserLiquidity from '../../UserLiquidity' import UserLiquidity from '../../UserLiquidity'
import { useWeb3 } from '@context/Web3' import { useWeb3 } from '@context/Web3'
import { isValidNumber } from '@utils/numbers' import { isValidNumber } from '@utils/numbers'
import Decimal from 'decimal.js' import Decimal from 'decimal.js'
import { useAsset } from '@context/Asset' import { useAsset } from '@context/Asset'
@ -20,11 +18,8 @@ import { LoggerInstance, Pool } from '@oceanprotocol/lib'
export default function FormAdd({ export default function FormAdd({
tokenInAddress, tokenInAddress,
coin, tokenInSymbol,
dtBalance,
dtSymbol,
amountMax, amountMax,
setCoin,
setAmount, setAmount,
totalPoolTokens, totalPoolTokens,
totalBalance, totalBalance,
@ -33,11 +28,8 @@ export default function FormAdd({
setNewPoolShare setNewPoolShare
}: { }: {
tokenInAddress: string tokenInAddress: string
coin: string tokenInSymbol: string
dtBalance: string
dtSymbol: string
amountMax: string amountMax: string
setCoin: (value: string) => void
setAmount: (value: string) => void setAmount: (value: string) => void
totalPoolTokens: string totalPoolTokens: string
totalBalance: PoolBalance totalBalance: PoolBalance
@ -111,16 +103,12 @@ export default function FormAdd({
setNewPoolShare setNewPoolShare
]) ])
useEffect(() => {
setFieldValue('amount', undefined)
}, [coin])
return ( return (
<> <>
<UserLiquidity <UserLiquidity
amount={coin === 'OCEAN' ? balance.ocean : dtBalance} amount={balance.ocean}
amountMax={amountMax} amountMax={amountMax}
symbol={coin} symbol={tokenInSymbol}
/> />
<Field name="amount"> <Field name="amount">
@ -138,13 +126,7 @@ export default function FormAdd({
min="0" min="0"
value={`${values.amount}`} value={`${values.amount}`}
step="any" step="any"
prefix={ prefix={tokenInSymbol}
<CoinSelect
dtSymbol={dtSymbol}
setCoin={setCoin}
disabled={!web3 || !isAssetNetwork}
/>
}
placeholder="0" placeholder="0"
field={field} field={field}
form={form} form={form}
@ -154,7 +136,7 @@ export default function FormAdd({
)} )}
</Field> </Field>
{(Number(balance.ocean) || dtBalance) > (values.amount || 0) && ( {Number(balance.ocean) && (
<Button <Button
className={styles.buttonMax} className={styles.buttonMax}
style="text" style="text"

View File

@ -13,8 +13,7 @@ export default function Output({
swapFee, swapFee,
dtSymbol, dtSymbol,
totalPoolTokens, totalPoolTokens,
totalBalance, totalBalance
coin
}: { }: {
newPoolTokens: string newPoolTokens: string
newPoolShare: string newPoolShare: string
@ -22,7 +21,6 @@ export default function Output({
dtSymbol: string dtSymbol: string
totalPoolTokens: string totalPoolTokens: string
totalBalance: PoolBalance totalBalance: PoolBalance
coin: string
}): ReactElement { }): ReactElement {
const { help, titleIn, titleOut } = content.pool.add.output const { help, titleIn, titleOut } = content.pool.add.output
@ -37,21 +35,14 @@ export default function Output({
return return
const newPoolSupply = new Decimal(totalPoolTokens).plus(newPoolTokens) const newPoolSupply = new Decimal(totalPoolTokens).plus(newPoolTokens)
const ratio = new Decimal(newPoolTokens).div(newPoolSupply) const ratio = new Decimal(newPoolTokens).div(newPoolSupply)
const newOceanReserve = const newOceanReserve = new Decimal(totalBalance.ocean).plus(values.amount)
coin === 'OCEAN' const newDtReserve = new Decimal(totalBalance.datatoken)
? new Decimal(totalBalance.ocean).plus(values.amount)
: new Decimal(totalBalance.ocean)
const newDtReserve =
coin === 'OCEAN'
? new Decimal(totalBalance.datatoken)
: new Decimal(totalBalance.datatoken).plus(values.amount)
const poolOcean = newOceanReserve.mul(ratio).toString() const poolOcean = newOceanReserve.mul(ratio).toString()
const poolDatatoken = newDtReserve.mul(ratio).toString() const poolDatatoken = newDtReserve.mul(ratio).toString()
setPoolOcean(poolOcean) setPoolOcean(poolOcean)
setPoolDatatoken(poolDatatoken) setPoolDatatoken(poolDatatoken)
}, [ }, [
values.amount, values.amount,
coin,
totalBalance, totalBalance,
totalPoolTokens, totalPoolTokens,
newPoolShare, newPoolShare,

View File

@ -13,7 +13,8 @@ import DebugOutput from '@shared/DebugOutput'
import { useWeb3 } from '@context/Web3' import { useWeb3 } from '@context/Web3'
import { useAsset } from '@context/Asset' import { useAsset } from '@context/Asset'
import content from '../../../../../../content/price.json' import content from '../../../../../../content/price.json'
import { Datatoken, LoggerInstance, Pool } from '@oceanprotocol/lib' import { LoggerInstance, Pool } from '@oceanprotocol/lib'
import { getOceanConfig } from '@utils/ocean'
export interface FormAddLiquidity { export interface FormAddLiquidity {
amount: number amount: number
@ -30,7 +31,7 @@ export default function Add({
totalBalance, totalBalance,
swapFee, swapFee,
dtSymbol, dtSymbol,
dtAddress, baseTokenSymbol,
fetchAllData fetchAllData
}: { }: {
setShowAdd: (show: boolean) => void setShowAdd: (show: boolean) => void
@ -39,15 +40,13 @@ export default function Add({
totalBalance: PoolBalance totalBalance: PoolBalance
swapFee: string swapFee: string
dtSymbol: string dtSymbol: string
dtAddress: string baseTokenSymbol: string
fetchAllData: () => void fetchAllData: () => void
}): ReactElement { }): ReactElement {
const { accountId, balance, web3 } = useWeb3() const { accountId, balance, web3 } = useWeb3()
const { isAssetNetwork } = useAsset() const { isAssetNetwork } = useAsset()
const { debug } = useUserPreferences() const { debug } = useUserPreferences()
const [txId, setTxId] = useState<string>() const [txId, setTxId] = useState<string>()
const [coin, setCoin] = useState('OCEAN')
const [dtBalance, setDtBalance] = useState<string>()
const [amountMax, setAmountMax] = useState<string>() const [amountMax, setAmountMax] = useState<string>()
const [amount, setAmount] = useState<string>('0') const [amount, setAmount] = useState<string>('0')
const [newPoolTokens, setNewPoolTokens] = useState('0') const [newPoolTokens, setNewPoolTokens] = useState('0')
@ -62,62 +61,37 @@ export default function Add({
.min(0.00001, (param) => `Must be more or equal to ${param.min}`) .min(0.00001, (param) => `Must be more or equal to ${param.min}`)
.max( .max(
Number(amountMax), Number(amountMax),
`Maximum you can add is ${Number(amountMax).toFixed(2)} ${coin}` `Maximum you can add is ${Number(amountMax).toFixed(2)} OCEAN`
) )
.required('Required') .required('Required')
}) })
// Get datatoken balance when datatoken selected // Get maximum amount for OCEAN
useEffect(() => {
if (!web3 || !accountId || !isAssetNetwork || coin === 'OCEAN') return
async function getDtBalance() {
const datatokenInstance = new Datatoken(web3)
const dtBalance = await datatokenInstance.balance(dtAddress, accountId)
setDtBalance(dtBalance)
}
getDtBalance()
}, [web3, accountId, dtAddress, coin, isAssetNetwork])
// Get maximum amount for either OCEAN or datatoken
useEffect(() => { useEffect(() => {
if (!web3 || !accountId || !isAssetNetwork || !poolAddress) return if (!web3 || !accountId || !isAssetNetwork || !poolAddress) return
async function getMaximum() { async function getMaximum() {
const poolInstance = new Pool(web3, LoggerInstance) try {
const baseTokenAddress = await poolInstance.getBasetoken(poolAddress) const poolInstance = new Pool(web3, LoggerInstance)
const tokenInAddress = coin === 'OCEAN' ? baseTokenAddress : dtAddress const tokenInAddress = await poolInstance.getBasetoken(poolAddress)
setTokenInAddress(tokenInAddress) setTokenInAddress(tokenInAddress)
const amountMaxPool = await poolInstance.getReserve( const amountMaxPool = await poolInstance.getReserve(
poolAddress, poolAddress,
tokenInAddress tokenInAddress
) )
// coin === 'OCEAN' const amountMax =
// ? await poolInstance.getOceanMaxAddLiquidity(poolAddress) Number(balance.ocean) > Number(amountMaxPool)
// : await poolInstance.getDTMaxAddLiquidity(poolAddress)
const amountMax =
coin === 'OCEAN'
? Number(balance.ocean) > Number(amountMaxPool)
? amountMaxPool ? amountMaxPool
: balance.ocean : balance.ocean
: Number(dtBalance) > Number(amountMaxPool) setAmountMax(Number(amountMax).toFixed(3))
? amountMaxPool } catch (error) {
: dtBalance LoggerInstance.error(error.message)
setAmountMax(Number(amountMax).toFixed(3)) }
} }
getMaximum() getMaximum()
}, [ }, [web3, accountId, isAssetNetwork, poolAddress, balance?.ocean])
web3,
accountId,
isAssetNetwork,
poolAddress,
dtAddress,
coin,
dtBalance,
balance.ocean
])
// Submit // Submit
async function handleAddLiquidity(amount: number, resetForm: () => void) { async function handleAddLiquidity(amount: number, resetForm: () => void) {
@ -133,10 +107,10 @@ export default function Add({
minPoolAmountOut minPoolAmountOut
) )
setTxId(result?.transactionHash) setTxId(result?.transactionHash)
// resetForm()
fetchAllData() fetchAllData()
resetForm()
} catch (error) { } catch (error) {
console.error(error.message) LoggerInstance.error(error.message)
toast.error(error.message) toast.error(error.message)
} }
} }
@ -161,11 +135,8 @@ export default function Add({
{isWarningAccepted ? ( {isWarningAccepted ? (
<FormAdd <FormAdd
tokenInAddress={tokenInAddress} tokenInAddress={tokenInAddress}
coin={coin} tokenInSymbol={baseTokenSymbol}
dtBalance={dtBalance}
dtSymbol={dtSymbol}
amountMax={amountMax} amountMax={amountMax}
setCoin={setCoin}
setAmount={setAmount} setAmount={setAmount}
totalPoolTokens={totalPoolTokens} totalPoolTokens={totalPoolTokens}
totalBalance={totalBalance} totalBalance={totalBalance}
@ -196,7 +167,6 @@ export default function Add({
dtSymbol={dtSymbol} dtSymbol={dtSymbol}
totalPoolTokens={totalPoolTokens} totalPoolTokens={totalPoolTokens}
totalBalance={totalBalance} totalBalance={totalBalance}
coin={coin}
/> />
<Actions <Actions
@ -212,7 +182,6 @@ export default function Add({
actionName={content.pool.add.action} actionName={content.pool.add.action}
action={submitForm} action={submitForm}
amount={amount} amount={amount}
coin={coin}
txId={txId} txId={txId}
/> />
{debug && <DebugOutput title="Collected values" output={values} />} {debug && <DebugOutput title="Collected values" output={values} />}

View File

@ -1,26 +0,0 @@
.coinSelect {
composes: select from '@shared/FormInput/InputElement.module.css';
font-size: var(--font-size-small);
font-weight: var(--font-weight-base);
border: none;
margin-left: -0.5rem;
margin-right: -0.5rem;
background-color: var(--background-highlight);
width: auto;
padding: 0 1.25rem 0 0.25rem;
height: 41px;
text-align: center;
/* custom arrow, without the divider line */
background-image: linear-gradient(
45deg,
transparent 50%,
var(--font-color-text) 50%
),
linear-gradient(135deg, var(--font-color-text) 50%, transparent 50%);
background-position: calc(100% - 14px) 1.2rem, calc(100% - 9px) 1.2rem, 100% 0;
}
.option {
color: var(--font-color-heading);
}

View File

@ -1,27 +0,0 @@
import React, { ReactElement } from 'react'
import styles from './CoinSelect.module.css'
export default function CoinSelect({
dtSymbol,
disabled,
setCoin
}: {
dtSymbol: string
disabled: boolean
setCoin: (coin: string) => void
}): ReactElement {
return (
<select
className={styles.coinSelect}
onChange={(e) => setCoin(e.target.value)}
disabled={disabled}
>
<option className={styles.option} value="OCEAN">
OCEAN
</option>
<option className={styles.option} value={dtSymbol}>
{dtSymbol}
</option>
</select>
)
}

View File

@ -32,7 +32,7 @@ interface PoolInfo {
weightOcean: string weightOcean: string
weightDt: string weightDt: string
dtSymbol: string dtSymbol: string
oceanSymbol: string baseTokenSymbol: string
totalPoolTokens: string totalPoolTokens: string
totalLiquidityInOcean: Decimal totalLiquidityInOcean: Decimal
} }
@ -161,7 +161,7 @@ export default function Pool(): ReactElement {
weightOcean: getWeight(poolData.baseTokenWeight), weightOcean: getWeight(poolData.baseTokenWeight),
weightDt: getWeight(poolData.datatokenWeight), weightDt: getWeight(poolData.datatokenWeight),
dtSymbol: poolData.datatoken.symbol, dtSymbol: poolData.datatoken.symbol,
oceanSymbol: poolData.baseToken.symbol, baseTokenSymbol: poolData.baseToken.symbol,
totalPoolTokens: poolData.totalShares, totalPoolTokens: poolData.totalShares,
totalLiquidityInOcean totalLiquidityInOcean
} }
@ -327,7 +327,6 @@ export default function Pool(): ReactElement {
// //
useEffect(() => { useEffect(() => {
if (!owner || !accountId) return if (!owner || !accountId) return
setIsRemoveDisabled(isInPurgatory && owner === accountId) setIsRemoveDisabled(isInPurgatory && owner === accountId)
}, [isInPurgatory, owner, accountId]) }, [isInPurgatory, owner, accountId])
@ -337,14 +336,14 @@ export default function Pool(): ReactElement {
<Add <Add
setShowAdd={setShowAdd} setShowAdd={setShowAdd}
poolAddress={price?.address} poolAddress={price?.address}
totalPoolTokens={poolInfo.totalPoolTokens} totalPoolTokens={poolInfo?.totalPoolTokens}
totalBalance={{ totalBalance={{
ocean: new Decimal(price?.ocean).toString(), ocean: new Decimal(price?.ocean).toString(),
datatoken: new Decimal(price?.datatoken).toString() datatoken: new Decimal(price?.datatoken).toString()
}} }}
swapFee={poolInfo.poolFee} swapFee={poolInfo?.poolFee}
dtSymbol={poolInfo.dtSymbol} dtSymbol={poolInfo?.dtSymbol}
dtAddress={ddo?.services[0].datatokenAddress} baseTokenSymbol={poolInfo?.baseTokenSymbol}
fetchAllData={fetchAllData} fetchAllData={fetchAllData}
/> />
) : showRemove ? ( ) : showRemove ? (
@ -362,7 +361,7 @@ export default function Pool(): ReactElement {
<PriceUnit price="1" symbol={poolInfo?.dtSymbol} /> ={' '} <PriceUnit price="1" symbol={poolInfo?.dtSymbol} /> ={' '}
<PriceUnit <PriceUnit
price={`${price?.value}`} price={`${price?.value}`}
symbol={poolInfo?.oceanSymbol} symbol={poolInfo?.baseTokenSymbol}
/> />
<Tooltip content={content.pool.tooltips.price} /> <Tooltip content={content.pool.tooltips.price} />
<div className={styles.dataTokenLinks}> <div className={styles.dataTokenLinks}>
@ -398,7 +397,7 @@ export default function Pool(): ReactElement {
</> </>
} }
ocean={`${poolInfoUser?.liquidity?.ocean}`} ocean={`${poolInfoUser?.liquidity?.ocean}`}
oceanSymbol={poolInfo?.oceanSymbol} oceanSymbol={poolInfo?.baseTokenSymbol}
dt={`${poolInfoUser?.liquidity?.datatoken}`} dt={`${poolInfoUser?.liquidity?.datatoken}`}
dtSymbol={poolInfo?.dtSymbol} dtSymbol={poolInfo?.dtSymbol}
poolShares={poolInfoUser?.poolShares} poolShares={poolInfoUser?.poolShares}
@ -415,7 +414,7 @@ export default function Pool(): ReactElement {
<TokenList <TokenList
title="Pool Creator Statistics" title="Pool Creator Statistics"
ocean={`${poolInfoOwner?.liquidity?.ocean}`} ocean={`${poolInfoOwner?.liquidity?.ocean}`}
oceanSymbol={poolInfo?.oceanSymbol} oceanSymbol={poolInfo?.baseTokenSymbol}
dt={`${poolInfoOwner?.liquidity?.datatoken}`} dt={`${poolInfoOwner?.liquidity?.datatoken}`}
dtSymbol={poolInfo?.dtSymbol} dtSymbol={poolInfo?.dtSymbol}
poolShares={poolInfoOwner?.poolShares} poolShares={poolInfoOwner?.poolShares}
@ -444,7 +443,7 @@ export default function Pool(): ReactElement {
</> </>
} }
ocean={`${price?.ocean}`} ocean={`${price?.ocean}`}
oceanSymbol={poolInfo?.oceanSymbol} oceanSymbol={poolInfo?.baseTokenSymbol}
dt={`${price?.datatoken}`} dt={`${price?.datatoken}`}
dtSymbol={poolInfo?.dtSymbol} dtSymbol={poolInfo?.dtSymbol}
poolShares={poolInfo?.totalPoolTokens} poolShares={poolInfo?.totalPoolTokens}