UNPKG

iso-filecoin

Version:

Isomorphic filecoin abstractions for RPC, signatures, address, token and wallet

422 lines (381 loc) 8.75 kB
import type _LedgerTransport from '@ledgerhq/hw-transport/lib-es/Transport' import type BigNumber from 'bignumber.js' import type { Driver } from 'iso-kv' import type { JsonValue, SetOptional, SetRequired } from 'type-fest' import type { z } from 'zod' // import type { WalletSupport as _WalletSupport } from './adapters/common' import type { AddressId, PROTOCOL_INDICATOR } from './address' import type { MessageSchema } from './message.js' import type { RPC } from './rpc' import type { SignatureObj, SignatureType } from './signature' export type Transport = _LedgerTransport export type TransportImpl = typeof _LedgerTransport export type { MaybeResult } from 'iso-web/types' export type * from './message.js' export type { LotusSignature, Signature, SignatureCode, SignatureObj, SignatureType, } from './signature.js' // export type * from './adapters/types' export type MessageObj = z.infer<typeof MessageSchema> export type PartialMessageObj = SetOptional< MessageObj, | 'version' | 'nonce' | 'gasLimit' | 'gasFeeCap' | 'gasPremium' | 'method' | 'params' > export type ProtocolIndicator = typeof PROTOCOL_INDICATOR export type ProtocolIndicatorCode = ProtocolIndicator[keyof ProtocolIndicator] export type HexAddress = `0x${string}` export type CID = { '/': string } export type Cache = boolean | Driver | undefined /** * Account types */ /** * Account interface */ export interface IAccount { type: SignatureType address: IAddress publicKey: Uint8Array /** * Derivation path - only for HD wallets */ path?: string /** * Private key - only for RAW and HD wallets */ privateKey?: Uint8Array } export type IAccountWithPath = SetRequired<IAccount, 'path'> /** * Address types */ /** * Options for RPC-based address methods */ export interface AddressRpcOptions { rpc: RPC cache?: Cache } export type Safety = 'safe' | 'finalized' | 'latest' /** * Options for RPC-based address methods with safety */ export interface AddressRpcSafetyOptions extends AddressRpcOptions { safety?: Safety } /** * Address interface */ export interface IAddress { protocol: ProtocolIndicatorCode payload: Uint8Array network: Network networkPrefix: NetworkPrefix namespace?: number id?: bigint checksum: () => Uint8Array toContractDestination: () => HexAddress toString: () => string toBytes: () => Uint8Array /** * Convert to ID address */ toIdAddress: (options: AddressRpcOptions) => Promise<AddressId> /** * Converts any address to a 0x address, either id masked address or eth address depending on the address type. * Delegated addresses convert to eth address and f1, f2, f3 convert to id masked address * and f0 depends on the underline address type */ to0x: (options: AddressRpcOptions) => Promise<string> } export interface DerivationPathComponents { purpose: number coinType: number account: number change: number addressIndex: number } export type Network = 'mainnet' | 'testnet' export type NetworkPrefix = 'f' | 't' export type ChainRpcUrls = { http: string[] webSocket?: string[] | undefined } export type ChainBlockExplorer = { name: string url: string apiUrl?: string | undefined } export type ChainContract = { address: HexAddress blockCreated?: number | undefined } export interface Chain { id: number | string name: string testnet?: boolean nativeCurrency: { name: string symbol: string decimals: number } rpcUrls: { [key: string]: ChainRpcUrls default: ChainRpcUrls } blockExplorers?: { [key: string]: ChainBlockExplorer default: ChainBlockExplorer } contracts?: { [key: string]: ChainContract } chainNamespace: string /** * CAIP-2 ID */ caipNetworkId: `${string}:${string}` /** * Chain ID 0x prefixed hex string */ chainId: string iconUrls?: string[] } /** * Ethereum chain type (Metamask) */ export type EthereumChain = { /** A 0x-prefixed hexadecimal string */ chainId: string /** The chain name. */ chainName: string /** Native currency for the chain. */ nativeCurrency?: | { name: string symbol: string decimals: number } | undefined rpcUrls: string[] blockExplorerUrls?: string[] | undefined iconUrls?: string[] | undefined } /** * JSON-RPC 2.0 */ export interface JsonRpcError { code: number message: string data?: JsonValue } export interface JsonRpcRequest { jsonrpc: '2.0' id?: number | string | null /** * A String containing the name of the method to be invoked. Method names that begin with the word rpc followed by a period character (U+002E or ASCII 46) are reserved for rpc-internal methods and extensions and MUST NOT be used for anything else. */ method: string params?: JsonValue } export type JsonRpcResponse = | { jsonrpc: '2.0' id: number | string | null result: JsonValue error?: undefined } | { jsonrpc: '2.0' id: number | string | null error: JsonRpcError result?: undefined } // RPC types export interface Options { token?: string api: string | URL network?: Network fetch?: typeof globalThis.fetch } export interface RpcOptions { method: `Filecoin.${string}` params?: JsonValue } export interface MsgReceipt { ExitCode: number Return: string | null GasUsed: number EventsRoot: CID | null } export type TipSetKey = CID[] export interface MsgLookup { Height: number Message: CID Receipt: MsgReceipt ReturnDec: unknown | null TipSet: TipSetKey } export interface Block { BLSAggregate: { Data: string Type: 2 } BeaconEntries: { Data: string Round: number }[] BlockSig: { Data: string Type: 2 } ElectionProof: { VRFProof: string WinCount: number } ForkSignaling: number Height: number Messages: CID /** * The miner address of the block. */ Miner: string ParentBaseFee: string ParentMessageReceipts: CID ParentStateRoot: CID /** * BitInt as a string */ ParentWeight: string Parents: CID[] Ticket: { VRFProof: string } Timestamp: number WinPoStProof: { PoStProof: number ProofBytes: string }[] } export interface TipSet { Cids: CID[] Height: number Blocks: Block[] } /** * Lotus API responses * * @see https://filecoin-shipyard.github.io/js-lotus-client/api/api.html */ /** * Lotus message */ export interface LotusMessage { Version: 0 To: string From: string Nonce: number Value: string GasLimit: number GasFeeCap: string GasPremium: string Method: number Params: string CID?: CID } export type VersionResponse = { Version: string APIVersion: number BlockDelay: number } export type StateNetworkNameResponse = Network export type MpoolGetNonceResponse = number export type GasEstimateMessageGasResponse = LotusMessage /** * Wallet balance in attoFIL * * @example '99999927137190925849' */ export type WalletBalanceResponse = string export type MpoolPushResponse = CID export type WaitMsgResponse = MsgLookup // RPC methods params export interface GasEstimateParams { /** * Message to estimate gas for * * @see https://lotus.filecoin.io/reference/lotus/gas/#gasestimatemessagegas */ msg: PartialMessageObj /** * Max fee to pay for gas (attoFIL/gas units) * * @default '0' */ maxFee?: string } export interface PushMessageParams { msg: MessageObj signature: SignatureObj } export interface waitMsgParams { cid: CID /** * Confidence depth to wait for * * @default 2 */ confidence?: number /** * How chain epochs to look back to find the message * * @default 100 */ lookback?: number } export interface StateAccountKeyParams { address: string tipSetKey?: TipSetKey | null } export type BlockNumber = '0x${string}' export interface FilecoinAddressToEthAddressParams { /** * The Filecoin address to convert. */ address: string /** * The block number or state for the conversion. * Defaults to "finalized" for maximum safety. * Possible values: "pending", "latest", "finalized", "safe", or a specific block number represented as hex. */ blockNumber?: 'pending' | 'latest' | 'finalized' | 'safe' | BlockNumber } export interface ChainGetTipSetByHeightParams { height: number tipSetKey?: TipSetKey | null } // Token types export type FormatOptions = BigNumber.Format & { /** * @default 18 * @see https://mikemcl.github.io/bignumber.js/#decimal-places */ decimalPlaces?: number /** * @default BigNumber.ROUND_HALF_DOWN * @see https://mikemcl.github.io/bignumber.js/#constructor-properties */ roundingMode?: BigNumber.RoundingMode }