From 74a9dfc99f4480ce86e73e9747d7bc681e897580 Mon Sep 17 00:00:00 2001 From: mitchellsoo Date: Sat, 18 Jul 2020 14:21:02 +0800 Subject: [PATCH 001/239] Add script to generate lotus cli document. Generate lotus command lines documents as text and markdown in folder "lotus/documentation/en". --- scripts/generate-lotus-cli.py | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 scripts/generate-lotus-cli.py diff --git a/scripts/generate-lotus-cli.py b/scripts/generate-lotus-cli.py new file mode 100644 index 000000000..8fb27026b --- /dev/null +++ b/scripts/generate-lotus-cli.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python +# Generate lotus command lines documents as text and markdown in folder "lotus/documentation/en". +# Python 2.7 + +import os + + +def generate_lotus_cli(): + output_folder = '../documentation/en' + txt_file = open('%s/lotus-cli.txt' % output_folder, 'w') # set the name of txt output + md_file = open('%s/lotus-cli.md' % output_folder, 'w') # set the name of md output + + def get_cmd_recursively(cur_cmd): + txt_file.writelines('\n\n%s\n' % cur_cmd[2:]) + md_file.writelines('#' * cur_cmd.count(' ') + '# ' + cur_cmd[2:] + '\n') + + cmd_flag = False + + cmd_help_output = os.popen('cd ..' + ' && ' + cur_cmd + ' -h') + cmd_help_output_lines = cmd_help_output.readlines() + + txt_file.writelines(cmd_help_output_lines) + md_file.writelines('```\n') + md_file.writelines(cmd_help_output_lines) + md_file.writelines('```\n') + + for line in cmd_help_output_lines: + try: + line = line.strip() + if line == 'COMMANDS:': + cmd_flag = True + if cmd_flag is True and line == '': + cmd_flag = False + if cmd_flag is True and line[-1] != ':' and 'help, h' not in line: + gap_pos = 0 + sub_cmd = line + if ' ' in line: + gap_pos = sub_cmd.index(' ') + if gap_pos: + sub_cmd = cur_cmd + ' ' + sub_cmd[:gap_pos] + get_cmd_recursively(sub_cmd) + except Exception as e: + print('Fail to deal with "%s" with error:\n%s' % (line, e)) + + get_cmd_recursively('./lotus') + txt_file.close() + md_file.close() + + +if __name__ == "__main__": + generate_lotus_cli() From 526cd739f671cbe0a39d928090bee6a5d9cffa45 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 20 Nov 2020 00:31:04 -0500 Subject: [PATCH 002/239] Return total power when GetPowerRaw doesn't find miner claim --- chain/stmgr/utils.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/chain/stmgr/utils.go b/chain/stmgr/utils.go index fb0b91378..5979bf705 100644 --- a/chain/stmgr/utils.go +++ b/chain/stmgr/utils.go @@ -103,8 +103,7 @@ func GetPowerRaw(ctx context.Context, sm *StateManager, st cid.Cid, maddr addres var found bool mpow, found, err = pas.MinerPower(maddr) if err != nil || !found { - // TODO: return an error when not found? - return power.Claim{}, power.Claim{}, false, err + return power.Claim{}, tpow, false, err } minpow, err = pas.MinerNominalPowerMeetsConsensusMinimum(maddr) From 7d3e4c5d011c36d2ed8954b511ed24e499e8f4a6 Mon Sep 17 00:00:00 2001 From: zgfzgf <1901989065@qq.com> Date: Wed, 2 Dec 2020 12:36:05 +0800 Subject: [PATCH 003/239] feat election error miner-power to network-power --- cmd/lotus-shed/election.go | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/cmd/lotus-shed/election.go b/cmd/lotus-shed/election.go index ffe30d163..000df0c62 100644 --- a/cmd/lotus-shed/election.go +++ b/cmd/lotus-shed/election.go @@ -13,7 +13,7 @@ import ( var electionCmd = &cli.Command{ Name: "election", - Usage: "commands related to leader election", + Usage: "Commands related to leader election", Subcommands: []*cli.Command{ electionRunDummy, }, @@ -21,16 +21,19 @@ var electionCmd = &cli.Command{ var electionRunDummy = &cli.Command{ Name: "run-dummy", - Usage: "runs dummy elections with given power", + Usage: "Runs dummy elections with given power", Flags: []cli.Flag{ &cli.StringFlag{ - Name: "network-power", + Name: "network-power", + Usage: "network storage power", }, &cli.StringFlag{ - Name: "miner-power", + Name: "miner-power", + Usage: "miner storage power", }, &cli.Uint64Flag{ Name: "seed", + Usage: "rand number", Value: 0, }, }, @@ -42,7 +45,7 @@ var electionRunDummy = &cli.Command{ } networkPow, err := types.BigFromString(cctx.String("network-power")) if err != nil { - return xerrors.Errorf("decoding miner-power: %w", err) + return xerrors.Errorf("decoding network-power: %w", err) } ep := &types.ElectionProof{} From 7c8ab6977a38a25cef67e7eca8b9e3e2137eee96 Mon Sep 17 00:00:00 2001 From: zgfzgf <1901989065@qq.com> Date: Wed, 2 Dec 2020 12:57:57 +0800 Subject: [PATCH 004/239] add estimate command --- cmd/lotus-shed/election.go | 53 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/cmd/lotus-shed/election.go b/cmd/lotus-shed/election.go index 000df0c62..c844203d6 100644 --- a/cmd/lotus-shed/election.go +++ b/cmd/lotus-shed/election.go @@ -7,6 +7,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" lcli "github.com/filecoin-project/lotus/cli" + builtin2 "github.com/filecoin-project/specs-actors/v2/actors/builtin" "github.com/urfave/cli/v2" "golang.org/x/xerrors" ) @@ -16,6 +17,7 @@ var electionCmd = &cli.Command{ Usage: "Commands related to leader election", Subcommands: []*cli.Command{ electionRunDummy, + electionEstimate, }, } @@ -71,3 +73,54 @@ var electionRunDummy = &cli.Command{ } }, } + +var electionEstimate = &cli.Command{ + Name: "estimate", + Usage: "Estimate elections with given power", + Flags: []cli.Flag{ + &cli.StringFlag{ + Name: "network-power", + Usage: "network storage power", + }, + &cli.StringFlag{ + Name: "miner-power", + Usage: "miner storage power", + }, + &cli.Uint64Flag{ + Name: "seed", + Usage: "rand number", + Value: 0, + }, + }, + Action: func(cctx *cli.Context) error { + minerPow, err := types.BigFromString(cctx.String("miner-power")) + if err != nil { + return xerrors.Errorf("decoding miner-power: %w", err) + } + networkPow, err := types.BigFromString(cctx.String("network-power")) + if err != nil { + return xerrors.Errorf("decoding network-power: %w", err) + } + + ep := &types.ElectionProof{} + ep.VRFProof = make([]byte, 32) + seed := cctx.Uint64("seed") + if seed == 0 { + seed = rand.Uint64() + } + binary.BigEndian.PutUint64(ep.VRFProof, seed) + + winYear := int64(0) + for i := 0; i < builtin2.EpochsInYear; i++ { + binary.BigEndian.PutUint64(ep.VRFProof[8:], uint64(i)) + j := ep.ComputeWinCount(minerPow, networkPow) + winYear += j + } + winHour := winYear * builtin2.EpochsInHour / builtin2.EpochsInYear + winDay := winYear * builtin2.EpochsInDay / builtin2.EpochsInYear + winMonth := winYear * builtin2.EpochsInDay * 30 / builtin2.EpochsInYear + fmt.Println("winInHour, winInDay, winInMonth, winInYear") + fmt.Printf("%d, %d, %d, %d\n", winHour, winDay, winMonth, winYear) + return nil + }, +} From 5b235db3663a78c9c936631d2e2cd4738e042a1e Mon Sep 17 00:00:00 2001 From: 15ho Date: Tue, 29 Dec 2020 10:07:28 +0800 Subject: [PATCH 005/239] fix: stores.FetchHandler: defer close file and increase buffer size --- extern/sector-storage/stores/http_handler.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/extern/sector-storage/stores/http_handler.go b/extern/sector-storage/stores/http_handler.go index a4c0480d4..9e927cb06 100644 --- a/extern/sector-storage/stores/http_handler.go +++ b/extern/sector-storage/stores/http_handler.go @@ -116,9 +116,12 @@ func (handler *FetchHandler) remoteGetSector(w http.ResponseWriter, r *http.Requ w.WriteHeader(500) return } + if !stat.IsDir() { + defer rd.(*os.File).Close() + } w.WriteHeader(200) - if _, err := io.Copy(w, rd); err != nil { // TODO: default 32k buf may be too small + if _, err := io.CopyBuffer(w, rd, make([]byte, CopyBuf)); err != nil { log.Errorf("%+v", err) return } From 7e0a2ca46e6a1ac22ef628f91160ead7b282b885 Mon Sep 17 00:00:00 2001 From: Frank Date: Wed, 30 Dec 2020 16:02:53 +0800 Subject: [PATCH 006/239] use deal duration from actor --- build/params_shared_vals.go | 4 ++-- build/params_testground.go | 4 ++-- chain/actors/policy/policy.go | 4 ++++ cli/client.go | 3 +++ 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/build/params_shared_vals.go b/build/params_shared_vals.go index 994c32934..2b5a2e85c 100644 --- a/build/params_shared_vals.go +++ b/build/params_shared_vals.go @@ -118,5 +118,5 @@ const PackingEfficiencyNum = 4 const PackingEfficiencyDenom = 5 // Actor consts -// TODO: Pull from actors when its made not private -var MinDealDuration = abi.ChainEpoch(180 * builtin2.EpochsInDay) +// TODO: pieceSize unused from actors +var MinDealDuration, MaxDealDuration = policy.DealDurationBounds(0) diff --git a/build/params_testground.go b/build/params_testground.go index d0e54e3f2..44dcf963d 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -72,8 +72,8 @@ var ( }() // Actor consts - // TODO: Pull from actors when its made not private - MinDealDuration = abi.ChainEpoch(180 * builtin2.EpochsInDay) + // TODO: pieceSize unused from actors + MinDealDuration, MaxDealDuration = policy.DealDurationBounds(0) PackingEfficiencyNum int64 = 4 PackingEfficiencyDenom int64 = 5 diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index 31d83cd3d..245873f2b 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -108,6 +108,10 @@ func DealProviderCollateralBounds( } } +func DealDurationBounds(pieceSize abi.PaddedPieceSize) (min, max abi.ChainEpoch) { + return market2.DealDurationBounds(pieceSize) +} + // Sets the challenge window and scales the proving period to match (such that // there are always 48 challenge windows in a proving period). func SetWPoStChallengeWindow(period abi.ChainEpoch) { diff --git a/cli/client.go b/cli/client.go index 129ede94b..ef4d4fc26 100644 --- a/cli/client.go +++ b/cli/client.go @@ -387,6 +387,9 @@ var clientDealCmd = &cli.Command{ if abi.ChainEpoch(dur) < build.MinDealDuration { return xerrors.Errorf("minimum deal duration is %d blocks", build.MinDealDuration) } + if abi.ChainEpoch(dur) > build.MaxDealDuration { + return xerrors.Errorf("maximum deal duration is %d blocks", build.MaxDealDuration) + } var a address.Address if from := cctx.String("from"); from != "" { From 0e2e1125d310f9557240c662807932e5f2a8d979 Mon Sep 17 00:00:00 2001 From: He Weidong Date: Thu, 4 Feb 2021 16:42:02 +0800 Subject: [PATCH 007/239] fix precommit ticket expiration handling --- chain/actors/policy/policy.go | 7 ++++--- extern/storage-sealing/checks.go | 10 ++-------- extern/storage-sealing/states_sealing.go | 3 +-- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/chain/actors/policy/policy.go b/chain/actors/policy/policy.go index e32b36743..0a4829bb8 100644 --- a/chain/actors/policy/policy.go +++ b/chain/actors/policy/policy.go @@ -25,9 +25,10 @@ import ( ) const ( - ChainFinality = miner3.ChainFinality - SealRandomnessLookback = ChainFinality - PaychSettleDelay = paych3.SettleDelay + ChainFinality = miner3.ChainFinality + SealRandomnessLookback = ChainFinality + PaychSettleDelay = paych3.SettleDelay + MaxPreCommitRandomnessLookback = builtin3.EpochsInDay + SealRandomnessLookback ) // SetSupportedProofTypes sets supported proof types, across all actor versions. diff --git a/extern/storage-sealing/checks.go b/extern/storage-sealing/checks.go index db2e87d0e..5ee39e58f 100644 --- a/extern/storage-sealing/checks.go +++ b/extern/storage-sealing/checks.go @@ -4,7 +4,6 @@ import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors" "github.com/filecoin-project/lotus/chain/actors/policy" proof2 "github.com/filecoin-project/specs-actors/v2/actors/runtime/proof" @@ -94,14 +93,9 @@ func checkPrecommit(ctx context.Context, maddr address.Address, si SectorInfo, t return &ErrBadCommD{xerrors.Errorf("on chain CommD differs from sector: %s != %s", commD, si.CommD)} } - nv, err := api.StateNetworkVersion(ctx, tok) - if err != nil { - return &ErrApi{xerrors.Errorf("calling StateNetworkVersion: %w", err)} - } + ticketEarliest := height - policy.MaxPreCommitRandomnessLookback - msd := policy.GetMaxProveCommitDuration(actors.VersionForNetwork(nv), si.SectorType) - - if height-(si.TicketEpoch+policy.SealRandomnessLookback) > msd { + if si.TicketEpoch < ticketEarliest { return &ErrExpiredTicket{xerrors.Errorf("ticket expired: seal height: %d, head: %d", si.TicketEpoch+policy.SealRandomnessLookback, height)} } diff --git a/extern/storage-sealing/states_sealing.go b/extern/storage-sealing/states_sealing.go index 1aedcdfb4..60dae68d9 100644 --- a/extern/storage-sealing/states_sealing.go +++ b/extern/storage-sealing/states_sealing.go @@ -12,7 +12,6 @@ import ( "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/exitcode" "github.com/filecoin-project/go-statemachine" - builtin0 "github.com/filecoin-project/specs-actors/actors/builtin" "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" @@ -22,7 +21,7 @@ import ( ) var DealSectorPriority = 1024 -var MaxTicketAge = abi.ChainEpoch(builtin0.EpochsInDay * 2) +var MaxTicketAge = policy.MaxPreCommitRandomnessLookback func (m *Sealing) handlePacking(ctx statemachine.Context, sector SectorInfo) error { log.Infow("performing filling up rest of the sector...", "sector", sector.SectorNumber) From 84803f82ab90862e3e3c0a23e657d4227017d3b1 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 4 Mar 2021 16:56:49 +0100 Subject: [PATCH 008/239] feat: show deals CLI command --- api/api_full.go | 1 + cli/client.go | 19 +++ cli/deal/showdeals.go | 271 ++++++++++++++++++++++++++++++++++++++++++ go.mod | 6 +- go.sum | 30 ++--- 5 files changed, 305 insertions(+), 22 deletions(-) create mode 100644 cli/deal/showdeals.go diff --git a/api/api_full.go b/api/api_full.go index ca3a02c74..b56a42aa2 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -605,6 +605,7 @@ type DealInfo struct { ProposalCid cid.Cid State storagemarket.StorageDealStatus Message string // more information about deal state, particularly errors + DealStages storagemarket.DealStages Provider address.Address DataRef *storagemarket.DataRef diff --git a/cli/client.go b/cli/client.go index 98f4b0229..ecb5d4947 100644 --- a/cli/client.go +++ b/cli/client.go @@ -44,6 +44,7 @@ import ( "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/market" "github.com/filecoin-project/lotus/chain/types" + dealcli "github.com/filecoin-project/lotus/cli/deal" "github.com/filecoin-project/lotus/lib/tablewriter" ) @@ -83,6 +84,7 @@ var clientCmd = &cli.Command{ WithCategory("storage", clientGetDealCmd), WithCategory("storage", clientListAsksCmd), WithCategory("storage", clientDealStatsCmd), + WithCategory("storage", clientShowDealsCmd), WithCategory("data", clientImportCmd), WithCategory("data", clientDropCmd), WithCategory("data", clientLocalCmd), @@ -1114,6 +1116,23 @@ var clientRetrieveCmd = &cli.Command{ }, } +var clientShowDealsCmd = &cli.Command{ + Name: "show-deals", + Usage: "Show storage deals", + Action: func(cctx *cli.Context) error { + //api, closer, err := GetFullNodeAPI(cctx) + //if err != nil { + // return err + //} + //defer closer() + var api api.FullNode + + ctx := ReqContext(cctx) + //afmt := NewAppFmt(cctx.App) + return dealcli.ShowDealsCmd(ctx, api) + }, +} + var clientDealStatsCmd = &cli.Command{ Name: "deal-stats", Usage: "Print statistics about local storage deals", diff --git a/cli/deal/showdeals.go b/cli/deal/showdeals.go new file mode 100644 index 000000000..bea986286 --- /dev/null +++ b/cli/deal/showdeals.go @@ -0,0 +1,271 @@ +package deal + +import ( + "context" + "fmt" + "io" + "time" + + tm "github.com/buger/goterm" + "github.com/fatih/color" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-state-types/abi" + lapi "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/lib/tablewriter" + "github.com/ipfs/go-cid" + term "github.com/nsf/termbox-go" +) + +var mockDealInfos []lapi.DealInfo + +func init() { + dummyCid, err := cid.Parse("bafkqaaa") + if err != nil { + panic(err) + } + + mockDealStages := storagemarket.DealStages{ + At: time.Now(), + Stages: []storagemarket.DealStage{{ + Name: "Reserving Funds", + ExpectedDuration: "5 epochs", + StartedAt: time.Now().Add(-5 * time.Minute), + Logs: []string{ + "Sending AddBalance message for 0.3FIL", + "Waiting 5 epochs (2:30) for confirmation", + "Funds for deal reserved successfully", + }, + }, { + Name: "Sending Deal Proposal to Provider", + ExpectedDuration: "5 epochs", + StartedAt: time.Now().Add(-2 * time.Minute), + Logs: []string{ + "Proposal: 512MB for 300 days @ 0.1FIL / GB / epoch", + "Deal proposal accepted by provider", + "Funds for deal reserved successfully", + }, + }, { + Name: "Sending deal data to Provider", + ExpectedDuration: "13 minutes", + StartedAt: time.Now().Add(-53 * time.Second), + Logs: []string{ + "Progress: 4:02 254MB / 1024MB (1MB / sec)", + "Connection to Provider f01234 disconnected, retrying in 8s", + }, + }, { + Name: "Waiting for deal to be published by Provider", + ExpectedDuration: "several hours", + }, { + Name: "Waiting for pre-commit message from Provider", + ExpectedDuration: "several hours", + }, { + Name: "Waiting for prove-commit message from Provider", + ExpectedDuration: "several hours", + }}, + } + + mockDealInfos = []lapi.DealInfo{{ + State: 3, + Message: "Reserving Client Funds", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 512 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(10), + Duration: 300, + DealID: 10, + CreationTime: time.Now().Add(-5 * time.Second), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 5, + Message: "Publishing Deal", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 482 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(12), + Duration: 323, + DealID: 14, + CreationTime: time.Now().Add(-23 * time.Minute), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 7, + Message: "Waiting for Pre-Commit", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 2 * 1024 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(8), + Duration: 298, + DealID: 8, + CreationTime: time.Now().Add(-3 * time.Hour), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }, { + State: 2, + Message: "Transferring Data", + DealStages: mockDealStages, + Provider: address.TestAddress, + DataRef: nil, + PieceCID: dummyCid, + Size: 23 * 1024 * 1024, + PricePerEpoch: abi.NewTokenAmount(11), + Duration: 328, + DealID: 3, + CreationTime: time.Now().Add(-49 * time.Hour), + Verified: false, + TransferChannelID: nil, + DataTransfer: nil, + }} +} + +func ShowDealsCmd(ctx context.Context, api lapi.FullNode) error { + ctx, cancel := context.WithCancel(ctx) + defer cancel() + + //localDeals, err := api.ClientListDeals(ctx) + //if err != nil { + // return err + //} + localDeals := mockDealInfos + + return showDealsUX(ctx, localDeals) +} + +func showDealsUX(ctx context.Context, deals []lapi.DealInfo) error { + err := term.Init() + if err != nil { + return err + } + defer term.Close() + + renderer := dealRenderer{out: tm.Screen} + + dealIdx := -1 + state := "main" + highlighted := -1 + for { + if err := ctx.Err(); err != nil { + return err + } + + switch state { + case "main": + renderMain := func(hlite int) error { + tm.Clear() + tm.MoveCursor(1, 1) + err := renderer.renderDeals(deals, hlite) + if err != nil { + return err + } + tm.Flush() + return nil + } + err := renderMain(highlighted) + if err != nil { + return err + } + + switch ev := term.PollEvent(); ev.Type { + case term.EventKey: + switch { + case ev.Ch == 'q', ev.Key == term.KeyEsc: + return nil + case ev.Key == term.KeyArrowUp: + term.Sync() + if highlighted > 0 { + highlighted-- + } + case ev.Key == term.KeyArrowDown: + term.Sync() + highlighted++ + case ev.Key == term.KeyEnter: + term.Sync() + dealIdx = highlighted + state = "deal" + } + case term.EventError: + return ev.Err + } + case "deal": + tm.Clear() + tm.MoveCursor(1, 1) + renderer.renderDeal(deals[dealIdx]) + tm.Flush() + + switch ev := term.PollEvent(); ev.Type { + case term.EventKey: + if ev.Ch == 'q' || ev.Key == term.KeyEsc || ev.Key == term.KeyEnter || ev.Key == term.KeyArrowLeft { + term.Sync() + state = "main" + } + case term.EventError: + return ev.Err + } + } + } +} + +type dealRenderer struct { + out io.Writer +} + +func (r *dealRenderer) renderDeals(deals []lapi.DealInfo, highlighted int) error { + tw := tablewriter.New( + tablewriter.Col(""), + tablewriter.Col("Created"), + tablewriter.Col("Provider"), + tablewriter.Col("Size"), + tablewriter.Col("State"), + ) + for i, di := range deals { + lineNum := fmt.Sprintf("%d", i+1) + cols := map[string]interface{}{ + "": lineNum, + "Created": time.Since(di.CreationTime).Round(time.Second), + "Provider": di.Provider, + "Size": di.Size, + "State": di.Message, + } + if i == highlighted { + for k, v := range cols { + cols[k] = color.YellowString(fmt.Sprint(v)) + } + } + tw.Write(cols) + } + return tw.Flush(r.out) +} + +func (r *dealRenderer) renderDeal(di lapi.DealInfo) error { + _, err := fmt.Fprintf(r.out, "Deal %d\n", di.DealID) + if err != nil { + return err + } + for _, stg := range di.DealStages.Stages { + msg := fmt.Sprintf("%s (%s)", stg.Name, stg.ExpectedDuration) + if stg.StartedAt.IsZero() { + msg = color.YellowString(msg) + } + _, err := fmt.Fprintf(r.out, "%s\n", msg) + if err != nil { + return err + } + for _, l := range stg.Logs { + _, err = fmt.Fprintf(r.out, " %s\n", l) + if err != nil { + return err + } + } + } + return nil +} diff --git a/go.mod b/go.mod index 54d6b42ed..5f3bce21a 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( github.com/ipfs/go-ds-pebble v0.0.2-0.20200921225637-ce220f8ac459 github.com/ipfs/go-filestore v1.0.0 github.com/ipfs/go-fs-lock v0.0.6 - github.com/ipfs/go-graphsync v0.5.2 + github.com/ipfs/go-graphsync v0.6.0 github.com/ipfs/go-ipfs-blockstore v1.0.3 github.com/ipfs/go-ipfs-chunker v0.0.5 github.com/ipfs/go-ipfs-ds-help v1.0.0 @@ -115,6 +115,7 @@ require ( github.com/libp2p/go-libp2p-yamux v0.4.1 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect + github.com/mattn/go-runewidth v0.0.10 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.3 @@ -123,6 +124,7 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.0.14 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect + github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 github.com/opentracing/opentracing-go v1.2.0 github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a github.com/prometheus/client_golang v1.6.0 @@ -159,3 +161,5 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets diff --git a/go.sum b/go.sum index c1e5494ee..0cfaa5141 100644 --- a/go.sum +++ b/go.sum @@ -250,7 +250,6 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= @@ -258,9 +257,6 @@ github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnman github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= -github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -288,10 +284,8 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= -github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= -github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= @@ -558,10 +552,10 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= -github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= +github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= +github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -613,7 +607,6 @@ github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rh github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= -github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -668,7 +661,6 @@ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= -github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d h1:iphSzTuPqyDgH7WUVZsdqUnQNzYgIblsVr1zhVNA33U= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= @@ -789,7 +781,6 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= -github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.12.0 h1:+xai9RQnQ9l5elFOKvp5wRyjyWisSwEx+6nU2+onpUA= github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= @@ -820,7 +811,6 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= -github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -926,7 +916,6 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= -github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.9.0 h1:WPuq5nV/chmIZIzvrkC2ulSdAQ0P0BDvgvAhZFOZ59E= github.com/libp2p/go-libp2p-quic-transport v0.9.0/go.mod h1:xyY+IgxL0qsW7Kiutab0+NlxM0/p9yRtrGTYsuMWf70= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= @@ -952,7 +941,6 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= -github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.3.1 h1:UTobu+oQHGdXTOGpZ4RefuVqYoJXcT0EBtSR74m2LkI= @@ -1068,7 +1056,6 @@ github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= -github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.18.1 h1:DMR7guC0NtVS8zNZR3IO7NARZvZygkSC56GGtC6cyys= github.com/lucas-clemente/quic-go v0.18.1/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1077,10 +1064,8 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= -github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.0 h1:i/YPXVxz8q9umso/5y474CNcHmTpA+5DH+mFPjx6PZg= @@ -1101,6 +1086,9 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= +github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1217,6 +1205,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 h1:3vzIuru1svOK2sXlg4XcrO3KkGRneIejmfQfR+ptSW8= +github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1225,7 +1215,6 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= @@ -1233,7 +1222,6 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= -github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1322,6 +1310,8 @@ github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= +github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= +github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -1411,7 +1401,6 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= -github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1642,7 +1631,6 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= From fe473e111cdeea3fd193006fe1caac3299ce0301 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Fri, 12 Mar 2021 16:58:43 -0500 Subject: [PATCH 009/239] Fix creation of remainder account when it's not a multisig --- chain/gen/genesis/f01_init.go | 19 ++++++++++++++++--- chain/gen/genesis/genesis.go | 14 ++++---------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/chain/gen/genesis/f01_init.go b/chain/gen/genesis/f01_init.go index 9fc6cfb9e..718eb4480 100644 --- a/chain/gen/genesis/f01_init.go +++ b/chain/gen/genesis/f01_init.go @@ -133,9 +133,22 @@ func SetupInitActor(bs bstore.Blockstore, netname string, initialActors []genesi } } - err := setupMsig(remainder.Meta) - if err != nil { - return 0, nil, nil, xerrors.Errorf("setting up remainder msig: %w", err) + if remainder.Type == genesis.TAccount { + var ainfo genesis.AccountMeta + if err := json.Unmarshal(remainder.Meta, &ainfo); err != nil { + return 0, nil, nil, xerrors.Errorf("unmarshaling account meta: %w", err) + } + + // TODO: Use builtin.ReserveAddress... + value := cbg.CborInt(90) + if err := amap.Put(abi.AddrKey(ainfo.Owner), &value); err != nil { + return 0, nil, nil, err + } + } else if remainder.Type == genesis.TMultisig { + err := setupMsig(remainder.Meta) + if err != nil { + return 0, nil, nil, xerrors.Errorf("setting up remainder msig: %w", err) + } } amapaddr, err := amap.Root() diff --git a/chain/gen/genesis/genesis.go b/chain/gen/genesis/genesis.go index d382e4d0d..4b86db550 100644 --- a/chain/gen/genesis/genesis.go +++ b/chain/gen/genesis/genesis.go @@ -330,24 +330,18 @@ func MakeInitialStateTree(ctx context.Context, bs bstore.Blockstore, template ge if err := json.Unmarshal(template.RemainderAccount.Meta, &ainfo); err != nil { return nil, nil, xerrors.Errorf("unmarshaling account meta: %w", err) } - st, err := cst.Put(ctx, &account0.State{Address: ainfo.Owner}) - if err != nil { - return nil, nil, err - } _, ok := keyIDs[ainfo.Owner] if ok { return nil, nil, fmt.Errorf("remainder account has already been declared, cannot be assigned 90: %s", ainfo.Owner) } - err = state.SetActor(builtin.ReserveAddress, &types.Actor{ - Code: builtin0.AccountActorCodeID, - Balance: template.RemainderAccount.Balance, - Head: st, - }) + keyIDs[ainfo.Owner] = builtin.ReserveAddress + err = createAccountActor(ctx, cst, state, template.RemainderAccount, keyIDs) if err != nil { - return nil, nil, xerrors.Errorf("setting remainder account: %w", err) + return nil, nil, xerrors.Errorf("creating remainder acct: %w", err) } + case genesis.TMultisig: if err = createMultisigAccount(ctx, bs, cst, state, builtin.ReserveAddress, template.RemainderAccount, keyIDs); err != nil { return nil, nil, xerrors.Errorf("failed to set up remainder: %w", err) From 9d6c77d93f818fbcae90135084f9d4636e39983e Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 10 Mar 2021 13:25:52 +0100 Subject: [PATCH 010/239] remove interactive UX; add `inspect-deal` cmd --- api/api_full.go | 2 +- api/types.go | 2 + build/params_2k.go | 3 + cli/client.go | 30 ++-- cli/deal/showdeals.go | 299 +++++++------------------------------ go.mod | 3 + node/impl/client/client.go | 4 + 7 files changed, 88 insertions(+), 255 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index b56a42aa2..084b04493 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -605,7 +605,7 @@ type DealInfo struct { ProposalCid cid.Cid State storagemarket.StorageDealStatus Message string // more information about deal state, particularly errors - DealStages storagemarket.DealStages + DealStages *storagemarket.DealStages Provider address.Address DataRef *storagemarket.DataRef diff --git a/api/types.go b/api/types.go index 28141b83a..0c3bcb32b 100644 --- a/api/types.go +++ b/api/types.go @@ -60,6 +60,7 @@ type DataTransferChannel struct { Message string OtherPeer peer.ID Transferred uint64 + Stages *datatransfer.ChannelStages } // NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id @@ -70,6 +71,7 @@ func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelSta BaseCID: channelState.BaseCID(), IsSender: channelState.Sender() == hostID, Message: channelState.Message(), + Stages: channelState.Stages(), } stringer, ok := channelState.Voucher().(fmt.Stringer) if ok { diff --git a/build/params_2k.go b/build/params_2k.go index 63f7e70b4..35443a4b5 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -38,6 +38,9 @@ func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048)) policy.SetMinVerifiedDealSize(abi.NewStoragePower(256)) + //policy.SetWPoStChallengeWindow(abi.ChainEpoch(5)) + policy.SetPreCommitChallengeDelay(abi.ChainEpoch(10)) + BuildType |= Build2k } diff --git a/cli/client.go b/cli/client.go index ecb5d4947..b640f85f7 100644 --- a/cli/client.go +++ b/cli/client.go @@ -84,7 +84,7 @@ var clientCmd = &cli.Command{ WithCategory("storage", clientGetDealCmd), WithCategory("storage", clientListAsksCmd), WithCategory("storage", clientDealStatsCmd), - WithCategory("storage", clientShowDealsCmd), + WithCategory("storage", clientInspectDealCmd), WithCategory("data", clientImportCmd), WithCategory("data", clientDropCmd), WithCategory("data", clientLocalCmd), @@ -1116,20 +1116,26 @@ var clientRetrieveCmd = &cli.Command{ }, } -var clientShowDealsCmd = &cli.Command{ - Name: "show-deals", - Usage: "Show storage deals", +var clientInspectDealCmd = &cli.Command{ + Name: "inspect-deal", + Usage: "Inspect storage deal", + Flags: []cli.Flag{ + &cli.IntFlag{ + Name: "deal-id", + }, + &cli.StringFlag{ + Name: "proposal-cid", + }, + }, Action: func(cctx *cli.Context) error { - //api, closer, err := GetFullNodeAPI(cctx) - //if err != nil { - // return err - //} - //defer closer() - var api api.FullNode + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() ctx := ReqContext(cctx) - //afmt := NewAppFmt(cctx.App) - return dealcli.ShowDealsCmd(ctx, api) + return dealcli.InspectDealCmd(ctx, api, cctx.String("proposal-cid"), cctx.Int("deal-id")) }, } diff --git a/cli/deal/showdeals.go b/cli/deal/showdeals.go index bea986286..de27d897d 100644 --- a/cli/deal/showdeals.go +++ b/cli/deal/showdeals.go @@ -2,270 +2,85 @@ package deal import ( "context" + "errors" "fmt" - "io" + "strings" "time" - tm "github.com/buger/goterm" "github.com/fatih/color" - "github.com/filecoin-project/go-address" - "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-state-types/abi" lapi "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/lib/tablewriter" - "github.com/ipfs/go-cid" - term "github.com/nsf/termbox-go" ) var mockDealInfos []lapi.DealInfo -func init() { - dummyCid, err := cid.Parse("bafkqaaa") - if err != nil { - panic(err) - } - - mockDealStages := storagemarket.DealStages{ - At: time.Now(), - Stages: []storagemarket.DealStage{{ - Name: "Reserving Funds", - ExpectedDuration: "5 epochs", - StartedAt: time.Now().Add(-5 * time.Minute), - Logs: []string{ - "Sending AddBalance message for 0.3FIL", - "Waiting 5 epochs (2:30) for confirmation", - "Funds for deal reserved successfully", - }, - }, { - Name: "Sending Deal Proposal to Provider", - ExpectedDuration: "5 epochs", - StartedAt: time.Now().Add(-2 * time.Minute), - Logs: []string{ - "Proposal: 512MB for 300 days @ 0.1FIL / GB / epoch", - "Deal proposal accepted by provider", - "Funds for deal reserved successfully", - }, - }, { - Name: "Sending deal data to Provider", - ExpectedDuration: "13 minutes", - StartedAt: time.Now().Add(-53 * time.Second), - Logs: []string{ - "Progress: 4:02 254MB / 1024MB (1MB / sec)", - "Connection to Provider f01234 disconnected, retrying in 8s", - }, - }, { - Name: "Waiting for deal to be published by Provider", - ExpectedDuration: "several hours", - }, { - Name: "Waiting for pre-commit message from Provider", - ExpectedDuration: "several hours", - }, { - Name: "Waiting for prove-commit message from Provider", - ExpectedDuration: "several hours", - }}, - } - - mockDealInfos = []lapi.DealInfo{{ - State: 3, - Message: "Reserving Client Funds", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 512 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(10), - Duration: 300, - DealID: 10, - CreationTime: time.Now().Add(-5 * time.Second), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 5, - Message: "Publishing Deal", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 482 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(12), - Duration: 323, - DealID: 14, - CreationTime: time.Now().Add(-23 * time.Minute), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 7, - Message: "Waiting for Pre-Commit", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 2 * 1024 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(8), - Duration: 298, - DealID: 8, - CreationTime: time.Now().Add(-3 * time.Hour), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }, { - State: 2, - Message: "Transferring Data", - DealStages: mockDealStages, - Provider: address.TestAddress, - DataRef: nil, - PieceCID: dummyCid, - Size: 23 * 1024 * 1024, - PricePerEpoch: abi.NewTokenAmount(11), - Duration: 328, - DealID: 3, - CreationTime: time.Now().Add(-49 * time.Hour), - Verified: false, - TransferChannelID: nil, - DataTransfer: nil, - }} -} - -func ShowDealsCmd(ctx context.Context, api lapi.FullNode) error { +func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { ctx, cancel := context.WithCancel(ctx) defer cancel() - //localDeals, err := api.ClientListDeals(ctx) - //if err != nil { - // return err - //} - localDeals := mockDealInfos - - return showDealsUX(ctx, localDeals) -} - -func showDealsUX(ctx context.Context, deals []lapi.DealInfo) error { - err := term.Init() + deals, err := api.ClientListDeals(ctx) if err != nil { return err } - defer term.Close() - renderer := dealRenderer{out: tm.Screen} - - dealIdx := -1 - state := "main" - highlighted := -1 - for { - if err := ctx.Err(); err != nil { - return err + var di lapi.DealInfo + found := false + for _, cdi := range deals { + if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { + di = cdi + found = true + break } - switch state { - case "main": - renderMain := func(hlite int) error { - tm.Clear() - tm.MoveCursor(1, 1) - err := renderer.renderDeals(deals, hlite) - if err != nil { - return err - } - tm.Flush() - return nil - } - err := renderMain(highlighted) - if err != nil { - return err - } - - switch ev := term.PollEvent(); ev.Type { - case term.EventKey: - switch { - case ev.Ch == 'q', ev.Key == term.KeyEsc: - return nil - case ev.Key == term.KeyArrowUp: - term.Sync() - if highlighted > 0 { - highlighted-- - } - case ev.Key == term.KeyArrowDown: - term.Sync() - highlighted++ - case ev.Key == term.KeyEnter: - term.Sync() - dealIdx = highlighted - state = "deal" - } - case term.EventError: - return ev.Err - } - case "deal": - tm.Clear() - tm.MoveCursor(1, 1) - renderer.renderDeal(deals[dealIdx]) - tm.Flush() - - switch ev := term.PollEvent(); ev.Type { - case term.EventKey: - if ev.Ch == 'q' || ev.Key == term.KeyEsc || ev.Key == term.KeyEnter || ev.Key == term.KeyArrowLeft { - term.Sync() - state = "main" - } - case term.EventError: - return ev.Err - } + if dealId != 0 && int(cdi.DealID) == dealId { + di = cdi + found = true + break } } -} -type dealRenderer struct { - out io.Writer -} + if !found { + if proposalCid != "" { + return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) + } + if dealId != 0 { + return fmt.Errorf("cannot find deal with deal id: %v", dealId) + } + return errors.New("you must specify proposal cid or deal id in order to inspect a deal") + } -func (r *dealRenderer) renderDeals(deals []lapi.DealInfo, highlighted int) error { - tw := tablewriter.New( - tablewriter.Col(""), - tablewriter.Col("Created"), - tablewriter.Col("Provider"), - tablewriter.Col("Size"), - tablewriter.Col("State"), - ) - for i, di := range deals { - lineNum := fmt.Sprintf("%d", i+1) - cols := map[string]interface{}{ - "": lineNum, - "Created": time.Since(di.CreationTime).Round(time.Second), - "Provider": di.Provider, - "Size": di.Size, - "State": di.Message, - } - if i == highlighted { - for k, v := range cols { - cols[k] = color.YellowString(fmt.Sprint(v)) - } - } - tw.Write(cols) - } - return tw.Flush(r.out) -} + renderDeal(di) -func (r *dealRenderer) renderDeal(di lapi.DealInfo) error { - _, err := fmt.Fprintf(r.out, "Deal %d\n", di.DealID) - if err != nil { - return err - } - for _, stg := range di.DealStages.Stages { - msg := fmt.Sprintf("%s (%s)", stg.Name, stg.ExpectedDuration) - if stg.StartedAt.IsZero() { - msg = color.YellowString(msg) - } - _, err := fmt.Fprintf(r.out, "%s\n", msg) - if err != nil { - return err - } - for _, l := range stg.Logs { - _, err = fmt.Fprintf(r.out, " %s\n", l) - if err != nil { - return err - } - } - } return nil } + +func renderDeal(di lapi.DealInfo) { + color.Blue("Deal ID: %d\n", int(di.DealID)) + color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) + + for _, stg := range di.DealStages.Stages { + msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) + if stg.UpdatedTime.Time().IsZero() { + msg = color.YellowString(msg) + } + fmt.Println(msg) + + for _, l := range stg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + + if stg.Name == "StorageDealStartDataTransfer" { + for _, dt_stg := range di.DataTransfer.Stages.Stages { + + msg := fmt.Sprintf("Data transfer stage: %s", dt_stg.Name) + msg = color.BlueString(msg) + if stg.UpdatedTime.Time().IsZero() { + msg = color.YellowString(msg) + } + fmt.Printf(" %s\n", msg) + for _, l := range dt_stg.Logs { + fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) + } + } + } + } +} diff --git a/go.mod b/go.mod index 5f3bce21a..f19895413 100644 --- a/go.mod +++ b/go.mod @@ -15,6 +15,7 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/coreos/go-systemd/v22 v22.1.0 + github.com/davecgh/go-spew v1.1.1 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.2 github.com/docker/go-units v0.4.0 @@ -163,3 +164,5 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets + +replace github.com/filecoin-project/go-data-transfer => ../go-data-transfer diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac60..4a0dd4907 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -7,6 +7,7 @@ import ( "io" "os" + "github.com/davecgh/go-spew/spew" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "golang.org/x/xerrors" @@ -215,6 +216,8 @@ func (a *API) ClientListDeals(ctx context.Context) ([]api.DealInfo, error) { out[k] = a.newDealInfoWithTransfer(transferCh, v) } + spew.Dump(out) + return out, nil } @@ -289,6 +292,7 @@ func (a *API) newDealInfoWithTransfer(transferCh *api.DataTransferChannel, v sto Verified: v.Proposal.VerifiedDeal, TransferChannelID: v.TransferChannelID, DataTransfer: transferCh, + DealStages: v.DealStages, } } From af8104830c05cff6370f337961b67fa794039ace Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 18 Mar 2021 16:03:24 +0200 Subject: [PATCH 011/239] fixup --- cli/deal/{showdeals.go => inspect.go} | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) rename cli/deal/{showdeals.go => inspect.go} (89%) diff --git a/cli/deal/showdeals.go b/cli/deal/inspect.go similarity index 89% rename from cli/deal/showdeals.go rename to cli/deal/inspect.go index de27d897d..ff7670b01 100644 --- a/cli/deal/showdeals.go +++ b/cli/deal/inspect.go @@ -71,12 +71,7 @@ func renderDeal(di lapi.DealInfo) { if stg.Name == "StorageDealStartDataTransfer" { for _, dt_stg := range di.DataTransfer.Stages.Stages { - msg := fmt.Sprintf("Data transfer stage: %s", dt_stg.Name) - msg = color.BlueString(msg) - if stg.UpdatedTime.Time().IsZero() { - msg = color.YellowString(msg) - } - fmt.Printf(" %s\n", msg) + fmt.Printf(" %s %s %s\n", color.YellowString(dt_stg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dt_stg.Name)) for _, l := range dt_stg.Logs { fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) } From 86772a09c73064e1fcdf6ba381068c624b313656 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 19 Mar 2021 13:53:03 +0200 Subject: [PATCH 012/239] use new channelmonitor.Config --- go.mod | 7 ++----- go.sum | 26 +++++++++++++++++++++----- node/impl/client/client.go | 3 --- node/modules/client.go | 14 ++++++++++++-- 4 files changed, 35 insertions(+), 15 deletions(-) diff --git a/go.mod b/go.mod index f19895413..9498b182b 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.2.7 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -125,7 +125,6 @@ require ( github.com/multiformats/go-multibase v0.0.3 github.com/multiformats/go-multihash v0.0.14 github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect - github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 github.com/opentracing/opentracing-go v1.2.0 github.com/polydawn/refmt v0.0.0-20190809202753-05966cbd336a github.com/prometheus/client_golang v1.6.0 @@ -163,6 +162,4 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors -replace github.com/filecoin-project/go-fil-markets => ../go-fil-markets - -replace github.com/filecoin-project/go-data-transfer => ../go-data-transfer +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.1 diff --git a/go.sum b/go.sum index 0cfaa5141..6756286fe 100644 --- a/go.sum +++ b/go.sum @@ -250,13 +250,14 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= +github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 h1:fZgoq675uEr7q3fdYNnKmd7Wk87od7Vx4RBqLvOD5gY= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -284,8 +285,10 @@ github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= +github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= +github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= @@ -552,6 +555,7 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= +github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= @@ -607,6 +611,7 @@ github.com/ipfs/go-ipld-cbor v0.0.1/go.mod h1:RXHr8s4k0NE0TKhnrxqZC9M888QfsBN9rh github.com/ipfs/go-ipld-cbor v0.0.2/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA0AQFOn7Nc= github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= +github.com/ipfs/go-ipld-cbor v0.0.5-0.20200204214505-252690b78669/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-cbor v0.0.5 h1:ovz4CHKogtG2KB/h1zUp5U0c/IzZrL435rCh5+K/5G8= github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4= github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms= @@ -661,6 +666,7 @@ github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.2.1 h1:au4HWn9/pRPbkxA08pDx2oRAs4cnbgQWgV0teYXuuGA= github.com/ipfs/iptb-plugins v0.2.1/go.mod h1:QXMbtIWZ+jRsW8a4h13qAKU7jcM7qaittO8wOsTP0Rs= +github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d h1:iphSzTuPqyDgH7WUVZsdqUnQNzYgIblsVr1zhVNA33U= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= github.com/ipld/go-ipld-prime v0.0.2-0.20200428162820-8b59dc292b8e/go.mod h1:uVIwe/u0H4VdKv3kaN1ck7uCb6yD9cFLS9/ELyXbsw8= @@ -781,6 +787,7 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TAnbubJQqQ= +github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.12.0 h1:+xai9RQnQ9l5elFOKvp5wRyjyWisSwEx+6nU2+onpUA= github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052 h1:BM7aaOF7RpmNn9+9g6uTjGJ0cTzWr5j9i9IKeun2M8U= @@ -811,6 +818,7 @@ github.com/libp2p/go-libp2p-circuit v0.1.3/go.mod h1:Xqh2TjSy8DD5iV2cCOMzdynd6h8 github.com/libp2p/go-libp2p-circuit v0.1.4/go.mod h1:CY67BrEjKNDhdTk8UgBX1Y/H5c3xkAcs3gnksxY7osU= github.com/libp2p/go-libp2p-circuit v0.2.1/go.mod h1:BXPwYDN5A8z4OEY9sOfr2DUQMLQvKt/6oku45YUmjIo= github.com/libp2p/go-libp2p-circuit v0.2.2/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= +github.com/libp2p/go-libp2p-circuit v0.2.3/go.mod h1:nkG3iE01tR3FoQ2nMm06IUrCpCyJp1Eo4A1xYdpjfs4= github.com/libp2p/go-libp2p-circuit v0.4.0 h1:eqQ3sEYkGTtybWgr6JLqJY6QLtPWRErvFjFDfAOO1wc= github.com/libp2p/go-libp2p-circuit v0.4.0/go.mod h1:t/ktoFIUzM6uLQ+o1G6NuBl2ANhBKN9Bc8jRIk31MoA= github.com/libp2p/go-libp2p-connmgr v0.1.1/go.mod h1:wZxh8veAmU5qdrfJ0ZBLcU8oJe9L82ciVP/fl1VHjXk= @@ -916,6 +924,7 @@ github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= +github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.9.0 h1:WPuq5nV/chmIZIzvrkC2ulSdAQ0P0BDvgvAhZFOZ59E= github.com/libp2p/go-libp2p-quic-transport v0.9.0/go.mod h1:xyY+IgxL0qsW7Kiutab0+NlxM0/p9yRtrGTYsuMWf70= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= @@ -941,6 +950,7 @@ github.com/libp2p/go-libp2p-swarm v0.2.1/go.mod h1:x07b4zkMFo2EvgPV2bMTlNmdQc8i+ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaTNyBcHImCxRpPKU= github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h/GGZes8Wku/M5Y= +github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= github.com/libp2p/go-libp2p-swarm v0.3.1 h1:UTobu+oQHGdXTOGpZ4RefuVqYoJXcT0EBtSR74m2LkI= @@ -1056,6 +1066,7 @@ github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= +github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.18.1 h1:DMR7guC0NtVS8zNZR3IO7NARZvZygkSC56GGtC6cyys= github.com/lucas-clemente/quic-go v0.18.1/go.mod h1:yXttHsSNxQi8AWijC/vLP+OJczXqzHSOcJrM5ITUlCg= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1064,8 +1075,10 @@ github.com/lyft/protoc-gen-validate v0.0.13/go.mod h1:XbGvPuh87YZc5TdIa2/I4pLk0Q github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/mailru/easyjson v0.0.0-20190312143242-1de009706dbe/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/marten-seemann/qpack v0.1.0/go.mod h1:LFt1NU/Ptjip0C2CPkhimBz5CGE3WGDAUWqna+CNTrI= github.com/marten-seemann/qpack v0.2.0/go.mod h1:F7Gl5L1jIgN1D11ucXefiuJS9UMVP2opoCp2jDKb7wc= github.com/marten-seemann/qtls v0.2.3/go.mod h1:xzjG7avBwGGbdZ8dTGxlBnLArsVKLvwmjgmPuiQEcYk= +github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZbBb/j3cvzHhk= github.com/marten-seemann/qtls v0.10.0 h1:ECsuYUKalRL240rRD4Ri33ISb7kAQ3qGDlrrl55b2pc= github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.0 h1:i/YPXVxz8q9umso/5y474CNcHmTpA+5DH+mFPjx6PZg= @@ -1086,7 +1099,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= @@ -1205,8 +1217,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8 h1:3vzIuru1svOK2sXlg4XcrO3KkGRneIejmfQfR+ptSW8= -github.com/nsf/termbox-go v0.0.0-20210114135735-d04385b850e8/go.mod h1:T0cTdVuOwf7pHQNtfhnEbzHbcNyCEcVU4YPpouCbVxo= +github.com/nonsense/go-data-transfer v0.0.1 h1:BI9hMOWdCcB4k1RxQscIJgQZ1LnLF2+/ujXHtNqLuVE= +github.com/nonsense/go-data-transfer v0.0.1/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1215,6 +1227,7 @@ github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:v github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= github.com/onsi/ginkgo v1.14.0 h1:2mOpI4JVVPBN+WQRa0WKH2eXR+Ey+uK4n7Zj0aYpIQA= @@ -1222,6 +1235,7 @@ github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9k github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= github.com/onsi/gomega v1.10.1 h1:o0+MgICZLuZ7xjH7Vx6zS/zcu93/BEp1VwkIW1mEXCE= github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= @@ -1401,6 +1415,7 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.6.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -1631,6 +1646,7 @@ golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190125091013-d26f9f9a57f3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190227160552-c95aed5357e7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190228165749-92fc7df08ae7/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190313220215-9f648a60d977/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 4a0dd4907..de6e813c7 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -7,7 +7,6 @@ import ( "io" "os" - "github.com/davecgh/go-spew/spew" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "golang.org/x/xerrors" @@ -216,8 +215,6 @@ func (a *API) ClientListDeals(ctx context.Context) ([]api.DealInfo, error) { out[k] = a.newDealInfoWithTransfer(transferCh, v) } - spew.Dump(out) - return out, nil } diff --git a/node/modules/client.go b/node/modules/client.go index da6a4cd83..bedbf6841 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -13,6 +13,7 @@ import ( "go.uber.org/fx" + "github.com/filecoin-project/go-data-transfer/channelmonitor" dtimpl "github.com/filecoin-project/go-data-transfer/impl" dtnet "github.com/filecoin-project/go-data-transfer/network" dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" @@ -136,8 +137,17 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap } // data-transfer push channel restart configuration - dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) + dtRestartConf := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + AcceptTimeout: 100 * time.Millisecond, + Interval: 100 * time.Millisecond, + MinBytesTransferred: 1, + ChecksPerInterval: 10, + RestartBackoff: 500 * time.Millisecond, + MaxConsecutiveRestarts: 5, + CompleteTimeout: 100 * time.Millisecond, + }) + //dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) if err != nil { return nil, err } From ac576c75d49d4416a87bdf0ff01995a268384b96 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 19 Mar 2021 14:08:50 +0200 Subject: [PATCH 013/239] amend restart config --- node/modules/client.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/node/modules/client.go b/node/modules/client.go index bedbf6841..ad3b10bb4 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -138,15 +138,14 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data-transfer push channel restart configuration dtRestartConf := dtimpl.ChannelRestartConfig(channelmonitor.Config{ - AcceptTimeout: 100 * time.Millisecond, - Interval: 100 * time.Millisecond, - MinBytesTransferred: 1, + AcceptTimeout: 30 * time.Second, + Interval: 1 * time.Minute, + MinBytesTransferred: 1024, ChecksPerInterval: 10, - RestartBackoff: 500 * time.Millisecond, - MaxConsecutiveRestarts: 5, - CompleteTimeout: 100 * time.Millisecond, + RestartBackoff: 10 * time.Minute, + MaxConsecutiveRestarts: 3, + CompleteTimeout: 30 * time.Second, }) - //dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) if err != nil { return nil, err From 9fb1dd43a9b58ca99d91ac3c578a4251a2bf7282 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 22 Mar 2021 12:08:05 +0100 Subject: [PATCH 014/239] feat: update to markets v1.2.0 --- go.mod | 4 ++-- go.sum | 9 ++++----- node/modules/client.go | 27 +++++++++++++++++++++------ 3 files changed, 27 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 621bea702..24e605b4c 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.7 + github.com/filecoin-project/go-data-transfer v1.2.9 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-fil-markets v1.2.0 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index e4b3d7d0e..e1d354fcd 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= +github.com/filecoin-project/go-data-transfer v1.2.9 h1:k6oXrI/6AfNdEfUVFAx6LbVMGNmdWWq97BiaDnhS3JE= +github.com/filecoin-project/go-data-transfer v1.2.9/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= +github.com/filecoin-project/go-fil-markets v1.2.0 h1:zFQOeuEK7a9ajYfwLiTwvsKAqa9tcLbf3I5waHubI+I= +github.com/filecoin-project/go-fil-markets v1.2.0/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -595,7 +595,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= diff --git a/node/modules/client.go b/node/modules/client.go index da6a4cd83..8e0a281ed 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -7,12 +7,10 @@ import ( "path/filepath" "time" - "github.com/filecoin-project/go-multistore" - "github.com/filecoin-project/go-state-types/abi" + "go.uber.org/fx" "golang.org/x/xerrors" - "go.uber.org/fx" - + "github.com/filecoin-project/go-data-transfer/channelmonitor" dtimpl "github.com/filecoin-project/go-data-transfer/impl" dtnet "github.com/filecoin-project/go-data-transfer/network" dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" @@ -25,6 +23,8 @@ import ( storageimpl "github.com/filecoin-project/go-fil-markets/storagemarket/impl" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/requestvalidation" smnet "github.com/filecoin-project/go-fil-markets/storagemarket/network" + "github.com/filecoin-project/go-multistore" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-storedcounter" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -135,8 +135,23 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap return nil, err } - // data-transfer push channel restart configuration - dtRestartConfig := dtimpl.PushChannelRestartConfig(time.Minute, 10, 1024, 10*time.Minute, 3) + // data-transfer push / pull channel restart configuration: + dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + // Wait up to 30s for the other side to respond to an Open channel message + AcceptTimeout: 30 * time.Second, + // Send a restart message if the data rate falls below 1024 bytes / minute + Interval: time.Minute, + MinBytesTransferred: 1024, + // Perform check 10 times / minute + ChecksPerInterval: 10, + // After sending a restart, wait for at least 1 minute before sending another + RestartBackoff: time.Minute, + // After trying to restart 3 times, give up and fail the transfer + MaxConsecutiveRestarts: 3, + // Wait up to 30s for the other side to send a Complete message once all + // data has been sent / received + CompleteTimeout: 30 * time.Second, + }) dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) if err != nil { return nil, err From bbd0cdd2124318226d25f8d1719b849c92ba2380 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 23 Mar 2021 13:59:41 +0200 Subject: [PATCH 015/239] fix linter and merge master --- cli/deal/inspect.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index ff7670b01..839d16d0b 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -11,8 +11,6 @@ import ( lapi "github.com/filecoin-project/lotus/api" ) -var mockDealInfos []lapi.DealInfo - func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, dealId int) error { ctx, cancel := context.WithCancel(ctx) defer cancel() @@ -69,10 +67,9 @@ func renderDeal(di lapi.DealInfo) { } if stg.Name == "StorageDealStartDataTransfer" { - for _, dt_stg := range di.DataTransfer.Stages.Stages { - - fmt.Printf(" %s %s %s\n", color.YellowString(dt_stg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dt_stg.Name)) - for _, l := range dt_stg.Logs { + for _, dtStg := range di.DataTransfer.Stages.Stages { + fmt.Printf(" %s %s %s\n", color.YellowString(dtStg.CreatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), color.BlueString("Data transfer stage:"), color.BlueString(dtStg.Name)) + for _, l := range dtStg.Logs { fmt.Printf(" %s %s\n", color.YellowString(l.UpdatedTime.Time().UTC().Round(time.Second).Format(time.Stamp)), l.Log) } } From aee9890ee7651eef65b87428bbd6fe4214c3029c Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Tue, 23 Mar 2021 13:28:30 +0100 Subject: [PATCH 016/239] feat: update go-data-transfer and go-fil-markets --- go.mod | 4 ++-- go.sum | 8 ++++---- node/modules/client.go | 4 +--- node/modules/storageminer.go | 3 +-- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 24e605b4c..e5f8900ae 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.9 + github.com/filecoin-project/go-data-transfer v1.3.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.0 + github.com/filecoin-project/go-fil-markets v1.2.1 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index e1d354fcd..ae66a5883 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.9 h1:k6oXrI/6AfNdEfUVFAx6LbVMGNmdWWq97BiaDnhS3JE= -github.com/filecoin-project/go-data-transfer v1.2.9/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= +github.com/filecoin-project/go-data-transfer v1.3.0 h1:QZvpUVU0fVKH+wBH/QDPi5AB7fUI3NwwBLHK+d1Jed4= +github.com/filecoin-project/go-data-transfer v1.3.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.0 h1:zFQOeuEK7a9ajYfwLiTwvsKAqa9tcLbf3I5waHubI+I= -github.com/filecoin-project/go-fil-markets v1.2.0/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= +github.com/filecoin-project/go-fil-markets v1.2.1 h1:vsTf6x6ZvwbIuPxCXIAIKBLOnRewMPPiXhwkZwVxWEo= +github.com/filecoin-project/go-fil-markets v1.2.1/go.mod h1:G4d/D/RwxpwSmMS1VyJ72wq8IIDdIbIefM1vKKPesfw= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/node/modules/client.go b/node/modules/client.go index 8e0a281ed..d68e96406 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -121,8 +121,6 @@ func RegisterClientValidator(crv dtypes.ClientRequestValidator, dtm dtypes.Clien // NewClientGraphsyncDataTransfer returns a data transfer manager that just // uses the clients's Client DAG service for transfers func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Graphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/client/counter")) - // go-data-transfer protocol retries: // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) @@ -152,7 +150,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data has been sent / received CompleteTimeout: 30 * time.Second, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConfig) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConfig) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d89474eee..1781d0493 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -330,7 +330,6 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. // NewProviderDAGServiceDataTransfer returns a data transfer manager that just // uses the provider's Staging DAG service for transfers func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.StagingGraphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/provider/counter")) net := dtnet.NewFromLibp2pHost(h) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) @@ -340,7 +339,7 @@ func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.S return nil, err } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) if err != nil { return nil, err } From b4d4766615b6e0488f6773dfa007542e24f9a4c7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 23 Mar 2021 14:30:26 +0200 Subject: [PATCH 017/239] use go-data-transfer from personal fork --- go.mod | 7 +++-- go.sum | 9 +++---- testplans/lotus-soup/go.mod | 10 +++++--- testplans/lotus-soup/go.sum | 51 ++++++++++++++++++++++++------------- 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/go.mod b/go.mod index 6f94b536d..ed3ebaf64 100644 --- a/go.mod +++ b/go.mod @@ -15,7 +15,6 @@ require ( github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e github.com/cockroachdb/pebble v0.0.0-20201001221639-879f3bfeef07 github.com/coreos/go-systemd/v22 v22.1.0 - github.com/davecgh/go-spew v1.1.1 github.com/detailyang/go-fallocate v0.0.0-20180908115635-432fa640bd2e github.com/dgraph-io/badger/v2 v2.2007.2 github.com/docker/go-units v0.4.0 @@ -33,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.7 + github.com/filecoin-project/go-data-transfer v1.2.9 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -167,4 +166,4 @@ replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.1 +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 diff --git a/go.sum b/go.sum index 39d0c7fc7..9266cfb9a 100644 --- a/go.sum +++ b/go.sum @@ -270,8 +270,8 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8 h1:fZgoq675uEr7q3fdYNnKmd7Wk87od7Vx4RBqLvOD5gY= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210319113544-a848de845da8/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 h1:vk4TGhO58hE3hs/2Rw5RXbh1Z2/Jy6v1GvkQpfUmYpM= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -591,7 +591,6 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -1259,8 +1258,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.1 h1:BI9hMOWdCcB4k1RxQscIJgQZ1LnLF2+/ujXHtNqLuVE= -github.com/nonsense/go-data-transfer v0.0.1/go.mod h1:ps/AU2Ok4pf2oFevi5RmMr3JRAWcnSTA/Zag6VMygIc= +github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= +github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 9974fe81c..80d0b5f69 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -8,11 +8,11 @@ require ( github.com/davecgh/go-spew v1.1.1 github.com/drand/drand v1.2.1 github.com/filecoin-project/go-address v0.0.5 - github.com/filecoin-project/go-fil-markets v1.1.7 - github.com/filecoin-project/go-jsonrpc v0.1.2 - github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71 + github.com/filecoin-project/go-fil-markets v1.1.9 + github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec + github.com/filecoin-project/go-state-types v0.1.0 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b - github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b + github.com/filecoin-project/lotus v1.5.2 github.com/filecoin-project/specs-actors v0.9.13 github.com/google/uuid v1.1.2 github.com/gorilla/mux v1.7.4 @@ -41,3 +41,5 @@ require ( // On docker:go and exec:go, it maps to /extra/filecoin-ffi, as it's picked up // as an "extra source" in the manifest. replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi + +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 083fbafa4..67eb30cba 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -38,12 +38,12 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/DataDog/zstd v1.4.1 h1:3oxKN3wbHibqx897utPC2LTQU4J+IHWWJO+glkAkpFM= github.com/DataDog/zstd v1.4.1/go.mod h1:1jcaCB/ufaK+sKp1NBhlGmpz41jOoPQ35bpF36t7BBo= +github.com/GeertJohan/go.incremental v1.0.0 h1:7AH+pY1XUgQE4Y1HcXYaMqAI0m9yrFqo/jt0CW30vsg= github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= github.com/GeertJohan/go.rice v1.0.0 h1:KkI6O9uMaQU3VEKaj01ulavtF7o1fWT7+pk/4voiMLQ= github.com/GeertJohan/go.rice v1.0.0/go.mod h1:eH6gbSOAUv07dQuZVnBmoDP8mgsM1rtixis4Tib9if0= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee h1:8doiS7ib3zi6/K172oDhSKU0dJ/miJramo9NITOMyZQ= github.com/Gurpartap/async v0.0.0-20180927173644-4f7f499dd9ee/go.mod h1:W0GbEAA4uFNYOGG2cJpmFJ04E6SD1NLELPYZB57/7AY= -github.com/Jeffail/gabs v1.4.0/go.mod h1:6xMvQMK4k33lb7GUUpaAPh6nKMmemQeg5d4gn7/bOXc= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Kubuxu/go-os-helper v0.0.1/go.mod h1:N8B+I7vPCT80IcP58r50u4+gEEcsZETFUpAzWW2ep1Y= github.com/OneOfOne/xxhash v1.2.2 h1:KMrpdQIwFcEqXDklaen+P1axHaj9BSKzvpUUfnHldSE= @@ -61,6 +61,7 @@ github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d/go.mod h1:asat6 github.com/aead/siphash v1.0.1/go.mod h1:Nywa3cDsYNNK3gaciGTWPwHt0wlpNV15vwmswBAUSII= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= +github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -253,31 +254,30 @@ github.com/filecoin-project/go-amt-ipld/v3 v3.0.0/go.mod h1:Qa95YNAbtoVCTSVtX38a github.com/filecoin-project/go-bitfield v0.2.0/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-bitfield v0.2.3 h1:pedK/7maYF06Z+BYJf2OeFFqIDEh6SP6mIOlLFpYXGs= github.com/filecoin-project/go-bitfield v0.2.3/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= +github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW8p9au0C68JPgk= +github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1:0kHszkYP3hgApcjl5x4rpwONhN9+j7XDobf6at5XfHs= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.2.7 h1:WE5Cpp9eMt5BDoWOVR64QegSn6bwHQaDzyyjVU377Y0= -github.com/filecoin-project/go-data-transfer v1.2.7/go.mod h1:mvjZ+C3NkBX10JP4JMu27DCjUouHFjHwUGh+Xc4yvDA= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.1.7 h1:7yy7alIDWzUxljxZhGmG3+wvaU4Ty5QDMbPmdZeaIJ8= -github.com/filecoin-project/go-fil-markets v1.1.7/go.mod h1:6oTRaAsHnCqhi3mpZqdvnWIzH6QzHQc4dbhJrI9/BfQ= +github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= +github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+eEvrDCGJoPLxFpDynFjYfBjI= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1 h1:zbzs46G7bOctkZ+JUX3xirrj0RaEsi+27dtlsgrTNBg= github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= -github.com/filecoin-project/go-jsonrpc v0.1.2 h1:MTebUawBHLxxY9gDi1WXuGc89TWIDmsgoDqeZSk9KRw= -github.com/filecoin-project/go-jsonrpc v0.1.2/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3 h1:vaRBY4YiA2UZFPK57RNuewypB8u0DzzQwqsL0XarpnI= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 h1:+/4aUeUoKr6AKfPE3mBhXA5spIV6UcKdTYDPNU2Tdmg= @@ -288,16 +288,16 @@ github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71 h1:Cas/CUB4ybYpdxvW7LouaydE16cpwdq3vvS3qgZuU+Q= -github.com/filecoin-project/go-state-types v0.0.0-20210119062722-4adba5aaea71/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.0 h1:9r2HCSMMCmyMfGyMKxQtv0GKp6VT/m5GgVk8EhYbLJU= +github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0 h1:t56reH59843TwXHkMcwyuayStBIiWBRilQjQ+5IiwdQ= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b h1:6L8LdxQDksFInGRmYbCrujBc7fEHip13T6UQX6iTk+I= -github.com/filecoin-project/lotus v1.5.0-pre3.0.20210209162308-5a3b9839540b/go.mod h1:frbnLE7QVAsmwe5XwTI6P0ZjjpGvA5/h1cM6yg2zhYM= +github.com/filecoin-project/lotus v1.5.2 h1:JXMTx9HYJ1G/sRPceNs4ZmGtYra5qpD22f3qDr2i0Zc= +github.com/filecoin-project/lotus v1.5.2/go.mod h1:ogeUSGizrAVxRbETP7Xe2muIXvxSyf+OfIb0kS4q3DQ= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbOzWYXXeIh41KF2M4= @@ -306,8 +306,8 @@ github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= -github.com/filecoin-project/specs-actors/v3 v3.0.1-0.20210128235937-57195d8909b1 h1:I6mvbwANIoToUZ37cYmuLyDKbPlAUxWnp0fJOZnlTz4= -github.com/filecoin-project/specs-actors/v3 v3.0.1-0.20210128235937-57195d8909b1/go.mod h1:NL24TPjJGyU7fh1ztpUyYcoZi3TmRKNEI0huPYmhObA= +github.com/filecoin-project/specs-actors/v3 v3.0.3 h1:bq9B1Jnq+Z0A+Yj3KnYhN3kcTpUyP6Umo3MZgai0BRE= +github.com/filecoin-project/specs-actors/v3 v3.0.3/go.mod h1:oMcmEed6B7H/wHabM3RQphTIhq0ibAKsbpYs+bQ/uxQ= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -531,6 +531,8 @@ github.com/ipfs/go-bitswap v0.3.2/go.mod h1:AyWWfN3moBzQX0banEtfKOfbXb3ZeoOeXnZG github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2 h1:qPDvcP19izTjU8rgo6p7gTXZlkMkF5bz5G3fqIsSCPE= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= +github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= +github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.3/go.mod h1:/NNihwTi6V2Yr6g8wBI+BSwPuURpBRMtYNGrlxZ8KuI= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= @@ -586,10 +588,11 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= -github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.5.2 h1:USD+daaSC+7pLHCxROThSaF6SF7WYXF03sjrta0rCfA= github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= +github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= +github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -727,6 +730,7 @@ github.com/jbenet/goprocess v0.1.4 h1:DRGOFReOMqqDNXwW70QkacFW0YN9QnwLV0Vqk+3oU0 github.com/jbenet/goprocess v0.1.4/go.mod h1:5yspPrukOVuOLORacaBi858NqyClJPQxYZlqdZVfqY4= github.com/jellevandenhooff/dkim v0.0.0-20150330215556-f50fe3d243e1/go.mod h1:E0B/fFc00Y+Rasa88328GlI/XbtyysCtTHZS8h7IrBU= github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= +github.com/jessevdk/go-flags v1.4.0 h1:4IU2WS7AumrZ/40jfhf4QVDMsQwqA7VEHozFRrGARJA= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik= @@ -960,8 +964,8 @@ github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEX github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.4.1 h1:j4umIg5nyus+sqNfU+FWvb9aeYFQH/A+nDFhWj+8yy8= -github.com/libp2p/go-libp2p-pubsub v0.4.1/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= +github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb h1:HExLcdXn8fgtXPciUw97O5NNhBn31dt6d9fVUD4cngo= +github.com/libp2p/go-libp2p-pubsub v0.4.2-0.20210212194758-6c1addf493eb/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1254,9 +1258,14 @@ github.com/nats-io/nkeys v0.1.3/go.mod h1:xpnFELMwJABBLVhffcfd1MZx6VsNRFpEugbxzi github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= github.com/neelance/sourcemap v0.0.0-20151028013722-8c68805598ab/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy8ALwOebjekYExl9HTT9urdawqC95tA= github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= +github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= +github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= +github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1494,7 +1503,9 @@ github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= @@ -1523,6 +1534,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2 h1:7HzUKl5d/dELS9lLeT4W6YvliZx+s9k/eOOIdHKrA/w= github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2 h1:bsUlNhdmbtlfdLVXAVfuvKQ01RnWAM09TVrJkI7NZs4= +github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -1821,6 +1834,8 @@ golang.org/x/sys v0.0.0-20200812155832-6a926be9bd1d/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200926100807-9d91bd62050c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f h1:+Nyd8tzPX9R7BWHguqsrbFdRx3WQ/1ib8I44HXV5yTA= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1967,6 +1982,8 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f h1:BLraFXnmrev5lT+xlilqcH8XK9/i0At2xKjWk4p6zsU= +gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= gopkg.in/cheggaaa/pb.v1 v1.0.28 h1:n1tBJnnK2r7g9OW2btFH91V92STTUevLXYFb8gy9EMk= gopkg.in/cheggaaa/pb.v1 v1.0.28/go.mod h1:V/YB90LKu/1FcN3WVnfiiE5oMCibMjukxqG/qStrOgw= From 571114bc44811c416f1dbeeddcfdcda72c13aced Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 16:40:22 +0100 Subject: [PATCH 018/239] Scaffolding for API versioning --- api/v0api/full.go | 679 ++++++++++++++++++++++++++++++++++++++ api/v0api/v1_wrapper.go | 32 ++ api/v1api/latest.go | 9 + cmd/lotus-gateway/main.go | 2 +- cmd/lotus/rpc.go | 25 +- 5 files changed, 737 insertions(+), 10 deletions(-) create mode 100644 api/v0api/full.go create mode 100644 api/v0api/v1_wrapper.go create mode 100644 api/v1api/latest.go diff --git a/api/v0api/full.go b/api/v0api/full.go new file mode 100644 index 000000000..aad8531a0 --- /dev/null +++ b/api/v0api/full.go @@ -0,0 +1,679 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-multistore" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" + "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + + "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/builtin/paych" + "github.com/filecoin-project/lotus/chain/types" + marketevents "github.com/filecoin-project/lotus/markets/loggers" + "github.com/filecoin-project/lotus/node/modules/dtypes" +) + +// FullNode API is a low-level interface to the Filecoin network full node +type FullNode interface { + api.Common + + // MethodGroup: Chain + // The Chain method group contains methods for interacting with the + // blockchain, but that do not require any form of state computation. + + // ChainNotify returns channel with chain head updates. + // First message is guaranteed to be of len == 1, and type == 'current'. + ChainNotify(context.Context) (<-chan []*api.HeadChange, error) //perm:read + + // ChainHead returns the current head of the chain. + ChainHead(context.Context) (*types.TipSet, error) //perm:read + + // ChainGetRandomnessFromTickets is used to sample the chain for randomness. + ChainGetRandomnessFromTickets(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + + // ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. + ChainGetRandomnessFromBeacon(ctx context.Context, tsk types.TipSetKey, personalization crypto.DomainSeparationTag, randEpoch abi.ChainEpoch, entropy []byte) (abi.Randomness, error) //perm:read + + // ChainGetBlock returns the block specified by the given CID. + ChainGetBlock(context.Context, cid.Cid) (*types.BlockHeader, error) //perm:read + // ChainGetTipSet returns the tipset specified by the given TipSetKey. + ChainGetTipSet(context.Context, types.TipSetKey) (*types.TipSet, error) //perm:read + + // ChainGetBlockMessages returns messages stored in the specified block. + // + // Note: If there are multiple blocks in a tipset, it's likely that some + // messages will be duplicated. It's also possible for blocks in a tipset to have + // different messages from the same sender at the same nonce. When that happens, + // only the first message (in a block with lowest ticket) will be considered + // for execution + // + // NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK + // + // DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET + // Use ChainGetParentMessages, which will perform correct message deduplication + ChainGetBlockMessages(ctx context.Context, blockCid cid.Cid) (*api.BlockMessages, error) //perm:read + + // ChainGetParentReceipts returns receipts for messages in parent tipset of + // the specified block. The receipts in the list returned is one-to-one with the + // messages returned by a call to ChainGetParentMessages with the same blockCid. + ChainGetParentReceipts(ctx context.Context, blockCid cid.Cid) ([]*types.MessageReceipt, error) //perm:read + + // ChainGetParentMessages returns messages stored in parent tipset of the + // specified block. + ChainGetParentMessages(ctx context.Context, blockCid cid.Cid) ([]api.Message, error) //perm:read + + // ChainGetTipSetByHeight looks back for a tipset at the specified epoch. + // If there are no blocks at the specified epoch, a tipset at an earlier epoch + // will be returned. + ChainGetTipSetByHeight(context.Context, abi.ChainEpoch, types.TipSetKey) (*types.TipSet, error) //perm:read + + // ChainReadObj reads ipld nodes referenced by the specified CID from chain + // blockstore and returns raw bytes. + ChainReadObj(context.Context, cid.Cid) ([]byte, error) //perm:read + + // ChainDeleteObj deletes node referenced by the given CID + ChainDeleteObj(context.Context, cid.Cid) error //perm:admin + + // ChainHasObj checks if a given CID exists in the chain blockstore. + ChainHasObj(context.Context, cid.Cid) (bool, error) //perm:read + + // ChainStatObj returns statistics about the graph referenced by 'obj'. + // If 'base' is also specified, then the returned stat will be a diff + // between the two objects. + ChainStatObj(ctx context.Context, obj cid.Cid, base cid.Cid) (api.ObjStat, error) //perm:read + + // ChainSetHead forcefully sets current chain head. Use with caution. + ChainSetHead(context.Context, types.TipSetKey) error //perm:admin + + // ChainGetGenesis returns the genesis tipset. + ChainGetGenesis(context.Context) (*types.TipSet, error) //perm:read + + // ChainTipSetWeight computes weight for the specified tipset. + ChainTipSetWeight(context.Context, types.TipSetKey) (types.BigInt, error) //perm:read + ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) //perm:read + + // ChainGetMessage reads a message referenced by the specified CID from the + // chain blockstore. + ChainGetMessage(context.Context, cid.Cid) (*types.Message, error) //perm:read + + // ChainGetPath returns a set of revert/apply operations needed to get from + // one tipset to another, for example: + //``` + // to + // ^ + // from tAA + // ^ ^ + // tBA tAB + // ^---*--^ + // ^ + // tRR + //``` + // Would return `[revert(tBA), apply(tAB), apply(tAA)]` + ChainGetPath(ctx context.Context, from types.TipSetKey, to types.TipSetKey) ([]*api.HeadChange, error) //perm:read + + // ChainExport returns a stream of bytes with CAR dump of chain data. + // The exported chain data includes the header chain from the given tipset + // back to genesis, the entire genesis state, and the most recent 'nroots' + // state trees. + // If oldmsgskip is set, messages from before the requested roots are also not included. + ChainExport(ctx context.Context, nroots abi.ChainEpoch, oldmsgskip bool, tsk types.TipSetKey) (<-chan []byte, error) //perm:read + + // MethodGroup: Beacon + // The Beacon method group contains methods for interacting with the random beacon (DRAND) + + // BeaconGetEntry returns the beacon entry for the given filecoin epoch. If + // the entry has not yet been produced, the call will block until the entry + // becomes available + BeaconGetEntry(ctx context.Context, epoch abi.ChainEpoch) (*types.BeaconEntry, error) //perm:read + + // GasEstimateFeeCap estimates gas fee cap + GasEstimateFeeCap(context.Context, *types.Message, int64, types.TipSetKey) (types.BigInt, error) //perm:read + + // GasEstimateGasLimit estimates gas used by the message and returns it. + // It fails if message fails to execute. + GasEstimateGasLimit(context.Context, *types.Message, types.TipSetKey) (int64, error) //perm:read + + // GasEstimateGasPremium estimates what gas price should be used for a + // message to have high likelihood of inclusion in `nblocksincl` epochs. + + GasEstimateGasPremium(_ context.Context, nblocksincl uint64, + sender address.Address, gaslimit int64, tsk types.TipSetKey) (types.BigInt, error) //perm:read + + // GasEstimateMessageGas estimates gas values for unset message gas fields + GasEstimateMessageGas(context.Context, *types.Message, *api.MessageSendSpec, types.TipSetKey) (*types.Message, error) //perm:read + + // MethodGroup: Sync + // The Sync method group contains methods for interacting with and + // observing the lotus sync service. + + // SyncState returns the current status of the lotus sync system. + SyncState(context.Context) (*api.SyncState, error) //perm:read + + // SyncSubmitBlock can be used to submit a newly created block to the. + // network through this node + SyncSubmitBlock(ctx context.Context, blk *types.BlockMsg) error //perm:write + + // SyncIncomingBlocks returns a channel streaming incoming, potentially not + // yet synced block headers. + SyncIncomingBlocks(ctx context.Context) (<-chan *types.BlockHeader, error) //perm:read + + // SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + SyncCheckpoint(ctx context.Context, tsk types.TipSetKey) error //perm:admin + + // SyncMarkBad marks a blocks as bad, meaning that it won't ever by synced. + // Use with extreme caution. + SyncMarkBad(ctx context.Context, bcid cid.Cid) error //perm:admin + + // SyncUnmarkBad unmarks a blocks as bad, making it possible to be validated and synced again. + SyncUnmarkBad(ctx context.Context, bcid cid.Cid) error //perm:admin + + // SyncUnmarkAllBad purges bad block cache, making it possible to sync to chains previously marked as bad + SyncUnmarkAllBad(ctx context.Context) error //perm:admin + + // SyncCheckBad checks if a block was marked as bad, and if it was, returns + // the reason. + SyncCheckBad(ctx context.Context, bcid cid.Cid) (string, error) //perm:read + + // SyncValidateTipset indicates whether the provided tipset is valid or not + SyncValidateTipset(ctx context.Context, tsk types.TipSetKey) (bool, error) //perm:read + + // MethodGroup: Mpool + // The Mpool methods are for interacting with the message pool. The message pool + // manages all incoming and outgoing 'messages' going over the network. + + // MpoolPending returns pending mempool messages. + MpoolPending(context.Context, types.TipSetKey) ([]*types.SignedMessage, error) //perm:read + + // MpoolSelect returns a list of pending messages for inclusion in the next block + MpoolSelect(context.Context, types.TipSetKey, float64) ([]*types.SignedMessage, error) //perm:read + + // MpoolPush pushes a signed message to mempool. + MpoolPush(context.Context, *types.SignedMessage) (cid.Cid, error) //perm:write + + // MpoolPushUntrusted pushes a signed message to mempool from untrusted sources. + MpoolPushUntrusted(context.Context, *types.SignedMessage) (cid.Cid, error) //perm:write + + // MpoolPushMessage atomically assigns a nonce, signs, and pushes a message + // to mempool. + // maxFee is only used when GasFeeCap/GasPremium fields aren't specified + // + // When maxFee is set to 0, MpoolPushMessage will guess appropriate fee + // based on current chain conditions + MpoolPushMessage(ctx context.Context, msg *types.Message, spec *api.MessageSendSpec) (*types.SignedMessage, error) //perm:sign + + // MpoolBatchPush batch pushes a signed message to mempool. + MpoolBatchPush(context.Context, []*types.SignedMessage) ([]cid.Cid, error) //perm:write + + // MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. + MpoolBatchPushUntrusted(context.Context, []*types.SignedMessage) ([]cid.Cid, error) //perm:write + + // MpoolBatchPushMessage batch pushes a unsigned message to mempool. + MpoolBatchPushMessage(context.Context, []*types.Message, *api.MessageSendSpec) ([]*types.SignedMessage, error) //perm:sign + + // MpoolGetNonce gets next nonce for the specified sender. + // Note that this method may not be atomic. Use MpoolPushMessage instead. + MpoolGetNonce(context.Context, address.Address) (uint64, error) //perm:read + MpoolSub(context.Context) (<-chan api.MpoolUpdate, error) //perm:read + + // MpoolClear clears pending messages from the mpool + MpoolClear(context.Context, bool) error //perm:write + + // MpoolGetConfig returns (a copy of) the current mpool config + MpoolGetConfig(context.Context) (*types.MpoolConfig, error) //perm:read + // MpoolSetConfig sets the mpool config to (a copy of) the supplied config + MpoolSetConfig(context.Context, *types.MpoolConfig) error //perm:admin + + // MethodGroup: Miner + + MinerGetBaseInfo(context.Context, address.Address, abi.ChainEpoch, types.TipSetKey) (*api.MiningBaseInfo, error) //perm:read + MinerCreateBlock(context.Context, *api.BlockTemplate) (*types.BlockMsg, error) //perm:write + + // // UX ? + + // MethodGroup: Wallet + + // WalletNew creates a new address in the wallet with the given sigType. + // Available key types: bls, secp256k1, secp256k1-ledger + // Support for numerical types: 1 - secp256k1, 2 - BLS is deprecated + WalletNew(context.Context, types.KeyType) (address.Address, error) //perm:write + // WalletHas indicates whether the given address is in the wallet. + WalletHas(context.Context, address.Address) (bool, error) //perm:write + // WalletList lists all the addresses in the wallet. + WalletList(context.Context) ([]address.Address, error) //perm:write + // WalletBalance returns the balance of the given address at the current head of the chain. + WalletBalance(context.Context, address.Address) (types.BigInt, error) //perm:read + // WalletSign signs the given bytes using the given address. + WalletSign(context.Context, address.Address, []byte) (*crypto.Signature, error) //perm:sign + // WalletSignMessage signs the given message using the given address. + WalletSignMessage(context.Context, address.Address, *types.Message) (*types.SignedMessage, error) //perm:sign + // WalletVerify takes an address, a signature, and some bytes, and indicates whether the signature is valid. + // The address does not have to be in the wallet. + WalletVerify(context.Context, address.Address, []byte, *crypto.Signature) (bool, error) //perm:read + // WalletDefaultAddress returns the address marked as default in the wallet. + WalletDefaultAddress(context.Context) (address.Address, error) //perm:write + // WalletSetDefault marks the given address as as the default one. + WalletSetDefault(context.Context, address.Address) error //perm:write + // WalletExport returns the private key of an address in the wallet. + WalletExport(context.Context, address.Address) (*types.KeyInfo, error) //perm:admin + // WalletImport receives a KeyInfo, which includes a private key, and imports it into the wallet. + WalletImport(context.Context, *types.KeyInfo) (address.Address, error) //perm:admin + // WalletDelete deletes an address from the wallet. + WalletDelete(context.Context, address.Address) error //perm:admin + // WalletValidateAddress validates whether a given string can be decoded as a well-formed address + WalletValidateAddress(context.Context, string) (address.Address, error) //perm:read + + // Other + + // MethodGroup: Client + // The Client methods all have to do with interacting with the storage and + // retrieval markets as a client + + // ClientImport imports file under the specified path into filestore. + ClientImport(ctx context.Context, ref api.FileRef) (*api.ImportRes, error) //perm:admin + // ClientRemoveImport removes file import + ClientRemoveImport(ctx context.Context, importID multistore.StoreID) error //perm:admin + // ClientStartDeal proposes a deal with a miner. + ClientStartDeal(ctx context.Context, params *api.StartDealParams) (*cid.Cid, error) //perm:admin + // ClientGetDealInfo returns the latest information about a given deal. + ClientGetDealInfo(context.Context, cid.Cid) (*api.DealInfo, error) //perm:read + // ClientListDeals returns information about the deals made by the local client. + ClientListDeals(ctx context.Context) ([]api.DealInfo, error) //perm:write + // ClientGetDealUpdates returns the status of updated deals + ClientGetDealUpdates(ctx context.Context) (<-chan api.DealInfo, error) //perm:write + // ClientGetDealStatus returns status given a code + ClientGetDealStatus(ctx context.Context, statusCode uint64) (string, error) //perm:read + // ClientHasLocal indicates whether a certain CID is locally stored. + ClientHasLocal(ctx context.Context, root cid.Cid) (bool, error) //perm:write + // ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer). + ClientFindData(ctx context.Context, root cid.Cid, piece *cid.Cid) ([]api.QueryOffer, error) //perm:read + // ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. + ClientMinerQueryOffer(ctx context.Context, miner address.Address, root cid.Cid, piece *cid.Cid) (api.QueryOffer, error) //perm:read + // ClientRetrieve initiates the retrieval of a file, as specified in the order. + ClientRetrieve(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) error //perm:admin + // ClientRetrieveWithEvents initiates the retrieval of a file, as specified in the order, and provides a channel + // of status updates. + ClientRetrieveWithEvents(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) (<-chan marketevents.RetrievalEvent, error) //perm:admin + // ClientQueryAsk returns a signed StorageAsk from the specified miner. + ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) //perm:read + // ClientCalcCommP calculates the CommP and data size of the specified CID + ClientDealPieceCID(ctx context.Context, root cid.Cid) (api.DataCIDSize, error) //perm:read + // ClientCalcCommP calculates the CommP for a specified file + ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet, error) //perm:write + // ClientGenCar generates a CAR file for the specified file. + ClientGenCar(ctx context.Context, ref api.FileRef, outpath string) error //perm:write + // ClientDealSize calculates real deal data size + ClientDealSize(ctx context.Context, root cid.Cid) (api.DataSize, error) //perm:read + // ClientListTransfers returns the status of all ongoing transfers of data + ClientListDataTransfers(ctx context.Context) ([]api.DataTransferChannel, error) //perm:write + ClientDataTransferUpdates(ctx context.Context) (<-chan api.DataTransferChannel, error) //perm:write + // ClientRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + ClientRestartDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + // ClientCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + ClientCancelDataTransfer(ctx context.Context, transferID datatransfer.TransferID, otherPeer peer.ID, isInitiator bool) error //perm:write + // ClientRetrieveTryRestartInsufficientFunds attempts to restart stalled retrievals on a given payment channel + // which are stuck due to insufficient funds + ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error //perm:write + + // ClientUnimport removes references to the specified file from filestore + //ClientUnimport(path string) + + // ClientListImports lists imported files and their root CIDs + ClientListImports(ctx context.Context) ([]api.Import, error) //perm:write + + //ClientListAsks() []Ask + + // MethodGroup: State + // The State methods are used to query, inspect, and interact with chain state. + // Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset. + // A nil TipSetKey can be provided as a param, this will cause the heaviest tipset in the chain to be used. + + // StateCall runs the given message and returns its result without any persisted changes. + // + // StateCall applies the message to the tipset's parent state. The + // message is not applied on-top-of the messages in the passed-in + // tipset. + StateCall(context.Context, *types.Message, types.TipSetKey) (*api.InvocResult, error) //perm:read + // StateReplay replays a given message, assuming it was included in a block in the specified tipset. + // + // If a tipset key is provided, and a replacing message is found on chain, + // the method will return an error saying that the message wasn't found + // + // If no tipset key is provided, the appropriate tipset is looked up, and if + // the message was gas-repriced, the on-chain message will be replayed - in + // that case the returned InvocResult.MsgCid will not match the Cid param + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that InvocResult.MsgCid is equal to the provided Cid. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + StateReplay(context.Context, types.TipSetKey, cid.Cid) (*api.InvocResult, error) //perm:read + // StateGetActor returns the indicated actor's nonce and balance. + StateGetActor(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*types.Actor, error) //perm:read + // StateReadState returns the indicated actor's state. + StateReadState(ctx context.Context, actor address.Address, tsk types.TipSetKey) (*api.ActorState, error) //perm:read + // StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. + StateListMessages(ctx context.Context, match *api.MessageMatch, tsk types.TipSetKey, toht abi.ChainEpoch) ([]cid.Cid, error) //perm:read + // StateDecodeParams attempts to decode the provided params, based on the recipient actor address and method number. + StateDecodeParams(ctx context.Context, toAddr address.Address, method abi.MethodNum, params []byte, tsk types.TipSetKey) (interface{}, error) //perm:read + + // StateNetworkName returns the name of the network the node is synced to + StateNetworkName(context.Context) (dtypes.NetworkName, error) //perm:read + // StateMinerSectors returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included. + StateMinerSectors(context.Context, address.Address, *bitfield.BitField, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + // StateMinerActiveSectors returns info about sectors that a given miner is actively proving. + StateMinerActiveSectors(context.Context, address.Address, types.TipSetKey) ([]*miner.SectorOnChainInfo, error) //perm:read + // StateMinerProvingDeadline calculates the deadline at some epoch for a proving period + // and returns the deadline-related calculations. + StateMinerProvingDeadline(context.Context, address.Address, types.TipSetKey) (*dline.Info, error) //perm:read + // StateMinerPower returns the power of the indicated miner + StateMinerPower(context.Context, address.Address, types.TipSetKey) (*api.MinerPower, error) //perm:read + // StateMinerInfo returns info about the indicated miner + StateMinerInfo(context.Context, address.Address, types.TipSetKey) (miner.MinerInfo, error) //perm:read + // StateMinerDeadlines returns all the proving deadlines for the given miner + StateMinerDeadlines(context.Context, address.Address, types.TipSetKey) ([]api.Deadline, error) //perm:read + // StateMinerPartitions returns all partitions in the specified deadline + StateMinerPartitions(ctx context.Context, m address.Address, dlIdx uint64, tsk types.TipSetKey) ([]api.Partition, error) //perm:read + // StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner + StateMinerFaults(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) //perm:read + // StateAllMinerFaults returns all non-expired Faults that occur within lookback epochs of the given tipset + StateAllMinerFaults(ctx context.Context, lookback abi.ChainEpoch, ts types.TipSetKey) ([]*api.Fault, error) //perm:read + // StateMinerRecoveries returns a bitfield indicating the recovering sectors of the given miner + StateMinerRecoveries(context.Context, address.Address, types.TipSetKey) (bitfield.BitField, error) //perm:read + // StateMinerInitialPledgeCollateral returns the precommit deposit for the specified miner's sector + StateMinerPreCommitDepositForPower(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) //perm:read + // StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector + StateMinerInitialPledgeCollateral(context.Context, address.Address, miner.SectorPreCommitInfo, types.TipSetKey) (types.BigInt, error) //perm:read + // StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent + StateMinerAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) //perm:read + // StateMinerSectorAllocated checks if a sector is allocated + StateMinerSectorAllocated(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (bool, error) //perm:read + // StateSectorPreCommitInfo returns the PreCommit info for the specified miner's sector + StateSectorPreCommitInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) //perm:read + // StateSectorGetInfo returns the on-chain info for the specified miner's sector. Returns null in case the sector info isn't found + // NOTE: returned info.Expiration may not be accurate in some cases, use StateSectorExpiration to get accurate + // expiration epoch + StateSectorGetInfo(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorOnChainInfo, error) //perm:read + // StateSectorExpiration returns epoch at which given sector will expire + StateSectorExpiration(context.Context, address.Address, abi.SectorNumber, types.TipSetKey) (*miner.SectorExpiration, error) //perm:read + // StateSectorPartition finds deadline/partition with the specified sector + StateSectorPartition(ctx context.Context, maddr address.Address, sectorNumber abi.SectorNumber, tok types.TipSetKey) (*miner.SectorLocation, error) //perm:read + // StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that MsgLookup.Message is equal to the provided 'cid'. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + StateSearchMsg(context.Context, cid.Cid) (*api.MsgLookup, error) //perm:read + // StateSearchMsgLimited looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that MsgLookup.Message is equal to the provided 'cid'. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + StateSearchMsgLimited(ctx context.Context, msg cid.Cid, limit abi.ChainEpoch) (*api.MsgLookup, error) //perm:read + // StateWaitMsg looks back in the chain for a message. If not found, it blocks until the + // message arrives on chain, and gets to the indicated confidence depth. + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that MsgLookup.Message is equal to the provided 'cid'. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + StateWaitMsg(ctx context.Context, cid cid.Cid, confidence uint64) (*api.MsgLookup, error) //perm:read + // StateWaitMsgLimited looks back up to limit epochs in the chain for a message. + // If not found, it blocks until the message arrives on chain, and gets to the + // indicated confidence depth. + // + // NOTE: If a replacing message is found on chain, this method will return + // a MsgLookup for the replacing message - the MsgLookup.Message will be a different + // CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the + // result of the execution of the replacing message. + // + // If the caller wants to ensure that exactly the requested message was executed, + // they MUST check that MsgLookup.Message is equal to the provided 'cid'. + // Without this check both the requested and original message may appear as + // successfully executed on-chain, which may look like a double-spend. + // + // A replacing message is a message with a different CID, any of Gas values, and + // different signature, but with all other parameters matching (source/destination, + // nonce, params, etc.) + StateWaitMsgLimited(ctx context.Context, cid cid.Cid, confidence uint64, limit abi.ChainEpoch) (*api.MsgLookup, error) //perm:read + // StateListMiners returns the addresses of every miner that has claimed power in the Power Actor + StateListMiners(context.Context, types.TipSetKey) ([]address.Address, error) //perm:read + // StateListActors returns the addresses of every actor in the state + StateListActors(context.Context, types.TipSetKey) ([]address.Address, error) //perm:read + // StateMarketBalance looks up the Escrow and Locked balances of the given address in the Storage Market + StateMarketBalance(context.Context, address.Address, types.TipSetKey) (api.MarketBalance, error) //perm:read + // StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market + StateMarketParticipants(context.Context, types.TipSetKey) (map[string]api.MarketBalance, error) //perm:read + // StateMarketDeals returns information about every deal in the Storage Market + StateMarketDeals(context.Context, types.TipSetKey) (map[string]api.MarketDeal, error) //perm:read + // StateMarketStorageDeal returns information about the indicated deal + StateMarketStorageDeal(context.Context, abi.DealID, types.TipSetKey) (*api.MarketDeal, error) //perm:read + // StateLookupID retrieves the ID address of the given address + StateLookupID(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read + // StateAccountKey returns the public key address of the given ID address + StateAccountKey(context.Context, address.Address, types.TipSetKey) (address.Address, error) //perm:read + // StateChangedActors returns all the actors whose states change between the two given state CIDs + // TODO: Should this take tipset keys instead? + StateChangedActors(context.Context, cid.Cid, cid.Cid) (map[string]types.Actor, error) //perm:read + // StateGetReceipt returns the message receipt for the given message or for a + // matching gas-repriced replacing message + // + // NOTE: If the requested message was replaced, this method will return the receipt + // for the replacing message - if the caller needs the receipt for exactly the + // requested message, use StateSearchMsg().Receipt, and check that MsgLookup.Message + // is matching the requested CID + // + // DEPRECATED: Use StateSearchMsg, this method won't be supported in v1 API + StateGetReceipt(context.Context, cid.Cid, types.TipSetKey) (*types.MessageReceipt, error) //perm:read + // StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set + StateMinerSectorCount(context.Context, address.Address, types.TipSetKey) (api.MinerSectors, error) //perm:read + // StateCompute is a flexible command that applies the given messages on the given tipset. + // The messages are run as though the VM were at the provided height. + // + // When called, StateCompute will: + // - Load the provided tipset, or use the current chain head if not provided + // - Compute the tipset state of the provided tipset on top of the parent state + // - (note that this step runs before vmheight is applied to the execution) + // - Execute state upgrade if any were scheduled at the epoch, or in null + // blocks preceding the tipset + // - Call the cron actor on null blocks preceding the tipset + // - For each block in the tipset + // - Apply messages in blocks in the specified + // - Award block reward by calling the reward actor + // - Call the cron actor for the current epoch + // - If the specified vmheight is higher than the current epoch, apply any + // needed state upgrades to the state + // - Apply the specified messages to the state + // + // The vmheight parameter sets VM execution epoch, and can be used to simulate + // message execution in different network versions. If the specified vmheight + // epoch is higher than the epoch of the specified tipset, any state upgrades + // until the vmheight will be executed on the state before applying messages + // specified by the user. + // + // Note that the initial tipset state computation is not affected by the + // vmheight parameter - only the messages in the `apply` set are + // + // If the caller wants to simply compute the state, vmheight should be set to + // the epoch of the specified tipset. + // + // Messages in the `apply` parameter must have the correct nonces, and gas + // values set. + StateCompute(context.Context, abi.ChainEpoch, []*types.Message, types.TipSetKey) (*api.ComputeStateOutput, error) //perm:read + // StateVerifierStatus returns the data cap for the given address. + // Returns nil if there is no entry in the data cap table for the + // address. + StateVerifierStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read + // StateVerifiedClientStatus returns the data cap for the given address. + // Returns nil if there is no entry in the data cap table for the + // address. + StateVerifiedClientStatus(ctx context.Context, addr address.Address, tsk types.TipSetKey) (*abi.StoragePower, error) //perm:read + // StateVerifiedClientStatus returns the address of the Verified Registry's root key + StateVerifiedRegistryRootKey(ctx context.Context, tsk types.TipSetKey) (address.Address, error) //perm:read + // StateDealProviderCollateralBounds returns the min and max collateral a storage provider + // can issue. It takes the deal size and verified status as parameters. + StateDealProviderCollateralBounds(context.Context, abi.PaddedPieceSize, bool, types.TipSetKey) (api.DealCollateralBounds, error) //perm:read + + // StateCirculatingSupply returns the exact circulating supply of Filecoin at the given tipset. + // This is not used anywhere in the protocol itself, and is only for external consumption. + StateCirculatingSupply(context.Context, types.TipSetKey) (abi.TokenAmount, error) //perm:read + // StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. + // This is the value reported by the runtime interface to actors code. + StateVMCirculatingSupplyInternal(context.Context, types.TipSetKey) (api.CirculatingSupply, error) //perm:read + // StateNetworkVersion returns the network version at the given tipset + StateNetworkVersion(context.Context, types.TipSetKey) (apitypes.NetworkVersion, error) //perm:read + + // MethodGroup: Msig + // The Msig methods are used to interact with multisig wallets on the + // filecoin network + + // MsigGetAvailableBalance returns the portion of a multisig's balance that can be withdrawn or spent + MsigGetAvailableBalance(context.Context, address.Address, types.TipSetKey) (types.BigInt, error) //perm:read + // MsigGetVestingSchedule returns the vesting details of a given multisig. + MsigGetVestingSchedule(context.Context, address.Address, types.TipSetKey) (api.MsigVesting, error) //perm:read + // MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. + // It takes the following params: , , + MsigGetVested(context.Context, address.Address, types.TipSetKey, types.TipSetKey) (types.BigInt, error) //perm:read + + //MsigGetPending returns pending transactions for the given multisig + //wallet. Once pending transactions are fully approved, they will no longer + //appear here. + MsigGetPending(context.Context, address.Address, types.TipSetKey) ([]*api.MsigTransaction, error) //perm:read + + // MsigCreate creates a multisig wallet + // It takes the following params: , , + //, , + MsigCreate(context.Context, uint64, []address.Address, abi.ChainEpoch, types.BigInt, address.Address, types.BigInt) (cid.Cid, error) //perm:sign + // MsigPropose proposes a multisig message + // It takes the following params: , , , + // , , + MsigPropose(context.Context, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign + + // MsigApprove approves a previously-proposed multisig message by transaction ID + // It takes the following params: , + MsigApprove(context.Context, address.Address, uint64, address.Address) (cid.Cid, error) //perm:sign + + // MsigApproveTxnHash approves a previously-proposed multisig message, specified + // using both transaction ID and a hash of the parameters used in the + // proposal. This method of approval can be used to ensure you only approve + // exactly the transaction you think you are. + // It takes the following params: , , , , , + // , , + MsigApproveTxnHash(context.Context, address.Address, uint64, address.Address, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign + + // MsigCancel cancels a previously-proposed multisig message + // It takes the following params: , , , , + // , , + MsigCancel(context.Context, address.Address, uint64, address.Address, types.BigInt, address.Address, uint64, []byte) (cid.Cid, error) //perm:sign + // MsigAddPropose proposes adding a signer in the multisig + // It takes the following params: , , + // , + MsigAddPropose(context.Context, address.Address, address.Address, address.Address, bool) (cid.Cid, error) //perm:sign + // MsigAddApprove approves a previously proposed AddSigner message + // It takes the following params: , , , + // , , + MsigAddApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, bool) (cid.Cid, error) //perm:sign + // MsigAddCancel cancels a previously proposed AddSigner message + // It takes the following params: , , , + // , + MsigAddCancel(context.Context, address.Address, address.Address, uint64, address.Address, bool) (cid.Cid, error) //perm:sign + // MsigSwapPropose proposes swapping 2 signers in the multisig + // It takes the following params: , , + // , + MsigSwapPropose(context.Context, address.Address, address.Address, address.Address, address.Address) (cid.Cid, error) //perm:sign + // MsigSwapApprove approves a previously proposed SwapSigner + // It takes the following params: , , , + // , , + MsigSwapApprove(context.Context, address.Address, address.Address, uint64, address.Address, address.Address, address.Address) (cid.Cid, error) //perm:sign + // MsigSwapCancel cancels a previously proposed SwapSigner message + // It takes the following params: , , , + // , + MsigSwapCancel(context.Context, address.Address, address.Address, uint64, address.Address, address.Address) (cid.Cid, error) //perm:sign + + // MsigRemoveSigner proposes the removal of a signer from the multisig. + // It accepts the multisig to make the change on, the proposer address to + // send the message from, the address to be removed, and a boolean + // indicating whether or not the signing threshold should be lowered by one + // along with the address removal. + MsigRemoveSigner(ctx context.Context, msig address.Address, proposer address.Address, toRemove address.Address, decrease bool) (cid.Cid, error) //perm:sign + + // MarketAddBalance adds funds to the market actor + MarketAddBalance(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + // MarketGetReserved gets the amount of funds that are currently reserved for the address + MarketGetReserved(ctx context.Context, addr address.Address) (types.BigInt, error) //perm:sign + // MarketReserveFunds reserves funds for a deal + MarketReserveFunds(ctx context.Context, wallet address.Address, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + // MarketReleaseFunds releases funds reserved by MarketReserveFunds + MarketReleaseFunds(ctx context.Context, addr address.Address, amt types.BigInt) error //perm:sign + // MarketWithdraw withdraws unlocked funds from the market actor + MarketWithdraw(ctx context.Context, wallet, addr address.Address, amt types.BigInt) (cid.Cid, error) //perm:sign + + // MethodGroup: Paych + // The Paych methods are for interacting with and managing payment channels + + PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*api.ChannelInfo, error) //perm:sign + PaychGetWaitReady(context.Context, cid.Cid) (address.Address, error) //perm:sign + PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) //perm:sign + PaychList(context.Context) ([]address.Address, error) //perm:read + PaychStatus(context.Context, address.Address) (*api.PaychStatus, error) //perm:read + PaychSettle(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychCollect(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) //perm:sign + PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error //perm:read + PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) //perm:read + PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*api.VoucherCreateResult, error) //perm:sign + PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) //perm:write + PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) //perm:write + PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) //perm:sign + + // CreateBackup creates node backup onder the specified file name. The + // method requires that the lotus daemon is running with the + // LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that + // the path specified when calling CreateBackup is within the base path + CreateBackup(ctx context.Context, fpath string) error //perm:admin +} + diff --git a/api/v0api/v1_wrapper.go b/api/v0api/v1_wrapper.go new file mode 100644 index 000000000..89130160d --- /dev/null +++ b/api/v0api/v1_wrapper.go @@ -0,0 +1,32 @@ +package v0api + +import ( + "github.com/filecoin-project/lotus/api/v1api" +) + +type WrapperV1 struct { + v1api.FullNode +} + +/* example: +- dropped StateGetReceipt +- tsk param for StateSearchMsg + +func (w *WrapperV1) StateSearchMsg(ctx context.Context, c cid.Cid) (*api.MsgLookup, error) { + return w.FullNode.StateSearchMsg(ctx, c, types.EmptyTSK) +} + +func (w *WrapperV1) StateGetReceipt(ctx context.Context, cid cid.Cid, key types.TipSetKey) (*types.MessageReceipt, error) { + m, err := w.FullNode.StateSearchMsg(ctx, cid, key) + if err != nil { + return nil, err + } + + if m == nil { + return nil, nil + } + + return &m.Receipt, nil +}*/ + +var _ FullNode = &WrapperV1{} diff --git a/api/v1api/latest.go b/api/v1api/latest.go new file mode 100644 index 000000000..eb67e1e36 --- /dev/null +++ b/api/v1api/latest.go @@ -0,0 +1,9 @@ +package v1api + +import ( + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" +) + +type FullNode = api.FullNode +type FullNodeStruct = apistruct.FullNodeStruct diff --git a/cmd/lotus-gateway/main.go b/cmd/lotus-gateway/main.go index 23b743d73..05fa62c75 100644 --- a/cmd/lotus-gateway/main.go +++ b/cmd/lotus-gateway/main.go @@ -100,7 +100,7 @@ var runCmd = &cli.Command{ rpcServer := jsonrpc.NewServer(serverOptions...) rpcServer.Register("Filecoin", metrics.MetricedGatewayAPI(NewGatewayAPI(api))) - mux.Handle("/rpc/v0", rpcServer) + mux.Handle("/rpc/v0", rpcServer) // todo: v1 support registry := promclient.DefaultRegisterer.(*promclient.Registry) exporter, err := prometheus.NewExporter(prometheus.Options{ diff --git a/cmd/lotus/rpc.go b/cmd/lotus/rpc.go index abadfd20c..0f0d1225d 100644 --- a/cmd/lotus/rpc.go +++ b/cmd/lotus/rpc.go @@ -21,8 +21,9 @@ import ( "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/impl" @@ -30,21 +31,27 @@ import ( var log = logging.Logger("main") -func serveRPC(a api.FullNode, stop node.StopFunc, addr multiaddr.Multiaddr, shutdownCh <-chan struct{}, maxRequestSize int64) error { +func serveRPC(a v1api.FullNode, stop node.StopFunc, addr multiaddr.Multiaddr, shutdownCh <-chan struct{}, maxRequestSize int64) error { serverOptions := make([]jsonrpc.ServerOption, 0) if maxRequestSize != 0 { // config set serverOptions = append(serverOptions, jsonrpc.WithMaxRequestSize(maxRequestSize)) } - rpcServer := jsonrpc.NewServer(serverOptions...) - rpcServer.Register("Filecoin", apistruct.PermissionedFullAPI(metrics.MetricedFullAPI(a))) - rpcServer.AliasMethod("rpc.discover", "Filecoin.Discover") + serveRpc := func(path string, hnd interface{}) { + rpcServer := jsonrpc.NewServer(serverOptions...) + rpcServer.Register("Filecoin", hnd) - ah := &auth.Handler{ - Verify: a.AuthVerify, - Next: rpcServer.ServeHTTP, + ah := &auth.Handler{ + Verify: a.AuthVerify, + Next: rpcServer.ServeHTTP, + } + + http.Handle(path, ah) } - http.Handle("/rpc/v0", ah) + pma := apistruct.PermissionedFullAPI(metrics.MetricedFullAPI(a)) + + serveRpc("/rpc/v1", pma) + serveRpc("/rpc/v0", &v0api.WrapperV1{FullNode: pma}) importAH := &auth.Handler{ Verify: a.AuthVerify, From 3fe4b50a13354d3ea9422e3471cef75617036aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 17:01:56 +0100 Subject: [PATCH 019/239] apigen: Work with versioned apis --- Makefile | 6 +- api/apistruct/struct.go | 20 +- api/apistruct/types.go | 12 + api/v0api/common.go | 77 +++ api/v0api/full.go | 39 +- api/v0api/struct.go | 1231 +++++++++++++++++++++++++++++++++++++++ gen/api/proxygen.go | 34 +- 7 files changed, 1378 insertions(+), 41 deletions(-) create mode 100644 api/apistruct/types.go create mode 100644 api/v0api/common.go create mode 100644 api/v0api/struct.go diff --git a/Makefile b/Makefile index 16269e133..5d7781b1d 100644 --- a/Makefile +++ b/Makefile @@ -326,9 +326,9 @@ method-gen: (cd ./lotuspond/front/src/chain && go run ./methodgen.go) api-gen: - go run ./gen/api > api/apistruct/struct.go - goimports -w api/apistruct - goimports -w api/apistruct + go run ./gen/api + goimports -w api/apistruct api/v0api + goimports -w api/apistruct api/v0api .PHONY: api-gen docsgen: docsgen-md docsgen-openrpc diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34cf52fce..63dbb51b0 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -32,10 +32,10 @@ import ( "github.com/filecoin-project/specs-storage/storage" "github.com/google/uuid" "github.com/ipfs/go-cid" - "github.com/libp2p/go-libp2p-core/metrics" + metrics "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" + protocol "github.com/libp2p/go-libp2p-core/protocol" ) type ChainIOStruct struct { @@ -2162,11 +2162,11 @@ func (s *WorkerStruct) WaitQuiet(p0 context.Context) error { return s.Internal.WaitQuiet(p0) } -var _ api.ChainIO = new(ChainIOStruct) -var _ api.Common = new(CommonStruct) -var _ api.FullNode = new(FullNodeStruct) -var _ api.Gateway = new(GatewayStruct) -var _ api.Signable = new(SignableStruct) -var _ api.StorageMiner = new(StorageMinerStruct) -var _ api.Wallet = new(WalletStruct) -var _ api.Worker = new(WorkerStruct) +var _ ChainIO = new(ChainIOStruct) +var _ Common = new(CommonStruct) +var _ FullNode = new(FullNodeStruct) +var _ Gateway = new(GatewayStruct) +var _ Signable = new(SignableStruct) +var _ StorageMiner = new(StorageMinerStruct) +var _ Wallet = new(WalletStruct) +var _ Worker = new(WorkerStruct) diff --git a/api/apistruct/types.go b/api/apistruct/types.go new file mode 100644 index 000000000..57c89cdaa --- /dev/null +++ b/api/apistruct/types.go @@ -0,0 +1,12 @@ +package apistruct + +import "github.com/filecoin-project/lotus/api" + +type ChainIO = api.ChainIO +type Common = api.Common +type FullNode = api.FullNode +type Gateway = api.Gateway +type Signable = api.Signable +type StorageMiner = api.StorageMiner +type Wallet = api.Wallet +type Worker = api.Worker diff --git a/api/v0api/common.go b/api/v0api/common.go new file mode 100644 index 000000000..6848fa6a8 --- /dev/null +++ b/api/v0api/common.go @@ -0,0 +1,77 @@ +package v0api + +import ( + "context" + + "github.com/filecoin-project/lotus/api" + + "github.com/google/uuid" + + "github.com/filecoin-project/go-jsonrpc/auth" + metrics "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + protocol "github.com/libp2p/go-libp2p-core/protocol" + + apitypes "github.com/filecoin-project/lotus/api/types" +) + +type Common interface { + + // MethodGroup: Auth + + AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read + AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin + + // MethodGroup: Net + + NetConnectedness(context.Context, peer.ID) (network.Connectedness, error) //perm:read + NetPeers(context.Context) ([]peer.AddrInfo, error) //perm:read + NetConnect(context.Context, peer.AddrInfo) error //perm:write + NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read + NetDisconnect(context.Context, peer.ID) error //perm:write + NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error) //perm:read + NetPubsubScores(context.Context) ([]api.PubsubScore, error) //perm:read + NetAutoNatStatus(context.Context) (api.NatInfo, error) //perm:read + NetAgentVersion(ctx context.Context, p peer.ID) (string, error) //perm:read + NetPeerInfo(context.Context, peer.ID) (*api.ExtendedPeerInfo, error) //perm:read + + // NetBandwidthStats returns statistics about the nodes total bandwidth + // usage and current rate across all peers and protocols. + NetBandwidthStats(ctx context.Context) (metrics.Stats, error) //perm:read + + // NetBandwidthStatsByPeer returns statistics about the nodes bandwidth + // usage and current rate per peer + NetBandwidthStatsByPeer(ctx context.Context) (map[string]metrics.Stats, error) //perm:read + + // NetBandwidthStatsByProtocol returns statistics about the nodes bandwidth + // usage and current rate per protocol + NetBandwidthStatsByProtocol(ctx context.Context) (map[protocol.ID]metrics.Stats, error) //perm:read + + // ConnectionGater API + NetBlockAdd(ctx context.Context, acl api.NetBlockList) error //perm:admin + NetBlockRemove(ctx context.Context, acl api.NetBlockList) error //perm:admin + NetBlockList(ctx context.Context) (api.NetBlockList, error) //perm:read + + // MethodGroup: Common + + // Discover returns an OpenRPC document describing an RPC API. + Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) //perm:read + + // ID returns peerID of libp2p node backing this API + ID(context.Context) (peer.ID, error) //perm:read + + // Version provides information about API provider + Version(context.Context) (api.APIVersion, error) //perm:read + + LogList(context.Context) ([]string, error) //perm:write + LogSetLevel(context.Context, string, string) error //perm:write + + // trigger graceful shutdown + Shutdown(context.Context) error //perm:admin + + // Session returns a random UUID of api provider session + Session(context.Context) (uuid.UUID, error) //perm:read + + Closing(context.Context) (<-chan struct{}, error) //perm:read +} diff --git a/api/v0api/full.go b/api/v0api/full.go index aad8531a0..8e370de51 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -25,7 +25,7 @@ import ( // FullNode API is a low-level interface to the Filecoin network full node type FullNode interface { - api.Common + Common // MethodGroup: Chain // The Chain method group contains methods for interacting with the @@ -100,7 +100,7 @@ type FullNode interface { // ChainTipSetWeight computes weight for the specified tipset. ChainTipSetWeight(context.Context, types.TipSetKey) (types.BigInt, error) //perm:read - ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) //perm:read + ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) //perm:read // ChainGetMessage reads a message referenced by the specified CID from the // chain blockstore. @@ -223,7 +223,7 @@ type FullNode interface { // MpoolGetNonce gets next nonce for the specified sender. // Note that this method may not be atomic. Use MpoolPushMessage instead. MpoolGetNonce(context.Context, address.Address) (uint64, error) //perm:read - MpoolSub(context.Context) (<-chan api.MpoolUpdate, error) //perm:read + MpoolSub(context.Context) (<-chan api.MpoolUpdate, error) //perm:read // MpoolClear clears pending messages from the mpool MpoolClear(context.Context, bool) error //perm:write @@ -653,22 +653,22 @@ type FullNode interface { // MethodGroup: Paych // The Paych methods are for interacting with and managing payment channels - PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*api.ChannelInfo, error) //perm:sign - PaychGetWaitReady(context.Context, cid.Cid) (address.Address, error) //perm:sign - PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) //perm:sign - PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) //perm:sign - PaychList(context.Context) ([]address.Address, error) //perm:read - PaychStatus(context.Context, address.Address) (*api.PaychStatus, error) //perm:read - PaychSettle(context.Context, address.Address) (cid.Cid, error) //perm:sign - PaychCollect(context.Context, address.Address) (cid.Cid, error) //perm:sign - PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign - PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) //perm:sign - PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error //perm:read - PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) //perm:read - PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*api.VoucherCreateResult, error) //perm:sign - PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) //perm:write - PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) //perm:write - PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) //perm:sign + PaychGet(ctx context.Context, from, to address.Address, amt types.BigInt) (*api.ChannelInfo, error) //perm:sign + PaychGetWaitReady(context.Context, cid.Cid) (address.Address, error) //perm:sign + PaychAvailableFunds(ctx context.Context, ch address.Address) (*api.ChannelAvailableFunds, error) //perm:sign + PaychAvailableFundsByFromTo(ctx context.Context, from, to address.Address) (*api.ChannelAvailableFunds, error) //perm:sign + PaychList(context.Context) ([]address.Address, error) //perm:read + PaychStatus(context.Context, address.Address) (*api.PaychStatus, error) //perm:read + PaychSettle(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychCollect(context.Context, address.Address) (cid.Cid, error) //perm:sign + PaychAllocateLane(ctx context.Context, ch address.Address) (uint64, error) //perm:sign + PaychNewPayment(ctx context.Context, from, to address.Address, vouchers []api.VoucherSpec) (*api.PaymentInfo, error) //perm:sign + PaychVoucherCheckValid(context.Context, address.Address, *paych.SignedVoucher) error //perm:read + PaychVoucherCheckSpendable(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (bool, error) //perm:read + PaychVoucherCreate(context.Context, address.Address, types.BigInt, uint64) (*api.VoucherCreateResult, error) //perm:sign + PaychVoucherAdd(context.Context, address.Address, *paych.SignedVoucher, []byte, types.BigInt) (types.BigInt, error) //perm:write + PaychVoucherList(context.Context, address.Address) ([]*paych.SignedVoucher, error) //perm:write + PaychVoucherSubmit(context.Context, address.Address, *paych.SignedVoucher, []byte, []byte) (cid.Cid, error) //perm:sign // CreateBackup creates node backup onder the specified file name. The // method requires that the lotus daemon is running with the @@ -676,4 +676,3 @@ type FullNode interface { // the path specified when calling CreateBackup is within the base path CreateBackup(ctx context.Context, fpath string) error //perm:admin } - diff --git a/api/v0api/struct.go b/api/v0api/struct.go new file mode 100644 index 000000000..e5550814f --- /dev/null +++ b/api/v0api/struct.go @@ -0,0 +1,1231 @@ +// Code generated by github.com/filecoin-project/lotus/gen/api. DO NOT EDIT. + +package v0api + +import ( + "context" + + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/go-multistore" + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/go-state-types/crypto" + "github.com/filecoin-project/go-state-types/dline" + "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + "github.com/filecoin-project/lotus/chain/actors/builtin/paych" + "github.com/filecoin-project/lotus/chain/types" + marketevents "github.com/filecoin-project/lotus/markets/loggers" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/google/uuid" + "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p-core/metrics" + "github.com/libp2p/go-libp2p-core/network" + "github.com/libp2p/go-libp2p-core/peer" + protocol "github.com/libp2p/go-libp2p-core/protocol" +) + +type CommonStruct struct { + Internal struct { + AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` + + AuthVerify func(p0 context.Context, p1 string) ([]auth.Permission, error) `perm:"read"` + + Closing func(p0 context.Context) (<-chan struct{}, error) `perm:"read"` + + Discover func(p0 context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` + + ID func(p0 context.Context) (peer.ID, error) `perm:"read"` + + LogList func(p0 context.Context) ([]string, error) `perm:"write"` + + LogSetLevel func(p0 context.Context, p1 string, p2 string) error `perm:"write"` + + NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` + + NetAgentVersion func(p0 context.Context, p1 peer.ID) (string, error) `perm:"read"` + + NetAutoNatStatus func(p0 context.Context) (api.NatInfo, error) `perm:"read"` + + NetBandwidthStats func(p0 context.Context) (metrics.Stats, error) `perm:"read"` + + NetBandwidthStatsByPeer func(p0 context.Context) (map[string]metrics.Stats, error) `perm:"read"` + + NetBandwidthStatsByProtocol func(p0 context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` + + NetBlockAdd func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + + NetBlockList func(p0 context.Context) (api.NetBlockList, error) `perm:"read"` + + NetBlockRemove func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + + NetConnect func(p0 context.Context, p1 peer.AddrInfo) error `perm:"write"` + + NetConnectedness func(p0 context.Context, p1 peer.ID) (network.Connectedness, error) `perm:"read"` + + NetDisconnect func(p0 context.Context, p1 peer.ID) error `perm:"write"` + + NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` + + NetPeerInfo func(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"` + + NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` + + NetPubsubScores func(p0 context.Context) ([]api.PubsubScore, error) `perm:"read"` + + Session func(p0 context.Context) (uuid.UUID, error) `perm:"read"` + + Shutdown func(p0 context.Context) error `perm:"admin"` + + Version func(p0 context.Context) (api.APIVersion, error) `perm:"read"` + } +} + +type FullNodeStruct struct { + CommonStruct + + Internal struct { + BeaconGetEntry func(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) `perm:"read"` + + ChainDeleteObj func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + ChainExport func(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) `perm:"read"` + + ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` + + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `perm:"read"` + + ChainGetGenesis func(p0 context.Context) (*types.TipSet, error) `perm:"read"` + + ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` + + ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"` + + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"` + + ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` + + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"` + + ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetRandomnessFromTickets func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` + + ChainGetTipSet func(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) `perm:"read"` + + ChainGetTipSetByHeight func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) `perm:"read"` + + ChainHasObj func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"read"` + + ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` + + ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"` + + ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` + + ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` + + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) `perm:"read"` + + ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + ClientCalcCommP func(p0 context.Context, p1 string) (*api.CommPRet, error) `perm:"write"` + + ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + + ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` + + ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"` + + ClientDealSize func(p0 context.Context, p1 cid.Cid) (api.DataSize, error) `perm:"read"` + + ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) `perm:"read"` + + ClientGenCar func(p0 context.Context, p1 api.FileRef, p2 string) error `perm:"write"` + + ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) `perm:"read"` + + ClientGetDealStatus func(p0 context.Context, p1 uint64) (string, error) `perm:"read"` + + ClientGetDealUpdates func(p0 context.Context) (<-chan api.DealInfo, error) `perm:"write"` + + ClientHasLocal func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"write"` + + ClientImport func(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) `perm:"admin"` + + ClientListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"` + + ClientListDeals func(p0 context.Context) ([]api.DealInfo, error) `perm:"write"` + + ClientListImports func(p0 context.Context) ([]api.Import, error) `perm:"write"` + + ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) `perm:"read"` + + ClientQueryAsk func(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) `perm:"read"` + + ClientRemoveImport func(p0 context.Context, p1 multistore.StoreID) error `perm:"admin"` + + ClientRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + + ClientRetrieve func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error `perm:"admin"` + + ClientRetrieveTryRestartInsufficientFunds func(p0 context.Context, p1 address.Address) error `perm:"write"` + + ClientRetrieveWithEvents func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"` + + ClientStartDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"admin"` + + CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` + + GasEstimateFeeCap func(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + GasEstimateGasLimit func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) `perm:"read"` + + GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + + MarketAddBalance func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MarketGetReserved func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"sign"` + + MarketReleaseFunds func(p0 context.Context, p1 address.Address, p2 types.BigInt) error `perm:"sign"` + + MarketReserveFunds func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MarketWithdraw func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MinerCreateBlock func(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"` + + MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + + MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` + + MpoolClear func(p0 context.Context, p1 bool) error `perm:"write"` + + MpoolGetConfig func(p0 context.Context) (*types.MpoolConfig, error) `perm:"read"` + + MpoolGetNonce func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"read"` + + MpoolPending func(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) `perm:"read"` + + MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + + MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` + + MpoolSelect func(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) `perm:"read"` + + MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` + + MpoolSub func(p0 context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"` + + MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) `perm:"sign"` + + MsigAddPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigApprove func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigApproveTxnHash func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCancel func(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) `perm:"sign"` + + MsigCreate func(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) `perm:"sign"` + + MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"` + + MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) `perm:"read"` + + MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` + + MsigRemoveSigner func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) `perm:"sign"` + + MsigSwapApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapCancel func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) `perm:"sign"` + + MsigSwapPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` + + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + + PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) `perm:"sign"` + + PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` + + PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` + + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"` + + PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` + + PaychStatus func(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) `perm:"read"` + + PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) `perm:"write"` + + PaychVoucherCheckSpendable func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) `perm:"read"` + + PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` + + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) `perm:"sign"` + + PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` + + PaychVoucherSubmit func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) `perm:"sign"` + + StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"` + + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"` + + StateChangedActors func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) `perm:"read"` + + StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` + + StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"` + + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"` + + StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `perm:"read"` + + StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `perm:"read"` + + StateGetReceipt func(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) `perm:"read"` + + StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateListMessages func(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` + + StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` + + StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"` + + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) `perm:"read"` + + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"` + + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `perm:"read"` + + StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) `perm:"read"` + + StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `perm:"read"` + + StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) `perm:"read"` + + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `perm:"read"` + + StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` + + StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `perm:"read"` + + StateMinerRecoveries func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` + + StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` + + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) `perm:"read"` + + StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` + + StateNetworkName func(p0 context.Context) (dtypes.NetworkName, error) `perm:"read"` + + StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `perm:"read"` + + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) `perm:"read"` + + StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) `perm:"read"` + + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `perm:"read"` + + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + + StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` + + StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `perm:"read"` + + StateSectorPartition func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) `perm:"read"` + + StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` + + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"` + + StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateVerifiedRegistryRootKey func(p0 context.Context, p1 types.TipSetKey) (address.Address, error) `perm:"read"` + + StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` + + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `perm:"read"` + + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + + SyncCheckBad func(p0 context.Context, p1 cid.Cid) (string, error) `perm:"read"` + + SyncCheckpoint func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` + + SyncIncomingBlocks func(p0 context.Context) (<-chan *types.BlockHeader, error) `perm:"read"` + + SyncMarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + SyncState func(p0 context.Context) (*api.SyncState, error) `perm:"read"` + + SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` + + SyncUnmarkAllBad func(p0 context.Context) error `perm:"admin"` + + SyncUnmarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` + + SyncValidateTipset func(p0 context.Context, p1 types.TipSetKey) (bool, error) `perm:"read"` + + WalletBalance func(p0 context.Context, p1 address.Address) (types.BigInt, error) `perm:"read"` + + WalletDefaultAddress func(p0 context.Context) (address.Address, error) `perm:"write"` + + WalletDelete func(p0 context.Context, p1 address.Address) error `perm:"admin"` + + WalletExport func(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) `perm:"admin"` + + WalletHas func(p0 context.Context, p1 address.Address) (bool, error) `perm:"write"` + + WalletImport func(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) `perm:"admin"` + + WalletList func(p0 context.Context) ([]address.Address, error) `perm:"write"` + + WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `perm:"write"` + + WalletSetDefault func(p0 context.Context, p1 address.Address) error `perm:"write"` + + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) `perm:"sign"` + + WalletSignMessage func(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) `perm:"sign"` + + WalletValidateAddress func(p0 context.Context, p1 string) (address.Address, error) `perm:"read"` + + WalletVerify func(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) `perm:"read"` + } +} + +func (s *CommonStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { + return s.Internal.AuthNew(p0, p1) +} + +func (s *CommonStruct) AuthVerify(p0 context.Context, p1 string) ([]auth.Permission, error) { + return s.Internal.AuthVerify(p0, p1) +} + +func (s *CommonStruct) Closing(p0 context.Context) (<-chan struct{}, error) { + return s.Internal.Closing(p0) +} + +func (s *CommonStruct) Discover(p0 context.Context) (apitypes.OpenRPCDocument, error) { + return s.Internal.Discover(p0) +} + +func (s *CommonStruct) ID(p0 context.Context) (peer.ID, error) { + return s.Internal.ID(p0) +} + +func (s *CommonStruct) LogList(p0 context.Context) ([]string, error) { + return s.Internal.LogList(p0) +} + +func (s *CommonStruct) LogSetLevel(p0 context.Context, p1 string, p2 string) error { + return s.Internal.LogSetLevel(p0, p1, p2) +} + +func (s *CommonStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { + return s.Internal.NetAddrsListen(p0) +} + +func (s *CommonStruct) NetAgentVersion(p0 context.Context, p1 peer.ID) (string, error) { + return s.Internal.NetAgentVersion(p0, p1) +} + +func (s *CommonStruct) NetAutoNatStatus(p0 context.Context) (api.NatInfo, error) { + return s.Internal.NetAutoNatStatus(p0) +} + +func (s *CommonStruct) NetBandwidthStats(p0 context.Context) (metrics.Stats, error) { + return s.Internal.NetBandwidthStats(p0) +} + +func (s *CommonStruct) NetBandwidthStatsByPeer(p0 context.Context) (map[string]metrics.Stats, error) { + return s.Internal.NetBandwidthStatsByPeer(p0) +} + +func (s *CommonStruct) NetBandwidthStatsByProtocol(p0 context.Context) (map[protocol.ID]metrics.Stats, error) { + return s.Internal.NetBandwidthStatsByProtocol(p0) +} + +func (s *CommonStruct) NetBlockAdd(p0 context.Context, p1 api.NetBlockList) error { + return s.Internal.NetBlockAdd(p0, p1) +} + +func (s *CommonStruct) NetBlockList(p0 context.Context) (api.NetBlockList, error) { + return s.Internal.NetBlockList(p0) +} + +func (s *CommonStruct) NetBlockRemove(p0 context.Context, p1 api.NetBlockList) error { + return s.Internal.NetBlockRemove(p0, p1) +} + +func (s *CommonStruct) NetConnect(p0 context.Context, p1 peer.AddrInfo) error { + return s.Internal.NetConnect(p0, p1) +} + +func (s *CommonStruct) NetConnectedness(p0 context.Context, p1 peer.ID) (network.Connectedness, error) { + return s.Internal.NetConnectedness(p0, p1) +} + +func (s *CommonStruct) NetDisconnect(p0 context.Context, p1 peer.ID) error { + return s.Internal.NetDisconnect(p0, p1) +} + +func (s *CommonStruct) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { + return s.Internal.NetFindPeer(p0, p1) +} + +func (s *CommonStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) { + return s.Internal.NetPeerInfo(p0, p1) +} + +func (s *CommonStruct) NetPeers(p0 context.Context) ([]peer.AddrInfo, error) { + return s.Internal.NetPeers(p0) +} + +func (s *CommonStruct) NetPubsubScores(p0 context.Context) ([]api.PubsubScore, error) { + return s.Internal.NetPubsubScores(p0) +} + +func (s *CommonStruct) Session(p0 context.Context) (uuid.UUID, error) { + return s.Internal.Session(p0) +} + +func (s *CommonStruct) Shutdown(p0 context.Context) error { + return s.Internal.Shutdown(p0) +} + +func (s *CommonStruct) Version(p0 context.Context) (api.APIVersion, error) { + return s.Internal.Version(p0) +} + +func (s *FullNodeStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { + return s.Internal.BeaconGetEntry(p0, p1) +} + +func (s *FullNodeStruct) ChainDeleteObj(p0 context.Context, p1 cid.Cid) error { + return s.Internal.ChainDeleteObj(p0, p1) +} + +func (s *FullNodeStruct) ChainExport(p0 context.Context, p1 abi.ChainEpoch, p2 bool, p3 types.TipSetKey) (<-chan []byte, error) { + return s.Internal.ChainExport(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) { + return s.Internal.ChainGetBlock(p0, p1) +} + +func (s *FullNodeStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) { + return s.Internal.ChainGetBlockMessages(p0, p1) +} + +func (s *FullNodeStruct) ChainGetGenesis(p0 context.Context) (*types.TipSet, error) { + return s.Internal.ChainGetGenesis(p0) +} + +func (s *FullNodeStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types.Message, error) { + return s.Internal.ChainGetMessage(p0, p1) +} + +func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*api.IpldObject, error) { + return s.Internal.ChainGetNode(p0, p1) +} + +func (s *FullNodeStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]api.Message, error) { + return s.Internal.ChainGetParentMessages(p0, p1) +} + +func (s *FullNodeStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) { + return s.Internal.ChainGetParentReceipts(p0, p1) +} + +func (s *FullNodeStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) { + return s.Internal.ChainGetPath(p0, p1, p2) +} + +func (s *FullNodeStruct) ChainGetRandomnessFromBeacon(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromBeacon(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) ChainGetRandomnessFromTickets(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) { + return s.Internal.ChainGetRandomnessFromTickets(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) ChainGetTipSet(p0 context.Context, p1 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSet(p0, p1) +} + +func (s *FullNodeStruct) ChainGetTipSetByHeight(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) (*types.TipSet, error) { + return s.Internal.ChainGetTipSetByHeight(p0, p1, p2) +} + +func (s *FullNodeStruct) ChainHasObj(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ChainHasObj(p0, p1) +} + +func (s *FullNodeStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { + return s.Internal.ChainHead(p0) +} + +func (s *FullNodeStruct) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, error) { + return s.Internal.ChainNotify(p0) +} + +func (s *FullNodeStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, error) { + return s.Internal.ChainReadObj(p0, p1) +} + +func (s *FullNodeStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.ChainSetHead(p0, p1) +} + +func (s *FullNodeStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) { + return s.Internal.ChainStatObj(p0, p1, p2) +} + +func (s *FullNodeStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) { + return s.Internal.ChainTipSetWeight(p0, p1) +} + +func (s *FullNodeStruct) ClientCalcCommP(p0 context.Context, p1 string) (*api.CommPRet, error) { + return s.Internal.ClientCalcCommP(p0, p1) +} + +func (s *FullNodeStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { + return s.Internal.ClientDataTransferUpdates(p0) +} + +func (s *FullNodeStruct) ClientDealPieceCID(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) { + return s.Internal.ClientDealPieceCID(p0, p1) +} + +func (s *FullNodeStruct) ClientDealSize(p0 context.Context, p1 cid.Cid) (api.DataSize, error) { + return s.Internal.ClientDealSize(p0, p1) +} + +func (s *FullNodeStruct) ClientFindData(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) { + return s.Internal.ClientFindData(p0, p1, p2) +} + +func (s *FullNodeStruct) ClientGenCar(p0 context.Context, p1 api.FileRef, p2 string) error { + return s.Internal.ClientGenCar(p0, p1, p2) +} + +func (s *FullNodeStruct) ClientGetDealInfo(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) { + return s.Internal.ClientGetDealInfo(p0, p1) +} + +func (s *FullNodeStruct) ClientGetDealStatus(p0 context.Context, p1 uint64) (string, error) { + return s.Internal.ClientGetDealStatus(p0, p1) +} + +func (s *FullNodeStruct) ClientGetDealUpdates(p0 context.Context) (<-chan api.DealInfo, error) { + return s.Internal.ClientGetDealUpdates(p0) +} + +func (s *FullNodeStruct) ClientHasLocal(p0 context.Context, p1 cid.Cid) (bool, error) { + return s.Internal.ClientHasLocal(p0, p1) +} + +func (s *FullNodeStruct) ClientImport(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) { + return s.Internal.ClientImport(p0, p1) +} + +func (s *FullNodeStruct) ClientListDataTransfers(p0 context.Context) ([]api.DataTransferChannel, error) { + return s.Internal.ClientListDataTransfers(p0) +} + +func (s *FullNodeStruct) ClientListDeals(p0 context.Context) ([]api.DealInfo, error) { + return s.Internal.ClientListDeals(p0) +} + +func (s *FullNodeStruct) ClientListImports(p0 context.Context) ([]api.Import, error) { + return s.Internal.ClientListImports(p0) +} + +func (s *FullNodeStruct) ClientMinerQueryOffer(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) { + return s.Internal.ClientMinerQueryOffer(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) ClientQueryAsk(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) { + return s.Internal.ClientQueryAsk(p0, p1, p2) +} + +func (s *FullNodeStruct) ClientRemoveImport(p0 context.Context, p1 multistore.StoreID) error { + return s.Internal.ClientRemoveImport(p0, p1) +} + +func (s *FullNodeStruct) ClientRestartDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { + return s.Internal.ClientRestartDataTransfer(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) ClientRetrieve(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error { + return s.Internal.ClientRetrieve(p0, p1, p2) +} + +func (s *FullNodeStruct) ClientRetrieveTryRestartInsufficientFunds(p0 context.Context, p1 address.Address) error { + return s.Internal.ClientRetrieveTryRestartInsufficientFunds(p0, p1) +} + +func (s *FullNodeStruct) ClientRetrieveWithEvents(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) { + return s.Internal.ClientRetrieveWithEvents(p0, p1, p2) +} + +func (s *FullNodeStruct) ClientStartDeal(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) { + return s.Internal.ClientStartDeal(p0, p1) +} + +func (s *FullNodeStruct) CreateBackup(p0 context.Context, p1 string) error { + return s.Internal.CreateBackup(p0, p1) +} + +func (s *FullNodeStruct) GasEstimateFeeCap(p0 context.Context, p1 *types.Message, p2 int64, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.GasEstimateFeeCap(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) GasEstimateGasLimit(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (int64, error) { + return s.Internal.GasEstimateGasLimit(p0, p1, p2) +} + +func (s *FullNodeStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) { + return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { + return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MarketAddBalance(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketAddBalance(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MarketGetReserved(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.MarketGetReserved(p0, p1) +} + +func (s *FullNodeStruct) MarketReleaseFunds(p0 context.Context, p1 address.Address, p2 types.BigInt) error { + return s.Internal.MarketReleaseFunds(p0, p1, p2) +} + +func (s *FullNodeStruct) MarketReserveFunds(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketReserveFunds(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MarketWithdraw(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) { + return s.Internal.MarketWithdraw(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MinerCreateBlock(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) { + return s.Internal.MinerCreateBlock(p0, p1) +} + +func (s *FullNodeStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) { + return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPush(p0, p1) +} + +func (s *FullNodeStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) { + return s.Internal.MpoolBatchPushMessage(p0, p1, p2) +} + +func (s *FullNodeStruct) MpoolBatchPushUntrusted(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) { + return s.Internal.MpoolBatchPushUntrusted(p0, p1) +} + +func (s *FullNodeStruct) MpoolClear(p0 context.Context, p1 bool) error { + return s.Internal.MpoolClear(p0, p1) +} + +func (s *FullNodeStruct) MpoolGetConfig(p0 context.Context) (*types.MpoolConfig, error) { + return s.Internal.MpoolGetConfig(p0) +} + +func (s *FullNodeStruct) MpoolGetNonce(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.MpoolGetNonce(p0, p1) +} + +func (s *FullNodeStruct) MpoolPending(p0 context.Context, p1 types.TipSetKey) ([]*types.SignedMessage, error) { + return s.Internal.MpoolPending(p0, p1) +} + +func (s *FullNodeStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPush(p0, p1) +} + +func (s *FullNodeStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) { + return s.Internal.MpoolPushMessage(p0, p1, p2) +} + +func (s *FullNodeStruct) MpoolPushUntrusted(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) { + return s.Internal.MpoolPushUntrusted(p0, p1) +} + +func (s *FullNodeStruct) MpoolSelect(p0 context.Context, p1 types.TipSetKey, p2 float64) ([]*types.SignedMessage, error) { + return s.Internal.MpoolSelect(p0, p1, p2) +} + +func (s *FullNodeStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfig) error { + return s.Internal.MpoolSetConfig(p0, p1) +} + +func (s *FullNodeStruct) MpoolSub(p0 context.Context) (<-chan api.MpoolUpdate, error) { + return s.Internal.MpoolSub(p0) +} + +func (s *FullNodeStruct) MsigAddApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) { + return s.Internal.MsigAddApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *FullNodeStruct) MsigAddCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 bool) (cid.Cid, error) { + return s.Internal.MsigAddCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *FullNodeStruct) MsigAddPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigAddPropose(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) MsigApprove(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address) (cid.Cid, error) { + return s.Internal.MsigApprove(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MsigApproveTxnHash(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 address.Address, p5 types.BigInt, p6 address.Address, p7 uint64, p8 []byte) (cid.Cid, error) { + return s.Internal.MsigApproveTxnHash(p0, p1, p2, p3, p4, p5, p6, p7, p8) +} + +func (s *FullNodeStruct) MsigCancel(p0 context.Context, p1 address.Address, p2 uint64, p3 address.Address, p4 types.BigInt, p5 address.Address, p6 uint64, p7 []byte) (cid.Cid, error) { + return s.Internal.MsigCancel(p0, p1, p2, p3, p4, p5, p6, p7) +} + +func (s *FullNodeStruct) MsigCreate(p0 context.Context, p1 uint64, p2 []address.Address, p3 abi.ChainEpoch, p4 types.BigInt, p5 address.Address, p6 types.BigInt) (cid.Cid, error) { + return s.Internal.MsigCreate(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *FullNodeStruct) MsigGetAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetAvailableBalance(p0, p1, p2) +} + +func (s *FullNodeStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) { + return s.Internal.MsigGetPending(p0, p1, p2) +} + +func (s *FullNodeStruct) MsigGetVested(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.MsigGetVested(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) MsigGetVestingSchedule(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) { + return s.Internal.MsigGetVestingSchedule(p0, p1, p2) +} + +func (s *FullNodeStruct) MsigPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) { + return s.Internal.MsigPropose(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *FullNodeStruct) MsigRemoveSigner(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 bool) (cid.Cid, error) { + return s.Internal.MsigRemoveSigner(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) MsigSwapApprove(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapApprove(p0, p1, p2, p3, p4, p5, p6) +} + +func (s *FullNodeStruct) MsigSwapCancel(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapCancel(p0, p1, p2, p3, p4, p5) +} + +func (s *FullNodeStruct) MsigSwapPropose(p0 context.Context, p1 address.Address, p2 address.Address, p3 address.Address, p4 address.Address) (cid.Cid, error) { + return s.Internal.MsigSwapPropose(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) PaychAllocateLane(p0 context.Context, p1 address.Address) (uint64, error) { + return s.Internal.PaychAllocateLane(p0, p1) +} + +func (s *FullNodeStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFunds(p0, p1) +} + +func (s *FullNodeStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) { + return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) +} + +func (s *FullNodeStruct) PaychCollect(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychCollect(p0, p1) +} + +func (s *FullNodeStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) { + return s.Internal.PaychGet(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) PaychGetWaitReady(p0 context.Context, p1 cid.Cid) (address.Address, error) { + return s.Internal.PaychGetWaitReady(p0, p1) +} + +func (s *FullNodeStruct) PaychList(p0 context.Context) ([]address.Address, error) { + return s.Internal.PaychList(p0) +} + +func (s *FullNodeStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) { + return s.Internal.PaychNewPayment(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) PaychSettle(p0 context.Context, p1 address.Address) (cid.Cid, error) { + return s.Internal.PaychSettle(p0, p1) +} + +func (s *FullNodeStruct) PaychStatus(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) { + return s.Internal.PaychStatus(p0, p1) +} + +func (s *FullNodeStruct) PaychVoucherAdd(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) { + return s.Internal.PaychVoucherAdd(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) PaychVoucherCheckSpendable(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (bool, error) { + return s.Internal.PaychVoucherCheckSpendable(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error { + return s.Internal.PaychVoucherCheckValid(p0, p1, p2) +} + +func (s *FullNodeStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) { + return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) PaychVoucherList(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) { + return s.Internal.PaychVoucherList(p0, p1) +} + +func (s *FullNodeStruct) PaychVoucherSubmit(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 []byte) (cid.Cid, error) { + return s.Internal.PaychVoucherSubmit(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) StateAccountKey(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateAccountKey(p0, p1, p2) +} + +func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) { + return s.Internal.StateAllMinerFaults(p0, p1, p2) +} + +func (s *FullNodeStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { + return s.Internal.StateCall(p0, p1, p2) +} + +func (s *FullNodeStruct) StateChangedActors(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) { + return s.Internal.StateChangedActors(p0, p1, p2) +} + +func (s *FullNodeStruct) StateCirculatingSupply(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) { + return s.Internal.StateCirculatingSupply(p0, p1) +} + +func (s *FullNodeStruct) StateCompute(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) { + return s.Internal.StateCompute(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { + return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateDecodeParams(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) { + return s.Internal.StateDecodeParams(p0, p1, p2, p3, p4) +} + +func (s *FullNodeStruct) StateGetActor(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) { + return s.Internal.StateGetActor(p0, p1, p2) +} + +func (s *FullNodeStruct) StateGetReceipt(p0 context.Context, p1 cid.Cid, p2 types.TipSetKey) (*types.MessageReceipt, error) { + return s.Internal.StateGetReceipt(p0, p1, p2) +} + +func (s *FullNodeStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListActors(p0, p1) +} + +func (s *FullNodeStruct) StateListMessages(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) { + return s.Internal.StateListMessages(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateListMiners(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) { + return s.Internal.StateListMiners(p0, p1) +} + +func (s *FullNodeStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) { + return s.Internal.StateLookupID(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) { + return s.Internal.StateMarketBalance(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) { + return s.Internal.StateMarketDeals(p0, p1) +} + +func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) { + return s.Internal.StateMarketParticipants(p0, p1) +} + +func (s *FullNodeStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) { + return s.Internal.StateMarketStorageDeal(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerActiveSectors(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerActiveSectors(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerAvailableBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerAvailableBalance(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) { + return s.Internal.StateMinerDeadlines(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerFaults(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerFaults(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) { + return s.Internal.StateMinerInfo(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) { + return s.Internal.StateMinerPartitions(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) { + return s.Internal.StateMinerPower(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerPreCommitDepositForPower(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) { + return s.Internal.StateMinerPreCommitDepositForPower(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateMinerProvingDeadline(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) { + return s.Internal.StateMinerProvingDeadline(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerRecoveries(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) { + return s.Internal.StateMinerRecoveries(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerSectorAllocated(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) { + return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) { + return s.Internal.StateMinerSectorCount(p0, p1, p2) +} + +func (s *FullNodeStruct) StateMinerSectors(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + return s.Internal.StateMinerSectors(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateNetworkName(p0 context.Context) (dtypes.NetworkName, error) { + return s.Internal.StateNetworkName(p0) +} + +func (s *FullNodeStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) { + return s.Internal.StateNetworkVersion(p0, p1) +} + +func (s *FullNodeStruct) StateReadState(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) { + return s.Internal.StateReadState(p0, p1, p2) +} + +func (s *FullNodeStruct) StateReplay(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) { + return s.Internal.StateReplay(p0, p1, p2) +} + +func (s *FullNodeStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { + return s.Internal.StateSearchMsg(p0, p1) +} + +func (s *FullNodeStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) { + return s.Internal.StateSearchMsgLimited(p0, p1, p2) +} + +func (s *FullNodeStruct) StateSectorExpiration(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) { + return s.Internal.StateSectorExpiration(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateSectorGetInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + return s.Internal.StateSectorGetInfo(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateSectorPartition(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorLocation, error) { + return s.Internal.StateSectorPartition(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) { + return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) +} + +func (s *FullNodeStruct) StateVerifiedClientStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifiedClientStatus(p0, p1, p2) +} + +func (s *FullNodeStruct) StateVerifiedRegistryRootKey(p0 context.Context, p1 types.TipSetKey) (address.Address, error) { + return s.Internal.StateVerifiedRegistryRootKey(p0, p1) +} + +func (s *FullNodeStruct) StateVerifierStatus(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) { + return s.Internal.StateVerifierStatus(p0, p1, p2) +} + +func (s *FullNodeStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) { + return s.Internal.StateWaitMsg(p0, p1, p2) +} + +func (s *FullNodeStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) { + return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) +} + +func (s *FullNodeStruct) SyncCheckBad(p0 context.Context, p1 cid.Cid) (string, error) { + return s.Internal.SyncCheckBad(p0, p1) +} + +func (s *FullNodeStruct) SyncCheckpoint(p0 context.Context, p1 types.TipSetKey) error { + return s.Internal.SyncCheckpoint(p0, p1) +} + +func (s *FullNodeStruct) SyncIncomingBlocks(p0 context.Context) (<-chan *types.BlockHeader, error) { + return s.Internal.SyncIncomingBlocks(p0) +} + +func (s *FullNodeStruct) SyncMarkBad(p0 context.Context, p1 cid.Cid) error { + return s.Internal.SyncMarkBad(p0, p1) +} + +func (s *FullNodeStruct) SyncState(p0 context.Context) (*api.SyncState, error) { + return s.Internal.SyncState(p0) +} + +func (s *FullNodeStruct) SyncSubmitBlock(p0 context.Context, p1 *types.BlockMsg) error { + return s.Internal.SyncSubmitBlock(p0, p1) +} + +func (s *FullNodeStruct) SyncUnmarkAllBad(p0 context.Context) error { + return s.Internal.SyncUnmarkAllBad(p0) +} + +func (s *FullNodeStruct) SyncUnmarkBad(p0 context.Context, p1 cid.Cid) error { + return s.Internal.SyncUnmarkBad(p0, p1) +} + +func (s *FullNodeStruct) SyncValidateTipset(p0 context.Context, p1 types.TipSetKey) (bool, error) { + return s.Internal.SyncValidateTipset(p0, p1) +} + +func (s *FullNodeStruct) WalletBalance(p0 context.Context, p1 address.Address) (types.BigInt, error) { + return s.Internal.WalletBalance(p0, p1) +} + +func (s *FullNodeStruct) WalletDefaultAddress(p0 context.Context) (address.Address, error) { + return s.Internal.WalletDefaultAddress(p0) +} + +func (s *FullNodeStruct) WalletDelete(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletDelete(p0, p1) +} + +func (s *FullNodeStruct) WalletExport(p0 context.Context, p1 address.Address) (*types.KeyInfo, error) { + return s.Internal.WalletExport(p0, p1) +} + +func (s *FullNodeStruct) WalletHas(p0 context.Context, p1 address.Address) (bool, error) { + return s.Internal.WalletHas(p0, p1) +} + +func (s *FullNodeStruct) WalletImport(p0 context.Context, p1 *types.KeyInfo) (address.Address, error) { + return s.Internal.WalletImport(p0, p1) +} + +func (s *FullNodeStruct) WalletList(p0 context.Context) ([]address.Address, error) { + return s.Internal.WalletList(p0) +} + +func (s *FullNodeStruct) WalletNew(p0 context.Context, p1 types.KeyType) (address.Address, error) { + return s.Internal.WalletNew(p0, p1) +} + +func (s *FullNodeStruct) WalletSetDefault(p0 context.Context, p1 address.Address) error { + return s.Internal.WalletSetDefault(p0, p1) +} + +func (s *FullNodeStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte) (*crypto.Signature, error) { + return s.Internal.WalletSign(p0, p1, p2) +} + +func (s *FullNodeStruct) WalletSignMessage(p0 context.Context, p1 address.Address, p2 *types.Message) (*types.SignedMessage, error) { + return s.Internal.WalletSignMessage(p0, p1, p2) +} + +func (s *FullNodeStruct) WalletValidateAddress(p0 context.Context, p1 string) (address.Address, error) { + return s.Internal.WalletValidateAddress(p0, p1) +} + +func (s *FullNodeStruct) WalletVerify(p0 context.Context, p1 address.Address, p2 []byte, p3 *crypto.Signature) (bool, error) { + return s.Internal.WalletVerify(p0, p1, p2, p3) +} + +var _ Common = new(CommonStruct) +var _ FullNode = new(FullNodeStruct) diff --git a/gen/api/proxygen.go b/gen/api/proxygen.go index 42aed0965..64859380f 100644 --- a/gen/api/proxygen.go +++ b/gen/api/proxygen.go @@ -53,7 +53,13 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { return v } func main() { - if err := runMain(); err != nil { + // latest (v1) + if err := generate("./api", "api", "apistruct", "./api/apistruct/struct.go"); err != nil { + fmt.Println("error: ", err) + } + + // v0 + if err := generate("./api/v0api", "v0api", "v0api", "./api/v0api/struct.go"); err != nil { fmt.Println("error: ", err) } } @@ -116,9 +122,13 @@ func typeName(e ast.Expr) (string, error) { } } -func runMain() error { +func generate(path, pkg, outpkg, outfile string) error { fset := token.NewFileSet() - apiDir, err := filepath.Abs("./api") + apiDir, err := filepath.Abs(path) + if err != nil { + return err + } + outfile, err = filepath.Abs(outfile) if err != nil { return err } @@ -127,7 +137,7 @@ func runMain() error { return err } - ap := pkgs["api"] + ap := pkgs[pkg] v := &Visitor{make(map[string]map[string]*methodMeta), map[string][]string{}} ast.Walk(v, ap) @@ -148,9 +158,11 @@ func runMain() error { type meta struct { Infos map[string]*strinfo Imports map[string]string + OutPkg string } m := &meta{ + OutPkg: outpkg, Infos: map[string]*strinfo{}, Imports: map[string]string{}, } @@ -165,6 +177,9 @@ func runMain() error { for _, im := range f.Imports { m.Imports[im.Path.Value] = im.Path.Value + if im.Name != nil { + m.Imports[im.Path.Value] = im.Name.Name + " " + m.Imports[im.Path.Value] + } } for ifname, methods := range v.Methods { @@ -244,14 +259,17 @@ func runMain() error { } fmt.Println(string(jb))*/ - w := os.Stdout + w, err := os.OpenFile(outfile, os.O_CREATE|os.O_TRUNC|os.O_WRONLY, 0666) + if err != nil { + return err + } err = doTemplate(w, m, `// Code generated by github.com/filecoin-project/lotus/gen/api. DO NOT EDIT. -package apistruct +package {{.OutPkg}} import ( -{{range .Imports}}{{.}} +{{range .Imports}} {{.}} {{end}} ) `) @@ -282,7 +300,7 @@ func (s *{{$name}}Struct) {{.Name}}({{.NamedParams}}) ({{.Results}}) { {{end}} {{end}} -{{range .Infos}}var _ api.{{.Name}} = new({{.Name}}Struct) +{{range .Infos}}var _ {{.Name}} = new({{.Name}}Struct) {{end}} `) From d198cf456ead4d6b500f800e4b80e0b284de27b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 17:20:56 +0100 Subject: [PATCH 020/239] make docsgen work with versioned api --- Makefile | 13 +- api/docgen-openrpc/cmd/docgen_openrpc.go | 2 +- api/docgen-openrpc/openrpc.go | 2 +- api/docgen/cmd/docgen.go | 2 +- api/docgen/docgen.go | 8 +- api/v0api/v1_wrapper.go | 8 +- cmd/lotus/rpc.go | 2 +- ...thods-miner.md => api-v0-methods-miner.md} | 0 ...ods-worker.md => api-v0-methods-worker.md} | 0 .../en/{api-methods.md => api-v0-methods.md} | 0 documentation/en/api-v1-unstable-methods.md | 5583 +++++++++++++++++ 11 files changed, 5602 insertions(+), 18 deletions(-) rename documentation/en/{api-methods-miner.md => api-v0-methods-miner.md} (100%) rename documentation/en/{api-methods-worker.md => api-v0-methods-worker.md} (100%) rename documentation/en/{api-methods.md => api-v0-methods.md} (100%) create mode 100644 documentation/en/api-v1-unstable-methods.md diff --git a/Makefile b/Makefile index 5d7781b1d..02fe23b4a 100644 --- a/Makefile +++ b/Makefile @@ -341,20 +341,21 @@ docsgen-openrpc-bin: docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker docsgen-md-full: docsgen-md-bin - ./docgen-md "api/api_full.go" "FullNode" > documentation/en/api-methods.md + ./docgen-md "api/api_full.go" "FullNode" "api" "./api" > documentation/en/api-v1-unstable-methods.md + ./docgen-md "api/v0api/full.go" "FullNode" "v0api" "./api/v0api" > documentation/en/api-v0-methods.md docsgen-md-storage: docsgen-md-bin - ./docgen-md "api/api_storage.go" "StorageMiner" > documentation/en/api-methods-miner.md + ./docgen-md "api/api_storage.go" "StorageMiner" "api" "./api" > documentation/en/api-v0-methods-miner.md docsgen-md-worker: docsgen-md-bin - ./docgen-md "api/api_worker.go" "Worker" > documentation/en/api-methods-worker.md + ./docgen-md "api/api_worker.go" "Worker" "api" "./api" > documentation/en/api-v0-methods-worker.md docsgen-openrpc: docsgen-openrpc-full docsgen-openrpc-storage docsgen-openrpc-worker docsgen-openrpc-full: docsgen-openrpc-bin - ./docgen-openrpc "api/api_full.go" "FullNode" -gzip > build/openrpc/full.json.gz + ./docgen-openrpc "api/api_full.go" "FullNode" "api" "./api" -gzip > build/openrpc/full.json.gz docsgen-openrpc-storage: docsgen-openrpc-bin - ./docgen-openrpc "api/api_storage.go" "StorageMiner" -gzip > build/openrpc/miner.json.gz + ./docgen-openrpc "api/api_storage.go" "StorageMiner" "api" "./api" -gzip > build/openrpc/miner.json.gz docsgen-openrpc-worker: docsgen-openrpc-bin - ./docgen-openrpc "api/api_worker.go" "Worker" -gzip > build/openrpc/worker.json.gz + ./docgen-openrpc "api/api_worker.go" "Worker" "api" "./api" -gzip > build/openrpc/worker.json.gz .PHONY: docsgen docsgen-md-bin docsgen-openrpc-bin diff --git a/api/docgen-openrpc/cmd/docgen_openrpc.go b/api/docgen-openrpc/cmd/docgen_openrpc.go index 81683e04d..b1322257c 100644 --- a/api/docgen-openrpc/cmd/docgen_openrpc.go +++ b/api/docgen-openrpc/cmd/docgen_openrpc.go @@ -52,7 +52,7 @@ func main() { // Could use flags package to handle this more cleanly, but that requires changes elsewhere // the scope of which just isn't warranted by this one use case which will usually be run // programmatically anyways. - if len(os.Args) > 3 && os.Args[3] == "-gzip" { + if len(os.Args) > 5 && os.Args[5] == "-gzip" { jsonOut, err = json.Marshal(out) if err != nil { log.Fatalln(err) diff --git a/api/docgen-openrpc/openrpc.go b/api/docgen-openrpc/openrpc.go index 507ad3cb1..e2cd9ce53 100644 --- a/api/docgen-openrpc/openrpc.go +++ b/api/docgen-openrpc/openrpc.go @@ -22,7 +22,7 @@ var Comments map[string]string var GroupDocs map[string]string func init() { - Comments, GroupDocs = docgen.ParseApiASTInfo(os.Args[1], os.Args[2]) + Comments, GroupDocs = docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) } // schemaDictEntry represents a type association passed to the jsonschema reflector. diff --git a/api/docgen/cmd/docgen.go b/api/docgen/cmd/docgen.go index c47d44208..57182d400 100644 --- a/api/docgen/cmd/docgen.go +++ b/api/docgen/cmd/docgen.go @@ -14,7 +14,7 @@ import ( ) func main() { - comments, groupComments := docgen.ParseApiASTInfo(os.Args[1], os.Args[2]) + comments, groupComments := docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) groups := make(map[string]*docgen.MethodGroup) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index e17238d88..49f838959 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -342,9 +342,9 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { const NoComment = "There are not yet any comments for this method." -func ParseApiASTInfo(apiFile, iface string) (comments map[string]string, groupDocs map[string]string) { //nolint:golint +func ParseApiASTInfo(apiFile, iface, pkg, dir string) (comments map[string]string, groupDocs map[string]string) { //nolint:golint fset := token.NewFileSet() - apiDir, err := filepath.Abs("./api") + apiDir, err := filepath.Abs(dir) if err != nil { fmt.Println("./api filepath absolute error: ", err) return @@ -360,14 +360,14 @@ func ParseApiASTInfo(apiFile, iface string) (comments map[string]string, groupDo return } - ap := pkgs["api"] + ap := pkgs[pkg] f := ap.Files[apiFile] cmap := ast.NewCommentMap(fset, f, f.Comments) v := &Visitor{iface, make(map[string]ast.Node)} - ast.Walk(v, pkgs["api"]) + ast.Walk(v, ap) comments = make(map[string]string) groupDocs = make(map[string]string) diff --git a/api/v0api/v1_wrapper.go b/api/v0api/v1_wrapper.go index 89130160d..92b223390 100644 --- a/api/v0api/v1_wrapper.go +++ b/api/v0api/v1_wrapper.go @@ -4,7 +4,7 @@ import ( "github.com/filecoin-project/lotus/api/v1api" ) -type WrapperV1 struct { +type WrapperV1Full struct { v1api.FullNode } @@ -12,11 +12,11 @@ type WrapperV1 struct { - dropped StateGetReceipt - tsk param for StateSearchMsg -func (w *WrapperV1) StateSearchMsg(ctx context.Context, c cid.Cid) (*api.MsgLookup, error) { +func (w *WrapperV1Full) StateSearchMsg(ctx context.Context, c cid.Cid) (*api.MsgLookup, error) { return w.FullNode.StateSearchMsg(ctx, c, types.EmptyTSK) } -func (w *WrapperV1) StateGetReceipt(ctx context.Context, cid cid.Cid, key types.TipSetKey) (*types.MessageReceipt, error) { +func (w *WrapperV1Full) StateGetReceipt(ctx context.Context, cid cid.Cid, key types.TipSetKey) (*types.MessageReceipt, error) { m, err := w.FullNode.StateSearchMsg(ctx, cid, key) if err != nil { return nil, err @@ -29,4 +29,4 @@ func (w *WrapperV1) StateGetReceipt(ctx context.Context, cid cid.Cid, key types. return &m.Receipt, nil }*/ -var _ FullNode = &WrapperV1{} +var _ FullNode = &WrapperV1Full{} diff --git a/cmd/lotus/rpc.go b/cmd/lotus/rpc.go index 0f0d1225d..00de0fddb 100644 --- a/cmd/lotus/rpc.go +++ b/cmd/lotus/rpc.go @@ -51,7 +51,7 @@ func serveRPC(a v1api.FullNode, stop node.StopFunc, addr multiaddr.Multiaddr, sh pma := apistruct.PermissionedFullAPI(metrics.MetricedFullAPI(a)) serveRpc("/rpc/v1", pma) - serveRpc("/rpc/v0", &v0api.WrapperV1{FullNode: pma}) + serveRpc("/rpc/v0", &v0api.WrapperV1Full{FullNode: pma}) importAH := &auth.Handler{ Verify: a.AuthVerify, diff --git a/documentation/en/api-methods-miner.md b/documentation/en/api-v0-methods-miner.md similarity index 100% rename from documentation/en/api-methods-miner.md rename to documentation/en/api-v0-methods-miner.md diff --git a/documentation/en/api-methods-worker.md b/documentation/en/api-v0-methods-worker.md similarity index 100% rename from documentation/en/api-methods-worker.md rename to documentation/en/api-v0-methods-worker.md diff --git a/documentation/en/api-methods.md b/documentation/en/api-v0-methods.md similarity index 100% rename from documentation/en/api-methods.md rename to documentation/en/api-v0-methods.md diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md new file mode 100644 index 000000000..b8764d5b1 --- /dev/null +++ b/documentation/en/api-v1-unstable-methods.md @@ -0,0 +1,5583 @@ +# Groups +* [](#) + * [Closing](#Closing) + * [Discover](#Discover) + * [Session](#Session) + * [Shutdown](#Shutdown) + * [Version](#Version) +* [Auth](#Auth) + * [AuthNew](#AuthNew) + * [AuthVerify](#AuthVerify) +* [Beacon](#Beacon) + * [BeaconGetEntry](#BeaconGetEntry) +* [Chain](#Chain) + * [ChainDeleteObj](#ChainDeleteObj) + * [ChainExport](#ChainExport) + * [ChainGetBlock](#ChainGetBlock) + * [ChainGetBlockMessages](#ChainGetBlockMessages) + * [ChainGetGenesis](#ChainGetGenesis) + * [ChainGetMessage](#ChainGetMessage) + * [ChainGetNode](#ChainGetNode) + * [ChainGetParentMessages](#ChainGetParentMessages) + * [ChainGetParentReceipts](#ChainGetParentReceipts) + * [ChainGetPath](#ChainGetPath) + * [ChainGetRandomnessFromBeacon](#ChainGetRandomnessFromBeacon) + * [ChainGetRandomnessFromTickets](#ChainGetRandomnessFromTickets) + * [ChainGetTipSet](#ChainGetTipSet) + * [ChainGetTipSetByHeight](#ChainGetTipSetByHeight) + * [ChainHasObj](#ChainHasObj) + * [ChainHead](#ChainHead) + * [ChainNotify](#ChainNotify) + * [ChainReadObj](#ChainReadObj) + * [ChainSetHead](#ChainSetHead) + * [ChainStatObj](#ChainStatObj) + * [ChainTipSetWeight](#ChainTipSetWeight) +* [Client](#Client) + * [ClientCalcCommP](#ClientCalcCommP) + * [ClientCancelDataTransfer](#ClientCancelDataTransfer) + * [ClientDataTransferUpdates](#ClientDataTransferUpdates) + * [ClientDealPieceCID](#ClientDealPieceCID) + * [ClientDealSize](#ClientDealSize) + * [ClientFindData](#ClientFindData) + * [ClientGenCar](#ClientGenCar) + * [ClientGetDealInfo](#ClientGetDealInfo) + * [ClientGetDealStatus](#ClientGetDealStatus) + * [ClientGetDealUpdates](#ClientGetDealUpdates) + * [ClientHasLocal](#ClientHasLocal) + * [ClientImport](#ClientImport) + * [ClientListDataTransfers](#ClientListDataTransfers) + * [ClientListDeals](#ClientListDeals) + * [ClientListImports](#ClientListImports) + * [ClientMinerQueryOffer](#ClientMinerQueryOffer) + * [ClientQueryAsk](#ClientQueryAsk) + * [ClientRemoveImport](#ClientRemoveImport) + * [ClientRestartDataTransfer](#ClientRestartDataTransfer) + * [ClientRetrieve](#ClientRetrieve) + * [ClientRetrieveTryRestartInsufficientFunds](#ClientRetrieveTryRestartInsufficientFunds) + * [ClientRetrieveWithEvents](#ClientRetrieveWithEvents) + * [ClientStartDeal](#ClientStartDeal) +* [Create](#Create) + * [CreateBackup](#CreateBackup) +* [Gas](#Gas) + * [GasEstimateFeeCap](#GasEstimateFeeCap) + * [GasEstimateGasLimit](#GasEstimateGasLimit) + * [GasEstimateGasPremium](#GasEstimateGasPremium) + * [GasEstimateMessageGas](#GasEstimateMessageGas) +* [I](#I) + * [ID](#ID) +* [Log](#Log) + * [LogList](#LogList) + * [LogSetLevel](#LogSetLevel) +* [Market](#Market) + * [MarketAddBalance](#MarketAddBalance) + * [MarketGetReserved](#MarketGetReserved) + * [MarketReleaseFunds](#MarketReleaseFunds) + * [MarketReserveFunds](#MarketReserveFunds) + * [MarketWithdraw](#MarketWithdraw) +* [Miner](#Miner) + * [MinerCreateBlock](#MinerCreateBlock) + * [MinerGetBaseInfo](#MinerGetBaseInfo) +* [Mpool](#Mpool) + * [MpoolBatchPush](#MpoolBatchPush) + * [MpoolBatchPushMessage](#MpoolBatchPushMessage) + * [MpoolBatchPushUntrusted](#MpoolBatchPushUntrusted) + * [MpoolClear](#MpoolClear) + * [MpoolGetConfig](#MpoolGetConfig) + * [MpoolGetNonce](#MpoolGetNonce) + * [MpoolPending](#MpoolPending) + * [MpoolPush](#MpoolPush) + * [MpoolPushMessage](#MpoolPushMessage) + * [MpoolPushUntrusted](#MpoolPushUntrusted) + * [MpoolSelect](#MpoolSelect) + * [MpoolSetConfig](#MpoolSetConfig) + * [MpoolSub](#MpoolSub) +* [Msig](#Msig) + * [MsigAddApprove](#MsigAddApprove) + * [MsigAddCancel](#MsigAddCancel) + * [MsigAddPropose](#MsigAddPropose) + * [MsigApprove](#MsigApprove) + * [MsigApproveTxnHash](#MsigApproveTxnHash) + * [MsigCancel](#MsigCancel) + * [MsigCreate](#MsigCreate) + * [MsigGetAvailableBalance](#MsigGetAvailableBalance) + * [MsigGetPending](#MsigGetPending) + * [MsigGetVested](#MsigGetVested) + * [MsigGetVestingSchedule](#MsigGetVestingSchedule) + * [MsigPropose](#MsigPropose) + * [MsigRemoveSigner](#MsigRemoveSigner) + * [MsigSwapApprove](#MsigSwapApprove) + * [MsigSwapCancel](#MsigSwapCancel) + * [MsigSwapPropose](#MsigSwapPropose) +* [Net](#Net) + * [NetAddrsListen](#NetAddrsListen) + * [NetAgentVersion](#NetAgentVersion) + * [NetAutoNatStatus](#NetAutoNatStatus) + * [NetBandwidthStats](#NetBandwidthStats) + * [NetBandwidthStatsByPeer](#NetBandwidthStatsByPeer) + * [NetBandwidthStatsByProtocol](#NetBandwidthStatsByProtocol) + * [NetBlockAdd](#NetBlockAdd) + * [NetBlockList](#NetBlockList) + * [NetBlockRemove](#NetBlockRemove) + * [NetConnect](#NetConnect) + * [NetConnectedness](#NetConnectedness) + * [NetDisconnect](#NetDisconnect) + * [NetFindPeer](#NetFindPeer) + * [NetPeerInfo](#NetPeerInfo) + * [NetPeers](#NetPeers) + * [NetPubsubScores](#NetPubsubScores) +* [Paych](#Paych) + * [PaychAllocateLane](#PaychAllocateLane) + * [PaychAvailableFunds](#PaychAvailableFunds) + * [PaychAvailableFundsByFromTo](#PaychAvailableFundsByFromTo) + * [PaychCollect](#PaychCollect) + * [PaychGet](#PaychGet) + * [PaychGetWaitReady](#PaychGetWaitReady) + * [PaychList](#PaychList) + * [PaychNewPayment](#PaychNewPayment) + * [PaychSettle](#PaychSettle) + * [PaychStatus](#PaychStatus) + * [PaychVoucherAdd](#PaychVoucherAdd) + * [PaychVoucherCheckSpendable](#PaychVoucherCheckSpendable) + * [PaychVoucherCheckValid](#PaychVoucherCheckValid) + * [PaychVoucherCreate](#PaychVoucherCreate) + * [PaychVoucherList](#PaychVoucherList) + * [PaychVoucherSubmit](#PaychVoucherSubmit) +* [State](#State) + * [StateAccountKey](#StateAccountKey) + * [StateAllMinerFaults](#StateAllMinerFaults) + * [StateCall](#StateCall) + * [StateChangedActors](#StateChangedActors) + * [StateCirculatingSupply](#StateCirculatingSupply) + * [StateCompute](#StateCompute) + * [StateDealProviderCollateralBounds](#StateDealProviderCollateralBounds) + * [StateDecodeParams](#StateDecodeParams) + * [StateGetActor](#StateGetActor) + * [StateGetReceipt](#StateGetReceipt) + * [StateListActors](#StateListActors) + * [StateListMessages](#StateListMessages) + * [StateListMiners](#StateListMiners) + * [StateLookupID](#StateLookupID) + * [StateMarketBalance](#StateMarketBalance) + * [StateMarketDeals](#StateMarketDeals) + * [StateMarketParticipants](#StateMarketParticipants) + * [StateMarketStorageDeal](#StateMarketStorageDeal) + * [StateMinerActiveSectors](#StateMinerActiveSectors) + * [StateMinerAvailableBalance](#StateMinerAvailableBalance) + * [StateMinerDeadlines](#StateMinerDeadlines) + * [StateMinerFaults](#StateMinerFaults) + * [StateMinerInfo](#StateMinerInfo) + * [StateMinerInitialPledgeCollateral](#StateMinerInitialPledgeCollateral) + * [StateMinerPartitions](#StateMinerPartitions) + * [StateMinerPower](#StateMinerPower) + * [StateMinerPreCommitDepositForPower](#StateMinerPreCommitDepositForPower) + * [StateMinerProvingDeadline](#StateMinerProvingDeadline) + * [StateMinerRecoveries](#StateMinerRecoveries) + * [StateMinerSectorAllocated](#StateMinerSectorAllocated) + * [StateMinerSectorCount](#StateMinerSectorCount) + * [StateMinerSectors](#StateMinerSectors) + * [StateNetworkName](#StateNetworkName) + * [StateNetworkVersion](#StateNetworkVersion) + * [StateReadState](#StateReadState) + * [StateReplay](#StateReplay) + * [StateSearchMsg](#StateSearchMsg) + * [StateSearchMsgLimited](#StateSearchMsgLimited) + * [StateSectorExpiration](#StateSectorExpiration) + * [StateSectorGetInfo](#StateSectorGetInfo) + * [StateSectorPartition](#StateSectorPartition) + * [StateSectorPreCommitInfo](#StateSectorPreCommitInfo) + * [StateVMCirculatingSupplyInternal](#StateVMCirculatingSupplyInternal) + * [StateVerifiedClientStatus](#StateVerifiedClientStatus) + * [StateVerifiedRegistryRootKey](#StateVerifiedRegistryRootKey) + * [StateVerifierStatus](#StateVerifierStatus) + * [StateWaitMsg](#StateWaitMsg) + * [StateWaitMsgLimited](#StateWaitMsgLimited) +* [Sync](#Sync) + * [SyncCheckBad](#SyncCheckBad) + * [SyncCheckpoint](#SyncCheckpoint) + * [SyncIncomingBlocks](#SyncIncomingBlocks) + * [SyncMarkBad](#SyncMarkBad) + * [SyncState](#SyncState) + * [SyncSubmitBlock](#SyncSubmitBlock) + * [SyncUnmarkAllBad](#SyncUnmarkAllBad) + * [SyncUnmarkBad](#SyncUnmarkBad) + * [SyncValidateTipset](#SyncValidateTipset) +* [Wallet](#Wallet) + * [WalletBalance](#WalletBalance) + * [WalletDefaultAddress](#WalletDefaultAddress) + * [WalletDelete](#WalletDelete) + * [WalletExport](#WalletExport) + * [WalletHas](#WalletHas) + * [WalletImport](#WalletImport) + * [WalletList](#WalletList) + * [WalletNew](#WalletNew) + * [WalletSetDefault](#WalletSetDefault) + * [WalletSign](#WalletSign) + * [WalletSignMessage](#WalletSignMessage) + * [WalletValidateAddress](#WalletValidateAddress) + * [WalletVerify](#WalletVerify) +## + + +### Closing + + +Perms: read + +Inputs: `null` + +Response: `{}` + +### Discover + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "info": { + "title": "Lotus RPC API", + "version": "1.2.1/generated=2020-11-22T08:22:42-06:00" + }, + "methods": [], + "openrpc": "1.2.6" +} +``` + +### Session + + +Perms: read + +Inputs: `null` + +Response: `"07070707-0707-0707-0707-070707070707"` + +### Shutdown + + +Perms: admin + +Inputs: `null` + +Response: `{}` + +### Version + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Version": "string value", + "APIVersion": 65792, + "BlockDelay": 42 +} +``` + +## Auth + + +### AuthNew + + +Perms: admin + +Inputs: +```json +[ + null +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### AuthVerify + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `null` + +## Beacon +The Beacon method group contains methods for interacting with the random beacon (DRAND) + + +### BeaconGetEntry +BeaconGetEntry returns the beacon entry for the given filecoin epoch. If +the entry has not yet been produced, the call will block until the entry +becomes available + + +Perms: read + +Inputs: +```json +[ + 10101 +] +``` + +Response: +```json +{ + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +## Chain +The Chain method group contains methods for interacting with the +blockchain, but that do not require any form of state computation. + + +### ChainDeleteObj +ChainDeleteObj deletes node referenced by the given CID + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + +### ChainExport +ChainExport returns a stream of bytes with CAR dump of chain data. +The exported chain data includes the header chain from the given tipset +back to genesis, the entire genesis state, and the most recent 'nroots' +state trees. +If oldmsgskip is set, messages from before the requested roots are also not included. + + +Perms: read + +Inputs: +```json +[ + 10101, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainGetBlock +ChainGetBlock returns the block specified by the given CID. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Miner": "f01234", + "Ticket": { + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" +} +``` + +### ChainGetBlockMessages +ChainGetBlockMessages returns messages stored in the specified block. + +Note: If there are multiple blocks in a tipset, it's likely that some +messages will be duplicated. It's also possible for blocks in a tipset to have +different messages from the same sender at the same nonce. When that happens, +only the first message (in a block with lowest ticket) will be considered +for execution + +NOTE: THIS METHOD SHOULD ONLY BE USED FOR GETTING MESSAGES IN A SPECIFIC BLOCK + +DO NOT USE THIS METHOD TO GET MESSAGES INCLUDED IN A TIPSET +Use ChainGetParentMessages, which will perform correct message deduplication + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "BlsMessages": null, + "SecpkMessages": null, + "Cids": null +} +``` + +### ChainGetGenesis +ChainGetGenesis returns the genesis tipset. + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainGetMessage +ChainGetMessage reads a message referenced by the specified CID from the +chain blockstore. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### ChainGetNode + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Cid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Obj": {} +} +``` + +### ChainGetParentMessages +ChainGetParentMessages returns messages stored in parent tipset of the +specified block. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### ChainGetParentReceipts +ChainGetParentReceipts returns receipts for messages in parent tipset of +the specified block. The receipts in the list returned is one-to-one with the +messages returned by a call to ChainGetParentMessages with the same blockCid. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### ChainGetPath +ChainGetPath returns a set of revert/apply operations needed to get from +one tipset to another, for example: +``` + to + ^ +from tAA + ^ ^ +tBA tAB + ^---*--^ + ^ + tRR +``` +Would return `[revert(tBA), apply(tAB), apply(tAA)]` + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### ChainGetRandomnessFromBeacon +ChainGetRandomnessFromBeacon is used to sample the beacon for randomness. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `null` + +### ChainGetRandomnessFromTickets +ChainGetRandomnessFromTickets is used to sample the chain for randomness. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 2, + 10101, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `null` + +### ChainGetTipSet +ChainGetTipSet returns the tipset specified by the given TipSetKey. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainGetTipSetByHeight +ChainGetTipSetByHeight looks back for a tipset at the specified epoch. +If there are no blocks at the specified epoch, a tipset at an earlier epoch +will be returned. + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainHasObj +ChainHasObj checks if a given CID exists in the chain blockstore. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `true` + +### ChainHead +ChainHead returns the current head of the chain. + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Cids": null, + "Blocks": null, + "Height": 0 +} +``` + +### ChainNotify +ChainNotify returns channel with chain head updates. +First message is guaranteed to be of len == 1, and type == 'current'. + + +Perms: read + +Inputs: `null` + +Response: `null` + +### ChainReadObj +ChainReadObj reads ipld nodes referenced by the specified CID from chain +blockstore and returns raw bytes. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"Ynl0ZSBhcnJheQ=="` + +### ChainSetHead +ChainSetHead forcefully sets current chain head. Use with caution. + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### ChainStatObj +ChainStatObj returns statistics about the graph referenced by 'obj'. +If 'base' is also specified, then the returned stat will be a diff +between the two objects. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Size": 42, + "Links": 42 +} +``` + +### ChainTipSetWeight +ChainTipSetWeight computes weight for the specified tipset. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +## Client +The Client methods all have to do with interacting with the storage and +retrieval markets as a client + + +### ClientCalcCommP +ClientCalcCommP calculates the CommP for a specified file + + +Perms: write + +Inputs: +```json +[ + "string value" +] +``` + +Response: +```json +{ + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 1024 +} +``` + +### ClientCancelDataTransfer +ClientCancelDataTransfer cancels a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### ClientDataTransferUpdates + + +Perms: write + +Inputs: `null` + +Response: +```json +{ + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42 +} +``` + +### ClientDealPieceCID +ClientCalcCommP calculates the CommP and data size of the specified CID + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "PayloadSize": 9, + "PieceSize": 1032, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +} +``` + +### ClientDealSize +ClientDealSize calculates real deal data size + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "PayloadSize": 9, + "PieceSize": 1032 +} +``` + +### ClientFindData +ClientFindData identifies peers that have a certain file, and returns QueryOffers (one per peer). + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + null +] +``` + +Response: `null` + +### ClientGenCar +ClientGenCar generates a CAR file for the specified file. + + +Perms: write + +Inputs: +```json +[ + { + "Path": "string value", + "IsCAR": true + }, + "string value" +] +``` + +Response: `{}` + +### ClientGetDealInfo +ClientGetDealInfo returns the latest information about a given deal. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42 + } +} +``` + +### ClientGetDealStatus +ClientGetDealStatus returns status given a code + + +Perms: read + +Inputs: +```json +[ + 42 +] +``` + +Response: `"string value"` + +### ClientGetDealUpdates +ClientGetDealUpdates returns the status of updated deals + + +Perms: write + +Inputs: `null` + +Response: +```json +{ + "ProposalCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": 42, + "Message": "string value", + "Provider": "f01234", + "DataRef": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Size": 42, + "PricePerEpoch": "0", + "Duration": 42, + "DealID": 5432, + "CreationTime": "0001-01-01T00:00:00Z", + "Verified": true, + "TransferChannelID": { + "Initiator": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Responder": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "ID": 3 + }, + "DataTransfer": { + "TransferID": 3, + "Status": 1, + "BaseCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "IsInitiator": true, + "IsSender": true, + "Voucher": "string value", + "Message": "string value", + "OtherPeer": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Transferred": 42 + } +} +``` + +### ClientHasLocal +ClientHasLocal indicates whether a certain CID is locally stored. + + +Perms: write + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `true` + +### ClientImport +ClientImport imports file under the specified path into filestore. + + +Perms: admin + +Inputs: +```json +[ + { + "Path": "string value", + "IsCAR": true + } +] +``` + +Response: +```json +{ + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ImportID": 50 +} +``` + +### ClientListDataTransfers +ClientListTransfers returns the status of all ongoing transfers of data + + +Perms: write + +Inputs: `null` + +Response: `null` + +### ClientListDeals +ClientListDeals returns information about the deals made by the local client. + + +Perms: write + +Inputs: `null` + +Response: `null` + +### ClientListImports +ClientListImports lists imported files and their root CIDs + + +Perms: write + +Inputs: `null` + +Response: `null` + +### ClientMinerQueryOffer +ClientMinerQueryOffer returns a QueryOffer for the specific miner and file. + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + null +] +``` + +Response: +```json +{ + "Err": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "MinPrice": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } +} +``` + +### ClientQueryAsk +ClientQueryAsk returns a signed StorageAsk from the specified miner. + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "f01234" +] +``` + +Response: +```json +{ + "Price": "0", + "VerifiedPrice": "0", + "MinPieceSize": 1032, + "MaxPieceSize": 1032, + "Miner": "f01234", + "Timestamp": 10101, + "Expiry": 10101, + "SeqNo": 42 +} +``` + +### ClientRemoveImport +ClientRemoveImport removes file import + + +Perms: admin + +Inputs: +```json +[ + 50 +] +``` + +Response: `{}` + +### ClientRestartDataTransfer +ClientRestartDataTransfer attempts to restart a data transfer with the given transfer ID and other peer + + +Perms: write + +Inputs: +```json +[ + 3, + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + true +] +``` + +Response: `{}` + +### ClientRetrieve +ClientRetrieve initiates the retrieval of a file, as specified in the order. + + +Perms: admin + +Inputs: +```json +[ + { + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "Total": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Client": "f01234", + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + }, + { + "Path": "string value", + "IsCAR": true + } +] +``` + +Response: `{}` + +### ClientRetrieveTryRestartInsufficientFunds +ClientRetrieveTryRestartInsufficientFunds attempts to restart stalled retrievals on a given payment channel +which are stuck due to insufficient funds + + +Perms: write + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### ClientRetrieveWithEvents +ClientRetrieveWithEvents initiates the retrieval of a file, as specified in the order, and provides a channel +of status updates. + + +Perms: admin + +Inputs: +```json +[ + { + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Piece": null, + "Size": 42, + "Total": "0", + "UnsealPrice": "0", + "PaymentInterval": 42, + "PaymentIntervalIncrease": 42, + "Client": "f01234", + "Miner": "f01234", + "MinerPeer": { + "Address": "f01234", + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "PieceCID": null + } + }, + { + "Path": "string value", + "IsCAR": true + } +] +``` + +Response: +```json +{ + "Event": 5, + "Status": 0, + "BytesReceived": 42, + "FundsSpent": "0", + "Err": "string value" +} +``` + +### ClientStartDeal +ClientStartDeal proposes a deal with a miner. + + +Perms: admin + +Inputs: +```json +[ + { + "Data": { + "TransferType": "string value", + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceCid": null, + "PieceSize": 1024, + "RawBlockSize": 42 + }, + "Wallet": "f01234", + "Miner": "f01234", + "EpochPrice": "0", + "MinBlocksDuration": 42, + "ProviderCollateral": "0", + "DealStartEpoch": 10101, + "FastRetrieval": true, + "VerifiedDeal": true + } +] +``` + +Response: `null` + +## Create + + +### CreateBackup +CreateBackup creates node backup onder the specified file name. The +method requires that the lotus daemon is running with the +LOTUS_BACKUP_BASE_PATH environment variable set to some path, and that +the path specified when calling CreateBackup is within the base path + + +Perms: admin + +Inputs: +```json +[ + "string value" +] +``` + +Response: `{}` + +## Gas + + +### GasEstimateFeeCap +GasEstimateFeeCap estimates gas fee cap + + +Perms: read + +Inputs: +```json +[ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateGasLimit +GasEstimateGasLimit estimates gas used by the message and returns it. +It fails if message fails to execute. + + +Perms: read + +Inputs: +```json +[ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `9` + +### GasEstimateGasPremium +GasEstimateGasPremium estimates what gas price should be used for a +message to have high likelihood of inclusion in `nblocksincl` epochs. + + +Perms: read + +Inputs: +```json +[ + 42, + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### GasEstimateMessageGas +GasEstimateMessageGas estimates gas values for unset message gas fields + + +Perms: read + +Inputs: +```json +[ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + { + "MaxFee": "0" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +## I + + +### ID + + +Perms: read + +Inputs: `null` + +Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` + +## Log + + +### LogList + + +Perms: write + +Inputs: `null` + +Response: `null` + +### LogSetLevel + + +Perms: write + +Inputs: +```json +[ + "string value", + "string value" +] +``` + +Response: `{}` + +## Market + + +### MarketAddBalance +MarketAddBalance adds funds to the market actor + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketGetReserved +MarketGetReserved gets the amount of funds that are currently reserved for the address + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `"0"` + +### MarketReleaseFunds +MarketReleaseFunds releases funds reserved by MarketReserveFunds + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "0" +] +``` + +Response: `{}` + +### MarketReserveFunds +MarketReserveFunds reserves funds for a deal + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MarketWithdraw +MarketWithdraw withdraws unlocked funds from the market actor + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Miner + + +### MinerCreateBlock + + +Perms: write + +Inputs: +```json +[ + { + "Miner": "f01234", + "Parents": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Ticket": { + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "Eproof": { + "WinCount": 9, + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "BeaconValues": null, + "Messages": null, + "Epoch": 10101, + "Timestamp": 42, + "WinningPoStProof": null + } +] +``` + +Response: +```json +{ + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": null, + "SecpkMessages": null +} +``` + +### MinerGetBaseInfo +There are not yet any comments for this method. + +Perms: read + +Inputs: +```json +[ + "f01234", + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": "0", + "NetworkPower": "0", + "Sectors": null, + "WorkerKey": "f01234", + "SectorSize": 34359738368, + "PrevBeaconEntry": { + "Round": 42, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "EligibleForMining": true +} +``` + +## Mpool +The Mpool methods are for interacting with the message pool. The message pool +manages all incoming and outgoing 'messages' going over the network. + + +### MpoolBatchPush +MpoolBatchPush batch pushes a signed message to mempool. + + +Perms: write + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolBatchPushMessage +MpoolBatchPushMessage batch pushes a unsigned message to mempool. + + +Perms: sign + +Inputs: +```json +[ + null, + { + "MaxFee": "0" + } +] +``` + +Response: `null` + +### MpoolBatchPushUntrusted +MpoolBatchPushUntrusted batch pushes a signed message to mempool from untrusted sources. + + +Perms: write + +Inputs: +```json +[ + null +] +``` + +Response: `null` + +### MpoolClear +MpoolClear clears pending messages from the mpool + + +Perms: write + +Inputs: +```json +[ + true +] +``` + +Response: `{}` + +### MpoolGetConfig +MpoolGetConfig returns (a copy of) the current mpool config + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "PriorityAddrs": null, + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 +} +``` + +### MpoolGetNonce +MpoolGetNonce gets next nonce for the specified sender. +Note that this method may not be atomic. Use MpoolPushMessage instead. + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `42` + +### MpoolPending +MpoolPending returns pending mempool messages. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### MpoolPush +MpoolPush pushes a signed message to mempool. + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolPushMessage +MpoolPushMessage atomically assigns a nonce, signs, and pushes a message +to mempool. +maxFee is only used when GasFeeCap/GasPremium fields aren't specified + +When maxFee is set to 0, MpoolPushMessage will guess appropriate fee +based on current chain conditions + + +Perms: sign + +Inputs: +```json +[ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + { + "MaxFee": "0" + } +] +``` + +Response: +```json +{ + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### MpoolPushUntrusted +MpoolPushUntrusted pushes a signed message to mempool from untrusted sources. + + +Perms: write + +Inputs: +```json +[ + { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MpoolSelect +MpoolSelect returns a list of pending messages for inclusion in the next block + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 12.3 +] +``` + +Response: `null` + +### MpoolSetConfig +MpoolSetConfig sets the mpool config to (a copy of) the supplied config + + +Perms: admin + +Inputs: +```json +[ + { + "PriorityAddrs": null, + "SizeLimitHigh": 123, + "SizeLimitLow": 123, + "ReplaceByFeeRatio": 12.3, + "PruneCooldown": 60000000000, + "GasLimitOverestimation": 12.3 + } +] +``` + +Response: `{}` + +### MpoolSub + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Type": 0, + "Message": { + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +} +``` + +## Msig +The Msig methods are used to interact with multisig wallets on the +filecoin network + + +### MsigAddApprove +MsigAddApprove approves a previously proposed AddSigner message +It takes the following params: , , , +, , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + 42, + "f01234", + "f01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigAddCancel +MsigAddCancel cancels a previously proposed AddSigner message +It takes the following params: , , , +, + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + 42, + "f01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigAddPropose +MsigAddPropose proposes adding a signer in the multisig +It takes the following params: , , +, + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "f01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigApprove +MsigApprove approves a previously-proposed multisig message by transaction ID +It takes the following params: , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + 42, + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigApproveTxnHash +MsigApproveTxnHash approves a previously-proposed multisig message, specified +using both transaction ID and a hash of the parameters used in the +proposal. This method of approval can be used to ensure you only approve +exactly the transaction you think you are. +It takes the following params: , , , , , +, , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + 42, + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigCancel +MsigCancel cancels a previously-proposed multisig message +It takes the following params: , , , , +, , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + 42, + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigCreate +MsigCreate creates a multisig wallet +It takes the following params: , , +, , + + +Perms: sign + +Inputs: +```json +[ + 42, + null, + 10101, + "0", + "f01234", + "0" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigGetAvailableBalance +MsigGetAvailableBalance returns the portion of a multisig's balance that can be withdrawn or spent + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### MsigGetPending +MsigGetPending returns pending transactions for the given multisig +wallet. Once pending transactions are fully approved, they will no longer +appear here. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### MsigGetVested +MsigGetVested returns the amount of FIL that vested in a multisig in a certain period. +It takes the following params: , , + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### MsigGetVestingSchedule +MsigGetVestingSchedule returns the vesting details of a given multisig. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "InitialBalance": "0", + "StartEpoch": 10101, + "UnlockDuration": 10101 +} +``` + +### MsigPropose +MsigPropose proposes a multisig message +It takes the following params: , , , +, , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0", + "f01234", + 42, + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigRemoveSigner +MsigRemoveSigner proposes the removal of a signer from the multisig. +It accepts the multisig to make the change on, the proposer address to +send the message from, the address to be removed, and a boolean +indicating whether or not the signing threshold should be lowered by one +along with the address removal. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "f01234", + true +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapApprove +MsigSwapApprove approves a previously proposed SwapSigner +It takes the following params: , , , +, , + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + 42, + "f01234", + "f01234", + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapCancel +MsigSwapCancel cancels a previously proposed SwapSigner message +It takes the following params: , , , +, + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + 42, + "f01234", + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### MsigSwapPropose +MsigSwapPropose proposes swapping 2 signers in the multisig +It takes the following params: , , +, + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "f01234", + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## Net + + +### NetAddrsListen + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Addrs": null, + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +} +``` + +### NetAgentVersion + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: `"string value"` + +### NetAutoNatStatus + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Reachability": 1, + "PublicAddr": "string value" +} +``` + +### NetBandwidthStats + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "TotalIn": 9, + "TotalOut": 9, + "RateIn": 12.3, + "RateOut": 12.3 +} +``` + +### NetBandwidthStatsByPeer + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "12D3KooWSXmXLJmBR1M7i9RW9GQPNUhZSzXKzxDHWtAgNuJAbyEJ": { + "TotalIn": 174000, + "TotalOut": 12500, + "RateIn": 100, + "RateOut": 50 + } +} +``` + +### NetBandwidthStatsByProtocol + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "/fil/hello/1.0.0": { + "TotalIn": 174000, + "TotalOut": 12500, + "RateIn": 100, + "RateOut": 50 + } +} +``` + +### NetBlockAdd + + +Perms: admin + +Inputs: +```json +[ + { + "Peers": null, + "IPAddrs": null, + "IPSubnets": null + } +] +``` + +Response: `{}` + +### NetBlockList + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Peers": null, + "IPAddrs": null, + "IPSubnets": null +} +``` + +### NetBlockRemove + + +Perms: admin + +Inputs: +```json +[ + { + "Peers": null, + "IPAddrs": null, + "IPSubnets": null + } +] +``` + +Response: `{}` + +### NetConnect + + +Perms: write + +Inputs: +```json +[ + { + "Addrs": null, + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + } +] +``` + +Response: `{}` + +### NetConnectedness + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: `1` + +### NetDisconnect + + +Perms: write + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: `{}` + +### NetFindPeer + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: +```json +{ + "Addrs": null, + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +} +``` + +### NetPeerInfo + + +Perms: read + +Inputs: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +Response: +```json +{ + "ID": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Agent": "string value", + "Addrs": null, + "Protocols": null, + "ConnMgrMeta": { + "FirstSeen": "0001-01-01T00:00:00Z", + "Value": 123, + "Tags": { + "name": 42 + }, + "Conns": { + "name": "2021-03-08T22:52:18Z" + } + } +} +``` + +### NetPeers + + +Perms: read + +Inputs: `null` + +Response: `null` + +### NetPubsubScores + + +Perms: read + +Inputs: `null` + +Response: `null` + +## Paych +The Paych methods are for interacting with and managing payment channels + + +### PaychAllocateLane + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `42` + +### PaychAvailableFunds + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychAvailableFundsByFromTo + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234" +] +``` + +Response: +```json +{ + "Channel": "\u003cempty\u003e", + "From": "f01234", + "To": "f01234", + "ConfirmedAmt": "0", + "PendingAmt": "0", + "PendingWaitSentinel": null, + "QueuedAmt": "0", + "VoucherReedeemedAmt": "0" +} +``` + +### PaychCollect + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychGet +There are not yet any comments for this method. + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + "0" +] +``` + +Response: +```json +{ + "Channel": "f01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +} +``` + +### PaychGetWaitReady + + +Perms: sign + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"f01234"` + +### PaychList + + +Perms: read + +Inputs: `null` + +Response: `null` + +### PaychNewPayment + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "f01234", + null +] +``` + +Response: +```json +{ + "Channel": "f01234", + "WaitSentinel": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Vouchers": null +} +``` + +### PaychSettle + + +Perms: sign + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +### PaychStatus + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "ControlAddr": "f01234", + "Direction": 1 +} +``` + +### PaychVoucherAdd + + +Perms: write + +Inputs: +```json +[ + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "0" +] +``` + +Response: `"0"` + +### PaychVoucherCheckSpendable + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: `true` + +### PaychVoucherCheckValid + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + } +] +``` + +Response: `{}` + +### PaychVoucherCreate + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "0", + 42 +] +``` + +Response: +```json +{ + "Voucher": { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Shortfall": "0" +} +``` + +### PaychVoucherList + + +Perms: write + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `null` + +### PaychVoucherSubmit + + +Perms: sign + +Inputs: +```json +[ + "f01234", + { + "ChannelAddr": "f01234", + "TimeLockMin": 10101, + "TimeLockMax": 10101, + "SecretPreimage": "Ynl0ZSBhcnJheQ==", + "Extra": { + "Actor": "f01234", + "Method": 1, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Lane": 42, + "Nonce": 42, + "Amount": "0", + "MinSettleHeight": 10101, + "Merges": null, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } + }, + "Ynl0ZSBhcnJheQ==", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" +} +``` + +## State +The State methods are used to query, inspect, and interact with chain state. +Most methods take a TipSetKey as a parameter. The state looked up is the parent state of the tipset. +A nil TipSetKey can be provided as a param, this will cause the heaviest tipset in the chain to be used. + + +### StateAccountKey +StateAccountKey returns the public key address of the given ID address + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"f01234"` + +### StateAllMinerFaults +StateAllMinerFaults returns all non-expired Faults that occur within lookback epochs of the given tipset + + +Perms: read + +Inputs: +```json +[ + 10101, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateCall +StateCall runs the given message and returns its result without any persisted changes. + +StateCall applies the message to the tipset's parent state. The +message is not applied on-top-of the messages in the passed-in +tipset. + + +Perms: read + +Inputs: +```json +[ + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": null, + "Subcalls": null + }, + "Error": "string value", + "Duration": 60000000000 +} +``` + +### StateChangedActors +StateChangedActors returns all the actors whose states change between the two given state CIDs +TODO: Should this take tipset keys instead? + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "t01236": { + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" + } +} +``` + +### StateCirculatingSupply +StateCirculatingSupply returns the exact circulating supply of Filecoin at the given tipset. +This is not used anywhere in the protocol itself, and is only for external consumption. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateCompute +StateCompute is a flexible command that applies the given messages on the given tipset. +The messages are run as though the VM were at the provided height. + +When called, StateCompute will: +- Load the provided tipset, or use the current chain head if not provided +- Compute the tipset state of the provided tipset on top of the parent state + - (note that this step runs before vmheight is applied to the execution) + - Execute state upgrade if any were scheduled at the epoch, or in null + blocks preceding the tipset + - Call the cron actor on null blocks preceding the tipset + - For each block in the tipset + - Apply messages in blocks in the specified + - Award block reward by calling the reward actor + - Call the cron actor for the current epoch +- If the specified vmheight is higher than the current epoch, apply any + needed state upgrades to the state +- Apply the specified messages to the state + +The vmheight parameter sets VM execution epoch, and can be used to simulate +message execution in different network versions. If the specified vmheight +epoch is higher than the epoch of the specified tipset, any state upgrades +until the vmheight will be executed on the state before applying messages +specified by the user. + +Note that the initial tipset state computation is not affected by the +vmheight parameter - only the messages in the `apply` set are + +If the caller wants to simply compute the state, vmheight should be set to +the epoch of the specified tipset. + +Messages in the `apply` parameter must have the correct nonces, and gas +values set. + + +Perms: read + +Inputs: +```json +[ + 10101, + null, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Root": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Trace": null +} +``` + +### StateDealProviderCollateralBounds +StateDealProviderCollateralBounds returns the min and max collateral a storage provider +can issue. It takes the deal size and verified status as parameters. + + +Perms: read + +Inputs: +```json +[ + 1032, + true, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Min": "0", + "Max": "0" +} +``` + +### StateDecodeParams +StateDecodeParams attempts to decode the provided params, based on the recipient actor address and method number. + + +Perms: read + +Inputs: +```json +[ + "f01234", + 1, + "Ynl0ZSBhcnJheQ==", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### StateGetActor +StateGetActor returns the indicated actor's nonce and balance. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Head": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Nonce": 42, + "Balance": "0" +} +``` + +### StateGetReceipt +StateGetReceipt returns the message receipt for the given message or for a +matching gas-repriced replacing message + +NOTE: If the requested message was replaced, this method will return the receipt +for the replacing message - if the caller needs the receipt for exactly the +requested message, use StateSearchMsg().Receipt, and check that MsgLookup.Message +is matching the requested CID + +DEPRECATED: Use StateSearchMsg, this method won't be supported in v1 API + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 +} +``` + +### StateListActors +StateListActors returns the addresses of every actor in the state + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateListMessages +StateListMessages looks back and returns all messages with a matching to or from address, stopping at the given height. + + +Perms: read + +Inputs: +```json +[ + { + "To": "f01234", + "From": "f01234" + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + 10101 +] +``` + +Response: `null` + +### StateListMiners +StateListMiners returns the addresses of every miner that has claimed power in the Power Actor + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateLookupID +StateLookupID retrieves the ID address of the given address + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"f01234"` + +### StateMarketBalance +StateMarketBalance looks up the Escrow and Locked balances of the given address in the Storage Market + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Escrow": "0", + "Locked": "0" +} +``` + +### StateMarketDeals +StateMarketDeals returns information about every deal in the Storage Market + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } + } +} +``` + +### StateMarketParticipants +StateMarketParticipants returns the Escrow and Locked balances of every participant in the Storage Market + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "t026363": { + "Escrow": "0", + "Locked": "0" + } +} +``` + +### StateMarketStorageDeal +StateMarketStorageDeal returns information about the indicated deal + + +Perms: read + +Inputs: +```json +[ + 5432, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Proposal": { + "PieceCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "PieceSize": 1032, + "VerifiedDeal": true, + "Client": "f01234", + "Provider": "f01234", + "Label": "string value", + "StartEpoch": 10101, + "EndEpoch": 10101, + "StoragePricePerEpoch": "0", + "ProviderCollateral": "0", + "ClientCollateral": "0" + }, + "State": { + "SectorStartEpoch": 10101, + "LastUpdatedEpoch": 10101, + "SlashEpoch": 10101 + } +} +``` + +### StateMinerActiveSectors +StateMinerActiveSectors returns info about sectors that a given miner is actively proving. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerAvailableBalance +StateMinerAvailableBalance returns the portion of a miner's balance that can be withdrawn or spent + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerDeadlines +StateMinerDeadlines returns all the proving deadlines for the given miner + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerFaults +StateMinerFaults returns a bitfield indicating the faulty sectors of the given miner + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerInfo +StateMinerInfo returns info about the indicated miner + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Owner": "f01234", + "Worker": "f01234", + "NewWorker": "f01234", + "ControlAddresses": null, + "WorkerChangeEpoch": 10101, + "PeerId": "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf", + "Multiaddrs": null, + "WindowPoStProofType": 8, + "SectorSize": 34359738368, + "WindowPoStPartitionSectors": 42, + "ConsensusFaultElapsed": 10101 +} +``` + +### StateMinerInitialPledgeCollateral +StateMinerInitialPledgeCollateral returns the initial pledge collateral for the specified miner's sector + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerPartitions +StateMinerPartitions returns all partitions in the specified deadline + + +Perms: read + +Inputs: +```json +[ + "f01234", + 42, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateMinerPower +StateMinerPower returns the power of the indicated miner + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "MinerPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "TotalPower": { + "RawBytePower": "0", + "QualityAdjPower": "0" + }, + "HasMinPower": true +} +``` + +### StateMinerPreCommitDepositForPower +StateMinerInitialPledgeCollateral returns the precommit deposit for the specified miner's sector + + +Perms: read + +Inputs: +```json +[ + "f01234", + { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateMinerProvingDeadline +StateMinerProvingDeadline calculates the deadline at some epoch for a proving period +and returns the deadline-related calculations. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "CurrentEpoch": 10101, + "PeriodStart": 10101, + "Index": 42, + "Open": 10101, + "Close": 10101, + "Challenge": 10101, + "FaultCutoff": 10101, + "WPoStPeriodDeadlines": 42, + "WPoStProvingPeriod": 10101, + "WPoStChallengeWindow": 10101, + "WPoStChallengeLookback": 10101, + "FaultDeclarationCutoff": 10101 +} +``` + +### StateMinerRecoveries +StateMinerRecoveries returns a bitfield indicating the recovering sectors of the given miner + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +[ + 5, + 1 +] +``` + +### StateMinerSectorAllocated +StateMinerSectorAllocated checks if a sector is allocated + + +Perms: read + +Inputs: +```json +[ + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `true` + +### StateMinerSectorCount +StateMinerSectorCount returns the number of sectors in a miner's sector set and proving set + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Live": 42, + "Active": 42, + "Faulty": 42 +} +``` + +### StateMinerSectors +StateMinerSectors returns info about the given miner's sectors. If the filter bitfield is nil, all sectors are included. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + 0 + ], + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `null` + +### StateNetworkName +StateNetworkName returns the name of the network the node is synced to + + +Perms: read + +Inputs: `null` + +Response: `"lotus"` + +### StateNetworkVersion +StateNetworkVersion returns the network version at the given tipset + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `9` + +### StateReadState +StateReadState returns the indicated actor's state. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Balance": "0", + "Code": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "State": {} +} +``` + +### StateReplay +StateReplay replays a given message, assuming it was included in a block in the specified tipset. + +If a tipset key is provided, and a replacing message is found on chain, +the method will return an error saying that the message wasn't found + +If no tipset key is provided, the appropriate tipset is looked up, and if +the message was gas-repriced, the on-chain message will be replayed - in +that case the returned InvocResult.MsgCid will not match the Cid param + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that InvocResult.MsgCid is equal to the provided Cid. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "MsgCid": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "GasCost": { + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "GasUsed": "0", + "BaseFeeBurn": "0", + "OverEstimationBurn": "0", + "MinerPenalty": "0", + "MinerTip": "0", + "Refund": "0", + "TotalCost": "0" + }, + "ExecutionTrace": { + "Msg": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "MsgRct": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "Error": "string value", + "Duration": 60000000000, + "GasCharges": null, + "Subcalls": null + }, + "Error": "string value", + "Duration": 60000000000 +} +``` + +### StateSearchMsg +StateSearchMsg searches for a message in the chain, and returns its receipt and the tipset where it was executed + +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that MsgLookup.Message is equal to the provided 'cid'. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateSearchMsgLimited +StateSearchMsgLimited looks back up to limit epochs in the chain for a message, and returns its receipt and the tipset where it was executed + +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that MsgLookup.Message is equal to the provided 'cid'. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 10101 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateSectorExpiration +StateSectorExpiration returns epoch at which given sector will expire + + +Perms: read + +Inputs: +```json +[ + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "OnTime": 10101, + "Early": 10101 +} +``` + +### StateSectorGetInfo +StateSectorGetInfo returns the on-chain info for the specified miner's sector. Returns null in case the sector info isn't found +NOTE: returned info.Expiration may not be accurate in some cases, use StateSectorExpiration to get accurate +expiration epoch + + +Perms: read + +Inputs: +```json +[ + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "SectorNumber": 9, + "SealProof": 8, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "DealIDs": null, + "Activation": 10101, + "Expiration": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0", + "InitialPledge": "0", + "ExpectedDayReward": "0", + "ExpectedStoragePledge": "0" +} +``` + +### StateSectorPartition +StateSectorPartition finds deadline/partition with the specified sector + + +Perms: read + +Inputs: +```json +[ + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Deadline": 42, + "Partition": 42 +} +``` + +### StateSectorPreCommitInfo +StateSectorPreCommitInfo returns the PreCommit info for the specified miner's sector + + +Perms: read + +Inputs: +```json +[ + "f01234", + 9, + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "Info": { + "SealProof": 8, + "SectorNumber": 9, + "SealedCID": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "SealRandEpoch": 10101, + "DealIDs": null, + "Expiration": 10101, + "ReplaceCapacity": true, + "ReplaceSectorDeadline": 42, + "ReplaceSectorPartition": 42, + "ReplaceSectorNumber": 9 + }, + "PreCommitDeposit": "0", + "PreCommitEpoch": 10101, + "DealWeight": "0", + "VerifiedDealWeight": "0" +} +``` + +### StateVMCirculatingSupplyInternal +StateVMCirculatingSupplyInternal returns an approximation of the circulating supply of Filecoin at the given tipset. +This is the value reported by the runtime interface to actors code. + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: +```json +{ + "FilVested": "0", + "FilMined": "0", + "FilBurnt": "0", + "FilLocked": "0", + "FilCirculating": "0" +} +``` + +### StateVerifiedClientStatus +StateVerifiedClientStatus returns the data cap for the given address. +Returns nil if there is no entry in the data cap table for the +address. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateVerifiedRegistryRootKey +StateVerifiedClientStatus returns the address of the Verified Registry's root key + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"f01234"` + +### StateVerifierStatus +StateVerifierStatus returns the data cap for the given address. +Returns nil if there is no entry in the data cap table for the +address. + + +Perms: read + +Inputs: +```json +[ + "f01234", + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `"0"` + +### StateWaitMsg +StateWaitMsg looks back in the chain for a message. If not found, it blocks until the +message arrives on chain, and gets to the indicated confidence depth. + +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that MsgLookup.Message is equal to the provided 'cid'. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +### StateWaitMsgLimited +StateWaitMsgLimited looks back up to limit epochs in the chain for a message. +If not found, it blocks until the message arrives on chain, and gets to the +indicated confidence depth. + +NOTE: If a replacing message is found on chain, this method will return +a MsgLookup for the replacing message - the MsgLookup.Message will be a different +CID than the one provided in the 'cid' param, MsgLookup.Receipt will contain the +result of the execution of the replacing message. + +If the caller wants to ensure that exactly the requested message was executed, +they MUST check that MsgLookup.Message is equal to the provided 'cid'. +Without this check both the requested and original message may appear as +successfully executed on-chain, which may look like a double-spend. + +A replacing message is a message with a different CID, any of Gas values, and +different signature, but with all other parameters matching (source/destination, +nonce, params, etc.) + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + 42, + 10101 +] +``` + +Response: +```json +{ + "Message": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Receipt": { + "ExitCode": 0, + "Return": "Ynl0ZSBhcnJheQ==", + "GasUsed": 9 + }, + "ReturnDec": {}, + "TipSet": [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ], + "Height": 10101 +} +``` + +## Sync +The Sync method group contains methods for interacting with and +observing the lotus sync service. + + +### SyncCheckBad +SyncCheckBad checks if a block was marked as bad, and if it was, returns +the reason. + + +Perms: read + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `"string value"` + +### SyncCheckpoint +SyncCheckpoint marks a blocks as checkpointed, meaning that it won't ever fork away from it. + + +Perms: admin + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `{}` + +### SyncIncomingBlocks +SyncIncomingBlocks returns a channel streaming incoming, potentially not +yet synced block headers. + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "Miner": "f01234", + "Ticket": { + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" +} +``` + +### SyncMarkBad +SyncMarkBad marks a blocks as bad, meaning that it won't ever by synced. +Use with extreme caution. + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + +### SyncState +SyncState returns the current status of the lotus sync system. + + +Perms: read + +Inputs: `null` + +Response: +```json +{ + "ActiveSyncs": null, + "VMApplied": 42 +} +``` + +### SyncSubmitBlock +SyncSubmitBlock can be used to submit a newly created block to the. +network through this node + + +Perms: write + +Inputs: +```json +[ + { + "Header": { + "Miner": "f01234", + "Ticket": { + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "ElectionProof": { + "WinCount": 9, + "VRFProof": "Ynl0ZSBhcnJheQ==" + }, + "BeaconEntries": null, + "WinPoStProof": null, + "Parents": null, + "ParentWeight": "0", + "Height": 10101, + "ParentStateRoot": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "ParentMessageReceipts": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "Messages": { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + "BLSAggregate": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "Timestamp": 42, + "BlockSig": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "ForkSignaling": 42, + "ParentBaseFee": "0" + }, + "BlsMessages": null, + "SecpkMessages": null + } +] +``` + +Response: `{}` + +### SyncUnmarkAllBad +SyncUnmarkAllBad purges bad block cache, making it possible to sync to chains previously marked as bad + + +Perms: admin + +Inputs: `null` + +Response: `{}` + +### SyncUnmarkBad +SyncUnmarkBad unmarks a blocks as bad, making it possible to be validated and synced again. + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + +### SyncValidateTipset +SyncValidateTipset indicates whether the provided tipset is valid or not + + +Perms: read + +Inputs: +```json +[ + [ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + }, + { + "/": "bafy2bzacebp3shtrn43k7g3unredz7fxn4gj533d3o43tqn2p2ipxxhrvchve" + } + ] +] +``` + +Response: `true` + +## Wallet + + +### WalletBalance +WalletBalance returns the balance of the given address at the current head of the chain. + + +Perms: read + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `"0"` + +### WalletDefaultAddress +WalletDefaultAddress returns the address marked as default in the wallet. + + +Perms: write + +Inputs: `null` + +Response: `"f01234"` + +### WalletDelete +WalletDelete deletes an address from the wallet. + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### WalletExport +WalletExport returns the private key of an address in the wallet. + + +Perms: admin + +Inputs: +```json +[ + "f01234" +] +``` + +Response: +```json +{ + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletHas +WalletHas indicates whether the given address is in the wallet. + + +Perms: write + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `true` + +### WalletImport +WalletImport receives a KeyInfo, which includes a private key, and imports it into the wallet. + + +Perms: admin + +Inputs: +```json +[ + { + "Type": "bls", + "PrivateKey": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: `"f01234"` + +### WalletList +WalletList lists all the addresses in the wallet. + + +Perms: write + +Inputs: `null` + +Response: `null` + +### WalletNew +WalletNew creates a new address in the wallet with the given sigType. +Available key types: bls, secp256k1, secp256k1-ledger +Support for numerical types: 1 - secp256k1, 2 - BLS is deprecated + + +Perms: write + +Inputs: +```json +[ + "bls" +] +``` + +Response: `"f01234"` + +### WalletSetDefault +WalletSetDefault marks the given address as as the default one. + + +Perms: write + +Inputs: +```json +[ + "f01234" +] +``` + +Response: `{}` + +### WalletSign +WalletSign signs the given bytes using the given address. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + "Ynl0ZSBhcnJheQ==" +] +``` + +Response: +```json +{ + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" +} +``` + +### WalletSignMessage +WalletSignMessage signs the given message using the given address. + + +Perms: sign + +Inputs: +```json +[ + "f01234", + { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + } +] +``` + +Response: +```json +{ + "Message": { + "Version": 42, + "To": "f01234", + "From": "f01234", + "Nonce": 42, + "Value": "0", + "GasLimit": 9, + "GasFeeCap": "0", + "GasPremium": "0", + "Method": 1, + "Params": "Ynl0ZSBhcnJheQ==", + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } + }, + "Signature": { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + }, + "CID": { + "/": "bafy2bzacebbpdegvr3i4cosewthysg5xkxpqfn2wfcz6mv2hmoktwbdxkax4s" + } +} +``` + +### WalletValidateAddress +WalletValidateAddress validates whether a given string can be decoded as a well-formed address + + +Perms: read + +Inputs: +```json +[ + "string value" +] +``` + +Response: `"f01234"` + +### WalletVerify +WalletVerify takes an address, a signature, and some bytes, and indicates whether the signature is valid. +The address does not have to be in the wallet. + + +Perms: read + +Inputs: +```json +[ + "f01234", + "Ynl0ZSBhcnJheQ==", + { + "Type": 2, + "Data": "Ynl0ZSBhcnJheQ==" + } +] +``` + +Response: `true` + From efccf7d73032df4f107244072a5c8ef97852cd59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 17:23:01 +0100 Subject: [PATCH 021/239] Generate v0 mocks --- api/v0api/full.go | 2 + api/v0api/v0mocks/mock_full.go | 3004 ++++++++++++++++++++++++++++++++ 2 files changed, 3006 insertions(+) create mode 100644 api/v0api/v0mocks/mock_full.go diff --git a/api/v0api/full.go b/api/v0api/full.go index 8e370de51..ec1ee9a4a 100644 --- a/api/v0api/full.go +++ b/api/v0api/full.go @@ -23,6 +23,8 @@ import ( "github.com/filecoin-project/lotus/node/modules/dtypes" ) +//go:generate go run github.com/golang/mock/mockgen -destination=v0mocks/mock_full.go -package=v0mocks . FullNode + // FullNode API is a low-level interface to the Filecoin network full node type FullNode interface { Common diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go new file mode 100644 index 000000000..ff391a0bb --- /dev/null +++ b/api/v0api/v0mocks/mock_full.go @@ -0,0 +1,3004 @@ +// Code generated by MockGen. DO NOT EDIT. +// Source: github.com/filecoin-project/lotus/api/v0api (interfaces: FullNode) + +// Package v0mocks is a generated GoMock package. +package v0mocks + +import ( + context "context" + reflect "reflect" + + address "github.com/filecoin-project/go-address" + bitfield "github.com/filecoin-project/go-bitfield" + datatransfer "github.com/filecoin-project/go-data-transfer" + storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" + auth "github.com/filecoin-project/go-jsonrpc/auth" + multistore "github.com/filecoin-project/go-multistore" + abi "github.com/filecoin-project/go-state-types/abi" + big "github.com/filecoin-project/go-state-types/big" + crypto "github.com/filecoin-project/go-state-types/crypto" + dline "github.com/filecoin-project/go-state-types/dline" + network "github.com/filecoin-project/go-state-types/network" + api "github.com/filecoin-project/lotus/api" + apitypes "github.com/filecoin-project/lotus/api/types" + miner "github.com/filecoin-project/lotus/chain/actors/builtin/miner" + types "github.com/filecoin-project/lotus/chain/types" + marketevents "github.com/filecoin-project/lotus/markets/loggers" + dtypes "github.com/filecoin-project/lotus/node/modules/dtypes" + miner0 "github.com/filecoin-project/specs-actors/actors/builtin/miner" + paych "github.com/filecoin-project/specs-actors/actors/builtin/paych" + gomock "github.com/golang/mock/gomock" + uuid "github.com/google/uuid" + cid "github.com/ipfs/go-cid" + metrics "github.com/libp2p/go-libp2p-core/metrics" + network0 "github.com/libp2p/go-libp2p-core/network" + peer "github.com/libp2p/go-libp2p-core/peer" + protocol "github.com/libp2p/go-libp2p-core/protocol" +) + +// MockFullNode is a mock of FullNode interface +type MockFullNode struct { + ctrl *gomock.Controller + recorder *MockFullNodeMockRecorder +} + +// MockFullNodeMockRecorder is the mock recorder for MockFullNode +type MockFullNodeMockRecorder struct { + mock *MockFullNode +} + +// NewMockFullNode creates a new mock instance +func NewMockFullNode(ctrl *gomock.Controller) *MockFullNode { + mock := &MockFullNode{ctrl: ctrl} + mock.recorder = &MockFullNodeMockRecorder{mock} + return mock +} + +// EXPECT returns an object that allows the caller to indicate expected use +func (m *MockFullNode) EXPECT() *MockFullNodeMockRecorder { + return m.recorder +} + +// AuthNew mocks base method +func (m *MockFullNode) AuthNew(arg0 context.Context, arg1 []auth.Permission) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AuthNew", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AuthNew indicates an expected call of AuthNew +func (mr *MockFullNodeMockRecorder) AuthNew(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthNew", reflect.TypeOf((*MockFullNode)(nil).AuthNew), arg0, arg1) +} + +// AuthVerify mocks base method +func (m *MockFullNode) AuthVerify(arg0 context.Context, arg1 string) ([]auth.Permission, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "AuthVerify", arg0, arg1) + ret0, _ := ret[0].([]auth.Permission) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// AuthVerify indicates an expected call of AuthVerify +func (mr *MockFullNodeMockRecorder) AuthVerify(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "AuthVerify", reflect.TypeOf((*MockFullNode)(nil).AuthVerify), arg0, arg1) +} + +// BeaconGetEntry mocks base method +func (m *MockFullNode) BeaconGetEntry(arg0 context.Context, arg1 abi.ChainEpoch) (*types.BeaconEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "BeaconGetEntry", arg0, arg1) + ret0, _ := ret[0].(*types.BeaconEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// BeaconGetEntry indicates an expected call of BeaconGetEntry +func (mr *MockFullNodeMockRecorder) BeaconGetEntry(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "BeaconGetEntry", reflect.TypeOf((*MockFullNode)(nil).BeaconGetEntry), arg0, arg1) +} + +// ChainDeleteObj mocks base method +func (m *MockFullNode) ChainDeleteObj(arg0 context.Context, arg1 cid.Cid) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainDeleteObj", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainDeleteObj indicates an expected call of ChainDeleteObj +func (mr *MockFullNodeMockRecorder) ChainDeleteObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainDeleteObj", reflect.TypeOf((*MockFullNode)(nil).ChainDeleteObj), arg0, arg1) +} + +// ChainExport mocks base method +func (m *MockFullNode) ChainExport(arg0 context.Context, arg1 abi.ChainEpoch, arg2 bool, arg3 types.TipSetKey) (<-chan []byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainExport", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(<-chan []byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainExport indicates an expected call of ChainExport +func (mr *MockFullNodeMockRecorder) ChainExport(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainExport", reflect.TypeOf((*MockFullNode)(nil).ChainExport), arg0, arg1, arg2, arg3) +} + +// ChainGetBlock mocks base method +func (m *MockFullNode) ChainGetBlock(arg0 context.Context, arg1 cid.Cid) (*types.BlockHeader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlock", arg0, arg1) + ret0, _ := ret[0].(*types.BlockHeader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlock indicates an expected call of ChainGetBlock +func (mr *MockFullNodeMockRecorder) ChainGetBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlock", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlock), arg0, arg1) +} + +// ChainGetBlockMessages mocks base method +func (m *MockFullNode) ChainGetBlockMessages(arg0 context.Context, arg1 cid.Cid) (*api.BlockMessages, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetBlockMessages", arg0, arg1) + ret0, _ := ret[0].(*api.BlockMessages) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetBlockMessages indicates an expected call of ChainGetBlockMessages +func (mr *MockFullNodeMockRecorder) ChainGetBlockMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetBlockMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetBlockMessages), arg0, arg1) +} + +// ChainGetGenesis mocks base method +func (m *MockFullNode) ChainGetGenesis(arg0 context.Context) (*types.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetGenesis", arg0) + ret0, _ := ret[0].(*types.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetGenesis indicates an expected call of ChainGetGenesis +func (mr *MockFullNodeMockRecorder) ChainGetGenesis(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetGenesis", reflect.TypeOf((*MockFullNode)(nil).ChainGetGenesis), arg0) +} + +// ChainGetMessage mocks base method +func (m *MockFullNode) ChainGetMessage(arg0 context.Context, arg1 cid.Cid) (*types.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetMessage", arg0, arg1) + ret0, _ := ret[0].(*types.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetMessage indicates an expected call of ChainGetMessage +func (mr *MockFullNodeMockRecorder) ChainGetMessage(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetMessage", reflect.TypeOf((*MockFullNode)(nil).ChainGetMessage), arg0, arg1) +} + +// ChainGetNode mocks base method +func (m *MockFullNode) ChainGetNode(arg0 context.Context, arg1 string) (*api.IpldObject, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetNode", arg0, arg1) + ret0, _ := ret[0].(*api.IpldObject) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetNode indicates an expected call of ChainGetNode +func (mr *MockFullNodeMockRecorder) ChainGetNode(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetNode", reflect.TypeOf((*MockFullNode)(nil).ChainGetNode), arg0, arg1) +} + +// ChainGetParentMessages mocks base method +func (m *MockFullNode) ChainGetParentMessages(arg0 context.Context, arg1 cid.Cid) ([]api.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentMessages", arg0, arg1) + ret0, _ := ret[0].([]api.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentMessages indicates an expected call of ChainGetParentMessages +func (mr *MockFullNodeMockRecorder) ChainGetParentMessages(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentMessages", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentMessages), arg0, arg1) +} + +// ChainGetParentReceipts mocks base method +func (m *MockFullNode) ChainGetParentReceipts(arg0 context.Context, arg1 cid.Cid) ([]*types.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetParentReceipts", arg0, arg1) + ret0, _ := ret[0].([]*types.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetParentReceipts indicates an expected call of ChainGetParentReceipts +func (mr *MockFullNodeMockRecorder) ChainGetParentReceipts(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetParentReceipts", reflect.TypeOf((*MockFullNode)(nil).ChainGetParentReceipts), arg0, arg1) +} + +// ChainGetPath mocks base method +func (m *MockFullNode) ChainGetPath(arg0 context.Context, arg1, arg2 types.TipSetKey) ([]*api.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetPath", arg0, arg1, arg2) + ret0, _ := ret[0].([]*api.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetPath indicates an expected call of ChainGetPath +func (mr *MockFullNodeMockRecorder) ChainGetPath(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetPath", reflect.TypeOf((*MockFullNode)(nil).ChainGetPath), arg0, arg1, arg2) +} + +// ChainGetRandomnessFromBeacon mocks base method +func (m *MockFullNode) ChainGetRandomnessFromBeacon(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromBeacon", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromBeacon indicates an expected call of ChainGetRandomnessFromBeacon +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromBeacon(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromBeacon", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromBeacon), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetRandomnessFromTickets mocks base method +func (m *MockFullNode) ChainGetRandomnessFromTickets(arg0 context.Context, arg1 types.TipSetKey, arg2 crypto.DomainSeparationTag, arg3 abi.ChainEpoch, arg4 []byte) (abi.Randomness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetRandomnessFromTickets", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(abi.Randomness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetRandomnessFromTickets indicates an expected call of ChainGetRandomnessFromTickets +func (mr *MockFullNodeMockRecorder) ChainGetRandomnessFromTickets(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetRandomnessFromTickets", reflect.TypeOf((*MockFullNode)(nil).ChainGetRandomnessFromTickets), arg0, arg1, arg2, arg3, arg4) +} + +// ChainGetTipSet mocks base method +func (m *MockFullNode) ChainGetTipSet(arg0 context.Context, arg1 types.TipSetKey) (*types.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSet", arg0, arg1) + ret0, _ := ret[0].(*types.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSet indicates an expected call of ChainGetTipSet +func (mr *MockFullNodeMockRecorder) ChainGetTipSet(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSet", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSet), arg0, arg1) +} + +// ChainGetTipSetByHeight mocks base method +func (m *MockFullNode) ChainGetTipSetByHeight(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) (*types.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainGetTipSetByHeight", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainGetTipSetByHeight indicates an expected call of ChainGetTipSetByHeight +func (mr *MockFullNodeMockRecorder) ChainGetTipSetByHeight(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainGetTipSetByHeight", reflect.TypeOf((*MockFullNode)(nil).ChainGetTipSetByHeight), arg0, arg1, arg2) +} + +// ChainHasObj mocks base method +func (m *MockFullNode) ChainHasObj(arg0 context.Context, arg1 cid.Cid) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHasObj", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHasObj indicates an expected call of ChainHasObj +func (mr *MockFullNodeMockRecorder) ChainHasObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHasObj", reflect.TypeOf((*MockFullNode)(nil).ChainHasObj), arg0, arg1) +} + +// ChainHead mocks base method +func (m *MockFullNode) ChainHead(arg0 context.Context) (*types.TipSet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainHead", arg0) + ret0, _ := ret[0].(*types.TipSet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainHead indicates an expected call of ChainHead +func (mr *MockFullNodeMockRecorder) ChainHead(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainHead", reflect.TypeOf((*MockFullNode)(nil).ChainHead), arg0) +} + +// ChainNotify mocks base method +func (m *MockFullNode) ChainNotify(arg0 context.Context) (<-chan []*api.HeadChange, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainNotify", arg0) + ret0, _ := ret[0].(<-chan []*api.HeadChange) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainNotify indicates an expected call of ChainNotify +func (mr *MockFullNodeMockRecorder) ChainNotify(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainNotify", reflect.TypeOf((*MockFullNode)(nil).ChainNotify), arg0) +} + +// ChainReadObj mocks base method +func (m *MockFullNode) ChainReadObj(arg0 context.Context, arg1 cid.Cid) ([]byte, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainReadObj", arg0, arg1) + ret0, _ := ret[0].([]byte) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainReadObj indicates an expected call of ChainReadObj +func (mr *MockFullNodeMockRecorder) ChainReadObj(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainReadObj", reflect.TypeOf((*MockFullNode)(nil).ChainReadObj), arg0, arg1) +} + +// ChainSetHead mocks base method +func (m *MockFullNode) ChainSetHead(arg0 context.Context, arg1 types.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainSetHead", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ChainSetHead indicates an expected call of ChainSetHead +func (mr *MockFullNodeMockRecorder) ChainSetHead(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainSetHead", reflect.TypeOf((*MockFullNode)(nil).ChainSetHead), arg0, arg1) +} + +// ChainStatObj mocks base method +func (m *MockFullNode) ChainStatObj(arg0 context.Context, arg1, arg2 cid.Cid) (api.ObjStat, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainStatObj", arg0, arg1, arg2) + ret0, _ := ret[0].(api.ObjStat) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainStatObj indicates an expected call of ChainStatObj +func (mr *MockFullNodeMockRecorder) ChainStatObj(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainStatObj", reflect.TypeOf((*MockFullNode)(nil).ChainStatObj), arg0, arg1, arg2) +} + +// ChainTipSetWeight mocks base method +func (m *MockFullNode) ChainTipSetWeight(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ChainTipSetWeight", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ChainTipSetWeight indicates an expected call of ChainTipSetWeight +func (mr *MockFullNodeMockRecorder) ChainTipSetWeight(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ChainTipSetWeight", reflect.TypeOf((*MockFullNode)(nil).ChainTipSetWeight), arg0, arg1) +} + +// ClientCalcCommP mocks base method +func (m *MockFullNode) ClientCalcCommP(arg0 context.Context, arg1 string) (*api.CommPRet, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientCalcCommP", arg0, arg1) + ret0, _ := ret[0].(*api.CommPRet) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientCalcCommP indicates an expected call of ClientCalcCommP +func (mr *MockFullNodeMockRecorder) ClientCalcCommP(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCalcCommP", reflect.TypeOf((*MockFullNode)(nil).ClientCalcCommP), arg0, arg1) +} + +// ClientCancelDataTransfer mocks base method +func (m *MockFullNode) ClientCancelDataTransfer(arg0 context.Context, arg1 datatransfer.TransferID, arg2 peer.ID, arg3 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientCancelDataTransfer", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientCancelDataTransfer indicates an expected call of ClientCancelDataTransfer +func (mr *MockFullNodeMockRecorder) ClientCancelDataTransfer(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCancelDataTransfer", reflect.TypeOf((*MockFullNode)(nil).ClientCancelDataTransfer), arg0, arg1, arg2, arg3) +} + +// ClientDataTransferUpdates mocks base method +func (m *MockFullNode) ClientDataTransferUpdates(arg0 context.Context) (<-chan api.DataTransferChannel, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientDataTransferUpdates", arg0) + ret0, _ := ret[0].(<-chan api.DataTransferChannel) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientDataTransferUpdates indicates an expected call of ClientDataTransferUpdates +func (mr *MockFullNodeMockRecorder) ClientDataTransferUpdates(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientDataTransferUpdates", reflect.TypeOf((*MockFullNode)(nil).ClientDataTransferUpdates), arg0) +} + +// ClientDealPieceCID mocks base method +func (m *MockFullNode) ClientDealPieceCID(arg0 context.Context, arg1 cid.Cid) (api.DataCIDSize, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientDealPieceCID", arg0, arg1) + ret0, _ := ret[0].(api.DataCIDSize) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientDealPieceCID indicates an expected call of ClientDealPieceCID +func (mr *MockFullNodeMockRecorder) ClientDealPieceCID(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientDealPieceCID", reflect.TypeOf((*MockFullNode)(nil).ClientDealPieceCID), arg0, arg1) +} + +// ClientDealSize mocks base method +func (m *MockFullNode) ClientDealSize(arg0 context.Context, arg1 cid.Cid) (api.DataSize, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientDealSize", arg0, arg1) + ret0, _ := ret[0].(api.DataSize) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientDealSize indicates an expected call of ClientDealSize +func (mr *MockFullNodeMockRecorder) ClientDealSize(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientDealSize", reflect.TypeOf((*MockFullNode)(nil).ClientDealSize), arg0, arg1) +} + +// ClientFindData mocks base method +func (m *MockFullNode) ClientFindData(arg0 context.Context, arg1 cid.Cid, arg2 *cid.Cid) ([]api.QueryOffer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientFindData", arg0, arg1, arg2) + ret0, _ := ret[0].([]api.QueryOffer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientFindData indicates an expected call of ClientFindData +func (mr *MockFullNodeMockRecorder) ClientFindData(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientFindData", reflect.TypeOf((*MockFullNode)(nil).ClientFindData), arg0, arg1, arg2) +} + +// ClientGenCar mocks base method +func (m *MockFullNode) ClientGenCar(arg0 context.Context, arg1 api.FileRef, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientGenCar", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientGenCar indicates an expected call of ClientGenCar +func (mr *MockFullNodeMockRecorder) ClientGenCar(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientGenCar", reflect.TypeOf((*MockFullNode)(nil).ClientGenCar), arg0, arg1, arg2) +} + +// ClientGetDealInfo mocks base method +func (m *MockFullNode) ClientGetDealInfo(arg0 context.Context, arg1 cid.Cid) (*api.DealInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientGetDealInfo", arg0, arg1) + ret0, _ := ret[0].(*api.DealInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientGetDealInfo indicates an expected call of ClientGetDealInfo +func (mr *MockFullNodeMockRecorder) ClientGetDealInfo(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientGetDealInfo", reflect.TypeOf((*MockFullNode)(nil).ClientGetDealInfo), arg0, arg1) +} + +// ClientGetDealStatus mocks base method +func (m *MockFullNode) ClientGetDealStatus(arg0 context.Context, arg1 uint64) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientGetDealStatus", arg0, arg1) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientGetDealStatus indicates an expected call of ClientGetDealStatus +func (mr *MockFullNodeMockRecorder) ClientGetDealStatus(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientGetDealStatus", reflect.TypeOf((*MockFullNode)(nil).ClientGetDealStatus), arg0, arg1) +} + +// ClientGetDealUpdates mocks base method +func (m *MockFullNode) ClientGetDealUpdates(arg0 context.Context) (<-chan api.DealInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientGetDealUpdates", arg0) + ret0, _ := ret[0].(<-chan api.DealInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientGetDealUpdates indicates an expected call of ClientGetDealUpdates +func (mr *MockFullNodeMockRecorder) ClientGetDealUpdates(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientGetDealUpdates", reflect.TypeOf((*MockFullNode)(nil).ClientGetDealUpdates), arg0) +} + +// ClientHasLocal mocks base method +func (m *MockFullNode) ClientHasLocal(arg0 context.Context, arg1 cid.Cid) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientHasLocal", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientHasLocal indicates an expected call of ClientHasLocal +func (mr *MockFullNodeMockRecorder) ClientHasLocal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientHasLocal", reflect.TypeOf((*MockFullNode)(nil).ClientHasLocal), arg0, arg1) +} + +// ClientImport mocks base method +func (m *MockFullNode) ClientImport(arg0 context.Context, arg1 api.FileRef) (*api.ImportRes, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientImport", arg0, arg1) + ret0, _ := ret[0].(*api.ImportRes) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientImport indicates an expected call of ClientImport +func (mr *MockFullNodeMockRecorder) ClientImport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientImport", reflect.TypeOf((*MockFullNode)(nil).ClientImport), arg0, arg1) +} + +// ClientListDataTransfers mocks base method +func (m *MockFullNode) ClientListDataTransfers(arg0 context.Context) ([]api.DataTransferChannel, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientListDataTransfers", arg0) + ret0, _ := ret[0].([]api.DataTransferChannel) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientListDataTransfers indicates an expected call of ClientListDataTransfers +func (mr *MockFullNodeMockRecorder) ClientListDataTransfers(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientListDataTransfers", reflect.TypeOf((*MockFullNode)(nil).ClientListDataTransfers), arg0) +} + +// ClientListDeals mocks base method +func (m *MockFullNode) ClientListDeals(arg0 context.Context) ([]api.DealInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientListDeals", arg0) + ret0, _ := ret[0].([]api.DealInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientListDeals indicates an expected call of ClientListDeals +func (mr *MockFullNodeMockRecorder) ClientListDeals(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientListDeals", reflect.TypeOf((*MockFullNode)(nil).ClientListDeals), arg0) +} + +// ClientListImports mocks base method +func (m *MockFullNode) ClientListImports(arg0 context.Context) ([]api.Import, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientListImports", arg0) + ret0, _ := ret[0].([]api.Import) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientListImports indicates an expected call of ClientListImports +func (mr *MockFullNodeMockRecorder) ClientListImports(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientListImports", reflect.TypeOf((*MockFullNode)(nil).ClientListImports), arg0) +} + +// ClientMinerQueryOffer mocks base method +func (m *MockFullNode) ClientMinerQueryOffer(arg0 context.Context, arg1 address.Address, arg2 cid.Cid, arg3 *cid.Cid) (api.QueryOffer, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientMinerQueryOffer", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(api.QueryOffer) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientMinerQueryOffer indicates an expected call of ClientMinerQueryOffer +func (mr *MockFullNodeMockRecorder) ClientMinerQueryOffer(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientMinerQueryOffer", reflect.TypeOf((*MockFullNode)(nil).ClientMinerQueryOffer), arg0, arg1, arg2, arg3) +} + +// ClientQueryAsk mocks base method +func (m *MockFullNode) ClientQueryAsk(arg0 context.Context, arg1 peer.ID, arg2 address.Address) (*storagemarket.StorageAsk, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientQueryAsk", arg0, arg1, arg2) + ret0, _ := ret[0].(*storagemarket.StorageAsk) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientQueryAsk indicates an expected call of ClientQueryAsk +func (mr *MockFullNodeMockRecorder) ClientQueryAsk(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientQueryAsk", reflect.TypeOf((*MockFullNode)(nil).ClientQueryAsk), arg0, arg1, arg2) +} + +// ClientRemoveImport mocks base method +func (m *MockFullNode) ClientRemoveImport(arg0 context.Context, arg1 multistore.StoreID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientRemoveImport", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientRemoveImport indicates an expected call of ClientRemoveImport +func (mr *MockFullNodeMockRecorder) ClientRemoveImport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientRemoveImport", reflect.TypeOf((*MockFullNode)(nil).ClientRemoveImport), arg0, arg1) +} + +// ClientRestartDataTransfer mocks base method +func (m *MockFullNode) ClientRestartDataTransfer(arg0 context.Context, arg1 datatransfer.TransferID, arg2 peer.ID, arg3 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientRestartDataTransfer", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientRestartDataTransfer indicates an expected call of ClientRestartDataTransfer +func (mr *MockFullNodeMockRecorder) ClientRestartDataTransfer(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientRestartDataTransfer", reflect.TypeOf((*MockFullNode)(nil).ClientRestartDataTransfer), arg0, arg1, arg2, arg3) +} + +// ClientRetrieve mocks base method +func (m *MockFullNode) ClientRetrieve(arg0 context.Context, arg1 api.RetrievalOrder, arg2 *api.FileRef) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientRetrieve", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientRetrieve indicates an expected call of ClientRetrieve +func (mr *MockFullNodeMockRecorder) ClientRetrieve(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientRetrieve", reflect.TypeOf((*MockFullNode)(nil).ClientRetrieve), arg0, arg1, arg2) +} + +// ClientRetrieveTryRestartInsufficientFunds mocks base method +func (m *MockFullNode) ClientRetrieveTryRestartInsufficientFunds(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientRetrieveTryRestartInsufficientFunds", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientRetrieveTryRestartInsufficientFunds indicates an expected call of ClientRetrieveTryRestartInsufficientFunds +func (mr *MockFullNodeMockRecorder) ClientRetrieveTryRestartInsufficientFunds(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientRetrieveTryRestartInsufficientFunds", reflect.TypeOf((*MockFullNode)(nil).ClientRetrieveTryRestartInsufficientFunds), arg0, arg1) +} + +// ClientRetrieveWithEvents mocks base method +func (m *MockFullNode) ClientRetrieveWithEvents(arg0 context.Context, arg1 api.RetrievalOrder, arg2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientRetrieveWithEvents", arg0, arg1, arg2) + ret0, _ := ret[0].(<-chan marketevents.RetrievalEvent) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientRetrieveWithEvents indicates an expected call of ClientRetrieveWithEvents +func (mr *MockFullNodeMockRecorder) ClientRetrieveWithEvents(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientRetrieveWithEvents", reflect.TypeOf((*MockFullNode)(nil).ClientRetrieveWithEvents), arg0, arg1, arg2) +} + +// ClientStartDeal mocks base method +func (m *MockFullNode) ClientStartDeal(arg0 context.Context, arg1 *api.StartDealParams) (*cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientStartDeal", arg0, arg1) + ret0, _ := ret[0].(*cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ClientStartDeal indicates an expected call of ClientStartDeal +func (mr *MockFullNodeMockRecorder) ClientStartDeal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientStartDeal", reflect.TypeOf((*MockFullNode)(nil).ClientStartDeal), arg0, arg1) +} + +// Closing mocks base method +func (m *MockFullNode) Closing(arg0 context.Context) (<-chan struct{}, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Closing", arg0) + ret0, _ := ret[0].(<-chan struct{}) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Closing indicates an expected call of Closing +func (mr *MockFullNodeMockRecorder) Closing(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Closing", reflect.TypeOf((*MockFullNode)(nil).Closing), arg0) +} + +// CreateBackup mocks base method +func (m *MockFullNode) CreateBackup(arg0 context.Context, arg1 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "CreateBackup", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// CreateBackup indicates an expected call of CreateBackup +func (mr *MockFullNodeMockRecorder) CreateBackup(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "CreateBackup", reflect.TypeOf((*MockFullNode)(nil).CreateBackup), arg0, arg1) +} + +// Discover mocks base method +func (m *MockFullNode) Discover(arg0 context.Context) (apitypes.OpenRPCDocument, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Discover", arg0) + ret0, _ := ret[0].(apitypes.OpenRPCDocument) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Discover indicates an expected call of Discover +func (mr *MockFullNodeMockRecorder) Discover(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Discover", reflect.TypeOf((*MockFullNode)(nil).Discover), arg0) +} + +// GasEstimateFeeCap mocks base method +func (m *MockFullNode) GasEstimateFeeCap(arg0 context.Context, arg1 *types.Message, arg2 int64, arg3 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateFeeCap", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateFeeCap indicates an expected call of GasEstimateFeeCap +func (mr *MockFullNodeMockRecorder) GasEstimateFeeCap(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateFeeCap", reflect.TypeOf((*MockFullNode)(nil).GasEstimateFeeCap), arg0, arg1, arg2, arg3) +} + +// GasEstimateGasLimit mocks base method +func (m *MockFullNode) GasEstimateGasLimit(arg0 context.Context, arg1 *types.Message, arg2 types.TipSetKey) (int64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasLimit", arg0, arg1, arg2) + ret0, _ := ret[0].(int64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasLimit indicates an expected call of GasEstimateGasLimit +func (mr *MockFullNodeMockRecorder) GasEstimateGasLimit(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasLimit", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasLimit), arg0, arg1, arg2) +} + +// GasEstimateGasPremium mocks base method +func (m *MockFullNode) GasEstimateGasPremium(arg0 context.Context, arg1 uint64, arg2 address.Address, arg3 int64, arg4 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateGasPremium", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateGasPremium indicates an expected call of GasEstimateGasPremium +func (mr *MockFullNodeMockRecorder) GasEstimateGasPremium(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateGasPremium", reflect.TypeOf((*MockFullNode)(nil).GasEstimateGasPremium), arg0, arg1, arg2, arg3, arg4) +} + +// GasEstimateMessageGas mocks base method +func (m *MockFullNode) GasEstimateMessageGas(arg0 context.Context, arg1 *types.Message, arg2 *api.MessageSendSpec, arg3 types.TipSetKey) (*types.Message, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GasEstimateMessageGas", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*types.Message) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GasEstimateMessageGas indicates an expected call of GasEstimateMessageGas +func (mr *MockFullNodeMockRecorder) GasEstimateMessageGas(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GasEstimateMessageGas", reflect.TypeOf((*MockFullNode)(nil).GasEstimateMessageGas), arg0, arg1, arg2, arg3) +} + +// ID mocks base method +func (m *MockFullNode) ID(arg0 context.Context) (peer.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ID", arg0) + ret0, _ := ret[0].(peer.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// ID indicates an expected call of ID +func (mr *MockFullNodeMockRecorder) ID(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ID", reflect.TypeOf((*MockFullNode)(nil).ID), arg0) +} + +// LogList mocks base method +func (m *MockFullNode) LogList(arg0 context.Context) ([]string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LogList", arg0) + ret0, _ := ret[0].([]string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// LogList indicates an expected call of LogList +func (mr *MockFullNodeMockRecorder) LogList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogList", reflect.TypeOf((*MockFullNode)(nil).LogList), arg0) +} + +// LogSetLevel mocks base method +func (m *MockFullNode) LogSetLevel(arg0 context.Context, arg1, arg2 string) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "LogSetLevel", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// LogSetLevel indicates an expected call of LogSetLevel +func (mr *MockFullNodeMockRecorder) LogSetLevel(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "LogSetLevel", reflect.TypeOf((*MockFullNode)(nil).LogSetLevel), arg0, arg1, arg2) +} + +// MarketAddBalance mocks base method +func (m *MockFullNode) MarketAddBalance(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarketAddBalance", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarketAddBalance indicates an expected call of MarketAddBalance +func (mr *MockFullNodeMockRecorder) MarketAddBalance(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketAddBalance", reflect.TypeOf((*MockFullNode)(nil).MarketAddBalance), arg0, arg1, arg2, arg3) +} + +// MarketGetReserved mocks base method +func (m *MockFullNode) MarketGetReserved(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarketGetReserved", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarketGetReserved indicates an expected call of MarketGetReserved +func (mr *MockFullNodeMockRecorder) MarketGetReserved(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketGetReserved", reflect.TypeOf((*MockFullNode)(nil).MarketGetReserved), arg0, arg1) +} + +// MarketReleaseFunds mocks base method +func (m *MockFullNode) MarketReleaseFunds(arg0 context.Context, arg1 address.Address, arg2 big.Int) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarketReleaseFunds", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// MarketReleaseFunds indicates an expected call of MarketReleaseFunds +func (mr *MockFullNodeMockRecorder) MarketReleaseFunds(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketReleaseFunds", reflect.TypeOf((*MockFullNode)(nil).MarketReleaseFunds), arg0, arg1, arg2) +} + +// MarketReserveFunds mocks base method +func (m *MockFullNode) MarketReserveFunds(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarketReserveFunds", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarketReserveFunds indicates an expected call of MarketReserveFunds +func (mr *MockFullNodeMockRecorder) MarketReserveFunds(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketReserveFunds", reflect.TypeOf((*MockFullNode)(nil).MarketReserveFunds), arg0, arg1, arg2, arg3) +} + +// MarketWithdraw mocks base method +func (m *MockFullNode) MarketWithdraw(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MarketWithdraw", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MarketWithdraw indicates an expected call of MarketWithdraw +func (mr *MockFullNodeMockRecorder) MarketWithdraw(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MarketWithdraw", reflect.TypeOf((*MockFullNode)(nil).MarketWithdraw), arg0, arg1, arg2, arg3) +} + +// MinerCreateBlock mocks base method +func (m *MockFullNode) MinerCreateBlock(arg0 context.Context, arg1 *api.BlockTemplate) (*types.BlockMsg, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerCreateBlock", arg0, arg1) + ret0, _ := ret[0].(*types.BlockMsg) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerCreateBlock indicates an expected call of MinerCreateBlock +func (mr *MockFullNodeMockRecorder) MinerCreateBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerCreateBlock", reflect.TypeOf((*MockFullNode)(nil).MinerCreateBlock), arg0, arg1) +} + +// MinerGetBaseInfo mocks base method +func (m *MockFullNode) MinerGetBaseInfo(arg0 context.Context, arg1 address.Address, arg2 abi.ChainEpoch, arg3 types.TipSetKey) (*api.MiningBaseInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MinerGetBaseInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.MiningBaseInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MinerGetBaseInfo indicates an expected call of MinerGetBaseInfo +func (mr *MockFullNodeMockRecorder) MinerGetBaseInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MinerGetBaseInfo", reflect.TypeOf((*MockFullNode)(nil).MinerGetBaseInfo), arg0, arg1, arg2, arg3) +} + +// MpoolBatchPush mocks base method +func (m *MockFullNode) MpoolBatchPush(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPush", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPush indicates an expected call of MpoolBatchPush +func (mr *MockFullNodeMockRecorder) MpoolBatchPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPush", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPush), arg0, arg1) +} + +// MpoolBatchPushMessage mocks base method +func (m *MockFullNode) MpoolBatchPushMessage(arg0 context.Context, arg1 []*types.Message, arg2 *api.MessageSendSpec) ([]*types.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].([]*types.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushMessage indicates an expected call of MpoolBatchPushMessage +func (mr *MockFullNodeMockRecorder) MpoolBatchPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushMessage), arg0, arg1, arg2) +} + +// MpoolBatchPushUntrusted mocks base method +func (m *MockFullNode) MpoolBatchPushUntrusted(arg0 context.Context, arg1 []*types.SignedMessage) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolBatchPushUntrusted", arg0, arg1) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolBatchPushUntrusted indicates an expected call of MpoolBatchPushUntrusted +func (mr *MockFullNodeMockRecorder) MpoolBatchPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolBatchPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolBatchPushUntrusted), arg0, arg1) +} + +// MpoolClear mocks base method +func (m *MockFullNode) MpoolClear(arg0 context.Context, arg1 bool) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolClear", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolClear indicates an expected call of MpoolClear +func (mr *MockFullNodeMockRecorder) MpoolClear(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolClear", reflect.TypeOf((*MockFullNode)(nil).MpoolClear), arg0, arg1) +} + +// MpoolGetConfig mocks base method +func (m *MockFullNode) MpoolGetConfig(arg0 context.Context) (*types.MpoolConfig, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetConfig", arg0) + ret0, _ := ret[0].(*types.MpoolConfig) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetConfig indicates an expected call of MpoolGetConfig +func (mr *MockFullNodeMockRecorder) MpoolGetConfig(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolGetConfig), arg0) +} + +// MpoolGetNonce mocks base method +func (m *MockFullNode) MpoolGetNonce(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolGetNonce", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolGetNonce indicates an expected call of MpoolGetNonce +func (mr *MockFullNodeMockRecorder) MpoolGetNonce(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolGetNonce", reflect.TypeOf((*MockFullNode)(nil).MpoolGetNonce), arg0, arg1) +} + +// MpoolPending mocks base method +func (m *MockFullNode) MpoolPending(arg0 context.Context, arg1 types.TipSetKey) ([]*types.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPending", arg0, arg1) + ret0, _ := ret[0].([]*types.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPending indicates an expected call of MpoolPending +func (mr *MockFullNodeMockRecorder) MpoolPending(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPending", reflect.TypeOf((*MockFullNode)(nil).MpoolPending), arg0, arg1) +} + +// MpoolPush mocks base method +func (m *MockFullNode) MpoolPush(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPush", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPush indicates an expected call of MpoolPush +func (mr *MockFullNodeMockRecorder) MpoolPush(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPush", reflect.TypeOf((*MockFullNode)(nil).MpoolPush), arg0, arg1) +} + +// MpoolPushMessage mocks base method +func (m *MockFullNode) MpoolPushMessage(arg0 context.Context, arg1 *types.Message, arg2 *api.MessageSendSpec) (*types.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushMessage indicates an expected call of MpoolPushMessage +func (mr *MockFullNodeMockRecorder) MpoolPushMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushMessage", reflect.TypeOf((*MockFullNode)(nil).MpoolPushMessage), arg0, arg1, arg2) +} + +// MpoolPushUntrusted mocks base method +func (m *MockFullNode) MpoolPushUntrusted(arg0 context.Context, arg1 *types.SignedMessage) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolPushUntrusted", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolPushUntrusted indicates an expected call of MpoolPushUntrusted +func (mr *MockFullNodeMockRecorder) MpoolPushUntrusted(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolPushUntrusted", reflect.TypeOf((*MockFullNode)(nil).MpoolPushUntrusted), arg0, arg1) +} + +// MpoolSelect mocks base method +func (m *MockFullNode) MpoolSelect(arg0 context.Context, arg1 types.TipSetKey, arg2 float64) ([]*types.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSelect", arg0, arg1, arg2) + ret0, _ := ret[0].([]*types.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSelect indicates an expected call of MpoolSelect +func (mr *MockFullNodeMockRecorder) MpoolSelect(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSelect", reflect.TypeOf((*MockFullNode)(nil).MpoolSelect), arg0, arg1, arg2) +} + +// MpoolSetConfig mocks base method +func (m *MockFullNode) MpoolSetConfig(arg0 context.Context, arg1 *types.MpoolConfig) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSetConfig", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// MpoolSetConfig indicates an expected call of MpoolSetConfig +func (mr *MockFullNodeMockRecorder) MpoolSetConfig(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSetConfig", reflect.TypeOf((*MockFullNode)(nil).MpoolSetConfig), arg0, arg1) +} + +// MpoolSub mocks base method +func (m *MockFullNode) MpoolSub(arg0 context.Context) (<-chan api.MpoolUpdate, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MpoolSub", arg0) + ret0, _ := ret[0].(<-chan api.MpoolUpdate) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MpoolSub indicates an expected call of MpoolSub +func (mr *MockFullNodeMockRecorder) MpoolSub(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MpoolSub", reflect.TypeOf((*MockFullNode)(nil).MpoolSub), arg0) +} + +// MsigAddApprove mocks base method +func (m *MockFullNode) MsigAddApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address, arg6 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddApprove indicates an expected call of MsigAddApprove +func (mr *MockFullNodeMockRecorder) MsigAddApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddApprove", reflect.TypeOf((*MockFullNode)(nil).MsigAddApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigAddCancel mocks base method +func (m *MockFullNode) MsigAddCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4 address.Address, arg5 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddCancel indicates an expected call of MsigAddCancel +func (mr *MockFullNodeMockRecorder) MsigAddCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddCancel", reflect.TypeOf((*MockFullNode)(nil).MsigAddCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigAddPropose mocks base method +func (m *MockFullNode) MsigAddPropose(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigAddPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigAddPropose indicates an expected call of MsigAddPropose +func (mr *MockFullNodeMockRecorder) MsigAddPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigAddPropose", reflect.TypeOf((*MockFullNode)(nil).MsigAddPropose), arg0, arg1, arg2, arg3, arg4) +} + +// MsigApprove mocks base method +func (m *MockFullNode) MsigApprove(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApprove", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApprove indicates an expected call of MsigApprove +func (mr *MockFullNodeMockRecorder) MsigApprove(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApprove", reflect.TypeOf((*MockFullNode)(nil).MsigApprove), arg0, arg1, arg2, arg3) +} + +// MsigApproveTxnHash mocks base method +func (m *MockFullNode) MsigApproveTxnHash(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3, arg4 address.Address, arg5 big.Int, arg6 address.Address, arg7 uint64, arg8 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigApproveTxnHash", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigApproveTxnHash indicates an expected call of MsigApproveTxnHash +func (mr *MockFullNodeMockRecorder) MsigApproveTxnHash(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigApproveTxnHash", reflect.TypeOf((*MockFullNode)(nil).MsigApproveTxnHash), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8) +} + +// MsigCancel mocks base method +func (m *MockFullNode) MsigCancel(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 address.Address, arg4 big.Int, arg5 address.Address, arg6 uint64, arg7 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCancel", arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCancel indicates an expected call of MsigCancel +func (mr *MockFullNodeMockRecorder) MsigCancel(arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCancel", reflect.TypeOf((*MockFullNode)(nil).MsigCancel), arg0, arg1, arg2, arg3, arg4, arg5, arg6, arg7) +} + +// MsigCreate mocks base method +func (m *MockFullNode) MsigCreate(arg0 context.Context, arg1 uint64, arg2 []address.Address, arg3 abi.ChainEpoch, arg4 big.Int, arg5 address.Address, arg6 big.Int) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigCreate", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigCreate indicates an expected call of MsigCreate +func (mr *MockFullNodeMockRecorder) MsigCreate(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigCreate", reflect.TypeOf((*MockFullNode)(nil).MsigCreate), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigGetAvailableBalance mocks base method +func (m *MockFullNode) MsigGetAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetAvailableBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetAvailableBalance indicates an expected call of MsigGetAvailableBalance +func (mr *MockFullNodeMockRecorder) MsigGetAvailableBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetAvailableBalance", reflect.TypeOf((*MockFullNode)(nil).MsigGetAvailableBalance), arg0, arg1, arg2) +} + +// MsigGetPending mocks base method +func (m *MockFullNode) MsigGetPending(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]*api.MsigTransaction, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetPending", arg0, arg1, arg2) + ret0, _ := ret[0].([]*api.MsigTransaction) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetPending indicates an expected call of MsigGetPending +func (mr *MockFullNodeMockRecorder) MsigGetPending(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetPending", reflect.TypeOf((*MockFullNode)(nil).MsigGetPending), arg0, arg1, arg2) +} + +// MsigGetVested mocks base method +func (m *MockFullNode) MsigGetVested(arg0 context.Context, arg1 address.Address, arg2, arg3 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetVested", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetVested indicates an expected call of MsigGetVested +func (mr *MockFullNodeMockRecorder) MsigGetVested(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetVested", reflect.TypeOf((*MockFullNode)(nil).MsigGetVested), arg0, arg1, arg2, arg3) +} + +// MsigGetVestingSchedule mocks base method +func (m *MockFullNode) MsigGetVestingSchedule(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (api.MsigVesting, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigGetVestingSchedule", arg0, arg1, arg2) + ret0, _ := ret[0].(api.MsigVesting) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigGetVestingSchedule indicates an expected call of MsigGetVestingSchedule +func (mr *MockFullNodeMockRecorder) MsigGetVestingSchedule(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigGetVestingSchedule", reflect.TypeOf((*MockFullNode)(nil).MsigGetVestingSchedule), arg0, arg1, arg2) +} + +// MsigPropose mocks base method +func (m *MockFullNode) MsigPropose(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int, arg4 address.Address, arg5 uint64, arg6 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigPropose", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigPropose indicates an expected call of MsigPropose +func (mr *MockFullNodeMockRecorder) MsigPropose(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigPropose", reflect.TypeOf((*MockFullNode)(nil).MsigPropose), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigRemoveSigner mocks base method +func (m *MockFullNode) MsigRemoveSigner(arg0 context.Context, arg1, arg2, arg3 address.Address, arg4 bool) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigRemoveSigner", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigRemoveSigner indicates an expected call of MsigRemoveSigner +func (mr *MockFullNodeMockRecorder) MsigRemoveSigner(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigRemoveSigner", reflect.TypeOf((*MockFullNode)(nil).MsigRemoveSigner), arg0, arg1, arg2, arg3, arg4) +} + +// MsigSwapApprove mocks base method +func (m *MockFullNode) MsigSwapApprove(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5, arg6 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapApprove", arg0, arg1, arg2, arg3, arg4, arg5, arg6) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapApprove indicates an expected call of MsigSwapApprove +func (mr *MockFullNodeMockRecorder) MsigSwapApprove(arg0, arg1, arg2, arg3, arg4, arg5, arg6 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapApprove", reflect.TypeOf((*MockFullNode)(nil).MsigSwapApprove), arg0, arg1, arg2, arg3, arg4, arg5, arg6) +} + +// MsigSwapCancel mocks base method +func (m *MockFullNode) MsigSwapCancel(arg0 context.Context, arg1, arg2 address.Address, arg3 uint64, arg4, arg5 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapCancel", arg0, arg1, arg2, arg3, arg4, arg5) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapCancel indicates an expected call of MsigSwapCancel +func (mr *MockFullNodeMockRecorder) MsigSwapCancel(arg0, arg1, arg2, arg3, arg4, arg5 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapCancel", reflect.TypeOf((*MockFullNode)(nil).MsigSwapCancel), arg0, arg1, arg2, arg3, arg4, arg5) +} + +// MsigSwapPropose mocks base method +func (m *MockFullNode) MsigSwapPropose(arg0 context.Context, arg1, arg2, arg3, arg4 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "MsigSwapPropose", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// MsigSwapPropose indicates an expected call of MsigSwapPropose +func (mr *MockFullNodeMockRecorder) MsigSwapPropose(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "MsigSwapPropose", reflect.TypeOf((*MockFullNode)(nil).MsigSwapPropose), arg0, arg1, arg2, arg3, arg4) +} + +// NetAddrsListen mocks base method +func (m *MockFullNode) NetAddrsListen(arg0 context.Context) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetAddrsListen", arg0) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetAddrsListen indicates an expected call of NetAddrsListen +func (mr *MockFullNodeMockRecorder) NetAddrsListen(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetAddrsListen", reflect.TypeOf((*MockFullNode)(nil).NetAddrsListen), arg0) +} + +// NetAgentVersion mocks base method +func (m *MockFullNode) NetAgentVersion(arg0 context.Context, arg1 peer.ID) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetAgentVersion", arg0, arg1) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetAgentVersion indicates an expected call of NetAgentVersion +func (mr *MockFullNodeMockRecorder) NetAgentVersion(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetAgentVersion", reflect.TypeOf((*MockFullNode)(nil).NetAgentVersion), arg0, arg1) +} + +// NetAutoNatStatus mocks base method +func (m *MockFullNode) NetAutoNatStatus(arg0 context.Context) (api.NatInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetAutoNatStatus", arg0) + ret0, _ := ret[0].(api.NatInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetAutoNatStatus indicates an expected call of NetAutoNatStatus +func (mr *MockFullNodeMockRecorder) NetAutoNatStatus(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetAutoNatStatus", reflect.TypeOf((*MockFullNode)(nil).NetAutoNatStatus), arg0) +} + +// NetBandwidthStats mocks base method +func (m *MockFullNode) NetBandwidthStats(arg0 context.Context) (metrics.Stats, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBandwidthStats", arg0) + ret0, _ := ret[0].(metrics.Stats) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetBandwidthStats indicates an expected call of NetBandwidthStats +func (mr *MockFullNodeMockRecorder) NetBandwidthStats(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBandwidthStats", reflect.TypeOf((*MockFullNode)(nil).NetBandwidthStats), arg0) +} + +// NetBandwidthStatsByPeer mocks base method +func (m *MockFullNode) NetBandwidthStatsByPeer(arg0 context.Context) (map[string]metrics.Stats, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBandwidthStatsByPeer", arg0) + ret0, _ := ret[0].(map[string]metrics.Stats) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetBandwidthStatsByPeer indicates an expected call of NetBandwidthStatsByPeer +func (mr *MockFullNodeMockRecorder) NetBandwidthStatsByPeer(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBandwidthStatsByPeer", reflect.TypeOf((*MockFullNode)(nil).NetBandwidthStatsByPeer), arg0) +} + +// NetBandwidthStatsByProtocol mocks base method +func (m *MockFullNode) NetBandwidthStatsByProtocol(arg0 context.Context) (map[protocol.ID]metrics.Stats, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBandwidthStatsByProtocol", arg0) + ret0, _ := ret[0].(map[protocol.ID]metrics.Stats) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetBandwidthStatsByProtocol indicates an expected call of NetBandwidthStatsByProtocol +func (mr *MockFullNodeMockRecorder) NetBandwidthStatsByProtocol(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBandwidthStatsByProtocol", reflect.TypeOf((*MockFullNode)(nil).NetBandwidthStatsByProtocol), arg0) +} + +// NetBlockAdd mocks base method +func (m *MockFullNode) NetBlockAdd(arg0 context.Context, arg1 api.NetBlockList) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBlockAdd", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetBlockAdd indicates an expected call of NetBlockAdd +func (mr *MockFullNodeMockRecorder) NetBlockAdd(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBlockAdd", reflect.TypeOf((*MockFullNode)(nil).NetBlockAdd), arg0, arg1) +} + +// NetBlockList mocks base method +func (m *MockFullNode) NetBlockList(arg0 context.Context) (api.NetBlockList, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBlockList", arg0) + ret0, _ := ret[0].(api.NetBlockList) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetBlockList indicates an expected call of NetBlockList +func (mr *MockFullNodeMockRecorder) NetBlockList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBlockList", reflect.TypeOf((*MockFullNode)(nil).NetBlockList), arg0) +} + +// NetBlockRemove mocks base method +func (m *MockFullNode) NetBlockRemove(arg0 context.Context, arg1 api.NetBlockList) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetBlockRemove", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetBlockRemove indicates an expected call of NetBlockRemove +func (mr *MockFullNodeMockRecorder) NetBlockRemove(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetBlockRemove", reflect.TypeOf((*MockFullNode)(nil).NetBlockRemove), arg0, arg1) +} + +// NetConnect mocks base method +func (m *MockFullNode) NetConnect(arg0 context.Context, arg1 peer.AddrInfo) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetConnect", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetConnect indicates an expected call of NetConnect +func (mr *MockFullNodeMockRecorder) NetConnect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetConnect", reflect.TypeOf((*MockFullNode)(nil).NetConnect), arg0, arg1) +} + +// NetConnectedness mocks base method +func (m *MockFullNode) NetConnectedness(arg0 context.Context, arg1 peer.ID) (network0.Connectedness, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetConnectedness", arg0, arg1) + ret0, _ := ret[0].(network0.Connectedness) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetConnectedness indicates an expected call of NetConnectedness +func (mr *MockFullNodeMockRecorder) NetConnectedness(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetConnectedness", reflect.TypeOf((*MockFullNode)(nil).NetConnectedness), arg0, arg1) +} + +// NetDisconnect mocks base method +func (m *MockFullNode) NetDisconnect(arg0 context.Context, arg1 peer.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetDisconnect", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetDisconnect indicates an expected call of NetDisconnect +func (mr *MockFullNodeMockRecorder) NetDisconnect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetDisconnect", reflect.TypeOf((*MockFullNode)(nil).NetDisconnect), arg0, arg1) +} + +// NetFindPeer mocks base method +func (m *MockFullNode) NetFindPeer(arg0 context.Context, arg1 peer.ID) (peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetFindPeer", arg0, arg1) + ret0, _ := ret[0].(peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetFindPeer indicates an expected call of NetFindPeer +func (mr *MockFullNodeMockRecorder) NetFindPeer(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetFindPeer", reflect.TypeOf((*MockFullNode)(nil).NetFindPeer), arg0, arg1) +} + +// NetPeerInfo mocks base method +func (m *MockFullNode) NetPeerInfo(arg0 context.Context, arg1 peer.ID) (*api.ExtendedPeerInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetPeerInfo", arg0, arg1) + ret0, _ := ret[0].(*api.ExtendedPeerInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetPeerInfo indicates an expected call of NetPeerInfo +func (mr *MockFullNodeMockRecorder) NetPeerInfo(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPeerInfo", reflect.TypeOf((*MockFullNode)(nil).NetPeerInfo), arg0, arg1) +} + +// NetPeers mocks base method +func (m *MockFullNode) NetPeers(arg0 context.Context) ([]peer.AddrInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetPeers", arg0) + ret0, _ := ret[0].([]peer.AddrInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetPeers indicates an expected call of NetPeers +func (mr *MockFullNodeMockRecorder) NetPeers(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPeers", reflect.TypeOf((*MockFullNode)(nil).NetPeers), arg0) +} + +// NetPubsubScores mocks base method +func (m *MockFullNode) NetPubsubScores(arg0 context.Context) ([]api.PubsubScore, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetPubsubScores", arg0) + ret0, _ := ret[0].([]api.PubsubScore) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetPubsubScores indicates an expected call of NetPubsubScores +func (mr *MockFullNodeMockRecorder) NetPubsubScores(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPubsubScores", reflect.TypeOf((*MockFullNode)(nil).NetPubsubScores), arg0) +} + +// PaychAllocateLane mocks base method +func (m *MockFullNode) PaychAllocateLane(arg0 context.Context, arg1 address.Address) (uint64, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAllocateLane", arg0, arg1) + ret0, _ := ret[0].(uint64) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAllocateLane indicates an expected call of PaychAllocateLane +func (mr *MockFullNodeMockRecorder) PaychAllocateLane(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAllocateLane", reflect.TypeOf((*MockFullNode)(nil).PaychAllocateLane), arg0, arg1) +} + +// PaychAvailableFunds mocks base method +func (m *MockFullNode) PaychAvailableFunds(arg0 context.Context, arg1 address.Address) (*api.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFunds", arg0, arg1) + ret0, _ := ret[0].(*api.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFunds indicates an expected call of PaychAvailableFunds +func (mr *MockFullNodeMockRecorder) PaychAvailableFunds(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFunds", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFunds), arg0, arg1) +} + +// PaychAvailableFundsByFromTo mocks base method +func (m *MockFullNode) PaychAvailableFundsByFromTo(arg0 context.Context, arg1, arg2 address.Address) (*api.ChannelAvailableFunds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychAvailableFundsByFromTo", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.ChannelAvailableFunds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychAvailableFundsByFromTo indicates an expected call of PaychAvailableFundsByFromTo +func (mr *MockFullNodeMockRecorder) PaychAvailableFundsByFromTo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychAvailableFundsByFromTo", reflect.TypeOf((*MockFullNode)(nil).PaychAvailableFundsByFromTo), arg0, arg1, arg2) +} + +// PaychCollect mocks base method +func (m *MockFullNode) PaychCollect(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychCollect", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychCollect indicates an expected call of PaychCollect +func (mr *MockFullNodeMockRecorder) PaychCollect(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychCollect", reflect.TypeOf((*MockFullNode)(nil).PaychCollect), arg0, arg1) +} + +// PaychGet mocks base method +func (m *MockFullNode) PaychGet(arg0 context.Context, arg1, arg2 address.Address, arg3 big.Int) (*api.ChannelInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGet", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.ChannelInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGet indicates an expected call of PaychGet +func (mr *MockFullNodeMockRecorder) PaychGet(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGet", reflect.TypeOf((*MockFullNode)(nil).PaychGet), arg0, arg1, arg2, arg3) +} + +// PaychGetWaitReady mocks base method +func (m *MockFullNode) PaychGetWaitReady(arg0 context.Context, arg1 cid.Cid) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychGetWaitReady", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychGetWaitReady indicates an expected call of PaychGetWaitReady +func (mr *MockFullNodeMockRecorder) PaychGetWaitReady(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychGetWaitReady", reflect.TypeOf((*MockFullNode)(nil).PaychGetWaitReady), arg0, arg1) +} + +// PaychList mocks base method +func (m *MockFullNode) PaychList(arg0 context.Context) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychList", arg0) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychList indicates an expected call of PaychList +func (mr *MockFullNodeMockRecorder) PaychList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychList", reflect.TypeOf((*MockFullNode)(nil).PaychList), arg0) +} + +// PaychNewPayment mocks base method +func (m *MockFullNode) PaychNewPayment(arg0 context.Context, arg1, arg2 address.Address, arg3 []api.VoucherSpec) (*api.PaymentInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychNewPayment", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.PaymentInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychNewPayment indicates an expected call of PaychNewPayment +func (mr *MockFullNodeMockRecorder) PaychNewPayment(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychNewPayment", reflect.TypeOf((*MockFullNode)(nil).PaychNewPayment), arg0, arg1, arg2, arg3) +} + +// PaychSettle mocks base method +func (m *MockFullNode) PaychSettle(arg0 context.Context, arg1 address.Address) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychSettle", arg0, arg1) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychSettle indicates an expected call of PaychSettle +func (mr *MockFullNodeMockRecorder) PaychSettle(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychSettle", reflect.TypeOf((*MockFullNode)(nil).PaychSettle), arg0, arg1) +} + +// PaychStatus mocks base method +func (m *MockFullNode) PaychStatus(arg0 context.Context, arg1 address.Address) (*api.PaychStatus, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychStatus", arg0, arg1) + ret0, _ := ret[0].(*api.PaychStatus) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychStatus indicates an expected call of PaychStatus +func (mr *MockFullNodeMockRecorder) PaychStatus(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychStatus", reflect.TypeOf((*MockFullNode)(nil).PaychStatus), arg0, arg1) +} + +// PaychVoucherAdd mocks base method +func (m *MockFullNode) PaychVoucherAdd(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3 []byte, arg4 big.Int) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherAdd", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherAdd indicates an expected call of PaychVoucherAdd +func (mr *MockFullNodeMockRecorder) PaychVoucherAdd(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherAdd", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherAdd), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckSpendable mocks base method +func (m *MockFullNode) PaychVoucherCheckSpendable(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckSpendable", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCheckSpendable indicates an expected call of PaychVoucherCheckSpendable +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckSpendable(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckSpendable", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckSpendable), arg0, arg1, arg2, arg3, arg4) +} + +// PaychVoucherCheckValid mocks base method +func (m *MockFullNode) PaychVoucherCheckValid(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCheckValid", arg0, arg1, arg2) + ret0, _ := ret[0].(error) + return ret0 +} + +// PaychVoucherCheckValid indicates an expected call of PaychVoucherCheckValid +func (mr *MockFullNodeMockRecorder) PaychVoucherCheckValid(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCheckValid", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCheckValid), arg0, arg1, arg2) +} + +// PaychVoucherCreate mocks base method +func (m *MockFullNode) PaychVoucherCreate(arg0 context.Context, arg1 address.Address, arg2 big.Int, arg3 uint64) (*api.VoucherCreateResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherCreate", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.VoucherCreateResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherCreate indicates an expected call of PaychVoucherCreate +func (mr *MockFullNodeMockRecorder) PaychVoucherCreate(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherCreate", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherCreate), arg0, arg1, arg2, arg3) +} + +// PaychVoucherList mocks base method +func (m *MockFullNode) PaychVoucherList(arg0 context.Context, arg1 address.Address) ([]*paych.SignedVoucher, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherList", arg0, arg1) + ret0, _ := ret[0].([]*paych.SignedVoucher) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherList indicates an expected call of PaychVoucherList +func (mr *MockFullNodeMockRecorder) PaychVoucherList(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherList", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherList), arg0, arg1) +} + +// PaychVoucherSubmit mocks base method +func (m *MockFullNode) PaychVoucherSubmit(arg0 context.Context, arg1 address.Address, arg2 *paych.SignedVoucher, arg3, arg4 []byte) (cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "PaychVoucherSubmit", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// PaychVoucherSubmit indicates an expected call of PaychVoucherSubmit +func (mr *MockFullNodeMockRecorder) PaychVoucherSubmit(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "PaychVoucherSubmit", reflect.TypeOf((*MockFullNode)(nil).PaychVoucherSubmit), arg0, arg1, arg2, arg3, arg4) +} + +// Session mocks base method +func (m *MockFullNode) Session(arg0 context.Context) (uuid.UUID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Session", arg0) + ret0, _ := ret[0].(uuid.UUID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Session indicates an expected call of Session +func (mr *MockFullNodeMockRecorder) Session(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Session", reflect.TypeOf((*MockFullNode)(nil).Session), arg0) +} + +// Shutdown mocks base method +func (m *MockFullNode) Shutdown(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Shutdown", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// Shutdown indicates an expected call of Shutdown +func (mr *MockFullNodeMockRecorder) Shutdown(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Shutdown", reflect.TypeOf((*MockFullNode)(nil).Shutdown), arg0) +} + +// StateAccountKey mocks base method +func (m *MockFullNode) StateAccountKey(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAccountKey", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAccountKey indicates an expected call of StateAccountKey +func (mr *MockFullNodeMockRecorder) StateAccountKey(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAccountKey", reflect.TypeOf((*MockFullNode)(nil).StateAccountKey), arg0, arg1, arg2) +} + +// StateAllMinerFaults mocks base method +func (m *MockFullNode) StateAllMinerFaults(arg0 context.Context, arg1 abi.ChainEpoch, arg2 types.TipSetKey) ([]*api.Fault, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateAllMinerFaults", arg0, arg1, arg2) + ret0, _ := ret[0].([]*api.Fault) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateAllMinerFaults indicates an expected call of StateAllMinerFaults +func (mr *MockFullNodeMockRecorder) StateAllMinerFaults(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateAllMinerFaults", reflect.TypeOf((*MockFullNode)(nil).StateAllMinerFaults), arg0, arg1, arg2) +} + +// StateCall mocks base method +func (m *MockFullNode) StateCall(arg0 context.Context, arg1 *types.Message, arg2 types.TipSetKey) (*api.InvocResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCall", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.InvocResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCall indicates an expected call of StateCall +func (mr *MockFullNodeMockRecorder) StateCall(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCall", reflect.TypeOf((*MockFullNode)(nil).StateCall), arg0, arg1, arg2) +} + +// StateChangedActors mocks base method +func (m *MockFullNode) StateChangedActors(arg0 context.Context, arg1, arg2 cid.Cid) (map[string]types.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateChangedActors", arg0, arg1, arg2) + ret0, _ := ret[0].(map[string]types.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateChangedActors indicates an expected call of StateChangedActors +func (mr *MockFullNodeMockRecorder) StateChangedActors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateChangedActors", reflect.TypeOf((*MockFullNode)(nil).StateChangedActors), arg0, arg1, arg2) +} + +// StateCirculatingSupply mocks base method +func (m *MockFullNode) StateCirculatingSupply(arg0 context.Context, arg1 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCirculatingSupply", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCirculatingSupply indicates an expected call of StateCirculatingSupply +func (mr *MockFullNodeMockRecorder) StateCirculatingSupply(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCirculatingSupply", reflect.TypeOf((*MockFullNode)(nil).StateCirculatingSupply), arg0, arg1) +} + +// StateCompute mocks base method +func (m *MockFullNode) StateCompute(arg0 context.Context, arg1 abi.ChainEpoch, arg2 []*types.Message, arg3 types.TipSetKey) (*api.ComputeStateOutput, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateCompute", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.ComputeStateOutput) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateCompute indicates an expected call of StateCompute +func (mr *MockFullNodeMockRecorder) StateCompute(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateCompute", reflect.TypeOf((*MockFullNode)(nil).StateCompute), arg0, arg1, arg2, arg3) +} + +// StateDealProviderCollateralBounds mocks base method +func (m *MockFullNode) StateDealProviderCollateralBounds(arg0 context.Context, arg1 abi.PaddedPieceSize, arg2 bool, arg3 types.TipSetKey) (api.DealCollateralBounds, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateDealProviderCollateralBounds", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(api.DealCollateralBounds) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateDealProviderCollateralBounds indicates an expected call of StateDealProviderCollateralBounds +func (mr *MockFullNodeMockRecorder) StateDealProviderCollateralBounds(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateDealProviderCollateralBounds", reflect.TypeOf((*MockFullNode)(nil).StateDealProviderCollateralBounds), arg0, arg1, arg2, arg3) +} + +// StateDecodeParams mocks base method +func (m *MockFullNode) StateDecodeParams(arg0 context.Context, arg1 address.Address, arg2 abi.MethodNum, arg3 []byte, arg4 types.TipSetKey) (interface{}, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateDecodeParams", arg0, arg1, arg2, arg3, arg4) + ret0, _ := ret[0].(interface{}) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateDecodeParams indicates an expected call of StateDecodeParams +func (mr *MockFullNodeMockRecorder) StateDecodeParams(arg0, arg1, arg2, arg3, arg4 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateDecodeParams", reflect.TypeOf((*MockFullNode)(nil).StateDecodeParams), arg0, arg1, arg2, arg3, arg4) +} + +// StateGetActor mocks base method +func (m *MockFullNode) StateGetActor(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*types.Actor, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetActor", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.Actor) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetActor indicates an expected call of StateGetActor +func (mr *MockFullNodeMockRecorder) StateGetActor(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetActor", reflect.TypeOf((*MockFullNode)(nil).StateGetActor), arg0, arg1, arg2) +} + +// StateGetReceipt mocks base method +func (m *MockFullNode) StateGetReceipt(arg0 context.Context, arg1 cid.Cid, arg2 types.TipSetKey) (*types.MessageReceipt, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateGetReceipt", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.MessageReceipt) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateGetReceipt indicates an expected call of StateGetReceipt +func (mr *MockFullNodeMockRecorder) StateGetReceipt(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateGetReceipt", reflect.TypeOf((*MockFullNode)(nil).StateGetReceipt), arg0, arg1, arg2) +} + +// StateListActors mocks base method +func (m *MockFullNode) StateListActors(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListActors", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListActors indicates an expected call of StateListActors +func (mr *MockFullNodeMockRecorder) StateListActors(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListActors", reflect.TypeOf((*MockFullNode)(nil).StateListActors), arg0, arg1) +} + +// StateListMessages mocks base method +func (m *MockFullNode) StateListMessages(arg0 context.Context, arg1 *api.MessageMatch, arg2 types.TipSetKey, arg3 abi.ChainEpoch) ([]cid.Cid, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListMessages", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]cid.Cid) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListMessages indicates an expected call of StateListMessages +func (mr *MockFullNodeMockRecorder) StateListMessages(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListMessages", reflect.TypeOf((*MockFullNode)(nil).StateListMessages), arg0, arg1, arg2, arg3) +} + +// StateListMiners mocks base method +func (m *MockFullNode) StateListMiners(arg0 context.Context, arg1 types.TipSetKey) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateListMiners", arg0, arg1) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateListMiners indicates an expected call of StateListMiners +func (mr *MockFullNodeMockRecorder) StateListMiners(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateListMiners", reflect.TypeOf((*MockFullNode)(nil).StateListMiners), arg0, arg1) +} + +// StateLookupID mocks base method +func (m *MockFullNode) StateLookupID(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateLookupID", arg0, arg1, arg2) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateLookupID indicates an expected call of StateLookupID +func (mr *MockFullNodeMockRecorder) StateLookupID(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateLookupID", reflect.TypeOf((*MockFullNode)(nil).StateLookupID), arg0, arg1, arg2) +} + +// StateMarketBalance mocks base method +func (m *MockFullNode) StateMarketBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (api.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(api.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketBalance indicates an expected call of StateMarketBalance +func (mr *MockFullNodeMockRecorder) StateMarketBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketBalance", reflect.TypeOf((*MockFullNode)(nil).StateMarketBalance), arg0, arg1, arg2) +} + +// StateMarketDeals mocks base method +func (m *MockFullNode) StateMarketDeals(arg0 context.Context, arg1 types.TipSetKey) (map[string]api.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketDeals", arg0, arg1) + ret0, _ := ret[0].(map[string]api.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketDeals indicates an expected call of StateMarketDeals +func (mr *MockFullNodeMockRecorder) StateMarketDeals(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketDeals", reflect.TypeOf((*MockFullNode)(nil).StateMarketDeals), arg0, arg1) +} + +// StateMarketParticipants mocks base method +func (m *MockFullNode) StateMarketParticipants(arg0 context.Context, arg1 types.TipSetKey) (map[string]api.MarketBalance, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketParticipants", arg0, arg1) + ret0, _ := ret[0].(map[string]api.MarketBalance) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketParticipants indicates an expected call of StateMarketParticipants +func (mr *MockFullNodeMockRecorder) StateMarketParticipants(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketParticipants", reflect.TypeOf((*MockFullNode)(nil).StateMarketParticipants), arg0, arg1) +} + +// StateMarketStorageDeal mocks base method +func (m *MockFullNode) StateMarketStorageDeal(arg0 context.Context, arg1 abi.DealID, arg2 types.TipSetKey) (*api.MarketDeal, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMarketStorageDeal", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.MarketDeal) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMarketStorageDeal indicates an expected call of StateMarketStorageDeal +func (mr *MockFullNodeMockRecorder) StateMarketStorageDeal(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMarketStorageDeal", reflect.TypeOf((*MockFullNode)(nil).StateMarketStorageDeal), arg0, arg1, arg2) +} + +// StateMinerActiveSectors mocks base method +func (m *MockFullNode) StateMinerActiveSectors(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerActiveSectors", arg0, arg1, arg2) + ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerActiveSectors indicates an expected call of StateMinerActiveSectors +func (mr *MockFullNodeMockRecorder) StateMinerActiveSectors(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerActiveSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerActiveSectors), arg0, arg1, arg2) +} + +// StateMinerAvailableBalance mocks base method +func (m *MockFullNode) StateMinerAvailableBalance(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerAvailableBalance", arg0, arg1, arg2) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerAvailableBalance indicates an expected call of StateMinerAvailableBalance +func (mr *MockFullNodeMockRecorder) StateMinerAvailableBalance(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerAvailableBalance", reflect.TypeOf((*MockFullNode)(nil).StateMinerAvailableBalance), arg0, arg1, arg2) +} + +// StateMinerDeadlines mocks base method +func (m *MockFullNode) StateMinerDeadlines(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) ([]api.Deadline, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerDeadlines", arg0, arg1, arg2) + ret0, _ := ret[0].([]api.Deadline) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerDeadlines indicates an expected call of StateMinerDeadlines +func (mr *MockFullNodeMockRecorder) StateMinerDeadlines(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerDeadlines", reflect.TypeOf((*MockFullNode)(nil).StateMinerDeadlines), arg0, arg1, arg2) +} + +// StateMinerFaults mocks base method +func (m *MockFullNode) StateMinerFaults(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerFaults", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerFaults indicates an expected call of StateMinerFaults +func (mr *MockFullNodeMockRecorder) StateMinerFaults(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerFaults", reflect.TypeOf((*MockFullNode)(nil).StateMinerFaults), arg0, arg1, arg2) +} + +// StateMinerInfo mocks base method +func (m *MockFullNode) StateMinerInfo(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (miner.MinerInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInfo", arg0, arg1, arg2) + ret0, _ := ret[0].(miner.MinerInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInfo indicates an expected call of StateMinerInfo +func (mr *MockFullNodeMockRecorder) StateMinerInfo(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInfo", reflect.TypeOf((*MockFullNode)(nil).StateMinerInfo), arg0, arg1, arg2) +} + +// StateMinerInitialPledgeCollateral mocks base method +func (m *MockFullNode) StateMinerInitialPledgeCollateral(arg0 context.Context, arg1 address.Address, arg2 miner0.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerInitialPledgeCollateral", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerInitialPledgeCollateral indicates an expected call of StateMinerInitialPledgeCollateral +func (mr *MockFullNodeMockRecorder) StateMinerInitialPledgeCollateral(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerInitialPledgeCollateral", reflect.TypeOf((*MockFullNode)(nil).StateMinerInitialPledgeCollateral), arg0, arg1, arg2, arg3) +} + +// StateMinerPartitions mocks base method +func (m *MockFullNode) StateMinerPartitions(arg0 context.Context, arg1 address.Address, arg2 uint64, arg3 types.TipSetKey) ([]api.Partition, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPartitions", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]api.Partition) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPartitions indicates an expected call of StateMinerPartitions +func (mr *MockFullNodeMockRecorder) StateMinerPartitions(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPartitions", reflect.TypeOf((*MockFullNode)(nil).StateMinerPartitions), arg0, arg1, arg2, arg3) +} + +// StateMinerPower mocks base method +func (m *MockFullNode) StateMinerPower(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*api.MinerPower, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPower", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.MinerPower) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPower indicates an expected call of StateMinerPower +func (mr *MockFullNodeMockRecorder) StateMinerPower(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPower), arg0, arg1, arg2) +} + +// StateMinerPreCommitDepositForPower mocks base method +func (m *MockFullNode) StateMinerPreCommitDepositForPower(arg0 context.Context, arg1 address.Address, arg2 miner0.SectorPreCommitInfo, arg3 types.TipSetKey) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerPreCommitDepositForPower", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerPreCommitDepositForPower indicates an expected call of StateMinerPreCommitDepositForPower +func (mr *MockFullNodeMockRecorder) StateMinerPreCommitDepositForPower(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerPreCommitDepositForPower", reflect.TypeOf((*MockFullNode)(nil).StateMinerPreCommitDepositForPower), arg0, arg1, arg2, arg3) +} + +// StateMinerProvingDeadline mocks base method +func (m *MockFullNode) StateMinerProvingDeadline(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*dline.Info, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerProvingDeadline", arg0, arg1, arg2) + ret0, _ := ret[0].(*dline.Info) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerProvingDeadline indicates an expected call of StateMinerProvingDeadline +func (mr *MockFullNodeMockRecorder) StateMinerProvingDeadline(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerProvingDeadline", reflect.TypeOf((*MockFullNode)(nil).StateMinerProvingDeadline), arg0, arg1, arg2) +} + +// StateMinerRecoveries mocks base method +func (m *MockFullNode) StateMinerRecoveries(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (bitfield.BitField, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerRecoveries", arg0, arg1, arg2) + ret0, _ := ret[0].(bitfield.BitField) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerRecoveries indicates an expected call of StateMinerRecoveries +func (mr *MockFullNodeMockRecorder) StateMinerRecoveries(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerRecoveries", reflect.TypeOf((*MockFullNode)(nil).StateMinerRecoveries), arg0, arg1, arg2) +} + +// StateMinerSectorAllocated mocks base method +func (m *MockFullNode) StateMinerSectorAllocated(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorAllocated", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorAllocated indicates an expected call of StateMinerSectorAllocated +func (mr *MockFullNodeMockRecorder) StateMinerSectorAllocated(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorAllocated", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorAllocated), arg0, arg1, arg2, arg3) +} + +// StateMinerSectorCount mocks base method +func (m *MockFullNode) StateMinerSectorCount(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (api.MinerSectors, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectorCount", arg0, arg1, arg2) + ret0, _ := ret[0].(api.MinerSectors) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectorCount indicates an expected call of StateMinerSectorCount +func (mr *MockFullNodeMockRecorder) StateMinerSectorCount(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectorCount", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectorCount), arg0, arg1, arg2) +} + +// StateMinerSectors mocks base method +func (m *MockFullNode) StateMinerSectors(arg0 context.Context, arg1 address.Address, arg2 *bitfield.BitField, arg3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateMinerSectors", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].([]*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateMinerSectors indicates an expected call of StateMinerSectors +func (mr *MockFullNodeMockRecorder) StateMinerSectors(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateMinerSectors", reflect.TypeOf((*MockFullNode)(nil).StateMinerSectors), arg0, arg1, arg2, arg3) +} + +// StateNetworkName mocks base method +func (m *MockFullNode) StateNetworkName(arg0 context.Context) (dtypes.NetworkName, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkName", arg0) + ret0, _ := ret[0].(dtypes.NetworkName) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkName indicates an expected call of StateNetworkName +func (mr *MockFullNodeMockRecorder) StateNetworkName(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkName", reflect.TypeOf((*MockFullNode)(nil).StateNetworkName), arg0) +} + +// StateNetworkVersion mocks base method +func (m *MockFullNode) StateNetworkVersion(arg0 context.Context, arg1 types.TipSetKey) (network.Version, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateNetworkVersion", arg0, arg1) + ret0, _ := ret[0].(network.Version) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateNetworkVersion indicates an expected call of StateNetworkVersion +func (mr *MockFullNodeMockRecorder) StateNetworkVersion(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateNetworkVersion", reflect.TypeOf((*MockFullNode)(nil).StateNetworkVersion), arg0, arg1) +} + +// StateReadState mocks base method +func (m *MockFullNode) StateReadState(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*api.ActorState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateReadState", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.ActorState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateReadState indicates an expected call of StateReadState +func (mr *MockFullNodeMockRecorder) StateReadState(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateReadState", reflect.TypeOf((*MockFullNode)(nil).StateReadState), arg0, arg1, arg2) +} + +// StateReplay mocks base method +func (m *MockFullNode) StateReplay(arg0 context.Context, arg1 types.TipSetKey, arg2 cid.Cid) (*api.InvocResult, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateReplay", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.InvocResult) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateReplay indicates an expected call of StateReplay +func (mr *MockFullNodeMockRecorder) StateReplay(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateReplay", reflect.TypeOf((*MockFullNode)(nil).StateReplay), arg0, arg1, arg2) +} + +// StateSearchMsg mocks base method +func (m *MockFullNode) StateSearchMsg(arg0 context.Context, arg1 cid.Cid) (*api.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSearchMsg", arg0, arg1) + ret0, _ := ret[0].(*api.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSearchMsg indicates an expected call of StateSearchMsg +func (mr *MockFullNodeMockRecorder) StateSearchMsg(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSearchMsg", reflect.TypeOf((*MockFullNode)(nil).StateSearchMsg), arg0, arg1) +} + +// StateSearchMsgLimited mocks base method +func (m *MockFullNode) StateSearchMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 abi.ChainEpoch) (*api.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSearchMsgLimited", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSearchMsgLimited indicates an expected call of StateSearchMsgLimited +func (mr *MockFullNodeMockRecorder) StateSearchMsgLimited(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSearchMsgLimited", reflect.TypeOf((*MockFullNode)(nil).StateSearchMsgLimited), arg0, arg1, arg2) +} + +// StateSectorExpiration mocks base method +func (m *MockFullNode) StateSectorExpiration(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner.SectorExpiration, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorExpiration", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner.SectorExpiration) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorExpiration indicates an expected call of StateSectorExpiration +func (mr *MockFullNodeMockRecorder) StateSectorExpiration(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorExpiration", reflect.TypeOf((*MockFullNode)(nil).StateSectorExpiration), arg0, arg1, arg2, arg3) +} + +// StateSectorGetInfo mocks base method +func (m *MockFullNode) StateSectorGetInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner.SectorOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorGetInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner.SectorOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorGetInfo indicates an expected call of StateSectorGetInfo +func (mr *MockFullNodeMockRecorder) StateSectorGetInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorGetInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorGetInfo), arg0, arg1, arg2, arg3) +} + +// StateSectorPartition mocks base method +func (m *MockFullNode) StateSectorPartition(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (*miner.SectorLocation, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPartition", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*miner.SectorLocation) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPartition indicates an expected call of StateSectorPartition +func (mr *MockFullNodeMockRecorder) StateSectorPartition(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPartition", reflect.TypeOf((*MockFullNode)(nil).StateSectorPartition), arg0, arg1, arg2, arg3) +} + +// StateSectorPreCommitInfo mocks base method +func (m *MockFullNode) StateSectorPreCommitInfo(arg0 context.Context, arg1 address.Address, arg2 abi.SectorNumber, arg3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateSectorPreCommitInfo", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(miner.SectorPreCommitOnChainInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateSectorPreCommitInfo indicates an expected call of StateSectorPreCommitInfo +func (mr *MockFullNodeMockRecorder) StateSectorPreCommitInfo(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateSectorPreCommitInfo", reflect.TypeOf((*MockFullNode)(nil).StateSectorPreCommitInfo), arg0, arg1, arg2, arg3) +} + +// StateVMCirculatingSupplyInternal mocks base method +func (m *MockFullNode) StateVMCirculatingSupplyInternal(arg0 context.Context, arg1 types.TipSetKey) (api.CirculatingSupply, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVMCirculatingSupplyInternal", arg0, arg1) + ret0, _ := ret[0].(api.CirculatingSupply) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVMCirculatingSupplyInternal indicates an expected call of StateVMCirculatingSupplyInternal +func (mr *MockFullNodeMockRecorder) StateVMCirculatingSupplyInternal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVMCirculatingSupplyInternal", reflect.TypeOf((*MockFullNode)(nil).StateVMCirculatingSupplyInternal), arg0, arg1) +} + +// StateVerifiedClientStatus mocks base method +func (m *MockFullNode) StateVerifiedClientStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedClientStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedClientStatus indicates an expected call of StateVerifiedClientStatus +func (mr *MockFullNodeMockRecorder) StateVerifiedClientStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedClientStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedClientStatus), arg0, arg1, arg2) +} + +// StateVerifiedRegistryRootKey mocks base method +func (m *MockFullNode) StateVerifiedRegistryRootKey(arg0 context.Context, arg1 types.TipSetKey) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifiedRegistryRootKey", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifiedRegistryRootKey indicates an expected call of StateVerifiedRegistryRootKey +func (mr *MockFullNodeMockRecorder) StateVerifiedRegistryRootKey(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifiedRegistryRootKey", reflect.TypeOf((*MockFullNode)(nil).StateVerifiedRegistryRootKey), arg0, arg1) +} + +// StateVerifierStatus mocks base method +func (m *MockFullNode) StateVerifierStatus(arg0 context.Context, arg1 address.Address, arg2 types.TipSetKey) (*big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateVerifierStatus", arg0, arg1, arg2) + ret0, _ := ret[0].(*big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateVerifierStatus indicates an expected call of StateVerifierStatus +func (mr *MockFullNodeMockRecorder) StateVerifierStatus(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateVerifierStatus", reflect.TypeOf((*MockFullNode)(nil).StateVerifierStatus), arg0, arg1, arg2) +} + +// StateWaitMsg mocks base method +func (m *MockFullNode) StateWaitMsg(arg0 context.Context, arg1 cid.Cid, arg2 uint64) (*api.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateWaitMsg", arg0, arg1, arg2) + ret0, _ := ret[0].(*api.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateWaitMsg indicates an expected call of StateWaitMsg +func (mr *MockFullNodeMockRecorder) StateWaitMsg(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsg", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsg), arg0, arg1, arg2) +} + +// StateWaitMsgLimited mocks base method +func (m *MockFullNode) StateWaitMsgLimited(arg0 context.Context, arg1 cid.Cid, arg2 uint64, arg3 abi.ChainEpoch) (*api.MsgLookup, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "StateWaitMsgLimited", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(*api.MsgLookup) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// StateWaitMsgLimited indicates an expected call of StateWaitMsgLimited +func (mr *MockFullNodeMockRecorder) StateWaitMsgLimited(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "StateWaitMsgLimited", reflect.TypeOf((*MockFullNode)(nil).StateWaitMsgLimited), arg0, arg1, arg2, arg3) +} + +// SyncCheckBad mocks base method +func (m *MockFullNode) SyncCheckBad(arg0 context.Context, arg1 cid.Cid) (string, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncCheckBad", arg0, arg1) + ret0, _ := ret[0].(string) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncCheckBad indicates an expected call of SyncCheckBad +func (mr *MockFullNodeMockRecorder) SyncCheckBad(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncCheckBad", reflect.TypeOf((*MockFullNode)(nil).SyncCheckBad), arg0, arg1) +} + +// SyncCheckpoint mocks base method +func (m *MockFullNode) SyncCheckpoint(arg0 context.Context, arg1 types.TipSetKey) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncCheckpoint", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncCheckpoint indicates an expected call of SyncCheckpoint +func (mr *MockFullNodeMockRecorder) SyncCheckpoint(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncCheckpoint", reflect.TypeOf((*MockFullNode)(nil).SyncCheckpoint), arg0, arg1) +} + +// SyncIncomingBlocks mocks base method +func (m *MockFullNode) SyncIncomingBlocks(arg0 context.Context) (<-chan *types.BlockHeader, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncIncomingBlocks", arg0) + ret0, _ := ret[0].(<-chan *types.BlockHeader) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncIncomingBlocks indicates an expected call of SyncIncomingBlocks +func (mr *MockFullNodeMockRecorder) SyncIncomingBlocks(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncIncomingBlocks", reflect.TypeOf((*MockFullNode)(nil).SyncIncomingBlocks), arg0) +} + +// SyncMarkBad mocks base method +func (m *MockFullNode) SyncMarkBad(arg0 context.Context, arg1 cid.Cid) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncMarkBad", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncMarkBad indicates an expected call of SyncMarkBad +func (mr *MockFullNodeMockRecorder) SyncMarkBad(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncMarkBad", reflect.TypeOf((*MockFullNode)(nil).SyncMarkBad), arg0, arg1) +} + +// SyncState mocks base method +func (m *MockFullNode) SyncState(arg0 context.Context) (*api.SyncState, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncState", arg0) + ret0, _ := ret[0].(*api.SyncState) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncState indicates an expected call of SyncState +func (mr *MockFullNodeMockRecorder) SyncState(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncState", reflect.TypeOf((*MockFullNode)(nil).SyncState), arg0) +} + +// SyncSubmitBlock mocks base method +func (m *MockFullNode) SyncSubmitBlock(arg0 context.Context, arg1 *types.BlockMsg) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncSubmitBlock", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncSubmitBlock indicates an expected call of SyncSubmitBlock +func (mr *MockFullNodeMockRecorder) SyncSubmitBlock(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncSubmitBlock", reflect.TypeOf((*MockFullNode)(nil).SyncSubmitBlock), arg0, arg1) +} + +// SyncUnmarkAllBad mocks base method +func (m *MockFullNode) SyncUnmarkAllBad(arg0 context.Context) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncUnmarkAllBad", arg0) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncUnmarkAllBad indicates an expected call of SyncUnmarkAllBad +func (mr *MockFullNodeMockRecorder) SyncUnmarkAllBad(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncUnmarkAllBad", reflect.TypeOf((*MockFullNode)(nil).SyncUnmarkAllBad), arg0) +} + +// SyncUnmarkBad mocks base method +func (m *MockFullNode) SyncUnmarkBad(arg0 context.Context, arg1 cid.Cid) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncUnmarkBad", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// SyncUnmarkBad indicates an expected call of SyncUnmarkBad +func (mr *MockFullNodeMockRecorder) SyncUnmarkBad(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncUnmarkBad", reflect.TypeOf((*MockFullNode)(nil).SyncUnmarkBad), arg0, arg1) +} + +// SyncValidateTipset mocks base method +func (m *MockFullNode) SyncValidateTipset(arg0 context.Context, arg1 types.TipSetKey) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "SyncValidateTipset", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// SyncValidateTipset indicates an expected call of SyncValidateTipset +func (mr *MockFullNodeMockRecorder) SyncValidateTipset(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SyncValidateTipset", reflect.TypeOf((*MockFullNode)(nil).SyncValidateTipset), arg0, arg1) +} + +// Version mocks base method +func (m *MockFullNode) Version(arg0 context.Context) (api.APIVersion, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "Version", arg0) + ret0, _ := ret[0].(api.APIVersion) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// Version indicates an expected call of Version +func (mr *MockFullNodeMockRecorder) Version(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "Version", reflect.TypeOf((*MockFullNode)(nil).Version), arg0) +} + +// WalletBalance mocks base method +func (m *MockFullNode) WalletBalance(arg0 context.Context, arg1 address.Address) (big.Int, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletBalance", arg0, arg1) + ret0, _ := ret[0].(big.Int) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletBalance indicates an expected call of WalletBalance +func (mr *MockFullNodeMockRecorder) WalletBalance(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletBalance", reflect.TypeOf((*MockFullNode)(nil).WalletBalance), arg0, arg1) +} + +// WalletDefaultAddress mocks base method +func (m *MockFullNode) WalletDefaultAddress(arg0 context.Context) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletDefaultAddress", arg0) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletDefaultAddress indicates an expected call of WalletDefaultAddress +func (mr *MockFullNodeMockRecorder) WalletDefaultAddress(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletDefaultAddress", reflect.TypeOf((*MockFullNode)(nil).WalletDefaultAddress), arg0) +} + +// WalletDelete mocks base method +func (m *MockFullNode) WalletDelete(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletDelete", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// WalletDelete indicates an expected call of WalletDelete +func (mr *MockFullNodeMockRecorder) WalletDelete(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletDelete", reflect.TypeOf((*MockFullNode)(nil).WalletDelete), arg0, arg1) +} + +// WalletExport mocks base method +func (m *MockFullNode) WalletExport(arg0 context.Context, arg1 address.Address) (*types.KeyInfo, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletExport", arg0, arg1) + ret0, _ := ret[0].(*types.KeyInfo) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletExport indicates an expected call of WalletExport +func (mr *MockFullNodeMockRecorder) WalletExport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletExport", reflect.TypeOf((*MockFullNode)(nil).WalletExport), arg0, arg1) +} + +// WalletHas mocks base method +func (m *MockFullNode) WalletHas(arg0 context.Context, arg1 address.Address) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletHas", arg0, arg1) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletHas indicates an expected call of WalletHas +func (mr *MockFullNodeMockRecorder) WalletHas(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletHas", reflect.TypeOf((*MockFullNode)(nil).WalletHas), arg0, arg1) +} + +// WalletImport mocks base method +func (m *MockFullNode) WalletImport(arg0 context.Context, arg1 *types.KeyInfo) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletImport", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletImport indicates an expected call of WalletImport +func (mr *MockFullNodeMockRecorder) WalletImport(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletImport", reflect.TypeOf((*MockFullNode)(nil).WalletImport), arg0, arg1) +} + +// WalletList mocks base method +func (m *MockFullNode) WalletList(arg0 context.Context) ([]address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletList", arg0) + ret0, _ := ret[0].([]address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletList indicates an expected call of WalletList +func (mr *MockFullNodeMockRecorder) WalletList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletList", reflect.TypeOf((*MockFullNode)(nil).WalletList), arg0) +} + +// WalletNew mocks base method +func (m *MockFullNode) WalletNew(arg0 context.Context, arg1 types.KeyType) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletNew", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletNew indicates an expected call of WalletNew +func (mr *MockFullNodeMockRecorder) WalletNew(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletNew", reflect.TypeOf((*MockFullNode)(nil).WalletNew), arg0, arg1) +} + +// WalletSetDefault mocks base method +func (m *MockFullNode) WalletSetDefault(arg0 context.Context, arg1 address.Address) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSetDefault", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// WalletSetDefault indicates an expected call of WalletSetDefault +func (mr *MockFullNodeMockRecorder) WalletSetDefault(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSetDefault", reflect.TypeOf((*MockFullNode)(nil).WalletSetDefault), arg0, arg1) +} + +// WalletSign mocks base method +func (m *MockFullNode) WalletSign(arg0 context.Context, arg1 address.Address, arg2 []byte) (*crypto.Signature, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSign", arg0, arg1, arg2) + ret0, _ := ret[0].(*crypto.Signature) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSign indicates an expected call of WalletSign +func (mr *MockFullNodeMockRecorder) WalletSign(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSign", reflect.TypeOf((*MockFullNode)(nil).WalletSign), arg0, arg1, arg2) +} + +// WalletSignMessage mocks base method +func (m *MockFullNode) WalletSignMessage(arg0 context.Context, arg1 address.Address, arg2 *types.Message) (*types.SignedMessage, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletSignMessage", arg0, arg1, arg2) + ret0, _ := ret[0].(*types.SignedMessage) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletSignMessage indicates an expected call of WalletSignMessage +func (mr *MockFullNodeMockRecorder) WalletSignMessage(arg0, arg1, arg2 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletSignMessage", reflect.TypeOf((*MockFullNode)(nil).WalletSignMessage), arg0, arg1, arg2) +} + +// WalletValidateAddress mocks base method +func (m *MockFullNode) WalletValidateAddress(arg0 context.Context, arg1 string) (address.Address, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletValidateAddress", arg0, arg1) + ret0, _ := ret[0].(address.Address) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletValidateAddress indicates an expected call of WalletValidateAddress +func (mr *MockFullNodeMockRecorder) WalletValidateAddress(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletValidateAddress", reflect.TypeOf((*MockFullNode)(nil).WalletValidateAddress), arg0, arg1) +} + +// WalletVerify mocks base method +func (m *MockFullNode) WalletVerify(arg0 context.Context, arg1 address.Address, arg2 []byte, arg3 *crypto.Signature) (bool, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "WalletVerify", arg0, arg1, arg2, arg3) + ret0, _ := ret[0].(bool) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// WalletVerify indicates an expected call of WalletVerify +func (mr *MockFullNodeMockRecorder) WalletVerify(arg0, arg1, arg2, arg3 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "WalletVerify", reflect.TypeOf((*MockFullNode)(nil).WalletVerify), arg0, arg1, arg2, arg3) +} From 421338b9f45bc5631e88c6dc944e6cb1f4c72239 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 17:33:20 +0100 Subject: [PATCH 022/239] ci: Fix cbor gen check --- .circleci/config.yml | 2 +- Makefile | 1 + api/mocks/mock_full.go | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 83fde80ad..ecdb169e1 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -399,7 +399,7 @@ jobs: - run: make deps - run: go install golang.org/x/tools/cmd/goimports - run: go install github.com/hannahhoward/cbor-gen-for - - run: go generate ./... + - run: make type-gen - run: git --no-pager diff - run: git --no-pager diff --quiet diff --git a/Makefile b/Makefile index 02fe23b4a..4ede5a5a9 100644 --- a/Makefile +++ b/Makefile @@ -321,6 +321,7 @@ dist-clean: type-gen: go run ./gen/main.go go generate ./... + goimports -w api/ method-gen: (cd ./lotuspond/front/src/chain && go run ./methodgen.go) diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 8fd646d9a..1e0ff151b 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -6,6 +6,8 @@ package mocks import ( context "context" + reflect "reflect" + address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" @@ -32,7 +34,6 @@ import ( network0 "github.com/libp2p/go-libp2p-core/network" peer "github.com/libp2p/go-libp2p-core/peer" protocol "github.com/libp2p/go-libp2p-core/protocol" - reflect "reflect" ) // MockFullNode is a mock of FullNode interface From b3774f8b87518010e0bbd4c46dce7923863c8083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 18:11:52 +0100 Subject: [PATCH 023/239] openrpc: Don't use os.Args in init --- api/docgen-openrpc/cmd/docgen_openrpc.go | 6 +++++- api/docgen-openrpc/openrpc.go | 13 +------------ 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/api/docgen-openrpc/cmd/docgen_openrpc.go b/api/docgen-openrpc/cmd/docgen_openrpc.go index b1322257c..b2eb31057 100644 --- a/api/docgen-openrpc/cmd/docgen_openrpc.go +++ b/api/docgen-openrpc/cmd/docgen_openrpc.go @@ -7,6 +7,8 @@ import ( "log" "os" + "github.com/filecoin-project/lotus/api/docgen" + "github.com/filecoin-project/lotus/api/apistruct" docgen_openrpc "github.com/filecoin-project/lotus/api/docgen-openrpc" ) @@ -29,7 +31,9 @@ Use: */ func main() { - doc := docgen_openrpc.NewLotusOpenRPCDocument() + Comments, GroupDocs := docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) + + doc := docgen_openrpc.NewLotusOpenRPCDocument(Comments, GroupDocs) switch os.Args[2] { case "FullNode": diff --git a/api/docgen-openrpc/openrpc.go b/api/docgen-openrpc/openrpc.go index e2cd9ce53..271b43ac6 100644 --- a/api/docgen-openrpc/openrpc.go +++ b/api/docgen-openrpc/openrpc.go @@ -4,7 +4,6 @@ import ( "encoding/json" "go/ast" "net" - "os" "reflect" "github.com/alecthomas/jsonschema" @@ -15,16 +14,6 @@ import ( meta_schema "github.com/open-rpc/meta-schema" ) -// Comments holds API method comments collected by AST parsing. -var Comments map[string]string - -// GroupDocs holds documentation for documentation groups. -var GroupDocs map[string]string - -func init() { - Comments, GroupDocs = docgen.ParseApiASTInfo(os.Args[1], os.Args[2], os.Args[3], os.Args[4]) -} - // schemaDictEntry represents a type association passed to the jsonschema reflector. type schemaDictEntry struct { example interface{} @@ -94,7 +83,7 @@ func OpenRPCSchemaTypeMapper(ty reflect.Type) *jsonschema.Type { } // NewLotusOpenRPCDocument defines application-specific documentation and configuration for its OpenRPC document. -func NewLotusOpenRPCDocument() *go_openrpc_reflect.Document { +func NewLotusOpenRPCDocument(Comments, GroupDocs map[string]string) *go_openrpc_reflect.Document { d := &go_openrpc_reflect.Document{} // Register "Meta" document fields. From 65dcec0ebcf80e250caa625d22a3e57d2fed2309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 19:15:44 +0100 Subject: [PATCH 024/239] api client: Use versioned api packages --- api/client/client.go | 10 ++++++---- api/v0api/storage.go | 9 +++++++++ chain/wallet/remotewallet/remote.go | 2 +- cli/util/api.go | 14 +++++++------- cli/util/apiinfo.go | 6 +++--- cmd/lotus-shed/consensus.go | 2 +- 6 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 api/v0api/storage.go diff --git a/api/client/client.go b/api/client/client.go index 9ffd1707e..a08da0929 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -11,12 +11,14 @@ import ( "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api/v0api" + "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/lib/rpcenc" ) // NewCommonRPC creates a new http jsonrpc client. func NewCommonRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Common, jsonrpc.ClientCloser, error) { - var res apistruct.CommonStruct + var res v0api.CommonStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.Internal, @@ -29,7 +31,7 @@ func NewCommonRPC(ctx context.Context, addr string, requestHeader http.Header) ( // NewFullNodeRPC creates a new http jsonrpc client. func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) { - var res apistruct.FullNodeStruct + var res v1api.FullNodeStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.CommonStruct.Internal, @@ -40,8 +42,8 @@ func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) } // NewStorageMinerRPC creates a new http jsonrpc client for miner -func NewStorageMinerRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.StorageMiner, jsonrpc.ClientCloser, error) { - var res apistruct.StorageMinerStruct +func NewStorageMinerRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (v0api.StorageMiner, jsonrpc.ClientCloser, error) { + var res v0api.StorageMinerStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.CommonStruct.Internal, diff --git a/api/v0api/storage.go b/api/v0api/storage.go new file mode 100644 index 000000000..a05f48285 --- /dev/null +++ b/api/v0api/storage.go @@ -0,0 +1,9 @@ +package v0api + +import ( + "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/api/apistruct" +) + +type StorageMiner = api.StorageMiner +type StorageMinerStruct = apistruct.StorageMinerStruct diff --git a/chain/wallet/remotewallet/remote.go b/chain/wallet/remotewallet/remote.go index 262b5f9c6..685d0fc35 100644 --- a/chain/wallet/remotewallet/remote.go +++ b/chain/wallet/remotewallet/remote.go @@ -20,7 +20,7 @@ func SetupRemoteWallet(info string) func(mctx helpers.MetricsCtx, lc fx.Lifecycl return func(mctx helpers.MetricsCtx, lc fx.Lifecycle) (*RemoteWallet, error) { ai := cliutil.ParseApiInfo(info) - url, err := ai.DialArgs() + url, err := ai.DialArgs("v0") if err != nil { return nil, err } diff --git a/cli/util/api.go b/cli/util/api.go index ce5945f2e..c0f0b0ed1 100644 --- a/cli/util/api.go +++ b/cli/util/api.go @@ -133,13 +133,13 @@ func GetAPIInfo(ctx *cli.Context, t repo.RepoType) (APIInfo, error) { }, nil } -func GetRawAPI(ctx *cli.Context, t repo.RepoType) (string, http.Header, error) { +func GetRawAPI(ctx *cli.Context, t repo.RepoType, version string) (string, http.Header, error) { ainfo, err := GetAPIInfo(ctx, t) if err != nil { return "", nil, xerrors.Errorf("could not get API info: %w", err) } - addr, err := ainfo.DialArgs() + addr, err := ainfo.DialArgs(version) if err != nil { return "", nil, xerrors.Errorf("could not get DialArgs: %w", err) } @@ -165,7 +165,7 @@ func GetAPI(ctx *cli.Context) (api.Common, jsonrpc.ClientCloser, error) { return tn.(api.FullNode), func() {}, nil } - addr, headers, err := GetRawAPI(ctx, t) + addr, headers, err := GetRawAPI(ctx, t, "v0") if err != nil { return nil, nil, err } @@ -178,7 +178,7 @@ func GetFullNodeAPI(ctx *cli.Context) (api.FullNode, jsonrpc.ClientCloser, error return tn.(api.FullNode), func() {}, nil } - addr, headers, err := GetRawAPI(ctx, repo.FullNode) + addr, headers, err := GetRawAPI(ctx, repo.FullNode, "v1") if err != nil { return nil, nil, err } @@ -206,7 +206,7 @@ func GetStorageMinerAPI(ctx *cli.Context, opts ...GetStorageMinerOption) (api.St return tn.(api.StorageMiner), func() {}, nil } - addr, headers, err := GetRawAPI(ctx, repo.StorageMiner) + addr, headers, err := GetRawAPI(ctx, repo.StorageMiner, "v0") if err != nil { return nil, nil, err } @@ -231,7 +231,7 @@ func GetStorageMinerAPI(ctx *cli.Context, opts ...GetStorageMinerOption) (api.St } func GetWorkerAPI(ctx *cli.Context) (api.Worker, jsonrpc.ClientCloser, error) { - addr, headers, err := GetRawAPI(ctx, repo.Worker) + addr, headers, err := GetRawAPI(ctx, repo.Worker, "v0") if err != nil { return nil, nil, err } @@ -240,7 +240,7 @@ func GetWorkerAPI(ctx *cli.Context) (api.Worker, jsonrpc.ClientCloser, error) { } func GetGatewayAPI(ctx *cli.Context) (api.Gateway, jsonrpc.ClientCloser, error) { - addr, headers, err := GetRawAPI(ctx, repo.FullNode) + addr, headers, err := GetRawAPI(ctx, repo.FullNode, "v0") if err != nil { return nil, nil, err } diff --git a/cli/util/apiinfo.go b/cli/util/apiinfo.go index 1f9a83769..41ca18c61 100644 --- a/cli/util/apiinfo.go +++ b/cli/util/apiinfo.go @@ -36,7 +36,7 @@ func ParseApiInfo(s string) APIInfo { } } -func (a APIInfo) DialArgs() (string, error) { +func (a APIInfo) DialArgs(version string) (string, error) { ma, err := multiaddr.NewMultiaddr(a.Addr) if err == nil { _, addr, err := manet.DialArgs(ma) @@ -44,14 +44,14 @@ func (a APIInfo) DialArgs() (string, error) { return "", err } - return "ws://" + addr + "/rpc/v0", nil + return "ws://" + addr + "/rpc/" + version, nil } _, err = url.Parse(a.Addr) if err != nil { return "", err } - return a.Addr + "/rpc/v0", nil + return a.Addr + "/rpc/" + version, nil } func (a APIInfo) Host() (string, error) { diff --git a/cmd/lotus-shed/consensus.go b/cmd/lotus-shed/consensus.go index c78c9c00f..8e30f5cee 100644 --- a/cmd/lotus-shed/consensus.go +++ b/cmd/lotus-shed/consensus.go @@ -113,7 +113,7 @@ var consensusCheckCmd = &cli.Command{ return err } ainfo := cliutil.APIInfo{Addr: apima.String()} - addr, err := ainfo.DialArgs() + addr, err := ainfo.DialArgs("v1") if err != nil { return err } From eed5840de3fc15f3572cdc81ae6bd463d7b1a1f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 23 Mar 2021 19:32:42 +0100 Subject: [PATCH 025/239] fix lotus-shed --- cmd/lotus-shed/rpc.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/cmd/lotus-shed/rpc.go b/cmd/lotus-shed/rpc.go index fe81e5a62..81171916e 100644 --- a/cmd/lotus-shed/rpc.go +++ b/cmd/lotus-shed/rpc.go @@ -28,6 +28,10 @@ var rpcCmd = &cli.Command{ &cli.BoolFlag{ Name: "miner", }, + &cli.StringFlag{ + Name: "version", + Value: "v0", + }, }, Action: func(cctx *cli.Context) error { rt := repo.FullNode @@ -35,7 +39,7 @@ var rpcCmd = &cli.Command{ rt = repo.StorageMiner } - addr, headers, err := lcli.GetRawAPI(cctx, rt) + addr, headers, err := lcli.GetRawAPI(cctx, rt, cctx.String("version")) if err != nil { return err } From 1359fb6cc4e0072a7b07f6a9c1f4965d362ef610 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 24 Mar 2021 13:56:59 +0100 Subject: [PATCH 026/239] fix: disable pull channel monitoring for now --- go.mod | 4 ++-- go.sum | 8 ++++---- node/modules/client.go | 6 ++++++ 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e5f8900ae..7602b3845 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.3.0 + github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.1 + github.com/filecoin-project/go-fil-markets v1.2.2 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index ae66a5883..ca91c1763 100644 --- a/go.sum +++ b/go.sum @@ -265,16 +265,16 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.3.0 h1:QZvpUVU0fVKH+wBH/QDPi5AB7fUI3NwwBLHK+d1Jed4= -github.com/filecoin-project/go-data-transfer v1.3.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/filecoin-project/go-data-transfer v1.4.0 h1:SRpFUp7WQdJe6iSmt7HfhMGDk7tniTVIlfmvQVBZhN8= +github.com/filecoin-project/go-data-transfer v1.4.0/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.1 h1:vsTf6x6ZvwbIuPxCXIAIKBLOnRewMPPiXhwkZwVxWEo= -github.com/filecoin-project/go-fil-markets v1.2.1/go.mod h1:G4d/D/RwxpwSmMS1VyJ72wq8IIDdIbIefM1vKKPesfw= +github.com/filecoin-project/go-fil-markets v1.2.2 h1:BC9Ixdyy5J8VfirytWmX69Ntrk94rzm4WyExhwg/Kwc= +github.com/filecoin-project/go-fil-markets v1.2.2/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/node/modules/client.go b/node/modules/client.go index d68e96406..d54347835 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -135,6 +135,12 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap // data-transfer push / pull channel restart configuration: dtRestartConfig := dtimpl.ChannelRestartConfig(channelmonitor.Config{ + // For now only monitor push channels (for storage deals) + MonitorPushChannels: true, + // TODO: Enable pull channel monitoring (for retrievals) when the + // following issue has been fixed: + // https://github.com/filecoin-project/go-data-transfer/issues/172 + MonitorPullChannels: false, // Wait up to 30s for the other side to respond to an Open channel message AcceptTimeout: 30 * time.Second, // Send a restart message if the data rate falls below 1024 bytes / minute From a202f9d19e1d841b88441b3b6e6252487a7692cd Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 24 Mar 2021 14:36:21 +0200 Subject: [PATCH 027/239] add cancel-retrieval-deal cmd --- api/api_full.go | 3 +++ api/apistruct/struct.go | 6 ++++++ api/mocks/mock_full.go | 15 +++++++++++++++ cli/client.go | 27 +++++++++++++++++++++++++++ documentation/en/api-methods.md | 16 ++++++++++++++++ node/impl/client/client.go | 23 +++++++++++++++++++++++ 6 files changed, 90 insertions(+) diff --git a/api/api_full.go b/api/api_full.go index b66b0e402..00dc86797 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -340,6 +340,9 @@ type FullNode interface { // which are stuck due to insufficient funds ClientRetrieveTryRestartInsufficientFunds(ctx context.Context, paymentChannel address.Address) error //perm:write + // ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error //perm:write + // ClientUnimport removes references to the specified file from filestore //ClientUnimport(path string) diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34cf52fce..afd177f86 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -154,6 +154,8 @@ type FullNodeStruct struct { ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` + ClientCancelRetrievalDeal func(p0 context.Context, p1 retrievalmarket.DealID) error `perm:"write"` + ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"` @@ -978,6 +980,10 @@ func (s *FullNodeStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatra return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) } +func (s *FullNodeStruct) ClientCancelRetrievalDeal(p0 context.Context, p1 retrievalmarket.DealID) error { + return s.Internal.ClientCancelRetrievalDeal(p0, p1) +} + func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { return s.Internal.ClientDataTransferUpdates(p0) } diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index 8fd646d9a..8de04cf4c 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -9,6 +9,7 @@ import ( address "github.com/filecoin-project/go-address" bitfield "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" + retrievalmarket "github.com/filecoin-project/go-fil-markets/retrievalmarket" storagemarket "github.com/filecoin-project/go-fil-markets/storagemarket" auth "github.com/filecoin-project/go-jsonrpc/auth" multistore "github.com/filecoin-project/go-multistore" @@ -445,6 +446,20 @@ func (mr *MockFullNodeMockRecorder) ClientCancelDataTransfer(arg0, arg1, arg2, a return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCancelDataTransfer", reflect.TypeOf((*MockFullNode)(nil).ClientCancelDataTransfer), arg0, arg1, arg2, arg3) } +// ClientCancelRetrievalDeal mocks base method +func (m *MockFullNode) ClientCancelRetrievalDeal(arg0 context.Context, arg1 retrievalmarket.DealID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "ClientCancelRetrievalDeal", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// ClientCancelRetrievalDeal indicates an expected call of ClientCancelRetrievalDeal +func (mr *MockFullNodeMockRecorder) ClientCancelRetrievalDeal(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "ClientCancelRetrievalDeal", reflect.TypeOf((*MockFullNode)(nil).ClientCancelRetrievalDeal), arg0, arg1) +} + // ClientDataTransferUpdates mocks base method func (m *MockFullNode) ClientDataTransferUpdates(arg0 context.Context) (<-chan api.DataTransferChannel, error) { m.ctrl.T.Helper() diff --git a/cli/client.go b/cli/client.go index 98f4b0229..ecc31e1e5 100644 --- a/cli/client.go +++ b/cli/client.go @@ -95,6 +95,7 @@ var clientCmd = &cli.Command{ WithCategory("util", clientListTransfers), WithCategory("util", clientRestartTransfer), WithCategory("util", clientCancelTransfer), + WithCategory("util", clientCancelRetrievalDeal), }, } @@ -1975,6 +1976,32 @@ var clientCancelTransfer = &cli.Command{ }, } +var clientCancelRetrievalDeal = &cli.Command{ + Name: "cancel-retrieval-deal", + Usage: "Cancel a retrieval deal by DealID", + Flags: []cli.Flag{ + &cli.Int64Flag{ + Name: "dealid", + Usage: "specify retrieval deal by DealID", + Required: true, + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + if cctx.Int64("dealid") == 0 { + return errors.New("deal id cannot be 0") + } + + return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) + }, +} + var clientListTransfers = &cli.Command{ Name: "list-transfers", Usage: "List ongoing data transfers for deals", diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index b8764d5b1..82e7f3e05 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -35,6 +35,7 @@ * [Client](#Client) * [ClientCalcCommP](#ClientCalcCommP) * [ClientCancelDataTransfer](#ClientCancelDataTransfer) + * [ClientCancelRetrievalDeal](#ClientCancelRetrievalDeal) * [ClientDataTransferUpdates](#ClientDataTransferUpdates) * [ClientDealPieceCID](#ClientDealPieceCID) * [ClientDealSize](#ClientDealSize) @@ -921,6 +922,21 @@ Inputs: Response: `{}` +### ClientCancelRetrievalDeal +ClientCancelRetrievalDeal cancels an ongoing retrieval deal based on DealID + + +Perms: write + +Inputs: +```json +[ + 5 +] +``` + +Response: `{}` + ### ClientDataTransferUpdates diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac60..1f5203754 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -475,6 +475,29 @@ func (a *API) ClientListImports(ctx context.Context) ([]api.Import, error) { return out, nil } +func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error { + cerr := make(chan error) + go func() { + err := a.Retrieval.CancelDeal(dealid) + + select { + case cerr <- err: + case <-ctx.Done(): + } + }() + + select { + case err := <-cerr: + if err != nil { + return xerrors.Errorf("canceling retrieval deal erred: %w", err) + } + + return nil + case <-ctx.Done(): + return xerrors.Errorf("canceling retrieval deal context timeout: %w", ctx.Err()) + } +} + func (a *API) ClientRetrieve(ctx context.Context, order api.RetrievalOrder, ref *api.FileRef) error { events := make(chan marketevents.RetrievalEvent) go a.clientRetrieve(ctx, order, ref, events) From 53f915d1555a69a3aaf45b5ea30ebfe8a642a3e0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 12:28:53 +0100 Subject: [PATCH 028/239] Import secp sigs in paych tests --- paychmgr/paych_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/paychmgr/paych_test.go b/paychmgr/paych_test.go index 8557dfb63..04ed5ce5c 100644 --- a/paychmgr/paych_test.go +++ b/paychmgr/paych_test.go @@ -23,6 +23,7 @@ import ( paychmock "github.com/filecoin-project/lotus/chain/actors/builtin/paych/mock" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/sigs" + _ "github.com/filecoin-project/lotus/lib/sigs/secp" ) func TestCheckVoucherValid(t *testing.T) { From 01340993151225ee4f1c8c5adefb773cf305875a Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Thu, 25 Mar 2021 15:07:42 +0100 Subject: [PATCH 029/239] feat: markets v1.2.3 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 7602b3845..f1bcab061 100644 --- a/go.mod +++ b/go.mod @@ -34,7 +34,7 @@ require ( github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.2.2 + github.com/filecoin-project/go-fil-markets v1.2.3 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 diff --git a/go.sum b/go.sum index ca91c1763..93c6bb2d9 100644 --- a/go.sum +++ b/go.sum @@ -273,8 +273,8 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.2.2 h1:BC9Ixdyy5J8VfirytWmX69Ntrk94rzm4WyExhwg/Kwc= -github.com/filecoin-project/go-fil-markets v1.2.2/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.2.3 h1:JDbGKQf60tB00TFKG/nofSyHyIEbqowZqoLOfda7yTs= +github.com/filecoin-project/go-fil-markets v1.2.3/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 7a23b411ae988c644f3160afe7ee5703d092a444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 15:09:50 +0100 Subject: [PATCH 030/239] Merge apistruct with the api package --- Makefile | 6 +- api/api_test.go | 6 + api/apistruct/struct_test.go | 9 - api/apistruct/types.go | 12 - api/client/client.go | 7 +- api/docgen-openrpc/cmd/docgen_openrpc.go | 11 +- api/docgen/cmd/docgen.go | 23 +- api/docgen/docgen.go | 37 +++ api/{apistruct => }/permissioned.go | 11 +- api/{apistruct => }/struct.go | 355 +++++++++++------------ api/v0api/common.go | 77 ----- api/v0api/latest.go | 24 ++ api/v0api/permissioned.go | 13 + api/v0api/storage.go | 9 - api/v0api/struct.go | 166 ----------- api/v1api/latest.go | 7 +- build/openrpc/full.json.gz | Bin 22582 -> 22496 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7608 bytes build/openrpc/worker.json.gz | Bin 2578 -> 2561 bytes cli/auth.go | 14 +- cmd/lotus-seal-worker/main.go | 5 +- cmd/lotus-shed/jwt.go | 13 +- cmd/lotus-storage-miner/run.go | 3 +- cmd/lotus/rpc.go | 6 +- gen/api/proxygen.go | 20 +- metrics/proxy.go | 11 +- node/impl/storminer.go | 3 +- node/modules/core.go | 4 +- 28 files changed, 314 insertions(+), 538 deletions(-) delete mode 100644 api/apistruct/struct_test.go delete mode 100644 api/apistruct/types.go rename api/{apistruct => }/permissioned.go (78%) rename api/{apistruct => }/struct.go (87%) delete mode 100644 api/v0api/common.go create mode 100644 api/v0api/latest.go create mode 100644 api/v0api/permissioned.go delete mode 100644 api/v0api/storage.go diff --git a/Makefile b/Makefile index 4ede5a5a9..e38844347 100644 --- a/Makefile +++ b/Makefile @@ -320,7 +320,7 @@ dist-clean: type-gen: go run ./gen/main.go - go generate ./... + go generate -x ./... goimports -w api/ method-gen: @@ -328,8 +328,8 @@ method-gen: api-gen: go run ./gen/api - goimports -w api/apistruct api/v0api - goimports -w api/apistruct api/v0api + goimports -w api + goimports -w api .PHONY: api-gen docsgen: docsgen-md docsgen-openrpc diff --git a/api/api_test.go b/api/api_test.go index 70d918b5c..738e1b067 100644 --- a/api/api_test.go +++ b/api/api_test.go @@ -113,3 +113,9 @@ func TestReturnTypes(t *testing.T) { t.Run("miner", tst(new(StorageMiner))) t.Run("worker", tst(new(Worker))) } + +func TestPermTags(t *testing.T) { + _ = PermissionedFullAPI(&FullNodeStruct{}) + _ = PermissionedStorMinerAPI(&StorageMinerStruct{}) + _ = PermissionedWorkerAPI(&WorkerStruct{}) +} diff --git a/api/apistruct/struct_test.go b/api/apistruct/struct_test.go deleted file mode 100644 index 9f5f58360..000000000 --- a/api/apistruct/struct_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package apistruct - -import "testing" - -func TestPermTags(t *testing.T) { - _ = PermissionedFullAPI(&FullNodeStruct{}) - _ = PermissionedStorMinerAPI(&StorageMinerStruct{}) - _ = PermissionedWorkerAPI(&WorkerStruct{}) -} diff --git a/api/apistruct/types.go b/api/apistruct/types.go deleted file mode 100644 index 57c89cdaa..000000000 --- a/api/apistruct/types.go +++ /dev/null @@ -1,12 +0,0 @@ -package apistruct - -import "github.com/filecoin-project/lotus/api" - -type ChainIO = api.ChainIO -type Common = api.Common -type FullNode = api.FullNode -type Gateway = api.Gateway -type Signable = api.Signable -type StorageMiner = api.StorageMiner -type Wallet = api.Wallet -type Worker = api.Worker diff --git a/api/client/client.go b/api/client/client.go index a08da0929..6c2f00b46 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/lib/rpcenc" @@ -71,7 +70,7 @@ func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) ( u.Path = path.Join(u.Path, "../streams/v0/push") - var res apistruct.WorkerStruct + var res api.WorkerStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.Internal, @@ -87,7 +86,7 @@ func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) ( // NewGatewayRPC creates a new http jsonrpc client for a gateway node. func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.Gateway, jsonrpc.ClientCloser, error) { - var res apistruct.GatewayStruct + var res api.GatewayStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.Internal, @@ -100,7 +99,7 @@ func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, } func NewWalletRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Wallet, jsonrpc.ClientCloser, error) { - var res apistruct.WalletStruct + var res api.WalletStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ &res.Internal, diff --git a/api/docgen-openrpc/cmd/docgen_openrpc.go b/api/docgen-openrpc/cmd/docgen_openrpc.go index b2eb31057..febbef3e4 100644 --- a/api/docgen-openrpc/cmd/docgen_openrpc.go +++ b/api/docgen-openrpc/cmd/docgen_openrpc.go @@ -9,7 +9,6 @@ import ( "github.com/filecoin-project/lotus/api/docgen" - "github.com/filecoin-project/lotus/api/apistruct" docgen_openrpc "github.com/filecoin-project/lotus/api/docgen-openrpc" ) @@ -35,14 +34,8 @@ func main() { doc := docgen_openrpc.NewLotusOpenRPCDocument(Comments, GroupDocs) - switch os.Args[2] { - case "FullNode": - doc.RegisterReceiverName("Filecoin", &apistruct.FullNodeStruct{}) - case "StorageMiner": - doc.RegisterReceiverName("Filecoin", &apistruct.StorageMinerStruct{}) - case "Worker": - doc.RegisterReceiverName("Filecoin", &apistruct.WorkerStruct{}) - } + i, _, _, _ := docgen.GetAPIType(os.Args[2], os.Args[3]) + doc.RegisterReceiverName("Filecoin", i) out, err := doc.Discover() if err != nil { diff --git a/api/docgen/cmd/docgen.go b/api/docgen/cmd/docgen.go index 57182d400..912eea841 100644 --- a/api/docgen/cmd/docgen.go +++ b/api/docgen/cmd/docgen.go @@ -4,12 +4,9 @@ import ( "encoding/json" "fmt" "os" - "reflect" "sort" "strings" - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/api/docgen" ) @@ -18,25 +15,7 @@ func main() { groups := make(map[string]*docgen.MethodGroup) - var t reflect.Type - var permStruct, commonPermStruct reflect.Type - - switch os.Args[2] { - case "FullNode": - t = reflect.TypeOf(new(struct{ api.FullNode })).Elem() - permStruct = reflect.TypeOf(apistruct.FullNodeStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) - case "StorageMiner": - t = reflect.TypeOf(new(struct{ api.StorageMiner })).Elem() - permStruct = reflect.TypeOf(apistruct.StorageMinerStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.CommonStruct{}.Internal) - case "Worker": - t = reflect.TypeOf(new(struct{ api.Worker })).Elem() - permStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) - commonPermStruct = reflect.TypeOf(apistruct.WorkerStruct{}.Internal) - default: - panic("unknown type") - } + _, t, permStruct, commonPermStruct := docgen.GetAPIType(os.Args[2], os.Args[3]) for i := 0; i < t.NumMethod(); i++ { m := t.Method(i) diff --git a/api/docgen/docgen.go b/api/docgen/docgen.go index 49f838959..9ce10edfe 100644 --- a/api/docgen/docgen.go +++ b/api/docgen/docgen.go @@ -35,6 +35,7 @@ import ( "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/extern/sector-storage/sealtasks" @@ -262,6 +263,42 @@ func init() { ) } +func GetAPIType(name, pkg string) (i interface{}, t, permStruct, commonPermStruct reflect.Type) { + switch pkg { + case "api": // latest + switch name { + case "FullNode": + i = &api.FullNodeStruct{} + t = reflect.TypeOf(new(struct{ api.FullNode })).Elem() + permStruct = reflect.TypeOf(api.FullNodeStruct{}.Internal) + commonPermStruct = reflect.TypeOf(api.CommonStruct{}.Internal) + case "StorageMiner": + i = &api.StorageMinerStruct{} + t = reflect.TypeOf(new(struct{ api.StorageMiner })).Elem() + permStruct = reflect.TypeOf(api.StorageMinerStruct{}.Internal) + commonPermStruct = reflect.TypeOf(api.CommonStruct{}.Internal) + case "Worker": + i = &api.WorkerStruct{} + t = reflect.TypeOf(new(struct{ api.Worker })).Elem() + permStruct = reflect.TypeOf(api.WorkerStruct{}.Internal) + commonPermStruct = reflect.TypeOf(api.WorkerStruct{}.Internal) + default: + panic("unknown type") + } + case "v0api": + switch name { + case "FullNode": + i = v0api.FullNodeStruct{} + t = reflect.TypeOf(new(struct{ v0api.FullNode })).Elem() + permStruct = reflect.TypeOf(v0api.FullNodeStruct{}.Internal) + commonPermStruct = reflect.TypeOf(v0api.CommonStruct{}.Internal) + default: + panic("unknown type") + } + } + return +} + func ExampleValue(method string, t, parent reflect.Type) interface{} { v, ok := ExampleValues[t] if ok { diff --git a/api/apistruct/permissioned.go b/api/permissioned.go similarity index 78% rename from api/apistruct/permissioned.go rename to api/permissioned.go index 23259fa87..d99e5943b 100644 --- a/api/apistruct/permissioned.go +++ b/api/permissioned.go @@ -1,8 +1,7 @@ -package apistruct +package api import ( "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api" ) const ( @@ -17,27 +16,27 @@ const ( var AllPermissions = []auth.Permission{PermRead, PermWrite, PermSign, PermAdmin} var DefaultPerms = []auth.Permission{PermRead} -func PermissionedStorMinerAPI(a api.StorageMiner) api.StorageMiner { +func PermissionedStorMinerAPI(a StorageMiner) StorageMiner { var out StorageMinerStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.CommonStruct.Internal) return &out } -func PermissionedFullAPI(a api.FullNode) api.FullNode { +func PermissionedFullAPI(a FullNode) FullNode { var out FullNodeStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.CommonStruct.Internal) return &out } -func PermissionedWorkerAPI(a api.Worker) api.Worker { +func PermissionedWorkerAPI(a Worker) Worker { var out WorkerStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) return &out } -func PermissionedWalletAPI(a api.Wallet) api.Wallet { +func PermissionedWalletAPI(a Wallet) Wallet { var out WalletStruct auth.PermissionedProxy(AllPermissions, DefaultPerms, a, &out.Internal) return &out diff --git a/api/apistruct/struct.go b/api/struct.go similarity index 87% rename from api/apistruct/struct.go rename to api/struct.go index 63dbb51b0..9a619e3d0 100644 --- a/api/apistruct/struct.go +++ b/api/struct.go @@ -1,6 +1,6 @@ // Code generated by github.com/filecoin-project/lotus/gen/api. DO NOT EDIT. -package apistruct +package api import ( "context" @@ -18,7 +18,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" "github.com/filecoin-project/go-state-types/dline" - "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" @@ -66,7 +65,7 @@ type CommonStruct struct { NetAgentVersion func(p0 context.Context, p1 peer.ID) (string, error) `perm:"read"` - NetAutoNatStatus func(p0 context.Context) (api.NatInfo, error) `perm:"read"` + NetAutoNatStatus func(p0 context.Context) (NatInfo, error) `perm:"read"` NetBandwidthStats func(p0 context.Context) (metrics.Stats, error) `perm:"read"` @@ -74,11 +73,11 @@ type CommonStruct struct { NetBandwidthStatsByProtocol func(p0 context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` - NetBlockAdd func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + NetBlockAdd func(p0 context.Context, p1 NetBlockList) error `perm:"admin"` - NetBlockList func(p0 context.Context) (api.NetBlockList, error) `perm:"read"` + NetBlockList func(p0 context.Context) (NetBlockList, error) `perm:"read"` - NetBlockRemove func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` + NetBlockRemove func(p0 context.Context, p1 NetBlockList) error `perm:"admin"` NetConnect func(p0 context.Context, p1 peer.AddrInfo) error `perm:"write"` @@ -88,17 +87,17 @@ type CommonStruct struct { NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - NetPeerInfo func(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"` + NetPeerInfo func(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) `perm:"read"` NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` - NetPubsubScores func(p0 context.Context) ([]api.PubsubScore, error) `perm:"read"` + NetPubsubScores func(p0 context.Context) ([]PubsubScore, error) `perm:"read"` Session func(p0 context.Context) (uuid.UUID, error) `perm:"read"` Shutdown func(p0 context.Context) error `perm:"admin"` - Version func(p0 context.Context) (api.APIVersion, error) `perm:"read"` + Version func(p0 context.Context) (APIVersion, error) `perm:"read"` } } @@ -114,19 +113,19 @@ type FullNodeStruct struct { ChainGetBlock func(p0 context.Context, p1 cid.Cid) (*types.BlockHeader, error) `perm:"read"` - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `perm:"read"` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*BlockMessages, error) `perm:"read"` ChainGetGenesis func(p0 context.Context) (*types.TipSet, error) `perm:"read"` ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `perm:"read"` - ChainGetNode func(p0 context.Context, p1 string) (*api.IpldObject, error) `perm:"read"` + ChainGetNode func(p0 context.Context, p1 string) (*IpldObject, error) `perm:"read"` - ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]api.Message, error) `perm:"read"` + ChainGetParentMessages func(p0 context.Context, p1 cid.Cid) ([]Message, error) `perm:"read"` ChainGetParentReceipts func(p0 context.Context, p1 cid.Cid) ([]*types.MessageReceipt, error) `perm:"read"` - ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) `perm:"read"` + ChainGetPath func(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*HeadChange, error) `perm:"read"` ChainGetRandomnessFromBeacon func(p0 context.Context, p1 types.TipSetKey, p2 crypto.DomainSeparationTag, p3 abi.ChainEpoch, p4 []byte) (abi.Randomness, error) `perm:"read"` @@ -140,47 +139,47 @@ type FullNodeStruct struct { ChainHead func(p0 context.Context) (*types.TipSet, error) `perm:"read"` - ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `perm:"read"` + ChainNotify func(p0 context.Context) (<-chan []*HeadChange, error) `perm:"read"` ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `perm:"read"` ChainSetHead func(p0 context.Context, p1 types.TipSetKey) error `perm:"admin"` - ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) `perm:"read"` + ChainStatObj func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (ObjStat, error) `perm:"read"` ChainTipSetWeight func(p0 context.Context, p1 types.TipSetKey) (types.BigInt, error) `perm:"read"` - ClientCalcCommP func(p0 context.Context, p1 string) (*api.CommPRet, error) `perm:"write"` + ClientCalcCommP func(p0 context.Context, p1 string) (*CommPRet, error) `perm:"write"` ClientCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` - ClientDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` + ClientDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` - ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) `perm:"read"` + ClientDealPieceCID func(p0 context.Context, p1 cid.Cid) (DataCIDSize, error) `perm:"read"` - ClientDealSize func(p0 context.Context, p1 cid.Cid) (api.DataSize, error) `perm:"read"` + ClientDealSize func(p0 context.Context, p1 cid.Cid) (DataSize, error) `perm:"read"` - ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) `perm:"read"` + ClientFindData func(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]QueryOffer, error) `perm:"read"` - ClientGenCar func(p0 context.Context, p1 api.FileRef, p2 string) error `perm:"write"` + ClientGenCar func(p0 context.Context, p1 FileRef, p2 string) error `perm:"write"` - ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) `perm:"read"` + ClientGetDealInfo func(p0 context.Context, p1 cid.Cid) (*DealInfo, error) `perm:"read"` ClientGetDealStatus func(p0 context.Context, p1 uint64) (string, error) `perm:"read"` - ClientGetDealUpdates func(p0 context.Context) (<-chan api.DealInfo, error) `perm:"write"` + ClientGetDealUpdates func(p0 context.Context) (<-chan DealInfo, error) `perm:"write"` ClientHasLocal func(p0 context.Context, p1 cid.Cid) (bool, error) `perm:"write"` - ClientImport func(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) `perm:"admin"` + ClientImport func(p0 context.Context, p1 FileRef) (*ImportRes, error) `perm:"admin"` - ClientListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"` + ClientListDataTransfers func(p0 context.Context) ([]DataTransferChannel, error) `perm:"write"` - ClientListDeals func(p0 context.Context) ([]api.DealInfo, error) `perm:"write"` + ClientListDeals func(p0 context.Context) ([]DealInfo, error) `perm:"write"` - ClientListImports func(p0 context.Context) ([]api.Import, error) `perm:"write"` + ClientListImports func(p0 context.Context) ([]Import, error) `perm:"write"` - ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) `perm:"read"` + ClientMinerQueryOffer func(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (QueryOffer, error) `perm:"read"` ClientQueryAsk func(p0 context.Context, p1 peer.ID, p2 address.Address) (*storagemarket.StorageAsk, error) `perm:"read"` @@ -188,13 +187,13 @@ type FullNodeStruct struct { ClientRestartDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` - ClientRetrieve func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error `perm:"admin"` + ClientRetrieve func(p0 context.Context, p1 RetrievalOrder, p2 *FileRef) error `perm:"admin"` ClientRetrieveTryRestartInsufficientFunds func(p0 context.Context, p1 address.Address) error `perm:"write"` - ClientRetrieveWithEvents func(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"` + ClientRetrieveWithEvents func(p0 context.Context, p1 RetrievalOrder, p2 *FileRef) (<-chan marketevents.RetrievalEvent, error) `perm:"admin"` - ClientStartDeal func(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) `perm:"admin"` + ClientStartDeal func(p0 context.Context, p1 *StartDealParams) (*cid.Cid, error) `perm:"admin"` CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` @@ -204,7 +203,7 @@ type FullNodeStruct struct { GasEstimateGasPremium func(p0 context.Context, p1 uint64, p2 address.Address, p3 int64, p4 types.TipSetKey) (types.BigInt, error) `perm:"read"` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `perm:"read"` MarketAddBalance func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` @@ -216,13 +215,13 @@ type FullNodeStruct struct { MarketWithdraw func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (cid.Cid, error) `perm:"sign"` - MinerCreateBlock func(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) `perm:"write"` + MinerCreateBlock func(p0 context.Context, p1 *BlockTemplate) (*types.BlockMsg, error) `perm:"write"` - MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) `perm:"read"` + MinerGetBaseInfo func(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*MiningBaseInfo, error) `perm:"read"` MpoolBatchPush func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` - MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` + MpoolBatchPushMessage func(p0 context.Context, p1 []*types.Message, p2 *MessageSendSpec) ([]*types.SignedMessage, error) `perm:"sign"` MpoolBatchPushUntrusted func(p0 context.Context, p1 []*types.SignedMessage) ([]cid.Cid, error) `perm:"write"` @@ -236,7 +235,7 @@ type FullNodeStruct struct { MpoolPush func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` - MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` + MpoolPushMessage func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec) (*types.SignedMessage, error) `perm:"sign"` MpoolPushUntrusted func(p0 context.Context, p1 *types.SignedMessage) (cid.Cid, error) `perm:"write"` @@ -244,7 +243,7 @@ type FullNodeStruct struct { MpoolSetConfig func(p0 context.Context, p1 *types.MpoolConfig) error `perm:"admin"` - MpoolSub func(p0 context.Context) (<-chan api.MpoolUpdate, error) `perm:"read"` + MpoolSub func(p0 context.Context) (<-chan MpoolUpdate, error) `perm:"read"` MsigAddApprove func(p0 context.Context, p1 address.Address, p2 address.Address, p3 uint64, p4 address.Address, p5 address.Address, p6 bool) (cid.Cid, error) `perm:"sign"` @@ -262,11 +261,11 @@ type FullNodeStruct struct { MsigGetAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `perm:"read"` + MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*MsigTransaction, error) `perm:"read"` MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) `perm:"read"` + MsigGetVestingSchedule func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MsigVesting, error) `perm:"read"` MsigPropose func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt, p4 address.Address, p5 uint64, p6 []byte) (cid.Cid, error) `perm:"sign"` @@ -280,23 +279,23 @@ type FullNodeStruct struct { PaychAllocateLane func(p0 context.Context, p1 address.Address) (uint64, error) `perm:"sign"` - PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFunds func(p0 context.Context, p1 address.Address) (*ChannelAvailableFunds, error) `perm:"sign"` - PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) `perm:"sign"` + PaychAvailableFundsByFromTo func(p0 context.Context, p1 address.Address, p2 address.Address) (*ChannelAvailableFunds, error) `perm:"sign"` PaychCollect func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) `perm:"sign"` + PaychGet func(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*ChannelInfo, error) `perm:"sign"` PaychGetWaitReady func(p0 context.Context, p1 cid.Cid) (address.Address, error) `perm:"sign"` PaychList func(p0 context.Context) ([]address.Address, error) `perm:"read"` - PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) `perm:"sign"` + PaychNewPayment func(p0 context.Context, p1 address.Address, p2 address.Address, p3 []VoucherSpec) (*PaymentInfo, error) `perm:"sign"` PaychSettle func(p0 context.Context, p1 address.Address) (cid.Cid, error) `perm:"sign"` - PaychStatus func(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) `perm:"read"` + PaychStatus func(p0 context.Context, p1 address.Address) (*PaychStatus, error) `perm:"read"` PaychVoucherAdd func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher, p3 []byte, p4 types.BigInt) (types.BigInt, error) `perm:"write"` @@ -304,7 +303,7 @@ type FullNodeStruct struct { PaychVoucherCheckValid func(p0 context.Context, p1 address.Address, p2 *paych.SignedVoucher) error `perm:"read"` - PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) `perm:"sign"` + PaychVoucherCreate func(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*VoucherCreateResult, error) `perm:"sign"` PaychVoucherList func(p0 context.Context, p1 address.Address) ([]*paych.SignedVoucher, error) `perm:"write"` @@ -312,17 +311,17 @@ type FullNodeStruct struct { StateAccountKey func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) `perm:"read"` + StateAllMinerFaults func(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*Fault, error) `perm:"read"` - StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) `perm:"read"` + StateCall func(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) `perm:"read"` StateChangedActors func(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (map[string]types.Actor, error) `perm:"read"` StateCirculatingSupply func(p0 context.Context, p1 types.TipSetKey) (abi.TokenAmount, error) `perm:"read"` - StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) `perm:"read"` + StateCompute func(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*ComputeStateOutput, error) `perm:"read"` - StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) `perm:"read"` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `perm:"read"` StateDecodeParams func(p0 context.Context, p1 address.Address, p2 abi.MethodNum, p3 []byte, p4 types.TipSetKey) (interface{}, error) `perm:"read"` @@ -332,25 +331,25 @@ type FullNodeStruct struct { StateListActors func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` - StateListMessages func(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` + StateListMessages func(p0 context.Context, p1 *MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) `perm:"read"` StateListMiners func(p0 context.Context, p1 types.TipSetKey) ([]address.Address, error) `perm:"read"` StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `perm:"read"` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `perm:"read"` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MarketBalance, error) `perm:"read"` - StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) `perm:"read"` + StateMarketDeals func(p0 context.Context, p1 types.TipSetKey) (map[string]MarketDeal, error) `perm:"read"` - StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) `perm:"read"` + StateMarketParticipants func(p0 context.Context, p1 types.TipSetKey) (map[string]MarketBalance, error) `perm:"read"` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `perm:"read"` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*MarketDeal, error) `perm:"read"` StateMinerActiveSectors func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` StateMinerAvailableBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (types.BigInt, error) `perm:"read"` - StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) `perm:"read"` + StateMinerDeadlines func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]Deadline, error) `perm:"read"` StateMinerFaults func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (bitfield.BitField, error) `perm:"read"` @@ -358,9 +357,9 @@ type FullNodeStruct struct { StateMinerInitialPledgeCollateral func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` - StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) `perm:"read"` + StateMinerPartitions func(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]Partition, error) `perm:"read"` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `perm:"read"` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*MinerPower, error) `perm:"read"` StateMinerPreCommitDepositForPower func(p0 context.Context, p1 address.Address, p2 miner.SectorPreCommitInfo, p3 types.TipSetKey) (types.BigInt, error) `perm:"read"` @@ -370,7 +369,7 @@ type FullNodeStruct struct { StateMinerSectorAllocated func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (bool, error) `perm:"read"` - StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) `perm:"read"` + StateMinerSectorCount func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MinerSectors, error) `perm:"read"` StateMinerSectors func(p0 context.Context, p1 address.Address, p2 *bitfield.BitField, p3 types.TipSetKey) ([]*miner.SectorOnChainInfo, error) `perm:"read"` @@ -378,13 +377,13 @@ type FullNodeStruct struct { StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `perm:"read"` - StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) `perm:"read"` + StateReadState func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) `perm:"read"` - StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) `perm:"read"` + StateReplay func(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*InvocResult, error) `perm:"read"` - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `perm:"read"` + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*MsgLookup, error) `perm:"read"` - StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + StateSearchMsgLimited func(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*MsgLookup, error) `perm:"read"` StateSectorExpiration func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorExpiration, error) `perm:"read"` @@ -394,7 +393,7 @@ type FullNodeStruct struct { StateSectorPreCommitInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (miner.SectorPreCommitOnChainInfo, error) `perm:"read"` - StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) `perm:"read"` + StateVMCirculatingSupplyInternal func(p0 context.Context, p1 types.TipSetKey) (CirculatingSupply, error) `perm:"read"` StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` @@ -402,9 +401,9 @@ type FullNodeStruct struct { StateVerifierStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `perm:"read"` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `perm:"read"` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*MsgLookup, error) `perm:"read"` - StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) `perm:"read"` + StateWaitMsgLimited func(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*MsgLookup, error) `perm:"read"` SyncCheckBad func(p0 context.Context, p1 cid.Cid) (string, error) `perm:"read"` @@ -414,7 +413,7 @@ type FullNodeStruct struct { SyncMarkBad func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` - SyncState func(p0 context.Context) (*api.SyncState, error) `perm:"read"` + SyncState func(p0 context.Context) (*SyncState, error) `perm:"read"` SyncSubmitBlock func(p0 context.Context, p1 *types.BlockMsg) error `perm:"write"` @@ -454,7 +453,7 @@ type FullNodeStruct struct { type GatewayStruct struct { Internal struct { - ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) `` + ChainGetBlockMessages func(p0 context.Context, p1 cid.Cid) (*BlockMessages, error) `` ChainGetMessage func(p0 context.Context, p1 cid.Cid) (*types.Message, error) `` @@ -466,23 +465,23 @@ type GatewayStruct struct { ChainHead func(p0 context.Context) (*types.TipSet, error) `` - ChainNotify func(p0 context.Context) (<-chan []*api.HeadChange, error) `` + ChainNotify func(p0 context.Context) (<-chan []*HeadChange, error) `` ChainReadObj func(p0 context.Context, p1 cid.Cid) ([]byte, error) `` - GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) `` + GasEstimateMessageGas func(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, 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) `` - MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) `` + MsigGetPending func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*MsigTransaction, error) `` MsigGetVested func(p0 context.Context, p1 address.Address, p2 types.TipSetKey, p3 types.TipSetKey) (types.BigInt, error) `` 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) `` + StateDealProviderCollateralBounds func(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) `` StateGetActor func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*types.Actor, error) `` @@ -492,31 +491,31 @@ type GatewayStruct struct { StateLookupID func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (address.Address, error) `` - StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) `` + StateMarketBalance func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MarketBalance, error) `` - StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) `` + StateMarketStorageDeal func(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*MarketDeal, error) `` StateMinerInfo func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (miner.MinerInfo, error) `` - StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) `` + StateMinerPower func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*MinerPower, error) `` StateMinerProvingDeadline func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*dline.Info, error) `` StateNetworkVersion func(p0 context.Context, p1 types.TipSetKey) (apitypes.NetworkVersion, error) `` - StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) `` + StateSearchMsg func(p0 context.Context, p1 cid.Cid) (*MsgLookup, error) `` StateSectorGetInfo func(p0 context.Context, p1 address.Address, p2 abi.SectorNumber, p3 types.TipSetKey) (*miner.SectorOnChainInfo, error) `` StateVerifiedClientStatus func(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*abi.StoragePower, error) `` - StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) `` + StateWaitMsg func(p0 context.Context, p1 cid.Cid, p2 uint64) (*MsgLookup, error) `` } } type SignableStruct struct { Internal struct { - Sign func(p0 context.Context, p1 api.SignFunc) error `` + Sign func(p0 context.Context, p1 SignFunc) error `` } } @@ -526,7 +525,7 @@ type StorageMinerStruct struct { Internal struct { ActorAddress func(p0 context.Context) (address.Address, error) `perm:"read"` - ActorAddressConfig func(p0 context.Context) (api.AddressConfig, error) `perm:"read"` + ActorAddressConfig func(p0 context.Context) (AddressConfig, error) `perm:"read"` ActorSectorSize func(p0 context.Context, p1 address.Address) (abi.SectorSize, error) `perm:"read"` @@ -548,7 +547,7 @@ type StorageMinerStruct struct { DealsImportData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"admin"` - DealsList func(p0 context.Context) ([]api.MarketDeal, error) `perm:"admin"` + DealsList func(p0 context.Context) ([]MarketDeal, error) `perm:"admin"` DealsPieceCidBlocklist func(p0 context.Context) ([]cid.Cid, error) `perm:"admin"` @@ -568,7 +567,7 @@ type StorageMinerStruct struct { MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` - MarketDataTransferUpdates func(p0 context.Context) (<-chan api.DataTransferChannel, error) `perm:"write"` + MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` MarketGetAsk func(p0 context.Context) (*storagemarket.SignedStorageAsk, error) `perm:"read"` @@ -578,15 +577,15 @@ type StorageMinerStruct struct { MarketImportDealData func(p0 context.Context, p1 cid.Cid, p2 string) error `perm:"write"` - MarketListDataTransfers func(p0 context.Context) ([]api.DataTransferChannel, error) `perm:"write"` + MarketListDataTransfers func(p0 context.Context) ([]DataTransferChannel, error) `perm:"write"` - MarketListDeals func(p0 context.Context) ([]api.MarketDeal, error) `perm:"read"` + MarketListDeals func(p0 context.Context) ([]MarketDeal, error) `perm:"read"` MarketListIncompleteDeals func(p0 context.Context) ([]storagemarket.MinerDeal, error) `perm:"read"` MarketListRetrievalDeals func(p0 context.Context) ([]retrievalmarket.ProviderDealState, error) `perm:"read"` - MarketPendingDeals func(p0 context.Context) (api.PendingDealInfo, error) `perm:"write"` + MarketPendingDeals func(p0 context.Context) (PendingDealInfo, error) `perm:"write"` MarketPublishPendingDeals func(p0 context.Context) error `perm:"admin"` @@ -656,15 +655,15 @@ type StorageMinerStruct struct { SectorsList func(p0 context.Context) ([]abi.SectorNumber, error) `perm:"read"` - SectorsListInStates func(p0 context.Context, p1 []api.SectorState) ([]abi.SectorNumber, error) `perm:"read"` + SectorsListInStates func(p0 context.Context, p1 []SectorState) ([]abi.SectorNumber, error) `perm:"read"` - SectorsRefs func(p0 context.Context) (map[string][]api.SealedRef, error) `perm:"read"` + SectorsRefs func(p0 context.Context) (map[string][]SealedRef, error) `perm:"read"` - SectorsStatus func(p0 context.Context, p1 abi.SectorNumber, p2 bool) (api.SectorInfo, error) `perm:"read"` + SectorsStatus func(p0 context.Context, p1 abi.SectorNumber, p2 bool) (SectorInfo, error) `perm:"read"` - SectorsSummary func(p0 context.Context) (map[api.SectorState]int, error) `perm:"read"` + SectorsSummary func(p0 context.Context) (map[SectorState]int, error) `perm:"read"` - SectorsUpdate func(p0 context.Context, p1 abi.SectorNumber, p2 api.SectorState) error `perm:"admin"` + SectorsUpdate func(p0 context.Context, p1 abi.SectorNumber, p2 SectorState) error `perm:"admin"` StorageAddLocal func(p0 context.Context, p1 string) error `perm:"admin"` @@ -714,7 +713,7 @@ type WalletStruct struct { WalletNew func(p0 context.Context, p1 types.KeyType) (address.Address, error) `` - WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 api.MsgMeta) (*crypto.Signature, error) `` + WalletSign func(p0 context.Context, p1 address.Address, p2 []byte, p3 MsgMeta) (*crypto.Signature, error) `` } } @@ -764,7 +763,7 @@ type WorkerStruct struct { UnsealPiece func(p0 context.Context, p1 storage.SectorRef, p2 storiface.UnpaddedByteIndex, p3 abi.UnpaddedPieceSize, p4 abi.SealRandomness, p5 cid.Cid) (storiface.CallID, error) `perm:"admin"` - Version func(p0 context.Context) (api.Version, error) `perm:"admin"` + Version func(p0 context.Context) (Version, error) `perm:"admin"` WaitQuiet func(p0 context.Context) error `perm:"admin"` } @@ -814,7 +813,7 @@ func (s *CommonStruct) NetAgentVersion(p0 context.Context, p1 peer.ID) (string, return s.Internal.NetAgentVersion(p0, p1) } -func (s *CommonStruct) NetAutoNatStatus(p0 context.Context) (api.NatInfo, error) { +func (s *CommonStruct) NetAutoNatStatus(p0 context.Context) (NatInfo, error) { return s.Internal.NetAutoNatStatus(p0) } @@ -830,15 +829,15 @@ func (s *CommonStruct) NetBandwidthStatsByProtocol(p0 context.Context) (map[prot return s.Internal.NetBandwidthStatsByProtocol(p0) } -func (s *CommonStruct) NetBlockAdd(p0 context.Context, p1 api.NetBlockList) error { +func (s *CommonStruct) NetBlockAdd(p0 context.Context, p1 NetBlockList) error { return s.Internal.NetBlockAdd(p0, p1) } -func (s *CommonStruct) NetBlockList(p0 context.Context) (api.NetBlockList, error) { +func (s *CommonStruct) NetBlockList(p0 context.Context) (NetBlockList, error) { return s.Internal.NetBlockList(p0) } -func (s *CommonStruct) NetBlockRemove(p0 context.Context, p1 api.NetBlockList) error { +func (s *CommonStruct) NetBlockRemove(p0 context.Context, p1 NetBlockList) error { return s.Internal.NetBlockRemove(p0, p1) } @@ -858,7 +857,7 @@ func (s *CommonStruct) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInf return s.Internal.NetFindPeer(p0, p1) } -func (s *CommonStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) { +func (s *CommonStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*ExtendedPeerInfo, error) { return s.Internal.NetPeerInfo(p0, p1) } @@ -866,7 +865,7 @@ func (s *CommonStruct) NetPeers(p0 context.Context) ([]peer.AddrInfo, error) { return s.Internal.NetPeers(p0) } -func (s *CommonStruct) NetPubsubScores(p0 context.Context) ([]api.PubsubScore, error) { +func (s *CommonStruct) NetPubsubScores(p0 context.Context) ([]PubsubScore, error) { return s.Internal.NetPubsubScores(p0) } @@ -878,7 +877,7 @@ func (s *CommonStruct) Shutdown(p0 context.Context) error { return s.Internal.Shutdown(p0) } -func (s *CommonStruct) Version(p0 context.Context) (api.APIVersion, error) { +func (s *CommonStruct) Version(p0 context.Context) (APIVersion, error) { return s.Internal.Version(p0) } @@ -898,7 +897,7 @@ func (s *FullNodeStruct) ChainGetBlock(p0 context.Context, p1 cid.Cid) (*types.B return s.Internal.ChainGetBlock(p0, p1) } -func (s *FullNodeStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) { +func (s *FullNodeStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } @@ -910,11 +909,11 @@ func (s *FullNodeStruct) ChainGetMessage(p0 context.Context, p1 cid.Cid) (*types return s.Internal.ChainGetMessage(p0, p1) } -func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*api.IpldObject, error) { +func (s *FullNodeStruct) ChainGetNode(p0 context.Context, p1 string) (*IpldObject, error) { return s.Internal.ChainGetNode(p0, p1) } -func (s *FullNodeStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]api.Message, error) { +func (s *FullNodeStruct) ChainGetParentMessages(p0 context.Context, p1 cid.Cid) ([]Message, error) { return s.Internal.ChainGetParentMessages(p0, p1) } @@ -922,7 +921,7 @@ func (s *FullNodeStruct) ChainGetParentReceipts(p0 context.Context, p1 cid.Cid) return s.Internal.ChainGetParentReceipts(p0, p1) } -func (s *FullNodeStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*api.HeadChange, error) { +func (s *FullNodeStruct) ChainGetPath(p0 context.Context, p1 types.TipSetKey, p2 types.TipSetKey) ([]*HeadChange, error) { return s.Internal.ChainGetPath(p0, p1, p2) } @@ -950,7 +949,7 @@ func (s *FullNodeStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } -func (s *FullNodeStruct) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, error) { +func (s *FullNodeStruct) ChainNotify(p0 context.Context) (<-chan []*HeadChange, error) { return s.Internal.ChainNotify(p0) } @@ -962,7 +961,7 @@ func (s *FullNodeStruct) ChainSetHead(p0 context.Context, p1 types.TipSetKey) er return s.Internal.ChainSetHead(p0, p1) } -func (s *FullNodeStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (api.ObjStat, error) { +func (s *FullNodeStruct) ChainStatObj(p0 context.Context, p1 cid.Cid, p2 cid.Cid) (ObjStat, error) { return s.Internal.ChainStatObj(p0, p1, p2) } @@ -970,7 +969,7 @@ func (s *FullNodeStruct) ChainTipSetWeight(p0 context.Context, p1 types.TipSetKe return s.Internal.ChainTipSetWeight(p0, p1) } -func (s *FullNodeStruct) ClientCalcCommP(p0 context.Context, p1 string) (*api.CommPRet, error) { +func (s *FullNodeStruct) ClientCalcCommP(p0 context.Context, p1 string) (*CommPRet, error) { return s.Internal.ClientCalcCommP(p0, p1) } @@ -978,27 +977,27 @@ func (s *FullNodeStruct) ClientCancelDataTransfer(p0 context.Context, p1 datatra return s.Internal.ClientCancelDataTransfer(p0, p1, p2, p3) } -func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { +func (s *FullNodeStruct) ClientDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { return s.Internal.ClientDataTransferUpdates(p0) } -func (s *FullNodeStruct) ClientDealPieceCID(p0 context.Context, p1 cid.Cid) (api.DataCIDSize, error) { +func (s *FullNodeStruct) ClientDealPieceCID(p0 context.Context, p1 cid.Cid) (DataCIDSize, error) { return s.Internal.ClientDealPieceCID(p0, p1) } -func (s *FullNodeStruct) ClientDealSize(p0 context.Context, p1 cid.Cid) (api.DataSize, error) { +func (s *FullNodeStruct) ClientDealSize(p0 context.Context, p1 cid.Cid) (DataSize, error) { return s.Internal.ClientDealSize(p0, p1) } -func (s *FullNodeStruct) ClientFindData(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]api.QueryOffer, error) { +func (s *FullNodeStruct) ClientFindData(p0 context.Context, p1 cid.Cid, p2 *cid.Cid) ([]QueryOffer, error) { return s.Internal.ClientFindData(p0, p1, p2) } -func (s *FullNodeStruct) ClientGenCar(p0 context.Context, p1 api.FileRef, p2 string) error { +func (s *FullNodeStruct) ClientGenCar(p0 context.Context, p1 FileRef, p2 string) error { return s.Internal.ClientGenCar(p0, p1, p2) } -func (s *FullNodeStruct) ClientGetDealInfo(p0 context.Context, p1 cid.Cid) (*api.DealInfo, error) { +func (s *FullNodeStruct) ClientGetDealInfo(p0 context.Context, p1 cid.Cid) (*DealInfo, error) { return s.Internal.ClientGetDealInfo(p0, p1) } @@ -1006,7 +1005,7 @@ func (s *FullNodeStruct) ClientGetDealStatus(p0 context.Context, p1 uint64) (str return s.Internal.ClientGetDealStatus(p0, p1) } -func (s *FullNodeStruct) ClientGetDealUpdates(p0 context.Context) (<-chan api.DealInfo, error) { +func (s *FullNodeStruct) ClientGetDealUpdates(p0 context.Context) (<-chan DealInfo, error) { return s.Internal.ClientGetDealUpdates(p0) } @@ -1014,23 +1013,23 @@ func (s *FullNodeStruct) ClientHasLocal(p0 context.Context, p1 cid.Cid) (bool, e return s.Internal.ClientHasLocal(p0, p1) } -func (s *FullNodeStruct) ClientImport(p0 context.Context, p1 api.FileRef) (*api.ImportRes, error) { +func (s *FullNodeStruct) ClientImport(p0 context.Context, p1 FileRef) (*ImportRes, error) { return s.Internal.ClientImport(p0, p1) } -func (s *FullNodeStruct) ClientListDataTransfers(p0 context.Context) ([]api.DataTransferChannel, error) { +func (s *FullNodeStruct) ClientListDataTransfers(p0 context.Context) ([]DataTransferChannel, error) { return s.Internal.ClientListDataTransfers(p0) } -func (s *FullNodeStruct) ClientListDeals(p0 context.Context) ([]api.DealInfo, error) { +func (s *FullNodeStruct) ClientListDeals(p0 context.Context) ([]DealInfo, error) { return s.Internal.ClientListDeals(p0) } -func (s *FullNodeStruct) ClientListImports(p0 context.Context) ([]api.Import, error) { +func (s *FullNodeStruct) ClientListImports(p0 context.Context) ([]Import, error) { return s.Internal.ClientListImports(p0) } -func (s *FullNodeStruct) ClientMinerQueryOffer(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (api.QueryOffer, error) { +func (s *FullNodeStruct) ClientMinerQueryOffer(p0 context.Context, p1 address.Address, p2 cid.Cid, p3 *cid.Cid) (QueryOffer, error) { return s.Internal.ClientMinerQueryOffer(p0, p1, p2, p3) } @@ -1046,7 +1045,7 @@ func (s *FullNodeStruct) ClientRestartDataTransfer(p0 context.Context, p1 datatr return s.Internal.ClientRestartDataTransfer(p0, p1, p2, p3) } -func (s *FullNodeStruct) ClientRetrieve(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) error { +func (s *FullNodeStruct) ClientRetrieve(p0 context.Context, p1 RetrievalOrder, p2 *FileRef) error { return s.Internal.ClientRetrieve(p0, p1, p2) } @@ -1054,11 +1053,11 @@ func (s *FullNodeStruct) ClientRetrieveTryRestartInsufficientFunds(p0 context.Co return s.Internal.ClientRetrieveTryRestartInsufficientFunds(p0, p1) } -func (s *FullNodeStruct) ClientRetrieveWithEvents(p0 context.Context, p1 api.RetrievalOrder, p2 *api.FileRef) (<-chan marketevents.RetrievalEvent, error) { +func (s *FullNodeStruct) ClientRetrieveWithEvents(p0 context.Context, p1 RetrievalOrder, p2 *FileRef) (<-chan marketevents.RetrievalEvent, error) { return s.Internal.ClientRetrieveWithEvents(p0, p1, p2) } -func (s *FullNodeStruct) ClientStartDeal(p0 context.Context, p1 *api.StartDealParams) (*cid.Cid, error) { +func (s *FullNodeStruct) ClientStartDeal(p0 context.Context, p1 *StartDealParams) (*cid.Cid, error) { return s.Internal.ClientStartDeal(p0, p1) } @@ -1078,7 +1077,7 @@ func (s *FullNodeStruct) GasEstimateGasPremium(p0 context.Context, p1 uint64, p2 return s.Internal.GasEstimateGasPremium(p0, p1, p2, p3, p4) } -func (s *FullNodeStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { +func (s *FullNodeStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -1102,11 +1101,11 @@ func (s *FullNodeStruct) MarketWithdraw(p0 context.Context, p1 address.Address, return s.Internal.MarketWithdraw(p0, p1, p2, p3) } -func (s *FullNodeStruct) MinerCreateBlock(p0 context.Context, p1 *api.BlockTemplate) (*types.BlockMsg, error) { +func (s *FullNodeStruct) MinerCreateBlock(p0 context.Context, p1 *BlockTemplate) (*types.BlockMsg, error) { return s.Internal.MinerCreateBlock(p0, p1) } -func (s *FullNodeStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*api.MiningBaseInfo, error) { +func (s *FullNodeStruct) MinerGetBaseInfo(p0 context.Context, p1 address.Address, p2 abi.ChainEpoch, p3 types.TipSetKey) (*MiningBaseInfo, error) { return s.Internal.MinerGetBaseInfo(p0, p1, p2, p3) } @@ -1114,7 +1113,7 @@ func (s *FullNodeStruct) MpoolBatchPush(p0 context.Context, p1 []*types.SignedMe return s.Internal.MpoolBatchPush(p0, p1) } -func (s *FullNodeStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *api.MessageSendSpec) ([]*types.SignedMessage, error) { +func (s *FullNodeStruct) MpoolBatchPushMessage(p0 context.Context, p1 []*types.Message, p2 *MessageSendSpec) ([]*types.SignedMessage, error) { return s.Internal.MpoolBatchPushMessage(p0, p1, p2) } @@ -1142,7 +1141,7 @@ func (s *FullNodeStruct) MpoolPush(p0 context.Context, p1 *types.SignedMessage) return s.Internal.MpoolPush(p0, p1) } -func (s *FullNodeStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec) (*types.SignedMessage, error) { +func (s *FullNodeStruct) MpoolPushMessage(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec) (*types.SignedMessage, error) { return s.Internal.MpoolPushMessage(p0, p1, p2) } @@ -1158,7 +1157,7 @@ func (s *FullNodeStruct) MpoolSetConfig(p0 context.Context, p1 *types.MpoolConfi return s.Internal.MpoolSetConfig(p0, p1) } -func (s *FullNodeStruct) MpoolSub(p0 context.Context) (<-chan api.MpoolUpdate, error) { +func (s *FullNodeStruct) MpoolSub(p0 context.Context) (<-chan MpoolUpdate, error) { return s.Internal.MpoolSub(p0) } @@ -1194,7 +1193,7 @@ func (s *FullNodeStruct) MsigGetAvailableBalance(p0 context.Context, p1 address. return s.Internal.MsigGetAvailableBalance(p0, p1, p2) } -func (s *FullNodeStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) { +func (s *FullNodeStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*MsigTransaction, error) { return s.Internal.MsigGetPending(p0, p1, p2) } @@ -1202,7 +1201,7 @@ func (s *FullNodeStruct) MsigGetVested(p0 context.Context, p1 address.Address, p return s.Internal.MsigGetVested(p0, p1, p2, p3) } -func (s *FullNodeStruct) MsigGetVestingSchedule(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MsigVesting, error) { +func (s *FullNodeStruct) MsigGetVestingSchedule(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MsigVesting, error) { return s.Internal.MsigGetVestingSchedule(p0, p1, p2) } @@ -1230,11 +1229,11 @@ func (s *FullNodeStruct) PaychAllocateLane(p0 context.Context, p1 address.Addres return s.Internal.PaychAllocateLane(p0, p1) } -func (s *FullNodeStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*api.ChannelAvailableFunds, error) { +func (s *FullNodeStruct) PaychAvailableFunds(p0 context.Context, p1 address.Address) (*ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFunds(p0, p1) } -func (s *FullNodeStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*api.ChannelAvailableFunds, error) { +func (s *FullNodeStruct) PaychAvailableFundsByFromTo(p0 context.Context, p1 address.Address, p2 address.Address) (*ChannelAvailableFunds, error) { return s.Internal.PaychAvailableFundsByFromTo(p0, p1, p2) } @@ -1242,7 +1241,7 @@ func (s *FullNodeStruct) PaychCollect(p0 context.Context, p1 address.Address) (c return s.Internal.PaychCollect(p0, p1) } -func (s *FullNodeStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*api.ChannelInfo, error) { +func (s *FullNodeStruct) PaychGet(p0 context.Context, p1 address.Address, p2 address.Address, p3 types.BigInt) (*ChannelInfo, error) { return s.Internal.PaychGet(p0, p1, p2, p3) } @@ -1254,7 +1253,7 @@ func (s *FullNodeStruct) PaychList(p0 context.Context) ([]address.Address, error return s.Internal.PaychList(p0) } -func (s *FullNodeStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []api.VoucherSpec) (*api.PaymentInfo, error) { +func (s *FullNodeStruct) PaychNewPayment(p0 context.Context, p1 address.Address, p2 address.Address, p3 []VoucherSpec) (*PaymentInfo, error) { return s.Internal.PaychNewPayment(p0, p1, p2, p3) } @@ -1262,7 +1261,7 @@ func (s *FullNodeStruct) PaychSettle(p0 context.Context, p1 address.Address) (ci return s.Internal.PaychSettle(p0, p1) } -func (s *FullNodeStruct) PaychStatus(p0 context.Context, p1 address.Address) (*api.PaychStatus, error) { +func (s *FullNodeStruct) PaychStatus(p0 context.Context, p1 address.Address) (*PaychStatus, error) { return s.Internal.PaychStatus(p0, p1) } @@ -1278,7 +1277,7 @@ func (s *FullNodeStruct) PaychVoucherCheckValid(p0 context.Context, p1 address.A return s.Internal.PaychVoucherCheckValid(p0, p1, p2) } -func (s *FullNodeStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*api.VoucherCreateResult, error) { +func (s *FullNodeStruct) PaychVoucherCreate(p0 context.Context, p1 address.Address, p2 types.BigInt, p3 uint64) (*VoucherCreateResult, error) { return s.Internal.PaychVoucherCreate(p0, p1, p2, p3) } @@ -1294,11 +1293,11 @@ func (s *FullNodeStruct) StateAccountKey(p0 context.Context, p1 address.Address, return s.Internal.StateAccountKey(p0, p1, p2) } -func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*api.Fault, error) { +func (s *FullNodeStruct) StateAllMinerFaults(p0 context.Context, p1 abi.ChainEpoch, p2 types.TipSetKey) ([]*Fault, error) { return s.Internal.StateAllMinerFaults(p0, p1, p2) } -func (s *FullNodeStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*api.InvocResult, error) { +func (s *FullNodeStruct) StateCall(p0 context.Context, p1 *types.Message, p2 types.TipSetKey) (*InvocResult, error) { return s.Internal.StateCall(p0, p1, p2) } @@ -1310,11 +1309,11 @@ func (s *FullNodeStruct) StateCirculatingSupply(p0 context.Context, p1 types.Tip return s.Internal.StateCirculatingSupply(p0, p1) } -func (s *FullNodeStruct) StateCompute(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*api.ComputeStateOutput, error) { +func (s *FullNodeStruct) StateCompute(p0 context.Context, p1 abi.ChainEpoch, p2 []*types.Message, p3 types.TipSetKey) (*ComputeStateOutput, error) { return s.Internal.StateCompute(p0, p1, p2, p3) } -func (s *FullNodeStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { +func (s *FullNodeStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } @@ -1334,7 +1333,7 @@ func (s *FullNodeStruct) StateListActors(p0 context.Context, p1 types.TipSetKey) return s.Internal.StateListActors(p0, p1) } -func (s *FullNodeStruct) StateListMessages(p0 context.Context, p1 *api.MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) { +func (s *FullNodeStruct) StateListMessages(p0 context.Context, p1 *MessageMatch, p2 types.TipSetKey, p3 abi.ChainEpoch) ([]cid.Cid, error) { return s.Internal.StateListMessages(p0, p1, p2, p3) } @@ -1346,19 +1345,19 @@ func (s *FullNodeStruct) StateLookupID(p0 context.Context, p1 address.Address, p return s.Internal.StateLookupID(p0, p1, p2) } -func (s *FullNodeStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) { +func (s *FullNodeStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketDeal, error) { +func (s *FullNodeStruct) StateMarketDeals(p0 context.Context, p1 types.TipSetKey) (map[string]MarketDeal, error) { return s.Internal.StateMarketDeals(p0, p1) } -func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]api.MarketBalance, error) { +func (s *FullNodeStruct) StateMarketParticipants(p0 context.Context, p1 types.TipSetKey) (map[string]MarketBalance, error) { return s.Internal.StateMarketParticipants(p0, p1) } -func (s *FullNodeStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) { +func (s *FullNodeStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } @@ -1370,7 +1369,7 @@ func (s *FullNodeStruct) StateMinerAvailableBalance(p0 context.Context, p1 addre return s.Internal.StateMinerAvailableBalance(p0, p1, p2) } -func (s *FullNodeStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]api.Deadline, error) { +func (s *FullNodeStruct) StateMinerDeadlines(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]Deadline, error) { return s.Internal.StateMinerDeadlines(p0, p1, p2) } @@ -1386,11 +1385,11 @@ func (s *FullNodeStruct) StateMinerInitialPledgeCollateral(p0 context.Context, p return s.Internal.StateMinerInitialPledgeCollateral(p0, p1, p2, p3) } -func (s *FullNodeStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]api.Partition, error) { +func (s *FullNodeStruct) StateMinerPartitions(p0 context.Context, p1 address.Address, p2 uint64, p3 types.TipSetKey) ([]Partition, error) { return s.Internal.StateMinerPartitions(p0, p1, p2, p3) } -func (s *FullNodeStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) { +func (s *FullNodeStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } @@ -1410,7 +1409,7 @@ func (s *FullNodeStruct) StateMinerSectorAllocated(p0 context.Context, p1 addres return s.Internal.StateMinerSectorAllocated(p0, p1, p2, p3) } -func (s *FullNodeStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MinerSectors, error) { +func (s *FullNodeStruct) StateMinerSectorCount(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MinerSectors, error) { return s.Internal.StateMinerSectorCount(p0, p1, p2) } @@ -1426,19 +1425,19 @@ func (s *FullNodeStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSet return s.Internal.StateNetworkVersion(p0, p1) } -func (s *FullNodeStruct) StateReadState(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.ActorState, error) { +func (s *FullNodeStruct) StateReadState(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*ActorState, error) { return s.Internal.StateReadState(p0, p1, p2) } -func (s *FullNodeStruct) StateReplay(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*api.InvocResult, error) { +func (s *FullNodeStruct) StateReplay(p0 context.Context, p1 types.TipSetKey, p2 cid.Cid) (*InvocResult, error) { return s.Internal.StateReplay(p0, p1, p2) } -func (s *FullNodeStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { +func (s *FullNodeStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1) } -func (s *FullNodeStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*api.MsgLookup, error) { +func (s *FullNodeStruct) StateSearchMsgLimited(p0 context.Context, p1 cid.Cid, p2 abi.ChainEpoch) (*MsgLookup, error) { return s.Internal.StateSearchMsgLimited(p0, p1, p2) } @@ -1458,7 +1457,7 @@ func (s *FullNodeStruct) StateSectorPreCommitInfo(p0 context.Context, p1 address return s.Internal.StateSectorPreCommitInfo(p0, p1, p2, p3) } -func (s *FullNodeStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (api.CirculatingSupply, error) { +func (s *FullNodeStruct) StateVMCirculatingSupplyInternal(p0 context.Context, p1 types.TipSetKey) (CirculatingSupply, error) { return s.Internal.StateVMCirculatingSupplyInternal(p0, p1) } @@ -1474,11 +1473,11 @@ func (s *FullNodeStruct) StateVerifierStatus(p0 context.Context, p1 address.Addr return s.Internal.StateVerifierStatus(p0, p1, p2) } -func (s *FullNodeStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) { +func (s *FullNodeStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2) } -func (s *FullNodeStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*api.MsgLookup, error) { +func (s *FullNodeStruct) StateWaitMsgLimited(p0 context.Context, p1 cid.Cid, p2 uint64, p3 abi.ChainEpoch) (*MsgLookup, error) { return s.Internal.StateWaitMsgLimited(p0, p1, p2, p3) } @@ -1498,7 +1497,7 @@ func (s *FullNodeStruct) SyncMarkBad(p0 context.Context, p1 cid.Cid) error { return s.Internal.SyncMarkBad(p0, p1) } -func (s *FullNodeStruct) SyncState(p0 context.Context) (*api.SyncState, error) { +func (s *FullNodeStruct) SyncState(p0 context.Context) (*SyncState, error) { return s.Internal.SyncState(p0) } @@ -1570,7 +1569,7 @@ func (s *FullNodeStruct) WalletVerify(p0 context.Context, p1 address.Address, p2 return s.Internal.WalletVerify(p0, p1, p2, p3) } -func (s *GatewayStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*api.BlockMessages, error) { +func (s *GatewayStruct) ChainGetBlockMessages(p0 context.Context, p1 cid.Cid) (*BlockMessages, error) { return s.Internal.ChainGetBlockMessages(p0, p1) } @@ -1594,7 +1593,7 @@ func (s *GatewayStruct) ChainHead(p0 context.Context) (*types.TipSet, error) { return s.Internal.ChainHead(p0) } -func (s *GatewayStruct) ChainNotify(p0 context.Context) (<-chan []*api.HeadChange, error) { +func (s *GatewayStruct) ChainNotify(p0 context.Context) (<-chan []*HeadChange, error) { return s.Internal.ChainNotify(p0) } @@ -1602,7 +1601,7 @@ func (s *GatewayStruct) ChainReadObj(p0 context.Context, p1 cid.Cid) ([]byte, er return s.Internal.ChainReadObj(p0, p1) } -func (s *GatewayStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *api.MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { +func (s *GatewayStruct) GasEstimateMessageGas(p0 context.Context, p1 *types.Message, p2 *MessageSendSpec, p3 types.TipSetKey) (*types.Message, error) { return s.Internal.GasEstimateMessageGas(p0, p1, p2, p3) } @@ -1614,7 +1613,7 @@ func (s *GatewayStruct) MsigGetAvailableBalance(p0 context.Context, p1 address.A return s.Internal.MsigGetAvailableBalance(p0, p1, p2) } -func (s *GatewayStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*api.MsigTransaction, error) { +func (s *GatewayStruct) MsigGetPending(p0 context.Context, p1 address.Address, p2 types.TipSetKey) ([]*MsigTransaction, error) { return s.Internal.MsigGetPending(p0, p1, p2) } @@ -1626,7 +1625,7 @@ func (s *GatewayStruct) StateAccountKey(p0 context.Context, p1 address.Address, return s.Internal.StateAccountKey(p0, p1, p2) } -func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (api.DealCollateralBounds, error) { +func (s *GatewayStruct) StateDealProviderCollateralBounds(p0 context.Context, p1 abi.PaddedPieceSize, p2 bool, p3 types.TipSetKey) (DealCollateralBounds, error) { return s.Internal.StateDealProviderCollateralBounds(p0, p1, p2, p3) } @@ -1646,11 +1645,11 @@ func (s *GatewayStruct) StateLookupID(p0 context.Context, p1 address.Address, p2 return s.Internal.StateLookupID(p0, p1, p2) } -func (s *GatewayStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (api.MarketBalance, error) { +func (s *GatewayStruct) StateMarketBalance(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (MarketBalance, error) { return s.Internal.StateMarketBalance(p0, p1, p2) } -func (s *GatewayStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*api.MarketDeal, error) { +func (s *GatewayStruct) StateMarketStorageDeal(p0 context.Context, p1 abi.DealID, p2 types.TipSetKey) (*MarketDeal, error) { return s.Internal.StateMarketStorageDeal(p0, p1, p2) } @@ -1658,7 +1657,7 @@ func (s *GatewayStruct) StateMinerInfo(p0 context.Context, p1 address.Address, p return s.Internal.StateMinerInfo(p0, p1, p2) } -func (s *GatewayStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*api.MinerPower, error) { +func (s *GatewayStruct) StateMinerPower(p0 context.Context, p1 address.Address, p2 types.TipSetKey) (*MinerPower, error) { return s.Internal.StateMinerPower(p0, p1, p2) } @@ -1670,7 +1669,7 @@ func (s *GatewayStruct) StateNetworkVersion(p0 context.Context, p1 types.TipSetK return s.Internal.StateNetworkVersion(p0, p1) } -func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*api.MsgLookup, error) { +func (s *GatewayStruct) StateSearchMsg(p0 context.Context, p1 cid.Cid) (*MsgLookup, error) { return s.Internal.StateSearchMsg(p0, p1) } @@ -1682,11 +1681,11 @@ func (s *GatewayStruct) StateVerifiedClientStatus(p0 context.Context, p1 address return s.Internal.StateVerifiedClientStatus(p0, p1, p2) } -func (s *GatewayStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*api.MsgLookup, error) { +func (s *GatewayStruct) StateWaitMsg(p0 context.Context, p1 cid.Cid, p2 uint64) (*MsgLookup, error) { return s.Internal.StateWaitMsg(p0, p1, p2) } -func (s *SignableStruct) Sign(p0 context.Context, p1 api.SignFunc) error { +func (s *SignableStruct) Sign(p0 context.Context, p1 SignFunc) error { return s.Internal.Sign(p0, p1) } @@ -1694,7 +1693,7 @@ func (s *StorageMinerStruct) ActorAddress(p0 context.Context) (address.Address, return s.Internal.ActorAddress(p0) } -func (s *StorageMinerStruct) ActorAddressConfig(p0 context.Context) (api.AddressConfig, error) { +func (s *StorageMinerStruct) ActorAddressConfig(p0 context.Context) (AddressConfig, error) { return s.Internal.ActorAddressConfig(p0) } @@ -1738,7 +1737,7 @@ func (s *StorageMinerStruct) DealsImportData(p0 context.Context, p1 cid.Cid, p2 return s.Internal.DealsImportData(p0, p1, p2) } -func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]api.MarketDeal, error) { +func (s *StorageMinerStruct) DealsList(p0 context.Context) ([]MarketDeal, error) { return s.Internal.DealsList(p0) } @@ -1778,7 +1777,7 @@ func (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 dat return s.Internal.MarketCancelDataTransfer(p0, p1, p2, p3) } -func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan api.DataTransferChannel, error) { +func (s *StorageMinerStruct) MarketDataTransferUpdates(p0 context.Context) (<-chan DataTransferChannel, error) { return s.Internal.MarketDataTransferUpdates(p0) } @@ -1798,11 +1797,11 @@ func (s *StorageMinerStruct) MarketImportDealData(p0 context.Context, p1 cid.Cid return s.Internal.MarketImportDealData(p0, p1, p2) } -func (s *StorageMinerStruct) MarketListDataTransfers(p0 context.Context) ([]api.DataTransferChannel, error) { +func (s *StorageMinerStruct) MarketListDataTransfers(p0 context.Context) ([]DataTransferChannel, error) { return s.Internal.MarketListDataTransfers(p0) } -func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]api.MarketDeal, error) { +func (s *StorageMinerStruct) MarketListDeals(p0 context.Context) ([]MarketDeal, error) { return s.Internal.MarketListDeals(p0) } @@ -1814,7 +1813,7 @@ func (s *StorageMinerStruct) MarketListRetrievalDeals(p0 context.Context) ([]ret return s.Internal.MarketListRetrievalDeals(p0) } -func (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (api.PendingDealInfo, error) { +func (s *StorageMinerStruct) MarketPendingDeals(p0 context.Context) (PendingDealInfo, error) { return s.Internal.MarketPendingDeals(p0) } @@ -1954,23 +1953,23 @@ func (s *StorageMinerStruct) SectorsList(p0 context.Context) ([]abi.SectorNumber return s.Internal.SectorsList(p0) } -func (s *StorageMinerStruct) SectorsListInStates(p0 context.Context, p1 []api.SectorState) ([]abi.SectorNumber, error) { +func (s *StorageMinerStruct) SectorsListInStates(p0 context.Context, p1 []SectorState) ([]abi.SectorNumber, error) { return s.Internal.SectorsListInStates(p0, p1) } -func (s *StorageMinerStruct) SectorsRefs(p0 context.Context) (map[string][]api.SealedRef, error) { +func (s *StorageMinerStruct) SectorsRefs(p0 context.Context) (map[string][]SealedRef, error) { return s.Internal.SectorsRefs(p0) } -func (s *StorageMinerStruct) SectorsStatus(p0 context.Context, p1 abi.SectorNumber, p2 bool) (api.SectorInfo, error) { +func (s *StorageMinerStruct) SectorsStatus(p0 context.Context, p1 abi.SectorNumber, p2 bool) (SectorInfo, error) { return s.Internal.SectorsStatus(p0, p1, p2) } -func (s *StorageMinerStruct) SectorsSummary(p0 context.Context) (map[api.SectorState]int, error) { +func (s *StorageMinerStruct) SectorsSummary(p0 context.Context) (map[SectorState]int, error) { return s.Internal.SectorsSummary(p0) } -func (s *StorageMinerStruct) SectorsUpdate(p0 context.Context, p1 abi.SectorNumber, p2 api.SectorState) error { +func (s *StorageMinerStruct) SectorsUpdate(p0 context.Context, p1 abi.SectorNumber, p2 SectorState) error { return s.Internal.SectorsUpdate(p0, p1, p2) } @@ -2062,7 +2061,7 @@ func (s *WalletStruct) WalletNew(p0 context.Context, p1 types.KeyType) (address. return s.Internal.WalletNew(p0, p1) } -func (s *WalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 api.MsgMeta) (*crypto.Signature, error) { +func (s *WalletStruct) WalletSign(p0 context.Context, p1 address.Address, p2 []byte, p3 MsgMeta) (*crypto.Signature, error) { return s.Internal.WalletSign(p0, p1, p2, p3) } @@ -2154,7 +2153,7 @@ func (s *WorkerStruct) UnsealPiece(p0 context.Context, p1 storage.SectorRef, p2 return s.Internal.UnsealPiece(p0, p1, p2, p3, p4, p5) } -func (s *WorkerStruct) Version(p0 context.Context) (api.Version, error) { +func (s *WorkerStruct) Version(p0 context.Context) (Version, error) { return s.Internal.Version(p0) } diff --git a/api/v0api/common.go b/api/v0api/common.go deleted file mode 100644 index 6848fa6a8..000000000 --- a/api/v0api/common.go +++ /dev/null @@ -1,77 +0,0 @@ -package v0api - -import ( - "context" - - "github.com/filecoin-project/lotus/api" - - "github.com/google/uuid" - - "github.com/filecoin-project/go-jsonrpc/auth" - metrics "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" - - apitypes "github.com/filecoin-project/lotus/api/types" -) - -type Common interface { - - // MethodGroup: Auth - - AuthVerify(ctx context.Context, token string) ([]auth.Permission, error) //perm:read - AuthNew(ctx context.Context, perms []auth.Permission) ([]byte, error) //perm:admin - - // MethodGroup: Net - - NetConnectedness(context.Context, peer.ID) (network.Connectedness, error) //perm:read - NetPeers(context.Context) ([]peer.AddrInfo, error) //perm:read - NetConnect(context.Context, peer.AddrInfo) error //perm:write - NetAddrsListen(context.Context) (peer.AddrInfo, error) //perm:read - NetDisconnect(context.Context, peer.ID) error //perm:write - NetFindPeer(context.Context, peer.ID) (peer.AddrInfo, error) //perm:read - NetPubsubScores(context.Context) ([]api.PubsubScore, error) //perm:read - NetAutoNatStatus(context.Context) (api.NatInfo, error) //perm:read - NetAgentVersion(ctx context.Context, p peer.ID) (string, error) //perm:read - NetPeerInfo(context.Context, peer.ID) (*api.ExtendedPeerInfo, error) //perm:read - - // NetBandwidthStats returns statistics about the nodes total bandwidth - // usage and current rate across all peers and protocols. - NetBandwidthStats(ctx context.Context) (metrics.Stats, error) //perm:read - - // NetBandwidthStatsByPeer returns statistics about the nodes bandwidth - // usage and current rate per peer - NetBandwidthStatsByPeer(ctx context.Context) (map[string]metrics.Stats, error) //perm:read - - // NetBandwidthStatsByProtocol returns statistics about the nodes bandwidth - // usage and current rate per protocol - NetBandwidthStatsByProtocol(ctx context.Context) (map[protocol.ID]metrics.Stats, error) //perm:read - - // ConnectionGater API - NetBlockAdd(ctx context.Context, acl api.NetBlockList) error //perm:admin - NetBlockRemove(ctx context.Context, acl api.NetBlockList) error //perm:admin - NetBlockList(ctx context.Context) (api.NetBlockList, error) //perm:read - - // MethodGroup: Common - - // Discover returns an OpenRPC document describing an RPC API. - Discover(ctx context.Context) (apitypes.OpenRPCDocument, error) //perm:read - - // ID returns peerID of libp2p node backing this API - ID(context.Context) (peer.ID, error) //perm:read - - // Version provides information about API provider - Version(context.Context) (api.APIVersion, error) //perm:read - - LogList(context.Context) ([]string, error) //perm:write - LogSetLevel(context.Context, string, string) error //perm:write - - // trigger graceful shutdown - Shutdown(context.Context) error //perm:admin - - // Session returns a random UUID of api provider session - Session(context.Context) (uuid.UUID, error) //perm:read - - Closing(context.Context) (<-chan struct{}, error) //perm:read -} diff --git a/api/v0api/latest.go b/api/v0api/latest.go new file mode 100644 index 000000000..9e29f948d --- /dev/null +++ b/api/v0api/latest.go @@ -0,0 +1,24 @@ +package v0api + +import ( + "github.com/filecoin-project/lotus/api" +) + +type Common = api.Common +type CommonStruct = api.CommonStruct + +type Gateway = api.Gateway + +type StorageMiner = api.StorageMiner +type StorageMinerStruct = api.StorageMinerStruct + +type Worker = api.Worker +type WorkerStruct = api.WorkerStruct + +func PermissionedStorMinerAPI(a StorageMiner) StorageMiner { + return api.PermissionedStorMinerAPI(a) +} + +func PermissionedWorkerAPI(a Worker) Worker { + return api.PermissionedWorkerAPI(a) +} diff --git a/api/v0api/permissioned.go b/api/v0api/permissioned.go new file mode 100644 index 000000000..ad64bc29e --- /dev/null +++ b/api/v0api/permissioned.go @@ -0,0 +1,13 @@ +package v0api + +import ( + "github.com/filecoin-project/go-jsonrpc/auth" + "github.com/filecoin-project/lotus/api" +) + +func PermissionedFullAPI(a FullNode) FullNode { + var out FullNodeStruct + auth.PermissionedProxy(api.AllPermissions, api.DefaultPerms, a, &out.Internal) + auth.PermissionedProxy(api.AllPermissions, api.DefaultPerms, a, &out.CommonStruct.Internal) + return &out +} diff --git a/api/v0api/storage.go b/api/v0api/storage.go deleted file mode 100644 index a05f48285..000000000 --- a/api/v0api/storage.go +++ /dev/null @@ -1,9 +0,0 @@ -package v0api - -import ( - "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" -) - -type StorageMiner = api.StorageMiner -type StorageMinerStruct = apistruct.StorageMinerStruct diff --git a/api/v0api/struct.go b/api/v0api/struct.go index e5550814f..0a7fb97dc 100644 --- a/api/v0api/struct.go +++ b/api/v0api/struct.go @@ -9,7 +9,6 @@ import ( "github.com/filecoin-project/go-bitfield" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-multistore" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/crypto" @@ -21,70 +20,10 @@ import ( "github.com/filecoin-project/lotus/chain/types" marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/google/uuid" "github.com/ipfs/go-cid" - metrics "github.com/libp2p/go-libp2p-core/metrics" - "github.com/libp2p/go-libp2p-core/network" "github.com/libp2p/go-libp2p-core/peer" - protocol "github.com/libp2p/go-libp2p-core/protocol" ) -type CommonStruct struct { - Internal struct { - AuthNew func(p0 context.Context, p1 []auth.Permission) ([]byte, error) `perm:"admin"` - - AuthVerify func(p0 context.Context, p1 string) ([]auth.Permission, error) `perm:"read"` - - Closing func(p0 context.Context) (<-chan struct{}, error) `perm:"read"` - - Discover func(p0 context.Context) (apitypes.OpenRPCDocument, error) `perm:"read"` - - ID func(p0 context.Context) (peer.ID, error) `perm:"read"` - - LogList func(p0 context.Context) ([]string, error) `perm:"write"` - - LogSetLevel func(p0 context.Context, p1 string, p2 string) error `perm:"write"` - - NetAddrsListen func(p0 context.Context) (peer.AddrInfo, error) `perm:"read"` - - NetAgentVersion func(p0 context.Context, p1 peer.ID) (string, error) `perm:"read"` - - NetAutoNatStatus func(p0 context.Context) (api.NatInfo, error) `perm:"read"` - - NetBandwidthStats func(p0 context.Context) (metrics.Stats, error) `perm:"read"` - - NetBandwidthStatsByPeer func(p0 context.Context) (map[string]metrics.Stats, error) `perm:"read"` - - NetBandwidthStatsByProtocol func(p0 context.Context) (map[protocol.ID]metrics.Stats, error) `perm:"read"` - - NetBlockAdd func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` - - NetBlockList func(p0 context.Context) (api.NetBlockList, error) `perm:"read"` - - NetBlockRemove func(p0 context.Context, p1 api.NetBlockList) error `perm:"admin"` - - NetConnect func(p0 context.Context, p1 peer.AddrInfo) error `perm:"write"` - - NetConnectedness func(p0 context.Context, p1 peer.ID) (network.Connectedness, error) `perm:"read"` - - NetDisconnect func(p0 context.Context, p1 peer.ID) error `perm:"write"` - - NetFindPeer func(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) `perm:"read"` - - NetPeerInfo func(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) `perm:"read"` - - NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` - - NetPubsubScores func(p0 context.Context) ([]api.PubsubScore, error) `perm:"read"` - - Session func(p0 context.Context) (uuid.UUID, error) `perm:"read"` - - Shutdown func(p0 context.Context) error `perm:"admin"` - - Version func(p0 context.Context) (api.APIVersion, error) `perm:"read"` - } -} - type FullNodeStruct struct { CommonStruct @@ -435,110 +374,6 @@ type FullNodeStruct struct { } } -func (s *CommonStruct) AuthNew(p0 context.Context, p1 []auth.Permission) ([]byte, error) { - return s.Internal.AuthNew(p0, p1) -} - -func (s *CommonStruct) AuthVerify(p0 context.Context, p1 string) ([]auth.Permission, error) { - return s.Internal.AuthVerify(p0, p1) -} - -func (s *CommonStruct) Closing(p0 context.Context) (<-chan struct{}, error) { - return s.Internal.Closing(p0) -} - -func (s *CommonStruct) Discover(p0 context.Context) (apitypes.OpenRPCDocument, error) { - return s.Internal.Discover(p0) -} - -func (s *CommonStruct) ID(p0 context.Context) (peer.ID, error) { - return s.Internal.ID(p0) -} - -func (s *CommonStruct) LogList(p0 context.Context) ([]string, error) { - return s.Internal.LogList(p0) -} - -func (s *CommonStruct) LogSetLevel(p0 context.Context, p1 string, p2 string) error { - return s.Internal.LogSetLevel(p0, p1, p2) -} - -func (s *CommonStruct) NetAddrsListen(p0 context.Context) (peer.AddrInfo, error) { - return s.Internal.NetAddrsListen(p0) -} - -func (s *CommonStruct) NetAgentVersion(p0 context.Context, p1 peer.ID) (string, error) { - return s.Internal.NetAgentVersion(p0, p1) -} - -func (s *CommonStruct) NetAutoNatStatus(p0 context.Context) (api.NatInfo, error) { - return s.Internal.NetAutoNatStatus(p0) -} - -func (s *CommonStruct) NetBandwidthStats(p0 context.Context) (metrics.Stats, error) { - return s.Internal.NetBandwidthStats(p0) -} - -func (s *CommonStruct) NetBandwidthStatsByPeer(p0 context.Context) (map[string]metrics.Stats, error) { - return s.Internal.NetBandwidthStatsByPeer(p0) -} - -func (s *CommonStruct) NetBandwidthStatsByProtocol(p0 context.Context) (map[protocol.ID]metrics.Stats, error) { - return s.Internal.NetBandwidthStatsByProtocol(p0) -} - -func (s *CommonStruct) NetBlockAdd(p0 context.Context, p1 api.NetBlockList) error { - return s.Internal.NetBlockAdd(p0, p1) -} - -func (s *CommonStruct) NetBlockList(p0 context.Context) (api.NetBlockList, error) { - return s.Internal.NetBlockList(p0) -} - -func (s *CommonStruct) NetBlockRemove(p0 context.Context, p1 api.NetBlockList) error { - return s.Internal.NetBlockRemove(p0, p1) -} - -func (s *CommonStruct) NetConnect(p0 context.Context, p1 peer.AddrInfo) error { - return s.Internal.NetConnect(p0, p1) -} - -func (s *CommonStruct) NetConnectedness(p0 context.Context, p1 peer.ID) (network.Connectedness, error) { - return s.Internal.NetConnectedness(p0, p1) -} - -func (s *CommonStruct) NetDisconnect(p0 context.Context, p1 peer.ID) error { - return s.Internal.NetDisconnect(p0, p1) -} - -func (s *CommonStruct) NetFindPeer(p0 context.Context, p1 peer.ID) (peer.AddrInfo, error) { - return s.Internal.NetFindPeer(p0, p1) -} - -func (s *CommonStruct) NetPeerInfo(p0 context.Context, p1 peer.ID) (*api.ExtendedPeerInfo, error) { - return s.Internal.NetPeerInfo(p0, p1) -} - -func (s *CommonStruct) NetPeers(p0 context.Context) ([]peer.AddrInfo, error) { - return s.Internal.NetPeers(p0) -} - -func (s *CommonStruct) NetPubsubScores(p0 context.Context) ([]api.PubsubScore, error) { - return s.Internal.NetPubsubScores(p0) -} - -func (s *CommonStruct) Session(p0 context.Context) (uuid.UUID, error) { - return s.Internal.Session(p0) -} - -func (s *CommonStruct) Shutdown(p0 context.Context) error { - return s.Internal.Shutdown(p0) -} - -func (s *CommonStruct) Version(p0 context.Context) (api.APIVersion, error) { - return s.Internal.Version(p0) -} - func (s *FullNodeStruct) BeaconGetEntry(p0 context.Context, p1 abi.ChainEpoch) (*types.BeaconEntry, error) { return s.Internal.BeaconGetEntry(p0, p1) } @@ -1227,5 +1062,4 @@ func (s *FullNodeStruct) WalletVerify(p0 context.Context, p1 address.Address, p2 return s.Internal.WalletVerify(p0, p1, p2, p3) } -var _ Common = new(CommonStruct) var _ FullNode = new(FullNodeStruct) diff --git a/api/v1api/latest.go b/api/v1api/latest.go index eb67e1e36..6f57d8826 100644 --- a/api/v1api/latest.go +++ b/api/v1api/latest.go @@ -2,8 +2,11 @@ package v1api import ( "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" ) type FullNode = api.FullNode -type FullNodeStruct = apistruct.FullNodeStruct +type FullNodeStruct = api.FullNodeStruct + +func PermissionedFullAPI(a FullNode) FullNode { + return api.PermissionedFullAPI(a) +} diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..6225a04aaee0d4f139b65efc61d021589a4e9f48 100644 GIT binary patch literal 22496 zcmV)=K!m>^iwFP!00000|LpyFbK5w!KMubYl%792Nhxl}cG4YJO+Dp3z8xnX+ez+B zl>2Rnge0^nfDM3_)v3JqUt!_C2&803w$U{;u}Eyha?a;0IOlthhKR7x>+SYlZES74 z>GgYNq4)WEXg`2>mM4(%-aiIV0gYXrAL%eY?ftVbH)SEm9&t8amh`8xoRqX@B z7-i4F_W>CQhD5{&;2WnzAVy%YQR+xG{Cq%u49K5<{@LsIcr=|tHt+5B@H@M`nb=Bsc0o?N)z z?$@}PZ$J7yhW?H)Lw;{pun5V9LxwykOqE4yJ})!W z@4X8e5x=*)v(@h%LIHcbz5kG4^S_t-6Oa7Q1pWJ8|LVyxLEl$X4TEz=L&OA@_0^F3 zy)g6WyJ_ZoZ;E`Z{up8c+5Cuj)W>8jmkx6DW=9@3Jw-h(n0)i29}lNu4NOt<`^S%T ze(CTpZwo2&+Q2olV}JSno@y4fXQ{Q--}q#+wDz+2>I@>zm8Rr z4UbNLjSt7mkWo3VUjs>bejNsM`0EsMf!MDw#J_U2l{d!p|M&j)-*@EqlnIX7tA{8+ z0(~6*)tcbstJe`65BnPj*nh5xN*zrpwN+13@rH3sE<7GY&OB(1YqK0xhG{G(^j z&jBPpfZ$A)nm|6;$Wx#1y|Dv~lhtZr) z!@q{p5t@&-cSd+Sn!kx6w6k@yqmF!hyv*V3PQE@wK~OzeCVRY!PNCcCg@h$0hTKK|SFi^5pg}pYRQL#2@PsFK@V7 zgpw;_gHX;eL9Dmi8*RSY+TQ8)dso=IMymJE7suy}(orR9>GzHTkfE zh~Dno{-Vk$lv21xlBK?E;GA9xQ%^rThfMCA{Le24k0+wH+uQ8*d+*E-1q|a7mjViO zL8n|sdHcpfGE8XSQW9d^iiM<@E8j{=%yeQYEygtx zsc{-V;DRzqE{KvCGa{s{wlN?B@_`Dp3r6G{=UODx7PO6T8wDn}sb?E@zw@n`c^pX=jRSu=wZ?s5AB?Z*5>% z3b%|pH~AGS4>uR$u*b7Gn_NOpP%JBT-kheswJF(@x812}^NUpjrYv9x`U*QFzl**i zsb1jV^e~aL2gH*t88KZ@hMb}K@ydg_?N~>5($_YGCt>nCTN+%Xre=-p(%%N;$btq@ zCe7m{8Elcvq&dgLktK+14 zktHKN4Fmt9nnznMYTB)5p)2BYW+U2AOH&rysNJ_x%AU?onXKpDS%S&cxv6{{{?*(4 z-j<4*A+*zL=&owI(bHKcv^|1T`f98Bl;-UOozH8&nZ+3R>$jHhx75L66r8WpWFZSx z$=DJ_M;Zf{ZDtMvKTZgo?8egcX5TC(l2W$*){hmXUt1}tI?=Xn>eVH?YEpA$C}w7X zw5sa?6VU~J2Aa|&eoD&`(YP5KBAOS@OwD#AHPf9fNsX%{B$dSvMwF%WwSutfOKnBM z3a%z7ZNqph1egocfuva+P=a0x`jQf)4fcvgPxI70CSvMFoS-%ADXFiW2h<=AuJy z%l`w-`ykvZKGXF59fJPB1d=vDS#>MBkmuei7{Eq|d=;G53?e}2`&e-F}wzfE_x z#ouHr+`{4Q?S$QUlN;3g@$GI*K4BG<_qJTBX23DmlD*1qnz>h1BNFXKTyrU|_Ix(x~AFxxwMC4(%vsRSMs;iXK^2DTaqI0i1aJw#xP@3__ z#HSXR@$y7gU*+nq;;L-z0dcBy#LKWM(@G7m(!Mv2RXJAWSe0W{j#VYBYI}h#yT)_Y zmN)6@mdvQD!*SBdVq=RgnsYfenzovNK*``7xA+-~8t1=#x2J!B5mwLa{@hH>a#SF0 z#xAC4jsAWK0+H$8PLrRn1_Da2IT%9kS^>%AmUVn-Iw2rB-sphju7ML8-_Wiu-_JD& z2|$nq7%}~JK;p~Ou~Bw)^yq=%7pM7l1a)l*>Q0mO^Bv@!1ElJ@i~U!Ilm=F0F==oC zXwv0?H$f`8#0bDNR3bpPn5XU~?t;scasH6otTeOc;bNj8d&-PP)1pUr@$W*p*q#VwL zorg`@<^o=13Yt5ZI1GFhubbOl!c<##KvMpssBYqK31>i#c!g?V$F zu*U%$(n#yX#tep&0yqDK4*&W^Ytw!iLXLh>DyD$bl*g--Jz54$?kvdmlZb;5_;@rL zkRcK?WJ-z|1$wJGmj5_dezUpRt;~9XF+*uelbb%b5&JIjKPJ+}drYLvx3ksq0<@`T zbMHfU_OwD0ylGNxXgu>}3F}a{1$#5GezK3pr^Jp`6}njf8MCEZ7{^E!us@R2v z8ne`J!!gd61s)8%C{UbKo?ZP=TXEBKEGKbghj=}rmBe#fRR9~<%+EFuA zcjlV0eJ5@iW>M`(;H#~}?LR2}a`MmZKY#r9KR4*z|BCSB%^qi;{%7C&a{F%o_;TwV zKcXjBx9sfw%^&|OM%{I*|407>ai+9GFz`S!TEPKKvh6+cMKw`sq&#`_*RZPAFI9X0xZOvbr5jZAVZ| zyNifvTr^8d8G-@u)&IqG)RD}`OfqZfRmB17=RB0s;c@Vc5(Gjc zcRqLa%SS=!8l~wMPkd?2P0khif~DuF!XqsA@{R-5F;*G>=M0l`hP@8a(>o>@R@Kgt zMb-QV?CDL?zC#1*D{*@V#9x&d=p4?chzLcwZ*)KhKoN~gqQ2=X>ey}htyK z?-Suju1bdu^~j@2y=~N#pCEDoyK2XE+Vn1$XuY19UE=)x+m5;Ju8 zVDCbqiwaA&e7rg^VZP5Ai;GFJw~Z~V-#g_8dlz~?wM65lW5Qa95{jm2 zt)%cQ`N{70UThS-%2M#8@@kzGG#r%^pzo9Altf!Q{oVzfsT*gpFXE5YE7|)QM@NO> z&Joks^>wnY!$?O@(k0X)ANF=%?`&`Ndj|~Z$Vymkj?K-@S1;B7t~NJ!)&Kt6QyG^O z28efBJi`YQNC*n_r<@WjFcefSODBtMzjuLnNQqwAj!nq1Z2!>vA#q>GYzp;WZ?lN2 z1ZMk?uXZ&~d1fl~gq`wBq`yo5{!AlpqCT^*J8Sp+M=^=zudY)QPk|yCJ6o-j0p+&J z_nzh-+9LtI6!K|>5Ry5UZM3DyvAR>cPVsnJ)#xOPEx{<5iX40dSn$B$CinsB3v{`}dQEpS7*@o~>PN&^E8G>rla!QJAN;ggC5|+s%U*S;GTNP#>sf8MlpB}N;3F~wz1plz zZ=Drz4CPo#T+?mT32YH2;?2%;@JugCD`72Z*-~87<#QL|B5njT2&5RYGRaJT)}8qc z?sN{QStYe3nv$QaKv~ao(&*Ch4)XWZgJm6$-4ThauPD4wvCT#2A}*Sd$!8O!+-g&M z=)vis+=ziJ7|czgL8rrbv^oqIVJJ@kYLkwtBXl|qDeG_rFH?Del|tnPRs}E6;y~Z| zb{7!a51`%2p&b&b+$+n?kyGrOa9! zzo{^#N!7cO`5zS$uT99Qj_7;LMOItU6^)nLsg7^<^;@=(k=^X5PE`+0#7CA-%I3@{ z2AR_lfI$E#8B=-IMN*cIl&|U1!O$u{w!$Z+y42k|r#Lm!U8|WMrBlVL&DuPW=^;fh zSc;6u`nBYvmDx4h+#*_`$|ZE7Y-5#_!&had&_{7RIwiLNPqngq_{8-4s>nne6W>zl zwVk!VSqmH)ch&-DEqGYgf=7ij8Wp3GVQV>X8KhxasKXliwLQ{En_Gl6Oi7ivpBw#% zans~VqbDW^Gr%Yn;NbL-uK-xoXp%B7evUW1T-X{-NWb?7n%^a_zN8WJ8oBgiJzS0V zwA6iphFcVN2dvOaZFU%~E8j4e4YFY?RoIZsO|G{0xXL52jUrO0nMwPed023>_P|uu zQpb0-{?>&lvNM?(@4BCm|Ib-m*5ayJIRc8iYPQ;|W(_2=c% zXv*U>cb`Z-DP6Tv&Z>1+sZ5i358vDkwB%Y@`d-58uC9@(d?dfDt!JdWq~|W_J-ADH z4;FXUW+hdqOA*aIe%%pp#?|YPW*UrctB5+EgJ&@&&BiqWFZ;BEO?k!@e$DdGZ7Ls{b0=Bs}1=r+W1H0I|e`uhXz5Su%0#!5Gu8>v-| z-1l16=)$u*A_OyQR(i{H1+4Vh`PF~QoTkz1;Q~$R4O+^%D%(UI$5G;nc4v}@8l4_m zT?8*Qy~xWdTU<@)4Klt~TCun?Zc+Z6JM%z(y}3#c20ZEi8WJ-G=fuyHguddH1$$Bfoj8z9~L#_XFH3&7rCDne$3pl~>wY zqJrAY_Y6US_Mvwjh3z3hrt+fHqs>@5-%tbF&lCin`oRIAJ_1Aij8;T4P-Zvz;Tzy; zf(B%Y#DvN%saDctgwXc}MZ|#*(UcOo=U7CD+@G&HbDeHUKa?p{+IUX6|kJF^g@dzt-#cy*EWZR$FX{31ssl;!$5x zQMrg5y-{*p8PC%WSXA%74iJ`GLhUFhL4U3HdITc_8alio{C57|@K>@l&UL;m{anQjI2Rj_>SZCPbShzh4k0IK_0B-BZ z$$zV{*X5a8Oih;K<))S9z}!`Lv6NCEe!H_e^+0Y+Srvio#)j#e+8MS#n?Rv>f5@;#V|Ai&osz!OS+Kt})*FNh=^0+@h5$xvAz1^XR5=@wowip4O!SV@kD>&p*7P;C!VMF8{!UESUA zbykWzbQR9pNbyzNyUvsLi96E%;r|1`-uLE-{&#BNY|FWJ%SObgaG;achM ztGcOo*)5d@VZn>O(?C7Z%HY-O8lwfHc{XIojh)kWARdXCq5v`(;bg3Y58Y~I$` zku|;gg2lvVaMqDp$JKu(rOu4OmP*G})D1rQ2L}-esM>CZR>uLQojz)hT#LFC@<8e(Kdxt8%-^joH?u zUyP=54w*bTE8CZ=vU&G=SJ=DOu_-=Z9G^2vM^%#2QPR7v- z8WAgtZB>*O^FZgl`;p9-U9gsT(OP_Ix}+VyHr*iIJ~-VV-Igko(A9YiIFEsj9s{|o zxMKn}54k^@k;HLoJzyIm(luaG%*fhSO!>_HQKG7OXqnTa%znC&q+A0QCrcLHp9|FW zbS>TjD-AD|$8mKoZJGBrDC!-8CR=kwZX8?G5+F|w;=DU}IU<7L6s>&0qyR=Try~3F z3&P`xF#dAy%nt){bP1J0d&SWJRl|k>ULX(QP@mS-G@s?nt7&on{pH?x%+T0m6W3I4 zt8Zv$<+>CgqKU3Iwyl0l*|nnRfjUGwc)6UmeaKPbiYwdYMW}j-yzn~zuq_nLHkzR& z4^!Z77oo7ogVF=uW&#TvX8qZ5iI6;W0VI3i9>VmOn7~64h6>cm20g^g#wu`Th8VRw z%}XK3gw%GcUcum6#&9h&;4Te(NoKk;jDFG_;NeOIk69wfWlPKfo+rIsAJbieSDSUt zsgkOnAVr{0$%u9{24os&Wyc-jje`lqM5#FIE&!ilDU!$STNw@V<5_Iey_z6~l!q#z z0?d&Bkj#Ncr&G1PwT~+1Ku4I}c$zlc++y8X#04cWy9jl%;>hoi9xfiJru(bfg&DH&bn|Y%+N`?+5mFlLL*Y%%BR**l z>2lTU0NvMbM$LbT#{~ICXm}2uef?(Zd{^wJ;j&S#C>YAWKp63f5)8N+0muaZnxd(! zvAR%R)n9AH_e{YT3N_fn}Ve&He1D!+VR|UC<|^KR@EwU;fUNPAHFXR z?0Bi;r8R+Nx)Q)A98|2D3D-bthrk`xcqCNAA@H?Desz}{bCBl~5iH`OOYD~FcJ527 zlI_q|y^_?i*0bo#j!{yN(};O!g^|=9@pr`E5&wrw{GIy6sb6ZD@K)VbRmofq0tCzJ zX2o|^)jC!?q%>F*peftP0`{qj0Z;xv2O%QzT*j<28x25~T^V1L-(Yn_49ju~9P#5Y!%1<*X23w$+ARn-oh@=RJeKqv0IT z(Q~z7P0T*Mapm|%c-(6LHpRqFKdLq^cCLtxF65kH%CMO4`F`q0a*6*z3M0M4<4JG# z)z)_A*?T%Ok1kLcKo9NDj}f|n0#o^XW4qrwXAwaMlm2i`&E&rneto<_%p{CZ zpCD_t)W*~`^}WhNH20adUH}VC>xD11fo~PFRx#kh5?Fa1y zt~-onm*^!-e`#L}&Za4tz=9OfY9J6J+tnQ<=b!6rCQfbU)Mid?w)U*B$!5~s<+RD$ zw8kpZ#wKFtWUBm2@6)riGlkC4*(ZP6Bq_(ec4)3cCmtY?QdIltidZx-> zQ0{h0g1JtCVjt7iVPq_2wHZeG!gJ$h?Y3jLlj=Ct*4X z)6ri?f1QN6zJg1Wf6)pY(5-yWSEOTY;c}k$HeUljbH^$jt8}c=u}a4(oif%bW0%A< zP5z6QD3JTG6PVF;E#0M*4t5k!DBkQW=Q@>iYoT}5WfSKq2m;JiLiF;*0LlO+UJ%I* z3NTTAkIEHt7*Oxpc~{-BcU7ZC$?O}e$$GW5vE9|-(YbgzNaY~aLx)t4$;In+lehEb zau=R18!kNMtf=YLADer6*=85$9g?DeBf-;qdFFZ(5VUj+ibr7>V2ujf-hi?(E4ph= z?wZqGUvqNzIA7O!u5vuy^ZmUrWb~$kdq}SOvZ>7DyH?>&#p~A<&)%53%+{*f;&8JO z@@2oWAK7jV3C&g4J{dPkh7K9J!8GE*9LNJtrDVS6`wE(})S={500FO&CcGmW1au~4 zB26!M!64e)-1d|_&ha?@UiB39&0BpREPf{?E7_JA3YhY7zIZa4Sf_k?XbKESt^}*@ zj-Z*=O0)d)*#wCR(wEir>6Al>4~MD30iVz)@WBvCQI8?Wk+0i%y!X%^Q9k(fy(gEB zx_rBDo#*)VgBtCdH43}n)UQtcY6o@R)R~ku_dbBcLuKS=iF9=BI|e$PKut2TDooRe zXLL>Asejf1&FGPI0W%J+IJn~A${oTL2LK!ZSbG3aXMfe~?p$+`t_Z+XUlszCpY3$x z`{{U!jK7iTn`$wG=W;-DhZ`p}7F%Rv{(Xn+-V7nb?;SgL?0l_9TV~^qF*?S$?u_xb zI@_jX3Cmaj+N=K)3An@wTQa~(Rel5KYtr4nOa;uCjm47Ya1I26ghQ2JUkaY9;D1ETvY_s$Ed_ z@%WSoWlk;^`YmnuckuPwa4ypM0msynA1qdP%s}b zAm|o)BABb*vcr)j#RQXU^%rDlW3_Czq(=reHgSeL9O4Y2%D=vWL8R_(sV^BNvTH2V zwzS}zX%!TBFbHC?y!Z))@vF&@b(Dv-kD9AFIN{*L9f`&3Jle8$JIfF3hPwF^jPUC` zr@uYOQ}%ns?E=Z^?WVSL=d&x`bHLmI^X|a>_qrHh9FLc9dT8(QumFe`KzFrYXVS)R zoj`Y^Geiuw>w$KIM?^iozI%<(odVE0rwfNa9sYbMb6m!s>xk$cx)bO_*tcaI>JXhn zbPo;DHF&ZfFa$+6bDgeQhv*XIwFSO@tMptM;*Em|#N;TX-ozf#Wec@LbMb)NU)Rx9 zfv5gSHmQVPGZ+L&Sc101wIua6(I~0_y|flj`O%nzRVWaVfO^-!kC?jo7vmrO5)&*i z48RZu5{y~7%Ifbcp|&yPAY|BEHNtubw7-nBN*nnO!UU}BR&*oy%ALJCTZUJguQp%Z ziMOl6W2?twYcr<~?Krfv1lnnE+dV;I?*`%k4g<8Wxnn2jQ_)Tv&6X%-q{}0p#Zabt z01E;uRo6>`EGfkbWlB{u`?_tK7%s?C<8o1L_ARij0+8APsa;P zW=%QJS`xOm4Q`hwNOVr2nXA4W8T3FBRXSS|vwT|3g*2=#xn@S&&66a!V|;^1 z<^qD2*fzjNNzf{5LWaO73R2e+zb{*w>r5Jif`F1SVgmxh5J3heNV$|a;^&CpqL6fj z<53lku3Y49L(v&`Fn@)?fpnze#esX;1burbk=!18WV5#oj+-Y)d`8`(tY>R4!Gx4* zaV7XV8H(MFfTTtaPs1sVhzeYKeEMFa=NnxLldKj|{qhhK5EBq0hN-_AA4M)8699$O zo8(_0;%6T_?&Y|bt@hAOnv-|#p3!V=HaH>~YKzJE(wiVZ3Oeg?3e7Ah|Hw8?gDtpB zzI!VHs8B7(b8hrI;3ENXz_l(XF9bPZ#Zj(Blq<8BOY@k2XA^DpRNEwDrK`@naw)-y zHbLzwTT#FFNf|Z|ja}0`ZW$f5*jHQFpBV!?}C9=o@PZaUak1qKDu-Q+6+Kj+4%n z;GrR#23LX$G^IC4$Fl4MZ?X-nM-;Hai0tElWhpgNBqJ!8!fT{`6ep035s-%<0}4_|BItlfl%iWOSF&Yix_nv;49&oh-#3TC zgijg}bDrc8jiZB61_%{8i3J`LWi6aA#3wZHGqJ$}Izvn!S4z-;z<|m|u$bh!H#727 zCGd3~?L)t$;$nw6mb&gN^;Lrt%jFD)%ft`M)c*-7M3#y_mLGb1B|@hDqI@E}XL(-m4 zmRhjnl+VGlSVC@Qc2yn72CG@zV`T(Y$3Kyl9*PjPmM5de8AWfqIH<#MM10=yY~%Womqso{dc-bUA4x`U#xzx)O@?f52AuB z?$6~GyP~V0>Tz33XbDzH@iW6|zV`N5ssF-`9yb znacLEhNa%Q(72N-oD$9{;p`9mPK~Kb9jg=6@vxsD+kH-FWcee1O^uY z*eYn=ePP~Zz~iF=VmnR7krO23L|q{0&pQ+7q=h<4ZNS2F@T^3i?dWf|hdak*4%+-g zXj4V$%1mS3naWzyfhJSXd(1lmG+DFa+^e|0T~51cZ|M_W9ZGf4R(ep$I@WQQy>3!b ze?YTyIG1p^+g?lSFDny#{buwvmm%_`P+;1%77B7hSu7hku)k)bErb2smbm-)$tuQc zdsusPD;Qi@tOr@8zBl^au(nQL6eIX1!=2&EozT0kdpBmgq-|%lb5^@GRc)>1X@ApXwYwBhL>(Q2 zb=?*Y!I@fiM?UVr9r;*@s9mwbODiFQ62YiJyQv^?h#AruhIZRV*v_@s8q}u!KCwvI zZ<_2kMi$!h+b7Q{)Ni9vdlAaI8!CQ+Z<;V_wc%W#Qd;hoxpc}Sv%3KLSdV+7lC5ej z+UW_3M?43vO@#d%LO0Kf(n>i1Z$|7jvTWK*ENH%p1=e!)M4;T+O2jDnXDq-g-^!9q zW=0nanA#&VClYB}=^GDO6O!>%fy%BEJ0G?UybLrQ}-*s?S%2QwYabTHGwOb0U^%ycmG{$S?XWce}4 z5Pn96gtf$pzcqRDWl_{;7*v>>T4O}j%(D3KxrTt&2r%x{T_$&^&!Ikt`W)(WsP93d zzA8lXAqvWf#yrfpeVFbfJ$ul2rO9_G=J^akv7|mrHPJrndy-E$j-US=JbRIA^Fpm( zD39U`t7ZpS2(;x zvTFNypXI)row5q$fo@SJ@eHG3fIV=H=EanpV|;@MI6X|#cs|Vpn}yY~8tsY>V!znT zFx=)7!N|_`^>5?th%n^;^V{f_?2P|2 zhHT~PB%})l0U(sTM7N<_VPIa12^4^OUc|r*iwPzmp!9kOy=#EvR}_ewz#&Isb%ZT9 zV|V7Jpd{KAB(Zn2Zb_?$+H_TRj`+phS~m19vlE8p5o#;wKXyIp+Zs1GMRyKhg-4(j zb(J;iXzB}n!p;!qaExkb>WfoyLp?hmw``9V)Kr!PEHc<<8 zltwyBM<^v2E~Hd4fn<#M#()e++A<8o0GsUaakGM|pPJPE!a)d`6lb`sv;nRrXh7nk zn5x)mQ#@>0<7rJ>lSP?D5Bgi_>siOGQIwl`Kr$MdUX>yD+RJFSw;=SeGOQOoEq zKf@qGMs;}t`FlLYqPP22{WwPG0EX$ybB3lkn#PLGRAG8)Y$w@b3}XnvJ}F-b`<{CR2JXW<&q>8s6^k)>_bR3DGj&-Jz

iiH9YbeAIrv`0R2?odf}tuD7ITYfD_0+ak;{8HPJetTs07L zr7L^2x^=#E!VYQz-XN=7j>6=ZL^S%(IWKa6I`JXcUpS8bo0{tA_*?+{#} zDmYt}EsvOHTi;D6Km$7@5>HRNT1&XpKQ3%gbJ0ul zOU%3|fC7{8WfX=%M;F#oGj$lD!fSPiH?HV4BKp3I9WbcquKpHvb(Ng|D!PT90A5-K za9xOwKs;dpijvdU#(-Q&Bw&0FB1xJdna?JOp~S_2Q9(T#04yY3?<>lRIiMt%OR5dx z4I(FuM^iQNt8+teM$Q(Vr}@2D>6({+?_%BOX-$)#`~jVYQHN+?*~%^4Ouv3B`AKb8 z`AM0URWBbS5k{6YC>hY=U|`t_+9Pumpj$i)5b)@9DhYz}In8=L<=mU>ZzDy7S9t;BH_j9uiW;h6T2jnGq zPobZ$ugA~_lu5Fu-gyyIURj=82rxm=2Y93iV_Zu%6}O%Ga~UzqxM&r6P+v~Na37!$ET2mj0Ip6|?+B-jgT@WJ>@H1L|FKAWtarB|}L+S9f&~3#A^TL`$af zQ)LT_D<4a?0lkSX8FQMngeH|^>QVjDo?ol2t8EgFPTnEe1g>E z%S{kZ-+-hY4)q*I95F>rK4gxg1VLC}801g7r$_+QGh^H}Md2jw`-oGQA;zzj;!TCbAa7G8!5sX_JAIpJEzGeoL6K?h{ve5)@%s~J@K z1=ENNFo8FQUQ))8CjgO>3fFsT4Eca4ZwU@o>W=#0uN4&e`JH>lJDZBLsjN5Nw+Fru^dCIl9H;Xs7o|yxF>VXF1zr?$ zgC1)IJ)Ccy^R08fb#E4$q}D@~(P_MY-}I=$Iy^k!9Ox-_9Rg{*FM& z?~bjlfTul#h`El%*|WF|87a+U{+$IwtLI)><^5yeAzMv1h)$5G_NKSuA93yFqT9Y` zdwVF;t;NNmxO7gmi0?}nm#1I2cGXa1eyDxmpDKZOB&mh9y6Hm7i}u%09^&Pbc4ELI zyNXKNX5{M+nhme>LI_c zJ)w;xqFg-9XB*)~j%`5V!IioLF9FVZPZETDo~>*yu0T%&#$U5EqQ3GASCe&#AoC_? zeEjVBMzSc%gLZej|y^g|o^#(+KLOehDk3Kj(lv8qebbfJkuy=KIxC=g& zIxEZqCBF#e(;0;!WwI4az|AYLcYf;b>pq5Cp$@OC7O&)~=z{pRX(<~7($fgRP;xyjxJR0n&GG%12CLKn=mxR5(F|gey=UU? zbpC`0`-}34RFzou&4QJAkgp>d*lx0a%L5Z%jOk7Y;udN{;+q0z5-(N>2g?4CzXPM_ zg=GTKs)1M91jm8KaM6A8r<=u4Hr!00q4Gkw4X4MX`dcPTx& z)48e;_SsprWbI86cJC$jdwcI87hL=vX>_CMBt7bBFxdgLsIxv+-C@+>|yGO+e zn@sVF6JUatLBzWLeIVkbCksTZ%PvC1Q&~!DdnS+rFMwEXwvf(H0+i3yk3D_E+`(lB zmmeQo-f1$mY8~k5VMhvKYTth%(M-=4+Vi-yq!zWrU}hw*mJo<9r<#(L+_D7 zHQD&iAiG8)w$OGWQ@JLVqgA=4tSD8na|?2nt72sMC{zUMhYW zI!cR~2JFSfOnBV1ehac1ceg-h%oI+ug_03v`g$pVLmCMqHLA-wcS|-MA?g%oIbFr3 zFw418c2SnM-fX|wme1vfP!0q2H%1<+%$nBKS1rAFwfkywdrRF0RX4xXV9l%?1Q-#K z)oI7K(z4Iq!yyXF>CP?%WWr=vR!YZy?}+&M2WC&7Gwh*r#LP=YmCN_v%nLoJ!s8!( zeYoTVT_R6VR?+=?$i=77m#bVDMgaLF`{>6C14d`pu|>6b?pu2SmZqm|3+XD^cm$Z$ zuZXRZ-L&nz3p1P3>dJMpDcgQ()h27(Ms}mwjJA5uceuQrIj+g<$9D^>qf5jmq{TKY zpBbxfEFD3sTA5?GROs@@37K9unVL1HIfqPO4~LM5rI1s$oh1NNd(pJeu@#ic*2$^i zo8?oDu)?&m16u0~wCaSvhJr2OR;@_5IwbIu#KlKS4V$cudM}uRTnW-!5W`F}O(7=a z`_scZ=lo6*Wxi)?WnHFPgM^vCHYDtz};) z@cvAJx1HwG3AIkBbwcgE3bl^`w7qF^|4@!pd!E2INKbWF5w_IMa%R@A-(D#1tqtAU zN20tmPsxbdLAk2o*kHL*y&RY`D2|&~I)_et*HSr~N$jMm2Xh_Lg^b;eeFy3md%@Lh z_o}oM^+oSCL4`UPEh43BaU>rM-9qB9h|-;l?WjBYqV6Je04cYjN(6HV=NBs7Q1>Qc zh8!S&+##00(QSy^1foCHscyP&9Ts&*pTQXclmQ+h;@qelV_(GBvwOW}B9oUcw`ZQhHF_(_gL;UdA7Ik;o@c&| zW#yH)A$y9J?b?=3{aUFSqaZk1x00@gsV2b<57)-~92vV$|#R zROkq~z01Md!W5hOC)!)zRY7i z@HSa9(D2+v&EQlEvw^e=M_{cT$kzlO47?~%*?T0CiS^h33c%?U0VFAv&Q6?MVF?k#)E|&+ z#ml^6^Mg1Mg~ zVs+CgyVb0`0BcsdecgBqS=TJ>So@m!9sRW24|g^fx*x`to272Srj7ixYg@S?*rJWJ zlEw8cme{!56)uM&+!d~$P1+WE3u*nrUJy_{^6vDl&{7*B2ZwkgtLUiFE)OZSj51q2 zo;J$lLT%tpkax`i9;qa(It{#XDbnwsC`l_W+?{z3y>-q*Kbs;`TE1^#9xk3W*;8f- zV{P$6CanvdRrJBoVHK7otE!bHv+AX-*`@!i=-w7HW@_cMOZw>Sf|atkocMyRz>s zTYXd_`>TZx70XB3?GR)4MTKl$;|srh=-qPAU3*+x8FIHEr6=^5Z-7%R!;f$v5X%Vv z91tAzm1liS&>=$r6EBE-%1!Gy}sYjj zC1g|N*~9+E0rn+XJ|#EQyHLB|k}jLhtcbEK3z+(cr^&z&=WvYr0CFBpF&P6azzp(4 z`>1V8!+?6%QsY%U)iCc?%R`nm|kU}5siosC;{FC zV$vTF*~1ix3H8AY2l2%-0EwOvz~Nl`Nf}rfw>5*D{33LFW>80y6m3$5Oj;YNFZNN`y8Boy1dd(8oGswabXV7-w_OCXGt~(xlazTzcC-ruX@|T%u0!gtcXV=#3boFI6ah0KbNBS3FJD1D_6T=K+<9y zj|r4$r4NRYFwF!3pkjiUUMD0F<9Y#Q_s=+un1_D#5f_*!O13O*;p(mD--t>&4!0QW^|g1Ax#z9lLbGk1koCd zoC1D5rZ}3K2WN^)_I6+Od*_B2^!`JF&HrBRPdxHJ6ZG$Y z{YxU;s{6siVd$gr4co>$9_45zCUZW1eS3Wy{yidFvyu1Do9WHgWJ<5aZ0O%!!`mIM zFyI*3~Chb zwuJqbIFh)ooH6|{iVZ|>Hk1GK2AV)NPGhWJMnegM%TUlFsxP7`1CfhoI7 ziD2naRaMMDuU4wb4210kxs@GXmGS-tbK7LQ>brf3J zPO>d8aCJ$F0n0s6`5$5UuQs-P}+t7RL`tjDvnvq_ znsvPv;gGjO-VS*?%ihr7-*#Z@=XvY1v`J56_C_4=J4Q5pKB1+y?s+%>0Y8(*q8xK@0^RLk9VbFW%J0bJZ)SdL0mR?R?KJ1 zIpeYckJRmjsz^xcMIri=dR7t3D)+n)psKgo>k@0yMF6X9!bJdE?+9QI7d19r&Mzh> zTmm;HjodYId{4c$8iwrHS^>wTA{b%f^CT77uVL~+**x;l@kwWCbqMTfBCz;aHp8z> zDI4sSPjZ{fYui45ZHuI@t*hXc-=x&OK;!xXhk!00lAuBF3G5T zrF={QLm_2CyGJUA*@y@{MF7ijjG%{rpgQO+2OjlT81mNPG<%#@+9nmAvgHysNbDE~ zpOu5OK@i6{IKw3Sb3bB4q(9$N?>hTB({UH9k#^9QN*DX?P(S{b4pq%0b*LFn_Y>w0 zZ<<{3VorJxU_^v`6m?AERn^jx!N-+sY-~q#hL|0Xs2+#K1(~XvIgN%71q2>UubOCr zAAik&Bz_b)09bJjrY<883J?)&9$z6z8WM0Apt!jKNn3i7x)8^tTIi>Xhoh{Ut|(!# z`kQyO@M}pLo4n3qa&UphmL^K1o}iT!l6#5&+4<`9xYNNY?39YR_G z3H+_eWc~$W(K%q3scaK3A;Ltw*=ZjqA??C~s+q#ss0j5T5LAk0LXA6oA7G&qpKuTn zfdfse;tS}IF?@q~CY}K#J{Ti?qd%YV%A;h2eMCG2d=!ewh6|VA!X>zH2`*g1V-J_0 zY5bjezwB(e7zr*$f{T&hVkE2)wr(=p8#uaDY_fbC_DEZ~oGu%rtkk)sTWP*t=OASp zCa+%;L`Tn?m~vW@EE2IHJ?FKuHpbHw%l;; zhI7E@#6$kZfPCUc;el=iLn?lpQZ_lB{b+gi(>m{O>&yUi;wg=Ir_-)#R-E&C&szlBW(2JN>IBE|;qZU?kp$<0Sb1u-d-4U)-lGIO9?v;&_L`88!vQ~06 z{qxyg7zS8wmexU8a?N#1LcR}qmvCu1F{~saQ1o_tJ{0Jsz*AJEKIp2WDBUF%1?@${ zjb#Cuupi+SWaIWie82aFvTMZh_oA0cJ)YSMPb+NB>&*ro!eum^VzDnddp9zb)~^F5 zFEmtEWzP860-)p@Z3ZcsvcQ7`3=xPVR~8g-^$I{h&@7k(k0E9M(|QJNP1+a`g2YUU z31Y%%G@fWP5~2R;!mt-6z>=K3L(tdv`cFzMg*y=2)gPrp~M>?QKT>-@u(Of}bNZ3L5t z0>ayA`il%HJ>YF7u&`m;M2=B=qH7{@^`ILkE)bG#SZb-!Ur>{6e-%I?d*B|z^p}`G zi$SL>qT|3*hSP2E1!`r3Pdh+j-rjC!m~!iAIeAjst$GE6Yd81`2Hd5Au3@hd!0^O5 zK#Jq;??_f1vJ9fIIW&0;*o~a$8nB3YDvR#Vg|57!&(1GLRfz)NdD7dpt4RFh6@;%h z8?1Dn$P}{cy&&jn705PFsV-b7Z5LXo7qznmK^U#CvM=jq- zwPQxh7;iNVH=VJ3;mVM1sX*oH!tpJ^nQCEqpA8qAY$aQ^Mkx@lbAUQH4rMD_GlfP8 zuF&El9-s>XU;U%Qahq+a9B{jC!v{~>pO&PuRil^Cd*tXgq^!M+lC5kHc#QAGA82lq zRH@L%qTQ|w=BRMU@C_6QTqAXvH*)}%pu!J+`{!4o&Os)9ZQ~zvWs-{oT%~+b(=KJR zDzArjP72w^mbKT`SRoz*2ivaEN9eQh4t7Oa@1SiYO-t=Vw%J8T`W@sox`w>$f}i$* zc0zvPEHn!Fr_&`kp02#Wxzdo%t};l{$D-q*3j&5bqynx$kZ{&m-RuRCuij)>p}E7U zDs!MR3Yusht3ExBmAGirKZyqHG%6w9W8Rel$g0%}hp*o{9e2}U(?OR-K!Ca6D#A=g z!GMbi@4GUG&A1)TzmUh3teeCbdBXW9?P+949MOM#DNM_F6A~g@?9_t zcpq@&gzK$&4r-(7S$G! z0xI1rHmBb>Z|d8aS2TOq_n6UX_V))$Jd-p3vkGXXZ`htdt|Bh0i@hh1A0u=C!}R4j zLsJ}0&4V))xVX2g@8YT@sEYV#vXU44&xWCo#y4ym?|77>nV8J^`1S4eZTReRKNoHvr4RSQ7 zBMr*l3(W5QwMFHRG9vElx^(CovBuX1mUH$jv{HxH_1bjRZI?S)q&h3qNG?64jtVeV zZR?PyCLoTFJnCzoPzYuy2ws|-LuTA7gX;GlmDMSt@9da0T8vZ*+4iZlvz6Oxt9RgL;sdyiFf z&G{_i7#NWM9$%LqUM~1;X@W?7m>Btj#$}e`*}1>e+wvCdgpeQQMQUrqeaeVeqD~P{F-^m!QAm?6AKN~cc^P?Y3R8vT?HDk6!r8t z@CS(pdi(Ua(2^lBFd_|nj%d~Gbcx5B$f(6};%C?Sx^BE}1LYGll=7dSdVMcYxl-8` z9RvBICq_Yoi73mY2+#-2d;Di5H%+)OI&%fT-d*INO)*fByLWd_lBr@nTaC*V&ztfwO?w7i#w;-dKr1U`SK$()@ zprMinI^>`R;RFpxRFJRTOo6@#kOX|bSk&zt%)7#^Rky89VMBKQL>h(&D)fd-@MbQO z<0m-K5$hlS10&=di@$5jMsiofz#Bw>Lfel3%On;Vn4m0pm$0KL@5uzyPlyD@gi!7Q zPDbVkl5`HvB1V);hP3;07?c3YQpo#59|kw)ydpM3H*N1yU5Z;H*+Ks#?dK+Kjgr5; z3p#0lCpuf$8oy}K8A^i+EAf&^Aa@`MP4M*|8$trX;L7p$x$3XTpz8pX-Tbo({2&qy zkjxBr&86Gn_Q8w7%Ug%C;q;rC7vr$4=Vq!J1B1*RK}R*r{Dmh}xs9H@_% z6Ra`@74!8Wfb+bY!F32-V&fRU1n6EJ8$1Z&o4kJUeqFV#-c3ywOJ1#$V~_+1AbnZO zd*3ZzNX18d#ED+^EghBsI#bpw%NSmY`ZWWj_jk$r=U|w{_zpw%=tXsqW&vsL+tbj~ zf~VG4ksuZVWMJ`*BZY#)0*1~fj$)yFF9eXkH9P;HBsb(KlYu<=g>y*?^h?{|@5)Ji z?*-dRL7ZSgHt=(B7^I4LzMFmf;2zli;W1~ANr6&jlKLMzy>NvdA@9Z59nS_}QobMq zK3djbFQ(**5xtN8$`N*K8$_Sr{16`3?Sfvc8$rAd!;TR<1y=vCd%k#M&0X<6*>eDM zw#`kvgS_*X@)(6%R~ve6{|-XT0ahL&Po!|caL$!P<{FfR*~0ZiWv_Na6$0Y>LM(&! z5j?g0&vHMwMAG~t3gZ9r5h!08&IrfL9xI1>4~ia6geVDI;9u9*T^KPsv}-RV(HVzm zZ<_@Fa;W26-(25byL$9l{o5s6`7Fqw$beJwTZUp0NC-Wi+>_0+}bN>_IEd^LGc$+~j`A&qpOv6#K3OYZuSknZ$7Pqm;D}7^g`pkEBz- zX506kBVD*8(#J))FnqnHv%}N>?hm{ye|r9z!-1pF>Ct#=fX$m+&L?BoWm^)`xGJOL zYpwAY$)r~>EV!w#6;a#(Jv@aVZ880+?0Cyc1TS;}vfF|J2d|Sj< z=3X{*0yCFte)1ZWqS32tam7f1>fo}|E)DJ_$G<_`tQ{#CFuO_fGdXf{M!yUrOc(Q} z2YyJfxf*ZCH9O9KaIJGCL9-Kb9xu^+G@e;f6i;5Sox2mw%45fiE(~)*e_)OGrPjbz&)IS+#<0|g4HWVy} zZ2tX_W=WnXl!E3EGFo;fLQsd`n3l*nai*Z*Af{62(M(Ln)afmxC|rk951?3rPAI$h z7*d%SaQ$Z(h*Ar`SCq+jC5;NC;u+7D6$$zSRZ&!CZkdE+*!As+VBn~3un;5TC1n;V z7aVYzd6x4*%U~SEe1}0W&d5cgA~^a_V9C5K(Q(2fZ$1N+&@55CLva-O<>fdS*|cKrCjG=T#C zJc3}vf;nH%1Oy?9nq!i?hX<5g{Jp&bZ;o)=#0Gj-`9uamO~{7Cx_Sh}dAT`+!6EnY z5q(ow@dClf#C2vpx=pLZX7Fq45hwWoK)fsKss*;@*edv4)Nj*+<9{?j@M(-C&9F#m zC@{WBoVx{@Tjg%&^ZT4EBl%?nN<4K9RyE89WmW0k$< z4c8sp$@zjwhs}9H*66lbDsN9wMxFMX$3azfXZ_T6a^rff`Q^nLTosE6!Y}Mc(vJ97 zlA491r+doyF8KaLS}Y7Bwdf2*Pj92KJ@1Ng!9xootPIZAbt@D>g|hZR&qEuiKx2V0 z?j%M|QF9x2Gj^YxP^LEuc})!lVQO5~$M)Wu@){K{LAU_kP9tIWg)-oJ*mQKP4(M<_ z)F)~BW`Fo`Z|>d2pSghV#Q6Yp*!^Gt`Z>@n@}yiSU3cPRa$lB6*5GfWZGGY^2%#DRz2-6xCNgPsMA5X0Dle~-)-uC*X#2u zKO0${X_R#^20|jAo>Uq=hG; zR?2$d5u(Hnhd2_%#fT?CEf!p6j!xJ>Ik*`J4z@xIb#V^Y*%_kmLTIo^@NA|ntD0&}&$&WkTAuAw1LzaZp4A-*_CWb6(k%^L2NTFZ=sFtfYyIK(;9TBZ-G?a}RxB{CZ}(?jSdk>G13R;xz9P@a5gp zbO4;&BE02XLuzyK3=lMG+djm4><#e42~pv(+OS{1IxzK;Q5qSNp(IN4p$va2dboi` zSf@40M;^;G8SV}pE>jKW5;StHG)d=iDX1J>cch4)77^wIoMIR|hf&a^khg~)2*7y2 zY4N|3Y(g6JB3Xd-KrkM5HT&rFs z#3*ImJ|6yZi4E~`t_qp#q#L5u@e$#pBfKS(n`%}WYH4%HeYkBDeMSubC*=r^6ns;OIaC; zlO#i(fY9h6d7>BJ>BoY|sq%oi#(SNY?ho4J#i2)SnwMmC?j3$g>EwtC$O(HP@UcY)8$xlR@$GryEz0zMS2(8w z`zzs8sp$&XfKd83J_jt%w^HfGZZsuV^PSQ=f~T6Raag(t((Qj-@3Jc``zKaEu(Y{U zx%P&1g@QWziJ%>&$ZMqWS#cELbU%OaykGpN33;=E;eM5-DFstd-L9*pTDY@D`$4*) zct<6&doXV)6fU(%s;aW7T)9lXY*sF>m6+>eK~AE-7a(U3aFHu^ zZSUG*;o4YgisGKnSawB0!)TgN zu?2WlRBR$qHk1N@futn^e2^-Bt6I-T=Elm^2z-xH!7kitDDmuZeXAPFhc9c1B4@PL zYJLL?<B(8R9ME(K;KFynU*#FAw=|0sddW0Q>o_FU-BOY`+ufE;M&{$#?F^!Y^RM=wr&*hn8f*mIZa9BqIOk?cc`IbP+|nqvc|c{ z??(AQoI%nYG-rc*Yl(*>?p!5vBf(1INtogxT%XV*E1NlXe=6Env=Won{8J}W-hJ>% zJU}f#!+OKT9Nzd_G)?$go9u|xj%ltqD1V~r+xu!*@vt7)dBN+vp3P$7uWZ}q%{5Ne zSSZ?=x%tR!0RCjPo+SQlw@e#kfdJpF`odP#l$2V{P2f9e;IUHahJiA2uhJB#-ggjLDs5Zat1JE6bq^N*=>r*dhZ7ipWqxZRHaB z$Vpe@;X~3_3Kp`YSV^DJ=)`)cQ%3rF$z+U+64Y~+Sb30JrZAhv^xO^gja4^i^Nyc@ z9MX^2ydz|^)>vjp5MO?WzPy-T=oKXgQ8Ru=S`c1Vm%(=A5Er9{^RH4BTiYZ{sB)Fy z3ny_HI^TfjK(3+$J`11%4l7;%D$PEH6Zlb9$IYtg==pHAa}&wjI!Z`1-!m&}*LS1yG1&j`KHSJJ z6Q4+#3B#xHiw4P%qAqhD#p#>ndYY4DavU7dhQV&Bg=*pL`L`0S#)_wc6jGvp=}cL` z1PGnj0ui@&960^?L}@C|2%S9GddT9lo>dcLBV&ZNU#=#iA7qny&s0?2a7Wzv;me3v$Sdb*mnfP^f?_mV~}(j1(e zZTb~odJgv26<;51W!E(-rzG1>w+O@vB&5`H`OXsc{Ypw5^trY}AKR4sq?F!fyd0!s zjrV%Mh+$>2CYmLmo@uh$+92LQ-;OG$QC8K$AD6KPq#t^(&%|tZROhVlT}|$@0T{`@ z6fSt!Z!xGB8oIV#?}|4yURD-;#oh!8G(`kzP&8Oh8slo&xiyfj>1c@*tMGD7TlwTG z$8vCKTH8Z5He>Sb&)kRp*lp4N$+17IY|D%>k&(CHa2(nA$G2WB^hDi8GizJNCZ$le z#e*Acz340xZ70Jie*(6$#1~^()kov_(dsvr(`DE81ieHO$-zrLHnt9vo;IcLR?ebb zkaD4A*Peo(KD(=(mDtK*!-zB+%@-a{PceMPaX#D*gMMrNOzByeUY7bVt=X2Q|Lm^A zu_qE=84-*ogI-=^G5^u9H@YhqJyK(WIg08Cn(mjz$1odDYk$;;D8B7`1_;Un_uXq=RBWv~}{s0b0buzDh;g_@7T3gFe} z_W@>Y2M5pn>+M0ND^TWxUC=ZQI2ErJ#unAwHF;id zQ+T|!SpbpxZ8$bGDKPNpVH)#iv(PD+fUqD&_K&PBk#)$UNs z3!@cR6^@-%6KFw%rQ6TXl-jaXsNcxw>7R8e=Qi30gx+jAz2v1sCD5FC+7CWR!zbYU z!B#73m}8U`zw3qHwN;8#Zv~Qj=Qk}bRPm!^m+6Q@2m9SD>(3kBiScogQ2Rqq=)PVq zo2r(Kzm^WMJhsN^AY8uguRXki`E?ybOeEDqm;4>q&_bt2p7+es{S5}=`Sjh9SzRTl zF-y2LL^OQO*HwYO2GRV?8M|P_gMHlUiQ5bk;$p%J9pgK9FG!yB2=;t2vM!cWUG7L- ztE0LNC9~ocr3Hq5YO{@oBAPcj=N4m)>gSu@_v-Qfx?2n<(6U1MhL(4e;;E)nROtiO z&%@1ByCT3dwX#H)^29;h44@k9FTDKh{q-c4X0lIAY<#+gI76I6ir~pWcaebu!y?_Q zSGc=_-O4ti%@ZPaLKG#1e68i#d?S_Svt1QLbva@IiX|Q#5(K1Np9gn}9+FwQ=!>$n z=I{9%G}!QYyVaCDr$?$)TU971;>`FAh2(UXwbmkeX+e&CBV7VRyD$#!6fHiqBV^pN zp#$8Pxy^9-BdPR@`rQ05;{8>?U{JD4Cg+sYG%Wey=Bz~Biv~O&M@6r)F7@jS z^YKbP9OhBJ*SA!&Sln!{0>gYySo(cnxO$-|;8NKqW2ej^g+)lEM%paycnI4l#jU;LU9h0-dM^~EO z5bd_$ip$X2cS5O7@36(NZ}ex1th$=^i;yvq*5M~E{v)+B5o|C8LiDI~az(IIvEZ%D z0XaepXdToOT4t^{);sQ?@VCQVe`DMmu*29Jadq8In!`H6M(Sc~s2!T1TO?9F95y)a zvfIwH_Ya=9`g<4Zvv^v$@~98^_f{73pS#=p7sFHC4yc$t^KUWIN1bsd0w@?q3JR7J*Jw4K z$X-~(Kw}|O2U>A4p2;p)vi=ZZ5}!YQKaQ;-B-pt_byxN3@U8Rd0_(a=KQQi07;Z4& zT!ZIGZ3B2@e=Y@k7BWn6BznjQ)}gu4TonE~g?g%F{=-R~W({iU@5~fV5Q_pvgpdw> z=Ynns3q<6NRzKBh_Z>WCdwTWW>qZx5N{* z7jIFc(jpJPeEbv*p8nD&l;gV-M1KGVd{nIh)y*>qkwl5(9M+JwAE_lhj9Cs2R-ZYa z_jbq|{W$MFy;ys;^5o9q+VNkXIdA;a+j`3t1Kf1_Q(mr-)TiIq0tYWcTUQpcJKE01 z=v#AVbm|V;wlQ9Q*)@<-B}@aNB>kinkI0-KBqrR=VikFJReQd8`nBz0`-sILKkB2v zcNhkQ3|d{Wsmn06v{d-y`ous62?bDNFRwS>dA6fqL_Y=l0M`@O|LRtGc|Vc1won6- zuN?6so}ba(FXZi&fp4plsyk+0GXK@_N|VRnkj^z+Ddozm7JscoSg=9Ro$!C|is6dk z1RBK=vE*`We9@g_%!v-Sh|vr@s3Eg>P!eI`gF938!|Vrw^U1)SK?i?#ZQWAz%%=08 zD9}O#AX;W1`xzbltnmZui-C?+(~AK$4Zx!{T{%sxgY(kV@_`l)f#!yh#$y z(&}{~caxz{`6~pF_H3a-C86>92$1|a>YD)+D>bGfgnrN{+}?s$uq{|3MWH|krNAF4 zuYmv%Dt#2`Xb2|IfTY4kmGOuGFboxk!E|UO4Gx>vML1@glx2-nt`ZXlbhWXh9N(Ar z?s6&=dQq1+2p71GE`Rmb1(8v;JiOxpOtMe)$ZkAD_l8z>(MiPWR3hFQtptfwN^x8s zVKFYWsOAccEgVSMheK!MQgqhbjE+fTb4=7GzB1t62ke4m?NK#M_LU|S$BGevu(q9Nu3tN*JrT{G5L zz>-lT>0pni7!0PeMxqiXFt1=LM#jJ_Y(iBNSRET`Ffw-0?UdiadW}4T(77MlHEN@T zUZ+aIfGT;3mFkg7cr?>&NNBYxGi9(W-?QOR!G=R#DEhjWA|VFC6D|D!0f$L+A|6Xh z7L04?RKf+>fcyHIWM2m6SMH*DVEmi&loAf*uw3WVrXz}@fCf1MFZYU$*V?_3MiW%- zD>6~pc{IG~PT}S+{Vh!f{dvnFcz=0v{u!0Gfv=hZG*>eR+D!pFXsVj zLUpYW^%c~QI~^b^RRkN^`Z{0P%70S6NsaM?cdk*My!V;1vI&a#ovrJs85pVqcyCHM zLD~UR-VkShjGg^1Fdeh1DD+KNmU{h#$X{B1RnEg1(69b|zzN^AlISSxnvwKU+4WnS zMZ|@xknf9K1;n+wv;rf?HB5wV*M{lrcnqAkMuzj~#+asM;n?I(XXJ|M=izJR%9ZXu6FM3bvM0 z3grul4p3(qm{2D9IXT9w!~EW^|I!e&(mRTYWXl$&VqKZgEQrmGw@A06dl1G&DY zBeaglvY`CeLzA%y#EZV!z()w?;&&ZbOv7-9KvO6_p4`gmT7F$-Xr8gF(fj7xW30=8 zMjq;yH8Z65dF6zo5KVM-9eNWx{;mQKnWLuf$Vh<1Npem8X&&{@i563243y}=C{TfVF@NLiGn5@2 zm5!?9xHibNV#E0Kz1A`SC}f4q7Zo*QZ;ij1L6Bn4doH6FZ62p$=5*-MzQ90KUivk) z9){bvYmb?(RL77+R?Nl~IGC*~=DR?2dQ`bO(9LKNhr0_G4|^Ai#N< z-l)`4<4pDm;oL@{5wzohju#VT7gba@bVC>~8`zA1PRHRKxBEMlI#|5AmjYW$fe3pu zk?>ipuF$=(6_s2-7d@tIz(2fBi!@yt-rAw)`=y%Bxl#h?N?DvmKuea!vGZRqnstoD zntjD9E=Qgm?!;L2mS{e1viONq;uvDynR6~1dD`sS!<)=9mMZfpcEb%LXG!jrP-iZ= zPl$R$y>e3|5I?eDab4F5bk(gH6D!?D!u3l1B%T!>96}yk%15rajEJ<1jjaaIF(?9j z&q>?<3iBN6(O^P{Rmff$4i_AfU;4syNY#}q%v;~CPq(Skn#3`aiaLVl-Iogr8JVKx zAGRhfDATnPC#e@ijRs=9;_gKyYFnR>_v&1Xubf`ar8E9b z(_xswLT~=oo9|tqyBCl!C=a~xT-exH-=5&(E%P{@r-TDPEeu(M6-iezq|JA@eDJ}h zCp%48=r8jqZhJOoePIkUC3Zk%#nviUOkmeJw?5B$)i`p>dXv-n3hIz}8BAXn>WtQ^ z!f`Z$t$xRJrhCv;RdKN6e1Xg%E1dVx-2ZL8VZjzxT}$(mLm(nR++xbIeVGDkBD5u#N@(OP|Jiz%P3%BG}`#2v9ep8cu}#1wPr?n)50-K zJ&5ElMb)P$R21C>%E26w0g z(z|3SOn-0|l6OTII~lEZBAhg(q`yA_oA)i+5={Q${k$=0){$Aa`pr*-!d) z6$|OoYv&R3M%zPfky(C>jd0ObZjr`1x5(Y4hufN(;6m!a!q?th%EbGpKX(iE2^|| zf8wrHcRp+ySa4c!r6)!>=!#T>9banP-aMpyM?pmdQkL^=AugEa$^GQ5=g#xSS@Fao`-Loc&BJ`1PvD|?3O7`^T9}{vSX zCJLW{u{#K)Lob9T9FePFI@gc)B~;JVa)vL2Z#3ZMFb5llCr zk13=LDrC{mWcBLrBzx4$c9y81PZ=?^SpT|eb`Bh~5TkB#>6ojt>go$(G>BlGr|K_1 z4>`A8Y-C-V(&aGEvYwiLU0Z@eO_y|#8Y%7%`!koQ4H0_6!k% z=$JbZA|q*Ts6>-fB35b*3x~3YDrzV}o|``4+aFlqa~fq>>OF-dnTCNbXTM~SP#AZ_ zvYV8K`}gk*?ww;KD+S%xD;88@G>EDJi_GELuQ@xbGtNa?>Kj9p;Ue!_bhrb}WYP<2 zpe-@Grc3`IXbd!3s-{=7*_KBd@n1x@duW^sO)rH2zofFuw&-z)iLetx+x_#$AH>ZB}C>3dVk*wc=cHoB{6uP@*gf$9+}w8frGmyZGZqy9he0 z$ZZA}DT;^URqePvR!kFhgWs)fzO3G1Dsst)H{vRfq1EQbkKYs~+J2NzuLWs?62}(b z_eJ|`k7XD?0zGoVNvbD`zkLeJI_hE{v<>-jUOlMnQ@XVZ!q|feCZRsmAqrmRJhkXn z4K&nhI`6KHS+ZJ*gbei2K9HChQxJ!o^aBl@o(Z8J1qv-qi+lAPNVnIIy=79D zJ0b-AMuA9d`IivEwCh&Cuh2@mZtrj`1mXG_=rJAS9F%It%~# ztu4sy912szP~(zwkT4;jni>YDyhV|R0WfA{{WP7#DphvWv3>q7d5nhrF))Vvwzj?e zy$d*`kMm@X+fS0Euk1oLPH4~q3hXntn_939XFE!9<3c9@7u@#vx6?3KG1N-{HmHFHOc~2?U##Sv#d&?&eGy zbFQYLIH^QEm~jof&<`brE#edlGe-`8<1A!K=-lMIqf|o_i?k3xcP;}1;~|DYSF`fF z6AnXhCC85E8wULu>U__7EwtwEuwGODwvPG;8Zc)1I)!jnR#-ea;+w%}lzZsB#H6W9a} zs22gt4GH9rV5G=lx=u*+*PpzLM~lXWmQdmEz1&1pZi|5#$&|=8IhnC6LgjO-HoMHq zX``^Bz9Qg)$?5b39+77uvaon4I7(|USjoE2<`Q{TuDz4L{mx057#uQ9Y84|o?AhCg zbhic^6F1E=Uj=ualf#_zk0Q498xkr6fu-nLYOGgfo+DBFy_m4#F;NnPzx6uiJOAul zPbU3HhaA}>ittGb_QB(;p^(%k36a$Pa8g$E30=IcO>REVnNm=(Y+7i`si|G2O8o`PWR<*;y1!+=5sOh zN$C2gO1?p~cO9ey3>d-;R@#a6`!hM$kilr7{gI@709w`qNfx~jjK&omnOEv=B>2_l z?iZ72l`z6&!u*&6)+4i0ac|MvfleY($&vrM4`?P@i~Kp640&Vae`Y!dgVgm|UW<+LD(3G9|QlJNkAjdkzJ^_9sP z&9TmxirkPA8Pva-;+7i$WxH3E?D~8uK8Tj@3US!tkcE616VvYU>B1KWtyptE=(CYc z!2sETp0(38@%jKj^g{sRw(0)SHq2RWe`fhZnmF;+=bFTIVoU%g%1W{hqO1o$p64fnO=@d}25adoW zJRlq!%^@L`UZT2kd=|F{EqZteFT3R*iy6qYu0EbRrPn?{xAgimA*Q$7^|S+&&-SJ? zVGCnNPiV#T=|wW0YQ!Tq6OLuk6xe<>%%_QmEUb9`i=Cs@wDSS+^<~7#(W#kB|3PiD zvy6&S@4{gD*1Whw*XbWWfr(a`C;!xD!zX^S)a8W?)Y0hAbs2G^IBID$2!~Oh@_zxN zqj;m#cCGzM6Hf_W+OtljZZLxyJFU~Zv!}!#e_zG-PQSR=#C+Zz`t;#jK!t3UK1*}F ztvJ5O``yJi9HKt>XpWmm=`w|uImYtT?O_t3mxD@HY3W%W=vF~*9ly+CrvH_SxU+qhJT04eZezrpOSoO_vK>y38ib+V!dir=;g~B{< zn;-iinC!%-eGYNRVv_0DlPg$QKKki^N*n)&!PHF;R_M2Nt@Y1!D~#v}e(0g;pJ3ed z4tbbIS%jcpp-^$TxN}?plsKGdh*oh_<0Ev-J6UJx?elTIIfQ}x+&OA>1J6RuuOMWX zpDHr9pBm*VSx2o|S#~&_Hk*@bjP#L;o$Yc;)9gy)=Nf9g@eYR=z2*;6QzjUY!b8kX zxr3dtxey%2LcmHmSHYWDR{k7Uje zb7f((HEV97&iR_xl$lRUK|>>jVd6kU7MsFjUG>FN;evt zui0rkO^WUsu?S5;&!DN0>ju8;@9US;Mz_<2#sUq)V_*o~Hdgw)>nCUk46gVI&Ebh> zw73JX=GEytK0#Pa$3~EMVvAcYs_=ds^i@msf4aFW*PN{5`M=4*1ND zMf_z%Pp_TG-nnnEy~LeUeymB)(=I;nq5me>y?wGjwo8ormchBg-qF+PJ~YtlL?_k3 znbWn`c_;`g&bR{!a!FhZ#whcByTvav;Q7LwzfAS1$Gw7J5QgdBPVvT)1EM5QqjY+| zBf?iY@9g#Mux_bVujvA+OnceC4pAmi=;;0+_RFi!K9Z;*uQ`2da-WO%mS8SWOO~et zB#|yhkD4xdC4-GD^}mgF_{`(B0d_vYlDyXP_a|ehCX%t~60vc`TXz_BoTvt~LRGob zSweI*=9=Cf1|44R&G08#87|4SjVi@$=L$yu#Oua1Yl2kc{;pBO^{nI2HL5#588Qol zoR4{+PbRifIhv$`h*DgmESQ5iNyg=hrh-OTNcsxZ3KIEkf@`AVL4M=adi~jdr9kcH zV!`Fwh33A#7^f?D`PTf4f9NE0tkwL9)*IH9w~%qs)A=Le_miWo)nof%iJ$lrZMh7H zqFbcG_j{Hv5L8X@dzrAXMM!Bb#Q}Z}@0;2z%+sv^JL*6PUO6;H#V&35_QN_lnQ~a% z#T;~2M!150Q(w$5qq%v=)+ISY?eZIM!u>cK?~q79PD2O`=GL;Lxu)jCOJ9-CDeP{E z8OUnbDa(*UeekY1anF|F%xaMBzRz0@r|Fj2{UvG1gmtP zaJTwl=&fZXmA@AQ+ziP2pbL8+HeK$^9Z+xPgQs%w&?!Kw%xH-eT&vX?o^zSeK$b|I z*NsTM)NOfjOe!>yQd|a#T@X~OHTdb20P>Uw864u+O$wJH_RK>8)g-Fmz}) zDsC$T;t8pbQmL&<9Lc>47PcO57b%fK>d3piQ)#~aFCKT66$2mE;JmeYer`OL1a1uB zRmvZNf|Wn+Zum`^q@p)ZshE?{Ea~-o;>lDN1mWAEawM6hyQB1x7S!}`!-20N`Yk3~ zeWz*$e@~Y$MFrLq#ejRC+Z;;YRQFeFg?)z2M&=&H3r+1sI*fPRcaco=bxiIm#uMha z0?+nCQwk}43&}eCa56vcj_^doJa`P9f=)!Gc1shUGkJ>SjS^-8F-eD#sIFoS?-t_F zN3N9I;8%XJDOdC~SrE>yl%rQ@Qe0AO#J~O!2!zB@kYF%C8JetV4%VV}1_*Jygp?ne z@IIgs-?3_hvsYP=6};%RDvRVJ7|Uk#MCJPL`*)=kgIJkL^{wRFyCZ*4O0_WKVZMb` zNoM2}=JNwja_3rdA#fVTV1G&A2B4uC1sNp>p5>8&D$T|^T@u74{75>6DmG@;w}MbV zx_v3b+s}9Ip&(2-U~;KE#RK?aU`tnTF*daXHcPdwI(e zE-_$=YX?F1v^k|TL+}Dap&4-ODH}~dj=U?|HLL(sDGJaRjxQ2#{@&Ko%UL#?s4&k0 z>(BkWvf$8yuvxXGNjJ4t4$4S_IivygEb4KqSfA^K1WkWh8#eYmb|e?gV0hCsf{IVGu}T zCawb1Ti(tq_Lje<>|KGq@$c}le6C?%^Ip&ol#8jyEHrXcwb6RN)~1eQ=NBSZmSkpn z1xLirRLgFNJf(#}K(SK>oQ%zl!S{v1m`+et7&O4Pao}^}4MDg*CCdcc#pURHI|9k} zLGIM*rqZiQf6`BZpIdwI?8GmYSNav>i|2CKNh_eRpLBL}U%+dNhaFH5;B0$zG>uU_ z*v7f>9*nRb$jC?80TLwrOi^?s8B$v3s2GbVyzm13BTGjR_RSbVDRpp#k^SE6Cp?{p z8mFlAD`Edbs956{)#)GhV6wRZ!C~Xk=x9ZWkQ$uN)Jt!C)`!(7iiFy{a-Y4C~A9t zxo_ofjFOslw!jES%bpAaxb6nIq(6pRTq4N+iC)Qn=}PyIEBw6NkT3ix*oJKB6>UU+ zB^JVtsIJADHjk0v96d~Vhk~?WV5(N`fZnb>#Skk#%4RmjxsZ3o6+x4)sfAmoY`#6> z-~6JMGdh5UG>!r15IlhsOByhu^c|zC1sZ|$#5R@QO}u;hbz}QvPTGa4mCm$J^N!2& zA3nEWw{lclFyAdAWHGIt9a~U_H)n51}DrmrOLw~Jct?k^2?H+)8#v}YiYu; zINasM8+304jfmEJo)i8|NV<_mH_}58RC(j>*C{| z`pZ--!n6twe-yq8|7I$dYYm2N-vWEXwqStrBqWn3bk<^Uo=~0V)^c4`;rLZ53)k)b z%lHV<)+QV-3v6tL89T;ic4& z5o`V~k2o?bQx9oi3$d`Nn3CsGTFo}Se;6W>8Y=#li&BwkLdKO4uo7j=^Jm};mN=8? z9re!?3a(nP4>7DZ6HnRBZvrw;FHhT23_UO8DpwM!)2cB3Rpz{I9>nH5u7<2O)Us)Z zz3gTHc?sVUY$oBD0yDiY<~iquWJv85vy;N33i=W^5%lpOY$5tKJt?3PSP|n=ydUAv zbwP8;!UaN!M|NzpwuQI*Qldu2dVBz+b*TlsosX{e0#f*V&F!@uBiHl})TuqcTj-xH z?^jVv^<=jjep61VVU2AC2)fnbU^Usv`nBWgQw=8&tYJFM5vf<@^6_QnXPh2Ysed`N zk+uYKm9W|f0kyGTUG{5<+>*!i-9y=m2I{bMvVir0QA%Cl9z!j$6RRC2k5l{%r!LwK z6?v@wCOJe1z}c)6)MtPtd609F0*bHw(Z|^Z!Rg2PAtZau(X5YResmoR!ih$b-22{ay-)-t)Sju zVO?+TjszYXIetET(B6L8)G7Y=NRy$M9tZB=tXWt0JyFX6y=7IqG z>KS*``~<9xdSCPE-Ue5Q8f!Dao=C;YDxp-5J&V3go(pJZKM@isD*RrBEie3F<&&{( zp$lDLYE8205$9ARo=2FK8FZfpzW*|8v!QIUOGTP78JPD39rpH<)$u6|< zHj>0l^DH!@@n;K3w;<5ml3CyH;iO)<7APw=VtcBRg%Ya5In_JETC_S3V(RBm^6j6C zGJ&p-7iEQZW}%4NpY`5$Ua-)JUBn^dTc-`^B1;6pc=;6^QM$4cweiFNO<~F-<0%h zTp%pc&+m$_<%g@eg+ALw^Fj{ZP}-!+0!kUL&(^n66_%tVTlsLI#(|+@4+_gRcB@)g zd9FHt&9-41_uqTwX=It3bt1vJ5ax_$wAAH)jvhTGgYyYAb(=QZBdk>SD6yCABhjc% z;`4whHQncXRv)c&Z|nYWkN6LG0sxr=K}K~_&<2dmn%u7S=(8qH$a;iW5!To|1SLs6 z!3YcX7uy_K^~Q;t;UveYvzsgKG;VF6wH7Ndw6jSENRRd_%3w6EjGqJixnJ1@si~W? ztH^@y>WDQkxCi-SLk|z(28k-G@~@ixQevtsxkhxiF3%jz2x~rC=H*3H;?Qv*b3e!z zps;>7iqcEqKz@#bV*R*7_7TZ;b&xf43riUeZomKg2m7QEZz8x!OgZKL$pc~)RTn>4 zXZ`OH#U~~u{qen9z(o+)yJk)S`zzbHs#b+#(+`WrSL0zho2R7FOX3xlrq4)q2LUE0i$bN)i*Vc z`@1{t6O7dT`1#5E|1%xo{gEf*OxotLj!h-d)Adb<4=mcSFZNM}%bR6wuWfmK`$xGu z?%VHaRUny4Hdq@6YTH|)GF)VQ`*6Vo&`fHuSIv^byb-}!rMC4hUeoD} z19FoqjK-UyVyLVc;~OTiGwCzAN|mY7vyoJEyH{ru_4ya1aj#@)(;U8QnhBM|nK|Ic zxEb+@<@NH>YrNa6U1b*KuOk{xbg{OM>_k8HwL$9aJLe#oC8yV)LS%dcO*%8$zvQE2 zbJgBZ!smvJvHqu$v;2wzeA6&Ux1@A84Ba5z-Q6+d&@C}AAPCY8QX(~Umw-wRARtJm zbjKhufUxXu&z}9fU*7-VJ?DAu=en<{oRC_TB9}H2uE}0?7vG_t9f*a%fr?;3hp<@A z9`r=iSke!$?B&H%Z$V_y6R05=3@on8-3`M+;I1i!PmbM|>CIZEyx;lA`#D^j$`z8t zs5w}$MoIsrj$Uox#*|$&TjYYRF1O_|_HbKFFd*97USm^mNF)@Qj@ttmL?I`bjLGW> z)%1~Vs}p#5B79`kQ+D%W(>=$K+wWE%5j?j17nbH@!v>(dN=6v^ihP zD2kOhyz{2=?l1zD4;|W=3;?KSCab8XT@rVTVbr?%UXyI&F9HlQl$ZE>KC*7_C01@Rz+NcNZDr5HYcurdv@LBxK1BUtRT6kWTMGA`7h3;wNazJ zEy$U1gbwlXpV`V*dpLd6;U^#O4y++fDGcg9>vpo@>XBM6n6Q9$G5g%59rJ-prqo02 z55{P-IJ>Q z5vYqNz{72ab)j2+NO6$`TUYX1Mb$ckv5(c-UgJ8|XT+yfATouzxh# z*(1J?#@~L!O%hTd0w0L};j7R%MB~bmxXG8jIAjUV9U$hB^$3Vxwd`lA3tuF71??}D zEaz(d{eJa3!}=&x&dq;HK^-9Y$2g@j3EHJg6->Od<_%Uk5-<;!>+{u|IWOk$;o@0^ zAn1DocvNNbMGVZ7|L_s)PvxI*w8S*=guIPEu{3!TuIR5Gr-W7O=7c4RRRLJG0-N)r zT5#u8XU)nSLbyxqKT`6;n4toW*-WK8uJLVVt84TJqgiWs(RpvJ!=r5bz)9&x)Eksk zr8iN(Bi$<%5kVSw+N<$xKOBK3H>=Ha!lY*%d)*G)MO2*%#+$`lU+yRy9)>c|a%NFi zw%5m)zoUgnmrjSFd~$V-j6sPqRo423{9VolaX!LKD}c&(89l1<d+T<&=kWu;dz;uBX zM+AexMwaFUy{^lR{f0#E#X77jqC_4jW(h+b3jYr^VT?j^ts@bM@-aR(Pu(>M| zv|S~Ov7}-ZTHS2&Nn2oVeDkCoMKS9A23~J zuf{L4?2vkR1Cs-Q>EFy-3!1~6cV1<~AJ2dCb)f3g0r)isR-yAZ*54d8>%8s+2fR2Y zg>0TG77ol58%{k%%^D3ihibXjvI77Ng^bIzH=_7Wbi~Jkz8bw60j%8BZHLndhU3lP z>d4^GQ;IF>WIa0B$ubUB2QXSEMCzBh8`m6P$-0&}=?C;Msu$G8nF;Bqmp24RL>O}) zs?^`WZLWKJ3X|4sXr7K&9>mB*@_NO8NDzNwmoOM}zlo3G(@6zZoWk7nu6Wyo`}gBY zH{{bJv;RAwY|MPJ>U>P8R64H4lhc?T{!3z;O7K~ifGXvszqAJC-)SJnrnuRvU=JxD zE+)%Rpkox=7{zEnVr^y#z{67+&d`jYgv$Z{h^}8xBCR8R z_40Yq&wj_AN54`G9-IgeJ)jL`%+0HRN`7r3cbi8b_hK19g9~89OErCY$l$4AO&j!wOBeBWp4tM-2NjJ6%Lwh$ zQ)!E6VCBVXa{owt!`%TUJ$AA)_S7j@ndB7&@6-5xq9T{rN9S6zF~8mpMRvO7{cmJ0 z;*#)9E_=CIq%0;2?a?vzSAx_F5o-y;qo^hoCR;(nkUmXASm+f9#>AwCwxwF6iz$Y! z+~A*Ax=K>yI$&$A=AAJw@-1&#C|xU!;JqM{9OJD5eHs|U`T+78;@Q?#CTpwH7fvd# zqu+8n- zL3Z)-=Q7NTkLPpW2brD)<({7w`kBw_60~XmKm0wH<6Th-@7p%jmjb+tZuiT9g)`gu zE!bdGrrL7OtG|XWF0%%G-Ch0b*8o)s{aHUGaS6Et*%S?FL~!CF{~Obdo8pjC$n@)| zv1|Hp|D+f{$eZ*UjU+J?3AwSoYlu;r*ybLY2Gj!TNlN zCluxJ2^im>@SX@iZv#N(K{Z3$))bl-W%z}d_dNGS?{H$c42+pdQ8Xif=HCnlLS~V* z0Wq@?yd~BPf7J6Dd^_0)FViUieNr7C9~#D73|gOj$3qC)ce%?tJwb1F<^y9o0u@^G zNEEnNxW6zKfsEKG;7g@Yh5-@3jPh~Ny9BjPEt&VurbGWI0;exM(P2Hy5g+Uv>S~6h zT2}VdyYv$OWeV_&@BVWPM<`FAOKOG9VN{&(utb+D7#Z=S^qO;U3-Un+nm#x~PdQW@ z?IdHJX~){mMC8Kjyr`?cWuFRqxuq_(TcfA&6hVIeCx2G^zx>$%XIwi&;hr>lqCoX% z1~!^**wE5K;=y^2xcf9yz~0(iis&2|F4xMe67u6a1}*I7KzuSyM_VLUBF?pWAY7UhN7LhD9}BQ&)rxFBo+)y;x* z`kuX49PI)anXCvI!^ey<(RO-mt%tS?WX^eg_9zI$Ur$*Q^+%%7HxhM>Q^<=_?E&8N z-_0^G4gA&^3xIz*XosROzJO+d=r=`k3 z5j9(z=03OvfH%bjs9e?lCRaSTD@ZvNJRhQwY}1E%hpO$I1jVSr%iAQ?f-|@q)BafL ze`YgeA4=R;!o_w17@35Q4u{YwQXBdC)3cK^r5RGc&g?Uom~N67IVvKoaUbhx)19yL znp;?P^7?LZUmg^DeEM?jwNJL_yW}bGR#TEObh6jy#a^oX-I8Ew-nAc#YS#PHI;S>= z2gM9T%!9Jz=1gya@wi9=xB2SmgN&Ld1fM2{e+mV);V(6{MW?DM@%=0{R&{Ir&v7js7E1Z2$8-2_ABzbdj zJ(CZvfx@+@-O`*i+uXp9x7mIynC&2$jXYNDtaS{BT#d5A(rmU!ld30 z>kPmVVd#h*p|^pNVCCgSDfk=2^&kO=e7S(Dy7ev!1x(6o$JrUB3y!yK5o2a?Reb^8 zw)W7OL5F5X>eMT4+c!31)TBkvyF_F){Rml{{w>93m@|MCH^+sWYl??M_`wfZ!px-> zt%QeYicGO-^-zlZZ3=7tufb_?9)hi+h%K-l)HhTz_)@955A8z{u(XRG5zf&@Av-<$etQv*3y99`o12)zP(oPer5O(i}R z-Xa7F;WKCfmqMk(us(vu>4j$R*Mw0hT3uVIL8Ih-N>Uke$V7A>(zCSt#c32ss=VX0%a`HB#FsAeo6-Ocmck3p% zhEd(zS#&k=Fqyp!j@f5WL}+0~IViUWvj8mFIDCq-1@1vP!|#;bJOe)*A>S%b1?3P- zs?lo0z0>0|q*`|_EeffYJ_g4T{iFVd&!|!Xf8>(?%Q=fHsH%T!RCgn;boc)_;CMjfTMLBWK7tmsQ5j6|rdp`A)#B({t<+{Rr zUSdJFU*6p+N}kB?FiNeigt98rfB`J(Nu>Xt(WzdvO;l}|-EVNKKL)C^?B3li!!P$k z;T!XL_`pE}%D>wC)^oLD*G+I44hNK#?cpPxUd}W>-oK0$S((dM(^ctn6IBlQcOP+t zKtUz$q+Hh-MxmfGQ@y3V)Y`0=@#o738C(?Z4&CES{;s`ltM&+_kepV}`&X7~<|Qv0 zxiI!=uBgf?_1$Ts2E7C?GPEQW1(G(f=3>ePWwXz_@BJGOnoD^02-8!gdefcRPUIzRm;sm7LzDQzvMNsa@nOKRT<`WPL6yZA98lgDNS_Wq(lkN{@Ll! z)31N)!Z)6O|J=X0Wter?kKeKAVWqNRq%oV`eS|S2#p@nw?iotUPM7WEVpeF^R@4>q zca@m@_&qztQ{qS`^(>f!!CX0zq`}S^sa9=Tq;Dze!Cv%h9KI{;MQLrHh_P?-u+6XF z0K2&9yRIiiEd9srCw%OiR2h#Wh8J)~)>c=4@t<;0vshHr3~B+jdpxG!pWft@>{IyP zch_Uq47^`qG9EB%zohv+lMqh&-onC?(fk>db>J%;stPS@sy4Q6>)v`=|7{qW{0yEE zK1bDZ0(~m*&y5Fo(%2@*;5zRiD+DYz(T9Ek_~}$C`rNlXhi^Le^#G^b3+Vot5)< z39(znsfQ#r71|R>nq2sbpXr0B>5X(6hok6&-1J;TDyT%iP|W0vr&X8N-x(*G&)(sS z2fA|WO^K*nIA5%&@38~2{Fpc`I;TaBK07wF*GC+aqI*ba>pS;3M`L6C<&tL;`f;Xp z`_RpTKDXggMgE+mn%e6$2}z?}X(}kS?_yjNPLqf!ve^5@rHW4=x3$TC##Z!*kHL|- z5brtxK%m4Ug7w7U6qf_f_>4#{*eT z7xhY_WU#(O3h-7MGj0cxB&A!I4uyoty+Q4}SE(cur84Y71g@p(6s^mcd;s<+XOsqw zUxuriy)$FASfa(JAV}W$HL8LS6Qh>bJI~OGvD;+Mtbu*Yrhjj>AP%XtahIpr0XyDEj7+i zo*a|NlZvaZmmWS>fcs8}upBCYam1>W0did0A8mS*Bl!?#09jLR8xr5Ma*e7rulsxl zZ=3xtiYG!7Vup&Ei&O9W$I+0;g~8LbjZnizFTWB>bR}9w($RP0(4Wd{T%?-^$opfy z{L}tzpleyg7E1SVrUGVa37l`b`PL)yikgfl$+cZk(1XeT{Y{YRplw*6j8SmtqB-(IemiV#MjO z|4y3B*bjz{@+GI=f5>~vZ@H{gGIINIVwc+M_u7Z%-losp(TYI9;gxhRdmw~cEpUA2 zUAdNCwgH#=Vj@(l$pPSX8u2?g=Xz^6Acv%KL?rp>Oglpp2c(*z7nPe|ZKWs@7k0H+ zq+ZU{$YSgRTw?s0Fxw&lH7ajbzfHiS;nOaY5cr!9+)maZF9g206$TZ$H|aPTa*}V} z##-*C8p{p8EVK0fm;--z(G(1*wSGcwIZ6GzbVkr>SgOXXT+h6CgM0A)AEoizzK-5U zlkk8Q^2&*zpenb$DFIw{J5KIOE@rT zfRxOS9nh*Dw|dPPFc+00nOAAb^;`8vy?zh|dCj)~xN%0shzjj>+Xe?}5Id%I-Xe?O zS$Wir$`tQ0$$X0UCM8JoNMP+|A<>zuV_~TpCrte)$5>lQZQ-in1ZMow1=_I$J|F?l zsr4>X{1aMzr|vWjLs?j|(p{>Pkh>0=lM9*N3CBr-uAouMK08ZoR~`O0JYG bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..e311dc8cc26a3400418dada4154810e5eac750f1 100644 GIT binary patch literal 7608 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 ac2h+h8qd!+&;K6)0RR8G8tvFgbpZfe663D` literal 7643 zcmV<19VFr(iwFP!00000|Lk3BbK5r7{wo;1A2#X8if*xG&Gds~C#hSz(OP!1+r+bl zNJzq(1i2*S*!B3ozXO0*ksv{eQWTlnZWEEf!G-5M=Yj*^NwXb9Tu0YNTDRS6A8IWP zlbNlJo-~T7iL{Y+Vbi4tuEwX}WPGl*w0q=w*e1NjVY_o+pnL7PrCEqBY{Sz=U!F7q zEmrdbHj!>)(mv6t?VcEhi#$(jX$JCi7duo?`RlL0=Jr=ITM`|-^1x3MYP)cbE-^vw zgt|+ez6Nmuubd9hZ9>rlZJ&xiUxQarylnf0S^&AO?Y;(2U&&YMBD!=5@Y?5uB9}n3 zy+ZKySMvOo{PovgT1)emmId8MZKP=}&4DhoL@$;u8`Jdhz_C5d`|iJHW4>)^F7lQp zWi#gwf2B*Qfv4Xmn)dVsvLK^}9-!rzh_$25I^AA>pxw4ub>0nVj$PY9F2$_G44NKl zY4p)Sthhb>FVd-Y`^@_Hza@5&p^d1!M65H8i*!iY6JF~%<5^2X4`RyBY~5p>Nsi$o zri(nMQJYSo~1Q`jZIk=rDR)*I?!kgi^ z)vl#^E~7*-*F9-t7oFOcg(;f{*EY2gS(;``%Y1l^TniIO(aQ5P?7^vtK7Av|{QymK z3iZ2y8~t~mZTD{V<#Q3UJF!Pkt6h51Fhv%BqaZPXz&wW!pzFd%_B*@xPeHk6SJ5e!|H3v5CV&cEUhVWQ)GVUj{)`o1Ywcbu=|7l+vB7D zuzxtbjRxnJ+y@al>U6V3=yZYfyRmEEGgz!7KnV&`@tNZG6`Et#O=OJi2_3t(J!=7{ z2fo~Tf~^0guMm6Q2Mmi}gI5-GzC>&wzT~Y(T}%qq`)b!%S6Gvb{ANWjd$=3p-|Ac& zjiQ%oHRHo5fe14xZd-vy`%<9Nk|x6WS)mS0R^YstIfcGz^nX9M{8>~f`<$U^`4_zA zPfHMpL1gS333Xli6ZKP{h{=f3H(}Ic9SH24>cE{NmZ@ImmsK%xyS=_P(sW4vK>^fx ze}Rjj0Zd!J(^v-`NSV}+6U@>6DQ4UG4eqItbkun(L3kHIirzu}Zs}A5_!t2hzKgki zE$~dRZ&{ra&9>D*u z9-s?Ic@;jZ2NoM5LsWN32qtsz4bugC|CL;Py1tqG=iSNaZ#U!rygQk^|Ihg3`WJx6 zJ$7wkAwt1DbTLyZz(W*J8+f*bfCK5G1t2kaTVDxlj6I8W^4kItphMGSEhdJEJ>COM zcpsB*{drFzh!+Z zpI_=_t~k+pS!;!I!&uv8EJ@%c`K8E4U@L=aU96Q&y5X&@@>Wk0k;wQ|HDgwaX03eH zAl7%~Dv1}A_)s_G9=Y5gua~p3>DI(uQsNDVZI{DTZ23Pn!e3cbYvL{m>4vwq%3J+B zL;l=yY?q!v3afKcL_-$I(Xr7!#RiYeD@AqEbb~PaMnmj=KZ`@^d~k$2T!#Z@IxXhi0r{~j8cDf4Sj1t%{^G(mJjD{@7YWiFXW zgerEz6zFd}>G1m{q`Xv%e~=fCO0z^g5vhE-^)vDc^@ff2j*Z{ug}&kpQR`}B0pU6s zIh%aL$@|C2c_Ek-N7RqUD$ASeadCsj`_99Md9G!QAL?F7EhJqdFH0L}_<8^MS<&OG zcipytaE-hyA>VNF{&8}FyH{h}FN>OtXTw;UBI9Ne-Z-~50l!TJ{2B?3B=kt)$%@s+ zQ%H1Vo zA2Bv&T?Ij3!)-ZWj_(nPo}Zs_ezxfXxqJk*?Ua#B)#f%IZ)EeP|54S_FuJ|7{%^MZ z`QzUYfB*L9zwgm6|Dw*v!xPWF`SqRt`Qev$A11wDy!ZCU>j(Gp;{LaP(OKnmjUC<4 z_+sHo60Q)E`Vr9+?`{o<5(KhW41eiYiuEpLd#(#x}9!I zd;j2I)+ztz1pV)KTN@2}&n=CO0g9P>(!>VnUQ6S7h$HRa#O(YzdAHEXuM70gpMTb# zOP&ei54A*%psOm$1j*S@s*#ve#TwPJPWXo`ooFJyj7rC1UsxgZCL7OoM!OA+^)GM8em*M;f5`4e=0@iU`-o@X!*im$2zrQvbUDaPkylEulQplFn-?E-S;$LFP(@hUFPWB|w3*@bAaHl~= zKP6iZvP*7u@4-9hRm;FX_s$8X7*gBK$}VRGCW!bs_vyEn$n)SFWo`@jL>I^%qeRu{ z?Sw+Q^c20EC_-1NJQr6bzsO$di_DI`m{jwj?D)W#v{hazU7=CW7Na!LW}{KF(Wu#I z)NC|rHX4;j|J)D~1KD$;+YG(v8YweUYBG(G47GDwopcjW3lXp#S(C0B@i4h zrzZ9mmFixhSxN2>^5-_rJ6G@<&(SMU!?tPpZUt_62*natJFyfR9VfjBlP_k%s&OqU z8-ws8Kg2bj=d7Tk7F`2Quy5txjGpoee zRNd^|&dHYwUCyw7RqAZk5)Ndt>_r6MLnd3=>C$yeujTqyqKP8C(=r`gOyv`pMa ztruC$?>`9d)vEdlvTeb2QWkvSlB{kZlMlS)7rTPrDmu8b=$z^jOF7%drqG-OPJUtW znv*;B(;|@_@Gf-v7!k$+>)Il5GV=QsW2G2msaYK>q&IfM;!5W-?^sNiQOVo#u~yuc z=(~Dj5TZle`+gbwb5ZG{9nnet+mkp2aT;Yp`j);vYaGh%oA9+rFkSViyEL^-t*4O6m`!RU zTJD7=s10SeMTie@g*+xbHSMa*ptiMbmDz2p?yJnG4Irh+a;OKW4P5cQ*<{&lvTQb4 zZWX?AGbkqOZnB)nHd%6zV$}16X0- z4UVGUt6>mtf7n4Z8X%?tau*dRwQa+k6mG-hIw5NdqbiQC(BJs6J{NHePK}v1DFo z^);<4WU8l?6tC6n>Eem(I-n39qdcRvpgbf~4$Q-9%5WZUr~&ks4Cr#sm6cL*4r72+ z53&{mQuP$|?bt7uchx*kHV0ZAm;$X3aa^G6^>KyY0zw&$})xl2~iR zl;Uq|ii-GKZGsY#Ys91xlWmBJ?8>dNiHtcC3cZ?$#0W?-iKn<7SPX>{lBAX`9oNWm z0CX^84?vMeF`1W2R>@2$j`cEg5ia&p#o+XJNOwD(PD=~+EgqM&6r*j{g*KV`*2q1z znq*gTU2!HmF~s_5B_2)09gO%)VwU01na9ZNbDr@x?T3NOSzRpn5tpY8fHD6 zwUY%es)29YK-#Di+o+j5e6wuGnv+vHRb9F{SKDl0xPjpYh8q~( zMHrSW3J4^-wC{s!&DX%-7?te+aI(P$eH-*`(6>R~9YkN*rMLpdt`J;16d%$kg}hVS zHrETm$J;HA!8ah>fbf<;csskio4|9U2g>My+!fg?WFqJxu>%dIQ&q}ng9N4RSmWtN z8;iVA20Nh)8YFIzIElo=+$F#Xg664hS(v8rMjeG?R7xSRe+x?6uls39*R#=+{b;Q8 z2AFpSnA5DjUK(zhV?I)cdQ{DGZG3=6^OVp$xeKBZR;PufistE6(mZ3=wr6!IonE7K z8l|&~N{4fKqi-60v)}qAcjb4&4?9BjI6D!cidqNN>GC9c(mj?!4rtRuJ02Os-%bnAe~~vt5FLzZcw9zc2WyP+^)za;R0oCC&x@`rB{;iqQ=W@ zYKu?9R?cW?)NP|~OQ_r2Tm%1@+cmS!VpO)1V~}jH$uDSB=}xH927Md!O`z{_N0MK_ zj15fYCsW%^AMC6Gym11mm|Fm?Dm=Of?cn{cjHkKxGfkz=lwVlxO{qFsW z&1kAu$#)7kC`T^QrE1pAj*Ew64NJh{M?~L0I7p|+U_5rVbfM1|Rb(ZHV)kin6kDhr z6e*UNeEKrc$*BeAh%tV{eXI0!sm6;PYY*V>1|B?gg4P=(E@f3i$*-mS(h##Wgj1XGanCh7qQRebMja6 z4PwdB48kBdSHrX><6ZR-|^`M+N5FlAA{i~!79Nim(acYV7oWY+=WK9cvTi5 znH?0JZ7DuXq5G6cdgE@?YBx8=e#gxXc<{jf7#;t z8t;)nao_5gxwaLqs)BP03>$gm9~4mJT9`n}5!)sQ`T}Co0^K75w^Chd z;#3txC30E3U2s_%VcIicl3jr6Ga%y>KajePFvZB!YBR17E|jNOac1^`DFQk)O=JMB zfP@K$33zWg^by!D_zW@Sw?&EIu=kZv8&DU|=g18s$OyXTV`JF8O!>);B!n)+8p0FO zs8w>}RExwWEF1Yz3AZb7sK6`c@{l>xG1LYy@{()5U@lFjfhbM+KS5+GW@G}LV0U{B_f5*1B@pCo<-FmkBNAQ(6z(WKgsU7`ssyV z@#*iJ3FNZW1)aMtnYpoykfXV)N=jKtO8w%%^+gK;6MGccGvN4d zfd@riq|g|Ch=j^1S%kzEk*1lfTqcusCgKt@M`7x-?MGC%p%3S|E1gOx4ON- z?e6S;+-;7PU2hm;k8?8NKJ>br8_<#YLtk#8gQEZeMeFi)tU)vd**-Gfl*gtKf$?D{G|vo0y$HC+`+I`E`N*`SZ_OOXJHiLAh(J z-w8PTgKuB+AHR2OeZhdV+v##36WgZq%7h0eTzd0(ml6-I5Oq0_4tg!^+72=V{dvBC z9)0h+t6SBcWbTg$nrm%%CyHhNTvJ=)0CZnkn2+$JAKBlW~lsziIGWDzLAu{frUH@ zEk|wS*Dlm^cce;9lt`>p+DT$dS?=`V;z{Fc1MDwTOrZPtp6E7@u#U7T^w8lT*3GDP z2w7?tUx-c{Fc5tdF2MvoMypWwv3;|0n8g^rTFd0dKsoK%kYk!J9Cl!UJZGz?a;UPe z9zgEOi8t{rs&!ldK|=14uY`_nF`=sFen?tw=lj0^CNrB^`gH|*B|Xpd)w9c~SgV0y zI_ma11+I4ug0`qFuv} zsX02Fb&rR`=>eMcI|l>f2pvrONIy7+hrOfOU<%*Dq1MuFt}ephT41{mdM)h|J_I*5 z^WUeCA2%BCCHu*`Cw`YbL@J<_#d3>B}N@{q*4@D-T%n1*_fS| zr*9Jsta|hpbfAvuBM-)&+(T@_DeL)hOZzZM{=PyUa_?DRj`?KrKW{w#plr}EBCHfM z3_Gb(I?->XQ^?p@R0>8jpu|6(TFK_@qV+Y3>?$>1;NKySo|vYsucK5#BE?6Z38ZJe zxPEkya5q9*euDo-{7mPl{20>3HBTUY_2o88Jry|P=?;E}Q=XH9-k7h_-Hfl2_&giy ze1Fh?dwkR%_78_O3?qF6Zr7a8P`}pMAP7Qz?QmGkj6+t%M{8laL z23;F;-72~^&=x_P>~bg{6+U2MtPgDwmEzUP*p*Nc)3Kk9D+JbLERx`_!Ih0CB)Ym) zL$g5`m5Y;p41~!A${#Z9vP)*DT*z}mEg40Bw1CUl#iGAib(-i(E$T3Tl{S;dN+?2B zztFmW4PI3ahx-j|pCLLmyIWS}_49V8`qF$G z>dP~vn~Io|d*VSY+fy@pC)uAWE2|>eNq+o!X&I*&l*D-1j_{zbO$PCr z8N|(fsC7bZe*DuE&!fq_5q_ zbzNGY#HPL4S5w3g!EGGeNOk!s1>YmjVAp|C5~BWWyLZSvwFzNzPz5Iw z6xQ0&zDh}Mi6u$`icC{nqe5&00cx`@h&ML)#*2F3YJ6Jb{^4dH{P*KzNeEl;#IN?W z+R2|$b@@Wea*2)h%}uyCD1b7oS){%bO>At{rJ$3Ui!jA?R5U)C4UOYt*gH5J9=<&o zbce?W!`TcT9M90KGaGge5kg@CL~x{KOv|TML;ZvT?dY&G>`r0l;IKP24hC=G+k>gz z86Ln{=k2Vk_YTopBRWN`fZ{du?wAZCXui4cykVTqPn3JZbo$kje1@26qYe+SxKtZy zy-u%l(Cr>{d)J-gQLi`Z9Q~=av|ntG`qRF!J*sVFoi=JDBLXC*u>>_yq24pjEckFP z2zC!!nuSU1*J_eR^nG^51WX5iVvE-yH>e-sx0{0tnfXbZ*{%f{TN{v~1Bxw_byA`b zk_yK;?x~+CyWCMgNXW8Vrw)jys3PgF%bEntX$fHtP0{Babu z>2(K3gJJ)0Fl=e3;~P&K9S&OBNB*}j8vHoE0o{K8NV{dS@}9t{8Og;ZvTi(NTw=mC zQ1BBz@Sh)@r3m-<;&IAf%@xUnvM7w0#{4utHw%>|cTR~ARw^YiWV{|5j7|NqI| JfEo*V0RT7s00{s9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7bf6216a75f64bf7adaa10fbee6e214287f259b6..62ec8064c97cfb0a84f7fe2b5284a0161e163955 100644 GIT binary patch literal 2561 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 diff --git a/cli/auth.go b/cli/auth.go index 6426a4ab6..20b9bb394 100644 --- a/cli/auth.go +++ b/cli/auth.go @@ -8,7 +8,7 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api" cliutil "github.com/filecoin-project/lotus/cli/util" "github.com/filecoin-project/lotus/node/repo" ) @@ -47,18 +47,18 @@ var AuthCreateAdminToken = &cli.Command{ perm := cctx.String("perm") idx := 0 - for i, p := range apistruct.AllPermissions { + for i, p := range api.AllPermissions { if auth.Permission(perm) == p { idx = i + 1 } } if idx == 0 { - return fmt.Errorf("--perm flag has to be one of: %s", apistruct.AllPermissions) + return fmt.Errorf("--perm flag has to be one of: %s", api.AllPermissions) } // slice on [:idx] so for example: 'sign' gives you [read, write, sign] - token, err := napi.AuthNew(ctx, apistruct.AllPermissions[:idx]) + token, err := napi.AuthNew(ctx, api.AllPermissions[:idx]) if err != nil { return err } @@ -95,18 +95,18 @@ var AuthApiInfoToken = &cli.Command{ perm := cctx.String("perm") idx := 0 - for i, p := range apistruct.AllPermissions { + for i, p := range api.AllPermissions { if auth.Permission(perm) == p { idx = i + 1 } } if idx == 0 { - return fmt.Errorf("--perm flag has to be one of: %s", apistruct.AllPermissions) + return fmt.Errorf("--perm flag has to be one of: %s", api.AllPermissions) } // slice on [:idx] so for example: 'sign' gives you [read, write, sign] - token, err := napi.AuthNew(ctx, apistruct.AllPermissions[:idx]) + token, err := napi.AuthNew(ctx, api.AllPermissions[:idx]) if err != nil { return err } diff --git a/cmd/lotus-seal-worker/main.go b/cmd/lotus-seal-worker/main.go index 24918e52a..0f0cb88e6 100644 --- a/cmd/lotus-seal-worker/main.go +++ b/cmd/lotus-seal-worker/main.go @@ -28,7 +28,6 @@ import ( "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/build" lcli "github.com/filecoin-project/lotus/cli" cliutil "github.com/filecoin-project/lotus/cli/util" @@ -366,7 +365,7 @@ var runCmd = &cli.Command{ fh := &stores.FetchHandler{Local: localStore} remoteHandler := func(w http.ResponseWriter, r *http.Request) { - if !auth.HasPerm(r.Context(), nil, apistruct.PermAdmin) { + if !auth.HasPerm(r.Context(), nil, api.PermAdmin) { w.WriteHeader(401) _ = json.NewEncoder(w).Encode(struct{ Error string }{"unauthorized: missing admin permission"}) return @@ -394,7 +393,7 @@ var runCmd = &cli.Command{ readerHandler, readerServerOpt := rpcenc.ReaderParamDecoder() rpcServer := jsonrpc.NewServer(readerServerOpt) - rpcServer.Register("Filecoin", apistruct.PermissionedWorkerAPI(metrics.MetricedWorkerAPI(workerApi))) + rpcServer.Register("Filecoin", api.PermissionedWorkerAPI(metrics.MetricedWorkerAPI(workerApi))) mux.Handle("/rpc/v0", rpcServer) mux.Handle("/rpc/streams/v0/push/{uuid}", readerHandler) diff --git a/cmd/lotus-shed/jwt.go b/cmd/lotus-shed/jwt.go index 78abcec76..e8853b419 100644 --- a/cmd/lotus-shed/jwt.go +++ b/cmd/lotus-shed/jwt.go @@ -15,7 +15,8 @@ import ( "github.com/urfave/cli/v2" "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api/apistruct" + + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/node/modules" ) @@ -98,19 +99,19 @@ var jwtTokenCmd = &cli.Command{ perms := []auth.Permission{} if cctx.Bool("read") { - perms = append(perms, apistruct.PermRead) + perms = append(perms, api.PermRead) } if cctx.Bool("write") { - perms = append(perms, apistruct.PermWrite) + perms = append(perms, api.PermWrite) } if cctx.Bool("sign") { - perms = append(perms, apistruct.PermSign) + perms = append(perms, api.PermSign) } if cctx.Bool("admin") { - perms = append(perms, apistruct.PermAdmin) + perms = append(perms, api.PermAdmin) } p := modules.JwtPayload{ @@ -152,7 +153,7 @@ var jwtNewCmd = &cli.Command{ } p := modules.JwtPayload{ - Allow: apistruct.AllPermissions, + Allow: api.AllPermissions, } token, err := jwt.Sign(&p, jwt.NewHS256(keyInfo.PrivateKey)) diff --git a/cmd/lotus-storage-miner/run.go b/cmd/lotus-storage-miner/run.go index cdcc4d88f..0d2e5a70e 100644 --- a/cmd/lotus-storage-miner/run.go +++ b/cmd/lotus-storage-miner/run.go @@ -22,7 +22,6 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/build" lcli "github.com/filecoin-project/lotus/cli" "github.com/filecoin-project/lotus/lib/ulimit" @@ -165,7 +164,7 @@ var runCmd = &cli.Command{ mux := mux.NewRouter() rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", apistruct.PermissionedStorMinerAPI(metrics.MetricedStorMinerAPI(minerapi))) + rpcServer.Register("Filecoin", api.PermissionedStorMinerAPI(metrics.MetricedStorMinerAPI(minerapi))) mux.Handle("/rpc/v0", rpcServer) mux.PathPrefix("/remote").HandlerFunc(minerapi.(*impl.StorageMinerAPI).ServeRemote) diff --git a/cmd/lotus/rpc.go b/cmd/lotus/rpc.go index 00de0fddb..95050d639 100644 --- a/cmd/lotus/rpc.go +++ b/cmd/lotus/rpc.go @@ -21,7 +21,7 @@ import ( "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" - "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/api/v0api" "github.com/filecoin-project/lotus/api/v1api" "github.com/filecoin-project/lotus/metrics" @@ -48,7 +48,7 @@ func serveRPC(a v1api.FullNode, stop node.StopFunc, addr multiaddr.Multiaddr, sh http.Handle(path, ah) } - pma := apistruct.PermissionedFullAPI(metrics.MetricedFullAPI(a)) + pma := api.PermissionedFullAPI(metrics.MetricedFullAPI(a)) serveRpc("/rpc/v1", pma) serveRpc("/rpc/v0", &v0api.WrapperV1Full{FullNode: pma}) @@ -116,7 +116,7 @@ func handleImport(a *impl.FullNodeAPI) func(w http.ResponseWriter, r *http.Reque w.WriteHeader(404) return } - if !auth.HasPerm(r.Context(), nil, apistruct.PermWrite) { + if !auth.HasPerm(r.Context(), nil, api.PermWrite) { w.WriteHeader(401) _ = json.NewEncoder(w).Encode(struct{ Error string }{"unauthorized: missing write permission"}) return diff --git a/gen/api/proxygen.go b/gen/api/proxygen.go index 64859380f..fb624c808 100644 --- a/gen/api/proxygen.go +++ b/gen/api/proxygen.go @@ -54,7 +54,7 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { } func main() { // latest (v1) - if err := generate("./api", "api", "apistruct", "./api/apistruct/struct.go"); err != nil { + if err := generate("./api", "api", "api", "./api/struct.go"); err != nil { fmt.Println("error: ", err) } @@ -64,34 +64,34 @@ func main() { } } -func typeName(e ast.Expr) (string, error) { +func typeName(e ast.Expr, pkg string) (string, error) { switch t := e.(type) { case *ast.SelectorExpr: return t.X.(*ast.Ident).Name + "." + t.Sel.Name, nil case *ast.Ident: pstr := t.Name - if !unicode.IsLower(rune(pstr[0])) { + if !unicode.IsLower(rune(pstr[0])) && pkg != "api" { pstr = "api." + pstr // todo src pkg name } return pstr, nil case *ast.ArrayType: - subt, err := typeName(t.Elt) + subt, err := typeName(t.Elt, pkg) if err != nil { return "", err } return "[]" + subt, nil case *ast.StarExpr: - subt, err := typeName(t.X) + subt, err := typeName(t.X, pkg) if err != nil { return "", err } return "*" + subt, nil case *ast.MapType: - k, err := typeName(t.Key) + k, err := typeName(t.Key, pkg) if err != nil { return "", err } - v, err := typeName(t.Value) + v, err := typeName(t.Value, pkg) if err != nil { return "", err } @@ -107,7 +107,7 @@ func typeName(e ast.Expr) (string, error) { } return "interface{}", nil case *ast.ChanType: - subt, err := typeName(t.Value) + subt, err := typeName(t.Value, pkg) if err != nil { return "", err } @@ -197,7 +197,7 @@ func generate(path, pkg, outpkg, outfile string) error { if _, ok := info.Methods[mname]; !ok { var params, pnames []string for _, param := range node.ftype.Params.List { - pstr, err := typeName(param.Type) + pstr, err := typeName(param.Type, outpkg) if err != nil { return err } @@ -216,7 +216,7 @@ func generate(path, pkg, outpkg, outfile string) error { var results []string for _, result := range node.ftype.Results.List { - rs, err := typeName(result.Type) + rs, err := typeName(result.Type, outpkg) if err != nil { return err } diff --git a/metrics/proxy.go b/metrics/proxy.go index 309ef80e1..7253a76c2 100644 --- a/metrics/proxy.go +++ b/metrics/proxy.go @@ -7,37 +7,36 @@ import ( "go.opencensus.io/tag" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" ) func MetricedStorMinerAPI(a api.StorageMiner) api.StorageMiner { - var out apistruct.StorageMinerStruct + var out api.StorageMinerStruct proxy(a, &out.Internal) proxy(a, &out.CommonStruct.Internal) return &out } func MetricedFullAPI(a api.FullNode) api.FullNode { - var out apistruct.FullNodeStruct + var out api.FullNodeStruct proxy(a, &out.Internal) proxy(a, &out.CommonStruct.Internal) return &out } func MetricedWorkerAPI(a api.Worker) api.Worker { - var out apistruct.WorkerStruct + var out api.WorkerStruct proxy(a, &out.Internal) return &out } func MetricedWalletAPI(a api.Wallet) api.Wallet { - var out apistruct.WalletStruct + var out api.WalletStruct proxy(a, &out.Internal) return &out } func MetricedGatewayAPI(a api.Gateway) api.Gateway { - var out apistruct.GatewayStruct + var out api.GatewayStruct proxy(a, &out.Internal) return &out } diff --git a/node/impl/storminer.go b/node/impl/storminer.go index e81560059..fa840d980 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -31,7 +31,6 @@ import ( sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" apitypes "github.com/filecoin-project/lotus/api/types" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/markets/storageadapter" @@ -86,7 +85,7 @@ type StorageMinerAPI struct { } func (sm *StorageMinerAPI) ServeRemote(w http.ResponseWriter, r *http.Request) { - if !auth.HasPerm(r.Context(), nil, apistruct.PermAdmin) { + if !auth.HasPerm(r.Context(), nil, api.PermAdmin) { w.WriteHeader(401) _ = json.NewEncoder(w).Encode(struct{ Error string }{"unauthorized: missing write permission"}) return diff --git a/node/modules/core.go b/node/modules/core.go index 83a7e8d42..e089333e7 100644 --- a/node/modules/core.go +++ b/node/modules/core.go @@ -22,7 +22,7 @@ import ( "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/go-state-types/abi" - "github.com/filecoin-project/lotus/api/apistruct" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/lib/addrutil" @@ -163,7 +163,7 @@ func APISecret(keystore types.KeyStore, lr repo.LockedRepo) (*dtypes.APIAlg, err // TODO: make this configurable p := JwtPayload{ - Allow: apistruct.AllPermissions, + Allow: api.AllPermissions, } cliToken, err := jwt.Sign(&p, jwt.NewHS256(key.PrivateKey)) From c25190bd8c3f4fbf074a0c7441e13849a8c7b401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 15:11:37 +0100 Subject: [PATCH 031/239] api: struct.go -> proxy_gen.go --- api/{struct.go => proxy_gen.go} | 0 api/v0api/{struct.go => proxy_gen.go} | 0 gen/api/proxygen.go | 4 ++-- 3 files changed, 2 insertions(+), 2 deletions(-) rename api/{struct.go => proxy_gen.go} (100%) rename api/v0api/{struct.go => proxy_gen.go} (100%) diff --git a/api/struct.go b/api/proxy_gen.go similarity index 100% rename from api/struct.go rename to api/proxy_gen.go diff --git a/api/v0api/struct.go b/api/v0api/proxy_gen.go similarity index 100% rename from api/v0api/struct.go rename to api/v0api/proxy_gen.go diff --git a/gen/api/proxygen.go b/gen/api/proxygen.go index fb624c808..d17807b44 100644 --- a/gen/api/proxygen.go +++ b/gen/api/proxygen.go @@ -54,12 +54,12 @@ func (v *Visitor) Visit(node ast.Node) ast.Visitor { } func main() { // latest (v1) - if err := generate("./api", "api", "api", "./api/struct.go"); err != nil { + if err := generate("./api", "api", "api", "./api/proxy_gen.go"); err != nil { fmt.Println("error: ", err) } // v0 - if err := generate("./api/v0api", "v0api", "v0api", "./api/v0api/struct.go"); err != nil { + if err := generate("./api/v0api", "v0api", "v0api", "./api/v0api/proxy_gen.go"); err != nil { fmt.Println("error: ", err) } } From 736c69784a47467af3ef6d96e3ce5a04112a749a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 15:19:22 +0100 Subject: [PATCH 032/239] make: Fix parallel gen --- .circleci/config.yml | 1 + Makefile | 8 ++++---- build/openrpc/full.json.gz | Bin 22496 -> 22508 bytes build/openrpc/miner.json.gz | Bin 7608 -> 7626 bytes build/openrpc/worker.json.gz | Bin 2561 -> 2573 bytes 5 files changed, 5 insertions(+), 4 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index ecdb169e1..0e4aaa36d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -408,6 +408,7 @@ jobs: steps: - install-deps - prepare + - run: go install golang.org/x/tools/cmd/goimports - run: zcat build/openrpc/full.json.gz | jq > ../pre-openrpc-full - run: zcat build/openrpc/miner.json.gz | jq > ../pre-openrpc-miner - run: zcat build/openrpc/worker.json.gz | jq > ../pre-openrpc-worker diff --git a/Makefile b/Makefile index e38844347..016e1e874 100644 --- a/Makefile +++ b/Makefile @@ -318,12 +318,12 @@ dist-clean: git submodule deinit --all -f .PHONY: dist-clean -type-gen: +type-gen: api-gen go run ./gen/main.go go generate -x ./... goimports -w api/ -method-gen: +method-gen: api-gen (cd ./lotuspond/front/src/chain && go run ./methodgen.go) api-gen: @@ -334,9 +334,9 @@ api-gen: docsgen: docsgen-md docsgen-openrpc -docsgen-md-bin: +docsgen-md-bin: api-gen go build $(GOFLAGS) -o docgen-md ./api/docgen/cmd -docsgen-openrpc-bin: +docsgen-openrpc-bin: api-gen go build $(GOFLAGS) -o docgen-openrpc ./api/docgen-openrpc/cmd docsgen-md: docsgen-md-full docsgen-md-storage docsgen-md-worker diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 6225a04aaee0d4f139b65efc61d021589a4e9f48..e50096a5bf3702bf791833d0f75fcac62db3f6ec 100644 GIT binary patch literal 22508 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 literal 22496 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 literal 7608 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 ac2h+h8qd!+&;K6)0RR8G8tvFgbpZfe663D` diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 62ec8064c97cfb0a84f7fe2b5284a0161e163955..95b70fcf106d7e53cd28357bedf18ca9a6a3fc05 100644 GIT binary patch delta 2435 zcmV-}34Hc}6pa*3ABzY8000000RQYgZFAZ>)_+B#=Sy?P0Rl8_`PPT*?PjJgY;wE( z&}25kK7blq@|ENyG{b-2k!6gH?O?mmCB)O2wg{c0Bk8>BNRdpXf4=F*xXy?oN9dLQ zNGHUG){waF`I&`42riD$;}yG70#qOvlC5*5KrrIA5~OOac)kk;>D|J@Bfw~+J!66Ee_mUdDu|dOGlTS4W~~sF zh@iDeeqX{|>%CpJ5h2LD`Yd~ykt@!z&O8$9a?|HK`r z;Vv%8E$1sXPT>o53X9ltcOKIg+@-A7mldQ^T!$qPm$E5N5G9oeTejoFWyH7~T^_%K z+C(*Oe_Z3n9hw{W=Cr_yQ$}3+6QaGSXwFl>Rr5c~_6x$MwXE~{=u0!*nCHC^p?xsV zYg|?@S5skWzf2|)RJpYc6Du_rre@}+v22ZHJ2cDowv%t!&e?=lv}YP5KQ*y_4xoE( zvQH7Vo#ZL<=y^hLQ=Q5P??1Uz@le`zMt8&wf3*I*0LcSkM=T58Xf~JBCN3WIyOwUa zyeEGA;Q}OxJIyecY<|c&6_d-oH3$hiN0^N0!9pHG zd`Q?OL>`ynz2#}#!V16CB;|i=1UKW?edIQAL)!Dc{RVV8D;4-}F`VC5ad=m7WH=Js z1}QH=O2b^0Fo0S~3&I@kA&ndH3AztSL(;%oXbKF3 z-iD~7J4g33U{Sv-=9}@5R79w11!Q@07tb@ZhRJVAoRgF?d^;&z+HA@WL>3AX?-xL7 zRa?ezMX?Cwt#5)V5OEB$9+@Q1&6lNK|36o7&K!6M572Xqz-ojoNn(HNA$q(Bf4{Bv zYomAG#8UeiOFeZMo{^3n7DDzry|=rmg?v6GolR`m#D)hJ8=iCu&L=Lw1tQ@qlR&B$ zQm#S&?z8vo@J&u~ucT-na+1yAdt=-h<967_t>Con0>TQ+sy0mn6`3;a#hR@>KRYt! zsn|M2h%{inL5gybsExj;8HlZ2f9Xq7SyEODB($2)?UsKla%-NZ`y9C0n-x)GBKC-* z2G@P=qET=ra0$d6a?hhG%RNuaM*^~%zh{_|xEEn=l7W=*HQP{Th^^=yWP0?YOS)mq zXewU(*K0!zsUvInkLjtbr-t-6jUTxe25TSu$SnIF;GNq-L44M8%_gJPe^koOgMx6R zVRWV!ElQ{{nL_6dFhwUc$;qoDz5hXokXX6b8|eA4SrXfK$b1_AWDcYWhxZxdfdRk<3x z+I}XNp$gW~A1u|u zXGxmOL1W_^8~=iAe7B%-CS?)p#G5PNdLie^9M_LJQ#3Sz=UxfYe?FM=TwZ&A7QL}c zja@o8yHrs0Qtw{Vb}lq+y2rffKxY^uUdNFsF zPP&DqE2`eJuPeYJhilBayP>Kph2)9KuDBcWh`5zV&0xvTL?STXwU>O|LZ7)pYDV;5 zR3ZsVQ8v9|9+@LWe{KO0G=Y00!RE}7NO7clblGiooEZKeV7*_oGMCnBtr7{w&KQ^W? z4m`QgFNnQNfAwOW7b6mob>FYcdnMwjpXtgy41bMm>a>Q`sgW^H&!M?5(4@{wy@mH2 z-)}hBpX55Q0)=dWex%+u?@VqLK^oVPI!Nf@B`~F@BEg*;n?7S5ZQBtJ;y41N1P9R= zTML~ly#Ny~JaEu>jtKg<`8`Mr5j5lu*yz>$jM_6qf0;w|6!jQh;3{hCZ;yRq-+~j5 zqC)4JFb5IzN%xu&IcudEXFHbxnjh_G4w{;SCgTgfF33zqvRu&*jG*%4npizN?T4*! z?BqSkqKU2AcVqKTU%z?Rt!?!7m3s=3iQfoS{|YFmiu@D9<#N!IiJ2s5KI6na(Aeen ztwaG+E!0J71_BTffS5UIkw^rLg$Fdh$ZIbyQ*zqDi^cWgzX1RM|Nr(akxfl{008F* Bzjput delta 2423 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 Date: Thu, 25 Mar 2021 15:26:30 +0100 Subject: [PATCH 033/239] Fix lotus-soup build --- testplans/lotus-soup/testkit/role_client.go | 7 +++---- testplans/lotus-soup/testkit/role_miner.go | 5 ++--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/testplans/lotus-soup/testkit/role_client.go b/testplans/lotus-soup/testkit/role_client.go index 8db68bddf..9fcd42902 100644 --- a/testplans/lotus-soup/testkit/role_client.go +++ b/testplans/lotus-soup/testkit/role_client.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/go-jsonrpc" "github.com/filecoin-project/go-jsonrpc/auth" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/wallet" "github.com/filecoin-project/lotus/node" @@ -157,11 +156,11 @@ func (c *LotusClient) RunDefault() error { return nil } -func startFullNodeAPIServer(t *TestEnvironment, repo repo.Repo, api api.FullNode) (*http.Server, error) { +func startFullNodeAPIServer(t *TestEnvironment, repo repo.Repo, napi api.FullNode) (*http.Server, error) { mux := mux.NewRouter() rpcServer := jsonrpc.NewServer() - rpcServer.Register("Filecoin", api) + rpcServer.Register("Filecoin", napi) mux.Handle("/rpc/v0", rpcServer) @@ -176,7 +175,7 @@ func startFullNodeAPIServer(t *TestEnvironment, repo repo.Repo, api api.FullNode ah := &auth.Handler{ Verify: func(ctx context.Context, token string) ([]auth.Permission, error) { - return apistruct.AllPermissions, nil + return api.AllPermissions, nil }, Next: mux.ServeHTTP, } diff --git a/testplans/lotus-soup/testkit/role_miner.go b/testplans/lotus-soup/testkit/role_miner.go index 7bd688780..a0248cfdd 100644 --- a/testplans/lotus-soup/testkit/role_miner.go +++ b/testplans/lotus-soup/testkit/role_miner.go @@ -17,7 +17,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-storedcounter" "github.com/filecoin-project/lotus/api" - "github.com/filecoin-project/lotus/api/apistruct" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain/actors" genesis_chain "github.com/filecoin-project/lotus/chain/gen/genesis" @@ -321,7 +320,7 @@ func PrepareMiner(t *TestEnvironment) (*LotusMiner, error) { } // print out the admin auth token - token, err := n.MinerApi.AuthNew(ctx, apistruct.AllPermissions) + token, err := n.MinerApi.AuthNew(ctx, api.AllPermissions) if err != nil { return nil, err } @@ -615,7 +614,7 @@ func startStorageMinerAPIServer(t *TestEnvironment, repo repo.Repo, minerApi api ah := &auth.Handler{ Verify: func(ctx context.Context, token string) ([]auth.Permission, error) { - return apistruct.AllPermissions, nil + return api.AllPermissions, nil }, Next: mux.ServeHTTP, } From e003977559dae78f6cfe92d5a84ea752ebdf10fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 15:39:48 +0100 Subject: [PATCH 034/239] apiclient: Version client funcs --- api/client/client.go | 32 ++++++++++++++++++++--------- chain/wallet/remotewallet/remote.go | 2 +- cli/util/api.go | 10 ++++----- cmd/lotus-chainwatch/util/api.go | 2 +- cmd/lotus-gateway/endtoend_test.go | 2 +- cmd/lotus-shed/consensus.go | 2 +- node/impl/remoteworker.go | 2 +- node/test/builder.go | 4 ++-- tools/stats/rpc.go | 2 +- 9 files changed, 35 insertions(+), 23 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index 6c2f00b46..7dea837e8 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -15,8 +15,8 @@ import ( "github.com/filecoin-project/lotus/lib/rpcenc" ) -// NewCommonRPC creates a new http jsonrpc client. -func NewCommonRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Common, jsonrpc.ClientCloser, error) { +// NewCommonRPCV0 creates a new http jsonrpc client. +func NewCommonRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.Common, jsonrpc.ClientCloser, error) { var res v0api.CommonStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ @@ -28,8 +28,20 @@ func NewCommonRPC(ctx context.Context, addr string, requestHeader http.Header) ( return &res, closer, err } -// NewFullNodeRPC creates a new http jsonrpc client. -func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) { +// NewFullNodeRPCV0 creates a new http jsonrpc client. +func NewFullNodeRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) { + var res v0api.FullNodeStruct + closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", + []interface{}{ + &res.CommonStruct.Internal, + &res.Internal, + }, requestHeader) + + return &res, closer, err +} + +// NewFullNodeRPCV1 creates a new http jsonrpc client. +func NewFullNodeRPCV1(ctx context.Context, addr string, requestHeader http.Header) (api.FullNode, jsonrpc.ClientCloser, error) { var res v1api.FullNodeStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ @@ -40,8 +52,8 @@ func NewFullNodeRPC(ctx context.Context, addr string, requestHeader http.Header) return &res, closer, err } -// NewStorageMinerRPC creates a new http jsonrpc client for miner -func NewStorageMinerRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (v0api.StorageMiner, jsonrpc.ClientCloser, error) { +// NewStorageMinerRPCV0 creates a new http jsonrpc client for miner +func NewStorageMinerRPCV0(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (v0api.StorageMiner, jsonrpc.ClientCloser, error) { var res v0api.StorageMinerStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ @@ -55,7 +67,7 @@ func NewStorageMinerRPC(ctx context.Context, addr string, requestHeader http.Hea return &res, closer, err } -func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Worker, jsonrpc.ClientCloser, error) { +func NewWorkerRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.Worker, jsonrpc.ClientCloser, error) { u, err := url.Parse(addr) if err != nil { return nil, nil, err @@ -84,8 +96,8 @@ func NewWorkerRPC(ctx context.Context, addr string, requestHeader http.Header) ( return &res, closer, err } -// NewGatewayRPC creates a new http jsonrpc client for a gateway node. -func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.Gateway, jsonrpc.ClientCloser, error) { +// NewGatewayRPCV0 creates a new http jsonrpc client for a gateway node. +func NewGatewayRPCV0(ctx context.Context, addr string, requestHeader http.Header, opts ...jsonrpc.Option) (api.Gateway, jsonrpc.ClientCloser, error) { var res api.GatewayStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ @@ -98,7 +110,7 @@ func NewGatewayRPC(ctx context.Context, addr string, requestHeader http.Header, return &res, closer, err } -func NewWalletRPC(ctx context.Context, addr string, requestHeader http.Header) (api.Wallet, jsonrpc.ClientCloser, error) { +func NewWalletRPCV0(ctx context.Context, addr string, requestHeader http.Header) (api.Wallet, jsonrpc.ClientCloser, error) { var res api.WalletStruct closer, err := jsonrpc.NewMergeClient(ctx, addr, "Filecoin", []interface{}{ diff --git a/chain/wallet/remotewallet/remote.go b/chain/wallet/remotewallet/remote.go index 685d0fc35..d1734518e 100644 --- a/chain/wallet/remotewallet/remote.go +++ b/chain/wallet/remotewallet/remote.go @@ -25,7 +25,7 @@ func SetupRemoteWallet(info string) func(mctx helpers.MetricsCtx, lc fx.Lifecycl return nil, err } - wapi, closer, err := client.NewWalletRPC(mctx, url, ai.AuthHeader()) + wapi, closer, err := client.NewWalletRPCV0(mctx, url, ai.AuthHeader()) if err != nil { return nil, xerrors.Errorf("creating jsonrpc client: %w", err) } diff --git a/cli/util/api.go b/cli/util/api.go index c0f0b0ed1..c296c84ff 100644 --- a/cli/util/api.go +++ b/cli/util/api.go @@ -170,7 +170,7 @@ func GetAPI(ctx *cli.Context) (api.Common, jsonrpc.ClientCloser, error) { return nil, nil, err } - return client.NewCommonRPC(ctx.Context, addr, headers) + return client.NewCommonRPCV0(ctx.Context, addr, headers) } func GetFullNodeAPI(ctx *cli.Context) (api.FullNode, jsonrpc.ClientCloser, error) { @@ -183,7 +183,7 @@ func GetFullNodeAPI(ctx *cli.Context) (api.FullNode, jsonrpc.ClientCloser, error return nil, nil, err } - return client.NewFullNodeRPC(ctx.Context, addr, headers) + return client.NewFullNodeRPCV1(ctx.Context, addr, headers) } type GetStorageMinerOptions struct { @@ -227,7 +227,7 @@ func GetStorageMinerAPI(ctx *cli.Context, opts ...GetStorageMinerOption) (api.St addr = u.String() } - return client.NewStorageMinerRPC(ctx.Context, addr, headers) + return client.NewStorageMinerRPCV0(ctx.Context, addr, headers) } func GetWorkerAPI(ctx *cli.Context) (api.Worker, jsonrpc.ClientCloser, error) { @@ -236,7 +236,7 @@ func GetWorkerAPI(ctx *cli.Context) (api.Worker, jsonrpc.ClientCloser, error) { return nil, nil, err } - return client.NewWorkerRPC(ctx.Context, addr, headers) + return client.NewWorkerRPCV0(ctx.Context, addr, headers) } func GetGatewayAPI(ctx *cli.Context) (api.Gateway, jsonrpc.ClientCloser, error) { @@ -245,7 +245,7 @@ func GetGatewayAPI(ctx *cli.Context) (api.Gateway, jsonrpc.ClientCloser, error) return nil, nil, err } - return client.NewGatewayRPC(ctx.Context, addr, headers) + return client.NewGatewayRPCV0(ctx.Context, addr, headers) } func DaemonContext(cctx *cli.Context) context.Context { diff --git a/cmd/lotus-chainwatch/util/api.go b/cmd/lotus-chainwatch/util/api.go index cfda833e0..57e75fe58 100644 --- a/cmd/lotus-chainwatch/util/api.go +++ b/cmd/lotus-chainwatch/util/api.go @@ -22,7 +22,7 @@ func GetFullNodeAPIUsingCredentials(ctx context.Context, listenAddr, token strin return nil, nil, err } - return client.NewFullNodeRPC(ctx, apiURI(addr), apiHeaders(token)) + return client.NewFullNodeRPCV1(ctx, apiURI(addr), apiHeaders(token)) } func apiURI(addr string) string { return "ws://" + addr + "/rpc/v0" diff --git a/cmd/lotus-gateway/endtoend_test.go b/cmd/lotus-gateway/endtoend_test.go index 8c1901d65..f575c5776 100644 --- a/cmd/lotus-gateway/endtoend_test.go +++ b/cmd/lotus-gateway/endtoend_test.go @@ -250,7 +250,7 @@ func startNodes( // Create a gateway client API that connects to the gateway server var gapi api.Gateway - gapi, closer, err = client.NewGatewayRPC(ctx, addr, nil) + gapi, closer, err = client.NewGatewayRPCV0(ctx, addr, nil) require.NoError(t, err) // Provide the gateway API to dependency injection diff --git a/cmd/lotus-shed/consensus.go b/cmd/lotus-shed/consensus.go index 8e30f5cee..2c5df4ea5 100644 --- a/cmd/lotus-shed/consensus.go +++ b/cmd/lotus-shed/consensus.go @@ -118,7 +118,7 @@ var consensusCheckCmd = &cli.Command{ return err } - api, closer, err := client.NewFullNodeRPC(cctx.Context, addr, nil) + api, closer, err := client.NewFullNodeRPCV1(cctx.Context, addr, nil) if err != nil { return err } diff --git a/node/impl/remoteworker.go b/node/impl/remoteworker.go index 1369dc248..8dc7510b4 100644 --- a/node/impl/remoteworker.go +++ b/node/impl/remoteworker.go @@ -33,7 +33,7 @@ func connectRemoteWorker(ctx context.Context, fa api.Common, url string) (*remot headers := http.Header{} headers.Add("Authorization", "Bearer "+string(token)) - wapi, closer, err := client.NewWorkerRPC(context.TODO(), url, headers) + wapi, closer, err := client.NewWorkerRPCV0(context.TODO(), url, headers) if err != nil { return nil, xerrors.Errorf("creating jsonrpc client: %w", err) } diff --git a/node/test/builder.go b/node/test/builder.go index 72a55ab49..9c4515a9b 100644 --- a/node/test/builder.go +++ b/node/test/builder.go @@ -505,7 +505,7 @@ func fullRpc(t *testing.T, nd test.TestNode) test.TestNode { var stop func() var full test.TestNode - full.FullNode, stop, err = client.NewFullNodeRPC(context.Background(), listenAddr, nil) + full.FullNode, stop, err = client.NewFullNodeRPCV1(context.Background(), listenAddr, nil) require.NoError(t, err) t.Cleanup(stop) @@ -519,7 +519,7 @@ func storerRpc(t *testing.T, nd test.TestStorageNode) test.TestStorageNode { var stop func() var storer test.TestStorageNode - storer.StorageMiner, stop, err = client.NewStorageMinerRPC(context.Background(), listenAddr, nil) + storer.StorageMiner, stop, err = client.NewStorageMinerRPCV0(context.Background(), listenAddr, nil) require.NoError(t, err) t.Cleanup(stop) diff --git a/tools/stats/rpc.go b/tools/stats/rpc.go index b01c07a35..cd3987ff1 100644 --- a/tools/stats/rpc.go +++ b/tools/stats/rpc.go @@ -220,5 +220,5 @@ func GetFullNodeAPI(ctx context.Context, repo string) (api.FullNode, jsonrpc.Cli return nil, nil, err } - return client.NewFullNodeRPC(ctx, addr, headers) + return client.NewFullNodeRPCV1(ctx, addr, headers) } From 1e10429326016428523e8f2a466817681948883f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 25 Mar 2021 18:00:29 +0100 Subject: [PATCH 035/239] api: Add basic package readme --- api/README.md | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 api/README.md diff --git a/api/README.md b/api/README.md new file mode 100644 index 000000000..07089d7ae --- /dev/null +++ b/api/README.md @@ -0,0 +1,14 @@ +## Lotus API + +This package contains all lotus API definitions. Interfaces defined here are +exposed as JsonRPC 2.0 endpoints by lotus programs. + +### Versions + +| File | Alias File | Interface | Exposed by | Version | HTTP Endpoint | Status | Docs +|------------------|-------------------|----------------|--------------------|---------|---------------|------------------------------|------ +| `api_common.go` | `v0api/latest.go` | `Common` | lotus; lotus-miner | v0 | `/rpc/v0` | Latest, Stable | [Methods](../documentation/en/api-v0-methods.md) +| `api_full.go` | `v1api/latest.go` | `FullNode` | lotus | v1 | `/rpc/v1` | Latest, **Work in progress** | [Methods](../documentation/en/api-v1-unstable-methods.md) +| `api_storage.go` | `v0api/latest.go` | `StorageMiner` | lotus-miner | v0 | `/rpc/v0` | Latest, Stable | [Methods](../documentation/en/api-v0-methods-miner.md) +| `api_worker.go` | `v0api/latest.go` | `Worker` | lotus-worker | v0 | `/rpc/v0` | Latest, Stable | [Methods](../documentation/en/api-v0-methods-worker.md) +| `v0api/full.go` | | `FullNode` | lotus | v0 | `/rpc/v0` | Stable | [Methods](../documentation/en/api-v0-methods.md) From f5029a018730ee35e98255dfd2d5ae4bcfd3598d Mon Sep 17 00:00:00 2001 From: Steven Allen Date: Thu, 25 Mar 2021 17:17:46 -0700 Subject: [PATCH 036/239] lint: don't skip builtin --- .golangci.yml | 6 ++++++ chain/actors/builtin/builtin.go | 2 +- chain/actors/builtin/multisig/state0.go | 2 +- chain/actors/builtin/multisig/state2.go | 2 +- chain/actors/builtin/multisig/state3.go | 2 +- 5 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.golangci.yml b/.golangci.yml index 8bdba64f0..87db745e4 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -16,6 +16,12 @@ linters: - deadcode - scopelint +# We don't want to skip builtin/ +skip-dirs-use-default: false +skip-dirs: + - vendor$ + - testdata$ + - examples$ issues: exclude: diff --git a/chain/actors/builtin/builtin.go b/chain/actors/builtin/builtin.go index 1e535dca4..045048d1f 100644 --- a/chain/actors/builtin/builtin.go +++ b/chain/actors/builtin/builtin.go @@ -52,7 +52,7 @@ type PoStProof = proof0.PoStProof type FilterEstimate = smoothing0.FilterEstimate func FromV0FilterEstimate(v0 smoothing0.FilterEstimate) FilterEstimate { - return (FilterEstimate)(v0) + return (FilterEstimate)(v0) //nolint:unconvert } // Doesn't change between actors v0, v2, and v3. diff --git a/chain/actors/builtin/multisig/state0.go b/chain/actors/builtin/multisig/state0.go index 5548b0a5c..27dd5c413 100644 --- a/chain/actors/builtin/multisig/state0.go +++ b/chain/actors/builtin/multisig/state0.go @@ -68,7 +68,7 @@ func (s *state0) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } diff --git a/chain/actors/builtin/multisig/state2.go b/chain/actors/builtin/multisig/state2.go index 628da3f2c..d637abb91 100644 --- a/chain/actors/builtin/multisig/state2.go +++ b/chain/actors/builtin/multisig/state2.go @@ -67,7 +67,7 @@ func (s *state2) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } diff --git a/chain/actors/builtin/multisig/state3.go b/chain/actors/builtin/multisig/state3.go index 7ade2ab64..a2eb1d909 100644 --- a/chain/actors/builtin/multisig/state3.go +++ b/chain/actors/builtin/multisig/state3.go @@ -69,7 +69,7 @@ func (s *state3) ForEachPendingTxn(cb func(id int64, txn Transaction) error) err if n <= 0 { return xerrors.Errorf("invalid pending transaction key: %v", key) } - return cb(txid, (Transaction)(out)) + return cb(txid, (Transaction)(out)) //nolint:unconvert }) } From 36c3086376ee760d1caefc9ebae119d75e7be7a0 Mon Sep 17 00:00:00 2001 From: aarshkshah1992 Date: Fri, 26 Mar 2021 09:48:50 +0530 Subject: [PATCH 037/239] changes as per review --- cli/client.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/cli/client.go b/cli/client.go index ecc31e1e5..787510821 100644 --- a/cli/client.go +++ b/cli/client.go @@ -95,7 +95,6 @@ var clientCmd = &cli.Command{ WithCategory("util", clientListTransfers), WithCategory("util", clientRestartTransfer), WithCategory("util", clientCancelTransfer), - WithCategory("util", clientCancelRetrievalDeal), }, } @@ -952,6 +951,9 @@ var clientRetrieveCmd = &cli.Command{ Name: "retrieve", Usage: "Retrieve data from network", ArgsUsage: "[dataCid outputPath]", + Subcommands: []*cli.Command{ + clientCancelRetrievalDeal, + }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "from", @@ -1977,7 +1979,7 @@ var clientCancelTransfer = &cli.Command{ } var clientCancelRetrievalDeal = &cli.Command{ - Name: "cancel-retrieval-deal", + Name: "cancel", Usage: "Cancel a retrieval deal by DealID", Flags: []cli.Flag{ &cli.Int64Flag{ @@ -1994,8 +1996,8 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") == 0 { - return errors.New("deal id cannot be 0") + if cctx.Int64("dealid") <= 0 { + return errors.New("deal id cannot be negative") } return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) From 449b33abee19ff04de414de348b48087af805337 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Fri, 26 Mar 2021 13:32:03 +0800 Subject: [PATCH 038/239] remote calc winningpost proof --- api/api_storage.go | 3 +++ api/apistruct/struct.go | 7 +++++++ build/openrpc/full.json.gz | Bin 22582 -> 22595 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7801 bytes build/openrpc/worker.json.gz | Bin 2578 -> 2579 bytes documentation/en/api-methods-miner.md | 20 ++++++++++++++++++++ node/impl/storminer.go | 9 ++++++++- 7 files changed, 38 insertions(+), 1 deletion(-) diff --git a/api/api_storage.go b/api/api_storage.go index f6efcd8af..9dae842d2 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,6 +3,7 @@ package api import ( "bytes" "context" + "github.com/filecoin-project/lotus/chain/actors/builtin" "time" "github.com/google/uuid" @@ -165,6 +166,8 @@ type StorageMiner interface { CreateBackup(ctx context.Context, fpath string) error //perm:admin CheckProvable(ctx context.Context, pp abi.RegisteredPoStProof, sectors []storage.SectorRef, expensive bool) (map[abi.SectorNumber]string, error) //perm:admin + + ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) //perm:read } var _ storiface.WorkerReturn = *new(StorageMiner) diff --git a/api/apistruct/struct.go b/api/apistruct/struct.go index 34cf52fce..8fe40b574 100644 --- a/api/apistruct/struct.go +++ b/api/apistruct/struct.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/go-state-types/dline" "github.com/filecoin-project/lotus/api" apitypes "github.com/filecoin-project/lotus/api/types" + "github.com/filecoin-project/lotus/chain/actors/builtin" "github.com/filecoin-project/lotus/chain/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin/paych" "github.com/filecoin-project/lotus/chain/types" @@ -532,6 +533,8 @@ type StorageMinerStruct struct { CheckProvable func(p0 context.Context, p1 abi.RegisteredPoStProof, p2 []storage.SectorRef, p3 bool) (map[abi.SectorNumber]string, error) `perm:"admin"` + ComputeProof func(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) `perm:"read"` + CreateBackup func(p0 context.Context, p1 string) error `perm:"admin"` DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` @@ -1706,6 +1709,10 @@ func (s *StorageMinerStruct) CheckProvable(p0 context.Context, p1 abi.Registered return s.Internal.CheckProvable(p0, p1, p2, p3) } +func (s *StorageMinerStruct) ComputeProof(p0 context.Context, p1 []builtin.SectorInfo, p2 abi.PoStRandomness) ([]builtin.PoStProof, error) { + return s.Internal.ComputeProof(p0, p1, p2) +} + func (s *StorageMinerStruct) CreateBackup(p0 context.Context, p1 string) error { return s.Internal.CreateBackup(p0, p1) } diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..729bc23680916c51c615571fb9fc45cde73ae15f 100644 GIT binary patch literal 22595 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 bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..224828a6652f32c604f5e99477de2131eddd6ec2 100644 GIT binary patch literal 7801 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 JfEo*V0RT7s00{s9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7bf6216a75f64bf7adaa10fbee6e214287f259b6..fa31420ac2e65857996e9400aa535e638dcc31b9 100644 GIT binary patch delta 2479 zcmV;g2~hTu6q6KxABzY8000000RQY=|8v?p68~2;x?h?%4iF%DdHmKR_j;M>7cP0d z{?KG5!d^g)E%`}uQkvm^zma8(jqPB&&?CgtX%b|uw32uCv%C7j6XrfJ;oEqCPg>p9 z8MZKG6OIQ@SW)Ey9^m&}1rlA2hUo3+5?lBIgruB>6lbk}&andzcwu1=)Qme4557KO zMm$aVCw0N*l(pVE&WM5y*uoA-TTow_7Vhruru>FY0%oH(68-jti+d2)N(8n#LQAqY zeh1l{Dfq5hL-X50{t1$b3o?b)HQ0)aE0|cw@1n1_WK3J1nNJ)COas^S2Uy7Op`s`K zxUCDK$Ps#fqd(FKv7t32u6uc5ArOL#BlL8`Zj=BO2!>?qk|_|3xUB@Mnl;Uc?oc;< zbi)=m?C$OkTUZ93N5mWt@TvndX5EdvVc5bx5yUf75C}bu#`@DA3k#0~=aawYKH$Om z;?}~%aYD9;I}+Rnp{Q z2}Ndq1nIuaTp=nEL2HBjx}>?)?{-;6gdp?kqwHmRt~kaz<4DZQNvGSt%^6w6Ve|`C zOB;%ET2-tmnt@Ur-Rep*aFuR5;%(hT<#M`Kp^ObMHse`4pp_YSemDP)bABxU;aXNA z66U8;qPx*Lc;x$~Y4GIC!X9ObPf=wf;|nW)G4}nlRJBb{woGe^0j>*f=gjmws%F6$ z3GlcA+r;lvcBU zkQq``xLG;%D^3_SO$US>h8&!C^5x)9Q1+~%6ofR@yvCKWH08Q~?G%J=jtIwLX-9ZrPrjaUIM4W)P9;wB&c$88)jQ-PE5^oPy=ucz#S^Uo#zAGC7bYyu%=1! z^A+oB1iI!Xn2K84N%A6(pJ((pRjG^)|C>t{ccmR^^g!G|o6#$fJP>vyx!{d|W^+kx z;^INSYw3dPN8-mHu0Vo#&~l>-hNI8Y{PiyUOB>upMGaqZ_Oul6$kku0F;}5c!&n&w zd>7S>O-zP|b(4^qqcUBjrmZA_ne@gg#8%;tZoXCcz#rh+cm@@XLxOTU`K%hAZ<>e3 z?cFPU-3Pb#IpsQ{IkY#f_aZ2+T zDhSLom3AAQ4+*=5$p11TxLmMXSm8s>QvOq;zZoy@J-3M)@}Bqf3()DTR5oCXG5&sQ z#Yv}NRdFP^4N_i%lt#uXsYi-9Ur&O7I<3#2H+xr^#`3kq5NeYx2y?g{hjiPBPtaq? z8j^)}drg?+h2 z?4NT5m&}3h;Zl3<=CK;FOp@7Oy4)U5!Y|u1w$Wv80<8TEu%25s&uGUEH&FIFz4P7d zp?o=8L7RZF2^bGEU_9v*EMZ)M3q--8cEly;7!q$X7PY^nVS; zH5m6AFz%#aLGB8|otssmO%oL%n)YeU8@{|aGALCHQc**iFdvtqJSA$QPih8YYX<|9 zT$WVX0!6K+d%G3mib9)b@ID4^_FzU-n21E;7{YZAL_-Re4X%N>L+*K0WrgT@HAzrb z^Ztx%689?1TQZO`KC>ID4zU$|fPYMlestnD3?$7K8UJ*xiy?Jn4R10%l=Xa(?x*o8 z_X585!K=)Q?*Sg*EmXu8J=Sc7YR#nVJVXe48b-^0(WHbHlPPrR08?~Alajnz_4_{r z42hXL-C(q|;Vo&k;)KKC3AeSuB$Ih}{Das)dXLhXoy~iscc#WYc@Lidjemdt+Yjd4 z^S_O~3Ct(G{)F~|`B@M^zx&WP4)-?Ot7s}$omYFG$!VxUxlL!NiT;}C?*M$;Zo%UJ z%B{=yOF} zF92Pka{U-I#X}Q@?v+061FGlB+RFp>2A&#tI#77(73_o1zhG5eF+zSSwZqLQt68BU__N4e+5!@a**WKf1MXaL)y*Aouu%Q1zdHf~qJ|F!ejsd delta 2499 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 N|NnO&nCSs~0067n*!BPb diff --git a/documentation/en/api-methods-miner.md b/documentation/en/api-methods-miner.md index 7a1fed274..00d09b0f4 100644 --- a/documentation/en/api-methods-miner.md +++ b/documentation/en/api-methods-miner.md @@ -14,6 +14,8 @@ * [AuthVerify](#AuthVerify) * [Check](#Check) * [CheckProvable](#CheckProvable) +* [Compute](#Compute) + * [ComputeProof](#ComputeProof) * [Create](#Create) * [CreateBackup](#CreateBackup) * [Deals](#Deals) @@ -295,6 +297,24 @@ Response: } ``` +## Compute + + +### ComputeProof + + +Perms: read + +Inputs: +```json +[ + null, + null +] +``` + +Response: `null` + ## Create diff --git a/node/impl/storminer.go b/node/impl/storminer.go index e81560059..ee15d447b 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,6 +3,8 @@ package impl import ( "context" "encoding/json" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/gen" "net/http" "os" "strconv" @@ -63,7 +65,8 @@ type StorageMinerAPI struct { AddrSel *storage.AddressSelector DealPublisher *storageadapter.DealPublisher - DS dtypes.MetadataDS + Epp gen.WinningPoStProver + DS dtypes.MetadataDS ConsiderOnlineStorageDealsConfigFunc dtypes.ConsiderOnlineStorageDealsConfigFunc SetConsiderOnlineStorageDealsConfigFunc dtypes.SetConsiderOnlineStorageDealsConfigFunc @@ -696,4 +699,8 @@ func (sm *StorageMinerAPI) Discover(ctx context.Context) (apitypes.OpenRPCDocume return build.OpenRPCDiscoverJSON_Miner(), nil } +func (sm *StorageMinerAPI) ComputeProof(ctx context.Context, ssi []builtin.SectorInfo, rand abi.PoStRandomness) ([]builtin.PoStProof, error) { + return sm.Epp.ComputeProof(ctx, ssi, rand) +} + var _ api.StorageMiner = &StorageMinerAPI{} From b13f6a32090e51fcdd7098ba9cd2940a66531a93 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 09:50:52 +0100 Subject: [PATCH 039/239] fix: cancel retrieval deal - disallow negative deal ID --- cli/client.go | 2 +- node/impl/client/client.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/cli/client.go b/cli/client.go index 787510821..24f1281c9 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1996,7 +1996,7 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") <= 0 { + if cctx.Int64("dealid") < 0 { return errors.New("deal id cannot be negative") } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 1f5203754..62198e0a2 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -489,12 +489,12 @@ func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmar select { case err := <-cerr: if err != nil { - return xerrors.Errorf("canceling retrieval deal erred: %w", err) + return xerrors.Errorf("failed to cancel retrieval deal: %w", err) } return nil case <-ctx.Done(): - return xerrors.Errorf("canceling retrieval deal context timeout: %w", ctx.Err()) + return xerrors.Errorf("context timeout while canceling retrieval deal: %w", ctx.Err()) } } From 85eab9e00eea6520a82a34b17390ac10df4e6f8e Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 09:53:01 +0100 Subject: [PATCH 040/239] fix: make docsgen --- build/openrpc/full.json.gz | Bin 22582 -> 22664 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7639 bytes build/openrpc/worker.json.gz | Bin 2578 -> 2578 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..3901c839f738bc39b49283b34909cdc1edcaa556 100644 GIT binary patch delta 21687 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 aS)A5hzW)1wg@*R<@H?X-i_#qv?SBAdLo-VN delta 21583 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 MdO6Ksp!hid0rbL)S^xk5 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..38f5f83500091bab5645a4b708932336e082dd92 100644 GIT binary patch literal 7639 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 F0RTDG0jvN3 literal 7643 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 JfEo*V0RT7s00{s9 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7bf6216a75f64bf7adaa10fbee6e214287f259b6..be362b3e99aca73dba202e7f06afea8a94c60296 100644 GIT binary patch delta 1830 zcmV+>2if?N6p|FM(gFfrpOe%AHGdE}c$+T=e}b}S6{R4gspd7VjHM~p{cEQnbQ@O> zM?}q{;(ns|ogL2pNA5rk=W)qyInS|i5nrH-SR|gi^PjfhJY{{rtRj_?IxK;>ludDh zDXBzQvK@~uqsHa<^7uW}W~y=O8mI0+ow_%@0x+kHxb!DPucRWXr--X2g@2aimxN7g zf%JOsOSEoKdM`9-A5eNt%IYO>DopL?$wY!GH@9K7rRK!cOb0ap*8tq10^I9-fV*H5 zUJ=$bNq)X!eT_iZ+yqlmYdc9^X9PO*OMTiPV38;&E8d}v3xBtgxX{a!W`})-8SMA z^boR!q@lOa6c`BoHh-du?i@YLfJODLnQ!_-QW2r5?KsO*zj&OPIZQq&v6NB@26wX4 zX)~}Ll1iL(3Uc$8Kx*yMjOmI36v|s)1yvy8z+^pKNv^Ojw}}07uHb?>@FQGm&)qy$ zBbG@r`&*aW<4O2!d&V}p>`j2Rp8?iW%jOyF*x?4sey8_lH-CF5pU+m%CSYs=#={I4 zPdWul7?r6^B{+UT>If!Nx?z$BL?RklD;tLffu#kiu- z<{7+Cftx*;5q}jXB9SvOy$th~45WS#rZW8C6 zwBR~ahIe{4XPsW$S*Kp%?iN+=e%Tdak^42~+}*JME7iyod%)sq$RpxTA~l1hSQClB zJZmq-yM;b+h187bA5MhwW*(U%MeYC*G=T>s!RE}7NO7c1Dwz@m`hz0!4rzIH z0)KalJI;R3<+jb1u7uDREqfWa?49F;=ZLFHeww;C`Vf>&Hz`1-tzs?MS_Ba$I?CNP zn!J2yo40$uREg{tB)uTO_5x(^?Vs!)LKbr zyuek|)=!UpV&8!i_o6~qoG=Fw^nX#;nh`l`r3Gg@M+%y64rx}Vnw6=vOIVP+j8wX! zI~Y;rM>)i&t=LjL?UJq9*~uN22~M&|l6tlq7(6?D{kB^h2lrc`&I)pmUkO$J2`H$F zA{Eo+3e}SdoFr+!9K|)z*yZ+}L;+LOMQR2D5D|cwS*MXm1dN5NJHIG;FBdhVa`qZ8 U7B`Fk1pom5|90#~$^m--0M!nQ#{d8T delta 1830 zcmV+>2if?N6p|FM(gFg`-jmb(p2*rSH{wm>;AP<5W0=4 zha;k9QE@*}{LT(%|08#xhV!^&x18tLxQH*%MJy7}-T6;jaGtV0U{;YzNgb9zT*{_6 z!IV@YEZL4nmr>(#e0lsHYBSY1b&XSZpibTE*9Bls8FA@Ph+auWR8J9CO@9h4%P$F= z)&lAE-j`_Ip!8m7(mtT{nv~T`;8d8}&y$G+Rc>y>Y)j3FshJLH0ImVJ0|mG@C;0$( z!6v*StZ9<`e8u`2fv&j;rlQt%lDx>{=L!8yRVt&y|K?J~U1>)e-4i#^X7myy4}={_ zE_kEaTvD63c+l@!y5Q=8_uM$*IO8Z9LLL#h!w7v=LD=SrK(YntY$sgnzgoTM;7Ys+$00 z+1yT?(maL=0`p9z-A3m_!mc3lzl;bj7wi^R_)xQy|J3Mj#>@M_ZQ_Q!=RN%jbUG`Q z4cKCgzvo)W%$QqJ{-a=DgAb<4Rh$^~s^e_V!)w^cC=?_UogsQgVEKmL7ac1T)`J}{BN+}rJ z$xf%uz;;+FQIMOz1X634W=vNUpitiWDyRYx2PW&`N^*sLxkc=sa|IX7fgj;gd+z43 z8nH~0+26X{9#6t=+cUP&Wp4tk{S2_4S~kyU#|}48_B*{dyMNh3`Fys5HUVQ3Fdk;W zc+x3Y!ngz%h=eap0;#?MbB+3UuhM6`Z}OFUrA+&fuWXj-8;ol(?nPi+!Ghc+ggZB@ zLYpQkLNx8unm2rLeq>Op7^I?xG+{n2MR`ipMxWIT#MTZ5Cb=xBvIUA-P4{*y#ubG& z&)|Iu-0Z=OsDCgKiNrC4>mG=P6f7HD0da@i^Qg)S(bH;@pseQo8QCQ6Wtg{QAZ2`J zH&h*BD|!!^8vW?RZx~3LEi(S;S{Fm=$Qs^cdMNApBHd5pRqh3R?SogD72g9qz+0$@ z&w8xc4Aq)R*?EW%_B4!^{h~<;Ehbaw!U3k}geE07Gk3bdXlcV+(rU#C zhruImYlBH9^X~X3v4Qj+q%%94_ek$djeGJAJpViY@wXq$x#xc$dlQ&Xdi@FQ1@p5Y zfPVMBZyfGzwpYg>swDP!s(%(cc01wkHLP|0}mHi{fQ{+ivykn7TCb zCO-%2mw(*RZj;#DHyzps7c?tn&(AGu@TkF~L&c+loj2O9j|9|Dx2%Y_l5trJerh6B zim7DoqyenGP_lghtb@;)GKmwkc~IXi*j$qW#yZjGinv|?x{y`;@pcG}(Yvz$TQsfR0K@)gD5^T;Ki4;fLq>?F7pg$-g?~s;P zCx39axZ~{iTyEQJ=~@YWuV~rJxMlAgCp<@7Rr1r+#nFeLY`RGSGHn%W!PX*(Fws%& zw$bF}L)*OF^TkSJLE`%_BJa+P`Kl<53CcoA1mbF&Cc|#b-8WB4WxCDXOJs(>@^|63 z?>lWf46WMTMnbnBq5XnA%EPee8x>S;`yS)vmjnuzM85Ryu@_*F`GyH zZ`t>MV_14zY>MQPt>??=vIaW74mzD4Aai%gFGpw_7|+bo=K5ulH%pP%0<@I+!DF~# z&?iby$|#k)X#KG<+3_;c5dDJi%C!nAz zid0OOD^yP=aFV3?aunAdBH00ZEYFaQ7m From 47f7208f38a33776b5663487d813865760db0755 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 26 Mar 2021 10:19:19 +0100 Subject: [PATCH 041/239] fix: rename command to retrieve-cancel --- cli/client.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cli/client.go b/cli/client.go index 24f1281c9..5d9257f01 100644 --- a/cli/client.go +++ b/cli/client.go @@ -89,6 +89,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), WithCategory("retrieval", clientRetrieveCmd), + WithCategory("retrieval", clientCancelRetrievalDeal), WithCategory("util", clientCommPCmd), WithCategory("util", clientCarGenCmd), WithCategory("util", clientBalancesCmd), @@ -951,9 +952,6 @@ var clientRetrieveCmd = &cli.Command{ Name: "retrieve", Usage: "Retrieve data from network", ArgsUsage: "[dataCid outputPath]", - Subcommands: []*cli.Command{ - clientCancelRetrievalDeal, - }, Flags: []cli.Flag{ &cli.StringFlag{ Name: "from", @@ -1979,7 +1977,7 @@ var clientCancelTransfer = &cli.Command{ } var clientCancelRetrievalDeal = &cli.Command{ - Name: "cancel", + Name: "retrieve-cancel", Usage: "Cancel a retrieval deal by DealID", Flags: []cli.Flag{ &cli.Int64Flag{ From fd91c095c48a9104eac0c770ae91c525d27539af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20Kripalani?= Date: Fri, 26 Mar 2021 16:37:46 +0000 Subject: [PATCH 042/239] rename command to cancel-retrieval; rename args to follow Lotus style. --- cli/client.go | 17 +++++++++-------- node/impl/client/client.go | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/cli/client.go b/cli/client.go index 5d9257f01..67fc7faff 100644 --- a/cli/client.go +++ b/cli/client.go @@ -89,7 +89,7 @@ var clientCmd = &cli.Command{ WithCategory("data", clientStat), WithCategory("retrieval", clientFindCmd), WithCategory("retrieval", clientRetrieveCmd), - WithCategory("retrieval", clientCancelRetrievalDeal), + WithCategory("retrieval", clientCancelRetrievalDealCmd), WithCategory("util", clientCommPCmd), WithCategory("util", clientCarGenCmd), WithCategory("util", clientBalancesCmd), @@ -1976,13 +1976,13 @@ var clientCancelTransfer = &cli.Command{ }, } -var clientCancelRetrievalDeal = &cli.Command{ - Name: "retrieve-cancel", - Usage: "Cancel a retrieval deal by DealID", +var clientCancelRetrievalDealCmd = &cli.Command{ + Name: "cancel-retrieval", + Usage: "Cancel a retrieval deal by deal ID; this also cancels the associated transfer", Flags: []cli.Flag{ &cli.Int64Flag{ - Name: "dealid", - Usage: "specify retrieval deal by DealID", + Name: "deal-id", + Usage: "specify retrieval deal by deal ID", Required: true, }, }, @@ -1994,11 +1994,12 @@ var clientCancelRetrievalDeal = &cli.Command{ defer closer() ctx := ReqContext(cctx) - if cctx.Int64("dealid") < 0 { + id := cctx.Int64("deal-id") + if id < 0 { return errors.New("deal id cannot be negative") } - return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(cctx.Int64("dealid"))) + return api.ClientCancelRetrievalDeal(ctx, retrievalmarket.DealID(id)) }, } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 62198e0a2..54fef4264 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -475,10 +475,10 @@ func (a *API) ClientListImports(ctx context.Context) ([]api.Import, error) { return out, nil } -func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealid retrievalmarket.DealID) error { +func (a *API) ClientCancelRetrievalDeal(ctx context.Context, dealID retrievalmarket.DealID) error { cerr := make(chan error) go func() { - err := a.Retrieval.CancelDeal(dealid) + err := a.Retrieval.CancelDeal(dealID) select { case cerr <- err: From 411f561db68f07c8445591f0c9872cd5b62ca739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 27 Mar 2021 10:05:12 +0100 Subject: [PATCH 043/239] backupds: Improve truncated log handling --- cmd/lotus-shed/datastore.go | 5 +++-- lib/backupds/log.go | 20 ++++++++++-------- lib/backupds/read.go | 41 +++++++++++++++++++------------------ 3 files changed, 36 insertions(+), 30 deletions(-) diff --git a/cmd/lotus-shed/datastore.go b/cmd/lotus-shed/datastore.go index e77b9a33a..4533b78a9 100644 --- a/cmd/lotus-shed/datastore.go +++ b/cmd/lotus-shed/datastore.go @@ -181,7 +181,7 @@ var datastoreBackupStatCmd = &cli.Command{ defer f.Close() // nolint:errcheck var keys, logs, kbytes, vbytes uint64 - err = backupds.ReadBackup(f, func(key datastore.Key, value []byte, log bool) error { + clean, err := backupds.ReadBackup(f, func(key datastore.Key, value []byte, log bool) error { if log { logs++ } @@ -194,6 +194,7 @@ var datastoreBackupStatCmd = &cli.Command{ return err } + fmt.Println("Truncated: ", !clean) fmt.Println("Keys: ", keys) fmt.Println("Log values: ", log) fmt.Println("Key bytes: ", units.BytesSize(float64(kbytes))) @@ -229,7 +230,7 @@ var datastoreBackupListCmd = &cli.Command{ defer f.Close() // nolint:errcheck printKv := kvPrinter(cctx.Bool("top-level"), cctx.String("get-enc")) - err = backupds.ReadBackup(f, func(key datastore.Key, value []byte, _ bool) error { + _, err = backupds.ReadBackup(f, func(key datastore.Key, value []byte, _ bool) error { return printKv(key.String(), value) }) if err != nil { diff --git a/lib/backupds/log.go b/lib/backupds/log.go index a708254a1..b76dfbfe6 100644 --- a/lib/backupds/log.go +++ b/lib/backupds/log.go @@ -145,7 +145,7 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { var lastLogHead string var openCount, vals, logvals int64 // check file integrity - err = ReadBackup(f, func(k datastore.Key, v []byte, log bool) error { + clean, err := ReadBackup(f, func(k datastore.Key, v []byte, log bool) error { if log { logvals++ } else { @@ -160,7 +160,7 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { if err != nil { return nil, "", xerrors.Errorf("reading backup part of the logfile: %w", err) } - if string(lh) != lastLogHead { + if string(lh) != lastLogHead && clean { // if not clean, user has opted in to ignore truncated logs, this will almost certainly happen return nil, "", xerrors.Errorf("loghead didn't match, expected '%s', last in logfile '%s'", string(lh), lastLogHead) } @@ -178,8 +178,8 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { } compact := logvals > vals*int64(compactThresh) - if compact { - log.Infow("compacting log", "current", p, "openCount", openCount, "baseValues", vals, "logValues", logvals) + if compact || !clean { + log.Infow("compacting log", "current", p, "openCount", openCount, "baseValues", vals, "logValues", logvals, "truncated", !clean) if err := f.Close(); err != nil { return nil, "", xerrors.Errorf("closing current log: %w", err) } @@ -189,10 +189,14 @@ func (d *Datastore) openLog(p string) (*logfile, string, error) { return nil, "", xerrors.Errorf("creating compacted log: %w", err) } - log.Infow("compacted log created, cleaning up old", "old", p, "new", latest) - if err := os.Remove(p); err != nil { - l.Close() // nolint - return nil, "", xerrors.Errorf("cleaning up old logfile: %w", err) + if clean { + log.Infow("compacted log created, cleaning up old", "old", p, "new", latest) + if err := os.Remove(p); err != nil { + l.Close() // nolint + return nil, "", xerrors.Errorf("cleaning up old logfile: %w", err) + } + } else { + log.Errorw("LOG FILE WAS TRUNCATED, KEEPING THE FILE", "old", p, "new", latest) } return l, latest, nil diff --git a/lib/backupds/read.go b/lib/backupds/read.go index 3d6d24139..33a54e22f 100644 --- a/lib/backupds/read.go +++ b/lib/backupds/read.go @@ -11,16 +11,16 @@ import ( "golang.org/x/xerrors" ) -func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) error) error { +func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) error) (bool, error) { scratch := make([]byte, 9) // read array[2]( if _, err := r.Read(scratch[:1]); err != nil { - return xerrors.Errorf("reading array header: %w", err) + return false, xerrors.Errorf("reading array header: %w", err) } if scratch[0] != 0x82 { - return xerrors.Errorf("expected array(2) header byte 0x82, got %x", scratch[0]) + return false, xerrors.Errorf("expected array(2) header byte 0x82, got %x", scratch[0]) } hasher := sha256.New() @@ -28,16 +28,16 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) // read array[*]( if _, err := hr.Read(scratch[:1]); err != nil { - return xerrors.Errorf("reading array header: %w", err) + return false, xerrors.Errorf("reading array header: %w", err) } if scratch[0] != 0x9f { - return xerrors.Errorf("expected indefinite length array header byte 0x9f, got %x", scratch[0]) + return false, xerrors.Errorf("expected indefinite length array header byte 0x9f, got %x", scratch[0]) } for { if _, err := hr.Read(scratch[:1]); err != nil { - return xerrors.Errorf("reading tuple header: %w", err) + return false, xerrors.Errorf("reading tuple header: %w", err) } // close array[*] @@ -47,22 +47,22 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) // read array[2](key:[]byte, value:[]byte) if scratch[0] != 0x82 { - return xerrors.Errorf("expected array(2) header 0x82, got %x", scratch[0]) + return false, xerrors.Errorf("expected array(2) header 0x82, got %x", scratch[0]) } keyb, err := cbg.ReadByteArray(hr, 1<<40) if err != nil { - return xerrors.Errorf("reading key: %w", err) + return false, xerrors.Errorf("reading key: %w", err) } key := datastore.NewKey(string(keyb)) value, err := cbg.ReadByteArray(hr, 1<<40) if err != nil { - return xerrors.Errorf("reading value: %w", err) + return false, xerrors.Errorf("reading value: %w", err) } if err := cb(key, value, false); err != nil { - return err + return false, err } } @@ -71,11 +71,11 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) // read the [32]byte checksum expSum, err := cbg.ReadByteArray(r, 32) if err != nil { - return xerrors.Errorf("reading expected checksum: %w", err) + return false, xerrors.Errorf("reading expected checksum: %w", err) } if !bytes.Equal(sum, expSum) { - return xerrors.Errorf("checksum didn't match; expected %x, got %x", expSum, sum) + return false, xerrors.Errorf("checksum didn't match; expected %x, got %x", expSum, sum) } // read the log, set of Entry-ies @@ -86,32 +86,33 @@ func ReadBackup(r io.Reader, cb func(key datastore.Key, value []byte, log bool) _, err := bp.ReadByte() switch err { case io.EOF, io.ErrUnexpectedEOF: - return nil + return true, nil case nil: default: - return xerrors.Errorf("peek log: %w", err) + return false, xerrors.Errorf("peek log: %w", err) } if err := bp.UnreadByte(); err != nil { - return xerrors.Errorf("unread log byte: %w", err) + return false, xerrors.Errorf("unread log byte: %w", err) } if err := ent.UnmarshalCBOR(bp); err != nil { switch err { case io.EOF, io.ErrUnexpectedEOF: if os.Getenv("LOTUS_ALLOW_TRUNCATED_LOG") == "1" { - panic("handleme; just ignore and tell the caller about the corrupted file") // todo + log.Errorw("log entry potentially truncated") + return false, nil } else { - return xerrors.Errorf("log entry potentially truncated, set LOTUS_ALLOW_TRUNCATED_LOG=1 to proceed: %w", err) + return false, xerrors.Errorf("log entry potentially truncated, set LOTUS_ALLOW_TRUNCATED_LOG=1 to proceed: %w", err) } default: - return xerrors.Errorf("unmarshaling log entry: %w", err) + return false, xerrors.Errorf("unmarshaling log entry: %w", err) } } key := datastore.NewKey(string(ent.Key)) if err := cb(key, ent.Value, true); err != nil { - return err + return false, err } } } @@ -122,7 +123,7 @@ func RestoreInto(r io.Reader, dest datastore.Batching) error { return xerrors.Errorf("creating batch: %w", err) } - err = ReadBackup(r, func(key datastore.Key, value []byte, _ bool) error { + _, err = ReadBackup(r, func(key datastore.Key, value []byte, _ bool) error { if err := batch.Put(key, value); err != nil { return xerrors.Errorf("put key: %w", err) } From 2c18921bcef4b524afc4a7658d670f44efb61303 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Sat, 27 Mar 2021 10:12:45 +0100 Subject: [PATCH 044/239] update go-commp-utils for >10x faster client commp calculation --- go.mod | 4 ++-- go.sum | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index 621bea702..428c6cd38 100644 --- a/go.mod +++ b/go.mod @@ -30,7 +30,7 @@ require ( github.com/filecoin-project/go-amt-ipld/v2 v2.1.1-0.20201006184820-924ee87a1349 // indirect github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 - github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 + github.com/filecoin-project/go-commp-utils v0.1.0 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 github.com/filecoin-project/go-data-transfer v1.2.7 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a @@ -41,7 +41,7 @@ require ( github.com/filecoin-project/go-paramfetch v0.0.2-0.20200701152213-3e0f0afdc261 github.com/filecoin-project/go-state-types v0.1.0 github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe - github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea + github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.4 diff --git a/go.sum b/go.sum index e4b3d7d0e..9ac1f33f7 100644 --- a/go.sum +++ b/go.sum @@ -260,8 +260,9 @@ github.com/filecoin-project/go-bitfield v0.2.4 h1:uZ7MeE+XfM5lqrHJZ93OnhQKc/rveW github.com/filecoin-project/go-bitfield v0.2.4/go.mod h1:CNl9WG8hgR5mttCnUErjcQjGvuiZjRqK9rHVBsQF4oM= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 h1:av5fw6wmm58FYMgJeoB/lK9XXrgdugYiTqkdxjTy9k8= github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= -github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1:0kHszkYP3hgApcjl5x4rpwONhN9+j7XDobf6at5XfHs= github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.0 h1:PaDxoXYh1TXnnz5kA/xSObpAQwcJSUs4Szb72nuaNdk= +github.com/filecoin-project/go-commp-utils v0.1.0/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= @@ -298,8 +299,8 @@ github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psS github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe h1:dF8u+LEWeIcTcfUcCf3WFVlc81Fr2JKg8zPzIbBDKDw= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statestore v0.1.0/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= -github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea h1:EvmiCrHRrPF2mxVMIRdtsxZGByqwT24aJLw7mdzEFxE= -github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= +github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/c3OROw/kXVNSTZk= +github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= From 869e6a76c16bacb9c0ce448b6963fd5121479995 Mon Sep 17 00:00:00 2001 From: hunjixin <1084400399@qq.com> Date: Mon, 29 Mar 2021 10:28:25 +0800 Subject: [PATCH 045/239] update make gen --- build/openrpc/miner.json.gz | Bin 7801 -> 7778 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 224828a6652f32c604f5e99477de2131eddd6ec2..45ece9898e2671986553d9995b8d773bfb60490e 100644 GIT binary patch delta 7735 zcmV-79?0SOJmNfmABzY8000000RQY=YjfK+*8VFPz8^N}$ck?9MKk^2*h%WvZnT!& z>^AXiAri8%CIK!9Id(n%@9zNMRU|}^q7+5uw%bG`Z~zeJJm-P~;K`saBA#m+L!;a7 zwfBvdfytB_!zY7bW+P*0oKrUU!R6=#9FNY7mT`|fA5$WKYV5Z=dltGko?C{4*o<1f zG5qpm5a{rlAFz!~ib?y}WYjyhED!m<(K0OLn;v$Vr1IBaf8ElrWI87%c;$ni#*BLK z7F}S1yfO3UCVLH%1YWrvU{b=+18bkiKVO4aP`+#jg<1f49`#;>r?2EI^AMYR1o-VU z!jMOx-CiJn`1&h({!0G(>o22a_;bgB-lH)zjF#a-4?40JbB~W{^0?bYrOd#y?^8|t<_tNI(?bu?ac#ugF{YhvuRkzuTD-dG2DC>Wb&T4ezH?) z`n)sgF?_^qHlF|wIg}w_V{&J-jJanULu1C6>kr?&xfMm)CUxFS1BTdhJ<9v_#^${B zW@6LH8wdIfd2gVL`Tu?K$=}F7+PC!o&b#|Z`^NKgYdLqFP%_20EAyBnqu?|bw^PN+ z@LEKFcs(4q*tIOr<&-Gqx+i1gp%dyjnDOu6QQH`jxox+M+=o}lb1;DnEj&NPKAhO- z(>H>=574$J(7X$|F?jcxdUuO2pNp8?O+0#9?9!8g8FIuM4T%W_<~e!*Jr6$e-}$|N z3d>C>wGkwVl8a->E1LbTwe>eU3pJ5`-br|WIp}njz{?nk|Kh(@g`CU8)*ar|q zMH0jA5BhJ94*G}v{llAha6!r45TQZ72%XH3c{lRtJ%`0g0+gbl6rTxhU!q&gyNRrS z5goIUN9nW$+#dLH<4dx^OkX1Yybm}QzXq=y=zfXWK+fci&pb>D)%#-CcvpCnocwx4 zFMqge9IcY7Blqw}P*z zQ}#JW(~23q5>HDINI+y_j-n_EnxFv6)13&Be61*+H>kCL1K=2m zLUgK!X}mbHP9$uG#l_4J2F@%*7@p!})ldp})mR$8AEss1PL^e=ee^0iHKRl;4loZf zbGUv9%V`)5HE~?rk`~8_qVFD=tn45Qi_T0if!^bLVp5Cq*U*?iAMFnkKI$_3t;$E+ z4awb}0+Kxh8F~lJySZBpk`n}fRFEt`_iKr(N?1)3Qv0OIg1{6%d_bs$z(hWy#6lim zGX#7WnH+R1z`q{ggKvYY8Tv|OAQ}Yo>H{`|OjHqHbqeQQ%X52LTtdSqng7 ziMGBH-WY$D=;XHU&09G!#9=U}6FnD9>`T(s>SkxfO&`V>LiKcU3O7VduWT7l_a*9Y<@_a z8|p>2krwT>M70C=<9qmjBwNm2Jw?beZ>|Dc+8;O?({VZPP%#BZ{X`NsTc$_bMM3@gC@R2>;lVv8D+{zC{SeTfBEPx|wZE(f_ z_Q8~T4zj@H5kT;V%#CaT2u`SlOz`U444X56iG@uO&4R$0+YFoh?VbzGJ7h(zaMpe; z;z$r&@KQ7A&)VsKMc60fjR<>AAA6I(p^0Gsn{UnbAN#Ps&nA8U4ms|B>BIlr`6G4Q z|4y7KdYtwLQ{10F?$76F(7PWP&sAePOGD~Sr0IJi$TE-Z9Q&*~cJSKy+UCm*baDFv zdUuHNqFS0KAh#9`v)G}WrH@R3HLrVk)TKVOOC}tg*ccIiRz6ct);poL4H@z@n$1vn zPptPYHD`M3H0N-F?40HAmNCM}M3t5dMNN^3rMpyg&n=nqLk(-L^0~$gdaT3;3#4r1 zVH1sz7u77+YG}0y7S2g5%}XsAGssX$Hav$uyLK&(d1b~ZbLq-{85{aD?ef_XzMK`m z!LkU7lsjyHy|bx#XRieO8B!`O5ZR6z@SjI?O}Zd96&IC2p%JOGI*m&pI zcz;>wE6EVGt~M4Bu9K1T$v2$5dz`#11e4*2`tewQXL)lqE^g3x=XrRUYnkAOx>r&Q zN!Q5B$_5&K-Z_3g(DeA~UAHYDTq7?l$Tyt4dz@V0?$sFg%cG{=lNH3$G#NLK@Y=bx z3HYrm;MYiKETM-APgbrro@ zUR(Tsy|1HtmNZ?w=Ur79nBoyBJuOHQ^C)a&5$QXP}@!!#iv@| zc@S&aPajOGUK&QXciR7r($63Ne)#*hKmUD?e)$)3Kkgs<-u18V%+C+My!$Zj{o=o; zAFm#~i}U;6{>7%1(>1nqkNJy*D@C|MO6o^{#E$*D6(C9y$X_x1DLC@M5hdGWd`lt| z_SnBGT1Q-HU@fbM1zpU1nBwv}ClK(GB54Ghyb~QGUg}RiyTBxoB+>2kdoAMvK4hQC zV=Kb*c3Q?2c974Yx^2>r~C_<>nW$qW*L3ilSMTUq0OPJ^6& zDz+Ttmt61OgLlxcmVtlfpApP3WYo*cF6RZthy*$J*|!(S_u(zd-4^hP&5$=jsj7+7 z!Wd+8U(?HpBXp(83vt!*i|E{(<#zPNq?#Y9&ihM9TjizF1se5iG0GBcHX1b>jhc-{ z%|@eUqfu$}R~;=FgX|eGDMv4VwnEB`lA1~*q(kk3Ryoy>ZD&nNLeW$8A=o)3*Q+*; zE$hRaSU&fSO9SZfJ;XMg*yscGq99$qO&IH$3>Eq62MZdv~h;8x7)wNtd zK%W(SUNMK4$VcA2G;hoGW|_r)ff%$PgCodh`30iG(Q_57vR-4cG#1N$c33PSCsqQ% z(R^ZKe^#mPC7PDx{xE-T?Ywgdzlj{Z5;Z7g<+~NSc*)mS%o>zJ;H?R^-gezHzx+6VDx6phX zd6ZF;Dh$?T7Uu{)+7wp1Z{jr+Xs?1N*sgGEh zxQ$*f@|Zt(5M6axbqexr!BtWg0^w4uZXjC>yyT2s!fzEFTvc>`PIrl=oNYrHw8x>7 zUs$~62$h#;@_)IXDI&t(^x2L4EHIXLoUOsVHUCO0CXJ%$~$#A4a4yhhc16M+^9KUY2KE=w&}>uIDi z=95~BmV2oQYO32Juti-=Vi|9VQ(bGye{!^XlG-tfT(fG%*D@&C#$INTBh4slLu;`M zwFbl<FE9{ODD~#$ViLGZJcCtHJL|AyM z0|h78iURl|qbd6J3&OWEW(cK?h4T0)oz|DRRdHC@N`K zR9_!jY`of{V#&PF>T6n;$ktCQDPF7D(Zv(hbwCk3#(737L3u=`9GFMdwBbD2Py^^M z8PL_7t16}C93}v%9%N5siEJ{vqsisl`IT|il~ocf&#})=u*G@5+LCyd%!+rs=6V;VlBO6(_NGkMdB9b7W$RwWN zc4#paN=TYozI0q6#|6;EoILxr=a#mpTS#utU1r>2z8~xNq^O zq@@^dvo5sB^tVRtsMVypitAD^*|8-Hui?y zKKLnJ?!AyEFnIzcVZy63IiC>FO&bZ1xp!EX4>PM$8%W_GvzAl3#PBO2P z_76w_Mw34f8h^ctyPZd9L+HEMW&^_w3^y>`!0R~27R{>eN~s@N*KFDaOF^ZM57e)PAIik3&AJbEsnuAAl!iPhCp~TyS$sg zbE5~!=z*mxvX{t4&_{9y8p@`sl+gw$N}I99vyC0vsb~ zpHRoaEQ>e#D4d{D3W0-LP})J=Pjj}Kjh^mDW2HC1yfwg_W%bq4aLXL?kvY_(YMyK3 z12mdPU-PJLq+i79tguwkJiSVqXXH^jtxM_j8l}@Hoo!S)g3B9y)99Ps);CL6e#hdl zBUF#G6Mqw`sC7`CE>EgAjRI;E&=x8n)HptkB6=B$=%}-F5j=(1tNK1Mp-PHK0@4Y# z{2H}T;|4WaXe+f)%sd6Z* z(PObNu;z~I0~`=cdBA6oq1sO9`F{6)CBA5;SLt^eIH*Q0*`;dM&6bOY zVk!+w!s187-aoj=WXR$?b~^W9z!z0yWeLUn)7%(#P&+JAEHTUJt3+o>lYbHye^x#e zE;ZQfHC_vE*K;XT;uh)37ffw8zpHLMkN7~$KeFNDYD^xHsgtvlL<`tCDjM^!U|lwY zj88uLW!meK0{&{sS{0?)daWZPGCOkHPSYV3p*Q z3+UZ_px(86>p`npyef~7$_|Rpf3}npQ|LbBl3u$Twb;$IvENa116~art_%q98N5Ue zyl@V&v=g{iU(H5)T2(cstV2+uqg7$KNw)hb1;ESAT}j?<_u!e z0`mM~6OylFf`CN{l9w~fcCNxoZ6KQD&H^MBAT%b(pV|06?12xyVcP~Kf1LXW#8xwK z5rHmwPMKr6x&LLsVjy#oq>(r4gnb6DHLKr~w0VP6-03s|ZtqOszKK z0^ve=N)+d2ADAFuLfb|be-H{tnsAta_m0aR0rkLVh?%%8N(P7huY^&+JbZhLyeNW< zpl3fehTY4QpQVw6$c0!zcp@6LN=}k$k=R6KV?Qe8c7+ZVc*R{Fa?5oLqX5QU5+z^) znK=Vf?D_04jhM8SI=1<+9WTom(!Ms@oA4IC_MLwVK(uNJ@42TbcW< zl$5okG$;UzTjdz_K6fAFDK<=l{t${+f216>>k z2pC$GuM-WbT_wTei4cMdJ%-J>4ZSFIP?H~%8DGV%yo;tuMaFCdbGrp|X@J7NMAMZ7 zlGo2yB@T4INZz^$ITqT;xqO!*DdoEF5Oe!N57l*qaLZQfeYB3 zL-~9qS(FrX!-Ua^?61MASfR*UQnlnWYHs zzAZRMJoo*8zuJv1Caj#`GaRffjM6S*`-f6F+bj&o`ZxoIMQT!ug7Sy@Bl z-^A|xIes@Y$*(i?&!2xbT83DT3Cmq!^G?FqA7cAj@c6w;%^3&MZl^1NOm3TARwg<) z;ljU7b}9AX5;0Ez>7ds#u4tGc7<}h*=(G2px45OQWt`K9f;^)^4DPUH9GeW^%k@&( zk(TlPf5F9G`Vk-TXM}HO%orLSqh0FECBn z4-j#EW@Bf-_|*)R-!QRqX{tApayW31&!FS#e~tXggXYp5sY(+i7Au{0(%4d#I|I0Q zGQ`>d|H}ju=smtCCKVCZp)r9z+8-pk8P|>=OV8qq&}j_@Vt~RWm>|Gt9qIwLuU8K9 z7$Zuz+_6frC(Q|SJCraUp>E^jVXc^9)JdJvseWsnLdM6UQ!xGlTKwbd zm2A!~szIZumeHiZze7Gdwry&zf1*?(BE?6ZNu=k!xO#MvbT=YfevJP{;!Nkb{0Oqy zl}I3c_2ni{Jry|P*$#e(Q=ZdGH zr=O?5KBF84LB@rS$FbOzB+heEYsY#qL_JW^@-8axhtNZF?UOwf=XsX1Yd4nRUZbM; zfz;E$}7YtkGeGgZbYSKwABRJWb+%fq#JZ?&~>Be+CWH;l~4-Pf3cs9D}>f$B9aiS!Ih0Cq`JCML$g5`or{xx41`$JruAT_ZYO&~`9~+B8 zH=&mo5_^|jf zaoG#8X5p*qp0dColOAwA3BD~O=M;mI7_Zt99`?1#AYL(pxVaCtPN-cT{|u7sD?=== zuM_`FW%XYV3c=3zMV=m199!+{>u7OM z0%cUQNPVZ8e^}e9OF<`d7h#I)=xBU2J+zLFU~g~#aR2SzpnG_>TdFY3J>4tt!*%-QoP36u8N-eUf3SGW7#h7!ud~xdilkMP^h!9~pcWK5~&K+e_{WN43J2j!iVD21fLagICcXR0oDln^;) zkgcM1e?)y9wX=xLqN1MK3ES9!-pTD{f!J0(BiMg-=J#@yS>B1!BMAsczDnd1JY_K+d&~tP4zp1`2<|2l4ZxJD1^} zKs-*wZ)4bbF3>z>a{mIFTF2vtozKezj5?c}CK${_U79d8e`Q81W<_VLAA^$m8Hp)2 x(uxo!xk$5uLTK~rZF_S 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 Date: Mon, 29 Mar 2021 10:31:31 +0800 Subject: [PATCH 046/239] fix lint --- api/api_storage.go | 3 ++- node/impl/storminer.go | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 9dae842d2..9662e8cd8 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -3,9 +3,10 @@ package api import ( "bytes" "context" - "github.com/filecoin-project/lotus/chain/actors/builtin" "time" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/google/uuid" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" diff --git a/node/impl/storminer.go b/node/impl/storminer.go index ee15d447b..cad886e2d 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -3,13 +3,14 @@ package impl import ( "context" "encoding/json" - "github.com/filecoin-project/lotus/chain/actors/builtin" - "github.com/filecoin-project/lotus/chain/gen" "net/http" "os" "strconv" "time" + "github.com/filecoin-project/lotus/chain/actors/builtin" + "github.com/filecoin-project/lotus/chain/gen" + "github.com/filecoin-project/lotus/build" "github.com/google/uuid" "github.com/ipfs/go-cid" From 14e6ce843efeb9fee53f0d1ae602c179604a8e04 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:28:35 +0300 Subject: [PATCH 047/239] use latest go-fil-markets and go-data-transfer --- go.mod | 9 ++++----- go.sum | 15 +++++++-------- 2 files changed, 11 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index ed3ebaf64..fdfc28c03 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.2.9 + github.com/filecoin-project/go-data-transfer v1.4.0 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 + github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -116,7 +116,6 @@ require ( github.com/libp2p/go-libp2p-yamux v0.4.1 github.com/libp2p/go-maddr-filter v0.1.0 github.com/mattn/go-colorable v0.1.6 // indirect - github.com/mattn/go-runewidth v0.0.10 // indirect github.com/minio/blake2b-simd v0.0.0-20160723061019-3f5f724cb5b1 github.com/mitchellh/go-homedir v1.1.0 github.com/multiformats/go-base32 v0.0.3 @@ -164,6 +163,6 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/test-vectors => ./extern/test-vectors +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.3 -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.2 +replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 9266cfb9a..c71a72929 100644 --- a/go.sum +++ b/go.sum @@ -270,8 +270,10 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922 h1:vk4TGhO58hE3hs/2Rw5RXbh1Z2/Jy6v1GvkQpfUmYpM= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210323120140-dfc792490922/go.mod h1:xWoSrWwnLg7N6OUFdlijGHfTj2alzgLZW2Z+a4p18vg= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= +github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= +github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -591,6 +593,7 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= @@ -1139,8 +1142,6 @@ github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7 h1:Ei8KR0497xHyKJPAv59M1dkC+rOZCMBJ+t3fZ+twI54= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= -github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= github.com/mattn/go-xmlrpc v0.0.3/go.mod h1:mqc2dz7tP5x5BKlCahN/n+hs7OSZKJkS9JsHNBRlrxA= github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= @@ -1258,8 +1259,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.2 h1:WmkpzXYsGFeNTCpuEtJXJauT0qehWJsKITWWqTOFDzE= -github.com/nonsense/go-data-transfer v0.0.2/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/nonsense/go-data-transfer v0.0.3 h1:4ZcQA8807qIlgjGk4Fk3mqKjfrQM6DiZ8TYJxvE/mQU= +github.com/nonsense/go-data-transfer v0.0.3/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= @@ -1367,8 +1368,6 @@ github.com/raulk/go-watchdog v1.0.1/go.mod h1:lzSbAl5sh4rtI8tYHU01BWIDzgzqaQLj6R github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk= github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo= -github.com/rivo/uniseg v0.1.0 h1:+2KBaVoUmb9XzDsrx/Ct0W/EYOSFf/nWTauy++DprtY= -github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= From fd6d8b302a36c95e68dfbdf42756c6b14584ff0f Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:32:09 +0300 Subject: [PATCH 048/239] commit full.json.gz and miner.json.gz docs --- build/openrpc/full.json.gz | Bin 22582 -> 22705 bytes build/openrpc/miner.json.gz | Bin 7643 -> 7693 bytes documentation/en/api-methods-miner.md | 5 ++++- documentation/en/api-methods.md | 21 ++++++++++++++++++--- 4 files changed, 22 insertions(+), 4 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 42d7e5b954d1b5f955c274b897f12b195c68386a..4120afb7e0018f18ce9658ef290165ebb69eb3dd 100644 GIT binary patch literal 22705 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%0A#r@(QTBKV7FiNjLKUH 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 NS0z^KGriG}{sRwXie~@- literal 22582 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 bMCQV|(2CBVZC)h7&(E={=}o^ts7U_>zxAJ= diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index faab78eb76c65d98e3190189bcda59a2faa51f16..6e7698d4ec3c8cc3fffad1ccf7a892d47876fdaa 100644 GIT binary patch delta 7271 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 delta 7243 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 ZR~ARw^YiWV{|5j7|NqI|fEo*V0RUVoB~$ Date: Mon, 29 Mar 2021 18:39:07 +0300 Subject: [PATCH 049/239] remove storedCounters --- node/modules/client.go | 4 +--- node/modules/storageminer.go | 3 +-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/node/modules/client.go b/node/modules/client.go index ad3b10bb4..053b466f6 100644 --- a/node/modules/client.go +++ b/node/modules/client.go @@ -122,8 +122,6 @@ func RegisterClientValidator(crv dtypes.ClientRequestValidator, dtm dtypes.Clien // NewClientGraphsyncDataTransfer returns a data transfer manager that just // uses the clients's Client DAG service for transfers func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Graphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ClientDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/client/counter")) - // go-data-transfer protocol retries: // 1s, 5s, 25s, 2m5s, 5m x 11 ~= 1 hour dtRetryParams := dtnet.RetryParameters(time.Second, 5*time.Minute, 15, 5) @@ -146,7 +144,7 @@ func NewClientGraphsyncDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.Grap MaxConsecutiveRestarts: 3, CompleteTimeout: 30 * time.Second, }) - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc, dtRestartConf) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, dtRestartConf) if err != nil { return nil, err } diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index d89474eee..1781d0493 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -330,7 +330,6 @@ func HandleMigrateProviderFunds(lc fx.Lifecycle, ds dtypes.MetadataDS, node api. // NewProviderDAGServiceDataTransfer returns a data transfer manager that just // uses the provider's Staging DAG service for transfers func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.StagingGraphsync, ds dtypes.MetadataDS, r repo.LockedRepo) (dtypes.ProviderDataTransfer, error) { - sc := storedcounter.New(ds, datastore.NewKey("/datatransfer/provider/counter")) net := dtnet.NewFromLibp2pHost(h) dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/provider/transfers")) @@ -340,7 +339,7 @@ func NewProviderDAGServiceDataTransfer(lc fx.Lifecycle, h host.Host, gs dtypes.S return nil, err } - dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport, sc) + dt, err := dtimpl.NewDataTransfer(dtDs, filepath.Join(r.Path(), "data-transfer"), net, transport) if err != nil { return nil, err } From f7eff6c728522798b77ef036120a09d8f7e8b455 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 18:45:54 +0300 Subject: [PATCH 050/239] go mod tidy --- go.sum | 3 --- 1 file changed, 3 deletions(-) diff --git a/go.sum b/go.sum index c71a72929..53fd18f29 100644 --- a/go.sum +++ b/go.sum @@ -272,8 +272,6 @@ github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= -github.com/filecoin-project/go-fil-markets v1.1.9 h1:sA0NIEOpy7brZaeXeNgdXg5pvHaBtD5OTRlraOUbI0w= -github.com/filecoin-project/go-fil-markets v1.1.9/go.mod h1:0yQu5gvrjFoAIyzPSSJ+xUdCG83vjInAFbTswIB5/hk= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -593,7 +591,6 @@ github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0 github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.5.2/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= github.com/ipfs/go-hamt-ipld v0.1.1/go.mod h1:1EZCr2v0jlCnhpa+aZ0JZYp8Tt2w16+JJOAVz17YcDk= From 82fb81a33d60e1664462b10e7d1c23e1e677613c Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 19:09:38 +0300 Subject: [PATCH 051/239] short circuit deals with no stages --- cli/deal/inspect.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index 839d16d0b..bc792b68f 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -55,6 +55,11 @@ func renderDeal(di lapi.DealInfo) { color.Blue("Deal ID: %d\n", int(di.DealID)) color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) + if di.DealStages == nil { + color.Yellow("Deal was made with an older version of Lotus and Lotus did not collect detailed information about its stages") + return + } + for _, stg := range di.DealStages.Stages { msg := fmt.Sprintf("%s %s: %s (%s)", color.BlueString("Stage:"), color.BlueString(strings.TrimPrefix(stg.Name, "StorageDeal")), stg.Description, color.GreenString(stg.ExpectedDuration)) if stg.UpdatedTime.Time().IsZero() { From a43f4b33d94f103aea60cb42309f4a23b3989f09 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Mon, 29 Mar 2021 19:25:35 +0300 Subject: [PATCH 052/239] upgrade go-data-transfer --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index fdfc28c03..2391cf400 100644 --- a/go.mod +++ b/go.mod @@ -163,6 +163,6 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.3 +replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.4 replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 53fd18f29..063f950f2 100644 --- a/go.sum +++ b/go.sum @@ -1256,8 +1256,8 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.3 h1:4ZcQA8807qIlgjGk4Fk3mqKjfrQM6DiZ8TYJxvE/mQU= -github.com/nonsense/go-data-transfer v0.0.3/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= +github.com/nonsense/go-data-transfer v0.0.4 h1:Jbpsk4dfBwCTJC25U4Ixif8lws1elhpltX2OtIwI4UI= +github.com/nonsense/go-data-transfer v0.0.4/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= From c800211fbbe8b34b00755dd7c4280bba5e0d04d0 Mon Sep 17 00:00:00 2001 From: Mike Greenberg Date: Mon, 29 Mar 2021 12:54:08 -0400 Subject: [PATCH 053/239] chore: Move lotus mpool clear to lotus-shed --- cli/mpool.go | 7 +++++-- cmd/lotus-shed/mpool.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/cli/mpool.go b/cli/mpool.go index b5a68860f..025a2fc3f 100644 --- a/cli/mpool.go +++ b/cli/mpool.go @@ -132,9 +132,11 @@ var MpoolPending = &cli.Command{ }, } +// Deprecated: MpoolClear is now available at `lotus-shed mpool clear` var MpoolClear = &cli.Command{ - Name: "clear", - Usage: "Clear all pending messages from the mpool (USE WITH CARE)", + Name: "clear", + Usage: "Clear all pending messages from the mpool (USE WITH CARE) (DEPRECATED)", + Hidden: true, Flags: []cli.Flag{ &cli.BoolFlag{ Name: "local", @@ -146,6 +148,7 @@ var MpoolClear = &cli.Command{ }, }, Action: func(cctx *cli.Context) error { + fmt.Println("DEPRECATED: This behavior is being moved to `lotus-shed mpool clear`") api, closer, err := GetFullNodeAPI(cctx) if err != nil { return err diff --git a/cmd/lotus-shed/mpool.go b/cmd/lotus-shed/mpool.go index d3660db69..004bd99a6 100644 --- a/cmd/lotus-shed/mpool.go +++ b/cmd/lotus-shed/mpool.go @@ -15,6 +15,7 @@ var mpoolCmd = &cli.Command{ Flags: []cli.Flag{}, Subcommands: []*cli.Command{ minerSelectMsgsCmd, + mpoolClear, }, } @@ -66,3 +67,36 @@ var minerSelectMsgsCmd = &cli.Command{ return nil }, } + +var mpoolClear = &cli.Command{ + Name: "clear", + Usage: "Clear all pending messages from the mpool (USE WITH CARE)", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "local", + Usage: "also clear local messages", + }, + &cli.BoolFlag{ + Name: "really-do-it", + Usage: "must be specified for the action to take effect", + }, + }, + Action: func(cctx *cli.Context) error { + api, closer, err := lcli.GetFullNodeAPI(cctx) + if err != nil { + return err + } + defer closer() + + really := cctx.Bool("really-do-it") + if !really { + //nolint:golint + return fmt.Errorf("--really-do-it must be specified for this action to have an effect; you have been warned") + } + + local := cctx.Bool("local") + + ctx := lcli.ReqContext(cctx) + return api.MpoolClear(ctx, local) + }, +} From c1600ad6d15579c2e6665d7e408ece2127707b47 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 18:30:04 -0400 Subject: [PATCH 054/239] Update specs-actors to latest master --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index dd042eaeb..878e314a3 100644 --- a/go.mod +++ b/go.mod @@ -42,8 +42,8 @@ require ( github.com/filecoin-project/go-statestore v0.1.1-0.20210311122610-6c7a5aedbdea github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.13 - github.com/filecoin-project/specs-actors/v2 v2.3.4 - github.com/filecoin-project/specs-actors/v3 v3.0.3 + github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb + github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 diff --git a/go.sum b/go.sum index d8175785c..5a06862b3 100644 --- a/go.sum +++ b/go.sum @@ -293,10 +293,10 @@ github.com/filecoin-project/specs-actors v0.9.13 h1:rUEOQouefi9fuVY/2HOroROJlZbO github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm5wWXxqv5+frFEbekBFemYghY= github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= -github.com/filecoin-project/specs-actors/v2 v2.3.4 h1:NZK2oMCcA71wNsUzDBmLQyRMzcCnX9tDGvwZ53G67j8= -github.com/filecoin-project/specs-actors/v2 v2.3.4/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= -github.com/filecoin-project/specs-actors/v3 v3.0.3 h1:bq9B1Jnq+Z0A+Yj3KnYhN3kcTpUyP6Umo3MZgai0BRE= -github.com/filecoin-project/specs-actors/v3 v3.0.3/go.mod h1:oMcmEed6B7H/wHabM3RQphTIhq0ibAKsbpYs+bQ/uxQ= +github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb h1:orr/sMzrDZUPAveRE+paBdu1kScIUO5zm+HYeh+VlhA= +github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= +github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07 h1:wg9HOz+/1HHJsO9Tj4vYvSat2bHm3F6BlFVG20Sfgmc= +github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From cea46e5f538968c4f122280f60e778b1f5db3e01 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 18:48:43 -0400 Subject: [PATCH 055/239] Upgrade to version 11 at Norwegian height --- build/params_2k.go | 1 + build/params_butterfly.go | 1 + build/params_calibnet.go | 1 + build/params_mainnet.go | 3 +++ build/params_nerpanet.go | 1 + chain/actors/version.go | 2 +- chain/stmgr/forks.go | 4 ++++ 7 files changed, 12 insertions(+), 1 deletion(-) diff --git a/build/params_2k.go b/build/params_2k.go index 63f7e70b4..b26579550 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -28,6 +28,7 @@ const UpgradeOrangeHeight = 27 const UpgradeClausHeight = 30 const UpgradeActorsV3Height = 35 +const UpgradeNorwegianHeight = 40 var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, diff --git a/build/params_butterfly.go b/build/params_butterfly.go index f7bf8aa10..5f63a3eab 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -32,6 +32,7 @@ const UpgradePersianHeight = 150 const UpgradeClausHeight = 180 const UpgradeOrangeHeight = 210 const UpgradeActorsV3Height = 240 +const UpgradeNorwegianHeight = 999999 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) diff --git a/build/params_calibnet.go b/build/params_calibnet.go index 976cffd22..83cf10856 100644 --- a/build/params_calibnet.go +++ b/build/params_calibnet.go @@ -40,6 +40,7 @@ const UpgradeClausHeight = 250 const UpgradeOrangeHeight = 300 const UpgradeActorsV3Height = 600 +const UpgradeNorwegianHeight = 114000 func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(32 << 30)) diff --git a/build/params_mainnet.go b/build/params_mainnet.go index cc929978b..635bbc679 100644 --- a/build/params_mainnet.go +++ b/build/params_mainnet.go @@ -56,6 +56,9 @@ const UpgradeClausHeight = 343200 // 2021-03-04T00:00:30Z var UpgradeActorsV3Height = abi.ChainEpoch(550321) +// 2021-04-12T22:00:00Z +const UpgradeNorwegianHeight = 665280 + func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(10 << 40)) diff --git a/build/params_nerpanet.go b/build/params_nerpanet.go index 20ecab4e2..1d051a908 100644 --- a/build/params_nerpanet.go +++ b/build/params_nerpanet.go @@ -39,6 +39,7 @@ const UpgradeClausHeight = 250 const UpgradeOrangeHeight = 300 const UpgradeActorsV3Height = 600 +const UpgradeNorwegianHeight = 999999 func init() { // Minimum block production power is set to 4 TiB diff --git a/chain/actors/version.go b/chain/actors/version.go index 763c5a42c..d62fd0d17 100644 --- a/chain/actors/version.go +++ b/chain/actors/version.go @@ -21,7 +21,7 @@ func VersionForNetwork(version network.Version) Version { return Version0 case network.Version4, network.Version5, network.Version6, network.Version7, network.Version8, network.Version9: return Version2 - case network.Version10: + case network.Version10, network.Version11: return Version3 default: panic(fmt.Sprintf("unsupported network version %d", version)) diff --git a/chain/stmgr/forks.go b/chain/stmgr/forks.go index cb6cb2261..ce140868e 100644 --- a/chain/stmgr/forks.go +++ b/chain/stmgr/forks.go @@ -186,6 +186,10 @@ func DefaultUpgradeSchedule() UpgradeSchedule { StopWithin: 5, }}, Expensive: true, + }, { + Height: build.UpgradeNorwegianHeight, + Network: network.Version11, + Migration: nil, }} for _, u := range updates { From 9c3f66bd8bcc91e1ebb43624ba89ade1d01f02d2 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 19:17:55 -0400 Subject: [PATCH 056/239] Upgrade to actors v3.1.0 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 878e314a3..503e95c5d 100644 --- a/go.mod +++ b/go.mod @@ -43,7 +43,7 @@ require ( github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b github.com/filecoin-project/specs-actors v0.9.13 github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb - github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07 + github.com/filecoin-project/specs-actors/v3 v3.1.0 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.0-beta.1 diff --git a/go.sum b/go.sum index 5a06862b3..09859784a 100644 --- a/go.sum +++ b/go.sum @@ -295,8 +295,8 @@ github.com/filecoin-project/specs-actors/v2 v2.0.1/go.mod h1:v2NZVYinNIKA9acEMBm github.com/filecoin-project/specs-actors/v2 v2.3.2/go.mod h1:UuJQLoTx/HPvvWeqlIFmC/ywlOLHNe8SNQ3OunFbu2Y= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb h1:orr/sMzrDZUPAveRE+paBdu1kScIUO5zm+HYeh+VlhA= github.com/filecoin-project/specs-actors/v2 v2.3.5-0.20210114162132-5b58b773f4fb/go.mod h1:LljnY2Mn2homxZsmokJZCpRuhOPxfXhvcek5gWkmqAc= -github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07 h1:wg9HOz+/1HHJsO9Tj4vYvSat2bHm3F6BlFVG20Sfgmc= -github.com/filecoin-project/specs-actors/v3 v3.0.4-0.20210329192415-0bcea9e3fa07/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= +github.com/filecoin-project/specs-actors/v3 v3.1.0 h1:s4qiPw8pgypqBGAy853u/zdZJ7K9cTZdM1rTiSonHrg= +github.com/filecoin-project/specs-actors/v3 v3.1.0/go.mod h1:mpynccOLlIRy0QnR008BwYBwT9fen+sPR13MA1VmMww= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= From 0b3ca48c05bc3a09ea3ebf66c87b191aa00eb398 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 19:20:20 -0400 Subject: [PATCH 057/239] Introduce UpgradeNorwegianHeight to testground params --- build/params_testground.go | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/build/params_testground.go b/build/params_testground.go index 759b29692..b4bdf0c9c 100644 --- a/build/params_testground.go +++ b/build/params_testground.go @@ -81,18 +81,19 @@ var ( UpgradeBreezeHeight abi.ChainEpoch = -1 BreezeGasTampingDuration abi.ChainEpoch = 0 - UpgradeSmokeHeight abi.ChainEpoch = -1 - UpgradeIgnitionHeight abi.ChainEpoch = -2 - UpgradeRefuelHeight abi.ChainEpoch = -3 - UpgradeTapeHeight abi.ChainEpoch = -4 - UpgradeActorsV2Height abi.ChainEpoch = 10 - UpgradeLiftoffHeight abi.ChainEpoch = -5 - UpgradeKumquatHeight abi.ChainEpoch = -6 - UpgradeCalicoHeight abi.ChainEpoch = -7 - UpgradePersianHeight abi.ChainEpoch = -8 - UpgradeOrangeHeight abi.ChainEpoch = -9 - UpgradeClausHeight abi.ChainEpoch = -10 - UpgradeActorsV3Height abi.ChainEpoch = -11 + UpgradeSmokeHeight abi.ChainEpoch = -1 + UpgradeIgnitionHeight abi.ChainEpoch = -2 + UpgradeRefuelHeight abi.ChainEpoch = -3 + UpgradeTapeHeight abi.ChainEpoch = -4 + UpgradeActorsV2Height abi.ChainEpoch = 10 + UpgradeLiftoffHeight abi.ChainEpoch = -5 + UpgradeKumquatHeight abi.ChainEpoch = -6 + UpgradeCalicoHeight abi.ChainEpoch = -7 + UpgradePersianHeight abi.ChainEpoch = -8 + UpgradeOrangeHeight abi.ChainEpoch = -9 + UpgradeClausHeight abi.ChainEpoch = -10 + UpgradeActorsV3Height abi.ChainEpoch = -11 + UpgradeNorwegianHeight abi.ChainEpoch = -12 DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, From 99a82d83aa827fd921955069b93129336313cb8a Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 18:34:58 -0400 Subject: [PATCH 058/239] Lotus version 1.6.0-rc1 --- CHANGELOG.md | 8 ++++++++ build/version.go | 2 +- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 854166c4c..67baa0ede 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Lotus changelog +# 1.6.0-rc1 / 2021-03-29 + +This is the first release candidate for Lotus v1.6.0. The only change included in this release is introducing network version 11, which implements [FIP-0014](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0014.md). + +## Changes + +- Introduce the v11 network upgrade (https://github.com/filecoin-project/lotus/pull/5904) + # 1.5.3 / 2021-03-24 This is a patch release of Lotus that introduces small fixes to the Storage FSM. diff --git a/build/version.go b/build/version.go index 0715a883a..910b17557 100644 --- a/build/version.go +++ b/build/version.go @@ -29,7 +29,7 @@ func buildType() string { } // BuildVersion is the local build version, set by build system -const BuildVersion = "1.5.3" +const BuildVersion = "1.6.0-rc1" func UserVersion() string { return BuildVersion + buildType() + CurrentCommit From ea2e668b57a04757379d878f9cded8efb59e351e Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Mon, 29 Mar 2021 19:41:47 -0400 Subject: [PATCH 059/239] Bump master to 1.7.0-dev --- build/openrpc/full.json.gz | Bin 22595 -> 22595 bytes build/openrpc/miner.json.gz | Bin 7778 -> 7778 bytes build/openrpc/worker.json.gz | Bin 2579 -> 2580 bytes build/version.go | 2 +- 4 files changed, 1 insertion(+), 1 deletion(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 729bc23680916c51c615571fb9fc45cde73ae15f..1e145564473343db9948a23339e79cd6467c4c4a 100644 GIT binary patch literal 22595 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 T_+J1301E&A=|Y)B0eb)dmoGZ( delta 2192 zcmV;B2yge46q6K?8wYuL{MIA)dXXYff9>cJTlfKlq@0BmXRXe$0}ps%VGq=dI}#7R zK4C^YP5CEv!RC~;-a5{Rf(_Wh4oF*2Uzrx}?(U}ihD`!yqc;-$_Jxak5Z6iswmL#f zvNwJQ*_cl8Os5h1NCLii<0lSjg|9ueW4OTc4Rv90yDT*YpQif5`8l zq9^^htqY>a5qhIP(h0GlH6*Tkd0`cbi;0x02K&^Wb2YC5RAC31gn}g&4}($ zH+^)&7B}qf?had62A)U691rlS12bmbjl5yl!afniGgA-2xgoG4RIv(;o{9j|AtFzve#R z!TI9W!o+bxwun0t+y|kkZf8PV2^RJfMaz~e5JXI@s_JWwJ4{W5$3Hc`4H9NfZMy{&HMZ52ptf2nuI0@uB@ zFjWux)zRX-9DiJ|zgZ#Rrxz+D>Sw@5)^XjAQWqPhS#yaCj%*#oq+rP~jS;b-W z3sp-SigH?2tSOp-QXJjtN-}VjZad;_-9+Vbx>li#4KOz2Sv#PW8Fzj+|BiEhEdSwJ zRw5GSr&6N3(K>kK`=x2{lWqbaMmwrz!59hfxB}!-c8@I_2p13VOetRu+U;prrDb!k zJ&9oc*cV*$)poVV&>p*d-1dl6Alk&I`o9cOt!;j_ru-l8yPe;Y)B-&rPf+%(q7;NQ z)x5@)u{7nnf9({6ZsY3Vh^Sdq+)ot0wUaUfupMGaqZ_Oul6$kku0F;}5c z!&n&wd>7S>O-zP|b(4^qqcUBjrmZA_ne@gg#8%;tZoXCcz#rh+cm@@XLxOTU`K%hA zZ<>e3?cFPU-3Pb#QvOq;zZoy@J-3M)@}Bqf3()DTR5oCX zG5&sQ#Yv}NRdFP^4N_i%lt#uXsYi-9Ur&O7I<3#2H+xr^#`3kq5NeYx2y?iHblZqe z&|}CNl7`+wQ(z$U+lVT)}drg?+h2?4NT5m&}3h;Zl3<=CK;F zOp@7Oy4)U5!Y|u1w$Wv80<8TEu%25s&uGUEH&FIFz4P7dp?o=8L7RZF2^bGEV1GR6 z6f9v}feS>!XC{GE-+;MB{i|2$v)woO%DqyieaKff%k&M#H5m6AFz%#aLGB8|otssm zO%oL%n)YeU8@{|aGALCHQc**iFdvtqJSA$QPih8YYX<|9T$WVX0!6K+d%G3mib9)b z@ID4^_FzU-n21E;7{YZAL_-Re4S%kIxI^xFRAq(ec{NE;R`dRhY!de>%v&;$GCs2# zst&OgeSl1jestnD3?$7K8UJ*xiy?Jn4R10%l=Xa(?x*o8_X585!K=)Q?*Sg*EmXu8 zJ=Sc7YR#nVJVXe48b-^0(WHbHlPPrR08?~Alajnz_4_{r42hXL-C(q|;eRb@wc>=s z;0d?2!6cJ;cl?9cKzfhTnVrphq<5yqJ$VnF|BZkD+Yjd4^S_O~3Ct(G{)F~|`B@M^ zzx&WP4)-?Ot7s}$omYFG$!VxUxlL!NiT;}C?*M$;Zo%UJ%B{=yOF}F92Pka{U-I#X}Q@?v+06 z1FGlB+RFp>2A&#tI#77(73_rffq>DiohdUa==dWE}NRK5FUSA<3G*O+s6!~U;SBhTysi>o1zh>^7Wpr5s9p40`ON=?R!{;emt3b41X8%~w=fh@c^Nz(#K#XVjh{${ebPsQd5& zS5aF(J@$!x4^G^R3SDu+97NCuU28_e+5!@a**WKf1MXaL)y*Aouu%Q1zdHf~qJ| zF Date: Tue, 30 Mar 2021 15:32:44 +0300 Subject: [PATCH 060/239] use go-fil-markets v1.2.4 --- go.mod | 6 ++---- go.sum | 10 ++++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/go.mod b/go.mod index 2391cf400..441b1e938 100644 --- a/go.mod +++ b/go.mod @@ -32,9 +32,9 @@ require ( github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 - github.com/filecoin-project/go-data-transfer v1.4.0 + github.com/filecoin-project/go-data-transfer v1.4.1 github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a - github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 + github.com/filecoin-project/go-fil-markets v1.2.4 github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec github.com/filecoin-project/go-multistore v0.0.3 github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20 @@ -163,6 +163,4 @@ replace github.com/golangci/golangci-lint => github.com/golangci/golangci-lint v replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi -replace github.com/filecoin-project/go-data-transfer => github.com/nonsense/go-data-transfer v0.0.4 - replace github.com/filecoin-project/test-vectors => ./extern/test-vectors diff --git a/go.sum b/go.sum index 063f950f2..cb8b7ec9a 100644 --- a/go.sum +++ b/go.sum @@ -264,14 +264,17 @@ github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434 h1 github.com/filecoin-project/go-commp-utils v0.0.0-20201119054358-b88f7a96a434/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03 h1:2pMXdBnCiXjfCYx/hLqFxccPoqsSveQFxVLvNxy9bus= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= +github.com/filecoin-project/go-data-transfer v1.4.1 h1:4GoMGEdMeDLqbKR74Q5ceZTN35nv+66JZERqQ+SjxWU= +github.com/filecoin-project/go-data-transfer v1.4.1/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a h1:hyJ+pUm/4U4RdEZBlg6k8Ma4rDiuvqyGpoICXAxwsTg= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63 h1:f5jpJQo+6Eb/slc613BKD9OhG9VUZHAigyCyzyJkIL4= -github.com/filecoin-project/go-fil-markets v1.0.8-0.20210325184546-c7ea9187ef63/go.mod h1:p5BIKl6sEoeOCKFa3/nfy66Q95rifEkJyGQgaNjPsno= +github.com/filecoin-project/go-fil-markets v1.2.4 h1:AcNMy/XGvSdv4GjuVoeqe67Q7OvppkSx1zWEGqVHixg= +github.com/filecoin-project/go-fil-markets v1.2.4/go.mod h1:8WEpiMkwdvtHb5dXmRIWX4vz4XjkVlhxRdHJdouV1b0= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -590,6 +593,7 @@ github.com/ipfs/go-filestore v1.0.0/go.mod h1:/XOCuNtIe2f1YPbiXdYvD0BKLA0JR1MgPi github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= +github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= github.com/ipfs/go-graphsync v0.6.0 h1:x6UvDUGA7wjaKNqx5Vbo7FGT8aJ5ryYA0dMQ5jN3dF0= github.com/ipfs/go-graphsync v0.6.0/go.mod h1:e2ZxnClqBBYAtd901g9vXMJzS47labjAtOzsWtOzKNk= @@ -1256,8 +1260,6 @@ github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c h1:5bFTChQxSKNwy github.com/nikkolasg/hexjson v0.0.0-20181101101858-78e39397e00c/go.mod h1:7qN3Y0BvzRUf4LofcoJplQL10lsFDb4PYlePTVwrP28= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229 h1:E2B8qYyeSgv5MXpmzZXRNp8IAQ4vjxIjhpAf5hv/tAg= github.com/nkovacs/streamquote v0.0.0-20170412213628-49af9bddb229/go.mod h1:0aYXnNPJ8l7uZxf45rWW1a/uME32OF0rhiYGNQ2oF2E= -github.com/nonsense/go-data-transfer v0.0.4 h1:Jbpsk4dfBwCTJC25U4Ixif8lws1elhpltX2OtIwI4UI= -github.com/nonsense/go-data-transfer v0.0.4/go.mod h1:n8kbDQXWrY1c4UgfMa9KERxNCWbOTDwdNhf2MpN9dpo= github.com/nxadm/tail v1.4.4 h1:DQuhQpB1tVlglWS2hLQ5OV6B5r8aGxSrPc5Qo6uTN78= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= From 5014b1712e3a1215a5260a6233d40759280e8e75 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 16:16:17 +0300 Subject: [PATCH 061/239] rebuild docs with make docsgen --- build/openrpc/full.json.gz | Bin 22595 -> 22717 bytes build/openrpc/miner.json.gz | Bin 7778 -> 7832 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e145564473343db9948a23339e79cd6467c4c4a..4a73fb761d9424fd3f3c6783142dd24386fb59e7 100644 GIT binary patch delta 22230 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 delta 22155 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%0DPfX74}>_Axu2hP=Q(GUG^~7af0t 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 CC#}=~ diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 7baad0ae31c0e6ec373d51071cca925f593427f9..8d449bed7755e459570920a0fb27d118a6ab9c76 100644 GIT binary patch literal 7832 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 literal 7778 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 From b661f51976db47adb5199dc7b4e3efb7e90d97b6 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 17:08:47 +0300 Subject: [PATCH 062/239] better description for `inspect-deal` --- cli/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/client.go b/cli/client.go index 53baebaf7..dd0c1fbc4 100644 --- a/cli/client.go +++ b/cli/client.go @@ -1172,7 +1172,7 @@ var clientRetrieveCmd = &cli.Command{ var clientInspectDealCmd = &cli.Command{ Name: "inspect-deal", - Usage: "Inspect storage deal", + Usage: "Inspect detailed information about deal's lifecycle and the various stages it goes through", Flags: []cli.Flag{ &cli.IntFlag{ Name: "deal-id", From adaf3a2753dc0cb09011a29e415ee4bda94446a4 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Tue, 30 Mar 2021 17:12:49 +0300 Subject: [PATCH 063/239] remove `found` boolean and use a pointer --- cli/deal/inspect.go | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/cli/deal/inspect.go b/cli/deal/inspect.go index bc792b68f..7869397b5 100644 --- a/cli/deal/inspect.go +++ b/cli/deal/inspect.go @@ -20,23 +20,20 @@ func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, return err } - var di lapi.DealInfo - found := false - for _, cdi := range deals { + var di *lapi.DealInfo + for i, cdi := range deals { if proposalCid != "" && cdi.ProposalCid.String() == proposalCid { - di = cdi - found = true + di = &deals[i] break } if dealId != 0 && int(cdi.DealID) == dealId { - di = cdi - found = true + di = &deals[i] break } } - if !found { + if di == nil { if proposalCid != "" { return fmt.Errorf("cannot find deal with proposal cid: %s", proposalCid) } @@ -51,7 +48,7 @@ func InspectDealCmd(ctx context.Context, api lapi.FullNode, proposalCid string, return nil } -func renderDeal(di lapi.DealInfo) { +func renderDeal(di *lapi.DealInfo) { color.Blue("Deal ID: %d\n", int(di.DealID)) color.Blue("Proposal CID: %s\n\n", di.ProposalCid.String()) From f2ab316fb1c01aa92d537c3d3d601227cde6e1cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Tue, 30 Mar 2021 21:28:54 +0200 Subject: [PATCH 064/239] Local retrieval support --- api/api_full.go | 6 +- cli/client.go | 147 ++++++++++++++++++--------------- node/impl/client/client.go | 161 ++++++++++++++++++++++--------------- 3 files changed, 181 insertions(+), 133 deletions(-) diff --git a/api/api_full.go b/api/api_full.go index b66b0e402..774dd7df1 100644 --- a/api/api_full.go +++ b/api/api_full.go @@ -880,7 +880,7 @@ func (o *QueryOffer) Order(client address.Address) RetrievalOrder { Client: client, Miner: o.Miner, - MinerPeer: o.MinerPeer, + MinerPeer: &o.MinerPeer, } } @@ -899,6 +899,8 @@ type RetrievalOrder struct { Root cid.Cid Piece *cid.Cid Size uint64 + + LocalStore *multistore.StoreID // if specified, get data from local store // TODO: support offset Total types.BigInt UnsealPrice types.BigInt @@ -906,7 +908,7 @@ type RetrievalOrder struct { PaymentIntervalIncrease uint64 Client address.Address Miner address.Address - MinerPeer retrievalmarket.RetrievalPeer + MinerPeer *retrievalmarket.RetrievalPeer } type InvocResult struct { diff --git a/cli/client.go b/cli/client.go index 8dfe2e7be..0550690c6 100644 --- a/cli/client.go +++ b/cli/client.go @@ -999,7 +999,7 @@ var clientFindCmd = &cli.Command{ }, } -const DefaultMaxRetrievePrice = 1 +const DefaultMaxRetrievePrice = "0.01" var clientRetrieveCmd = &cli.Command{ Name: "retrieve", @@ -1020,12 +1020,15 @@ var clientRetrieveCmd = &cli.Command{ }, &cli.StringFlag{ Name: "maxPrice", - Usage: fmt.Sprintf("maximum price the client is willing to consider (default: %d FIL)", DefaultMaxRetrievePrice), + Usage: fmt.Sprintf("maximum price the client is willing to consider (default: %s FIL)", DefaultMaxRetrievePrice), }, &cli.StringFlag{ Name: "pieceCid", Usage: "require data to be retrieved from a specific Piece CID", }, + &cli.BoolFlag{ + Name: "allow-local", + }, }, Action: func(cctx *cli.Context) error { if cctx.NArg() != 2 { @@ -1055,18 +1058,6 @@ var clientRetrieveCmd = &cli.Command{ return err } - // Check if we already have this data locally - - /*has, err := api.ClientHasLocal(ctx, file) - if err != nil { - return err - } - - if has { - fmt.Println("Success: Already in local storage") - return nil - }*/ // TODO: fix - var pieceCid *cid.Cid if cctx.String("pieceCid") != "" { parsed, err := cid.Parse(cctx.String("pieceCid")) @@ -1076,69 +1067,93 @@ var clientRetrieveCmd = &cli.Command{ pieceCid = &parsed } - var offer api.QueryOffer - minerStrAddr := cctx.String("miner") - if minerStrAddr == "" { // Local discovery - offers, err := fapi.ClientFindData(ctx, file, pieceCid) + var order *lapi.RetrievalOrder + if cctx.Bool("allow-local") { + imports, err := fapi.ClientListImports(ctx) + if err != nil { + return err + } - var cleaned []api.QueryOffer - // filter out offers that errored - for _, o := range offers { - if o.Err == "" { - cleaned = append(cleaned, o) + for _, i := range imports { + if i.Root != nil && i.Root.Equals(file) { + order = &lapi.RetrievalOrder{ + Root: file, + LocalStore: &i.Key, + + Total: big.Zero(), + UnsealPrice: big.Zero(), + } + break + } + } + } + + if order == nil { + var offer api.QueryOffer + minerStrAddr := cctx.String("miner") + if minerStrAddr == "" { // Local discovery + offers, err := fapi.ClientFindData(ctx, file, pieceCid) + + var cleaned []api.QueryOffer + // filter out offers that errored + for _, o := range offers { + if o.Err == "" { + cleaned = append(cleaned, o) + } + } + + offers = cleaned + + // sort by price low to high + sort.Slice(offers, func(i, j int) bool { + return offers[i].MinPrice.LessThan(offers[j].MinPrice) + }) + if err != nil { + return err + } + + // TODO: parse offer strings from `client find`, make this smarter + if len(offers) < 1 { + fmt.Println("Failed to find file") + return nil + } + offer = offers[0] + } else { // Directed retrieval + minerAddr, err := address.NewFromString(minerStrAddr) + if err != nil { + return err + } + offer, err = fapi.ClientMinerQueryOffer(ctx, minerAddr, file, pieceCid) + if err != nil { + return err + } + } + if offer.Err != "" { + return fmt.Errorf("The received offer errored: %s", offer.Err) + } + + maxPrice := types.MustParseFIL(DefaultMaxRetrievePrice) + + if cctx.String("maxPrice") != "" { + maxPrice, err = types.ParseFIL(cctx.String("maxPrice")) + if err != nil { + return xerrors.Errorf("parsing maxPrice: %w", err) } } - offers = cleaned - - // sort by price low to high - sort.Slice(offers, func(i, j int) bool { - return offers[i].MinPrice.LessThan(offers[j].MinPrice) - }) - if err != nil { - return err + if offer.MinPrice.GreaterThan(big.Int(maxPrice)) { + return xerrors.Errorf("failed to find offer satisfying maxPrice: %s", maxPrice) } - // TODO: parse offer strings from `client find`, make this smarter - if len(offers) < 1 { - fmt.Println("Failed to find file") - return nil - } - offer = offers[0] - } else { // Directed retrieval - minerAddr, err := address.NewFromString(minerStrAddr) - if err != nil { - return err - } - offer, err = fapi.ClientMinerQueryOffer(ctx, minerAddr, file, pieceCid) - if err != nil { - return err - } + o := offer.Order(payer) + order = &o } - if offer.Err != "" { - return fmt.Errorf("The received offer errored: %s", offer.Err) - } - - maxPrice := types.FromFil(DefaultMaxRetrievePrice) - - if cctx.String("maxPrice") != "" { - maxPriceFil, err := types.ParseFIL(cctx.String("maxPrice")) - if err != nil { - return xerrors.Errorf("parsing maxPrice: %w", err) - } - - maxPrice = types.BigInt(maxPriceFil) - } - - if offer.MinPrice.GreaterThan(maxPrice) { - return xerrors.Errorf("failed to find offer satisfying maxPrice: %s", maxPrice) - } - ref := &lapi.FileRef{ Path: cctx.Args().Get(1), IsCAR: cctx.Bool("car"), } - updates, err := fapi.ClientRetrieveWithEvents(ctx, offer.Order(payer), ref) + + updates, err := fapi.ClientRetrieveWithEvents(ctx, *order, ref) if err != nil { return xerrors.Errorf("error setting up retrieval: %w", err) } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ac526ac60..ffc169667 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -57,6 +57,7 @@ import ( "github.com/filecoin-project/lotus/node/impl/paych" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/repo/importmgr" + "github.com/filecoin-project/lotus/node/repo/retrievalstoremgr" ) var DefaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) @@ -77,6 +78,7 @@ type API struct { Chain *store.ChainStore Imports dtypes.ClientImportMgr + Mds dtypes.ClientMultiDstore CombinedBstore dtypes.ClientBlockstore // TODO: try to remove RetrievalStoreMgr dtypes.ClientRetrievalStoreManager @@ -555,86 +557,102 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref } } - if order.MinerPeer.ID == "" { - mi, err := a.StateMinerInfo(ctx, order.Miner, types.EmptyTSK) - if err != nil { - finish(err) + var store retrievalstoremgr.RetrievalStore + + if order.LocalStore == nil { + if order.MinerPeer == nil || order.MinerPeer.ID == "" { + mi, err := a.StateMinerInfo(ctx, order.Miner, types.EmptyTSK) + if err != nil { + finish(err) + return + } + + order.MinerPeer = &retrievalmarket.RetrievalPeer{ + ID: *mi.PeerId, + Address: order.Miner, + } + } + + if order.Size == 0 { + finish(xerrors.Errorf("cannot make retrieval deal for zero bytes")) return } - order.MinerPeer = retrievalmarket.RetrievalPeer{ - ID: *mi.PeerId, - Address: order.Miner, + /*id, st, err := a.imgr().NewStore() + if err != nil { + return err } - } + if err := a.imgr().AddLabel(id, "source", "retrieval"); err != nil { + return err + }*/ - if order.Size == 0 { - finish(xerrors.Errorf("cannot make retrieval deal for zero bytes")) - return - } + ppb := types.BigDiv(order.Total, types.NewInt(order.Size)) - /*id, st, err := a.imgr().NewStore() - if err != nil { - return err - } - if err := a.imgr().AddLabel(id, "source", "retrieval"); err != nil { - return err - }*/ + params, err := rm.NewParamsV1(ppb, order.PaymentInterval, order.PaymentIntervalIncrease, shared.AllSelector(), order.Piece, order.UnsealPrice) + if err != nil { + finish(xerrors.Errorf("Error in retrieval params: %s", err)) + return + } - ppb := types.BigDiv(order.Total, types.NewInt(order.Size)) + store, err := a.RetrievalStoreMgr.NewStore() + if err != nil { + finish(xerrors.Errorf("Error setting up new store: %w", err)) + return + } - params, err := rm.NewParamsV1(ppb, order.PaymentInterval, order.PaymentIntervalIncrease, shared.AllSelector(), order.Piece, order.UnsealPrice) - if err != nil { - finish(xerrors.Errorf("Error in retrieval params: %s", err)) - return - } + defer func() { + _ = a.RetrievalStoreMgr.ReleaseStore(store) + }() - store, err := a.RetrievalStoreMgr.NewStore() - if err != nil { - finish(xerrors.Errorf("Error setting up new store: %w", err)) - return - } - - defer func() { - _ = a.RetrievalStoreMgr.ReleaseStore(store) - }() - - // Subscribe to events before retrieving to avoid losing events. - subscribeEvents := make(chan retrievalSubscribeEvent, 1) - subscribeCtx, cancel := context.WithCancel(ctx) - defer cancel() - unsubscribe := a.Retrieval.SubscribeToEvents(func(event rm.ClientEvent, state rm.ClientDealState) { - // We'll check the deal IDs inside readSubscribeEvents. - if state.PayloadCID.Equals(order.Root) { - select { - case <-subscribeCtx.Done(): - case subscribeEvents <- retrievalSubscribeEvent{event, state}: + // Subscribe to events before retrieving to avoid losing events. + subscribeEvents := make(chan retrievalSubscribeEvent, 1) + subscribeCtx, cancel := context.WithCancel(ctx) + defer cancel() + unsubscribe := a.Retrieval.SubscribeToEvents(func(event rm.ClientEvent, state rm.ClientDealState) { + // We'll check the deal IDs inside readSubscribeEvents. + if state.PayloadCID.Equals(order.Root) { + select { + case <-subscribeCtx.Done(): + case subscribeEvents <- retrievalSubscribeEvent{event, state}: + } } + }) + + dealID, err := a.Retrieval.Retrieve( + ctx, + order.Root, + params, + order.Total, + *order.MinerPeer, + order.Client, + order.Miner, + store.StoreID()) + + if err != nil { + unsubscribe() + finish(xerrors.Errorf("Retrieve failed: %w", err)) + return } - }) - dealID, err := a.Retrieval.Retrieve( - ctx, - order.Root, - params, - order.Total, - order.MinerPeer, - order.Client, - order.Miner, - store.StoreID()) + err = readSubscribeEvents(ctx, dealID, subscribeEvents, events) - if err != nil { unsubscribe() - finish(xerrors.Errorf("Retrieve failed: %w", err)) - return - } + if err != nil { + finish(xerrors.Errorf("Retrieve: %w", err)) + return + } + } else { + // local retrieval + st, err := ((*multistore.MultiStore)(a.Mds)).Get(*order.LocalStore) + if err != nil { + finish(xerrors.Errorf("Retrieve: %w", err)) + return + } - err = readSubscribeEvents(ctx, dealID, subscribeEvents, events) - - unsubscribe() - if err != nil { - finish(xerrors.Errorf("Retrieve: %w", err)) - return + store = &multiStoreRetrievalStore{ + storeID: *order.LocalStore, + store: st, + } } // If ref is nil, it only fetches the data into the configured blockstore. @@ -674,6 +692,19 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref return } +type multiStoreRetrievalStore struct { + storeID multistore.StoreID + store *multistore.Store +} + +func (mrs *multiStoreRetrievalStore) StoreID() *multistore.StoreID { + return &mrs.storeID +} + +func (mrs *multiStoreRetrievalStore) DAGService() ipld.DAGService { + return mrs.store.DAG +} + func (a *API) ClientQueryAsk(ctx context.Context, p peer.ID, miner address.Address) (*storagemarket.StorageAsk, error) { mi, err := a.StateMinerInfo(ctx, miner, types.EmptyTSK) if err != nil { From fd140c3eafb2e275b7494e734b6defaac56ebd63 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 30 Mar 2021 20:59:15 -0400 Subject: [PATCH 065/239] Debug mode: Make upgrade heights controllable by an envvar --- build/params_2k.go | 62 +++++++++++++++++++++++++++++++++++----------- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/build/params_2k.go b/build/params_2k.go index b26579550..e94c71154 100644 --- a/build/params_2k.go +++ b/build/params_2k.go @@ -3,6 +3,9 @@ package build import ( + "os" + "strconv" + "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/chain/actors/policy" ) @@ -10,25 +13,27 @@ import ( const BootstrappersFile = "" const GenesisFile = "" -const UpgradeBreezeHeight = -1 +var UpgradeBreezeHeight = abi.ChainEpoch(-1) + const BreezeGasTampingDuration = 0 -const UpgradeSmokeHeight = -1 -const UpgradeIgnitionHeight = -2 -const UpgradeRefuelHeight = -3 -const UpgradeTapeHeight = -4 +var UpgradeSmokeHeight = abi.ChainEpoch(-1) +var UpgradeIgnitionHeight = abi.ChainEpoch(-2) +var UpgradeRefuelHeight = abi.ChainEpoch(-3) +var UpgradeTapeHeight = abi.ChainEpoch(-4) -const UpgradeActorsV2Height = 10 -const UpgradeLiftoffHeight = -5 +var UpgradeActorsV2Height = abi.ChainEpoch(10) +var UpgradeLiftoffHeight = abi.ChainEpoch(-5) -const UpgradeKumquatHeight = 15 -const UpgradeCalicoHeight = 20 -const UpgradePersianHeight = 25 -const UpgradeOrangeHeight = 27 -const UpgradeClausHeight = 30 +var UpgradeKumquatHeight = abi.ChainEpoch(15) +var UpgradeCalicoHeight = abi.ChainEpoch(20) +var UpgradePersianHeight = abi.ChainEpoch(25) +var UpgradeOrangeHeight = abi.ChainEpoch(27) +var UpgradeClausHeight = abi.ChainEpoch(30) -const UpgradeActorsV3Height = 35 -const UpgradeNorwegianHeight = 40 +var UpgradeActorsV3Height = abi.ChainEpoch(35) + +var UpgradeNorwegianHeight = abi.ChainEpoch(40) var DrandSchedule = map[abi.ChainEpoch]DrandEnum{ 0: DrandMainnet, @@ -39,6 +44,35 @@ func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2048)) policy.SetMinVerifiedDealSize(abi.NewStoragePower(256)) + getUpgradeHeight := func(ev string, def abi.ChainEpoch) abi.ChainEpoch { + hs, found := os.LookupEnv(ev) + if found { + h, err := strconv.Atoi(hs) + if err != nil { + log.Panicf("failed to parse %s env var", ev) + } + + return abi.ChainEpoch(h) + } + + return def + } + + UpgradeBreezeHeight = getUpgradeHeight("LOTUS_BREEZE_HEIGHT", UpgradeBreezeHeight) + UpgradeSmokeHeight = getUpgradeHeight("LOTUS_SMOKE_HEIGHT", UpgradeSmokeHeight) + UpgradeIgnitionHeight = getUpgradeHeight("LOTUS_IGNITION_HEIGHT", UpgradeIgnitionHeight) + UpgradeRefuelHeight = getUpgradeHeight("LOTUS_REFUEL_HEIGHT", UpgradeRefuelHeight) + UpgradeTapeHeight = getUpgradeHeight("LOTUS_TAPE_HEIGHT", UpgradeTapeHeight) + UpgradeActorsV2Height = getUpgradeHeight("LOTUS_ACTORSV2_HEIGHT", UpgradeActorsV2Height) + UpgradeLiftoffHeight = getUpgradeHeight("LOTUS_LIFTOFF_HEIGHT", UpgradeLiftoffHeight) + UpgradeKumquatHeight = getUpgradeHeight("LOTUS_KUMQUAT_HEIGHT", UpgradeKumquatHeight) + UpgradeCalicoHeight = getUpgradeHeight("LOTUS_CALICO_HEIGHT", UpgradeCalicoHeight) + UpgradePersianHeight = getUpgradeHeight("LOTUS_PERSIAN_HEIGHT", UpgradePersianHeight) + UpgradeOrangeHeight = getUpgradeHeight("LOTUS_ORANGE_HEIGHT", UpgradeOrangeHeight) + UpgradeClausHeight = getUpgradeHeight("LOTUS_CLAUS_HEIGHT", UpgradeClausHeight) + UpgradeActorsV3Height = getUpgradeHeight("LOTUS_ACTORSV3_HEIGHT", UpgradeActorsV3Height) + UpgradeNorwegianHeight = getUpgradeHeight("LOTUS_NORWEGIAN_HEIGHT", UpgradeNorwegianHeight) + BuildType |= Build2k } From 15e8ea196626ba3268c8f22846a4942c5f680fe8 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Wed, 31 Mar 2021 00:00:45 -0400 Subject: [PATCH 066/239] Lotus version 1.6.0-rc2 --- CHANGELOG.md | 5 +++-- build/version.go | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 67baa0ede..b1d71749a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,12 +1,13 @@ # Lotus changelog -# 1.6.0-rc1 / 2021-03-29 +# 1.6.0-rc2 / 2021-03-30 -This is the first release candidate for Lotus v1.6.0. The only change included in this release is introducing network version 11, which implements [FIP-0014](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0014.md). +This is the second release candidate for Lotus v1.6.0. The primary change included in this release is introducing network version 11, which implements [FIP-0014](https://github.com/filecoin-project/FIPs/blob/master/FIPS/fip-0014.md). ## Changes - Introduce the v11 network upgrade (https://github.com/filecoin-project/lotus/pull/5904) +- Debug mode: Make upgrade heights controllable by an envvar (https://github.com/filecoin-project/lotus/pull/5919) # 1.5.3 / 2021-03-24 diff --git a/build/version.go b/build/version.go index 910b17557..e2528f8cc 100644 --- a/build/version.go +++ b/build/version.go @@ -29,7 +29,7 @@ func buildType() string { } // BuildVersion is the local build version, set by build system -const BuildVersion = "1.6.0-rc1" +const BuildVersion = "1.6.0-rc2" func UserVersion() string { return BuildVersion + buildType() + CurrentCommit From 3895b2ccca396183b0d40380aeb0b6bdd5f9fefa Mon Sep 17 00:00:00 2001 From: yaohcn Date: Wed, 31 Mar 2021 14:30:24 +0800 Subject: [PATCH 067/239] fix reservations --- extern/sector-storage/stores/local.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/extern/sector-storage/stores/local.go b/extern/sector-storage/stores/local.go index a7df5ae21..5837b711c 100644 --- a/extern/sector-storage/stores/local.go +++ b/extern/sector-storage/stores/local.go @@ -392,8 +392,10 @@ func (st *Local) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac } p.reserved += overhead + p.reservations[sid.ID] |= fileType prevDone := done + saveFileType := fileType done = func() { prevDone() @@ -401,6 +403,10 @@ func (st *Local) Reserve(ctx context.Context, sid storage.SectorRef, ft storifac defer st.localLk.Unlock() p.reserved -= overhead + p.reservations[sid.ID] ^= saveFileType + if p.reservations[sid.ID] == storiface.FTNone { + delete(p.reservations, sid.ID) + } } } From dfe8a1c1e25b6246cb212b7b3f9560f734f4013e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Mar 2021 19:38:02 +0200 Subject: [PATCH 068/239] client: Set the client var in the correct scope --- node/impl/client/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/impl/client/client.go b/node/impl/client/client.go index ffc169667..28496cd15 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -594,7 +594,7 @@ func (a *API) clientRetrieve(ctx context.Context, order api.RetrievalOrder, ref return } - store, err := a.RetrievalStoreMgr.NewStore() + store, err = a.RetrievalStoreMgr.NewStore() if err != nil { finish(xerrors.Errorf("Error setting up new store: %w", err)) return From 823c6600e3b73b01b109d24b1c3208341d439456 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 31 Mar 2021 19:38:34 +0200 Subject: [PATCH 069/239] docsgen --- build/openrpc/full.json.gz | Bin 22595 -> 22613 bytes documentation/en/api-methods.md | 2 ++ 2 files changed, 2 insertions(+) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e145564473343db9948a23339e79cd6467c4c4a..e34c8fcea4d8c06cfcabbd9c6196b6cf51acc578 100644 GIT binary patch delta 16933 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 V+vESm85sWmf9%QUD3r&-006>5NxA?4 delta 16864 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 T{rLX^00960?@x)}(rp9)M|4+p diff --git a/documentation/en/api-methods.md b/documentation/en/api-methods.md index b8764d5b1..51d64859b 100644 --- a/documentation/en/api-methods.md +++ b/documentation/en/api-methods.md @@ -1352,6 +1352,7 @@ Inputs: }, "Piece": null, "Size": 42, + "LocalStore": 12, "Total": "0", "UnsealPrice": "0", "PaymentInterval": 42, @@ -1405,6 +1406,7 @@ Inputs: }, "Piece": null, "Size": 42, + "LocalStore": 12, "Total": "0", "UnsealPrice": "0", "PaymentInterval": 42, From a59e36d2134eb6e80584523369c6ace8c4bc9e4a Mon Sep 17 00:00:00 2001 From: Travis Person Date: Wed, 31 Mar 2021 19:16:32 +0000 Subject: [PATCH 070/239] Update butterfly network upgrade --- build/params_butterfly.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/params_butterfly.go b/build/params_butterfly.go index 5f63a3eab..579e019b1 100644 --- a/build/params_butterfly.go +++ b/build/params_butterfly.go @@ -32,7 +32,7 @@ const UpgradePersianHeight = 150 const UpgradeClausHeight = 180 const UpgradeOrangeHeight = 210 const UpgradeActorsV3Height = 240 -const UpgradeNorwegianHeight = 999999 +const UpgradeNorwegianHeight = UpgradeActorsV3Height + (builtin2.EpochsInHour * 12) func init() { policy.SetConsensusMinerMinPower(abi.NewStoragePower(2 << 30)) From 41efbc000d9f6b4509bb71572120586c23f869c2 Mon Sep 17 00:00:00 2001 From: Travis Person Date: Wed, 31 Mar 2021 19:45:17 +0000 Subject: [PATCH 071/239] New butterfly network info --- build/bootstrap/butterflynet.pi | 4 ++-- build/genesis/butterflynet.car | Bin 2519783 -> 0 bytes 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 build/genesis/butterflynet.car diff --git a/build/bootstrap/butterflynet.pi b/build/bootstrap/butterflynet.pi index dc49bdf0e..0de3043a3 100644 --- a/build/bootstrap/butterflynet.pi +++ b/build/bootstrap/butterflynet.pi @@ -1,2 +1,2 @@ -/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWQafkXgEWDgcVhZvF6KMhiC8ktdxjvmdQN8RarRXe9jCc -/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWE7UmZ4DLk9WBdEJUSwuSCPiSqjoCv3wPeoe8Tq3yMa77 +/dns4/bootstrap-0.butterfly.fildev.network/tcp/1347/p2p/12D3KooWRkaF18SR3E6qL6dkGrozT8QJUV5VbhE9E7BZtPmHqdWJ +/dns4/bootstrap-1.butterfly.fildev.network/tcp/1347/p2p/12D3KooWJcJUc23WJjJHGSboGcU3t76z9Lb7CghrH2tiBiDCY4ux diff --git a/build/genesis/butterflynet.car b/build/genesis/butterflynet.car deleted file mode 100644 index 1f5185c1af87b62a515224eb3073edf42f83a7e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2519783 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

QOS2T{eE!(#yDhy0&FCb;jlQ^C%P@KC72r` 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

jD0LcMUHL~4tw_Gwtr<*fLaUU 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