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 }