package api import ( "encoding/json" "fmt" "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/specs-actors/actors/abi" "github.com/filecoin-project/specs-actors/actors/builtin/miner" "github.com/ipfs/go-cid" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" ma "github.com/multiformats/go-multiaddr" ) // TODO: check if this exists anywhere else type MultiaddrSlice []ma.Multiaddr func (m *MultiaddrSlice) UnmarshalJSON(raw []byte) (err error) { var temp []string if err := json.Unmarshal(raw, &temp); err != nil { return err } res := make([]ma.Multiaddr, len(temp)) for i, str := range temp { res[i], err = ma.NewMultiaddr(str) if err != nil { return err } } *m = res return nil } var _ json.Unmarshaler = new(MultiaddrSlice) type ObjStat struct { Size uint64 Links uint64 } type PubsubScore struct { ID peer.ID Score *pubsub.PeerScoreSnapshot } type MinerInfo struct { Owner address.Address // Must be an ID-address. Worker address.Address // Must be an ID-address. NewWorker address.Address // Must be an ID-address. ControlAddresses []address.Address // Must be an ID-addresses. WorkerChangeEpoch abi.ChainEpoch PeerId *peer.ID Multiaddrs []abi.Multiaddrs SealProofType abi.RegisteredSealProof SectorSize abi.SectorSize WindowPoStPartitionSectors uint64 ConsensusFaultElapsed abi.ChainEpoch } func NewApiMinerInfo(info *miner.MinerInfo) MinerInfo { var pid *peer.ID if peerID, err := peer.IDFromBytes(info.PeerId); err == nil { pid = &peerID } mi := MinerInfo{ Owner: info.Owner, Worker: info.Worker, ControlAddresses: info.ControlAddresses, NewWorker: address.Undef, WorkerChangeEpoch: -1, PeerId: pid, Multiaddrs: info.Multiaddrs, SealProofType: info.SealProofType, SectorSize: info.SectorSize, WindowPoStPartitionSectors: info.WindowPoStPartitionSectors, ConsensusFaultElapsed: info.ConsensusFaultElapsed, } if info.PendingWorkerKey != nil { mi.NewWorker = info.PendingWorkerKey.NewWorker mi.WorkerChangeEpoch = info.PendingWorkerKey.EffectiveAt } return mi } type MessageSendSpec struct { MaxFee abi.TokenAmount } var DefaultMessageSendSpec = MessageSendSpec{ // MaxFee of 0.1FIL MaxFee: abi.NewTokenAmount(int64(build.FilecoinPrecision) / 10), } func (ms *MessageSendSpec) Get() MessageSendSpec { if ms == nil { return DefaultMessageSendSpec } return *ms } type DataTransferChannel struct { TransferID datatransfer.TransferID Status datatransfer.Status BaseCID cid.Cid IsInitiator bool IsSender bool Voucher string Message string OtherPeer peer.ID Transferred uint64 } // NewDataTransferChannel constructs an API DataTransferChannel type from full channel state snapshot and a host id func NewDataTransferChannel(hostID peer.ID, channelState datatransfer.ChannelState) DataTransferChannel { channel := DataTransferChannel{ TransferID: channelState.TransferID(), Status: channelState.Status(), BaseCID: channelState.BaseCID(), IsSender: channelState.Sender() == hostID, Message: channelState.Message(), } stringer, ok := channelState.Voucher().(fmt.Stringer) if ok { channel.Voucher = stringer.String() } else { voucherJSON, err := json.Marshal(channelState.Voucher()) if err != nil { channel.Voucher = fmt.Errorf("Voucher Serialization: %w", err).Error() } else { channel.Voucher = string(voucherJSON) } } if channel.IsSender { channel.IsInitiator = !channelState.IsPull() channel.Transferred = channelState.Sent() channel.OtherPeer = channelState.Recipient() } else { channel.IsInitiator = channelState.IsPull() channel.Transferred = channelState.Received() channel.OtherPeer = channelState.Sender() } return channel }