2020-02-11 20:48:03 +00:00
|
|
|
package genesis
|
|
|
|
|
|
|
|
import (
|
|
|
|
"context"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/go-address"
|
|
|
|
"github.com/filecoin-project/specs-actors/actors/abi"
|
|
|
|
cbg "github.com/whyrusleeping/cbor-gen"
|
|
|
|
"golang.org/x/xerrors"
|
|
|
|
|
|
|
|
"github.com/filecoin-project/lotus/chain/actors"
|
|
|
|
"github.com/filecoin-project/lotus/chain/types"
|
|
|
|
"github.com/filecoin-project/lotus/chain/vm"
|
|
|
|
)
|
|
|
|
|
|
|
|
func mustEnc(i cbg.CBORMarshaler) []byte {
|
|
|
|
enc, err := actors.SerializeParams(i)
|
|
|
|
if err != nil {
|
|
|
|
panic(err) // ok
|
|
|
|
}
|
|
|
|
return enc
|
|
|
|
}
|
|
|
|
|
|
|
|
func doExec(ctx context.Context, vm *vm.VM, to, from address.Address, method abi.MethodNum, params []byte) ([]byte, error) {
|
|
|
|
return doExecValue(ctx, vm, to, from, types.NewInt(0), method, params)
|
|
|
|
}
|
|
|
|
|
|
|
|
func doExecValue(ctx context.Context, vm *vm.VM, to, from address.Address, value types.BigInt, method abi.MethodNum, params []byte) ([]byte, error) {
|
|
|
|
act, err := vm.StateTree().GetActor(from)
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("doExec failed to get from actor: %w", err)
|
|
|
|
}
|
|
|
|
|
2020-03-25 08:46:42 +00:00
|
|
|
ret, err := vm.ApplyImplicitMessage(ctx, &types.Message{
|
2020-02-11 20:48:03 +00:00
|
|
|
To: to,
|
|
|
|
From: from,
|
|
|
|
Method: method,
|
|
|
|
Params: params,
|
2020-03-18 20:45:37 +00:00
|
|
|
GasLimit: 1000000,
|
2020-02-11 20:48:03 +00:00
|
|
|
GasPrice: types.NewInt(0),
|
|
|
|
Value: value,
|
|
|
|
Nonce: act.Nonce,
|
|
|
|
})
|
|
|
|
if err != nil {
|
|
|
|
return nil, xerrors.Errorf("doExec apply message failed: %w", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
if ret.ExitCode != 0 {
|
2020-02-17 07:59:53 +00:00
|
|
|
return nil, xerrors.Errorf("failed to call method: %w", ret.ActorErr)
|
2020-02-11 20:48:03 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return ret.Return, nil
|
|
|
|
}
|