From daae8cf4048c4954da6460694f3e37180faa6afa Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Wed, 5 Nov 2025 11:19:55 -0800 Subject: [PATCH 01/13] Add naga-staging --- packages/e2e/src/helper/createEnvVars.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/packages/e2e/src/helper/createEnvVars.ts b/packages/e2e/src/helper/createEnvVars.ts index 1e2c0bb38..0f52852fb 100644 --- a/packages/e2e/src/helper/createEnvVars.ts +++ b/packages/e2e/src/helper/createEnvVars.ts @@ -1,4 +1,9 @@ -const supportedNetworks = ['naga-local', 'naga-test', 'naga-dev'] as const; +const supportedNetworks = [ + 'naga-local', + 'naga-test', + 'naga-staging', + 'naga-dev', +] as const; type EnvName = 'local' | 'live'; export type EnvVars = { @@ -71,7 +76,11 @@ export function createEnvVars(): EnvVars { } // -- live networks - if (network === 'naga-dev' || network === 'naga-test') { + if ( + network === 'naga-dev' || + network === 'naga-test' || + network === 'naga-staging' + ) { const liveRpcUrl = process.env['LIT_YELLOWSTONE_PRIVATE_RPC_URL']; if (liveRpcUrl) { From bc098d07e363f4335941748c4fbfb316c7b88b36 Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Wed, 5 Nov 2025 11:35:34 -0800 Subject: [PATCH 02/13] Changes from PR#924 --- packages/artillery/configs/sign-session-key.yml | 8 +++----- packages/artillery/src/init.ts | 2 +- packages/artillery/src/processors/multi-endpoints.ts | 12 ++++++++++-- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/artillery/configs/sign-session-key.yml b/packages/artillery/configs/sign-session-key.yml index 28c46a8f8..d9dbb32f7 100644 --- a/packages/artillery/configs/sign-session-key.yml +++ b/packages/artillery/configs/sign-session-key.yml @@ -4,17 +4,15 @@ config: # Over 60s, ramp up to creating 50 vusers per second - duration: 60 arrivalRate: 5 - # rampTo: 50 - rampTo: 10 + rampTo: 150 name: 'Ramp Up' # Over 300s, create 50 vusers per second - duration: 300 - # arrivalRate: 50 - arrivalRate: 10 + arrivalRate: 150 name: 'Sustained Sign Session Key' # Over 60s, ramp down to creating 5 vusers per second - duration: 60 - arrivalRate: 5 + arrivalRate: 20 name: 'Ramp Down' processor: '../src/processors/multi-endpoints.ts' diff --git a/packages/artillery/src/init.ts b/packages/artillery/src/init.ts index f5c1b063d..f7b31b304 100644 --- a/packages/artillery/src/init.ts +++ b/packages/artillery/src/init.ts @@ -17,7 +17,7 @@ const _network = process.env['NETWORK']; // CONFIGURATIONS const REJECT_BALANCE_THRESHOLD = 0; -const LEDGER_MINIMUM_BALANCE = 20000; +const LEDGER_MINIMUM_BALANCE = 10000; (async () => { // -- Start diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index 7a17c8aa5..a1d17e660 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -112,7 +112,7 @@ const createAuthContextFromState = async () => { ['access-control-condition-decryption', '*'], ], capabilityAuthSigs: [], - expiration: new Date(Date.now() + 1000 * 60 * 15).toISOString(), + expiration: new Date(Date.now() + 1000 * 60 * 30).toISOString(), }, litClient: litClient, }); @@ -166,7 +166,15 @@ export async function runPkpSignTest() { ); // Throw the error to let Artillery handle it - throw error; + // Handle specific errors to aggregate them + if ( + error instanceof Error && + error.message.includes('unable to get signature share') + ) { + throw new Error('"PKP Sign" failed. unable to get signature share.'); + } else { + throw error; + } } } From ffb4adb4c5fa7fbed7093618a6b3a992f21adb87 Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Wed, 5 Nov 2025 12:25:11 -0800 Subject: [PATCH 03/13] Fix field --- packages/artillery/src/processors/multi-endpoints.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index a1d17e660..248290690 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -140,7 +140,7 @@ export async function runPkpSignTest() { // Perform pkpSign operation const result = await litClient.chain.ethereum.pkpSign({ authContext: authContext, - pubKey: state.masterAccount.pkp.publicKey, + pubKey: state.masterAccount.pkp.pubkey, toSign: `Hello from Artillery! ${Date.now()}`, // Unique message per request // userMaxPrice: 1000000000000000000n, }); @@ -280,7 +280,7 @@ export async function runExecuteJSTest() { message: 'Test message from e2e executeJs', sigName: 'e2e-test-sig', toSign: 'Test message from e2e executeJs', - publicKey: state.masterAccount.pkp.publicKey, + publicKey: state.masterAccount.pkp.pubkey, }, }); From a3e698325d5d197ba9b03c08bd869fb29548bcea Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Wed, 5 Nov 2025 14:35:17 -0800 Subject: [PATCH 04/13] Use ARTILLERY_KEY if present --- packages/artillery/project.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/artillery/project.json b/packages/artillery/project.json index 34b837c52..7bf26f670 100644 --- a/packages/artillery/project.json +++ b/packages/artillery/project.json @@ -22,35 +22,35 @@ "executor": "nx:run-commands", "options": { "cwd": "{projectRoot}", - "command": "dotenvx run --env-file=../../.env -- bash -lc 'if [ -n \"$ARTILLERY_KEY\" ]; then artillery run --record --key \"$ARTILLERY_KEY\" configs/pkp-sign.yml; else artillery run configs/pkp-sign.yml; fi'" + "command": "artillery run configs/pkp-sign.yml $([ -n \"$ARTILLERY_KEY\" ] && echo \"--record --key $ARTILLERY_KEY\")" } }, "run:encrypt-decrypt": { "executor": "nx:run-commands", "options": { "cwd": "{projectRoot}", - "command": "dotenvx run --env-file=../../.env -- bash -lc 'if [ -n \"$ARTILLERY_KEY\" ]; then artillery run --record --key \"$ARTILLERY_KEY\" configs/encrypt-decrypt.yml; else artillery run configs/encrypt-decrypt.yml; fi'" + "command": "artillery run configs/encrypt-decrypt.yml $([ -n \"$ARTILLERY_KEY\" ] && echo \"--record --key $ARTILLERY_KEY\")" } }, "run:execute": { "executor": "nx:run-commands", "options": { "cwd": "{projectRoot}", - "command": "dotenvx run --env-file=../../.env -- bash -lc 'if [ -n \"$ARTILLERY_KEY\" ]; then artillery run --record --key \"$ARTILLERY_KEY\" configs/execute.yml; else artillery run configs/execute.yml; fi'" + "command": "artillery run configs/execute.yml $([ -n \"$ARTILLERY_KEY\" ] && echo \"--record --key $ARTILLERY_KEY\")" } }, "run:mix": { "executor": "nx:run-commands", "options": { "cwd": "{projectRoot}", - "command": "dotenvx run --env-file=../../.env -- bash -lc 'if [ -n \"$ARTILLERY_KEY\" ]; then artillery run --record --key \"$ARTILLERY_KEY\" configs/mix.yml; else artillery run configs/mix.yml; fi'" + "command": "artillery run configs/mix.yml $([ -n \"$ARTILLERY_KEY\" ] && echo \"--record --key $ARTILLERY_KEY\")" } }, "run:sign-session-key": { "executor": "nx:run-commands", "options": { "cwd": "{projectRoot}", - "command": "dotenvx run --env-file=../../.env -- bash -lc 'if [ -n \"$ARTILLERY_KEY\" ]; then artillery run --record --key \"$ARTILLERY_KEY\" configs/sign-session-key.yml; else artillery run configs/sign-session-key.yml; fi'" + "command": "artillery run configs/sign-session-key.yml $([ -n \"$ARTILLERY_KEY\" ] && echo \"--record --key $ARTILLERY_KEY\")" } } }, From fb1eb55ff99924f396d8c4ced72ce4fe077498bf Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Thu, 6 Nov 2025 16:32:54 -0800 Subject: [PATCH 05/13] Add more lit-action variants --- packages/artillery/configs/execute.yml | 40 +++- .../src/processors/multi-endpoints.ts | 189 +++++++++++++++--- 2 files changed, 205 insertions(+), 24 deletions(-) diff --git a/packages/artillery/configs/execute.yml b/packages/artillery/configs/execute.yml index 4b5c07938..7a2875c16 100644 --- a/packages/artillery/configs/execute.yml +++ b/packages/artillery/configs/execute.yml @@ -17,8 +17,46 @@ config: processor: '../src/processors/multi-endpoints.ts' scenarios: - - name: 'Execute JS Stress Test' + - name: 'Execute JS Stress Test - Sign' weight: 100 + variables: + # Access in the script via context.scenario.variables.variant + variant: 'sign' flow: - function: 'runExecuteJSTest' - think: 0.1 + - name: 'Execute JS Stress Test - Broadcast and Collect' + weight: 0 + variables: + variant: 'broadcastAndCollect' + flow: + - function: 'runExecuteJSTest' + - think: 0.1 + - name: 'Execute JS Stress Test - Check Conditions with Auth Sig' + weight: 0 + variables: + variant: 'checkConditionsWithAuthSig' + flow: + - function: 'runExecuteJSTest' + - think: 0.1 + - name: 'Execute JS Stress Test - Sign Child Lit Action' + weight: 0 + variables: + variant: 'signChildLitAction' + flow: + - function: 'runExecuteJSTest' + - think: 0.1 + - name: 'Execute JS Stress Test - Decrypt to Single Node without Auth Sig' + weight: 0 + variables: + variant: 'decryptToSingleNode' + flow: + - function: 'runExecuteJSTest' + - think: 0.1 + - name: 'Execute JS Stress Test - Run Once' + weight: 0 + variables: + variant: 'runOnce' + flow: + - function: 'runExecuteJSTest' + - think: 0.1 \ No newline at end of file diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index 248290690..c403b2618 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -37,7 +37,7 @@ const ExecuteJsResultSchema = z.object({ }) ), response: z.string(), - logs: z.string(), + logs: z.string().optional(), }); // Global variables to cache expensive operations @@ -243,7 +243,11 @@ export async function runEncryptDecryptTest() { } // test '/web/execute/v2' endpoint -export async function runExecuteJSTest() { +export async function runExecuteJSTest(context: any, _events: any) { + const variant = context.scenario.variables.variant; + + console.log('🔍 variant:', variant); + const startTime = Date.now(); try { @@ -256,32 +260,37 @@ export async function runExecuteJSTest() { // Create auth context const authContext = await createAuthContextFromState(); + // Set up access control conditions requiring wallet ownership + const builder = createAccBuilder(); + const accs = builder + .requireWalletOwnership(state.masterAccount.pkp.ethAddress) + .on('ethereum') + .build(); + + let encryptedData: any; + if (variant === 'decryptToSingleNodeWithoutAuthSig') { + // Encrypt data with the access control conditions + const dataToEncrypt = 'Hello from PKP encrypt-decrypt test!'; + encryptedData = await litClient.encrypt({ + dataToEncrypt, + unifiedAccessControlConditions: accs, + chain: 'ethereum', + }); + } + // Perform executeJs operation - const litActionCode = ` - (async () => { - const { sigName, toSign, publicKey } = jsParams; - const { keccak256, arrayify } = ethers.utils; - - const toSignBytes = new TextEncoder().encode(toSign); - const toSignBytes32 = keccak256(toSignBytes); - const toSignBytes32Array = arrayify(toSignBytes32); - - const sigShare = await Lit.Actions.signEcdsa({ - toSign: toSignBytes32Array, - publicKey, - sigName, - }); - })();`; + const { litActionCode, jsParams } = getLitActionCodeAndJsParams( + variant, + state, + encryptedData, + accs, + await authContext.authNeededCallback() + ); const result = await litClient.executeJs({ code: litActionCode, authContext, - jsParams: { - message: 'Test message from e2e executeJs', - sigName: 'e2e-test-sig', - toSign: 'Test message from e2e executeJs', - publicKey: state.masterAccount.pkp.pubkey, - }, + jsParams, }); // Validate the result using Zod schema @@ -355,3 +364,137 @@ export async function runSignSessionKeyTest() { throw error; } } + +// String enum for the variant +type Variant = + | 'sign' + | 'broadcastAndCollect' + | 'checkConditionsWithoutAuthSig' + | 'signChildLitAction' + | 'decryptToSingleNode' + | 'runOnce'; + +function getLitActionCodeAndJsParams( + variant: Variant, + state: any, + encryptedData?: any, + accs?: any, + authSig?: any +): { + litActionCode: string; + jsParams: any; +} { + switch (variant) { + case 'broadcastAndCollect': + return { + litActionCode: ` + (async () => { + const resp = await Lit.Actions.broadcastAndCollect({ + name: 'some-name', + value: 'some-value', + }); + Lit.Actions.setResponse({ response: JSON.stringify(resp) }); + })();`, + jsParams: undefined, + }; + case 'checkConditionsWithoutAuthSig': + return { + litActionCode: ` + (async () => { + const resp = await Lit.Actions.checkConditions({ + conditions: accessControlConditions, + chain: 'ethereum', + }); + Lit.Actions.setResponse({ response: JSON.stringify(resp.toString()) }); + })();`, + jsParams: { + accessControlConditions: + accs || state.masterAccount.pkp.accessControlConditions, + }, + }; + case 'signChildLitAction': + return { + litActionCode: ` + (async () => { + const { sigName, publicKey } = jsParams; + let utf8Encode = new TextEncoder(); + const toSign = utf8Encode.encode('This message is exactly 32 bytes'); + const _ = await Lit.Actions.call({ ipfsId: 'QmRwN9GKHvCn4Vk7biqtr6adjXMs7PzzYPCzNCRjPFiDjm', params: { + toSign: Array.from(toSign), + publicKey, + sigName + }}); + })();`, + jsParams: { + sigName: 'e2e-test-sig', + publicKey: state.masterAccount.pkp.pubkey, + }, + }; + case 'decryptToSingleNode': + return { + litActionCode: ` + (async () => { + const { accessControlConditions, authSig, ciphertext, dataToEncryptHash } = jsParams; + const resp = await Lit.Actions.decryptAndCombine({ + accessControlConditions, + ciphertext, + dataToEncryptHash, + authSig, + chain: 'ethereum', + }); + Lit.Actions.setResponse({ response: JSON.stringify(resp) }); + })();`, + jsParams: { + accessControlConditions: + accs || state.masterAccount.pkp.accessControlConditions, + authSig, + ciphertext: encryptedData?.ciphertext, + dataToEncryptHash: encryptedData?.dataToEncryptHash, + }, + }; + case 'runOnce': + return { + litActionCode: ` + (async () => { + let temp = await Lit.Actions.runOnce( + { waitForResponse: false, name: 'weather' }, + async () => { + const url = 'https://api.weather.gov/gridpoints/TOP/31,80/forecast'; + const resp = await fetch(url).then((response) => response.json()); + const temp = resp.properties.periods[0].temperature; + return temp; + } + ); + + Lit.Actions.setResponse({ response: JSON.stringify(temp) }); + })();`, + jsParams: undefined, + }; + case 'sign': + return { + litActionCode: ` + (async () => { + const { sigName, toSign, publicKey } = jsParams; + const { keccak256, arrayify } = ethers.utils; + + const toSignBytes = new TextEncoder().encode(toSign); + const toSignBytes32 = keccak256(toSignBytes); + const toSignBytes32Array = arrayify(toSignBytes32); + + const sigShare = await Lit.Actions.signEcdsa({ + toSign: toSignBytes32Array, + publicKey, + sigName, + }); + })();`, + jsParams: { + message: 'Test message from e2e executeJs', + sigName: 'e2e-test-sig', + toSign: 'Test message from e2e executeJs', + publicKey: state.masterAccount.pkp.pubkey, + }, + }; + default: + throw new Error(`Unknown variant: ${variant}`); + } +} From 5a36588e01a1363861e9137f4b96f3759d13723f Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Thu, 6 Nov 2025 16:53:18 -0800 Subject: [PATCH 06/13] Fix format --- packages/artillery/configs/execute.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/artillery/configs/execute.yml b/packages/artillery/configs/execute.yml index 7a2875c16..74b4a339c 100644 --- a/packages/artillery/configs/execute.yml +++ b/packages/artillery/configs/execute.yml @@ -59,4 +59,4 @@ scenarios: variant: 'runOnce' flow: - function: 'runExecuteJSTest' - - think: 0.1 \ No newline at end of file + - think: 0.1 From 9805b4166d8e4aad8627471ceefcf3761760f61d Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Fri, 7 Nov 2025 09:59:46 -0800 Subject: [PATCH 07/13] Fix variant name --- packages/artillery/configs/execute.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/artillery/configs/execute.yml b/packages/artillery/configs/execute.yml index 74b4a339c..671af02a2 100644 --- a/packages/artillery/configs/execute.yml +++ b/packages/artillery/configs/execute.yml @@ -35,7 +35,7 @@ scenarios: - name: 'Execute JS Stress Test - Check Conditions with Auth Sig' weight: 0 variables: - variant: 'checkConditionsWithAuthSig' + variant: 'checkConditionsWithoutAuthSig' flow: - function: 'runExecuteJSTest' - think: 0.1 From e58675a15029e0b351385a7e45ee5c0783a553fb Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 7 Nov 2025 18:04:29 +0000 Subject: [PATCH 08/13] refactor: change to eoa auth --- packages/artillery/src/processors/multi-endpoints.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index c403b2618..84e3785cc 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -1,5 +1,6 @@ import { createAuthManager, storagePlugins } from '@lit-protocol/auth'; import { createLitClient, LitClientType } from '@lit-protocol/lit-client'; +import { AuthSig } from '@lit-protocol/types'; import { z } from 'zod'; import * as StateManager from '../StateManager'; import { getLitNetworkModule } from '@lit-protocol/e2e'; @@ -118,6 +119,7 @@ const createAuthContextFromState = async () => { }); } + return masterAccountAuthContext; }; @@ -263,14 +265,14 @@ export async function runExecuteJSTest(context: any, _events: any) { // Set up access control conditions requiring wallet ownership const builder = createAccBuilder(); const accs = builder - .requireWalletOwnership(state.masterAccount.pkp.ethAddress) + .requireWalletOwnership(authContext.account.address) .on('ethereum') .build(); let encryptedData: any; - if (variant === 'decryptToSingleNodeWithoutAuthSig') { + if (variant === 'decryptToSingleNode') { // Encrypt data with the access control conditions - const dataToEncrypt = 'Hello from PKP encrypt-decrypt test!'; + const dataToEncrypt = 'Hello from encrypt-decrypt test!'; encryptedData = await litClient.encrypt({ dataToEncrypt, unifiedAccessControlConditions: accs, @@ -284,7 +286,7 @@ export async function runExecuteJSTest(context: any, _events: any) { state, encryptedData, accs, - await authContext.authNeededCallback() + null ); const result = await litClient.executeJs({ From e1db48ba5a5a5bf5dacf0b8f57df21b4a13b3b31 Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Fri, 7 Nov 2025 10:04:48 -0800 Subject: [PATCH 09/13] Add params --- packages/artillery/src/processors/multi-endpoints.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index c403b2618..494008884 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -401,6 +401,7 @@ function getLitActionCodeAndJsParams( return { litActionCode: ` (async () => { + const { accessControlConditions } = jsParams; const resp = await Lit.Actions.checkConditions({ conditions: accessControlConditions, chain: 'ethereum', From fc609612d1722d55a55cd452858afa525bee4745 Mon Sep 17 00:00:00 2001 From: anson Date: Fri, 7 Nov 2025 18:19:34 +0000 Subject: [PATCH 10/13] refactor: remove unused import of AuthSig --- packages/artillery/src/processors/multi-endpoints.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index 84e3785cc..397b5c8c5 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -1,6 +1,5 @@ import { createAuthManager, storagePlugins } from '@lit-protocol/auth'; import { createLitClient, LitClientType } from '@lit-protocol/lit-client'; -import { AuthSig } from '@lit-protocol/types'; import { z } from 'zod'; import * as StateManager from '../StateManager'; import { getLitNetworkModule } from '@lit-protocol/e2e'; @@ -119,7 +118,6 @@ const createAuthContextFromState = async () => { }); } - return masterAccountAuthContext; }; From 602658de798fc5ffbf71f7e82b7e124024da83d6 Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Tue, 11 Nov 2025 19:10:15 -0800 Subject: [PATCH 11/13] Tidy up decrypt scenario --- .../src/processors/multi-endpoints.ts | 25 +++++++++++-------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index f98050413..5d7489c3b 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -262,13 +262,14 @@ export async function runExecuteJSTest(context: any, _events: any) { // Set up access control conditions requiring wallet ownership const builder = createAccBuilder(); - const accs = builder - .requireWalletOwnership(authContext.account.address) - .on('ethereum') - .build(); - + let accs: any; let encryptedData: any; if (variant === 'decryptToSingleNode') { + accs = builder + .requireWalletOwnership(authContext.account.address) + .on('ethereum') + .build(); + // Encrypt data with the access control conditions const dataToEncrypt = 'Hello from encrypt-decrypt test!'; encryptedData = await litClient.encrypt({ @@ -276,6 +277,11 @@ export async function runExecuteJSTest(context: any, _events: any) { unifiedAccessControlConditions: accs, chain: 'ethereum', }); + } else { + accs = builder + .requireWalletOwnership(state.masterAccount.pkp.ethAddress) + .on('ethereum') + .build(); } // Perform executeJs operation @@ -284,7 +290,7 @@ export async function runExecuteJSTest(context: any, _events: any) { state, encryptedData, accs, - null + await authContext.authNeededCallback() ); const result = await litClient.executeJs({ @@ -435,12 +441,12 @@ function getLitActionCodeAndJsParams( return { litActionCode: ` (async () => { - const { accessControlConditions, authSig, ciphertext, dataToEncryptHash } = jsParams; - const resp = await Lit.Actions.decryptAndCombine({ + const { accessControlConditions, ciphertext, dataToEncryptHash } = jsParams; + const resp = await Lit.Actions.decryptToSingleNode({ accessControlConditions, ciphertext, dataToEncryptHash, - authSig, + authSig: null, chain: 'ethereum', }); Lit.Actions.setResponse({ response: JSON.stringify(resp) }); @@ -448,7 +454,6 @@ function getLitActionCodeAndJsParams( jsParams: { accessControlConditions: accs || state.masterAccount.pkp.accessControlConditions, - authSig, ciphertext: encryptedData?.ciphertext, dataToEncryptHash: encryptedData?.dataToEncryptHash, }, From 8cc0ea33943589cb7086838801be47532566c50a Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Tue, 11 Nov 2025 19:14:36 -0800 Subject: [PATCH 12/13] Validate decrypted response from LA --- .../artillery/src/processors/multi-endpoints.ts | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index 5d7489c3b..74b5944df 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -264,6 +264,7 @@ export async function runExecuteJSTest(context: any, _events: any) { const builder = createAccBuilder(); let accs: any; let encryptedData: any; + let dataToEncrypt: string; if (variant === 'decryptToSingleNode') { accs = builder .requireWalletOwnership(authContext.account.address) @@ -271,7 +272,7 @@ export async function runExecuteJSTest(context: any, _events: any) { .build(); // Encrypt data with the access control conditions - const dataToEncrypt = 'Hello from encrypt-decrypt test!'; + dataToEncrypt = 'Hello from encrypt-decrypt test!'; encryptedData = await litClient.encrypt({ dataToEncrypt, unifiedAccessControlConditions: accs, @@ -305,9 +306,19 @@ export async function runExecuteJSTest(context: any, _events: any) { const endTime = Date.now(); const duration = endTime - startTime; + if ( + variant === 'decryptToSingleNode' && + // Strip quote marks at the ends + validatedResult.response.substring( + 1, + validatedResult.response.length - 1 + ) !== dataToEncrypt! + ) { + throw new Error('❌ Decrypted data does not match the original data'); + } + console.log(`✅ executeJs successful in ${duration}ms`); console.log('✅ executeJs result:', validatedResult); - // For Artillery, just return - no need to call next() return; } catch (error) { From 75f2aa5608994d72e68c9f1dbd1411b0e34bda6e Mon Sep 17 00:00:00 2001 From: Howard Tam Date: Tue, 11 Nov 2025 22:44:13 -0800 Subject: [PATCH 13/13] Fix sign session key --- packages/artillery/src/processors/multi-endpoints.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/artillery/src/processors/multi-endpoints.ts b/packages/artillery/src/processors/multi-endpoints.ts index 74b5944df..7757943e8 100644 --- a/packages/artillery/src/processors/multi-endpoints.ts +++ b/packages/artillery/src/processors/multi-endpoints.ts @@ -351,7 +351,7 @@ export async function runSignSessionKeyTest() { const masterAccountPkpAuthContext = await authManager.createPkpAuthContext({ authData: state.masterAccount.authData, - pkpPublicKey: state.masterAccount.pkp.publicKey, + pkpPublicKey: state.masterAccount.pkp.pubkey, authConfig: { resources: [ ['pkp-signing', '*'], @@ -367,7 +367,10 @@ export async function runSignSessionKeyTest() { }, }); - // console.log('✅ Master Account PKP Auth Context:', masterAccountPkpAuthContext); + console.log( + '✅ Sign Session Key successful. Master Account PKP Auth Context:', + masterAccountPkpAuthContext + ); } catch (error) { const endTime = Date.now(); const duration = endTime - startTime;