Class: PocketIc
This class represents the main PocketIC client. It is responsible for interacting with the PocketIC server via the REST API. See PocketIcServer for details on the server to use with this client.
Example
The easist way to use PocketIC is to use setupCanister convenience method:
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const wasmPath = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const fixture = await pic.setupCanister<_SERVICE>({ idlFactory, wasmPath });
const { actor } = fixture;
// perform tests...
await pic.tearDown();
await picServer.stop();
If more control is needed, then the createCanister, installCode and createActor methods can be used directly:
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const canisterId = await pic.createCanister();
await pic.installCode({ canisterId, wasm });
const actor = pic.createActor<_SERVICE>({ idlFactory, canisterId });
// perform tests...
await pic.tearDown();
await picServer.stop();
Methods
create()
static
create(url
,options
?):Promise
<PocketIc
>
Creates a PocketIC instance.
Parameters
• url: string
The URL of an existing PocketIC server to connect to.
• options?: CreateInstanceOptions
Options for creating the PocketIC instance see CreateInstanceOptions.
Returns
Promise
< PocketIc
>
A new PocketIC instance.
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const fixture = await pic.setupCanister<_SERVICE>({ idlFactory, wasmPath });
const { actor } = fixture;
await pic.tearDown();
await picServer.stop();
Source
setupCanister()
setupCanister<
T
>(options
):Promise
<CanisterFixture
<T
> >
A convenience method that creates a new canister, installs the given WASM module to it and returns a typesafe Actor that implements the Candid interface of the canister. To just create a canister, see createCanister. To just install code to an existing canister, see installCode. To just create an Actor for an existing canister, see createActor.
Type parameters
• T extends ActorInterface
< T
> = object
Parameters
• options: SetupCanisterOptions
Options for setting up the canister, see SetupCanisterOptions.
Returns
Promise
< CanisterFixture
< T
> >
The Actor instance.
See
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const wasmPath = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const fixture = await pic.setupCanister<_SERVICE>({ idlFactory, wasmPath });
const { actor } = fixture;
await pic.tearDown();
await picServer.stop();
Source
createCanister()
createCanister(
options
):Promise
<Principal
>
Creates a new canister. For a more convenient way of creating a PocketIC instance, creating a canister and installing code, see setupCanister.
Parameters
• options: CreateCanisterOptions
= {}
Options for creating the canister, see CreateCanisterOptions.
Returns
Promise
< Principal
>
The Principal of the newly created canister.
See
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const canisterId = await pic.createCanister();
await pic.tearDown();
await picServer.stop();
Source
startCanister()
startCanister(
options
):Promise
<void
>
Starts the given canister.
Parameters
• options: StartCanisterOptions
Options for starting the canister, see StartCanisterOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.startCanister({ canisterId });
await pic.tearDown();
await picServer.stop();
Source
stopCanister()
stopCanister(
options
):Promise
<void
>
Stops the given canister.
Parameters
• options: StopCanisterOptions
Options for stopping the canister, see StopCanisterOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.stopCanister({ canisterId });
await pic.tearDown();
await picServer.stop();
Source
installCode()
installCode(
options
):Promise
<void
>
Installs the given WASM module to the provided canister. To create a canister to install code to, see createCanister. For a more convenient way of creating a PocketIC instance, creating a canister and installing code, see setupCanister.
Parameters
• options: InstallCodeOptions
Options for installing the code, see InstallCodeOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { resolve } from 'node:path';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.installCode({ canisterId, wasm });
await pic.tearDown();
await picServer.stop();
Source
reinstallCode()
reinstallCode(
options
):Promise
<void
>
Reinstalls the given WASM module to the provided canister. This will reset both the canister's heap and its stable memory. To create a canister to upgrade, see createCanister. To install the initial WASM module to a new canister, see installCode.
Parameters
• options: ReinstallCodeOptions
Options for reinstalling the code, see ReinstallCodeOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { resolve } from 'node:path';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.reinstallCode({ canisterId, wasm });
await pic.tearDown();
await picServer.stop();
Source
upgradeCanister()
upgradeCanister(
options
):Promise
<void
>
Upgrades the given canister with the given WASM module. This will reset the canister's heap, but preserve stable memory. To create a canister to upgrade to, see createCanister. To install the initial WASM module to a new canister, see installCode.
Parameters
• options: UpgradeCanisterOptions
Options for upgrading the canister, see UpgradeCanisterOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { resolve } from 'node:path';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.upgradeCanister({ canisterId, wasm });
await pic.tearDown();
await picServer.stop();
Source
updateCanisterSettings()
updateCanisterSettings(
options
):Promise
<void
>
Updates the settings of the given canister.
Parameters
• options: UpdateCanisterSettingsOptions
Options for updating the canister settings, see UpdateCanisterSettingsOptions.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.updateCanisterSettings({
canisterId,
controllers: [Principal.fromUint8Array(new Uint8Array([1]))],
});
await pic.tearDown();
await picServer.stop();
Source
createActor()
createActor<
T
>(interfaceFactory
,canisterId
):Actor
<T
>
Creates an Actor for the given canister. An Actor is a typesafe class that implements the Candid interface of a canister. To create a canister for the Actor, see createCanister. For a more convenient way of creating a PocketIC instance, creating a canister and installing code, see setupCanister.
Type parameters
• T extends ActorInterface
< T
> = object
Parameters
• interfaceFactory: InterfaceFactory
The InterfaceFactory to use for the Actor.
• canisterId: Principal
The Principal of the canister to create the Actor for.
Returns
Actor
< T
>
The Actor instance.
Typeparam
T The type of the Actor. Must implement ActorInterface.
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const canisterId = await pic.createCanister();
await pic.installCode({ canisterId, wasm });
const actor = pic.createActor<_SERVICE>({ idlFactory, canisterId });
await pic.tearDown();
await picServer.stop();
Source
createDeferredActor()
createDeferredActor<
T
>(interfaceFactory
,canisterId
):DeferredActor
<T
>
Creates a DeferredActor for the given canister. A DeferredActor is a typesafe class that implements the Candid interface of a canister.
A DeferredActor in contrast to a normal Actor will submit the call to the PocketIc replica,
but the call will not be executed immediately. Instead, the calls are queued and a Promise
is returned
by the DeferredActor that can be awaited to process the pending canister call.
To create a canister for the DeferredActor, see createCanister. For a more convenient way of creating a PocketIC instance, creating a canister and installing code, see setupCanister.
Type parameters
• T extends ActorInterface
< T
> = object
Parameters
• interfaceFactory: InterfaceFactory
The InterfaceFactory to use for the DeferredActor.
• canisterId: Principal
The Principal of the canister to create the DeferredActor for.
Returns
DeferredActor
< T
>
The DeferredActor instance.
Typeparam
T The type of the DeferredActor. Must implement ActorInterface.
See
Example
Source
queryCall()
queryCall(
options
):Promise
<ArrayBufferLike
>
Makes a query call to the given canister.
Parameters
• options: QueryCallOptions
Options for making the query call, see QueryCallOptions.
Returns
Promise
< ArrayBufferLike
>
The Candid-encoded response of the query call.
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
canisterId = await pic.createCanister({
sender: controllerIdentity.getPrincipal(),
});
await pic.installCode({ canisterId, wasm });
const res = await pic.queryCall({
canisterId,
method: 'greet',
});
await pic.tearDown();
await picServer.stop();
Source
updateCall()
updateCall(
options
):Promise
<ArrayBufferLike
>
Makes an update call to the given canister.
Parameters
• options: UpdateCallOptions
Options for making the update call, see UpdateCallOptions.
Returns
Promise
< ArrayBufferLike
>
The Candid-encoded response of the update call.
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
import { _SERVICE, idlFactory } from '../declarations';
const wasm = resolve('..', '..', 'canister.wasm');
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
canisterId = await pic.createCanister({
sender: controllerIdentity.getPrincipal(),
});
await pic.installCode({ canisterId, wasm });
const res = await pic.updateCall({
canisterId,
method: 'greet',
});
await pic.tearDown();
await picServer.stop();
Source
tearDown()
tearDown():
Promise
<void
>
Deletes the PocketIC instance.
Returns
Promise
< void
>
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.tearDown();
await picServer.stop();
Source
tick()
tick(
times
):Promise
<void
>
Make the IC produce and progress by one block. Accepts a parameter times
to tick multiple times,
the default is 1
.
Parameters
• times: number
= 1
The number of new blocks to produce and progress by. Defaults to 1
.
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.tick();
// or to tick multiple times
await pic.tick(3);
await pic.tearDown();
await picServer.stop();
Returns
Promise
< void
>
Source
getTime()
getTime():
Promise
<number
>
Get the current time of the IC in milliseconds since the Unix epoch.
Returns
Promise
< number
>
The current time in milliseconds since the UNIX epoch.
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const time = await pic.getTime();
await pic.tearDown();
await picServer.stop();
Source
resetTime()
resetTime():
Promise
<void
>
Reset the time of the IC to the current time.
Returns
Promise
< void
>
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.resetTime();
const time = await pic.getTime();
await pic.tearDown();
await picServer.stop();
Source
setTime()
setTime(
time
):Promise
<void
>
Set the current time of the IC.
Parameters
• time: number
| Date
The time to set in milliseconds since the Unix epoch.
Returns
Promise
< void
>
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const pic = await PocketIc.create();
const date = new Date();
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.setTime(date);
// or
await pic.setTime(date.getTime());
const time = await pic.getTime();
await pic.tearDown();
await picServer.stop();
Source
advanceTime()
advanceTime(
duration
):Promise
<void
>
Advance the time of the IC by the given duration in milliseconds.
Parameters
• duration: number
The duration to advance the time by.
Returns
Promise
< void
>
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const initialTime = await pic.getTime();
await pic.advanceTime(1_000);
const newTime = await pic.getTime();
await pic.tearDown();
await picServer.stop();
Source
getPubKey()
getPubKey(
subnetId
):Promise
<ArrayBufferLike
>
Fetch the public key of the specified subnet.
Parameters
• subnetId: Principal
The Principal of the subnet to fetch the public key of.
Returns
Promise
< ArrayBufferLike
>
The public key of the specified subnet.
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const subnets = pic.getApplicationSubnets();
const pubKey = await pic.getPubKey(subnets[0].id);
await pic.tearDown();
await picServer.stop();
Source
getCanisterSubnetId()
getCanisterSubnetId(
canisterId
):Promise
<null
|Principal
>
Gets the subnet Id of the provided canister Id.
Parameters
• canisterId: Principal
The Principal of the canister to get the subnet Id of.
Returns
Promise
< null
| Principal
>
The canister's subnet Id if the canister exists, null
otherwise.
See
Example
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const subnetId = await pic.getCanisterSubnetId(canisterId);
await pic.tearDown();
await picServer.stop();
Source
getTopology()
getTopology():
SubnetTopology
[]
Get the topology of this instance's network. The topology is a list of subnets, each with a type and a list of canister ID ranges that can be deployed to that subnet. The instance network topology is configured via the create method.
Returns
An array of subnet topologies, see SubnetTopology.
Source
getBitcoinSubnet()
getBitcoinSubnet():
undefined
|SubnetTopology
Get the Bitcoin subnet topology for this instance's network. The instance network topology is configured via the create method.
Returns
undefined
| SubnetTopology
The subnet topology for the Bitcoin subnet, if it exists on this instance's network.
Source
getFiduciarySubnet()
getFiduciarySubnet():
undefined
|SubnetTopology
Get the Fiduciary subnet topology for this instance's network. The instance network topology is configured via the create method.
Returns
undefined
| SubnetTopology
The subnet topology for the Fiduciary subnet, if it exists on this instance's network.
Source
getInternetIdentitySubnet()
getInternetIdentitySubnet():
undefined
|SubnetTopology
Get the Internet Identity subnet topology for this instance's network. The instance network topology is configured via the create method.
Returns
undefined
| SubnetTopology
The subnet topology for the Internet Identity subnet, if it exists on this instance's network.
Source
getNnsSubnet()
getNnsSubnet():
undefined
|SubnetTopology
Get the NNS subnet topology for this instance's network. The instance network topology is configured via the create method.
Returns
undefined
| SubnetTopology
The subnet topology for the NNS subnet, if it exists on this instance's network.
Source
getSnsSubnet()
getSnsSubnet():
undefined
|SubnetTopology
Get the SNS subnet topology for this instance's network. The instance network topology is configured via the create method.
Returns
undefined
| SubnetTopology
The subnet topology for the SNS subnet, if it exists on this instance's network.
Source
getApplicationSubnets()
getApplicationSubnets():
SubnetTopology
[]
Get all application subnet topologies for this instance's network. The instance network topology is configured via the create method.
Returns
An array of subnet topologies for each application subnet that exists on this instance's network.
Source
getSystemSubnets()
getSystemSubnets():
SubnetTopology
[]
Get all system subnet topologies for this instance's network. The instance network topology is configured via the create method.
Returns
An array of subnet topologies for each system subnet that exists on this instance's network.
Source
getCyclesBalance()
getCyclesBalance(
canisterId
):Promise
<number
>
Gets the current cycle balance of the specified canister.
Parameters
• canisterId: Principal
The Principal of the canister to check.
Returns
Promise
< number
>
The current cycles balance of the canister.
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const cyclesBalance = await pic.getCyclesBalance(canisterId);
await pic.tearDown();
await picServer.stop();
Source
addCycles()
addCycles(
canisterId
,amount
):Promise
<number
>
Add cycles to the specified canister.
Parameters
• canisterId: Principal
The Principal of the canister to add cycles to.
• amount: number
The amount of cycles to add.
Returns
Promise
< number
>
The new cycle balance of the canister.
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const newCyclesBalance = await pic.addCycles(canisterId, 10_000_000);
await pic.tearDown();
await picServer.stop();
Source
setStableMemory()
setStableMemory(
canisterId
,stableMemory
):Promise
<void
>
Set the stable memory of a given canister.
Parameters
• canisterId: Principal
The Principal of the canister to set the stable memory of.
• stableMemory: ArrayBufferLike
A blob containing the stable memory to set.
Returns
Promise
< void
>
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const stableMemory = new Uint8Array([0, 1, 2, 3, 4]);
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
await pic.setStableMemory(canisterId, stableMemory);
await pic.tearDown();
await picServer.stop();
Source
getStableMemory()
getStableMemory(
canisterId
):Promise
<ArrayBufferLike
>
Get the stable memory of a given canister.
Parameters
• canisterId: Principal
The Principal of the canister to get the stable memory of.
Returns
Promise
< ArrayBufferLike
>
A blob containing the canister's stable memory.
See
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
const stableMemory = await pic.getStableMemory(canisterId);
await pic.tearDown();
await picServer.stop();
Source
getPendingHttpsOutcalls()
getPendingHttpsOutcalls():
Promise
<PendingHttpsOutcall
[] >
Get all pending HTTPS Outcalls across all subnets on this PocketIC instance.
Returns
Promise
< PendingHttpsOutcall
[] >
An array of pending HTTPS Outcalls.
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
// queue the canister message that will send the HTTPS Outcall
const executeGoogleSearch = await deferredActor.google_search();
// tick for two rounds to allow the canister message to be processed
// and for the HTTPS Outcall to be queued
await pic.tick(2);
// get all queued HTTPS Outcalls
const pendingHttpsOutcalls = await pic.getPendingHttpsOutcalls();
// get the first pending HTTPS Outcall
const pendingGoogleSearchOutcall = pendingHttpsOutcalls[0];
// mock the HTTPS Outcall
await pic.mockPendingHttpsOutcall({
requestId: pendingGoogleSearchOutcall.requestId,
subnetId: pendingGoogleSearchOutcall.subnetId,
response: {
type: 'success',
body: new TextEncoder().encode('Google search result'),
statusCode: 200,
headers: [],
},
});
// finish executing the message, including the HTTPS Outcall
const result = await executeGoogleSearch();
await pic.tearDown();
await picServer.stop();
Source
mockPendingHttpsOutcall()
mockPendingHttpsOutcall(
options
):Promise
<void
>
Mock a pending HTTPS Outcall.
Parameters
• options: MockPendingHttpsOutcallOptions
Options for mocking the pending HTTPS Outcall, see MockPendingHttpsOutcallOptions.
Returns
Promise
< void
>
Example
import { Principal } from '@dfinity/principal';
import { PocketIc, PocketIcServer } from '@hadronous/pic';
const canisterId = Principal.fromUint8Array(new Uint8Array([0]));
const picServer = await PocketIcServer.create();
const pic = await PocketIc.create(picServer.getUrl());
// queue the canister message that will send the HTTPS Outcall
const executeGoogleSearch = await deferredActor.google_search();
// tick for two rounds to allow the canister message to be processed
// and for the HTTPS Outcall to be queued
await pic.tick(2);
// get all queued HTTPS Outcalls
const pendingHttpsOutcalls = await pic.getPendingHttpsOutcalls();
// get the first pending HTTPS Outcall
const pendingGoogleSearchOutcall = pendingHttpsOutcalls[0];
// mock the HTTPS Outcall
await pic.mockPendingHttpsOutcall({
requestId: pendingGoogleSearchOutcall.requestId,
subnetId: pendingGoogleSearchOutcall.subnetId,
response: {
type: 'success',
body: new TextEncoder().encode('Google search result'),
statusCode: 200,
headers: [],
},
});
// finish executing the message, including the HTTPS Outcall
const result = await executeGoogleSearch();
await pic.tearDown();
await picServer.stop();