From a6d4106dbcf342113369b0e4b61e249600e0d293 Mon Sep 17 00:00:00 2001 From: show Date: Wed, 12 Feb 2020 18:44:08 +0100 Subject: [PATCH 01/28] add multidenom rewards to tmbalance & livalidator --- src/components/common/TmBalance.vue | 53 ++++++++++++++++--- src/components/staking/LiValidator.vue | 18 ++++++- src/components/staking/TableValidators.vue | 41 ++++++++++++-- .../__snapshots__/TmBalance.spec.js.snap | 2 + .../TableValidators.spec.js.snap | 15 ++++++ 5 files changed, 115 insertions(+), 14 deletions(-) diff --git a/src/components/common/TmBalance.vue b/src/components/common/TmBalance.vue index d5e2efbc3e..80e8ec0151 100644 --- a/src/components/common/TmBalance.vue +++ b/src/components/common/TmBalance.vue @@ -32,7 +32,13 @@
-

Total Rewards

+

+ {{ + isMultiDenomReward + ? `Total Rewards in ${stakingDenom}` + : `Total Rewards` + }} +

+{{ overview.totalRewards | shortDecimals | noBlanks }}

@@ -48,6 +54,11 @@ >

{{ balance.denom }}

{{ balance.amount }}

+

+ +{{ + calculateTotalRewardsDenom(balance.denom) | shortDecimals + }} +

@@ -117,6 +128,7 @@ export default { selectedTokenFiatValue: `Tokens Total Fiat Value`, selectedFiatCurrency: `EUR`, // EUR is our default fiat currency showTutorial: false, + rewards: [], cosmosTokensTutorial: { fullguide: `https://lunie.io/guides/how-to-get-tokens/`, background: `red`, @@ -214,6 +226,15 @@ export default { } else { return [this.stakingDenom] } + }, + isMultiDenomReward() { + if (this.overview.rewards && this.overview.rewards.length > 0) { + return this.overview.rewards[0].denom !== this.overview.rewards[1].denom + ? true + : false + } else { + return false + } } }, methods: { @@ -228,6 +249,17 @@ export default { }, hideTutorial() { this.showTutorial = false + }, + calculateTotalRewardsDenom(denom) { + if (this.overview.rewards && this.overview.rewards.length > 0) { + let rewardsAccumulator = 0 + this.overview.rewards + .filter(reward => reward.denom === denom.toLowerCase()) + .forEach(reward => { + rewardsAccumulator += parseFloat(reward.amount) + }) + return rewardsAccumulator + } } }, apollo: { @@ -238,6 +270,10 @@ export default { totalRewards liquidStake totalStake + rewards { + amount + denom + } } } `, @@ -291,7 +327,8 @@ export default { } return { ...data.overview, - totalRewards: Number(data.overview.totalRewards) + totalRewards: Number(data.overview.totalRewards), + rewards: data.overview.rewards } }, /* istanbul ignore next */ @@ -423,7 +460,6 @@ export default { .token-denom { font-size: 12px; - float: left; } .token-balance { @@ -436,6 +472,11 @@ export default { top: -0.7rem; } +p.rewards { + color: var(--success); + font-size: var(--s); +} + .rewards h2 { color: var(--success); font-size: var(--m); @@ -459,6 +500,7 @@ export default { width: 100%; border-bottom: 1px solid var(--bc-dim); border-top: 1px solid var(--bc-dim); + margin-top: 1rem; margin-bottom: 2rem; } @@ -553,11 +595,6 @@ export default { width: 100%; } - /* This doesn't work */ - /* .scroll > .scroll-item { - flex: 0 0 auto; - } */ - .scroll > .row > div { margin-right: 3rem; } diff --git a/src/components/staking/LiValidator.vue b/src/components/staking/LiValidator.vue index 41c43b43a9..53083721a1 100644 --- a/src/components/staking/LiValidator.vue +++ b/src/components/staking/LiValidator.vue @@ -43,7 +43,12 @@ {{ delegation.amount | shortDecimals }}
- +{{ rewards.amount | shortDecimals }} + +{{ + shortDecimals(rewards.amount).concat(` ${stakingDenom}`) + }} + +{{ rewards.amount | shortDecimals }}
@@ -94,10 +99,19 @@ export default { type: String, /* istanbul ignore next */ default: () => "returns" + }, + isMultiDenomReward: { + type: Boolean, + default: false + }, + stakingDenom: { + type: String, + default: "" } }, methods: { - percent + percent, + shortDecimals } } diff --git a/src/components/staking/TableValidators.vue b/src/components/staking/TableValidators.vue index abb36d3895..176497dc95 100644 --- a/src/components/staking/TableValidators.vue +++ b/src/components/staking/TableValidators.vue @@ -21,6 +21,8 @@ :delegation="getDelegation(validator)" :rewards="getRewards(validator)" :show-on-mobile="showOnMobile" + :is-multi-denom-reward="isMultiDenomReward" + :staking-denom="stakingDenom" /> @@ -29,6 +31,7 @@ diff --git a/src/components/staking/PageValidator.vue b/src/components/staking/PageValidator.vue index d401caaf0e..9afb3a1d0b 100644 --- a/src/components/staking/PageValidator.vue +++ b/src/components/staking/PageValidator.vue @@ -54,7 +54,7 @@

{{ delegation.amount | fullDecimals }}

- +{{ rewards.amount | fullDecimals | noBlanks }} + +{{ selectMostRelevantReward(rewards) | noBlanks }}
@@ -307,6 +307,7 @@ export default { }, methods: { shortDecimals, + fullDecimals, atoms, percent, fromNow, @@ -329,6 +330,14 @@ export default { }, handleIntercom() { this.$store.dispatch(`displayMessenger`) + }, + selectMostRelevantReward(rewards) { + // this results in an infinite loop O.o + // rewards.sort( (a ,b) => b.amount - a.amount) + // we return the reward with the highest amount + return fullDecimals(rewards[0].amount) + .toString() + .concat(` ${rewards[0].denom.slice(-3).toUpperCase()}`) } }, apollo: { @@ -386,6 +395,7 @@ export default { operatorAddress: $operatorAddress ) { amount + denom } } `, @@ -404,7 +414,7 @@ export default { update(result) { /* istanbul ignore next */ return result.rewards && result.rewards.length > 0 - ? result.rewards[0] + ? result.rewards : { amount: 0 } } }, diff --git a/src/components/staking/TableValidators.vue b/src/components/staking/TableValidators.vue index cfe53c1c82..66ff599a7e 100644 --- a/src/components/staking/TableValidators.vue +++ b/src/components/staking/TableValidators.vue @@ -139,10 +139,10 @@ export default { return ( this.rewards /* istanbul ignore next */ + // .filter( + // ({ denom }) => denom === this.toMicroDenom(this.stakingDenom) + // ) .filter( - ({ denom }) => denom === this.toMicroDenom(this.stakingDenom) - ) - .find( ({ validator }) => validator.operatorAddress === operatorAddress ) ) diff --git a/src/scripts/common.js b/src/scripts/common.js index 3b889c4791..d71c6f869c 100644 --- a/src/scripts/common.js +++ b/src/scripts/common.js @@ -54,3 +54,9 @@ export function toMicroDenom(denom) { } return lookup[denom] ? lookup[denom] : denom.toLowerCase() } + +export function removeUFromMicroDenom(denom) { + if (denom.startsWith(`u`)) { + return denom.slice(-3) + } +} diff --git a/tests/unit/specs/components/staking/LiValidator.spec.js b/tests/unit/specs/components/staking/LiValidator.spec.js index 192e756429..a30d3a1965 100644 --- a/tests/unit/specs/components/staking/LiValidator.spec.js +++ b/tests/unit/specs/components/staking/LiValidator.spec.js @@ -65,6 +65,12 @@ describe(`LiValidator`, () => { localVue, propsData: { validator, + rewards: [ + { + amount: 1, + denom: `token1` + } + ], index, showOnMobile: "returns" }, diff --git a/tests/unit/specs/components/staking/TableValidators.spec.js b/tests/unit/specs/components/staking/TableValidators.spec.js index 85cf9dd8e6..49576a61b7 100644 --- a/tests/unit/specs/components/staking/TableValidators.spec.js +++ b/tests/unit/specs/components/staking/TableValidators.spec.js @@ -56,10 +56,12 @@ describe(`TableValidators`, () => { wrapper.setData({ rewards: [ { + validator: { name: "cosmos1a", operatorAddress: "cosmos1a" }, amount: 1, denom: `utoken1` }, { + validator: { name: "cosmos1a", operatorAddress: "cosmos1a" }, amount: 2, denom: `utoken2` } diff --git a/tests/unit/specs/components/staking/__snapshots__/TableValidators.spec.js.snap b/tests/unit/specs/components/staking/__snapshots__/TableValidators.spec.js.snap index 250d29e34d..7a5d89bdf4 100644 --- a/tests/unit/specs/components/staking/__snapshots__/TableValidators.spec.js.snap +++ b/tests/unit/specs/components/staking/__snapshots__/TableValidators.spec.js.snap @@ -20,7 +20,7 @@ exports[`TableValidators shows a validator table 1`] = ` Date: Fri, 14 Feb 2020 13:09:52 +0100 Subject: [PATCH 07/28] fix infinite loop --- src/components/staking/PageValidator.vue | 26 ++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/src/components/staking/PageValidator.vue b/src/components/staking/PageValidator.vue index 9afb3a1d0b..eef303ca40 100644 --- a/src/components/staking/PageValidator.vue +++ b/src/components/staking/PageValidator.vue @@ -252,6 +252,8 @@ export default { error: false, loaded: false, showTutorial: false, + isMostRelevantRewardSelected: false, + mostRelevantReward: ``, cosmosStakingTutorial: { fullguide: `https://lunie.io/guides/how-cosmos-staking-works/`, background: `blue`, @@ -332,12 +334,24 @@ export default { this.$store.dispatch(`displayMessenger`) }, selectMostRelevantReward(rewards) { - // this results in an infinite loop O.o - // rewards.sort( (a ,b) => b.amount - a.amount) - // we return the reward with the highest amount - return fullDecimals(rewards[0].amount) - .toString() - .concat(` ${rewards[0].denom.slice(-3).toUpperCase()}`) + if ( + !this.isMostRelevantRewardSelected && + this.rewards && + this.rewards.length > 0 + ) { + // this results in an infinite loop O.o + rewards.sort((a, b) => b.amount - a.amount) + // avoid infinite loop + this.isMostRelevantRewardSelected = true + // we return the reward with the highest amount + this.mostRelevantReward = this.fullDecimals(rewards[0].amount) + .toString() + .concat(` ${rewards[0].denom.slice(-3).toUpperCase()}`) + } else { + if (this.mostRelevantReward !== "") { + return this.mostRelevantReward + } + } } }, apollo: { From 7d8fe2d331ad22ef093f6cd16374de6a04c6245e Mon Sep 17 00:00:00 2001 From: show Date: Fri, 14 Feb 2020 13:46:24 +0100 Subject: [PATCH 08/28] fixes. make cosmos compatible --- src/components/common/TmBalance.vue | 4 +--- src/components/staking/LiValidator.vue | 11 ++++++----- src/components/staking/PageValidator.vue | 17 +++++++++++++++-- src/components/staking/TableValidators.vue | 2 +- src/scripts/common.js | 2 +- 5 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/components/common/TmBalance.vue b/src/components/common/TmBalance.vue index 781bea7bba..c7ea7cc5f4 100644 --- a/src/components/common/TmBalance.vue +++ b/src/components/common/TmBalance.vue @@ -239,9 +239,7 @@ export default { }, isMultiDenomReward() { if (this.overview.rewards && this.overview.rewards.length > 0) { - return this.overview.rewards[0].denom !== this.overview.rewards[1].denom - ? true - : false + return this.overview.rewards[0].denom ? true : false } else { return false } diff --git a/src/components/staking/LiValidator.vue b/src/components/staking/LiValidator.vue index 5a9b38b439..74783d17e9 100644 --- a/src/components/staking/LiValidator.vue +++ b/src/components/staking/LiValidator.vue @@ -43,10 +43,7 @@ {{ delegation.amount | shortDecimals }}
- +{{ selectMostRelevantReward(rewards) }} - +{{ rewards.amount | shortDecimals }} + +{{ selectMostRelevantReward(rewards) }}
@@ -115,7 +112,11 @@ export default { // we return the reward with the highest amount return shortDecimals(rewards[0].amount) .toString() - .concat(` ${rewards[0].denom.slice(-3).toUpperCase()}`) + .concat( + this.isMultiDenomReward + ? ` ${rewards[0].denom.slice(-3).toUpperCase()}` + : `` + ) } } } diff --git a/src/components/staking/PageValidator.vue b/src/components/staking/PageValidator.vue index eef303ca40..78581c0847 100644 --- a/src/components/staking/PageValidator.vue +++ b/src/components/staking/PageValidator.vue @@ -198,6 +198,7 @@ import moment from "moment" import { mapGetters, mapState } from "vuex" import { atoms, shortDecimals, fullDecimals, percent } from "scripts/num" import { noBlanks, fromNow } from "src/filters" +import { removeUFromMicroDenom } from "src/scripts/common" import TmBtn from "common/TmBtn" import DelegationModal from "src/ActionModal/components/DelegationModal" import UndelegationModal from "src/ActionModal/components/UndelegationModal" @@ -301,13 +302,21 @@ export default { computed: { ...mapState([`connection`]), ...mapGetters([`network`]), - ...mapGetters({ userAddress: `address` }) + ...mapGetters({ userAddress: `address` }), + isMultiDenomReward() { + if (this.rewards && this.rewards.length > 0) { + return this.rewards[0].denom ? true : false + } else { + return false + } + } }, mounted() { this.$apollo.queries.rewards.refetch() this.$apollo.queries.delegation.refetch() }, methods: { + removeUFromMicroDenom, shortDecimals, fullDecimals, atoms, @@ -346,7 +355,11 @@ export default { // we return the reward with the highest amount this.mostRelevantReward = this.fullDecimals(rewards[0].amount) .toString() - .concat(` ${rewards[0].denom.slice(-3).toUpperCase()}`) + .concat( + this.isMultiDenomReward + ? ` ${this.removeUFromMicroDenom(rewards[0].denom).toUpperCase()}` + : `` + ) } else { if (this.mostRelevantReward !== "") { return this.mostRelevantReward diff --git a/src/components/staking/TableValidators.vue b/src/components/staking/TableValidators.vue index 66ff599a7e..f98682bcdb 100644 --- a/src/components/staking/TableValidators.vue +++ b/src/components/staking/TableValidators.vue @@ -107,7 +107,7 @@ export default { }, isMultiDenomReward() { if (this.rewards && this.rewards.length > 0) { - return this.rewards[0].denom !== this.rewards[1].denom ? true : false + return this.rewards[0].denom ? true : false } else { return false } diff --git a/src/scripts/common.js b/src/scripts/common.js index d71c6f869c..ff4858fea6 100644 --- a/src/scripts/common.js +++ b/src/scripts/common.js @@ -57,6 +57,6 @@ export function toMicroDenom(denom) { export function removeUFromMicroDenom(denom) { if (denom.startsWith(`u`)) { - return denom.slice(-3) + return denom.slice(1, denom.length) } } From 75f8b7ea879e7cd7e2067ee83e6fca65e63372f3 Mon Sep 17 00:00:00 2001 From: show Date: Fri, 14 Feb 2020 16:58:53 +0100 Subject: [PATCH 09/28] change to only display staking denom rewards --- src/components/staking/LiValidator.vue | 31 +++++++----- src/components/staking/PageValidator.vue | 59 ++++++++++++---------- src/components/staking/TableValidators.vue | 2 +- 3 files changed, 53 insertions(+), 39 deletions(-) diff --git a/src/components/staking/LiValidator.vue b/src/components/staking/LiValidator.vue index 74783d17e9..0cdbc3f786 100644 --- a/src/components/staking/LiValidator.vue +++ b/src/components/staking/LiValidator.vue @@ -42,8 +42,16 @@

{{ delegation.amount | shortDecimals }}

-
- +{{ selectMostRelevantReward(rewards) }} +
+ +{{ filterStakingDenomReward(rewards) }}
@@ -61,6 +69,7 @@