From 74a9dfc99f4480ce86e73e9747d7bc681e897580 Mon Sep 17 00:00:00 2001 From: mitchellsoo Date: Sat, 18 Jul 2020 14:21:02 +0800 Subject: [PATCH 001/146] 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/146] 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 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 003/146] 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 004/146] 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 005/146] 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 006/146] 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 007/146] 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 008/146] 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 009/146] 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 010/146] 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 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 011/146] 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 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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..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 012/146] 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 013/146] 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 014/146] 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 015/146] 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 016/146] 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 c800211fbbe8b34b00755dd7c4280bba5e0d04d0 Mon Sep 17 00:00:00 2001 From: Mike Greenberg Date: Mon, 29 Mar 2021 12:54:08 -0400 Subject: [PATCH 017/146] 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 018/146] 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 019/146] 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 020/146] 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 021/146] 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 022/146] 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 fd140c3eafb2e275b7494e734b6defaac56ebd63 Mon Sep 17 00:00:00 2001 From: Aayush Rajasekaran Date: Tue, 30 Mar 2021 20:59:15 -0400 Subject: [PATCH 023/146] 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 024/146] 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 a59e36d2134eb6e80584523369c6ace8c4bc9e4a Mon Sep 17 00:00:00 2001 From: Travis Person Date: Wed, 31 Mar 2021 19:16:32 +0000 Subject: [PATCH 025/146] 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 026/146] 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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