From 4abc7416f63503fbc304ce39b1c2ebcc3e0c58ad Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 4 Aug 2020 17:27:27 -0400 Subject: [PATCH] fix: make DeleteActor(beneficiary) transfer funds to beneficiary (instead of burning funds) --- chain/vm/runtime.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/chain/vm/runtime.go b/chain/vm/runtime.go index 9985d4a73..883fc3941 100644 --- a/chain/vm/runtime.go +++ b/chain/vm/runtime.go @@ -294,7 +294,10 @@ func (rt *Runtime) CreateActor(codeID cid.Cid, address address.Address) { _ = rt.chargeGasSafe(gasOnActorExec) } -func (rt *Runtime) DeleteActor(addr address.Address) { +// Deletes the executing actor from the state tree, transferring any balance to beneficiary. +// Aborts if the beneficiary does not exist. +// May only be called by the actor itself. +func (rt *Runtime) DeleteActor(beneficiary address.Address) { rt.chargeGas(rt.Pricelist().OnDeleteActor()) act, err := rt.state.GetActor(rt.Message().Receiver()) if err != nil { @@ -304,11 +307,13 @@ func (rt *Runtime) DeleteActor(addr address.Address) { panic(aerrors.Fatalf("failed to get actor: %s", err)) } if !act.Balance.IsZero() { - if err := rt.vm.transfer(rt.Message().Receiver(), builtin.BurntFundsActorAddr, act.Balance); err != nil { - panic(aerrors.Fatalf("failed to transfer balance to burnt funds actor: %s", err)) + // Transfer the executing actor's balance to the beneficiary + if err := rt.vm.transfer(rt.Message().Receiver(), beneficiary, act.Balance); err != nil { + panic(aerrors.Fatalf("failed to transfer balance to beneficiary actor: %s", err)) } } + // Delete the executing actor if err := rt.state.DeleteActor(rt.Message().Receiver()); err != nil { panic(aerrors.Fatalf("failed to delete actor: %s", err)) }