From 1631c6ac8d7a7089c9aea08e83529cb2506f7545 Mon Sep 17 00:00:00 2001 From: Aayush Date: Thu, 2 Mar 2023 11:30:27 -0500 Subject: [PATCH 01/27] fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct --- node/impl/full/eth.go | 73 +++++++++++++++++++++++++++++-------------- 1 file changed, 49 insertions(+), 24 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index b1d03db4b..0bdf8c140 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1776,6 +1776,8 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, err } + bn := ethtypes.EthUint64(ts.Height()) + blkCid, err := ts.Key().Cid() if err != nil { return ethtypes.EthBlock{}, err @@ -1792,20 +1794,35 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx block := ethtypes.NewEthBlock(len(msgs) > 0) - // this seems to be a very expensive way to get gasUsed of the block. may need to find an efficient way to do it gasUsed := int64(0) - for txIdx, msg := range msgs { - msgLookup, err := sa.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) - if err != nil || msgLookup == nil { - return ethtypes.EthBlock{}, nil - } - gasUsed += msgLookup.Receipt.GasUsed + compOutput, err := sa.StateCompute(ctx, ts.Height(), nil, ts.Key()) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) + } - tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, cs, sa) - if err != nil { - return ethtypes.EthBlock{}, nil + for txIdx, msg := range compOutput.Trace { + // skip system messages like reward application and cron + if msg.Msg.From == builtintypes.SystemActorAddr { + continue } + gasUsed += msg.MsgRct.GasUsed + smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + } + tx, err := newEthTxFromSignedMessage(ctx, smsgCid, sa) + if err != nil { + return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) + } + + ti := ethtypes.EthUint64(txIdx) + + tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) + tx.BlockHash = &blkHash + tx.BlockNumber = &bn + tx.TransactionIndex = &ti + if fullTxInfo { block.Transactions = append(block.Transactions, tx) } else { @@ -1814,7 +1831,7 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx } block.Hash = blkHash - block.Number = ethtypes.EthUint64(ts.Height()) + block.Number = bn block.ParentHash = parentBlkHash block.Timestamp = ethtypes.EthUint64(ts.Blocks()[0].Timestamp) block.BaseFeePerGas = ethtypes.EthBigInt{Int: ts.Blocks()[0].ParentBaseFee.Int} @@ -1995,20 +2012,9 @@ func newEthTxFromMessageLookup(ctx context.Context, msgLookup *api.MsgLookup, tx return ethtypes.EthTx{}, err } - smsg, err := cs.GetSignedMessage(ctx, msgLookup.Message) + smsg, err := getSignedMessage(ctx, cs, msgLookup.Message) if err != nil { - // We couldn't find the signed message, it might be a BLS message, so search for a regular message. - msg, err := cs.GetMessage(ctx, msgLookup.Message) - if err != nil { - return ethtypes.EthTx{}, err - } - smsg = &types.SignedMessage{ - Message: *msg, - Signature: crypto.Signature{ - Type: crypto.SigTypeBLS, - Data: nil, - }, - } + return ethtypes.EthTx{}, xerrors.Errorf("failed to get signed msg: %w", err) } tx, err := newEthTxFromSignedMessage(ctx, smsg, sa) @@ -2364,6 +2370,25 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew return rewards, totalGasUsed } +func getSignedMessage(ctx context.Context, cs *store.ChainStore, msgCid cid.Cid) (*types.SignedMessage, error) { + smsg, err := cs.GetSignedMessage(ctx, msgCid) + if err != nil { + // We couldn't find the signed message, it might be a BLS message, so search for a regular message. + msg, err := cs.GetMessage(ctx, msgCid) + if err != nil { + return nil, xerrors.Errorf("failed to find msg %s: %w", msgCid, err) + } + smsg = &types.SignedMessage{ + Message: *msg, + Signature: crypto.Signature{ + Type: crypto.SigTypeBLS, + }, + } + } + + return smsg, nil +} + type gasRewardTuple struct { gas uint64 reward ethtypes.EthBigInt From a59e1d5220898eaff8ccf17137f7ea77525ce689 Mon Sep 17 00:00:00 2001 From: Aayush Date: Fri, 3 Mar 2023 16:42:57 -0500 Subject: [PATCH 02/27] fix: EthAPI: Correctly get parent hash --- itests/eth_api_test.go | 22 ++++++++++++++++++++++ node/impl/full/eth.go | 6 +----- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/itests/eth_api_test.go b/itests/eth_api_test.go index 32949cc71..c24b32416 100644 --- a/itests/eth_api_test.go +++ b/itests/eth_api_test.go @@ -87,3 +87,25 @@ func TestFilecoinAddressToEthAddress(t *testing.T) { require.ErrorContains(t, err, ethtypes.ErrInvalidAddress.Error()) } + +func TestEthGetGenesis(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + ethBlk, err := client.EVM().EthGetBlockByNumber(ctx, "0x0", true) + require.NoError(t, err) + + genesis, err := client.ChainGetGenesis(ctx) + require.NoError(t, err) + + genesisCid, err := genesis.Key().Cid() + require.NoError(t, err) + + genesisHash, err := ethtypes.EthHashFromCid(genesisCid) + require.NoError(t, err) + require.Equal(t, ethBlk.Hash, genesisHash) +} diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 0bdf8c140..907adf8cd 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1763,11 +1763,7 @@ func (e *ethSubscription) stop() { } func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTxInfo bool, cs *store.ChainStore, sa StateAPI) (ethtypes.EthBlock, error) { - parent, err := cs.LoadTipSet(ctx, ts.Parents()) - if err != nil { - return ethtypes.EthBlock{}, err - } - parentKeyCid, err := parent.Key().Cid() + parentKeyCid, err := ts.Parents().Cid() if err != nil { return ethtypes.EthBlock{}, err } From c3e1d26ddfdae763690392af3050cf2c92b89ec0 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Mon, 6 Mar 2023 15:29:03 -0500 Subject: [PATCH 03/27] v1.20.1 prep --- CHANGELOG.md | 8 ++++++++ build/openrpc/full.json.gz | Bin 33286 -> 33286 bytes build/openrpc/gateway.json.gz | Bin 8479 -> 8480 bytes build/openrpc/miner.json.gz | Bin 16039 -> 16039 bytes build/openrpc/worker.json.gz | Bin 5220 -> 5220 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 9 files changed, 12 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index af84828d7..8fb999fb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Lotus changelog +# v1.20.1 / 2023-03-06 + +This an optional patch releases for node operators/API service providers that run ETH RPC service. + +## Bug fixes +- fix: EthAPI: Correctly get parent hash #10389 +- fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct #10380 + # 1.20.0 / 2023-02-28 This is a MANDATORY release of Lotus that delivers the [Hygge network upgrade](https://github.com/filecoin-project/community/discussions/74?sort=top#discussioncomment-4313888), introducing Filecoin network version 18. The centerpiece of the upgrade is the introduction of the [Filecoin Virtual Machine (FVM)’s Milestone 2.1](https://fvm.filecoin.io/), which will allow for EVM-compatible contracts to be deployed on the Filecoin network. This upgrade delivers user-programmablity to the Filecoin network for the first time! diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 2bdf6336a97539097065e1123a90bc7ede83b53e..16fe7b83776c9d828aa2ede1cf17758a94cc5897 100644 GIT binary patch literal 33286 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 a&x4cRKmYvr=l=o#0RR6BJLa-^uLc0Td?!W# literal 33286 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 a=fO$upMQS*^M3&V0RR7ufBYkPuLb}f>{tE( diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 4f93653ad67196c59614d05703739534c737f553..60bf3dd77bde07d331b381e82d05337fa280d76c 100644 GIT binary patch delta 6367 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 3106db222eb6b23d759a7ee11706e5a889c72a2f..b3f1e3c25f2b1e6b352f3e15e086937d8fd5f649 100644 GIT binary patch delta 21 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 diff --git a/build/version.go b/build/version.go index e5a1435f1..4541c99e7 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.20.0" +const BuildVersion = "1.20.1" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d302a309a..82c9ba147 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.20.0 + 1.20.1 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 69d68dae5..1673ba528 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.20.0 + 1.20.1 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 65a9a31b1..e581d13cc 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.20.0 + 1.20.1 COMMANDS: daemon Start a lotus daemon process From 54e7fa8f705cdd08fcaa8fa5f565529e889fb839 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 6 Mar 2023 15:38:46 -0500 Subject: [PATCH 04/27] fix: state: short-circuit genesis state computation --- chain/consensus/filcns/compute_state.go | 8 ++++++++ chain/stmgr/execute.go | 8 -------- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/chain/consensus/filcns/compute_state.go b/chain/consensus/filcns/compute_state.go index 13dbc2069..ca03ee678 100644 --- a/chain/consensus/filcns/compute_state.go +++ b/chain/consensus/filcns/compute_state.go @@ -331,6 +331,14 @@ func (t *TipSetExecutor) ExecuteTipSet(ctx context.Context, } } + if ts.Height() == 0 { + // NB: This is here because the process that executes blocks requires that the + // block miner reference a valid miner in the state tree. Unless we create some + // magical genesis miner, this won't work properly, so we short circuit here + // This avoids the question of 'who gets paid the genesis block reward' + return blks[0].ParentStateRoot, blks[0].ParentMessageReceipts, nil + } + var parentEpoch abi.ChainEpoch pstate := blks[0].ParentStateRoot if blks[0].Height > 0 { diff --git a/chain/stmgr/execute.go b/chain/stmgr/execute.go index 60ee069d0..e67398299 100644 --- a/chain/stmgr/execute.go +++ b/chain/stmgr/execute.go @@ -52,14 +52,6 @@ func (sm *StateManager) TipSetState(ctx context.Context, ts *types.TipSet) (st c sm.stlk.Unlock() - if ts.Height() == 0 { - // NB: This is here because the process that executes blocks requires that the - // block miner reference a valid miner in the state tree. Unless we create some - // magical genesis miner, this won't work properly, so we short circuit here - // This avoids the question of 'who gets paid the genesis block reward' - return ts.Blocks()[0].ParentStateRoot, ts.Blocks()[0].ParentMessageReceipts, nil - } - st, rec, err = sm.tsExec.ExecuteTipSet(ctx, sm, ts, sm.tsExecMonitor, false) if err != nil { return cid.Undef, cid.Undef, err From 202cd41eeee753af67aae46eb8cadc72e34db236 Mon Sep 17 00:00:00 2001 From: Aayush Date: Mon, 6 Mar 2023 16:02:23 -0500 Subject: [PATCH 05/27] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8fb999fb0..5b13ba3f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ This an optional patch releases for node operators/API service providers that ru ## Bug fixes - fix: EthAPI: Correctly get parent hash #10389 - fix: EthAPI: Make newEthBlockFromFilecoinTipSet faster and correct #10380 +- fix: state: short-circuit genesis state computation # 1.20.0 / 2023-02-28 From b5c88d57146fc6b2e503b453046e8814d54d8fc1 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 19:36:11 +0200 Subject: [PATCH 06/27] try to add statenetworkname method --- api/api_gateway.go | 2 ++ api/proxy_gen.go | 31 +++++++++++++++++++++---------- api/v0api/gateway.go | 2 ++ api/v0api/proxy_gen.go | 23 +++++++++++++++++------ gateway/node.go | 2 ++ 5 files changed, 44 insertions(+), 16 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 2e877fb1a..62f4be87f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" @@ -63,6 +64,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*MinerPower, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ef257e69b..661e50976 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,15 +7,6 @@ import ( "encoding/json" "time" - "github.com/google/uuid" - "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" - "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" @@ -32,7 +23,6 @@ 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" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -45,6 +35,14 @@ 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" + "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" + "github.com/libp2p/go-libp2p/core/protocol" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -754,6 +752,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` @@ -4750,6 +4750,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { if s.Internal.StateNetworkVersion == nil { return *new(apitypes.NetworkVersion), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index 674371c14..fcbc714b3 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" ) @@ -59,6 +60,7 @@ type Gateway interface { StateMinerInfo(ctx context.Context, actor address.Address, tsk types.TipSetKey) (api.MinerInfo, error) StateMinerProvingDeadline(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*dline.Info, error) StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (abinetwork.Version, error) StateSearchMsg(ctx context.Context, msg cid.Cid) (*api.MsgLookup, error) StateSectorGetInfo(ctx context.Context, maddr address.Address, n abi.SectorNumber, tsk types.TipSetKey) (*miner.SectorOnChainInfo, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 5fa0d949c..b8359fb42 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,11 +5,6 @@ package v0api import ( "context" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "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" @@ -22,7 +17,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" @@ -30,6 +24,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" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "github.com/libp2p/go-libp2p/core/peer" + "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -481,6 +479,8 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` @@ -2842,6 +2842,17 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A return nil, ErrNotSupported } +func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) +} + +func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return *new(dtypes.NetworkName), ErrNotSupported +} + func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { if s.Internal.StateNetworkVersion == nil { return *new(abinetwork.Version), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 90a6812b5..ac83f12bc 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -25,6 +25,7 @@ import ( _ "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/dtypes" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/full" ) @@ -71,6 +72,7 @@ type TargetAPI interface { StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (api.MarketBalance, error) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, tsk types.TipSetKey) (*api.MarketDeal, error) + StateNetworkName(context.Context) (dtypes.NetworkName, error) StateNetworkVersion(context.Context, types.TipSetKey) (network.Version, error) StateSearchMsg(ctx context.Context, from types.TipSetKey, msg cid.Cid, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch, allowReplaced bool) (*api.MsgLookup, error) From 857b0205a8c478b38fc948a05d502ea057711c08 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 21:29:49 +0200 Subject: [PATCH 07/27] add method implementation --- gateway/proxy_fil.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 1f6ee2ccc..ba0c98579 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/types" @@ -308,6 +309,13 @@ func (gw *Node) StateMarketStorageDeal(ctx context.Context, dealId abi.DealID, t return gw.target.StateMarketStorageDeal(ctx, dealId, tsk) } +func (gw *Node) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return *new(dtypes.NetworkName), err + } + return gw.target.StateNetworkName(ctx) +} + func (gw *Node) StateNetworkVersion(ctx context.Context, tsk types.TipSetKey) (network.Version, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return network.VersionMax, err From 3aac4b45ab9b47c53c0ab40b3cb20be0aa5243a8 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Tue, 7 Mar 2023 22:19:20 +0200 Subject: [PATCH 08/27] add MPoolGetNonce --- api/api_gateway.go | 1 + api/proxy_gen.go | 13 +++++++++++++ api/v0api/gateway.go | 1 + api/v0api/proxy_gen.go | 13 +++++++++++++ gateway/node.go | 1 + gateway/proxy_fil.go | 7 +++++++ 6 files changed, 36 insertions(+) diff --git a/api/api_gateway.go b/api/api_gateway.go index 62f4be87f..8de636516 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -48,6 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 661e50976..9fc69dde5 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -718,6 +718,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -4563,6 +4565,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index fcbc714b3..f157617d9 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -45,6 +45,7 @@ type Gateway interface { ChainNotify(context.Context) (<-chan []*api.HeadChange, error) ChainReadObj(context.Context, cid.Cid) ([]byte, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index b8359fb42..88d3def63 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -449,6 +449,8 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `` @@ -2677,6 +2679,17 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag return nil, ErrNotSupported } +func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return 0, ErrNotSupported +} + func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { if s.Internal.MpoolPush == nil { return *new(cid.Cid), ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index ac83f12bc..5a51fe62c 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -60,6 +60,7 @@ type TargetAPI interface { ChainPutObj(context.Context, blocks.Block) error ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPushUntrusted(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index ba0c98579..50da42cba 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -188,6 +188,13 @@ func (gw *Node) GasEstimateMessageGas(ctx context.Context, msg *types.Message, s return gw.target.GasEstimateMessageGas(ctx, msg, spec, tsk) } +func (gw *Node) MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return 0, err + } + return gw.target.MpoolGetNonce(ctx, addr) +} + func (gw *Node) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return cid.Cid{}, err From fb569d4c2c4371960f4f4d9cd509ad098469eb7a Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 03:15:52 +0200 Subject: [PATCH 09/27] add two more methods: StateCall and StateDecodeParams --- api/api_gateway.go | 4 +++- api/proxy_gen.go | 26 ++++++++++++++++++++++++++ api/v0api/gateway.go | 4 +++- api/v0api/proxy_gen.go | 30 +++++++++++++++++++++++++++++- gateway/node.go | 4 +++- gateway/proxy_fil.go | 20 ++++++++++++++++++++ 6 files changed, 84 insertions(+), 4 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 8de636516..575050623 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -55,9 +55,11 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetVestingSchedule(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MsigVesting, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*InvocResult, error) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) - StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) //perm:read + StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*ActorState, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateMarketBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (MarketBalance, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 9fc69dde5..8ea8c7d45 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -736,8 +736,12 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `` @@ -4664,6 +4668,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(DealCollateralBounds), ErrNotSupported @@ -4675,6 +4690,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index f157617d9..b83dd0539 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -51,7 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index 88d3def63..fc321f594 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -461,7 +461,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -2734,6 +2738,8 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } + + func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2745,6 +2751,17 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 return *new(address.Address), ErrNotSupported } +func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { if s.Internal.StateDealProviderCollateralBounds == nil { return *new(api.DealCollateralBounds), ErrNotSupported @@ -2756,6 +2773,17 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a return *new(api.DealCollateralBounds), ErrNotSupported } +func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return nil, ErrNotSupported +} + func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { if s.Internal.StateGetActor == nil { return nil, ErrNotSupported diff --git a/gateway/node.go b/gateway/node.go index 5a51fe62c..babf844a2 100644 --- a/gateway/node.go +++ b/gateway/node.go @@ -67,7 +67,9 @@ type TargetAPI interface { MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (api.MsigVesting, error) MsigGetPending(ctx context.Context, addr address.Address, ts types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateLookupID(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/gateway/proxy_fil.go b/gateway/proxy_fil.go index 50da42cba..e3e8d5312 100644 --- a/gateway/proxy_fil.go +++ b/gateway/proxy_fil.go @@ -256,6 +256,16 @@ func (gw *Node) StateAccountKey(ctx context.Context, addr address.Address, tsk t return gw.target.StateAccountKey(ctx, addr, tsk) } +func (gw *Node) StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateCall(ctx, msg, tsk) +} + func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return api.DealCollateralBounds{}, err @@ -266,6 +276,16 @@ func (gw *Node) StateDealProviderCollateralBounds(ctx context.Context, size abi. return gw.target.StateDealProviderCollateralBounds(ctx, size, verified, tsk) } +func (gw *Node) StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) { + if err := gw.limit(ctx, stateRateLimitTokens); err != nil { + return nil, err + } + if err := gw.checkTipsetKey(ctx, tsk); err != nil { + return nil, err + } + return gw.target.StateDecodeParams(ctx, toAddr, method, params, tsk) +} + func (gw *Node) StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) { if err := gw.limit(ctx, stateRateLimitTokens); err != nil { return nil, err From 649b0769ba679ededa0e621c7e6a82949eb13aa9 Mon Sep 17 00:00:00 2001 From: Arsenii Petrovich Date: Wed, 8 Mar 2023 18:53:19 +0200 Subject: [PATCH 10/27] run make gen --- api/api_gateway.go | 4 +-- api/proxy_gen.go | 38 +++++++++++---------- api/v0api/gateway.go | 8 ++--- api/v0api/proxy_gen.go | 60 +++++++++++++++++----------------- build/openrpc/full.json.gz | Bin 33286 -> 33287 bytes build/openrpc/gateway.json.gz | Bin 8480 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16039 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5220 -> 5221 bytes gateway/node.go | 12 +++---- gateway/proxy_fil.go | 24 +++++++------- 10 files changed, 74 insertions(+), 72 deletions(-) diff --git a/api/api_gateway.go b/api/api_gateway.go index 575050623..9bc69cc0f 100644 --- a/api/api_gateway.go +++ b/api/api_gateway.go @@ -12,10 +12,10 @@ import ( "github.com/filecoin-project/go-state-types/builtin/v9/miner" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/lotus/node/modules/dtypes" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -48,7 +48,7 @@ type Gateway interface { ChainReadObj(context.Context, cid.Cid) ([]byte, error) ChainGetGenesis(context.Context) (*types.TipSet, error) GasEstimateMessageGas(ctx context.Context, msg *types.Message, spec *MessageSendSpec, tsk types.TipSetKey) (*types.Message, error) - MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) + MpoolGetNonce(ctx context.Context, addr address.Address) (uint64, error) MpoolPush(ctx context.Context, sm *types.SignedMessage) (cid.Cid, error) MsigGetAvailableBalance(ctx context.Context, addr address.Address, tsk types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*MsigTransaction, error) diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 8ea8c7d45..70579af1a 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -7,6 +7,15 @@ import ( "encoding/json" "time" + "github.com/google/uuid" + "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" + "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" @@ -23,6 +32,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" builtinactors "github.com/filecoin-project/lotus/chain/actors/builtin" lminer "github.com/filecoin-project/lotus/chain/actors/builtin/miner" @@ -35,14 +45,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" - "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" - "github.com/libp2p/go-libp2p/core/protocol" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -718,7 +720,7 @@ type GatewayMethods struct { GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` - MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `` MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `` @@ -736,11 +738,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `` StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -758,11 +760,11 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` - StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `` StateSearchMsg func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid, p3 abi.ChainEpoch, p4 bool) (*MsgLookup, error) `` @@ -4691,14 +4693,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { diff --git a/api/v0api/gateway.go b/api/v0api/gateway.go index b83dd0539..2a0bfb2f7 100644 --- a/api/v0api/gateway.go +++ b/api/v0api/gateway.go @@ -12,9 +12,9 @@ import ( "github.com/filecoin-project/go-state-types/dline" abinetwork "github.com/filecoin-project/go-state-types/network" - "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) // MODIFYING THE API INTERFACE @@ -51,9 +51,9 @@ type Gateway interface { MsigGetVested(ctx context.Context, addr address.Address, start types.TipSetKey, end types.TipSetKey) (types.BigInt, error) MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) StateAccountKey(ctx context.Context, addr address.Address, tsk types.TipSetKey) (address.Address, error) - StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) - StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) - StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) + StateCall(ctx context.Context, msg *types.Message, tsk types.TipSetKey) (*api.InvocResult, error) + StateDealProviderCollateralBounds(ctx context.Context, size abi.PaddedPieceSize, verified bool, tsk types.TipSetKey) (api.DealCollateralBounds, error) + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) StateGetActor(ctx context.Context, actor address.Address, ts types.TipSetKey) (*types.Actor, error) StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) StateListMiners(ctx context.Context, tsk types.TipSetKey) ([]address.Address, error) diff --git a/api/v0api/proxy_gen.go b/api/v0api/proxy_gen.go index fc321f594..17a1ae84a 100644 --- a/api/v0api/proxy_gen.go +++ b/api/v0api/proxy_gen.go @@ -5,6 +5,11 @@ package v0api import ( "context" + "github.com/ipfs/go-cid" + blocks "github.com/ipfs/go-libipfs/blocks" + "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" @@ -17,6 +22,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" @@ -24,10 +30,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" - "github.com/ipfs/go-cid" - blocks "github.com/ipfs/go-libipfs/blocks" - "github.com/libp2p/go-libp2p/core/peer" - "golang.org/x/xerrors" ) var ErrNotSupported = xerrors.New("method not supported") @@ -461,11 +463,11 @@ type GatewayMethods struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `` - StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -485,7 +487,7 @@ type GatewayMethods struct { StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` - StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) `` @@ -2684,14 +2686,14 @@ func (s *GatewayStub) GasEstimateMessageGas(p0 context.Context, p1 *types.Messag } func (s *GatewayStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - if s.Internal.MpoolGetNonce == nil { - return 0, ErrNotSupported - } - return s.Internal.MpoolGetNonce(p0, p1) + if s.Internal.MpoolGetNonce == nil { + return 0, ErrNotSupported + } + return s.Internal.MpoolGetNonce(p0, p1) } func (s *GatewayStub) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { - return 0, ErrNotSupported + return 0, ErrNotSupported } func (s *GatewayStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { @@ -2738,8 +2740,6 @@ func (s *GatewayStub) MsigGetVested(p0 context.Context, p1 address.Address, p2 t return *new(types.BigInt), ErrNotSupported } - - func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { if s.Internal.StateAccountKey == nil { return *new(address.Address), ErrNotSupported @@ -2752,14 +2752,14 @@ func (s *GatewayStub) StateAccountKey(p0 context.Context, p1 address.Address, p2 } func (s *GatewayStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - if s.Internal.StateCall == nil { - return nil, ErrNotSupported - } - return s.Internal.StateCall(p0, p1, p2) + if s.Internal.StateCall == nil { + return nil, ErrNotSupported + } + return s.Internal.StateCall(p0, p1, p2) } func (s *GatewayStub) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { @@ -2774,14 +2774,14 @@ func (s *GatewayStub) StateDealProviderCollateralBounds(p0 context.Context, p1 a } func (s *GatewayStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - if s.Internal.StateDecodeParams == nil { - return nil, ErrNotSupported - } - return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) + if s.Internal.StateDecodeParams == nil { + return nil, ErrNotSupported + } + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) } func (s *GatewayStub) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { - return nil, ErrNotSupported + return nil, ErrNotSupported } func (s *GatewayStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { @@ -2884,14 +2884,14 @@ func (s *GatewayStub) StateMinerProvingDeadline(p0 context.Context, p1 address.A } func (s *GatewayStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - if s.Internal.StateNetworkName == nil { - return *new(dtypes.NetworkName), ErrNotSupported - } - return s.Internal.StateNetworkName(p0) + if s.Internal.StateNetworkName == nil { + return *new(dtypes.NetworkName), ErrNotSupported + } + return s.Internal.StateNetworkName(p0) } func (s *GatewayStub) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { - return *new(dtypes.NetworkName), ErrNotSupported + return *new(dtypes.NetworkName), ErrNotSupported } func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (abinetwork.Version, error) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 16fe7b83776c9d828aa2ede1cf17758a94cc5897..bd8810929825a503b8986d7178ffbda8f4354c82 100644 GIT binary patch delta 29893 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 z zp9hqViZ=Uybvq}%dik^S4U;1}BPy6+L9Igs9ZKX@u*Q%dGpnNbUQjg zLJy~ome_w5p%C59B_0!~rtHtom6T~!!_|5u#)(gzNoRk%x82(oGh~Vwhf`mTX0%6o4mG>d^;q9Z+9>)#&)Ie^yVQeg60{L7 zxf(r<7i7cU#>=}|hvTK&>{BIHyA27lAwdm8f)dqJ;`E_ph7#LN7&Z|i8er5N$Owki ztr(+(hm%A_Txa9y09>|E&)h^OM8s&u*K)O}V#$I`FP0A?oc z`eT)xlzr;fS#se&h2hU>$fsl}W~8PGv{H>`mAcMG}`6d7(=>XP{I)Y z=-!&p($e#{uBDNl{k83sfBZao5(Ax__$KH&5(v#^R6>TBwU!V7^$=-F95tyLinewp za6;C-ePLwQ%NKVuVV?J?OokVx-2MN@tCe{D-(xp*K=L7a`i zddLW@)D2EHa>ho^*vOfBkuwR++u}9Uk&-A7t_vgh+c%1T6khbUK_>)q(fkd+<+=i^ z?UFq0X{=C|Nv0^kXWFQ(F{;83~Z`ZY>wL}mgBY<)0LRT)_S(qvsElsu~_SQgDkFo$$cSd z?EjVUV8(cp%!TdDHMU|ecd}Ea?(Ud3Q@^)Lz%h&JF**wz)Z*P$R-s#kZWX#! z=vJXycer(juLU?8l-+(H0Kw4&IdQOdBV3juQ31(xk@J9Zf2uyli|;?a|Im*ml}ir! zj4cFbsTM17SrPgAAT8U&1^6t@o{s`Ci5c+d7(37dj(E)gB>-yNMxzVO+e@QcFyI!2 z6{D~}p@&_~z6vn3$jBn2wLnJ6shJP+TsaUa5}yToa6xCk z*X?}yBkb!*e-K0;U)`A5>2^M1b-EG`ozDJte;}-()S_>+{B>9A#aJqqjnWncL1Grf z6vEEOV(B$e2J%f1ri_h1L8-NjBq|!?fAM%Cm1pAF8NJhwv@LQte~-`w{;bL(OeK zmGvRpP;+~BECFz~tJ0t~&wy5y{H)}3nCaQD1v$?ep9M2Zb|zbY$P8zVwX9XL4}HO; z)vQ*tTFu&6v)b#&?e*g;$2|{$PCNs!MW|onxnX6|}DzYY9Rkf3iCAmF#CKO>C)SmdIKopJNL`Z@lA6k-K4Jw?;?2QKtggEWA|TRizsITvj4<+C z24H~5Z#?!VUz2O{O;n1hF~kLA>vi*9<2&qmU_3*N0q6^f8DPi}7$I~`gg|rwCDG=a zGl7_hkFBI`djZT1;@h4D)T@WJe=KUUsA-vvN1G9C12Uo+`LwOAZEbC$x7kwO>>5eU()_GJCNrywttz&v*s5Zyimlt*y1kdiOgmLs z$S#p5reY(or0N<*F-mXu$fJ<&?lg~RR82lWKx5Q51FyGcDhz3az{89Ke>y5SzC;6n ziQ~=0LI9Y^uxA+wJ@lw^V`Cmy9P?P|&(o9BXt1{XTZ5+Y&NlG!S%703cxiF6#mP4C zvH+3oRwXjKT<#3)WyKlTR1iXZd~?wm@XP8$u(gp@%-{mgRNOE_oWmK-iKyMoaY^ACjp0Sk{ zZ2s8*gePzPor2eI3ZCui)Eh5yiJ~hF;1tvCM0sV$A+&ZyzeI;b2L!_S^XQ$hmz6}`e+SpIUT@$?pAf_2 zC`Y7tin{u(Iw~B#6IQpNrC9+}Hcl6hxC!?)PLFkgYmzDv6gNlEo!S`*($DWEh)<9@ z$E;SqU?p65x(WkqLT8=}h6rHd1PC(ZDmt5cM7h%DUT1CxPv{7B%ys_Y_d1X9n4!-II^7NjBpgiFROA=}xkWF+arP zQ^IAKXui;1O!qC5M?K1a-FuR&>}|oRaseaEhBjwSHO-b`ZBlEKTAS3`q?>4y4$2bE zGdx}*pt*iDbGxqmmZOymLzT-7!ixChay!sE?X9WtL`@9~kSsv50LcQRO$10gWoeuv zJ->|4K1HELmwm=PU!2(?qOrGxdp^~JmI0TUbNCZS20PqIt}DT0Uaga{%u4CPMg*=+u`VteoUm8$el)a+jTWbGvs zsoa5B+8R-8tk4FD`e_!G9TOp==p@|S}G4lw~f3NUrs zIrYmp3^+hObtdT-h`7neR`pudYr4%~2hG}q52DE4_A2g#&;l2e@uf3C?#yfKRm+fB z&PEh}G&Mm(EtY7yLY*b(Hq~b7J{nnxS^ko`?N+@5F5(b-O!?K)mZG)jtb|-7Arlij zH;(CdCfk0eDpVr$vn#XhQh*?}C%!K?ue+VEGT!1?hg;~!HTTT2ZPhhjl5Ck+SXrJ| zcjf51>VxfyWa-OfN^dDmdM1XdIJZ+2oVB}u#JP~RGpLuRPhT8LmCvERno}PuIna^M zx^7Q&*!=5jiP1MF5_@3#k`4vbhZXy6LAglQFx6o5w9i7x>6wqnvIwZA60UZbVoTc6f5Ilu{ zH%J{um_RZ{fRb(!4aZoV(`zE&xuT%clZwVv`M4MuYQ~V;)j3=B>bNGDxY&WxBNbkZ zL<2x5mo!8VWRSunKx{%iH*qbJNAFO8TriviO3*cd9u-6|pQM`CBl28*TIk`5F@)Xbp0v2c^E(ILT9C zPXE|xDvBzIy29%>OH0X=1P9%AW zLMPZA^nHO~`x+~Bhn;=RMWREnnLm9y6#+eYR;{gqm|4oElIOO6+Je9NUAK5#~vFW zFIv}W_O2uupqe+3&shCw7F8{?ZFNY0T(EM^MWrf|HpGQ$>e*xx#HueUYWr1%Q z1{vS(^+e&VLAU7bdrY8zhxuF;`Bf86XIigOvy9Q7c`RAUb*_97NK21%4K9mE-Ut8} ze9UGDGd-2+46&YSChQugiO6%fVHo#auOz$OIh;F_1J9#^<1!YUYK1>DJ%Rh+7|#70@tW zaIcOgkPzgh>n~n_sp75dAryDRE<@>8E&NJ(=W1Co6DX(acJ@0uv*pz1bG4mO;8{)k zU5_Xk;b4l~gDKZuQ=J$)e(;%+3&c=xTU07!IQQlo#QYKwjwNd?<@W0Q=M2q~Z2U=Q z&IAP)2)PI)x=|m0CKAnOJ?C6{{OZK88edm7w}u_; zZXIEFq5jr{E4C~&rCR$H8J?}_EBMv}nPWbFzQ6}nC?!3~o;J`gbEjb5uV zLrlhM_QV-ekqdA{Z3~=ofaN~XRAoPcKyQ0?0R%_XMGkmzH^I&X=;TUqa#u&ZeeFZ% z2DwoyV(eb(yiA`&f2j#%ldZIitQ|$TVf&r$c1qG$$dx6qP%}9qYPOlwIAJ)Pk`Y}f zZbbX-83(#Ii|=EJ+a4p%01XoNy!&uI6?4^5-2g+x?+_wUD6J21uyswYCI~PeIbx-_ z;WaMu?y{lG2!>>8;4rzFAjBsDosB1elGn}zVj?esmz%JoDwz;?yJQO06jUvYzb}nMA8FTpr3CSq4&X8a#coDMxYvIoT^YfF+mN8DW}ibjlU@`91BqnY&r{h`+PcNJRlDLkn)u>y_kD zkYRk!^BMMZZN@re<~HayXWC$6b$c3s8Dc9TL%L4WtFj{R$s?Z9mql^oZv z(C**ioFf@XmWfqP2bwLA7BN>9=p)rYZ2^+%xLK6hrV5lw-*C~V zuIE^?E*=9HPc2z${VdkcV*M=7&d<{BCYn&xX1XUQuNs?FRq>H)6UAACuQSZ8Dd+2o zUo2s-|Aq0?VHI@TIl0+RKl-@b^2S8mM@DjXum7;ke zKcTTlPS$BJASK&9d(@~9B(0CHyvmeZ+p8%GV}A-(K^~kI7cv2-A(Y*>IJE{&?RG9F zG~grXc}Qw|ga-WW_hU<7rs12o06227fp6t%#A^0}UK zO)+be8)cz4Tl``3)fBpDijbceq&IoeO)lW7b!QMU^z1irx3^1D=1HM?;5c+f_#deL zbs?Gh^`jB5uz!g})p{3+WZGTPH6r=mRiD<#a-}FTdC!+W8+zCQH)tN+m`2qNU}JoX z2sk~Co{wk%7;=1RFAO~fpd!hCp6Ml8nVDj`58O(w<`^n0VqjW{ z_KX49Q*p#S2_7NFj|v<|=Hf0vrIy62CFT;1w7j!j))5m4m*grV zqR}7^IB3%(2f9Z&UguKFI1MUvIm&-BkEl8@atGbUEpNisH`07e=Eer*|?g zO3fY>#ne2wT2nEKkx?Afb2o2(IOq18lB6_JFde~y6X{0MUDPa->95oh)O$N6GX2#l zxuwqH1J+S%t?b_=c{dQ;vfW^&5vr26Q`IdAIzmZ~rBoMPks_PUIDljhe1UBk7kFg? z$r!P%YjRCu%Fy>+J&Y9bkSwS2r;_TwG2p{M039YOZGo!^x+Y;!%mATWQ*i+$uQ~N! zYvrH|F@TBkxA7q5FSy+Gtn#UeA|e5Ipl|sq4x+Ks=kURUv5!w!Z@Bn zF&`5zB>Fu^1bTd)d~}7w4|;({GZIq1q8xgv7oDDpxJS-R(7Xzu62EquJ?=C+5r{a_ zSKwBTXt#4b3!sukyS?ZiH7O@BIx6y6iLy*xkAFJyt*`;|Z_hA6o&D|ppxb#rBl>Ej zbRlUQjb)!5^&h7GbE}`;>c_YGIp-NZ(R~oMMLK!cEH=ns~RSALQ1Q!&@^JjgFJ4HmyNz4eI5igkv3C#~Gc{ymg`^ zx(QWpI5m{MHz^zfhejW*FoZf%mazcMEy$vZ3CpO)u%@h>21_m+sk$pDGTrKZ$+V?a zyV=Mnt6Q_k^s7rFv;phZOPGrd_gB(u&lU=DE67_DH%?-`;M&l5hMR52z1bP`)BDX$I+p9n^4pF18-GaccB4&e{-lrotf@Nh zZXpiBIZ%8@&y)GG-q z7R_YIFVyQ*yj5uVqPFU*`~?GJ7?@nyh2*J=DJF8cOyNCnqJm-_a~i;L6uKK+69*E2 z8Ji)wY&pEqQGd+>F#v}DQJH;jQJ{k87>9hu0Az8j9BVi9Ei)HZ82>ituO$3UOk5)k zCa5Pk5cLowHhkw{^=Z)p&kblvA)|z+IEsdV_bRZV<~6ghV$Y|-xz^Z0wHc;tzh8B= zbjUhT{Bj>x<1dQ+ISt#IVv$*vCtzU=zpM}zYJ7d%u;*jXEGhFVXUV3 zft;hMuR^&NP!j#HQ4x*OrE$W~rXWT}!X?41C zMJBD7_hti}3qNTgeS)<^m(iOE!IT@v^gF|w0~ZH1Y=~kSRNWvd9o0)IrX&TE1Uz|# z^f#kq>wf~?>5V~o<&;uU3lvbY>B{S-1hx8BRHkQ!R#S?pq!vOXuZ2X{wJHivo~aE4 z=~=ZIbT-0Sv#AO-vu@2atDNxxybDk2b=JmZTzo~B#tiEKCDv5G>{Q*_`T_Cc6hub4 zC9J*Neg67*pjmpiu*voennWiIa<@h8Cmn2|D1X#Ptbb$bXsEiFU*!vWt`>>K&^3;Z z@rs;anU^NMrp?R$RnJvsb9^m#Y1W!5v^Q0k^9uRwdDMYgq&C!Q5s5mgO>T<>XslOi zMB~&gONdie!$=KArQ6ko$*vpPRB3LKni0m2M>GIXC&EcO?h-{#kDsfWET1|nGdg-J zF@HL&zOSM0%f5PE`B#)QLINH}gm?D0<&m>+(>VNn3^{C1v&(JT{q5eM-|bwXU@G^X zWO@<(8{S91Pwssj9>&tQA=lFIVZTg*LBn3wjZTd@G>R{d#@3{?8Y`2M(a0GW#;d(i zb4|g)Zq<#>DLwU`2Iq*ln2e7RY< zcbxQDR=*}ghF3YgoM=j&CUaKM5j~Ck0#Lb5E&y$H-9n_-qYabtGdlD z&cCT2Tu$i?`Y11Oi^}U)hXF$Wl)O6~6FHv6Z_n_E)6uB-i; zSI{qE=a1R+-!sUIU!DipL1&opFVtt5BC3xcAiIK7ACqyMoIXwC2zuC|CG=6iFf190 zF99Uu60VOtILk5=c7HXPv6Ak5rokN=mo|7c3x*|(ew_O#a07f>#?OR0)Pua_^_R&d zfqwD3%bR&n@@4{qn=*dJnW6br(}>M3A`=Bww#e!pHYr?Hb$BnGdM3RnSxhymrk8h( zis`jbr($+~)v23YD>dq+=2)$I*|k!ma#lLlsG5;vHEL#rZhwuMIf+uEZdxeRshARs zH7aJrZJnA$il9dQv~H?VF(m`*)JsU!I@OXoy+*yHeyvk2sjKSLOKPfSS+-Nqs^IdI zQe9TgnvySTDyYdC<{yKlKlmF!DLqBsCg6Ps)*SN-(tFfM$W^M;i-{9tc-2U z;>*0H-IEN|7|{R(QLXlzi{)Q%W!rwMIRWq#qCafru#I))rX@>pzV_s6gO7Z8r#|d@ zB(7Ok-MCYgcq}Jsuds82cykY7A+;x>9W}QPsUG72T7O1AhKv_0NOc*6)sI#`TK#DC zqt%ZY{rILTaoQPXDiK&ijTqN2(}8(4_WegL@??P~i(9G8znLLhUwx%|vmmrS!BZ+Q zM5m)SE^;YX&CjM;>)A- zhJhh;Ze)0SD5;?5g_%(qxWjw`Aef4Q!elJaH4XHgYoUN>ASgcWE~EPJi35yQKy#Z&Ex3o2Xcqm0g&YeDh!v zp!h<*4a)MJGaWZfU+-0=o019z6SRztpz5#MMo_J+-bRReV_+j_o)*{$Q&9@=3FPv8 ztqdziF7W9cicAL?UjwAgVGRgtKy0)D@wO_R&KadQGr#Fw&0+23j>Xg#PrB7A=ljy4 zDSz&n!NHb@qX6*$qg#DN;^}d8AeN32SYJQ1hgz(hT;%CpASKuD%de>rd{>naMJ?Y8 zI-D_HHqtfZVT#aWh{hBHtCy15{u&F+G@nUW=g)>7cEAmq7faBDWF64}5K3M{$Dy-? zdBea9X`L`U?kY^k0OHO|D|M~ZwNm#%q<`*CuPRf^Cm7ry9$u``NZzJMEGKDGq!!BA zROt!{n<`gdzGnMpAX(F#DWCPsm!k88IRU+sKAAHroi+Lvem;OopJ5xlzH!0E2OR1 ztCxTxKVJ$nO%xV05rn+g-yQ4@#BhcOr^oFjfRYrGS)l$z0UlxGN@n%A zgn23AJ>xi!MEvXw4w0vNC6h3y{eQtIeLQi~5A;ly2jk9BpkGSKA5uS}o(DM!1Sj%^ zVkGnUS63}5F(@iyMM3jtknyj+E52=p4G*$O`cXIpDhJ4Z@7J&PQhX%8W~0m?HE*TM z4Om?Y@pm&hx2ESn-A0o0x@JO?c>dPSU|f^Mf;m~2Msi*nodPUeB6V9$uYc(1q~efL z4?$9VxG`E#HRfo3iJ9k^sXa1@Rclf{v!s{G4zsbqZ%~ylMyarK7;x-hACji$LGpAO z!N4YFe6mq9JlKj^pXsX+Fif$UbeLA#_6jfhab*h|*AX^W8_pF4YeL6TbGkh|^GK%l z#>(KGs#EJ~I_S0B{OYA(m%-H>jQ`5TckcvQ$s&TXSt30 z?>}D2=$m+{ zc!30Eb#JbctCO+Kt!^Re;&A=4xnB^sUs2R(gjGdlx^(v634I`YM@OCgx9S&iTSc|X z%1RhSa*3sr?&hvJR@J`gT!9jACe>={#VNrYL+{)}?ilH3C-**bIC78S`~uy_g4yoc%UTN@+iziv|!nTgPVOs&g2Gjp|Wa|IKzDT%}^H-n9lm@q9K$&q>%Ms`s( zsU6BUvpW=0%Po)Bi$%}!;Yyoz5^86+Dt(K>R_az?ls^ny1Ap6wG?v4)uZEb9F!J23 zL(JccKMe6~*nEqA)NHqmp=!iSlq~^--I7BCF_D=NJWr!mEw34v!r%tE0J89caO46U z!q|2*zgXP5skk-2hVmZPq9O((+FMbIg*6qOdsSIz)LIYkAYLw_zlhXwf>b>@#N$)K z4Mk|C{R*!@l7DzpKR~{>#_~1GXzC0V4dg}@9RaB1=5H*F3Q)cQ2NEzuGHHz)z&iqH z0GN-64f405b&+UIPW+OAj9wai^WO7181=R)Nr+t9#|XL}CQZ|NrD-hdVGRkHiO;Cn zN^fdds-e_O_RUmW#*8JCcS%{Pe4)UNN~Evxm*Ue(MSm+57dlGAIac5pO}sK1!E?&^ z@{Zvjt3pDCG#^*5EzMq^Jv#Bbrjah zeJl4(o2^qiXRV8YX3%hXJ(Og)H>Pw~y2+5dXD%-`VaT5B{L^+lPPd|C9d^C4c|V-jnvWjcfZ?2!ELcj&HW6 zO}{m1+9__5=}pr1;f)JiTB2<}%cMu7?05$A-ygV0qE?f#(k#|sfX0$|c(|Q&c-DXa z4FP7RzV?Z6=2+oXfy(ecr%)7M9Dj!xcW8o-dt)r&o? zvZa`%Xn%7Nzy%Yl6PFD}1dXwW)kG)rV?4e?p>%ZnPeeJ?{sCVY^3C4`HwPi(BjRH+ zDS>p2Ru$b|qm>Ev8m&qkDBdl^y&L&w>kJgN0n?Y)RFEU2{R~{o@tTlbEzu=Ic8P&; zw7lyHb4Aiv!fm5wD)*RW5#!uRG#oVChLrcjFnZ zu%x$3Lkd=LwKj*F^&K-Z7-INlL z?Kibaac%mpBgBsFQ_64Eu;E55VRH`t%rE5Ta8R3UOo=0gYm?!%zs+T$6r#)h!t|C* zYJUT(+r{Fj6?0|{~AEfF!l5T?+~gT9!id@*50>HJxQ+Y<9dX~z zCn7l&B~B6MJF7W-7X-;=TsuTaUDZ1O^ago!i3EqwzqvGGSmS5e$X4}q%a|r)D1Qyy z?(^mtUEAg+!#M%ZHh7mzdFKz3!2t91JOBUE zr?Mz2he3mOzd?3|NhUBUw>v5$PUN>asgpyK9iY*?F|IkDSo~qd1)&BSG8I1 zLIEb$+ML@6`EE zU2g8w`P&FRCmXY{eOA$Gm7zv1vQ7rlmP!K&V_@$Yo$I}A^+925){2B2UVk18yeN<* z?}hvkYwQ8!fYCVuNYGFzp1>rMaDhTh{UL$G&xkc~n+%tk-lJZqvSV+msu^z)|WryEm% zsk5Py@oY=SC6pG@9)D=RE*G*byWW%lLBnk*3unh@D-4_HnJPL>tm!xrdoeLmC~A_< z5SQf^V}&1Uv3}z7qT?MQbWE5~RX-*7(nf!GiI+&J&Xmik`dj&cs+?d>%B>iPwJvFG z_wA)6)EB1rIN9Hr{A>GKIt{Aml;sw$2+-KBxXvS#)hQO#v45B0OUvox6dnl&U<2?; zsYAv%;3zcoC`?(c(zNCbzz_jUydd&-SKxnYxwbp$zAF#Zl?Up|19jzr?5DRY57dO-QXFn!!Ad`|keuZ{>KWT!AKT}>?+@z| zC+Ru*ib7Tv!0WR0HH@l@YVr077dW#}8i4Jw(4W_wjEW8#ACGi|VnmxyNsM9UpyZ2A_5fYELe>U zZ7s!4Nq_J?><`YdF9`i7vZUUPJOCDyUUbwZnb(M0(RkT+DF0z;*?+_soS;5{j74)y zCIEA=f-JE`DBJcZpx&&Qn@WkBgCQA`Ph$Y}Z!kk^A&*GQw~ze3w1Y#{wIj>j=dNjG2u*#>UonnUhQ<>%tDWUhL6;+Y470EJ)$31@&)fC!61 zU4Oz6-9wKDYu(kK5n?jIi7^m#kGzN@UrqZOTz$E{Q!Z)>LJ3}&0rY1C1JPMh9Zl?& zbLmWFtO2@Dd1=5Q^R1i=tMHY6I3W9ZlXfn}# zu$p3TDjSIv0|A~P0D(`VQGoW?0uf*C&3||0TMrs5#iybn9*~d>I0mq(rySIRzpk{F| zVzPeGBv~fTpF%brWG{{FEPqo)SgA;9(4nGCnSE)MZAX%__5{f*HW9$$+q`tMxua&u ziw_~4XG&mDDL{%3zY6lA<=c;tU4P;^=F)cg5wZ^mox?@?@^gshIGXDRSCUKi-X8RO zpEWTk78~jJO3inp(ZWZQWq5>-J<8CEPuFbn>V9^=_;XASS7Yz5llk&+I;S(f8u|A# zcz?{KSb4=JH=bOai+jwKM7!Vb-AGnej=)FAzQ{@ur~Tf=Qk;VuN_lHJ8h>O5=afl^ zSBk2)x3&rLa>~yjLmv=2Q)3lReqW;Sf^j^T^xSx%qJ8O7_v+= zq(-4qG+juRhbg%Wp}K5z+w5_-*@cilldGAM3wr(D`zW@Np6n<8sZBYB;Y8D%YemX( zZ3F7bx8g!me0zxr>b*TUJb&u5XY)IUr8bg3UN^>fa1c*?j< zc?G_WMnarSXk@q9y3O_jHXDh8;Gge~Lw3!~6S?>?XhceC@Dz#iBOqZewrv@uEGBAy zlz{docF3tgaiLnQEWqwEp|gPB-g*+UAzU-N?dA;%h`aH@vvwE9uf$W zB}g(p7a{J+=gF6YtDH^NF!l|}`KR}QPa)A}T*IKLXXGaj`#&l3T;BkCqvt>Z75faT z?}tR0FJgaY6n|?B;s*tM2M=b>okxtD=G@|xR9bW8sQW<2vdeM(7X|@c#Ss?&O--Dl zu_P`7P&EIl-6O4|IRHZf%*36UxHA*C5ucl7;Sc9sy??NO&_ep4<44MV zQ(o34<`E@TZH!k|X7;viv6|;TEklj!{5|rNPDT;Y)_=}NTja6d`%Q=THOXuHTM`zy z`R>zLjbp5CcLOX@6s6nD&F~WM$n9e~pYxsbbzSCs6<2G7J2$*~W}!SlTEt%iGebh! zmBocL+n~*RX<^is$yEwC#dl1VGaqs-yen^IomxxYw~%PFt5tEk)QFGGOn+P~O~r99 z%4XFc+J8uDzmq#WPcwpCz%W=hlN5AQt3>d+)7{Jb^`#pGBRn+Il3=hIpQ2QvNdSoW zU|?{gUpV8m z%{jJJ#<4Ep*mF%d=AQVp%Q998qRTR7hj^D|to1Bo&-oT`T34_`m+XZh$J;8T5+Dz* zkGiCui#94jtnHhCIbx@~K#I{A6Q3mo8UM9NUPuFO_BOE76{b6(dUu5C(!;(%7iD~A zBY#jQb!%lDSxW!h)77VtEZsBXo_0!x_~zWm1oY6lsiZS^B~=E`))`c8 z65NXJCaw1Ux!lKyd--C!UB| z99FQjrWU{i(9lY#}9}Y>Jp+8PeFFoS&BNpA5bE7=Hlslb%3Z~LM zZz1Tzt|n3IB!%6P6gCmzdOci43mf@Ce){(Bf*!6!P1mwwPJq0D#Lt$?E~x8DbboVS z2vg{^my<+DH1Q<9N0P2+C0p{?#M4oo5)pHmfvr?CtV-Z)p`1Qb&f+X3S?zvAw>r3SYT`>W!C_-Pp(}6u~BHQ>9!`v zcA<@XcJ2D{Zb-FVhjmf|o2W#A_kTLhGnNv)v?XA&sdy8wZdq#X!H`Hn7b|I91`L1@ zsd0jlj_imC$8!X*z+((OB!pC`q)?CgEvDe@1R8sRrm#&)Jot-W*a$2iaPU<|yJ-IW z0S8x@m_N^=knr^9CG}?JYop`z;SFLaT%z}wjiNA4U**W<)2>}W74wyp)pFBOb zq_epW>q_`!duVXEs2t;_i$w*lCi&Ia#rKK035eVL#6U=?%w68e{Et!8r@(BUIx~8r zH0ijmW{=+XVGB}V_^9$<_&}0h*g)nBJ87?z_MR|l?WDbSDC=zh>Y7$$^C%f(9}y1$A1(NF(4|=FQY>{TmY#Tur7m00)5sQ76xaIx*SJcj-xKeQJ3Q=z7D>w%B#C3-nozz&!F#q9W)wmxDNgT zepbs{d&e{2mEZA(yMm2ACEk$Pr@Hi=PnspZ+K|ihls&m@*V||*c2pS^D zC}~gK)k%m?tn8o$ke}P+v4uV=Q_85Z^!h}}&6}!}YVk2!P=8E{1skmij%;piPgHR$ zbp%JkDAi~7KZ8uF7=O;OuSvrGYa;a@O$Z2@wi%|N;@9!V%$^Y;6_utC@|F_rgU8wTP z@C}X65cDXyAUwnxr5h?MCJL_e9&%XP?t5Q!@|oUp4f~J3d&aLf{hs{mY|T+=g>eDk zGZaj^Re4f@%%oe)F*NmsG^iiSYl+OV_BQCb>5D>Uu&c5SMC z=rq=sM{ka*G8U|f_l3-1IC~caO$}ZqfKvT+tzyG$-G*i(hfTFwBh&FB3MWWfx_`9t z!h_xv^}!s@#QDJ-EGT1m6v&h{Qjg84iZ_t?5to=oELdk> zy0u+40n^@AwXw~n-A1I!K3lp|M=})?_F)_kp$xSEP9W}VvYk!##ZZn{RdLvB;(gU8 z;7(>LYeYV>Anfx%j3^B@*=)10%YO-rnrKJ*Qb4+%$mH-ykH>0?WVBHx!i(##m?AKM zhJaAsxo$mz>z0l-d5jR0r%Dc9R|F4#gF%4!84Mut+}$)Xtu0eA`~rT~#wk4cM0g!B z$bhd&{bIs%%KMVXznUIoQ8E2HM*5j{?8qcqh!aD`J|I&B{UoL2v{i}Y$$#ZfC_9+u zLRC<>Hd zDZRe>>f<K}GdSbv%B9O~uXMplt#_3)N8qvL%g?iGSiI3L$ze*AHdy zgLt>;L#LQ29IeBO*cr92KFzma$g1%McWX_Io80RZ{0F_yB}3SB05vWl@{mlf201Idv!*mgG%Z&X{qfzI zpa@_!XjO0j{5M+PNu#+ti@ipx2j#B{_f5=IV4*^p zmV>ppGlFTi>A}$P!j|a3s|ueg zwbySGyFf#7kOF8+W1K>4M{AtHaMRg0I#-TXB}Pv9zswe|zoewa(sfU6V|R+=%cIki z3jZR#Yw(0LJ%2xVLR_jk{PBIX=7PEY>V@kCr-R!xL+~c{Dn4ydp{!A_FWq4D%?P0C#i3j;D4oKvZZ@59(nQ?r-ttcV43DH z-F-GBMf-TGxb{10rgHcY(z*Hjni3DG55LN!I4W1cN60Sm9ILzyA0hjI&^cVBFF%K9 zj-$DLa3!lt$gDk|^%9gNuP!aZKN>B3G+Bm6_}HTit@w1!Ca>;i_lrNre?Now$E^2{Yk^xiYS+j}W84jz>iM(G#hgs2Yftgq+w`Ls+bYISuVYg_ zLfuEA_n&jKc(Xqo*Q&90XDD&i>CJ!Sm~MUtj&r}4icOX&JRXml7)#U9ppFJLq(Nq6 zv$^-5tf>D|lj)zH*1A^5fk4~&R_CBpT>{kdG=DJ`Uc?N;!^Q@wXu{s%kJ$NT%W{@}87s(USLv$4C5 zQdUhY=!mR6+f=u$I=3YwF>58(9%6+9hqH_qc^^QtFq@34rgNken%c*v)H^O|l*COA zhHK=`2*B_uVzRK}6fWZc?p^VqdwOco+9GA0_OtVfY>RpyRD~&^(b0K;5#h1C?M%Y+ z5X!xmHkURk0BWbcQ5k;a6#2$XGA>(yrE0RZTT)jHr+#}L9{2wF=lehZ9{>RV{~|t_ ImU*uR07|*-J^%m! delta 29882 zcmV)!K#;$OgaU?y0+1a7II*!GG6H`Gd+$V_N>

1UWbHRB5)vGDHg3m|RMwD=9;v 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 diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index 60bf3dd77bde07d331b381e82d05337fa280d76c..b25ce7cbe1ab3cfd377be9c3d92391adffab78bd 100644 GIT binary patch delta 9070 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 g6H@V+Wmp~@YU;zokB9#k00960YR delta 8246 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index b3f1e3c25f2b1e6b352f3e15e086937d8fd5f649..1bbcff07417c74e3b4f49e6af62f4194f3a6f970 100644 GIT binary patch delta 14255 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 N|Nq7QtK0D#0{~kb*e(D7 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index ff47f7b11157d68f004b7198bf8eef7bfb9f7381..8aa648469a10cdd793a646a4af4076708f2a6b81 100644 GIT binary patch delta 2801 zcmV4YN8Y`(sieiR=95Ax`pem#dY__Ij-A&B$f@$U@Ss2TW^2Eq>>pysR3f8N5Gcl zLy*)l->YPPC6!8LPgovnJJi>gUn3qaOzpck4?zo)nTOm5Y@n{^SLk)Ulc~~EwUeHz z>3vC-{)wQ8Tu(YBOUqg_U34I2#&;1@qRuazTDL7Xf{h&6|Akh*76nSDlwp6*ZS!tMeI0gVi9)Mttsp~!481loq$$~C=vM+K7UG@9hPg6m&wKDL zAUFAZB+Q&mLV_OS;2b+q4ki~_b{~S&QIM;ps-*X_Rp}py8gouX^7HVr=RCyr8TIbv z1*G%vadaEzqv3b_H`_#@Z)BFi zK_PfSKdZXNNI*{8SX%@UXo;~t6A=)&AaLQe;le;G#)WV!ssTcfxp^cA@;40u+tvu* z-y(w)zF&X%e&PEo`Tn7v?fbtVf?P;LhxaeE`iE;TD(uSVmczTeXkfE*hD}a%$gRF9 zpeSl@aUhn!jn|4Bg^P!wUhiKk^o@j2aBd<(@f2sQ8=hekxU6~)5y~92hpg#IkY<9( zEHF4i0W?h)c^)zW-j>z@=ajkisqHS12_`E5!JmJ@w;wWq;LJ9W0p2~%u`vgjn3y$@ z)v;Jw6dUaAi35#$WNvF=o%J3-Vgd-hu~c*D%{%d>%qOYK^c+rC>f|Rh5Y!$$b3RyU zP#e&R=G~)(^SAxuKhAPxFPy(8iz!-7HGPV;U9lO-|5MQ%-bqh)yONGET;Dpbn?{1oq)b zlBK^8p3P}+v%^>0fRUxPYNUr>Kw?LcOPinh|-+QzvHftKTt0e1fcq37A-V|v= z#@kJ6s{z|9yZuF1atz(I4di)O$nyf7=Cb%$=4{hnF0t9UzAmPs@q&K}tbSV>pPeV= z%r^KSBSSXVzYz+sihw-@kAACx7vz`0EWFpw3=>)_@Hj^#Om|D1pg!PH=u+>N9Oy~5 zjZO_u^i7G2t4gtjMlQD6kN>a3%=*1tGkZXn!KQX_@mYH2ve(v1e1vcAb3Hf^RI< z9D4Ike3Dzw6_^nY6w<01t^*Y#(~glz--jti=7=LBR+q%;(ra5?8mML2a2mjQ*|1tO z82bY@E+*o3#K=eb4fhzb!2*BmBdE7@6yCLq9C*g&Wtn zpOZ=tOn)d$kCj0-OkW{ro%z=h@CI5&a`HlSz#gG>=|=?<@5{^{|GFKW}$81&{>N75_zRSJb`$x4e`{RbE24A zzi?6Y6{%h3nii!F+fIs$)Fc?j8XjF=5}4Q$8*T$8zJYZmvC<;;%>+>qM5P|0qU9X? z6@P==Dzo!l=IRsl9p+b?qwi#R7G@%5>Mb{hTxLsvU-R z_$hcz9e=m)+`F&%9wpB5lfh(3!S+Br5{7(7PPt=NU}6tWELOKT;qHx`a5o<0oN#xA z=&!`r25!6AWXvOs6Wg{5K04SHaOj5zF@I4CK0er0xPb1x2k0DatO9xf1@F2W>*#>r zYzpWcvVX7#JVYrbvsSIGYNAYY$Utdv(4iV7Y@&6 z$OT@Q@L+U!bNVvMlb;bZf8(6b6+;F1j3_kbA2T|olv;1Ib9%)@?wYhYDorD&%fB)0 z87fN7_js`mKfou8 zR=7+NDYRg%BBx}&m5aFijd;==Ia58IpRUZBW~m!GPNl91DeO9sf6o1d%YsYtY6?4U zt1+l~p`(FDTp|-07IY7>ig+1$PXCwanEU%w`<5fJO0NkAQX)Ugwo|MN%ArC}8;>DW z^b>WU_D^(u(mR=E2Bl>o{L!4cs3i=a)RCdfZqM*VDXF7G9x*2 zNf?3_h2FjAR})-&f0%2Fk@60;z_@75Q?OJsOVY9M>U6{3ZS1Ook{zPqdQOxC8%=|drvE}XC;N{%gjzTe|E*RbYohlPwPEXkirOs zR~+<0(u%HVBfaV^(|gaBNEvd2Em7-e zM*7f*SNF9>MEU>*aV>zjOG^Z+ieS~+2J;nd3bp8JU00960oq2scsV)Hk DTA*Q8 delta 2796 zcmV>9P<5ZT;e zS4q$*tSax8)I=#>r0Y&2t#IAKbqm*Bi|ZZ?b6mImNGuzg!B~W5#^uFR1@KNKC$??* z^Tq{qZjyhrel9X zYl$-6Wa(oPDZ_uB+veSj`a0~!5`|XPT0w>c8G3DGXgJCyL%$L@u@LV(Hq4bld)|Y0 z0lCTNBVp!j5)$+n2j|#{axl5bvilIEj)Gh*Ri)85Tb2HSs4?eMBtH)?d(J~_pHc5# zUO+kzA4j)gJ{o?<3g?D8V)b+k9ngbEqge6af=x;h*RdITkkHwPQlc8@`cQ z1_y=U1^uk*8Y2NYZDVZ_M4%pg;CqbGC zCbPic2nEnIUF3Pl1bACo2b@#p)~B|+Kqi>100ahq2H$?j0F&trAXRnNdjN?EAo#{o z&7n8%#FsLkq%PBQI9;iepU^;1d-TltV5LEAKqs1aj~33~_K*KK%ay%w{+=wRXf@UJ zDb|*&!E%Xo^+A``VwF!Ix*(KW5J{RLnFRCRqX5hj?-4r9Wb5}u0+XHwvsJBJn8 zi4eZAB%<+d}7GM%E78FF#M$~JN| z8drnLwUiI_`?InKa0Gu>a+%0rkbQXeH~RryQQL+7JqA2yXh(AL-i4cd&ZPOnzigB1 za@>dnOYw{=$l9sdH{JY{a~o|CGVoQT_E#ci>#4cCUlY+Sp5bnbB?nx7~8 zT8QWsKp`Hm)J5pzmsWT)Rc4V~@U)S*k?SFH1T4HBDW0y>eJp>z8yF6zz42%?IYCoR zInm7_I+m|-0x$@WD0&QkLsqG$q z@6o2%tZCS;lB~DkjYP?LQ=|tZSzFQ|XO>bIrw*?CgVY=aLnGGuf88=(NJ2-s8b=(iepL4Fy`!h7w^Frl>q zk8?!AbhpF_>H{8yF7A!~XPq?s_{WQ1iv({z#NArs(jX&rD*nS-3#?gE)$vH}qN ziQE84AULy4WPo>%b8O53CMIT0WOXc-7R3g8d*VRj9+}%(sK3+$i3uS1#!}6pH}AwJ zx%FIu8R36GA+4(6I#4k(?HHN#eVAfojyN)6bxEu)y|UG%QBNt$hSLDf%ZAmO*{}?p zek5;L*PoDJ%Yr_?@eU@;>hlq1HG?p-CJNHr65AJ~`Hd3*L7HE{$OzKh){*HKpidTf zm)l=S-)SG;{zyq(<0bxr{R{U0lG(r7%Vz(V$U=Y6L)U(AKQcL)eyPfXUP3bC z4Vp?+-xPsQw^9U8wai@GK-g2-TsCUp_vzF_l#P_C%hDD8iGshY@9u9(EYs~leb2ft zF922m>}vy9P0a(?h5f)Aj~rymgHt%cAtaoCejmVNHafCGvO$pt{6bM!)!BHriCgZ1 z-{~$Kxm+O@MF1FWXGv?%v2i}LZPo%f^*zg1{(M6DRLC#+?IUn@*k#pX- z&q&Vdr)GqF_4g&M%%>ZR+>AF+ETFZ_LfgQhvlRIy@=Aet0`XoO;tg}oiDGX3!bR0r zq;{EWT9i6$J1H(wlVBKYcyxV9U}8&bxDA;22G*6tN{iSx6GTN2m3oNEDCgj>7=Pqe znVs)4SD&EoFu&RyeJ8`SFcUFTZ=u1qftBQF^h=~B0s{pGzBUXT=bVXG?J&Hl`yRnjU!rc|3zY<>? zxb0?>F^@1#Y}+dM=wMgCp&uT^M1Lvx_+VGz0=oAepmVgb3g`h8yz6ePqXT}kDWG%6 z{=pvb5T%&RZpi|!0EPDmKrls*z(a;jOb<{SF!v5;kRtYjLhl|hbvKt*jh{NOUM*!* zOhY5AVRJ02_?Dow&8Ru&;9Sj@)U+SDktWQR2{rj<66QMCNOrYno5vq6o(;{A3%oGl z!RYYj^hL{)pb<2Gdd}yHp#pqH6dLo78J$u}t+&}Zy<#GFP1+olrjgU--<HKtM)-+4q&~YktO-NzafpqSFFI*N}l2=pMaa)aHm=`)4 zXv8Hlkzqmi5UYrnk>~V(iH^CyPqlA3BCGV8a3Ce}vur!Xx}Y2?^tAC9LPbAO2WtOB z*C)M`2{iSSiKz@H{qaOq4ZSj26z;i*WsPUE(NRvY+aJ)o{~RoSaav|1XD$gt(4x@0 z_xx&tYY%gOZ81{bp%xeyt$7NTYGz3~7G9lh_`8i=RZy}+G<=*BCBeodSOTt~;6cXP z^gAf74)xv&CbatvX!lT2a`rzrW5Rm@;5J{uR3kO;j7BdF`m`>Za%@Z9H{ZxFo@?F_ zZAs1|cbEd4+%6SGLm;?q?%=iVJ*~)|l@z8gGdtOT*cH>#jcJ`et@lhp3L_L=b?m@U z>E&#L2A_@k;jNt36UkXUa_*Wq&@_?xX+_aFG0~6h0Ti1zeg#+fC-M)T$ox2ZyNh>{IBr4&;FS!(OBu%g1KW8bLZbIeE4reM^s2W^?>$>0WylS-M6IJ4=|dx4 z-PamK=>r(VwE*HSEfK6Lf>moHoLWu{QE1DYWHZc_JyF}bhkU9RCMlqKVG1sGx09-o you0g|+C6UwN44HaS1KcEOBGVjlN1y?7N=BwRa&p_*8d*>0RR6g Date: Wed, 8 Mar 2023 20:38:09 +0000 Subject: [PATCH 11/27] Eth API: make block parameter parsing sounder. --- node/impl/full/eth.go | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 907adf8cd..7af9e7000 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -153,6 +153,8 @@ type EthAPI struct { EthEventAPI } +var ErrNullRound = errors.New("requested epoch was a null round") + func (a *EthModule) StateNetworkName(ctx context.Context) (dtypes.NetworkName, error) { return stmgr.GetNetworkName(ctx, a.StateManager, a.Chain.GetHeaviestTipSet().ParentState()) } @@ -231,7 +233,7 @@ func (a *EthModule) EthGetBlockByHash(ctx context.Context, blkHash ethtypes.EthH return newEthBlockFromFilecoinTipSet(ctx, ts, fullTxInfo, a.Chain, a.StateAPI) } -func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset *types.TipSet, err error) { +func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict bool) (tipset *types.TipSet, err error) { if blkParam == "earliest" { return nil, fmt.Errorf("block param \"earliest\" is not supported") } @@ -252,16 +254,19 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string) (tipset if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, false) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } + if strict && ts.Height() != abi.ChainEpoch(num) { + return nil, ErrNullRound + } return ts, nil } } func (a *EthModule) EthGetBlockByNumber(ctx context.Context, blkParam string, fullTxInfo bool) (ethtypes.EthBlock, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, true) if err != nil { return ethtypes.EthBlock{}, err } @@ -367,7 +372,7 @@ func (a *EthModule) EthGetTransactionCount(ctx context.Context, sender ethtypes. return ethtypes.EthUint64(0), nil } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthUint64(0), xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -456,7 +461,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, return nil, xerrors.Errorf("cannot get Filecoin address: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -535,7 +540,7 @@ func (a *EthModule) EthGetCode(ctx context.Context, ethAddr ethtypes.EthAddress, } func (a *EthModule) EthGetStorageAt(ctx context.Context, ethAddr ethtypes.EthAddress, position ethtypes.EthBytes, blkParam string) (ethtypes.EthBytes, error) { - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -631,7 +636,7 @@ func (a *EthModule) EthGetBalance(ctx context.Context, address ethtypes.EthAddre return ethtypes.EthBigInt{}, err } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return ethtypes.EthBigInt{}, xerrors.Errorf("cannot parse block param: %s", blkParam) } @@ -676,7 +681,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth } } - ts, err := a.parseBlkParam(ctx, params.NewestBlkNum) + ts, err := a.parseBlkParam(ctx, params.NewestBlkNum, false) if err != nil { return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } @@ -1066,7 +1071,7 @@ func (a *EthModule) EthCall(ctx context.Context, tx ethtypes.EthCall, blkParam s return nil, xerrors.Errorf("failed to convert ethcall to filecoin message: %w", err) } - ts, err := a.parseBlkParam(ctx, blkParam) + ts, err := a.parseBlkParam(ctx, blkParam, false) if err != nil { return nil, xerrors.Errorf("cannot parse block param: %s", blkParam) } From a0821506bc5aacf7740dfd7c405e3308c56a6fab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 20:49:28 +0000 Subject: [PATCH 12/27] Eth API: fail when requesting future epochs. --- node/impl/full/eth.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 7af9e7000..919380ad1 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,6 +254,9 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } + if abi.ChainEpoch(num) > head.Height()-1 { + return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") + } ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) From e73ec088d563de385f05e9217c32dcc2b2e264d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Wed, 8 Mar 2023 21:15:04 +0000 Subject: [PATCH 13/27] add a test to verify block parameter soundness. --- itests/eth_transactions_test.go | 71 +++++++++++++++++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9afeb7bd5..82de0c6c0 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,6 +7,7 @@ import ( "testing" "time" + "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -270,6 +271,76 @@ func TestContractInvocation(t *testing.T) { require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) } +func TestGetBlockByNumber(t *testing.T) { + blockTime := 100 * time.Millisecond + client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) + + bms := ens.InterconnectAll().BeginMining(blockTime) + + ctx, cancel := context.WithTimeout(context.Background(), time.Minute) + defer cancel() + + // install contract + contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") + require.NoError(t, err) + + contract, err := hex.DecodeString(string(contractHex)) + require.NoError(t, err) + + // create a new Ethereum account + key, ethAddr, deployer := client.EVM().NewAccount() + // send some funds to the f410 address + kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) + + // DEPLOY CONTRACT + tx, err := deployContractTx(ctx, client, ethAddr, contract) + require.NoError(t, err) + + client.EVM().SignTransaction(tx, key.PrivateKey) + hash := client.EVM().SubmitTransaction(ctx, tx) + + receipt, err := waitForEthTxReceipt(ctx, client, hash) + require.NoError(t, err) + require.NotNil(t, receipt) + require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + + latest, err := client.EthBlockNumber(ctx) + require.NoError(t, err) + + // can get the latest block + _, err = client.EthGetBlockByNumber(ctx, latest.Hex(), true) + require.NoError(t, err) + + // fail to get a future block + _, err = client.EthGetBlockByNumber(ctx, (latest + 10000).Hex(), true) + require.Error(t, err) + + // inject 10 null rounds + bms[0].InjectNulls(10) + + // wait until we produce blocks again + tctx, cancel := context.WithTimeout(ctx, 30*time.Second) + defer cancel() + ch, err := client.ChainNotify(tctx) + require.NoError(t, err) + hc := <-ch // current + hc = <-ch // wait for next block + require.Equal(t, store.HCApply, hc[0].Type) + + afterNullHeight := hc[0].Val.Height() + + // Fail when trying to fetch a null round. + _, err = client.EthGetBlockByNumber(ctx, (ethtypes.EthUint64(afterNullHeight - 1)).Hex(), true) + require.Error(t, err) + + // Fetch balance on a null round; should not fail and should return previous balance. + // Should be lower than original balance. + bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) + require.NoError(t, err) + require.NotEqual(t, big.Zero(), bal) + require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) +} + func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { gaslimit, err := client.EthEstimateGas(ctx, ethtypes.EthCall{ From: ðAddr, From 6a7895bf49ce9de264cb46315b7497dd178a11dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 12:15:35 +0000 Subject: [PATCH 14/27] fmt. --- itests/eth_transactions_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 82de0c6c0..5cc829907 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -7,7 +7,6 @@ import ( "testing" "time" - "github.com/filecoin-project/lotus/chain/store" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-state-types/big" @@ -15,6 +14,7 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" From 558eaf8b61b57e8157201aff49cf10a322f75896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 14:59:56 +0000 Subject: [PATCH 15/27] fix lint. --- itests/eth_transactions_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 5cc829907..9d6c742dc 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -323,8 +323,8 @@ func TestGetBlockByNumber(t *testing.T) { defer cancel() ch, err := client.ChainNotify(tctx) require.NoError(t, err) - hc := <-ch // current - hc = <-ch // wait for next block + <-ch // current + hc := <-ch // wait for next block require.Equal(t, store.HCApply, hc[0].Type) afterNullHeight := hc[0].Val.Height() From 2909a31e8f104803ee5dacabc67b6d3d30610a0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 17:14:23 +0000 Subject: [PATCH 16/27] fix TestEthBlockHashesCorrect_MultiBlockTipset: skip null rounds. --- itests/eth_block_hash_test.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/itests/eth_block_hash_test.go b/itests/eth_block_hash_test.go index ac6506bb2..7cc766ebc 100644 --- a/itests/eth_block_hash_test.go +++ b/itests/eth_block_hash_test.go @@ -3,6 +3,7 @@ package itests import ( "context" "fmt" + "strings" "testing" "time" @@ -55,6 +56,10 @@ func TestEthBlockHashesCorrect_MultiBlockTipset(t *testing.T) { hex := fmt.Sprintf("0x%x", i) ethBlockA, err := n2.EthGetBlockByNumber(ctx, hex, true) + // Cannot use static ErrFullRound error for comparison since it gets reserialized as a JSON RPC error. + if err != nil && strings.Contains(err.Error(), "null round") { + continue + } require.NoError(t, err) ethBlockB, err := n2.EthGetBlockByHash(ctx, ethBlockA.Hash, true) From a72879b2b257a6b98054f0f30ec38c0ec1668c94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 18:51:38 +0000 Subject: [PATCH 17/27] switch to ChainAPI#ChainGetTipSetByHeight. --- node/impl/full/eth.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 919380ad1..203d9475b 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -257,7 +257,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if abi.ChainEpoch(num) > head.Height()-1 { return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) + ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } From 1da2d59066d73125ffe29686fe5e6b595a2bd1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Thu, 9 Mar 2023 19:05:31 +0000 Subject: [PATCH 18/27] simplify test. --- itests/eth_transactions_test.go | 25 +++---------------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/itests/eth_transactions_test.go b/itests/eth_transactions_test.go index 9d6c742dc..8d0df0433 100644 --- a/itests/eth_transactions_test.go +++ b/itests/eth_transactions_test.go @@ -280,29 +280,10 @@ func TestGetBlockByNumber(t *testing.T) { ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // install contract - contractHex, err := os.ReadFile("./contracts/SimpleCoin.hex") - require.NoError(t, err) - - contract, err := hex.DecodeString(string(contractHex)) - require.NoError(t, err) - // create a new Ethereum account - key, ethAddr, deployer := client.EVM().NewAccount() + _, ethAddr, filAddr := client.EVM().NewAccount() // send some funds to the f410 address - kit.SendFunds(ctx, t, client, deployer, types.FromFil(10)) - - // DEPLOY CONTRACT - tx, err := deployContractTx(ctx, client, ethAddr, contract) - require.NoError(t, err) - - client.EVM().SignTransaction(tx, key.PrivateKey) - hash := client.EVM().SubmitTransaction(ctx, tx) - - receipt, err := waitForEthTxReceipt(ctx, client, hash) - require.NoError(t, err) - require.NotNil(t, receipt) - require.EqualValues(t, ethtypes.EthUint64(0x1), receipt.Status) + kit.SendFunds(ctx, t, client, filAddr, types.FromFil(10)) latest, err := client.EthBlockNumber(ctx) require.NoError(t, err) @@ -338,7 +319,7 @@ func TestGetBlockByNumber(t *testing.T) { bal, err := client.EthGetBalance(ctx, ethAddr, (ethtypes.EthUint64(afterNullHeight - 1)).Hex()) require.NoError(t, err) require.NotEqual(t, big.Zero(), bal) - require.Equal(t, -1, bal.Cmp(types.FromFil(10).Int)) + require.Equal(t, types.FromFil(10).Int, bal.Int) } func deployContractTx(ctx context.Context, client *kit.TestFullNode, ethAddr ethtypes.EthAddress, contract []byte) (*ethtypes.EthTxArgs, error) { From 0e58b3fbbc14826c5b271592b4930da513de809a Mon Sep 17 00:00:00 2001 From: ychiao Date: Wed, 8 Mar 2023 19:28:17 -0500 Subject: [PATCH 19/27] fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium (#10413) --- itests/eth_fee_history_test.go | 135 ++++++++++++++++++++++++++++----- node/impl/full/eth.go | 40 +++++----- node/impl/full/eth_test.go | 2 +- 3 files changed, 135 insertions(+), 42 deletions(-) diff --git a/itests/eth_fee_history_test.go b/itests/eth_fee_history_test.go index 72302f298..a792c7f0e 100644 --- a/itests/eth_fee_history_test.go +++ b/itests/eth_fee_history_test.go @@ -3,18 +3,42 @@ package itests import ( "context" "encoding/json" + "sort" "testing" "time" "github.com/stretchr/testify/require" "github.com/filecoin-project/go-jsonrpc" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/ethtypes" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/lib/result" + "github.com/filecoin-project/lotus/node/impl/full" ) +// calculateExpectations calculates the expected number of items to be included in the response +// of eth_feeHistory. It takes care of null rounds by finding the closet tipset with height +// smaller than startHeight, and then looks back at requestAmount of items. It also considers +// scenarios where there are not enough items to look back. +func calculateExpectations(tsHeights []int, requestAmount, startHeight int) (count, oldestHeight int) { + latestIdx := sort.SearchInts(tsHeights, startHeight) + // SearchInts returns the index of the number that's larger than the target if the target + // doesn't exist. However, we're looking for the closet number that's smaller that the target + for tsHeights[latestIdx] > startHeight { + latestIdx-- + } + cnt := requestAmount + oldestIdx := latestIdx - requestAmount + 1 + if oldestIdx < 0 { + cnt = latestIdx + 1 + oldestIdx = 0 + } + return cnt, tsHeights[oldestIdx] +} + func TestEthFeeHistory(t *testing.T) { require := require.New(t) @@ -22,70 +46,136 @@ func TestEthFeeHistory(t *testing.T) { blockTime := 100 * time.Millisecond client, _, ens := kit.EnsembleMinimal(t, kit.MockProofs(), kit.ThroughRPC()) - ens.InterconnectAll().BeginMining(blockTime) ctx, cancel := context.WithTimeout(context.Background(), time.Minute) defer cancel() - // Wait for the network to create 20 blocks + heads, err := client.ChainNotify(ctx) + require.NoError(err) + + // Save the full view of the tipsets to calculate the answer when there are null rounds + tsHeights := []int{1} + go func() { + for chg := range heads { + for _, c := range chg { + tsHeights = append(tsHeights, int(c.Val.Height())) + } + } + }() + + miner := ens.InterconnectAll().BeginMining(blockTime) + + client.WaitTillChain(ctx, kit.HeightAtLeast(7)) + miner[0].InjectNulls(abi.ChainEpoch(5)) + + // Wait for the network to create at least 20 tipsets client.WaitTillChain(ctx, kit.HeightAtLeast(20)) + for _, m := range miner { + m.Pause() + } + + ch, err := client.ChainNotify(ctx) + require.NoError(err) + + // Wait for 5 seconds of inactivity + func() { + for { + select { + case <-ch: + continue + case <-time.After(5 * time.Second): + return + } + } + }() + + sort.Ints(tsHeights) + + // because of the deferred execution, the last tipset is not executed yet, + // and the one before the last one is the last executed tipset, + // which corresponds to the "latest" tag in EthGetBlockByNumber + latestBlk := ethtypes.EthUint64(tsHeights[len(tsHeights)-2]) + blk, err := client.EthGetBlockByNumber(ctx, "latest", false) + require.NoError(err) + require.Equal(blk.Number, latestBlk) + + assertHistory := func(history *ethtypes.EthFeeHistory, requestAmount, startHeight int) { + amount, oldest := calculateExpectations(tsHeights, requestAmount, startHeight) + require.Equal(amount+1, len(history.BaseFeePerGas)) + require.Equal(amount, len(history.GasUsedRatio)) + require.Equal(ethtypes.EthUint64(oldest), history.OldestBlock) + } history, err := client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"5", "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) + require.Nil(history.Reward) + + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 5, int(latestBlk)) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{"0x10", "0x12"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(17, len(history.BaseFeePerGas)) - require.Equal(16, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(18-16+1), history.OldestBlock) + assertHistory(&history, 16, 18) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "0x10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(16-5+1), history.OldestBlock) + assertHistory(&history, 5, 16) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10"}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "latest"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, int(latestBlk)) + require.Nil(history.Reward) + + // test when the requested number of blocks is longer than chain length + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{"0x30", "10"}), + ).Assert(require.NoError)) + require.NoError(err) + assertHistory(&history, 48, 10) require.Nil(history.Reward) history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{25, 50, 75}}), ).Assert(require.NoError)) require.NoError(err) - require.Equal(6, len(history.BaseFeePerGas)) - require.Equal(5, len(history.GasUsedRatio)) - require.Equal(ethtypes.EthUint64(10-5+1), history.OldestBlock) + assertHistory(&history, 5, 10) require.NotNil(history.Reward) require.Equal(5, len(*history.Reward)) for _, arr := range *history.Reward { require.Equal(3, len(arr)) + for _, item := range arr { + require.Equal(ethtypes.EthBigInt(types.NewInt(full.MinGasPremium)), item) + } } history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( @@ -93,6 +183,11 @@ func TestEthFeeHistory(t *testing.T) { ).Assert(require.NoError)) require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( + json.Marshal([]interface{}{5, "10", &[]float64{75, 50}}), + ).Assert(require.NoError)) + require.Error(err) + history, err = client.EthFeeHistory(ctx, result.Wrap[jsonrpc.RawParams]( json.Marshal([]interface{}{5, "10", &[]float64{}}), ).Assert(require.NoError)) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 203d9475b..c5809d250 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,10 +254,7 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - if abi.ChainEpoch(num) > head.Height()-1 { - return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") - } - ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) + ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } @@ -689,11 +686,7 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth return ethtypes.EthFeeHistory{}, fmt.Errorf("bad block parameter %s: %s", params.NewestBlkNum, err) } - // Deal with the case that the chain is shorter than the number of requested blocks. oldestBlkHeight := uint64(1) - if abi.ChainEpoch(params.BlkCount) <= ts.Height() { - oldestBlkHeight = uint64(ts.Height()) - uint64(params.BlkCount) + 1 - } // NOTE: baseFeePerGas should include the next block after the newest of the returned range, // because the next base fee can be inferred from the messages in the newest block. @@ -703,29 +696,32 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth gasUsedRatioArray := []float64{} rewardsArray := make([][]ethtypes.EthBigInt, 0) - for ts.Height() >= abi.ChainEpoch(oldestBlkHeight) { - // Unfortunately we need to rebuild the full message view so we can - // totalize gas used in the tipset. - msgs, err := a.Chain.MessagesForTipset(ctx, ts) + blocksIncluded := 0 + for blocksIncluded < int(params.BlkCount) && ts.Height() > 0 { + compOutput, err := a.StateCompute(ctx, ts.Height(), nil, ts.Key()) if err != nil { - return ethtypes.EthFeeHistory{}, xerrors.Errorf("error loading messages for tipset: %v: %w", ts, err) + return ethtypes.EthFeeHistory{}, xerrors.Errorf("cannot lookup the status of tipset: %v: %w", ts, err) } txGasRewards := gasRewardSorter{} - for txIdx, msg := range msgs { - msgLookup, err := a.StateAPI.StateSearchMsg(ctx, types.EmptyTSK, msg.Cid(), api.LookbackNoLimit, false) - if err != nil || msgLookup == nil { - return ethtypes.EthFeeHistory{}, nil + for _, msg := range compOutput.Trace { + if msg.Msg.From == builtintypes.SystemActorAddr { + continue } - tx, err := newEthTxFromMessageLookup(ctx, msgLookup, txIdx, a.Chain, a.StateAPI) + smsgCid, err := getSignedMessage(ctx, a.Chain, msg.MsgCid) if err != nil { - return ethtypes.EthFeeHistory{}, nil + return ethtypes.EthFeeHistory{}, xerrors.Errorf("failed to get signed msg %s: %w", msg.MsgCid, err) + } + + tx, err := newEthTxFromSignedMessage(ctx, smsgCid, a.StateAPI) + if err != nil { + return ethtypes.EthFeeHistory{}, err } txGasRewards = append(txGasRewards, gasRewardTuple{ reward: tx.Reward(ts.Blocks()[0].ParentBaseFee), - gas: uint64(msgLookup.Receipt.GasUsed), + gas: uint64(msg.MsgRct.GasUsed), }) } @@ -735,6 +731,8 @@ func (a *EthModule) EthFeeHistory(ctx context.Context, p jsonrpc.RawParams) (eth baseFeeArray = append(baseFeeArray, ethtypes.EthBigInt(ts.Blocks()[0].ParentBaseFee)) gasUsedRatioArray = append(gasUsedRatioArray, float64(totalGasUsed)/float64(build.BlockGasLimit)) rewardsArray = append(rewardsArray, rewards) + oldestBlkHeight = uint64(ts.Height()) + blocksIncluded++ parentTsKey := ts.Parents() ts, err = a.Chain.LoadTipSet(ctx, parentTsKey) @@ -2351,7 +2349,7 @@ func calculateRewardsAndGasUsed(rewardPercentiles []float64, txGasRewards gasRew rewards := make([]ethtypes.EthBigInt, len(rewardPercentiles)) for i := range rewards { - rewards[i] = ethtypes.EthBigIntZero + rewards[i] = ethtypes.EthBigInt(types.NewInt(MinGasPremium)) } if len(txGasRewards) == 0 { diff --git a/node/impl/full/eth_test.go b/node/impl/full/eth_test.go index 67a8b0500..4cf3b5c76 100644 --- a/node/impl/full/eth_test.go +++ b/node/impl/full/eth_test.go @@ -135,7 +135,7 @@ func TestRewardPercentiles(t *testing.T) { { percentiles: []float64{25, 50, 75}, txGasRewards: []gasRewardTuple{}, - answer: []int64{0, 0, 0}, + answer: []int64{MinGasPremium, MinGasPremium, MinGasPremium}, }, { percentiles: []float64{25, 50, 75, 100}, From 36ffa09b054f3366d4ba50d8b09347c0399db591 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Thu, 9 Mar 2023 07:14:57 -0500 Subject: [PATCH 20/27] fix: eth API: return correct txIdx around null blocks (#10419) --- node/impl/full/eth.go | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index c5809d250..9b6794339 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -1802,12 +1802,16 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to compute state: %w", err) } - for txIdx, msg := range compOutput.Trace { + txIdx := 0 + for _, msg := range compOutput.Trace { // skip system messages like reward application and cron if msg.Msg.From == builtintypes.SystemActorAddr { continue } + ti := ethtypes.EthUint64(txIdx) + txIdx++ + gasUsed += msg.MsgRct.GasUsed smsgCid, err := getSignedMessage(ctx, cs, msg.MsgCid) if err != nil { @@ -1818,8 +1822,6 @@ func newEthBlockFromFilecoinTipSet(ctx context.Context, ts *types.TipSet, fullTx return ethtypes.EthBlock{}, xerrors.Errorf("failed to convert msg to ethTx: %w", err) } - ti := ethtypes.EthUint64(txIdx) - tx.ChainID = ethtypes.EthUint64(build.Eip155ChainId) tx.BlockHash = &blkHash tx.BlockNumber = &bn From b7db4cb280cc07f35804bb8d90f61a249db300b3 Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 9 Mar 2023 13:17:17 -0800 Subject: [PATCH 21/27] feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x (#10416) However, we're leaving the default at 1.25x for backwards compatibility, for now. Also: 1. Actually use the configured replace fee ratio. 2. Store said ratios as percentages instead of floats. 1.25, or 1+1/(2^2), can be represented as a float. 1.1, or 1 + 1/(2 * 5), cannot. fixes #10415 --- api/docgen/docgen.go | 4 ++ build/openrpc/full.json.gz | Bin 33287 -> 33289 bytes build/version.go | 2 +- chain/messagepool/config.go | 14 ++++--- chain/messagepool/messagepool.go | 14 ++++--- chain/types/mpool.go | 2 +- chain/types/percent.go | 39 ++++++++++++++++++++ chain/types/percent_test.go | 34 +++++++++++++++++ cli/mpool.go | 9 ++++- cli/mpool_test.go | 7 +++- documentation/en/api-v0-methods.md | 4 +- documentation/en/api-v1-unstable-methods.md | 4 +- 12 files changed, 113 insertions(+), 20 deletions(-) create mode 100644 chain/types/percent.go create mode 100644 chain/types/percent_test.go diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 65d71d208..0e97997a6 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -401,6 +401,10 @@ func init() { FromBlock: pstring("2301220"), Address: []ethtypes.EthAddress{ethaddr}, }) + + percent := types.Percent(123) + addExample(percent) + addExample(&percent) } func GetAPIType(name, pkg string) (i interface{}, t reflect.Type, permStruct []reflect.Type) { diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index bd8810929825a503b8986d7178ffbda8f4354c82..dfa68e4f37c5b836f2e599d091be8266a7ef01ed 100644 GIT binary patch delta 8498 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 1.00). +type Percent int64 + +func (p Percent) String() string { + abs := p + sign := "" + if abs < 0 { + abs = -abs + sign = "-" + } + return fmt.Sprintf(`%s%d.%d`, sign, abs/100, abs%100) +} + +func (p Percent) MarshalJSON() ([]byte, error) { + return []byte(p.String()), nil +} + +func (p *Percent) UnmarshalJSON(b []byte) error { + flt, err := strconv.ParseFloat(string(b)+"e2", 64) + if err != nil { + return xerrors.Errorf("unable to parse ratio %s: %w", string(b), err) + } + if math.Trunc(flt) != flt { + return xerrors.Errorf("ratio may only have two decimals: %s", string(b)) + } + *p = Percent(flt) + return nil +} diff --git a/chain/types/percent_test.go b/chain/types/percent_test.go new file mode 100644 index 000000000..7364c2447 --- /dev/null +++ b/chain/types/percent_test.go @@ -0,0 +1,34 @@ +package types + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestPercent(t *testing.T) { + for _, tc := range []struct { + p Percent + s string + }{ + {100, "1.0"}, + {111, "1.11"}, + {12, "0.12"}, + {-12, "-0.12"}, + {1012, "10.12"}, + {-1012, "-10.12"}, + {0, "0.0"}, + } { + tc := tc + t.Run(fmt.Sprintf("%d <> %s", tc.p, tc.s), func(t *testing.T) { + m, err := tc.p.MarshalJSON() + require.NoError(t, err) + require.Equal(t, tc.s, string(m)) + var p Percent + require.NoError(t, p.UnmarshalJSON([]byte(tc.s))) + require.Equal(t, tc.p, p) + }) + } + +} diff --git a/cli/mpool.go b/cli/mpool.go index e098806cb..c83fb4b61 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -461,7 +461,12 @@ var MpoolReplaceCmd = &cli.Command{ msg := found.Message if cctx.Bool("auto") { - minRBF := messagepool.ComputeMinRBF(msg.GasPremium) + cfg, err := api.MpoolGetConfig(ctx) + if err != nil { + return xerrors.Errorf("failed to lookup the message pool config: %w", err) + } + + defaultRBF := messagepool.ComputeRBF(msg.GasPremium, cfg.ReplaceByFeeRatio) var mss *lapi.MessageSendSpec if cctx.IsSet("fee-limit") { @@ -482,7 +487,7 @@ var MpoolReplaceCmd = &cli.Command{ return xerrors.Errorf("failed to estimate gas values: %w", err) } - msg.GasPremium = big.Max(retm.GasPremium, minRBF) + msg.GasPremium = big.Max(retm.GasPremium, defaultRBF) msg.GasFeeCap = big.Max(retm.GasFeeCap, msg.GasPremium) mff := func() (abi.TokenAmount, error) { diff --git a/cli/mpool_test.go b/cli/mpool_test.go index 01b49d4b3..0aa055ba3 100644 --- a/cli/mpool_test.go +++ b/cli/mpool_test.go @@ -15,6 +15,7 @@ import ( "github.com/filecoin-project/go-state-types/big" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/types/mock" "github.com/filecoin-project/lotus/chain/wallet" @@ -298,6 +299,7 @@ func TestReplace(t *testing.T) { mockApi.EXPECT().ChainGetMessage(ctx, sm.Cid()).Return(&sm.Message, nil), mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -342,6 +344,7 @@ func TestReplace(t *testing.T) { gomock.InOrder( mockApi.EXPECT().ChainHead(ctx).Return(nil, nil), mockApi.EXPECT().MpoolPending(ctx, types.EmptyTSK).Return([]*types.SignedMessage{sm}, nil), + mockApi.EXPECT().MpoolGetConfig(ctx).Return(messagepool.DefaultConfig(), nil), // use gomock.any to match the message in expected api calls // since the replace function modifies the message between calls, it would be pointless to try to match the exact argument mockApi.EXPECT().GasEstimateMessageGas(ctx, gomock.Any(), &mss, types.EmptyTSK).Return(&sm.Message, nil), @@ -538,7 +541,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: 0.25} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 1234567, SizeLimitLow: 6, ReplaceByFeeRatio: types.Percent(25)} gomock.InOrder( mockApi.EXPECT().MpoolGetConfig(ctx).Return(mpoolCfg, nil), ) @@ -566,7 +569,7 @@ func TestConfig(t *testing.T) { t.Fatal(err) } - mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: 0.33} + mpoolCfg := &types.MpoolConfig{PriorityAddrs: []address.Address{senderAddr}, SizeLimitHigh: 234567, SizeLimitLow: 3, ReplaceByFeeRatio: types.Percent(33)} gomock.InOrder( mockApi.EXPECT().MpoolSetConfig(ctx, mpoolCfg).Return(nil), ) diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index fe639b2f3..e47b90904 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -2879,7 +2879,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -3167,7 +3167,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index 8e8176c23..5c3ac336d 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -3816,7 +3816,7 @@ Response: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } @@ -4104,7 +4104,7 @@ Inputs: ], "SizeLimitHigh": 123, "SizeLimitLow": 123, - "ReplaceByFeeRatio": 12.3, + "ReplaceByFeeRatio": 1.23, "PruneCooldown": 60000000000, "GasLimitOverestimation": 12.3 } From 51d0d5e5490cd4e96901979dd82d6cb9ff7c6727 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:24:18 -0500 Subject: [PATCH 22/27] make gen --- build/openrpc/full.json.gz | Bin 33289 -> 33289 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5221 -> 5221 bytes documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 7 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index dfa68e4f37c5b836f2e599d091be8266a7ef01ed..acf4fb80f258800544f3a0b31b0fd6b00ecce16d 100644 GIT binary patch literal 33289 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 literal 33289 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 ZhsV8t{`vmT{|5j7|NjBLDEphQ1^|phe82zz diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index b25ce7cbe1ab3cfd377be9c3d92391adffab78bd..bae9a6a79b0245962fcf82e4f79d013a96bf1865 100644 GIT binary patch delta 21 dcmX@_ao%G>6XUOq%}10u?k!!a-tw1`0RVW|3NQcw delta 21 dcmX@_ao%G>6JyoJ<|E1+Ih7L)TmCXK003;x2?ziH diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 1bbcff07417c74e3b4f49e6af62f4194f3a6f970..be588eccd3e652a06e6545ca11925ca275713d2a 100644 GIT binary patch delta 21 dcmZ2oySjElE91hAZL)S8-=~Bye3WKp003<#2#^2( delta 21 dcmZ2oySjElD`VrvHd#B4Gu!We{3y-L0046D3E}_% diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 8aa648469a10cdd793a646a4af4076708f2a6b81..1f10d091011e00ff878bf3e9976e387f7945eb3f 100644 GIT binary patch delta 5137 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 diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 82c9ba147..782441813 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index 1673ba528..bf1fa68b0 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e581d13cc..e9ff4a6ee 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.20.1 + 1.20.2 COMMANDS: daemon Start a lotus daemon process From 4def0a53e0f5838050636fc46bb59390ed5a2905 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 19:39:07 -0500 Subject: [PATCH 23/27] change log --- CHANGELOG.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5b13ba3f6..84b67b84d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,19 @@ # Lotus changelog +# v1.20.2 / 2023-03-09 + +This is a HIGHLY RECOMMENDED patch release for node operators/API service providers that run ETH RPC service and an optional release for Storage Providers. + +## Bug fixes +- fix: EthAPI: use StateCompute for feeHistory; apply minimum gas premium #10413 +- fix: eth API: return correct txIdx around null blocks #10419 +- fix: Eth API: make block parameter parsing sounder. #10427 + +## Improvement +- feat: Lotus Gateway: Add missing methods - master #10420 +- feat: mempool: Reduce minimum replace fee from 1.25x to 1.1x #10416 + - We recommend storage providers to update your nodes to this patch, that will help improve developers who use Ethereum tooling's experience. + # v1.20.1 / 2023-03-06 This an optional patch releases for node operators/API service providers that run ETH RPC service. From 80cba5f176f8d1001bf1c085dec5afaea4541d57 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 21:09:04 -0500 Subject: [PATCH 24/27] fiix bakcport error #10427 --- node/impl/full/eth.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/node/impl/full/eth.go b/node/impl/full/eth.go index 9b6794339..c7de18900 100644 --- a/node/impl/full/eth.go +++ b/node/impl/full/eth.go @@ -254,7 +254,10 @@ func (a *EthModule) parseBlkParam(ctx context.Context, blkParam string, strict b if err != nil { return nil, fmt.Errorf("cannot parse block number: %v", err) } - ts, err := a.Chain.GetTipsetByHeight(ctx, abi.ChainEpoch(num), nil, true) + if abi.ChainEpoch(num) > head.Height()-1 { + return nil, fmt.Errorf("requested a future epoch (beyond 'latest')") + } + ts, err := a.ChainAPI.ChainGetTipSetByHeight(ctx, abi.ChainEpoch(num), head.Key()) if err != nil { return nil, fmt.Errorf("cannot get tipset at height: %v", num) } From 8c6ffcf4d4509738608f5e21bc11a1a89f2e2e21 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 21:10:30 -0500 Subject: [PATCH 25/27] retract v1.20.2 --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 55ee0d510..208e59361 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/filecoin-project/lotus go 1.18 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. +retract v1.20.2 // Wrongfully cherry picked PR, use v1.20.2+ instead. require ( contrib.go.opencensus.io/exporter/prometheus v0.4.0 From c8b4f5f0a3403ed5c31661f5017beaedd6cc40a9 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 22:03:27 -0500 Subject: [PATCH 26/27] go mod tidy --- go.mod | 1 + 1 file changed, 1 insertion(+) diff --git a/go.mod b/go.mod index 208e59361..dbb9328f9 100644 --- a/go.mod +++ b/go.mod @@ -3,6 +3,7 @@ module github.com/filecoin-project/lotus go 1.18 retract v1.14.0 // Accidentally force-pushed tag, use v1.14.1+ instead. + retract v1.20.2 // Wrongfully cherry picked PR, use v1.20.2+ instead. require ( From e3b3b0ca6cb59cbafb67dab70b5a0e3bf5589e94 Mon Sep 17 00:00:00 2001 From: Jennifer Wang Date: Thu, 9 Mar 2023 22:11:11 -0500 Subject: [PATCH 27/27] make gen --- build/openrpc/full.json.gz | Bin 33289 -> 33289 bytes build/openrpc/gateway.json.gz | Bin 9295 -> 9295 bytes build/openrpc/miner.json.gz | Bin 16043 -> 16043 bytes build/openrpc/worker.json.gz | Bin 5221 -> 5221 bytes build/version.go | 2 +- documentation/en/cli-lotus-miner.md | 2 +- documentation/en/cli-lotus-worker.md | 2 +- documentation/en/cli-lotus.md | 2 +- 8 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index acf4fb80f258800544f3a0b31b0fd6b00ecce16d..8956d2d32c811736a98d66b056e9b44941abfb4e 100644 GIT binary patch delta 24 gcmeBdVd`vQn$XUaePLr~MI#6A!(T^cuV-Tb0D>+GssI20 delta 24 gcmeBdVd`vQn$XU)`u@hwibjs^bHcZ0uV-Tb0EILPlmGw# diff --git a/build/openrpc/gateway.json.gz b/build/openrpc/gateway.json.gz index bae9a6a79b0245962fcf82e4f79d013a96bf1865..ff28b65dd16932a4e62e26e5de7c091a58a9595b 100644 GIT binary patch delta 9219 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 Z4-Pf;;o--_{|f*B|NoB@nVf|E0RSdS9m@a! delta 9203 zcmVth+wNNtXvq-!f1@3n}KzL48?_x3%y{*K=GhC zeoNYnkToHn&B6*W3>SJHG!zs;+fgpCf`WC(B zWgs13=#Md*n;7Z-+qVwT@1PNlf>#cFtpLkVfb!XIHGc)()ZaI_1T)8kWNY5}`v%6V z{^%FbA<*tUW4gD}fVPK6ns*0h&QE*!uQOlSGw0`MHioOQHW(vqzS^75;h?`5s1H9n zsy~=I{HA)?Mb%@|xzL-N*xzXSjoy?~ zOy+gLXManq@!0gD9{%sYLt-BEJL;{i4%KnD*VhJWNB!X1GxqnTZRwCS{2Q2ae}-MP zqn-or6Ph8c4iAGLA0RvdPW&CJk_oLOyOVe z->V(<HIsk`uAh~*WPT=pU&(%d_OXl zcVId2)CYfSZ=mknCDu)U_=CKFE$FB>Xkr1v8-A;|0fzQF>M6h=Z}f-8zrYDH8YD6w zA~1}Ay#e#ewH@eU~A823pKh@ zoPUZLuQi{I0%l8F)87wCBoiGe#7CZSC;{*^4RQOoI)erZIME1Mz+IhLx^4KJ(MJRi z?hX9bv^(XQ4}=g!S3+r0xLe2os+aYU)15v5t_xNHl^>l2j$Bu1~57DJXzaL{8S-p5Q^934d2}n}=B4q)qtL&75bxGE6L%Q(MpBTjvN* z=Oe|1GaEz2MAn_!QRl9y4%I2fjyHVwZW1)v(e2s0F}42QIz(Oak?%&PJ$g3- z9)|8a;GlPoYcE&-{{&h)6Z`-BH0Wx({+fzy$a82x57o9FY4;qv(YF=-o%D8Yk$-ao zF^{Q8p*3nG#xvZuX_#w)uv?NfKvHjc><=Owt+{D-)WCj;etm>!GR5k!TdCYVD~uoP zm1BG;18ZVD?atvTAs>^r=Rtqkv{Cerrz^c9kFNr@+dGm#*dpc>zvkgiFTfQbW;sh; zTI$m7^HVc-_sfOu6>y=2*FCF9LVu|i!QXxeNZ%yzd?EbCg7-1h*L4JPW(`si~cArNue$zIgtW4?F7F!vC<>wvC&Tm-XdGaxP-LJzhMg z^+$Gqr*XKIwd}GNAXfGdtHcVP))yvtS|mbPAMzh?)lr;&`WX=~A0aSKroiGgkMOiy zl*I6A3Xot;{u=x_w@GxQwttV8^E9GnXVh0m^QPFf2HM^JM4MYKG=A-mm)2nNb63+0 z%^qm@U#su*k+WP*-Gx3~Ks8`K8#n@pH?1!>Z9P#KQ%{}%OuXgV$6J=+DvQ9>3QR6) zCsZC9)fZUN`D|Jm(a}Y`YA--g9CphEMZsYqr>G#kIfX@?LtE0a(SJj$XwGf3AtX-| zK2DNH-5cW^y>5?(a~zE^bm~3JYF@yIzuRr!8gOP zH^4NRWl4@HIi}>8&wra^_O%j@`4M=3j(*l+lca0)nb^p-%}TyUfaNngvX!FjE}CB3 z%u#uy)v_ZkA3-xaOCMHq9DgKcHhw<{tS8Phv_ToqfWWB7F(5FSNILN0G^ZEQS;<6$ z7aJw($i}nkod86Jkz$3 zg;Wh&rWz6y%Q@SnkE z+g|T&zkl03820;(4-XA(Y>c#Ve-~=qLtXFh4aWUJcQoqm?G3tGPfZ33#s8|~TF>~= ze{|FtSY8mI{ccB{A&dEy4hDK&@j?A=L442|o(5LWW&YMyQzFwlpBP!p`GPFGH>jXQ z24V>@W`DtoQetxEZ6L<%nlc|Gx5;KsqWql*I;6i=WGLkca|r(yNhST&3h6w&0j?KxPS@ zvMEjSIjM&If)FO3)lLDjE`(3l;+_qugcRCF)xmhiQWbm=s-RX7h;oLfXC6i~fZ;i) za zOkmYR^QbeAVH+L17an?W(LyxlW~qT)THB96L{8v^4&XPTlZc$UKSPJMWMylyvi*Vp zVM?;T!gRd)2t463SQ!93EX{8h@UxL^r=4~IC=O;8kI2i=f-wCW{4BAyw(~Ul4Y_DQ z+uu9v>SL(y>Alf-plhSU{=tF14}W%z{R0gi9_(v9c-S3v!9efr@9TY_?GN;Qa5(7i zYrDH}(~M5*vy9IF)i|TuPC{5EccU2-CCrUKr$U|jC@^f|`v&+2E&Q=Th~5-vUo1VC zY%>sN$bzn@Puar&LsH1GnOR^LSRT;*Z|5}$*QI4#n}liF6YtoxsqenK?|-8n8jq1a zH}NX+B48T>^ECUM5-a18r{$vK2c&dm2nWrehr!H=p1>t`!71aa_dnvYNi4HSY3l%b z@=w-1LXQqS^b5vwX1->as5GZo+YIYm*ViKEonSvNk6(oOLYqDjnF!sAF%hYYN;u)> zP9ll~RJ=Hb(l))1lnp-SxqnMU#E-e5+(5)kdGh););Q%$H`qG=KA@nJ>+JY355a zUz+*S%$H`qH1nmIFU|Z%H}emRi}`x2C-&UJYX>9b1LO@(sFO%kKJrF$iz*l0 zwuo;Tu^=-_+Qz1|UU6}kVgg&+J6QyhhgDH-(I~UpLdh78rMH=3wVAdg>v$B_(J!ut za}LR^ueCUY-?Nz*aet1&ICQ*C*2amK)W$Ol85{mIW5Z>!lWp@mt+?39Im923iJ?pG zNUc-(Aq|3u1CkCGr>~V)Z?ey?1N^Dxe~Domxr`uxIc-*N!kv^hS>-iHMTnNY`pKTG#k>6e+h$z;n179PExHiNvLwrrEbGx& z)^2gRlXHmcGpjN-m4gB|4%FA~h z(&-gZg7GNPm|Hj|s}4L!{|+u3di+y$=5s|gN~nb!oWPd7BVQ(OciVCr*%W7$;^-NP zqrH;)FA#r*o__}>@B|shE5^xR|46q4AeZo>XS#3bRZP`Vs${?hg;)8qS}oJ$sVx_O zi|_tQ?WMdF>=7>oYb#gXFD*E9gKZZ~;F0kC_o?op2TD2TNRGDFF;g^^4WBi!OAZg5 z{K>b8tI9(songy{|`#5G%*_D@qg+#G<}aOVhbdIc zsWLF>c3CYM%ICu=E^e1KWJTppv^`=$YUH&gN}EHTs@U{xmhv;Nd3=sKy`&^c|BF)V z{9jEbn=)Rz1_9DQ%$&?V!XCpH+qtqJc`E_+1(69L%bDXiBa*$`UN)<({}Bn%zm`pLVs$rnlEh?X{$(EMcOLTR*|-fv{j_7 zB5jqYX{!vnrNu51T6Fz*s0U`PpPtk)OJ!hZj@qAnFZF(@_e;HB z>itshmwLa{`=#Fh)b##-Y4xadsiU>k{s2lNrD1sMMWqMdbcv{(#kT!`LB{VsnW8bW z5P#N2xS&>A2rHH2biB$-jS=O95u_q+NK;B!$0GNw2ga8N)%>q zEQ)1WTk0*3>lmlf(3`&wDCxr8iUWB&et%-O!7GV84DdX5Ci@)61v(B5C&8KN^V!@4 z7%kv=>N2AAt+5fhYYPm-8d zh>{y3fh}NqtU5(MMebC3s{ZpdaXhBmF^AN+E||*Fov3%Q6(wST3p zulA{ui?Nk!%wl%SbtDn;>ZtZpc%x)R@ux>Wbj%2gN1a@aGmnS7vzzS4+}5>i?xSCL z6slf)w??(*kn3q;AODHlb2|syEv~KmIqyVR+<%b=CdYk|E=_|b7gm+KA`digjhXP7>DvnyyDP0Gm9P0+<|x3~t- z4YZ7FaL+L88l;g0!V?ljDpMzEh9j^vI~XU?1R+?0B$KK&YjOu-+vUFn=h{zWZW%Yp5km zZyw4|=?R?l@0DvK^=RK~vC<(0uB843seiX1b?h8?XC6i~fFZqbutwZfE|9__Zi3dd zVNiPD4gGNgE#t<4dT@srX?Ba88;JjatJlh_bkAazkvpMAGRumV+SVJyl6%H^>>c`$ zhl74cy|vY$I_~!R+EhU8s2@mHQS|$glwk22{vDQ#QakE7@IIj#!s_ra`0)Y46X3)z zuUt4o^BH~cIasnf>~&OXU=7v(T4wiuH^)=m`p*>p_5QuuQBN*T{i!C?ZAX*r0xf^w z>H7zoW+0ZFz^uDQSGs>Z;iT+_ijEZSJs&Z}Mf1f{eC(^5<>N z|H40_Ia1+J!l)I_YI89Zy**Zk@PB_b6C+W28(&H?ab7arNST06hW$C3H^r_s(C+pp z+T3!X@oRs)v<8!(yP9Tb_CUk`T79RFoaJ)rF7)XFs@3;hHx^iukv~#AN%17bQ@g}d zOKq0Df^3n`j%}Og5R>mMXsaYT7uhH@+H!|x*S=O>%`0Oa5`gnv69P{zD9@iWhlx0r7>#$wQaZUGki1vx4Kl3vZlOO;0*E8GM(XktNw>IbitSG3qv zB_aBtOAao>vR}dkNvGU4V$9nuUPFSm9=-_0s-yaQ1jtVRR&N6$?RV5uQkEk#`om-D zbpwxdUEuTJQStGaVgkpB1C zLz8oej}`!#U}VB$V1ha}NIn=&Ya}=_$)1joC)Jtk1%sC;ODtqDjj3>*Z7kN@I)kRv zZ7iLT{Jft<;DU`5s!;Hv>J#i979@{R>ZTb{HF+TIy&miP_T!BYjtPHa=U{+z2;`J&FU51k98e z8gGfcjD?g=xhA%MwFxO=nLZVBGtd008GYVT*|yg$NT{T|`)}y^6Rs!PNar;qTR|9< zprTKvu|f4dT4!5hprn6{dk!*AhGa-V<_c0%qtCCPvT=1};8xY<;Q@ zd);2Q*HOP%rmf$d&Rsx;3LXm{3#P{sH3rye@z^WrIls6_q`iNBK|=Q>#GjCdp;f~H z#`evxwNjNB#X@K(Eh;ssHk411$vhc!926w;UiwnCR{5W}XFe(t??VMLmX`SWu6|bq zF|l1`e4<+_ANlgiwj$+jL4N5C1{facx;?k3P9lVvsqX8k!kJdZ_?#NIL=R2}i;7@* zc6Cw-mP+vUl;D5tmu>r(Zz=cNE6A@62>b+?Srvwd@A(}C@@R8XW-qLTtzQS9y^`Dc zqcxHw%g()x{7hyY$*dz8XZqM#M^c72lw!&7_$;eSzT`>>@FpiDYqyc@^x?gj?4;K2_N9+S2DPySp$m)6Tbw#B^oj4bG0K?|68#Xh=4;Rn5jT@6FtqTbIm1y?3Xm;i+myx`pPL7TmyN&m{(SHOfr@)<1o^#3iSfakBtp{&? zZ94n*6S9AxI_&kej{0G4=?Q-fZ4`v7OoBD*wV+QI^zni|$2c|5;6}GVGrF0N zbYPkhkCezJk!=geM(&CcT(Y1hFLJaKO(f?Ql`K>l41ok!v9H zMqcDk7vo zEe-1R6E|ZSEPzi*$y=Jon8V6LQO}7Q{Fk7IibJiBmYdZY3Coy)7T=bY#Q)GT64=&+ zl~aS{!krSOpvZI+`;tjZOL*AGC=>0OXZnf42yH;oevG+TGvqx@?EV~Iy)RBTLZlU=gkW@B}(dR?u4rK_^z zpDl&=$&8X_PN4D#F0-Kpjkr#vP;_hnmgIi~K)8Z!E!DTS`uI#l(Lq7kH_9M&+knxH zNOeR{3_v8V&u4K&551hv0(tZ8$7qFp88pZdJ;-P4W1z#|4;&IFo>Ft6FsX&IqQjqa ztHej^0=~-RL;@2wC*~TEaajRFaF%a_Ge<17gNNf8WvgOJk;gCc7^afh$K*Q>0at%4 z&Dhg|XChM$3u77ETWB}lTS-NNRB34 zsXw3mQZIRw_Rx9MOrX(62pSAYV}db~8Ji(m57qDUZdcRc%)zVRpHS51h(L+j9kug1 z)9yMxM_;(JV!gP1yU)xd+V2)rLkoYH_b24x;KZb!K@@i{5@A_!_3ejfQd2xiY3;MM z)0z^iXL&9inUzVES*px3d-BO~y?#MarGUIY1NRQ%nx(e05Y{ZF#Dc2ieu;n9Wu=tZ zcH#^$y*|kWB^TUcA*E9KOuyxE9h`Z(Yu{6o{FANU(F`L&3p@lPYDb47zUZ^ReXXG8 z5yNqAu=zU07VfgJ13G`RDWVYKZ^IKv zO24z{AS~{RdA%7N<%(*Ka8r1SIe53}GLQLWP$NE?q1q_%ER4*{Pv8iNMgT{%WW=?` z3{`UVVkncReTruyek57dvJCtF%D%x@u5FLWrIrVgLANl0r43PLDL4^&Fng)sUS^- zZF-iANig}2Gr=$HF#N4vgZtwZhV*x!asD+2Cc>*D<7fOdtn*N#-$&qmMizY(=%He2 zXrh0fh)pg?0CHx+!X+~jo3OsLO>XhiUCDEkkNaf>#|iqm_5xXxQwR(bSv4bPasaI< zGXoeq{EmON)aXr1&&=AS9F=l(i*ht3hpZe;yyMEbnY%8uaN0NKBHIYgJfde8mI0T< z5A~-5V;|0mX?rmKH3g;#tx5bO@FSeeu{|C~&%OqxQ7}kIM%2ail^RVxg^>oyP7!=! zVimmnWZQQmpx-4YaSC-45EC>pA3;gZERoAALiT@$t7+m}@bpM*E_a8Vjo|4^F@UEj z!4R$kPZrg0H7WEsd`qCduLZepbSZ{IpVzk^0JioaQ}6<`?(P=ffUDe$H{NsYFd&)-04z-+O? zBsDgo$#W-p?j+Bhc-K`FVKG5N)D_^*{$M^_gd zVfNLb^)VcwX!>|=ZO9~v7m?ZH#48?&5?!NDNkv%%*YS5)NW-4iI~a63>al6-cc;(< zD|I;Ni+XYyfIRfh4#t03>@fmfK>W{y@b(KzvU~-mS^I*9L}yMX)obMy@lzb5$%Tc> zNHYPxgg{w%LL{1=f7?=BTIYVs<1Fm%7r3ONm(qWdrptqZQV?I^NFxr?nxZiSAYVul zepgC`X+Zgu_+9<33ejH9{MsNWsQ^gtcJ!D7g%eWonPpfW9BLEl!^4k<{}%uN|Nq{l Jr6+{_0RZ8i_zM64 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index be588eccd3e652a06e6545ca11925ca275713d2a..85314e30bad4580888ef93f6e4cd00f10a638421 100644 GIT binary patch delta 21 dcmZ2oySjElE91nCZL)S8a$T1LK1wq)003#j2y6fV delta 21 dcmZ2oySjElE91hAZL)S8-=~Bye3WKp003<#2#^2( diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 1f10d091011e00ff878bf3e9976e387f7945eb3f..ed5b806127ca03c71764a9d182922130aa81c381 100644 GIT binary patch delta 21 dcmaE=@l<0%3!~@8)*HecN9`WTt<+;=003$o2z>wm delta 21 dcmaE=@l<0%3!~S@)*HecnRD0juhe5?003xP2t5D* diff --git a/build/version.go b/build/version.go index fcf02d27b..e36a2798a 100644 --- a/build/version.go +++ b/build/version.go @@ -37,7 +37,7 @@ func BuildTypeString() string { } // BuildVersion is the local build version -const BuildVersion = "1.20.2" +const BuildVersion = "1.20.3" func UserVersion() string { if os.Getenv("LOTUS_VERSION_IGNORE_COMMIT") == "1" { diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 782441813..80fca3ce3 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -7,7 +7,7 @@ USAGE: lotus-miner [global options] command [command options] [arguments...] VERSION: - 1.20.2 + 1.20.3 COMMANDS: init Initialize a lotus miner repo diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index bf1fa68b0..a792a213d 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -7,7 +7,7 @@ USAGE: lotus-worker [global options] command [command options] [arguments...] VERSION: - 1.20.2 + 1.20.3 COMMANDS: run Start lotus worker diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index e9ff4a6ee..e3d7f19d7 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -7,7 +7,7 @@ USAGE: lotus [global options] command [command options] [arguments...] VERSION: - 1.20.2 + 1.20.3 COMMANDS: daemon Start a lotus daemon process