Documentation Index
Fetch the complete documentation index at: https://icp-agent.com/llms.txt
Use this file to discover all available pages before exploring further.
The Canister Plugin provides comprehensive canister management capabilities, including lifecycle operations, WASM deployment, method calls, and controller management.
Overview
The Canister Plugin supports:
- Lifecycle Management: Create, start, stop, delete canisters
- Code Deployment: Install, upgrade, uninstall WASM modules
- Method Calls: Query and update calls with IDL support
- Actor Creation: Direct typed actor creation
- Controller Management: Add/remove controllers, update settings
- Metrics Tracking: Call counts, response times, error rates
Lifecycle Operations
create(options?)
Create a new canister.
Parameters:
options (optional): ICanisterCreateOptions
settings: ICanisterSettings - Initial canister settings
cycles: bigint | string - Initial cycles amount
Returns: Promise<{ canisterId: Principal }> - Created canister information
Example:
// Create basic canister
const { canisterId } = await agent.canisterPlugin.create();
// Create with custom settings and cycles
const { canisterId: customCanister } = await agent.canisterPlugin.create({
cycles: '5T', // 5 trillion cycles
settings: {
controllers: [Principal.fromText('controller-principal')],
computeAllocation: 10,
memoryAllocation: BigInt(1024 * 1024), // 1MB
freezingThreshold: 2592000 // 30 days
}
});
deploy(options)
Deploy WASM code to a canister.
Parameters:
options: ICanisterDeployOptions
canisterId: Principal - Target canister ID
wasmModule: Uint8Array - WASM module bytes
installArgs: Uint8Array - Installation arguments (optional)
mode: 'install' | 'upgrade' | 'reinstall' - Installation mode (default: ‘install’)
Returns: Promise<IDeployResult>
canisterId: Principal - Deployed canister ID
moduleHash: string - Hash of deployed module
cyclesUsed: bigint - Cycles consumed during deployment
Example:
import { readFileSync } from 'fs';
// Load WASM module
const wasmModule = readFileSync('./hello-world.wasm');
// Deploy to canister
const result = await agent.canisterPlugin.deploy({
canisterId: Principal.fromText('canister-id'),
wasmModule,
mode: 'install'
});
console.log('Deployed with hash:', result.moduleHash);
console.log('Cycles used:', agent.canisterPlugin.formatCycles(result.cyclesUsed));
start(canisterId)
Start a stopped canister.
Parameters:
canisterId: Principal | string - Canister to start
Returns: Promise<void>
Example:
await agent.canisterPlugin.start('canister-id');
console.log('Canister started');
stop(canisterId)
Stop a running canister.
Parameters:
canisterId: Principal | string - Canister to stop
Returns: Promise<void>
Example:
await agent.canisterPlugin.stop('canister-id');
console.log('Canister stopped');
delete(canisterId)
Delete a canister (must be stopped first).
Parameters:
canisterId: Principal | string - Canister to delete
Returns: Promise<void>
Example:
// Stop then delete
await agent.canisterPlugin.stop('canister-id');
await agent.canisterPlugin.delete('canister-id');
console.log('Canister deleted');
Method Calls
call(options)
Execute an update call on a canister.
Parameters:
options: ICanisterCallOptions
canisterId: Principal - Target canister
methodName: string - Method to call
args: unknown[] - Method arguments
idlFactory: IDL.InterfaceFactory - Candid interface factory
Returns: Promise<unknown> - Method result
Example:
import { idlFactory } from './hello-world.did.js';
const result = await agent.canisterPlugin.call({
canisterId: Principal.fromText('canister-id'),
methodName: 'greet',
args: ['World'],
idlFactory
});
console.log('Greeting result:', result);
query(options)
Execute a query call on a canister (read-only, faster).
Parameters:
options: ICanisterQueryOptions
canisterId: Principal - Target canister
methodName: string - Method to call
args: unknown[] - Method arguments
idlFactory: IDL.InterfaceFactory - Candid interface factory
Returns: Promise<unknown> - Method result
Example:
const balance = await agent.canisterPlugin.query({
canisterId: Principal.fromText('canister-id'),
methodName: 'getBalance',
args: [],
idlFactory
});
console.log('Current balance:', balance);
createActor(canisterId, idlFactory)
Create a typed actor for easier method calls.
Parameters:
canisterId: Principal | string - Target canister
idlFactory: IDL.InterfaceFactory - Candid interface factory
Returns: ActorSubclass<T> - Typed actor instance
Example:
import { idlFactory } from './hello-world.did.js';
const actor = agent.canisterPlugin.createActor('canister-id', idlFactory);
// Use actor methods directly
const greeting = await actor.greet('World');
const balance = await actor.getBalance();
const result = await actor.updateCounter(42);
getStatus(canisterId)
Get detailed canister status information.
Parameters:
canisterId: Principal | string - Canister to query
Returns: Promise<ICanisterStatus>
canisterId: Principal - Canister ID
status: 'running' | 'stopping' | 'stopped' - Current status
settings: ICanisterSettings - Current settings
memorySize: bigint - Memory usage in bytes
cycles: bigint - Current cycles balance
moduleHash: string - Hash of installed module
Example:
const status = await agent.canisterPlugin.getStatus('canister-id');
console.log('Status:', status.status);
console.log('Cycles:', agent.canisterPlugin.formatCycles(status.cycles));
console.log('Memory:', status.memorySize, 'bytes');
console.log('Controllers:', status.settings.controllers?.map(p => p.toText()));
Controller Management
updateSettings(canisterId, settings)
Update canister settings.
Parameters:
canisterId: Principal | string - Target canister
settings: Partial<ICanisterSettings> - Settings to update
Returns: Promise<void>
Example:
await agent.canisterPlugin.updateSettings('canister-id', {
computeAllocation: 20,
memoryAllocation: BigInt(2 * 1024 * 1024), // 2MB
freezingThreshold: 7776000 // 90 days
});
addController(canisterId, controller)
Add a new controller to a canister.
Parameters:
canisterId: Principal | string - Target canister
controller: Principal | string - New controller principal
Returns: Promise<void>
Example:
await agent.canisterPlugin.addController(
'canister-id',
'new-controller-principal'
);
removeController(canisterId, controller)
Remove a controller from a canister.
Parameters:
canisterId: Principal | string - Target canister
controller: Principal | string - Controller to remove
Returns: Promise<void>
Example:
await agent.canisterPlugin.removeController(
'canister-id',
'old-controller-principal'
);
Utility Functions
Format cycles amount for display.
Parameters:
cycles: bigint - Cycles amount
Returns: string - Formatted cycles (e.g., “2.5T”, “1.2B”)
Example:
const formatted = agent.canisterPlugin.formatCycles(BigInt('2500000000000'));
console.log(formatted); // "2.5T"
parseCycles(cycles)
Parse cycles string to bigint.
Parameters:
cycles: string - Cycles string (e.g., “2.5T”, “1B”)
Returns: bigint - Parsed cycles amount
Example:
const amount = agent.canisterPlugin.parseCycles('2.5T');
console.log(amount); // 2500000000000n
exists(canisterId)
Check if a canister exists.
Parameters:
canisterId: Principal | string - Canister to check
Returns: Promise<boolean> - Whether canister exists
Example:
const exists = await agent.canisterPlugin.exists('canister-id');
if (exists) {
console.log('Canister exists');
}
isController(canisterId)
Check if current identity is a controller of the canister.
Parameters:
canisterId: Principal | string - Canister to check
Returns: Promise<boolean> - Whether current identity is a controller
Example:
const isController = await agent.canisterPlugin.isController('canister-id');
if (isController) {
console.log('You are a controller of this canister');
}
Types
ICanisterSettings
Canister configuration settings.
interface ICanisterSettings {
controllers?: Principal[];
computeAllocation?: number; // 0-100
memoryAllocation?: bigint; // bytes
freezingThreshold?: number; // seconds
}
ICanisterDeployOptions
Options for deploying WASM to a canister.
interface ICanisterDeployOptions {
canisterId: Principal;
wasmModule: Uint8Array;
installArgs?: Uint8Array;
mode?: 'install' | 'upgrade' | 'reinstall';
}
IDeployResult
Result of canister deployment.
interface IDeployResult {
canisterId: Principal;
moduleHash: string;
cyclesUsed: bigint;
}
ICanisterCallOptions
Options for canister method calls.
interface ICanisterCallOptions {
canisterId: Principal;
methodName: string;
args: unknown[];
idlFactory: IDL.InterfaceFactory;
}
Usage Patterns
Complete Canister Lifecycle
// 1. Create canister
const { canisterId } = await agent.canisterPlugin.create({
cycles: '10T'
});
// 2. Deploy WASM
const wasmModule = await fetch('/hello-world.wasm').then(r => r.arrayBuffer());
await agent.canisterPlugin.deploy({
canisterId,
wasmModule: new Uint8Array(wasmModule)
});
// 3. Create actor for method calls
const actor = agent.canisterPlugin.createActor(canisterId, idlFactory);
// 4. Call methods
const result = await actor.greet('World');
console.log('Result:', result);
// 5. Monitor status
const status = await agent.canisterPlugin.getStatus(canisterId);
console.log('Remaining cycles:', agent.canisterPlugin.formatCycles(status.cycles));
Multi-Canister Management
const canisters = ['canister-1', 'canister-2', 'canister-3'];
// Check status of all canisters
for (const canisterId of canisters) {
const status = await agent.canisterPlugin.getStatus(canisterId);
console.log(`${canisterId}: ${status.status}, ${agent.canisterPlugin.formatCycles(status.cycles)} cycles`);
}
// Stop all canisters
await Promise.all(canisters.map(id => agent.canisterPlugin.stop(id)));
// Update settings for all
const newSettings = { computeAllocation: 10 };
await Promise.all(canisters.map(id =>
agent.canisterPlugin.updateSettings(id, newSettings)
));
Canister Upgrade Pattern
// Upgrade existing canister
const newWasmModule = await fetch('/hello-world-v2.wasm').then(r => r.arrayBuffer());
// First, check if we're a controller
const isController = await agent.canisterPlugin.isController('canister-id');
if (!isController) {
throw new Error('Not authorized to upgrade canister');
}
// Perform upgrade
await agent.canisterPlugin.deploy({
canisterId: Principal.fromText('canister-id'),
wasmModule: new Uint8Array(newWasmModule),
mode: 'upgrade'
});
console.log('Canister upgraded successfully');
Error Handling
import { ICPAgentError } from 'icp-agent-kit';
try {
await agent.canisterPlugin.call({
canisterId: Principal.fromText('invalid-canister'),
methodName: 'test',
args: [],
idlFactory
});
} catch (error) {
if (error instanceof ICPAgentError) {
if (error.code === 'CANISTER_NOT_FOUND') {
console.log('Canister does not exist');
} else if (error.code === 'INSUFFICIENT_CYCLES') {
console.log('Not enough cycles for operation');
}
}
}