diff --git a/packages/cli/src/commands/governance/view.ts b/packages/cli/src/commands/governance/view.ts index 1249201a383..854008c4c16 100644 --- a/packages/cli/src/commands/governance/view.ts +++ b/packages/cli/src/commands/governance/view.ts @@ -1,3 +1,4 @@ +import { proposalToJSON } from '@celo/contractkit/lib/governance/proposals' import { flags } from '@oclif/command' import { BaseCommand } from '../../base' import { newCheckBuilder } from '../../utils/checks' @@ -9,13 +10,15 @@ export default class View extends BaseCommand { static flags = { ...BaseCommand.flags, proposalID: flags.string({ required: true, description: 'UUID of proposal to view' }), + raw: flags.boolean({ required: false, description: 'Display proposal in raw bytes format' }), } - static examples = ['view --proposalID 99'] + static examples = ['view --proposalID 99', 'view --proposalID 99 --raw'] async run() { const res = this.parse(View) const id = res.flags.proposalID + const raw = res.flags.raw await newCheckBuilder(this) .proposalExists(id) @@ -23,6 +26,10 @@ export default class View extends BaseCommand { const governance = await this.kit.contracts.getGovernance() const record = await governance.getProposalRecord(id) + if (!raw) { + const jsonproposal = await proposalToJSON(this.kit, record.proposal) + record.proposal = jsonproposal as any + } printValueMapRecursive(record) } } diff --git a/packages/contractkit/src/governance/proposals.ts b/packages/contractkit/src/governance/proposals.ts index 5682c119cd8..97f5bbf5075 100644 --- a/packages/contractkit/src/governance/proposals.ts +++ b/packages/contractkit/src/governance/proposals.ts @@ -24,6 +24,7 @@ export interface ProposalTransactionJSON { contract: CeloContract function: string args: any[] + params?: Record value: string } @@ -40,6 +41,7 @@ export const proposalToJSON = async (kit: ContractKit, proposal: Proposal) => { contract: parsedTx.callDetails.contract as CeloContract, function: parsedTx.callDetails.function, args: parsedTx.callDetails.argList, + params: parsedTx.callDetails.paramMap, value: parsedTx.tx.value, } }) diff --git a/packages/contractkit/src/wrappers/Governance.ts b/packages/contractkit/src/wrappers/Governance.ts index 0403970ed83..4ced8f02cb1 100644 --- a/packages/contractkit/src/wrappers/Governance.ts +++ b/packages/contractkit/src/wrappers/Governance.ts @@ -342,11 +342,13 @@ export class GovernanceWrapper extends BaseWrapper { ) /** - * Returns the proposal dequeue as list of proposal IDs. + * Returns the (existing) proposal dequeue as list of proposal IDs. */ - getDequeue = proxyCall(this.contract.methods.getDequeue, undefined, (arrayObject) => - arrayObject.map(valueToBigNumber) - ) + async getDequeue() { + const dequeue = await this.contract.methods.getDequeue().call() + // filter non-zero as dequeued indices are reused and `deleteDequeuedProposal` zeroes + return dequeue.map(valueToBigNumber).filter((id) => !id.isZero()) + } /** * Dequeues any queued proposals if `dequeueFrequency` seconds have elapsed since the last dequeue @@ -430,9 +432,11 @@ export class GovernanceWrapper extends BaseWrapper { private async lesserAndGreaterAfterUpvote(upvoter: Address, proposalID: BigNumber.Value) { const upvoteRecord = await this.getUpvoteRecord(upvoter) - const queue = upvoteRecord.proposalID.isZero() - ? await this.getQueue() - : (await this.withUpvoteRevoked(upvoter)).queue + const recordQueued = await this.isQueued(upvoteRecord.proposalID) + // if existing upvote exists in queue, revoke it before applying new upvote + const queue = recordQueued + ? (await this.withUpvoteRevoked(upvoter)).queue + : await this.getQueue() const upvoteQueue = await this.withUpvoteApplied(upvoter, proposalID, queue) return this.lesserAndGreater(proposalID, upvoteQueue) } diff --git a/packages/docs/command-line-interface/governance.md b/packages/docs/command-line-interface/governance.md index b156067e317..b6197d285ce 100644 --- a/packages/docs/command-line-interface/governance.md +++ b/packages/docs/command-line-interface/governance.md @@ -159,9 +159,11 @@ USAGE OPTIONS --proposalID=proposalID (required) UUID of proposal to view + --raw Display proposal in raw bytes format -EXAMPLE +EXAMPLES view --proposalID 99 + view --proposalID 99 --raw ``` _See code: [packages/cli/src/commands/governance/view.ts](https://github.com/celo-org/celo-monorepo/tree/master/packages/cli/src/commands/governance/view.ts)_