UNPKG

@ledgerhq/coin-celo

Version:
56 lines (45 loc) 2.04 kB
import invariant from "invariant"; import BigNumber from "bignumber.js"; import sampleSize from "lodash/sampleSize"; import { MutationSpec } from "@ledgerhq/coin-framework/bot/types"; import { getCryptoCurrencyById } from "@ledgerhq/cryptoassets/index"; import { parseCurrencyUnit } from "@ledgerhq/coin-framework/currencies/parseCurrencyUnit"; import { getCurrentCeloPreloadData } from "../../bridge/preload"; import { getValidatorGroupsWithoutVotes } from "../../logic"; import type { CeloAccount, CeloResources, Transaction } from "../../types"; const currency = getCryptoCurrencyById("celo"); const minimalAmount = parseCurrencyUnit(currency.units[0], "0.001"); export const createVoteMutation = (): MutationSpec<Transaction> => ({ name: "Celo: Vote", feature: "staking", maxRun: 1, transaction: ({ account, bridge, maxSpendable }) => { invariant(maxSpendable.gt(minimalAmount), "Celo: Vote | balance is too low"); const { celoResources } = account as CeloAccount; invariant(celoResources?.registrationStatus, "Celo: Vote | Account is not registered"); const nonvotingLockedBalance = celoResources?.nonvotingLockedBalance || new BigNumber(0); invariant(nonvotingLockedBalance.gt(0), "Celo: Vote | No non voting locked balance"); const votes = (celoResources as CeloResources).votes || []; const { validatorGroups } = getCurrentCeloPreloadData(); // Get a random validator group that the account does not have locked tokens for. const validatorGroupWithoutVotes = sampleSize( getValidatorGroupsWithoutVotes(validatorGroups, votes), 1, )[0]; const amount = nonvotingLockedBalance.times(0.5).precision(8).integerValue(); invariant(amount.gt(0), "Celo: Vote | Not enough funds to vote"); const transaction = { recipient: validatorGroupWithoutVotes.address, amount, }; return { transaction: bridge.createTransaction(account), updates: [ { mode: "vote", }, transaction, ], }; }, });