Skip to content
This repository has been archived by the owner on Feb 26, 2024. It is now read-only.

Commit

Permalink
add support for additional methods used by js-lotus-client-workshop
Browse files Browse the repository at this point in the history
  • Loading branch information
mikeseese committed Jan 16, 2021
1 parent 2bb0849 commit 4d78760
Show file tree
Hide file tree
Showing 5 changed files with 296 additions and 16 deletions.
18 changes: 18 additions & 0 deletions src/chains/filecoin/filecoin/src/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ import { SubscriptionMethod, SubscriptionId } from "./types/subscriptions";
import { FileRef, SerializedFileRef } from "./things/file-ref";
import { MinerPower, SerializedMinerPower } from "./things/miner-power";
import { PowerClaim } from "./things/power-claim";
import { SerializedVersion, Version } from "./things/version";
import { MinerInfo, SerializedMinerInfo } from "./things/miner-info";

export default class FilecoinApi implements types.Api {
readonly [index: string]: (...args: any) => Promise<any>;
Expand All @@ -36,6 +38,16 @@ export default class FilecoinApi implements types.Api {
return await this.#blockchain.stop();
}

async "Filecoin.Version"(): Promise<SerializedVersion> {
return new Version({
blockDelay: BigInt(this.#blockchain.options.miner.blockTime)
}).serialize();
}

async "Filecoin.ActorAddress"(): Promise<string> {
return this.#blockchain.address.serialize();
}

async "Filecoin.ChainGetGenesis"(): Promise<SerializedTipset> {
return this.#blockchain.latestTipset().serialize();
}
Expand Down Expand Up @@ -132,6 +144,12 @@ export default class FilecoinApi implements types.Api {
return power.serialize();
}
}
async "Filecoin.StateMinerInfo"(
minerAddress: string
): Promise<SerializedMinerInfo> {
// TODO: defaults are not really accurate here
return new MinerInfo().serialize();
}

async "Filecoin.WalletDefaultAddress"(): Promise<SerializedAddress> {
return this.#blockchain.address.serialize();
Expand Down
136 changes: 136 additions & 0 deletions src/chains/filecoin/filecoin/src/things/miner-info.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
import {
SerializableObject,
SerializedObject,
DeserializedObject,
Definitions
} from "./serializable-object";
import { Address, SerializedAddress } from "./address";

type MinerInfoConfig = {
properties: {
owner: {
type: Address;
serializedType: SerializedAddress;
serializedName: "Owner";
};
worker: {
type: Address;
serializedType: SerializedAddress;
serializedName: "Worker";
};
newWorker: {
type: Address;
serializedType: SerializedAddress;
serializedName: "NewWorker";
};
controlAddresses: {
type: Address[];
serializedType: SerializedAddress[];
serializedName: "ControlAddresses";
};
workerChangeEpoch: {
type: bigint;
serializedType: string;
serializedName: "WorkerChangeEpoch";
};
peerId: {
type: string;
serializedType: string;
serializedName: "PeerId";
};
multiaddrs: {
type: Uint8Array[];
serializedType: Uint8Array[];
serializedName: "Multiaddrs";
};
sealProofType: {
type: bigint;
serializedType: string;
serializedName: "SealProofType";
};
sectorSize: {
type: bigint;
serializedType: string;
serializedName: "SectorSize";
};
windowPoStPartitionSectors: {
type: bigint;
serializedType: string;
serializedName: "WindowPoStPartitionSectors";
};
consensusFaultElapsed: {
type: bigint;
serializedType: string;
serializedName: "ConsensusFaultElapsed";
};
};
};

class MinerInfo
extends SerializableObject<MinerInfoConfig>
implements DeserializedObject<MinerInfoConfig> {
get config(): Definitions<MinerInfoConfig> {
return {
owner: {
serializedName: "Owner",
defaultValue: Address.random()
},
worker: {
serializedName: "Worker",
defaultValue: Address.random()
},
newWorker: {
serializedName: "NewWorker",
defaultValue: Address.random()
},
controlAddresses: {
serializedName: "ControlAddresses",
defaultValue: [Address.random()]
},
workerChangeEpoch: {
serializedName: "WorkerChangeEpoch",
defaultValue: config => (config ? BigInt(config) : 0n)
},
peerId: {
serializedName: "PeerId",
defaultValue: "0"
},
multiaddrs: {
serializedName: "Multiaddrs",
defaultValue: [new Uint8Array()]
},
sealProofType: {
serializedName: "SealProofType",
defaultValue: config => (config ? BigInt(config) : 0n) // not sure what to put here
},
sectorSize: {
serializedName: "SectorSize",
defaultValue: 18446744073709551615n // max from https://bit.ly/2XJItAg
},
windowPoStPartitionSectors: {
serializedName: "WindowPoStPartitionSectors",
defaultValue: config => (config ? BigInt(config) : 0n) // not sure what to put here
},
consensusFaultElapsed: {
serializedName: "ConsensusFaultElapsed",
defaultValue: config => (config ? BigInt(config) : 0n) // not sure what to put here
}
};
}

owner: Address;
worker: Address;
newWorker: Address;
controlAddresses: Address[];
workerChangeEpoch: bigint;
peerId: string;
multiaddrs: Uint8Array[];
sealProofType: bigint;
sectorSize: bigint;
windowPoStPartitionSectors: bigint;
consensusFaultElapsed: bigint;
}

type SerializedMinerInfo = SerializedObject<MinerInfoConfig>;

export { MinerInfo, SerializedMinerInfo };
26 changes: 10 additions & 16 deletions src/chains/filecoin/filecoin/src/things/retrieval-offer.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { RootCID, SerializedRootCID } from "./root-cid";
import { Miner, SerializedMiner } from "./miner";
import {
SerializableObject,
SerializedObject,
DeserializedObject,
Definitions
} from "./serializable-object";
import { RetrievalPeer, SerializedRetrievalPeer } from "./retrieval-peer";
import { Miner, SerializedMiner } from "./miner";

type RetrievalOfferConfig = {
properties: {
Expand Down Expand Up @@ -44,10 +45,10 @@ type RetrievalOfferConfig = {
serializedType: SerializedMiner;
serializedName: "Miner";
};
minerPeerId: {
type: string;
serializedType: string;
serializedName: "MinerPeerID";
minerPeer: {
type: RetrievalPeer;
serializedType: SerializedRetrievalPeer;
serializedName: "MinerPeer";
};
};
};
Expand Down Expand Up @@ -82,16 +83,9 @@ class RetrievalOffer
miner: {
serializedName: "Miner"
},
minerPeerId: {
serializedName: "MinerPeerID",
defaultValue: options => {
let alphabet = "abcdefghijklmnopqrstuvwxyz0123456789";
return " "
.repeat(52)
.split("")
.map(() => alphabet[Math.floor(Math.random() * alphabet.length)])
.join("");
}
minerPeer: {
serializedName: "MinerPeer",
defaultValue: options => new RetrievalPeer(options)
}
};
}
Expand All @@ -103,7 +97,7 @@ class RetrievalOffer
paymentInterval: number;
paymentIntervalIncrease: number;
miner: Miner;
minerPeerId: string;
minerPeer: RetrievalPeer;
}

type SerializedRetrievalOffer = SerializedObject<RetrievalOfferConfig>;
Expand Down
58 changes: 58 additions & 0 deletions src/chains/filecoin/filecoin/src/things/retrieval-peer.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import {
SerializableObject,
SerializedObject,
DeserializedObject,
Definitions
} from "./serializable-object";
import { CID, SerializedCID } from "./cid";
import { Miner, SerializedMiner } from "./miner";

type RetrievalPeerConfig = {
properties: {
address: {
type: Miner;
serializedType: SerializedMiner;
serializedName: "Address";
};
id: {
type: string;
serializedType: string;
serializedName: "ID";
};
pieceCID: {
type: CID;
serializedType: SerializedCID;
serializedName: "PieceCID";
};
};
};

class RetrievalPeer
extends SerializableObject<RetrievalPeerConfig>
implements DeserializedObject<RetrievalPeerConfig> {
get config(): Definitions<RetrievalPeerConfig> {
return {
address: {
serializedName: "Address",
defaultValue: options => new Miner(options)
},
id: {
serializedName: "ID",
defaultValue: "0"
},
pieceCID: {
serializedName: "PieceCID",
defaultValue: options =>
new CID(options || "Piece CIDs are not supported in Ganache")
}
};
}

address: Miner;
id: string;
pieceCID: CID;
}

type SerializedRetrievalPeer = SerializedObject<RetrievalPeerConfig>;

export { RetrievalPeer, SerializedRetrievalPeer };
74 changes: 74 additions & 0 deletions src/chains/filecoin/filecoin/src/things/version.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import {
SerializableObject,
DeserializedObject,
SerializedObject,
Definitions
} from "./serializable-object";
import { $INLINE_JSON } from "ts-transformer-inline-file";

const { version: GanacheFilecoinVersion } = $INLINE_JSON("../../package.json");

function createBinarySemverVersion(version: string): number {
const versionParts = version.split(".");

const majorVersion =
versionParts.length > 0 ? parseInt(versionParts[0], 10) : 0;
const minorVersion =
versionParts.length > 1 ? parseInt(versionParts[1], 10) : 0;
const patchVersion =
versionParts.length > 2 ? parseInt(versionParts[2], 10) : 0;

const binaryVersion =
(majorVersion << 16) | (minorVersion << 8) | patchVersion;

return binaryVersion;
}

interface VersionConfig {
properties: {
version: {
type: string;
serializedType: string;
serializedName: "Version";
};
apiVersion: {
type: number;
serializedType: number;
serializedName: "APIVersion";
};
blockDelay: {
type: bigint;
serializedType: string;
serializedName: "BlockDelay";
};
};
}

class Version
extends SerializableObject<VersionConfig>
implements DeserializedObject<VersionConfig> {
get config(): Definitions<VersionConfig> {
return {
version: {
serializedName: "Version",
defaultValue: `@ganache/filecoin v${GanacheFilecoinVersion}`
},
apiVersion: {
serializedName: "APIVersion",
defaultValue: createBinarySemverVersion("0.0.1") // TODO: not sure what to put here
},
blockDelay: {
serializedName: "BlockDelay",
defaultValue: 0n
}
};
}

version: string;
apiVersion: number;
blockDelay: bigint;
}

type SerializedVersion = SerializedObject<VersionConfig>;

export { Version, SerializedVersion };

0 comments on commit 4d78760

Please sign in to comment.