github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/execution/contexts/unbond_context.go (about)

     1  package contexts
     2  
     3  import (
     4  	"fmt"
     5  	"math/big"
     6  
     7  	"github.com/hyperledger/burrow/acm/acmstate"
     8  	"github.com/hyperledger/burrow/acm/validator"
     9  	"github.com/hyperledger/burrow/execution/exec"
    10  	"github.com/hyperledger/burrow/logging"
    11  	"github.com/hyperledger/burrow/txs/payload"
    12  )
    13  
    14  type UnbondContext struct {
    15  	State        acmstate.ReaderWriter
    16  	ValidatorSet validator.ReaderWriter
    17  	Logger       *logging.Logger
    18  	tx           *payload.UnbondTx
    19  }
    20  
    21  // Execute an UnbondTx to remove a validator
    22  func (ctx *UnbondContext) Execute(txe *exec.TxExecution, p payload.Payload) error {
    23  	var ok bool
    24  	ctx.tx, ok = p.(*payload.UnbondTx)
    25  	if !ok {
    26  		return fmt.Errorf("payload must be UnbondTx, but is: %v", txe.Envelope.Tx.Payload)
    27  	}
    28  
    29  	if ctx.tx.Input.Address != ctx.tx.Output.Address {
    30  		return fmt.Errorf("input and output address must match")
    31  	}
    32  
    33  	power := new(big.Int).SetUint64(ctx.tx.Output.GetAmount())
    34  	account, err := ctx.State.GetAccount(ctx.tx.Input.Address)
    35  	if err != nil {
    36  		return err
    37  	}
    38  
    39  	err = account.AddToBalance(power.Uint64())
    40  	if err != nil {
    41  		return err
    42  	}
    43  
    44  	err = validator.SubtractPower(ctx.ValidatorSet, account.PublicKey, power)
    45  	if err != nil {
    46  		return err
    47  	}
    48  
    49  	return ctx.State.UpdateAccount(account)
    50  }