diff --git a/CHANGELOG.md b/CHANGELOG.md
index abc0dd92b0..db9e831468 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -39,8 +39,9 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
- [\#1685](https://github.com/cosmos/voyager/pull/1685) added .idea to .gitignore @sabau
- [\#1578](https://github.com/cosmos/voyager/issues/1578) added e2e tests for submit governance proposals @fedekunze
- [\#1672](https://github.com/cosmos/voyager/issues/1672) added e2e tests for staking parameters tab @fedekunze
-- [\#1550](https://github.com/cosmos/voyager/issues/1578) added e2e tests for voting on governance proposals @fedekunze
-- [\#1555](https://github.com/cosmos/voyager/issues/1578) added e2e tests for submitting a deposit on a governance proposal @fedekunze
+- [\#1648](https://github.com/cosmos/voyager/issues/1648) added governance parameters tab @fedekunze
+- [\#1550](https://github.com/cosmos/voyager/issues/1550) added e2e tests for voting on governance proposals @fedekunze
+- [\#1555](https://github.com/cosmos/voyager/issues/1555) added e2e tests for submitting a deposit on a governance proposal @fedekunze
- [\#1681](https://github.com/cosmos/voyager/issues/1681) Governance: Fixed voting starting date @sabau
- [\#1690](https://github.com/cosmos/voyager/issues/1690) Governance: Fixed error messages for maxLength @sabau
diff --git a/app/src/renderer/components/governance/PageGovernance.vue b/app/src/renderer/components/governance/PageGovernance.vue
index 6a4205bad7..fcf4e60244 100644
--- a/app/src/renderer/components/governance/PageGovernance.vue
+++ b/app/src/renderer/components/governance/PageGovernance.vue
@@ -54,6 +54,11 @@ export default {
displayName: `Proposals`,
pathName: `Proposals`
}
+ // TODO uncomment when updated to latest SDK
+ // {
+ // displayName: `Parameters`,
+ // pathName: `Governance Parameters`
+ // }
],
showModalPropose: false
}),
diff --git a/app/src/renderer/components/governance/TabParameters.vue b/app/src/renderer/components/governance/TabParameters.vue
new file mode 100644
index 0000000000..e1c2b3e455
--- /dev/null
+++ b/app/src/renderer/components/governance/TabParameters.vue
@@ -0,0 +1,278 @@
+
+
+
+
+ Deposit Parameters
+ info_outline
+
+
+
+
+
+ -
+ Minimum Deposit
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.deposit.min_deposit
+ ? minimumDeposit
+ : `n/a`
+ }}
+
+
+
+
+
+ -
+ Maximum Deposit Period
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.deposit.max_deposit_period
+ ? depositPeriodInDays + ` days`
+ : `n/a`
+ }}
+
+
+
+
+
+
+
+
+ Tally Parameters
+ info_outline
+
+
+
+
+
+ -
+ Threshold
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.tallying.threshold
+ ? `${parseFloat(
+ governanceParameters.parameters.tallying.threshold
+ ) * 100} %`
+ : `n/a`
+ }}
+
+
+
+ -
+ Veto
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.tallying.veto
+ ? `${parseFloat(
+ governanceParameters.parameters.tallying.veto
+ ) * 100} %`
+ : `n/a`
+ }}
+
+
+
+
+
+ -
+ Governance Penalty
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.tallying.governance_penalty
+ ? governanceParameters.parameters.tallying
+ .governance_penalty
+ : `n/a`
+ }}
+
+
+
+
+
+
+
+
+ Voting Parameters
+ info_outline
+
+
+
+
+
+ -
+ Voting Period
+ info_outline
+
+ -
+ {{
+ governanceParameters.parameters.voting.voting_period
+ ? votingPeriodInDays + ` days`
+ : `n/a`
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/renderer/components/staking/TabParameters.vue b/app/src/renderer/components/staking/TabParameters.vue
index 4a776d951f..f20941b303 100644
--- a/app/src/renderer/components/staking/TabParameters.vue
+++ b/app/src/renderer/components/staking/TabParameters.vue
@@ -1,5 +1,5 @@
-
+
Staking Pool
@@ -14,7 +14,12 @@
-
- Loose {{ parameters.parameters.bond_denom }}
+ Loose
+ {{
+ stakingParameters.parameters.bond_denom
+ ? stakingParameters.parameters.bond_denom
+ : bondingDenom
+ }}
-
- Delegated {{ parameters.parameters.bond_denom }}
+ Delegated
+ {{
+ stakingParameters.parameters.bond_denom
+ ? stakingParameters.parameters.bond_denom
+ : bondingDenom
+ }}
-
{{
- parameters.parameters.unbonding_time
+ stakingParameters.parameters.unbonding_time
? unbondingTimeInDays + ` days`
: `n/a`
}}
@@ -77,8 +87,8 @@
- Current Staking Coin Denomination
-
{{
- parameters.parameters.bond_denom
- ? parameters.parameters.bond_denom
+ stakingParameters.parameters.bond_denom
+ ? stakingParameters.parameters.bond_denom
: `n/a`
}}
@@ -89,8 +99,8 @@
- Maximum Number of Validators
-
{{
- parameters.parameters.max_validators
- ? parameters.parameters.max_validators
+ stakingParameters.parameters.max_validators
+ ? stakingParameters.parameters.max_validators
: `n/a`
}}
@@ -128,10 +138,10 @@ export default {
}
}),
computed: {
- ...mapGetters([`config`, `parameters`, `pool`]),
+ ...mapGetters([`config`, `stakingParameters`, `pool`, `bondingDenom`]),
unbondingTimeInDays() {
return (
- parseInt(this.parameters.parameters.unbonding_time) /
+ parseInt(this.stakingParameters.parameters.unbonding_time) /
(10 ** 9 * 60 * 60 * 24)
)
}
diff --git a/app/src/renderer/connectors/lcdClientMock.js b/app/src/renderer/connectors/lcdClientMock.js
index c83b800ef6..20bcbc42cc 100644
--- a/app/src/renderer/connectors/lcdClientMock.js
+++ b/app/src/renderer/connectors/lcdClientMock.js
@@ -301,20 +301,20 @@ let state = {
loose_tokens: `100.0000000000`,
bonded_tokens: `50.0000000000`
},
- parameters: {
+ stakingParameters: {
unbonding_time: `259200000000000`,
max_validators: 100,
bond_denom: `steak`
},
- govParameters: {
+ governanceParameters: {
deposit: {
min_deposit: [
{
- denom: `steak`,
- amount: `coin`
+ denom: `stake`,
+ amount: `10.0000000000`
}
],
- max_deposit_period: `86400000000`
+ max_deposit_period: `86400000000000`
},
tallying: {
threshold: `0.5000000000`,
@@ -322,7 +322,7 @@ let state = {
governance_penalty: `0.0100000000`
},
voting: {
- voting_period: `86400000000`
+ voting_period: `86400000000000`
}
},
sendHeight: 2,
@@ -752,7 +752,7 @@ module.exports = {
// update sender balance
let coinBalance = fromAccount.coins.find(
- c => c.denom === state.parameters.bond_denom
+ c => c.denom === state.stakingParameters.bond_denom
)
coinBalance.amount = String(parseInt(coinBalance.amount) + amount)
@@ -869,7 +869,7 @@ module.exports = {
// add redelegation object
let coins = {
amount: tx.shares, // in mock mode we assume 1 share = 1 token
- denom: state.parameters.bond_denom
+ denom: state.stakingParameters.bond_denom
}
let minTime = Date.now()
red = {
@@ -971,7 +971,7 @@ module.exports = {
return state.pool
},
async getStakingParameters() {
- return state.parameters
+ return state.stakingParameters
},
async getProposals() {
return state.proposals || []
@@ -1271,13 +1271,13 @@ module.exports = {
)
},
async getGovDepositParameters() {
- return state.govParameters.deposit
+ return state.governanceParameters.deposit
},
async getGovTallyingParameters() {
- return state.govParameters.tallying
+ return state.governanceParameters.tallying
},
async getGovVotingParameters() {
- return state.govParameters.voting
+ return state.governanceParameters.voting
},
// exports to be used in tests
state,
diff --git a/app/src/renderer/routes.js b/app/src/renderer/routes.js
index f4809fbc2a..0798041b34 100644
--- a/app/src/renderer/routes.js
+++ b/app/src/renderer/routes.js
@@ -18,6 +18,11 @@ export default [
path: `proposals`,
name: `Proposals`,
component: require(`./components/governance/TabProposals`).default
+ },
+ {
+ path: `governance-parameters`,
+ name: `Governance Parameters`,
+ component: require(`./components/governance/TabParameters`).default
}
]
},
diff --git a/app/src/renderer/vuex/getters.js b/app/src/renderer/vuex/getters.js
index 181686f54d..01cbc1d1ab 100644
--- a/app/src/renderer/vuex/getters.js
+++ b/app/src/renderer/vuex/getters.js
@@ -64,12 +64,13 @@ export const shoppingCart = state => state.delegation.delegates
export const validators = state => state.validators.validators
export const keybase = state => state.keybase.identities
export const pool = state => state.pool
-export const parameters = state => state.parameters
+export const stakingParameters = state => state.stakingParameters
// governance
export const proposals = state => state.proposals.proposals
export const votes = state => state.votes.votes
export const deposits = state => state.deposits.deposits
+export const governanceParameters = state => state.governanceParameters
// status
export const approvalRequired = state => state.connection.approvalRequired
diff --git a/app/src/renderer/vuex/modules/governance/parameters.js b/app/src/renderer/vuex/modules/governance/parameters.js
index 8b2595c774..fda1e17808 100644
--- a/app/src/renderer/vuex/modules/governance/parameters.js
+++ b/app/src/renderer/vuex/modules/governance/parameters.js
@@ -2,7 +2,7 @@ import Raven from "raven-js"
export default ({ node }) => {
const emptyState = {
- govParameters: {
+ parameters: {
deposit: {},
tallying: {},
voting: {}
@@ -14,7 +14,7 @@ export default ({ node }) => {
const mutations = {
setGovParameters(state, parameters) {
- state.govParameters = parameters
+ state.parameters = parameters
}
}
diff --git a/app/src/renderer/vuex/modules/index.js b/app/src/renderer/vuex/modules/index.js
index fd4bc39486..eeb8d8523b 100644
--- a/app/src/renderer/vuex/modules/index.js
+++ b/app/src/renderer/vuex/modules/index.js
@@ -13,12 +13,13 @@ export default opts => ({
proposals: require(`./governance/proposals.js`).default(opts),
votes: require(`./governance/votes.js`).default(opts),
deposits: require(`./governance/deposits.js`).default(opts),
+ governanceParameters: require(`./governance/parameters.js`).default(opts),
send: require(`./send.js`).default(opts),
themes: require(`./themes.js`).default(opts),
user: require(`./user.js`).default(opts),
validators: require(`./validators.js`).default(opts),
wallet: require(`./wallet.js`).default(opts),
keybase: require(`./keybase.js`).default(opts),
- parameters: require(`./parameters.js`).default(opts),
+ stakingParameters: require(`./parameters.js`).default(opts),
pool: require(`./pool.js`).default(opts)
})
diff --git a/test/unit/specs/components/governance/TabParameters.spec.js b/test/unit/specs/components/governance/TabParameters.spec.js
new file mode 100644
index 0000000000..d5fdfe7c77
--- /dev/null
+++ b/test/unit/specs/components/governance/TabParameters.spec.js
@@ -0,0 +1,62 @@
+import Vuelidate from "vuelidate"
+import setup from "../../../helpers/vuex-setup"
+import htmlBeautify from "html-beautify"
+import TabParameters from "renderer/components/governance/TabParameters"
+import lcdClientMock from "renderer/connectors/lcdClientMock.js"
+
+let { governanceParameters } = lcdClientMock.state
+
+describe(`TabParameters`, () => {
+ let wrapper, store
+ let { mount, localVue } = setup()
+ localVue.use(Vuelidate)
+
+ const $store = {
+ commit: jest.fn(),
+ dispatch: jest.fn(),
+ getters: {
+ governanceParameters,
+ totalAtoms: 100,
+ user: { atoms: 42 }
+ }
+ }
+
+ beforeEach(() => {
+ let instance = mount(TabParameters, {
+ localVue,
+ doBefore: ({ store }) => {
+ store.commit(`setGovParameters`, governanceParameters)
+ },
+ $store
+ })
+ wrapper = instance.wrapper
+ store = instance.store
+ store.commit(`setConnected`, true)
+ wrapper.update()
+ })
+
+ it(`has the expected html structure`, async () => {
+ await wrapper.vm.$nextTick()
+ wrapper.update()
+ expect(htmlBeautify(wrapper.html())).toMatchSnapshot()
+ })
+
+ it(`shows the governance parameters`, () => {
+ expect(store.state.governanceParameters.parameters).toEqual(
+ governanceParameters
+ )
+ })
+
+ it(`displays the minimum deposit`, () => {
+ let coin = governanceParameters.deposit.min_deposit[0]
+ expect(wrapper.vm.minimumDeposit).toEqual(`${coin.amount} ${coin.denom}s`)
+ })
+
+ it(`displays deposit period in days`, () => {
+ expect(wrapper.vm.depositPeriodInDays).toEqual(1)
+ })
+
+ it(`displays voting period in days`, () => {
+ expect(wrapper.vm.votingPeriodInDays).toEqual(1)
+ })
+})
diff --git a/test/unit/specs/components/governance/__snapshots__/TabParameters.spec.js.snap b/test/unit/specs/components/governance/__snapshots__/TabParameters.spec.js.snap
new file mode 100644
index 0000000000..d3139d342b
--- /dev/null
+++ b/test/unit/specs/components/governance/__snapshots__/TabParameters.spec.js.snap
@@ -0,0 +1,92 @@
+// Jest Snapshot v1, https://goo.gl/fbAQLP
+
+exports[`TabParameters has the expected html structure 1`] = `
+"
+
+
+ Deposit Parameters info_outline
+
+
+
+
+
+ -
+ Minimum Deposit info_outline
+
+ -
+ 10.0000000000 stakes
+
+
+
+
+
+ -
+ Maximum Deposit Period info_outline
+
+ -
+ 1 days
+
+
+
+
+
+
+
+
+ Tally Parameters info_outline
+
+
+
+
+
+ -
+ Threshold info_outline
+
+ -
+ 50 %
+
+
+
+ -
+ Veto info_outline
+
+ -
+ 33.4 %
+
+
+
+
+
+ -
+ Governance Penalty info_outline
+
+ -
+ 0.0100000000
+
+
+
+
+
+
+
+
+ Voting Parameters info_outline
+
+
+
+
+
+ -
+ Voting Period info_outline
+
+ -
+ 1 days
+
+
+
+
+
+
+
+
"
+`;
diff --git a/test/unit/specs/components/staking/TabParameters.spec.js b/test/unit/specs/components/staking/TabParameters.spec.js
index 9268fee03a..cd94d54142 100644
--- a/test/unit/specs/components/staking/TabParameters.spec.js
+++ b/test/unit/specs/components/staking/TabParameters.spec.js
@@ -4,8 +4,7 @@ import htmlBeautify from "html-beautify"
import TabParameters from "renderer/components/staking/TabParameters"
import lcdClientMock from "renderer/connectors/lcdClientMock.js"
-let pool = lcdClientMock.state.pool
-let parameters = lcdClientMock.state.parameters
+let { pool, stakingParameters } = lcdClientMock.state
describe(`TabParameters`, () => {
let wrapper, store
@@ -17,9 +16,10 @@ describe(`TabParameters`, () => {
dispatch: jest.fn(),
getters: {
pool,
- parameters,
+ stakingParameters,
totalAtoms: 100,
- user: { atoms: 42 }
+ user: { atoms: 42 },
+ bondingDenom: `Stake`
}
}
@@ -28,7 +28,7 @@ describe(`TabParameters`, () => {
localVue,
doBefore: ({ store }) => {
store.commit(`setPool`, pool)
- store.commit(`setStakingParameters`, parameters)
+ store.commit(`setStakingParameters`, stakingParameters)
},
$store
})
@@ -45,7 +45,7 @@ describe(`TabParameters`, () => {
})
it(`shows the staking parameters and pool`, () => {
- expect(store.state.parameters.parameters).toEqual(parameters)
+ expect(store.state.stakingParameters.parameters).toEqual(stakingParameters)
expect(store.state.pool.pool).toEqual(pool)
})
diff --git a/test/unit/specs/components/staking/__snapshots__/TabParameters.spec.js.snap b/test/unit/specs/components/staking/__snapshots__/TabParameters.spec.js.snap
index 1e6ebcbe6d..d9b9f0f393 100644
--- a/test/unit/specs/components/staking/__snapshots__/TabParameters.spec.js.snap
+++ b/test/unit/specs/components/staking/__snapshots__/TabParameters.spec.js.snap
@@ -11,7 +11,7 @@ exports[`TabParameters has the expected html structure 1`] = `
-
- Loose steak info_outline
+ Loose steak info_outline
-
100.0000000000
@@ -21,7 +21,7 @@ exports[`TabParameters has the expected html structure 1`] = `
-
- Delegated steak info_outline
+ Delegated steak info_outline
-
50.0000000000
diff --git a/test/unit/specs/lcdClientMock.spec.js b/test/unit/specs/lcdClientMock.spec.js
index feefd98b74..49736034fd 100644
--- a/test/unit/specs/lcdClientMock.spec.js
+++ b/test/unit/specs/lcdClientMock.spec.js
@@ -824,16 +824,14 @@ describe(`LCD Client Mock`, () => {
it(`queries for staking parameters`, async () => {
let parameters = await client.getStakingParameters()
- expect(Object.keys(parameters)).toContain(
- `unbonding_time`,
- `max_validators`,
- `bond_denom`
- )
+ expect(parameters).toBeDefined()
+ expect(parameters).toMatchObject(lcdClientMock.state.stakingParameters)
})
it(`queries for staking pool`, async () => {
let pool = await client.getPool()
- expect(Object.keys(pool)).toContain(`loose_tokens`, `bonded_tokens`)
+ expect(pool).toBeDefined()
+ expect(pool).toMatchObject(lcdClientMock.state.pool)
})
it(`queries for validator signing information`, async () => {
@@ -989,21 +987,21 @@ describe(`LCD Client Mock`, () => {
describe(`Parameters`, () => {
it(`queries for governance deposit parameters`, async () => {
- let depositParams = lcdClientMock.state.govParameters.deposit
+ let depositParams = lcdClientMock.state.governanceParameters.deposit
let res = await client.getGovDepositParameters()
expect(res).toBeDefined()
expect(res).toEqual(depositParams)
})
it(`queries for governance tallying parameters`, async () => {
- let tallyingParams = lcdClientMock.state.govParameters.tallying
+ let tallyingParams = lcdClientMock.state.governanceParameters.tallying
let res = await client.getGovTallyingParameters()
expect(res).toBeDefined()
expect(res).toEqual(tallyingParams)
})
it(`queries for governance voting parameters`, async () => {
- let votingParams = lcdClientMock.state.govParameters.voting
+ let votingParams = lcdClientMock.state.governanceParameters.voting
let res = await client.getGovVotingParameters()
expect(res).toBeDefined()
expect(res).toEqual(votingParams)
diff --git a/test/unit/specs/store/governance/parameters.spec.js b/test/unit/specs/store/governance/parameters.spec.js
index 807cbe6a10..332c275909 100644
--- a/test/unit/specs/store/governance/parameters.spec.js
+++ b/test/unit/specs/store/governance/parameters.spec.js
@@ -1,15 +1,17 @@
import parametersModule from "renderer/vuex/modules/governance/parameters.js"
import lcdClientMock from "renderer/connectors/lcdClientMock.js"
-let { govParameters } = lcdClientMock.state
+let { governanceParameters } = lcdClientMock.state
describe(`Module: Governance Parameters`, () => {
let module, node
beforeEach(() => {
node = {
- getGovDepositParameters: () => Promise.resolve(govParameters.deposit),
- getGovTallyingParameters: () => Promise.resolve(govParameters.tallying),
- getGovVotingParameters: () => Promise.resolve(govParameters.voting)
+ getGovDepositParameters: () =>
+ Promise.resolve(governanceParameters.deposit),
+ getGovTallyingParameters: () =>
+ Promise.resolve(governanceParameters.tallying),
+ getGovVotingParameters: () => Promise.resolve(governanceParameters.voting)
}
module = parametersModule({
node
@@ -18,15 +20,17 @@ describe(`Module: Governance Parameters`, () => {
it(`adds parameters to state`, () => {
let { mutations, state } = module
- mutations.setGovParameters(state, govParameters)
- expect(state.govParameters).toEqual(govParameters)
+ mutations.setGovParameters(state, governanceParameters)
+ expect(state.parameters).toEqual(governanceParameters)
})
it(`fetches all governance parameters`, async () => {
let { actions, state } = module
let commit = jest.fn()
await actions.getGovParameters({ state, commit })
- expect(commit.mock.calls).toEqual([[`setGovParameters`, govParameters]])
+ expect(commit.mock.calls).toEqual([
+ [`setGovParameters`, governanceParameters]
+ ])
})
it(`should store an error if failed to load governance deposit parameters`, async () => {
diff --git a/test/unit/specs/store/parameters.spec.js b/test/unit/specs/store/parameters.spec.js
index a6c90b3733..cc1f3849db 100644
--- a/test/unit/specs/store/parameters.spec.js
+++ b/test/unit/specs/store/parameters.spec.js
@@ -1,43 +1,39 @@
-import setup from "../../helpers/vuex-setup"
-import lcdClientMock from "renderer/connectors/lcdClientMock.js"
import parametersModule from "renderer/vuex/modules/parameters.js"
+import lcdClientMock from "renderer/connectors/lcdClientMock.js"
+let { stakingParameters } = lcdClientMock.state
-let instance = setup()
-
-const mockParameters = lcdClientMock.state.parameters
-
-describe(`Module: Parameters`, () => {
- let store
+describe(`Module: Staking Parameters`, () => {
+ let module, node
beforeEach(() => {
- let test = instance.shallow(null)
- store = test.store
- })
-
- it(`should have no parameters by default`, () => {
- expect(store.state.parameters.parameters).toEqual({})
+ node = {
+ getStakingParameters: () => Promise.resolve(stakingParameters)
+ }
+ module = parametersModule({ node })
})
- it(`should query parameters`, async () => {
- await store.dispatch(`getStakingParameters`)
- expect(store.state.parameters.parameters).toEqual(mockParameters)
+ it(`should fetch staking parameters`, async () => {
+ let { actions, state } = module
+ let commit = jest.fn()
+ await actions.getStakingParameters({ state, commit })
+ expect(commit.mock.calls).toEqual([
+ [`setStakingParameters`, stakingParameters]
+ ])
})
- it(`should set parameters`, () => {
- store.commit(`setStakingParameters`, mockParameters)
- expect(store.state.parameters.parameters).toEqual(mockParameters)
+ it(`should add staking parameters to state`, () => {
+ let { mutations, state } = module
+ mutations.setStakingParameters(state, stakingParameters)
+ expect(state.parameters).toEqual(stakingParameters)
})
- it(`should store an error if failed to load parameters`, async () => {
- const node = lcdClientMock
- const { state, actions } = parametersModule({ node })
- jest
- .spyOn(node, `getStakingParameters`)
- .mockImplementationOnce(async () => Promise.reject(`Error`))
+ it(`should store an error if failed to load staking parameters`, async () => {
+ node.getStakingParameters = () => Promise.reject(new Error(`Error`))
+ let { actions, state } = module
await actions.getStakingParameters({
state,
commit: jest.fn()
})
- expect(state.error).toBe(`Error`)
+ expect(state.error.message).toBe(`Error`)
})
})