diff --git a/env.json b/env.json index 35d13fe4b..a4d19123c 100644 --- a/env.json +++ b/env.json @@ -9,7 +9,7 @@ "moonpay": true, "charts": false }, - "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora", + "SUBQUERY_ENDPOINT": "https://subquery.q1.sora2.soramitsu.co.jp", "DEFAULT_NETWORKS": [ { "chain": "SORA", diff --git a/src/store/demeterFarming/getters.ts b/src/store/demeterFarming/getters.ts index 9447d44e5..44b108419 100644 --- a/src/store/demeterFarming/getters.ts +++ b/src/store/demeterFarming/getters.ts @@ -58,7 +58,7 @@ const getters = defineGetters()({ if (!pools[poolAsset]) return FPNumber.ZERO; return pools[poolAsset].reduce((value, accountPool) => { - return value.add(accountPool.pooledTokens); + return FPNumber.max(value, accountPool.pooledTokens) as FPNumber; }, FPNumber.ZERO); }; }, diff --git a/src/store/removeLiquidity/actions.ts b/src/store/removeLiquidity/actions.ts index f6966ecde..062084059 100644 --- a/src/store/removeLiquidity/actions.ts +++ b/src/store/removeLiquidity/actions.ts @@ -65,18 +65,14 @@ const actions = defineActions({ if (!state.focusedField || state.focusedField === 'removePart') { commit.setFocusedField('removePart'); - const part = new FPNumber(Math.round(removePart)); + const partAmount = new FPNumber(Math.round(removePart)); if (removePart) { - const hundred = FPNumber.HUNDRED; - commit.setRemovePart(part.toNumber()); - commit.setLiquidityAmount(part.div(hundred).mul(FPNumber.fromCodecValue(getters.liquidityBalance)).toString()); - commit.setFirstTokenAmount( - part.div(hundred).mul(FPNumber.fromCodecValue(getters.firstTokenBalance)).toString() - ); - commit.setSecondTokenAmount( - part.div(hundred).mul(FPNumber.fromCodecValue(getters.secondTokenBalance)).toString() - ); + const part = partAmount.div(FPNumber.HUNDRED); + commit.setRemovePart(partAmount.toNumber()); + commit.setLiquidityAmount(part.mul(getters.liquidityBalance).toString()); + commit.setFirstTokenAmount(part.mul(getters.firstTokenBalance).toString()); + commit.setSecondTokenAmount(part.mul(getters.secondTokenBalance).toString()); } else { commit.setRemovePart(); commit.setLiquidityAmount(); @@ -94,11 +90,11 @@ const actions = defineActions({ commit.setFocusedField('firstTokenAmount'); if (firstTokenAmount) { if (!Number.isNaN(firstTokenAmount)) { - const part = new FPNumber(firstTokenAmount).div(FPNumber.fromCodecValue(getters.firstTokenBalance)); + const part = new FPNumber(firstTokenAmount).div(getters.firstTokenBalance); commit.setRemovePart(Math.round(part.mul(FPNumber.HUNDRED).toNumber())); - commit.setLiquidityAmount(part.mul(FPNumber.fromCodecValue(getters.liquidityBalance)).toString()); + commit.setLiquidityAmount(part.mul(getters.liquidityBalance).toString()); commit.setFirstTokenAmount(firstTokenAmount); - commit.setSecondTokenAmount(part.mul(FPNumber.fromCodecValue(getters.secondTokenBalance)).toString()); + commit.setSecondTokenAmount(part.mul(getters.secondTokenBalance).toString()); } } else { commit.setFirstTokenAmount(); @@ -114,10 +110,10 @@ const actions = defineActions({ commit.setFocusedField('secondTokenAmount'); if (secondTokenAmount) { if (!Number.isNaN(secondTokenAmount)) { - const part = new FPNumber(secondTokenAmount).div(FPNumber.fromCodecValue(getters.secondTokenBalance)); + const part = new FPNumber(secondTokenAmount).div(getters.secondTokenBalance); commit.setRemovePart(Math.round(part.mul(FPNumber.HUNDRED).toNumber())); - commit.setLiquidityAmount(part.mul(FPNumber.fromCodecValue(getters.liquidityBalance)).toString()); - commit.setFirstTokenAmount(part.mul(FPNumber.fromCodecValue(getters.firstTokenBalance)).toString()); + commit.setLiquidityAmount(part.mul(getters.liquidityBalance).toString()); + commit.setFirstTokenAmount(part.mul(getters.firstTokenBalance).toString()); commit.setSecondTokenAmount(secondTokenAmount); } } else { diff --git a/src/store/removeLiquidity/getters.ts b/src/store/removeLiquidity/getters.ts index 6ac50eb71..c140871dd 100644 --- a/src/store/removeLiquidity/getters.ts +++ b/src/store/removeLiquidity/getters.ts @@ -15,31 +15,35 @@ const getters = defineGetters()({ (liquidity) => liquidity.firstAddress === firstTokenAddress && liquidity.secondAddress === secondTokenAddress ); }, - liquidityBalanceFreePart(...args): FPNumber { + // Liquidity full balance (without locked balance) + liquidityBalanceFull(...args): FPNumber { + const { getters } = removeLiquidityGetterContext(args); + + if (!getters.liquidity?.balance) return FPNumber.ZERO; + + return FPNumber.fromCodecValue(getters.liquidity.balance); + }, + // Liquidity locked balance + liquidityBalanceLocked(...args): FPNumber { const { getters, rootGetters } = removeLiquidityGetterContext(args); - if (!rootGetters.demeterFarming || !getters.liquidity) return FPNumber.ONE; + if (!rootGetters.demeterFarming || !getters.liquidity) return FPNumber.ZERO; const poolAsset = getters.liquidity.secondAddress; - const balance = FPNumber.fromCodecValue(getters.liquidity.balance); - const lockedAmount = rootGetters.demeterFarming.getLockedAmount(poolAsset, true); - const maxLocked = FPNumber.min(balance, lockedAmount); + const lockedBalance = rootGetters.demeterFarming.getLockedAmount(poolAsset, true); + const balance = getters.liquidityBalanceFull; + const maxLocked = FPNumber.min(balance, lockedBalance) as FPNumber; - return balance.sub(maxLocked).div(balance); + return maxLocked; }, - liquidityBalance(...args): CodecString { + // Liqudity free balance (full - locked) + liquidityBalance(...args): FPNumber { const { getters } = removeLiquidityGetterContext(args); - if (!getters.liquidity?.balance) return ZeroStringValue; + const balance = getters.liquidityBalanceFull; + const lockedBalance = getters.liquidityBalanceLocked; - const balance = FPNumber.fromCodecValue(getters.liquidity.balance); - const freePart = getters.liquidityBalanceFreePart; - - return balance.mul(freePart).toCodecString(); - }, - liquidityDecimals(...args): number { - const { getters } = removeLiquidityGetterContext(args); - return getters.liquidity?.decimals ?? 0; + return balance.sub(lockedBalance); }, firstToken(...args): Nullable { const { getters, rootGetters } = removeLiquidityGetterContext(args); @@ -57,30 +61,30 @@ const getters = defineGetters()({ } return rootGetters.assets.assetDataByAddress(secondAddress); }, - firstTokenBalance(...args): CodecString { + // First token free balance + firstTokenBalance(...args): FPNumber { const { getters } = removeLiquidityGetterContext(args); - if (!getters.liquidity?.firstBalance) return ZeroStringValue; + if (!getters.liquidity?.firstBalance) return FPNumber.ZERO; - const balance = FPNumber.fromCodecValue(getters.liquidity.firstBalance, getters.firstToken?.decimals); - const freePart = getters.liquidityBalanceFreePart; + const tokenBalance = FPNumber.fromCodecValue(getters.liquidity.firstBalance, getters.firstToken?.decimals); - return balance.mul(freePart).toCodecString(); + return tokenBalance.mul(getters.liquidityBalance).div(getters.liquidityBalanceFull); }, - secondTokenBalance(...args): CodecString { + // Second token free balance + secondTokenBalance(...args): FPNumber { const { getters } = removeLiquidityGetterContext(args); - if (!getters.liquidity?.secondBalance) return ZeroStringValue; + if (!getters.liquidity?.secondBalance) return FPNumber.ZERO; - const balance = FPNumber.fromCodecValue(getters.liquidity.secondBalance, getters.secondToken?.decimals); - const freePart = getters.liquidityBalanceFreePart; + const tokenBalance = FPNumber.fromCodecValue(getters.liquidity.secondBalance, getters.secondToken?.decimals); - return balance.mul(freePart).toCodecString(); + return tokenBalance.mul(getters.liquidityBalance).div(getters.liquidityBalanceFull); }, shareOfPool(...args): string { const { state, getters } = removeLiquidityGetterContext(args); - const balance = FPNumber.fromCodecValue(getters.liquidityBalance); + const balance = getters.liquidityBalanceFull; const removed = new FPNumber(state.liquidityAmount ?? 0); const totalSupply = FPNumber.fromCodecValue(state.totalSupply); const totalSupplyAfter = totalSupply.sub(removed); diff --git a/src/views/RemoveLiquidity.vue b/src/views/RemoveLiquidity.vue index f1775589d..9383c09a5 100644 --- a/src/views/RemoveLiquidity.vue +++ b/src/views/RemoveLiquidity.vue @@ -198,14 +198,14 @@ export default class RemoveLiquidity extends Mixins( @state.prices.priceReversed priceReversed!: string; @getter.assets.xor private xor!: Nullable; - @getter.removeLiquidity.liquidityBalance private liquidityBalance!: CodecString; + @getter.removeLiquidity.liquidityBalanceFull private liquidityBalanceFull!: FPNumber; + @getter.removeLiquidity.liquidityBalance private liquidityBalance!: FPNumber; @getter.removeLiquidity.liquidity liquidity!: AccountLiquidity; @getter.removeLiquidity.firstToken firstToken!: Asset; @getter.removeLiquidity.secondToken secondToken!: Asset; - @getter.removeLiquidity.firstTokenBalance firstTokenBalance!: CodecString; - @getter.removeLiquidity.secondTokenBalance secondTokenBalance!: CodecString; + @getter.removeLiquidity.firstTokenBalance firstTokenBalance!: FPNumber; + @getter.removeLiquidity.secondTokenBalance secondTokenBalance!: FPNumber; @getter.removeLiquidity.shareOfPool shareOfPool!: string; - @getter.removeLiquidity.liquidityBalanceFreePart liquidityBalanceFreePart!: FPNumber; @mutation.removeLiquidity.setFocusedField setFocusedField!: (field: FocusedField) => void; @mutation.removeLiquidity.resetFocusedField resetFocusedField!: VoidFunction; @@ -288,26 +288,30 @@ export default class RemoveLiquidity extends Mixins( } get liquidityLocked(): boolean { - return this.liquidityBalanceFreePart.isZero(); + return this.liquidityBalance.isZero(); } get hasLockedPart(): boolean { - return FPNumber.isLessThan(this.liquidityBalanceFreePart, FPNumber.ONE); + return FPNumber.isLessThan(this.liquidityBalance, this.liquidityBalanceFull); } get liquidityBalanceLockedPercent() { - return FPNumber.ONE.sub(this.liquidityBalanceFreePart).mul(FPNumber.HUNDRED).toLocaleString() + '%'; + return ( + this.liquidityBalanceFull + .sub(this.liquidityBalance) + .div(this.liquidityBalanceFull) + .mul(FPNumber.HUNDRED) + .toLocaleString() + '%' + ); } get isInsufficientBalance(): boolean { - const balance = this.getFPNumberFromCodec(this.liquidityBalance); - const firstTokenBalance = this.getFPNumberFromCodec(this.firstTokenBalance); - const secondTokenBalance = this.getFPNumberFromCodec(this.secondTokenBalance); + const { liquidityBalance, firstTokenBalance, secondTokenBalance } = this; const amount = this.getFPNumber(this.liquidityAmount); const firstTokenAmount = this.getFPNumber(this.firstTokenAmount); const secondTokenAmount = this.getFPNumber(this.secondTokenAmount); return ( - FPNumber.gt(amount, balance) || + FPNumber.gt(amount, liquidityBalance) || FPNumber.gt(firstTokenAmount, firstTokenBalance) || FPNumber.gt(secondTokenAmount, secondTokenBalance) ); @@ -354,16 +358,12 @@ export default class RemoveLiquidity extends Mixins( } } - getTokenMaxAmount(tokenBalance: CodecString, decimals?: number): string | undefined { - if (!tokenBalance) { - return undefined; - } - return this.getStringFromCodec(tokenBalance, decimals); + getTokenMaxAmount(tokenBalance: FPNumber): string { + return tokenBalance.toString(); } private updatePrices(): void { - const firstTokenBalance = this.getFPNumberFromCodec(this.firstTokenBalance); - const secondTokenBalance = this.getFPNumberFromCodec(this.secondTokenBalance); + const { firstTokenBalance, secondTokenBalance } = this; this.getPrices({ assetAAddress: this.firstTokenAddress ?? this.firstToken.address, assetBAddress: this.secondTokenAddress ?? this.secondToken.address,