From 7315c229549c0b6b52bb79706876e024b593cb1b Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Mon, 19 Jan 2026 21:39:32 +0100 Subject: [PATCH 1/7] Added function for customizable AWAIT_INGRESS_STATUS_ROUNDS. --- bun.lock | 2 +- dfx.json | 2 +- packages/pic/src/pocket-ic-client-types.ts | 1 + packages/pic/src/pocket-ic-client.ts | 14 ++++++++++++-- packages/pic/src/pocket-ic-types.ts | 4 ++++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/bun.lock b/bun.lock index 166f1be..842d632 100644 --- a/bun.lock +++ b/bun.lock @@ -78,7 +78,7 @@ }, "packages/pic": { "name": "@dfinity/pic", - "version": "0.16.1", + "version": "0.17.1", "dependencies": { "@icp-sdk/core": "^4.2.3", "bip39": "^3.1.0", diff --git a/dfx.json b/dfx.json index aa12ab9..2530733 100644 --- a/dfx.json +++ b/dfx.json @@ -1,6 +1,6 @@ { "version": 1, - "dfx": "0.29.1", + "dfx": "0.29.2", "output_env_file": ".env", "networks": { "local": { diff --git a/packages/pic/src/pocket-ic-client-types.ts b/packages/pic/src/pocket-ic-client-types.ts index 236c6b8..2ae5a75 100644 --- a/packages/pic/src/pocket-ic-client-types.ts +++ b/packages/pic/src/pocket-ic-client-types.ts @@ -24,6 +24,7 @@ export interface CreateInstanceRequest { application?: ApplicationSubnetConfig[]; verifiedApplication?: VerifiedApplicationSubnetConfig[]; processingTimeoutMs?: number; + awaitIngressStatusRounds? : number; icpConfig?: IcpConfig; icpFeatures?: IcpFeatures; } diff --git a/packages/pic/src/pocket-ic-client.ts b/packages/pic/src/pocket-ic-client.ts index ab62328..dfe3773 100644 --- a/packages/pic/src/pocket-ic-client.ts +++ b/packages/pic/src/pocket-ic-client.ts @@ -94,6 +94,7 @@ export class PocketIcClient { private constructor( private readonly serverClient: Http2Client, private readonly instancePath: string, + private awaitIngressStatusRounds: number ) {} public static async create( @@ -102,6 +103,7 @@ export class PocketIcClient { ): Promise { const processingTimeoutMs = req?.processingTimeoutMs ?? PROCESSING_TIME_VALUE_MS; + const awaitIngressStatusRounds = req?.awaitIngressStatusRounds ?? AWAIT_INGRESS_STATUS_ROUNDS; const serverClient = new Http2Client(url, processingTimeoutMs); const res = await serverClient.jsonPost< @@ -120,7 +122,7 @@ export class PocketIcClient { const instanceId = res.Created.instance_id; - return new PocketIcClient(serverClient, `/instances/${instanceId}`); + return new PocketIcClient(serverClient, `/instances/${instanceId}`, awaitIngressStatusRounds); } public async deleteInstance(): Promise { @@ -134,6 +136,14 @@ export class PocketIcClient { this.isInstanceDeleted = true; } + public setAwaitIngressStatusRounds(numberOfRounds : number){ + this.awaitIngressStatusRounds = numberOfRounds; + } + + public getAwaitIngressStatusRounds() { + return this.awaitIngressStatusRounds; + } + public async getControllers( req: GetControllersRequest, ): Promise { @@ -361,7 +371,7 @@ export class PocketIcClient { caller: undefined, }; - for (let i = 0; i < AWAIT_INGRESS_STATUS_ROUNDS; i++) { + for (let i = 0; i < this.awaitIngressStatusRounds; i++) { await this.tick(); const result = await this.ingressStatus(encodedReq); if (isNotNil(result)) { diff --git a/packages/pic/src/pocket-ic-types.ts b/packages/pic/src/pocket-ic-types.ts index d396365..b8e9e74 100644 --- a/packages/pic/src/pocket-ic-types.ts +++ b/packages/pic/src/pocket-ic-types.ts @@ -68,6 +68,10 @@ export interface CreateInstanceOptions { */ processingTimeoutMs?: number; + /** + * How many IngressStatusRounds all IC update calls should wait, till we get a timeout. + */ + awaitIngressStatusRounds?: number; /** * Determines what non-mainnet features should be * enabled for the PocketIC instance. From 1e3d76308b91e7cf858be53bf6259101b86b8186 Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Mon, 19 Jan 2026 21:48:07 +0100 Subject: [PATCH 2/7] pleased formatter... --- packages/pic/src/pocket-ic-client-types.ts | 2 +- packages/pic/src/pocket-ic-client.ts | 13 +++++++++---- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/packages/pic/src/pocket-ic-client-types.ts b/packages/pic/src/pocket-ic-client-types.ts index 8f35da5..3baefb2 100644 --- a/packages/pic/src/pocket-ic-client-types.ts +++ b/packages/pic/src/pocket-ic-client-types.ts @@ -24,7 +24,7 @@ export interface CreateInstanceRequest { application?: ApplicationSubnetConfig[]; verifiedApplication?: VerifiedApplicationSubnetConfig[]; processingTimeoutMs?: number; - awaitIngressStatusRounds? : number; + awaitIngressStatusRounds?: number; icpConfig?: IcpConfig; icpFeatures?: IcpFeatures; } diff --git a/packages/pic/src/pocket-ic-client.ts b/packages/pic/src/pocket-ic-client.ts index 9d88d9d..adc901b 100644 --- a/packages/pic/src/pocket-ic-client.ts +++ b/packages/pic/src/pocket-ic-client.ts @@ -94,7 +94,7 @@ export class PocketIcClient { private constructor( private readonly serverClient: Http2Client, private readonly instancePath: string, - private awaitIngressStatusRounds: number + private awaitIngressStatusRounds: number, ) {} public static async create( @@ -103,7 +103,8 @@ export class PocketIcClient { ): Promise { const processingTimeoutMs = req?.processingTimeoutMs ?? PROCESSING_TIME_VALUE_MS; - const awaitIngressStatusRounds = req?.awaitIngressStatusRounds ?? AWAIT_INGRESS_STATUS_ROUNDS; + const awaitIngressStatusRounds = + req?.awaitIngressStatusRounds ?? AWAIT_INGRESS_STATUS_ROUNDS; const serverClient = new Http2Client(url, processingTimeoutMs); const res = await serverClient.jsonPost< @@ -122,7 +123,11 @@ export class PocketIcClient { const instanceId = res.Created.instance_id; - return new PocketIcClient(serverClient, `/instances/${instanceId}`, awaitIngressStatusRounds); + return new PocketIcClient( + serverClient, + `/instances/${instanceId}`, + awaitIngressStatusRounds, + ); } public async deleteInstance(): Promise { @@ -136,7 +141,7 @@ export class PocketIcClient { this.isInstanceDeleted = true; } - public setAwaitIngressStatusRounds(numberOfRounds : number){ + public setAwaitIngressStatusRounds(numberOfRounds: number) { this.awaitIngressStatusRounds = numberOfRounds; } From 6d6be1cba62e37e24e5de4781d5368a3fa8ee138 Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Tue, 20 Jan 2026 09:10:42 +0100 Subject: [PATCH 3/7] made changes according to review... --- packages/pic/src/pocket-ic-client.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/pic/src/pocket-ic-client.ts b/packages/pic/src/pocket-ic-client.ts index adc901b..8250e85 100644 --- a/packages/pic/src/pocket-ic-client.ts +++ b/packages/pic/src/pocket-ic-client.ts @@ -94,7 +94,7 @@ export class PocketIcClient { private constructor( private readonly serverClient: Http2Client, private readonly instancePath: string, - private awaitIngressStatusRounds: number, + private readonly awaitIngressStatusRounds: number, ) {} public static async create( @@ -141,10 +141,6 @@ export class PocketIcClient { this.isInstanceDeleted = true; } - public setAwaitIngressStatusRounds(numberOfRounds: number) { - this.awaitIngressStatusRounds = numberOfRounds; - } - public getAwaitIngressStatusRounds() { return this.awaitIngressStatusRounds; } From 8c4001e63cd5b1baad99394fa7d02ee7adfd30a8 Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Tue, 20 Jan 2026 09:11:31 +0100 Subject: [PATCH 4/7] removed get method. --- packages/pic/src/pocket-ic-client.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/pic/src/pocket-ic-client.ts b/packages/pic/src/pocket-ic-client.ts index 8250e85..6e0cb0d 100644 --- a/packages/pic/src/pocket-ic-client.ts +++ b/packages/pic/src/pocket-ic-client.ts @@ -141,10 +141,6 @@ export class PocketIcClient { this.isInstanceDeleted = true; } - public getAwaitIngressStatusRounds() { - return this.awaitIngressStatusRounds; - } - public async getControllers( req: GetControllersRequest, ): Promise { From 1fb0b364ff4b83947137e96b3317f21dab506fea Mon Sep 17 00:00:00 2001 From: Martin Stypinski Date: Tue, 20 Jan 2026 09:40:24 +0100 Subject: [PATCH 5/7] Downgrade dfx version from 0.29.2 to 0.29.1 --- dfx.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dfx.json b/dfx.json index 2530733..aa12ab9 100644 --- a/dfx.json +++ b/dfx.json @@ -1,6 +1,6 @@ { "version": 1, - "dfx": "0.29.2", + "dfx": "0.29.1", "output_env_file": ".env", "networks": { "local": { From 14d360e0d694296e3b6f5eabd64a64173b7e86f3 Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Tue, 20 Jan 2026 14:18:24 +0100 Subject: [PATCH 6/7] fixed requested changes... --- dfx.json | 2 +- packages/pic/src/pocket-ic-client-types.ts | 2 +- packages/pic/src/pocket-ic-client.ts | 13 +++++++------ packages/pic/src/pocket-ic-types.ts | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) diff --git a/dfx.json b/dfx.json index 2530733..aa12ab9 100644 --- a/dfx.json +++ b/dfx.json @@ -1,6 +1,6 @@ { "version": 1, - "dfx": "0.29.2", + "dfx": "0.29.1", "output_env_file": ".env", "networks": { "local": { diff --git a/packages/pic/src/pocket-ic-client-types.ts b/packages/pic/src/pocket-ic-client-types.ts index 3baefb2..26c4aa3 100644 --- a/packages/pic/src/pocket-ic-client-types.ts +++ b/packages/pic/src/pocket-ic-client-types.ts @@ -24,7 +24,7 @@ export interface CreateInstanceRequest { application?: ApplicationSubnetConfig[]; verifiedApplication?: VerifiedApplicationSubnetConfig[]; processingTimeoutMs?: number; - awaitIngressStatusRounds?: number; + ingressMaxRetries?: number; icpConfig?: IcpConfig; icpFeatures?: IcpFeatures; } diff --git a/packages/pic/src/pocket-ic-client.ts b/packages/pic/src/pocket-ic-client.ts index 6e0cb0d..7b08f2b 100644 --- a/packages/pic/src/pocket-ic-client.ts +++ b/packages/pic/src/pocket-ic-client.ts @@ -94,7 +94,7 @@ export class PocketIcClient { private constructor( private readonly serverClient: Http2Client, private readonly instancePath: string, - private readonly awaitIngressStatusRounds: number, + private readonly ingressMaxRetries: number, ) {} public static async create( @@ -103,8 +103,6 @@ export class PocketIcClient { ): Promise { const processingTimeoutMs = req?.processingTimeoutMs ?? PROCESSING_TIME_VALUE_MS; - const awaitIngressStatusRounds = - req?.awaitIngressStatusRounds ?? AWAIT_INGRESS_STATUS_ROUNDS; const serverClient = new Http2Client(url, processingTimeoutMs); const res = await serverClient.jsonPost< @@ -123,10 +121,13 @@ export class PocketIcClient { const instanceId = res.Created.instance_id; + const ingressMaxRetries = + req?.ingressMaxRetries ?? AWAIT_INGRESS_STATUS_ROUNDS; + return new PocketIcClient( serverClient, `/instances/${instanceId}`, - awaitIngressStatusRounds, + ingressMaxRetries, ); } @@ -368,7 +369,7 @@ export class PocketIcClient { caller: undefined, }; - for (let i = 0; i < this.awaitIngressStatusRounds; i++) { + for (let i = 0; i < this.ingressMaxRetries; i++) { await this.tick(); const result = await this.ingressStatus(encodedReq); if (isNotNil(result)) { @@ -377,7 +378,7 @@ export class PocketIcClient { } throw new Error( - `PocketIC did not complete the update call within ${this.awaitIngressStatusRounds} rounds`, + `PocketIC did not complete the update call within ${this.ingressMaxRetries} rounds`, ); } diff --git a/packages/pic/src/pocket-ic-types.ts b/packages/pic/src/pocket-ic-types.ts index b8e9e74..87787a1 100644 --- a/packages/pic/src/pocket-ic-types.ts +++ b/packages/pic/src/pocket-ic-types.ts @@ -71,7 +71,7 @@ export interface CreateInstanceOptions { /** * How many IngressStatusRounds all IC update calls should wait, till we get a timeout. */ - awaitIngressStatusRounds?: number; + ingressMaxRetries?: number; /** * Determines what non-mainnet features should be * enabled for the PocketIC instance. From 8d02931eff55a61b68dae994d91af44f933317d0 Mon Sep 17 00:00:00 2001 From: "martin.stypinski" Date: Tue, 20 Jan 2026 15:41:17 +0100 Subject: [PATCH 7/7] removed rounds from AwaitCanisterCallRequest --- packages/pic/src/pocket-ic-client-types.ts | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/pic/src/pocket-ic-client-types.ts b/packages/pic/src/pocket-ic-client-types.ts index 26c4aa3..cace287 100644 --- a/packages/pic/src/pocket-ic-client-types.ts +++ b/packages/pic/src/pocket-ic-client-types.ts @@ -1148,14 +1148,12 @@ export function decodeIngressStatusResponse( //#region AwaitCanisterCall -export type AwaitCanisterCallRequest = SubmitCanisterCallResponse & { - rounds?: number; -}; +export type AwaitCanisterCallRequest = SubmitCanisterCallResponse; export type EncodedAwaitCanisterCallRequest = EncodedCanisterCallId; export function encodeAwaitCanisterCallRequest( - req: Omit, + req: AwaitCanisterCallRequest, ): EncodedAwaitCanisterCallRequest { return { effective_principal: encodeEffectivePrincipal(req.effectivePrincipal),