aergoio/aergo

View on GitHub
chain/governance.go

Summary

Maintainability
A
40 mins
Test Coverage
F
54%
/**
 *  @file
 *  @copyright defined in aergo/LICENSE.txt
 */

package chain

import (
    "math/big"

    "github.com/aergoio/aergo/v2/consensus"
    "github.com/aergoio/aergo/v2/contract"
    "github.com/aergoio/aergo/v2/contract/enterprise"
    "github.com/aergoio/aergo/v2/contract/name"
    "github.com/aergoio/aergo/v2/contract/system"
    "github.com/aergoio/aergo/v2/state"
    "github.com/aergoio/aergo/v2/state/statedb"
    "github.com/aergoio/aergo/v2/types"
)

func executeGovernanceTx(ccc consensus.ChainConsensusCluster, bs *state.BlockState, txBody *types.TxBody, sender, receiver *state.AccountState,
    blockInfo *types.BlockHeaderInfo) ([]*types.Event, error) {

    if len(txBody.Payload) <= 0 {
        return nil, types.ErrTxFormatInvalid
    }

    governance := string(txBody.Recipient)
    scs, err := statedb.OpenContractState(receiver.IDNoPadding(), receiver.State(), bs.StateDB)
    if err != nil {
        return nil, err
    }
    blockNo := blockInfo.No
    var events []*types.Event
    switch governance {
    case types.AergoSystem:
        events, err = system.ExecuteSystemTx(scs, txBody, sender, receiver, blockInfo)
    case types.AergoName:
        events, err = name.ExecuteNameTx(bs, scs, txBody, sender, receiver, blockInfo)
    case types.AergoEnterprise:
        events, err = enterprise.ExecuteEnterpriseTx(bs, ccc, scs, txBody, sender, receiver, blockNo)
        if err != nil {
            err = contract.NewGovEntErr(err)
        }
    default:
        logger.Warn().Str("governance", governance).Msg("receive unknown recipient")
        err = types.ErrTxInvalidRecipient
    }
    if err == nil {
        err = statedb.StageContractState(scs, bs.StateDB)
    }

    return events, err
}

// InitGenesisBPs opens system contract and put initial voting result
// it also set *State in Genesis to use statedb
func InitGenesisBPs(states *statedb.StateDB, genesis *types.Genesis) error {
    scs, err := statedb.GetSystemAccountState(states)
    if err != nil {
        return err
    }

    voteResult := make(map[string]*big.Int)
    for _, v := range genesis.BPs {
        voteResult[v] = new(big.Int).SetUint64(0)
    }
    if err = system.InitVoteResult(scs, voteResult); err != nil {
        return err
    }

    // Set genesis.BPs to the votes-ordered BPs. This will be used later for
    // bootstrapping.
    genesis.BPs = system.BuildOrderedCandidates(voteResult)
    if err = statedb.StageContractState(scs, states); err != nil {
        return err
    }
    if err = states.Update(); err != nil {
        return err
    }
    if err = states.Commit(); err != nil {
        return err
    }

    return nil
}