From 5626c69ce5641d425e4e08a1a05b5debe0e19fdc Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 27 Sep 2022 09:31:48 +0200 Subject: [PATCH 001/282] wip: abstract common fns required for consensus --- chain/consensus/common.go | 466 +++++++++++++++++++++++++++++ chain/consensus/filcns/filecoin.go | 432 ++------------------------ chain/consensus/filcns/mine.go | 80 +---- chain/consensus/iface.go | 59 +++- chain/sub/incoming.go | 2 +- 5 files changed, 559 insertions(+), 480 deletions(-) create mode 100644 chain/consensus/common.go diff --git a/chain/consensus/common.go b/chain/consensus/common.go new file mode 100644 index 00000000000..c3a1120aaf0 --- /dev/null +++ b/chain/consensus/common.go @@ -0,0 +1,466 @@ +package consensus + +import ( + "context" + "fmt" + "strings" + + "go.opencensus.io/stats" + "golang.org/x/xerrors" + + "github.com/hashicorp/go-multierror" + "github.com/ipfs/go-cid" + cbor "github.com/ipfs/go-ipld-cbor" + logging "github.com/ipfs/go-log/v2" + pubsub "github.com/libp2p/go-libp2p-pubsub" + cbg "github.com/whyrusleeping/cbor-gen" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" + bstore "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/state" + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" + "github.com/filecoin-project/lotus/lib/async" + "github.com/filecoin-project/lotus/lib/sigs" + "github.com/filecoin-project/lotus/metrics" + blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" +) + +// Common operations shared by all consensus algorithm implementations. +var log = logging.Logger("consensus-common") + +// RunAsyncChecks accepts a list of checks to perform in parallel. +// +// Each consensus algorithm may choose to perform a set of different +// checks when a new blocks is received. +func RunAsyncChecks(ctx context.Context, await []async.ErrorFuture) error { + var merr error + for _, fut := range await { + if err := fut.AwaitContext(ctx); err != nil { + merr = multierror.Append(merr, err) + } + } + if merr != nil { + mulErr := merr.(*multierror.Error) + mulErr.ErrorFormat = func(es []error) string { + if len(es) == 1 { + return fmt.Sprintf("1 error occurred:\n\t* %+v\n\n", es[0]) + } + + points := make([]string, len(es)) + for i, err := range es { + points[i] = fmt.Sprintf("* %+v", err) + } + + return fmt.Sprintf( + "%d errors occurred:\n\t%s\n\n", + len(es), strings.Join(points, "\n\t")) + } + return mulErr + } + + return nil +} + +// CommonBlkChecks performed by all consensus implementations. +//TODO: Take stateManager and ChainStore in a common object abstracted by all consensus algorithms? +func CommonBlkChecks(ctx context.Context, sm *stmgr.StateManager, cs *store.ChainStore, + b *types.FullBlock, baseTs *types.TipSet) []async.ErrorFuture { + h := b.Header + msgsCheck := async.Err(func() error { + if b.Cid() == build.WhitelistedBlock { + return nil + } + + if err := checkBlockMessages(ctx, sm, cs, b, baseTs); err != nil { + return xerrors.Errorf("block had invalid messages: %w", err) + } + return nil + }) + + baseFeeCheck := async.Err(func() error { + baseFee, err := cs.ComputeBaseFee(ctx, baseTs) + if err != nil { + return xerrors.Errorf("computing base fee: %w", err) + } + if types.BigCmp(baseFee, b.Header.ParentBaseFee) != 0 { + return xerrors.Errorf("base fee doesn't match: %s (header) != %s (computed)", + b.Header.ParentBaseFee, baseFee) + } + return nil + }) + + stateRootCheck := async.Err(func() error { + stateroot, precp, err := sm.TipSetState(ctx, baseTs) + if err != nil { + return xerrors.Errorf("get tipsetstate(%d, %s) failed: %w", h.Height, h.Parents, err) + } + + if stateroot != h.ParentStateRoot { + msgs, err := cs.MessagesForTipset(ctx, baseTs) + if err != nil { + log.Error("failed to load messages for tipset during tipset state mismatch error: ", err) + } else { + log.Warn("Messages for tipset with mismatching state:") + for i, m := range msgs { + mm := m.VMMessage() + log.Warnf("Message[%d]: from=%s to=%s method=%d params=%x", i, mm.From, mm.To, mm.Method, mm.Params) + } + } + + return xerrors.Errorf("parent state root did not match computed state (%s != %s)", h.ParentStateRoot, stateroot) + } + + if precp != h.ParentMessageReceipts { + return xerrors.Errorf("parent receipts root did not match computed value (%s != %s)", precp, h.ParentMessageReceipts) + } + return nil + }) + + return []async.ErrorFuture{ + msgsCheck, + baseFeeCheck, + stateRootCheck, + } +} + +// Check the validity of the messages included in a block. +// TODO: We should extract this somewhere else and make the message pool and miner use the same logic +func checkBlockMessages(ctx context.Context, sm *stmgr.StateManager, cs *store.ChainStore, b *types.FullBlock, baseTs *types.TipSet) error { + { + var sigCids []cid.Cid // this is what we get for people not wanting the marshalcbor method on the cid type + var pubks [][]byte + + for _, m := range b.BlsMessages { + sigCids = append(sigCids, m.Cid()) + + pubk, err := sm.GetBlsPublicKey(ctx, m.From, baseTs) + if err != nil { + return xerrors.Errorf("failed to load bls public to validate block: %w", err) + } + + pubks = append(pubks, pubk) + } + + if err := VerifyBlsAggregate(ctx, b.Header.BLSAggregate, sigCids, pubks); err != nil { + return xerrors.Errorf("bls aggregate signature was invalid: %w", err) + } + } + + nonces := make(map[address.Address]uint64) + + stateroot, _, err := sm.TipSetState(ctx, baseTs) + if err != nil { + return xerrors.Errorf("failed to compute tipsettate for %s: %w", baseTs.Key(), err) + } + + st, err := state.LoadStateTree(cs.ActorStore(ctx), stateroot) + if err != nil { + return xerrors.Errorf("failed to load base state tree: %w", err) + } + + nv := sm.GetNetworkVersion(ctx, b.Header.Height) + pl := vm.PricelistByEpoch(b.Header.Height) + var sumGasLimit int64 + checkMsg := func(msg types.ChainMsg) error { + m := msg.VMMessage() + + // Phase 1: syntactic validation, as defined in the spec + minGas := pl.OnChainMessage(msg.ChainLength()) + if err := m.ValidForBlockInclusion(minGas.Total(), nv); err != nil { + return xerrors.Errorf("msg %s invalid for block inclusion: %w", m.Cid(), err) + } + + // ValidForBlockInclusion checks if any single message does not exceed BlockGasLimit + // So below is overflow safe + sumGasLimit += m.GasLimit + if sumGasLimit > build.BlockGasLimit { + return xerrors.Errorf("block gas limit exceeded") + } + + // Phase 2: (Partial) semantic validation: + // the sender exists and is an account actor, and the nonces make sense + var sender address.Address + if nv >= network.Version13 { + sender, err = st.LookupID(m.From) + if err != nil { + return xerrors.Errorf("failed to lookup sender %s: %w", m.From, err) + } + } else { + sender = m.From + } + + if _, ok := nonces[sender]; !ok { + // `GetActor` does not validate that this is an account actor. + act, err := st.GetActor(sender) + if err != nil { + return xerrors.Errorf("failed to get actor: %w", err) + } + + if !builtin.IsAccountActor(act.Code) { + return xerrors.New("Sender must be an account actor") + } + nonces[sender] = act.Nonce + } + + if nonces[sender] != m.Nonce { + return xerrors.Errorf("wrong nonce (exp: %d, got: %d)", nonces[sender], m.Nonce) + } + nonces[sender]++ + + return nil + } + + // Validate message arrays in a temporary blockstore. + tmpbs := bstore.NewMemory() + tmpstore := blockadt.WrapStore(ctx, cbor.NewCborStore(tmpbs)) + + bmArr := blockadt.MakeEmptyArray(tmpstore) + for i, m := range b.BlsMessages { + if err := checkMsg(m); err != nil { + return xerrors.Errorf("block had invalid bls message at index %d: %w", i, err) + } + + c, err := store.PutMessage(ctx, tmpbs, m) + if err != nil { + return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) + } + + k := cbg.CborCid(c) + if err := bmArr.Set(uint64(i), &k); err != nil { + return xerrors.Errorf("failed to put bls message at index %d: %w", i, err) + } + } + + smArr := blockadt.MakeEmptyArray(tmpstore) + for i, m := range b.SecpkMessages { + if sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version14 { + if m.Signature.Type != crypto.SigTypeSecp256k1 { + return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) + } + } + + if err := checkMsg(m); err != nil { + return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) + } + + // `From` being an account actor is only validated inside the `vm.ResolveToKeyAddr` call + // in `StateManager.ResolveToKeyAddress` here (and not in `checkMsg`). + kaddr, err := sm.ResolveToKeyAddress(ctx, m.Message.From, baseTs) + if err != nil { + return xerrors.Errorf("failed to resolve key addr: %w", err) + } + + if err := sigs.Verify(&m.Signature, kaddr, m.Message.Cid().Bytes()); err != nil { + return xerrors.Errorf("secpk message %s has invalid signature: %w", m.Cid(), err) + } + + c, err := store.PutMessage(ctx, tmpbs, m) + if err != nil { + return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) + } + k := cbg.CborCid(c) + if err := smArr.Set(uint64(i), &k); err != nil { + return xerrors.Errorf("failed to put secpk message at index %d: %w", i, err) + } + } + + bmroot, err := bmArr.Root() + if err != nil { + return xerrors.Errorf("failed to root bls msgs: %w", err) + + } + + smroot, err := smArr.Root() + if err != nil { + return xerrors.Errorf("failed to root secp msgs: %w", err) + } + + mrcid, err := tmpstore.Put(ctx, &types.MsgMeta{ + BlsMessages: bmroot, + SecpkMessages: smroot, + }) + if err != nil { + return xerrors.Errorf("failed to put msg meta: %w", err) + } + + if b.Header.Messages != mrcid { + return fmt.Errorf("messages didnt match message root in header") + } + + // Finally, flush. + err = vm.Copy(ctx, tmpbs, cs.ChainBlockstore(), mrcid) + if err != nil { + return xerrors.Errorf("failed to flush:%w", err) + } + + return nil +} + +// MsgsFromBlockTemplate extracts the different types of messages from a block +// template and populates the header for the next block to be proposed. +func MsgsFromBlockTemplate(ctx context.Context, sm *stmgr.StateManager, next *types.BlockHeader, + pts *types.TipSet, bt *api.BlockTemplate) ([]*types.Message, []*types.SignedMessage, error) { + + var blsMessages []*types.Message + var secpkMessages []*types.SignedMessage + + var blsMsgCids, secpkMsgCids []cid.Cid + var blsSigs []crypto.Signature + for _, msg := range bt.Messages { + if msg.Signature.Type == crypto.SigTypeBLS { + blsSigs = append(blsSigs, msg.Signature) + blsMessages = append(blsMessages, &msg.Message) + + c, err := sm.ChainStore().PutMessage(ctx, &msg.Message) + if err != nil { + return nil, nil, err + } + + blsMsgCids = append(blsMsgCids, c) + } else if msg.Signature.Type == crypto.SigTypeSecp256k1 { + c, err := sm.ChainStore().PutMessage(ctx, msg) + if err != nil { + return nil, nil, err + } + + secpkMsgCids = append(secpkMsgCids, c) + secpkMessages = append(secpkMessages, msg) + + } else { + return nil, nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) + } + } + + store := sm.ChainStore().ActorStore(ctx) + blsmsgroot, err := ToMessagesArray(store, blsMsgCids) + if err != nil { + return nil, nil, xerrors.Errorf("building bls amt: %w", err) + } + secpkmsgroot, err := ToMessagesArray(store, secpkMsgCids) + if err != nil { + return nil, nil, xerrors.Errorf("building secpk amt: %w", err) + } + + mmcid, err := store.Put(store.Context(), &types.MsgMeta{ + BlsMessages: blsmsgroot, + SecpkMessages: secpkmsgroot, + }) + if err != nil { + return nil, nil, err + } + next.Messages = mmcid + + aggSig, err := AggregateSignatures(blsSigs) + if err != nil { + return nil, nil, err + } + + next.BLSAggregate = aggSig + pweight, err := sm.ChainStore().Weight(ctx, pts) + if err != nil { + return nil, nil, err + } + next.ParentWeight = pweight + + baseFee, err := sm.ChainStore().ComputeBaseFee(ctx, pts) + if err != nil { + return nil, nil, xerrors.Errorf("computing base fee: %w", err) + } + next.ParentBaseFee = baseFee + + return blsMessages, secpkMessages, err + +} + +// Basic sanity-checks performed when a block is proposed locally. +func validateLocalBlock(ctx context.Context, msg *pubsub.Message) (pubsub.ValidationResult, string) { + stats.Record(ctx, metrics.BlockPublished.M(1)) + + if size := msg.Size(); size > 1<<20-1<<15 { + log.Errorf("ignoring oversize block (%dB)", size) + return pubsub.ValidationIgnore, "oversize_block" + } + + blk, what, err := decodeAndCheckBlock(msg) + if err != nil { + log.Errorf("got invalid local block: %s", err) + return pubsub.ValidationIgnore, what + } + + msg.ValidatorData = blk + stats.Record(ctx, metrics.BlockValidationSuccess.M(1)) + return pubsub.ValidationAccept, "" +} + +func decodeAndCheckBlock(msg *pubsub.Message) (*types.BlockMsg, string, error) { + blk, err := types.DecodeBlockMsg(msg.GetData()) + if err != nil { + return nil, "invalid", xerrors.Errorf("error decoding block: %w", err) + } + + if count := len(blk.BlsMessages) + len(blk.SecpkMessages); count > build.BlockMessageLimit { + return nil, "too_many_messages", fmt.Errorf("block contains too many messages (%d)", count) + } + + // make sure we have a signature + if blk.Header.BlockSig == nil { + return nil, "missing_signature", fmt.Errorf("block without a signature") + } + + return blk, "", nil +} + +func validateMsgMeta(ctx context.Context, msg *types.BlockMsg) error { + // TODO there has to be a simpler way to do this without the blockstore dance + // block headers use adt0 + store := blockadt.WrapStore(ctx, cbor.NewCborStore(bstore.NewMemory())) + bmArr := blockadt.MakeEmptyArray(store) + smArr := blockadt.MakeEmptyArray(store) + + for i, m := range msg.BlsMessages { + c := cbg.CborCid(m) + if err := bmArr.Set(uint64(i), &c); err != nil { + return err + } + } + + for i, m := range msg.SecpkMessages { + c := cbg.CborCid(m) + if err := smArr.Set(uint64(i), &c); err != nil { + return err + } + } + + bmroot, err := bmArr.Root() + if err != nil { + return err + } + + smroot, err := smArr.Root() + if err != nil { + return err + } + + mrcid, err := store.Put(store.Context(), &types.MsgMeta{ + BlsMessages: bmroot, + SecpkMessages: smroot, + }) + + if err != nil { + return err + } + + if msg.Header.Messages != mrcid { + return fmt.Errorf("messages didn't match root cid in header") + } + + return nil +} diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index de3cf7cf7d6..24aa3ffb480 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -4,18 +4,11 @@ import ( "bytes" "context" "errors" - "fmt" "os" - "strings" "time" - "github.com/hashicorp/go-multierror" "github.com/ipfs/go-cid" - cbor "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" - pubsub "github.com/libp2p/go-libp2p-pubsub" - cbg "github.com/whyrusleeping/cbor-gen" - "go.opencensus.io/stats" "go.opencensus.io/trace" "golang.org/x/xerrors" @@ -23,25 +16,20 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" - blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" "github.com/filecoin-project/specs-actors/v7/actors/runtime/proof" - bstore "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" - "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/rand" - "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" - "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/lib/async" "github.com/filecoin-project/lotus/lib/sigs" - "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" "github.com/filecoin-project/lotus/storage/sealer/storiface" ) @@ -125,17 +113,6 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) log.Warn("Got block from the future, but within threshold", h.Timestamp, build.Clock.Now().Unix()) } - msgsCheck := async.Err(func() error { - if b.Cid() == build.WhitelistedBlock { - return nil - } - - if err := filec.checkBlockMessages(ctx, b, baseTs); err != nil { - return xerrors.Errorf("block had invalid messages: %w", err) - } - return nil - }) - minerCheck := async.Err(func() error { if err := filec.minerIsValid(ctx, h.Miner, baseTs); err != nil { return xerrors.Errorf("minerIsValid failed: %w", err) @@ -143,17 +120,6 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return nil }) - baseFeeCheck := async.Err(func() error { - baseFee, err := filec.store.ComputeBaseFee(ctx, baseTs) - if err != nil { - return xerrors.Errorf("computing base fee: %w", err) - } - if types.BigCmp(baseFee, b.Header.ParentBaseFee) != 0 { - return xerrors.Errorf("base fee doesn't match: %s (header) != %s (computed)", - b.Header.ParentBaseFee, baseFee) - } - return nil - }) pweight, err := filec.store.Weight(ctx, baseTs) if err != nil { return xerrors.Errorf("getting parent weight: %w", err) @@ -164,34 +130,6 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) b.Header.ParentWeight, pweight) } - stateRootCheck := async.Err(func() error { - stateroot, precp, err := filec.sm.TipSetState(ctx, baseTs) - if err != nil { - return xerrors.Errorf("get tipsetstate(%d, %s) failed: %w", h.Height, h.Parents, err) - } - - if stateroot != h.ParentStateRoot { - msgs, err := filec.store.MessagesForTipset(ctx, baseTs) - if err != nil { - log.Error("failed to load messages for tipset during tipset state mismatch error: ", err) - } else { - log.Warn("Messages for tipset with mismatching state:") - for i, m := range msgs { - mm := m.VMMessage() - log.Warnf("Message[%d]: from=%s to=%s method=%d params=%x", i, mm.From, mm.To, mm.Method, mm.Params) - } - } - - return xerrors.Errorf("parent state root did not match computed state (%s != %s)", h.ParentStateRoot, stateroot) - } - - if precp != h.ParentMessageReceipts { - return xerrors.Errorf("parent receipts root did not match computed value (%s != %s)", precp, h.ParentMessageReceipts) - } - - return nil - }) - // Stuff that needs worker address waddr, err := stmgr.GetMinerWorkerRaw(ctx, filec.sm, lbst, h.Miner) if err != nil { @@ -253,10 +191,11 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) }) blockSigCheck := async.Err(func() error { - if err := sigs.CheckBlockSignature(ctx, h, waddr); err != nil { + if err := filec.VerifyBlockSignature(ctx, h, waddr); err != nil { return xerrors.Errorf("check block signature failed: %w", err) } return nil + }) beaconValuesCheck := async.Err(func() error { @@ -305,44 +244,17 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) return nil }) - await := []async.ErrorFuture{ + commonChecks := consensus.CommonBlkChecks(ctx, filec.sm, filec.store, b, baseTs) + await := append([]async.ErrorFuture{ minerCheck, tktsCheck, blockSigCheck, beaconValuesCheck, wproofCheck, winnerCheck, - msgsCheck, - baseFeeCheck, - stateRootCheck, - } + }, commonChecks...) - var merr error - for _, fut := range await { - if err := fut.AwaitContext(ctx); err != nil { - merr = multierror.Append(merr, err) - } - } - if merr != nil { - mulErr := merr.(*multierror.Error) - mulErr.ErrorFormat = func(es []error) string { - if len(es) == 1 { - return fmt.Sprintf("1 error occurred:\n\t* %+v\n\n", es[0]) - } - - points := make([]string, len(es)) - for i, err := range es { - points[i] = fmt.Sprintf("* %+v", err) - } - - return fmt.Sprintf( - "%d errors occurred:\n\t%s\n\n", - len(es), strings.Join(points, "\n\t")) - } - return mulErr - } - - return nil + return consensus.RunAsyncChecks(ctx, await) } func blockSanityChecks(h *types.BlockHeader) error { @@ -433,178 +345,6 @@ func (filec *FilecoinEC) VerifyWinningPoStProof(ctx context.Context, nv network. return nil } -// TODO: We should extract this somewhere else and make the message pool and miner use the same logic -func (filec *FilecoinEC) checkBlockMessages(ctx context.Context, b *types.FullBlock, baseTs *types.TipSet) error { - { - var sigCids []cid.Cid // this is what we get for people not wanting the marshalcbor method on the cid type - var pubks [][]byte - - for _, m := range b.BlsMessages { - sigCids = append(sigCids, m.Cid()) - - pubk, err := filec.sm.GetBlsPublicKey(ctx, m.From, baseTs) - if err != nil { - return xerrors.Errorf("failed to load bls public to validate block: %w", err) - } - - pubks = append(pubks, pubk) - } - - if err := consensus.VerifyBlsAggregate(ctx, b.Header.BLSAggregate, sigCids, pubks); err != nil { - return xerrors.Errorf("bls aggregate signature was invalid: %w", err) - } - } - - nonces := make(map[address.Address]uint64) - - stateroot, _, err := filec.sm.TipSetState(ctx, baseTs) - if err != nil { - return xerrors.Errorf("failed to compute tipsettate for %s: %w", baseTs.Key(), err) - } - - st, err := state.LoadStateTree(filec.store.ActorStore(ctx), stateroot) - if err != nil { - return xerrors.Errorf("failed to load base state tree: %w", err) - } - - nv := filec.sm.GetNetworkVersion(ctx, b.Header.Height) - pl := vm.PricelistByEpoch(b.Header.Height) - var sumGasLimit int64 - checkMsg := func(msg types.ChainMsg) error { - m := msg.VMMessage() - - // Phase 1: syntactic validation, as defined in the spec - minGas := pl.OnChainMessage(msg.ChainLength()) - if err := m.ValidForBlockInclusion(minGas.Total(), nv); err != nil { - return xerrors.Errorf("msg %s invalid for block inclusion: %w", m.Cid(), err) - } - - // ValidForBlockInclusion checks if any single message does not exceed BlockGasLimit - // So below is overflow safe - sumGasLimit += m.GasLimit - if sumGasLimit > build.BlockGasLimit { - return xerrors.Errorf("block gas limit exceeded") - } - - // Phase 2: (Partial) semantic validation: - // the sender exists and is an account actor, and the nonces make sense - var sender address.Address - if nv >= network.Version13 { - sender, err = st.LookupID(m.From) - if err != nil { - return xerrors.Errorf("failed to lookup sender %s: %w", m.From, err) - } - } else { - sender = m.From - } - - if _, ok := nonces[sender]; !ok { - // `GetActor` does not validate that this is an account actor. - act, err := st.GetActor(sender) - if err != nil { - return xerrors.Errorf("failed to get actor: %w", err) - } - - if !builtin.IsAccountActor(act.Code) { - return xerrors.New("Sender must be an account actor") - } - nonces[sender] = act.Nonce - } - - if nonces[sender] != m.Nonce { - return xerrors.Errorf("wrong nonce (exp: %d, got: %d)", nonces[sender], m.Nonce) - } - nonces[sender]++ - - return nil - } - - // Validate message arrays in a temporary blockstore. - tmpbs := bstore.NewMemory() - tmpstore := blockadt.WrapStore(ctx, cbor.NewCborStore(tmpbs)) - - bmArr := blockadt.MakeEmptyArray(tmpstore) - for i, m := range b.BlsMessages { - if err := checkMsg(m); err != nil { - return xerrors.Errorf("block had invalid bls message at index %d: %w", i, err) - } - - c, err := store.PutMessage(ctx, tmpbs, m) - if err != nil { - return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) - } - - k := cbg.CborCid(c) - if err := bmArr.Set(uint64(i), &k); err != nil { - return xerrors.Errorf("failed to put bls message at index %d: %w", i, err) - } - } - - smArr := blockadt.MakeEmptyArray(tmpstore) - for i, m := range b.SecpkMessages { - if filec.sm.GetNetworkVersion(ctx, b.Header.Height) >= network.Version14 { - if m.Signature.Type != crypto.SigTypeSecp256k1 { - return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) - } - } - - if err := checkMsg(m); err != nil { - return xerrors.Errorf("block had invalid secpk message at index %d: %w", i, err) - } - - // `From` being an account actor is only validated inside the `vm.ResolveToKeyAddr` call - // in `StateManager.ResolveToKeyAddress` here (and not in `checkMsg`). - kaddr, err := filec.sm.ResolveToKeyAddress(ctx, m.Message.From, baseTs) - if err != nil { - return xerrors.Errorf("failed to resolve key addr: %w", err) - } - - if err := sigs.Verify(&m.Signature, kaddr, m.Message.Cid().Bytes()); err != nil { - return xerrors.Errorf("secpk message %s has invalid signature: %w", m.Cid(), err) - } - - c, err := store.PutMessage(ctx, tmpbs, m) - if err != nil { - return xerrors.Errorf("failed to store message %s: %w", m.Cid(), err) - } - k := cbg.CborCid(c) - if err := smArr.Set(uint64(i), &k); err != nil { - return xerrors.Errorf("failed to put secpk message at index %d: %w", i, err) - } - } - - bmroot, err := bmArr.Root() - if err != nil { - return xerrors.Errorf("failed to root bls msgs: %w", err) - - } - - smroot, err := smArr.Root() - if err != nil { - return xerrors.Errorf("failed to root secp msgs: %w", err) - } - - mrcid, err := tmpstore.Put(ctx, &types.MsgMeta{ - BlsMessages: bmroot, - SecpkMessages: smroot, - }) - if err != nil { - return xerrors.Errorf("failed to put msg meta: %w", err) - } - - if b.Header.Messages != mrcid { - return fmt.Errorf("messages didnt match message root in header") - } - - // Finally, flush. - err = vm.Copy(ctx, tmpbs, filec.store.ChainBlockstore(), mrcid) - if err != nil { - return xerrors.Errorf("failed to flush:%w", err) - } - - return nil -} - func (filec *FilecoinEC) IsEpochBeyondCurrMax(epoch abi.ChainEpoch) bool { if filec.genesis == nil { return false @@ -660,140 +400,7 @@ func VerifyVRF(ctx context.Context, worker address.Address, vrfBase, vrfproof [] var ErrSoftFailure = errors.New("soft validation failure") var ErrInsufficientPower = errors.New("incoming block's miner does not have minimum power") -func (filec *FilecoinEC) ValidateBlockPubsub(ctx context.Context, self bool, msg *pubsub.Message) (pubsub.ValidationResult, string) { - if self { - return filec.validateLocalBlock(ctx, msg) - } - - // track validation time - begin := build.Clock.Now() - defer func() { - log.Debugf("block validation time: %s", build.Clock.Since(begin)) - }() - - stats.Record(ctx, metrics.BlockReceived.M(1)) - - recordFailureFlagPeer := func(what string) { - // bv.Validate will flag the peer in that case - panic(what) - } - - blk, what, err := filec.decodeAndCheckBlock(msg) - if err != nil { - log.Error("got invalid block over pubsub: ", err) - recordFailureFlagPeer(what) - return pubsub.ValidationReject, what - } - - // validate the block meta: the Message CID in the header must match the included messages - err = filec.validateMsgMeta(ctx, blk) - if err != nil { - log.Warnf("error validating message metadata: %s", err) - recordFailureFlagPeer("invalid_block_meta") - return pubsub.ValidationReject, "invalid_block_meta" - } - - reject, err := filec.validateBlockHeader(ctx, blk.Header) - if err != nil { - if reject == "" { - log.Warn("ignoring block msg: ", err) - return pubsub.ValidationIgnore, reject - } - recordFailureFlagPeer(reject) - return pubsub.ValidationReject, reject - } - - // all good, accept the block - msg.ValidatorData = blk - stats.Record(ctx, metrics.BlockValidationSuccess.M(1)) - return pubsub.ValidationAccept, "" -} - -func (filec *FilecoinEC) validateLocalBlock(ctx context.Context, msg *pubsub.Message) (pubsub.ValidationResult, string) { - stats.Record(ctx, metrics.BlockPublished.M(1)) - - if size := msg.Size(); size > 1<<20-1<<15 { - log.Errorf("ignoring oversize block (%dB)", size) - return pubsub.ValidationIgnore, "oversize_block" - } - - blk, what, err := filec.decodeAndCheckBlock(msg) - if err != nil { - log.Errorf("got invalid local block: %s", err) - return pubsub.ValidationIgnore, what - } - - msg.ValidatorData = blk - stats.Record(ctx, metrics.BlockValidationSuccess.M(1)) - return pubsub.ValidationAccept, "" -} - -func (filec *FilecoinEC) decodeAndCheckBlock(msg *pubsub.Message) (*types.BlockMsg, string, error) { - blk, err := types.DecodeBlockMsg(msg.GetData()) - if err != nil { - return nil, "invalid", xerrors.Errorf("error decoding block: %w", err) - } - - if count := len(blk.BlsMessages) + len(blk.SecpkMessages); count > build.BlockMessageLimit { - return nil, "too_many_messages", fmt.Errorf("block contains too many messages (%d)", count) - } - - // make sure we have a signature - if blk.Header.BlockSig == nil { - return nil, "missing_signature", fmt.Errorf("block without a signature") - } - - return blk, "", nil -} - -func (filec *FilecoinEC) validateMsgMeta(ctx context.Context, msg *types.BlockMsg) error { - // TODO there has to be a simpler way to do this without the blockstore dance - // block headers use adt0 - store := blockadt.WrapStore(ctx, cbor.NewCborStore(bstore.NewMemory())) - bmArr := blockadt.MakeEmptyArray(store) - smArr := blockadt.MakeEmptyArray(store) - - for i, m := range msg.BlsMessages { - c := cbg.CborCid(m) - if err := bmArr.Set(uint64(i), &c); err != nil { - return err - } - } - - for i, m := range msg.SecpkMessages { - c := cbg.CborCid(m) - if err := smArr.Set(uint64(i), &c); err != nil { - return err - } - } - - bmroot, err := bmArr.Root() - if err != nil { - return err - } - - smroot, err := smArr.Root() - if err != nil { - return err - } - - mrcid, err := store.Put(store.Context(), &types.MsgMeta{ - BlsMessages: bmroot, - SecpkMessages: smroot, - }) - - if err != nil { - return err - } - - if msg.Header.Messages != mrcid { - return fmt.Errorf("messages didn't match root cid in header") - } - - return nil -} - -func (filec *FilecoinEC) validateBlockHeader(ctx context.Context, b *types.BlockHeader) (rejectReason string, err error) { +func (filec *FilecoinEC) ValidateBlockHeader(ctx context.Context, b *types.BlockHeader) (rejectReason string, err error) { // we want to ensure that it is a block from a known miner; we reject blocks from unknown miners // to prevent spam attacks. @@ -868,4 +475,27 @@ func (filec *FilecoinEC) isChainNearSynced() bool { return build.Clock.Since(timestampTime) < 6*time.Hour } +func (filec *FilecoinEC) VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, + addr address.Address) error { + return sigs.CheckBlockSignature(ctx, h, addr) +} + +func (filec *FilecoinEC) SignBlock(ctx context.Context, w api.Wallet, + addr address.Address, next *types.BlockHeader) error { + + nosigbytes, err := next.SigningBytes() + if err != nil { + return xerrors.Errorf("failed to get signing bytes for block: %w", err) + } + + sig, err := w.WalletSign(ctx, addr, nosigbytes, api.MsgMeta{ + Type: api.MTBlock, + }) + if err != nil { + return xerrors.Errorf("failed to sign new block: %w", err) + } + next.BlockSig = sig + return nil +} + var _ consensus.Consensus = &FilecoinEC{} diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index 35e38883d97..68d4cc88c55 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -3,11 +3,8 @@ package filcns import ( "context" - "github.com/ipfs/go-cid" "golang.org/x/xerrors" - "github.com/filecoin-project/go-state-types/crypto" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/stmgr" @@ -49,87 +46,16 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. ParentMessageReceipts: recpts, } - var blsMessages []*types.Message - var secpkMessages []*types.SignedMessage - - var blsMsgCids, secpkMsgCids []cid.Cid - var blsSigs []crypto.Signature - for _, msg := range bt.Messages { - if msg.Signature.Type == crypto.SigTypeBLS { - blsSigs = append(blsSigs, msg.Signature) - blsMessages = append(blsMessages, &msg.Message) - - c, err := filec.sm.ChainStore().PutMessage(ctx, &msg.Message) - if err != nil { - return nil, err - } - - blsMsgCids = append(blsMsgCids, c) - } else if msg.Signature.Type == crypto.SigTypeSecp256k1 { - c, err := filec.sm.ChainStore().PutMessage(ctx, msg) - if err != nil { - return nil, err - } - - secpkMsgCids = append(secpkMsgCids, c) - secpkMessages = append(secpkMessages, msg) - - } else { - return nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) - } - } - - store := filec.sm.ChainStore().ActorStore(ctx) - blsmsgroot, err := consensus.ToMessagesArray(store, blsMsgCids) - if err != nil { - return nil, xerrors.Errorf("building bls amt: %w", err) - } - secpkmsgroot, err := consensus.ToMessagesArray(store, secpkMsgCids) - if err != nil { - return nil, xerrors.Errorf("building secpk amt: %w", err) - } - - mmcid, err := store.Put(store.Context(), &types.MsgMeta{ - BlsMessages: blsmsgroot, - SecpkMessages: secpkmsgroot, - }) + blsMessages, secpkMessages, err := consensus.MsgsFromBlockTemplate(ctx, filec.sm, next, pts, bt) if err != nil { - return nil, err + return nil, xerrors.Errorf("failed to process messages from block template: %w", err) } - next.Messages = mmcid - aggSig, err := consensus.AggregateSignatures(blsSigs) - if err != nil { - return nil, err - } - - next.BLSAggregate = aggSig - pweight, err := filec.sm.ChainStore().Weight(ctx, pts) - if err != nil { - return nil, err - } - next.ParentWeight = pweight - - baseFee, err := filec.sm.ChainStore().ComputeBaseFee(ctx, pts) - if err != nil { - return nil, xerrors.Errorf("computing base fee: %w", err) - } - next.ParentBaseFee = baseFee - - nosigbytes, err := next.SigningBytes() - if err != nil { - return nil, xerrors.Errorf("failed to get signing bytes for block: %w", err) - } - - sig, err := w.WalletSign(ctx, worker, nosigbytes, api.MsgMeta{ - Type: api.MTBlock, - }) + filec.SignBlock(ctx, w, worker, next) if err != nil { return nil, xerrors.Errorf("failed to sign new block: %w", err) } - next.BlockSig = sig - fullBlock := &types.FullBlock{ Header: next, BlsMessages: blsMessages, diff --git a/chain/consensus/iface.go b/chain/consensus/iface.go index 06dc0a11338..ebb8f450e71 100644 --- a/chain/consensus/iface.go +++ b/chain/consensus/iface.go @@ -4,17 +4,74 @@ import ( "context" pubsub "github.com/libp2p/go-libp2p-pubsub" + "go.opencensus.io/stats" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/metrics" ) type Consensus interface { ValidateBlock(ctx context.Context, b *types.FullBlock) (err error) - ValidateBlockPubsub(ctx context.Context, self bool, msg *pubsub.Message) (pubsub.ValidationResult, string) + ValidateBlockHeader(ctx context.Context, b *types.BlockHeader) (rejectReason string, err error) IsEpochBeyondCurrMax(epoch abi.ChainEpoch) bool CreateBlock(ctx context.Context, w api.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) + SignBlock(ctx context.Context, w api.Wallet, addr address.Address, next *types.BlockHeader) error + VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, addr address.Address) error +} + +// ValidateBlockPubsub implements the common checks performed by all consensus implementations +// when a block is received through the pubsub channel. +func ValidateBlockPubsub(ctx context.Context, cns Consensus, self bool, msg *pubsub.Message) (pubsub.ValidationResult, string) { + if self { + return validateLocalBlock(ctx, msg) + } + + // track validation time + begin := build.Clock.Now() + defer func() { + log.Debugf("block validation time: %s", build.Clock.Since(begin)) + }() + + stats.Record(ctx, metrics.BlockReceived.M(1)) + + recordFailureFlagPeer := func(what string) { + // bv.Validate will flag the peer in that case + panic(what) + } + + blk, what, err := decodeAndCheckBlock(msg) + if err != nil { + log.Error("got invalid block over pubsub: ", err) + recordFailureFlagPeer(what) + return pubsub.ValidationReject, what + } + + // validate the block meta: the Message CID in the header must match the included messages + err = validateMsgMeta(ctx, blk) + if err != nil { + log.Warnf("error validating message metadata: %s", err) + recordFailureFlagPeer("invalid_block_meta") + return pubsub.ValidationReject, "invalid_block_meta" + } + + reject, err := cns.ValidateBlockHeader(ctx, blk.Header) + if err != nil { + if reject == "" { + log.Warn("ignoring block msg: ", err) + return pubsub.ValidationIgnore, reject + } + recordFailureFlagPeer(reject) + return pubsub.ValidationReject, reject + } + + // all good, accept the block + msg.ValidatorData = blk + stats.Record(ctx, metrics.BlockValidationSuccess.M(1)) + return pubsub.ValidationAccept, "" } diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index b8427e0368b..2eb846d806d 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -273,7 +273,7 @@ func (bv *BlockValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub }() var what string - res, what = bv.consensus.ValidateBlockPubsub(ctx, pid == bv.self, msg) + res, what = consensus.ValidateBlockPubsub(ctx, bv.consensus, pid == bv.self, msg) if res == pubsub.ValidationAccept { // it's a good block! make sure we've only seen it once if count := bv.recvBlocks.add(msg.ValidatorData.(*types.BlockMsg).Cid()); count > 0 { From 43d557e0f42ddca95c80931bedd54593e81e6c51 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 27 Sep 2022 09:54:21 +0200 Subject: [PATCH 002/282] minor fix --- chain/consensus/common.go | 1 - 1 file changed, 1 deletion(-) diff --git a/chain/consensus/common.go b/chain/consensus/common.go index c3a1120aaf0..714c2de8d56 100644 --- a/chain/consensus/common.go +++ b/chain/consensus/common.go @@ -132,7 +132,6 @@ func CommonBlkChecks(ctx context.Context, sm *stmgr.StateManager, cs *store.Chai } // Check the validity of the messages included in a block. -// TODO: We should extract this somewhere else and make the message pool and miner use the same logic func checkBlockMessages(ctx context.Context, sm *stmgr.StateManager, cs *store.ChainStore, b *types.FullBlock, baseTs *types.TipSet) error { { var sigCids []cid.Cid // this is what we get for people not wanting the marshalcbor method on the cid type From 627d6e70a67fe12383eade11e879c259295768ad Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 27 Sep 2022 12:21:42 +0200 Subject: [PATCH 003/282] parametrized reward function for consensus --- chain/consensus/{filcns => }/compute_state.go | 36 +++++-------------- chain/consensus/filcns/filecoin.go | 32 +++++++++++++++++ chain/consensus/iface.go | 8 +++++ chain/gen/gen.go | 3 +- chain/gen/genesis/genesis.go | 4 +-- chain/gen/genesis/miners.go | 4 +-- chain/stmgr/forks_test.go | 20 +++++------ chain/store/store_test.go | 3 +- chain/types/cbor_gen.go | 7 ++-- chain/vm/cbor_gen.go | 3 +- cli/chain.go | 4 +-- cli/multisig.go | 4 +-- cli/services.go | 4 +-- cli/servicesmock_test.go | 4 +-- cli/state.go | 8 ++--- cmd/lotus-bench/import.go | 3 +- cmd/lotus-shed/balances.go | 5 +-- cmd/lotus-shed/migrations.go | 3 +- cmd/lotus-shed/msg.go | 4 +-- .../simulation/blockbuilder/blockbuilder.go | 4 +-- cmd/lotus-sim/simulation/node.go | 5 +-- cmd/lotus-sim/simulation/simulation.go | 3 +- cmd/lotus-wallet/interactive.go | 6 ++-- cmd/lotus/daemon.go | 3 +- cmd/tvx/extract_many.go | 5 ++- conformance/driver.go | 9 ++--- lotuspond/front/src/chain/methodgen.go | 4 +-- node/builder_chain.go | 2 +- 28 files changed, 113 insertions(+), 87 deletions(-) rename chain/consensus/{filcns => }/compute_state.go (90%) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/compute_state.go similarity index 90% rename from chain/consensus/filcns/compute_state.go rename to chain/consensus/compute_state.go index 9837e265f0f..d0f669a10f5 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/compute_state.go @@ -1,4 +1,4 @@ -package filcns +package consensus import ( "context" @@ -52,10 +52,12 @@ func NewActorRegistry() *vm.ActorRegistry { return inv } -type TipSetExecutor struct{} +type TipSetExecutor struct { + reward RewardFunc +} -func NewTipSetExecutor() *TipSetExecutor { - return &TipSetExecutor{} +func NewTipSetExecutor(r RewardFunc) *TipSetExecutor { + return &TipSetExecutor{reward: r} } func (t *TipSetExecutor) NewActorRegistry() *vm.ActorRegistry { @@ -208,29 +210,9 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, return cid.Undef, cid.Undef, xerrors.Errorf("failed to serialize award params: %w", err) } - rwMsg := &types.Message{ - From: builtin.SystemActorAddr, - To: reward.Address, - Nonce: uint64(epoch), - Value: types.NewInt(0), - GasFeeCap: types.NewInt(0), - GasPremium: types.NewInt(0), - GasLimit: 1 << 30, - Method: reward.Methods.AwardBlockReward, - Params: params, - } - ret, actErr := vmi.ApplyImplicitMessage(ctx, rwMsg) - if actErr != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("failed to apply reward message for miner %s: %w", b.Miner, actErr) - } - if em != nil { - if err := em.MessageApplied(ctx, ts, rwMsg.Cid(), rwMsg, ret, true); err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("callback failed on reward message: %w", err) - } - } - - if ret.ExitCode != 0 { - return cid.Undef, cid.Undef, xerrors.Errorf("reward application message failed (exit %d): %s", ret.ExitCode, ret.ActorErr) + rErr := t.reward(ctx, vmi, em, epoch, ts, params) + if rErr != nil { + return cid.Undef, cid.Undef, xerrors.Errorf("error applying reward: %w", err) } } diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 24aa3ffb480..99612bd5765 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -21,13 +21,16 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" + "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/power" + "github.com/filecoin-project/lotus/chain/actors/builtin/reward" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/lib/async" "github.com/filecoin-project/lotus/lib/sigs" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" @@ -55,6 +58,35 @@ type FilecoinEC struct { // the theoretical max height based on systime are quickly rejected const MaxHeightDrift = 5 +var RewardFunc = func(ctx context.Context, vmi vm.Interface, em stmgr.ExecMonitor, + epoch abi.ChainEpoch, ts *types.TipSet, params []byte) error { + rwMsg := &types.Message{ + From: builtin.SystemActorAddr, + To: reward.Address, + Nonce: uint64(epoch), + Value: types.NewInt(0), + GasFeeCap: types.NewInt(0), + GasPremium: types.NewInt(0), + GasLimit: 1 << 30, + Method: reward.Methods.AwardBlockReward, + Params: params, + } + ret, actErr := vmi.ApplyImplicitMessage(ctx, rwMsg) + if actErr != nil { + return xerrors.Errorf("failed to apply reward message: %w", actErr) + } + if em != nil { + if err := em.MessageApplied(ctx, ts, rwMsg.Cid(), rwMsg, ret, true); err != nil { + return xerrors.Errorf("callback failed on reward message: %w", err) + } + } + + if ret.ExitCode != 0 { + return xerrors.Errorf("reward application message failed (exit %d): %s", ret.ExitCode, ret.ActorErr) + } + return nil +} + func NewFilecoinExpectedConsensus(sm *stmgr.StateManager, beacon beacon.Schedule, verifier storiface.Verifier, genesis chain.Genesis) consensus.Consensus { if build.InsecurePoStValidation { log.Warn("*********************************************************************************************") diff --git a/chain/consensus/iface.go b/chain/consensus/iface.go index ebb8f450e71..63e4c2307d0 100644 --- a/chain/consensus/iface.go +++ b/chain/consensus/iface.go @@ -11,7 +11,9 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/metrics" ) @@ -25,6 +27,12 @@ type Consensus interface { VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, addr address.Address) error } +// RewardFunc parametrizes the logic for rewards when a message is executed. +// +// Each consensus implementation can set their own reward function. +type RewardFunc func(ctx context.Context, vmi vm.Interface, em stmgr.ExecMonitor, + epoch abi.ChainEpoch, ts *types.TipSet, params []byte) error + // ValidateBlockPubsub implements the common checks performed by all consensus implementations // when a block is received through the pubsub channel. func ValidateBlockPubsub(ctx context.Context, cns Consensus, self bool, msg *pubsub.Message) (pubsub.ValidationResult, string) { diff --git a/chain/gen/gen.go b/chain/gen/gen.go index fe748020237..674befaef28 100644 --- a/chain/gen/gen.go +++ b/chain/gen/gen.go @@ -31,6 +31,7 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/chain/beacon" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" genesis2 "github.com/filecoin-project/lotus/chain/gen/genesis" "github.com/filecoin-project/lotus/chain/rand" @@ -255,7 +256,7 @@ func NewGeneratorWithSectorsAndUpgradeSchedule(numSectors int, us stmgr.UpgradeS //return nil, xerrors.Errorf("creating drand beacon: %w", err) //} - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), sys, us, beac) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), sys, us, beac) if err != nil { return nil, xerrors.Errorf("initing stmgr: %w", err) } diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index 34f12db6dc0..611bbcf81ae 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -36,7 +36,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/reward" "github.com/filecoin-project/lotus/chain/actors/builtin/system" "github.com/filecoin-project/lotus/chain/actors/builtin/verifreg" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -480,7 +480,7 @@ func VerifyPreSealedData(ctx context.Context, cs *store.ChainStore, sys vm.Sysca Epoch: 0, Rand: &fakeRand{}, Bstore: cs.StateBlockstore(), - Actors: filcns.NewActorRegistry(), + Actors: consensus.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, NetworkVersion: nv, diff --git a/chain/gen/genesis/miners.go b/chain/gen/genesis/miners.go index 385e89c0039..2c161da2a00 100644 --- a/chain/gen/genesis/miners.go +++ b/chain/gen/genesis/miners.go @@ -40,7 +40,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" "github.com/filecoin-project/lotus/chain/actors/policy" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" @@ -94,7 +94,7 @@ func SetupStorageMiners(ctx context.Context, cs *store.ChainStore, sys vm.Syscal Epoch: 0, Rand: &fakeRand{}, Bstore: cs.StateBlockstore(), - Actors: filcns.NewActorRegistry(), + Actors: consensus.NewActorRegistry(), Syscalls: mkFakedSigSyscalls(sys), CircSupplyCalc: csc, NetworkVersion: nv, diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index d46d0befe0b..47ffa29eea2 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -17,7 +17,6 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" - actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -29,6 +28,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/aerrors" _init "github.com/filecoin-project/lotus/chain/actors/builtin/init" "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen" . "github.com/filecoin-project/lotus/chain/stmgr" @@ -126,7 +126,7 @@ func TestForkHeightTriggers(t *testing.T) { } sm, err := NewStateManager( - cg.ChainStore(), filcns.NewTipSetExecutor(), cg.StateManager().VMSys(), UpgradeSchedule{{ + cg.ChainStore(), consensus.NewTipSetExecutor(filcns.RewardFunc), cg.StateManager().VMSys(), UpgradeSchedule{{ Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, @@ -167,8 +167,8 @@ func TestForkHeightTriggers(t *testing.T) { t.Fatal(err) } - inv := filcns.NewActorRegistry() - inv.Register(actorstypes.Version0, nil, testActor{}) + inv := consensus.NewActorRegistry() + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -271,7 +271,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { var migrationCount int sm, err := NewStateManager( - cg.ChainStore(), filcns.NewTipSetExecutor(), cg.StateManager().VMSys(), UpgradeSchedule{{ + cg.ChainStore(), consensus.NewTipSetExecutor(filcns.RewardFunc), cg.StateManager().VMSys(), UpgradeSchedule{{ Network: network.Version1, Expensive: true, Height: testForkHeight, @@ -284,8 +284,8 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { t.Fatal(err) } - inv := filcns.NewActorRegistry() - inv.Register(actorstypes.Version0, nil, testActor{}) + inv := consensus.NewActorRegistry() + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -408,7 +408,7 @@ func TestForkPreMigration(t *testing.T) { counter := make(chan struct{}, 10) sm, err := NewStateManager( - cg.ChainStore(), filcns.NewTipSetExecutor(), cg.StateManager().VMSys(), UpgradeSchedule{{ + cg.ChainStore(), consensus.NewTipSetExecutor(filcns.RewardFunc), cg.StateManager().VMSys(), UpgradeSchedule{{ Network: network.Version1, Height: testForkHeight, Migration: func(ctx context.Context, sm *StateManager, cache MigrationCache, cb ExecMonitor, @@ -505,8 +505,8 @@ func TestForkPreMigration(t *testing.T) { require.NoError(t, sm.Stop(context.Background())) }() - inv := filcns.NewActorRegistry() - inv.Register(actorstypes.Version0, nil, testActor{}) + inv := consensus.NewActorRegistry() + inv.Register(actors.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) diff --git a/chain/store/store_test.go b/chain/store/store_test.go index af78e3dc00c..64be55a8ba6 100644 --- a/chain/store/store_test.go +++ b/chain/store/store_test.go @@ -14,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen" "github.com/filecoin-project/lotus/chain/stmgr" @@ -166,7 +167,7 @@ func TestChainExportImportFull(t *testing.T) { t.Fatal("imported chain differed from exported chain") } - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), nil, filcns.DefaultUpgradeSchedule(), cg.BeaconSchedule()) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), nil, filcns.DefaultUpgradeSchedule(), cg.BeaconSchedule()) if err != nil { t.Fatal(err) } diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 78a3449ee82..79ff5d19c49 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,14 +8,13 @@ import ( "math" "sort" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" - abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index edcf065608c..4f93a86a4c6 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,11 +8,10 @@ import ( "math" "sort" + types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" - - types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/cli/chain.go b/cli/chain.go index 814aebeed80..c57c50e9c13 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -37,7 +37,7 @@ import ( "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/types" ) @@ -492,7 +492,7 @@ var ChainInspectUsage = &cli.Command{ return err } - mm := filcns.NewActorRegistry().Methods[code][m.Message.Method] // TODO: use remote map + mm := consensus.NewActorRegistry().Methods[code][m.Message.Method] // TODO: use remote map byMethod[mm.Num] += m.Message.GasLimit byMethodC[mm.Num]++ diff --git a/cli/multisig.go b/cli/multisig.go index 1dd7d01b819..369f7e8d323 100644 --- a/cli/multisig.go +++ b/cli/multisig.go @@ -28,7 +28,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/types" ) @@ -325,7 +325,7 @@ var msigInspectCmd = &cli.Command{ fmt.Fprintf(w, "%d\t%s\t%d\t%s\t%s\t%s(%d)\t%s\n", txid, "pending", len(tx.Approved), target, types.FIL(tx.Value), "new account, unknown method", tx.Method, paramStr) } } else { - method := filcns.NewActorRegistry().Methods[targAct.Code][tx.Method] // TODO: use remote map + method := consensus.NewActorRegistry().Methods[targAct.Code][tx.Method] // TODO: use remote map if decParams && tx.Method != 0 { ptyp := reflect.New(method.Params.Elem()).Interface().(cbg.CBORUnmarshaler) diff --git a/cli/services.go b/cli/services.go index d90da419c67..ef257693f89 100644 --- a/cli/services.go +++ b/cli/services.go @@ -17,7 +17,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/types" ) @@ -88,7 +88,7 @@ func (s *ServicesImpl) DecodeTypedParamsFromJSON(ctx context.Context, to address return nil, err } - methodMeta, found := filcns.NewActorRegistry().Methods[act.Code][method] // TODO: use remote map + methodMeta, found := consensus.NewActorRegistry().Methods[act.Code][method] // TODO: use remote map if !found { return nil, fmt.Errorf("method %d not found on actor %s", method, act.Code) } diff --git a/cli/servicesmock_test.go b/cli/servicesmock_test.go index 11260ab08be..5bae52a5ebc 100644 --- a/cli/servicesmock_test.go +++ b/cli/servicesmock_test.go @@ -8,14 +8,12 @@ import ( context "context" reflect "reflect" - gomock "github.com/golang/mock/gomock" - go_address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" - api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" + gomock "github.com/golang/mock/gomock" ) // MockServicesAPI is a mock of ServicesAPI interface. diff --git a/cli/state.go b/cli/state.go index de358815f6f..d569a2e4e1d 100644 --- a/cli/state.go +++ b/cli/state.go @@ -41,7 +41,7 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -1407,7 +1407,7 @@ func codeStr(c cid.Cid) string { } func getMethod(code cid.Cid, method abi.MethodNum) string { - return filcns.NewActorRegistry().Methods[code][method].Num // todo: use remote + return consensus.NewActorRegistry().Methods[code][method].Name // todo: use remote } func toFil(f types.BigInt) types.FIL { @@ -1438,7 +1438,7 @@ func sumGas(changes []*types.GasTrace) types.GasTrace { } func JsonParams(code cid.Cid, method abi.MethodNum, params []byte) (string, error) { - p, err := stmgr.GetParamType(filcns.NewActorRegistry(), code, method) // todo use api for correct actor registry + p, err := stmgr.GetParamType(consensus.NewActorRegistry(), code, method) // todo use api for correct actor registry if err != nil { return "", err } @@ -1452,7 +1452,7 @@ func JsonParams(code cid.Cid, method abi.MethodNum, params []byte) (string, erro } func jsonReturn(code cid.Cid, method abi.MethodNum, ret []byte) (string, error) { - methodMeta, found := filcns.NewActorRegistry().Methods[code][method] // TODO: use remote + methodMeta, found := consensus.NewActorRegistry().Methods[code][method] // TODO: use remote if !found { return "", fmt.Errorf("method %d not found on actor %s", method, code) } diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index ce0b8d86e6b..12a73814c0f 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -34,6 +34,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/blockstore" badgerbs "github.com/filecoin-project/lotus/blockstore/badger" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -227,7 +228,7 @@ var importBenchCmd = &cli.Command{ defer cs.Close() //nolint:errcheck // TODO: We need to supply the actual beacon after v14 - stm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(verifier), filcns.DefaultUpgradeSchedule(), nil) + stm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(verifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } diff --git a/cmd/lotus-shed/balances.go b/cmd/lotus-shed/balances.go index 9ce4faf723c..d678c797719 100644 --- a/cmd/lotus-shed/balances.go +++ b/cmd/lotus-shed/balances.go @@ -32,6 +32,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/gen/genesis" "github.com/filecoin-project/lotus/chain/state" @@ -512,7 +513,7 @@ var chainBalanceStateCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } @@ -736,7 +737,7 @@ var chainPledgeCmd = &cli.Command{ cst := cbor.NewCborStore(bs) store := adt.WrapStore(ctx, cst) - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } diff --git a/cmd/lotus-shed/migrations.go b/cmd/lotus-shed/migrations.go index 2e291c947cb..66b02c7bd97 100644 --- a/cmd/lotus-shed/migrations.go +++ b/cmd/lotus-shed/migrations.go @@ -11,6 +11,7 @@ import ( "github.com/filecoin-project/specs-actors/v7/actors/migration/nv15" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -76,7 +77,7 @@ var migrationsCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go index 847b93d9f51..062e077dfb6 100644 --- a/cmd/lotus-shed/msg.go +++ b/cmd/lotus-shed/msg.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/specs-actors/v2/actors/builtin/multisig" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" ) @@ -141,7 +141,7 @@ func printMessage(cctx *cli.Context, msg *types.Message) error { return nil } - fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][msg.Method].Num) // todo use remote + fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][msg.Method].Name) // todo use remote p, err := lcli.JsonParams(toact.Code, msg.Method, msg.Params) if err != nil { return err diff --git a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go index f984c993d9a..a4c9fdeaaa0 100644 --- a/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go +++ b/cmd/lotus-sim/simulation/blockbuilder/blockbuilder.go @@ -16,7 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/adt" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/account" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" lrand "github.com/filecoin-project/lotus/chain/rand" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" @@ -85,7 +85,7 @@ func NewBlockBuilder(ctx context.Context, logger *zap.SugaredLogger, sm *stmgr.S Epoch: parentTs.Height() + 1, Rand: r, Bstore: sm.ChainStore().StateBlockstore(), - Actors: filcns.NewActorRegistry(), + Actors: consensus.NewActorRegistry(), Syscalls: sm.VMSys(), CircSupplyCalc: sm.GetVMCirculatingSupply, NetworkVersion: sm.GetNetworkVersion(ctx, parentTs.Height()+1), diff --git a/cmd/lotus-sim/simulation/node.go b/cmd/lotus-sim/simulation/node.go index f115ffe19d3..06e837f8f29 100644 --- a/cmd/lotus-sim/simulation/node.go +++ b/cmd/lotus-sim/simulation/node.go @@ -10,6 +10,7 @@ import ( "golang.org/x/xerrors" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -105,7 +106,7 @@ func (nd *Node) LoadSim(ctx context.Context, name string) (*Simulation, error) { if err != nil { return nil, xerrors.Errorf("failed to create upgrade schedule for simulation %s: %w", name, err) } - sim.StateManager, err = stmgr.NewStateManager(nd.Chainstore, filcns.NewTipSetExecutor(), vm.Syscalls(mock.Verifier), us, nil) + sim.StateManager, err = stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), us, nil) if err != nil { return nil, xerrors.Errorf("failed to create state manager for simulation %s: %w", name, err) } @@ -124,7 +125,7 @@ func (nd *Node) CreateSim(ctx context.Context, name string, head *types.TipSet) if err != nil { return nil, err } - sm, err := stmgr.NewStateManager(nd.Chainstore, filcns.NewTipSetExecutor(), vm.Syscalls(mock.Verifier), filcns.DefaultUpgradeSchedule(), nil) + sm, err := stmgr.NewStateManager(nd.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return nil, xerrors.Errorf("creating state manager: %w", err) } diff --git a/cmd/lotus-sim/simulation/simulation.go b/cmd/lotus-sim/simulation/simulation.go index dc0b0e26374..19ab391dc1f 100644 --- a/cmd/lotus-sim/simulation/simulation.go +++ b/cmd/lotus-sim/simulation/simulation.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/network" blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" @@ -200,7 +201,7 @@ func (sim *Simulation) SetUpgradeHeight(nv network.Version, epoch abi.ChainEpoch if err != nil { return err } - sm, err := stmgr.NewStateManager(sim.Node.Chainstore, filcns.NewTipSetExecutor(), vm.Syscalls(mock.Verifier), newUpgradeSchedule, nil) + sm, err := stmgr.NewStateManager(sim.Node.Chainstore, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(mock.Verifier), newUpgradeSchedule, nil) if err != nil { return err } diff --git a/cmd/lotus-wallet/interactive.go b/cmd/lotus-wallet/interactive.go index 9770961c028..96d2ad9f2e0 100644 --- a/cmd/lotus-wallet/interactive.go +++ b/cmd/lotus-wallet/interactive.go @@ -23,7 +23,7 @@ import ( "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/multisig" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" ) @@ -103,7 +103,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up dest actor: %w", err) } - fmt.Println("Method:", filcns.NewActorRegistry().Methods[toact.Code][cmsg.Method].Num) + fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][cmsg.Method].Name) p, err := lcli.JsonParams(toact.Code, cmsg.Method, cmsg.Params) if err != nil { return err @@ -125,7 +125,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up msig dest actor: %w", err) } - fmt.Println("\tMultiSig Proposal Method:", filcns.NewActorRegistry().Methods[toact.Code][mp.Method].Num) // todo use remote + fmt.Println("\tMultiSig Proposal Method:", consensus.NewActorRegistry().Methods[toact.Code][mp.Method].Name) // todo use remote p, err := lcli.JsonParams(toact.Code, mp.Method, mp.Params) if err != nil { return err diff --git a/cmd/lotus/daemon.go b/cmd/lotus/daemon.go index 0c7874dfcd4..dc1b3afec8c 100644 --- a/cmd/lotus/daemon.go +++ b/cmd/lotus/daemon.go @@ -32,6 +32,7 @@ import ( lapi "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -521,7 +522,7 @@ func ImportChain(ctx context.Context, r repo.Repo, fname string, snapshot bool) } // TODO: We need to supply the actual beacon after v14 - stm, err := stmgr.NewStateManager(cst, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + stm, err := stmgr.NewStateManager(cst, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } diff --git a/cmd/tvx/extract_many.go b/cmd/tvx/extract_many.go index 07bbc8df442..796f5014677 100644 --- a/cmd/tvx/extract_many.go +++ b/cmd/tvx/extract_many.go @@ -18,8 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" - - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" ) var extractManyFlags struct { @@ -159,7 +158,7 @@ func runExtractMany(c *cli.Context) error { } // Lookup the method in actor method table. - if m, ok := filcns.NewActorRegistry().Methods[codeCid]; !ok { + if m, ok := consensus.NewActorRegistry().Methods[codeCid]; !ok { return fmt.Errorf("unrecognized actor: %s", actorcode) } else if methodnum >= len(m) { return fmt.Errorf("unrecognized method number for actor %s: %d", actorcode, methodnum) diff --git a/conformance/driver.go b/conformance/driver.go index 2329fe336cf..d158187dc88 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/test-vectors/schema" "github.com/filecoin-project/lotus/blockstore" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/state" "github.com/filecoin-project/lotus/chain/stmgr" @@ -103,7 +104,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params syscalls = vm.Syscalls(ffiwrapper.ProofVerifier) cs = store.NewChainStore(bs, bs, ds, filcns.Weight, nil) - tse = filcns.NewTipSetExecutor() + tse = consensus.NewTipSetExecutor(filcns.RewardFunc) sm, err = stmgr.NewStateManager(cs, tse, syscalls, filcns.DefaultUpgradeSchedule(), nil) ) if err != nil { @@ -120,7 +121,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params defer cs.Close() //nolint:errcheck - blocks := make([]filcns.FilecoinBlockMessages, 0, len(tipset.Blocks)) + blocks := make([]consensus.FilecoinBlockMessages, 0, len(tipset.Blocks)) for _, b := range tipset.Blocks { sb := store.BlockMessages{ Miner: b.MinerAddr, @@ -142,7 +143,7 @@ func (d *Driver) ExecuteTipset(bs blockstore.Blockstore, ds ds.Batching, params sb.BlsMessages = append(sb.BlsMessages, msg) } } - blocks = append(blocks, filcns.FilecoinBlockMessages{ + blocks = append(blocks, consensus.FilecoinBlockMessages{ BlockMessages: sb, WinCount: b.WinCount, }) @@ -245,7 +246,7 @@ func (d *Driver) ExecuteMessage(bs blockstore.Blockstore, params ExecuteMessageP return nil, cid.Undef, err } - invoker := filcns.NewActorRegistry() + invoker := consensus.NewActorRegistry() // register the chaos actor if required by the vector. if chaosOn, ok := d.selector["chaos_actor"]; ok && chaosOn == "true" { diff --git a/lotuspond/front/src/chain/methodgen.go b/lotuspond/front/src/chain/methodgen.go index 5fd6cde9310..f7f634872ea 100644 --- a/lotuspond/front/src/chain/methodgen.go +++ b/lotuspond/front/src/chain/methodgen.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/actors/builtin" - "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/consensus" ) func main() { @@ -44,7 +44,7 @@ func main() { out := map[string][]string{} - for c, methods := range filcns.NewActorRegistry().Methods { + for c, methods := range consensus.NewActorRegistry().Methods { name := builtin.ActorNameByCode(c) remaining := len(methods) diff --git a/node/builder_chain.go b/node/builder_chain.go index e24b2609734..098761cbca2 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -72,7 +72,7 @@ var ChainNode = Options( // Consensus: Chain storage/access Override(new(chain.Genesis), chain.LoadGenesis), Override(new(store.WeightFunc), filcns.Weight), - Override(new(stmgr.Executor), filcns.NewTipSetExecutor()), + Override(new(stmgr.Executor), consensus.NewTipSetExecutor(filcns.RewardFunc)), Override(new(consensus.Consensus), filcns.NewFilecoinExpectedConsensus), Override(new(*store.ChainStore), modules.ChainStore), Override(new(*stmgr.StateManager), modules.StateManager), From 536600c95c63eeafdd0d5c7530fb2dde6a917287 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Wed, 28 Sep 2022 12:15:57 +0200 Subject: [PATCH 004/282] added comments to consensus interface --- chain/consensus/iface.go | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/chain/consensus/iface.go b/chain/consensus/iface.go index 63e4c2307d0..1ab6c0cf518 100644 --- a/chain/consensus/iface.go +++ b/chain/consensus/iface.go @@ -18,12 +18,35 @@ import ( ) type Consensus interface { - ValidateBlock(ctx context.Context, b *types.FullBlock) (err error) + // ValidateBlockHeader is called by peers when they receive a new block through the network. + // + // This is a fast sanity-check validation performed by the PubSub protocol before delivering + // it to the syncer. It checks that the block has the right format and it performs + // other consensus-specific light verifications like ensuring that the block is signed by + // a valid miner, or that it includes all the data required for a full verification. ValidateBlockHeader(ctx context.Context, b *types.BlockHeader) (rejectReason string, err error) + + // ValidateBlock is called by the syncer to determine if to accept a block or not. + // + // It performs all the checks needed by the syncer to accept + // the block (signature verifications, VRF checks, message validity, etc.) + ValidateBlock(ctx context.Context, b *types.FullBlock) (err error) + + // IsEpochBeyondCurrMax is used to configure the fork rules for longest-chain + // consensus protocols. IsEpochBeyondCurrMax(epoch abi.ChainEpoch) bool + // CreateBlock implements all the logic required to propose and assemble a new Filecoin block. + // + // This function encapsulate all the consensus-specific actions to propose a new block + // such as the ordering of transactions, the inclusion of consensus proofs, the signature + // of the block, etc. CreateBlock(ctx context.Context, w api.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) + + // SignBlock determines how should blocks be signed for them to be considered valid by the consensus + // engine. SignBlock(ctx context.Context, w api.Wallet, addr address.Address, next *types.BlockHeader) error + // VerifyBlockSignature verifies the signature scheme implemented by the consensus algorithm. VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, addr address.Address) error } From c3ee957cc6fb8192a8e275e1df747c686d88fc48 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 29 Sep 2022 11:15:36 +0200 Subject: [PATCH 005/282] rm signature fns from cns iface --- chain/consensus/iface.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/chain/consensus/iface.go b/chain/consensus/iface.go index 1ab6c0cf518..58adfe03e62 100644 --- a/chain/consensus/iface.go +++ b/chain/consensus/iface.go @@ -6,7 +6,6 @@ import ( pubsub "github.com/libp2p/go-libp2p-pubsub" "go.opencensus.io/stats" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/api" @@ -42,12 +41,6 @@ type Consensus interface { // such as the ordering of transactions, the inclusion of consensus proofs, the signature // of the block, etc. CreateBlock(ctx context.Context, w api.Wallet, bt *api.BlockTemplate) (*types.FullBlock, error) - - // SignBlock determines how should blocks be signed for them to be considered valid by the consensus - // engine. - SignBlock(ctx context.Context, w api.Wallet, addr address.Address, next *types.BlockHeader) error - // VerifyBlockSignature verifies the signature scheme implemented by the consensus algorithm. - VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, addr address.Address) error } // RewardFunc parametrizes the logic for rewards when a message is executed. From 9d1208c9ff3efa186b32e78e04f315a9677eb7cc Mon Sep 17 00:00:00 2001 From: Kevin Li Date: Thu, 29 Sep 2022 16:46:59 -0400 Subject: [PATCH 006/282] api: ethrpc: implement eth_sendRawTransaction (#9334) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Raúl Kripalani --- api/eth_transactions.go | 478 ++++++++++++++++++++++++++++ api/eth_transactions_test.go | 185 +++++++++++ api/proxy_gen.go | 1 + api/rlp.go | 176 ++++++++++ api/rlp_test.go | 175 ++++++++++ chain/messagepool/messagepool.go | 25 +- chain/messagepool/selection.go | 8 +- chain/messagepool/selection_test.go | 1 + chain/sync.go | 2 +- chain/types/keystore.go | 3 + chain/vectors/gen/main.go | 1 + chain/vm/gas.go | 1 + chain/wallet/key/key.go | 4 +- chain/wallet/wallet.go | 3 +- cmd/lotus-bench/import.go | 1 + cmd/lotus-keygen/main.go | 1 + cmd/lotus-shed/keyinfo.go | 1 + conformance/driver.go | 3 +- gateway/node.go | 1 + lib/sigs/delegated/init.go | 57 ++++ lib/sigs/secp/init.go | 10 +- node/builder.go | 1 + 22 files changed, 1124 insertions(+), 14 deletions(-) create mode 100644 api/eth_transactions.go create mode 100644 api/eth_transactions_test.go create mode 100644 api/rlp.go create mode 100644 api/rlp_test.go create mode 100644 lib/sigs/delegated/init.go diff --git a/api/eth_transactions.go b/api/eth_transactions.go new file mode 100644 index 00000000000..333f126924d --- /dev/null +++ b/api/eth_transactions.go @@ -0,0 +1,478 @@ +package api + +import ( + "bytes" + "encoding/binary" + "fmt" + mathbig "math/big" + + "golang.org/x/crypto/sha3" + xerrors "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + gocrypto "github.com/filecoin-project/go-crypto" + "github.com/filecoin-project/go-state-types/big" + builtintypes "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/builtin/v8/evm" + init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" + typescrypto "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/types" +) + +type EthTx struct { + ChainID EthInt `json:"chainId"` + Nonce EthInt `json:"nonce"` + Hash EthHash `json:"hash"` + BlockHash EthHash `json:"blockHash"` + BlockNumber EthInt `json:"blockNumber"` + TransactionIndex EthInt `json:"transacionIndex"` + From EthAddress `json:"from"` + To *EthAddress `json:"to"` + Value EthBigInt `json:"value"` + Type EthInt `json:"type"` + Input EthBytes `json:"input"` + Gas EthInt `json:"gas"` + GasLimit *EthInt `json:"gasLimit,omitempty"` + MaxFeePerGas EthBigInt `json:"maxFeePerGas"` + MaxPriorityFeePerGas EthBigInt `json:"maxPriorityFeePerGas"` + V EthBytes `json:"v"` + R EthBytes `json:"r"` + S EthBytes `json:"s"` +} + +type EthTxArgs struct { + ChainID int `json:"chainId"` + Nonce int `json:"nonce"` + To *EthAddress `json:"to"` + Value big.Int `json:"value"` + MaxFeePerGas big.Int `json:"maxFeePerGas"` + MaxPriorityFeePerGas big.Int `json:"maxPrioritiyFeePerGas"` + GasLimit int `json:"gasLimit"` + Input []byte `json:"input"` + V []byte `json:"v"` + R []byte `json:"r"` + S []byte `json:"s"` +} + +func NewEthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { + var to *EthAddress + params := msg.Params + if msg.To == builtintypes.InitActorAddr { + to = nil + + var exec init8.ExecParams + reader := bytes.NewReader(msg.Params) + if err := exec.UnmarshalCBOR(reader); err != nil { + return EthTxArgs{}, err + } + + var evmParams evm.ConstructorParams + reader1 := bytes.NewReader(exec.ConstructorParams) + if err := evmParams.UnmarshalCBOR(reader1); err != nil { + return EthTxArgs{}, err + } + params = evmParams.Bytecode + } else { + addr, err := EthAddressFromFilecoinIDAddress(msg.To) + if err != nil { + return EthTxArgs{}, nil + } + to = &addr + } + + return EthTxArgs{ + ChainID: build.Eip155ChainId, + Nonce: int(msg.Nonce), + To: to, + Value: msg.Value, + Input: params, + MaxFeePerGas: msg.GasFeeCap, + MaxPriorityFeePerGas: msg.GasPremium, + GasLimit: int(msg.GasLimit), + }, nil +} + +func (tx *EthTxArgs) ToSignedMessage() (*types.SignedMessage, error) { + from, err := tx.Sender() + if err != nil { + return nil, err + } + + var to address.Address + var params []byte + + if tx.To == nil && tx.Input == nil { + return nil, fmt.Errorf("to and input cannot both be empty") + } + + if tx.To == nil { + // this is a contract creation + to = builtintypes.InitActorAddr + + constructorParams, err := actors.SerializeParams(&evm.ConstructorParams{ + Bytecode: tx.Input, + InputData: []byte{}, + }) + if err != nil { + return nil, fmt.Errorf("failed to serialize constructor params: %w", err) + } + + evmActorCid, ok := actors.GetActorCodeID(actors.Version8, "evm") + if !ok { + return nil, fmt.Errorf("failed to lookup evm actor code CID") + } + + params, err = actors.SerializeParams(&init8.ExecParams{ + CodeCID: evmActorCid, + ConstructorParams: constructorParams, + }) + if err != nil { + return nil, fmt.Errorf("failed to serialize init actor exec params: %w", err) + } + } else { + addr, err := tx.To.ToFilecoinAddress() + if err != nil { + return nil, err + } + to = addr + params = tx.Input + } + + msg := &types.Message{ + Nonce: uint64(tx.Nonce), + From: from, + To: to, + Value: tx.Value, + Method: 2, + Params: params, + GasLimit: int64(tx.GasLimit), + GasFeeCap: tx.MaxFeePerGas, + GasPremium: tx.MaxPriorityFeePerGas, + } + + sig, err := tx.Signature() + if err != nil { + return nil, err + } + + signedMsg := types.SignedMessage{ + Message: *msg, + Signature: *sig, + } + return &signedMsg, nil + +} + +func (tx *EthTxArgs) HashedOriginalRlpMsg() ([]byte, error) { + msg, err := tx.OriginalRlpMsg() + if err != nil { + return nil, err + } + + hasher := sha3.NewLegacyKeccak256() + hasher.Write(msg) + hash := hasher.Sum(nil) + return hash, nil +} + +func (tx *EthTxArgs) OriginalRlpMsg() ([]byte, error) { + chainId, err := formatInt(tx.ChainID) + if err != nil { + return nil, err + } + + nonce, err := formatInt(tx.Nonce) + if err != nil { + return nil, err + } + + maxPriorityFeePerGas, err := formatBigInt(tx.MaxPriorityFeePerGas) + if err != nil { + return nil, err + } + + maxFeePerGas, err := formatBigInt(tx.MaxFeePerGas) + if err != nil { + return nil, err + } + + gasLimit, err := formatInt(tx.GasLimit) + if err != nil { + return nil, err + } + + value, err := formatBigInt(tx.Value) + if err != nil { + return nil, err + } + + res := []interface{}{ + chainId, + nonce, + maxPriorityFeePerGas, + maxFeePerGas, + gasLimit, + formatEthAddr(tx.To), + value, + tx.Input, + []interface{}{}, // access list + } + + encoded, err := EncodeRLP(res) + if err != nil { + return nil, err + } + return append([]byte{0x02}, encoded...), nil +} + +func (tx *EthTxArgs) Signature() (*typescrypto.Signature, error) { + if tx.V == nil || tx.R == nil || tx.S == nil { + return nil, fmt.Errorf("one of V, R, or S is nil") + } + sig := append([]byte{}, tx.R...) + sig = append(sig, tx.S...) + sig = append(sig, tx.V...) + + if len(sig) != 65 { + return nil, fmt.Errorf("signature is not 65 bytes") + } + return &typescrypto.Signature{ + Type: typescrypto.SigTypeDelegated, Data: sig, + }, nil +} + +func (tx *EthTxArgs) Sender() (address.Address, error) { + msg, err := tx.OriginalRlpMsg() + if err != nil { + return address.Undef, err + } + + hasher := sha3.NewLegacyKeccak256() + hasher.Write(msg) + hash := hasher.Sum(nil) + + sig, err := tx.Signature() + if err != nil { + return address.Undef, err + } + + pubk, err := gocrypto.EcRecover(hash, sig.Data) + if err != nil { + return address.Undef, err + } + + return address.NewSecp256k1Address(pubk) +} + +func parseEip1559Tx(data []byte) (*EthTxArgs, error) { + if data[0] != 2 { + return nil, xerrors.Errorf("not an EIP-1559 transaction: first byte is not 2") + } + + d, err := DecodeRLP(data[1:]) + if err != nil { + return nil, err + } + decoded, ok := d.([]interface{}) + if !ok { + return nil, xerrors.Errorf("not an EIP-1559 transaction: decoded data is not a list") + } + + if len(decoded) != 9 && len(decoded) != 12 { + return nil, xerrors.Errorf("not an EIP-1559 transaction: should have 6 or 9 elements in the list") + } + + chainId, err := parseInt(decoded[0]) + if err != nil { + return nil, err + } + + nonce, err := parseInt(decoded[1]) + if err != nil { + return nil, err + } + + maxPriorityFeePerGas, err := parseBigInt(decoded[2]) + if err != nil { + return nil, err + } + + maxFeePerGas, err := parseBigInt(decoded[3]) + if err != nil { + return nil, err + } + + gasLimit, err := parseInt(decoded[4]) + if err != nil { + return nil, err + } + + to, err := parseEthAddr(decoded[5]) + if err != nil { + return nil, err + } + + value, err := parseBigInt(decoded[6]) + if err != nil { + return nil, err + } + + input, err := parseBytes(decoded[7]) + if err != nil { + return nil, err + } + + accessList, ok := decoded[8].([]interface{}) + if !ok || (ok && len(accessList) != 0) { + return nil, fmt.Errorf("access list should be an empty list") + } + + V, err := parseBytes(decoded[9]) + if err != nil { + return nil, err + } + + if len(V) == 0 { + V = []byte{0} + } + + R, err := parseBytes(decoded[10]) + if err != nil { + return nil, err + } + + S, err := parseBytes(decoded[11]) + if err != nil { + return nil, err + } + + args := EthTxArgs{ + ChainID: chainId, + Nonce: nonce, + To: to, + MaxPriorityFeePerGas: maxPriorityFeePerGas, + MaxFeePerGas: maxFeePerGas, + GasLimit: gasLimit, + Value: value, + Input: input, + R: padLeadingZeros(R, 32), + S: padLeadingZeros(S, 32), + V: V, + } + return &args, nil +} + +func ParseEthTxArgs(data []byte) (*EthTxArgs, error) { + if data[0] > 0x7f { + // legacy transaction + return nil, xerrors.Errorf("legacy transaction is not supported") + } else if data[0] == 1 { + // EIP-2930 + return nil, xerrors.Errorf("EIP-2930 transaction is not supported") + } else if data[0] == 2 { + // EIP-1559 + return parseEip1559Tx(data) + } + return nil, xerrors.Errorf("unsupported transaction type") +} + +func padLeadingZeros(data []byte, length int) []byte { + if len(data) >= length { + return data + } + zeros := make([]byte, length-len(data)) + return append(zeros, data...) +} + +func removeLeadingZeros(data []byte) []byte { + firstNonZeroIndex := len(data) + for i, b := range data { + if b > 0 { + firstNonZeroIndex = i + break + } + } + return data[firstNonZeroIndex:] +} + +func formatInt(val int) ([]byte, error) { + buf := new(bytes.Buffer) + err := binary.Write(buf, binary.BigEndian, int64(val)) + if err != nil { + return nil, err + } + return removeLeadingZeros(buf.Bytes()), nil +} + +func formatEthAddr(addr *EthAddress) []byte { + if addr == nil { + return nil + } + return addr[:] +} + +func formatBigInt(val big.Int) ([]byte, error) { + b, err := val.Bytes() + if err != nil { + return nil, err + } + return removeLeadingZeros(b), nil +} + +func parseInt(v interface{}) (int, error) { + data, ok := v.([]byte) + if !ok { + return 0, xerrors.Errorf("cannot parse interface to int: input is not a byte array") + } + if len(data) == 0 { + return 0, nil + } + if len(data) > 8 { + return 0, xerrors.Errorf("cannot parse interface to int: length is more than 8 bytes") + } + var value int64 + r := bytes.NewReader(append(make([]byte, 8-len(data)), data...)) + if err := binary.Read(r, binary.BigEndian, &value); err != nil { + return 0, xerrors.Errorf("cannot parse interface to EthInt: %w", err) + } + return int(value), nil +} + +func parseBigInt(v interface{}) (big.Int, error) { + data, ok := v.([]byte) + if !ok { + return big.Zero(), xerrors.Errorf("cannot parse interface to big.Int: input is not a byte array") + } + if len(data) == 0 { + return big.Zero(), nil + } + var b mathbig.Int + b.SetBytes(data) + return big.NewFromGo(&b), nil +} + +func parseBytes(v interface{}) ([]byte, error) { + val, ok := v.([]byte) + if !ok { + return nil, xerrors.Errorf("cannot parse interface into bytes: input is not a byte array") + } + return val, nil +} + +func parseEthAddr(v interface{}) (*EthAddress, error) { + b, err := parseBytes(v) + if err != nil { + return nil, err + } + if b == nil || len(b) == 0 { + return nil, nil + } + addr, err := EthAddressFromBytes(b) + if err != nil { + return nil, err + } + return &addr, nil +} diff --git a/api/eth_transactions_test.go b/api/eth_transactions_test.go new file mode 100644 index 00000000000..259e2903003 --- /dev/null +++ b/api/eth_transactions_test.go @@ -0,0 +1,185 @@ +package api + +import ( + "bytes" + "encoding/hex" + "encoding/json" + "fmt" + "testing" + + "github.com/stretchr/testify/require" + "golang.org/x/crypto/sha3" + + "github.com/filecoin-project/go-address" + gocrypto "github.com/filecoin-project/go-crypto" + "github.com/filecoin-project/go-state-types/builtin/v8/evm" + init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" + crypto1 "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/lib/sigs" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" +) + +type TxTestcase struct { + TxJSON string + NosigTx string + Input EthBytes + Output EthTxArgs +} + +func TestTxArgs(t *testing.T) { + testcases, err := prepareTxTestcases() + require.Nil(t, err) + require.NotEmpty(t, testcases) + + for i, tc := range testcases { + comment := fmt.Sprintf("case %d: \n%s\n%s", i, tc.TxJSON, hex.EncodeToString(tc.Input)) + + // parse txargs + txArgs, err := ParseEthTxArgs(tc.Input) + require.Nil(t, err, comment) + + msgRecovered, err := txArgs.OriginalRlpMsg() + require.Nil(t, err, comment) + require.Equal(t, tc.NosigTx, "0x"+hex.EncodeToString(msgRecovered), comment) + + // verify signatures + from, err := txArgs.Sender() + require.Nil(t, err, comment) + + smsg, err := txArgs.ToSignedMessage() + require.Nil(t, err, comment) + + err = sigs.Verify(&smsg.Signature, from, msgRecovered) + require.Nil(t, err, comment) + + // verify data + require.Equal(t, tc.Output.ChainID, txArgs.ChainID) + require.Equal(t, tc.Output.Nonce, txArgs.Nonce) + require.Equal(t, tc.Output.To, txArgs.To) + } +} + +func TestTransformParams(t *testing.T) { + constructorParams, err := actors.SerializeParams(&evm.ConstructorParams{ + Bytecode: mustDecodeHex("0x1122334455"), + InputData: []byte{}, + }) + require.Nil(t, err) + + evmActorCid, ok := actors.GetActorCodeID(actors.Version8, "reward") + require.True(t, ok) + + params, err := actors.SerializeParams(&init8.ExecParams{ + CodeCID: evmActorCid, + ConstructorParams: constructorParams, + }) + require.Nil(t, err) + + var exec init8.ExecParams + reader := bytes.NewReader(params) + err1 := exec.UnmarshalCBOR(reader) + require.Nil(t, err1) + + var evmParams evm.ConstructorParams + reader1 := bytes.NewReader(exec.ConstructorParams) + err1 = evmParams.UnmarshalCBOR(reader1) + require.Nil(t, err1) + + require.Equal(t, mustDecodeHex("0x1122334455"), evmParams.Bytecode) +} +func TestEcRecover(t *testing.T) { + rHex := "0x479ff7fa64cf8bf641eb81635d1e8a698530d2f219951d234539e6d074819529" + sHex := "0x4b6146d27be50cdbb2853ba9a42f207af8d730272f1ebe9c9a78aeef1d6aa924" + fromHex := "0x3947D223fc5415f43ea099866AB62B1d4D33814D" + v := byte(0) + + msgHex := "0x02f1030185012a05f2008504a817c800825208942b87d1cb599bc2a606db9a0169fcec96af04ad3a880de0b6b3a764000080c0" + pubKeyHex := "0x048362749392a0e192eff600d21155236c5a0648d300a8e0e44d8617712c7c96384c75825dc5c7595df2a5005fd8a0f7c809119fb9ab36403ed712244fc329348e" + + msg := mustDecodeHex(msgHex) + pubKey := mustDecodeHex(pubKeyHex) + r := mustDecodeHex(rHex) + s := mustDecodeHex(sHex) + from := mustDecodeHex(fromHex) + + sig := append(r, s...) + sig = append(sig, v) + require.Equal(t, 65, len(sig)) + + sha := sha3.NewLegacyKeccak256() + sha.Write(msg) + h := sha.Sum(nil) + + pubk, err := gocrypto.EcRecover(h, sig) + require.Nil(t, err) + require.Equal(t, pubKey, pubk) + + sha.Reset() + sha.Write(pubk[1:]) + h = sha.Sum(nil) + h = h[len(h)-20:] + + require.Equal(t, from, h) +} + +func TestDelegatedSigner(t *testing.T) { + rHex := "0xcf1fa52fae9154ba21d67aeca9b42adfe186eb9e426c441051a8473efd190848" + sHex := "0x0e6c8c79ffaf35fb8f136c8cf6c5656f1f3befad21f2644321aa6dba58d68737" + v := byte(0) + + msgHex := "0x02f08401df5e76038502540be400843b9aca008398968094ff000000000000000000000000000000000003f2832dc6c080c0" + pubKeyHex := "0x04cfecc0520d906cbfea387759246e89d85e2998843e56ad1c41de247ce10b3e4c453aa73c8de13c178d94461b6fa3f8b6f74406ce43d2fbab6992d0b283394242" + + msg := mustDecodeHex(msgHex) + pubKey := mustDecodeHex(pubKeyHex) + r := mustDecodeHex(rHex) + s := mustDecodeHex(sHex) + from, err := address.NewSecp256k1Address(pubKey) + require.Nil(t, err) + + sig := append(r, s...) + sig = append(sig, v) + require.Equal(t, 65, len(sig)) + + signature := &crypto1.Signature{ + Type: crypto1.SigTypeDelegated, + Data: sig, + } + + err = sigs.Verify(signature, from, msg) + require.Nil(t, err) +} + +func prepareTxTestcases() ([]TxTestcase, error) { + tcstr := `[{"input":"0x02f84e82013a80808080808080c080a002d9af9415b94bac9fb29efa168e800fe8390ec22dd6dd3b6848632f999e5fa6a04b0bd833d6993eb37c3b0b5f89551cbbd5412b3a1fed84ca1e94ab2b936be12b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080808080c0"},{"input":"0x02f84f82013a81c8808080808080c080a0a9177c9fc995b0f83480113a62b797a3520e6bc15d0e9c722c662c40d443b893a01eec355e019308be6acf89a55288a40ae247b6f57c0ca31545efea5954f788d5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080808080c0"},{"input":"0x02f84e82013a80808080808080c080a002d9af9415b94bac9fb29efa168e800fe8390ec22dd6dd3b6848632f999e5fa6a04b0bd833d6993eb37c3b0b5f89551cbbd5412b3a1fed84ca1e94ab2b936be12b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080808080c0"},{"input":"0x02f84f82013a81c8808080808080c080a0a9177c9fc995b0f83480113a62b797a3520e6bc15d0e9c722c662c40d443b893a01eec355e019308be6acf89a55288a40ae247b6f57c0ca31545efea5954f788d5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080808080c0"},{"input":"0x02f87282013a808080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a0ab14f6fcca6c9905f447e961f128f2c00f5a00e7b1ae18f5d4f9e024a9b7a6a06c4126378d89035f4ab6085fa9a01d92bf798cd799b9338f7818bc48bcba0c8e","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ef82013a808080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87382013a81c88080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0884e063f65a2986844a9e92f9e02561789c231136976715d5afb581435359e87a044295113d06dd7b8bdf105dd412c76fbd966ef6dbe1d8ace984886296a36018c","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f082013a81c88080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a808082ea6080808080c080a02b86cbd16667f7e035bd908d250d842e7d06f888716131de27897655dce01666a055f43bf2a758e6c250a14a31d33056fcb764e0fce4fffdeb0e11d84caa5ca57b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080808080c0"},{"input":"0x02f85182013a81c88082ea6080808080c001a07f1e363b3d38607f8854013e68a80750befd3ba78cc9ce116d6ef6a09359a7aea05ef2c89ffc70ef7f2eaae90a2b4b2a4ffb418108d458e1237b26469e6381fdce","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080808080c0"},{"input":"0x02f85082013a808082ea6080808080c080a02b86cbd16667f7e035bd908d250d842e7d06f888716131de27897655dce01666a055f43bf2a758e6c250a14a31d33056fcb764e0fce4fffdeb0e11d84caa5ca57b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080808080c0"},{"input":"0x02f85182013a81c88082ea6080808080c001a07f1e363b3d38607f8854013e68a80750befd3ba78cc9ce116d6ef6a09359a7aea05ef2c89ffc70ef7f2eaae90a2b4b2a4ffb418108d458e1237b26469e6381fdce","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080808080c0"},{"input":"0x02f87482013a808082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ddb915f82dd7835ad51b718abcfce007d8626019b122763063b92fa40b987248a03bd8dfd6c9b9c33affcdcd3a16b8d28ba9554ace2b5333c7d51d218f9d9ae175","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a808082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c88082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0606a3f7eeae6d8e7167d68bdd18c8d6f1dafa2aa308cc972d00c17fba8a00ed5a023ab15156103722a5b318570eed11eaa54d943f49135fae65288cb08fdb63aa1","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c88082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a8082ea608080808080c080a06ad97b54cb997b20c8c10e8aa231582470e9fb29c7b4353ad349ede58988e167a0536ca437b1e2c2346b44ac24d0c5c2bc84ef76f2fa9fb601e5120ab08172188d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080808080c0"},{"input":"0x02f85182013a81c882ea608080808080c080a07765925917407579de914453373b3169a9c7bd54ffbdc2baf95d27d628782b6aa07bdb11529410353d7fcf128e47d4a11f78805bdea8317df3060f75574dd56049","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080808080c0"},{"input":"0x02f85082013a8082ea608080808080c080a06ad97b54cb997b20c8c10e8aa231582470e9fb29c7b4353ad349ede58988e167a0536ca437b1e2c2346b44ac24d0c5c2bc84ef76f2fa9fb601e5120ab08172188d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080808080c0"},{"input":"0x02f85182013a81c882ea608080808080c080a07765925917407579de914453373b3169a9c7bd54ffbdc2baf95d27d628782b6aa07bdb11529410353d7fcf128e47d4a11f78805bdea8317df3060f75574dd56049","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080808080c0"},{"input":"0x02f87482013a8082ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0cea8956fdd5588f6ecb10da330d2b792f1f65e44ad7ce7ef8f084054c036a1f4a0429db8240b6da9dbc82286141ec5af4abcf38a3c1aabe2f918274aca59cfc315","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a8082ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c882ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0936dede60bd875866a5909ff0f6bbdfc12d3e9b171904140d745f8fb8f58dd1aa005d646d18d5abcd9dfdc448226be2b2395bb725603d548ce20e99968c7d1165b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c882ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea6082ea6080808080c001a08d8e15db9b109df23e6a888073dfbd4ff82650072a6fabc2acb7a8077221eee6a04d6b3b42271a428998881b4a061efa181b66113dbbb68ea559bc07668b4be8e5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080808080c0"},{"input":"0x02f85382013a81c882ea6082ea6080808080c080a0cf0e64a9535ae3e48045e863970f9e50b2742c641a5fe87a68ce60711e7f0d37a077ec4be433ce17b81eeccc857edde772bceaf7f1ef5dec398a0a5c514db554ab","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080808080c0"},{"input":"0x02f85282013a8082ea6082ea6080808080c001a08d8e15db9b109df23e6a888073dfbd4ff82650072a6fabc2acb7a8077221eee6a04d6b3b42271a428998881b4a061efa181b66113dbbb68ea559bc07668b4be8e5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080808080c0"},{"input":"0x02f85382013a81c882ea6082ea6080808080c080a0cf0e64a9535ae3e48045e863970f9e50b2742c641a5fe87a68ce60711e7f0d37a077ec4be433ce17b81eeccc857edde772bceaf7f1ef5dec398a0a5c514db554ab","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080808080c0"},{"input":"0x02f87582013a8082ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a087081d2d818f81fb4d6e7063e1c99b0c615166815dcfab4ada162a3bb9888f689f0d4db69544b662926e8d06d838739691ddc15c23e5bde43b39b4908248abc2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a050d9da7b09da1c7b8f8acf8a4757ef0a30e051c9f3ad2175f23f00ce1c9b830da047e0d9bb275b89be86bd3e5c711d6ec93220df5072ba363f2d49b2b1c2487235","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a80808082ea60808080c080a07b741f41b9adbaff98e97624a7910c544ca9fe9d6d4df4c72f9c6388eae73feda02206314ddfccf58fd2859b09b186c5d620b3da4629b4f5ea7182f5f20166cc17","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60808080c0"},{"input":"0x02f85182013a81c8808082ea60808080c080a0de264ea9a2f3130cf8b701f1e9683e7966fc11f889e2662ce019bde8b230c76ea0757eeb15f1425b63a1b30404a90e7fdd71d260144370400b90759151dc9e5c0a","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60808080c0"},{"input":"0x02f85082013a80808082ea60808080c080a07b741f41b9adbaff98e97624a7910c544ca9fe9d6d4df4c72f9c6388eae73feda02206314ddfccf58fd2859b09b186c5d620b3da4629b4f5ea7182f5f20166cc17","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60808080c0"},{"input":"0x02f85182013a81c8808082ea60808080c080a0de264ea9a2f3130cf8b701f1e9683e7966fc11f889e2662ce019bde8b230c76ea0757eeb15f1425b63a1b30404a90e7fdd71d260144370400b90759151dc9e5c0a","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60808080c0"},{"input":"0x02f87482013a80808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0b88b1993c94f40aa95afdb48d12fe68872b2ad2db152a4af2e333926e57bab16a0134405c059bd7006ffde093895cb5f032bfb2ed2a2c2b1a8bc0fd404d34e397c","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a80808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c8808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a016bd6bdb9a4a99679bb85cfb0d17b49d635c0837589827aa95b23ccb2e6899c9a0041e3d19f409ddef0eb8b3d5197cf7f6097d7ad7c8f55bc976ded6195e27f373","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c8808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a808082ea6082ea60808080c001a054c4ed8414c0103afb7d19ad69433cd0e9d3b988f33ace6c050795c583ffa681a06e4aa13eb0459ceeb0b25a8099ec17fa40ca7ca381191a940c68199a95e8d98d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60808080c0"},{"input":"0x02f85282013a81c88082ea6082ea60808080c001a0d3b7b7cd9a61dd80070781bbba5b4b84a8006715e628ea0c0f891446e524d2f89fd149593d7205b5baf322da6c1a770b402b4cd075cf476f6bdc5331c9ebb5c3","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60808080c0"},{"input":"0x02f85282013a808082ea6082ea60808080c001a054c4ed8414c0103afb7d19ad69433cd0e9d3b988f33ace6c050795c583ffa681a06e4aa13eb0459ceeb0b25a8099ec17fa40ca7ca381191a940c68199a95e8d98d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60808080c0"},{"input":"0x02f85282013a81c88082ea6082ea60808080c001a0d3b7b7cd9a61dd80070781bbba5b4b84a8006715e628ea0c0f891446e524d2f89fd149593d7205b5baf322da6c1a770b402b4cd075cf476f6bdc5331c9ebb5c3","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60808080c0"},{"input":"0x02f87682013a808082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ca465473de19d169c5ec35304368da7d03767e8bbbdfc3e01a7b38822a3e2899a05ea2562bbd0bf90d2ee8944997129ff42618b123b7b6d3221208c34c37e6d7b2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a808082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c88082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a025e211e1e66aa58549f12d352f1f7c4c644c0a208c0ccf48e1c0b6642ad1fadfa07275f712cf8e1f257722893c99fcd794aabf4eb2124ce2025cc404d326f69f95","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c88082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85182013a8082ea608082ea60808080c0019fadd8e2ba459fd435d0e5ff745057e84f2ef3982952da514d1b59e12acb8639a04ee061901f178335a5498809e96e5984186e3015800ac95ae05bb17c2ad0eb2f","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60808080c0"},{"input":"0x02f85382013a81c882ea608082ea60808080c001a05ae3f41d9ecdbf2f944f532cd63afafdcb6ea93d849925a3713af37133acacfba06f3fca48b5d91f3f7475a3b24bc9e406584dfca736a3e818506156a8a2955f77","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60808080c0"},{"input":"0x02f85182013a8082ea608082ea60808080c0019fadd8e2ba459fd435d0e5ff745057e84f2ef3982952da514d1b59e12acb8639a04ee061901f178335a5498809e96e5984186e3015800ac95ae05bb17c2ad0eb2f","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60808080c0"},{"input":"0x02f85382013a81c882ea608082ea60808080c001a05ae3f41d9ecdbf2f944f532cd63afafdcb6ea93d849925a3713af37133acacfba06f3fca48b5d91f3f7475a3b24bc9e406584dfca736a3e818506156a8a2955f77","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60808080c0"},{"input":"0x02f87682013a8082ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0df6e0b1a5df0b64974bd19cb70cfba37732beca6b172708d10b27861d2f05a7ca04d16fd21111cd6867a0a341a9355599665bf951d0a8e4bb70714ed73007c309b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a00ffa95e5be67c550de3b12b20ff369cdfc994faafc2c8bbd9fac95dc2d20e904a019ad18231fb1965b13c43f3f5a69f02c21c38fae141c8b391f598e7ed12ecbcb","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60808080c080a08f0078606ffc32decf3ee390a30f9610b8dc49cb55666a7d037325d367ef09bca0767479734098f684fca992e7237b369343b223940c7a3dcf486ae0763c2d3707","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60808080c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60808080c001a088ddf4e4ce8c4ad8b2d1b197ba41692ffd35e91feb4cb7f944019b9fd2b05fa4a04c87674f13d7ea3fa09b4a5f7d84a70206aed313136c5d2cdff65b6028e0efb2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60808080c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60808080c080a08f0078606ffc32decf3ee390a30f9610b8dc49cb55666a7d037325d367ef09bca0767479734098f684fca992e7237b369343b223940c7a3dcf486ae0763c2d3707","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60808080c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60808080c001a088ddf4e4ce8c4ad8b2d1b197ba41692ffd35e91feb4cb7f944019b9fd2b05fa4a04c87674f13d7ea3fa09b4a5f7d84a70206aed313136c5d2cdff65b6028e0efb2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60808080c0"},{"input":"0x02f87882013a8082ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a062385c6b319fd40197a42e418525993e08804552961eb34e3de3cdddb1e1c17aa01f846e856717054b4974814048483e8be23f7acb0382e883f8a36e527a2067cb","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f582013a8082ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87982013a81c882ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a091f71b17ab4d27b10ffa21aa757fa361adac0ec0084bc0ca499f5eb7b09677d5a034d9e5954f9a3e4b0f871c3045ccb11ad0e26bc6f4e32c19bc91e80931f2fd5d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f682013a81c882ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f84e82013a80808080806480c080a0e3e8ae1c2f71c3657729422bc3d48239f877d9133c2608966ccbe899d477b2bba0272d93dbc97ee070fdc86870712795a8a87779f706b45baa1643092290258878","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080806480c0"},{"input":"0x02f84f82013a81c8808080806480c080a097cb9161ea9dc2753dd6d0866d9b03b39c4cdfef2f44fa6c73fc1d5def02dee9a05e723c214ed4cc12d1df5842e422947805afe44c85e8184855174a673ce68d74","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080806480c0"},{"input":"0x02f84e82013a80808080806480c080a0e3e8ae1c2f71c3657729422bc3d48239f877d9133c2608966ccbe899d477b2bba0272d93dbc97ee070fdc86870712795a8a87779f706b45baa1643092290258878","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080806480c0"},{"input":"0x02f84f82013a81c8808080806480c080a097cb9161ea9dc2753dd6d0866d9b03b39c4cdfef2f44fa6c73fc1d5def02dee9a05e723c214ed4cc12d1df5842e422947805afe44c85e8184855174a673ce68d74","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080806480c0"},{"input":"0x02f87282013a808080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09459bcb2fd569e48e6d854b142924b3cb5f63b774705f691238fdba4722896bda0137170a8cf29602fcf9a6ae1f692e20371f7ad6a73856e96e0b1f58535b5938c","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ef82013a808080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87382013a81c88080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09a229970bf10c22518b219419cb17688b2db26110eaef65458b54e7cfb3de4f2a07dc083b02a1e86f4c5037ecc2906e49978da216b5e40d629c5856508c5475f89","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f082013a81c88080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a808082ea6080806480c001a0ad1c4e4febc7dca2391a4a15118f7a86806c2556049ad60cfb8b056fadad3ecfa058f215be70dfa961d7072f4dc438510e9c8db0a5791caa79ff0b7b706cf316ed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080806480c0"},{"input":"0x02f85182013a81c88082ea6080806480c001a0f31747ec765743a700ca8df903fc916cda923abf5b44a979db85d306f59cbde6a02e139ced4f0a12955f8b3782a7d921cc460f7bb066b65490c81f68ce7f7a50dd","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080806480c0"},{"input":"0x02f85082013a808082ea6080806480c001a0ad1c4e4febc7dca2391a4a15118f7a86806c2556049ad60cfb8b056fadad3ecfa058f215be70dfa961d7072f4dc438510e9c8db0a5791caa79ff0b7b706cf316ed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080806480c0"},{"input":"0x02f85182013a81c88082ea6080806480c001a0f31747ec765743a700ca8df903fc916cda923abf5b44a979db85d306f59cbde6a02e139ced4f0a12955f8b3782a7d921cc460f7bb066b65490c81f68ce7f7a50dd","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080806480c0"},{"input":"0x02f87482013a808082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a810714a260023b52cda70890e61f16ee4af42f46fa9e1566f470c453bd25b88a02d6a88558e5692dbd2e59bed18109d505005ae48d5e59742b408dcef5bd9e367","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a808082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c88082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d11b1322d114f5b9f9c4b1e5231a2db2171b5608122e0317b29d4959770d7ef6a011fd8d3641694c019c62b010c37af30aa5ab41ee34d8f69b9a9f98a3c1c5d578","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c88082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a8082ea608080806480c001a0320db73af75876fedea2856c3aeeb4bb20e6514b1ed0e6c30e81723a7db3daa5a03a7fce79ffb6638b7a44aa1ef72073d6e55cca462c2fca9d85ffe2a246a5908d","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080806480c0"},{"input":"0x02f85182013a81c882ea608080806480c080a0dac7634fa49fc1a622bf8bb562449f712b8d611315d1a4c42437fbab9ce6db84a07b8ee93bb2e8267646b2f0cf6d833b179cea243a64c87d3404a845f2c5f2e5de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080806480c0"},{"input":"0x02f85082013a8082ea608080806480c001a0320db73af75876fedea2856c3aeeb4bb20e6514b1ed0e6c30e81723a7db3daa5a03a7fce79ffb6638b7a44aa1ef72073d6e55cca462c2fca9d85ffe2a246a5908d","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080806480c0"},{"input":"0x02f85182013a81c882ea608080806480c080a0dac7634fa49fc1a622bf8bb562449f712b8d611315d1a4c42437fbab9ce6db84a07b8ee93bb2e8267646b2f0cf6d833b179cea243a64c87d3404a845f2c5f2e5de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080806480c0"},{"input":"0x02f87482013a8082ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03f00cc26a7c13191e82fe3ee79f43a3c7addeb4b3ff14c1382b5eb7dedac6745a02e994b354d3fa24bf97350f36d5177356f1c40cec2c0ff3e3c6c6620afe2a637","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a8082ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c882ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ec35e69a3bbcf761e388401ce39cd25d7dab736bb200bb632e7d484aad96f506a05a3ee4422b29d1192434c4d3c9d64af412538f0deeeb7d1a18b931eb4af38df3","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c882ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea6082ea6080806480c080a0eddd719e0b0de7f96549dd1de6f5ef13f9fb5f9e67bdaad08545ca348058c431a0687a16c86b9068385f6175475e91907f9c37377e1a54bd4b41d088d27bc7088a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080806480c0"},{"input":"0x02f85382013a81c882ea6082ea6080806480c001a0788913be6a613572ca175c16ffaddf01a167b58c32f81defd8e4de53625fc812a004c93984e30bdba3603c1f57feee0b5115a87031e0124516c251cb73ef27de10","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080806480c0"},{"input":"0x02f85282013a8082ea6082ea6080806480c080a0eddd719e0b0de7f96549dd1de6f5ef13f9fb5f9e67bdaad08545ca348058c431a0687a16c86b9068385f6175475e91907f9c37377e1a54bd4b41d088d27bc7088a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080806480c0"},{"input":"0x02f85382013a81c882ea6082ea6080806480c001a0788913be6a613572ca175c16ffaddf01a167b58c32f81defd8e4de53625fc812a004c93984e30bdba3603c1f57feee0b5115a87031e0124516c251cb73ef27de10","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080806480c0"},{"input":"0x02f87682013a8082ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07f7f9b35e2759a1b6dc06506c1195468e29fd8b80e1ff90e3f40723a9334fed8a039cac5524d7e57b22be8c4390f8c4aedb2ce7abe8e9c6c0a3fbe90c48d754387","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07eddd29705e5e913d22de47daf6d93b20a7135f0e3ac8aa16c5b1c25efa95815a0082caa535a5e00776dcc47a19aca103f0e815fb984ecf90d3407dcc43655eece","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a80808082ea60806480c080a0f8102947aec0f244de8b3c3791a4e4214f693c3314bf50696546f5ca7c54930ca002769e82a368edbb1c9cb53d1857541c1386fcc6d0a11d3e58655025f8ce7312","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60806480c0"},{"input":"0x02f85182013a81c8808082ea60806480c080a0ce8df3004e424af808d77c6a11b2f0391842bbd5ac686e5b432e1e8a1f5fd1d4a00d55cc4ff21cacc2581d8756b0a8227111fdcbb030c6bbd692f775525be29902","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60806480c0"},{"input":"0x02f85082013a80808082ea60806480c080a0f8102947aec0f244de8b3c3791a4e4214f693c3314bf50696546f5ca7c54930ca002769e82a368edbb1c9cb53d1857541c1386fcc6d0a11d3e58655025f8ce7312","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60806480c0"},{"input":"0x02f85182013a81c8808082ea60806480c080a0ce8df3004e424af808d77c6a11b2f0391842bbd5ac686e5b432e1e8a1f5fd1d4a00d55cc4ff21cacc2581d8756b0a8227111fdcbb030c6bbd692f775525be29902","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60806480c0"},{"input":"0x02f87482013a80808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a009f2b5837ed29f7b472468b9dc636f39e989796d97ca9400e35f094f234b7231a0345874d675700c4488978338d12a7c62f9d8a0096798342bff7f35e444604154","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a80808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c8808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c0580e0842bb3f50d0a28402f4a99fd6e156b978633b629c0f2cc4172252153a051f9ecab32316215af8da2abb81dcf859aec81ad75fc0e22f2c281d512333928","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c8808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a808082ea6082ea60806480c080a0fcdad7ad0562a7129b4cc73bfb8565959feb5a8259993cd68ece3d6f6bd4f0e1a0121e6ae7e4819a865ffbacbe8ad67d5cc8634e9dbe8f5528cc8841c9d4453ccc","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60806480c0"},{"input":"0x02f85382013a81c88082ea6082ea60806480c001a083dc862eaf257068751ac014ff021ab5a729c68fc3f665bcc3abe3d7393cb0d2a02400cc4059f66c8feaa0d717a659d763ac5d4d067a45b9571037f5d573fdd7c9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60806480c0"},{"input":"0x02f85282013a808082ea6082ea60806480c080a0fcdad7ad0562a7129b4cc73bfb8565959feb5a8259993cd68ece3d6f6bd4f0e1a0121e6ae7e4819a865ffbacbe8ad67d5cc8634e9dbe8f5528cc8841c9d4453ccc","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60806480c0"},{"input":"0x02f85382013a81c88082ea6082ea60806480c001a083dc862eaf257068751ac014ff021ab5a729c68fc3f665bcc3abe3d7393cb0d2a02400cc4059f66c8feaa0d717a659d763ac5d4d067a45b9571037f5d573fdd7c9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60806480c0"},{"input":"0x02f87682013a808082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a5b1529fb5158abf54d61689aeafbcf7aba86c95efa53726299c64349e8cb277a06f68a0c684c1e1ddba000a3bdd18019011ca5a01f627914445a8e8ff77d11eed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a808082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c88082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a049bc9983635fe90f3c5ac42c4919695c2bd1bf3600e731a85e671923dab1d24da02c2140f4339ff23855d599c7c88257709fbf6a363bcd7211e6218cf1ad3936d9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c88082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea608082ea60806480c001a03a08bf6de5d7d22ca0154c5a705bb3f5b0e3105c343eabc0307fc99bb89f91d0a021f8c7c5867ca59acd770eb06ac8c4488bd8f40c4bfd0841185ac60f8cb311de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60806480c0"},{"input":"0x02f85382013a81c882ea608082ea60806480c001a09449cea6b7b492b80c6ebe08588c3b3bb94f73cddcf5b60a4bdf9c10462f9264a01682ef0a841044bd58f392b252418d9dd473e08bf561632976126652f1ac1b88","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60806480c0"},{"input":"0x02f85282013a8082ea608082ea60806480c001a03a08bf6de5d7d22ca0154c5a705bb3f5b0e3105c343eabc0307fc99bb89f91d0a021f8c7c5867ca59acd770eb06ac8c4488bd8f40c4bfd0841185ac60f8cb311de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60806480c0"},{"input":"0x02f85382013a81c882ea608082ea60806480c001a09449cea6b7b492b80c6ebe08588c3b3bb94f73cddcf5b60a4bdf9c10462f9264a01682ef0a841044bd58f392b252418d9dd473e08bf561632976126652f1ac1b88","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60806480c0"},{"input":"0x02f87682013a8082ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a07e9ba318f9c63d1a6b2afeccbca77eb512e85e1ac661e6fc050970449c4b2a26a0478a9c96e9d9e900dc3ae4dba33a425254ff3578af30255c1be68fe316c40119","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a08c6c7c76220d18df6d45175256f1c615757a456163bcf732a605d9a063509c79a022b364054d69f91213c521ffad2d0c5c349a5808b03543d4813f8b23e342e8f3","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60806480c080a0825a042c44b472317d1387a9cf190f4d0c770a84300c299452ff5a220e2c1590a00403abbbf3b147d4895f68305b0db21be477616987d604cea0615cf6ac377a77","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60806480c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60806480c001a044bdb37e9b26c8a09c9ce61acd01f68badc063005f5dcbfd32836f5950049695a0499a9d378b97c4a5bb6ec105a00ad581b224bf227439799d0b97ea8f5faee767","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60806480c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60806480c080a0825a042c44b472317d1387a9cf190f4d0c770a84300c299452ff5a220e2c1590a00403abbbf3b147d4895f68305b0db21be477616987d604cea0615cf6ac377a77","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60806480c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60806480c001a044bdb37e9b26c8a09c9ce61acd01f68badc063005f5dcbfd32836f5950049695a0499a9d378b97c4a5bb6ec105a00ad581b224bf227439799d0b97ea8f5faee767","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60806480c0"},{"input":"0x02f87882013a8082ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c73e7dcd11a8f1e1b59b81f5e626c898597c84dc540966dad1dbb51fcc106814a0352250cf688c74808d2939ff919cdef19a4c9c9fa61698224565ce912a20429a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f582013a8082ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87982013a81c882ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a08020e129ccb7034377ea4cbb03a313997c6e9a370891de88d1d3d61c0e87e1b4a00668935ceed45538772745b760bb6471e79963e44ffce163440240b3578cd262","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f682013a81c882ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85682013a8080808080880de0b6b3a764000080c080a0f31df874009680817aea98fdd57d6a0f8d596e251b573e86d44e0b944a7913f3a03baa16757b2351cd5784c4b0213e66c2f3839e98af99f20606d8c33d9d45f661","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d382013a8080808080880de0b6b3a764000080c0"},{"input":"0x02f85782013a81c880808080880de0b6b3a764000080c001a0cf54b9a861cf6a6951b38578a73de9c51688b124b8e7dd0ee7ba10f0136e4efba003a5bf873c58a9dc269727e1ebc2b2c690ed2e7e3a64482c1f58e6b526092944","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d482013a81c880808080880de0b6b3a764000080c0"},{"input":"0x02f85682013a8080808080880de0b6b3a764000080c080a0f31df874009680817aea98fdd57d6a0f8d596e251b573e86d44e0b944a7913f3a03baa16757b2351cd5784c4b0213e66c2f3839e98af99f20606d8c33d9d45f661","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d382013a8080808080880de0b6b3a764000080c0"},{"input":"0x02f85782013a81c880808080880de0b6b3a764000080c001a0cf54b9a861cf6a6951b38578a73de9c51688b124b8e7dd0ee7ba10f0136e4efba003a5bf873c58a9dc269727e1ebc2b2c690ed2e7e3a64482c1f58e6b526092944","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d482013a81c880808080880de0b6b3a764000080c0"},{"input":"0x02f87a82013a8080808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0907be9b9c50d1ebc3489dde0599802464a2792e6a4c3014d2d42db50f4ba3c75a02330372fe92742fce0fe28bc0583813f17640e3c5080141008b4ac803e61911a","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f782013a8080808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87b82013a81c880808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c566bb25bc5010ed9c7a5eedb662d3390bf065fcc10571125dc248d810a6731a024531646c80970757cff49228a332f238d8e3e4ce7038fd6943610f877eedff9","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83882013a81c880808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a808082ea608080880de0b6b3a764000080c001a0b7079e6b62999bc486de04bed329e79a52aa17752ba4880b996710349b40c7e1a014869354847aebbfdddc473183b9baa8584d86b2dc48ecf647ae20430f146f35","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a808082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c88082ea608080880de0b6b3a764000080c080a04f4cd4dcfef7d6a5b654d9bdf8a89c4929dc32e375d199b40f5a114b9edabd45a01aabbcd6fb9b5f96597f180a70ba57e8d238995c392c96bb204879f134a12a93","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c88082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85882013a808082ea608080880de0b6b3a764000080c001a0b7079e6b62999bc486de04bed329e79a52aa17752ba4880b996710349b40c7e1a014869354847aebbfdddc473183b9baa8584d86b2dc48ecf647ae20430f146f35","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a808082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c88082ea608080880de0b6b3a764000080c080a04f4cd4dcfef7d6a5b654d9bdf8a89c4929dc32e375d199b40f5a114b9edabd45a01aabbcd6fb9b5f96597f180a70ba57e8d238995c392c96bb204879f134a12a93","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c88082ea608080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a808082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a06f5262d03380227973c7507fbb1931ce3ae684521b2803d967fc67cead8734fda02801ed8fc53083936ec4bbefa3216a5241d25c8940aa16c9bc0ed51d302907b7","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a808082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c88082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a046b8e78656538c428e14378d9e3fe1c19a3a9a96251aeb7b04fd416858ceff23a017bd04e5f3059b34c8c9a42a0ee67517bf67592c95d4b8553716808e8fde4400","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c88082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a8082ea60808080880de0b6b3a764000080c001a0d93a26bd5294c50b7dedf5c6d7cbc5a1a5ec40d80cfb811f463788b80dc45d0fa05598f7fc9dff96717999450035d4f9b503988b616e3990a20d165cdd638be362","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a8082ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c882ea60808080880de0b6b3a764000080c001a08890ab494d178516833623e2c05e7ffb600ec980b141f8b6e8733a94bf7b5289a04bc7ff419352ca8eb396d1b7b57d50bc1ec80a236a71055241bf2e7535f92901","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c882ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85882013a8082ea60808080880de0b6b3a764000080c001a0d93a26bd5294c50b7dedf5c6d7cbc5a1a5ec40d80cfb811f463788b80dc45d0fa05598f7fc9dff96717999450035d4f9b503988b616e3990a20d165cdd638be362","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a8082ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c882ea60808080880de0b6b3a764000080c001a08890ab494d178516833623e2c05e7ffb600ec980b141f8b6e8733a94bf7b5289a04bc7ff419352ca8eb396d1b7b57d50bc1ec80a236a71055241bf2e7535f92901","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c882ea60808080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a8082ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0d9d52087d771d397a9e1630452cc4649671941c3486b0bb24019087b4d897769a04e2ecc1e542690cfcf341c6fce6987ac4cd8cdecdbdfd5c9521d268d2085c84e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a8082ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c882ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0eadf0da93be9c532794684382b7fe49093a093a8f082b79b4b9bb9ee686de274a021648c60e5dd6e4c3e102befcfdc4512a246e9d66e24fff3053545144955cb80","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c882ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a8082ea6082ea608080880de0b6b3a764000080c080a0ee344021ecd122a30b44535901718a9eefd06f5ecccc41c530c1e9cfe4cd1f13a07425a2aa7612bb4e5cffe400af1d162ab8cdbe185d92b1e6c166de7fa571a9f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea6082ea608080880de0b6b3a764000080c001a0da86086e5a046a1b41dbc4b55b97ba517696db207e0a9da2e3b46af1507d17c5a07779b1c12a3dc37378985b5d7a4fcc95f1fbd0cbba522d7cc1a20d535faeb30e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a8082ea6082ea608080880de0b6b3a764000080c080a0ee344021ecd122a30b44535901718a9eefd06f5ecccc41c530c1e9cfe4cd1f13a07425a2aa7612bb4e5cffe400af1d162ab8cdbe185d92b1e6c166de7fa571a9f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea6082ea608080880de0b6b3a764000080c001a0da86086e5a046a1b41dbc4b55b97ba517696db207e0a9da2e3b46af1507d17c5a07779b1c12a3dc37378985b5d7a4fcc95f1fbd0cbba522d7cc1a20d535faeb30e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a8082ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0fc1e27c941325403a95a8adf21eb77fbc947b20a0a1dabb245ab514ef09d0171a03e014156069072bf3682e34da2719af03d784691c199beb012c71682dfda20ae","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a8082ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c882ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03412dc4f1e4b8de363a753b08e7bed249c1e3c5a95515f5a50997ad7f3bb6c50a05fb5a87024da9009bb50337a28bd86dd448c3772ba93abba952d9c3b5fc927f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c882ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a80808082ea6080880de0b6b3a764000080c080a00b2cab27d46f5b18c95bcbbbbdbc128e1798e8c633f3126f8e0b4d47822899c8a00e2dfee3c9698df3dacea25569c96f927baa0e83a2dc3804c2007215ff1fd16e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a80808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c8808082ea6080880de0b6b3a764000080c001a098d11fdf17851c4393dcdeca863464936f901cb89b5959be1d5fbe5cf47fce64a070acf0beaedc55af8a67b637d43dd8f70b10026501f146b32ec9b413689c3018","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c8808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85882013a80808082ea6080880de0b6b3a764000080c080a00b2cab27d46f5b18c95bcbbbbdbc128e1798e8c633f3126f8e0b4d47822899c8a00e2dfee3c9698df3dacea25569c96f927baa0e83a2dc3804c2007215ff1fd16e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a80808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c8808082ea6080880de0b6b3a764000080c001a098d11fdf17851c4393dcdeca863464936f901cb89b5959be1d5fbe5cf47fce64a070acf0beaedc55af8a67b637d43dd8f70b10026501f146b32ec9b413689c3018","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c8808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a80808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a062d300529917ba1c03873cfdf35ef669d0e1d3f52115b305916609f1659d67c4a0111fc401c2a10f874c02c20b3e938412f9c35f24fb83b121fadb8fd107182726","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a80808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c8808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02b66e32d2b4bda0ddbfa74d8ea2f8a0267ba7019abb366e0d3f8b247b129982aa02c163d63b6e727cbd6b17add5b2f98d60b7cbe00af5b0224d809e94924a5c129","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c8808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a808082ea6082ea6080880de0b6b3a764000080c001a0055ae00874a381bf2c6f1b518f318270f2c4109b2eb071fcc17d934b1faf2c81a04a2a6dd88a31a2929656581bf31d42109beb431dbc99bdea4ec0636d697b7137","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a808082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c88082ea6082ea6080880de0b6b3a764000080c080a0ceb7acb4eccb1683ed065ed0df5b3e1e747a741449c17f4170fb4688af79169da04647dc401f5170ce6824219e4b877100a79ff252e73177bc3be6904f04457c5e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c88082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a808082ea6082ea6080880de0b6b3a764000080c001a0055ae00874a381bf2c6f1b518f318270f2c4109b2eb071fcc17d934b1faf2c81a04a2a6dd88a31a2929656581bf31d42109beb431dbc99bdea4ec0636d697b7137","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a808082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c88082ea6082ea6080880de0b6b3a764000080c080a0ceb7acb4eccb1683ed065ed0df5b3e1e747a741449c17f4170fb4688af79169da04647dc401f5170ce6824219e4b877100a79ff252e73177bc3be6904f04457c5e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c88082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a808082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a020e9ce595105ad63212d5c8e1e598d2d90347c94ca57aa8454768222b5ee91a5a019bcc3d4692a00fbf0ee91605eb2ebd7aab58f94ead5f03b005cee1e6a328a9a","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a808082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c88082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0203be5acf80eea1a22f151475993fdea0b429a90a7ce53554f303309ba5cbb75a05ba185145f6f072158cff4a2c63bb4e7c5ffaf3ef2029d2688c24cd238495657","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c88082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a8082ea608082ea6080880de0b6b3a764000080c080a02200b34117aec43fbf36c19584d3f5371662e02e06e41ab18893f6ea4eae9db7a036cfb853039002767d6b41625ffdf926ab2adec33d668b83209f609d4a64661b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea608082ea6080880de0b6b3a764000080c001a0d5bf42725de1f608b811ad94bd96f1419606b5edc2b2885252be998e21c19e64a026b18d19b371fc68a48c0b348192956158cfc3aef4c2995a04e455193156ab9b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a8082ea608082ea6080880de0b6b3a764000080c080a02200b34117aec43fbf36c19584d3f5371662e02e06e41ab18893f6ea4eae9db7a036cfb853039002767d6b41625ffdf926ab2adec33d668b83209f609d4a64661b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea608082ea6080880de0b6b3a764000080c001a0d5bf42725de1f608b811ad94bd96f1419606b5edc2b2885252be998e21c19e64a026b18d19b371fc68a48c0b348192956158cfc3aef4c2995a04e455193156ab9b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a8082ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0048571da63d488ba7d100e9ef32c0b4a06ffe51354e82a40ff953c377959033da069fae6fc2a68e6f96480fbb2768ba3bdcb9c9fa5523fe3ca428ef2d377b67ed2","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a8082ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c882ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0e4bf87c6adc1f903dde3bae06b12c00d62e0b4bb8178669b9cb3f658d43059dba07f0cdef6581cbb312cceef38703b154e5744df03693423e07aa2464daf67fc28","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c882ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85c82013a8082ea6082ea6082ea6080880de0b6b3a764000080c001a0adb3a7c410f3a4d89792fcede5c7a5437c5fab3881d9145cdbf96ee6d4050311a066866bcc349f1e78ea7ecb8d71c649cd3e8bcf8614494c6facd5c2dd68a6352f","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d982013a8082ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85d82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c080a0ba51668b00de8e0355e0ab99c49377f61be25d30f7598bd798178fa500bbe262a06bba3437dea06d5a63f3122d4fa7013238e47289b5801bf18444383180484900","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02da82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85c82013a8082ea6082ea6082ea6080880de0b6b3a764000080c001a0adb3a7c410f3a4d89792fcede5c7a5437c5fab3881d9145cdbf96ee6d4050311a066866bcc349f1e78ea7ecb8d71c649cd3e8bcf8614494c6facd5c2dd68a6352f","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d982013a8082ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85d82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c080a0ba51668b00de8e0355e0ab99c49377f61be25d30f7598bd798178fa500bbe262a06bba3437dea06d5a63f3122d4fa7013238e47289b5801bf18444383180484900","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02da82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f88082013a8082ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a960e8dd8eafea3b38178e802b4ed9d4ef3613c9de83c96a5bb9178565bb0b90a0250e480879b64829e0ca2296c6a5f07b4d96bf2654ec70af3be447a01ca950ad","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83d82013a8082ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88182013a81c882ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c5b361f372b4b9f115de0510913e11e80b22649ec6a54fdd6cd8c70abe1c4fa4a00c109e6bf278b5bc9e93f293c1ed7cdfebf315d908a7f9c1ae255e165832c37c","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83e82013a81c882ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec8080c080a0f411a73e33523b40c1a916e79e67746bd01a4a4fb4ecfa87b441375a215ddfb4a0551692c1553574fab4c227ca70cb1c121dc3a2ef82179a9c984bd7acc0880a38","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec8080c001a0ed75a56e365c88479bf3f60251a2dd47ae181f1a3d95724581a3f648487b4396a046628bb9734edf4b4c455f2bbd351e43c466f315272cd1927f2c55d9b52e058b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec8080c080a0f411a73e33523b40c1a916e79e67746bd01a4a4fb4ecfa87b441375a215ddfb4a0551692c1553574fab4c227ca70cb1c121dc3a2ef82179a9c984bd7acc0880a38","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec8080c001a0ed75a56e365c88479bf3f60251a2dd47ae181f1a3d95724581a3f648487b4396a046628bb9734edf4b4c455f2bbd351e43c466f315272cd1927f2c55d9b52e058b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88682013a8080808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0706d871013403cf8b965dfa7f2be5a4d185d746da45b21d5a67c667c26d255d6a02e68a14f386aa325ce8e82d30405107d53103d038cf20e40af961ef3a3963608","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84382013a8080808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88782013a81c880808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0df137d0a6733354b2f2419a4ea5fe77d333deca28b2fe091d76190b51c2bae73a0232cbf9c29b8840cbf104ff77360fbf3ca4acda29b5e230636e19ac253ad92de","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84482013a81c880808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec8080c001a03a2880cc65e88d5320067f502a0ffda72111d01f0ebeeea9fbeb812e457aa0f9a020c08483b104dbfbbbffffedc3acdbe8245ca6daf97c0dbab843d747e587d625","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec8080c001a03427daf1639de6bf1b948abeab765b0a6a9170cc6a16d263c71c859f78916b03a01bbbb824b9953b5eb9f3098b4358a7ebb78f3358866eed997de66350ae4c9475","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec8080c001a03a2880cc65e88d5320067f502a0ffda72111d01f0ebeeea9fbeb812e457aa0f9a020c08483b104dbfbbbffffedc3acdbe8245ca6daf97c0dbab843d747e587d625","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec8080c001a03427daf1639de6bf1b948abeab765b0a6a9170cc6a16d263c71c859f78916b03a01bbbb824b9953b5eb9f3098b4358a7ebb78f3358866eed997de66350ae4c9475","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a808082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b9ebc36653a4800816f71ceacf93a1ee601a136916a3476ea9073a9a55ff026aa0647665249b12e8d1d1773b91844588ed70f65c91bc088ccb259ec0f0a24330d5","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a808082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c88082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0122dd8468dbd34e111e1a5ea1997199be633aa3bc9c1a7ee27dc3a8eda39c29da07cb99cd28ac67f55e507a8b8ef5b931c56cacf79273a4a2969a004a4b4a2864a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c88082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec8080c080a0c1d020df63cb6db76e3a27a60ba0500a3cdd30f9f47b08733009dc8d610ea29ba05cbafb4c223417526ded0b02b8eb66a73535386d0e62da0e20f3641b532aa406","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec8080c080a090e30d32c6cd3f1ba2109b6a9f1c9fffc50b96a934192edf98adc086299e410ba057db0c136436de2e907942bdaad8e0113cf576f250b336ab652ef094c260dae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec8080c080a0c1d020df63cb6db76e3a27a60ba0500a3cdd30f9f47b08733009dc8d610ea29ba05cbafb4c223417526ded0b02b8eb66a73535386d0e62da0e20f3641b532aa406","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec8080c080a090e30d32c6cd3f1ba2109b6a9f1c9fffc50b96a934192edf98adc086299e410ba057db0c136436de2e907942bdaad8e0113cf576f250b336ab652ef094c260dae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a8082ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a016e3f30a612fc802bb64b765325ecf78f2769b879a9acf62f07669f9723335d6a0781bb3444a73819f28233f1eebf8c3a4de288842fd73c2e05a7a7b0c288d5b25","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a8082ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c882ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0b652a447bdcdd1906ed86406ee543ee06023e4f762784c1d3aaf4c3bd85c6a17a0368ae9995e15258f14b74f937e97140a659d052d341674be0c24452257b56b30","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c882ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c001a0b1411f337b69609a256c0e76c57ccf4af87e977c98fd2a889f29281bf623cab4a049bec0fb4773aed870bae9c1cdf1ee398c498f0b436dcd19cae588b4ecd8bdf2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c080a00b845fec9c96bf593c3501753764e14867d3f5d4bd02051e49329b6810d6513ea070d046e5b38c18c542594b328f02345a8f34ab05fd00db33974f914f7ae31c63","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c001a0b1411f337b69609a256c0e76c57ccf4af87e977c98fd2a889f29281bf623cab4a049bec0fb4773aed870bae9c1cdf1ee398c498f0b436dcd19cae588b4ecd8bdf2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c080a00b845fec9c96bf593c3501753764e14867d3f5d4bd02051e49329b6810d6513ea070d046e5b38c18c542594b328f02345a8f34ab05fd00db33974f914f7ae31c63","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a8082ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02d8215d8408d2f4b83a2e68f4aad6fe5dee97d7ef6a43b02ec413ead2215ac80a0641a43cebd6905e3e324c0dd06585d5ffc9b971b519045999c48e31db7aa7f9d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88a82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0da68784e191ce0806527d389f84b5d15bed3908e1c2cc0d8f0cea7a29eb0dba39f231a0b438b7d0f0f57292c68dc174d4ee6df7add933ab4e0b3789f597a7d3b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec8080c080a04c97162e2d2ab508116a23c522fd816ecd9cb091d4c288afe45c37ee3a8dde34a06ebf67ff15b74d65c276340aaebde8e6ebb8da0d3bbab43deffac8eb1e6a0630","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c080a0d503d409e667c2876ab9e420854cecce4c0092985855234be07f270bfcf3ed4aa07a40deecc8a4448d4dc0e2014b4b23ac5721409c62bffa05aee6938d8447f72d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec8080c080a04c97162e2d2ab508116a23c522fd816ecd9cb091d4c288afe45c37ee3a8dde34a06ebf67ff15b74d65c276340aaebde8e6ebb8da0d3bbab43deffac8eb1e6a0630","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c080a0d503d409e667c2876ab9e420854cecce4c0092985855234be07f270bfcf3ed4aa07a40deecc8a4448d4dc0e2014b4b23ac5721409c62bffa05aee6938d8447f72d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a80808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a059aecc1d365ee0dc56a577d162f04c0912a5c5b62f889cff1acc706ac17a4489a017209b3ec43a10a40c5863a2b7a1ee823380ad42697a5f7d5f537c230583a4c7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a80808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c8808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0dc1eb40f93e311f3f9a94d8a695db2bbb38973ce097121875885e4bc54f18152a0075da0bd405bb4f5c69034daaf8f40052b941fae5b9f3b8df218d80fb4d7ea99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c8808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a03d392fd5e83c64554907a55204572aaeec6ffab25f2c73655c6a22344fa02a14a03b9ae94b7dc21108db6dda65125ecaff844f8f43f483bed35f32f6d5d530fe9f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c001a0405e8a430ef6ad4c3403150776af08c255b6f6fbe278d194f88517733c816caca0364203b5bca7953dd863d4cf90c0a77b499ef4a3d5831c4fdf33926c31709c4f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a03d392fd5e83c64554907a55204572aaeec6ffab25f2c73655c6a22344fa02a14a03b9ae94b7dc21108db6dda65125ecaff844f8f43f483bed35f32f6d5d530fe9f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c001a0405e8a430ef6ad4c3403150776af08c255b6f6fbe278d194f88517733c816caca0364203b5bca7953dd863d4cf90c0a77b499ef4a3d5831c4fdf33926c31709c4f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a808082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a083cf6701aee00872946b6550c059f028f72e3052acb8cc9c25b830ace860e046a03fd969d73e995d43896659f94d3956a17da18451050349e7db6f7881f8c057d3","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a808082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c5a545f2d94e719068d9a43b01879bcb46b56e236dd378dd26ef3b8e4ec8314aa04024b9936960b9b156405e4f3e0b6562518df8778324a927381e380b23f47fb8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c080a0aa406ec7f4901a1777e44b975ff41603b9d46257efdc1ca904a3e7890f2b020ea03bda5c785182cfa2d9f9b7a54f194cd08b9d0f913069a4514ff21e8fa0ef3850","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c080a089fc465c24b4bad898cf900f585eddab6d40189e8d19746da76597f86fbadf51a005732ffa2ebac36646afab9105540b543f74a5c91b441834a2b1930815c2ccc8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c080a0aa406ec7f4901a1777e44b975ff41603b9d46257efdc1ca904a3e7890f2b020ea03bda5c785182cfa2d9f9b7a54f194cd08b9d0f913069a4514ff21e8fa0ef3850","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c080a089fc465c24b4bad898cf900f585eddab6d40189e8d19746da76597f86fbadf51a005732ffa2ebac36646afab9105540b543f74a5c91b441834a2b1930815c2ccc8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a8082ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09d9a8ee802486b826348a76346987b3e7331d70ef0c0257ff976ceebef1141a2a07d97d14ed877c16bd932f08a67c374e773ee3337d512ff8241c8d78566a04d46","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a024ad1ec1578f51beb2b574507bda7691a486cdbc9c22add01ad4c1f686beb567a048445e0fe8945b8052e5e87139690c0615a11c52503b226cf23610c999eada40","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a06b382fcbe48de85615ff6e2dcc0c84021beb4abc527878accd36c9c77af84ba8a06a07d34a6896b270538525cb14b0856ceb442714fa85e4c9ee36dedf638935f9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a0ba2586cfb3323fd0f9d7bb38bf9948758a52f156bda66f7100b789760894ad89a01e4bd2ff4eff2c391915141250313ab845401d5e2f71c23691d20a0b3c68cbd9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a06b382fcbe48de85615ff6e2dcc0c84021beb4abc527878accd36c9c77af84ba8a06a07d34a6896b270538525cb14b0856ceb442714fa85e4c9ee36dedf638935f9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a0ba2586cfb3323fd0f9d7bb38bf9948758a52f156bda66f7100b789760894ad89a01e4bd2ff4eff2c391915141250313ab845401d5e2f71c23691d20a0b3c68cbd9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88c82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0f36ff02ab3e90d2de77cdb24423dc39ca5c959429db62cb5c9ed4f0c9e04703aa0476bf841b0602af44039801d4e68648971f63fc2152002b127be6d914d4fc5ca","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84982013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88d82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a08267ae8838a8a5d9c2a761c182b5759184b7672b761278d499c1514fb6e8a495a023aa268f67da7728767e114fdec4d141bf649e0ad931117b5b325834dbf72803","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84a82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec6480c080a011ec4af7fc663080460b70ae8829f47e9cfa1814c616750d359459cbbba55563a0446e4ec9ea504d13dcbef44238e442caad366dbae1ae9408d39c6d902a5577b0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec6480c001a0b80bc30bef46b3f824d1460685db875ff070f7798c3148c1fc49c01d6acc550ca0437efe7721563800e6a56ac54877a72c7860cd5e17ef4675afe989822ae87759","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec6480c080a011ec4af7fc663080460b70ae8829f47e9cfa1814c616750d359459cbbba55563a0446e4ec9ea504d13dcbef44238e442caad366dbae1ae9408d39c6d902a5577b0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec6480c001a0b80bc30bef46b3f824d1460685db875ff070f7798c3148c1fc49c01d6acc550ca0437efe7721563800e6a56ac54877a72c7860cd5e17ef4675afe989822ae87759","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88682013a8080808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a06ab9d5988105d28dd090e509c8caabaa7773fc08ec5ef3dfeae532e01938ff69a078bca296df26dd2497a49110e138a49a67a6e232a35524b041d04a10fc583651","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84382013a8080808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88782013a81c880808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a031d51b866a02a9966250d312ed6cb4e083f9131ad8f6bb5814074375093d7536a03f8f819c4011dd54348930b6f98f365de8060b487ada38a62a5617aab6cc6e09","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84482013a81c880808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec6480c001a05bda5ad44c8f9a7516226488cf2d4f53188b40352f35ea7cece8076acda26dbba015373b3b78c88b74c7cca32fd02696a248bb9bea22a09c7a4a17b9e3b629b896","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec6480c080a00d92624cc3335c903077e318204929b4a8c9cd96d94690b0191f8a3bb24e937aa02f1d0315ececf46900154791a732eb8fee9efd0dc998a4e6b892d07ad657a815","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec6480c001a05bda5ad44c8f9a7516226488cf2d4f53188b40352f35ea7cece8076acda26dbba015373b3b78c88b74c7cca32fd02696a248bb9bea22a09c7a4a17b9e3b629b896","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec6480c080a00d92624cc3335c903077e318204929b4a8c9cd96d94690b0191f8a3bb24e937aa02f1d0315ececf46900154791a732eb8fee9efd0dc998a4e6b892d07ad657a815","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a808082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0def168136c0532ec148a9e200e3cc1b22f90c7bbc5d9ef25ac0c5d342e8f3784a022f94642dfc81ba321b3e09879888332fa7c25b623bead7686e3e493c0911b55","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a808082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c88082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0626f43b80260f84cde2c67538c5cfbd328ce85b0f934e8568769e51709b100a7a0283fff5dbfde72b72e2b74c464b1add985d72750be3f4e16ae8ffb4747a40ff2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c88082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec6480c080a051b109080002dab4aae47139eb92ddea8951ef5ac6dfc3d7fa07621047dbc680a0334aa47a2888a6cc52b8cf3c3635192b66c692416e954822c1c93c3896ff1ead","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec6480c080a009e179e3bad2da6fb5e205e52fd8d1c462007162aabde5a4d6b052dd4fc4f23ca063922c31438835adf2e4424e2e7d5d2702ec65de2e24a72b491ff0004a53865d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec6480c080a051b109080002dab4aae47139eb92ddea8951ef5ac6dfc3d7fa07621047dbc680a0334aa47a2888a6cc52b8cf3c3635192b66c692416e954822c1c93c3896ff1ead","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec6480c080a009e179e3bad2da6fb5e205e52fd8d1c462007162aabde5a4d6b052dd4fc4f23ca063922c31438835adf2e4424e2e7d5d2702ec65de2e24a72b491ff0004a53865d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a8082ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d3bfebc6597304c6a06491f68d2ac149fc233d28e81af48dd5b1f83e6ff951d2a06668da06d86aba341971dabb58016ca7764cd4b4c1634e3f829dcc8ef8bca4f6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a8082ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c882ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0d45b9fd9a2a3fdf79805cf73b70348037cc69927209a5e3728fe62cbe9543f03a02f5f8477666487ee5148a65ce59f400beac7c208369162b2d555411314d358fb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c882ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c001a02a6a910f7b5f83fda937006021b9c074f4544d5bb37b9b5a1b7045095f461836a038572b25418528bce7e6a3a480cf9fc90a33d9c63b392c2dbc8faf72a1e4ab8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c080a07a6dd661b5da27c809cce22aa186c158fe3b07a484a9395fd9a7a31a2b90636fa02b86f82b661264e27c3fda085b59740d3059335bff91693291afcf93c7ca627c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c001a02a6a910f7b5f83fda937006021b9c074f4544d5bb37b9b5a1b7045095f461836a038572b25418528bce7e6a3a480cf9fc90a33d9c63b392c2dbc8faf72a1e4ab8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c080a07a6dd661b5da27c809cce22aa186c158fe3b07a484a9395fd9a7a31a2b90636fa02b86f82b661264e27c3fda085b59740d3059335bff91693291afcf93c7ca627c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a8082ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a08c13c10490bc20cb1e55dc54ececb37a6c9cc8d013dbe513feacbb0416f09feba045c4e038759a0901820091e043db326b1bf9a8a1cd046ac72629969497c6a86f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b904edf8eb9b6beb9cde9e1fae538e12f8d40e9124ace0cba2eee8cbbe77aa10a0788a0bd9a6fb98e7230f5db89be2f5067d1a227ba277b9cb155fb5859c57aae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec6480c080a08d10a7a81c561391fe88bcb2c1dfbf4f7140fb7884fec0558606e76ffc4eaa91a049fa2a95e0f07a4376df9c6f2e1563ad443ce8369d44c6e1ce8ee521805b3623","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c001a00de6dc2841a25e5ea2dc1e054d69638ec519a9953666930060797cd110cde122a07fd1dcb6319eca7c681cef006efb3f7dcd74ff98a79ce05917d5d1fa7a175b6f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec6480c080a08d10a7a81c561391fe88bcb2c1dfbf4f7140fb7884fec0558606e76ffc4eaa91a049fa2a95e0f07a4376df9c6f2e1563ad443ce8369d44c6e1ce8ee521805b3623","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c001a00de6dc2841a25e5ea2dc1e054d69638ec519a9953666930060797cd110cde122a07fd1dcb6319eca7c681cef006efb3f7dcd74ff98a79ce05917d5d1fa7a175b6f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a80808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a04c43dab94dd746973a1f7f051cc520cc01e93e9c6c55147cef34e5fdc0b182a2a06d148cc6ec017f9aeb6442a17d72e388ffc835950e19abd0c06057520f893542","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a80808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c8808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a025b50c1db31c0ae7aaa73374659201b54b71488efecbb6985dc50015abde7e36a04dd8cf68920de7232ab8d1fb28ab94ac05466c1f9d9a3a658f2054fce7868e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c8808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c080a0415ad0a93225eaec617206ec835e362d5e75fd0e1903747c1806270ec2684c7da0487ec1479cdb2affa891ff56413818ec169651c906ab932594b6e5bbb79d4998","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0a46ac278c400ef099ad23ac4ccb066a37db8bb5c4d65e0a347152a499ae9eb92a07505f9c67f0897cbe6f848c9a2164c3c234dab2fea7a4dd6f4436be34080e2ff","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c080a0415ad0a93225eaec617206ec835e362d5e75fd0e1903747c1806270ec2684c7da0487ec1479cdb2affa891ff56413818ec169651c906ab932594b6e5bbb79d4998","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0a46ac278c400ef099ad23ac4ccb066a37db8bb5c4d65e0a347152a499ae9eb92a07505f9c67f0897cbe6f848c9a2164c3c234dab2fea7a4dd6f4436be34080e2ff","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a808082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a43aba5078d2da3ecc1ec0c67191f8cf58f29f5b4db7f8d4765ea691ddbd4195a0110e568c803db5ea587b406f452cf49ddf6b6f24d41207973d6c785ffaed1454","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a808082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a00caeadf2fcba95f0deab5ee4899348ecac4a18eeb09317d6f8156b891626d219a0549c5376aba320889c2f7b61fd4a51aec5f9a1d9ed9b26cef0a3bee52fac4989","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c001a07b5568d8a3ec3c7e126f570955db304e31d3f3d7b0c4fd103b6d064a2f6f5e23a030a1b17f299352ae193b8dbce2adda473ccb04e00670f416877762971697606f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c080a07bb69d01062f9d6ecb011ad344bbe08d4eca2f6b192dde45015def4c2e6096e0a03a3df52d753e3293d2fd544f72e62ceae00ea6dcab7229685d7b1873d873d203","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c001a07b5568d8a3ec3c7e126f570955db304e31d3f3d7b0c4fd103b6d064a2f6f5e23a030a1b17f299352ae193b8dbce2adda473ccb04e00670f416877762971697606f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c080a07bb69d01062f9d6ecb011ad344bbe08d4eca2f6b192dde45015def4c2e6096e0a03a3df52d753e3293d2fd544f72e62ceae00ea6dcab7229685d7b1873d873d203","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a8082ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0621255015626b35acf19629ce318999336441537920f9f3ff1bfd44e54d8abd3a03b3426f8fa963debdfa6b44561772bdebc9524c7f63abd0d947b678f5e966502","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b73c3ba53fc5a0f7fab636cc2b826c3873cda5d0be9dd2100fdceae7899f3310a0491905f676063924cf847fdf2e488be4606ce351748e5c88d49ed50c8d595c94","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0e60702e3f5c5f56e3d1bc2907015ec889d0557ea14e81f137056471fef0fdb9da066e601e6e55c2e37e2042401b352e81841d492d0fe4f05bfe81bba29c9e6ce1f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a085a947fb201d0b50272e7bb7a056adc9ee6f5904634ed91dbde0d650641b7de3a03635c731769302e955d41f794a63262d5d4d37d117c9db89a6b6bce927b71f42","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0e60702e3f5c5f56e3d1bc2907015ec889d0557ea14e81f137056471fef0fdb9da066e601e6e55c2e37e2042401b352e81841d492d0fe4f05bfe81bba29c9e6ce1f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a085a947fb201d0b50272e7bb7a056adc9ee6f5904634ed91dbde0d650641b7de3a03635c731769302e955d41f794a63262d5d4d37d117c9db89a6b6bce927b71f42","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88c82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d67e28d31489af5129c4832af814a01e0baa5e5ba6245fe2d3304693ceea48e0a03bc06f1c6dd01a14826c67aa35258c0bbf7c516a9bb21e9190eaa8d3768f49bb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84982013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88d82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a5368984aca4bc1e3d7ebc7ae4ead5e09ffd3b4b4712d039c19fdac948e5952ea065953ace0a29210440d6a0f05d6b43f482950b463b3be6b23fc63452c94b9446","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84a82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86a82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a086da25ab078729b08cf48da02eb1c1e05fe0f4e5d7b332262b68f4db3dc9b72fa04102c03c7d9f11a6fdb77d6a36d3f07e09b1ceaab0bf4ef1fdc604bcd726f83b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e782013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86b82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0cde92f395919b3205b4260867b11597f9ecf363bc1be9bbd8b5400d3381d64b3a01b9555cfa22ee8615c3033235ebad605d0bef616d08876de26719866fcc4d41e","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e882013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86a82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a086da25ab078729b08cf48da02eb1c1e05fe0f4e5d7b332262b68f4db3dc9b72fa04102c03c7d9f11a6fdb77d6a36d3f07e09b1ceaab0bf4ef1fdc604bcd726f83b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e782013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86b82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0cde92f395919b3205b4260867b11597f9ecf363bc1be9bbd8b5400d3381d64b3a01b9555cfa22ee8615c3033235ebad605d0bef616d08876de26719866fcc4d41e","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e882013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f88e82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03dd64e48a1ae228665b3f180367997ee96bc60ee226615c900e3d86634044328a00f6cdb24633e75fa65f6b93fce9b084c1f30dd03dde97d01f25c6f10f34d5d9d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84b82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88f82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07475efeb8dd5bf4ba7efb31ab67a9077401ed71f4e8dd13e7058ce5cfeb5a0f2a01046e93a5258bf320bc392173a49b6fef15976be4c1210f2e367af223ad8c026","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84c82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0ca84441c7ba097a7afa5ef9ad7ef70ba58ddfffc06c5d015b5c8553f1632d103a057fee6d92055c9c031a1efa667f3ee554804c4f34a195b6dfc781e1592c20444","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a04055dfcd6e0b7264d3474ba13f76659384e5f365ebc6ba271641481b12bf410ca01ef7d04dc33fdf0c3137e31d8c822ad68bbd4f89ada52db9705bb66813d11583","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0ca84441c7ba097a7afa5ef9ad7ef70ba58ddfffc06c5d015b5c8553f1632d103a057fee6d92055c9c031a1efa667f3ee554804c4f34a195b6dfc781e1592c20444","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a04055dfcd6e0b7264d3474ba13f76659384e5f365ebc6ba271641481b12bf410ca01ef7d04dc33fdf0c3137e31d8c822ad68bbd4f89ada52db9705bb66813d11583","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02080212bb64a798e1e138e4991ab830cf04d37ffeedf6fde7eba0eb7d972b350a02aff43f9e5ca8d6cea6e918391188fa37bdb91b864eadec705f7c69c4a61bc5a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0e41c052d72950a563b8ed7fb15855beabea43ff5b038bd6a3ccc6416e3498619a0568bbd7cbff31a47e1d0b9712f382c52e74b7b28cbcb8458974d82a8d54ddc57","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a057c342304f133ff8832d3d16a43571afe905dc9b10afc24c6e99225cca6d8817a00e2155d1904751ce0d2ba01e6475aeae254c02966773f5bc7650e37252a01a92","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0fc2a550a7798085cae28028abbe4829be29e5f3a40af221086831d0e17ca3c83a01ce21f5934b9ca566958e09e89c99fd9ed2dc4acae209a6fb81fd3a6c9879a99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a057c342304f133ff8832d3d16a43571afe905dc9b10afc24c6e99225cca6d8817a00e2155d1904751ce0d2ba01e6475aeae254c02966773f5bc7650e37252a01a92","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0fc2a550a7798085cae28028abbe4829be29e5f3a40af221086831d0e17ca3c83a01ce21f5934b9ca566958e09e89c99fd9ed2dc4acae209a6fb81fd3a6c9879a99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0fa33b63666310ca1c72fc5d82639c5b8e2a7638910be7bee23ada9f139c6b891a02012cad8e991beea7dcf0b6e9346b0228699698e183e2fadfc5b9b880601af9b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0bc6ae4e92e7a20d5ff61258653dffda636cee0fd97dd156eac7a1f231f1f2785a0323055e0e0bed496b3fec30be292338d0956ecf8baeeb34458230821589aa7fb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0bd2889395392859a83a33bfe549c09d172e1f289de29d4bc9d0a3d25ea8aa71ba075fe92140a08d8e680061852438623c9cd10e211955577d1a3b56e49e960e4e7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a05553c929ae32692a9f742371ffcfc8c8d2b77f31a7795460297cb78c29e357e8a043e42ca4ed7eb1b8e3546de2364522735d79a2e2ff5d16f7f96d165c5815c80c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0bd2889395392859a83a33bfe549c09d172e1f289de29d4bc9d0a3d25ea8aa71ba075fe92140a08d8e680061852438623c9cd10e211955577d1a3b56e49e960e4e7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a05553c929ae32692a9f742371ffcfc8c8d2b77f31a7795460297cb78c29e357e8a043e42ca4ed7eb1b8e3546de2364522735d79a2e2ff5d16f7f96d165c5815c80c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a055f63a6bef8e23dc437ff4ac9349a59fcde2f72d1879de50b0d3686ff648749da04cf8034df06cf6f15f31bb55979b40eeacbd28fb1d745e608acdc088e22beb66","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c4a0253448dad999692c1bf3cfb5de9e95a2e96da4e1f64133ada452a825fe9aa0757b576ceb7a2c494819960ac59e9d3a4e3da384f23c0e88ada758dc265eae94","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a02632c4d8a443afb8d39f91d036fd4915ca3ad2f253b8f93211b4b3ee15566519a009bdc00c8eaaf22f3d7d04b53dbc777fd027a780fb4ddaf01002724ddf2879dd","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a08bda02c15ca37d35d9ad2e2f7731d24dd039f5c6c6f7eaad739daadac6db33e5a044c01e493e10929e4021c69d9df886b211eb349a865df9f0796846ad1cdf23e8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a02632c4d8a443afb8d39f91d036fd4915ca3ad2f253b8f93211b4b3ee15566519a009bdc00c8eaaf22f3d7d04b53dbc777fd027a780fb4ddaf01002724ddf2879dd","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a08bda02c15ca37d35d9ad2e2f7731d24dd039f5c6c6f7eaad739daadac6db33e5a044c01e493e10929e4021c69d9df886b211eb349a865df9f0796846ad1cdf23e8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0ed0db75f41b2b8b89768ce5ad08716aff149dc1d5a2e593140d8964eb2da3229a02e5248cca9b5af340d73271cad4d690f7efa11c9278824aca528eb15d28aec4d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a07108fbbabc45826dbdc8e4cf831240fb39ead7bd4b8ec5d8de64d04e2885e554a04dae4fb4bdbabb9d8f923d579e75ee980da1b4fac5773ec68f395af240f037f0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0130b6723050095faa2e7abc69c2f785e73d333c65fae6cf2835518f970c627d5a00b90bd4f2ded1da0163ab5e81ad76d51aef005d663137347fc550313e1c8b6fc","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0993a50431e82d10d632466d45f8aaffea9a56efa59d529dfd497d3c2a06aabeba0070d3132c6ce1e4ff70b0721d1f4c03ab566b8e2af29d33148033fb3009dc29d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0130b6723050095faa2e7abc69c2f785e73d333c65fae6cf2835518f970c627d5a00b90bd4f2ded1da0163ab5e81ad76d51aef005d663137347fc550313e1c8b6fc","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0993a50431e82d10d632466d45f8aaffea9a56efa59d529dfd497d3c2a06aabeba0070d3132c6ce1e4ff70b0721d1f4c03ab566b8e2af29d33148033fb3009dc29d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c9d3b0d7b58bfe81a6881b9db184e0ade03c1ad11aa8f1566e2f24f50f85525a06c10cf91f4dbc24d0f78ef09a8e2310d349a034cec7e86e807d7a48ea26161e1","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0f8423b51e513618c6a4bdd2696479d91c760e11ea24657dd27fa6eb9b7da8c0ea07e9456113fb034718d1b4f4e09ade1ce78251a8c86f298b152850bc5925156cb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0d09b373d45c1bfc1c5d9b5198e69f974d4df456245e2f7a5edd486f3dd2795a9a011396197a670e7b0c4613b7ebf8aee53382930c7bd25c35dda15acae78ec0e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0131f5af3ece9a0b723d0c812dbcfc6cb458acf5e0846cc506215fc04d6af66d5a078d0bf7a40cc1ddcebbc4e86fb9a04bfc94f3da94b4a74476883b7b1729f8a44","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0d09b373d45c1bfc1c5d9b5198e69f974d4df456245e2f7a5edd486f3dd2795a9a011396197a670e7b0c4613b7ebf8aee53382930c7bd25c35dda15acae78ec0e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0131f5af3ece9a0b723d0c812dbcfc6cb458acf5e0846cc506215fc04d6af66d5a078d0bf7a40cc1ddcebbc4e86fb9a04bfc94f3da94b4a74476883b7b1729f8a44","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c286f4ee350eab70273cf9a952537534446a0f39e9bfea7340eabc04396a0e3da01e1302ae987a69836ec2c9266e6fe623db5fcdc566e37084c0c57630c4de8ee6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09dee3fa88e365133a18035618af718a045e1a957f10f50c632f23923fd337b9ba06bbbd59489849803f8c61138932ac1a8361edb4c80789d030542829c0a2b5b7f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87082013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0c1cb1e2b41e48fecd59d72039147c76993653f061f9ea156b53c377673eef7f1a01822506f755206b60209a12ed3c84446f4fcb4ad602fa7ab7ee4ff2acde19ed6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ed82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87182013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a09817043ad22797d2f26ca46697db5f586c38336a171dce2d22d659889e9e9eb5a0369a5d6169586d9c831b6e017aa29fd49eac0636a136bfa5bafb95390fa95b8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ee82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87082013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0c1cb1e2b41e48fecd59d72039147c76993653f061f9ea156b53c377673eef7f1a01822506f755206b60209a12ed3c84446f4fcb4ad602fa7ab7ee4ff2acde19ed6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ed82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87182013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a09817043ad22797d2f26ca46697db5f586c38336a171dce2d22d659889e9e9eb5a0369a5d6169586d9c831b6e017aa29fd49eac0636a136bfa5bafb95390fa95b8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ee82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89482013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a039357ad40087d17551ca2b94723f0394185a993671db02172a7de70c24054852a046c84070dfadd244b358690e5b89c75f3988b21b6614e6e3af2f8ca302d6c42a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85182013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89582013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c991c81705a4c53a9255e72beb8243638c68f10c63b082755972bbbe15245d12a014f6852ae34c92882559e6810d4372109930a23b522368fdef2c85ce04e27839","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85282013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"}]` + + testcases := []struct { + Input EthBytes `json:"input"` + Output string `json:"output"` + NosigTx string `json:"nosigTx"` + }{} + + err := json.Unmarshal([]byte(tcstr), &testcases) + if err != nil { + return nil, err + } + + res := []TxTestcase{} + for _, tc := range testcases { + tx := EthTxArgs{} + err := json.Unmarshal([]byte(tc.Output), &tx) + if err != nil { + return nil, err + } + res = append(res, TxTestcase{ + Input: tc.Input, + Output: tx, + TxJSON: tc.Output, + NosigTx: tc.NosigTx, + }) + } + + return res, err +} diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 254d1274d85..0e75ea64316 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -36,6 +36,7 @@ import ( lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal/alerting" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" diff --git a/api/rlp.go b/api/rlp.go new file mode 100644 index 00000000000..3de418c3104 --- /dev/null +++ b/api/rlp.go @@ -0,0 +1,176 @@ +package api + +import ( + "bytes" + "encoding/binary" + "fmt" + + "golang.org/x/xerrors" +) + +func EncodeRLP(val interface{}) ([]byte, error) { + return encodeRLP(val) +} + +func encodeRLPListItems(list []interface{}) (result []byte, err error) { + res := []byte{} + for _, elem := range list { + encoded, err := encodeRLP(elem) + if err != nil { + return nil, err + } + res = append(res, encoded...) + } + return res, nil +} + +func encodeLength(length int) (lenInBytes []byte, err error) { + if length == 0 { + return nil, fmt.Errorf("cannot encode length: length should be larger than 0") + } + + buf := new(bytes.Buffer) + err = binary.Write(buf, binary.BigEndian, int64(length)) + if err != nil { + return nil, err + } + + firstNonZeroIndex := len(buf.Bytes()) - 1 + for i, b := range buf.Bytes() { + if b != 0 { + firstNonZeroIndex = i + break + } + } + + res := buf.Bytes()[firstNonZeroIndex:] + return res, nil +} + +func encodeRLP(val interface{}) ([]byte, error) { + if data, ok := val.([]byte); ok { + if len(data) == 1 && data[0] <= 0x7f { + return data, nil + } else if len(data) <= 55 { + prefix := byte(0x80 + len(data)) + return append([]byte{prefix}, data...), nil + } else { + lenInBytes, err := encodeLength(len(data)) + if err != nil { + return nil, err + } + prefix := byte(0xb7 + len(lenInBytes)) + return append( + []byte{prefix}, + append(lenInBytes, data...)..., + ), nil + } + } else if data, ok := val.([]interface{}); ok { + encodedList, err := encodeRLPListItems(data) + if err != nil { + return nil, err + } + if len(encodedList) <= 55 { + prefix := byte(0xc0 + len(encodedList)) + return append( + []byte{prefix}, + encodedList..., + ), nil + } + lenInBytes, err := encodeLength(len(encodedList)) + if err != nil { + return nil, err + } + prefix := byte(0xf7 + len(lenInBytes)) + return append( + []byte{prefix}, + append(lenInBytes, encodedList...)..., + ), nil + } + return nil, fmt.Errorf("input data should either be a list or a byte array") +} + +func DecodeRLP(data []byte) (interface{}, error) { + res, consumed, err := decodeRLP(data) + if err != nil { + return nil, err + } + if consumed != len(data) { + return nil, xerrors.Errorf("invalid rlp data: length %d, consumed %d", len(data), consumed) + } + return res, nil +} + +func decodeRLP(data []byte) (res interface{}, consumed int, err error) { + if len(data) == 0 { + return data, 0, xerrors.Errorf("invalid rlp data: data cannot be empty") + } + if data[0] >= 0xf8 { + listLenInBytes := int(data[0]) - 0xf7 + listLen, err := decodeLength(data[1:], listLenInBytes) + if err != nil { + return nil, 0, err + } + if 1+listLenInBytes+listLen > len(data) { + return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list") + } + result, err := decodeListElems(data[1+listLenInBytes:], listLen) + return result, 1 + listLenInBytes + listLen, err + } else if data[0] >= 0xc0 { + length := int(data[0]) - 0xc0 + result, err := decodeListElems(data[1:], length) + return result, 1 + length, err + } else if data[0] >= 0xb8 { + strLenInBytes := int(data[0]) - 0xb7 + strLen, err := decodeLength(data[1:], strLenInBytes) + if err != nil { + return nil, 0, err + } + totalLen := 1 + strLenInBytes + strLen + if totalLen > len(data) { + return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing string") + } + return data[1+strLenInBytes : totalLen], totalLen, nil + } else if data[0] >= 0x80 { + length := int(data[0]) - 0x80 + if 1+length > len(data) { + return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing string") + } + return data[1 : 1+length], 1 + length, nil + } + return []byte{data[0]}, 1, nil +} + +func decodeLength(data []byte, lenInBytes int) (length int, err error) { + if lenInBytes > len(data) || lenInBytes > 8 { + return 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list length") + } + var decodedLength int64 + r := bytes.NewReader(append(make([]byte, 8-lenInBytes), data[:lenInBytes]...)) + if err := binary.Read(r, binary.BigEndian, &decodedLength); err != nil { + return 0, xerrors.Errorf("invalid rlp data: cannot parse string length: %w", err) + } + if lenInBytes+int(decodedLength) > len(data) { + return 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list") + } + return int(decodedLength), nil +} + +func decodeListElems(data []byte, length int) (res []interface{}, err error) { + totalConsumed := 0 + result := []interface{}{} + + // set a limit to make sure it doesn't loop infinitely + for i := 0; totalConsumed < length && i < 5000; i++ { + elem, consumed, err := decodeRLP(data[totalConsumed:]) + if err != nil { + return nil, xerrors.Errorf("invalid rlp data: cannot decode list element: %w", err) + } + totalConsumed += consumed + result = append(result, elem) + } + if totalConsumed != length { + return nil, xerrors.Errorf("invalid rlp data: incorrect list length") + } + return result, nil +} diff --git a/api/rlp_test.go b/api/rlp_test.go new file mode 100644 index 00000000000..a2422564b26 --- /dev/null +++ b/api/rlp_test.go @@ -0,0 +1,175 @@ +package api + +import ( + "encoding/hex" + "fmt" + "strings" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestEncode(t *testing.T) { + testcases := []TestCase{ + {[]byte(""), mustDecodeHex("0x80")}, + {mustDecodeHex("0x01"), mustDecodeHex("0x01")}, + {mustDecodeHex("0xaa"), mustDecodeHex("0x81aa")}, + {mustDecodeHex("0x0402"), mustDecodeHex("0x820402")}, + { + []interface{}{}, + mustDecodeHex("0xc0"), + }, + { + mustDecodeHex("0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), + mustDecodeHex("0xb83cabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), + }, + { + mustDecodeHex("0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), + mustDecodeHex("0xb8aaabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), + }, + { + []interface{}{ + mustDecodeHex("0xaaaa"), + mustDecodeHex("0xbbbb"), + mustDecodeHex("0xcccc"), + mustDecodeHex("0xdddd"), + }, + mustDecodeHex("0xcc82aaaa82bbbb82cccc82dddd"), + }, + { + []interface{}{ + mustDecodeHex("0xaaaaaaaaaaaaaaaaaaaa"), + mustDecodeHex("0xbbbbbbbbbbbbbbbbbbbb"), + []interface{}{ + mustDecodeHex("0xc1c1c1c1c1c1c1c1c1c1"), + mustDecodeHex("0xc2c2c2c2c2c2c2c2c2c2"), + mustDecodeHex("0xc3c3c3c3c3c3c3c3c3c3"), + }, + mustDecodeHex("0xdddddddddddddddddddd"), + mustDecodeHex("0xeeeeeeeeeeeeeeeeeeee"), + mustDecodeHex("0xffffffffffffffffffff"), + }, + mustDecodeHex("0xf8598aaaaaaaaaaaaaaaaaaaaa8abbbbbbbbbbbbbbbbbbbbe18ac1c1c1c1c1c1c1c1c1c18ac2c2c2c2c2c2c2c2c2c28ac3c3c3c3c3c3c3c3c3c38adddddddddddddddddddd8aeeeeeeeeeeeeeeeeeeee8affffffffffffffffffff"), + }, + } + + for _, tc := range testcases { + result, err := EncodeRLP(tc.Input) + require.Nil(t, err) + + require.Equal(t, tc.Output.([]byte), result) + } +} + +func TestDecodeString(t *testing.T) { + testcases := []TestCase{ + {"0x00", "0x00"}, + {"0x80", "0x"}, + {"0x0f", "0x0f"}, + {"0x81aa", "0xaa"}, + {"0x820400", "0x0400"}, + {"0xb83cabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", + "0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, + } + + for _, tc := range testcases { + input, err := hex.DecodeString(strings.Replace(tc.Input.(string), "0x", "", -1)) + require.Nil(t, err) + + output, err := hex.DecodeString(strings.Replace(tc.Output.(string), "0x", "", -1)) + require.Nil(t, err) + + result, err := DecodeRLP(input) + require.Nil(t, err) + require.Equal(t, output, result.([]byte)) + } +} + +func mustDecodeHex(s string) []byte { + d, err := hex.DecodeString(strings.Replace(s, "0x", "", -1)) + if err != nil { + panic(fmt.Errorf("err must be nil: %w", err)) + } + return d +} + +func TestDecodeList(t *testing.T) { + testcases := []TestCase{ + {"0xc0", []interface{}{}}, + {"0xc100", []interface{}{[]byte{0}}}, + {"0xc3000102", []interface{}{[]byte{0}, []byte{1}, []byte{2}}}, + {"0xc4000181aa", []interface{}{[]byte{0}, []byte{1}, []byte{0xaa}}}, + {"0xc6000181aa81ff", []interface{}{[]byte{0}, []byte{1}, []byte{0xaa}, []byte{0xff}}}, + {"0xf8428aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd", + []interface{}{ + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + mustDecodeHex("0xabcdabcdabcdabcdabcd"), + }, + }, + {"0xf1030185012a05f2008504a817c800825208942b87d1cb599bc2a606db9a0169fcec96af04ad3a880de0b6b3a764000080c0", + []interface{}{ + []byte{3}, + []byte{1}, + mustDecodeHex("0x012a05f200"), + mustDecodeHex("0x04a817c800"), + mustDecodeHex("0x5208"), + mustDecodeHex("0x2b87d1CB599Bc2a606Db9A0169fcEc96Af04ad3a"), + mustDecodeHex("0x0de0b6b3a7640000"), + []byte{}, + []interface{}{}, + }}, + } + + for _, tc := range testcases { + input, err := hex.DecodeString(strings.Replace(tc.Input.(string), "0x", "", -1)) + require.Nil(t, err) + + result, err := DecodeRLP(input) + require.Nil(t, err) + + fmt.Println(result) + r := result.([]interface{}) + require.Equal(t, len(tc.Output.([]interface{})), len(r)) + + for i, v := range r { + require.Equal(t, tc.Output.([]interface{})[i], v) + } + } +} + +func TestDecodeEncodeTx(t *testing.T) { + testcases := [][]byte{ + mustDecodeHex("0xdc82013a0185012a05f2008504a817c8008080872386f26fc1000000c0"), + mustDecodeHex("0xf85f82013a0185012a05f2008504a817c8008080872386f26fc1000000c001a027fa36fb9623e4d71fcdd7f7dce71eb814c9560dcf3908c1719386e2efd122fba05fb4e4227174eeb0ba84747a4fb883c8d4e0fdb129c4b1f42e90282c41480234"), + mustDecodeHex("0xf9061c82013a0185012a05f2008504a817c8008080872386f26fc10000b905bb608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610556806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637bd703e81461004657806390b98a1114610076578063f8b2cb4f146100a6575b600080fd5b610060600480360381019061005b919061030a565b6100d6565b60405161006d9190610350565b60405180910390f35b610090600480360381019061008b9190610397565b6100f4565b60405161009d91906103f2565b60405180910390f35b6100c060048036038101906100bb919061030a565b61025f565b6040516100cd9190610350565b60405180910390f35b600060026100e38361025f565b6100ed919061043c565b9050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156101455760009050610259565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101939190610496565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101e891906104ca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161024c9190610350565b60405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d7826102ac565b9050919050565b6102e7816102cc565b81146102f257600080fd5b50565b600081359050610304816102de565b92915050565b6000602082840312156103205761031f6102a7565b5b600061032e848285016102f5565b91505092915050565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b61037481610337565b811461037f57600080fd5b50565b6000813590506103918161036b565b92915050565b600080604083850312156103ae576103ad6102a7565b5b60006103bc858286016102f5565b92505060206103cd85828601610382565b9150509250929050565b60008115159050919050565b6103ec816103d7565b82525050565b600060208201905061040760008301846103e3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061044782610337565b915061045283610337565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561048b5761048a61040d565b5b828202905092915050565b60006104a182610337565b91506104ac83610337565b9250828210156104bf576104be61040d565b5b828203905092915050565b60006104d582610337565b91506104e083610337565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156105155761051461040d565b5b82820190509291505056fea26469706673582212208e5b4b874c839967f88008ed2fa42d6c2d9c9b0ae05d1d2c61faa7d229c134e664736f6c634300080d0033c080a0c4e9477f57c6848b2f1ea73a14809c1f44529d20763c947f3ac8ffd3d1629d93a011485a215457579bb13ac7b53bb9d6804763ae6fe5ce8ddd41642cea55c9a09a"), + mustDecodeHex("0xf9063082013a0185012a05f2008504a817c8008094025b594a4f1c4888cafcfaf2bb24ed95507749e0872386f26fc10000b905bb608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610556806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637bd703e81461004657806390b98a1114610076578063f8b2cb4f146100a6575b600080fd5b610060600480360381019061005b919061030a565b6100d6565b60405161006d9190610350565b60405180910390f35b610090600480360381019061008b9190610397565b6100f4565b60405161009d91906103f2565b60405180910390f35b6100c060048036038101906100bb919061030a565b61025f565b6040516100cd9190610350565b60405180910390f35b600060026100e38361025f565b6100ed919061043c565b9050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156101455760009050610259565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101939190610496565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101e891906104ca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161024c9190610350565b60405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d7826102ac565b9050919050565b6102e7816102cc565b81146102f257600080fd5b50565b600081359050610304816102de565b92915050565b6000602082840312156103205761031f6102a7565b5b600061032e848285016102f5565b91505092915050565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b61037481610337565b811461037f57600080fd5b50565b6000813590506103918161036b565b92915050565b600080604083850312156103ae576103ad6102a7565b5b60006103bc858286016102f5565b92505060206103cd85828601610382565b9150509250929050565b60008115159050919050565b6103ec816103d7565b82525050565b600060208201905061040760008301846103e3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061044782610337565b915061045283610337565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561048b5761048a61040d565b5b828202905092915050565b60006104a182610337565b91506104ac83610337565b9250828210156104bf576104be61040d565b5b828203905092915050565b60006104d582610337565b91506104e083610337565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156105155761051461040d565b5b82820190509291505056fea26469706673582212208e5b4b874c839967f88008ed2fa42d6c2d9c9b0ae05d1d2c61faa7d229c134e664736f6c634300080d0033c080a0fe38720928596f9e9dfbf891d00311638efce3713f03cdd67b212ecbbcf18f29a05993e656c0b35b8a580da6aff7c89b3d3e8b1c6f83a7ce09473c0699a8500b9c"), + } + + for _, tc := range testcases { + decoded, err := DecodeRLP(tc) + require.Nil(t, err) + + encoded, err := EncodeRLP(decoded) + require.Nil(t, err) + require.Equal(t, tc, encoded) + } +} + +func TestDecodeError(t *testing.T) { + testcases := [][]byte{ + mustDecodeHex("0xdc82013a0185012a05f2008504a817c8008080872386f26fc1000000"), + mustDecodeHex("0xdc013a01012a05f2008504a817c8008080872386f26fc1000000"), + mustDecodeHex("0xdc82013a0185012a05f28504a817c08080872386f26fc1000000"), + mustDecodeHex("0xdc82013a0185012a05f504a817c080872386ffc1000000"), + mustDecodeHex("0x013a018505f2008504a817c8008080872386f26fc1000000"), + } + + for _, tc := range testcases { + _, err := DecodeRLP(tc) + require.NotNil(t, err, hex.EncodeToString(tc)) + } +} diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 085980f79eb..30cdaabd9e8 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -3,6 +3,7 @@ package messagepool import ( "bytes" "context" + "encoding/hex" "errors" "fmt" "math" @@ -770,6 +771,16 @@ func sigCacheKey(m *types.SignedMessage) (string, error) { return string(hashCache[:]), nil case crypto.SigTypeSecp256k1: return string(m.Cid().Bytes()), nil + case crypto.SigTypeDelegated: + txArgs, err := api.NewEthTxArgsFromMessage(&m.Message) + if err != nil { + return "", err + } + msg, err := txArgs.HashedOriginalRlpMsg() + if err != nil { + return "", err + } + return hex.EncodeToString(msg), nil default: return "", xerrors.Errorf("unrecognized signature type: %d", m.Signature.Type) } @@ -787,7 +798,19 @@ func (mp *MessagePool) VerifyMsgSig(m *types.SignedMessage) error { return nil } - if err := sigs.Verify(&m.Signature, m.Message.From, m.Message.Cid().Bytes()); err != nil { + if m.Signature.Type == crypto.SigTypeDelegated { + txArgs, err := api.NewEthTxArgsFromMessage(&m.Message) + if err != nil { + return err + } + msg, err := txArgs.OriginalRlpMsg() + if err != nil { + return err + } + if err := sigs.Verify(&m.Signature, m.Message.From, msg); err != nil { + return err + } + } else if err := sigs.Verify(&m.Signature, m.Message.From, m.Message.Cid().Bytes()); err != nil { return err } diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index e84962869c4..bd504412863 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -97,7 +97,7 @@ func (sm *selectedMessages) tryToAdd(mc *msgChain) bool { sm.msgs = append(sm.msgs, mc.msgs...) sm.blsLimit -= l sm.gasLimit -= mc.gasLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 { + } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { if sm.secpLimit < l { return false } @@ -123,7 +123,7 @@ func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, base if mc.sigType == crypto.SigTypeBLS { smMsgLimit = sm.blsLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 { + } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { smMsgLimit = sm.secpLimit } else { return false @@ -174,7 +174,7 @@ func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, base if mc.sigType == crypto.SigTypeBLS { sm.blsLimit -= chainMsgLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 { + } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { sm.secpLimit -= chainMsgLimit } @@ -187,7 +187,7 @@ func (sm *selectedMessages) trimChain(mc *msgChain, mp *MessagePool, baseFee typ if msgLimit > sm.blsLimit { msgLimit = sm.blsLimit } - } else if mc.sigType == crypto.SigTypeSecp256k1 { + } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { if msgLimit > sm.secpLimit { msgLimit = sm.secpLimit } diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index a5b2f326602..c3a5c6d6f3a 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -31,6 +31,7 @@ import ( "github.com/filecoin-project/lotus/chain/types/mock" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/chain/sync.go b/chain/sync.go index 634313855d7..ba28d3e79a9 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -1145,7 +1145,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co } } for _, m := range bst.Secpk { - if m.Signature.Type != crypto.SigTypeSecp256k1 { + if m.Signature.Type != crypto.SigTypeSecp256k1 && m.Signature.Type != crypto.SigTypeDelegated { return xerrors.Errorf("unknown signature type on message %s: %q", m.Cid(), m.Signature.Type) } //log.Infof("putting secp256k1 message: %s", m.Cid()) diff --git a/chain/types/keystore.go b/chain/types/keystore.go index 107c1fbe3ab..8e8d9192bb2 100644 --- a/chain/types/keystore.go +++ b/chain/types/keystore.go @@ -39,6 +39,8 @@ func (kt *KeyType) UnmarshalJSON(bb []byte) error { *kt = KTBLS case crypto.SigTypeSecp256k1: *kt = KTSecp256k1 + case crypto.SigTypeDelegated: + *kt = KTDelegated default: return fmt.Errorf("unknown sigtype: %d", bst) } @@ -51,6 +53,7 @@ const ( KTBLS KeyType = "bls" KTSecp256k1 KeyType = "secp256k1" KTSecp256k1Ledger KeyType = "secp256k1-ledger" + KTDelegated KeyType = "delegated" ) // KeyInfo is used for storing keys in KeyStore diff --git a/chain/vectors/gen/main.go b/chain/vectors/gen/main.go index fbc96d2c388..ce9f1baf872 100644 --- a/chain/vectors/gen/main.go +++ b/chain/vectors/gen/main.go @@ -19,6 +19,7 @@ import ( "github.com/filecoin-project/lotus/chain/vectors" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index ca6e5571aa5..c9007d3f104 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -111,6 +111,7 @@ var Prices = map[abi.ChainEpoch]Pricelist{ verifySignature: map[crypto.SigType]int64{ crypto.SigTypeBLS: 16598605, crypto.SigTypeSecp256k1: 1637292, + crypto.SigTypeDelegated: 1637292, }, hashingBase: 31355, diff --git a/chain/wallet/key/key.go b/chain/wallet/key/key.go index 66053525b55..cb769ef09bc 100644 --- a/chain/wallet/key/key.go +++ b/chain/wallet/key/key.go @@ -45,7 +45,7 @@ func NewKey(keyinfo types.KeyInfo) (*Key, error) { } switch k.Type { - case types.KTSecp256k1: + case types.KTSecp256k1, types.KTDelegated: k.Address, err = address.NewSecp256k1Address(k.PublicKey) if err != nil { return nil, xerrors.Errorf("converting Secp256k1 to address: %w", err) @@ -68,6 +68,8 @@ func ActSigType(typ types.KeyType) crypto.SigType { return crypto.SigTypeBLS case types.KTSecp256k1: return crypto.SigTypeSecp256k1 + case types.KTDelegated: + return crypto.SigTypeDelegated default: return crypto.SigTypeUnknown } diff --git a/chain/wallet/wallet.go b/chain/wallet/wallet.go index b88d776b503..32a94d3b28d 100644 --- a/chain/wallet/wallet.go +++ b/chain/wallet/wallet.go @@ -16,7 +16,8 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet/key" "github.com/filecoin-project/lotus/lib/sigs" - _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures + _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" // enable secp signatures ) diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 12a73814c0f..298b3cd3a21 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -42,6 +42,7 @@ import ( "github.com/filecoin-project/lotus/chain/vm" lcli "github.com/filecoin-project/lotus/cli" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" diff --git a/cmd/lotus-keygen/main.go b/cmd/lotus-keygen/main.go index 1970d5074ba..41993a16990 100644 --- a/cmd/lotus-keygen/main.go +++ b/cmd/lotus-keygen/main.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go index 373964dc6c9..38f5ee6fefe 100644 --- a/cmd/lotus-shed/keyinfo.go +++ b/cmd/lotus-shed/keyinfo.go @@ -23,6 +23,7 @@ import ( "github.com/filecoin-project/lotus/chain/wallet" "github.com/filecoin-project/lotus/chain/wallet/key" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/lp2p" diff --git a/conformance/driver.go b/conformance/driver.go index d158187dc88..e26651e206e 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -26,7 +26,8 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/conformance/chaos" - _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures + _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" // enable secp signatures "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" ) diff --git a/gateway/node.go b/gateway/node.go index 7e84092e316..13ac57c82f7 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -25,6 +25,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/sigs" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" diff --git a/lib/sigs/delegated/init.go b/lib/sigs/delegated/init.go new file mode 100644 index 00000000000..de39c5b0cf9 --- /dev/null +++ b/lib/sigs/delegated/init.go @@ -0,0 +1,57 @@ +package delegated + +import ( + "fmt" + + "golang.org/x/crypto/sha3" + + "github.com/filecoin-project/go-address" + gocrypto "github.com/filecoin-project/go-crypto" + crypto1 "github.com/filecoin-project/go-state-types/crypto" + + "github.com/filecoin-project/lotus/lib/sigs" +) + +type delegatedSigner struct{} + +func (delegatedSigner) GenPrivate() ([]byte, error) { + priv, err := gocrypto.GenerateKey() + if err != nil { + return nil, err + } + return priv, nil +} + +func (delegatedSigner) ToPublic(pk []byte) ([]byte, error) { + return gocrypto.PublicKey(pk), nil +} + +func (delegatedSigner) Sign(pk []byte, msg []byte) ([]byte, error) { + return nil, fmt.Errorf("not implemented") +} + +func (delegatedSigner) Verify(sig []byte, a address.Address, msg []byte) error { + hasher := sha3.NewLegacyKeccak256() + hasher.Write(msg) + hash := hasher.Sum(nil) + + pubk, err := gocrypto.EcRecover(hash, sig) + if err != nil { + return err + } + + maybeaddr, err := address.NewSecp256k1Address(pubk) + if err != nil { + return err + } + + if maybeaddr != a { + return fmt.Errorf("signature did not match") + } + + return nil +} + +func init() { + sigs.RegisterSignature(crypto1.SigTypeDelegated, delegatedSigner{}) +} diff --git a/lib/sigs/secp/init.go b/lib/sigs/secp/init.go index 05238fdcd00..395e3a28f24 100644 --- a/lib/sigs/secp/init.go +++ b/lib/sigs/secp/init.go @@ -6,7 +6,7 @@ import ( "github.com/minio/blake2b-simd" "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-crypto" + gocrypto "github.com/filecoin-project/go-crypto" crypto2 "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/lib/sigs" @@ -15,7 +15,7 @@ import ( type secpSigner struct{} func (secpSigner) GenPrivate() ([]byte, error) { - priv, err := crypto.GenerateKey() + priv, err := gocrypto.GenerateKey() if err != nil { return nil, err } @@ -23,12 +23,12 @@ func (secpSigner) GenPrivate() ([]byte, error) { } func (secpSigner) ToPublic(pk []byte) ([]byte, error) { - return crypto.PublicKey(pk), nil + return gocrypto.PublicKey(pk), nil } func (secpSigner) Sign(pk []byte, msg []byte) ([]byte, error) { b2sum := blake2b.Sum256(msg) - sig, err := crypto.Sign(pk, b2sum[:]) + sig, err := gocrypto.Sign(pk, b2sum[:]) if err != nil { return nil, err } @@ -38,7 +38,7 @@ func (secpSigner) Sign(pk []byte, msg []byte) ([]byte, error) { func (secpSigner) Verify(sig []byte, a address.Address, msg []byte) error { b2sum := blake2b.Sum256(msg) - pubk, err := crypto.EcRecover(b2sum[:], sig) + pubk, err := gocrypto.EcRecover(b2sum[:], sig) if err != nil { return err } diff --git a/node/builder.go b/node/builder.go index 9690b7f7ce7..2c08cd9169b 100644 --- a/node/builder.go +++ b/node/builder.go @@ -30,6 +30,7 @@ import ( "github.com/filecoin-project/lotus/lib/lotuslog" "github.com/filecoin-project/lotus/lib/peermgr" _ "github.com/filecoin-project/lotus/lib/sigs/bls" + _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/node/config" From 653af0123525f76036c00d6e81723c9d8d757327 Mon Sep 17 00:00:00 2001 From: raulk Date: Thu, 29 Sep 2022 23:55:13 +0100 Subject: [PATCH 007/282] Eth JSON-RPC API: implement eth_getCode and eth_getStorageAt (#9397) --- api/api_full.go | 16 ++++++++-------- api/docgen/docgen.go | 2 +- api/eth_transactions.go | 18 +++++++++--------- api/v0api/full.go | 16 ++++++++-------- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index 155601fc800..f9f1ac9a722 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -149,7 +149,7 @@ type FullNode interface { // ChainGetPath returns a set of revert/apply operations needed to get from // one tipset to another, for example: - //``` + // ``` // to // ^ // from tAA @@ -158,7 +158,7 @@ type FullNode interface { // ^---*--^ // ^ // tRR - //``` + // ``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*HeadChange, error) //perm:read @@ -386,12 +386,12 @@ type FullNode interface { ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write // ClientUnimport removes references to the specified file from filestore - //ClientUnimport(path string) + // ClientUnimport(path string) // ClientListImports lists imported files and their root CIDs ClientListImports(ctx context.Context) ([]Import, error) //perm:write - //ClientListAsks() []Ask + // ClientListAsks() []Ask // MethodGroup: State // The State methods are used to query, inspect, and interact with chain state. @@ -627,14 +627,14 @@ type FullNode interface { // It takes the following params: , , MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read - //MsigGetPending returns pending transactions for the given multisig - //wallet. Once pending transactions are fully approved, they will no longer - //appear here. + // MsigGetPending returns pending transactions for the given multisig + // wallet. Once pending transactions are fully approved, they will no longer + // appear here. MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) //perm:read // MsigCreate creates a multisig wallet // It takes the following params: , , - //, , + // , , MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (*MessagePrototype, error) //perm:sign // MsigPropose proposes a multisig message diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index cd1f03337e6..bb5085be395 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -425,7 +425,7 @@ func ExampleValue(method string, t, parent reflect.Type) interface{} { case reflect.Ptr: if t.Elem().Kind() == reflect.Struct { es := exampleStruct(method, t.Elem(), t) - //ExampleValues[t] = es + // ExampleValues[t] = es return es } case reflect.Interface: diff --git a/api/eth_transactions.go b/api/eth_transactions.go index 333f126924d..5dc630af64d 100644 --- a/api/eth_transactions.go +++ b/api/eth_transactions.go @@ -7,7 +7,7 @@ import ( mathbig "math/big" "golang.org/x/crypto/sha3" - xerrors "golang.org/x/xerrors" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" gocrypto "github.com/filecoin-project/go-crypto" @@ -23,19 +23,19 @@ import ( ) type EthTx struct { - ChainID EthInt `json:"chainId"` - Nonce EthInt `json:"nonce"` + ChainID EthUint64 `json:"chainId"` + Nonce EthUint64 `json:"nonce"` Hash EthHash `json:"hash"` BlockHash EthHash `json:"blockHash"` - BlockNumber EthInt `json:"blockNumber"` - TransactionIndex EthInt `json:"transacionIndex"` + BlockNumber EthUint64 `json:"blockNumber"` + TransactionIndex EthUint64 `json:"transacionIndex"` From EthAddress `json:"from"` To *EthAddress `json:"to"` Value EthBigInt `json:"value"` - Type EthInt `json:"type"` + Type EthUint64 `json:"type"` Input EthBytes `json:"input"` - Gas EthInt `json:"gas"` - GasLimit *EthInt `json:"gasLimit,omitempty"` + Gas EthUint64 `json:"gas"` + GasLimit *EthUint64 `json:"gasLimit,omitempty"` MaxFeePerGas EthBigInt `json:"maxFeePerGas"` MaxPriorityFeePerGas EthBigInt `json:"maxPriorityFeePerGas"` V EthBytes `json:"v"` @@ -436,7 +436,7 @@ func parseInt(v interface{}) (int, error) { var value int64 r := bytes.NewReader(append(make([]byte, 8-len(data)), data...)) if err := binary.Read(r, binary.BigEndian, &value); err != nil { - return 0, xerrors.Errorf("cannot parse interface to EthInt: %w", err) + return 0, xerrors.Errorf("cannot parse interface to EthUint64: %w", err) } return int(value), nil } diff --git a/api/v0api/full.go b/api/v0api/full.go index 3600663b4fe..a0656c3fc39 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -140,7 +140,7 @@ type FullNode interface { // ChainGetPath returns a set of revert/apply operations needed to get from // one tipset to another, for example: - //``` + // ``` // to // ^ // from tAA @@ -149,7 +149,7 @@ type FullNode interface { // ^---*--^ // ^ // tRR - //``` + // ``` // Would return `[revert(tBA), apply(tAB), apply(tAA)]` ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) //perm:read @@ -366,12 +366,12 @@ type FullNode interface { ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write // ClientUnimport removes references to the specified file from filestore - //ClientUnimport(path string) + // ClientUnimport(path string) // ClientListImports lists imported files and their root CIDs ClientListImports(ctx context.Context) ([]api.Import, error) //perm:write - //ClientListAsks() []Ask + // ClientListAsks() []Ask // MethodGroup: State // The State methods are used to query, inspect, and interact with chain state. @@ -630,14 +630,14 @@ type FullNode interface { // It takes the following params: , , MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read - //MsigGetPending returns pending transactions for the given multisig - //wallet. Once pending transactions are fully approved, they will no longer - //appear here. + // MsigGetPending returns pending transactions for the given multisig + // wallet. Once pending transactions are fully approved, they will no longer + // appear here. MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) //perm:read // MsigCreate creates a multisig wallet // It takes the following params: , , - //, , + // , , MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign // MsigPropose proposes a multisig message // It takes the following params: , , , From 95c0afb99b7e926bb447f22f9191847f079e820b Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 3 Oct 2022 09:29:42 +0200 Subject: [PATCH 008/282] minor fixes --- chain/consensus/common.go | 1 - chain/consensus/filcns/filecoin.go | 6 +++--- chain/consensus/filcns/mine.go | 3 +-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/chain/consensus/common.go b/chain/consensus/common.go index 714c2de8d56..af78097f8ee 100644 --- a/chain/consensus/common.go +++ b/chain/consensus/common.go @@ -70,7 +70,6 @@ func RunAsyncChecks(ctx context.Context, await []async.ErrorFuture) error { } // CommonBlkChecks performed by all consensus implementations. -//TODO: Take stateManager and ChainStore in a common object abstracted by all consensus algorithms? func CommonBlkChecks(ctx context.Context, sm *stmgr.StateManager, cs *store.ChainStore, b *types.FullBlock, baseTs *types.TipSet) []async.ErrorFuture { h := b.Header diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 99612bd5765..543dc5c68c8 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -223,7 +223,7 @@ func (filec *FilecoinEC) ValidateBlock(ctx context.Context, b *types.FullBlock) }) blockSigCheck := async.Err(func() error { - if err := filec.VerifyBlockSignature(ctx, h, waddr); err != nil { + if err := verifyBlockSignature(ctx, h, waddr); err != nil { return xerrors.Errorf("check block signature failed: %w", err) } return nil @@ -507,12 +507,12 @@ func (filec *FilecoinEC) isChainNearSynced() bool { return build.Clock.Since(timestampTime) < 6*time.Hour } -func (filec *FilecoinEC) VerifyBlockSignature(ctx context.Context, h *types.BlockHeader, +func verifyBlockSignature(ctx context.Context, h *types.BlockHeader, addr address.Address) error { return sigs.CheckBlockSignature(ctx, h, addr) } -func (filec *FilecoinEC) SignBlock(ctx context.Context, w api.Wallet, +func signBlock(ctx context.Context, w api.Wallet, addr address.Address, next *types.BlockHeader) error { nosigbytes, err := next.SigningBytes() diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index 68d4cc88c55..d5d605a13ef 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -51,8 +51,7 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. return nil, xerrors.Errorf("failed to process messages from block template: %w", err) } - filec.SignBlock(ctx, w, worker, next) - if err != nil { + if err := signBlock(ctx, w, worker, next); err != nil { return nil, xerrors.Errorf("failed to sign new block: %w", err) } From 88d3de7afc68af5d26dc85efcffdf40a28433e5d Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 3 Oct 2022 09:50:48 +0200 Subject: [PATCH 009/282] run make gen to make ci happy --- chain/consensus/common.go | 8 ++++---- chain/types/cbor_gen.go | 7 ++++--- chain/vm/cbor_gen.go | 3 ++- cli/servicesmock_test.go | 4 +++- cmd/tvx/extract_many.go | 1 + 5 files changed, 14 insertions(+), 9 deletions(-) diff --git a/chain/consensus/common.go b/chain/consensus/common.go index af78097f8ee..0e5793ca8c3 100644 --- a/chain/consensus/common.go +++ b/chain/consensus/common.go @@ -5,19 +5,20 @@ import ( "fmt" "strings" - "go.opencensus.io/stats" - "golang.org/x/xerrors" - "github.com/hashicorp/go-multierror" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" logging "github.com/ipfs/go-log/v2" pubsub "github.com/libp2p/go-libp2p-pubsub" cbg "github.com/whyrusleeping/cbor-gen" + "go.opencensus.io/stats" + "golang.org/x/xerrors" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/network" + blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" + "github.com/filecoin-project/lotus/api" bstore "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" @@ -30,7 +31,6 @@ import ( "github.com/filecoin-project/lotus/lib/async" "github.com/filecoin-project/lotus/lib/sigs" "github.com/filecoin-project/lotus/metrics" - blockadt "github.com/filecoin-project/specs-actors/actors/util/adt" ) // Common operations shared by all consensus algorithm implementations. diff --git a/chain/types/cbor_gen.go b/chain/types/cbor_gen.go index 79ff5d19c49..78a3449ee82 100644 --- a/chain/types/cbor_gen.go +++ b/chain/types/cbor_gen.go @@ -8,13 +8,14 @@ import ( "math" "sort" + cid "github.com/ipfs/go-cid" + cbg "github.com/whyrusleeping/cbor-gen" + xerrors "golang.org/x/xerrors" + abi "github.com/filecoin-project/go-state-types/abi" crypto "github.com/filecoin-project/go-state-types/crypto" exitcode "github.com/filecoin-project/go-state-types/exitcode" proof "github.com/filecoin-project/go-state-types/proof" - cid "github.com/ipfs/go-cid" - cbg "github.com/whyrusleeping/cbor-gen" - xerrors "golang.org/x/xerrors" ) var _ = xerrors.Errorf diff --git a/chain/vm/cbor_gen.go b/chain/vm/cbor_gen.go index 4f93a86a4c6..edcf065608c 100644 --- a/chain/vm/cbor_gen.go +++ b/chain/vm/cbor_gen.go @@ -8,10 +8,11 @@ import ( "math" "sort" - types "github.com/filecoin-project/lotus/chain/types" cid "github.com/ipfs/go-cid" cbg "github.com/whyrusleeping/cbor-gen" xerrors "golang.org/x/xerrors" + + types "github.com/filecoin-project/lotus/chain/types" ) var _ = xerrors.Errorf diff --git a/cli/servicesmock_test.go b/cli/servicesmock_test.go index 5bae52a5ebc..11260ab08be 100644 --- a/cli/servicesmock_test.go +++ b/cli/servicesmock_test.go @@ -8,12 +8,14 @@ import ( context "context" reflect "reflect" + gomock "github.com/golang/mock/gomock" + go_address "github.com/filecoin-project/go-address" abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" + api "github.com/filecoin-project/lotus/api" types "github.com/filecoin-project/lotus/chain/types" - gomock "github.com/golang/mock/gomock" ) // MockServicesAPI is a mock of ServicesAPI interface. diff --git a/cmd/tvx/extract_many.go b/cmd/tvx/extract_many.go index 796f5014677..762304d9cfa 100644 --- a/cmd/tvx/extract_many.go +++ b/cmd/tvx/extract_many.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/exitcode" + "github.com/filecoin-project/lotus/chain/consensus" ) From 9bfb73211e634fdc69d94646a3318a6821a9a6d4 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 13 Oct 2022 13:20:51 +0200 Subject: [PATCH 010/282] fixed RewardFunc --- chain/consensus/compute_state.go | 6 +----- chain/consensus/filcns/filecoin.go | 9 +++++++-- chain/consensus/iface.go | 3 ++- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/chain/consensus/compute_state.go b/chain/consensus/compute_state.go index d0f669a10f5..041b6fb03a4 100644 --- a/chain/consensus/compute_state.go +++ b/chain/consensus/compute_state.go @@ -200,16 +200,12 @@ func (t *TipSetExecutor) ApplyBlocks(ctx context.Context, processedMsgs[m.Cid()] = struct{}{} } - params, err := actors.SerializeParams(&reward.AwardBlockRewardParams{ + params := &reward.AwardBlockRewardParams{ Miner: b.Miner, Penalty: penalty, GasReward: gasReward, WinCount: b.WinCount, - }) - if err != nil { - return cid.Undef, cid.Undef, xerrors.Errorf("failed to serialize award params: %w", err) } - rErr := t.reward(ctx, vmi, em, epoch, ts, params) if rErr != nil { return cid.Undef, cid.Undef, xerrors.Errorf("error applying reward: %w", err) diff --git a/chain/consensus/filcns/filecoin.go b/chain/consensus/filcns/filecoin.go index 543dc5c68c8..2e3baa4db29 100644 --- a/chain/consensus/filcns/filecoin.go +++ b/chain/consensus/filcns/filecoin.go @@ -21,6 +21,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" + "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/power" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" @@ -59,7 +60,11 @@ type FilecoinEC struct { const MaxHeightDrift = 5 var RewardFunc = func(ctx context.Context, vmi vm.Interface, em stmgr.ExecMonitor, - epoch abi.ChainEpoch, ts *types.TipSet, params []byte) error { + epoch abi.ChainEpoch, ts *types.TipSet, params *reward.AwardBlockRewardParams) error { + ser, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("failed to serialize award params: %w", err) + } rwMsg := &types.Message{ From: builtin.SystemActorAddr, To: reward.Address, @@ -69,7 +74,7 @@ var RewardFunc = func(ctx context.Context, vmi vm.Interface, em stmgr.ExecMonito GasPremium: types.NewInt(0), GasLimit: 1 << 30, Method: reward.Methods.AwardBlockReward, - Params: params, + Params: ser, } ret, actErr := vmi.ApplyImplicitMessage(ctx, rwMsg) if actErr != nil { diff --git a/chain/consensus/iface.go b/chain/consensus/iface.go index 58adfe03e62..10c3ead74df 100644 --- a/chain/consensus/iface.go +++ b/chain/consensus/iface.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/actors/builtin/reward" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" @@ -47,7 +48,7 @@ type Consensus interface { // // Each consensus implementation can set their own reward function. type RewardFunc func(ctx context.Context, vmi vm.Interface, em stmgr.ExecMonitor, - epoch abi.ChainEpoch, ts *types.TipSet, params []byte) error + epoch abi.ChainEpoch, ts *types.TipSet, params *reward.AwardBlockRewardParams) error // ValidateBlockPubsub implements the common checks performed by all consensus implementations // when a block is received through the pubsub channel. From 3105596c9e01a9dfd7bd22377f2534371c4e6158 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 13 Oct 2022 17:03:18 +0200 Subject: [PATCH 011/282] Clean pending files from rebase --- api/eth_transactions.go | 478 ---------------------------- api/eth_transactions_test.go | 185 ----------- api/proxy_gen.go | 19 +- api/rlp_test.go | 175 ---------- api/v0api/proxy_gen.go | 10 +- chain/consensus/compute_state.go | 1 - chain/messagepool/messagepool.go | 28 -- chain/messagepool/selection.go | 8 +- chain/messagepool/selection_test.go | 1 - chain/sync.go | 2 +- chain/types/keystore.go | 3 - chain/vectors/gen/main.go | 1 - chain/vm/gas.go | 1 - chain/wallet/key/key.go | 4 +- chain/wallet/wallet.go | 3 +- cli/state.go | 2 +- cmd/lotus-keygen/main.go | 1 - cmd/lotus-shed/msg.go | 2 +- cmd/lotus-wallet/interactive.go | 4 +- conformance/driver.go | 3 +- gateway/node.go | 1 - lib/sigs/delegated/init.go | 57 ---- lib/sigs/secp/init.go | 10 +- node/builder.go | 1 - 24 files changed, 29 insertions(+), 971 deletions(-) delete mode 100644 api/eth_transactions.go delete mode 100644 api/eth_transactions_test.go delete mode 100644 api/rlp_test.go delete mode 100644 lib/sigs/delegated/init.go diff --git a/api/eth_transactions.go b/api/eth_transactions.go deleted file mode 100644 index 5dc630af64d..00000000000 --- a/api/eth_transactions.go +++ /dev/null @@ -1,478 +0,0 @@ -package api - -import ( - "bytes" - "encoding/binary" - "fmt" - mathbig "math/big" - - "golang.org/x/crypto/sha3" - "golang.org/x/xerrors" - - "github.com/filecoin-project/go-address" - gocrypto "github.com/filecoin-project/go-crypto" - "github.com/filecoin-project/go-state-types/big" - builtintypes "github.com/filecoin-project/go-state-types/builtin" - "github.com/filecoin-project/go-state-types/builtin/v8/evm" - init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" - typescrypto "github.com/filecoin-project/go-state-types/crypto" - - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/chain/types" -) - -type EthTx struct { - ChainID EthUint64 `json:"chainId"` - Nonce EthUint64 `json:"nonce"` - Hash EthHash `json:"hash"` - BlockHash EthHash `json:"blockHash"` - BlockNumber EthUint64 `json:"blockNumber"` - TransactionIndex EthUint64 `json:"transacionIndex"` - From EthAddress `json:"from"` - To *EthAddress `json:"to"` - Value EthBigInt `json:"value"` - Type EthUint64 `json:"type"` - Input EthBytes `json:"input"` - Gas EthUint64 `json:"gas"` - GasLimit *EthUint64 `json:"gasLimit,omitempty"` - MaxFeePerGas EthBigInt `json:"maxFeePerGas"` - MaxPriorityFeePerGas EthBigInt `json:"maxPriorityFeePerGas"` - V EthBytes `json:"v"` - R EthBytes `json:"r"` - S EthBytes `json:"s"` -} - -type EthTxArgs struct { - ChainID int `json:"chainId"` - Nonce int `json:"nonce"` - To *EthAddress `json:"to"` - Value big.Int `json:"value"` - MaxFeePerGas big.Int `json:"maxFeePerGas"` - MaxPriorityFeePerGas big.Int `json:"maxPrioritiyFeePerGas"` - GasLimit int `json:"gasLimit"` - Input []byte `json:"input"` - V []byte `json:"v"` - R []byte `json:"r"` - S []byte `json:"s"` -} - -func NewEthTxArgsFromMessage(msg *types.Message) (EthTxArgs, error) { - var to *EthAddress - params := msg.Params - if msg.To == builtintypes.InitActorAddr { - to = nil - - var exec init8.ExecParams - reader := bytes.NewReader(msg.Params) - if err := exec.UnmarshalCBOR(reader); err != nil { - return EthTxArgs{}, err - } - - var evmParams evm.ConstructorParams - reader1 := bytes.NewReader(exec.ConstructorParams) - if err := evmParams.UnmarshalCBOR(reader1); err != nil { - return EthTxArgs{}, err - } - params = evmParams.Bytecode - } else { - addr, err := EthAddressFromFilecoinIDAddress(msg.To) - if err != nil { - return EthTxArgs{}, nil - } - to = &addr - } - - return EthTxArgs{ - ChainID: build.Eip155ChainId, - Nonce: int(msg.Nonce), - To: to, - Value: msg.Value, - Input: params, - MaxFeePerGas: msg.GasFeeCap, - MaxPriorityFeePerGas: msg.GasPremium, - GasLimit: int(msg.GasLimit), - }, nil -} - -func (tx *EthTxArgs) ToSignedMessage() (*types.SignedMessage, error) { - from, err := tx.Sender() - if err != nil { - return nil, err - } - - var to address.Address - var params []byte - - if tx.To == nil && tx.Input == nil { - return nil, fmt.Errorf("to and input cannot both be empty") - } - - if tx.To == nil { - // this is a contract creation - to = builtintypes.InitActorAddr - - constructorParams, err := actors.SerializeParams(&evm.ConstructorParams{ - Bytecode: tx.Input, - InputData: []byte{}, - }) - if err != nil { - return nil, fmt.Errorf("failed to serialize constructor params: %w", err) - } - - evmActorCid, ok := actors.GetActorCodeID(actors.Version8, "evm") - if !ok { - return nil, fmt.Errorf("failed to lookup evm actor code CID") - } - - params, err = actors.SerializeParams(&init8.ExecParams{ - CodeCID: evmActorCid, - ConstructorParams: constructorParams, - }) - if err != nil { - return nil, fmt.Errorf("failed to serialize init actor exec params: %w", err) - } - } else { - addr, err := tx.To.ToFilecoinAddress() - if err != nil { - return nil, err - } - to = addr - params = tx.Input - } - - msg := &types.Message{ - Nonce: uint64(tx.Nonce), - From: from, - To: to, - Value: tx.Value, - Method: 2, - Params: params, - GasLimit: int64(tx.GasLimit), - GasFeeCap: tx.MaxFeePerGas, - GasPremium: tx.MaxPriorityFeePerGas, - } - - sig, err := tx.Signature() - if err != nil { - return nil, err - } - - signedMsg := types.SignedMessage{ - Message: *msg, - Signature: *sig, - } - return &signedMsg, nil - -} - -func (tx *EthTxArgs) HashedOriginalRlpMsg() ([]byte, error) { - msg, err := tx.OriginalRlpMsg() - if err != nil { - return nil, err - } - - hasher := sha3.NewLegacyKeccak256() - hasher.Write(msg) - hash := hasher.Sum(nil) - return hash, nil -} - -func (tx *EthTxArgs) OriginalRlpMsg() ([]byte, error) { - chainId, err := formatInt(tx.ChainID) - if err != nil { - return nil, err - } - - nonce, err := formatInt(tx.Nonce) - if err != nil { - return nil, err - } - - maxPriorityFeePerGas, err := formatBigInt(tx.MaxPriorityFeePerGas) - if err != nil { - return nil, err - } - - maxFeePerGas, err := formatBigInt(tx.MaxFeePerGas) - if err != nil { - return nil, err - } - - gasLimit, err := formatInt(tx.GasLimit) - if err != nil { - return nil, err - } - - value, err := formatBigInt(tx.Value) - if err != nil { - return nil, err - } - - res := []interface{}{ - chainId, - nonce, - maxPriorityFeePerGas, - maxFeePerGas, - gasLimit, - formatEthAddr(tx.To), - value, - tx.Input, - []interface{}{}, // access list - } - - encoded, err := EncodeRLP(res) - if err != nil { - return nil, err - } - return append([]byte{0x02}, encoded...), nil -} - -func (tx *EthTxArgs) Signature() (*typescrypto.Signature, error) { - if tx.V == nil || tx.R == nil || tx.S == nil { - return nil, fmt.Errorf("one of V, R, or S is nil") - } - sig := append([]byte{}, tx.R...) - sig = append(sig, tx.S...) - sig = append(sig, tx.V...) - - if len(sig) != 65 { - return nil, fmt.Errorf("signature is not 65 bytes") - } - return &typescrypto.Signature{ - Type: typescrypto.SigTypeDelegated, Data: sig, - }, nil -} - -func (tx *EthTxArgs) Sender() (address.Address, error) { - msg, err := tx.OriginalRlpMsg() - if err != nil { - return address.Undef, err - } - - hasher := sha3.NewLegacyKeccak256() - hasher.Write(msg) - hash := hasher.Sum(nil) - - sig, err := tx.Signature() - if err != nil { - return address.Undef, err - } - - pubk, err := gocrypto.EcRecover(hash, sig.Data) - if err != nil { - return address.Undef, err - } - - return address.NewSecp256k1Address(pubk) -} - -func parseEip1559Tx(data []byte) (*EthTxArgs, error) { - if data[0] != 2 { - return nil, xerrors.Errorf("not an EIP-1559 transaction: first byte is not 2") - } - - d, err := DecodeRLP(data[1:]) - if err != nil { - return nil, err - } - decoded, ok := d.([]interface{}) - if !ok { - return nil, xerrors.Errorf("not an EIP-1559 transaction: decoded data is not a list") - } - - if len(decoded) != 9 && len(decoded) != 12 { - return nil, xerrors.Errorf("not an EIP-1559 transaction: should have 6 or 9 elements in the list") - } - - chainId, err := parseInt(decoded[0]) - if err != nil { - return nil, err - } - - nonce, err := parseInt(decoded[1]) - if err != nil { - return nil, err - } - - maxPriorityFeePerGas, err := parseBigInt(decoded[2]) - if err != nil { - return nil, err - } - - maxFeePerGas, err := parseBigInt(decoded[3]) - if err != nil { - return nil, err - } - - gasLimit, err := parseInt(decoded[4]) - if err != nil { - return nil, err - } - - to, err := parseEthAddr(decoded[5]) - if err != nil { - return nil, err - } - - value, err := parseBigInt(decoded[6]) - if err != nil { - return nil, err - } - - input, err := parseBytes(decoded[7]) - if err != nil { - return nil, err - } - - accessList, ok := decoded[8].([]interface{}) - if !ok || (ok && len(accessList) != 0) { - return nil, fmt.Errorf("access list should be an empty list") - } - - V, err := parseBytes(decoded[9]) - if err != nil { - return nil, err - } - - if len(V) == 0 { - V = []byte{0} - } - - R, err := parseBytes(decoded[10]) - if err != nil { - return nil, err - } - - S, err := parseBytes(decoded[11]) - if err != nil { - return nil, err - } - - args := EthTxArgs{ - ChainID: chainId, - Nonce: nonce, - To: to, - MaxPriorityFeePerGas: maxPriorityFeePerGas, - MaxFeePerGas: maxFeePerGas, - GasLimit: gasLimit, - Value: value, - Input: input, - R: padLeadingZeros(R, 32), - S: padLeadingZeros(S, 32), - V: V, - } - return &args, nil -} - -func ParseEthTxArgs(data []byte) (*EthTxArgs, error) { - if data[0] > 0x7f { - // legacy transaction - return nil, xerrors.Errorf("legacy transaction is not supported") - } else if data[0] == 1 { - // EIP-2930 - return nil, xerrors.Errorf("EIP-2930 transaction is not supported") - } else if data[0] == 2 { - // EIP-1559 - return parseEip1559Tx(data) - } - return nil, xerrors.Errorf("unsupported transaction type") -} - -func padLeadingZeros(data []byte, length int) []byte { - if len(data) >= length { - return data - } - zeros := make([]byte, length-len(data)) - return append(zeros, data...) -} - -func removeLeadingZeros(data []byte) []byte { - firstNonZeroIndex := len(data) - for i, b := range data { - if b > 0 { - firstNonZeroIndex = i - break - } - } - return data[firstNonZeroIndex:] -} - -func formatInt(val int) ([]byte, error) { - buf := new(bytes.Buffer) - err := binary.Write(buf, binary.BigEndian, int64(val)) - if err != nil { - return nil, err - } - return removeLeadingZeros(buf.Bytes()), nil -} - -func formatEthAddr(addr *EthAddress) []byte { - if addr == nil { - return nil - } - return addr[:] -} - -func formatBigInt(val big.Int) ([]byte, error) { - b, err := val.Bytes() - if err != nil { - return nil, err - } - return removeLeadingZeros(b), nil -} - -func parseInt(v interface{}) (int, error) { - data, ok := v.([]byte) - if !ok { - return 0, xerrors.Errorf("cannot parse interface to int: input is not a byte array") - } - if len(data) == 0 { - return 0, nil - } - if len(data) > 8 { - return 0, xerrors.Errorf("cannot parse interface to int: length is more than 8 bytes") - } - var value int64 - r := bytes.NewReader(append(make([]byte, 8-len(data)), data...)) - if err := binary.Read(r, binary.BigEndian, &value); err != nil { - return 0, xerrors.Errorf("cannot parse interface to EthUint64: %w", err) - } - return int(value), nil -} - -func parseBigInt(v interface{}) (big.Int, error) { - data, ok := v.([]byte) - if !ok { - return big.Zero(), xerrors.Errorf("cannot parse interface to big.Int: input is not a byte array") - } - if len(data) == 0 { - return big.Zero(), nil - } - var b mathbig.Int - b.SetBytes(data) - return big.NewFromGo(&b), nil -} - -func parseBytes(v interface{}) ([]byte, error) { - val, ok := v.([]byte) - if !ok { - return nil, xerrors.Errorf("cannot parse interface into bytes: input is not a byte array") - } - return val, nil -} - -func parseEthAddr(v interface{}) (*EthAddress, error) { - b, err := parseBytes(v) - if err != nil { - return nil, err - } - if b == nil || len(b) == 0 { - return nil, nil - } - addr, err := EthAddressFromBytes(b) - if err != nil { - return nil, err - } - return &addr, nil -} diff --git a/api/eth_transactions_test.go b/api/eth_transactions_test.go deleted file mode 100644 index 259e2903003..00000000000 --- a/api/eth_transactions_test.go +++ /dev/null @@ -1,185 +0,0 @@ -package api - -import ( - "bytes" - "encoding/hex" - "encoding/json" - "fmt" - "testing" - - "github.com/stretchr/testify/require" - "golang.org/x/crypto/sha3" - - "github.com/filecoin-project/go-address" - gocrypto "github.com/filecoin-project/go-crypto" - "github.com/filecoin-project/go-state-types/builtin/v8/evm" - init8 "github.com/filecoin-project/go-state-types/builtin/v8/init" - crypto1 "github.com/filecoin-project/go-state-types/crypto" - - "github.com/filecoin-project/lotus/chain/actors" - "github.com/filecoin-project/lotus/lib/sigs" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" -) - -type TxTestcase struct { - TxJSON string - NosigTx string - Input EthBytes - Output EthTxArgs -} - -func TestTxArgs(t *testing.T) { - testcases, err := prepareTxTestcases() - require.Nil(t, err) - require.NotEmpty(t, testcases) - - for i, tc := range testcases { - comment := fmt.Sprintf("case %d: \n%s\n%s", i, tc.TxJSON, hex.EncodeToString(tc.Input)) - - // parse txargs - txArgs, err := ParseEthTxArgs(tc.Input) - require.Nil(t, err, comment) - - msgRecovered, err := txArgs.OriginalRlpMsg() - require.Nil(t, err, comment) - require.Equal(t, tc.NosigTx, "0x"+hex.EncodeToString(msgRecovered), comment) - - // verify signatures - from, err := txArgs.Sender() - require.Nil(t, err, comment) - - smsg, err := txArgs.ToSignedMessage() - require.Nil(t, err, comment) - - err = sigs.Verify(&smsg.Signature, from, msgRecovered) - require.Nil(t, err, comment) - - // verify data - require.Equal(t, tc.Output.ChainID, txArgs.ChainID) - require.Equal(t, tc.Output.Nonce, txArgs.Nonce) - require.Equal(t, tc.Output.To, txArgs.To) - } -} - -func TestTransformParams(t *testing.T) { - constructorParams, err := actors.SerializeParams(&evm.ConstructorParams{ - Bytecode: mustDecodeHex("0x1122334455"), - InputData: []byte{}, - }) - require.Nil(t, err) - - evmActorCid, ok := actors.GetActorCodeID(actors.Version8, "reward") - require.True(t, ok) - - params, err := actors.SerializeParams(&init8.ExecParams{ - CodeCID: evmActorCid, - ConstructorParams: constructorParams, - }) - require.Nil(t, err) - - var exec init8.ExecParams - reader := bytes.NewReader(params) - err1 := exec.UnmarshalCBOR(reader) - require.Nil(t, err1) - - var evmParams evm.ConstructorParams - reader1 := bytes.NewReader(exec.ConstructorParams) - err1 = evmParams.UnmarshalCBOR(reader1) - require.Nil(t, err1) - - require.Equal(t, mustDecodeHex("0x1122334455"), evmParams.Bytecode) -} -func TestEcRecover(t *testing.T) { - rHex := "0x479ff7fa64cf8bf641eb81635d1e8a698530d2f219951d234539e6d074819529" - sHex := "0x4b6146d27be50cdbb2853ba9a42f207af8d730272f1ebe9c9a78aeef1d6aa924" - fromHex := "0x3947D223fc5415f43ea099866AB62B1d4D33814D" - v := byte(0) - - msgHex := "0x02f1030185012a05f2008504a817c800825208942b87d1cb599bc2a606db9a0169fcec96af04ad3a880de0b6b3a764000080c0" - pubKeyHex := "0x048362749392a0e192eff600d21155236c5a0648d300a8e0e44d8617712c7c96384c75825dc5c7595df2a5005fd8a0f7c809119fb9ab36403ed712244fc329348e" - - msg := mustDecodeHex(msgHex) - pubKey := mustDecodeHex(pubKeyHex) - r := mustDecodeHex(rHex) - s := mustDecodeHex(sHex) - from := mustDecodeHex(fromHex) - - sig := append(r, s...) - sig = append(sig, v) - require.Equal(t, 65, len(sig)) - - sha := sha3.NewLegacyKeccak256() - sha.Write(msg) - h := sha.Sum(nil) - - pubk, err := gocrypto.EcRecover(h, sig) - require.Nil(t, err) - require.Equal(t, pubKey, pubk) - - sha.Reset() - sha.Write(pubk[1:]) - h = sha.Sum(nil) - h = h[len(h)-20:] - - require.Equal(t, from, h) -} - -func TestDelegatedSigner(t *testing.T) { - rHex := "0xcf1fa52fae9154ba21d67aeca9b42adfe186eb9e426c441051a8473efd190848" - sHex := "0x0e6c8c79ffaf35fb8f136c8cf6c5656f1f3befad21f2644321aa6dba58d68737" - v := byte(0) - - msgHex := "0x02f08401df5e76038502540be400843b9aca008398968094ff000000000000000000000000000000000003f2832dc6c080c0" - pubKeyHex := "0x04cfecc0520d906cbfea387759246e89d85e2998843e56ad1c41de247ce10b3e4c453aa73c8de13c178d94461b6fa3f8b6f74406ce43d2fbab6992d0b283394242" - - msg := mustDecodeHex(msgHex) - pubKey := mustDecodeHex(pubKeyHex) - r := mustDecodeHex(rHex) - s := mustDecodeHex(sHex) - from, err := address.NewSecp256k1Address(pubKey) - require.Nil(t, err) - - sig := append(r, s...) - sig = append(sig, v) - require.Equal(t, 65, len(sig)) - - signature := &crypto1.Signature{ - Type: crypto1.SigTypeDelegated, - Data: sig, - } - - err = sigs.Verify(signature, from, msg) - require.Nil(t, err) -} - -func prepareTxTestcases() ([]TxTestcase, error) { - tcstr := `[{"input":"0x02f84e82013a80808080808080c080a002d9af9415b94bac9fb29efa168e800fe8390ec22dd6dd3b6848632f999e5fa6a04b0bd833d6993eb37c3b0b5f89551cbbd5412b3a1fed84ca1e94ab2b936be12b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080808080c0"},{"input":"0x02f84f82013a81c8808080808080c080a0a9177c9fc995b0f83480113a62b797a3520e6bc15d0e9c722c662c40d443b893a01eec355e019308be6acf89a55288a40ae247b6f57c0ca31545efea5954f788d5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080808080c0"},{"input":"0x02f84e82013a80808080808080c080a002d9af9415b94bac9fb29efa168e800fe8390ec22dd6dd3b6848632f999e5fa6a04b0bd833d6993eb37c3b0b5f89551cbbd5412b3a1fed84ca1e94ab2b936be12b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080808080c0"},{"input":"0x02f84f82013a81c8808080808080c080a0a9177c9fc995b0f83480113a62b797a3520e6bc15d0e9c722c662c40d443b893a01eec355e019308be6acf89a55288a40ae247b6f57c0ca31545efea5954f788d5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080808080c0"},{"input":"0x02f87282013a808080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a0ab14f6fcca6c9905f447e961f128f2c00f5a00e7b1ae18f5d4f9e024a9b7a6a06c4126378d89035f4ab6085fa9a01d92bf798cd799b9338f7818bc48bcba0c8e","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ef82013a808080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87382013a81c88080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0884e063f65a2986844a9e92f9e02561789c231136976715d5afb581435359e87a044295113d06dd7b8bdf105dd412c76fbd966ef6dbe1d8ace984886296a36018c","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f082013a81c88080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a808082ea6080808080c080a02b86cbd16667f7e035bd908d250d842e7d06f888716131de27897655dce01666a055f43bf2a758e6c250a14a31d33056fcb764e0fce4fffdeb0e11d84caa5ca57b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080808080c0"},{"input":"0x02f85182013a81c88082ea6080808080c001a07f1e363b3d38607f8854013e68a80750befd3ba78cc9ce116d6ef6a09359a7aea05ef2c89ffc70ef7f2eaae90a2b4b2a4ffb418108d458e1237b26469e6381fdce","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080808080c0"},{"input":"0x02f85082013a808082ea6080808080c080a02b86cbd16667f7e035bd908d250d842e7d06f888716131de27897655dce01666a055f43bf2a758e6c250a14a31d33056fcb764e0fce4fffdeb0e11d84caa5ca57b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080808080c0"},{"input":"0x02f85182013a81c88082ea6080808080c001a07f1e363b3d38607f8854013e68a80750befd3ba78cc9ce116d6ef6a09359a7aea05ef2c89ffc70ef7f2eaae90a2b4b2a4ffb418108d458e1237b26469e6381fdce","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080808080c0"},{"input":"0x02f87482013a808082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ddb915f82dd7835ad51b718abcfce007d8626019b122763063b92fa40b987248a03bd8dfd6c9b9c33affcdcd3a16b8d28ba9554ace2b5333c7d51d218f9d9ae175","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a808082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c88082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0606a3f7eeae6d8e7167d68bdd18c8d6f1dafa2aa308cc972d00c17fba8a00ed5a023ab15156103722a5b318570eed11eaa54d943f49135fae65288cb08fdb63aa1","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c88082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a8082ea608080808080c080a06ad97b54cb997b20c8c10e8aa231582470e9fb29c7b4353ad349ede58988e167a0536ca437b1e2c2346b44ac24d0c5c2bc84ef76f2fa9fb601e5120ab08172188d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080808080c0"},{"input":"0x02f85182013a81c882ea608080808080c080a07765925917407579de914453373b3169a9c7bd54ffbdc2baf95d27d628782b6aa07bdb11529410353d7fcf128e47d4a11f78805bdea8317df3060f75574dd56049","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080808080c0"},{"input":"0x02f85082013a8082ea608080808080c080a06ad97b54cb997b20c8c10e8aa231582470e9fb29c7b4353ad349ede58988e167a0536ca437b1e2c2346b44ac24d0c5c2bc84ef76f2fa9fb601e5120ab08172188d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080808080c0"},{"input":"0x02f85182013a81c882ea608080808080c080a07765925917407579de914453373b3169a9c7bd54ffbdc2baf95d27d628782b6aa07bdb11529410353d7fcf128e47d4a11f78805bdea8317df3060f75574dd56049","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080808080c0"},{"input":"0x02f87482013a8082ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0cea8956fdd5588f6ecb10da330d2b792f1f65e44ad7ce7ef8f084054c036a1f4a0429db8240b6da9dbc82286141ec5af4abcf38a3c1aabe2f918274aca59cfc315","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a8082ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c882ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0936dede60bd875866a5909ff0f6bbdfc12d3e9b171904140d745f8fb8f58dd1aa005d646d18d5abcd9dfdc448226be2b2395bb725603d548ce20e99968c7d1165b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c882ea6080808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea6082ea6080808080c001a08d8e15db9b109df23e6a888073dfbd4ff82650072a6fabc2acb7a8077221eee6a04d6b3b42271a428998881b4a061efa181b66113dbbb68ea559bc07668b4be8e5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080808080c0"},{"input":"0x02f85382013a81c882ea6082ea6080808080c080a0cf0e64a9535ae3e48045e863970f9e50b2742c641a5fe87a68ce60711e7f0d37a077ec4be433ce17b81eeccc857edde772bceaf7f1ef5dec398a0a5c514db554ab","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080808080c0"},{"input":"0x02f85282013a8082ea6082ea6080808080c001a08d8e15db9b109df23e6a888073dfbd4ff82650072a6fabc2acb7a8077221eee6a04d6b3b42271a428998881b4a061efa181b66113dbbb68ea559bc07668b4be8e5","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080808080c0"},{"input":"0x02f85382013a81c882ea6082ea6080808080c080a0cf0e64a9535ae3e48045e863970f9e50b2742c641a5fe87a68ce60711e7f0d37a077ec4be433ce17b81eeccc857edde772bceaf7f1ef5dec398a0a5c514db554ab","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080808080c0"},{"input":"0x02f87582013a8082ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a087081d2d818f81fb4d6e7063e1c99b0c615166815dcfab4ada162a3bb9888f689f0d4db69544b662926e8d06d838739691ddc15c23e5bde43b39b4908248abc2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a050d9da7b09da1c7b8f8acf8a4757ef0a30e051c9f3ad2175f23f00ce1c9b830da047e0d9bb275b89be86bd3e5c711d6ec93220df5072ba363f2d49b2b1c2487235","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea6082ea60808080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a80808082ea60808080c080a07b741f41b9adbaff98e97624a7910c544ca9fe9d6d4df4c72f9c6388eae73feda02206314ddfccf58fd2859b09b186c5d620b3da4629b4f5ea7182f5f20166cc17","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60808080c0"},{"input":"0x02f85182013a81c8808082ea60808080c080a0de264ea9a2f3130cf8b701f1e9683e7966fc11f889e2662ce019bde8b230c76ea0757eeb15f1425b63a1b30404a90e7fdd71d260144370400b90759151dc9e5c0a","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60808080c0"},{"input":"0x02f85082013a80808082ea60808080c080a07b741f41b9adbaff98e97624a7910c544ca9fe9d6d4df4c72f9c6388eae73feda02206314ddfccf58fd2859b09b186c5d620b3da4629b4f5ea7182f5f20166cc17","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60808080c0"},{"input":"0x02f85182013a81c8808082ea60808080c080a0de264ea9a2f3130cf8b701f1e9683e7966fc11f889e2662ce019bde8b230c76ea0757eeb15f1425b63a1b30404a90e7fdd71d260144370400b90759151dc9e5c0a","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60808080c0"},{"input":"0x02f87482013a80808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0b88b1993c94f40aa95afdb48d12fe68872b2ad2db152a4af2e333926e57bab16a0134405c059bd7006ffde093895cb5f032bfb2ed2a2c2b1a8bc0fd404d34e397c","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a80808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c8808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a016bd6bdb9a4a99679bb85cfb0d17b49d635c0837589827aa95b23ccb2e6899c9a0041e3d19f409ddef0eb8b3d5197cf7f6097d7ad7c8f55bc976ded6195e27f373","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c8808082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a808082ea6082ea60808080c001a054c4ed8414c0103afb7d19ad69433cd0e9d3b988f33ace6c050795c583ffa681a06e4aa13eb0459ceeb0b25a8099ec17fa40ca7ca381191a940c68199a95e8d98d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60808080c0"},{"input":"0x02f85282013a81c88082ea6082ea60808080c001a0d3b7b7cd9a61dd80070781bbba5b4b84a8006715e628ea0c0f891446e524d2f89fd149593d7205b5baf322da6c1a770b402b4cd075cf476f6bdc5331c9ebb5c3","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60808080c0"},{"input":"0x02f85282013a808082ea6082ea60808080c001a054c4ed8414c0103afb7d19ad69433cd0e9d3b988f33ace6c050795c583ffa681a06e4aa13eb0459ceeb0b25a8099ec17fa40ca7ca381191a940c68199a95e8d98d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60808080c0"},{"input":"0x02f85282013a81c88082ea6082ea60808080c001a0d3b7b7cd9a61dd80070781bbba5b4b84a8006715e628ea0c0f891446e524d2f89fd149593d7205b5baf322da6c1a770b402b4cd075cf476f6bdc5331c9ebb5c3","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60808080c0"},{"input":"0x02f87682013a808082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ca465473de19d169c5ec35304368da7d03767e8bbbdfc3e01a7b38822a3e2899a05ea2562bbd0bf90d2ee8944997129ff42618b123b7b6d3221208c34c37e6d7b2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a808082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c88082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a025e211e1e66aa58549f12d352f1f7c4c644c0a208c0ccf48e1c0b6642ad1fadfa07275f712cf8e1f257722893c99fcd794aabf4eb2124ce2025cc404d326f69f95","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c88082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85182013a8082ea608082ea60808080c0019fadd8e2ba459fd435d0e5ff745057e84f2ef3982952da514d1b59e12acb8639a04ee061901f178335a5498809e96e5984186e3015800ac95ae05bb17c2ad0eb2f","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60808080c0"},{"input":"0x02f85382013a81c882ea608082ea60808080c001a05ae3f41d9ecdbf2f944f532cd63afafdcb6ea93d849925a3713af37133acacfba06f3fca48b5d91f3f7475a3b24bc9e406584dfca736a3e818506156a8a2955f77","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60808080c0"},{"input":"0x02f85182013a8082ea608082ea60808080c0019fadd8e2ba459fd435d0e5ff745057e84f2ef3982952da514d1b59e12acb8639a04ee061901f178335a5498809e96e5984186e3015800ac95ae05bb17c2ad0eb2f","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60808080c0"},{"input":"0x02f85382013a81c882ea608082ea60808080c001a05ae3f41d9ecdbf2f944f532cd63afafdcb6ea93d849925a3713af37133acacfba06f3fca48b5d91f3f7475a3b24bc9e406584dfca736a3e818506156a8a2955f77","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60808080c0"},{"input":"0x02f87682013a8082ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0df6e0b1a5df0b64974bd19cb70cfba37732beca6b172708d10b27861d2f05a7ca04d16fd21111cd6867a0a341a9355599665bf951d0a8e4bb70714ed73007c309b","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a00ffa95e5be67c550de3b12b20ff369cdfc994faafc2c8bbd9fac95dc2d20e904a019ad18231fb1965b13c43f3f5a69f02c21c38fae141c8b391f598e7ed12ecbcb","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea608082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60808080c080a08f0078606ffc32decf3ee390a30f9610b8dc49cb55666a7d037325d367ef09bca0767479734098f684fca992e7237b369343b223940c7a3dcf486ae0763c2d3707","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60808080c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60808080c001a088ddf4e4ce8c4ad8b2d1b197ba41692ffd35e91feb4cb7f944019b9fd2b05fa4a04c87674f13d7ea3fa09b4a5f7d84a70206aed313136c5d2cdff65b6028e0efb2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60808080c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60808080c080a08f0078606ffc32decf3ee390a30f9610b8dc49cb55666a7d037325d367ef09bca0767479734098f684fca992e7237b369343b223940c7a3dcf486ae0763c2d3707","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60808080c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60808080c001a088ddf4e4ce8c4ad8b2d1b197ba41692ffd35e91feb4cb7f944019b9fd2b05fa4a04c87674f13d7ea3fa09b4a5f7d84a70206aed313136c5d2cdff65b6028e0efb2","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60808080c0"},{"input":"0x02f87882013a8082ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a062385c6b319fd40197a42e418525993e08804552961eb34e3de3cdddb1e1c17aa01f846e856717054b4974814048483e8be23f7acb0382e883f8a36e527a2067cb","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f582013a8082ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87982013a81c882ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a091f71b17ab4d27b10ffa21aa757fa361adac0ec0084bc0ca499f5eb7b09677d5a034d9e5954f9a3e4b0f871c3045ccb11ad0e26bc6f4e32c19bc91e80931f2fd5d","output":"{\"to\":null,\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f682013a81c882ea6082ea6082ea608080a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f84e82013a80808080806480c080a0e3e8ae1c2f71c3657729422bc3d48239f877d9133c2608966ccbe899d477b2bba0272d93dbc97ee070fdc86870712795a8a87779f706b45baa1643092290258878","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080806480c0"},{"input":"0x02f84f82013a81c8808080806480c080a097cb9161ea9dc2753dd6d0866d9b03b39c4cdfef2f44fa6c73fc1d5def02dee9a05e723c214ed4cc12d1df5842e422947805afe44c85e8184855174a673ce68d74","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080806480c0"},{"input":"0x02f84e82013a80808080806480c080a0e3e8ae1c2f71c3657729422bc3d48239f877d9133c2608966ccbe899d477b2bba0272d93dbc97ee070fdc86870712795a8a87779f706b45baa1643092290258878","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cb82013a80808080806480c0"},{"input":"0x02f84f82013a81c8808080806480c080a097cb9161ea9dc2753dd6d0866d9b03b39c4cdfef2f44fa6c73fc1d5def02dee9a05e723c214ed4cc12d1df5842e422947805afe44c85e8184855174a673ce68d74","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02cc82013a81c8808080806480c0"},{"input":"0x02f87282013a808080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09459bcb2fd569e48e6d854b142924b3cb5f63b774705f691238fdba4722896bda0137170a8cf29602fcf9a6ae1f692e20371f7ad6a73856e96e0b1f58535b5938c","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ef82013a808080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87382013a81c88080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09a229970bf10c22518b219419cb17688b2db26110eaef65458b54e7cfb3de4f2a07dc083b02a1e86f4c5037ecc2906e49978da216b5e40d629c5856508c5475f89","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f082013a81c88080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a808082ea6080806480c001a0ad1c4e4febc7dca2391a4a15118f7a86806c2556049ad60cfb8b056fadad3ecfa058f215be70dfa961d7072f4dc438510e9c8db0a5791caa79ff0b7b706cf316ed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080806480c0"},{"input":"0x02f85182013a81c88082ea6080806480c001a0f31747ec765743a700ca8df903fc916cda923abf5b44a979db85d306f59cbde6a02e139ced4f0a12955f8b3782a7d921cc460f7bb066b65490c81f68ce7f7a50dd","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080806480c0"},{"input":"0x02f85082013a808082ea6080806480c001a0ad1c4e4febc7dca2391a4a15118f7a86806c2556049ad60cfb8b056fadad3ecfa058f215be70dfa961d7072f4dc438510e9c8db0a5791caa79ff0b7b706cf316ed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a808082ea6080806480c0"},{"input":"0x02f85182013a81c88082ea6080806480c001a0f31747ec765743a700ca8df903fc916cda923abf5b44a979db85d306f59cbde6a02e139ced4f0a12955f8b3782a7d921cc460f7bb066b65490c81f68ce7f7a50dd","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c88082ea6080806480c0"},{"input":"0x02f87482013a808082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a810714a260023b52cda70890e61f16ee4af42f46fa9e1566f470c453bd25b88a02d6a88558e5692dbd2e59bed18109d505005ae48d5e59742b408dcef5bd9e367","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a808082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c88082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d11b1322d114f5b9f9c4b1e5231a2db2171b5608122e0317b29d4959770d7ef6a011fd8d3641694c019c62b010c37af30aa5ab41ee34d8f69b9a9f98a3c1c5d578","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c88082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a8082ea608080806480c001a0320db73af75876fedea2856c3aeeb4bb20e6514b1ed0e6c30e81723a7db3daa5a03a7fce79ffb6638b7a44aa1ef72073d6e55cca462c2fca9d85ffe2a246a5908d","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080806480c0"},{"input":"0x02f85182013a81c882ea608080806480c080a0dac7634fa49fc1a622bf8bb562449f712b8d611315d1a4c42437fbab9ce6db84a07b8ee93bb2e8267646b2f0cf6d833b179cea243a64c87d3404a845f2c5f2e5de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080806480c0"},{"input":"0x02f85082013a8082ea608080806480c001a0320db73af75876fedea2856c3aeeb4bb20e6514b1ed0e6c30e81723a7db3daa5a03a7fce79ffb6638b7a44aa1ef72073d6e55cca462c2fca9d85ffe2a246a5908d","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a8082ea608080806480c0"},{"input":"0x02f85182013a81c882ea608080806480c080a0dac7634fa49fc1a622bf8bb562449f712b8d611315d1a4c42437fbab9ce6db84a07b8ee93bb2e8267646b2f0cf6d833b179cea243a64c87d3404a845f2c5f2e5de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c882ea608080806480c0"},{"input":"0x02f87482013a8082ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03f00cc26a7c13191e82fe3ee79f43a3c7addeb4b3ff14c1382b5eb7dedac6745a02e994b354d3fa24bf97350f36d5177356f1c40cec2c0ff3e3c6c6620afe2a637","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a8082ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c882ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0ec35e69a3bbcf761e388401ce39cd25d7dab736bb200bb632e7d484aad96f506a05a3ee4422b29d1192434c4d3c9d64af412538f0deeeb7d1a18b931eb4af38df3","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c882ea6080808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea6082ea6080806480c080a0eddd719e0b0de7f96549dd1de6f5ef13f9fb5f9e67bdaad08545ca348058c431a0687a16c86b9068385f6175475e91907f9c37377e1a54bd4b41d088d27bc7088a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080806480c0"},{"input":"0x02f85382013a81c882ea6082ea6080806480c001a0788913be6a613572ca175c16ffaddf01a167b58c32f81defd8e4de53625fc812a004c93984e30bdba3603c1f57feee0b5115a87031e0124516c251cb73ef27de10","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080806480c0"},{"input":"0x02f85282013a8082ea6082ea6080806480c080a0eddd719e0b0de7f96549dd1de6f5ef13f9fb5f9e67bdaad08545ca348058c431a0687a16c86b9068385f6175475e91907f9c37377e1a54bd4b41d088d27bc7088a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea6082ea6080806480c0"},{"input":"0x02f85382013a81c882ea6082ea6080806480c001a0788913be6a613572ca175c16ffaddf01a167b58c32f81defd8e4de53625fc812a004c93984e30bdba3603c1f57feee0b5115a87031e0124516c251cb73ef27de10","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea6082ea6080806480c0"},{"input":"0x02f87682013a8082ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07f7f9b35e2759a1b6dc06506c1195468e29fd8b80e1ff90e3f40723a9334fed8a039cac5524d7e57b22be8c4390f8c4aedb2ce7abe8e9c6c0a3fbe90c48d754387","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07eddd29705e5e913d22de47daf6d93b20a7135f0e3ac8aa16c5b1c25efa95815a0082caa535a5e00776dcc47a19aca103f0e815fb984ecf90d3407dcc43655eece","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea6082ea60808064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85082013a80808082ea60806480c080a0f8102947aec0f244de8b3c3791a4e4214f693c3314bf50696546f5ca7c54930ca002769e82a368edbb1c9cb53d1857541c1386fcc6d0a11d3e58655025f8ce7312","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60806480c0"},{"input":"0x02f85182013a81c8808082ea60806480c080a0ce8df3004e424af808d77c6a11b2f0391842bbd5ac686e5b432e1e8a1f5fd1d4a00d55cc4ff21cacc2581d8756b0a8227111fdcbb030c6bbd692f775525be29902","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60806480c0"},{"input":"0x02f85082013a80808082ea60806480c080a0f8102947aec0f244de8b3c3791a4e4214f693c3314bf50696546f5ca7c54930ca002769e82a368edbb1c9cb53d1857541c1386fcc6d0a11d3e58655025f8ce7312","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cd82013a80808082ea60806480c0"},{"input":"0x02f85182013a81c8808082ea60806480c080a0ce8df3004e424af808d77c6a11b2f0391842bbd5ac686e5b432e1e8a1f5fd1d4a00d55cc4ff21cacc2581d8756b0a8227111fdcbb030c6bbd692f775525be29902","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ce82013a81c8808082ea60806480c0"},{"input":"0x02f87482013a80808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a009f2b5837ed29f7b472468b9dc636f39e989796d97ca9400e35f094f234b7231a0345874d675700c4488978338d12a7c62f9d8a0096798342bff7f35e444604154","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f182013a80808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87582013a81c8808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c0580e0842bb3f50d0a28402f4a99fd6e156b978633b629c0f2cc4172252153a051f9ecab32316215af8da2abb81dcf859aec81ad75fc0e22f2c281d512333928","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f282013a81c8808082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a808082ea6082ea60806480c080a0fcdad7ad0562a7129b4cc73bfb8565959feb5a8259993cd68ece3d6f6bd4f0e1a0121e6ae7e4819a865ffbacbe8ad67d5cc8634e9dbe8f5528cc8841c9d4453ccc","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60806480c0"},{"input":"0x02f85382013a81c88082ea6082ea60806480c001a083dc862eaf257068751ac014ff021ab5a729c68fc3f665bcc3abe3d7393cb0d2a02400cc4059f66c8feaa0d717a659d763ac5d4d067a45b9571037f5d573fdd7c9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60806480c0"},{"input":"0x02f85282013a808082ea6082ea60806480c080a0fcdad7ad0562a7129b4cc73bfb8565959feb5a8259993cd68ece3d6f6bd4f0e1a0121e6ae7e4819a865ffbacbe8ad67d5cc8634e9dbe8f5528cc8841c9d4453ccc","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a808082ea6082ea60806480c0"},{"input":"0x02f85382013a81c88082ea6082ea60806480c001a083dc862eaf257068751ac014ff021ab5a729c68fc3f665bcc3abe3d7393cb0d2a02400cc4059f66c8feaa0d717a659d763ac5d4d067a45b9571037f5d573fdd7c9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c88082ea6082ea60806480c0"},{"input":"0x02f87682013a808082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a5b1529fb5158abf54d61689aeafbcf7aba86c95efa53726299c64349e8cb277a06f68a0c684c1e1ddba000a3bdd18019011ca5a01f627914445a8e8ff77d11eed","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a808082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c88082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a049bc9983635fe90f3c5ac42c4919695c2bd1bf3600e731a85e671923dab1d24da02c2140f4339ff23855d599c7c88257709fbf6a363bcd7211e6218cf1ad3936d9","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c88082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85282013a8082ea608082ea60806480c001a03a08bf6de5d7d22ca0154c5a705bb3f5b0e3105c343eabc0307fc99bb89f91d0a021f8c7c5867ca59acd770eb06ac8c4488bd8f40c4bfd0841185ac60f8cb311de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60806480c0"},{"input":"0x02f85382013a81c882ea608082ea60806480c001a09449cea6b7b492b80c6ebe08588c3b3bb94f73cddcf5b60a4bdf9c10462f9264a01682ef0a841044bd58f392b252418d9dd473e08bf561632976126652f1ac1b88","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60806480c0"},{"input":"0x02f85282013a8082ea608082ea60806480c001a03a08bf6de5d7d22ca0154c5a705bb3f5b0e3105c343eabc0307fc99bb89f91d0a021f8c7c5867ca59acd770eb06ac8c4488bd8f40c4bfd0841185ac60f8cb311de","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02cf82013a8082ea608082ea60806480c0"},{"input":"0x02f85382013a81c882ea608082ea60806480c001a09449cea6b7b492b80c6ebe08588c3b3bb94f73cddcf5b60a4bdf9c10462f9264a01682ef0a841044bd58f392b252418d9dd473e08bf561632976126652f1ac1b88","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d082013a81c882ea608082ea60806480c0"},{"input":"0x02f87682013a8082ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a07e9ba318f9c63d1a6b2afeccbca77eb512e85e1ac661e6fc050970449c4b2a26a0478a9c96e9d9e900dc3ae4dba33a425254ff3578af30255c1be68fe316c40119","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f382013a8082ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87782013a81c882ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a08c6c7c76220d18df6d45175256f1c615757a456163bcf732a605d9a063509c79a022b364054d69f91213c521ffad2d0c5c349a5808b03543d4813f8b23e342e8f3","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f482013a81c882ea608082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60806480c080a0825a042c44b472317d1387a9cf190f4d0c770a84300c299452ff5a220e2c1590a00403abbbf3b147d4895f68305b0db21be477616987d604cea0615cf6ac377a77","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60806480c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60806480c001a044bdb37e9b26c8a09c9ce61acd01f68badc063005f5dcbfd32836f5950049695a0499a9d378b97c4a5bb6ec105a00ad581b224bf227439799d0b97ea8f5faee767","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60806480c0"},{"input":"0x02f85482013a8082ea6082ea6082ea60806480c080a0825a042c44b472317d1387a9cf190f4d0c770a84300c299452ff5a220e2c1590a00403abbbf3b147d4895f68305b0db21be477616987d604cea0615cf6ac377a77","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d182013a8082ea6082ea6082ea60806480c0"},{"input":"0x02f85582013a81c882ea6082ea6082ea60806480c001a044bdb37e9b26c8a09c9ce61acd01f68badc063005f5dcbfd32836f5950049695a0499a9d378b97c4a5bb6ec105a00ad581b224bf227439799d0b97ea8f5faee767","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d282013a81c882ea6082ea6082ea60806480c0"},{"input":"0x02f87882013a8082ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c73e7dcd11a8f1e1b59b81f5e626c898597c84dc540966dad1dbb51fcc106814a0352250cf688c74808d2939ff919cdef19a4c9c9fa61698224565ce912a20429a","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f582013a8082ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87982013a81c882ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a08020e129ccb7034377ea4cbb03a313997c6e9a370891de88d1d3d61c0e87e1b4a00668935ceed45538772745b760bb6471e79963e44ffce163440240b3578cd262","output":"{\"to\":null,\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f682013a81c882ea6082ea6082ea608064a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85682013a8080808080880de0b6b3a764000080c080a0f31df874009680817aea98fdd57d6a0f8d596e251b573e86d44e0b944a7913f3a03baa16757b2351cd5784c4b0213e66c2f3839e98af99f20606d8c33d9d45f661","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d382013a8080808080880de0b6b3a764000080c0"},{"input":"0x02f85782013a81c880808080880de0b6b3a764000080c001a0cf54b9a861cf6a6951b38578a73de9c51688b124b8e7dd0ee7ba10f0136e4efba003a5bf873c58a9dc269727e1ebc2b2c690ed2e7e3a64482c1f58e6b526092944","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d482013a81c880808080880de0b6b3a764000080c0"},{"input":"0x02f85682013a8080808080880de0b6b3a764000080c080a0f31df874009680817aea98fdd57d6a0f8d596e251b573e86d44e0b944a7913f3a03baa16757b2351cd5784c4b0213e66c2f3839e98af99f20606d8c33d9d45f661","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d382013a8080808080880de0b6b3a764000080c0"},{"input":"0x02f85782013a81c880808080880de0b6b3a764000080c001a0cf54b9a861cf6a6951b38578a73de9c51688b124b8e7dd0ee7ba10f0136e4efba003a5bf873c58a9dc269727e1ebc2b2c690ed2e7e3a64482c1f58e6b526092944","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d482013a81c880808080880de0b6b3a764000080c0"},{"input":"0x02f87a82013a8080808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0907be9b9c50d1ebc3489dde0599802464a2792e6a4c3014d2d42db50f4ba3c75a02330372fe92742fce0fe28bc0583813f17640e3c5080141008b4ac803e61911a","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f782013a8080808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87b82013a81c880808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c566bb25bc5010ed9c7a5eedb662d3390bf065fcc10571125dc248d810a6731a024531646c80970757cff49228a332f238d8e3e4ce7038fd6943610f877eedff9","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83882013a81c880808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a808082ea608080880de0b6b3a764000080c001a0b7079e6b62999bc486de04bed329e79a52aa17752ba4880b996710349b40c7e1a014869354847aebbfdddc473183b9baa8584d86b2dc48ecf647ae20430f146f35","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a808082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c88082ea608080880de0b6b3a764000080c080a04f4cd4dcfef7d6a5b654d9bdf8a89c4929dc32e375d199b40f5a114b9edabd45a01aabbcd6fb9b5f96597f180a70ba57e8d238995c392c96bb204879f134a12a93","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c88082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85882013a808082ea608080880de0b6b3a764000080c001a0b7079e6b62999bc486de04bed329e79a52aa17752ba4880b996710349b40c7e1a014869354847aebbfdddc473183b9baa8584d86b2dc48ecf647ae20430f146f35","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a808082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c88082ea608080880de0b6b3a764000080c080a04f4cd4dcfef7d6a5b654d9bdf8a89c4929dc32e375d199b40f5a114b9edabd45a01aabbcd6fb9b5f96597f180a70ba57e8d238995c392c96bb204879f134a12a93","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c88082ea608080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a808082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a06f5262d03380227973c7507fbb1931ce3ae684521b2803d967fc67cead8734fda02801ed8fc53083936ec4bbefa3216a5241d25c8940aa16c9bc0ed51d302907b7","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a808082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c88082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a046b8e78656538c428e14378d9e3fe1c19a3a9a96251aeb7b04fd416858ceff23a017bd04e5f3059b34c8c9a42a0ee67517bf67592c95d4b8553716808e8fde4400","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c88082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a8082ea60808080880de0b6b3a764000080c001a0d93a26bd5294c50b7dedf5c6d7cbc5a1a5ec40d80cfb811f463788b80dc45d0fa05598f7fc9dff96717999450035d4f9b503988b616e3990a20d165cdd638be362","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a8082ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c882ea60808080880de0b6b3a764000080c001a08890ab494d178516833623e2c05e7ffb600ec980b141f8b6e8733a94bf7b5289a04bc7ff419352ca8eb396d1b7b57d50bc1ec80a236a71055241bf2e7535f92901","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c882ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85882013a8082ea60808080880de0b6b3a764000080c001a0d93a26bd5294c50b7dedf5c6d7cbc5a1a5ec40d80cfb811f463788b80dc45d0fa05598f7fc9dff96717999450035d4f9b503988b616e3990a20d165cdd638be362","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a8082ea60808080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c882ea60808080880de0b6b3a764000080c001a08890ab494d178516833623e2c05e7ffb600ec980b141f8b6e8733a94bf7b5289a04bc7ff419352ca8eb396d1b7b57d50bc1ec80a236a71055241bf2e7535f92901","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c882ea60808080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a8082ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0d9d52087d771d397a9e1630452cc4649671941c3486b0bb24019087b4d897769a04e2ecc1e542690cfcf341c6fce6987ac4cd8cdecdbdfd5c9521d268d2085c84e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a8082ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c882ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0eadf0da93be9c532794684382b7fe49093a093a8f082b79b4b9bb9ee686de274a021648c60e5dd6e4c3e102befcfdc4512a246e9d66e24fff3053545144955cb80","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c882ea60808080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a8082ea6082ea608080880de0b6b3a764000080c080a0ee344021ecd122a30b44535901718a9eefd06f5ecccc41c530c1e9cfe4cd1f13a07425a2aa7612bb4e5cffe400af1d162ab8cdbe185d92b1e6c166de7fa571a9f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea6082ea608080880de0b6b3a764000080c001a0da86086e5a046a1b41dbc4b55b97ba517696db207e0a9da2e3b46af1507d17c5a07779b1c12a3dc37378985b5d7a4fcc95f1fbd0cbba522d7cc1a20d535faeb30e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a8082ea6082ea608080880de0b6b3a764000080c080a0ee344021ecd122a30b44535901718a9eefd06f5ecccc41c530c1e9cfe4cd1f13a07425a2aa7612bb4e5cffe400af1d162ab8cdbe185d92b1e6c166de7fa571a9f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea6082ea608080880de0b6b3a764000080c001a0da86086e5a046a1b41dbc4b55b97ba517696db207e0a9da2e3b46af1507d17c5a07779b1c12a3dc37378985b5d7a4fcc95f1fbd0cbba522d7cc1a20d535faeb30e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea6082ea608080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a8082ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0fc1e27c941325403a95a8adf21eb77fbc947b20a0a1dabb245ab514ef09d0171a03e014156069072bf3682e34da2719af03d784691c199beb012c71682dfda20ae","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a8082ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c882ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03412dc4f1e4b8de363a753b08e7bed249c1e3c5a95515f5a50997ad7f3bb6c50a05fb5a87024da9009bb50337a28bd86dd448c3772ba93abba952d9c3b5fc927f3","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c882ea6082ea608080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85882013a80808082ea6080880de0b6b3a764000080c080a00b2cab27d46f5b18c95bcbbbbdbc128e1798e8c633f3126f8e0b4d47822899c8a00e2dfee3c9698df3dacea25569c96f927baa0e83a2dc3804c2007215ff1fd16e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a80808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c8808082ea6080880de0b6b3a764000080c001a098d11fdf17851c4393dcdeca863464936f901cb89b5959be1d5fbe5cf47fce64a070acf0beaedc55af8a67b637d43dd8f70b10026501f146b32ec9b413689c3018","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c8808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85882013a80808082ea6080880de0b6b3a764000080c080a00b2cab27d46f5b18c95bcbbbbdbc128e1798e8c633f3126f8e0b4d47822899c8a00e2dfee3c9698df3dacea25569c96f927baa0e83a2dc3804c2007215ff1fd16e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d582013a80808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85982013a81c8808082ea6080880de0b6b3a764000080c001a098d11fdf17851c4393dcdeca863464936f901cb89b5959be1d5fbe5cf47fce64a070acf0beaedc55af8a67b637d43dd8f70b10026501f146b32ec9b413689c3018","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d682013a81c8808082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87c82013a80808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a062d300529917ba1c03873cfdf35ef669d0e1d3f52115b305916609f1659d67c4a0111fc401c2a10f874c02c20b3e938412f9c35f24fb83b121fadb8fd107182726","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83982013a80808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87d82013a81c8808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02b66e32d2b4bda0ddbfa74d8ea2f8a0267ba7019abb366e0d3f8b247b129982aa02c163d63b6e727cbd6b17add5b2f98d60b7cbe00af5b0224d809e94924a5c129","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83a82013a81c8808082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a808082ea6082ea6080880de0b6b3a764000080c001a0055ae00874a381bf2c6f1b518f318270f2c4109b2eb071fcc17d934b1faf2c81a04a2a6dd88a31a2929656581bf31d42109beb431dbc99bdea4ec0636d697b7137","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a808082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c88082ea6082ea6080880de0b6b3a764000080c080a0ceb7acb4eccb1683ed065ed0df5b3e1e747a741449c17f4170fb4688af79169da04647dc401f5170ce6824219e4b877100a79ff252e73177bc3be6904f04457c5e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c88082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a808082ea6082ea6080880de0b6b3a764000080c001a0055ae00874a381bf2c6f1b518f318270f2c4109b2eb071fcc17d934b1faf2c81a04a2a6dd88a31a2929656581bf31d42109beb431dbc99bdea4ec0636d697b7137","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a808082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c88082ea6082ea6080880de0b6b3a764000080c080a0ceb7acb4eccb1683ed065ed0df5b3e1e747a741449c17f4170fb4688af79169da04647dc401f5170ce6824219e4b877100a79ff252e73177bc3be6904f04457c5e","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c88082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a808082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a020e9ce595105ad63212d5c8e1e598d2d90347c94ca57aa8454768222b5ee91a5a019bcc3d4692a00fbf0ee91605eb2ebd7aab58f94ead5f03b005cee1e6a328a9a","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a808082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c88082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0203be5acf80eea1a22f151475993fdea0b429a90a7ce53554f303309ba5cbb75a05ba185145f6f072158cff4a2c63bb4e7c5ffaf3ef2029d2688c24cd238495657","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c88082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85a82013a8082ea608082ea6080880de0b6b3a764000080c080a02200b34117aec43fbf36c19584d3f5371662e02e06e41ab18893f6ea4eae9db7a036cfb853039002767d6b41625ffdf926ab2adec33d668b83209f609d4a64661b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea608082ea6080880de0b6b3a764000080c001a0d5bf42725de1f608b811ad94bd96f1419606b5edc2b2885252be998e21c19e64a026b18d19b371fc68a48c0b348192956158cfc3aef4c2995a04e455193156ab9b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85a82013a8082ea608082ea6080880de0b6b3a764000080c080a02200b34117aec43fbf36c19584d3f5371662e02e06e41ab18893f6ea4eae9db7a036cfb853039002767d6b41625ffdf926ab2adec33d668b83209f609d4a64661b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d782013a8082ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85b82013a81c882ea608082ea6080880de0b6b3a764000080c001a0d5bf42725de1f608b811ad94bd96f1419606b5edc2b2885252be998e21c19e64a026b18d19b371fc68a48c0b348192956158cfc3aef4c2995a04e455193156ab9b","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02d882013a81c882ea608082ea6080880de0b6b3a764000080c0"},{"input":"0x02f87e82013a8082ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0048571da63d488ba7d100e9ef32c0b4a06ffe51354e82a40ff953c377959033da069fae6fc2a68e6f96480fbb2768ba3bdcb9c9fa5523fe3ca428ef2d377b67ed2","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83b82013a8082ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87f82013a81c882ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0e4bf87c6adc1f903dde3bae06b12c00d62e0b4bb8178669b9cb3f658d43059dba07f0cdef6581cbb312cceef38703b154e5744df03693423e07aa2464daf67fc28","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83c82013a81c882ea608082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f85c82013a8082ea6082ea6082ea6080880de0b6b3a764000080c001a0adb3a7c410f3a4d89792fcede5c7a5437c5fab3881d9145cdbf96ee6d4050311a066866bcc349f1e78ea7ecb8d71c649cd3e8bcf8614494c6facd5c2dd68a6352f","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d982013a8082ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85d82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c080a0ba51668b00de8e0355e0ab99c49377f61be25d30f7598bd798178fa500bbe262a06bba3437dea06d5a63f3122d4fa7013238e47289b5801bf18444383180484900","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02da82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85c82013a8082ea6082ea6082ea6080880de0b6b3a764000080c001a0adb3a7c410f3a4d89792fcede5c7a5437c5fab3881d9145cdbf96ee6d4050311a066866bcc349f1e78ea7ecb8d71c649cd3e8bcf8614494c6facd5c2dd68a6352f","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02d982013a8082ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f85d82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c080a0ba51668b00de8e0355e0ab99c49377f61be25d30f7598bd798178fa500bbe262a06bba3437dea06d5a63f3122d4fa7013238e47289b5801bf18444383180484900","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02da82013a81c882ea6082ea6082ea6080880de0b6b3a764000080c0"},{"input":"0x02f88082013a8082ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a960e8dd8eafea3b38178e802b4ed9d4ef3613c9de83c96a5bb9178565bb0b90a0250e480879b64829e0ca2296c6a5f07b4d96bf2654ec70af3be447a01ca950ad","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83d82013a8082ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88182013a81c882ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c5b361f372b4b9f115de0510913e11e80b22649ec6a54fdd6cd8c70abe1c4fa4a00c109e6bf278b5bc9e93f293c1ed7cdfebf315d908a7f9c1ae255e165832c37c","output":"{\"to\":null,\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f83e82013a81c882ea6082ea6082ea6080880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec8080c080a0f411a73e33523b40c1a916e79e67746bd01a4a4fb4ecfa87b441375a215ddfb4a0551692c1553574fab4c227ca70cb1c121dc3a2ef82179a9c984bd7acc0880a38","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec8080c001a0ed75a56e365c88479bf3f60251a2dd47ae181f1a3d95724581a3f648487b4396a046628bb9734edf4b4c455f2bbd351e43c466f315272cd1927f2c55d9b52e058b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec8080c080a0f411a73e33523b40c1a916e79e67746bd01a4a4fb4ecfa87b441375a215ddfb4a0551692c1553574fab4c227ca70cb1c121dc3a2ef82179a9c984bd7acc0880a38","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec8080c001a0ed75a56e365c88479bf3f60251a2dd47ae181f1a3d95724581a3f648487b4396a046628bb9734edf4b4c455f2bbd351e43c466f315272cd1927f2c55d9b52e058b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88682013a8080808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0706d871013403cf8b965dfa7f2be5a4d185d746da45b21d5a67c667c26d255d6a02e68a14f386aa325ce8e82d30405107d53103d038cf20e40af961ef3a3963608","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84382013a8080808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88782013a81c880808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0df137d0a6733354b2f2419a4ea5fe77d333deca28b2fe091d76190b51c2bae73a0232cbf9c29b8840cbf104ff77360fbf3ca4acda29b5e230636e19ac253ad92de","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84482013a81c880808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec8080c001a03a2880cc65e88d5320067f502a0ffda72111d01f0ebeeea9fbeb812e457aa0f9a020c08483b104dbfbbbffffedc3acdbe8245ca6daf97c0dbab843d747e587d625","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec8080c001a03427daf1639de6bf1b948abeab765b0a6a9170cc6a16d263c71c859f78916b03a01bbbb824b9953b5eb9f3098b4358a7ebb78f3358866eed997de66350ae4c9475","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec8080c001a03a2880cc65e88d5320067f502a0ffda72111d01f0ebeeea9fbeb812e457aa0f9a020c08483b104dbfbbbffffedc3acdbe8245ca6daf97c0dbab843d747e587d625","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec8080c001a03427daf1639de6bf1b948abeab765b0a6a9170cc6a16d263c71c859f78916b03a01bbbb824b9953b5eb9f3098b4358a7ebb78f3358866eed997de66350ae4c9475","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a808082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b9ebc36653a4800816f71ceacf93a1ee601a136916a3476ea9073a9a55ff026aa0647665249b12e8d1d1773b91844588ed70f65c91bc088ccb259ec0f0a24330d5","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a808082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c88082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0122dd8468dbd34e111e1a5ea1997199be633aa3bc9c1a7ee27dc3a8eda39c29da07cb99cd28ac67f55e507a8b8ef5b931c56cacf79273a4a2969a004a4b4a2864a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c88082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec8080c080a0c1d020df63cb6db76e3a27a60ba0500a3cdd30f9f47b08733009dc8d610ea29ba05cbafb4c223417526ded0b02b8eb66a73535386d0e62da0e20f3641b532aa406","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec8080c080a090e30d32c6cd3f1ba2109b6a9f1c9fffc50b96a934192edf98adc086299e410ba057db0c136436de2e907942bdaad8e0113cf576f250b336ab652ef094c260dae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec8080c080a0c1d020df63cb6db76e3a27a60ba0500a3cdd30f9f47b08733009dc8d610ea29ba05cbafb4c223417526ded0b02b8eb66a73535386d0e62da0e20f3641b532aa406","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec8080c080a090e30d32c6cd3f1ba2109b6a9f1c9fffc50b96a934192edf98adc086299e410ba057db0c136436de2e907942bdaad8e0113cf576f250b336ab652ef094c260dae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a8082ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a016e3f30a612fc802bb64b765325ecf78f2769b879a9acf62f07669f9723335d6a0781bb3444a73819f28233f1eebf8c3a4de288842fd73c2e05a7a7b0c288d5b25","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a8082ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c882ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0b652a447bdcdd1906ed86406ee543ee06023e4f762784c1d3aaf4c3bd85c6a17a0368ae9995e15258f14b74f937e97140a659d052d341674be0c24452257b56b30","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c882ea60808094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c001a0b1411f337b69609a256c0e76c57ccf4af87e977c98fd2a889f29281bf623cab4a049bec0fb4773aed870bae9c1cdf1ee398c498f0b436dcd19cae588b4ecd8bdf2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c080a00b845fec9c96bf593c3501753764e14867d3f5d4bd02051e49329b6810d6513ea070d046e5b38c18c542594b328f02345a8f34ab05fd00db33974f914f7ae31c63","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c001a0b1411f337b69609a256c0e76c57ccf4af87e977c98fd2a889f29281bf623cab4a049bec0fb4773aed870bae9c1cdf1ee398c498f0b436dcd19cae588b4ecd8bdf2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c080a00b845fec9c96bf593c3501753764e14867d3f5d4bd02051e49329b6810d6513ea070d046e5b38c18c542594b328f02345a8f34ab05fd00db33974f914f7ae31c63","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a8082ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02d8215d8408d2f4b83a2e68f4aad6fe5dee97d7ef6a43b02ec413ead2215ac80a0641a43cebd6905e3e324c0dd06585d5ffc9b971b519045999c48e31db7aa7f9d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88a82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0da68784e191ce0806527d389f84b5d15bed3908e1c2cc0d8f0cea7a29eb0dba39f231a0b438b7d0f0f57292c68dc174d4ee6df7add933ab4e0b3789f597a7d3b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea6082ea608094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec8080c080a04c97162e2d2ab508116a23c522fd816ecd9cb091d4c288afe45c37ee3a8dde34a06ebf67ff15b74d65c276340aaebde8e6ebb8da0d3bbab43deffac8eb1e6a0630","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c080a0d503d409e667c2876ab9e420854cecce4c0092985855234be07f270bfcf3ed4aa07a40deecc8a4448d4dc0e2014b4b23ac5721409c62bffa05aee6938d8447f72d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec8080c080a04c97162e2d2ab508116a23c522fd816ecd9cb091d4c288afe45c37ee3a8dde34a06ebf67ff15b74d65c276340aaebde8e6ebb8da0d3bbab43deffac8eb1e6a0630","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c080a0d503d409e667c2876ab9e420854cecce4c0092985855234be07f270bfcf3ed4aa07a40deecc8a4448d4dc0e2014b4b23ac5721409c62bffa05aee6938d8447f72d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88882013a80808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a059aecc1d365ee0dc56a577d162f04c0912a5c5b62f889cff1acc706ac17a4489a017209b3ec43a10a40c5863a2b7a1ee823380ad42697a5f7d5f537c230583a4c7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a80808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c8808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0dc1eb40f93e311f3f9a94d8a695db2bbb38973ce097121875885e4bc54f18152a0075da0bd405bb4f5c69034daaf8f40052b941fae5b9f3b8df218d80fb4d7ea99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c8808082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a03d392fd5e83c64554907a55204572aaeec6ffab25f2c73655c6a22344fa02a14a03b9ae94b7dc21108db6dda65125ecaff844f8f43f483bed35f32f6d5d530fe9f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c001a0405e8a430ef6ad4c3403150776af08c255b6f6fbe278d194f88517733c816caca0364203b5bca7953dd863d4cf90c0a77b499ef4a3d5831c4fdf33926c31709c4f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a03d392fd5e83c64554907a55204572aaeec6ffab25f2c73655c6a22344fa02a14a03b9ae94b7dc21108db6dda65125ecaff844f8f43f483bed35f32f6d5d530fe9f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c001a0405e8a430ef6ad4c3403150776af08c255b6f6fbe278d194f88517733c816caca0364203b5bca7953dd863d4cf90c0a77b499ef4a3d5831c4fdf33926c31709c4f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a808082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a083cf6701aee00872946b6550c059f028f72e3052acb8cc9c25b830ace860e046a03fd969d73e995d43896659f94d3956a17da18451050349e7db6f7881f8c057d3","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a808082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c5a545f2d94e719068d9a43b01879bcb46b56e236dd378dd26ef3b8e4ec8314aa04024b9936960b9b156405e4f3e0b6562518df8778324a927381e380b23f47fb8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c080a0aa406ec7f4901a1777e44b975ff41603b9d46257efdc1ca904a3e7890f2b020ea03bda5c785182cfa2d9f9b7a54f194cd08b9d0f913069a4514ff21e8fa0ef3850","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c080a089fc465c24b4bad898cf900f585eddab6d40189e8d19746da76597f86fbadf51a005732ffa2ebac36646afab9105540b543f74a5c91b441834a2b1930815c2ccc8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c080a0aa406ec7f4901a1777e44b975ff41603b9d46257efdc1ca904a3e7890f2b020ea03bda5c785182cfa2d9f9b7a54f194cd08b9d0f913069a4514ff21e8fa0ef3850","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c080a089fc465c24b4bad898cf900f585eddab6d40189e8d19746da76597f86fbadf51a005732ffa2ebac36646afab9105540b543f74a5c91b441834a2b1930815c2ccc8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88a82013a8082ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09d9a8ee802486b826348a76346987b3e7331d70ef0c0257ff976ceebef1141a2a07d97d14ed877c16bd932f08a67c374e773ee3337d512ff8241c8d78566a04d46","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a024ad1ec1578f51beb2b574507bda7691a486cdbc9c22add01ad4c1f686beb567a048445e0fe8945b8052e5e87139690c0615a11c52503b226cf23610c999eada40","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea608082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a06b382fcbe48de85615ff6e2dcc0c84021beb4abc527878accd36c9c77af84ba8a06a07d34a6896b270538525cb14b0856ceb442714fa85e4c9ee36dedf638935f9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a0ba2586cfb3323fd0f9d7bb38bf9948758a52f156bda66f7100b789760894ad89a01e4bd2ff4eff2c391915141250313ab845401d5e2f71c23691d20a0b3c68cbd9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a06b382fcbe48de85615ff6e2dcc0c84021beb4abc527878accd36c9c77af84ba8a06a07d34a6896b270538525cb14b0856ceb442714fa85e4c9ee36dedf638935f9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c080a0ba2586cfb3323fd0f9d7bb38bf9948758a52f156bda66f7100b789760894ad89a01e4bd2ff4eff2c391915141250313ab845401d5e2f71c23691d20a0b3c68cbd9","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec8080c0"},{"input":"0x02f88c82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0f36ff02ab3e90d2de77cdb24423dc39ca5c959429db62cb5c9ed4f0c9e04703aa0476bf841b0602af44039801d4e68648971f63fc2152002b127be6d914d4fc5ca","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84982013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88d82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a08267ae8838a8a5d9c2a761c182b5759184b7672b761278d499c1514fb6e8a495a023aa268f67da7728767e114fdec4d141bf649e0ad931117b5b325834dbf72803","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"0\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84a82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec80a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec6480c080a011ec4af7fc663080460b70ae8829f47e9cfa1814c616750d359459cbbba55563a0446e4ec9ea504d13dcbef44238e442caad366dbae1ae9408d39c6d902a5577b0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec6480c001a0b80bc30bef46b3f824d1460685db875ff070f7798c3148c1fc49c01d6acc550ca0437efe7721563800e6a56ac54877a72c7860cd5e17ef4675afe989822ae87759","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86282013a8080808094ff000000000000000000000000000000000003ec6480c080a011ec4af7fc663080460b70ae8829f47e9cfa1814c616750d359459cbbba55563a0446e4ec9ea504d13dcbef44238e442caad366dbae1ae9408d39c6d902a5577b0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02df82013a8080808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86382013a81c880808094ff000000000000000000000000000000000003ec6480c001a0b80bc30bef46b3f824d1460685db875ff070f7798c3148c1fc49c01d6acc550ca0437efe7721563800e6a56ac54877a72c7860cd5e17ef4675afe989822ae87759","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e082013a81c880808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88682013a8080808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a06ab9d5988105d28dd090e509c8caabaa7773fc08ec5ef3dfeae532e01938ff69a078bca296df26dd2497a49110e138a49a67a6e232a35524b041d04a10fc583651","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84382013a8080808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88782013a81c880808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a031d51b866a02a9966250d312ed6cb4e083f9131ad8f6bb5814074375093d7536a03f8f819c4011dd54348930b6f98f365de8060b487ada38a62a5617aab6cc6e09","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84482013a81c880808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec6480c001a05bda5ad44c8f9a7516226488cf2d4f53188b40352f35ea7cece8076acda26dbba015373b3b78c88b74c7cca32fd02696a248bb9bea22a09c7a4a17b9e3b629b896","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec6480c080a00d92624cc3335c903077e318204929b4a8c9cd96d94690b0191f8a3bb24e937aa02f1d0315ececf46900154791a732eb8fee9efd0dc998a4e6b892d07ad657a815","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a808082ea608094ff000000000000000000000000000000000003ec6480c001a05bda5ad44c8f9a7516226488cf2d4f53188b40352f35ea7cece8076acda26dbba015373b3b78c88b74c7cca32fd02696a248bb9bea22a09c7a4a17b9e3b629b896","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a808082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c88082ea608094ff000000000000000000000000000000000003ec6480c080a00d92624cc3335c903077e318204929b4a8c9cd96d94690b0191f8a3bb24e937aa02f1d0315ececf46900154791a732eb8fee9efd0dc998a4e6b892d07ad657a815","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c88082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a808082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0def168136c0532ec148a9e200e3cc1b22f90c7bbc5d9ef25ac0c5d342e8f3784a022f94642dfc81ba321b3e09879888332fa7c25b623bead7686e3e493c0911b55","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a808082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c88082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0626f43b80260f84cde2c67538c5cfbd328ce85b0f934e8568769e51709b100a7a0283fff5dbfde72b72e2b74c464b1add985d72750be3f4e16ae8ffb4747a40ff2","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c88082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec6480c080a051b109080002dab4aae47139eb92ddea8951ef5ac6dfc3d7fa07621047dbc680a0334aa47a2888a6cc52b8cf3c3635192b66c692416e954822c1c93c3896ff1ead","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec6480c080a009e179e3bad2da6fb5e205e52fd8d1c462007162aabde5a4d6b052dd4fc4f23ca063922c31438835adf2e4424e2e7d5d2702ec65de2e24a72b491ff0004a53865d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a8082ea60808094ff000000000000000000000000000000000003ec6480c080a051b109080002dab4aae47139eb92ddea8951ef5ac6dfc3d7fa07621047dbc680a0334aa47a2888a6cc52b8cf3c3635192b66c692416e954822c1c93c3896ff1ead","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a8082ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c882ea60808094ff000000000000000000000000000000000003ec6480c080a009e179e3bad2da6fb5e205e52fd8d1c462007162aabde5a4d6b052dd4fc4f23ca063922c31438835adf2e4424e2e7d5d2702ec65de2e24a72b491ff0004a53865d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c882ea60808094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a8082ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d3bfebc6597304c6a06491f68d2ac149fc233d28e81af48dd5b1f83e6ff951d2a06668da06d86aba341971dabb58016ca7764cd4b4c1634e3f829dcc8ef8bca4f6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a8082ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c882ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0d45b9fd9a2a3fdf79805cf73b70348037cc69927209a5e3728fe62cbe9543f03a02f5f8477666487ee5148a65ce59f400beac7c208369162b2d555411314d358fb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c882ea60808094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c001a02a6a910f7b5f83fda937006021b9c074f4544d5bb37b9b5a1b7045095f461836a038572b25418528bce7e6a3a480cf9fc90a33d9c63b392c2dbc8faf72a1e4ab8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c080a07a6dd661b5da27c809cce22aa186c158fe3b07a484a9395fd9a7a31a2b90636fa02b86f82b661264e27c3fda085b59740d3059335bff91693291afcf93c7ca627c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c001a02a6a910f7b5f83fda937006021b9c074f4544d5bb37b9b5a1b7045095f461836a038572b25418528bce7e6a3a480cf9fc90a33d9c63b392c2dbc8faf72a1e4ab8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c080a07a6dd661b5da27c809cce22aa186c158fe3b07a484a9395fd9a7a31a2b90636fa02b86f82b661264e27c3fda085b59740d3059335bff91693291afcf93c7ca627c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea6082ea608094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a8082ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a08c13c10490bc20cb1e55dc54ececb37a6c9cc8d013dbe513feacbb0416f09feba045c4e038759a0901820091e043db326b1bf9a8a1cd046ac72629969497c6a86f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b904edf8eb9b6beb9cde9e1fae538e12f8d40e9124ace0cba2eee8cbbe77aa10a0788a0bd9a6fb98e7230f5db89be2f5067d1a227ba277b9cb155fb5859c57aae6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea6082ea608094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec6480c080a08d10a7a81c561391fe88bcb2c1dfbf4f7140fb7884fec0558606e76ffc4eaa91a049fa2a95e0f07a4376df9c6f2e1563ad443ce8369d44c6e1ce8ee521805b3623","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c001a00de6dc2841a25e5ea2dc1e054d69638ec519a9953666930060797cd110cde122a07fd1dcb6319eca7c681cef006efb3f7dcd74ff98a79ce05917d5d1fa7a175b6f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86482013a80808082ea6094ff000000000000000000000000000000000003ec6480c080a08d10a7a81c561391fe88bcb2c1dfbf4f7140fb7884fec0558606e76ffc4eaa91a049fa2a95e0f07a4376df9c6f2e1563ad443ce8369d44c6e1ce8ee521805b3623","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e182013a80808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86582013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c001a00de6dc2841a25e5ea2dc1e054d69638ec519a9953666930060797cd110cde122a07fd1dcb6319eca7c681cef006efb3f7dcd74ff98a79ce05917d5d1fa7a175b6f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e282013a81c8808082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88882013a80808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a04c43dab94dd746973a1f7f051cc520cc01e93e9c6c55147cef34e5fdc0b182a2a06d148cc6ec017f9aeb6442a17d72e388ffc835950e19abd0c06057520f893542","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84582013a80808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88982013a81c8808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a025b50c1db31c0ae7aaa73374659201b54b71488efecbb6985dc50015abde7e36a04dd8cf68920de7232ab8d1fb28ab94ac05466c1f9d9a3a658f2054fce7868e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84682013a81c8808082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c080a0415ad0a93225eaec617206ec835e362d5e75fd0e1903747c1806270ec2684c7da0487ec1479cdb2affa891ff56413818ec169651c906ab932594b6e5bbb79d4998","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0a46ac278c400ef099ad23ac4ccb066a37db8bb5c4d65e0a347152a499ae9eb92a07505f9c67f0897cbe6f848c9a2164c3c234dab2fea7a4dd6f4436be34080e2ff","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c080a0415ad0a93225eaec617206ec835e362d5e75fd0e1903747c1806270ec2684c7da0487ec1479cdb2affa891ff56413818ec169651c906ab932594b6e5bbb79d4998","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a808082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0a46ac278c400ef099ad23ac4ccb066a37db8bb5c4d65e0a347152a499ae9eb92a07505f9c67f0897cbe6f848c9a2164c3c234dab2fea7a4dd6f4436be34080e2ff","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a808082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0a43aba5078d2da3ecc1ec0c67191f8cf58f29f5b4db7f8d4765ea691ddbd4195a0110e568c803db5ea587b406f452cf49ddf6b6f24d41207973d6c785ffaed1454","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a808082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a00caeadf2fcba95f0deab5ee4899348ecac4a18eeb09317d6f8156b891626d219a0549c5376aba320889c2f7b61fd4a51aec5f9a1d9ed9b26cef0a3bee52fac4989","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c001a07b5568d8a3ec3c7e126f570955db304e31d3f3d7b0c4fd103b6d064a2f6f5e23a030a1b17f299352ae193b8dbce2adda473ccb04e00670f416877762971697606f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c080a07bb69d01062f9d6ecb011ad344bbe08d4eca2f6b192dde45015def4c2e6096e0a03a3df52d753e3293d2fd544f72e62ceae00ea6dcab7229685d7b1873d873d203","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86682013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c001a07b5568d8a3ec3c7e126f570955db304e31d3f3d7b0c4fd103b6d064a2f6f5e23a030a1b17f299352ae193b8dbce2adda473ccb04e00670f416877762971697606f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e382013a8082ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86782013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c080a07bb69d01062f9d6ecb011ad344bbe08d4eca2f6b192dde45015def4c2e6096e0a03a3df52d753e3293d2fd544f72e62ceae00ea6dcab7229685d7b1873d873d203","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e482013a81c882ea608082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88a82013a8082ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0621255015626b35acf19629ce318999336441537920f9f3ff1bfd44e54d8abd3a03b3426f8fa963debdfa6b44561772bdebc9524c7f63abd0d947b678f5e966502","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84782013a8082ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88b82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0b73c3ba53fc5a0f7fab636cc2b826c3873cda5d0be9dd2100fdceae7899f3310a0491905f676063924cf847fdf2e488be4606ce351748e5c88d49ed50c8d595c94","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84882013a81c882ea608082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0e60702e3f5c5f56e3d1bc2907015ec889d0557ea14e81f137056471fef0fdb9da066e601e6e55c2e37e2042401b352e81841d492d0fe4f05bfe81bba29c9e6ce1f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a085a947fb201d0b50272e7bb7a056adc9ee6f5904634ed91dbde0d650641b7de3a03635c731769302e955d41f794a63262d5d4d37d117c9db89a6b6bce927b71f42","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86882013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a0e60702e3f5c5f56e3d1bc2907015ec889d0557ea14e81f137056471fef0fdb9da066e601e6e55c2e37e2042401b352e81841d492d0fe4f05bfe81bba29c9e6ce1f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e582013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f86982013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c001a085a947fb201d0b50272e7bb7a056adc9ee6f5904634ed91dbde0d650641b7de3a03635c731769302e955d41f794a63262d5d4d37d117c9db89a6b6bce927b71f42","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e682013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec6480c0"},{"input":"0x02f88c82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0d67e28d31489af5129c4832af814a01e0baa5e5ba6245fe2d3304693ceea48e0a03bc06f1c6dd01a14826c67aa35258c0bbf7c516a9bb21e9190eaa8d3768f49bb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84982013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88d82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0a5368984aca4bc1e3d7ebc7ae4ead5e09ffd3b4b4712d039c19fdac948e5952ea065953ace0a29210440d6a0f05d6b43f482950b463b3be6b23fc63452c94b9446","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"100\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84a82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec64a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86a82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a086da25ab078729b08cf48da02eb1c1e05fe0f4e5d7b332262b68f4db3dc9b72fa04102c03c7d9f11a6fdb77d6a36d3f07e09b1ceaab0bf4ef1fdc604bcd726f83b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e782013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86b82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0cde92f395919b3205b4260867b11597f9ecf363bc1be9bbd8b5400d3381d64b3a01b9555cfa22ee8615c3033235ebad605d0bef616d08876de26719866fcc4d41e","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e882013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86a82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a086da25ab078729b08cf48da02eb1c1e05fe0f4e5d7b332262b68f4db3dc9b72fa04102c03c7d9f11a6fdb77d6a36d3f07e09b1ceaab0bf4ef1fdc604bcd726f83b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e782013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86b82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0cde92f395919b3205b4260867b11597f9ecf363bc1be9bbd8b5400d3381d64b3a01b9555cfa22ee8615c3033235ebad605d0bef616d08876de26719866fcc4d41e","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02e882013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f88e82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a03dd64e48a1ae228665b3f180367997ee96bc60ee226615c900e3d86634044328a00f6cdb24633e75fa65f6b93fce9b084c1f30dd03dde97d01f25c6f10f34d5d9d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84b82013a8080808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f88f82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a07475efeb8dd5bf4ba7efb31ab67a9077401ed71f4e8dd13e7058ce5cfeb5a0f2a01046e93a5258bf320bc392173a49b6fef15976be4c1210f2e367af223ad8c026","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84c82013a81c880808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0ca84441c7ba097a7afa5ef9ad7ef70ba58ddfffc06c5d015b5c8553f1632d103a057fee6d92055c9c031a1efa667f3ee554804c4f34a195b6dfc781e1592c20444","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a04055dfcd6e0b7264d3474ba13f76659384e5f365ebc6ba271641481b12bf410ca01ef7d04dc33fdf0c3137e31d8c822ad68bbd4f89ada52db9705bb66813d11583","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0ca84441c7ba097a7afa5ef9ad7ef70ba58ddfffc06c5d015b5c8553f1632d103a057fee6d92055c9c031a1efa667f3ee554804c4f34a195b6dfc781e1592c20444","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a04055dfcd6e0b7264d3474ba13f76659384e5f365ebc6ba271641481b12bf410ca01ef7d04dc33fdf0c3137e31d8c822ad68bbd4f89ada52db9705bb66813d11583","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a02080212bb64a798e1e138e4991ab830cf04d37ffeedf6fde7eba0eb7d972b350a02aff43f9e5ca8d6cea6e918391188fa37bdb91b864eadec705f7c69c4a61bc5a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a808082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0e41c052d72950a563b8ed7fb15855beabea43ff5b038bd6a3ccc6416e3498619a0568bbd7cbff31a47e1d0b9712f382c52e74b7b28cbcb8458974d82a8d54ddc57","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c88082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a057c342304f133ff8832d3d16a43571afe905dc9b10afc24c6e99225cca6d8817a00e2155d1904751ce0d2ba01e6475aeae254c02966773f5bc7650e37252a01a92","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0fc2a550a7798085cae28028abbe4829be29e5f3a40af221086831d0e17ca3c83a01ce21f5934b9ca566958e09e89c99fd9ed2dc4acae209a6fb81fd3a6c9879a99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a057c342304f133ff8832d3d16a43571afe905dc9b10afc24c6e99225cca6d8817a00e2155d1904751ce0d2ba01e6475aeae254c02966773f5bc7650e37252a01a92","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0fc2a550a7798085cae28028abbe4829be29e5f3a40af221086831d0e17ca3c83a01ce21f5934b9ca566958e09e89c99fd9ed2dc4acae209a6fb81fd3a6c9879a99","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0fa33b63666310ca1c72fc5d82639c5b8e2a7638910be7bee23ada9f139c6b891a02012cad8e991beea7dcf0b6e9346b0228699698e183e2fadfc5b9b880601af9b","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a8082ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0bc6ae4e92e7a20d5ff61258653dffda636cee0fd97dd156eac7a1f231f1f2785a0323055e0e0bed496b3fec30be292338d0956ecf8baeeb34458230821589aa7fb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c882ea60808094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0bd2889395392859a83a33bfe549c09d172e1f289de29d4bc9d0a3d25ea8aa71ba075fe92140a08d8e680061852438623c9cd10e211955577d1a3b56e49e960e4e7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a05553c929ae32692a9f742371ffcfc8c8d2b77f31a7795460297cb78c29e357e8a043e42ca4ed7eb1b8e3546de2364522735d79a2e2ff5d16f7f96d165c5815c80c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0bd2889395392859a83a33bfe549c09d172e1f289de29d4bc9d0a3d25ea8aa71ba075fe92140a08d8e680061852438623c9cd10e211955577d1a3b56e49e960e4e7","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a05553c929ae32692a9f742371ffcfc8c8d2b77f31a7795460297cb78c29e357e8a043e42ca4ed7eb1b8e3546de2364522735d79a2e2ff5d16f7f96d165c5815c80c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a055f63a6bef8e23dc437ff4ac9349a59fcde2f72d1879de50b0d3686ff648749da04cf8034df06cf6f15f31bb55979b40eeacbd28fb1d745e608acdc088e22beb66","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a8082ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c4a0253448dad999692c1bf3cfb5de9e95a2e96da4e1f64133ada452a825fe9aa0757b576ceb7a2c494819960ac59e9d3a4e3da384f23c0e88ada758dc265eae94","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":0,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c882ea6082ea608094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86c82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a02632c4d8a443afb8d39f91d036fd4915ca3ad2f253b8f93211b4b3ee15566519a009bdc00c8eaaf22f3d7d04b53dbc777fd027a780fb4ddaf01002724ddf2879dd","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a08bda02c15ca37d35d9ad2e2f7731d24dd039f5c6c6f7eaad739daadac6db33e5a044c01e493e10929e4021c69d9df886b211eb349a865df9f0796846ad1cdf23e8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86c82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a02632c4d8a443afb8d39f91d036fd4915ca3ad2f253b8f93211b4b3ee15566519a009bdc00c8eaaf22f3d7d04b53dbc777fd027a780fb4ddaf01002724ddf2879dd","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02e982013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86d82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a08bda02c15ca37d35d9ad2e2f7731d24dd039f5c6c6f7eaad739daadac6db33e5a044c01e493e10929e4021c69d9df886b211eb349a865df9f0796846ad1cdf23e8","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ea82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89082013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0ed0db75f41b2b8b89768ce5ad08716aff149dc1d5a2e593140d8964eb2da3229a02e5248cca9b5af340d73271cad4d690f7efa11c9278824aca528eb15d28aec4d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84d82013a80808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89182013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a07108fbbabc45826dbdc8e4cf831240fb39ead7bd4b8ec5d8de64d04e2885e554a04dae4fb4bdbabb9d8f923d579e75ee980da1b4fac5773ec68f395af240f037f0","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84e82013a81c8808082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0130b6723050095faa2e7abc69c2f785e73d333c65fae6cf2835518f970c627d5a00b90bd4f2ded1da0163ab5e81ad76d51aef005d663137347fc550313e1c8b6fc","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0993a50431e82d10d632466d45f8aaffea9a56efa59d529dfd497d3c2a06aabeba0070d3132c6ce1e4ff70b0721d1f4c03ab566b8e2af29d33148033fb3009dc29d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0130b6723050095faa2e7abc69c2f785e73d333c65fae6cf2835518f970c627d5a00b90bd4f2ded1da0163ab5e81ad76d51aef005d663137347fc550313e1c8b6fc","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0993a50431e82d10d632466d45f8aaffea9a56efa59d529dfd497d3c2a06aabeba0070d3132c6ce1e4ff70b0721d1f4c03ab566b8e2af29d33148033fb3009dc29d","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a09c9d3b0d7b58bfe81a6881b9db184e0ade03c1ad11aa8f1566e2f24f50f85525a06c10cf91f4dbc24d0f78ef09a8e2310d349a034cec7e86e807d7a48ea26161e1","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a808082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a0f8423b51e513618c6a4bdd2696479d91c760e11ea24657dd27fa6eb9b7da8c0ea07e9456113fb034718d1b4f4e09ade1ce78251a8c86f298b152850bc5925156cb","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"0\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c88082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f86e82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0d09b373d45c1bfc1c5d9b5198e69f974d4df456245e2f7a5edd486f3dd2795a9a011396197a670e7b0c4613b7ebf8aee53382930c7bd25c35dda15acae78ec0e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0131f5af3ece9a0b723d0c812dbcfc6cb458acf5e0846cc506215fc04d6af66d5a078d0bf7a40cc1ddcebbc4e86fb9a04bfc94f3da94b4a74476883b7b1729f8a44","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86e82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0d09b373d45c1bfc1c5d9b5198e69f974d4df456245e2f7a5edd486f3dd2795a9a011396197a670e7b0c4613b7ebf8aee53382930c7bd25c35dda15acae78ec0e2c","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02eb82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f86f82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c080a0131f5af3ece9a0b723d0c812dbcfc6cb458acf5e0846cc506215fc04d6af66d5a078d0bf7a40cc1ddcebbc4e86fb9a04bfc94f3da94b4a74476883b7b1729f8a44","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ec82013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89282013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c286f4ee350eab70273cf9a952537534446a0f39e9bfea7340eabc04396a0e3da01e1302ae987a69836ec2c9266e6fe623db5fcdc566e37084c0c57630c4de8ee6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f84f82013a8082ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89382013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c080a09dee3fa88e365133a18035618af718a045e1a957f10f50c632f23923fd337b9ba06bbbd59489849803f8c61138932ac1a8361edb4c80789d030542829c0a2b5b7f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"0\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85082013a81c882ea608082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f87082013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0c1cb1e2b41e48fecd59d72039147c76993653f061f9ea156b53c377673eef7f1a01822506f755206b60209a12ed3c84446f4fcb4ad602fa7ab7ee4ff2acde19ed6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ed82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87182013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a09817043ad22797d2f26ca46697db5f586c38336a171dce2d22d659889e9e9eb5a0369a5d6169586d9c831b6e017aa29fd49eac0636a136bfa5bafb95390fa95b8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":null,\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ee82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87082013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a0c1cb1e2b41e48fecd59d72039147c76993653f061f9ea156b53c377673eef7f1a01822506f755206b60209a12ed3c84446f4fcb4ad602fa7ab7ee4ff2acde19ed6","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02ed82013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f87182013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c001a09817043ad22797d2f26ca46697db5f586c38336a171dce2d22d659889e9e9eb5a0369a5d6169586d9c831b6e017aa29fd49eac0636a136bfa5bafb95390fa95b8f","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02ee82013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a764000080c0"},{"input":"0x02f89482013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a039357ad40087d17551ca2b94723f0394185a993671db02172a7de70c24054852a046c84070dfadd244b358690e5b89c75f3988b21b6614e6e3af2f8ca302d6c42a","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":0,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85182013a8082ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"},{"input":"0x02f89582013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c001a0c991c81705a4c53a9255e72beb8243638c68f10c63b082755972bbbe15245d12a014f6852ae34c92882559e6810d4372109930a23b522368fdef2c85ce04e27839","output":"{\"to\":\"0xff000000000000000000000000000000000003EC\",\"value\":\"1000000000000000000\",\"gasLimit\":60000,\"maxFeePerGas\":\"60000\",\"maxPriorityFeePerGas\":\"60000\",\"data\":\"0xf8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064\",\"nonce\":200,\"type\":2,\"chainId\":314}","nosigTx":"0x02f85282013a81c882ea6082ea6082ea6094ff000000000000000000000000000000000003ec880de0b6b3a7640000a4f8b2cb4f000000000000000000000000ff00000000000000000000000000000000000064c0"}]` - - testcases := []struct { - Input EthBytes `json:"input"` - Output string `json:"output"` - NosigTx string `json:"nosigTx"` - }{} - - err := json.Unmarshal([]byte(tcstr), &testcases) - if err != nil { - return nil, err - } - - res := []TxTestcase{} - for _, tc := range testcases { - tx := EthTxArgs{} - err := json.Unmarshal([]byte(tc.Output), &tx) - if err != nil { - return nil, err - } - res = append(res, TxTestcase{ - Input: tc.Input, - Output: tx, - TxJSON: tc.Output, - NosigTx: tc.NosigTx, - }) - } - - return res, err -} diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 0e75ea64316..fc69ab361a2 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,15 +7,6 @@ import ( "encoding/json" "time" - "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -30,19 +21,25 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" - apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/journal/alerting" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" "github.com/filecoin-project/lotus/storage/pipeline/sealiface" "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/rlp_test.go b/api/rlp_test.go deleted file mode 100644 index a2422564b26..00000000000 --- a/api/rlp_test.go +++ /dev/null @@ -1,175 +0,0 @@ -package api - -import ( - "encoding/hex" - "fmt" - "strings" - "testing" - - "github.com/stretchr/testify/require" -) - -func TestEncode(t *testing.T) { - testcases := []TestCase{ - {[]byte(""), mustDecodeHex("0x80")}, - {mustDecodeHex("0x01"), mustDecodeHex("0x01")}, - {mustDecodeHex("0xaa"), mustDecodeHex("0x81aa")}, - {mustDecodeHex("0x0402"), mustDecodeHex("0x820402")}, - { - []interface{}{}, - mustDecodeHex("0xc0"), - }, - { - mustDecodeHex("0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), - mustDecodeHex("0xb83cabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), - }, - { - mustDecodeHex("0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), - mustDecodeHex("0xb8aaabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"), - }, - { - []interface{}{ - mustDecodeHex("0xaaaa"), - mustDecodeHex("0xbbbb"), - mustDecodeHex("0xcccc"), - mustDecodeHex("0xdddd"), - }, - mustDecodeHex("0xcc82aaaa82bbbb82cccc82dddd"), - }, - { - []interface{}{ - mustDecodeHex("0xaaaaaaaaaaaaaaaaaaaa"), - mustDecodeHex("0xbbbbbbbbbbbbbbbbbbbb"), - []interface{}{ - mustDecodeHex("0xc1c1c1c1c1c1c1c1c1c1"), - mustDecodeHex("0xc2c2c2c2c2c2c2c2c2c2"), - mustDecodeHex("0xc3c3c3c3c3c3c3c3c3c3"), - }, - mustDecodeHex("0xdddddddddddddddddddd"), - mustDecodeHex("0xeeeeeeeeeeeeeeeeeeee"), - mustDecodeHex("0xffffffffffffffffffff"), - }, - mustDecodeHex("0xf8598aaaaaaaaaaaaaaaaaaaaa8abbbbbbbbbbbbbbbbbbbbe18ac1c1c1c1c1c1c1c1c1c18ac2c2c2c2c2c2c2c2c2c28ac3c3c3c3c3c3c3c3c3c38adddddddddddddddddddd8aeeeeeeeeeeeeeeeeeeee8affffffffffffffffffff"), - }, - } - - for _, tc := range testcases { - result, err := EncodeRLP(tc.Input) - require.Nil(t, err) - - require.Equal(t, tc.Output.([]byte), result) - } -} - -func TestDecodeString(t *testing.T) { - testcases := []TestCase{ - {"0x00", "0x00"}, - {"0x80", "0x"}, - {"0x0f", "0x0f"}, - {"0x81aa", "0xaa"}, - {"0x820400", "0x0400"}, - {"0xb83cabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd", - "0xabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcdabcd"}, - } - - for _, tc := range testcases { - input, err := hex.DecodeString(strings.Replace(tc.Input.(string), "0x", "", -1)) - require.Nil(t, err) - - output, err := hex.DecodeString(strings.Replace(tc.Output.(string), "0x", "", -1)) - require.Nil(t, err) - - result, err := DecodeRLP(input) - require.Nil(t, err) - require.Equal(t, output, result.([]byte)) - } -} - -func mustDecodeHex(s string) []byte { - d, err := hex.DecodeString(strings.Replace(s, "0x", "", -1)) - if err != nil { - panic(fmt.Errorf("err must be nil: %w", err)) - } - return d -} - -func TestDecodeList(t *testing.T) { - testcases := []TestCase{ - {"0xc0", []interface{}{}}, - {"0xc100", []interface{}{[]byte{0}}}, - {"0xc3000102", []interface{}{[]byte{0}, []byte{1}, []byte{2}}}, - {"0xc4000181aa", []interface{}{[]byte{0}, []byte{1}, []byte{0xaa}}}, - {"0xc6000181aa81ff", []interface{}{[]byte{0}, []byte{1}, []byte{0xaa}, []byte{0xff}}}, - {"0xf8428aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd8aabcdabcdabcdabcdabcd", - []interface{}{ - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - mustDecodeHex("0xabcdabcdabcdabcdabcd"), - }, - }, - {"0xf1030185012a05f2008504a817c800825208942b87d1cb599bc2a606db9a0169fcec96af04ad3a880de0b6b3a764000080c0", - []interface{}{ - []byte{3}, - []byte{1}, - mustDecodeHex("0x012a05f200"), - mustDecodeHex("0x04a817c800"), - mustDecodeHex("0x5208"), - mustDecodeHex("0x2b87d1CB599Bc2a606Db9A0169fcEc96Af04ad3a"), - mustDecodeHex("0x0de0b6b3a7640000"), - []byte{}, - []interface{}{}, - }}, - } - - for _, tc := range testcases { - input, err := hex.DecodeString(strings.Replace(tc.Input.(string), "0x", "", -1)) - require.Nil(t, err) - - result, err := DecodeRLP(input) - require.Nil(t, err) - - fmt.Println(result) - r := result.([]interface{}) - require.Equal(t, len(tc.Output.([]interface{})), len(r)) - - for i, v := range r { - require.Equal(t, tc.Output.([]interface{})[i], v) - } - } -} - -func TestDecodeEncodeTx(t *testing.T) { - testcases := [][]byte{ - mustDecodeHex("0xdc82013a0185012a05f2008504a817c8008080872386f26fc1000000c0"), - mustDecodeHex("0xf85f82013a0185012a05f2008504a817c8008080872386f26fc1000000c001a027fa36fb9623e4d71fcdd7f7dce71eb814c9560dcf3908c1719386e2efd122fba05fb4e4227174eeb0ba84747a4fb883c8d4e0fdb129c4b1f42e90282c41480234"), - mustDecodeHex("0xf9061c82013a0185012a05f2008504a817c8008080872386f26fc10000b905bb608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610556806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637bd703e81461004657806390b98a1114610076578063f8b2cb4f146100a6575b600080fd5b610060600480360381019061005b919061030a565b6100d6565b60405161006d9190610350565b60405180910390f35b610090600480360381019061008b9190610397565b6100f4565b60405161009d91906103f2565b60405180910390f35b6100c060048036038101906100bb919061030a565b61025f565b6040516100cd9190610350565b60405180910390f35b600060026100e38361025f565b6100ed919061043c565b9050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156101455760009050610259565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101939190610496565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101e891906104ca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161024c9190610350565b60405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d7826102ac565b9050919050565b6102e7816102cc565b81146102f257600080fd5b50565b600081359050610304816102de565b92915050565b6000602082840312156103205761031f6102a7565b5b600061032e848285016102f5565b91505092915050565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b61037481610337565b811461037f57600080fd5b50565b6000813590506103918161036b565b92915050565b600080604083850312156103ae576103ad6102a7565b5b60006103bc858286016102f5565b92505060206103cd85828601610382565b9150509250929050565b60008115159050919050565b6103ec816103d7565b82525050565b600060208201905061040760008301846103e3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061044782610337565b915061045283610337565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561048b5761048a61040d565b5b828202905092915050565b60006104a182610337565b91506104ac83610337565b9250828210156104bf576104be61040d565b5b828203905092915050565b60006104d582610337565b91506104e083610337565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156105155761051461040d565b5b82820190509291505056fea26469706673582212208e5b4b874c839967f88008ed2fa42d6c2d9c9b0ae05d1d2c61faa7d229c134e664736f6c634300080d0033c080a0c4e9477f57c6848b2f1ea73a14809c1f44529d20763c947f3ac8ffd3d1629d93a011485a215457579bb13ac7b53bb9d6804763ae6fe5ce8ddd41642cea55c9a09a"), - mustDecodeHex("0xf9063082013a0185012a05f2008504a817c8008094025b594a4f1c4888cafcfaf2bb24ed95507749e0872386f26fc10000b905bb608060405234801561001057600080fd5b506127106000803273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610556806100656000396000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c80637bd703e81461004657806390b98a1114610076578063f8b2cb4f146100a6575b600080fd5b610060600480360381019061005b919061030a565b6100d6565b60405161006d9190610350565b60405180910390f35b610090600480360381019061008b9190610397565b6100f4565b60405161009d91906103f2565b60405180910390f35b6100c060048036038101906100bb919061030a565b61025f565b6040516100cd9190610350565b60405180910390f35b600060026100e38361025f565b6100ed919061043c565b9050919050565b6000816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410156101455760009050610259565b816000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101939190610496565b92505081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546101e891906104ca565b925050819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161024c9190610350565b60405180910390a3600190505b92915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006102d7826102ac565b9050919050565b6102e7816102cc565b81146102f257600080fd5b50565b600081359050610304816102de565b92915050565b6000602082840312156103205761031f6102a7565b5b600061032e848285016102f5565b91505092915050565b6000819050919050565b61034a81610337565b82525050565b60006020820190506103656000830184610341565b92915050565b61037481610337565b811461037f57600080fd5b50565b6000813590506103918161036b565b92915050565b600080604083850312156103ae576103ad6102a7565b5b60006103bc858286016102f5565b92505060206103cd85828601610382565b9150509250929050565b60008115159050919050565b6103ec816103d7565b82525050565b600060208201905061040760008301846103e3565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061044782610337565b915061045283610337565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561048b5761048a61040d565b5b828202905092915050565b60006104a182610337565b91506104ac83610337565b9250828210156104bf576104be61040d565b5b828203905092915050565b60006104d582610337565b91506104e083610337565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156105155761051461040d565b5b82820190509291505056fea26469706673582212208e5b4b874c839967f88008ed2fa42d6c2d9c9b0ae05d1d2c61faa7d229c134e664736f6c634300080d0033c080a0fe38720928596f9e9dfbf891d00311638efce3713f03cdd67b212ecbbcf18f29a05993e656c0b35b8a580da6aff7c89b3d3e8b1c6f83a7ce09473c0699a8500b9c"), - } - - for _, tc := range testcases { - decoded, err := DecodeRLP(tc) - require.Nil(t, err) - - encoded, err := EncodeRLP(decoded) - require.Nil(t, err) - require.Equal(t, tc, encoded) - } -} - -func TestDecodeError(t *testing.T) { - testcases := [][]byte{ - mustDecodeHex("0xdc82013a0185012a05f2008504a817c8008080872386f26fc1000000"), - mustDecodeHex("0xdc013a01012a05f2008504a817c8008080872386f26fc1000000"), - mustDecodeHex("0xdc82013a0185012a05f28504a817c08080872386f26fc1000000"), - mustDecodeHex("0xdc82013a0185012a05f504a817c080872386ffc1000000"), - mustDecodeHex("0x013a018505f2008504a817c8008080872386f26fc1000000"), - } - - for _, tc := range testcases { - _, err := DecodeRLP(tc) - require.NotNil(t, err, hex.EncodeToString(tc)) - } -} diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 57cf730baaa..3d4744fcef9 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,11 +5,6 @@ package v0api import ( "context" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" - "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -21,7 +16,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -29,6 +23,10 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/chain/consensus/compute_state.go b/chain/consensus/compute_state.go index 041b6fb03a4..75a40fc7612 100644 --- a/chain/consensus/compute_state.go +++ b/chain/consensus/compute_state.go @@ -24,7 +24,6 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/cron" "github.com/filecoin-project/lotus/chain/actors/builtin/reward" diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 30cdaabd9e8..5fbf79c8f71 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -3,7 +3,6 @@ package messagepool import ( "bytes" "context" - "encoding/hex" "errors" "fmt" "math" @@ -39,7 +38,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/journal" - "github.com/filecoin-project/lotus/lib/sigs" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/modules/dtypes" ) @@ -771,16 +769,6 @@ func sigCacheKey(m *types.SignedMessage) (string, error) { return string(hashCache[:]), nil case crypto.SigTypeSecp256k1: return string(m.Cid().Bytes()), nil - case crypto.SigTypeDelegated: - txArgs, err := api.NewEthTxArgsFromMessage(&m.Message) - if err != nil { - return "", err - } - msg, err := txArgs.HashedOriginalRlpMsg() - if err != nil { - return "", err - } - return hex.EncodeToString(msg), nil default: return "", xerrors.Errorf("unrecognized signature type: %d", m.Signature.Type) } @@ -798,22 +786,6 @@ func (mp *MessagePool) VerifyMsgSig(m *types.SignedMessage) error { return nil } - if m.Signature.Type == crypto.SigTypeDelegated { - txArgs, err := api.NewEthTxArgsFromMessage(&m.Message) - if err != nil { - return err - } - msg, err := txArgs.OriginalRlpMsg() - if err != nil { - return err - } - if err := sigs.Verify(&m.Signature, m.Message.From, msg); err != nil { - return err - } - } else if err := sigs.Verify(&m.Signature, m.Message.From, m.Message.Cid().Bytes()); err != nil { - return err - } - mp.sigValCache.Add(sck, struct{}{}) return nil diff --git a/chain/messagepool/selection.go b/chain/messagepool/selection.go index bd504412863..e84962869c4 100644 --- a/chain/messagepool/selection.go +++ b/chain/messagepool/selection.go @@ -97,7 +97,7 @@ func (sm *selectedMessages) tryToAdd(mc *msgChain) bool { sm.msgs = append(sm.msgs, mc.msgs...) sm.blsLimit -= l sm.gasLimit -= mc.gasLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { + } else if mc.sigType == crypto.SigTypeSecp256k1 { if sm.secpLimit < l { return false } @@ -123,7 +123,7 @@ func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, base if mc.sigType == crypto.SigTypeBLS { smMsgLimit = sm.blsLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { + } else if mc.sigType == crypto.SigTypeSecp256k1 { smMsgLimit = sm.secpLimit } else { return false @@ -174,7 +174,7 @@ func (sm *selectedMessages) tryToAddWithDeps(mc *msgChain, mp *MessagePool, base if mc.sigType == crypto.SigTypeBLS { sm.blsLimit -= chainMsgLimit - } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { + } else if mc.sigType == crypto.SigTypeSecp256k1 { sm.secpLimit -= chainMsgLimit } @@ -187,7 +187,7 @@ func (sm *selectedMessages) trimChain(mc *msgChain, mp *MessagePool, baseFee typ if msgLimit > sm.blsLimit { msgLimit = sm.blsLimit } - } else if mc.sigType == crypto.SigTypeSecp256k1 || mc.sigType == crypto.SigTypeDelegated { + } else if mc.sigType == crypto.SigTypeSecp256k1 { if msgLimit > sm.secpLimit { msgLimit = sm.secpLimit } diff --git a/chain/messagepool/selection_test.go b/chain/messagepool/selection_test.go index c3a5c6d6f3a..a5b2f326602 100644 --- a/chain/messagepool/selection_test.go +++ b/chain/messagepool/selection_test.go @@ -31,7 +31,6 @@ import ( "github.com/filecoin-project/lotus/chain/types/mock" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/chain/sync.go b/chain/sync.go index ba28d3e79a9..634313855d7 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -1145,7 +1145,7 @@ func persistMessages(ctx context.Context, bs bstore.Blockstore, bst *exchange.Co } } for _, m := range bst.Secpk { - if m.Signature.Type != crypto.SigTypeSecp256k1 && m.Signature.Type != crypto.SigTypeDelegated { + if m.Signature.Type != crypto.SigTypeSecp256k1 { return xerrors.Errorf("unknown signature type on message %s: %q", m.Cid(), m.Signature.Type) } //log.Infof("putting secp256k1 message: %s", m.Cid()) diff --git a/chain/types/keystore.go b/chain/types/keystore.go index 8e8d9192bb2..107c1fbe3ab 100644 --- a/chain/types/keystore.go +++ b/chain/types/keystore.go @@ -39,8 +39,6 @@ func (kt *KeyType) UnmarshalJSON(bb []byte) error { *kt = KTBLS case crypto.SigTypeSecp256k1: *kt = KTSecp256k1 - case crypto.SigTypeDelegated: - *kt = KTDelegated default: return fmt.Errorf("unknown sigtype: %d", bst) } @@ -53,7 +51,6 @@ const ( KTBLS KeyType = "bls" KTSecp256k1 KeyType = "secp256k1" KTSecp256k1Ledger KeyType = "secp256k1-ledger" - KTDelegated KeyType = "delegated" ) // KeyInfo is used for storing keys in KeyStore diff --git a/chain/vectors/gen/main.go b/chain/vectors/gen/main.go index ce9f1baf872..fbc96d2c388 100644 --- a/chain/vectors/gen/main.go +++ b/chain/vectors/gen/main.go @@ -19,7 +19,6 @@ import ( "github.com/filecoin-project/lotus/chain/vectors" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/chain/vm/gas.go b/chain/vm/gas.go index c9007d3f104..ca6e5571aa5 100644 --- a/chain/vm/gas.go +++ b/chain/vm/gas.go @@ -111,7 +111,6 @@ var Prices = map[abi.ChainEpoch]Pricelist{ verifySignature: map[crypto.SigType]int64{ crypto.SigTypeBLS: 16598605, crypto.SigTypeSecp256k1: 1637292, - crypto.SigTypeDelegated: 1637292, }, hashingBase: 31355, diff --git a/chain/wallet/key/key.go b/chain/wallet/key/key.go index cb769ef09bc..66053525b55 100644 --- a/chain/wallet/key/key.go +++ b/chain/wallet/key/key.go @@ -45,7 +45,7 @@ func NewKey(keyinfo types.KeyInfo) (*Key, error) { } switch k.Type { - case types.KTSecp256k1, types.KTDelegated: + case types.KTSecp256k1: k.Address, err = address.NewSecp256k1Address(k.PublicKey) if err != nil { return nil, xerrors.Errorf("converting Secp256k1 to address: %w", err) @@ -68,8 +68,6 @@ func ActSigType(typ types.KeyType) crypto.SigType { return crypto.SigTypeBLS case types.KTSecp256k1: return crypto.SigTypeSecp256k1 - case types.KTDelegated: - return crypto.SigTypeDelegated default: return crypto.SigTypeUnknown } diff --git a/chain/wallet/wallet.go b/chain/wallet/wallet.go index 32a94d3b28d..b88d776b503 100644 --- a/chain/wallet/wallet.go +++ b/chain/wallet/wallet.go @@ -16,8 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet/key" "github.com/filecoin-project/lotus/lib/sigs" - _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" + _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures _ "github.com/filecoin-project/lotus/lib/sigs/secp" // enable secp signatures ) diff --git a/cli/state.go b/cli/state.go index d569a2e4e1d..026775821f6 100644 --- a/cli/state.go +++ b/cli/state.go @@ -1407,7 +1407,7 @@ func codeStr(c cid.Cid) string { } func getMethod(code cid.Cid, method abi.MethodNum) string { - return consensus.NewActorRegistry().Methods[code][method].Name // todo: use remote + return consensus.NewActorRegistry().Methods[code][method].Num // todo: use remote } func toFil(f types.BigInt) types.FIL { diff --git a/cmd/lotus-keygen/main.go b/cmd/lotus-keygen/main.go index 41993a16990..1970d5074ba 100644 --- a/cmd/lotus-keygen/main.go +++ b/cmd/lotus-keygen/main.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) diff --git a/cmd/lotus-shed/msg.go b/cmd/lotus-shed/msg.go index 062e077dfb6..4f8bef0d5a1 100644 --- a/cmd/lotus-shed/msg.go +++ b/cmd/lotus-shed/msg.go @@ -141,7 +141,7 @@ func printMessage(cctx *cli.Context, msg *types.Message) error { return nil } - fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][msg.Method].Name) // todo use remote + fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][msg.Method].Num) // todo use remote p, err := lcli.JsonParams(toact.Code, msg.Method, msg.Params) if err != nil { return err diff --git a/cmd/lotus-wallet/interactive.go b/cmd/lotus-wallet/interactive.go index 96d2ad9f2e0..34837cbd537 100644 --- a/cmd/lotus-wallet/interactive.go +++ b/cmd/lotus-wallet/interactive.go @@ -103,7 +103,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up dest actor: %w", err) } - fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][cmsg.Method].Name) + fmt.Println("Method:", consensus.NewActorRegistry().Methods[toact.Code][cmsg.Method].Num) p, err := lcli.JsonParams(toact.Code, cmsg.Method, cmsg.Params) if err != nil { return err @@ -125,7 +125,7 @@ func (c *InteractiveWallet) WalletSign(ctx context.Context, k address.Address, m return xerrors.Errorf("looking up msig dest actor: %w", err) } - fmt.Println("\tMultiSig Proposal Method:", consensus.NewActorRegistry().Methods[toact.Code][mp.Method].Name) // todo use remote + fmt.Println("\tMultiSig Proposal Method:", consensus.NewActorRegistry().Methods[toact.Code][mp.Method].Num) // todo use remote p, err := lcli.JsonParams(toact.Code, mp.Method, mp.Params) if err != nil { return err diff --git a/conformance/driver.go b/conformance/driver.go index e26651e206e..d158187dc88 100644 --- a/conformance/driver.go +++ b/conformance/driver.go @@ -26,8 +26,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/conformance/chaos" - _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" + _ "github.com/filecoin-project/lotus/lib/sigs/bls" // enable bls signatures _ "github.com/filecoin-project/lotus/lib/sigs/secp" // enable secp signatures "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" ) diff --git a/gateway/node.go b/gateway/node.go index 13ac57c82f7..7e84092e316 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -25,7 +25,6 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/sigs" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" diff --git a/lib/sigs/delegated/init.go b/lib/sigs/delegated/init.go deleted file mode 100644 index de39c5b0cf9..00000000000 --- a/lib/sigs/delegated/init.go +++ /dev/null @@ -1,57 +0,0 @@ -package delegated - -import ( - "fmt" - - "golang.org/x/crypto/sha3" - - "github.com/filecoin-project/go-address" - gocrypto "github.com/filecoin-project/go-crypto" - crypto1 "github.com/filecoin-project/go-state-types/crypto" - - "github.com/filecoin-project/lotus/lib/sigs" -) - -type delegatedSigner struct{} - -func (delegatedSigner) GenPrivate() ([]byte, error) { - priv, err := gocrypto.GenerateKey() - if err != nil { - return nil, err - } - return priv, nil -} - -func (delegatedSigner) ToPublic(pk []byte) ([]byte, error) { - return gocrypto.PublicKey(pk), nil -} - -func (delegatedSigner) Sign(pk []byte, msg []byte) ([]byte, error) { - return nil, fmt.Errorf("not implemented") -} - -func (delegatedSigner) Verify(sig []byte, a address.Address, msg []byte) error { - hasher := sha3.NewLegacyKeccak256() - hasher.Write(msg) - hash := hasher.Sum(nil) - - pubk, err := gocrypto.EcRecover(hash, sig) - if err != nil { - return err - } - - maybeaddr, err := address.NewSecp256k1Address(pubk) - if err != nil { - return err - } - - if maybeaddr != a { - return fmt.Errorf("signature did not match") - } - - return nil -} - -func init() { - sigs.RegisterSignature(crypto1.SigTypeDelegated, delegatedSigner{}) -} diff --git a/lib/sigs/secp/init.go b/lib/sigs/secp/init.go index 395e3a28f24..49d5cef172a 100644 --- a/lib/sigs/secp/init.go +++ b/lib/sigs/secp/init.go @@ -6,7 +6,7 @@ import ( "github.com/minio/blake2b-simd" "github.com/filecoin-project/go-address" - gocrypto "github.com/filecoin-project/go-crypto" + crypto "github.com/filecoin-project/go-crypto" crypto2 "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/lotus/lib/sigs" @@ -15,7 +15,7 @@ import ( type secpSigner struct{} func (secpSigner) GenPrivate() ([]byte, error) { - priv, err := gocrypto.GenerateKey() + priv, err := crypto.GenerateKey() if err != nil { return nil, err } @@ -23,12 +23,12 @@ func (secpSigner) GenPrivate() ([]byte, error) { } func (secpSigner) ToPublic(pk []byte) ([]byte, error) { - return gocrypto.PublicKey(pk), nil + return crypto.PublicKey(pk), nil } func (secpSigner) Sign(pk []byte, msg []byte) ([]byte, error) { b2sum := blake2b.Sum256(msg) - sig, err := gocrypto.Sign(pk, b2sum[:]) + sig, err := crypto.Sign(pk, b2sum[:]) if err != nil { return nil, err } @@ -38,7 +38,7 @@ func (secpSigner) Sign(pk []byte, msg []byte) ([]byte, error) { func (secpSigner) Verify(sig []byte, a address.Address, msg []byte) error { b2sum := blake2b.Sum256(msg) - pubk, err := gocrypto.EcRecover(b2sum[:], sig) + pubk, err := crypto.EcRecover(b2sum[:], sig) if err != nil { return err } diff --git a/node/builder.go b/node/builder.go index 2c08cd9169b..9690b7f7ce7 100644 --- a/node/builder.go +++ b/node/builder.go @@ -30,7 +30,6 @@ import ( "github.com/filecoin-project/lotus/lib/lotuslog" "github.com/filecoin-project/lotus/lib/peermgr" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/markets/storageadapter" "github.com/filecoin-project/lotus/node/config" From fa71ed607bde6bb17fd27b2e4bf2af1c070f3ac5 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 13 Oct 2022 17:07:34 +0200 Subject: [PATCH 012/282] more cleaning --- api/rlp.go | 176 -------------------------------------- chain/stmgr/forks_test.go | 7 +- cmd/lotus-bench/import.go | 1 - 3 files changed, 4 insertions(+), 180 deletions(-) delete mode 100644 api/rlp.go diff --git a/api/rlp.go b/api/rlp.go deleted file mode 100644 index 3de418c3104..00000000000 --- a/api/rlp.go +++ /dev/null @@ -1,176 +0,0 @@ -package api - -import ( - "bytes" - "encoding/binary" - "fmt" - - "golang.org/x/xerrors" -) - -func EncodeRLP(val interface{}) ([]byte, error) { - return encodeRLP(val) -} - -func encodeRLPListItems(list []interface{}) (result []byte, err error) { - res := []byte{} - for _, elem := range list { - encoded, err := encodeRLP(elem) - if err != nil { - return nil, err - } - res = append(res, encoded...) - } - return res, nil -} - -func encodeLength(length int) (lenInBytes []byte, err error) { - if length == 0 { - return nil, fmt.Errorf("cannot encode length: length should be larger than 0") - } - - buf := new(bytes.Buffer) - err = binary.Write(buf, binary.BigEndian, int64(length)) - if err != nil { - return nil, err - } - - firstNonZeroIndex := len(buf.Bytes()) - 1 - for i, b := range buf.Bytes() { - if b != 0 { - firstNonZeroIndex = i - break - } - } - - res := buf.Bytes()[firstNonZeroIndex:] - return res, nil -} - -func encodeRLP(val interface{}) ([]byte, error) { - if data, ok := val.([]byte); ok { - if len(data) == 1 && data[0] <= 0x7f { - return data, nil - } else if len(data) <= 55 { - prefix := byte(0x80 + len(data)) - return append([]byte{prefix}, data...), nil - } else { - lenInBytes, err := encodeLength(len(data)) - if err != nil { - return nil, err - } - prefix := byte(0xb7 + len(lenInBytes)) - return append( - []byte{prefix}, - append(lenInBytes, data...)..., - ), nil - } - } else if data, ok := val.([]interface{}); ok { - encodedList, err := encodeRLPListItems(data) - if err != nil { - return nil, err - } - if len(encodedList) <= 55 { - prefix := byte(0xc0 + len(encodedList)) - return append( - []byte{prefix}, - encodedList..., - ), nil - } - lenInBytes, err := encodeLength(len(encodedList)) - if err != nil { - return nil, err - } - prefix := byte(0xf7 + len(lenInBytes)) - return append( - []byte{prefix}, - append(lenInBytes, encodedList...)..., - ), nil - } - return nil, fmt.Errorf("input data should either be a list or a byte array") -} - -func DecodeRLP(data []byte) (interface{}, error) { - res, consumed, err := decodeRLP(data) - if err != nil { - return nil, err - } - if consumed != len(data) { - return nil, xerrors.Errorf("invalid rlp data: length %d, consumed %d", len(data), consumed) - } - return res, nil -} - -func decodeRLP(data []byte) (res interface{}, consumed int, err error) { - if len(data) == 0 { - return data, 0, xerrors.Errorf("invalid rlp data: data cannot be empty") - } - if data[0] >= 0xf8 { - listLenInBytes := int(data[0]) - 0xf7 - listLen, err := decodeLength(data[1:], listLenInBytes) - if err != nil { - return nil, 0, err - } - if 1+listLenInBytes+listLen > len(data) { - return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list") - } - result, err := decodeListElems(data[1+listLenInBytes:], listLen) - return result, 1 + listLenInBytes + listLen, err - } else if data[0] >= 0xc0 { - length := int(data[0]) - 0xc0 - result, err := decodeListElems(data[1:], length) - return result, 1 + length, err - } else if data[0] >= 0xb8 { - strLenInBytes := int(data[0]) - 0xb7 - strLen, err := decodeLength(data[1:], strLenInBytes) - if err != nil { - return nil, 0, err - } - totalLen := 1 + strLenInBytes + strLen - if totalLen > len(data) { - return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing string") - } - return data[1+strLenInBytes : totalLen], totalLen, nil - } else if data[0] >= 0x80 { - length := int(data[0]) - 0x80 - if 1+length > len(data) { - return nil, 0, xerrors.Errorf("invalid rlp data: out of bound while parsing string") - } - return data[1 : 1+length], 1 + length, nil - } - return []byte{data[0]}, 1, nil -} - -func decodeLength(data []byte, lenInBytes int) (length int, err error) { - if lenInBytes > len(data) || lenInBytes > 8 { - return 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list length") - } - var decodedLength int64 - r := bytes.NewReader(append(make([]byte, 8-lenInBytes), data[:lenInBytes]...)) - if err := binary.Read(r, binary.BigEndian, &decodedLength); err != nil { - return 0, xerrors.Errorf("invalid rlp data: cannot parse string length: %w", err) - } - if lenInBytes+int(decodedLength) > len(data) { - return 0, xerrors.Errorf("invalid rlp data: out of bound while parsing list") - } - return int(decodedLength), nil -} - -func decodeListElems(data []byte, length int) (res []interface{}, err error) { - totalConsumed := 0 - result := []interface{}{} - - // set a limit to make sure it doesn't loop infinitely - for i := 0; totalConsumed < length && i < 5000; i++ { - elem, consumed, err := decodeRLP(data[totalConsumed:]) - if err != nil { - return nil, xerrors.Errorf("invalid rlp data: cannot decode list element: %w", err) - } - totalConsumed += consumed - result = append(result, elem) - } - if totalConsumed != length { - return nil, xerrors.Errorf("invalid rlp data: incorrect list length") - } - return result, nil -} diff --git a/chain/stmgr/forks_test.go b/chain/stmgr/forks_test.go index 47ffa29eea2..8780742ab59 100644 --- a/chain/stmgr/forks_test.go +++ b/chain/stmgr/forks_test.go @@ -17,6 +17,7 @@ import ( "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" + actorstypes "github.com/filecoin-project/go-state-types/actors" "github.com/filecoin-project/go-state-types/cbor" "github.com/filecoin-project/go-state-types/network" builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" @@ -168,7 +169,7 @@ func TestForkHeightTriggers(t *testing.T) { } inv := consensus.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -285,7 +286,7 @@ func testForkRefuseCall(t *testing.T, nullsBefore, nullsAfter int) { } inv := consensus.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) @@ -506,7 +507,7 @@ func TestForkPreMigration(t *testing.T) { }() inv := consensus.NewActorRegistry() - inv.Register(actors.Version0, nil, testActor{}) + inv.Register(actorstypes.Version0, nil, testActor{}) sm.SetVMConstructor(func(ctx context.Context, vmopt *vm.VMOpts) (vm.Interface, error) { nvm, err := vm.NewLegacyVM(ctx, vmopt) diff --git a/cmd/lotus-bench/import.go b/cmd/lotus-bench/import.go index 298b3cd3a21..12a73814c0f 100644 --- a/cmd/lotus-bench/import.go +++ b/cmd/lotus-bench/import.go @@ -42,7 +42,6 @@ import ( "github.com/filecoin-project/lotus/chain/vm" lcli "github.com/filecoin-project/lotus/cli" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/node/repo" "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" From fe675b6fa184015afe4b5650004294ea77b311a7 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 13 Oct 2022 17:16:01 +0200 Subject: [PATCH 013/282] minor fix --- cmd/lotus-shed/keyinfo.go | 1 - 1 file changed, 1 deletion(-) diff --git a/cmd/lotus-shed/keyinfo.go b/cmd/lotus-shed/keyinfo.go index 38f5ee6fefe..373964dc6c9 100644 --- a/cmd/lotus-shed/keyinfo.go +++ b/cmd/lotus-shed/keyinfo.go @@ -23,7 +23,6 @@ import ( "github.com/filecoin-project/lotus/chain/wallet" "github.com/filecoin-project/lotus/chain/wallet/key" _ "github.com/filecoin-project/lotus/lib/sigs/bls" - _ "github.com/filecoin-project/lotus/lib/sigs/delegated" _ "github.com/filecoin-project/lotus/lib/sigs/secp" "github.com/filecoin-project/lotus/node/modules" "github.com/filecoin-project/lotus/node/modules/lp2p" From ef2200c28e1e5d346120554694b0952f7d11c3cc Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Thu, 13 Oct 2022 17:51:42 +0200 Subject: [PATCH 014/282] make gen --- api/proxy_gen.go | 18 ++++++++++-------- api/v0api/proxy_gen.go | 10 ++++++---- lib/retry/retry.go | 6 ++---- node/options.go | 3 +-- 4 files changed, 19 insertions(+), 18 deletions(-) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index fc69ab361a2..254d1274d85 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,6 +7,15 @@ import ( "encoding/json" "time" + "github.com/google/uuid" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/metrics" + "github.com/libp2p/go-libp2p/core/network" + "github.com/libp2p/go-libp2p/core/peer" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -21,6 +30,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/go-state-types/proof" + apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -32,14 +42,6 @@ import ( "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/sealtasks" "github.com/filecoin-project/lotus/storage/sealer/storiface" - "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/metrics" - "github.com/libp2p/go-libp2p/core/network" - "github.com/libp2p/go-libp2p/core/peer" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 3d4744fcef9..57cf730baaa 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,6 +5,11 @@ package v0api import ( "context" + blocks "github.com/ipfs/go-block-format" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" + "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -16,6 +21,7 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -23,10 +29,6 @@ import ( marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/imports" - blocks "github.com/ipfs/go-block-format" - "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") diff --git a/lib/retry/retry.go b/lib/retry/retry.go index e69d1ef35bc..fc7900febd5 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -1,11 +1,9 @@ package retry import ( - "time" - - logging "github.com/ipfs/go-log/v2" - "github.com/filecoin-project/lotus/api" + logging "github.com/ipfs/go-log/v2" + "time" ) var log = logging.Logger("retry") diff --git a/node/options.go b/node/options.go index 26c2c247f9a..de2e166624f 100644 --- a/node/options.go +++ b/node/options.go @@ -1,9 +1,8 @@ package node import ( - "reflect" - "go.uber.org/fx" + "reflect" ) // Option is a functional option which can be used with the New function to From 5c2949b59d85a4e78d6c010b220af61c376366ff Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 14 Oct 2022 11:23:05 +0200 Subject: [PATCH 015/282] fix linter --- node/options.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/options.go b/node/options.go index de2e166624f..26c2c247f9a 100644 --- a/node/options.go +++ b/node/options.go @@ -1,8 +1,9 @@ package node import ( - "go.uber.org/fx" "reflect" + + "go.uber.org/fx" ) // Option is a functional option which can be used with the New function to From c65ab1b277fa70cca5ade3885b9e7b0033b183e7 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Fri, 14 Oct 2022 11:28:43 +0200 Subject: [PATCH 016/282] minor fix --- chain/messagepool/messagepool.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/chain/messagepool/messagepool.go b/chain/messagepool/messagepool.go index 5fbf79c8f71..085980f79eb 100644 --- a/chain/messagepool/messagepool.go +++ b/chain/messagepool/messagepool.go @@ -38,6 +38,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" "github.com/filecoin-project/lotus/journal" + "github.com/filecoin-project/lotus/lib/sigs" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/modules/dtypes" ) @@ -786,6 +787,10 @@ func (mp *MessagePool) VerifyMsgSig(m *types.SignedMessage) error { return nil } + if err := sigs.Verify(&m.Signature, m.Message.From, m.Message.Cid().Bytes()); err != nil { + return err + } + mp.sigValCache.Add(sck, struct{}{}) return nil From f5b027eda302ceb9edc96e05cbc0112c10b538ab Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 22 Nov 2022 10:52:11 +0100 Subject: [PATCH 017/282] address review --- chain/consensus/common.go | 46 +++++++++++++++++++++++----------- chain/consensus/filcns/mine.go | 21 +--------------- lib/retry/retry.go | 3 ++- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/chain/consensus/common.go b/chain/consensus/common.go index 0e5793ca8c3..4dc70f0d4ac 100644 --- a/chain/consensus/common.go +++ b/chain/consensus/common.go @@ -302,10 +302,28 @@ func checkBlockMessages(ctx context.Context, sm *stmgr.StateManager, cs *store.C return nil } -// MsgsFromBlockTemplate extracts the different types of messages from a block -// template and populates the header for the next block to be proposed. -func MsgsFromBlockTemplate(ctx context.Context, sm *stmgr.StateManager, next *types.BlockHeader, - pts *types.TipSet, bt *api.BlockTemplate) ([]*types.Message, []*types.SignedMessage, error) { +// CreateBlockHeader generates the block header from the block template of +// the block being proposed. +func CreateBlockHeader(ctx context.Context, sm *stmgr.StateManager, pts *types.TipSet, + bt *api.BlockTemplate) (*types.BlockHeader, []*types.Message, []*types.SignedMessage, error) { + + st, recpts, err := sm.TipSetState(ctx, pts) + if err != nil { + return nil, nil, nil, xerrors.Errorf("failed to load tipset state: %w", err) + } + next := &types.BlockHeader{ + Miner: bt.Miner, + Parents: bt.Parents.Cids(), + Ticket: bt.Ticket, + ElectionProof: bt.Eproof, + + BeaconEntries: bt.BeaconValues, + Height: bt.Epoch, + Timestamp: bt.Timestamp, + WinPoStProof: bt.WinningPoStProof, + ParentStateRoot: st, + ParentMessageReceipts: recpts, + } var blsMessages []*types.Message var secpkMessages []*types.SignedMessage @@ -319,32 +337,32 @@ func MsgsFromBlockTemplate(ctx context.Context, sm *stmgr.StateManager, next *ty c, err := sm.ChainStore().PutMessage(ctx, &msg.Message) if err != nil { - return nil, nil, err + return nil, nil, nil, err } blsMsgCids = append(blsMsgCids, c) } else if msg.Signature.Type == crypto.SigTypeSecp256k1 { c, err := sm.ChainStore().PutMessage(ctx, msg) if err != nil { - return nil, nil, err + return nil, nil, nil, err } secpkMsgCids = append(secpkMsgCids, c) secpkMessages = append(secpkMessages, msg) } else { - return nil, nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) + return nil, nil, nil, xerrors.Errorf("unknown sig type: %d", msg.Signature.Type) } } store := sm.ChainStore().ActorStore(ctx) blsmsgroot, err := ToMessagesArray(store, blsMsgCids) if err != nil { - return nil, nil, xerrors.Errorf("building bls amt: %w", err) + return nil, nil, nil, xerrors.Errorf("building bls amt: %w", err) } secpkmsgroot, err := ToMessagesArray(store, secpkMsgCids) if err != nil { - return nil, nil, xerrors.Errorf("building secpk amt: %w", err) + return nil, nil, nil, xerrors.Errorf("building secpk amt: %w", err) } mmcid, err := store.Put(store.Context(), &types.MsgMeta{ @@ -352,29 +370,29 @@ func MsgsFromBlockTemplate(ctx context.Context, sm *stmgr.StateManager, next *ty SecpkMessages: secpkmsgroot, }) if err != nil { - return nil, nil, err + return nil, nil, nil, err } next.Messages = mmcid aggSig, err := AggregateSignatures(blsSigs) if err != nil { - return nil, nil, err + return nil, nil, nil, err } next.BLSAggregate = aggSig pweight, err := sm.ChainStore().Weight(ctx, pts) if err != nil { - return nil, nil, err + return nil, nil, nil, err } next.ParentWeight = pweight baseFee, err := sm.ChainStore().ComputeBaseFee(ctx, pts) if err != nil { - return nil, nil, xerrors.Errorf("computing base fee: %w", err) + return nil, nil, nil, xerrors.Errorf("computing base fee: %w", err) } next.ParentBaseFee = baseFee - return blsMessages, secpkMessages, err + return next, blsMessages, secpkMessages, err } diff --git a/chain/consensus/filcns/mine.go b/chain/consensus/filcns/mine.go index d5d605a13ef..956cba25270 100644 --- a/chain/consensus/filcns/mine.go +++ b/chain/consensus/filcns/mine.go @@ -17,11 +17,6 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. return nil, xerrors.Errorf("failed to load parent tipset: %w", err) } - st, recpts, err := filec.sm.TipSetState(ctx, pts) - if err != nil { - return nil, xerrors.Errorf("failed to load tipset state: %w", err) - } - _, lbst, err := stmgr.GetLookbackTipSetForRound(ctx, filec.sm, pts, bt.Epoch) if err != nil { return nil, xerrors.Errorf("getting lookback miner actor state: %w", err) @@ -32,21 +27,7 @@ func (filec *FilecoinEC) CreateBlock(ctx context.Context, w api.Wallet, bt *api. return nil, xerrors.Errorf("failed to get miner worker: %w", err) } - next := &types.BlockHeader{ - Miner: bt.Miner, - Parents: bt.Parents.Cids(), - Ticket: bt.Ticket, - ElectionProof: bt.Eproof, - - BeaconEntries: bt.BeaconValues, - Height: bt.Epoch, - Timestamp: bt.Timestamp, - WinPoStProof: bt.WinningPoStProof, - ParentStateRoot: st, - ParentMessageReceipts: recpts, - } - - blsMessages, secpkMessages, err := consensus.MsgsFromBlockTemplate(ctx, filec.sm, next, pts, bt) + next, blsMessages, secpkMessages, err := consensus.CreateBlockHeader(ctx, filec.sm, pts, bt) if err != nil { return nil, xerrors.Errorf("failed to process messages from block template: %w", err) } diff --git a/lib/retry/retry.go b/lib/retry/retry.go index 6b64e9b0cbb..897dbb06c9d 100644 --- a/lib/retry/retry.go +++ b/lib/retry/retry.go @@ -4,8 +4,9 @@ import ( "context" "time" - "github.com/filecoin-project/lotus/api" logging "github.com/ipfs/go-log/v2" + + "github.com/filecoin-project/lotus/api" ) var log = logging.Logger("retry") From 0b9b89bf2ba39855ba213366b9b4e30ca349a348 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Tue, 22 Nov 2022 10:59:43 +0100 Subject: [PATCH 018/282] minor fix --- cmd/lotus-shed/invariants.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/invariants.go b/cmd/lotus-shed/invariants.go index 9fb67393d2b..65aafe9d9f3 100644 --- a/cmd/lotus-shed/invariants.go +++ b/cmd/lotus-shed/invariants.go @@ -19,6 +19,7 @@ import ( "github.com/filecoin-project/lotus/blockstore" "github.com/filecoin-project/lotus/chain/actors" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -89,7 +90,7 @@ var invariantsCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) if err != nil { return err } From 985a4bd730a9496115dc955415ca035b3a96361e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 23 Nov 2022 17:41:39 +0100 Subject: [PATCH 019/282] feat: scripts: go.mod dep diff script --- scripts/gomod-diff.sh | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 scripts/gomod-diff.sh diff --git a/scripts/gomod-diff.sh b/scripts/gomod-diff.sh new file mode 100644 index 00000000000..b5e863b61a5 --- /dev/null +++ b/scripts/gomod-diff.sh @@ -0,0 +1,36 @@ +#!/usr/bin/env bash + +if [ $# -ne 2 ]; then + echo "./gomod-diff.sh [refA] [refB]" + exit 1 +fi + +temp=$(mktemp -d) +repo=$(pwd) + +cd "$temp" +echo "running in $temp" + +git clone $repo a +git clone $repo b + +cd a +git checkout $1 + +cd ../b +git checkout $2 +make deps +make -j10 buildall + +cd ../a +make deps +make -j10 buildall + +go mod vendor +cd ../b +go mod vendor + +cd .. +diff -r --color a/vendor b/vendor +diff -r --color a/vendor b/vendor > mod.diff +echo "Saved to $temp/mod.diff" From db6532c9d70c1f07256827fed93163076a49b25d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 23 Nov 2022 21:24:00 +0100 Subject: [PATCH 020/282] moddiff: Nicer diff --- scripts/gomod-diff.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/scripts/gomod-diff.sh b/scripts/gomod-diff.sh index b5e863b61a5..2c3bd87773e 100644 --- a/scripts/gomod-diff.sh +++ b/scripts/gomod-diff.sh @@ -31,6 +31,6 @@ cd ../b go mod vendor cd .. -diff -r --color a/vendor b/vendor -diff -r --color a/vendor b/vendor > mod.diff +diff -Naur --color b/vendor a/vendor +diff -Naur --color b/vendor a/vendor > mod.diff echo "Saved to $temp/mod.diff" From 25edb23c3f0806f20d4a0057d4ace0593b1b4216 Mon Sep 17 00:00:00 2001 From: Alfonso de la Rocha Date: Mon, 5 Dec 2022 18:22:10 +0100 Subject: [PATCH 021/282] minor fix after rebase --- cmd/lotus-shed/gas-estimation.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/cmd/lotus-shed/gas-estimation.go b/cmd/lotus-shed/gas-estimation.go index cf56ea03db9..26c4663bf0b 100644 --- a/cmd/lotus-shed/gas-estimation.go +++ b/cmd/lotus-shed/gas-estimation.go @@ -18,6 +18,7 @@ import ( "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/beacon" "github.com/filecoin-project/lotus/chain/beacon/drand" + "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/consensus/filcns" "github.com/filecoin-project/lotus/chain/stmgr" "github.com/filecoin-project/lotus/chain/store" @@ -110,7 +111,7 @@ var gasTraceCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd) if err != nil { return err } @@ -211,7 +212,7 @@ var replayOfflineCmd = &cli.Command{ cs := store.NewChainStore(bs, bs, mds, filcns.Weight, nil) defer cs.Close() //nolint:errcheck - sm, err := stmgr.NewStateManager(cs, filcns.NewTipSetExecutor(), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd) + sm, err := stmgr.NewStateManager(cs, consensus.NewTipSetExecutor(filcns.RewardFunc), vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), shd) if err != nil { return err } From 754f294992fd292a706d4e55305ee51162b59264 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Dec 2022 16:37:42 -0500 Subject: [PATCH 022/282] Add cli command for removing expired claims --- cli/filplus.go | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/cli/filplus.go b/cli/filplus.go index 0e81ccd3e36..7f469b4d9d2 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -44,6 +44,7 @@ var filplusCmd = &cli.Command{ filplusSignRemoveDataCapProposal, filplusListAllocationsCmd, filplusRemoveExpiredAllocationsCmd, + filplusRemoveExpiredClaimsCmd, }, } @@ -403,6 +404,99 @@ var filplusRemoveExpiredAllocationsCmd = &cli.Command{ }, } +var filplusRemoveExpiredClaimsCmd = &cli.Command{ + Name: "remove-expired-claims", + Usage: "remove expired claims (if no claims are specified all eligible claims are removed)", + ArgsUsage: "providerAddress Optional[...claimId]", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "from", + Usage: "optionally specify the account to send the message from", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() < 1 { + return IncorrectNumArgs(cctx) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + args := cctx.Args().Slice() + + providerAddr, err := address.NewFromString(args[0]) + if err != nil { + return err + } + + providerIdAddr, err := api.StateLookupID(ctx, providerAddr, types.EmptyTSK) + if err != nil { + return err + } + + providerId, err := address.IDFromAddress(providerIdAddr) + if err != nil { + return err + } + + fromAddr := providerIdAddr + if from := cctx.String("from"); from != "" { + addr, err := address.NewFromString(from) + if err != nil { + return err + } + + fromAddr = addr + } + + claimIDs := make([]verifregtypes9.ClaimId, len(args)-1) + for i, claimStr := range args[1:] { + id, err := strconv.ParseUint(claimStr, 10, 64) + if err != nil { + return err + } + claimIDs[i] = verifregtypes9.ClaimId(id) + } + + params, err := actors.SerializeParams(&verifregtypes9.RemoveExpiredClaimsParams{ + Provider: abi.ActorID(providerId), + ClaimIds: claimIDs, + }) + if err != nil { + return err + } + + msg := &types.Message{ + To: verifreg.Address, + From: fromAddr, + Method: verifreg.Methods.RemoveExpiredClaims, + Params: params, + } + + smsg, err := api.MpoolPushMessage(ctx, msg, nil) + if err != nil { + return err + } + + fmt.Printf("message sent, now waiting on cid: %s\n", smsg.Cid()) + + mwait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) + if err != nil { + return err + } + + if mwait.Receipt.ExitCode.IsError() { + return fmt.Errorf("failed to remove expired allocations: %d", mwait.Receipt.ExitCode) + } + + return nil + }, +} + var filplusCheckClientCmd = &cli.Command{ Name: "check-client-datacap", Usage: "check verified client remaining bytes", From 6ca975e83a3471970aa0d406b858fc0e3c7b00dc Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 14 Dec 2022 16:55:50 -0500 Subject: [PATCH 023/282] Add cli command to get a list of claims --- cli/filplus.go | 86 +++++++++++++++++++++++++++++++++++ documentation/en/cli-lotus.md | 28 ++++++++++++ 2 files changed, 114 insertions(+) diff --git a/cli/filplus.go b/cli/filplus.go index 7f469b4d9d2..9fbd2a489ad 100644 --- a/cli/filplus.go +++ b/cli/filplus.go @@ -43,6 +43,7 @@ var filplusCmd = &cli.Command{ filplusCheckNotaryCmd, filplusSignRemoveDataCapProposal, filplusListAllocationsCmd, + filplusListClaimsCmd, filplusRemoveExpiredAllocationsCmd, filplusRemoveExpiredClaimsCmd, }, @@ -311,6 +312,91 @@ var filplusListAllocationsCmd = &cli.Command{ }, } +var filplusListClaimsCmd = &cli.Command{ + Name: "list-claims", + Usage: "List claims made by provider", + ArgsUsage: "providerAddress", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "expired", + Usage: "list only expired claims", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + providerAddr, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return err + } + + providerIdAddr, err := api.StateLookupID(ctx, providerAddr, types.EmptyTSK) + if err != nil { + return err + } + + store := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(api))) + + verifregActor, err := api.StateGetActor(ctx, verifreg.Address, types.EmptyTSK) + if err != nil { + return err + } + + verifregState, err := verifreg.Load(store, verifregActor) + if err != nil { + return err + } + + ts, err := api.ChainHead(ctx) + if err != nil { + return err + } + + claimsMap, err := verifregState.GetClaims(providerIdAddr) + if err != nil { + return err + } + + tw := tablewriter.New( + tablewriter.Col("ID"), + tablewriter.Col("Provider"), + tablewriter.Col("Client"), + tablewriter.Col("Data"), + tablewriter.Col("Size"), + tablewriter.Col("TermMin"), + tablewriter.Col("TermMax"), + tablewriter.Col("TermStart"), + tablewriter.Col("Sector"), + ) + + for claimId, claim := range claimsMap { + if ts.Height() > claim.TermMax || !cctx.IsSet("expired") { + tw.Write(map[string]interface{}{ + "ID": claimId, + "Provider": claim.Provider, + "Client": claim.Client, + "Data": claim.Data, + "Size": claim.Size, + "TermMin": claim.TermMin, + "TermMax": claim.TermMax, + "TermStart": claim.TermStart, + "Sector": claim.Sector, + }) + } + } + return tw.Flush(os.Stdout) + }, +} + var filplusRemoveExpiredAllocationsCmd = &cli.Command{ Name: "remove-expired-allocations", Usage: "remove expired allocations (if no allocations are specified all eligible allocations are removed)", diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 2f662f017cd..86ce59ba442 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -1210,7 +1210,9 @@ COMMANDS: check-notary-datacap check a notary's remaining bytes sign-remove-data-cap-proposal allows a notary to sign a Remove Data Cap Proposal list-allocations List allocations made by client + list-claims List claims made by provider remove-expired-allocations remove expired allocations (if no allocations are specified all eligible allocations are removed) + remove-expired-claims remove expired claims (if no claims are specified all eligible claims are removed) help, h Shows a list of commands or help for one command OPTIONS: @@ -1309,6 +1311,19 @@ OPTIONS: ``` +### lotus filplus list-claims +``` +NAME: + lotus filplus list-claims - List claims made by provider + +USAGE: + lotus filplus list-claims [command options] providerAddress + +OPTIONS: + --expired list only expired claims (default: false) + +``` + ### lotus filplus remove-expired-allocations ``` NAME: @@ -1322,6 +1337,19 @@ OPTIONS: ``` +### lotus filplus remove-expired-claims +``` +NAME: + lotus filplus remove-expired-claims - remove expired claims (if no claims are specified all eligible claims are removed) + +USAGE: + lotus filplus remove-expired-claims [command options] providerAddress Optional[...claimId] + +OPTIONS: + --from value optionally specify the account to send the message from + +``` + ## lotus paych ``` NAME: From f8195deb541d8c1ccb76b1a51e93368b493c8f64 Mon Sep 17 00:00:00 2001 From: Phi Date: Fri, 6 Jan 2023 12:43:12 +0100 Subject: [PATCH 024/282] fix: cli: remove requirements Remove the requirements from the `lotus-worker run` cli --- cmd/lotus-worker/main.go | 8 ++++---- documentation/en/cli-lotus-worker.md | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cmd/lotus-worker/main.go b/cmd/lotus-worker/main.go index 074a6a3e528..bb7fa94d8f8 100644 --- a/cmd/lotus-worker/main.go +++ b/cmd/lotus-worker/main.go @@ -184,25 +184,25 @@ var runCmd = &cli.Command{ }, &cli.BoolFlag{ Name: "precommit1", - Usage: "enable precommit1 (32G sectors: 1 core, 128GiB Memory)", + Usage: "enable precommit1", Value: true, EnvVars: []string{"LOTUS_WORKER_PRECOMMIT1"}, }, &cli.BoolFlag{ Name: "unseal", - Usage: "enable unsealing (32G sectors: 1 core, 128GiB Memory)", + Usage: "enable unsealing", Value: true, EnvVars: []string{"LOTUS_WORKER_UNSEAL"}, }, &cli.BoolFlag{ Name: "precommit2", - Usage: "enable precommit2 (32G sectors: all cores, 96GiB Memory)", + Usage: "enable precommit2", Value: true, EnvVars: []string{"LOTUS_WORKER_PRECOMMIT2"}, }, &cli.BoolFlag{ Name: "commit", - Usage: "enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap)", + Usage: "enable commit", Value: true, EnvVars: []string{"LOTUS_WORKER_COMMIT"}, }, diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 74b7a19b898..cfc4938bce6 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -39,7 +39,7 @@ USAGE: OPTIONS: --addpiece enable addpiece (default: true) [$LOTUS_WORKER_ADDPIECE] - --commit enable commit (32G sectors: all cores or GPUs, 128GiB Memory + 64GiB swap) (default: true) [$LOTUS_WORKER_COMMIT] + --commit enable commit (default: true) [$LOTUS_WORKER_COMMIT] --http-server-timeout value (default: "30s") --listen value host address and port the worker api will listen on (default: "0.0.0.0:3456") [$LOTUS_WORKER_LISTEN] --name value custom worker name (default: hostname) [$LOTUS_WORKER_NAME] @@ -49,14 +49,14 @@ OPTIONS: --parallel-fetch-limit value maximum fetch operations to run in parallel (default: 5) [$LOTUS_WORKER_PARALLEL_FETCH_LIMIT] --post-parallel-reads value maximum number of parallel challenge reads (0 = no limit) (default: 128) [$LOTUS_WORKER_POST_PARALLEL_READS] --post-read-timeout value time limit for reading PoSt challenges (0 = no limit) (default: 0s) [$LOTUS_WORKER_POST_READ_TIMEOUT] - --precommit1 enable precommit1 (32G sectors: 1 core, 128GiB Memory) (default: true) [$LOTUS_WORKER_PRECOMMIT1] - --precommit2 enable precommit2 (32G sectors: all cores, 96GiB Memory) (default: true) [$LOTUS_WORKER_PRECOMMIT2] + --precommit1 enable precommit1 (default: true) [$LOTUS_WORKER_PRECOMMIT1] + --precommit2 enable precommit2 (default: true) [$LOTUS_WORKER_PRECOMMIT2] --prove-replica-update2 enable prove replica update 2 (default: true) [$LOTUS_WORKER_PROVE_REPLICA_UPDATE2] --regen-sector-key enable regen sector key (default: true) [$LOTUS_WORKER_REGEN_SECTOR_KEY] --replica-update enable replica update (default: true) [$LOTUS_WORKER_REPLICA_UPDATE] --sector-download enable external sector data download (default: false) [$LOTUS_WORKER_SECTOR_DOWNLOAD] --timeout value used when 'listen' is unspecified. must be a valid duration recognized by golang's time.ParseDuration function (default: "30m") [$LOTUS_WORKER_TIMEOUT] - --unseal enable unsealing (32G sectors: 1 core, 128GiB Memory) (default: true) [$LOTUS_WORKER_UNSEAL] + --unseal enable unsealing (default: true) [$LOTUS_WORKER_UNSEAL] --windowpost enable window post (default: false) [$LOTUS_WORKER_WINDOWPOST] --winningpost enable winning post (default: false) [$LOTUS_WORKER_WINNINGPOST] From a4a4e04c5e0284ffb645540ada180e0c3e9a429f Mon Sep 17 00:00:00 2001 From: Mike Greenberg Date: Fri, 6 Jan 2023 17:33:25 -0500 Subject: [PATCH 025/282] feat(blockstore): Envvar can adjust badger compaction worker poolsize --- node/repo/blockstore_opts.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/node/repo/blockstore_opts.go b/node/repo/blockstore_opts.go index 1705217d304..81f8b9ff416 100644 --- a/node/repo/blockstore_opts.go +++ b/node/repo/blockstore_opts.go @@ -1,6 +1,11 @@ package repo -import badgerbs "github.com/filecoin-project/lotus/blockstore/badger" +import ( + "os" + "strconv" + + badgerbs "github.com/filecoin-project/lotus/blockstore/badger" +) // BadgerBlockstoreOptions returns the badger options to apply for the provided // domain. @@ -42,5 +47,17 @@ func BadgerBlockstoreOptions(domain BlockstoreDomain, path string, readonly bool opts.ReadOnly = readonly + // Envvar LOTUS_CHAIN_BADGERSTORE_COMPACTIONWORKERNUM + // Allows the number of compaction workers used by BadgerDB to be adjusted + // Unset - leaves the default number of compaction workers (4) + // "0" - disables compaction + // Positive integer - enables that number of compaction workers + if badgerNumCompactors, badgerNumCompactorsSet := os.LookupEnv("LOTUS_CHAIN_BADGERSTORE_COMPACTIONWORKERNUM"); badgerNumCompactorsSet { + if numWorkers, err := strconv.Atoi(badgerNumCompactors); err == nil && numWorkers >= 0 { + opts.NumCompactors = numWorkers + } + } + return opts, nil + } From 45667b739114598df432be358966db1c6591fcfc Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 10 Jan 2023 13:04:11 +0000 Subject: [PATCH 026/282] Upgrade to index-provider 0.10.0 Upgrade to the latest index-provider and as a result also upgrade go-fil-markets. Note that the index-provider go module is renamed and moved to `ipni` GitHub org. --- go.mod | 6 +++--- go.sum | 12 ++++++------ itests/deals_concurrent_test.go | 2 +- node/builder_miner.go | 2 +- node/modules/storageminer.go | 2 +- node/modules/storageminer_idxprov.go | 4 ++-- node/modules/storageminer_idxprov_test.go | 2 +- 7 files changed, 15 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index 7ac89434930..13f4b94a10c 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.15.2 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.25.2 + github.com/filecoin-project/go-fil-markets v1.25.3 github.com/filecoin-project/go-jsonrpc v0.1.8 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 @@ -47,7 +47,6 @@ require ( github.com/filecoin-project/go-statemachine v1.0.2 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.9.1 github.com/filecoin-project/pubsub v1.0.0 github.com/filecoin-project/specs-actors v0.9.15 github.com/filecoin-project/specs-actors/v2 v2.3.6 @@ -109,6 +108,7 @@ require ( github.com/ipld/go-codec-dagpb v1.5.0 github.com/ipld/go-ipld-prime v0.18.0 github.com/ipld/go-ipld-selector-text-lite v0.0.1 + github.com/ipni/index-provider v0.10.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 @@ -199,7 +199,6 @@ require ( github.com/filecoin-project/go-hamt-ipld v0.1.5 // indirect github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 // indirect github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 // indirect - github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893 // indirect github.com/flynn/noise v1.0.0 // indirect github.com/francoispqt/gojay v1.2.13 // indirect github.com/fsnotify/fsnotify v1.5.4 // indirect @@ -243,6 +242,7 @@ require ( github.com/ipfs/go-peertaskqueue v0.8.0 // indirect github.com/ipfs/go-verifcid v0.0.2 // indirect github.com/ipld/go-ipld-adl-hamt v0.0.0-20220616142416-9004dbd839e0 // indirect + github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15 // indirect github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jbenet/go-random v0.0.0-20190219211222-123a90aedc0c // indirect diff --git a/go.sum b/go.sum index 77787e04ca0..a3de79b8e2b 100644 --- a/go.sum +++ b/go.sum @@ -331,8 +331,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.25.2 h1:kVfgaamTC7dkn8KwS5zRJBNEBSNvVqdG3BCoDaUYuCI= -github.com/filecoin-project/go-fil-markets v1.25.2/go.mod h1:dc2oTPU6GH3Qk1nA+Er+hSX64rg+NVykkPIWFBYxcZU= +github.com/filecoin-project/go-fil-markets v1.25.3 h1:50kK+2VBmyh9SuuS/MgcTRaWlVdBdTZLPCzMxw8ONBg= +github.com/filecoin-project/go-fil-markets v1.25.3/go.mod h1:eOIYHfPwyqc64O1HiapvcelfnrTfU7gLQgBf55IYleQ= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -366,8 +366,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.9.1 h1:Jnh9dviIHvQxZ2baNoYu3n8z6F9O62ksnVlyREgPyyM= -github.com/filecoin-project/index-provider v0.9.1/go.mod h1:NlHxQcy2iMGfUoUGUzrRxntcpiC50QSnvp68u2VTT40= github.com/filecoin-project/pubsub v1.0.0 h1:ZTmT27U07e54qV1mMiQo4HDr0buo8I1LDHBYLXlsNXM= github.com/filecoin-project/pubsub v1.0.0/go.mod h1:GkpB33CcUtUNrLPhJgfdy4FDx4OMNR9k+46DHx/Lqrg= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -388,8 +386,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.1 h1:w72xCxijK7xs1qzmJiw+WYJaVt github.com/filecoin-project/specs-actors/v7 v7.0.1/go.mod h1:tPLEYXoXhcpyLh69Ccq91SOuLXsPWjHiY27CzawjUEk= github.com/filecoin-project/specs-actors/v8 v8.0.1 h1:4u0tIRJeT5G7F05lwLRIsDnsrN+bJ5Ixj6h49Q7uE2Y= github.com/filecoin-project/specs-actors/v8 v8.0.1/go.mod h1:UYIPg65iPWoFw5NEftREdJwv9b/5yaLKdCgTvNI/2FA= -github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893 h1:6GCuzxLVHBzlz7y+FkbHh6n0UyoEGWqDwJKQPJoz7bE= -github.com/filecoin-project/storetheindex v0.4.30-0.20221114113647-683091f8e893/go.mod h1:S7590oDimBvXMUtzWsBXoshu9HtYKwtXl47zAK9rcP8= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -899,6 +895,10 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipni/index-provider v0.10.0 h1:nu8YBxzRopdjwZHsgCUuC4AHpq88VVHJYrbkqUDx7eg= +github.com/ipni/index-provider v0.10.0/go.mod h1:InSXbZp2p/ZhAwiDElG/wzjnA1ea1iJ3hhyiAHrD+Vo= +github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15 h1:qJq6QtLk+9nQi3CDBhNfJ1cjZ4pghjCHcQUZ1mWbF0k= +github.com/ipni/storetheindex v0.5.3-0.20221203123030-16745cb63f15/go.mod h1:c/NS640Iu2NrCCIErnUhsUM5KVEyeXymgtNnx6eDwMU= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index e36bde773a8..0fee8da01df 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -8,12 +8,12 @@ import ( "testing" "time" + provider "github.com/ipni/index-provider" "github.com/stretchr/testify/require" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-state-types/abi" - provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/itests/kit" diff --git a/node/builder_miner.go b/node/builder_miner.go index 2d33727f804..68d5a32f891 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -4,6 +4,7 @@ import ( "errors" "time" + provider "github.com/ipni/index-provider" "go.uber.org/fx" "golang.org/x/xerrors" @@ -12,7 +13,6 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask" "github.com/filecoin-project/go-state-types/abi" - provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v1api" diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index dff9c14153a..7f6ccf60a99 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -18,6 +18,7 @@ import ( graphsync "github.com/ipfs/go-graphsync/impl" gsnet "github.com/ipfs/go-graphsync/network" "github.com/ipfs/go-graphsync/storeutil" + provider "github.com/ipni/index-provider" "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "go.uber.org/multierr" @@ -42,7 +43,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-statestore" - provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v0api" diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 92a6a6a548f..dc4e608780a 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -5,14 +5,14 @@ import ( "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" + provider "github.com/ipni/index-provider" + "github.com/ipni/index-provider/engine" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" "go.uber.org/fx" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" - provider "github.com/filecoin-project/index-provider" - "github.com/filecoin-project/index-provider/engine" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/node/config" diff --git a/node/modules/storageminer_idxprov_test.go b/node/modules/storageminer_idxprov_test.go index 8d5717b66f5..434577bab64 100644 --- a/node/modules/storageminer_idxprov_test.go +++ b/node/modules/storageminer_idxprov_test.go @@ -7,6 +7,7 @@ import ( "time" "github.com/ipfs/go-datastore" + provider "github.com/ipni/index-provider" "github.com/libp2p/go-libp2p" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/host" @@ -14,7 +15,6 @@ import ( "go.uber.org/fx" "github.com/filecoin-project/go-address" - provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules" From fea879088c17df01fd0ec64eb1d792f273dc2ba7 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 10 Jan 2023 14:43:32 +0100 Subject: [PATCH 027/282] feat: update to go-fil-markets v1.26.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 13f4b94a10c..602b1b00737 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.15.2 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.25.3 + github.com/filecoin-project/go-fil-markets v1.26.0 github.com/filecoin-project/go-jsonrpc v0.1.8 github.com/filecoin-project/go-legs v0.4.4 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index a3de79b8e2b..879c13433a8 100644 --- a/go.sum +++ b/go.sum @@ -331,8 +331,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.25.3 h1:50kK+2VBmyh9SuuS/MgcTRaWlVdBdTZLPCzMxw8ONBg= -github.com/filecoin-project/go-fil-markets v1.25.3/go.mod h1:eOIYHfPwyqc64O1HiapvcelfnrTfU7gLQgBf55IYleQ= +github.com/filecoin-project/go-fil-markets v1.26.0 h1:uNtt1UAxX2C/Q8tlWD00oF2Zma3CVGxhZmBc2ljYhkk= +github.com/filecoin-project/go-fil-markets v1.26.0/go.mod h1:eOIYHfPwyqc64O1HiapvcelfnrTfU7gLQgBf55IYleQ= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From a02c783f0e174a74bc63d8eed0a99f5107d09b1b Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 10 Jan 2023 14:50:38 +0100 Subject: [PATCH 028/282] fix: dagstore miner api test --- markets/dagstore/miner_api_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/markets/dagstore/miner_api_test.go b/markets/dagstore/miner_api_test.go index c2618e8a75a..08135b3a553 100644 --- a/markets/dagstore/miner_api_test.go +++ b/markets/dagstore/miner_api_test.go @@ -83,7 +83,7 @@ func TestLotusAccessorFetchUnsealedPiece(t *testing.T) { dealInfo := piecestore.DealInfo{ SectorID: sectorID, } - err = ps.AddDealForPiece(cid1, dealInfo) + err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) require.NoError(t, err) } @@ -124,7 +124,7 @@ func TestLotusAccessorGetUnpaddedCARSize(t *testing.T) { dealInfo := piecestore.DealInfo{ Length: 10, } - err = ps.AddDealForPiece(cid1, dealInfo) + err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) require.NoError(t, err) // Check that the data length is correct @@ -153,7 +153,7 @@ func TestThrottle(t *testing.T) { SectorID: unsealedSectorID, Length: 10, } - err = ps.AddDealForPiece(cid1, dealInfo) + err = ps.AddDealForPiece(cid1, cid.Undef, dealInfo) require.NoError(t, err) // hold the lock to block. From 7c448afda897852ab685376d15bd6faa725b147d Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 19 Dec 2022 01:17:00 -0500 Subject: [PATCH 029/282] make build step --- .circleci/config.yml | 342 +++++++++++++++++++++++++++++++++++------ .circleci/template.yml | 147 ++++++++++++------ 2 files changed, 395 insertions(+), 94 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d690a6d541c..bfb947de3dd 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -5,6 +5,11 @@ orbs: executors: golang: + docker: + # Must match GO_VERSION_MIN in project root + - image: cimg/go:1.18.8 + resource_class: large + golang-2xl: docker: # Must match GO_VERSION_MIN in project root - image: cimg/go:1.18.8 @@ -14,7 +19,7 @@ executors: - image: ubuntu:20.04 commands: - prepare: + build-platform-specific: parameters: linux: default: true @@ -34,6 +39,7 @@ commands: - when: condition: <> steps: + - prepare - run: name: Check Go Version command: | @@ -43,10 +49,6 @@ commands: echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." exit 1 fi - - run: sudo apt-get update - - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev - - run: sudo apt-get install python-is-python3 - - when: condition: <> steps: @@ -69,6 +71,7 @@ commands: curl https://sh.rustup.rs -sSf | sh -s -- -y - run: git submodule sync - run: git submodule update --init + - run: make deps lotus download-params: steps: - restore_cache: @@ -77,7 +80,7 @@ commands: - 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ - - run: ./lotus fetch-params 2048 + - run: ./lotus fetch-params 2048 - save_cache: name: Save parameters cache key: 'v26-2k-lotus-params' @@ -99,12 +102,42 @@ commands: name: fetch all tags command: | git fetch --all + prepare: + steps: + - run: sudo apt-get update + - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev jobs: + build: + executor: golang + working_directory: ~/lotus + steps: + - checkout + - git_fetch_all_tags + - run: + name: Check Go Version + command: | + v=`go version | { read _ _ v _; echo ${v#go}; }` + if [[ $v != `cat GO_VERSION_MIN` ]]; then + echo "GO_VERSION_MIN file does not match the go version being used." + echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." + exit 1 + fi + - prepare + - run: git submodule sync + - run: git submodule update --init + - run: make deps lotus + - persist_to_workspace: + root: ~/ + paths: + - "lotus" mod-tidy-check: executor: golang + working_directory: ~/lotus steps: - prepare + - attach_workspace: + at: ~/ - run: go mod tidy -v - run: name: Check git diff @@ -115,13 +148,14 @@ jobs: test: description: | Run tests with gotestsum. + working_directory: ~/lotus parameters: &test-params executor: type: executor default: golang go-test-flags: type: string - default: "-timeout 30m" + default: "-timeout 20m" description: Flags passed to go test. target: type: string @@ -130,21 +164,22 @@ jobs: proofs-log-test: type: string default: "0" + get-params: + type: boolean + default: false suite: type: string default: unit description: Test suite name to report to CircleCI. - gotestsum-format: - type: string - default: standard-verbose - description: gotestsum format. https://github.com/gotestyourself/gotestsum#format executor: << parameters.executor >> steps: - prepare - - run: - command: make deps lotus - no_output_timeout: 30m - - download-params + - attach_workspace: + at: ~/ + - when: + condition: << parameters.get-params >> + steps: + - download-params - run: name: go test environment: @@ -155,7 +190,7 @@ jobs: mkdir -p /tmp/test-reports/<< parameters.suite >> mkdir -p /tmp/test-artifacts gotestsum \ - --format << parameters.gotestsum-format >> \ + --format standard-verbose \ --junitfile /tmp/test-reports/<< parameters.suite >>/junit.xml \ --jsonfile /tmp/test-artifacts/<< parameters.suite >>.json \ -- \ @@ -168,6 +203,7 @@ jobs: path: /tmp/test-artifacts/<< parameters.suite >>.json test-conformance: + working_directory: ~/lotus description: | Run tests using a corpus of interoperable test vectors for Filecoin implementations to test their correctness and compliance with the Filecoin @@ -184,9 +220,8 @@ jobs: executor: << parameters.executor >> steps: - prepare - - run: - command: make deps lotus - no_output_timeout: 30m + - attach_workspace: + at: ~/ - download-params - when: condition: @@ -229,7 +264,7 @@ jobs: build-linux-amd64: executor: golang steps: - - prepare + - build-platform-specific - run: make lotus lotus-miner lotus-worker - run: name: check tag and version output match @@ -248,7 +283,7 @@ jobs: macos: xcode: "13.4.1" steps: - - prepare: + - build-platform-specific: linux: false darwin: true darwin-architecture: amd64 @@ -272,7 +307,7 @@ jobs: resource_class: filecoin-project/self-hosted-m1 steps: - run: echo 'export PATH=/opt/homebrew/bin:"$PATH"' >> "$BASH_ENV" - - prepare: + - build-platform-specific: linux: false darwin: true darwin-architecture: arm64 @@ -380,16 +415,18 @@ jobs: gofmt: executor: golang + working_directory: ~/lotus steps: - - prepare - run: command: "! go fmt ./... 2>&1 | read" gen-check: executor: golang + working_directory: ~/lotus steps: - prepare - - run: make deps + - attach_workspace: + at: ~/ - run: go install golang.org/x/tools/cmd/goimports - run: go install github.com/hannahhoward/cbor-gen-for - run: make gen @@ -399,32 +436,29 @@ jobs: docs-check: executor: golang + working_directory: ~/lotus steps: - prepare + - attach_workspace: + at: ~/ - run: go install golang.org/x/tools/cmd/goimports - run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../pre-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../pre-openrpc-worker - - run: make deps - run: make docsgen - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker - run: diff ../pre-openrpc-full ../post-openrpc-full && diff ../pre-openrpc-miner ../post-openrpc-miner && diff ../pre-openrpc-worker ../post-openrpc-worker && git --no-pager diff && git --no-pager diff --quiet - lint: &lint + lint-all: description: | Run golangci-lint. + working_directory: ~/lotus parameters: executor: type: executor default: golang - concurrency: - type: string - default: '2' - description: | - Concurrency used to run linters. Defaults to 2 because NumCPU is not - aware of container CPU limits. args: type: string default: '' @@ -433,16 +467,13 @@ jobs: executor: << parameters.executor >> steps: - prepare - - run: - command: make deps - no_output_timeout: 30m + - attach_workspace: + at: ~/ - run: name: Lint command: | - golangci-lint run -v --timeout 2m \ - --concurrency << parameters.concurrency >> << parameters.args >> - lint-all: - <<: *lint + golangci-lint run -v --timeout 10m \ + --concurrency 4 << parameters.args >> publish: description: publish binary artifacts @@ -462,7 +493,6 @@ jobs: command: apt update && apt install -y git jq curl sudo - checkout - git_fetch_all_tags - - checkout - install_ipfs - attach_workspace: at: /tmp/workspace @@ -606,356 +636,576 @@ jobs: extra_build_args: --target <> --build-arg GOFLAGS=-tags=<> workflows: - version: 2.1 ci: jobs: + - build - lint-all: - concurrency: "16" # expend all docker 2xlarge CPUs. - - mod-tidy-check - - gofmt - - gen-check - - docs-check + requires: + - build + - mod-tidy-check: + requires: + - build + - gofmt: + requires: + - build + - gen-check: + requires: + - build + - docs-check: + requires: + - build - test: name: test-itest-api + requires: + - build suite: itest-api target: "./itests/api_test.go" + - test: name: test-itest-batch_deal + requires: + - build suite: itest-batch_deal target: "./itests/batch_deal_test.go" + - test: name: test-itest-ccupgrade + requires: + - build suite: itest-ccupgrade target: "./itests/ccupgrade_test.go" + - test: name: test-itest-cli + requires: + - build suite: itest-cli target: "./itests/cli_test.go" + - test: name: test-itest-deadlines + requires: + - build suite: itest-deadlines target: "./itests/deadlines_test.go" + - test: name: test-itest-deals_512mb + requires: + - build suite: itest-deals_512mb target: "./itests/deals_512mb_test.go" + - test: name: test-itest-deals_anycid + requires: + - build suite: itest-deals_anycid target: "./itests/deals_anycid_test.go" + - test: name: test-itest-deals_concurrent + requires: + - build suite: itest-deals_concurrent target: "./itests/deals_concurrent_test.go" + executor: golang-2xl - test: name: test-itest-deals_invalid_utf8_label + requires: + - build suite: itest-deals_invalid_utf8_label target: "./itests/deals_invalid_utf8_label_test.go" + - test: name: test-itest-deals_max_staging_deals + requires: + - build suite: itest-deals_max_staging_deals target: "./itests/deals_max_staging_deals_test.go" + - test: name: test-itest-deals_offline + requires: + - build suite: itest-deals_offline target: "./itests/deals_offline_test.go" + - test: name: test-itest-deals_padding + requires: + - build suite: itest-deals_padding target: "./itests/deals_padding_test.go" + - test: name: test-itest-deals_partial_retrieval_dm-level + requires: + - build suite: itest-deals_partial_retrieval_dm-level target: "./itests/deals_partial_retrieval_dm-level_test.go" + - test: name: test-itest-deals_partial_retrieval + requires: + - build suite: itest-deals_partial_retrieval target: "./itests/deals_partial_retrieval_test.go" + - test: name: test-itest-deals_power + requires: + - build suite: itest-deals_power target: "./itests/deals_power_test.go" + - test: name: test-itest-deals_pricing + requires: + - build suite: itest-deals_pricing target: "./itests/deals_pricing_test.go" + - test: name: test-itest-deals_publish + requires: + - build suite: itest-deals_publish target: "./itests/deals_publish_test.go" + - test: name: test-itest-deals_remote_retrieval + requires: + - build suite: itest-deals_remote_retrieval target: "./itests/deals_remote_retrieval_test.go" + - test: name: test-itest-deals_retry_deal_no_funds + requires: + - build suite: itest-deals_retry_deal_no_funds target: "./itests/deals_retry_deal_no_funds_test.go" + - test: name: test-itest-deals + requires: + - build suite: itest-deals target: "./itests/deals_test.go" + - test: name: test-itest-dup_mpool_messages + requires: + - build suite: itest-dup_mpool_messages target: "./itests/dup_mpool_messages_test.go" + - test: name: test-itest-gas_estimation + requires: + - build suite: itest-gas_estimation target: "./itests/gas_estimation_test.go" + - test: name: test-itest-gateway + requires: + - build suite: itest-gateway target: "./itests/gateway_test.go" + - test: name: test-itest-get_messages_in_ts + requires: + - build suite: itest-get_messages_in_ts target: "./itests/get_messages_in_ts_test.go" + - test: name: test-itest-lite_migration + requires: + - build suite: itest-lite_migration target: "./itests/lite_migration_test.go" + - test: name: test-itest-lookup_robust_address + requires: + - build suite: itest-lookup_robust_address target: "./itests/lookup_robust_address_test.go" + - test: name: test-itest-mempool + requires: + - build suite: itest-mempool target: "./itests/mempool_test.go" + - test: name: test-itest-migration_nv17 + requires: + - build suite: itest-migration_nv17 target: "./itests/migration_nv17_test.go" + - test: name: test-itest-mpool_msg_uuid + requires: + - build suite: itest-mpool_msg_uuid target: "./itests/mpool_msg_uuid_test.go" + - test: name: test-itest-mpool_push_with_uuid + requires: + - build suite: itest-mpool_push_with_uuid target: "./itests/mpool_push_with_uuid_test.go" + - test: name: test-itest-multisig + requires: + - build suite: itest-multisig target: "./itests/multisig_test.go" + - test: name: test-itest-net + requires: + - build suite: itest-net target: "./itests/net_test.go" + - test: name: test-itest-nonce + requires: + - build suite: itest-nonce target: "./itests/nonce_test.go" + - test: name: test-itest-path_detach_redeclare + requires: + - build suite: itest-path_detach_redeclare target: "./itests/path_detach_redeclare_test.go" + - test: name: test-itest-path_type_filters + requires: + - build suite: itest-path_type_filters target: "./itests/path_type_filters_test.go" + - test: name: test-itest-paych_api + requires: + - build suite: itest-paych_api target: "./itests/paych_api_test.go" + - test: name: test-itest-paych_cli + requires: + - build suite: itest-paych_cli target: "./itests/paych_cli_test.go" + - test: name: test-itest-pending_deal_allocation + requires: + - build suite: itest-pending_deal_allocation target: "./itests/pending_deal_allocation_test.go" + - test: name: test-itest-raft_messagesigner + requires: + - build suite: itest-raft_messagesigner target: "./itests/raft_messagesigner_test.go" + - test: name: test-itest-remove_verifreg_datacap + requires: + - build suite: itest-remove_verifreg_datacap target: "./itests/remove_verifreg_datacap_test.go" + - test: name: test-itest-sdr_upgrade + requires: + - build suite: itest-sdr_upgrade target: "./itests/sdr_upgrade_test.go" + - test: name: test-itest-sector_finalize_early + requires: + - build suite: itest-sector_finalize_early target: "./itests/sector_finalize_early_test.go" + - test: name: test-itest-sector_import_full + requires: + - build suite: itest-sector_import_full target: "./itests/sector_import_full_test.go" + - test: name: test-itest-sector_import_simple + requires: + - build suite: itest-sector_import_simple target: "./itests/sector_import_simple_test.go" + - test: name: test-itest-sector_make_cc_avail + requires: + - build suite: itest-sector_make_cc_avail target: "./itests/sector_make_cc_avail_test.go" + - test: name: test-itest-sector_miner_collateral + requires: + - build suite: itest-sector_miner_collateral target: "./itests/sector_miner_collateral_test.go" + - test: name: test-itest-sector_numassign + requires: + - build suite: itest-sector_numassign target: "./itests/sector_numassign_test.go" + - test: name: test-itest-sector_pledge + requires: + - build suite: itest-sector_pledge target: "./itests/sector_pledge_test.go" + - test: name: test-itest-sector_prefer_no_upgrade + requires: + - build suite: itest-sector_prefer_no_upgrade target: "./itests/sector_prefer_no_upgrade_test.go" + - test: name: test-itest-sector_revert_available + requires: + - build suite: itest-sector_revert_available target: "./itests/sector_revert_available_test.go" + - test: name: test-itest-sector_terminate + requires: + - build suite: itest-sector_terminate target: "./itests/sector_terminate_test.go" + - test: name: test-itest-sector_unseal + requires: + - build suite: itest-sector_unseal target: "./itests/sector_unseal_test.go" + - test: name: test-itest-self_sent_txn + requires: + - build suite: itest-self_sent_txn target: "./itests/self_sent_txn_test.go" + - test: name: test-itest-splitstore + requires: + - build suite: itest-splitstore target: "./itests/splitstore_test.go" + - test: name: test-itest-tape + requires: + - build suite: itest-tape target: "./itests/tape_test.go" + - test: name: test-itest-verifreg + requires: + - build suite: itest-verifreg target: "./itests/verifreg_test.go" + - test: name: test-itest-wdpost_config + requires: + - build suite: itest-wdpost_config target: "./itests/wdpost_config_test.go" + - test: name: test-itest-wdpost_dispute + requires: + - build suite: itest-wdpost_dispute target: "./itests/wdpost_dispute_test.go" + - test: name: test-itest-wdpost_no_miner_storage + requires: + - build suite: itest-wdpost_no_miner_storage target: "./itests/wdpost_no_miner_storage_test.go" + - test: name: test-itest-wdpost + requires: + - build suite: itest-wdpost target: "./itests/wdpost_test.go" + - test: name: test-itest-wdpost_worker_config + requires: + - build suite: itest-wdpost_worker_config target: "./itests/wdpost_worker_config_test.go" + executor: golang-2xl - test: name: test-itest-worker + requires: + - build suite: itest-worker target: "./itests/worker_test.go" + executor: golang-2xl - test: name: test-itest-worker_upgrade + requires: + - build suite: itest-worker_upgrade target: "./itests/worker_upgrade_test.go" + - test: name: test-unit-cli + requires: + - build suite: utest-unit-cli target: "./cli/... ./cmd/... ./api/..." + get-params: true + - test: name: test-unit-node + requires: + - build suite: utest-unit-node target: "./node/..." + + - test: name: test-unit-rest + requires: + - build suite: utest-unit-rest target: "./api/... ./blockstore/... ./build/... ./chain/... ./cli/... ./cmd/... ./conformance/... ./extern/... ./gateway/... ./journal/... ./lib/... ./markets/... ./node/... ./paychmgr/... ./storage/... ./tools/..." + + executor: golang-2xl - test: name: test-unit-storage + requires: + - build suite: utest-unit-storage target: "./storage/... ./extern/..." + + - test: go-test-flags: "-run=TestMulticoreSDR" + requires: + - build suite: multicore-sdr-check target: "./storage/sealer/ffiwrapper" proofs-log-test: "1" - test-conformance: + requires: + - build suite: conformance target: "./conformance" - test-conformance: name: test-conformance-bleeding-edge + requires: + - build suite: conformance-bleeding-edge target: "./conformance" vectors-branch: specs-actors-v7 diff --git a/.circleci/template.yml b/.circleci/template.yml index 6906f13f4bd..ba71ccc73b5 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -5,6 +5,11 @@ orbs: executors: golang: + docker: + # Must match GO_VERSION_MIN in project root + - image: cimg/go:1.18.8 + resource_class: large + golang-2xl: docker: # Must match GO_VERSION_MIN in project root - image: cimg/go:1.18.8 @@ -14,7 +19,7 @@ executors: - image: ubuntu:20.04 commands: - prepare: + build-platform-specific: parameters: linux: default: true @@ -34,6 +39,7 @@ commands: - when: condition: <> steps: + - prepare - run: name: Check Go Version command: | @@ -43,10 +49,6 @@ commands: echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." exit 1 fi - - run: sudo apt-get update - - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev - - run: sudo apt-get install python-is-python3 - - when: condition: <> steps: @@ -69,6 +71,7 @@ commands: curl https://sh.rustup.rs -sSf | sh -s -- -y - run: git submodule sync - run: git submodule update --init + - run: make deps lotus download-params: steps: - restore_cache: @@ -77,7 +80,7 @@ commands: - 'v26-2k-lotus-params' paths: - /var/tmp/filecoin-proof-parameters/ - - run: ./lotus fetch-params 2048 + - run: ./lotus fetch-params 2048 - save_cache: name: Save parameters cache key: 'v26-2k-lotus-params' @@ -99,12 +102,42 @@ commands: name: fetch all tags command: | git fetch --all + prepare: + steps: + - run: sudo apt-get update + - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev jobs: + build: + executor: golang + working_directory: ~/lotus + steps: + - checkout + - git_fetch_all_tags + - run: + name: Check Go Version + command: | + v=`go version | { read _ _ v _; echo ${v#go}; }` + if [["[[ $v != `cat GO_VERSION_MIN` ]]"]]; then + echo "GO_VERSION_MIN file does not match the go version being used." + echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." + exit 1 + fi + - prepare + - run: git submodule sync + - run: git submodule update --init + - run: make deps lotus + - persist_to_workspace: + root: ~/ + paths: + - "lotus" mod-tidy-check: executor: golang + working_directory: ~/lotus steps: - prepare + - attach_workspace: + at: ~/ - run: go mod tidy -v - run: name: Check git diff @@ -115,13 +148,14 @@ jobs: test: description: | Run tests with gotestsum. + working_directory: ~/lotus parameters: &test-params executor: type: executor default: golang go-test-flags: type: string - default: "-timeout 30m" + default: "-timeout 20m" description: Flags passed to go test. target: type: string @@ -130,21 +164,22 @@ jobs: proofs-log-test: type: string default: "0" + get-params: + type: boolean + default: false suite: type: string default: unit description: Test suite name to report to CircleCI. - gotestsum-format: - type: string - default: standard-verbose - description: gotestsum format. https://github.com/gotestyourself/gotestsum#format executor: << parameters.executor >> steps: - prepare - - run: - command: make deps lotus - no_output_timeout: 30m - - download-params + - attach_workspace: + at: ~/ + - when: + condition: << parameters.get-params >> + steps: + - download-params - run: name: go test environment: @@ -155,7 +190,7 @@ jobs: mkdir -p /tmp/test-reports/<< parameters.suite >> mkdir -p /tmp/test-artifacts gotestsum \ - --format << parameters.gotestsum-format >> \ + --format standard-verbose \ --junitfile /tmp/test-reports/<< parameters.suite >>/junit.xml \ --jsonfile /tmp/test-artifacts/<< parameters.suite >>.json \ -- \ @@ -168,6 +203,7 @@ jobs: path: /tmp/test-artifacts/<< parameters.suite >>.json test-conformance: + working_directory: ~/lotus description: | Run tests using a corpus of interoperable test vectors for Filecoin implementations to test their correctness and compliance with the Filecoin @@ -184,9 +220,8 @@ jobs: executor: << parameters.executor >> steps: - prepare - - run: - command: make deps lotus - no_output_timeout: 30m + - attach_workspace: + at: ~/ - download-params - when: condition: @@ -229,7 +264,7 @@ jobs: build-linux-amd64: executor: golang steps: - - prepare + - build-platform-specific - run: make lotus lotus-miner lotus-worker - run: name: check tag and version output match @@ -248,7 +283,7 @@ jobs: macos: xcode: "13.4.1" steps: - - prepare: + - build-platform-specific: linux: false darwin: true darwin-architecture: amd64 @@ -272,7 +307,7 @@ jobs: resource_class: filecoin-project/self-hosted-m1 steps: - run: echo 'export PATH=/opt/homebrew/bin:"$PATH"' >> "$BASH_ENV" - - prepare: + - build-platform-specific: linux: false darwin: true darwin-architecture: arm64 @@ -380,16 +415,18 @@ jobs: gofmt: executor: golang + working_directory: ~/lotus steps: - - prepare - run: command: "! go fmt ./... 2>&1 | read" gen-check: executor: golang + working_directory: ~/lotus steps: - prepare - - run: make deps + - attach_workspace: + at: ~/ - run: go install golang.org/x/tools/cmd/goimports - run: go install github.com/hannahhoward/cbor-gen-for - run: make gen @@ -399,32 +436,29 @@ jobs: docs-check: executor: golang + working_directory: ~/lotus steps: - prepare + - attach_workspace: + at: ~/ - run: go install golang.org/x/tools/cmd/goimports - run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../pre-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../pre-openrpc-worker - - run: make deps - run: make docsgen - run: zcat build/openrpc/full.json.gz | jq > ../post-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../post-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../post-openrpc-worker - run: diff ../pre-openrpc-full ../post-openrpc-full && diff ../pre-openrpc-miner ../post-openrpc-miner && diff ../pre-openrpc-worker ../post-openrpc-worker && git --no-pager diff && git --no-pager diff --quiet - lint: &lint + lint-all: description: | Run golangci-lint. + working_directory: ~/lotus parameters: executor: type: executor default: golang - concurrency: - type: string - default: '2' - description: | - Concurrency used to run linters. Defaults to 2 because NumCPU is not - aware of container CPU limits. args: type: string default: '' @@ -433,16 +467,13 @@ jobs: executor: << parameters.executor >> steps: - prepare - - run: - command: make deps - no_output_timeout: 30m + - attach_workspace: + at: ~/ - run: name: Lint command: | - golangci-lint run -v --timeout 2m \ - --concurrency << parameters.concurrency >> << parameters.args >> - lint-all: - <<: *lint + golangci-lint run -v --timeout 10m \ + --concurrency 4 << parameters.args >> publish: description: publish binary artifacts @@ -462,7 +493,6 @@ jobs: command: apt update && apt install -y git jq curl sudo - checkout - git_fetch_all_tags - - checkout - install_ipfs - attach_workspace: at: /tmp/workspace @@ -606,41 +636,62 @@ jobs: extra_build_args: --target <> --build-arg GOFLAGS=-tags=<> workflows: - version: 2.1 ci: jobs: + - build - lint-all: - concurrency: "16" # expend all docker 2xlarge CPUs. - - mod-tidy-check - - gofmt - - gen-check - - docs-check + requires: + - build + - mod-tidy-check: + requires: + - build + - gofmt: + requires: + - build + - gen-check: + requires: + - build + - docs-check: + requires: + - build [[- range $file := .ItestFiles -]] [[ with $name := $file | stripSuffix ]] - test: name: test-itest-[[ $name ]] + requires: + - build suite: itest-[[ $name ]] target: "./itests/[[ $file ]]" - [[ end ]] - [[- end -]] + [[if or (eq $name "worker") (eq $name "deals_concurrent") (eq $name "wdpost_worker_config")]]executor: golang-2xl[[end]] + [[ end ]][[- end -]] [[range $suite, $pkgs := .UnitSuites]] - test: name: test-[[ $suite ]] + requires: + - build suite: utest-[[ $suite ]] target: "[[ $pkgs ]]" + [[if eq $suite "unit-cli"]]get-params: true[[end]] + [[if eq $suite "unit-rest"]]executor: golang-2xl[[end]] [[- end]] - test: go-test-flags: "-run=TestMulticoreSDR" + requires: + - build suite: multicore-sdr-check target: "./storage/sealer/ffiwrapper" proofs-log-test: "1" - test-conformance: + requires: + - build suite: conformance target: "./conformance" - test-conformance: name: test-conformance-bleeding-edge + requires: + - build suite: conformance-bleeding-edge target: "./conformance" vectors-branch: specs-actors-v7 From f9404aa55e8d62578371e99e0818c06059b1e477 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Mon, 19 Dec 2022 16:18:07 -0500 Subject: [PATCH 030/282] Try medium+ --- .circleci/config.yml | 2 +- .circleci/template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index bfb947de3dd..11b21ae3733 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -8,7 +8,7 @@ executors: docker: # Must match GO_VERSION_MIN in project root - image: cimg/go:1.18.8 - resource_class: large + resource_class: medium+ golang-2xl: docker: # Must match GO_VERSION_MIN in project root diff --git a/.circleci/template.yml b/.circleci/template.yml index ba71ccc73b5..f135c7cb84f 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -8,7 +8,7 @@ executors: docker: # Must match GO_VERSION_MIN in project root - image: cimg/go:1.18.8 - resource_class: large + resource_class: medium+ golang-2xl: docker: # Must match GO_VERSION_MIN in project root From 3bae3a3bea58372e415c5b23cd4b28093614a16e Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 20 Dec 2022 10:03:22 -0500 Subject: [PATCH 031/282] Reorg some jobs --- .circleci/config.yml | 178 +++++------------------------------------ .circleci/template.yml | 61 +++++++------- 2 files changed, 50 insertions(+), 189 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 11b21ae3733..964c86b0523 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -36,19 +36,13 @@ commands: steps: - checkout - git_fetch_all_tags + - run: git submodule sync + - run: git submodule update --init - when: condition: <> steps: - - prepare - - run: - name: Check Go Version - command: | - v=`go version | { read _ _ v _; echo ${v#go}; }` - if [[ $v != `cat GO_VERSION_MIN` ]]; then - echo "GO_VERSION_MIN file does not match the go version being used." - echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." - exit 1 - fi + - install-ubuntu-deps + - check-go-version - when: condition: <> steps: @@ -69,8 +63,6 @@ commands: name: Install Rust command: | curl https://sh.rustup.rs -sSf | sh -s -- -y - - run: git submodule sync - - run: git submodule update --init - run: make deps lotus download-params: steps: @@ -102,10 +94,19 @@ commands: name: fetch all tags command: | git fetch --all - prepare: + install-ubuntu-deps: steps: - run: sudo apt-get update - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev + check-go-version: + steps: + - run: | + v=`go version | { read _ _ v _; echo ${v#go}; }` + if [[ $v != `cat GO_VERSION_MIN` ]]; then + echo "GO_VERSION_MIN file does not match the go version being used." + echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." + exit 1 + fi jobs: build: @@ -114,18 +115,10 @@ jobs: steps: - checkout - git_fetch_all_tags - - run: - name: Check Go Version - command: | - v=`go version | { read _ _ v _; echo ${v#go}; }` - if [[ $v != `cat GO_VERSION_MIN` ]]; then - echo "GO_VERSION_MIN file does not match the go version being used." - echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." - exit 1 - fi - - prepare - run: git submodule sync - run: git submodule update --init + - install-ubuntu-deps + - check-go-version - run: make deps lotus - persist_to_workspace: root: ~/ @@ -135,7 +128,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go mod tidy -v @@ -173,7 +166,7 @@ jobs: description: Test suite name to report to CircleCI. executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - when: @@ -219,7 +212,7 @@ jobs: submodule is used. executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - download-params @@ -424,7 +417,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go install golang.org/x/tools/cmd/goimports @@ -438,7 +431,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go install golang.org/x/tools/cmd/goimports @@ -466,7 +459,7 @@ jobs: Arguments to pass to golangci-lint executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: @@ -660,56 +653,42 @@ workflows: - build suite: itest-api target: "./itests/api_test.go" - - - test: name: test-itest-batch_deal requires: - build suite: itest-batch_deal target: "./itests/batch_deal_test.go" - - - test: name: test-itest-ccupgrade requires: - build suite: itest-ccupgrade target: "./itests/ccupgrade_test.go" - - - test: name: test-itest-cli requires: - build suite: itest-cli target: "./itests/cli_test.go" - - - test: name: test-itest-deadlines requires: - build suite: itest-deadlines target: "./itests/deadlines_test.go" - - - test: name: test-itest-deals_512mb requires: - build suite: itest-deals_512mb target: "./itests/deals_512mb_test.go" - - - test: name: test-itest-deals_anycid requires: - build suite: itest-deals_anycid target: "./itests/deals_anycid_test.go" - - - test: name: test-itest-deals_concurrent requires: @@ -717,423 +696,318 @@ workflows: suite: itest-deals_concurrent target: "./itests/deals_concurrent_test.go" executor: golang-2xl - - test: name: test-itest-deals_invalid_utf8_label requires: - build suite: itest-deals_invalid_utf8_label target: "./itests/deals_invalid_utf8_label_test.go" - - - test: name: test-itest-deals_max_staging_deals requires: - build suite: itest-deals_max_staging_deals target: "./itests/deals_max_staging_deals_test.go" - - - test: name: test-itest-deals_offline requires: - build suite: itest-deals_offline target: "./itests/deals_offline_test.go" - - - test: name: test-itest-deals_padding requires: - build suite: itest-deals_padding target: "./itests/deals_padding_test.go" - - - test: name: test-itest-deals_partial_retrieval_dm-level requires: - build suite: itest-deals_partial_retrieval_dm-level target: "./itests/deals_partial_retrieval_dm-level_test.go" - - - test: name: test-itest-deals_partial_retrieval requires: - build suite: itest-deals_partial_retrieval target: "./itests/deals_partial_retrieval_test.go" - - - test: name: test-itest-deals_power requires: - build suite: itest-deals_power target: "./itests/deals_power_test.go" - - - test: name: test-itest-deals_pricing requires: - build suite: itest-deals_pricing target: "./itests/deals_pricing_test.go" - - - test: name: test-itest-deals_publish requires: - build suite: itest-deals_publish target: "./itests/deals_publish_test.go" - - - test: name: test-itest-deals_remote_retrieval requires: - build suite: itest-deals_remote_retrieval target: "./itests/deals_remote_retrieval_test.go" - - - test: name: test-itest-deals_retry_deal_no_funds requires: - build suite: itest-deals_retry_deal_no_funds target: "./itests/deals_retry_deal_no_funds_test.go" - - - test: name: test-itest-deals requires: - build suite: itest-deals target: "./itests/deals_test.go" - - - test: name: test-itest-dup_mpool_messages requires: - build suite: itest-dup_mpool_messages target: "./itests/dup_mpool_messages_test.go" - - - test: name: test-itest-gas_estimation requires: - build suite: itest-gas_estimation target: "./itests/gas_estimation_test.go" - - - test: name: test-itest-gateway requires: - build suite: itest-gateway target: "./itests/gateway_test.go" - - - test: name: test-itest-get_messages_in_ts requires: - build suite: itest-get_messages_in_ts target: "./itests/get_messages_in_ts_test.go" - - - test: name: test-itest-lite_migration requires: - build suite: itest-lite_migration target: "./itests/lite_migration_test.go" - - - test: name: test-itest-lookup_robust_address requires: - build suite: itest-lookup_robust_address target: "./itests/lookup_robust_address_test.go" - - - test: name: test-itest-mempool requires: - build suite: itest-mempool target: "./itests/mempool_test.go" - - - test: name: test-itest-migration_nv17 requires: - build suite: itest-migration_nv17 target: "./itests/migration_nv17_test.go" - - - test: name: test-itest-mpool_msg_uuid requires: - build suite: itest-mpool_msg_uuid target: "./itests/mpool_msg_uuid_test.go" - - - test: name: test-itest-mpool_push_with_uuid requires: - build suite: itest-mpool_push_with_uuid target: "./itests/mpool_push_with_uuid_test.go" - - - test: name: test-itest-multisig requires: - build suite: itest-multisig target: "./itests/multisig_test.go" - - - test: name: test-itest-net requires: - build suite: itest-net target: "./itests/net_test.go" - - - test: name: test-itest-nonce requires: - build suite: itest-nonce target: "./itests/nonce_test.go" - - - test: name: test-itest-path_detach_redeclare requires: - build suite: itest-path_detach_redeclare target: "./itests/path_detach_redeclare_test.go" - - - test: name: test-itest-path_type_filters requires: - build suite: itest-path_type_filters target: "./itests/path_type_filters_test.go" - - - test: name: test-itest-paych_api requires: - build suite: itest-paych_api target: "./itests/paych_api_test.go" - - - test: name: test-itest-paych_cli requires: - build suite: itest-paych_cli target: "./itests/paych_cli_test.go" - - - test: name: test-itest-pending_deal_allocation requires: - build suite: itest-pending_deal_allocation target: "./itests/pending_deal_allocation_test.go" - - - test: name: test-itest-raft_messagesigner requires: - build suite: itest-raft_messagesigner target: "./itests/raft_messagesigner_test.go" - - - test: name: test-itest-remove_verifreg_datacap requires: - build suite: itest-remove_verifreg_datacap target: "./itests/remove_verifreg_datacap_test.go" - - - test: name: test-itest-sdr_upgrade requires: - build suite: itest-sdr_upgrade target: "./itests/sdr_upgrade_test.go" - - - test: name: test-itest-sector_finalize_early requires: - build suite: itest-sector_finalize_early target: "./itests/sector_finalize_early_test.go" - - - test: name: test-itest-sector_import_full requires: - build suite: itest-sector_import_full target: "./itests/sector_import_full_test.go" - - - test: name: test-itest-sector_import_simple requires: - build suite: itest-sector_import_simple target: "./itests/sector_import_simple_test.go" - - - test: name: test-itest-sector_make_cc_avail requires: - build suite: itest-sector_make_cc_avail target: "./itests/sector_make_cc_avail_test.go" - - - test: name: test-itest-sector_miner_collateral requires: - build suite: itest-sector_miner_collateral target: "./itests/sector_miner_collateral_test.go" - - - test: name: test-itest-sector_numassign requires: - build suite: itest-sector_numassign target: "./itests/sector_numassign_test.go" - - - test: name: test-itest-sector_pledge requires: - build suite: itest-sector_pledge target: "./itests/sector_pledge_test.go" - - - test: name: test-itest-sector_prefer_no_upgrade requires: - build suite: itest-sector_prefer_no_upgrade target: "./itests/sector_prefer_no_upgrade_test.go" - - - test: name: test-itest-sector_revert_available requires: - build suite: itest-sector_revert_available target: "./itests/sector_revert_available_test.go" - - - test: name: test-itest-sector_terminate requires: - build suite: itest-sector_terminate target: "./itests/sector_terminate_test.go" - - - test: name: test-itest-sector_unseal requires: - build suite: itest-sector_unseal target: "./itests/sector_unseal_test.go" - - - test: name: test-itest-self_sent_txn requires: - build suite: itest-self_sent_txn target: "./itests/self_sent_txn_test.go" - - - test: name: test-itest-splitstore requires: - build suite: itest-splitstore target: "./itests/splitstore_test.go" - - - test: name: test-itest-tape requires: - build suite: itest-tape target: "./itests/tape_test.go" - - - test: name: test-itest-verifreg requires: - build suite: itest-verifreg target: "./itests/verifreg_test.go" - - - test: name: test-itest-wdpost_config requires: - build suite: itest-wdpost_config target: "./itests/wdpost_config_test.go" - - - test: name: test-itest-wdpost_dispute requires: - build suite: itest-wdpost_dispute target: "./itests/wdpost_dispute_test.go" - - - test: name: test-itest-wdpost_no_miner_storage requires: - build suite: itest-wdpost_no_miner_storage target: "./itests/wdpost_no_miner_storage_test.go" - - - test: name: test-itest-wdpost requires: - build suite: itest-wdpost target: "./itests/wdpost_test.go" - - - test: name: test-itest-wdpost_worker_config requires: @@ -1141,7 +1015,6 @@ workflows: suite: itest-wdpost_worker_config target: "./itests/wdpost_worker_config_test.go" executor: golang-2xl - - test: name: test-itest-worker requires: @@ -1149,15 +1022,12 @@ workflows: suite: itest-worker target: "./itests/worker_test.go" executor: golang-2xl - - test: name: test-itest-worker_upgrade requires: - build suite: itest-worker_upgrade target: "./itests/worker_upgrade_test.go" - - - test: name: test-unit-cli requires: @@ -1165,7 +1035,6 @@ workflows: suite: utest-unit-cli target: "./cli/... ./cmd/... ./api/..." get-params: true - - test: name: test-unit-node requires: @@ -1173,14 +1042,12 @@ workflows: suite: utest-unit-node target: "./node/..." - - test: name: test-unit-rest requires: - build suite: utest-unit-rest target: "./api/... ./blockstore/... ./build/... ./chain/... ./cli/... ./cmd/... ./conformance/... ./extern/... ./gateway/... ./journal/... ./lib/... ./markets/... ./node/... ./paychmgr/... ./storage/... ./tools/..." - executor: golang-2xl - test: name: test-unit-storage @@ -1189,7 +1056,6 @@ workflows: suite: utest-unit-storage target: "./storage/... ./extern/..." - - test: go-test-flags: "-run=TestMulticoreSDR" requires: diff --git a/.circleci/template.yml b/.circleci/template.yml index f135c7cb84f..6bb688d278d 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -36,19 +36,13 @@ commands: steps: - checkout - git_fetch_all_tags + - run: git submodule sync + - run: git submodule update --init - when: condition: <> steps: - - prepare - - run: - name: Check Go Version - command: | - v=`go version | { read _ _ v _; echo ${v#go}; }` - if [["[[ $v != `cat GO_VERSION_MIN` ]]"]]; then - echo "GO_VERSION_MIN file does not match the go version being used." - echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." - exit 1 - fi + - install-ubuntu-deps + - check-go-version - when: condition: <> steps: @@ -69,8 +63,6 @@ commands: name: Install Rust command: | curl https://sh.rustup.rs -sSf | sh -s -- -y - - run: git submodule sync - - run: git submodule update --init - run: make deps lotus download-params: steps: @@ -102,10 +94,19 @@ commands: name: fetch all tags command: | git fetch --all - prepare: + install-ubuntu-deps: steps: - run: sudo apt-get update - run: sudo apt-get install ocl-icd-opencl-dev libhwloc-dev + check-go-version: + steps: + - run: | + v=`go version | { read _ _ v _; echo ${v#go}; }` + if [["[[ $v != `cat GO_VERSION_MIN` ]]"]]; then + echo "GO_VERSION_MIN file does not match the go version being used." + echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." + exit 1 + fi jobs: build: @@ -114,18 +115,10 @@ jobs: steps: - checkout - git_fetch_all_tags - - run: - name: Check Go Version - command: | - v=`go version | { read _ _ v _; echo ${v#go}; }` - if [["[[ $v != `cat GO_VERSION_MIN` ]]"]]; then - echo "GO_VERSION_MIN file does not match the go version being used." - echo "Please update image to cimg/go:`cat GO_VERSION_MIN` or update GO_VERSION_MIN to $v." - exit 1 - fi - - prepare - run: git submodule sync - run: git submodule update --init + - install-ubuntu-deps + - check-go-version - run: make deps lotus - persist_to_workspace: root: ~/ @@ -135,7 +128,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go mod tidy -v @@ -173,7 +166,7 @@ jobs: description: Test suite name to report to CircleCI. executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - when: @@ -219,7 +212,7 @@ jobs: submodule is used. executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - download-params @@ -424,7 +417,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go install golang.org/x/tools/cmd/goimports @@ -438,7 +431,7 @@ jobs: executor: golang working_directory: ~/lotus steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: go install golang.org/x/tools/cmd/goimports @@ -466,7 +459,7 @@ jobs: Arguments to pass to golangci-lint executor: << parameters.executor >> steps: - - prepare + - install-ubuntu-deps - attach_workspace: at: ~/ - run: @@ -663,10 +656,12 @@ workflows: - build suite: itest-[[ $name ]] target: "./itests/[[ $file ]]" - [[if or (eq $name "worker") (eq $name "deals_concurrent") (eq $name "wdpost_worker_config")]]executor: golang-2xl[[end]] - [[ end ]][[- end -]] + [[- if or (eq $name "worker") (eq $name "deals_concurrent") (eq $name "wdpost_worker_config")]] + executor: golang-2xl + [[- end]] + [[- end ]][[- end]] - [[range $suite, $pkgs := .UnitSuites]] + [[- range $suite, $pkgs := .UnitSuites]] - test: name: test-[[ $suite ]] requires: @@ -674,7 +669,7 @@ workflows: suite: utest-[[ $suite ]] target: "[[ $pkgs ]]" [[if eq $suite "unit-cli"]]get-params: true[[end]] - [[if eq $suite "unit-rest"]]executor: golang-2xl[[end]] + [[- if eq $suite "unit-rest"]]executor: golang-2xl[[end]] [[- end]] - test: go-test-flags: "-run=TestMulticoreSDR" From fd1e0ad7a3566dc69b4cfcb00f8c97778292ab89 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 20 Dec 2022 12:45:06 -0500 Subject: [PATCH 032/282] rerun fails --- .circleci/config.yml | 5 ++--- .circleci/template.yml | 5 ++--- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 964c86b0523..ce1561e6601 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -186,9 +186,8 @@ jobs: --format standard-verbose \ --junitfile /tmp/test-reports/<< parameters.suite >>/junit.xml \ --jsonfile /tmp/test-artifacts/<< parameters.suite >>.json \ - -- \ - << parameters.go-test-flags >> \ - << parameters.target >> + --packages="<< parameters.target >>" \ + -- << parameters.go-test-flags >> no_output_timeout: 30m - store_test_results: path: /tmp/test-reports diff --git a/.circleci/template.yml b/.circleci/template.yml index 6bb688d278d..1b79e595ca7 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -186,9 +186,8 @@ jobs: --format standard-verbose \ --junitfile /tmp/test-reports/<< parameters.suite >>/junit.xml \ --jsonfile /tmp/test-artifacts/<< parameters.suite >>.json \ - -- \ - << parameters.go-test-flags >> \ - << parameters.target >> + --packages="<< parameters.target >>" \ + -- << parameters.go-test-flags >> no_output_timeout: 30m - store_test_results: path: /tmp/test-reports From 0ebdbed30b9c31539445485d9b5e201b55c7f27a Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Tue, 20 Dec 2022 12:01:22 -0500 Subject: [PATCH 033/282] Refactor renew and remove extend --- cmd/lotus-miner/sectors.go | 348 +++++----------------------- documentation/en/cli-lotus-miner.md | 29 +-- 2 files changed, 63 insertions(+), 314 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index fc5fdcef62d..455b5976b08 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -51,7 +51,6 @@ var sectorsCmd = &cli.Command{ sectorPreCommitsCmd, sectorsCheckExpireCmd, sectorsExpiredCmd, - sectorsRenewCmd, sectorsExtendCmd, sectorsTerminateCmd, sectorsRemoveCmd, @@ -743,14 +742,14 @@ func ArrayToString(array []uint64) string { return strings.Join(sarray, ",") } -func getSectorsFromFile(filePath string) ([]uint64, error) { +func getSectorsFromFile(filePath string) ([]abi.SectorNumber, error) { file, err := os.Open(filePath) if err != nil { return nil, err } scanner := bufio.NewScanner(file) - sectors := make([]uint64, 0) + sectors := make([]abi.SectorNumber, 0) for scanner.Scan() { line := scanner.Text() @@ -760,7 +759,7 @@ func getSectorsFromFile(filePath string) ([]uint64, error) { return nil, xerrors.Errorf("could not parse %s as sector id: %s", line, err) } - sectors = append(sectors, id) + sectors = append(sectors, abi.SectorNumber(id)) } if err = file.Close(); err != nil { @@ -770,9 +769,19 @@ func getSectorsFromFile(filePath string) ([]uint64, error) { return sectors, nil } -var sectorsRenewCmd = &cli.Command{ - Name: "renew", - Usage: "Renew expiring sectors while not exceeding each sector's max life", +func SectorNumsToBitfield(sectors []abi.SectorNumber) bitfield.BitField { + var numbers []uint64 + for sector := range sectors { + numbers = append(numbers, uint64(sector)) + } + + return bitfield.NewFromSet(numbers) +} + +var sectorsExtendCmd = &cli.Command{ + Name: "extend", + Usage: "Extend expiring sectors while not exceeding each sector's max life", + ArgsUsage: "", Flags: []cli.Flag{ &cli.Int64Flag{ Name: "from", @@ -819,7 +828,7 @@ var sectorsRenewCmd = &cli.Command{ }, &cli.BoolFlag{ Name: "really-do-it", - Usage: "pass this flag to really renew sectors, otherwise will only print out json representation of parameters", + Usage: "pass this flag to really extend sectors, otherwise will only print out json representation of parameters", }, }, Action: func(cctx *cli.Context) error { @@ -896,8 +905,7 @@ var sectorsRenewCmd = &cli.Command{ return err } - excludeSet := make(map[uint64]struct{}) - + excludeSet := make(map[abi.SectorNumber]struct{}) if cctx.IsSet("exclude") { excludeSectors, err := getSectorsFromFile(cctx.String("exclude")) if err != nil { @@ -909,28 +917,24 @@ var sectorsRenewCmd = &cli.Command{ } } - var sis []*miner.SectorOnChainInfo - - if cctx.IsSet("sector-file") { - sectors, err := getSectorsFromFile(cctx.String("sector-file")) - if err != nil { - return err + var sectors []abi.SectorNumber + if cctx.Args().Present() { + if cctx.IsSet("sector-file") { + return xerrors.Errorf("sector-file specified along with command line params") } - for _, id := range sectors { - if _, exclude := excludeSet[id]; exclude { - continue - } - - si, found := activeSectorsInfo[abi.SectorNumber(id)] - if !found { - return xerrors.Errorf("sector %d is not active", id) - } - if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { - continue + for i, s := range cctx.Args().Slice() { + id, err := strconv.ParseUint(s, 10, 64) + if err != nil { + return xerrors.Errorf("could not parse sector %d: %w", i, err) } - sis = append(sis, si) + sectors = append(sectors, abi.SectorNumber(id)) + } + } else if cctx.IsSet("sector-file") { + sectors, err = getSectorsFromFile(cctx.String("sector-file")) + if err != nil { + return err } } else { from := currEpoch + 120 @@ -945,19 +949,28 @@ var sectorsRenewCmd = &cli.Command{ } for _, si := range activeSet { - if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { - continue - } - if si.Expiration >= from && si.Expiration <= to { - if _, exclude := excludeSet[uint64(si.SectorNumber)]; !exclude { - sis = append(sis, si) - } + sectors = append(sectors, si.SectorNumber) } } } - extensions := map[lminer.SectorLocation]map[abi.ChainEpoch][]uint64{} + var sis []*miner.SectorOnChainInfo + for _, id := range sectors { + if _, exclude := excludeSet[id]; exclude { + continue + } + + si, found := activeSectorsInfo[id] + if !found { + return xerrors.Errorf("sector %d is not active", id) + } + if len(si.DealIDs) > 0 && cctx.Bool("only-cc") { + continue + } + + sis = append(sis, si) + } withinTolerance := func(a, b abi.ChainEpoch) bool { diff := a - b @@ -968,6 +981,7 @@ var sectorsRenewCmd = &cli.Command{ return diff <= abi.ChainEpoch(cctx.Int64("tolerance")) } + extensions := map[lminer.SectorLocation]map[abi.ChainEpoch][]abi.SectorNumber{} for _, si := range sis { extension := abi.ChainEpoch(cctx.Int64("extension")) newExp := si.Expiration + extension @@ -997,21 +1011,21 @@ var sectorsRenewCmd = &cli.Command{ es, found := extensions[*l] if !found { - ne := make(map[abi.ChainEpoch][]uint64) - ne[newExp] = []uint64{uint64(si.SectorNumber)} + ne := make(map[abi.ChainEpoch][]abi.SectorNumber) + ne[newExp] = []abi.SectorNumber{si.SectorNumber} extensions[*l] = ne } else { added := false for exp := range es { if withinTolerance(newExp, exp) { - es[exp] = append(es[exp], uint64(si.SectorNumber)) + es[exp] = append(es[exp], si.SectorNumber) added = true break } } if !added { - es[newExp] = []uint64{uint64(si.SectorNumber)} + es[newExp] = []abi.SectorNumber{si.SectorNumber} } } } @@ -1051,7 +1065,7 @@ var sectorsRenewCmd = &cli.Command{ p.Extensions = append(p.Extensions, miner.ExpirationExtension{ Deadline: l.Deadline, Partition: l.Partition, - Sectors: bitfield.NewFromSet(numbers), + Sectors: SectorNumsToBitfield(numbers), NewExpiration: newExp, }) } @@ -1083,7 +1097,7 @@ var sectorsRenewCmd = &cli.Command{ } scount += int(count) } - fmt.Printf("Renewing %d sectors: ", scount) + fmt.Printf("Extending %d sectors: ", scount) stotal += scount if !cctx.Bool("really-do-it") { @@ -1097,8 +1111,7 @@ var sectorsRenewCmd = &cli.Command{ return err } - fmt.Println() - fmt.Println(string(data)) + fmt.Println("\n", string(data)) continue } @@ -1121,252 +1134,7 @@ var sectorsRenewCmd = &cli.Command{ fmt.Println(smsg.Cid()) } - fmt.Printf("%d sectors renewed\n", stotal) - - return nil - }, -} - -var sectorsExtendCmd = &cli.Command{ - Name: "extend", - Usage: "Extend sector expiration", - ArgsUsage: "", - Flags: []cli.Flag{ - &cli.Int64Flag{ - Name: "new-expiration", - Usage: "new expiration epoch", - Required: false, - }, - &cli.BoolFlag{ - Name: "v1-sectors", - Usage: "renews all v1 sectors up to the maximum possible lifetime", - Required: false, - }, - &cli.Int64Flag{ - Name: "tolerance", - Value: 20160, - Usage: "when extending v1 sectors, don't try to extend sectors by fewer than this number of epochs", - Required: false, - }, - &cli.Int64Flag{ - Name: "expiration-ignore", - Value: 120, - Usage: "when extending v1 sectors, skip sectors whose current expiration is less than epochs from now", - Required: false, - }, - &cli.Int64Flag{ - Name: "expiration-cutoff", - Usage: "when extending v1 sectors, skip sectors whose current expiration is more than epochs from now (infinity if unspecified)", - Required: false, - }, - &cli.StringFlag{}, - }, - Action: func(cctx *cli.Context) error { - - api, nCloser, err := lcli.GetFullNodeAPI(cctx) - if err != nil { - return err - } - defer nCloser() - - ctx := lcli.ReqContext(cctx) - - maddr, err := getActorAddress(ctx, cctx) - if err != nil { - return err - } - - var params []miner.ExtendSectorExpirationParams - - if cctx.Bool("v1-sectors") { - - head, err := api.ChainHead(ctx) - if err != nil { - return err - } - - nv, err := api.StateNetworkVersion(ctx, types.EmptyTSK) - if err != nil { - return err - } - - extensions := map[lminer.SectorLocation]map[abi.ChainEpoch][]uint64{} - - // are given durations within tolerance epochs - withinTolerance := func(a, b abi.ChainEpoch) bool { - diff := a - b - if diff < 0 { - diff = b - a - } - - return diff <= abi.ChainEpoch(cctx.Int64("tolerance")) - } - - sis, err := api.StateMinerActiveSectors(ctx, maddr, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting miner sector infos: %w", err) - } - - for _, si := range sis { - if si.SealProof >= abi.RegisteredSealProof_StackedDrg2KiBV1_1 { - continue - } - - if si.Expiration < (head.Height() + abi.ChainEpoch(cctx.Int64("expiration-ignore"))) { - continue - } - - if cctx.IsSet("expiration-cutoff") { - if si.Expiration > (head.Height() + abi.ChainEpoch(cctx.Int64("expiration-cutoff"))) { - continue - } - } - - ml := policy.GetSectorMaxLifetime(si.SealProof, nv) - // if the sector's missing less than "tolerance" of its maximum possible lifetime, don't bother extending it - if withinTolerance(si.Expiration-si.Activation, ml) { - continue - } - - // Set the new expiration to 48 hours less than the theoretical maximum lifetime - newExp := ml - (miner.WPoStProvingPeriod * 2) + si.Activation - if withinTolerance(si.Expiration, newExp) || si.Expiration >= newExp { - continue - } - - p, err := api.StateSectorPartition(ctx, maddr, si.SectorNumber, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting sector location for sector %d: %w", si.SectorNumber, err) - } - - if p == nil { - return xerrors.Errorf("sector %d not found in any partition", si.SectorNumber) - } - - es, found := extensions[*p] - if !found { - ne := make(map[abi.ChainEpoch][]uint64) - ne[newExp] = []uint64{uint64(si.SectorNumber)} - extensions[*p] = ne - } else { - added := false - for exp := range es { - if withinTolerance(exp, newExp) && newExp >= exp && exp > si.Expiration { - es[exp] = append(es[exp], uint64(si.SectorNumber)) - added = true - break - } - } - - if !added { - es[newExp] = []uint64{uint64(si.SectorNumber)} - } - } - } - - p := miner.ExtendSectorExpirationParams{} - scount := 0 - - for l, exts := range extensions { - for newExp, numbers := range exts { - scount += len(numbers) - addressedMax, err := policy.GetAddressedSectorsMax(nv) - if err != nil { - return xerrors.Errorf("failed to get addressed sectors max") - } - declMax, err := policy.GetDeclarationsMax(nv) - if err != nil { - return xerrors.Errorf("failed to get declarations max") - } - if scount > addressedMax || len(p.Extensions) == declMax { - params = append(params, p) - p = miner.ExtendSectorExpirationParams{} - scount = len(numbers) - } - - p.Extensions = append(p.Extensions, miner.ExpirationExtension{ - Deadline: l.Deadline, - Partition: l.Partition, - Sectors: bitfield.NewFromSet(numbers), - NewExpiration: newExp, - }) - } - } - - // if we have any sectors, then one last append is needed here - if scount != 0 { - params = append(params, p) - } - - } else { - if !cctx.Args().Present() || !cctx.IsSet("new-expiration") { - return xerrors.Errorf("must pass at least one sector number and new expiration") - } - sectors := map[lminer.SectorLocation][]uint64{} - - for i, s := range cctx.Args().Slice() { - id, err := strconv.ParseUint(s, 10, 64) - if err != nil { - return xerrors.Errorf("could not parse sector %d: %w", i, err) - } - - p, err := api.StateSectorPartition(ctx, maddr, abi.SectorNumber(id), types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting sector location for sector %d: %w", id, err) - } - - if p == nil { - return xerrors.Errorf("sector %d not found in any partition", id) - } - - sectors[*p] = append(sectors[*p], id) - } - - p := miner.ExtendSectorExpirationParams{} - for l, numbers := range sectors { - - // TODO: Dedup with above loop - p.Extensions = append(p.Extensions, miner.ExpirationExtension{ - Deadline: l.Deadline, - Partition: l.Partition, - Sectors: bitfield.NewFromSet(numbers), - NewExpiration: abi.ChainEpoch(cctx.Int64("new-expiration")), - }) - } - - params = append(params, p) - } - - if len(params) == 0 { - fmt.Println("nothing to extend") - return nil - } - - mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) - if err != nil { - return xerrors.Errorf("getting miner info: %w", err) - } - - for i := range params { - sp, aerr := actors.SerializeParams(¶ms[i]) - if aerr != nil { - return xerrors.Errorf("serializing params: %w", err) - } - - smsg, err := api.MpoolPushMessage(ctx, &types.Message{ - From: mi.Worker, - To: maddr, - Method: builtin.MethodsMiner.ExtendSectorExpiration, - - Value: big.Zero(), - Params: sp, - }, nil) - if err != nil { - return xerrors.Errorf("mpool push message: %w", err) - } - - fmt.Println(smsg.Cid()) - } + fmt.Printf("%d sectors extended\n", stotal) return nil }, diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 4b705adad5c..9bc3bac11f5 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1677,8 +1677,7 @@ COMMANDS: precommits Print on-chain precommit info check-expire Inspect expiring sectors expired Get or cleanup expired sectors - renew Renew expiring sectors while not exceeding each sector's max life - extend Extend sector expiration + extend Extend expiring sectors while not exceeding each sector's max life terminate Terminate sector on-chain then remove (WARNING: This means losing power and collateral for the removed sector) remove Forcefully remove a sector (WARNING: This means losing power and collateral for the removed sector (use 'terminate' for lower penalty)) snap-up Mark a committed capacity sector to be filled with deals @@ -1884,13 +1883,13 @@ OPTIONS: ``` -### lotus-miner sectors renew +### lotus-miner sectors extend ``` NAME: - lotus-miner sectors renew - Renew expiring sectors while not exceeding each sector's max life + lotus-miner sectors extend - Extend expiring sectors while not exceeding each sector's max life USAGE: - lotus-miner sectors renew [command options] [arguments...] + lotus-miner sectors extend [command options] OPTIONS: --exclude value optionally provide a file containing excluding sectors @@ -1900,31 +1899,13 @@ OPTIONS: --max-sectors value the maximum number of sectors contained in each message message (default: 0) --new-expiration value try to extend selected sectors to this epoch, ignoring extension (default: 0) --only-cc only extend CC sectors (useful for making sector ready for snap upgrade) (default: false) - --really-do-it pass this flag to really renew sectors, otherwise will only print out json representation of parameters (default: false) + --really-do-it pass this flag to really extend sectors, otherwise will only print out json representation of parameters (default: false) --sector-file value provide a file containing one sector number in each line, ignoring above selecting criteria --to value only consider sectors whose current expiration epoch is in the range of [from, to], defaults to: now + 92160 (32 days) (default: 0) --tolerance value don't try to extend sectors by fewer than this number of epochs, defaults to 7 days (default: 20160) ``` -### lotus-miner sectors extend -``` -NAME: - lotus-miner sectors extend - Extend sector expiration - -USAGE: - lotus-miner sectors extend [command options] - -OPTIONS: - - --expiration-cutoff value when extending v1 sectors, skip sectors whose current expiration is more than epochs from now (infinity if unspecified) (default: 0) - --expiration-ignore value when extending v1 sectors, skip sectors whose current expiration is less than epochs from now (default: 120) - --new-expiration value new expiration epoch (default: 0) - --tolerance value when extending v1 sectors, don't try to extend sectors by fewer than this number of epochs (default: 20160) - --v1-sectors renews all v1 sectors up to the maximum possible lifetime (default: false) - -``` - ### lotus-miner sectors terminate ``` NAME: From 12a06defd1e7f3e6a14efd21c2bf84cdc8e44423 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 11 Jan 2023 16:21:14 -0500 Subject: [PATCH 034/282] Check sectors for allocation expiry before committing --- storage/pipeline/input.go | 24 ++++++++-- .../pipeline/mocks/mock_precommit_batcher.go | 17 +++++++ storage/pipeline/precommit_batch.go | 46 +++++++++++++++---- 3 files changed, 73 insertions(+), 14 deletions(-) diff --git a/storage/pipeline/input.go b/storage/pipeline/input.go index 25c752e5f42..f06359c8737 100644 --- a/storage/pipeline/input.go +++ b/storage/pipeline/input.go @@ -143,17 +143,33 @@ func (m *Sealing) maybeStartSealing(ctx statemachine.Context, sector SectorInfo, if err != nil { return false, xerrors.Errorf("API error getting head: %w", err) } + + var dealSafeSealEpoch abi.ChainEpoch for _, piece := range sector.Pieces { if piece.DealInfo == nil { continue } - dealSafeSealEpoch := piece.DealInfo.DealProposal.StartEpoch - cfg.StartEpochSealingBuffer - dealSafeSealTime := time.Now().Add(time.Duration(dealSafeSealEpoch-ts.Height()) * blockTime) - if dealSafeSealTime.Before(sealTime) { - sealTime = dealSafeSealTime + + dealSafeSealEpoch = piece.DealInfo.DealProposal.StartEpoch - cfg.StartEpochSealingBuffer + + alloc, _ := m.Api.StateGetAllocationForPendingDeal(ctx.Context(), piece.DealInfo.DealID, types.EmptyTSK) + // alloc is nil if this is not a verified deal in nv17 or later + if alloc == nil { + continue + } + + if alloc.Expiration-cfg.StartEpochSealingBuffer < dealSafeSealEpoch { + dealSafeSealEpoch = alloc.Expiration - cfg.StartEpochSealingBuffer + log.Debugw("checking safe seal epoch", "dealSafeSealEpoch", dealSafeSealEpoch) } } + dealSafeSealTime := time.Now().Add(time.Duration(dealSafeSealEpoch-ts.Height()) * blockTime) + if dealSafeSealTime.Before(sealTime) { + log.Debugw("deal safe time is before seal time", "dealSafeSealTime", dealSafeSealTime, "sealTime", sealTime) + sealTime = dealSafeSealTime + } + if now.After(sealTime) { log.Infow("starting to seal deal sector", "trigger", "wait-timeout", "creation", sector.CreationTime) return true, ctx.Send(SectorStartPacking{}) diff --git a/storage/pipeline/mocks/mock_precommit_batcher.go b/storage/pipeline/mocks/mock_precommit_batcher.go index 2f65e3e034e..2d514eb7eb0 100644 --- a/storage/pipeline/mocks/mock_precommit_batcher.go +++ b/storage/pipeline/mocks/mock_precommit_batcher.go @@ -11,7 +11,9 @@ import ( gomock "github.com/golang/mock/gomock" address "github.com/filecoin-project/go-address" + abi "github.com/filecoin-project/go-state-types/abi" big "github.com/filecoin-project/go-state-types/big" + verifreg "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" network "github.com/filecoin-project/go-state-types/network" api "github.com/filecoin-project/lotus/api" @@ -86,6 +88,21 @@ func (mr *MockPreCommitBatcherApiMockRecorder) StateAccountKey(arg0, arg1, arg2 return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).StateAccountKey), arg0, arg1, arg2) } +// StateGetAllocationForPendingDeal mocks base method. +func (m *MockPreCommitBatcherApi) StateGetAllocationForPendingDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*verifreg.Allocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetAllocationForPendingDeal", arg0, arg1, arg2) + ret0, _ := ret[0].(*verifreg.Allocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetAllocationForPendingDeal indicates an expected call of StateGetAllocationForPendingDeal. +func (mr *MockPreCommitBatcherApiMockRecorder) StateGetAllocationForPendingDeal(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetAllocationForPendingDeal", reflect.TypeOf((*MockPreCommitBatcherApi)(nil).StateGetAllocationForPendingDeal), arg0, arg1, arg2) +} + // StateLookupID mocks base method. func (m *MockPreCommitBatcherApi) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { m.ctrl.T.Helper() diff --git a/storage/pipeline/precommit_batch.go b/storage/pipeline/precommit_batch.go index 6ee6aed9353..9bc6243291b 100644 --- a/storage/pipeline/precommit_batch.go +++ b/storage/pipeline/precommit_batch.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" "github.com/filecoin-project/go-state-types/builtin/v9/miner" + verifregtypes "github.com/filecoin-project/go-state-types/builtin/v9/verifreg" "github.com/filecoin-project/go-state-types/network" "github.com/filecoin-project/lotus/api" @@ -34,6 +35,7 @@ type PreCommitBatcherApi interface { StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (big.Int, error) ChainHead(ctx context.Context) (*types.TipSet, error) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) + StateGetAllocationForPendingDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*verifregtypes.Allocation, error) // Address selector WalletBalance(context.Context, address.Address) (types.BigInt, error) @@ -386,15 +388,25 @@ func (b *PreCommitBatcher) AddPreCommit(ctx context.Context, s SectorInfo, depos return sealiface.PreCommitBatchRes{}, err } - cutoff, err := getPreCommitCutoff(ts.Height(), s) - if err != nil { - return sealiface.PreCommitBatchRes{}, xerrors.Errorf("failed to calculate cutoff: %w", err) + dealStartCutoff := getDealStartCutoff(s) + if dealStartCutoff <= ts.Height() { + return sealiface.PreCommitBatchRes{}, xerrors.Errorf("cutoff has already passed (cutoff %d <= curEpoch %d)", dealStartCutoff, ts.Height()) + } + + // Allocation cutoff is a soft deadline, so don't fail if we've passed it. + allocationCutoff := b.getAllocationCutoff(s) + + var cutoffEpoch abi.ChainEpoch + if dealStartCutoff < allocationCutoff { + cutoffEpoch = dealStartCutoff + } else { + cutoffEpoch = allocationCutoff } sn := s.SectorNumber b.lk.Lock() - b.cutoffs[sn] = cutoff + b.cutoffs[sn] = time.Now().Add(time.Duration(cutoffEpoch-ts.Height()) * time.Duration(build.BlockDelaySecs) * time.Second) b.todo[sn] = &preCommitEntry{ deposit: deposit, pci: in, @@ -471,8 +483,7 @@ func (b *PreCommitBatcher) Stop(ctx context.Context) error { } } -// TODO: If this returned epochs, it would make testing much easier -func getPreCommitCutoff(curEpoch abi.ChainEpoch, si SectorInfo) (time.Time, error) { +func getDealStartCutoff(si SectorInfo) abi.ChainEpoch { cutoffEpoch := si.TicketEpoch + policy.MaxPreCommitRandomnessLookback for _, p := range si.Pieces { if p.DealInfo == nil { @@ -485,9 +496,24 @@ func getPreCommitCutoff(curEpoch abi.ChainEpoch, si SectorInfo) (time.Time, erro } } - if cutoffEpoch <= curEpoch { - return time.Now(), xerrors.Errorf("cutoff has already passed (cutoff %d <= curEpoch %d)", cutoffEpoch, curEpoch) - } + return cutoffEpoch +} + +func (b *PreCommitBatcher) getAllocationCutoff(si SectorInfo) abi.ChainEpoch { + cutoff := si.TicketEpoch + policy.MaxPreCommitRandomnessLookback + for _, p := range si.Pieces { + if p.DealInfo == nil { + continue + } - return time.Now().Add(time.Duration(cutoffEpoch-curEpoch) * time.Duration(build.BlockDelaySecs) * time.Second), nil + alloc, _ := b.api.StateGetAllocationForPendingDeal(b.mctx, p.DealInfo.DealID, types.EmptyTSK) + // alloc is nil if this is not a verified deal in nv17 or later + if alloc == nil { + continue + } + if alloc.Expiration < cutoff { + cutoff = alloc.Expiration + } + } + return cutoff } From 787470c2b42f20d3a39f849c25e29d4bbed26905 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 12 Jan 2023 12:39:57 -0500 Subject: [PATCH 035/282] Remove workaround that is no longer needed --- storage/pipeline/checks.go | 5 ----- 1 file changed, 5 deletions(-) diff --git a/storage/pipeline/checks.go b/storage/pipeline/checks.go index 6381ce898c3..b243804cc0e 100644 --- a/storage/pipeline/checks.go +++ b/storage/pipeline/checks.go @@ -3,7 +3,6 @@ package sealing import ( "bytes" "context" - "time" "golang.org/x/xerrors" @@ -133,8 +132,6 @@ func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, t if err != nil { return xerrors.Errorf("checking if sector is allocated: %w", err) } - // TODO This is a very bad hack!! We are only using this while we investigate the compiler issue here. - time.Sleep(time.Nanosecond) if alloc { //committed P2 message but commit C2 message too late, pci should be null in this case return &ErrSectorNumberAllocated{xerrors.Errorf("sector %d is allocated, but PreCommit info wasn't found on chain", si.SectorNumber)} @@ -164,8 +161,6 @@ func (m *Sealing) checkCommit(ctx context.Context, si SectorInfo, proof []byte, if err != nil { return xerrors.Errorf("checking if sector is allocated: %w", err) } - // TODO This is a very bad hack!! We are only using this while we investigate the compiler issue here. - time.Sleep(time.Nanosecond) if alloc { // not much more we can check here, basically try to wait for commit, // and hope that this will work From fc82aab74b9f0187d38fb01890af287b0c0f6cc7 Mon Sep 17 00:00:00 2001 From: Richard Guan Date: Mon, 16 Jan 2023 16:14:19 +1100 Subject: [PATCH 036/282] add bool flag and gen documentation --- cmd/lotus/main.go | 11 +++++++++++ documentation/en/cli-lotus.md | 1 + 2 files changed, 12 insertions(+) diff --git a/cmd/lotus/main.go b/cmd/lotus/main.go index c19b9fce4df..85324e466b5 100644 --- a/cmd/lotus/main.go +++ b/cmd/lotus/main.go @@ -4,6 +4,7 @@ import ( "context" "os" + "github.com/fatih/color" logging "github.com/ipfs/go-log/v2" "github.com/mattn/go-isatty" "github.com/urfave/cli/v2" @@ -52,6 +53,10 @@ func main() { } jaeger = tracing.SetupJaegerTracing("lotus/" + cmd.Name) + if cctx.IsSet("color") { + color.NoColor = !cctx.Bool("color") + } + if originBefore != nil { return originBefore(cctx) } @@ -75,6 +80,12 @@ func main() { Hidden: true, Value: "~/.lotus", // should follow --repo default }, + &cli.BoolFlag{ + // examined in the Before above + Name: "color", + Usage: "use color in display output", + DefaultText: "depends on output being a TTY", + }, &cli.StringFlag{ Name: "repo", EnvVars: []string{"LOTUS_PATH"}, diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 86ce59ba442..53f55e61d7d 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -38,6 +38,7 @@ COMMANDS: status Check node status GLOBAL OPTIONS: + --color use color in display output (default: depends on output being a TTY) --force-send if true, will ignore pre-send checks (default: false) --help, -h show help (default: false) --interactive setting to false will disable interactive functionality of commands (default: false) From b60aeccfdc68d0d29e81d9111d2513aa4a69f55c Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Mon, 16 Jan 2023 16:03:35 +0000 Subject: [PATCH 037/282] Remove AppImage and Snapcraft build automation --- .circleci/config.yml | 188 ------------------------------- .circleci/gen.go | 2 - .circleci/template.yml | 166 --------------------------- scripts/build-appimage-bundle.sh | 26 ----- scripts/build-arch-bundle.sh | 46 -------- scripts/publish-arch-release.sh | 121 -------------------- 6 files changed, 549 deletions(-) delete mode 100755 scripts/build-appimage-bundle.sh delete mode 100755 scripts/build-arch-bundle.sh delete mode 100755 scripts/publish-arch-release.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index ce1561e6601..d4c00132d05 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -355,56 +355,6 @@ jobs: - run: ./scripts/generate-checksums.sh - run: ./scripts/publish-checksums.sh - build-appimage: - machine: - image: ubuntu-2004:202111-02 - steps: - - checkout - - attach_workspace: - at: /tmp/workspace - - run: - name: Update Go - command: | - sudo rm -rf /usr/local/go && \ - curl -L https://golang.org/dl/go`cat GO_VERSION_MIN`.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ - sudo tar -C /usr/local -xvf /tmp/go.tar.gz - - run: go version - - run: - name: install appimage-builder - command: | - # appimage-builder requires /dev/snd to exist. It creates containers during the testing phase - # that pass sound devices from the host to the testing container. (hard coded!) - # https://github.com/AppImageCrafters/appimage-builder/blob/master/appimagebuilder/modules/test/execution_test.py#L54 - # Circleci doesn't provide a working sound device; this is enough to fake it. - if [ ! -e /dev/snd ] - then - sudo mkdir /dev/snd - sudo mknod /dev/snd/ControlC0 c 1 2 - fi - - # docs: https://appimage-builder.readthedocs.io/en/latest/intro/install.html - sudo apt update - sudo apt install -y python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace - sudo curl -Lo /usr/local/bin/appimagetool https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage - sudo chmod +x /usr/local/bin/appimagetool - sudo pip3 install appimage-builder - - run: - name: install lotus dependencies - command: sudo apt install ocl-icd-opencl-dev libhwloc-dev - - run: - name: build appimage - command: | - sed -i "s/version: latest/version: ${CIRCLE_TAG:-latest}/" AppImageBuilder.yml - make appimage - - run: | - mkdir -p /tmp/workspace/appimage && \ - mv Lotus-*.AppImage /tmp/workspace/appimage/ - - persist_to_workspace: - root: /tmp/workspace - paths: - - appimage - - gofmt: executor: golang working_directory: ~/lotus @@ -467,71 +417,6 @@ jobs: golangci-lint run -v --timeout 10m \ --concurrency 4 << parameters.args >> - publish: - description: publish binary artifacts - executor: ubuntu - parameters: - linux: - default: false - description: publish linux binaries? - type: boolean - appimage: - default: false - description: publish appimage binaries? - type: boolean - steps: - - run: - name: Install git jq curl - command: apt update && apt install -y git jq curl sudo - - checkout - - git_fetch_all_tags - - install_ipfs - - attach_workspace: - at: /tmp/workspace - - when: - condition: << parameters.linux >> - steps: - - run: ./scripts/build-arch-bundle.sh linux - - run: ./scripts/publish-arch-release.sh linux - - when: - condition: << parameters.appimage >> - steps: - - run: ./scripts/build-appimage-bundle.sh - - run: ./scripts/publish-arch-release.sh appimage - - publish-snapcraft: - description: build and push snapcraft - machine: - image: ubuntu-2004:202104-01 - resource_class: 2xlarge - parameters: - channel: - type: string - default: "edge" - description: snapcraft channel - snap-name: - type: string - default: 'lotus-filecoin' - description: name of snap in snap store - steps: - - checkout - - run: - name: Install snapcraft - command: sudo snap install snapcraft --classic - - run: - name: Build << parameters.snap-name >> snap - command: | - if [ "<< parameters.snap-name >>" != 'lotus-filecoin' ]; then - cat snap/snapcraft.yaml | sed 's/lotus-filecoin/lotus/' > edited-snapcraft.yaml - mv edited-snapcraft.yaml snap/snapcraft.yaml - fi - - snapcraft --use-lxd --debug - - run: - name: Publish snap to << parameters.channel >> channel - shell: /bin/bash -o pipefail - command: | - snapcraft upload *.snap --release << parameters.channel >> build-docker: description: > Publish to Dockerhub @@ -1128,71 +1013,6 @@ workflows: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - name: "Build AppImage" - filters: - branches: - only: - - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish: - name: "Publish AppImage" - appimage: true - requires: - - "Build AppImage" - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish-snapcraft: - name: "Publish Snapcraft (lotus / stable)" - channel: stable - snap-name: lotus - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+$/ - - publish-snapcraft: - name: "Publish Snapcraft (lotus / candidate)" - channel: candidate - snap-name: lotus - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+-rc\d+$/ - - publish-snapcraft: - name: "Publish Snapcraft (lotus-filecoin / stable)" - channel: stable - snap-name: lotus-filecoin - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+$/ - - publish-snapcraft: - name: "Publish Snapcraft (lotus-filecoin / candidate)" - channel: candidate - snap-name: lotus-filecoin - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+-rc\d+$/ - build-docker: name: "Docker push (lotus-all-in-one / stable / mainnet)" image: lotus-all-in-one @@ -1428,14 +1248,6 @@ workflows: only: - master jobs: - - publish-snapcraft: - name: "Publish Snapcraft (lotus / edge)" - channel: edge - snap-name: lotus - - publish-snapcraft: - name: "Publish Snapcraft (lotus-filecoin / edge)" - channel: edge - snap-name: lotus-filecoin - build-docker: name: "Docker (lotus-all-in-one / nightly / mainnet)" image: lotus-all-in-one diff --git a/.circleci/gen.go b/.circleci/gen.go index 6cc9cedb131..5d951027a0c 100644 --- a/.circleci/gen.go +++ b/.circleci/gen.go @@ -107,13 +107,11 @@ func main() { // form the input data. type data struct { Networks []string - SnapNames []string ItestFiles []string UnitSuites map[string]string } in := data{ Networks: []string{"mainnet", "butterflynet", "calibnet", "debug"}, - SnapNames: []string{"lotus", "lotus-filecoin"}, ItestFiles: itests, UnitSuites: func() map[string]string { ret := make(map[string]string) diff --git a/.circleci/template.yml b/.circleci/template.yml index 1b79e595ca7..fa912409ade 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -355,56 +355,6 @@ jobs: - run: ./scripts/generate-checksums.sh - run: ./scripts/publish-checksums.sh - build-appimage: - machine: - image: ubuntu-2004:202111-02 - steps: - - checkout - - attach_workspace: - at: /tmp/workspace - - run: - name: Update Go - command: | - sudo rm -rf /usr/local/go && \ - curl -L https://golang.org/dl/go`cat GO_VERSION_MIN`.linux-amd64.tar.gz -o /tmp/go.tar.gz && \ - sudo tar -C /usr/local -xvf /tmp/go.tar.gz - - run: go version - - run: - name: install appimage-builder - command: | - # appimage-builder requires /dev/snd to exist. It creates containers during the testing phase - # that pass sound devices from the host to the testing container. (hard coded!) - # https://github.com/AppImageCrafters/appimage-builder/blob/master/appimagebuilder/modules/test/execution_test.py#L54 - # Circleci doesn't provide a working sound device; this is enough to fake it. - if [ ! -e /dev/snd ] - then - sudo mkdir /dev/snd - sudo mknod /dev/snd/ControlC0 c 1 2 - fi - - # docs: https://appimage-builder.readthedocs.io/en/latest/intro/install.html - sudo apt update - sudo apt install -y python3-pip python3-setuptools patchelf desktop-file-utils libgdk-pixbuf2.0-dev fakeroot strace - sudo curl -Lo /usr/local/bin/appimagetool https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-x86_64.AppImage - sudo chmod +x /usr/local/bin/appimagetool - sudo pip3 install appimage-builder - - run: - name: install lotus dependencies - command: sudo apt install ocl-icd-opencl-dev libhwloc-dev - - run: - name: build appimage - command: | - sed -i "s/version: latest/version: ${CIRCLE_TAG:-latest}/" AppImageBuilder.yml - make appimage - - run: | - mkdir -p /tmp/workspace/appimage && \ - mv Lotus-*.AppImage /tmp/workspace/appimage/ - - persist_to_workspace: - root: /tmp/workspace - paths: - - appimage - - gofmt: executor: golang working_directory: ~/lotus @@ -467,71 +417,6 @@ jobs: golangci-lint run -v --timeout 10m \ --concurrency 4 << parameters.args >> - publish: - description: publish binary artifacts - executor: ubuntu - parameters: - linux: - default: false - description: publish linux binaries? - type: boolean - appimage: - default: false - description: publish appimage binaries? - type: boolean - steps: - - run: - name: Install git jq curl - command: apt update && apt install -y git jq curl sudo - - checkout - - git_fetch_all_tags - - install_ipfs - - attach_workspace: - at: /tmp/workspace - - when: - condition: << parameters.linux >> - steps: - - run: ./scripts/build-arch-bundle.sh linux - - run: ./scripts/publish-arch-release.sh linux - - when: - condition: << parameters.appimage >> - steps: - - run: ./scripts/build-appimage-bundle.sh - - run: ./scripts/publish-arch-release.sh appimage - - publish-snapcraft: - description: build and push snapcraft - machine: - image: ubuntu-2004:202104-01 - resource_class: 2xlarge - parameters: - channel: - type: string - default: "edge" - description: snapcraft channel - snap-name: - type: string - default: 'lotus-filecoin' - description: name of snap in snap store - steps: - - checkout - - run: - name: Install snapcraft - command: sudo snap install snapcraft --classic - - run: - name: Build << parameters.snap-name >> snap - command: | - if [ "<< parameters.snap-name >>" != 'lotus-filecoin' ]; then - cat snap/snapcraft.yaml | sed 's/lotus-filecoin/lotus/' > edited-snapcraft.yaml - mv edited-snapcraft.yaml snap/snapcraft.yaml - fi - - snapcraft --use-lxd --debug - - run: - name: Publish snap to << parameters.channel >> channel - shell: /bin/bash -o pipefail - command: | - snapcraft upload *.snap --release << parameters.channel >> build-docker: description: > Publish to Dockerhub @@ -743,51 +628,6 @@ workflows: branches: only: - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - - build-appimage: - name: "Build AppImage" - filters: - branches: - only: - - /^release\/v\d+\.\d+\.\d+(-rc\d+)?$/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - - publish: - name: "Publish AppImage" - appimage: true - requires: - - "Build AppImage" - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+(-rc\d+)?$/ - [[- range .SnapNames]] - - publish-snapcraft: - name: "Publish Snapcraft ([[.]] / stable)" - channel: stable - snap-name: [[.]] - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+$/ - - publish-snapcraft: - name: "Publish Snapcraft ([[.]] / candidate)" - channel: candidate - snap-name: [[.]] - filters: - branches: - ignore: - - /.*/ - tags: - only: - - /^v\d+\.\d+\.\d+-rc\d+$/ - [[- end]] [[- range .Networks]] - build-docker: name: "Docker push (lotus-all-in-one / stable / [[.]])" @@ -890,12 +730,6 @@ workflows: only: - master jobs: - [[- range .SnapNames]] - - publish-snapcraft: - name: "Publish Snapcraft ([[.]] / edge)" - channel: edge - snap-name: [[.]] - [[- end]] [[- range .Networks]] - build-docker: name: "Docker (lotus-all-in-one / nightly / [[.]])" diff --git a/scripts/build-appimage-bundle.sh b/scripts/build-appimage-bundle.sh deleted file mode 100755 index d4ce6de770a..00000000000 --- a/scripts/build-appimage-bundle.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/usr/bin/env bash -set -ex - -REQUIRED=( - "ipfs" - "sha512sum" -) -for REQUIRE in "${REQUIRED[@]}" -do - command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" -done - -mkdir bundle -pushd bundle - -export IPFS_PATH=`mktemp -d` -ipfs init -ipfs daemon & -PID="$!" -trap "kill -9 ${PID}" EXIT -sleep 30 - -cp "/tmp/workspace/appimage/Lotus-${CIRCLE_TAG}-x86_64.AppImage" . -sha512sum "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.sha512" -ipfs add -q "Lotus-${CIRCLE_TAG}-x86_64.AppImage" > "Lotus-${CIRCLE_TAG}-x86_64.AppImage.cid" -popd diff --git a/scripts/build-arch-bundle.sh b/scripts/build-arch-bundle.sh deleted file mode 100755 index 27b4218f507..00000000000 --- a/scripts/build-arch-bundle.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env bash -set -ex - -ARCH=$1 - -REQUIRED=( - "ipfs" - "sha512sum" -) -for REQUIRE in "${REQUIRED[@]}" -do - command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" -done - -mkdir bundle -pushd bundle - -BINARIES=( - "lotus" - "lotus-miner" - "lotus-worker" -) - -export IPFS_PATH=`mktemp -d` -ipfs init -ipfs daemon & -PID="$!" -trap "kill -9 ${PID}" EXIT -sleep 30 - -mkdir -p "${ARCH}/lotus" -pushd "${ARCH}" -for BINARY in "${BINARIES[@]}" -do - cp "../../${ARCH}/${BINARY}" "lotus/" - chmod +x "lotus/${BINARY}" -done - -tar -zcvf "../lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" lotus -popd -rm -rf "${ARCH}" - -sha512sum "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.sha512" - -ipfs add -q "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz" > "lotus_${CIRCLE_TAG}_${ARCH}-amd64.tar.gz.cid" -popd diff --git a/scripts/publish-arch-release.sh b/scripts/publish-arch-release.sh deleted file mode 100755 index b47ad53fe4d..00000000000 --- a/scripts/publish-arch-release.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env bash -set -e - -ARCH=$1 - -pushd bundle - -# make sure we have a token set, api requests won't work otherwise -if [ -z "${GITHUB_TOKEN}" ]; then - echo "\${GITHUB_TOKEN} not set, publish failed" - exit 1 -fi - -REQUIRED=( - "jq" - "curl" -) -for REQUIRE in "${REQUIRED[@]}" -do - command -v "${REQUIRE}" >/dev/null 2>&1 || echo >&2 "'${REQUIRE}' must be installed" -done - -#see if the release already exists by tag -RELEASE_RESPONSE=` - curl \ - --header "Authorization: token ${GITHUB_TOKEN}" \ - "https://api.github.com/repos/${CIRCLE_PROJECT_USERNAME}/${CIRCLE_PROJECT_REPONAME}/releases/tags/${CIRCLE_TAG}" -` -RELEASE_ID=`echo "${RELEASE_RESPONSE}" | jq '.id'` - -if [ "${RELEASE_ID}" = "null" ]; then - echo "creating release" - - COND_CREATE_DISCUSSION="" - PRERELEASE=true - if [[ ${CIRCLE_TAG} =~ ^v[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - COND_CREATE_DISCUSSION="\"discussion_category_name\": \"announcement\"," - PRERELEASE=false - fi - - RELEASE_DATA="{ - \"tag_name\": \"${CIRCLE_TAG}\", - \"target_commitish\": \"${CIRCLE_SHA1}\", - ${COND_CREATE_DISCUSSION} - \"name\": \"${CIRCLE_TAG}\", - \"body\": \"\", - \"prerelease\": ${PRERELEASE} - }" - - # create it if it doesn't exist yet - RELEASE_RESPONSE=` - curl \ - --request POST \ - --header "Authorization: token ${GITHUB_TOKEN}" \ - --header "Content-Type: application/json" \ - --data "${RELEASE_DATA}" \ - "https://api.github.com/repos/$CIRCLE_PROJECT_USERNAME/${CIRCLE_PROJECT_REPONAME}/releases" - ` -else - echo "release already exists" -fi - -RELEASE_UPLOAD_URL=`echo "${RELEASE_RESPONSE}" | jq -r '.upload_url' | cut -d'{' -f1` -echo "Preparing to send artifacts to ${RELEASE_UPLOAD_URL}" - -if [ $ARCH = 'linux' ]; then -artifacts=( - "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz" - "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz.cid" - "lotus_${CIRCLE_TAG}_linux-amd64.tar.gz.sha512" -) -elif [ $ARCH = 'darwin' ]; then -artifacts=( - "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz" - "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz.cid" - "lotus_${CIRCLE_TAG}_darwin-amd64.tar.gz.sha512" -) -elif [ $ARCH = 'appimage' ]; then -artifacts=( - "Lotus-${CIRCLE_TAG}-x86_64.AppImage" - "Lotus-${CIRCLE_TAG}-x86_64.AppImage.cid" - "Lotus-${CIRCLE_TAG}-x86_64.AppImage.sha512" -) -else - echo "$1 is not a supported architecture to publish a release for" 1>&2 - exit 1 -fi - -for RELEASE_FILE in "${artifacts[@]}" -do - echo "Uploading ${RELEASE_FILE}..." - curl \ - --request POST \ - --fail \ - --header "Authorization: token ${GITHUB_TOKEN}" \ - --header "Content-Type: application/octet-stream" \ - --data-binary "@${RELEASE_FILE}" \ - "$RELEASE_UPLOAD_URL?name=$(basename "${RELEASE_FILE}")" - - echo "Uploaded ${RELEASE_FILE}" -done - -popd - -miscellaneous=( - "README.md" - "LICENSE-MIT" - "LICENSE-APACHE" -) -for MISC in "${miscellaneous[@]}" -do - echo "Uploading release bundle: ${MISC}" - curl \ - --request POST \ - --header "Authorization: token ${GITHUB_TOKEN}" \ - --header "Content-Type: application/octet-stream" \ - --data-binary "@${MISC}" \ - "$RELEASE_UPLOAD_URL?name=$(basename "${MISC}")" - - echo "Release bundle uploaded: ${MISC}" -done From 39ae4b04be8a5a7d0b5d4dc23b83524046a2a20b Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 16 Jan 2023 17:50:47 -0700 Subject: [PATCH 038/282] Add cid to cbor cmd --- cmd/lotus-shed/cid.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cmd/lotus-shed/cid.go b/cmd/lotus-shed/cid.go index a8534eff2f3..4b526ea2f9f 100644 --- a/cmd/lotus-shed/cid.go +++ b/cmd/lotus-shed/cid.go @@ -1,6 +1,7 @@ package main import ( + "bytes" "encoding/base64" "encoding/hex" "fmt" @@ -12,6 +13,7 @@ import ( "github.com/ipld/go-car" mh "github.com/multiformats/go-multihash" "github.com/urfave/cli/v2" + cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" @@ -27,6 +29,23 @@ var cidCmd = &cli.Command{ Subcommands: cli.Commands{ cidIdCmd, inspectBundleCmd, + cborCid, + }, +} + +var cborCid = &cli.Command{ + Name: "cbor", + Usage: "Serialize cid to cbor", + ArgsUsage: "[cid]", + Action: func(cctx *cli.Context) error { + c, err := cid.Decode(cctx.Args().First()) + if err != nil { + return err + } + cbgc := cbg.CborCid(c) + buf := bytes.NewBuffer(make([]byte, 0)) + cbgc.MarshalCBOR(buf) + fmt.Printf("%x\n", buf.Bytes()) }, } From 7383a761f6b015ff20760773f232676e36424a76 Mon Sep 17 00:00:00 2001 From: zenground0 Date: Mon, 16 Jan 2023 17:54:38 -0700 Subject: [PATCH 039/282] Fix --- cmd/lotus-shed/cid.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/lotus-shed/cid.go b/cmd/lotus-shed/cid.go index 4b526ea2f9f..e7205e28eb8 100644 --- a/cmd/lotus-shed/cid.go +++ b/cmd/lotus-shed/cid.go @@ -46,6 +46,7 @@ var cborCid = &cli.Command{ buf := bytes.NewBuffer(make([]byte, 0)) cbgc.MarshalCBOR(buf) fmt.Printf("%x\n", buf.Bytes()) + return nil }, } From d35818293a6a9bfd5d5faf602350054f139359e5 Mon Sep 17 00:00:00 2001 From: Adin Schmahmann Date: Tue, 17 Jan 2023 01:03:10 -0500 Subject: [PATCH 040/282] fix: stub out the FileSize command so lotus libraries can build on Windows --- storage/sealer/fsutil/filesize_unix.go | 3 +++ storage/sealer/fsutil/filesize_windows.go | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) create mode 100644 storage/sealer/fsutil/filesize_windows.go diff --git a/storage/sealer/fsutil/filesize_unix.go b/storage/sealer/fsutil/filesize_unix.go index 9c7f04ace45..3d80e0b8a24 100644 --- a/storage/sealer/fsutil/filesize_unix.go +++ b/storage/sealer/fsutil/filesize_unix.go @@ -1,3 +1,6 @@ +//go:build !windows +// +build !windows + package fsutil import ( diff --git a/storage/sealer/fsutil/filesize_windows.go b/storage/sealer/fsutil/filesize_windows.go new file mode 100644 index 00000000000..aeef50473d9 --- /dev/null +++ b/storage/sealer/fsutil/filesize_windows.go @@ -0,0 +1,16 @@ +package fsutil + +import ( + "fmt" +) + +type SizeInfo struct { + OnDisk int64 +} + +// FileSize returns bytes used by a file or directory on disk +// NOTE: We care about the allocated bytes, not file or directory size +// This is not currently supported on Windows, but at least other lotus can components can build on Windows now +func FileSize(path string) (SizeInfo, error) { + return SizeInfo{0}, fmt.Errorf("unsupported") +} From 51d2a883f0ed2a19ad19eb2a2f646d0ac05cbeb2 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 17 Jan 2023 12:39:55 +0100 Subject: [PATCH 041/282] Beneficiary cmd in lotus-shed Add `ProposeChangeBeneficiary` and `ConfirmChangeBeneficiary` to lotus-shed --- cmd/lotus-shed/actor.go | 256 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) diff --git a/cmd/lotus-shed/actor.go b/cmd/lotus-shed/actor.go index bdf2ecaf78e..183ca1a9e74 100644 --- a/cmd/lotus-shed/actor.go +++ b/cmd/lotus-shed/actor.go @@ -5,6 +5,7 @@ import ( "encoding/hex" "fmt" "os" + "strconv" "github.com/fatih/color" "github.com/urfave/cli/v2" @@ -14,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/go-state-types/builtin" + "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/network" miner2 "github.com/filecoin-project/specs-actors/v2/actors/builtin/miner" @@ -35,6 +37,8 @@ var actorCmd = &cli.Command{ actorProposeChangeWorker, actorConfirmChangeWorker, actorGetMethodNum, + actorProposeChangeBeneficiary, + actorConfirmChangeBeneficiary, }, } @@ -831,3 +835,255 @@ var actorGetMethodNum = &cli.Command{ return nil }, } + +var actorProposeChangeBeneficiary = &cli.Command{ + Name: "propose-change-beneficiary", + Usage: "Propose a beneficiary address change", + ArgsUsage: "[beneficiaryAddress quota expiration minerID]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + &cli.BoolFlag{ + Name: "overwrite-pending-change", + Usage: "Overwrite the current beneficiary change proposal", + Value: false, + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 4 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + na, err := address.NewFromString(cctx.Args().Get(0)) + if err != nil { + return xerrors.Errorf("parsing beneficiary address: %w", err) + } + + newAddr, err := api.StateLookupID(ctx, na, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("looking up new beneficiary address: %w", err) + } + + quota, err := types.ParseFIL(cctx.Args().Get(1)) + if err != nil { + return xerrors.Errorf("parsing quota: %w", err) + } + + expiration, err := strconv.ParseInt(cctx.Args().Get(2), 10, 64) + if err != nil { + return xerrors.Errorf("parsing expiration: %w", err) + } + + maddr, err := address.NewFromString(cctx.Args().Get(3)) + if err != nil { + return xerrors.Errorf("getting miner address: %w", err) + } + + mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if mi.Beneficiary == mi.Owner && newAddr == mi.Owner { + return fmt.Errorf("beneficiary %s already set to owner address", mi.Beneficiary) + } + + if mi.PendingBeneficiaryTerm != nil { + fmt.Println("WARNING: replacing Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("overwrite-pending-change") { + return fmt.Errorf("must pass --overwrite-pending-change to replace current pending beneficiary change. Please review CAREFULLY") + } + } + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: newAddr, + NewQuota: abi.TokenAmount(quota), + NewExpiration: abi.ChainEpoch(expiration), + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + From: mi.Owner, + To: maddr, + Method: builtin.MethodsMiner.ChangeBeneficiary, + Value: big.Zero(), + Params: sp, + }, nil) + if err != nil { + return xerrors.Errorf("mpool push: %w", err) + } + + fmt.Println("Propose Message CID:", smsg.Cid()) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("propose beneficiary change failed") + } + + updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, wait.TipSet) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == newAddr { + fmt.Println("Beneficiary address successfully changed") + } else { + fmt.Println("Beneficiary address change awaiting additional confirmations") + } + + return nil + }, +} + +var actorConfirmChangeBeneficiary = &cli.Command{ + Name: "confirm-change-beneficiary", + Usage: "Confirm a beneficiary address change", + ArgsUsage: "[minerAddress]", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "Actually send transaction performing the action", + Value: false, + }, + &cli.BoolFlag{ + Name: "existing-beneficiary", + Usage: "send confirmation from the existing beneficiary address", + }, + &cli.BoolFlag{ + Name: "new-beneficiary", + Usage: "send confirmation from the new beneficiary address", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + + api, acloser, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return xerrors.Errorf("getting fullnode api: %w", err) + } + defer acloser() + + ctx := lcli.ReqContext(cctx) + + maddr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return xerrors.Errorf("parsing beneficiary address: %w", err) + } + + mi, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return xerrors.Errorf("getting miner info: %w", err) + } + + if mi.PendingBeneficiaryTerm == nil { + return fmt.Errorf("no pending beneficiary term found for miner %s", maddr) + } + + if (cctx.IsSet("existing-beneficiary") && cctx.IsSet("new-beneficiary")) || (!cctx.IsSet("existing-beneficiary") && !cctx.IsSet("new-beneficiary")) { + return lcli.ShowHelp(cctx, fmt.Errorf("must pass exactly one of --existing-beneficiary or --new-beneficiary")) + } + + var fromAddr address.Address + if cctx.IsSet("existing-beneficiary") { + if mi.PendingBeneficiaryTerm.ApprovedByBeneficiary { + return fmt.Errorf("beneficiary change already approved by current beneficiary") + } + fromAddr = mi.Beneficiary + } else { + if mi.PendingBeneficiaryTerm.ApprovedByNominee { + return fmt.Errorf("beneficiary change already approved by new beneficiary") + } + fromAddr = mi.PendingBeneficiaryTerm.NewBeneficiary + } + + fmt.Println("Confirming Pending Beneficiary Term of:") + fmt.Println("Beneficiary: ", mi.PendingBeneficiaryTerm.NewBeneficiary) + fmt.Println("Quota:", mi.PendingBeneficiaryTerm.NewQuota) + fmt.Println("Expiration Epoch:", mi.PendingBeneficiaryTerm.NewExpiration) + + if !cctx.Bool("really-do-it") { + fmt.Println("Pass --really-do-it to actually execute this action. Review what you're about to approve CAREFULLY please") + return nil + } + + params := &miner.ChangeBeneficiaryParams{ + NewBeneficiary: mi.PendingBeneficiaryTerm.NewBeneficiary, + NewQuota: mi.PendingBeneficiaryTerm.NewQuota, + NewExpiration: mi.PendingBeneficiaryTerm.NewExpiration, + } + + sp, err := actors.SerializeParams(params) + if err != nil { + return xerrors.Errorf("serializing params: %w", err) + } + + smsg, err := api.MpoolPushMessage(ctx, &types.Message{ + From: fromAddr, + To: maddr, + Method: builtin.MethodsMiner.ChangeBeneficiary, + Value: big.Zero(), + Params: sp, + }, nil) + if err != nil { + return xerrors.Errorf("mpool push: %w", err) + } + + fmt.Println("Confirm Message CID:", smsg.Cid()) + + // wait for it to get mined into a block + wait, err := api.StateWaitMsg(ctx, smsg.Cid(), build.MessageConfidence) + if err != nil { + return xerrors.Errorf("waiting for message to be included in block: %w", err) + } + + // check it executed successfully + if wait.Receipt.ExitCode.IsError() { + return fmt.Errorf("confirm beneficiary change failed with code %d", wait.Receipt.ExitCode) + } + + updatedMinerInfo, err := api.StateMinerInfo(ctx, maddr, types.EmptyTSK) + if err != nil { + return err + } + + if updatedMinerInfo.PendingBeneficiaryTerm == nil && updatedMinerInfo.Beneficiary == mi.PendingBeneficiaryTerm.NewBeneficiary { + fmt.Println("Beneficiary address successfully changed") + } else { + fmt.Println("Beneficiary address change awaiting additional confirmations") + } + + return nil + }, +} From 14d921f64fa7e30522df14a1a5807cf8b505b35b Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 17 Jan 2023 09:56:17 -0700 Subject: [PATCH 042/282] Err handle --- cmd/lotus-shed/cid.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/cid.go b/cmd/lotus-shed/cid.go index e7205e28eb8..b25e8580c2e 100644 --- a/cmd/lotus-shed/cid.go +++ b/cmd/lotus-shed/cid.go @@ -44,7 +44,9 @@ var cborCid = &cli.Command{ } cbgc := cbg.CborCid(c) buf := bytes.NewBuffer(make([]byte, 0)) - cbgc.MarshalCBOR(buf) + if err := cbgc.MarshalCBOR(buf); err != nil { + return err + } fmt.Printf("%x\n", buf.Bytes()) return nil }, From 72baa3d91684ec64be758e8e759fa2ce4f58cb4f Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 17 Jan 2023 12:15:34 -0700 Subject: [PATCH 043/282] cid -> bytes command --- cmd/lotus-shed/cid.go | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/cmd/lotus-shed/cid.go b/cmd/lotus-shed/cid.go index b25e8580c2e..f6c4a472171 100644 --- a/cmd/lotus-shed/cid.go +++ b/cmd/lotus-shed/cid.go @@ -30,6 +30,22 @@ var cidCmd = &cli.Command{ cidIdCmd, inspectBundleCmd, cborCid, + cidBytes, + }, +} + +var cidBytes = &cli.Command{ + Name: "bytes", + Usage: "cid bytes", + ArgsUsage: "[cid]", + Action: func(cctx *cli.Context) error { + c, err := cid.Decode(cctx.Args().First()) + if err != nil { + return err + } + // Add in the troublesome zero byte prefix + fmt.Printf("00%x\n", c.Bytes()) + return nil }, } From a0c58b5582e279938c3ef3390c21dadc68d862e7 Mon Sep 17 00:00:00 2001 From: Travis Person Date: Fri, 6 Jan 2023 23:02:36 +0000 Subject: [PATCH 044/282] feat: add toolshed commands to inspect statetree size --- cli/state.go | 10 +- cmd/lotus-shed/main.go | 2 + cmd/lotus-shed/state-stats.go | 533 ++++++++++++++++++++++++++++++++++ 3 files changed, 543 insertions(+), 2 deletions(-) create mode 100644 cmd/lotus-shed/state-stats.go diff --git a/cli/state.go b/cli/state.go index 85d8f26e7be..a29253dfca9 100644 --- a/cli/state.go +++ b/cli/state.go @@ -252,10 +252,16 @@ func ParseTipSetString(ts string) ([]cid.Cid, error) { return cids, nil } +type TipSetResolver interface { + ChainHead(context.Context) (*types.TipSet, error) + ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) + ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) +} + // LoadTipSet gets the tipset from the context, or the head from the API. // // It always gets the head from the API so commands use a consistent tipset even if time pases. -func LoadTipSet(ctx context.Context, cctx *cli.Context, api v0api.FullNode) (*types.TipSet, error) { +func LoadTipSet(ctx context.Context, cctx *cli.Context, api TipSetResolver) (*types.TipSet, error) { tss := cctx.String("tipset") if tss == "" { return api.ChainHead(ctx) @@ -264,7 +270,7 @@ func LoadTipSet(ctx context.Context, cctx *cli.Context, api v0api.FullNode) (*ty return ParseTipSetRef(ctx, api, tss) } -func ParseTipSetRef(ctx context.Context, api v0api.FullNode, tss string) (*types.TipSet, error) { +func ParseTipSetRef(ctx context.Context, api TipSetResolver, tss string) (*types.TipSet, error) { if tss[0] == '@' { if tss == "@head" { return api.ChainHead(ctx) diff --git a/cmd/lotus-shed/main.go b/cmd/lotus-shed/main.go index 6f84739fa5c..a8ced92f834 100644 --- a/cmd/lotus-shed/main.go +++ b/cmd/lotus-shed/main.go @@ -20,6 +20,8 @@ func main() { local := []*cli.Command{ addressCmd, + statActorCmd, + statObjCmd, base64Cmd, base32Cmd, base16Cmd, diff --git a/cmd/lotus-shed/state-stats.go b/cmd/lotus-shed/state-stats.go new file mode 100644 index 00000000000..8ec4a0ff439 --- /dev/null +++ b/cmd/lotus-shed/state-stats.go @@ -0,0 +1,533 @@ +package main + +import ( + "context" + "encoding/json" + "fmt" + "io" + "reflect" + "sync" + + "github.com/docker/go-units" + lru "github.com/hashicorp/golang-lru" + "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-cid" + offline "github.com/ipfs/go-ipfs-exchange-offline" + format "github.com/ipfs/go-ipld-format" + "github.com/ipfs/go-merkledag" + "github.com/urfave/cli/v2" + "golang.org/x/sync/errgroup" + "golang.org/x/xerrors" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-state-types/abi" + + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/consensus" + "github.com/filecoin-project/lotus/chain/consensus/filcns" + "github.com/filecoin-project/lotus/chain/stmgr" + "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/chain/vm" + lcli "github.com/filecoin-project/lotus/cli" + "github.com/filecoin-project/lotus/node/repo" + "github.com/filecoin-project/lotus/storage/sealer/ffiwrapper" +) + +type actorStats struct { + Address address.Address + Actor *types.Actor + Fields []fieldItem + Stats api.ObjStat +} + +type fieldItem struct { + Name string + Cid cid.Cid + Stats api.ObjStat +} + +type cacheNodeGetter struct { + ds format.NodeGetter + cache *lru.TwoQueueCache +} + +func newCacheNodeGetter(d format.NodeGetter, size int) (*cacheNodeGetter, error) { + cng := &cacheNodeGetter{ds: d} + + cache, err := lru.New2Q(size) + if err != nil { + return nil, err + } + + cng.cache = cache + + return cng, nil +} + +func (cng *cacheNodeGetter) Get(ctx context.Context, c cid.Cid) (format.Node, error) { + if n, ok := cng.cache.Get(c); ok { + return n.(format.Node), nil + } + + n, err := cng.ds.Get(ctx, c) + if err != nil { + return nil, err + } + + cng.cache.Add(c, n) + + return n, nil +} + +func (cng *cacheNodeGetter) GetMany(ctx context.Context, list []cid.Cid) <-chan *format.NodeOption { + out := make(chan *format.NodeOption, len(list)) + go func() { + for _, c := range list { + n, err := cng.Get(ctx, c) + if err != nil { + out <- &format.NodeOption{Err: err} + continue + } + + out <- &format.NodeOption{Node: n} + } + }() + + return out +} + +type dagStatCollector struct { + ds format.NodeGetter + walk func(format.Node) ([]*format.Link, error) + + statsLk sync.Mutex + stats api.ObjStat +} + +func (dsc *dagStatCollector) record(ctx context.Context, nd format.Node) error { + size, err := nd.Size() + if err != nil { + return err + } + + dsc.statsLk.Lock() + defer dsc.statsLk.Unlock() + + dsc.stats.Size = dsc.stats.Size + size + dsc.stats.Links = dsc.stats.Links + 1 + + return nil +} + +func (dsc *dagStatCollector) walkLinks(ctx context.Context, c cid.Cid) ([]*format.Link, error) { + nd, err := dsc.ds.Get(ctx, c) + if err != nil { + return nil, err + } + + if err := dsc.record(ctx, nd); err != nil { + return nil, err + } + + return dsc.walk(nd) +} + +type ChainStoreTipSetResolver struct { + Chain *store.ChainStore +} + +func (tsr *ChainStoreTipSetResolver) ChainHead(ctx context.Context) (*types.TipSet, error) { + return tsr.Chain.GetHeaviestTipSet(), nil +} + +func (tsr *ChainStoreTipSetResolver) ChainGetTipSetByHeight(ctx context.Context, h abi.ChainEpoch, tsk types.TipSetKey) (*types.TipSet, error) { + ts, err := tsr.Chain.GetTipSetFromKey(ctx, tsk) + if err != nil { + return nil, xerrors.Errorf("loading tipset %s: %w", tsk, err) + } + return tsr.Chain.GetTipsetByHeight(ctx, h, ts, true) +} +func (tsr *ChainStoreTipSetResolver) ChainGetTipSet(ctx context.Context, tsk types.TipSetKey) (*types.TipSet, error) { + return tsr.Chain.LoadTipSet(ctx, tsk) +} + +var statObjCmd = &cli.Command{ + Name: "stat-obj", + Usage: "calculates the size of any DAG in the blockstore", + Flags: []cli.Flag{}, + Action: func(cctx *cli.Context) error { + ctx := lcli.ReqContext(cctx) + + c, err := cid.Parse(cctx.Args().First()) + if err != nil { + return err + } + + r, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return xerrors.Errorf("opening fs repo: %w", err) + } + + exists, err := r.Exists() + if err != nil { + return err + } + if !exists { + return xerrors.Errorf("lotus repo doesn't exist") + } + + lr, err := r.Lock(repo.FullNode) + if err != nil { + return err + } + defer lr.Close() //nolint:errcheck + + bs, err := lr.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + dag := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) + dsc := &dagStatCollector{ + ds: dag, + walk: carWalkFunc, + } + + if err := merkledag.Walk(ctx, dsc.walkLinks, c, cid.NewSet().Visit, merkledag.Concurrent()); err != nil { + return err + } + + return DumpJSON(dsc.stats) + }, +} + +var statActorCmd = &cli.Command{ + Name: "stat-actor", + Usage: "calculates the size of actors and their immeidate structures", + Description: `Any DAG linked by the actor object (field) will have its size calculated independently of all +other linked DAG. If an actor has two fields containing links to the same DAG the structure size will be counted +twice, included in each fields size individually. + +The top level stats reported for an actor is computed independently of all fields and is a more accurate +accounting of the true size of the actor in the state datastore. + +The calculation of these stats results in the actor state being traversed twice. The dag-cache-size flag can be used +to reduce the number of decode operations performed by caching the decoded object after first access.`, + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "tipset", + Usage: "specify tipset to call method on (pass comma separated array of cids)", + }, + &cli.IntFlag{ + Name: "workers", + Usage: "number of workers to use when processing", + Value: 10, + }, + &cli.IntFlag{ + Name: "dag-cache-size", + Usage: "cache size per worker (setting to 0 disables)", + Value: 8092, + }, + &cli.BoolFlag{ + Name: "all", + Usage: "process all actors in stateroot of tipset", + Value: false, + }, + &cli.BoolFlag{ + Name: "pretty", + Usage: "print formated output instead of ldjson", + Value: false, + }, + }, + Action: func(cctx *cli.Context) error { + ctx := lcli.ReqContext(cctx) + + var addrs []address.Address + + if !cctx.Bool("all") { + for _, a := range cctx.Args().Slice() { + addr, err := address.NewFromString(a) + if err != nil { + return err + } + + addrs = append(addrs, addr) + } + } + + r, err := repo.NewFS(cctx.String("repo")) + if err != nil { + return xerrors.Errorf("opening fs repo: %w", err) + } + + exists, err := r.Exists() + if err != nil { + return err + } + if !exists { + return xerrors.Errorf("lotus repo doesn't exist") + } + + lr, err := r.Lock(repo.FullNode) + if err != nil { + return err + } + defer lr.Close() //nolint:errcheck + + bs, err := lr.Blockstore(ctx, repo.UniversalBlockstore) + if err != nil { + return fmt.Errorf("failed to open blockstore: %w", err) + } + + defer func() { + if c, ok := bs.(io.Closer); ok { + if err := c.Close(); err != nil { + log.Warnf("failed to close blockstore: %s", err) + } + } + }() + + mds, err := lr.Datastore(context.Background(), "/metadata") + if err != nil { + return err + } + + cs := store.NewChainStore(bs, bs, mds, nil, nil) + if err := cs.Load(ctx); err != nil { + return nil + } + + tsExec := consensus.NewTipSetExecutor(filcns.RewardFunc) + sm, err := stmgr.NewStateManager(cs, tsExec, vm.Syscalls(ffiwrapper.ProofVerifier), filcns.DefaultUpgradeSchedule(), nil) + if err != nil { + return err + } + + tsr := &ChainStoreTipSetResolver{ + Chain: cs, + } + + ts, err := lcli.LoadTipSet(ctx, cctx, tsr) + if err != nil { + return err + } + + log.Infow("tipset", "parentstate", ts.ParentState()) + + if len(addrs) == 0 && cctx.Bool("all") { + var err error + addrs, err = sm.ListAllActors(ctx, ts) + if err != nil { + return err + } + } + + numWorkers := cctx.Int("workers") + dagCacheSize := cctx.Int("dag-cache-size") + + eg, egctx := errgroup.WithContext(ctx) + + jobs := make(chan address.Address, numWorkers) + results := make(chan actorStats, numWorkers) + + worker := func(ctx context.Context, id int) error { + completed := 0 + defer func() { + log.Infow("worker done", "id", id, "completed", completed) + }() + + for { + select { + case addr, ok := <-jobs: + if !ok { + return nil + } + + actor, err := sm.LoadActor(ctx, addr, ts) + if err != nil { + return err + } + + var dag format.NodeGetter = merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) + if dagCacheSize != 0 { + var err error + dag, err = newCacheNodeGetter(merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))), dagCacheSize) + if err != nil { + return err + } + } + + actStats, err := collectStats(ctx, addr, actor, dag) + if err != nil { + return err + } + + select { + case results <- actStats: + case <-ctx.Done(): + return ctx.Err() + } + case <-ctx.Done(): + return ctx.Err() + } + + completed = completed + 1 + } + } + + for w := 0; w < numWorkers; w++ { + id := w + eg.Go(func() error { + return worker(egctx, id) + }) + } + + go func() { + defer close(jobs) + for _, addr := range addrs { + jobs <- addr + } + }() + + go func() { + // error is check later + eg.Wait() //nolint:errcheck + close(results) + }() + + for { + select { + case result, ok := <-results: + if !ok { + return eg.Wait() + } + + if cctx.Bool("pretty") { + DumpStats(result) + } else { + if err := DumpJSON(result); err != nil { + return err + } + } + case <-ctx.Done(): + return ctx.Err() + } + } + }, +} + +func collectStats(ctx context.Context, addr address.Address, actor *types.Actor, dag format.NodeGetter) (actorStats, error) { + log.Infow("actor", "addr", addr, "code", actor.Code, "name", builtin.ActorNameByCode(actor.Code)) + + nd, err := dag.Get(ctx, actor.Head) + if err != nil { + return actorStats{}, err + } + + // When it comes to fvm / evm actors this method of inspecting fields will probably not work + // and we may only be able to collect stats for the top level object. We might be able to iterate + // over the top level fields for the actors and identify field that are CIDs, but unsure if we would + // be able to identify a field name. + + oif, err := vm.DumpActorState(consensus.NewTipSetExecutor(filcns.RewardFunc).NewActorRegistry(), actor, nd.RawData()) + if err != nil { + oif = nil + } + + fields := []fieldItem{} + + // Account actors return nil from DumpActorState as they have no state + if oif != nil { + v := reflect.Indirect(reflect.ValueOf(oif)) + for i := 0; i < v.NumField(); i++ { + varName := v.Type().Field(i).Name + varType := v.Type().Field(i).Type + varValue := v.Field(i).Interface() + + if varType == reflect.TypeOf(cid.Cid{}) { + fields = append(fields, fieldItem{ + Name: varName, + Cid: varValue.(cid.Cid), + }) + } + } + } + + actStats := actorStats{ + Address: addr, + Actor: actor, + } + + dsc := &dagStatCollector{ + ds: dag, + walk: carWalkFunc, + } + + if err := merkledag.Walk(ctx, dsc.walkLinks, actor.Head, cid.NewSet().Visit, merkledag.Concurrent()); err != nil { + return actorStats{}, err + } + + actStats.Stats = dsc.stats + + for _, field := range fields { + dsc := &dagStatCollector{ + ds: dag, + walk: carWalkFunc, + } + + if err := merkledag.Walk(ctx, dsc.walkLinks, field.Cid, cid.NewSet().Visit, merkledag.Concurrent()); err != nil { + return actorStats{}, err + } + + field.Stats = dsc.stats + + actStats.Fields = append(actStats.Fields, field) + } + + return actStats, nil +} + +func DumpJSON(i interface{}) error { + bs, err := json.Marshal(i) + if err != nil { + return err + } + + fmt.Println(string(bs)) + + return nil +} + +func DumpStats(actStats actorStats) { + strtype := builtin.ActorNameByCode(actStats.Actor.Code) + fmt.Printf("Address:\t%s\n", actStats.Address) + fmt.Printf("Balance:\t%s\n", types.FIL(actStats.Actor.Balance)) + fmt.Printf("Nonce:\t\t%d\n", actStats.Actor.Nonce) + fmt.Printf("Code:\t\t%s (%s)\n", actStats.Actor.Code, strtype) + fmt.Printf("Head:\t\t%s\n", actStats.Actor.Head) + fmt.Println() + + fmt.Printf("%-*s%-*s%-*s\n", 32, "Field", 24, "Size", 24, "\"Blocks\"") + + stats := actStats.Stats + sizeStr := units.BytesSize(float64(stats.Size)) + fmt.Printf("%-*s%-*s%-*s%-*d\n", 32, "", 10, sizeStr, 14, fmt.Sprintf("(%d)", stats.Size), 24, stats.Links) + + for _, s := range actStats.Fields { + stats := s.Stats + sizeStr := units.BytesSize(float64(stats.Size)) + fmt.Printf("%-*s%-*s%-*s%-*d\n", 32, s.Name, 10, sizeStr, 14, fmt.Sprintf("(%d)", stats.Size), 24, stats.Links) + } + + fmt.Println("--------------------------------------------------------------------------") +} From 901bb153d0a8997288dbb88ba1936889733721a8 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 19 Jan 2023 11:02:09 -0500 Subject: [PATCH 045/282] fix: should not serve non v0 api in v1 --- node/rpc.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/node/rpc.go b/node/rpc.go index 34f68097346..28ea67eb568 100644 --- a/node/rpc.go +++ b/node/rpc.go @@ -92,8 +92,9 @@ func FullNodeHandler(a v1api.FullNode, permissioned bool, opts ...jsonrpc.Server fnapi = api.PermissionedFullAPI(fnapi) } + var v0 v0api.FullNode = &(struct{ v0api.FullNode }{&v0api.WrapperV1Full{FullNode: fnapi}}) serveRpc("/rpc/v1", fnapi) - serveRpc("/rpc/v0", &v0api.WrapperV1Full{FullNode: fnapi}) + serveRpc("/rpc/v0", v0) // Import handler handleImportFunc := handleImport(a.(*impl.FullNodeAPI)) From d1fa22244f8160b599988f745880b4a7c43b48af Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Fri, 20 Jan 2023 19:12:22 +0000 Subject: [PATCH 046/282] Properly balance <> in circleci docker config --- .circleci/config.yml | 6 +++--- .circleci/template.yml | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index d4c00132d05..b68d7d86767 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -457,7 +457,7 @@ jobs: equal: [ mainnet, <> ] steps: - when: - condition: > + condition: <> steps: - docker/build: image: filecoin/<> @@ -468,7 +468,7 @@ jobs: command: | docker push filecoin/<>:<> if [[ ! -z $CIRCLE_SHA ]]; then - docker image tag filecoin/<>:<>> filecoin/<>:"${CIRCLE_SHA:0:7}" + docker image tag filecoin/<>:<> filecoin/<>:"${CIRCLE_SHA:0:7}" docker push filecoin/<>:"${CIRCLE_SHA:0:7}" fi if [[ ! -z $CIRCLE_TAG ]]; then @@ -496,7 +496,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<>-<> + docker push filecoin/<>:<> if [[ ! -z $CIRCLE_SHA ]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> diff --git a/.circleci/template.yml b/.circleci/template.yml index fa912409ade..66f45a2c1de 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -457,7 +457,7 @@ jobs: equal: [ mainnet, <> ] steps: - when: - condition: > + condition: <> steps: - docker/build: image: filecoin/<> @@ -468,7 +468,7 @@ jobs: command: | docker push filecoin/<>:<> if [["[[ ! -z $CIRCLE_SHA ]]"]]; then - docker image tag filecoin/<>:<>> filecoin/<>:"${CIRCLE_SHA:0:7}" + docker image tag filecoin/<>:<> filecoin/<>:"${CIRCLE_SHA:0:7}" docker push filecoin/<>:"${CIRCLE_SHA:0:7}" fi if [["[[ ! -z $CIRCLE_TAG ]]"]]; then @@ -496,7 +496,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<>-<> + docker push filecoin/<>:<> if [["[[ ! -z $CIRCLE_SHA ]]"]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> From 9d967b084a090bbcee3ccbd3bedb817684905e35 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Sun, 22 Jan 2023 16:39:40 +0000 Subject: [PATCH 047/282] Add back <> parameter for docker push This commit reverts a change with the previous fix for this flow: - https://github.com/filecoin-project/lotus/pull/10088 --- .circleci/config.yml | 2 +- .circleci/template.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index b68d7d86767..c7d0a5aa23d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -496,7 +496,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<> + docker push filecoin/<>:<>-<> if [[ ! -z $CIRCLE_SHA ]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> diff --git a/.circleci/template.yml b/.circleci/template.yml index 66f45a2c1de..38057866f2b 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -496,7 +496,7 @@ jobs: - run: name: Docker push command: | - docker push filecoin/<>:<> + docker push filecoin/<>:<>-<> if [["[[ ! -z $CIRCLE_SHA ]]"]]; then docker image tag filecoin/<>:<>-<> filecoin/<>:"${CIRCLE_SHA:0:7}"-<> docker push filecoin/<>:"${CIRCLE_SHA:0:7}"-<> From c8a692046f4b09aca6ed6c7d6337d1c2c582f6a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Mon, 23 Jan 2023 12:02:42 +0100 Subject: [PATCH 048/282] fix: itests: Fix flaky paych test --- itests/paych_api_test.go | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/itests/paych_api_test.go b/itests/paych_api_test.go index 353e2229400..ea7e73dbc0f 100644 --- a/itests/paych_api_test.go +++ b/itests/paych_api_test.go @@ -38,7 +38,7 @@ func TestPaymentChannelsAPI(t *testing.T) { kit.QuietMiningLogs() ctx := context.Background() - blockTime := 5 * time.Millisecond + blockTime := 10 * time.Millisecond var ( paymentCreator kit.TestFullNode @@ -55,6 +55,15 @@ func TestPaymentChannelsAPI(t *testing.T) { bms := ens.BeginMiningMustPost(blockTime) bm := bms[0] + waitRecvInSync := func() { + // paymentCreator is the block miner, in some cases paymentReceiver may fall behind, so we wait for it to catch up + + head, err := paymentReceiver.ChainHead(ctx) + require.NoError(t, err) + + paymentReceiver.WaitTillChain(ctx, kit.HeightAtLeast(head.Height())) + } + // send some funds to register the receiver receiverAddr, err := paymentReceiver.WalletNew(ctx, types.KTSecp256k1) require.NoError(t, err) @@ -74,6 +83,8 @@ func TestPaymentChannelsAPI(t *testing.T) { channel, err := paymentCreator.PaychGetWaitReady(ctx, channelInfo.WaitSentinel) require.NoError(t, err) + waitRecvInSync() + // allocate three lanes var lanes []uint64 for i := 0; i < 3; i++ { @@ -110,6 +121,8 @@ func TestPaymentChannelsAPI(t *testing.T) { res := waitForMessage(ctx, t, paymentCreator, settleMsgCid, time.Second*10, "settle") require.EqualValues(t, 0, res.Receipt.ExitCode, "Unable to settle payment channel") + waitRecvInSync() + creatorStore := adt.WrapStore(ctx, cbor.NewCborStore(blockstore.NewAPIBlockstore(paymentCreator))) // wait for the receiver to submit their vouchers From 807a60b4e49a40560599f082c46d913ad05beba5 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Wed, 18 Jan 2023 23:09:10 -0500 Subject: [PATCH 049/282] Remove unneeded individual color flags --- cli/client.go | 27 ----------- cmd/lotus-miner/actor.go | 9 ---- cmd/lotus-miner/dagstore.go | 75 ----------------------------- cmd/lotus-miner/index_provider.go | 23 --------- cmd/lotus-miner/market.go | 10 ---- cmd/lotus-miner/sealing.go | 20 -------- cmd/lotus-miner/sectors.go | 10 ---- cmd/lotus-miner/storage.go | 22 --------- documentation/en/cli-lotus-miner.md | 28 +++++------ documentation/en/cli-lotus.md | 3 -- 10 files changed, 11 insertions(+), 216 deletions(-) diff --git a/cli/client.go b/cli/client.go index 1c41262a51e..fb6649ad833 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1120,11 +1120,6 @@ var clientListRetrievalsCmd = &cli.Command{ Aliases: []string{"v"}, Usage: "print verbose deal details", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, &cli.BoolFlag{ Name: "show-failed", Usage: "show failed/failing deals", @@ -1140,10 +1135,6 @@ var clientListRetrievalsCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -1708,11 +1699,6 @@ var clientListDeals = &cli.Command{ Aliases: []string{"v"}, Usage: "print verbose deal details", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, &cli.BoolFlag{ Name: "show-failed", Usage: "show failed/failing deals", @@ -1723,10 +1709,6 @@ var clientListDeals = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err @@ -2238,11 +2220,6 @@ var clientListTransfers = &cli.Command{ Aliases: []string{"v"}, Usage: "print verbose transfer details", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, &cli.BoolFlag{ Name: "completed", Usage: "show completed data transfers", @@ -2257,10 +2234,6 @@ var clientListTransfers = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index dd78adfeff0..7b01fc85b60 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -433,17 +433,8 @@ var actorControlList = &cli.Command{ &cli.BoolFlag{ Name: "verbose", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/dagstore.go b/cmd/lotus-miner/dagstore.go index 519b43cc7c4..c0e37f63bf0 100644 --- a/cmd/lotus-miner/dagstore.go +++ b/cmd/lotus-miner/dagstore.go @@ -31,18 +31,7 @@ var dagstoreCmd = &cli.Command{ var dagstoreListShardsCmd = &cli.Command{ Name: "list-shards", Usage: "List all shards known to the dagstore, with their current status", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - marketsApi, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { return err @@ -64,18 +53,7 @@ var dagstoreRegisterShardCmd = &cli.Command{ Name: "register-shard", ArgsUsage: "[key]", Usage: "Register a shard", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - if cctx.NArg() != 1 { return lcli.IncorrectNumArgs(cctx) } @@ -103,18 +81,7 @@ var dagstoreInitializeShardCmd = &cli.Command{ Name: "initialize-shard", ArgsUsage: "[key]", Usage: "Initialize the specified shard", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - if cctx.NArg() != 1 { return lcli.IncorrectNumArgs(cctx) } @@ -135,18 +102,7 @@ var dagstoreRecoverShardCmd = &cli.Command{ Name: "recover-shard", ArgsUsage: "[key]", Usage: "Attempt to recover a shard in errored state", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - if cctx.NArg() != 1 { return lcli.IncorrectNumArgs(cctx) } @@ -176,17 +132,8 @@ var dagstoreInitializeAllCmd = &cli.Command{ Name: "include-sealed", Usage: "initialize sealed pieces as well", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - concurrency := cctx.Uint("concurrency") sealed := cctx.Bool("sealed") @@ -236,18 +183,7 @@ var dagstoreInitializeAllCmd = &cli.Command{ var dagstoreGcCmd = &cli.Command{ Name: "gc", Usage: "Garbage collect the dagstore", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - marketsApi, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { return err @@ -317,18 +253,7 @@ var dagstoreLookupPiecesCmd = &cli.Command{ Name: "lookup-pieces", Usage: "Lookup pieces that a given CID belongs to", ArgsUsage: "", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - if cctx.NArg() != 1 { return lcli.IncorrectNumArgs(cctx) } diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go index 4ed14549daf..2b6838a4b3f 100644 --- a/cmd/lotus-miner/index_provider.go +++ b/cmd/lotus-miner/index_provider.go @@ -3,7 +3,6 @@ package main import ( "fmt" - "github.com/fatih/color" "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" @@ -23,18 +22,7 @@ var indexProvAnnounceCmd = &cli.Command{ Name: "announce", ArgsUsage: "", Usage: "Announce a deal to indexers so they can download its index", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - if cctx.NArg() != 1 { return lcli.IncorrectNumArgs(cctx) } @@ -60,18 +48,7 @@ var indexProvAnnounceCmd = &cli.Command{ var indexProvAnnounceAllCmd = &cli.Command{ Name: "announce-all", Usage: "Announce all active deals to indexers so they can download the indices", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - marketsApi, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/market.go b/cmd/lotus-miner/market.go index 706e4923605..ce0d6890c81 100644 --- a/cmd/lotus-miner/market.go +++ b/cmd/lotus-miner/market.go @@ -16,7 +16,6 @@ import ( tm "github.com/buger/goterm" "github.com/docker/go-units" - "github.com/fatih/color" "github.com/ipfs/go-cid" "github.com/ipfs/go-cidutil/cidenc" "github.com/libp2p/go-libp2p/core/peer" @@ -779,11 +778,6 @@ var transfersListCmd = &cli.Command{ Aliases: []string{"v"}, Usage: "print verbose transfer details", }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, &cli.BoolFlag{ Name: "completed", Usage: "show completed data transfers", @@ -798,10 +792,6 @@ var transfersListCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - api, closer, err := lcli.GetMarketsAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/sealing.go b/cmd/lotus-miner/sealing.go index 4810b9ab991..b2f4dcab911 100644 --- a/cmd/lotus-miner/sealing.go +++ b/cmd/lotus-miner/sealing.go @@ -45,18 +45,7 @@ func workersCmd(sealing bool) *cli.Command { return &cli.Command{ Name: "workers", Usage: "list workers", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err @@ -218,21 +207,12 @@ var sealingJobsCmd = &cli.Command{ Name: "jobs", Usage: "list running jobs", Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, &cli.BoolFlag{ Name: "show-ret-done", Usage: "show returned but not consumed calls", }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index fc5fdcef62d..fc5ea11dcd2 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -278,12 +278,6 @@ var sectorsListCmd = &cli.Command{ Usage: "show removed sectors", Aliases: []string{"r"}, }, - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - Aliases: []string{"c"}, - }, &cli.BoolFlag{ Name: "fast", Usage: "don't show on-chain info for better performance", @@ -315,10 +309,6 @@ var sectorsListCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index b5bfb730daf..5a910722375 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -254,21 +254,10 @@ var storageRedeclareCmd = &cli.Command{ var storageListCmd = &cli.Command{ Name: "list", Usage: "list local storage paths", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Subcommands: []*cli.Command{ storageListSectorsCmd, }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err @@ -633,18 +622,7 @@ var storageFindCmd = &cli.Command{ var storageListSectorsCmd = &cli.Command{ Name: "sectors", Usage: "get list of all sector files", - Flags: []cli.Flag{ - &cli.BoolFlag{ - Name: "color", - Usage: "use color in display output", - DefaultText: "depends on output being a TTY", - }, - }, Action: func(cctx *cli.Context) error { - if cctx.IsSet("color") { - color.NoColor = !cctx.Bool("color") - } - minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 4b705adad5c..7d9ac58b0da 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -333,7 +333,6 @@ USAGE: lotus-miner actor control list [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) --verbose (default: false) ``` @@ -980,7 +979,6 @@ USAGE: lotus-miner data-transfers list [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) --completed show completed data transfers (default: false) --show-failed show failed/cancelled transfers (default: false) --verbose, -v print verbose transfer details (default: false) @@ -1062,7 +1060,7 @@ USAGE: lotus-miner dagstore list-shards [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1075,7 +1073,7 @@ USAGE: lotus-miner dagstore register-shard [command options] [key] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1088,7 +1086,7 @@ USAGE: lotus-miner dagstore initialize-shard [command options] [key] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1101,7 +1099,7 @@ USAGE: lotus-miner dagstore recover-shard [command options] [key] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1114,7 +1112,6 @@ USAGE: lotus-miner dagstore initialize-all [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) --concurrency value maximum shards to initialize concurrently at a time; use 0 for unlimited (default: 0) --include-sealed initialize sealed pieces as well (default: false) @@ -1129,7 +1126,7 @@ USAGE: lotus-miner dagstore gc [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1142,7 +1139,7 @@ USAGE: lotus-miner dagstore lookup-pieces [command options] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1173,7 +1170,7 @@ USAGE: lotus-miner index announce [command options] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1186,7 +1183,7 @@ USAGE: lotus-miner index announce-all [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -1721,7 +1718,6 @@ USAGE: lotus-miner sectors list [command options] [arguments...] OPTIONS: - --color, -c use color in display output (default: depends on output being a TTY) --events, -e display number of events the sector has received (default: false) --fast, -f don't show on-chain info for better performance (default: false) --initial-pledge, -p display initial pledge (default: false) @@ -2223,7 +2219,7 @@ USAGE: lotus-miner proving workers [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -2371,7 +2367,6 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --color use color in display output (default: depends on output being a TTY) --help, -h show help (default: false) ``` @@ -2385,7 +2380,7 @@ USAGE: lotus-miner storage list sectors [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -2458,7 +2453,6 @@ USAGE: lotus-miner sealing jobs [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) --show-ret-done show returned but not consumed calls (default: false) ``` @@ -2472,7 +2466,7 @@ USAGE: lotus-miner sealing workers [command options] [arguments...] OPTIONS: - --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 53f55e61d7d..6685315a839 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -686,7 +686,6 @@ CATEGORY: RETRIEVAL OPTIONS: - --color use color in display output (default: depends on output being a TTY) --completed show completed retrievals (default: false) --show-failed show failed/failing deals (default: true) --verbose, -v print verbose deal details (default: false) @@ -757,7 +756,6 @@ CATEGORY: STORAGE OPTIONS: - --color use color in display output (default: depends on output being a TTY) --show-failed show failed/failing deals (default: false) --verbose, -v print verbose deal details (default: false) --watch watch deal updates in real-time, rather than a one time list (default: false) @@ -890,7 +888,6 @@ CATEGORY: UTIL OPTIONS: - --color use color in display output (default: depends on output being a TTY) --completed show completed data transfers (default: false) --show-failed show failed/cancelled transfers (default: false) --verbose, -v print verbose transfer details (default: false) From f03c7a8880f7959435f0ff9107888af3b1e4c20a Mon Sep 17 00:00:00 2001 From: zenground0 Date: Tue, 24 Jan 2023 20:18:04 +1300 Subject: [PATCH 050/282] encode address into byte --- cmd/lotus-shed/address.go | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cmd/lotus-shed/address.go b/cmd/lotus-shed/address.go index bf023f7b088..aa616410db1 100644 --- a/cmd/lotus-shed/address.go +++ b/cmd/lotus-shed/address.go @@ -13,6 +13,15 @@ import ( var addressCmd = &cli.Command{ Name: "addr", + Usage: "interact with filecoin addresses", + Subcommands: cli.Commands{ + addrDecode, + addrEncode, + }, +} + +var addrDecode = &cli.Command{ + Name: "decode", Usage: "decode hex bytes into address", Action: func(cctx *cli.Context) error { addrHex := cctx.Args().First() @@ -39,3 +48,17 @@ var addressCmd = &cli.Command{ return nil }, } + +var addrEncode = &cli.Command{ + Name: "encode", + Usage: "encode address to hex bytes", + Action: func(cctx *cli.Context) error { + addr, err := address.NewFromString(cctx.Args().First()) + if err != nil { + return err + } + + fmt.Printf("%x\n", addr.Bytes()) + return nil + }, +} From 34f376eb23b5da361eb96b822f03f33c86936392 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 25 Jan 2023 13:13:56 +0100 Subject: [PATCH 051/282] chore: cli Standarize cli/code functions similar to: https://github.com/filecoin-project/lotus/pull/9317 - cctx.NArg() instead of cctx.Args().xxx - Add check for args and print help on functions that did not have it --- cli/chain.go | 32 +++++++++++++++++++++------ cli/client.go | 41 +++++++++++++++++------------------ cli/disputer.go | 3 +-- cli/params.go | 4 ++-- cli/state.go | 57 +++++++++++++++++++++++++------------------------ cli/wallet.go | 24 ++++++++++----------- 6 files changed, 90 insertions(+), 71 deletions(-) diff --git a/cli/chain.go b/cli/chain.go index dadef84926f..549b8646e0f 100644 --- a/cli/chain.go +++ b/cli/chain.go @@ -112,8 +112,8 @@ var ChainGetBlock = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass cid of block to print") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } bcid, err := cid.Decode(cctx.Args().First()) @@ -198,6 +198,10 @@ var ChainReadObjCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + c, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to parse cid input: %s", err) @@ -233,6 +237,10 @@ var ChainDeleteObjCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + c, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to parse cid input: %s", err) @@ -276,6 +284,10 @@ var ChainStatObjCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + obj, err := cid.Decode(cctx.Args().First()) if err != nil { return fmt.Errorf("failed to parse cid input: %s", err) @@ -308,8 +320,8 @@ var ChainGetMsgCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) - if !cctx.Args().Present() { - return fmt.Errorf("must pass a cid of a message to get") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -374,6 +386,10 @@ var ChainSetHeadCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + var ts *types.TipSet if cctx.Bool("genesis") { @@ -734,6 +750,10 @@ var ChainGetCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) + } + p := path.Clean(cctx.Args().First()) if strings.HasPrefix(p, "/pstate") { p = p[len("/pstate"):] @@ -1071,8 +1091,8 @@ var ChainExportCmd = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify filename to export chain to") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } rsrs := abi.ChainEpoch(cctx.Int64("recent-stateroots")) diff --git a/cli/client.go b/cli/client.go index a8355f9a143..00deaf97701 100644 --- a/cli/client.go +++ b/cli/client.go @@ -166,8 +166,8 @@ var clientDropCmd = &cli.Command{ Usage: "Remove import", ArgsUsage: "[import ID...]", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return xerrors.Errorf("no imports specified") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -996,9 +996,8 @@ var clientFindCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - fmt.Println("Usage: find [CID]") - return nil + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } file, err := cid.Parse(cctx.Args().First()) @@ -1063,8 +1062,7 @@ var clientQueryRetrievalAskCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) if cctx.NArg() != 2 { - afmt.Println("Usage: retrieval-ask [minerAddress] [data CID]") - return nil + return IncorrectNumArgs(cctx) } maddr, err := address.NewFromString(cctx.Args().First()) @@ -1639,8 +1637,7 @@ var clientQueryAskCmd = &cli.Command{ Action: func(cctx *cli.Context) error { afmt := NewAppFmt(cctx.App) if cctx.NArg() != 1 { - afmt.Println("Usage: query-ask [minerAddress]") - return nil + return IncorrectNumArgs(cctx) } maddr, err := address.NewFromString(cctx.Args().First()) @@ -1944,8 +1941,8 @@ var clientGetDealCmd = &cli.Command{ Usage: "Print detailed deal information", ArgsUsage: "[proposalCID]", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return cli.ShowCommandHelp(cctx, cctx.Command.Name) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -2058,8 +2055,8 @@ var clientStat = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() || cctx.NArg() != 1 { - return fmt.Errorf("must specify cid of data") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } dataCid, err := cid.Parse(cctx.Args().First()) @@ -2080,8 +2077,9 @@ var clientStat = &cli.Command{ } var clientRestartTransfer = &cli.Command{ - Name: "restart-transfer", - Usage: "Force restart a stalled data transfer", + Name: "restart-transfer", + Usage: "Force restart a stalled data transfer", + ArgsUsage: "[transferID]", Flags: []cli.Flag{ &cli.StringFlag{ Name: "peerid", @@ -2094,8 +2092,8 @@ var clientRestartTransfer = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return cli.ShowCommandHelp(cctx, cctx.Command.Name) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) if err != nil { @@ -2140,8 +2138,9 @@ var clientRestartTransfer = &cli.Command{ } var clientCancelTransfer = &cli.Command{ - Name: "cancel-transfer", - Usage: "Force cancel a data transfer", + Name: "cancel-transfer", + Usage: "Force cancel a data transfer", + ArgsUsage: "[transferID]", Flags: []cli.Flag{ &cli.StringFlag{ Name: "peerid", @@ -2159,8 +2158,8 @@ var clientCancelTransfer = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return cli.ShowCommandHelp(cctx, cctx.Command.Name) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) if err != nil { diff --git a/cli/disputer.go b/cli/disputer.go index adbdd919edc..de3f5032468 100644 --- a/cli/disputer.go +++ b/cli/disputer.go @@ -58,8 +58,7 @@ var disputerMsgCmd = &cli.Command{ Flags: []cli.Flag{}, Action: func(cctx *cli.Context) error { if cctx.NArg() != 3 { - fmt.Println("Usage: dispute [minerAddress index postIndex]") - return nil + return IncorrectNumArgs(cctx) } ctx := ReqContext(cctx) diff --git a/cli/params.go b/cli/params.go index 4dcbe67e2a0..e79eb8e3071 100644 --- a/cli/params.go +++ b/cli/params.go @@ -15,8 +15,8 @@ var FetchParamCmd = &cli.Command{ Usage: "Fetch proving parameters", ArgsUsage: "[sectorSize]", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return xerrors.Errorf("must pass sector size to fetch params for (specify as \"32GiB\", for instance)") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } sectorSizeInt, err := units.RAMInBytes(cctx.Args().First()) if err != nil { diff --git a/cli/state.go b/cli/state.go index 7b8162aad72..9441077b1c6 100644 --- a/cli/state.go +++ b/cli/state.go @@ -99,8 +99,8 @@ var StateMinerProvingDeadlineCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify miner to get information for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -142,8 +142,8 @@ var StateMinerInfo = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify miner to get information for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -397,8 +397,8 @@ var StateSectorsCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify miner to list sectors for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } maddr, err := address.NewFromString(cctx.Args().First()) @@ -437,8 +437,8 @@ var StateActiveSectorsCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify miner to list sectors for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } maddr, err := address.NewFromString(cctx.Args().First()) @@ -469,8 +469,8 @@ var StateExecTraceCmd = &cli.Command{ Usage: "Get the execution trace of a given message", ArgsUsage: "", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return ShowHelp(cctx, fmt.Errorf("must pass message cid")) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } mcid, err := cid.Decode(cctx.Args().First()) @@ -612,8 +612,8 @@ var StateGetDealSetCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify deal ID") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } dealid, err := strconv.ParseUint(cctx.Args().First(), 10, 64) @@ -756,8 +756,8 @@ var StateGetActorCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass address of actor to get") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -810,8 +810,8 @@ var StateLookupIDCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass address of actor to get") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -854,8 +854,8 @@ var StateSectorSizeCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass miner's address") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -891,8 +891,8 @@ var StateReadStateCmd = &cli.Command{ ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass address of actor to get") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -1473,8 +1473,8 @@ var StateWaitMsgCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return fmt.Errorf("must specify message cid to wait for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -1510,8 +1510,8 @@ var StateSearchMsgCmd = &cli.Command{ Usage: "Search to see whether a message has appeared on chain", ArgsUsage: "[messageCid]", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return fmt.Errorf("must specify message cid to search for") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) @@ -1842,11 +1842,12 @@ var StateMarketCmd = &cli.Command{ } var stateMarketBalanceCmd = &cli.Command{ - Name: "balance", - Usage: "Get the market balance (locked and escrowed) for a given account", + Name: "balance", + Usage: "Get the market balance (locked and escrowed) for a given account", + ArgsUsage: "[address]", Action: func(cctx *cli.Context) error { - if !cctx.Args().Present() { - return ShowHelp(cctx, fmt.Errorf("must specify address to print market balance for")) + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } api, closer, err := GetFullNodeAPI(cctx) diff --git a/cli/wallet.go b/cli/wallet.go index 3a21cdaba81..305af7cfdee 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -251,8 +251,8 @@ var walletSetDefault = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must pass address to set as default") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -279,8 +279,8 @@ var walletExport = &cli.Command{ afmt := NewAppFmt(cctx.App) - if !cctx.Args().Present() { - return fmt.Errorf("must specify key to export") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -414,8 +414,8 @@ var walletSign = &cli.Command{ afmt := NewAppFmt(cctx.App) - if !cctx.Args().Present() || cctx.NArg() != 2 { - return fmt.Errorf("must specify signing address and message to sign") + if cctx.NArg() != 2 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -457,8 +457,8 @@ var walletVerify = &cli.Command{ afmt := NewAppFmt(cctx.App) - if !cctx.Args().Present() || cctx.NArg() != 3 { - return fmt.Errorf("must specify signing address, message, and signature to verify") + if cctx.NArg() != 3 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -509,8 +509,8 @@ var walletDelete = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if !cctx.Args().Present() || cctx.NArg() != 1 { - return fmt.Errorf("must specify address to delete") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } addr, err := address.NewFromString(cctx.Args().First()) @@ -701,8 +701,8 @@ var walletMarketAdd = &cli.Command{ afmt := NewAppFmt(cctx.App) // Get amount param - if !cctx.Args().Present() { - return fmt.Errorf("must pass amount to add") + if cctx.NArg() != 1 { + return IncorrectNumArgs(cctx) } f, err := types.ParseFIL(cctx.Args().First()) if err != nil { From 128bdc63db5e7a2d930f31eda80c29a43b20be86 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 25 Jan 2023 16:45:35 +0100 Subject: [PATCH 052/282] fix: rpcenc: Don't hang when source dies --- lib/rpcenc/reader.go | 25 +++++++- lib/rpcenc/reader_test.go | 130 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 154 insertions(+), 1 deletion(-) diff --git a/lib/rpcenc/reader.go b/lib/rpcenc/reader.go index 99b0faf05ef..64dcc4b497d 100644 --- a/lib/rpcenc/reader.go +++ b/lib/rpcenc/reader.go @@ -282,7 +282,7 @@ func (w *RpcReader) Read(p []byte) (int, error) { } if w.postBody == nil { - return 0, xerrors.Errorf("reader already closed or redirected") + return 0, xerrors.Errorf("reader already closed, redirected or cancelled") } n, err := w.postBody.Read(p) @@ -406,6 +406,29 @@ func ReaderParamDecoder() (http.HandlerFunc, jsonrpc.ServerOption) { return case <-req.Context().Done(): log.Errorf("context error in reader stream handler (2): %v", req.Context().Err()) + + closed := make(chan struct{}) + // start a draining goroutine + go func() { + for { + select { + case r, ok := <-wr.res: + if !ok { + return + } + log.Errorw("discarding read res", "type", r.rt, "meta", r.meta) + case <-closed: + return + } + } + }() + + wr.beginOnce.Do(func() {}) + wr.closeOnce.Do(func() { + close(wr.res) + }) + close(closed) + resp.WriteHeader(500) return } diff --git a/lib/rpcenc/reader_test.go b/lib/rpcenc/reader_test.go index 455cc8fcc30..da436068f1d 100644 --- a/lib/rpcenc/reader_test.go +++ b/lib/rpcenc/reader_test.go @@ -7,7 +7,9 @@ import ( "io/ioutil" "net/http/httptest" "strings" + "sync" "testing" + "time" "github.com/gorilla/mux" "github.com/stretchr/testify/require" @@ -20,6 +22,9 @@ import ( type ReaderHandler struct { readApi func(ctx context.Context, r io.Reader) ([]byte, error) + + cont chan struct{} + subErr error } func (h *ReaderHandler) ReadAllApi(ctx context.Context, r io.Reader, mustRedir bool) ([]byte, error) { @@ -31,6 +36,24 @@ func (h *ReaderHandler) ReadAllApi(ctx context.Context, r io.Reader, mustRedir b return h.readApi(ctx, r) } +func (h *ReaderHandler) ReadAllWaiting(ctx context.Context, r io.Reader, mustRedir bool) ([]byte, error) { + if mustRedir { + if err := r.(*RpcReader).MustRedirect(); err != nil { + return nil, err + } + } + + h.cont <- struct{}{} + <-h.cont + + var m []byte + m, h.subErr = h.readApi(ctx, r) + + h.cont <- struct{}{} + + return m, h.subErr +} + func (h *ReaderHandler) ReadStartAndApi(ctx context.Context, r io.Reader, mustRedir bool) ([]byte, error) { if mustRedir { if err := r.(*RpcReader).MustRedirect(); err != nil { @@ -194,3 +217,110 @@ func TestReaderRedirect(t *testing.T) { err = redirClient.CloseReader(context.TODO(), strings.NewReader("rediracted pooooootato")) require.NoError(t, err) } + +func TestReaderRedirectDrop(t *testing.T) { + // lower timeout so that the dangling connection between client and reader is dropped quickly + // after the test. Otherwise httptest.Close is blocked. + Timeout = 200 * time.Millisecond + + var allClient struct { + ReadAll func(ctx context.Context, r io.Reader) ([]byte, error) + } + + { + allServerHandler := &ReaderHandler{} + readerHandler, readerServerOpt := ReaderParamDecoder() + rpcServer := jsonrpc.NewServer(readerServerOpt) + rpcServer.Register("ReaderHandler", allServerHandler) + + mux := mux.NewRouter() + mux.Handle("/rpc/v0", rpcServer) + mux.Handle("/rpc/streams/v0/push/{uuid}", readerHandler) + + testServ := httptest.NewServer(mux) + defer testServ.Close() + t.Logf("test server reading: %s", testServ.URL) + + re := ReaderParamEncoder("http://" + testServ.Listener.Addr().String() + "/rpc/streams/v0/push") + closer, err := jsonrpc.NewMergeClient(context.Background(), "ws://"+testServ.Listener.Addr().String()+"/rpc/v0", "ReaderHandler", []interface{}{&allClient}, nil, re) + require.NoError(t, err) + + defer closer() + } + + var redirClient struct { + ReadAllWaiting func(ctx context.Context, r io.Reader, mustRedir bool) ([]byte, error) + } + contCh := make(chan struct{}) + + allServerHandler := &ReaderHandler{readApi: allClient.ReadAll, cont: contCh} + readerHandler, readerServerOpt := ReaderParamDecoder() + rpcServer := jsonrpc.NewServer(readerServerOpt) + rpcServer.Register("ReaderHandler", allServerHandler) + + mux := mux.NewRouter() + mux.Handle("/rpc/v0", rpcServer) + mux.Handle("/rpc/streams/v0/push/{uuid}", readerHandler) + + testServ := httptest.NewServer(mux) + defer testServ.Close() + t.Logf("test server redirecting: %s", testServ.URL) + + re := ReaderParamEncoder("http://" + testServ.Listener.Addr().String() + "/rpc/streams/v0/push") + closer, err := jsonrpc.NewMergeClient(context.Background(), "http://"+testServ.Listener.Addr().String()+"/rpc/v0", "ReaderHandler", []interface{}{&redirClient}, nil, re) + require.NoError(t, err) + + defer closer() + + var done sync.WaitGroup + + // Happy case + + done.Add(1) + go func() { + defer done.Done() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + read, err := redirClient.ReadAllWaiting(ctx, strings.NewReader("rediracted pooooootato"), true) + require.NoError(t, err) + require.Equal(t, "rediracted pooooootato", string(read), "potatoes weren't equal") + }() + + <-contCh // exec enter ReadAllWaiting + contCh <- struct{}{} // stert subcall + <-contCh // wait for subcall to finish + + done.Wait() + + // Redir client drops before subcall + done.Add(1) + + go func() { + defer done.Done() + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + _, err := redirClient.ReadAllWaiting(ctx, strings.NewReader("rediracted pooooootato"), true) + require.ErrorContains(t, err, "sendRequest failed") + }() + + // wait for execution to enter ReadAllWaiting + <-contCh + + // kill redirecting server connection + testServ.CloseClientConnections() + + // ReadAllWaiting should fail + done.Wait() + + // resume execution in ReadAllWaiting, calling redicect + contCh <- struct{}{} + + // wait for subcall to finish + <-contCh + + require.ErrorContains(t, allServerHandler.subErr, "decoding params for 'ReaderHandler.ReadAll' (param: 0; custom decoder): context canceled") +} From 38dc0344994ad4b06ad679060c022b30d66d9bea Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 25 Jan 2023 17:24:53 +0100 Subject: [PATCH 053/282] make docsgen-cli make docsgen-cli --- documentation/en/cli-lotus.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index fbb020b0ecf..ec76cc999ae 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -906,7 +906,7 @@ NAME: lotus client restart-transfer - Force restart a stalled data transfer USAGE: - lotus client restart-transfer [command options] [arguments...] + lotus client restart-transfer [command options] [transferID] CATEGORY: UTIL @@ -923,7 +923,7 @@ NAME: lotus client cancel-transfer - Force cancel a data transfer USAGE: - lotus client cancel-transfer [command options] [arguments...] + lotus client cancel-transfer [command options] [transferID] CATEGORY: UTIL @@ -2034,7 +2034,7 @@ NAME: lotus state market balance - Get the market balance (locked and escrowed) for a given account USAGE: - lotus state market balance [command options] [arguments...] + lotus state market balance [command options] [address] OPTIONS: --help, -h show help (default: false) From 291deaa017293a45e77f89dee25cc150fd0947f3 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Jan 2023 01:24:44 -0500 Subject: [PATCH 054/282] Update codeql to v2 --- .github/workflows/codeql-analysis.yml | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 65d5fd93a09..6b27bf6f84a 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -16,7 +16,9 @@ on: branches: [ master ] pull_request: # The branches below must be a subset of the branches above - branches: [ master ] + branches: + - master + - 'release/*' jobs: analyze: @@ -33,15 +35,15 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v3 - - uses: actions/setup-go@v1 + - uses: actions/setup-go@v3 with: go-version: '1.18.8' # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # If you wish to specify custom queries, you can do so here or in a config file. @@ -52,7 +54,7 @@ jobs: # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). # If this step fails, then you should remove it and run the build manually (see below) - name: Autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹ️ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -66,4 +68,4 @@ jobs: # make release - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 From 0cc63f689672b76d385c3e886a7a52c7df3b26e1 Mon Sep 17 00:00:00 2001 From: Geoff Stuart Date: Thu, 26 Jan 2023 02:20:23 -0500 Subject: [PATCH 055/282] Enable code ql for release branches --- .github/workflows/codeql-analysis.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 6b27bf6f84a..0cba5457e0d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -13,7 +13,9 @@ name: "CodeQL" on: push: - branches: [ master ] + branches: + - master + - 'release/*' pull_request: # The branches below must be a subset of the branches above branches: @@ -45,7 +47,7 @@ jobs: - name: Initialize CodeQL uses: github/codeql-action/init@v2 with: - languages: ${{ matrix.language }} + languages: go # If you wish to specify custom queries, you can do so here or in a config file. # By default, queries listed here will override any specified in a config file. # Prefix the list here with "+" to use these queries and those in the config file. From a0b25b91360b7dac9c7c181e52f6840edbbd5968 Mon Sep 17 00:00:00 2001 From: Phi Date: Thu, 26 Jan 2023 10:13:39 +0100 Subject: [PATCH 056/282] less strict ArgsCheck Less strict ArgsCheck --- cli/wallet.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/wallet.go b/cli/wallet.go index 305af7cfdee..a936efa94bb 100644 --- a/cli/wallet.go +++ b/cli/wallet.go @@ -701,7 +701,7 @@ var walletMarketAdd = &cli.Command{ afmt := NewAppFmt(cctx.App) // Get amount param - if cctx.NArg() != 1 { + if cctx.NArg() < 1 { return IncorrectNumArgs(cctx) } f, err := types.ParseFIL(cctx.Args().First()) From fc6721cff7db5e65c294e0fb72e6b4804feadbd7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 26 Jan 2023 11:54:03 +0100 Subject: [PATCH 057/282] feat: wdpost: Emit more detailed errors --- storage/sealer/manager_post.go | 14 +++++++++++--- storage/sealer/worker_local.go | 10 +++++++--- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/storage/sealer/manager_post.go b/storage/sealer/manager_post.go index a4b812f8fb6..29748c8edad 100644 --- a/storage/sealer/manager_post.go +++ b/storage/sealer/manager_post.go @@ -4,6 +4,7 @@ import ( "context" "sort" "sync" + "time" "go.uber.org/multierr" "golang.org/x/xerrors" @@ -82,7 +83,12 @@ func (m *Manager) GenerateWindowPoSt(ctx context.Context, minerID abi.ActorID, s // if builtin PoSt isn't disabled, and there are no workers, compute the PoSt locally log.Info("GenerateWindowPoSt run at lotus-miner") - return m.localProver.GenerateWindowPoSt(ctx, minerID, sectorInfo, randomness) + p, s, err := m.localProver.GenerateWindowPoSt(ctx, minerID, sectorInfo, randomness) + if err != nil { + return nil, nil, xerrors.Errorf("local prover: %w", err) + } + + return p, s, nil } return m.generateWindowPoSt(ctx, minerID, sectorInfo, randomness) @@ -217,18 +223,20 @@ func (m *Manager) generateWindowPoSt(ctx context.Context, minerID abi.ActorID, s func (m *Manager) generatePartitionWindowPost(ctx context.Context, spt abi.RegisteredSealProof, ppt abi.RegisteredPoStProof, minerID abi.ActorID, partIndex int, sc []storiface.PostSectorChallenge, randomness abi.PoStRandomness) (proof.PoStProof, []abi.SectorID, error) { log.Infow("generateWindowPost", "index", partIndex) + start := time.Now() + var result storiface.WindowPoStResult err := m.windowPoStSched.Schedule(ctx, true, spt, func(ctx context.Context, w Worker) error { out, err := w.GenerateWindowPoSt(ctx, ppt, minerID, sc, partIndex, randomness) if err != nil { - return err + return xerrors.Errorf("post worker: %w", err) } result = out return nil }) - log.Warnf("generateWindowPost partition:%d, get skip count:%d", partIndex, len(result.Skipped)) + log.Warnw("generateWindowPost done", "index", partIndex, "skipped", len(result.Skipped), "took", time.Since(start).String(), "err", err) return result.PoStProofs, result.Skipped, err } diff --git a/storage/sealer/worker_local.go b/storage/sealer/worker_local.go index 7f141780c3e..24b9ff2478e 100644 --- a/storage/sealer/worker_local.go +++ b/storage/sealer/worker_local.go @@ -706,11 +706,15 @@ func (l *LocalWorker) GenerateWindowPoSt(ctx context.Context, ppt abi.Registered } res, err := sb.GenerateWindowPoStWithVanilla(ctx, ppt, mid, randomness, vproofs, partitionIdx) - - return storiface.WindowPoStResult{ + r := storiface.WindowPoStResult{ PoStProofs: res, Skipped: skipped, - }, err + } + if err != nil { + log.Errorw("generating window PoSt failed", "error", err) + return r, xerrors.Errorf("generate window PoSt with vanilla proofs: %w", err) + } + return r, nil } func (l *LocalWorker) TaskTypes(context.Context) (map[sealtasks.TaskType]struct{}, error) { From 7cfb2529ac6b6dad37035824ad36346b86fcc524 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 26 Jan 2023 10:59:00 +0000 Subject: [PATCH 058/282] init git submodules in build-docker CI --- .circleci/config.yml | 4 ++++ .circleci/template.yml | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 9a687f03683..f22bff0f71b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -449,6 +449,10 @@ jobs: steps: - setup_remote_docker - checkout + - git_fetch_all_tags + - run: git submodule sync + - run: git submodule update --init + - docker/check: docker-username: DOCKERHUB_USERNAME docker-password: DOCKERHUB_PASSWORD diff --git a/.circleci/template.yml b/.circleci/template.yml index 38057866f2b..857f8f44242 100644 --- a/.circleci/template.yml +++ b/.circleci/template.yml @@ -449,6 +449,10 @@ jobs: steps: - setup_remote_docker - checkout + - git_fetch_all_tags + - run: git submodule sync + - run: git submodule update --init + - docker/check: docker-username: DOCKERHUB_USERNAME docker-password: DOCKERHUB_PASSWORD From 98a9c8310b7c9d036bb194dc4f4d166c3006eab9 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 26 Jan 2023 12:25:20 +0000 Subject: [PATCH 059/282] Remove old Snapcraft and AppDir folders --- .gitignore | 3 -- AppDir/usr/share/icons/icon.svg | 1 - AppImageBuilder.yml | 71 ------------------------ snap/local/icon.svg | 1 - snap/snapcraft.yaml | 96 --------------------------------- 5 files changed, 172 deletions(-) delete mode 100644 AppDir/usr/share/icons/icon.svg delete mode 100644 AppImageBuilder.yml delete mode 100644 snap/local/icon.svg delete mode 100644 snap/snapcraft.yaml diff --git a/.gitignore b/.gitignore index 5ff2726f286..4221c67b7b9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,3 @@ -/AppDir -/appimage-builder-cache -*.AppImage /lotus /lotus-miner /lotus-worker diff --git a/AppDir/usr/share/icons/icon.svg b/AppDir/usr/share/icons/icon.svg deleted file mode 100644 index da992296a1a..00000000000 --- a/AppDir/usr/share/icons/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/AppImageBuilder.yml b/AppImageBuilder.yml deleted file mode 100644 index 4f1f56bbb26..00000000000 --- a/AppImageBuilder.yml +++ /dev/null @@ -1,71 +0,0 @@ -version: 1 -AppDir: - path: ./AppDir - app_info: - id: io.filecoin.lotus - name: Lotus - icon: icon - version: latest - exec: usr/bin/lotus - exec_args: $@ - apt: - arch: amd64 - allow_unauthenticated: true - sources: - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal main restricted - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates main restricted - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal universe - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates universe - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal multiverse - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-updates multiverse - - sourceline: deb http://archive.ubuntu.com/ubuntu/ focal-backports main restricted - universe multiverse - - sourceline: deb http://security.ubuntu.com/ubuntu focal-security main restricted - - sourceline: deb http://security.ubuntu.com/ubuntu focal-security universe - - sourceline: deb http://security.ubuntu.com/ubuntu focal-security multiverse - - sourceline: deb https://cli-assets.heroku.com/apt ./ - - sourceline: deb http://ppa.launchpad.net/openjdk-r/ppa/ubuntu focal main - - sourceline: deb http://ppa.launchpad.net/git-core/ppa/ubuntu focal main - - sourceline: deb http://archive.canonical.com/ubuntu focal partner - include: - - ocl-icd-libopencl1 - - libhwloc15 - exclude: [] - files: - include: - - /usr/lib/x86_64-linux-gnu/libgcc_s.so.1 - - /usr/lib/x86_64-linux-gnu/libpthread-2.31.so - - /usr/lib/x86_64-linux-gnu/libm-2.31.so - - /usr/lib/x86_64-linux-gnu/libdl-2.31.so - - /usr/lib/x86_64-linux-gnu/libc-2.31.so - - /usr/lib/x86_64-linux-gnu/libudev.so.1.6.17 - exclude: - - usr/share/man - - usr/share/doc/*/README.* - - usr/share/doc/*/changelog.* - - usr/share/doc/*/NEWS.* - - usr/share/doc/*/TODO.* - test: - fedora: - image: appimagecrafters/tests-env:fedora-30 - command: ./AppRun - use_host_x: false - debian: - image: appimagecrafters/tests-env:debian-stable - command: ./AppRun - use_host_x: false - arch: - image: appimagecrafters/tests-env:archlinux-latest - command: ./AppRun - use_host_x: false - centos: - image: appimagecrafters/tests-env:centos-7 - command: ./AppRun - use_host_x: false - ubuntu: - image: appimagecrafters/tests-env:ubuntu-xenial - command: ./AppRun - use_host_x: false -AppImage: - arch: x86_64 - diff --git a/snap/local/icon.svg b/snap/local/icon.svg deleted file mode 100644 index da992296a1a..00000000000 --- a/snap/local/icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/snap/snapcraft.yaml b/snap/snapcraft.yaml deleted file mode 100644 index 8c7323a2b8e..00000000000 --- a/snap/snapcraft.yaml +++ /dev/null @@ -1,96 +0,0 @@ -name: lotus-filecoin -base: core20 -version: latest -summary: filecoin daemon/client -icon: snap/local/icon.svg -description: | - Filecoin is a peer-to-peer network that stores files on the internet - with built-in economic incentives to ensure files are stored reliably over time - - For documentation and additional information, please see the following resources - - https://filecoin.io - - https://fil.org - - https://lotus.filecoin.io - - https://github.com/filecoin-project/lotus - -confinement: strict - -parts: - lotus: - plugin: make - source: ./ - build-snaps: - - go - - rustup - build-packages: - - git - - jq - - libhwloc-dev - - ocl-icd-opencl-dev - - pkg-config - stage-packages: - - libhwloc15 - - ocl-icd-libopencl1 - override-build: | - LDFLAGS="" make lotus lotus-miner lotus-worker - cp lotus lotus-miner lotus-worker $SNAPCRAFT_PART_INSTALL - cp scripts/snap-lotus-entrypoint.sh $SNAPCRAFT_PART_INSTALL - -layout: - /var/lib/lotus: - symlink: $SNAP_COMMON/lotus - /var/lib/lotus-miner: - symlink: $SNAP_COMMON/lotus-miner - /var/lib/lotus-worker: - symlink: $SNAP_COMMON/lotus-worker - -apps: - lotus: - command: lotus - plugs: - - network - - network-bind - - home - environment: - FIL_PROOFS_PARAMETER_CACHE: $SNAP_USER_COMMON/filecoin-proof-parameters - LOTUS_PATH: $SNAP_COMMON/lotus - LOTUS_MINER_PATH: $SNAP_COMMON/lotus-miner - LOTUS_WORKER_PATH: $SNAP_COMMON/lotus-worker - lotus-miner: - command: lotus-miner - plugs: - - network - - network-bind - - opengl - environment: - FIL_PROOFS_PARAMETER_CACHE: $SNAP_USER_COMMON/filecoin-proof-parameters - LOTUS_PATH: $SNAP_COMMON/lotus - LOTUS_MINER_PATH: $SNAP_COMMON/lotus-miner - LOTUS_WORKER_PATH: $SNAP_COMMON/lotus-worker - lotus-worker: - command: lotus-worker - plugs: - - network - - network-bind - - opengl - environment: - FIL_PROOFS_PARAMETER_CACHE: $SNAP_USER_COMMON/filecoin-proof-parameters - LOTUS_PATH: $SNAP_COMMON/lotus - LOTUS_MINER_PATH: $SNAP_COMMON/lotus-miner - LOTUS_WORKER_PATH: $SNAP_COMMON/lotus-worker - lotus-daemon: - command: snap-lotus-entrypoint.sh - daemon: simple - install-mode: disable - plugs: - - network - - network-bind - environment: - FIL_PROOFS_PARAMETER_CACHE: $SNAP_COMMON/filecoin-proof-parameters - LOTUS_PATH: $SNAP_COMMON/lotus - LOTUS_MINER_PATH: $SNAP_COMMON/lotus-miner - LOTUS_WORKER_PATH: $SNAP_COMMON/lotus-worker From 17d220524ca2709718aeb9be806de67e60394a31 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 26 Jan 2023 13:06:23 +0000 Subject: [PATCH 060/282] Always include checked in files in docker context The .dockerignore file is symlinked to the .gitignore file, and checked in files should not be removed from our docker context otherwise they result in dirty git state when we build our images. --- .gitignore | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.gitignore b/.gitignore index 4221c67b7b9..2e9dcd0ffd0 100644 --- a/.gitignore +++ b/.gitignore @@ -47,3 +47,8 @@ build/builtin-actors/v* build/builtin-actors/*.car dist/ + + +# The following files are checked into git and result +# in dirty git state if removed from the docker context +!extern/filecoin-ffi/rust/filecoin.pc From 0f6003fd6857bdbf092781a20d9321a209e797f6 Mon Sep 17 00:00:00 2001 From: Ian Davis Date: Thu, 26 Jan 2023 13:25:47 +0000 Subject: [PATCH 061/282] Check git state in Dockerfile to catch .dockerignore bugs --- Dockerfile | 2 ++ scripts/docker-git-state-check.sh | 12 ++++++++++++ 2 files changed, 14 insertions(+) create mode 100755 scripts/docker-git-state-check.sh diff --git a/Dockerfile b/Dockerfile index 5c147e930d0..81089517b5c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,6 +33,8 @@ RUN set -eux; \ COPY ./ /opt/filecoin WORKDIR /opt/filecoin +RUN scripts/docker-git-state-check.sh + ### make configurable filecoin-ffi build ARG FFI_BUILD_FROM_SOURCE=0 ENV FFI_BUILD_FROM_SOURCE=${FFI_BUILD_FROM_SOURCE} diff --git a/scripts/docker-git-state-check.sh b/scripts/docker-git-state-check.sh new file mode 100755 index 00000000000..6075ebf843c --- /dev/null +++ b/scripts/docker-git-state-check.sh @@ -0,0 +1,12 @@ +set -e + +if [ -z "$(git status --porcelain)" ]; then + echo "PASSED: Working directory clean" +else + echo "FAILED: Working directory not clean." + echo "This is likely because the .dockerignore file has removed something checked into git." + echo "Add the missing files listed below to the .dockerignore to fix this issue:" + echo "$(git status)" + exit 1 +fi + From f572852d06aa73e54193d053601ab879642638f7 Mon Sep 17 00:00:00 2001 From: Jorropo Date: Thu, 26 Jan 2023 16:41:28 +0100 Subject: [PATCH 062/282] chore: all: bump go-libipfs to replace go-block-format Includes changes from: - https://github.com/ipfs/go-block-format/pull/37 - https://github.com/ipfs/go-libipfs/pull/58 --- api/api_full.go | 2 +- api/api_gateway.go | 2 +- api/docgen/docgen.go | 2 +- api/mocks/mock_full.go | 2 +- api/proxy_gen.go | 2 +- api/v0api/full.go | 2 +- api/v0api/gateway.go | 2 +- api/v0api/proxy_gen.go | 2 +- api/v0api/v0mocks/mock_full.go | 2 +- blockstore/api.go | 2 +- blockstore/autobatch.go | 2 +- blockstore/badger/blockstore.go | 2 +- blockstore/badger/blockstore_test.go | 2 +- blockstore/badger/blockstore_test_suite.go | 2 +- blockstore/buffered.go | 2 +- blockstore/discard.go | 2 +- blockstore/fallback.go | 2 +- blockstore/idstore.go | 2 +- blockstore/ipfs.go | 2 +- blockstore/mem.go | 2 +- blockstore/mem_test.go | 2 +- blockstore/net.go | 2 +- blockstore/net_serve.go | 2 +- blockstore/net_test.go | 2 +- blockstore/splitstore/debug.go | 2 +- blockstore/splitstore/splitstore.go | 2 +- blockstore/splitstore/splitstore_compact.go | 2 +- blockstore/splitstore/splitstore_expose.go | 2 +- blockstore/splitstore/splitstore_reify.go | 2 +- blockstore/splitstore/splitstore_test.go | 2 +- blockstore/splitstore/splitstore_warmup.go | 2 +- blockstore/sync.go | 2 +- blockstore/timed.go | 2 +- blockstore/timed_test.go | 2 +- blockstore/union.go | 2 +- blockstore/union_test.go | 2 +- chain/events/state/mock/api.go | 2 +- chain/gen/genesis/genblock.go | 2 +- chain/store/messages.go | 2 +- chain/store/snapshot.go | 2 +- chain/store/store.go | 2 +- chain/sub/incoming.go | 2 +- chain/sub/incoming_test.go | 2 +- chain/sync.go | 2 +- chain/types/blockheader.go | 2 +- chain/types/message.go | 2 +- chain/types/signedmessage.go | 2 +- chain/types/tipset_key.go | 2 +- chain/vm/vm.go | 2 +- cmd/lotus-shed/datastore-vlog.go | 2 +- cmd/lotus-shed/export.go | 2 +- cmd/lotus-shed/import-car.go | 2 +- cmd/tvx/stores.go | 2 +- conformance/runner.go | 2 +- gateway/node.go | 2 +- gateway/proxy_fil.go | 2 +- go.mod | 9 +++++---- go.sum | 19 ++++++++++++------- .../deals_partial_retrieval_dm-level_test.go | 2 +- itests/deals_partial_retrieval_test.go | 2 +- markets/dagstore/blockstore.go | 2 +- markets/storageadapter/api.go | 2 +- .../ondealsectorcommitted_test.go | 2 +- node/impl/full/chain.go | 2 +- 64 files changed, 79 insertions(+), 73 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index b17fad3b5d8..00d1017cbb3 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -7,8 +7,8 @@ import ( "time" "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-libp2p/core/peer" "github.com/filecoin-project/go-address" diff --git a/api/api_gateway.go b/api/api_gateway.go index c787100263b..38ddb667006 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -3,8 +3,8 @@ package api import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 606ae9d8e22..65d71d208a7 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -14,9 +14,9 @@ import ( "unicode" "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/ipfs/go-graphsync" + blocks "github.com/ipfs/go-libipfs/blocks" textselector "github.com/ipld/go-ipld-selector-text-lite" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/metrics" diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index b32fc7d8b66..43e2c55dfd8 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -12,8 +12,8 @@ import ( gomock "github.com/golang/mock/gomock" uuid "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" metrics "github.com/libp2p/go-libp2p/core/metrics" network0 "github.com/libp2p/go-libp2p/core/network" peer "github.com/libp2p/go-libp2p/core/peer" diff --git a/api/proxy_gen.go b/api/proxy_gen.go index aaa1d87c748..6a0a204e0f0 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -8,8 +8,8 @@ import ( "time" "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-libp2p/core/metrics" "github.com/libp2p/go-libp2p/core/network" "github.com/libp2p/go-libp2p/core/peer" diff --git a/api/v0api/full.go b/api/v0api/full.go index 87d5cba4e99..490cd73c839 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -3,8 +3,8 @@ package v0api import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/libp2p/go-libp2p/core/peer" diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index bd55917c712..674371c144c 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -3,8 +3,8 @@ package v0api import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-state-types/abi" diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index b1a07dacc18..de912140f3e 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,8 +5,8 @@ package v0api import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-libp2p/core/peer" "golang.org/x/xerrors" diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 3aff979ff65..619f19d35bf 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -11,8 +11,8 @@ import ( gomock "github.com/golang/mock/gomock" uuid "github.com/google/uuid" - blocks "github.com/ipfs/go-block-format" cid "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" metrics "github.com/libp2p/go-libp2p/core/metrics" network0 "github.com/libp2p/go-libp2p/core/network" peer "github.com/libp2p/go-libp2p/core/peer" diff --git a/blockstore/api.go b/blockstore/api.go index 090f53e5a99..251deb13a05 100644 --- a/blockstore/api.go +++ b/blockstore/api.go @@ -3,8 +3,8 @@ package blockstore import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" ) diff --git a/blockstore/autobatch.go b/blockstore/autobatch.go index d41d521ef74..3cb8eafa6a7 100644 --- a/blockstore/autobatch.go +++ b/blockstore/autobatch.go @@ -5,9 +5,9 @@ import ( "sync" "time" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" ) diff --git a/blockstore/badger/blockstore.go b/blockstore/badger/blockstore.go index 050ed6d3b1d..da4f9f67dd5 100644 --- a/blockstore/badger/blockstore.go +++ b/blockstore/badger/blockstore.go @@ -13,9 +13,9 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/dgraph-io/badger/v2/options" "github.com/dgraph-io/badger/v2/pb" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" logger "github.com/ipfs/go-log/v2" pool "github.com/libp2p/go-buffer-pool" "github.com/multiformats/go-base32" diff --git a/blockstore/badger/blockstore_test.go b/blockstore/badger/blockstore_test.go index a1451579619..fc81be43e7b 100644 --- a/blockstore/badger/blockstore_test.go +++ b/blockstore/badger/blockstore_test.go @@ -10,8 +10,8 @@ import ( "strings" "testing" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/stretchr/testify/require" "golang.org/x/sync/errgroup" diff --git a/blockstore/badger/blockstore_test_suite.go b/blockstore/badger/blockstore_test_suite.go index 7db15590193..877eb6e6bdc 100644 --- a/blockstore/badger/blockstore_test_suite.go +++ b/blockstore/badger/blockstore_test_suite.go @@ -9,10 +9,10 @@ import ( "strings" "testing" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" u "github.com/ipfs/go-ipfs-util" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/stretchr/testify/require" "github.com/filecoin-project/lotus/blockstore" diff --git a/blockstore/buffered.go b/blockstore/buffered.go index dbee095a211..e089ed561f8 100644 --- a/blockstore/buffered.go +++ b/blockstore/buffered.go @@ -4,9 +4,9 @@ import ( "context" "os" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" ) // buflog is a logger for the buffered blockstore. It is subscoped from the diff --git a/blockstore/discard.go b/blockstore/discard.go index a8e6cfec7a9..7f1a76a2289 100644 --- a/blockstore/discard.go +++ b/blockstore/discard.go @@ -4,8 +4,8 @@ import ( "context" "io" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" ) var _ Blockstore = (*discardstore)(nil) diff --git a/blockstore/fallback.go b/blockstore/fallback.go index de948b34600..9fab960f5d7 100644 --- a/blockstore/fallback.go +++ b/blockstore/fallback.go @@ -5,9 +5,9 @@ import ( "sync" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" ) diff --git a/blockstore/idstore.go b/blockstore/idstore.go index 23b85146aeb..a0ecec5f07e 100644 --- a/blockstore/idstore.go +++ b/blockstore/idstore.go @@ -4,8 +4,8 @@ import ( "context" "io" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" mh "github.com/multiformats/go-multihash" "golang.org/x/xerrors" ) diff --git a/blockstore/ipfs.go b/blockstore/ipfs.go index 41c2b871003..756314f2de8 100644 --- a/blockstore/ipfs.go +++ b/blockstore/ipfs.go @@ -5,9 +5,9 @@ import ( "context" "io/ioutil" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" httpapi "github.com/ipfs/go-ipfs-http-client" + blocks "github.com/ipfs/go-libipfs/blocks" iface "github.com/ipfs/interface-go-ipfs-core" "github.com/ipfs/interface-go-ipfs-core/options" "github.com/ipfs/interface-go-ipfs-core/path" diff --git a/blockstore/mem.go b/blockstore/mem.go index 7cfefafd7a4..05da287c58b 100644 --- a/blockstore/mem.go +++ b/blockstore/mem.go @@ -3,9 +3,9 @@ package blockstore import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" ) // NewMemory returns a temporary memory-backed blockstore. diff --git a/blockstore/mem_test.go b/blockstore/mem_test.go index 4d4a776245b..6a5e0d2d11d 100644 --- a/blockstore/mem_test.go +++ b/blockstore/mem_test.go @@ -4,8 +4,8 @@ import ( "context" "testing" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" mh "github.com/multiformats/go-multihash" "github.com/stretchr/testify/require" ) diff --git a/blockstore/net.go b/blockstore/net.go index 77da764a57d..a6b008af2bd 100644 --- a/blockstore/net.go +++ b/blockstore/net.go @@ -8,9 +8,9 @@ import ( "sync" "sync/atomic" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-msgio" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" diff --git a/blockstore/net_serve.go b/blockstore/net_serve.go index 2540c845e81..b58d2a5fd19 100644 --- a/blockstore/net_serve.go +++ b/blockstore/net_serve.go @@ -5,9 +5,9 @@ import ( "context" "encoding/binary" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-msgio" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" diff --git a/blockstore/net_test.go b/blockstore/net_test.go index d8c33818eb3..6c3060a98f5 100644 --- a/blockstore/net_test.go +++ b/blockstore/net_test.go @@ -6,8 +6,8 @@ import ( "io" "testing" - block "github.com/ipfs/go-block-format" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" "github.com/libp2p/go-msgio" "github.com/stretchr/testify/require" ) diff --git a/blockstore/splitstore/debug.go b/blockstore/splitstore/debug.go index f059ae4ced9..c870a44e1b5 100644 --- a/blockstore/splitstore/debug.go +++ b/blockstore/splitstore/debug.go @@ -12,8 +12,8 @@ import ( "sync" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "go.uber.org/multierr" "golang.org/x/xerrors" ) diff --git a/blockstore/splitstore/splitstore.go b/blockstore/splitstore/splitstore.go index dee6e784cdd..0afb15c11c4 100644 --- a/blockstore/splitstore/splitstore.go +++ b/blockstore/splitstore/splitstore.go @@ -8,10 +8,10 @@ import ( "sync/atomic" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" dstore "github.com/ipfs/go-datastore" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/stats" "go.uber.org/multierr" diff --git a/blockstore/splitstore/splitstore_compact.go b/blockstore/splitstore/splitstore_compact.go index 6ffb3572652..0422736f03c 100644 --- a/blockstore/splitstore/splitstore_compact.go +++ b/blockstore/splitstore/splitstore_compact.go @@ -10,9 +10,9 @@ import ( "sync/atomic" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" cbg "github.com/whyrusleeping/cbor-gen" "go.opencensus.io/stats" "golang.org/x/sync/errgroup" diff --git a/blockstore/splitstore/splitstore_expose.go b/blockstore/splitstore/splitstore_expose.go index ff9bf1f7182..d092fbb9bdc 100644 --- a/blockstore/splitstore/splitstore_expose.go +++ b/blockstore/splitstore/splitstore_expose.go @@ -4,9 +4,9 @@ import ( "context" "errors" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" bstore "github.com/filecoin-project/lotus/blockstore" ) diff --git a/blockstore/splitstore/splitstore_reify.go b/blockstore/splitstore/splitstore_reify.go index 9db480b8c5f..aa14f090af6 100644 --- a/blockstore/splitstore/splitstore_reify.go +++ b/blockstore/splitstore/splitstore_reify.go @@ -5,8 +5,8 @@ import ( "runtime" "sync/atomic" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" ) diff --git a/blockstore/splitstore/splitstore_test.go b/blockstore/splitstore/splitstore_test.go index 750a2efeda5..c97a9d01ccb 100644 --- a/blockstore/splitstore/splitstore_test.go +++ b/blockstore/splitstore/splitstore_test.go @@ -11,11 +11,11 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" dssync "github.com/ipfs/go-datastore/sync" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" mh "github.com/multiformats/go-multihash" diff --git a/blockstore/splitstore/splitstore_warmup.go b/blockstore/splitstore/splitstore_warmup.go index e387263dae7..23bbad7cada 100644 --- a/blockstore/splitstore/splitstore_warmup.go +++ b/blockstore/splitstore/splitstore_warmup.go @@ -5,9 +5,9 @@ import ( "sync/atomic" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-state-types/abi" diff --git a/blockstore/sync.go b/blockstore/sync.go index 1b4ad8297e8..4f97027ae17 100644 --- a/blockstore/sync.go +++ b/blockstore/sync.go @@ -4,8 +4,8 @@ import ( "context" "sync" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" ) // NewMemorySync returns a thread-safe in-memory blockstore. diff --git a/blockstore/timed.go b/blockstore/timed.go index 38f4e51f387..dda2e19589d 100644 --- a/blockstore/timed.go +++ b/blockstore/timed.go @@ -6,9 +6,9 @@ import ( "sync" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/raulk/clock" "go.uber.org/multierr" ) diff --git a/blockstore/timed_test.go b/blockstore/timed_test.go index 931f145075b..fb3aa00c9b4 100644 --- a/blockstore/timed_test.go +++ b/blockstore/timed_test.go @@ -6,8 +6,8 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/raulk/clock" "github.com/stretchr/testify/require" ) diff --git a/blockstore/union.go b/blockstore/union.go index 71e785f1a9e..3372cd20c9a 100644 --- a/blockstore/union.go +++ b/blockstore/union.go @@ -3,9 +3,9 @@ package blockstore import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" ) type unionBlockstore []Blockstore diff --git a/blockstore/union_test.go b/blockstore/union_test.go index 57948994770..47aab852a86 100644 --- a/blockstore/union_test.go +++ b/blockstore/union_test.go @@ -5,7 +5,7 @@ import ( "context" "testing" - blocks "github.com/ipfs/go-block-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/stretchr/testify/require" ) diff --git a/chain/events/state/mock/api.go b/chain/events/state/mock/api.go index cdec4265922..680e304f56c 100644 --- a/chain/events/state/mock/api.go +++ b/chain/events/state/mock/api.go @@ -4,8 +4,8 @@ import ( "context" "sync" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/chain/gen/genesis/genblock.go b/chain/gen/genesis/genblock.go index f26659cdfac..930b3ccff4e 100644 --- a/chain/gen/genesis/genblock.go +++ b/chain/gen/genesis/genblock.go @@ -3,8 +3,8 @@ package genesis import ( "encoding/hex" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/multiformats/go-multihash" ) diff --git a/chain/store/messages.go b/chain/store/messages.go index 5e2880c4a31..efc41bfc174 100644 --- a/chain/store/messages.go +++ b/chain/store/messages.go @@ -3,10 +3,10 @@ package store import ( "context" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" cbg "github.com/whyrusleeping/cbor-gen" "golang.org/x/xerrors" diff --git a/chain/store/snapshot.go b/chain/store/snapshot.go index e90a60611a8..36435152eec 100644 --- a/chain/store/snapshot.go +++ b/chain/store/snapshot.go @@ -5,8 +5,8 @@ import ( "context" "io" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/ipld/go-car" carutil "github.com/ipld/go-car/util" carv2 "github.com/ipld/go-car/v2" diff --git a/chain/store/store.go b/chain/store/store.go index 6dc17d766d3..0299a1fb9d7 100644 --- a/chain/store/store.go +++ b/chain/store/store.go @@ -12,11 +12,11 @@ import ( "time" lru "github.com/hashicorp/golang-lru" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" dstore "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/query" cbor "github.com/ipfs/go-ipld-cbor" + block "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" "go.opencensus.io/stats" "go.opencensus.io/trace" diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 2eb846d806d..cbda39d8cfa 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -8,9 +8,9 @@ import ( "time" lru "github.com/hashicorp/golang-lru" - blocks "github.com/ipfs/go-block-format" bserv "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" pubsub "github.com/libp2p/go-libp2p-pubsub" "github.com/libp2p/go-libp2p/core/connmgr" diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index 8566391b997..d17b0882550 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -7,8 +7,8 @@ import ( "testing" "github.com/golang/mock/gomock" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" pubsub "github.com/libp2p/go-libp2p-pubsub" pb "github.com/libp2p/go-libp2p-pubsub/pb" "github.com/libp2p/go-libp2p/core/peer" diff --git a/chain/sync.go b/chain/sync.go index b0c8b50ff96..db7b7fc042d 100644 --- a/chain/sync.go +++ b/chain/sync.go @@ -11,10 +11,10 @@ import ( "github.com/Gurpartap/async" "github.com/hashicorp/go-multierror" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" "github.com/libp2p/go-libp2p/core/connmgr" "github.com/libp2p/go-libp2p/core/peer" diff --git a/chain/types/blockheader.go b/chain/types/blockheader.go index e0b9e6b30bb..559569ba01b 100644 --- a/chain/types/blockheader.go +++ b/chain/types/blockheader.go @@ -4,8 +4,8 @@ import ( "bytes" "math/big" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" "github.com/minio/blake2b-simd" "golang.org/x/xerrors" diff --git a/chain/types/message.go b/chain/types/message.go index 352548d0c5b..a25cd05b6f4 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -5,8 +5,8 @@ import ( "encoding/json" "fmt" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/chain/types/signedmessage.go b/chain/types/signedmessage.go index 16853171464..dc867c5e547 100644 --- a/chain/types/signedmessage.go +++ b/chain/types/signedmessage.go @@ -4,8 +4,8 @@ import ( "bytes" "encoding/json" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" diff --git a/chain/types/tipset_key.go b/chain/types/tipset_key.go index 15e655da7d6..50753ffd245 100644 --- a/chain/types/tipset_key.go +++ b/chain/types/tipset_key.go @@ -7,8 +7,8 @@ import ( "io" "strings" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" typegen "github.com/whyrusleeping/cbor-gen" "github.com/filecoin-project/go-state-types/abi" diff --git a/chain/vm/vm.go b/chain/vm/vm.go index e18c4aea960..5ba6938e579 100644 --- a/chain/vm/vm.go +++ b/chain/vm/vm.go @@ -7,9 +7,9 @@ import ( "sync/atomic" "time" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" + block "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" mh "github.com/multiformats/go-multihash" cbg "github.com/whyrusleeping/cbor-gen" diff --git a/cmd/lotus-shed/datastore-vlog.go b/cmd/lotus-shed/datastore-vlog.go index 936d33849f7..af412df19da 100644 --- a/cmd/lotus-shed/datastore-vlog.go +++ b/cmd/lotus-shed/datastore-vlog.go @@ -12,8 +12,8 @@ import ( "strings" "github.com/dgraph-io/badger/v2/y" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" "github.com/mitchellh/go-homedir" "github.com/multiformats/go-base32" "github.com/urfave/cli/v2" diff --git a/cmd/lotus-shed/export.go b/cmd/lotus-shed/export.go index 459de3383d3..d67fa449352 100644 --- a/cmd/lotus-shed/export.go +++ b/cmd/lotus-shed/export.go @@ -15,11 +15,11 @@ import ( "github.com/dgraph-io/badger/v2" "github.com/dgraph-io/badger/v2/pb" "github.com/dustin/go-humanize" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" ipld "github.com/ipfs/go-ipld-format" + block "github.com/ipfs/go-libipfs/blocks" "github.com/ipfs/go-merkledag" "github.com/ipld/go-car" "github.com/multiformats/go-base32" diff --git a/cmd/lotus-shed/import-car.go b/cmd/lotus-shed/import-car.go index 973e7b31b84..4c636a3af40 100644 --- a/cmd/lotus-shed/import-car.go +++ b/cmd/lotus-shed/import-car.go @@ -7,8 +7,8 @@ import ( "io" "os" - block "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + block "github.com/ipfs/go-libipfs/blocks" "github.com/ipld/go-car" "github.com/urfave/cli/v2" "golang.org/x/xerrors" diff --git a/cmd/tvx/stores.go b/cmd/tvx/stores.go index 9035c482a0b..b863ffa7442 100644 --- a/cmd/tvx/stores.go +++ b/cmd/tvx/stores.go @@ -6,7 +6,6 @@ import ( "sync" "github.com/fatih/color" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" @@ -15,6 +14,7 @@ import ( offline "github.com/ipfs/go-ipfs-exchange-offline" cbor "github.com/ipfs/go-ipld-cbor" format "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/ipfs/go-merkledag" "golang.org/x/xerrors" diff --git a/conformance/runner.go b/conformance/runner.go index b6bb5a164ad..ff738a4a5ee 100644 --- a/conformance/runner.go +++ b/conformance/runner.go @@ -14,12 +14,12 @@ import ( "github.com/fatih/color" "github.com/hashicorp/go-multierror" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" offline "github.com/ipfs/go-ipfs-exchange-offline" format "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/ipfs/go-merkledag" "github.com/ipld/go-car" diff --git a/gateway/node.go b/gateway/node.go index f18189ae22b..bfe0c7c0b61 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -5,8 +5,8 @@ import ( "fmt" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "go.opencensus.io/stats" "golang.org/x/time/rate" diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 0e53130fbf3..1f6ee2ccc3c 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -3,8 +3,8 @@ package gateway import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/go.mod b/go.mod index b9eb613eea0..2ca329a09b8 100644 --- a/go.mod +++ b/go.mod @@ -75,7 +75,6 @@ require ( github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 github.com/ipfs/go-bitswap v0.10.2 - github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.4.0 github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 @@ -97,6 +96,7 @@ require ( github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.4.0 + github.com/ipfs/go-libipfs v0.3.0 github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-merkledag v0.8.1 github.com/ipfs/go-metrics-interface v0.0.1 @@ -113,7 +113,7 @@ require ( github.com/kelseyhightower/envconfig v1.4.0 github.com/koalacxr/quantile v0.0.1 github.com/libp2p/go-buffer-pool v0.1.0 - github.com/libp2p/go-libp2p v0.23.2 + github.com/libp2p/go-libp2p v0.23.4 github.com/libp2p/go-libp2p-consensus v0.0.1 github.com/libp2p/go-libp2p-gorpc v0.4.0 github.com/libp2p/go-libp2p-kad-dht v0.18.0 @@ -128,7 +128,7 @@ require ( github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.1.0 - github.com/multiformats/go-multiaddr v0.7.0 + github.com/multiformats/go-multiaddr v0.8.0 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.1.1 github.com/multiformats/go-multihash v0.2.1 @@ -138,7 +138,7 @@ require ( github.com/prometheus/client_golang v1.13.0 github.com/raulk/clock v1.1.0 github.com/raulk/go-watchdog v1.3.0 - github.com/stretchr/testify v1.8.0 + github.com/stretchr/testify v1.8.1 github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 github.com/urfave/cli/v2 v2.16.3 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba @@ -231,6 +231,7 @@ require ( github.com/huin/goupnp v1.0.3 // indirect github.com/iancoleman/orderedmap v0.1.0 // indirect github.com/ipfs/go-bitfield v1.0.0 // indirect + github.com/ipfs/go-block-format v0.1.1 // indirect github.com/ipfs/go-filestore v1.2.0 // indirect github.com/ipfs/go-ipfs-cmds v0.7.0 // indirect github.com/ipfs/go-ipfs-config v0.18.0 // indirect diff --git a/go.sum b/go.sum index 6df3481e4aa..88eda50b211 100644 --- a/go.sum +++ b/go.sum @@ -679,8 +679,9 @@ github.com/ipfs/go-bitswap v0.10.2 h1:B81RIwkTnIvSYT1ZCzxjYTeF0Ek88xa9r1AMpTfk+9 github.com/ipfs/go-bitswap v0.10.2/go.mod h1:+fZEvycxviZ7c+5KlKwTzLm0M28g2ukCPqiuLfJk4KA= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= -github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= +github.com/ipfs/go-block-format v0.1.1 h1:129vSO3zwbsYADcyQWcOYiuCpAqt462SFfqFHdFJhhI= +github.com/ipfs/go-block-format v0.1.1/go.mod h1:+McEIT+g52p+zz5xGAABGSOKrzmrdX97bc0USBdWPUs= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= @@ -808,6 +809,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= +github.com/ipfs/go-libipfs v0.3.0 h1:YvzFWGcl88eiz2tjOheNqaeQseH+dW3fUKrSaHOG/dU= +github.com/ipfs/go-libipfs v0.3.0/go.mod h1:pSUHZ5qPJTAidsxe9bAeHp3KIiw2ODEW2a2kM3v+iXI= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= @@ -1028,8 +1031,8 @@ github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2 github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.19.4/go.mod h1:MIt8y481VDhUe4ErWi1a4bvt/CjjFfOq6kZTothWIXY= -github.com/libp2p/go-libp2p v0.23.2 h1:yqyTeKQJyofWXxEv/eEVUvOrGdt/9x+0PIQ4N1kaxmE= -github.com/libp2p/go-libp2p v0.23.2/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= +github.com/libp2p/go-libp2p v0.23.4 h1:hWi9XHSOVFR1oDWRk7rigfyA4XNMuYL20INNybP9LP8= +github.com/libp2p/go-libp2p v0.23.4/go.mod h1:s9DEa5NLR4g+LZS+md5uGU4emjMWFiqkZr6hBTY8UxI= github.com/libp2p/go-libp2p-asn-util v0.1.0/go.mod h1:wu+AnM9Ii2KgO5jMmS1rz9dvzTdj8BXqsPR9HR0XB7I= github.com/libp2p/go-libp2p-asn-util v0.2.0 h1:rg3+Os8jbnO5DxkC7K/Utdi+DkY3q/d1/1q+8WeNAsw= github.com/libp2p/go-libp2p-asn-util v0.2.0/go.mod h1:WoaWxbHKBymSN41hWSq/lGKJEca7TNm58+gGJi2WsLI= @@ -1485,8 +1488,8 @@ github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9x github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= -github.com/multiformats/go-multiaddr v0.7.0 h1:gskHcdaCyPtp9XskVwtvEeQOG465sCohbQIirSyqxrc= -github.com/multiformats/go-multiaddr v0.7.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= +github.com/multiformats/go-multiaddr v0.8.0 h1:aqjksEcqK+iD/Foe1RRFsGZh8+XFiGo7FgUCZlpv3LU= +github.com/multiformats/go-multiaddr v0.8.0/go.mod h1:Fs50eBDWvZu+l3/9S6xAE7ZYj6yhxlvaVZjakWN7xRs= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= @@ -1780,8 +1783,9 @@ github.com/streadway/amqp v0.0.0-20190827072141-edfb9018d271/go.mod h1:AZpEONHx3 github.com/streadway/handy v0.0.0-20190108123426-d5acb3125c2a/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.4.0 h1:M2gUjqZET1qApGOWNSnZ49BAIMX4F/1plDv3+l31EJ4= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.1-0.20190311161405-34c6fa2dc709/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= @@ -1790,8 +1794,9 @@ github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5 github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1 h1:w7B6lhMri9wdJUVmEZPGGhZzrYTPvgJArz7wNPgYKsk= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7 h1:epCh84lMvA70Z7CTTCmYQn2CKbY8j86K7/FAIr141uY= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= diff --git a/itests/deals_partial_retrieval_dm-level_test.go b/itests/deals_partial_retrieval_dm-level_test.go index f56d64026eb..246541229ee 100644 --- a/itests/deals_partial_retrieval_dm-level_test.go +++ b/itests/deals_partial_retrieval_dm-level_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/ipld/go-car" textselector "github.com/ipld/go-ipld-selector-text-lite" "github.com/stretchr/testify/require" diff --git a/itests/deals_partial_retrieval_test.go b/itests/deals_partial_retrieval_test.go index 0bbf23da054..e2dae9aff19 100644 --- a/itests/deals_partial_retrieval_test.go +++ b/itests/deals_partial_retrieval_test.go @@ -9,8 +9,8 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/ipld/go-car" "github.com/stretchr/testify/require" "golang.org/x/xerrors" diff --git a/markets/dagstore/blockstore.go b/markets/dagstore/blockstore.go index 317cb08b9fc..593204ec8e5 100644 --- a/markets/dagstore/blockstore.go +++ b/markets/dagstore/blockstore.go @@ -4,9 +4,9 @@ import ( "context" "io" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" bstore "github.com/ipfs/go-ipfs-blockstore" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/dagstore" diff --git a/markets/storageadapter/api.go b/markets/storageadapter/api.go index b93ffdfbb16..3105f2261c0 100644 --- a/markets/storageadapter/api.go +++ b/markets/storageadapter/api.go @@ -3,9 +3,9 @@ package storageadapter import ( "context" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" cbor "github.com/ipfs/go-ipld-cbor" + blocks "github.com/ipfs/go-libipfs/blocks" "golang.org/x/xerrors" "github.com/filecoin-project/go-address" diff --git a/markets/storageadapter/ondealsectorcommitted_test.go b/markets/storageadapter/ondealsectorcommitted_test.go index 1d7519ff9f9..592c22db7d5 100644 --- a/markets/storageadapter/ondealsectorcommitted_test.go +++ b/markets/storageadapter/ondealsectorcommitted_test.go @@ -10,8 +10,8 @@ import ( "testing" "time" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" "github.com/stretchr/testify/require" "golang.org/x/xerrors" diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 8448a542e9b..17444ca58c2 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -11,12 +11,12 @@ import ( "strings" "sync" - blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" offline "github.com/ipfs/go-ipfs-exchange-offline" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" + blocks "github.com/ipfs/go-libipfs/blocks" logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-merkledag" mh "github.com/multiformats/go-multihash" From d060df2fb901faee701f711e02ea3a3ad6b8ef7f Mon Sep 17 00:00:00 2001 From: Jorropo Date: Fri, 27 Jan 2023 23:01:51 +0100 Subject: [PATCH 063/282] chore: node: migrate go-bitswap to go-libipfs/bitswap This was migrated in https://github.com/ipfs/go-libipfs/pull/63. --- go.mod | 5 ++--- go.sum | 8 ++++---- node/modules/chain.go | 4 ++-- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 2ca329a09b8..dbd2459c7bf 100644 --- a/go.mod +++ b/go.mod @@ -74,7 +74,6 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.10.2 github.com/ipfs/go-blockservice v0.4.0 github.com/ipfs/go-cid v0.3.2 github.com/ipfs/go-cidutil v0.1.0 @@ -92,11 +91,11 @@ require ( github.com/ipfs/go-ipfs-exchange-offline v0.3.0 github.com/ipfs/go-ipfs-files v0.1.1 github.com/ipfs/go-ipfs-http-client v0.4.0 - github.com/ipfs/go-ipfs-routing v0.2.1 + github.com/ipfs/go-ipfs-routing v0.3.0 github.com/ipfs/go-ipfs-util v0.0.2 github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.4.0 - github.com/ipfs/go-libipfs v0.3.0 + github.com/ipfs/go-libipfs v0.4.0 github.com/ipfs/go-log/v2 v2.5.1 github.com/ipfs/go-merkledag v0.8.1 github.com/ipfs/go-metrics-interface v0.0.1 diff --git a/go.sum b/go.sum index 88eda50b211..bf049f3a0e9 100644 --- a/go.sum +++ b/go.sum @@ -676,7 +676,6 @@ github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiL github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-bitswap v0.6.0/go.mod h1:Hj3ZXdOC5wBJvENtdqsixmzzRukqd8EHLxZLZc3mzRA= github.com/ipfs/go-bitswap v0.10.2 h1:B81RIwkTnIvSYT1ZCzxjYTeF0Ek88xa9r1AMpTfk+9Q= -github.com/ipfs/go-bitswap v0.10.2/go.mod h1:+fZEvycxviZ7c+5KlKwTzLm0M28g2ukCPqiuLfJk4KA= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= @@ -786,8 +785,9 @@ github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= -github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= github.com/ipfs/go-ipfs-routing v0.2.1/go.mod h1:xiNNiwgjmLqPS1cimvAw6EyB9rkVDbiocA4yY+wRNLM= +github.com/ipfs/go-ipfs-routing v0.3.0 h1:9W/W3N+g+y4ZDeffSgqhgo7BsBSJwPMcyssET9OWevc= +github.com/ipfs/go-ipfs-routing v0.3.0/go.mod h1:dKqtTFIql7e1zYsEuWLyuOU+E0WJWW8JjbTPLParDWo= github.com/ipfs/go-ipfs-util v0.0.1/go.mod h1:spsl5z8KUnrve+73pOhSVZND1SIxPW5RyBCNzQxlJBc= github.com/ipfs/go-ipfs-util v0.0.2 h1:59Sswnk1MFaiq+VcaknX7aYEyGyGDAA73ilhEK2POp8= github.com/ipfs/go-ipfs-util v0.0.2/go.mod h1:CbPtkWJzjLdEcezDns2XYaehFVNXG9zrdrtMecczcsQ= @@ -809,8 +809,8 @@ github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2 github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= github.com/ipfs/go-ipns v0.3.0 h1:ai791nTgVo+zTuq2bLvEGmWP1M0A6kGTXUsgv/Yq67A= github.com/ipfs/go-ipns v0.3.0/go.mod h1:3cLT2rbvgPZGkHJoPO1YMJeh6LtkxopCkKFcio/wE24= -github.com/ipfs/go-libipfs v0.3.0 h1:YvzFWGcl88eiz2tjOheNqaeQseH+dW3fUKrSaHOG/dU= -github.com/ipfs/go-libipfs v0.3.0/go.mod h1:pSUHZ5qPJTAidsxe9bAeHp3KIiw2ODEW2a2kM3v+iXI= +github.com/ipfs/go-libipfs v0.4.0 h1:TkUxJGjtPnSzAgkw7VjS0/DBay3MPjmTBa4dGdUQCDE= +github.com/ipfs/go-libipfs v0.4.0/go.mod h1:XsU2cP9jBhDrXoJDe0WxikB8XcVmD3k2MEZvB3dbYu8= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= github.com/ipfs/go-log v1.0.0/go.mod h1:JO7RzlMK6rA+CIxFMLOuB6Wf5b81GDiKElL7UPSIKjA= github.com/ipfs/go-log v1.0.1/go.mod h1:HuWlQttfN6FWNHRhlY5yMk/lW7evQC0HHGOxEwMRR8I= diff --git a/node/modules/chain.go b/node/modules/chain.go index 49418d88336..2be840266b7 100644 --- a/node/modules/chain.go +++ b/node/modules/chain.go @@ -4,9 +4,9 @@ import ( "context" "time" - "github.com/ipfs/go-bitswap" - "github.com/ipfs/go-bitswap/network" "github.com/ipfs/go-blockservice" + "github.com/ipfs/go-libipfs/bitswap" + "github.com/ipfs/go-libipfs/bitswap/network" "github.com/libp2p/go-libp2p/core/host" "github.com/libp2p/go-libp2p/core/routing" "go.uber.org/fx" From b334b2055f07adab6e7acc0b2a9f791dd58ad083 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 31 Jan 2023 11:56:55 +0100 Subject: [PATCH 064/282] fix: cli: add ArgsUsage fix: cli: add ArgsUsage --- cmd/lotus-miner/actor.go | 24 +++++++++++++++--------- cmd/lotus-miner/sectors.go | 15 ++++++++------- cmd/lotus-miner/storage.go | 26 ++++++++++++++++++-------- documentation/en/cli-lotus-miner.md | 6 +++--- 4 files changed, 44 insertions(+), 27 deletions(-) diff --git a/cmd/lotus-miner/actor.go b/cmd/lotus-miner/actor.go index 7b01fc85b60..bec2202b4cd 100644 --- a/cmd/lotus-miner/actor.go +++ b/cmd/lotus-miner/actor.go @@ -55,9 +55,10 @@ var actorCmd = &cli.Command{ } var actorSetAddrsCmd = &cli.Command{ - Name: "set-addresses", - Aliases: []string{"set-addrs"}, - Usage: "set addresses that your miner can be publicly dialed on", + Name: "set-addresses", + Aliases: []string{"set-addrs"}, + Usage: "set addresses that your miner can be publicly dialed on", + ArgsUsage: "", Flags: []cli.Flag{ &cli.StringFlag{ Name: "from", @@ -170,8 +171,9 @@ var actorSetAddrsCmd = &cli.Command{ } var actorSetPeeridCmd = &cli.Command{ - Name: "set-peer-id", - Usage: "set the peer id of your miner", + Name: "set-peer-id", + Usage: "set the peer id of your miner", + ArgsUsage: "", Flags: []cli.Flag{ &cli.Int64Flag{ Name: "gas-limit", @@ -194,6 +196,10 @@ var actorSetPeeridCmd = &cli.Command{ ctx := lcli.ReqContext(cctx) + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + pid, err := peer.Decode(cctx.Args().Get(0)) if err != nil { return fmt.Errorf("failed to parse input as a peerId: %w", err) @@ -720,15 +726,15 @@ var actorSetOwnerCmd = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { + if cctx.NArg() != 2 { + return lcli.IncorrectNumArgs(cctx) + } + if !cctx.Bool("really-do-it") { fmt.Println("Pass --really-do-it to actually execute this action") return nil } - if cctx.NArg() != 2 { - return lcli.IncorrectNumArgs(cctx) - } - api, acloser, err := lcli.GetFullNodeAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index cb9f5a1a8b0..1473262c42d 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -120,8 +120,8 @@ var sectorsStatusCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if !cctx.Args().Present() { - return fmt.Errorf("must specify sector number to get status of") + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) } id, err := strconv.ParseUint(cctx.Args().First(), 10, 64) @@ -1145,9 +1145,6 @@ var sectorsTerminateCmd = &cli.Command{ sectorsTerminatePendingCmd, }, Action: func(cctx *cli.Context) error { - if !cctx.Bool("really-do-it") { - return xerrors.Errorf("pass --really-do-it to confirm this action") - } minerApi, closer, err := lcli.GetStorageMinerAPI(cctx) if err != nil { return err @@ -1158,6 +1155,10 @@ var sectorsTerminateCmd = &cli.Command{ return lcli.IncorrectNumArgs(cctx) } + if !cctx.Bool("really-do-it") { + return xerrors.Errorf("pass --really-do-it to confirm this action") + } + id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) if err != nil { return xerrors.Errorf("could not parse sector number: %w", err) @@ -1490,8 +1491,8 @@ var sectorsUpdateCmd = &cli.Command{ } defer closer() ctx := lcli.ReqContext(cctx) - if cctx.NArg() < 2 { - return lcli.ShowHelp(cctx, xerrors.Errorf("must pass sector number and new state")) + if cctx.NArg() != 2 { + return lcli.IncorrectNumArgs(cctx) } id, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) diff --git a/cmd/lotus-miner/storage.go b/cmd/lotus-miner/storage.go index 5a910722375..a5aa354f8d4 100644 --- a/cmd/lotus-miner/storage.go +++ b/cmd/lotus-miner/storage.go @@ -55,8 +55,9 @@ stored while moving through the sealing pipeline (references as 'seal').`, } var storageAttachCmd = &cli.Command{ - Name: "attach", - Usage: "attach local storage path", + Name: "attach", + Usage: "attach local storage path", + ArgsUsage: "[path]", Description: `Storage can be attached to the miner using this command. The storage volume list is stored local to the miner in $LOTUS_MINER_PATH/storage.json. We do not recommend manually modifying this value without further understanding of the @@ -115,8 +116,8 @@ over time defer closer() ctx := lcli.ReqContext(cctx) - if !cctx.Args().Present() { - return xerrors.Errorf("must specify storage path to attach") + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) } p, err := homedir.Expand(cctx.Args().First()) @@ -192,8 +193,8 @@ var storageDetachCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) - if !cctx.Args().Present() { - return xerrors.Errorf("must specify storage path") + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) } p, err := homedir.Expand(cctx.Args().First()) @@ -210,8 +211,9 @@ var storageDetachCmd = &cli.Command{ } var storageRedeclareCmd = &cli.Command{ - Name: "redeclare", - Usage: "redeclare sectors in a local storage path", + Name: "redeclare", + Usage: "redeclare sectors in a local storage path", + ArgsUsage: "[path]", Flags: []cli.Flag{ &cli.StringFlag{ Name: "id", @@ -234,6 +236,10 @@ var storageRedeclareCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + if cctx.IsSet("id") && cctx.Bool("all") { return xerrors.Errorf("--id and --all can't be passed at the same time") } @@ -466,6 +472,10 @@ var storageFindCmd = &cli.Command{ defer closer() ctx := lcli.ReqContext(cctx) + if cctx.NArg() != 1 { + return lcli.IncorrectNumArgs(cctx) + } + ma, err := minerApi.ActorAddress(ctx) if err != nil { return err diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index c5887c5be67..4b8e42cc320 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -286,7 +286,7 @@ NAME: lotus-miner actor set-peer-id - set the peer id of your miner USAGE: - lotus-miner actor set-peer-id [command options] [arguments...] + lotus-miner actor set-peer-id [command options] OPTIONS: --gas-limit value set gas limit (default: 0) @@ -2273,7 +2273,7 @@ NAME: lotus-miner storage attach - attach local storage path USAGE: - lotus-miner storage attach [command options] [arguments...] + lotus-miner storage attach [command options] [path] DESCRIPTION: Storage can be attached to the miner using this command. The storage volume @@ -2326,7 +2326,7 @@ NAME: lotus-miner storage redeclare - redeclare sectors in a local storage path USAGE: - lotus-miner storage redeclare [command options] [arguments...] + lotus-miner storage redeclare [command options] [path] OPTIONS: --all redeclare all storage paths (default: false) From a8dace0f2382925fee8c5704d1ffabdd92dbe61d Mon Sep 17 00:00:00 2001 From: Richard Guan Date: Tue, 31 Jan 2023 21:40:55 +0900 Subject: [PATCH 065/282] make libp2p user agent overridable --- node/builder.go | 3 ++- node/modules/lp2p/host.go | 7 +++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/node/builder.go b/node/builder.go index eaf932e2e65..4c2608937ae 100644 --- a/node/builder.go +++ b/node/builder.go @@ -66,9 +66,10 @@ var ( ConnectionManagerKey = special{9} // Libp2p option AutoNATSvcKey = special{10} // Libp2p option BandwidthReporterKey = special{11} // Libp2p option - ConnGaterKey = special{12} // libp2p option + ConnGaterKey = special{12} // Libp2p option DAGStoreKey = special{13} // constructor returns multiple values ResourceManagerKey = special{14} // Libp2p option + UserAgentKey = special{15} // Libp2p option ) type invoke int diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 2d441eb3f29..79e9df534ea 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -114,3 +114,10 @@ func NilRouting(mctx helpers.MetricsCtx) (BaseIpfsRouting, error) { func RoutedHost(rh RawHost, r BaseIpfsRouting) host.Host { return routedhost.Wrap(rh, r) } + +func UserAgentOption(agent string) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, libp2p.UserAgent(agent)) + return + } +} From 45ceb5d297895ff0a75b4dae9de7f4d4c86c24d3 Mon Sep 17 00:00:00 2001 From: Richard Guan Date: Tue, 31 Jan 2023 21:46:24 +0900 Subject: [PATCH 066/282] move UserAgentOption upwards --- node/modules/lp2p/host.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/node/modules/lp2p/host.go b/node/modules/lp2p/host.go index 79e9df534ea..f529574f71e 100644 --- a/node/modules/lp2p/host.go +++ b/node/modules/lp2p/host.go @@ -69,6 +69,13 @@ func Host(mctx helpers.MetricsCtx, lc fx.Lifecycle, params P2PHostIn) (RawHost, return h, nil } +func UserAgentOption(agent string) func() (opts Libp2pOpts, err error) { + return func() (opts Libp2pOpts, err error) { + opts.Opts = append(opts.Opts, libp2p.UserAgent(agent)) + return + } +} + func MockHost(mn mocknet.Mocknet, id peer.ID, ps peerstore.Peerstore) (RawHost, error) { return mn.AddPeerWithPeerstore(id, ps) } @@ -114,10 +121,3 @@ func NilRouting(mctx helpers.MetricsCtx) (BaseIpfsRouting, error) { func RoutedHost(rh RawHost, r BaseIpfsRouting) host.Host { return routedhost.Wrap(rh, r) } - -func UserAgentOption(agent string) func() (opts Libp2pOpts, err error) { - return func() (opts Libp2pOpts, err error) { - opts.Opts = append(opts.Opts, libp2p.UserAgent(agent)) - return - } -} From 37d41f3f8325835a4bfa26ba42ee5b015fbcbb48 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:20:20 +0100 Subject: [PATCH 067/282] Fix: typo Fix: typo --- documentation/en/about.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/en/about.md b/documentation/en/about.md index de2bb4c377f..210f920b7ed 100644 --- a/documentation/en/about.md +++ b/documentation/en/about.md @@ -5,7 +5,7 @@ Lotus is an implementation of the **Filecoin Distributed Storage Network**. It is written in Go and provides a suite of command-line applications: - Lotus Node (`lotus`): a Filecoin Node: validates network transactions, manages a FIL wallet, can perform storage and retrieval deals. -- Lotus Miner (`lotus-miner`): a Filecoin miner. See the the respective Lotus Miner section in the Mine documentation. +- Lotus Miner (`lotus-miner`): a Filecoin miner. See the respective Lotus Miner section in the Mine documentation. - Lotus Worker (`lotus-worker`): a worker that assists miners to perform mining-related tasks. See its respective guide for more information. The [Lotus user documentation](https://lotus.filecoin.io/lotus/get-started/what-is-lotus/) is part of the [Filecoin documentation site](https://lotus.filecoin.io): From fa97016573189a72745aacd4425cf78c91d1113e Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:23:42 +0100 Subject: [PATCH 068/282] Fix: typos Fix: typos --- documentation/en/WIP-arch-complementary-notes.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/documentation/en/WIP-arch-complementary-notes.md b/documentation/en/WIP-arch-complementary-notes.md index 013a7bbac8e..85403cbc14f 100644 --- a/documentation/en/WIP-arch-complementary-notes.md +++ b/documentation/en/WIP-arch-complementary-notes.md @@ -1,14 +1,14 @@ # Genesis block -Seems a good way to start exploring the VM state though the instantiation of its different actors like the storage power. +Seems a good way to start exploring the VM state through the instantiation of its different actors like the storage power. -Explain where do we load the genesis block, the CAR entries, and we set the root of the state. Follow the daemon command option, `chain.LoadGenesis()` saves all the blocks of the CAR file into the store provided by `ChainBlockstore` (this should already be explained in the previous section). The CAR root (MT root?) of those blocks is decoded into the `BlockHeader` that will be the Filecoin (genesis) block of the chain, but most of the information was stored in the raw data (non-Filecoin, what's the correct term?) blocks forwarded directly to the chain, the block header just has a pointer to it. +Explain where we load the genesis block, the CAR entries, and we set the root of the state. Follow the daemon command option, `chain.LoadGenesis()` saves all the blocks of the CAR file into the store provided by `ChainBlockstore` (this should already be explained in the previous section). The CAR root (MT root?) of those blocks is decoded into the `BlockHeader` that will be the Filecoin (genesis) block of the chain, but most of the information was stored in the raw data (non-Filecoin, what's the correct term?) blocks forwarded directly to the chain, the block header just has a pointer to it. `SetGenesis` block with name 0. `(ChainStore).SetGenesis()` stores it there. `MakeInitialStateTree` (`chain/gen/genesis/genesis.go`, used to construct the genesis block (`MakeGenesisBlock()`), constructs the state tree (`NewStateTree`) which is just a "pointer" (root node in the HAMT) to the different actors. It will be continuously used in `(*StateTree).SetActor()` an `types.Actor` structure under a certain `Address` (in the HAMT). (How does the `stateSnaps` work? It has no comments.) -From this point we can follow different setup function like: +From this point we can follow different setup functions like: * `SetupInitActor()`: see the `AddressMap`. @@ -40,7 +40,7 @@ List what are the main directories we should be looking at (e.g., `chain/`) and # Tests -Run a few messages and observe state changes. What is the easiest test that also let's us "interact" with it (modify something and observe the difference). +Run a few messages and observe state changes. What is the easiest test that also lets us "interact" with it (modify something and observe the difference). ### Filecoin blocks vs IPFS blocks @@ -84,7 +84,7 @@ func (b *BlockHeader) ToStorageBlock() (block.Block, error) { These edited extracts from the `BlockHeader` show how it's treated as an IPFS block, `github.com/ipfs/go-block-format.block.BasicBlock`, to be both stored and referenced by its block storage CID. -This duality permeates the code (and the Filecoin spec for that matter) but it is usually clear within the context to which block we are referring to. Normally the unqualified *block* is reserved for the Filecoin block and we won't usually refer to the IPFS one but only implicitly through the concept of its CID. With enough understanding of both stack's architecture the two definitions can coexist without much confusion as we will abstract away the IPFS layer and just use the CID as an identifier that we now its unique for two sequences of different *raw* byte strings. +This duality permeates the code (and the Filecoin spec for that matter) but it is usually clear within the context to which block we are referring to. Normally the unqualified *block* is reserved for the Filecoin block and we won't usually refer to the IPFS one but only implicitly through the concept of its CID. With enough understanding of both stack's architecture the two definitions can coexist without much confusion as we will abstract away the IPFS layer and just use the CID as an identifier that we know is unique for two sequences of different *raw* byte strings. (FIXME: We use to do this presentation when talking about `gossipsub` topics and incoming blocks, and had to deal with, besides the block ambiguity, a similar confusion with the *message* term, used in libp2p to name anything that comes through the network, needing to present the extremely confusing hierarchy of a libp2p message containing a Filecoin block, identified by a IPFS block CID, containing Filecoin messages.) @@ -150,4 +150,4 @@ Because we rely heavily on reflection for this part of the code the call chain i This means that when we are tracking the logic of a CLI command we will eventually find this bifurcation and need to study the code of the server-side implementation in `node/impl/full` (mostly in the `common/` and `full/` directories). If we understand this architecture going directly to that part of the code abstracts away the JSON-RPC client/server logic and we can think that the CLI is actually running the node's logic. -FIXME: Explain that "*the* node" is actually an API structure like `impl.FullNodeAPI` with the different API subcomponents like `full.SyncAPI`. We won't see a *single* node structure, each API (full node, minder, etc) will gather the necessary subcomponents it needs to service its calls. \ No newline at end of file +FIXME: Explain that "*the* node" is actually an API structure like `impl.FullNodeAPI` with the different API subcomponents like `full.SyncAPI`. We won't see a *single* node structure, each API (full node, minder, etc) will gather the necessary subcomponents it needs to service its calls. From 0c17d78356dcf9e8259d153b7ffd51080cde9c05 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:25:26 +0100 Subject: [PATCH 069/282] Fix: typo Fix: typo --- documentation/en/block-validation.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/en/block-validation.md b/documentation/en/block-validation.md index ccd83a90457..d178a0667d5 100644 --- a/documentation/en/block-validation.md +++ b/documentation/en/block-validation.md @@ -34,7 +34,7 @@ Assemble a `FullTipSet` populated with the single block received earlier. `(*Syncer).collectHeaders()`: we retrieve all tipsets from the received block down to our chain. Validation now is expanded to *every* block inside these tipsets. -`V`: Beacon entires are ordered by their round number. +`V`: Beacon entries are ordered by their round number. `V:` Tipset `Parents` CIDs match the fetched parent tipset through block sync. (This check is not enforced correctly at the moment, see [issue](https://github.com/filecoin-project/lotus/issues/1918).) From 05c5e18899a91043e597494c866fd25d356cca94 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:27:40 +0100 Subject: [PATCH 070/282] Fix: typo Fix: typo --- documentation/en/create-miner.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/en/create-miner.md b/documentation/en/create-miner.md index 7b3b8176548..254d70f8618 100644 --- a/documentation/en/create-miner.md +++ b/documentation/en/create-miner.md @@ -2,7 +2,7 @@ This document explains the code flow of the [storage miner](https://filecoin-project.github.io/specs/#systems__filecoin_mining) creation process. It describes the flow on two dimensions: at the network level, from the local node to the rest of the Filecoin network, and at the VM level, from the CLI commands to the new chain state. It assumes the reader is already familiar with the general Lotus [architecture](architecture-2.md), relying especially on the descriptions of the CLI/API interface and the VM chain state. -Note we are not following the [Storage Mining](https://lotu.sh/en+mining) user documentation where the miner is created along with the owner through the faucet, but we do those in separate stages try to exercise what will be the closest code path to Mainnet, using the `createStorageMiner()` call in the CLI (when `--actor` is not provided). +Note we are not following the [Storage Mining](https://lotu.sh/en+mining) user documentation where the miner is created along with the owner through the faucet, but we do those in separate stages to try to exercise what will be the closest code path to Mainnet, using the `createStorageMiner()` call in the CLI (when `--actor` is not provided). FIXME: Check that all the information it assumes throughout this document is actually present in the main architecture doc. From ed63798082aa7b082d011f498ed7f0739301d495 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:28:24 +0100 Subject: [PATCH 071/282] Fix: typo Fix: typo --- documentation/en/dev-tools-pond-ui.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/en/dev-tools-pond-ui.md b/documentation/en/dev-tools-pond-ui.md index 7d110890be3..f20dad44a2a 100644 --- a/documentation/en/dev-tools-pond-ui.md +++ b/documentation/en/dev-tools-pond-ui.md @@ -19,7 +19,7 @@ Now go to `http://127.0.0.1:2222`. ## What can I test? - The `Spawn Node` button starts a new **Lotus Node** in a new draggable window. -- Click `[Spawn Miner]` to start a **Lotus Miner**. This require's the node's wallet to have funds. +- Click `[Spawn Miner]` to start a **Lotus Miner**. This requires the node's wallet to have funds. - Click on `[Client]` to open the **Lotus Node**'s client interface and propose a deal with an existing Miner. If successful you'll see a payment channel open up with that Miner. Don't leave Pond unattended for more than 10 hours, the web client will eventually consume all available RAM. From 7d5c7f5fec444200e3ec648926b76ed60e296584 Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:30:09 +0100 Subject: [PATCH 072/282] Fix: typos Fix: typos --- documentation/en/jaeger-tracing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/en/jaeger-tracing.md b/documentation/en/jaeger-tracing.md index ec9351d5322..2c0cf566b7f 100644 --- a/documentation/en/jaeger-tracing.md +++ b/documentation/en/jaeger-tracing.md @@ -19,7 +19,7 @@ export LOTUS_JAEGER_AGENT_ENDPOINT=127.0.0.1:6831 lotus daemon ``` -Alternatively, the agent endpoint can also be configured by a pair of environemnt variables to provide the host and port. The following snipit is functionally equivilent to the previous. +Alternatively, the agent endpoint can also be configured by a pair of environment variables to provide the host and port. The following snippet is functionally equivalent to the previous. ```bash export LOTUS_JAEGER_AGENT_HOST=127.0.0.1 From 28101be1b788390a5a8a04726cd9a06ef510b6aa Mon Sep 17 00:00:00 2001 From: omahs <73983677+omahs@users.noreply.github.com> Date: Tue, 31 Jan 2023 23:33:11 +0100 Subject: [PATCH 073/282] Fix: typos Fix: typos --- documentation/en/architecture/architecture.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/en/architecture/architecture.md b/documentation/en/architecture/architecture.md index 64914d53996..9e78fa65064 100644 --- a/documentation/en/architecture/architecture.md +++ b/documentation/en/architecture/architecture.md @@ -81,7 +81,7 @@ Note: The API refers to these stages as `StageHeaders` and `StagePersistHeaders` We proceed in the sync process by requesting block headers from the peer, moving back from their head, until we reach a tipset that we have in common -(such a common tipset must exist, thought it may simply be the genesis block). +(such a common tipset must exist, though it may simply be the genesis block). The functionality can be found in `Syncer::collectHeaders()`. If the common tipset is our head, we treat the sync as a "fast-forward", else we must @@ -126,7 +126,7 @@ If all validations pass we will now set that head as our heaviest tipset in We already have the full state, since we calculated it during the sync process. -FIXME (aayush) I don't fuilly understand the next 2 paragraphs, but it seems important. Confirm and polish. +FIXME (aayush) I don't fully understand the next 2 paragraphs, but it seems important. Confirm and polish. Relevant issue in IPFS: https://github.com/ipfs/ipfs-docs/issues/264 It is important to note at this point that similar to the IPFS architecture of addressing by content and not by location/address (FIXME: check and link to IPFS docs) the "actual" chain stored in the node repo is *relative* to which CID we look for. We always have stored a series of Filecoin blocks pointing to other blocks, each a potential chain in itself by following its parent's reference, and its parent's parent, and so on up to the genesis block. (FIXME: We need a diagram here, one of the Filecoin blog entries might have something similar to what we are describing here.) It only depends on *where* (location) do we start to look for. The *only* address/location reference we hold of the chain, a relative reference, is the `heaviest` pointer. This is reflected by the fact that we don't store it in the `Blockstore` by a fixed, *absolute*, CID that reflects its contents, as this will change each time we sync to a new head (FIXME: link to the immutability IPFS doc that I need to write). @@ -149,7 +149,7 @@ encapsulated in the [`StateTree`](https://github.com/filecoin-project/lotus/blob and accessed through the [`StateManager`](https://github.com/filecoin-project/lotus/blob/master/chain/stmgr/stmgr.go). The state at the chain's head is thus easily tracked and updated in a state root CID. -(FIXME: Talk about CIDs somewhere, we might want to explain some of the modify/flush/update-root mechanism here.)) +(FIXME: Talk about CIDs somewhere, we might want to explain some of the modify/flush/update-root mechanism here.) ## Calculating a Tipset State From 0a35e9659b7a4c7f5ed7402bdea6d6b7e3f328d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 1 Feb 2023 17:51:12 +0100 Subject: [PATCH 074/282] feat: shed: Add a tool to read data from sectors --- cmd/lotus-shed/sectors.go | 140 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 140 insertions(+) diff --git a/cmd/lotus-shed/sectors.go b/cmd/lotus-shed/sectors.go index 52d07f5b69f..ee2f58c6bb4 100644 --- a/cmd/lotus-shed/sectors.go +++ b/cmd/lotus-shed/sectors.go @@ -18,6 +18,7 @@ import ( "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" "golang.org/x/xerrors" + "gopkg.in/cheggaaa/pb.v1" "github.com/filecoin-project/go-address" "github.com/filecoin-project/go-bitfield" @@ -31,6 +32,11 @@ import ( "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/parmap" + "github.com/filecoin-project/lotus/node/repo" + "github.com/filecoin-project/lotus/storage/paths" + "github.com/filecoin-project/lotus/storage/sealer/fr32" + "github.com/filecoin-project/lotus/storage/sealer/fsutil" + "github.com/filecoin-project/lotus/storage/sealer/storiface" ) var sectorsCmd = &cli.Command{ @@ -42,6 +48,7 @@ var sectorsCmd = &cli.Command{ terminateSectorPenaltyEstimationCmd, visAllocatedSectorsCmd, dumpRLESectorCmd, + sectorReadCmd, }, } @@ -563,3 +570,136 @@ func rleToPng(rleBytes []byte) ([]byte, error) { return buf.Bytes(), nil } + +var sectorReadCmd = &cli.Command{ + Name: "read", + Usage: "read data from a sector into stdout", + ArgsUsage: "[sector num] [padded length] [padded offset]", + Description: `Read data from a sector. + +TIP: to get sectornum/len/offset for a piece you can use 'boostd pieces piece-info [cid]' + +fr32 padding is removed from the output.`, + Action: func(cctx *cli.Context) error { + if cctx.NArg() != 3 { + return xerrors.Errorf("must pass sectornum/len/offset") + } + + sectorNum, err := strconv.ParseUint(cctx.Args().Get(0), 10, 64) + if err != nil { + return xerrors.Errorf("parsing sector number: %w", err) + } + + length, err := strconv.ParseUint(cctx.Args().Get(1), 10, 64) + if err != nil { + return xerrors.Errorf("parsing length: %w", err) + } + + offset, err := strconv.ParseUint(cctx.Args().Get(2), 10, 64) + if err != nil { + return xerrors.Errorf("parsing offset: %w", err) + } + + ctx := lcli.ReqContext(cctx) + api, closer, err := lcli.GetStorageMinerAPI(cctx) + if err != nil { + return err + } + + maddr, err := api.ActorAddress(ctx) + if err != nil { + return xerrors.Errorf("getting miner actor address: %w", err) + } + + mid, err := address.IDFromAddress(maddr) + if err != nil { + return xerrors.Errorf("getting miner id: %w", err) + } + + sid := abi.SectorID{ + Miner: abi.ActorID(mid), + Number: abi.SectorNumber(sectorNum), + } + + si, err := api.SectorsStatus(ctx, sid.Number, false) + if err != nil { + return xerrors.Errorf("getting sector status: %w", err) + } + + sref := storiface.SectorRef{ + ID: sid, + ProofType: si.SealProof, + } + + defer closer() + + // Setup remote sector store + sminfo, err := lcli.GetAPIInfo(cctx, repo.StorageMiner) + if err != nil { + return xerrors.Errorf("could not get api info: %w", err) + } + + localStore, err := paths.NewLocal(ctx, &emptyLocalStorage{}, api, []string{}) + if err != nil { + return err + } + + remote := paths.NewRemote(localStore, api, sminfo.AuthHeader(), 10, + &paths.DefaultPartialFileHandler{}) + + readStarter, err := remote.Reader(ctx, sref, abi.PaddedPieceSize(offset), abi.PaddedPieceSize(length)) + if err != nil { + return xerrors.Errorf("getting reader: %w", err) + } + + rd, err := readStarter(0) + if err != nil { + return xerrors.Errorf("starting reader: %w", err) + } + + upr, err := fr32.NewUnpadReaderBuf(rd, abi.PaddedPieceSize(length), make([]byte, 1<<20)) + if err != nil { + return xerrors.Errorf("creating unpadded reader: %w", err) + } + + l := int64(abi.PaddedPieceSize(length).Unpadded()) + + bar := pb.New64(l) + br := bar.NewProxyReader(upr) + bar.ShowTimeLeft = true + bar.ShowPercent = true + bar.ShowSpeed = true + bar.Units = pb.U_BYTES + bar.Output = os.Stderr + bar.Start() + + _, err = io.CopyN(os.Stdout, br, l) + if err != nil { + return xerrors.Errorf("reading data: %w", err) + } + + return nil + }, +} + +type emptyLocalStorage struct { +} + +func (e *emptyLocalStorage) GetStorage() (storiface.StorageConfig, error) { + return storiface.StorageConfig{}, nil +} + +func (e *emptyLocalStorage) SetStorage(f func(*storiface.StorageConfig)) error { + panic("don't call") +} + +func (e *emptyLocalStorage) Stat(path string) (fsutil.FsStat, error) { + //TODO implement me + panic("don't call") +} + +func (e *emptyLocalStorage) DiskUsage(path string) (int64, error) { + panic("don't call") +} + +var _ paths.LocalStorage = &emptyLocalStorage{} From 818b3b8dafc275ef90c9ce1d379f56a60cde7ded Mon Sep 17 00:00:00 2001 From: Peter Rabbitson Date: Wed, 1 Feb 2023 20:04:58 +0100 Subject: [PATCH 075/282] fix: extend LOTUS_CHAIN_BADGERSTORE_DISABLE_FSYNC to the markset Without doing this walking a badger markset on a non-nvme knocks the node hopelessly out of sync during a compaction. --- blockstore/splitstore/markset_badger.go | 4 +++- node/repo/fsrepo.go | 16 +++------------- system/io.go | 25 +++++++++++++++++++++++++ 3 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 system/io.go diff --git a/blockstore/splitstore/markset_badger.go b/blockstore/splitstore/markset_badger.go index e98046862f0..8808a621709 100644 --- a/blockstore/splitstore/markset_badger.go +++ b/blockstore/splitstore/markset_badger.go @@ -11,6 +11,8 @@ import ( "github.com/ipfs/go-cid" "go.uber.org/zap" "golang.org/x/xerrors" + + "github.com/filecoin-project/lotus/system" ) type BadgerMarkSetEnv struct { @@ -349,7 +351,7 @@ func (s *BadgerMarkSet) write(seqno int) (err error) { persist := s.persist s.mx.RUnlock() - if persist { + if persist && !system.BadgerFsyncDisable { return s.db.Sync() } diff --git a/node/repo/fsrepo.go b/node/repo/fsrepo.go index bd387babf82..3012daaca76 100644 --- a/node/repo/fsrepo.go +++ b/node/repo/fsrepo.go @@ -27,6 +27,7 @@ import ( "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/storage/sealer/fsutil" "github.com/filecoin-project/lotus/storage/sealer/storiface" + "github.com/filecoin-project/lotus/system" ) const ( @@ -479,19 +480,8 @@ func (fsr *fsLockedRepo) Blockstore(ctx context.Context, domain BlockstoreDomain return } - // - // Tri-state environment variable LOTUS_CHAIN_BADGERSTORE_DISABLE_FSYNC - // - unset == the default (currently fsync enabled) - // - set with a false-y value == fsync enabled no matter what a future default is - // - set with any other value == fsync is disabled ignored defaults (recommended for day-to-day use) - // - if nosyncBs, nosyncBsSet := os.LookupEnv("LOTUS_CHAIN_BADGERSTORE_DISABLE_FSYNC"); nosyncBsSet { - nosyncBs = strings.ToLower(nosyncBs) - if nosyncBs == "" || nosyncBs == "0" || nosyncBs == "false" || nosyncBs == "no" { - opts.SyncWrites = true - } else { - opts.SyncWrites = false - } + if system.BadgerFsyncDisable { + opts.SyncWrites = false } bs, err := badgerbs.Open(opts) diff --git a/system/io.go b/system/io.go new file mode 100644 index 00000000000..5a8306df172 --- /dev/null +++ b/system/io.go @@ -0,0 +1,25 @@ +package system + +import ( + "os" + "strings" +) + +var BadgerFsyncDisable bool + +func init() { + // + // Tri-state environment variable LOTUS_CHAIN_BADGERSTORE_DISABLE_FSYNC + // - unset == the default (currently fsync enabled) + // - set with a false-y value == fsync enabled no matter what a future default is + // - set with any other value == fsync is disabled ignored defaults (recommended for day-to-day use) + // + if nosyncBs, nosyncBsSet := os.LookupEnv("LOTUS_CHAIN_BADGERSTORE_DISABLE_FSYNC"); nosyncBsSet { + nosyncBs = strings.ToLower(nosyncBs) + if nosyncBs == "" || nosyncBs == "0" || nosyncBs == "false" || nosyncBs == "no" { + BadgerFsyncDisable = false + } else { + BadgerFsyncDisable = true + } + } +} From e1c00bdbba30b19c6011657f889377fc9b397fca Mon Sep 17 00:00:00 2001 From: 0x5459 <0x5459@protonmail.com> Date: Fri, 3 Feb 2023 14:56:54 +0800 Subject: [PATCH 076/282] cli: fix extend cmd to get the right sector number --- cmd/lotus-miner/sectors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 1473262c42d..8999c457842 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -761,7 +761,7 @@ func getSectorsFromFile(filePath string) ([]abi.SectorNumber, error) { func SectorNumsToBitfield(sectors []abi.SectorNumber) bitfield.BitField { var numbers []uint64 - for sector := range sectors { + for _, sector := range sectors { numbers = append(numbers, uint64(sector)) } From 6a268cfb635fe1c4964d76a3b7ff747e74c56474 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 6 Feb 2023 17:53:00 -0500 Subject: [PATCH 077/282] chain: explicitly check that gasLimit is above zero --- chain/types/message.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/chain/types/message.go b/chain/types/message.go index a25cd05b6f4..becd2c010f7 100644 --- a/chain/types/message.go +++ b/chain/types/message.go @@ -207,6 +207,10 @@ func (m *Message) ValidForBlockInclusion(minGas int64, version network.Version) return xerrors.Errorf("'GasLimit' field cannot be greater than a block's gas limit (%d > %d)", m.GasLimit, build.BlockGasLimit) } + if m.GasLimit <= 0 { + return xerrors.Errorf("'GasLimit' field %d must be positive", m.GasLimit) + } + // since prices might vary with time, this is technically semantic validation if m.GasLimit < minGas { return xerrors.Errorf("'GasLimit' field cannot be less than the cost of storing a message on chain %d < %d", m.GasLimit, minGas) From cf0997b434efbbbaffc5c149aedd243571cfa1c4 Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 7 Feb 2023 16:12:31 +0100 Subject: [PATCH 078/282] fix: worker: add all task type flag Add all flag for the `lotus-worker tasks enable/disable` cmd --- cmd/lotus-worker/tasks.go | 51 ++++++++++++++++++++++++++++++--------- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/cmd/lotus-worker/tasks.go b/cmd/lotus-worker/tasks.go index 7b446207318..af9a9af70be 100644 --- a/cmd/lotus-worker/tasks.go +++ b/cmd/lotus-worker/tasks.go @@ -45,32 +45,52 @@ var tasksEnableCmd = &cli.Command{ Name: "enable", Usage: "Enable a task type", ArgsUsage: "[" + settableStr + "]", - Action: taskAction(api.Worker.TaskEnable), + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "all", + Usage: "Enable all task types", + }, + }, + Action: taskAction(api.Worker.TaskEnable), } var tasksDisableCmd = &cli.Command{ Name: "disable", Usage: "Disable a task type", ArgsUsage: "[" + settableStr + "]", - Action: taskAction(api.Worker.TaskDisable), + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "all", + Usage: "Disable all task types", + }, + }, + Action: taskAction(api.Worker.TaskDisable), } func taskAction(tf func(a api.Worker, ctx context.Context, tt sealtasks.TaskType) error) func(cctx *cli.Context) error { return func(cctx *cli.Context) error { - if cctx.NArg() != 1 { - return xerrors.Errorf("expected 1 argument") + allFlag := cctx.Bool("all") + + if cctx.NArg() == 1 && allFlag { + return xerrors.Errorf("Cannot use --all flag with task type argument") + } + + if cctx.NArg() == 0 && !allFlag { + return xerrors.Errorf("Expected 1 argument or use --all flag") } var tt sealtasks.TaskType - for taskType := range allowSetting { - if taskType.Short() == cctx.Args().First() { - tt = taskType - break + if cctx.NArg() == 1 { + for taskType := range allowSetting { + if taskType.Short() == cctx.Args().First() { + tt = taskType + break + } } - } - if tt == "" { - return xerrors.Errorf("unknown task type '%s'", cctx.Args().First()) + if tt == "" { + return xerrors.Errorf("unknown task type '%s'", cctx.Args().First()) + } } api, closer, err := lcli.GetWorkerAPI(cctx) @@ -81,6 +101,15 @@ func taskAction(tf func(a api.Worker, ctx context.Context, tt sealtasks.TaskType ctx := lcli.ReqContext(cctx) + if allFlag { + for taskType := range allowSetting { + if err := tf(api, ctx, taskType); err != nil { + return err + } + } + return nil + } + return tf(api, ctx, tt) } } From 58c7c514c6bf70505241b6bdfbe8ac72547f1b7b Mon Sep 17 00:00:00 2001 From: Phi-rjan Date: Tue, 7 Feb 2023 16:47:16 +0100 Subject: [PATCH 079/282] Update cmd/lotus-worker/tasks.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cmd/lotus-worker/tasks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-worker/tasks.go b/cmd/lotus-worker/tasks.go index af9a9af70be..3c4c04629d0 100644 --- a/cmd/lotus-worker/tasks.go +++ b/cmd/lotus-worker/tasks.go @@ -44,7 +44,7 @@ var settableStr = func() string { var tasksEnableCmd = &cli.Command{ Name: "enable", Usage: "Enable a task type", - ArgsUsage: "[" + settableStr + "]", + ArgsUsage: "--all | [" + settableStr + "]", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "all", From 3fc1346d5b12e85f2366df0f9521a4db88573ae4 Mon Sep 17 00:00:00 2001 From: Phi-rjan Date: Tue, 7 Feb 2023 16:47:23 +0100 Subject: [PATCH 080/282] Update cmd/lotus-worker/tasks.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cmd/lotus-worker/tasks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-worker/tasks.go b/cmd/lotus-worker/tasks.go index 3c4c04629d0..aee0599890d 100644 --- a/cmd/lotus-worker/tasks.go +++ b/cmd/lotus-worker/tasks.go @@ -57,7 +57,7 @@ var tasksEnableCmd = &cli.Command{ var tasksDisableCmd = &cli.Command{ Name: "disable", Usage: "Disable a task type", - ArgsUsage: "[" + settableStr + "]", + ArgsUsage: "--all | [" + settableStr + "]", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "all", From 21d60201792cb3176741ef174a4a6878a26c0670 Mon Sep 17 00:00:00 2001 From: Phi-rjan Date: Tue, 7 Feb 2023 16:47:30 +0100 Subject: [PATCH 081/282] Update cmd/lotus-worker/tasks.go MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Łukasz Magiera --- cmd/lotus-worker/tasks.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-worker/tasks.go b/cmd/lotus-worker/tasks.go index aee0599890d..73ca5eb0a01 100644 --- a/cmd/lotus-worker/tasks.go +++ b/cmd/lotus-worker/tasks.go @@ -75,7 +75,7 @@ func taskAction(tf func(a api.Worker, ctx context.Context, tt sealtasks.TaskType return xerrors.Errorf("Cannot use --all flag with task type argument") } - if cctx.NArg() == 0 && !allFlag { + if cctx.NArg() != 1 && !allFlag { return xerrors.Errorf("Expected 1 argument or use --all flag") } From d75f77b4c572fdcbd35654ea79cca0cd76d0607e Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 7 Feb 2023 17:12:42 +0100 Subject: [PATCH 082/282] make docsgen-cli make docsgen-cli --- documentation/en/cli-lotus-worker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index cfc4938bce6..84355c404f2 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -221,7 +221,7 @@ USAGE: lotus-worker tasks enable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] OPTIONS: - --help, -h show help (default: false) + --all Enable all task types (default: false) ``` @@ -234,6 +234,6 @@ USAGE: lotus-worker tasks disable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] OPTIONS: - --help, -h show help (default: false) + --all Disable all task types (default: false) ``` From 48233221541c11cdc53d3ae4c0747fbaf8c3100f Mon Sep 17 00:00:00 2001 From: Phi Date: Tue, 7 Feb 2023 17:44:54 +0100 Subject: [PATCH 083/282] retry make docsgen-cli retry make docsgen-cli with the new usage --- documentation/en/cli-lotus-worker.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 84355c404f2..426d64d6ca8 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -218,7 +218,7 @@ NAME: lotus-worker tasks enable - Enable a task type USAGE: - lotus-worker tasks enable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] + lotus-worker tasks enable [command options] --all | [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] OPTIONS: --all Enable all task types (default: false) @@ -231,7 +231,7 @@ NAME: lotus-worker tasks disable - Disable a task type USAGE: - lotus-worker tasks disable [command options] [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] + lotus-worker tasks disable [command options] --all | [UNS|C2|PC2|PC1|PR2|RU|AP|DC|GSK] OPTIONS: --all Disable all task types (default: false) From 662fc3797648f6efe3fb5e6b8d43ebaa6375d557 Mon Sep 17 00:00:00 2001 From: Phi Date: Wed, 8 Feb 2023 09:34:44 +0100 Subject: [PATCH 084/282] Option to set-seal-delay seconds Add the option to set-seal-delay in seconds --- cmd/lotus-miner/sectors.go | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/cmd/lotus-miner/sectors.go b/cmd/lotus-miner/sectors.go index 8999c457842..da07901f79f 100644 --- a/cmd/lotus-miner/sectors.go +++ b/cmd/lotus-miner/sectors.go @@ -1379,8 +1379,14 @@ var sectorsStartSealCmd = &cli.Command{ var sectorsSealDelayCmd = &cli.Command{ Name: "set-seal-delay", - Usage: "Set the time, in minutes, that a new sector waits for deals before sealing starts", - ArgsUsage: "", + Usage: "Set the time (in minutes) that a new sector waits for deals before sealing starts", + ArgsUsage: "