diff --git a/env.json b/env.json index c2af9f9ca..fda3aa336 100644 --- a/env.json +++ b/env.json @@ -13,7 +13,7 @@ "x1ex": false, "charts": true, "soraCard": false, - "orderBook": false + "orderBook": true }, "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod", "SUBSQUID_ENDPOINT": "", diff --git a/package.json b/package.json index beb97859c..faf3de013 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "polkaswap-exchange-web", - "version": "1.30.0", + "version": "1.31.0", "repository": { "type": "git", "url": "https://github.com/sora-xor/polkaswap-exchange-web.git" diff --git a/public/env.json b/public/env.json index 7386257fd..82fbb0c12 100644 --- a/public/env.json +++ b/public/env.json @@ -35,7 +35,7 @@ "address": "wss://ws.framenode-3.r0.dev.sora2.soramitsu.co.jp" } ], - "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-dev", + "SUBQUERY_ENDPOINT": "https://api.subquery.network/sq/sora-xor/sora-prod", "SUBSQUID_ENDPOINT": "https://squid.subsquid.io/sora-dev/v/v1/graphql", "NETWORK_TYPE": "Dev", "CHAIN_GENESIS_HASH": "", diff --git a/src/components/mixins/BridgeMixin.ts b/src/components/mixins/BridgeMixin.ts index 31128d8ea..b9a99fb5e 100644 --- a/src/components/mixins/BridgeMixin.ts +++ b/src/components/mixins/BridgeMixin.ts @@ -37,6 +37,10 @@ export default class BridgeMixin extends Mixins(mixins.LoadingMixin, WalletConne return this.nativeToken?.externalDecimals; } + get isNativeTokenSelected(): boolean { + return this.nativeToken?.address === this.asset?.address; + } + get assetLockedOnSora(): boolean { return !subBridgeApi.isSoraParachain(this.networkSelected as SubNetwork); } diff --git a/src/components/pages/OrderBook/BookWidget.vue b/src/components/pages/OrderBook/BookWidget.vue index 9a193bdec..b9746da11 100644 --- a/src/components/pages/OrderBook/BookWidget.vue +++ b/src/components/pages/OrderBook/BookWidget.vue @@ -14,7 +14,7 @@ price)) as FPNumber; - - if (!maxPrice) return orders; - - const step = new FPNumber(precision); - - const aggregatedOrders = [] as Array; - let accumulatedAmount = FPNumber.ZERO; - let accumulatedTotal = FPNumber.ZERO; - let edge = maxPrice.add(step); - - if (!edge.isZeroMod(step)) edge = edge.sub(edge.mod(step)); - - for (let index = 0; index < orders.length; index++) { - const [price, amount] = orders[index]; - - if (FPNumber.lte(edge, FPNumber.ZERO)) break; - if (FPNumber.lt(edge, price)) break; - - if (FPNumber.lte(price, edge) && FPNumber.gt(price, edge.sub(step))) { - accumulatedAmount = accumulatedAmount.add(amount); - accumulatedTotal = price.mul(amount).add(accumulatedTotal); - } else { - aggregatedOrders.push([edge, accumulatedAmount, accumulatedTotal]); - - accumulatedAmount = FPNumber.ZERO; - accumulatedTotal = FPNumber.ZERO; - edge = edge.sub(step); - index -= 1; - } - - if (index === orders.length - 1) { - aggregatedOrders.push([edge, accumulatedAmount, accumulatedTotal]); - } - } - - return aggregatedOrders.filter((row: OrderBookPriceVolumeAggregated) => !row[1].isZero()); + return orders; } get bookPrecision(): number { - return this.currentOrderBook?.tickSize?.toLocaleString()?.split(FPNumber.DELIMITERS_CONFIG.decimal)[1]?.length; + return this.currentOrderBook?.tickSize?.toLocaleString()?.split(FPNumber.DELIMITERS_CONFIG.decimal)[1]?.length || 0; + } + + get amountPrecision(): number { + return ( + this.currentOrderBook?.stepLotSize?.toLocaleString()?.split(FPNumber.DELIMITERS_CONFIG.decimal)[1]?.length || 0 + ); } private getAmountProportion(currentAmount: FPNumber, maxAmount: FPNumber): number { @@ -373,6 +304,10 @@ export default class BookWidget extends Mixins(TranslationMixin, mixins.LoadingM return cell.toNumber().toFixed(this.bookPrecision); } + private toAmountPrecision(cell: FPNumber): string { + return cell.toNumber().toFixed(this.amountPrecision); + } + private formatPriceVolumes(items: OrderBookPriceVolume[]): LimitOrderForm[] { if (!this.selectedStep) return []; const aggregated = this.calculateStepsDistribution(items, Number(this.selectedStep)); @@ -388,7 +323,7 @@ export default class BookWidget extends Mixins(TranslationMixin, mixins.LoadingM result.push({ price: this.toBookPrecision(price), - amount: this.toBookPrecision(amount), + amount: this.toAmountPrecision(amount), total: this.toBookPrecision(total), filled: this.getAmountProportion(amount, maxAmount), }); diff --git a/src/components/pages/OrderBook/BuySell.vue b/src/components/pages/OrderBook/BuySell.vue index 9ac9d20e5..faa627eb6 100644 --- a/src/components/pages/OrderBook/BuySell.vue +++ b/src/components/pages/OrderBook/BuySell.vue @@ -94,10 +94,8 @@ />
- {{ t('orderBook.total') }} -
- {{ amountAtPrice }} -
+ +
@@ -115,6 +113,7 @@ - {{ buttonText }} - + + + + + + + + + + + + + + + + + + @@ -179,12 +227,14 @@ import type { Subscription } from 'rxjs'; @Component({ components: { FormattedAmount: components.FormattedAmount, + InfoLine: components.InfoLine, TokenInput: lazyComponent(Components.TokenInput), PairTokenLogo: lazyComponent(Components.PairTokenLogo), PairListPopover: lazyComponent(Components.PairListPopover), PlaceConfirm: lazyComponent(Components.PlaceOrder), PlaceTransactionDetails: lazyComponent(Components.PlaceTransactionDetails), PriceChange: lazyComponent(Components.PriceChange), + Error: lazyComponent(Components.ErrorButton), }, }) export default class BuySellWidget extends Mixins(TranslationMixin, mixins.FormattedAmountMixin, mixins.LoadingMixin) { @@ -200,7 +250,7 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma @state.orderBook.amountSliderValue sliderValue!: number; @state.orderBook.userLimitOrders userLimitOrders!: Array; - @getter.assets.xor private xor!: AccountAsset; + @getter.assets.xor xor!: AccountAsset; @getter.orderBook.baseAsset baseAsset!: AccountAsset; @getter.orderBook.quoteAsset quoteAsset!: AccountAsset; @getter.orderBook.currentOrderBook currentOrderBook!: Nullable; @@ -315,65 +365,49 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma return this.limitOrderType === LimitOrderType.market; } - get hasExplainableError(): boolean { - return !!this.reason && !!this.reading; + get isBalanceLessThanStepSize(): boolean { + if (!this.currentOrderBook) return false; + + const { stepLotSize } = this.currentOrderBook; + const availableBalance = getMaxValue(this.baseAsset, this.networkFee); + + // if input accepts no decimals + if (!this.amountPrecision && this.baseValue === '0' && !this.isBuySide) { + return new FPNumber(availableBalance).lt(stepLotSize); + } + + return false; } - get shouldErrorTooltipBeShown(): boolean { - return this.isLoggedIn && this.hasExplainableError; + get hasExplainableError(): boolean { + return !!this.reason && !!this.reading; } - get amountAtPrice(): string { - if (this.buttonDisabled || !this.baseValue) return ''; - if (!this.quoteValue && !this.marketQuotePrice) return ''; + get formattedAmountAtPrice(): string { + if (!(this.baseValue && this.quoteValue)) return ''; return this.t('orderBook.tradingPair.total', { - amount: this.baseValue, + amount: this.formatStringValue(this.baseValue), symbol: this.baseSymbol, - amount2: this.quoteValue || this.marketQuotePrice, + amount2: this.formatStringValue(this.quoteValue || this.marketQuotePrice), symbol2: this.quoteSymbol, }); } - // TODO: [Rustem]: Refactor this function to reduce its Cognitive Complexity from 33 to the 15 allowed. [+22 locations]sonarlint(typescript:S3776) - get buttonText(): string { - if (!this.isLoggedIn) return this.t('connectWalletText'); - - if (this.bookStopped) return this.t('orderBook.stop'); - - if (this.userReachedSpotLimit || this.userReachedOwnLimit) return this.t('orderBook.cantPlaceOrder'); - - if (this.limitOrderType === LimitOrderType.limit) { - if (!this.quoteValue) return this.t('orderBook.setPrice'); - if (!this.baseValue || this.isZeroAmount) return this.t('orderBook.enterAmount'); - - // NOTE: corridor check could be enabled on blockchain later on; uncomment to return - // if (this.isPriceTooHigh || this.isPriceTooLow || !this.isPriceBeyondPrecision) { - // return this.t('orderBook.cantPlaceOrder'); - // } - - if (!this.isPriceBeyondPrecision) { - return this.t('orderBook.cantPlaceOrder'); - } - - if (this.orderBookStatus === OrderBookStatus.PlaceAndCancel) { - if (this.priceExceedsSpread) return this.t('orderBook.cantPlaceOrder'); - } - - if (this.limitForSinglePriceReached) return this.t('orderBook.cantPlaceOrder'); - } else { - if (this.isZeroAmount) return this.t('orderBook.enterAmount'); - if (!this.marketQuotePrice) return this.t('orderBook.cantPlaceOrder'); - } - - if (this.isOutOfAmountBounds) return this.t('orderBook.cantPlaceOrder'); + get formattedTotal(): string { + return this.getFPNumber(this.baseValue).mul(this.getFPNumber(this.quoteValue)).toLocaleString(); + } - if (this.isInsufficientXorForFee) return this.t('insufficientBalanceText', { tokenSymbol: this.xor?.symbol }); + get shouldErrorTooltipBeShown(): boolean { + return this.isLoggedIn && this.hasExplainableError; + } - if (this.isInsufficientBalance) return this.t('insufficientBalanceText', { tokenSymbol: this.tokenFrom?.symbol }); + get isLimitOrder(): boolean { + return this.limitOrderType === LimitOrderType.limit; + } - if (this.side === PriceVariant.Buy) return this.t('orderBook.Buy', { asset: this.baseAsset.symbol }); - else return this.t('orderBook.Sell', { asset: this.baseAsset.symbol }); + get isPlaceAndCancelMode(): boolean { + return this.orderBookStatus === OrderBookStatus.PlaceAndCancel; } setError({ reason, reading }): void { @@ -381,18 +415,13 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma this.reading = reading; } - // TODO: [Rustem] Refactor this function to reduce its Cognitive Complexity from 21 to the 15 allowed. [+14 locations]sonarlint(typescript:S3776) get buttonDisabled(): boolean { if (this.bookStopped) return true; - if (this.userReachedSpotLimit || this.userReachedOwnLimit || this.limitForSinglePriceReached) return true; + if (this.limitForSinglePriceReached || this.userReachedSpotLimit || this.userReachedOwnLimit) return true; if (!this.isLoggedIn) return false; - if (this.isInsufficientXorForFee) return true; - - if (this.isInsufficientBalance) return true; - if (this.limitOrderType === LimitOrderType.limit) { if (!this.baseValue || !this.quoteValue) return true; // NOTE: corridor check could be enabled on blockchain later on; uncomment to return @@ -403,32 +432,39 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma if (this.priceExceedsSpread) return true; } } else { - if (!this.baseValue) return true; // TODO: [Rustem] check with btn text + if (!this.baseValue) return true; if (!this.marketQuotePrice) return true; } - return this.isOutOfAmountBounds; + if (this.isOutOfAmountBounds || this.isInsufficientXorForFee || this.isInsufficientBalance) return true; + + return false; } - // TODO: [Rustem] Refactor this function to reduce its Cognitive Complexity from 16 to the 15 allowed. [+15 locations]sonarlint(typescript:S3776) async checkInputValidation(): Promise { this.setError({ reason: '', reading: '' }); if (this.orderBookStatus === OrderBookStatus.Stop) return; - if (this.userReachedSpotLimit) - return this.setError({ - reason: this.t('orderBook.error.spotLimit.reason'), - reading: this.t('orderBook.error.spotLimit.reading'), - }); + if (this.isLimitOrder) { + if ((await this.singlePriceReachedLimit()) && this.quoteValue) + return this.setError({ + reason: this.t('orderBook.error.singlePriceLimit.reason'), + reading: this.t('orderBook.error.singlePriceLimit.reading'), + }); - if (this.userReachedOwnLimit) - return this.setError({ - reason: this.t('orderBook.error.accountLimit.reason'), - reading: this.t('orderBook.error.accountLimit.reading'), - }); + if (this.userReachedOwnLimit) + return this.setError({ + reason: this.t('orderBook.error.accountLimit.reason'), + reading: this.t('orderBook.error.accountLimit.reading'), + }); - if (this.isInsufficientBalance || this.isInsufficientXorForFee) return; + if (this.userReachedSpotLimit) + return this.setError({ + reason: this.t('orderBook.error.spotLimit.reason'), + reading: this.t('orderBook.error.spotLimit.reading'), + }); + } // NOTE: corridor check could be enabled on blockchain later on; uncomment to return // if (this.isPriceTooHigh && this.quoteValue && this.baseValue) @@ -444,11 +480,14 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma // 'Price range alert: Your price is more than 50% above or below the current market price. Please enter a more closely aligned market price', // }); - if (!this.isPriceBeyondPrecision && this.baseValue) + if (!this.isPriceBeyondPrecision && this.baseValue && this.isLimitOrder) { + const { tickSize } = this.currentOrderBook as OrderBook; + return this.setError({ - reason: this.t('orderBook.error.beyondPrecision.reason'), - reading: this.t('orderBook.error.beyondPrecision.reading'), + reason: this.t('orderBook.error.multipleOf.reason'), + reading: this.t('orderBook.error.multipleOf.reading', { value: tickSize?.toString() }), }); + } if (this.isMarketType) { // wait until any market quote being set to avoid error appearance @@ -468,13 +507,7 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma reading: this.t('orderBook.error.exceedsSpread.reading'), }); - if ((await this.singlePriceReachedLimit()) && this.quoteValue) - return this.setError({ - reason: this.t('orderBook.error.singlePriceLimit.reason'), - reading: this.t('orderBook.error.singlePriceLimit.reading'), - }); - - if (!this.isZeroAmount && this.isOutOfAmountBounds && this.quoteValue) { + if ((!this.isZeroAmount && this.isOutOfAmountBounds && this.quoteValue) || this.isBalanceLessThanStepSize) { const { maxLotSize, minLotSize } = this.currentOrderBook as OrderBook; const { symbol } = this.baseAsset; @@ -488,18 +521,6 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma } } - async singlePriceReachedLimit(): Promise { - const limitReached = !(await api.orderBook.isOrderPlaceable( - this.baseAsset.address, - this.quoteAsset.address, - this.side, - this.quoteValue - )); - - this.limitForSinglePriceReached = limitReached; - return limitReached; - } - get priceExceedsSpread(): boolean { if (this.isBuySide) { if (!this.asks[this.asks.length - 1]) return false; @@ -680,16 +701,6 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma } } - formatInputValue(value: string, precision: number): string { - if (!value) return ''; - - const [_, decimal] = value.split('.'); - - if (value.endsWith('.') && precision === 0) return value.slice(0, -1); - - return value.endsWith('.') || decimal?.length <= precision ? value : new FPNumber(value).dp(precision).toString(); - } - get preparedForSwap(): boolean { return this.isLoggedIn && this.areTokensSelected; } @@ -735,17 +746,75 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma return ![OrderBookStatus.Trade, OrderBookStatus.PlaceAndCancel].includes(this.orderBookStatus); } + get isBuySide(): boolean { + return this.side === PriceVariant.Buy; + } + + get isMaxAmountAvailable(): boolean { + if (!(this.baseAsset && this.quoteAsset)) return false; + + return this.isLoggedIn && isMaxButtonAvailable(this.baseAsset, this.baseValue, this.networkFee, this.xor, true); + } + + get maxPossibleAmount(): FPNumber { + if (!this.currentOrderBook) return FPNumber.ZERO; + const max = getMaxValue(this.baseAsset, this.networkFee); + const maxLotSize: FPNumber = this.currentOrderBook.maxLotSize; + + const maxPossible = FPNumber.fromNatural(max, this.amountPrecision); + + if (this.isBuySide) return maxLotSize; + + return FPNumber.lte(maxPossible, maxLotSize) ? maxPossible : maxLotSize; + } + get userReachedSpotLimit(): boolean { - // TODO: [Rustem] Should be improved as user could put into existing price - return (this.side === PriceVariant.Sell ? this.asks : this.bids).length >= MAX_ORDERS_PER_SIDE; + if (this.isMarketType) return false; + + if ((this.side === PriceVariant.Sell ? this.asks : this.bids).length >= MAX_ORDERS_PER_SIDE && !!this.quoteValue) { + if (this.isPriceUnique(this.quoteValue)) return true; + + if (this.limitForSinglePriceReached) return true; + } + + return false; + } + + isPriceUnique(statedPrice: string): boolean { + const rawPrices = (!this.isBuySide ? this.asks : this.bids).map((priceVolume) => priceVolume[0]); + const prices = rawPrices.map((price) => price.toString()); + + return !prices.includes(statedPrice); } get userReachedOwnLimit(): boolean { + if (this.isMarketType) return false; + return this.userLimitOrders?.length === MAX_ORDERS_PER_USER; } - get isBuySide(): boolean { - return this.side === PriceVariant.Buy; + async singlePriceReachedLimit(): Promise { + if (this.isMarketType) return false; + + const limitReached = !(await api.orderBook.isOrderPlaceable( + this.baseAsset.address, + this.quoteAsset.address, + this.side, + this.quoteValue + )); + + this.limitForSinglePriceReached = limitReached; + return limitReached; + } + + formatInputValue(value: string, precision: number): string { + if (!value) return ''; + + const [_, decimal] = value.split('.'); + + if (value.endsWith('.') && precision === 0) return value.slice(0, -1); + + return value.endsWith('.') || decimal?.length <= precision ? value : new FPNumber(value).dp(precision).toString(); } private resetQuoteSubscription(): void { @@ -801,34 +870,6 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma this.checkInputValidation(); } - mounted(): void { - if (this.prevRoute === PageNames.Swap && this.tokenFrom?.address && this.tokenTo?.address) { - this.prevSwapFromAddress = this.tokenFrom?.address; - this.prevSwapToAddress = this.tokenTo?.address; - } - } - - beforeDestroy(): void { - this.resetQuoteSubscription(); - this.updateBalanceSubscription(true); - if (this.prevSwapFromAddress && this.prevSwapToAddress) { - this.setTokenFromAddress(this.prevSwapFromAddress); - this.setTokenToAddress(this.prevSwapToAddress); - } else { - this.setTokenFromAddress(this.xor.address); - this.resetTokenToAddress(); - } - this.setFromValue(''); - this.setToValue(''); - this.setQuoteValue(''); - this.setBaseValue(''); - this.setLiquiditySource(LiquiditySourceTypes.Default); - this.selectDexId(DexId.XOR); - this.setSide(PriceVariant.Buy); - this.setAmountSliderValue(0); - this.limitOrderType = LimitOrderType.limit; - } - resetValues(success?: boolean) { this.setBaseValue(''); this.setQuoteValue(''); @@ -842,29 +883,11 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma this.confirmPlaceOrderVisibility = true; } - get maxPossibleAmount(): FPNumber { - if (!this.currentOrderBook) return FPNumber.ZERO; - const max = getMaxValue(this.baseAsset, this.networkFee); - const maxLotSize: FPNumber = this.currentOrderBook.maxLotSize; - - const maxPossible = FPNumber.fromNatural(max, this.bookPrecision); - - if (this.isBuySide) return maxLotSize; - - return FPNumber.lte(maxPossible, maxLotSize) ? maxPossible : maxLotSize; - } - handleMaxValue(): void { this.handleInputFieldBase(this.maxPossibleAmount.toString()); this.checkInputValidation(); } - get isMaxAmountAvailable(): boolean { - if (!(this.baseAsset && this.quoteAsset)) return false; - - return this.isLoggedIn && isMaxButtonAvailable(this.baseAsset, this.baseValue, this.networkFee, this.xor, true); - } - handleTabClick(): void { this.setTokens(); @@ -879,6 +902,36 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma this.checkInputValidation(); } + + mounted(): void { + this.updateBalanceSubscription(); + + if (this.prevRoute === PageNames.Swap && this.tokenFrom?.address && this.tokenTo?.address) { + this.prevSwapFromAddress = this.tokenFrom?.address; + this.prevSwapToAddress = this.tokenTo?.address; + } + } + + beforeDestroy(): void { + this.resetQuoteSubscription(); + this.updateBalanceSubscription(true); + if (this.prevSwapFromAddress && this.prevSwapToAddress) { + this.setTokenFromAddress(this.prevSwapFromAddress); + this.setTokenToAddress(this.prevSwapToAddress); + } else { + this.setTokenFromAddress(this.xor.address); + this.resetTokenToAddress(); + } + this.setFromValue(''); + this.setToValue(''); + this.setQuoteValue(''); + this.setBaseValue(''); + this.setLiquiditySource(LiquiditySourceTypes.Default); + this.selectDexId(DexId.XOR); + this.setSide(PriceVariant.Buy); + this.setAmountSliderValue(0); + this.limitOrderType = LimitOrderType.limit; + } } @@ -939,7 +992,7 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma @include custom-tabs; &__tab { - margin-bottom: #{$basic-spacing-medium}; + margin-bottom: $inner-spacing-mini; } .s-tabs.s-rounded .el-tabs__nav-wrap .el-tabs__item { @@ -1006,6 +1059,10 @@ export default class BuySellWidget extends Mixins(TranslationMixin, mixins.Forma cursor: pointer; } } + +.book-inform-icon-btn { + margin-left: $inner-spacing-mini; +} + + diff --git a/src/modules/staking/sora/components/ClaimRewardsDialog.vue b/src/modules/staking/sora/components/ClaimRewardsDialog.vue index 82dbea23c..637041d55 100644 --- a/src/modules/staking/sora/components/ClaimRewardsDialog.vue +++ b/src/modules/staking/sora/components/ClaimRewardsDialog.vue @@ -36,6 +36,7 @@ -
- {{ t('soraStaking.claimRewardsDialog.checkRewards') }} ({{ pendingRewards?.length ?? 0 }}) +
+ {{ t('soraStaking.claimRewardsDialog.checkRewards') }} ({{ pendingRewards.length ?? 0 }})
@@ -154,7 +155,10 @@ export default class ClaimRewardsDialog extends Mixins(StakingMixin, mixins.Dial } get selectedValidatorsFormatted(): string { - return `${this.selectedValidators.length} (MAX: ${this.validators.length})`; + return this.t('soraStaking.selectedValidators', { + count: this.selectedValidators.length, + max: this.validators.length, + }); } get payouts() { diff --git a/src/modules/staking/sora/components/EraCountdown.vue b/src/modules/staking/sora/components/EraCountdown.vue new file mode 100644 index 000000000..72472fb92 --- /dev/null +++ b/src/modules/staking/sora/components/EraCountdown.vue @@ -0,0 +1,88 @@ + + + diff --git a/src/modules/staking/sora/components/PendingRewardsDialog.vue b/src/modules/staking/sora/components/PendingRewardsDialog.vue index a1f968923..f029f8bb5 100644 --- a/src/modules/staking/sora/components/PendingRewardsDialog.vue +++ b/src/modules/staking/sora/components/PendingRewardsDialog.vue @@ -318,8 +318,6 @@ export default class PendingRewardsDialog extends Mixins( flex-shrink: 0; background: var(--s-color-status-info); border: 2px solid var(--s-color-base-border-primary); - // box-shadow: 20px 20px 60px 0px rgba(0, 0, 0, 0.1), 1px 1px 10px 0px #fff inset, - // -10px -10px 30px 0px rgba(255, 255, 255, 0.9); i { margin-bottom: 2px; diff --git a/src/modules/staking/sora/components/StakeDialog.vue b/src/modules/staking/sora/components/StakeDialog.vue index 941aafcea..5288cb502 100644 --- a/src/modules/staking/sora/components/StakeDialog.vue +++ b/src/modules/staking/sora/components/StakeDialog.vue @@ -40,7 +40,19 @@ /> + +
+
+ {{ t('soraStaking.allWithdrawsDialog.information') }} +
+
+ +
+
+
+