Skip to content

Commit

Permalink
fix: setting voting power to zero (#5604)
Browse files Browse the repository at this point in the history
* fix: allow setting voting power to zero

* chore: add todo

* fix: adjust activity generation for txs where voting power is set to zero

* enhancement: show difference on tile

Co-authored-by: Mark Nardi <mark.nardi@iota.org>
  • Loading branch information
maxwellmattryan and MarkNerdi996 committed Jan 19, 2023
1 parent 8f100cd commit 4a18d5d
Show file tree
Hide file tree
Showing 6 changed files with 37 additions and 16 deletions.
1 change: 1 addition & 0 deletions packages/shared/components/inputs/AssetAmountInput.svelte
Expand Up @@ -63,6 +63,7 @@
const isAmountZeroOrNull = !Number(amountAsFloat)
// Zero value transactions can still contain metadata/tags
if (allowZeroOrNull && isAmountZeroOrNull) {
rawAmount = Big(0).toString()
return
} else if (isAmountZeroOrNull) {
error = localize('error.send.amountInvalidFormat')
Expand Down
Expand Up @@ -14,7 +14,7 @@
...(activity.time && {
transactionTime: { data: formattedTransactionTime },
}),
...(activity.votingPower && {
...(activity.votingPower !== undefined && {
votingPower: {
data: formatTokenAmountBestMatch(activity.votingPower, BASE_TOKEN[$activeProfile?.networkProtocol], 2),
alternateKey:
Expand Down
10 changes: 5 additions & 5 deletions packages/shared/components/popups/ManageVotingPowerPopup.svelte
@@ -1,13 +1,13 @@
<script lang="typescript">
import { Button, Text, TextHint, AssetAmountInput } from 'shared/components'
import { HTMLButtonType, TextType } from 'shared/components/enums'
import { selectedAccount } from '@core/account'
import { selectedAccount } from '@core/account/stores'
import { handleError } from '@core/error/handlers/handleError'
import { setVotingPower } from '@contexts/governance/actions'
import { localize } from '@core/i18n'
import { checkActiveProfileAuth } from '@core/profile'
import { visibleSelectedAccountAssets } from '@core/wallet'
import { closePopup } from '@auxiliary/popup'
import { checkActiveProfileAuth } from '@core/profile/actions'
import { visibleSelectedAccountAssets } from '@core/wallet/stores'
import { closePopup } from '@auxiliary/popup/actions'
const asset = $visibleSelectedAccountAssets?.baseCoin
Expand All @@ -23,7 +23,7 @@
async function onSubmit(): Promise<void> {
try {
await assetAmountInput?.validate()
await assetAmountInput?.validate(true)
await checkActiveProfileAuth(async () => {
await setVotingPower(rawAmount)
closePopup()
Expand Down
Expand Up @@ -3,8 +3,8 @@ import { updateNftInAllAccountNfts } from '@core/nfts'
import { ActivityAction, ActivityDirection, ActivityType } from '@core/wallet'
import { updateClaimingTransactionInclusion } from '@core/wallet/actions/activities/updateClaimingTransactionInclusion'
import {
updateActivityByTransactionId,
getActivityByTransactionId,
updateActivityByTransactionId,
} from '@core/wallet/stores/all-account-activities.store'

import { WalletApiEvent } from '../../enums'
Expand Down Expand Up @@ -35,7 +35,7 @@ export function handleTransactionInclusionEventInternal(
updateNftInAllAccountNfts(accountIndex, activity.nftId, { isSpendable })
}

if (activity?.tag === 'PARTICIPATE') {
if (activity?.type === ActivityType.Governance) {
syncVotingPower(accountIndex)
}

Expand Down
Expand Up @@ -33,7 +33,7 @@ function generateActivitiesFromProcessedTransactionsWithInputs(
processedTransaction: IProcessedTransaction,
account: IAccountState
): Activity[] {
const outputs = processedTransaction.outputs
const { outputs, wrappedInputs } = processedTransaction
const activities: Activity[] = []

const containsFoundryActivity = outputs.some((output) => output.output.type === OUTPUT_TYPE_FOUNDRY)
Expand All @@ -55,7 +55,10 @@ function generateActivitiesFromProcessedTransactionsWithInputs(
activities.push(...aliasActivities)
}

const governanceOutput = outputs.find((output) => isParticipationOutput(output.output))
const hasParticipationInputs = wrappedInputs?.some((input) => isParticipationOutput(input.output))
const governanceOutput = hasParticipationInputs
? processedTransaction?.outputs[0]
: outputs.find((output) => isParticipationOutput(output.output))
if (governanceOutput) {
const governanceActivity = generateSingleGovernanceActivity(account, {
processedTransaction,
Expand Down
Expand Up @@ -14,13 +14,19 @@ interface IGovernanceInfo {
}

export function getGovernanceInfo(output: Output, inputs: IWrappedOutput[], metadata: string): IGovernanceInfo {
const currentVotingPower = getAmountFromOutput(output)
/**
* NOTE: If the output is NOT a participation output, then it doesn't have any voting power.
* This is possible if the user manually set it to zero, which automatically removes the
* participation metadata and tag.
*/
const currentVotingPower = isParticipationOutput(output) ? getAmountFromOutput(output) : 0
const participations = parseGovernanceMetadata(metadata)

const governanceInput = inputs?.find((input) => isParticipationOutput(input.output))
if (governanceInput) {
const oldMetadata = getMetadataFromOutput(governanceInput.output)
const oldParticipations = parseGovernanceMetadata(oldMetadata)
const oldVotingPower = getAmountFromOutput(governanceInput.output)

const addedParticipation = getParticipationDifference(oldParticipations, participations)
const removedParticipation = getParticipationDifference(participations, oldParticipations)
Expand All @@ -32,13 +38,24 @@ export function getGovernanceInfo(output: Output, inputs: IWrappedOutput[], meta
participation: addedParticipation,
}
} else if (removedParticipation) {
return {
governanceAction: GovernanceAction.StopVoting,
votingPower: currentVotingPower,
participation: removedParticipation,
/**
* NOTE: Unless we check the voting power, we won't know if the participations were removed
* because the user stopped voting or manually set the voting power to zero.
*/
if (currentVotingPower === 0) {
return {
governanceAction: GovernanceAction.DecreaseVotingPower,
votingPower: currentVotingPower,
votingPowerDifference: oldVotingPower,
}
} else {
return {
governanceAction: GovernanceAction.StopVoting,
votingPower: currentVotingPower,
participation: removedParticipation,
}
}
} else {
const oldVotingPower = getAmountFromOutput(governanceInput.output)
return {
governanceAction:
currentVotingPower - oldVotingPower > 0
Expand Down

0 comments on commit 4a18d5d

Please sign in to comment.