return correct exitcodes from vm transfer

This commit is contained in:
frrist 2020-05-13 14:20:38 -07:00
parent 59725b3af3
commit 0c2e4e2d4f
2 changed files with 9 additions and 8 deletions

View File

@ -271,6 +271,7 @@ func (rt *Runtime) DeleteActor(addr address.Address) {
panic(aerrors.Fatalf("failed to get actor: %s", err)) panic(aerrors.Fatalf("failed to get actor: %s", err))
} }
if !act.Balance.IsZero() { if !act.Balance.IsZero() {
// TODO don't ignore this error?
rt.vm.transfer(rt.Message().Receiver(), builtin.BurntFundsActorAddr, act.Balance) rt.vm.transfer(rt.Message().Receiver(), builtin.BurntFundsActorAddr, act.Balance)
} }

View File

@ -210,7 +210,7 @@ func (vm *VM) send(ctx context.Context, msg *types.Message, parent *Runtime,
if types.BigCmp(msg.Value, types.NewInt(0)) != 0 { if types.BigCmp(msg.Value, types.NewInt(0)) != 0 {
if err := vm.transfer(msg.From, msg.To, msg.Value); err != nil { if err := vm.transfer(msg.From, msg.To, msg.Value); err != nil {
return nil, aerrors.Absorb(err, 1, "failed to transfer funds"), nil return nil, aerrors.Wrap(err, "failed to transfer funds"), nil
} }
} }
@ -602,36 +602,36 @@ func (vm *VM) incrementNonce(addr address.Address) error {
}) })
} }
func (vm *VM) transfer(from, to address.Address, amt types.BigInt) error { func (vm *VM) transfer(from, to address.Address, amt types.BigInt) aerrors.ActorError {
if from == to { if from == to {
return nil return nil
} }
if amt.LessThan(types.NewInt(0)) { if amt.LessThan(types.NewInt(0)) {
return xerrors.Errorf("attempted to transfer negative value") return aerrors.New(exitcode.SysErrSenderInvalid, "attempted to transfer negative value")
} }
f, err := vm.cstate.GetActor(from) f, err := vm.cstate.GetActor(from)
if err != nil { if err != nil {
return xerrors.Errorf("transfer failed when retrieving sender actor") return aerrors.Newf(exitcode.SysErrSenderInvalid, "transfer failed when retrieving sender actor: %s", err)
} }
t, err := vm.cstate.GetActor(to) t, err := vm.cstate.GetActor(to)
if err != nil { if err != nil {
return xerrors.Errorf("transfer failed when retrieving receiver actor") return aerrors.Newf(exitcode.SysErrInvalidReceiver, "transfer failed when retrieving receiver actor: %s", err)
} }
if err := deductFunds(f, amt); err != nil { if err := deductFunds(f, amt); err != nil {
return err return aerrors.Newf(exitcode.SysErrInsufficientFunds, "transfer failed when deducting funds: %s", err)
} }
depositFunds(t, amt) depositFunds(t, amt)
if err := vm.cstate.SetActor(from, f); err != nil { if err := vm.cstate.SetActor(from, f); err != nil {
return err return aerrors.Newf(exitcode.ErrIllegalState, "transfer failed when setting receiver actor: %s", err)
} }
if err := vm.cstate.SetActor(to, t); err != nil { if err := vm.cstate.SetActor(to, t); err != nil {
return err return aerrors.Newf(exitcode.ErrIllegalState, "transfer failed when setting sender actor: %s", err)
} }
return nil return nil