Skip to content

Commit 5670ab2

Browse files
authored
Merge pull request #888 from LIT-Protocol/feature/jss-100-naga-bug-accs-failing-on-unified-accs
fix(accs): Custom EVM contract condition type failing on unified acce…
2 parents f4f5926 + 64a4b12 commit 5670ab2

File tree

5 files changed

+168
-6
lines changed

5 files changed

+168
-6
lines changed
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import { createAuthManager, storagePlugins } from '@lit-protocol/auth';
2+
import { createLitClient } from '@lit-protocol/lit-client';
3+
import { nagaDev } from '@lit-protocol/networks';
4+
import { privateKeyToAccount } from 'viem/accounts';
5+
import {
6+
createAccBuilder,
7+
UnifiedAccessControlCondition,
8+
} from '@lit-protocol/access-control-conditions';
9+
10+
import { createPublicClient, http } from 'viem';
11+
import { baseSepolia } from 'viem/chains';
12+
13+
const liveMasterAccount = privateKeyToAccount(
14+
process.env['LIVE_MASTER_ACCOUNT'] as `0x${string}`
15+
);
16+
17+
const rawAccs = [
18+
{
19+
conditionType: 'evmContract',
20+
contractAddress: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
21+
functionName: 'balanceOf',
22+
functionParams: [':userAddress'],
23+
functionAbi: {
24+
inputs: [{ internalType: 'address', name: 'account', type: 'address' }],
25+
name: 'balanceOf',
26+
outputs: [{ internalType: 'uint256', name: '', type: 'uint256' }],
27+
stateMutability: 'view',
28+
type: 'function',
29+
},
30+
chain: 'baseSepolia',
31+
returnValueTest: {
32+
key: '',
33+
comparator: '>=',
34+
value: '0',
35+
},
36+
},
37+
] as UnifiedAccessControlCondition;
38+
39+
describe('jss100 custom contract accs', () => {
40+
beforeAll(async () => {
41+
const client = createPublicClient({
42+
chain: baseSepolia,
43+
transport: http(),
44+
});
45+
46+
const balance = await client.readContract({
47+
address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',
48+
abi: [
49+
{
50+
constant: true,
51+
inputs: [{ name: 'account', type: 'address' }],
52+
name: 'balanceOf',
53+
outputs: [{ name: '', type: 'uint256' }],
54+
payable: false,
55+
stateMutability: 'view',
56+
type: 'function',
57+
},
58+
],
59+
functionName: 'balanceOf',
60+
args: [liveMasterAccount.address],
61+
});
62+
63+
if (BigInt(balance) <= 0n) {
64+
throw new Error(
65+
`Test account ${liveMasterAccount.address} has no balance for token 0x036CbD53842c5426634e7929541eC2318f3dCF7e. Please get some before running the test.`
66+
);
67+
}
68+
});
69+
70+
it('should be able to use the custom contract accs api - evmContract conditions', async () => {
71+
console.log(
72+
'🔧 [TEST] Testing evmContract conditions (rawAccs):',
73+
JSON.stringify(rawAccs, null, 2)
74+
);
75+
76+
console.log(
77+
'Setting up permissions for address:',
78+
liveMasterAccount.address
79+
);
80+
81+
console.log('🔧 [SESSION] Creating fresh litClient and clearing storage');
82+
83+
const litClient = await createLitClient({ network: nagaDev });
84+
85+
// Use unique storage path with timestamp to prevent session reuse
86+
const uniqueStoragePath = `.e2e/jss100-${Date.now()}`;
87+
console.log('🔧 [SESSION] Using unique storage path:', uniqueStoragePath);
88+
89+
const authManager = createAuthManager({
90+
storage: storagePlugins.localStorageNode({
91+
appName: 'jss100-custom-contract-accs',
92+
networkName: 'naga-dev',
93+
storagePath: uniqueStoragePath,
94+
}),
95+
});
96+
97+
/**
98+
* ====================================
99+
* Create the auth context
100+
* ====================================
101+
*/
102+
const aliceEoaAuthContext = await authManager.createEoaAuthContext({
103+
config: {
104+
account: liveMasterAccount,
105+
},
106+
authConfig: {
107+
statement: 'I authorize the Lit Protocol to execute this Lit Action.',
108+
domain: 'example.com',
109+
resources: [
110+
['lit-action-execution', '*'],
111+
['pkp-signing', '*'],
112+
['access-control-condition-decryption', '*'],
113+
],
114+
capabilityAuthSigs: [],
115+
expiration: new Date(Date.now() + 1000 * 60 * 15).toISOString(),
116+
},
117+
litClient: litClient,
118+
});
119+
120+
// Handle both array and single condition formats correctly
121+
const unifiedAccs = createAccBuilder().unifiedAccs(rawAccs).build();
122+
123+
console.log('unifiedAccs:', JSON.stringify(unifiedAccs, null, 2));
124+
125+
const stringData = 'Hello world';
126+
const encryptedStringData = await litClient.encrypt({
127+
dataToEncrypt: stringData,
128+
unifiedAccessControlConditions: unifiedAccs,
129+
});
130+
131+
console.log(encryptedStringData);
132+
133+
// Use the same account to decrypt the data
134+
const decryptedStringData = await litClient.decrypt({
135+
data: encryptedStringData,
136+
unifiedAccessControlConditions: unifiedAccs,
137+
authContext: aliceEoaAuthContext,
138+
});
139+
140+
console.log('decryptedStringData:', decryptedStringData);
141+
142+
expect(decryptedStringData.convertedData).toBe(stringData);
143+
});
144+
});

packages/lit-client/src/lib/LitClient/createLitClient.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import {
2424
import {
2525
AuthContextSchema2,
2626
AuthData,
27+
ChainSchema,
2728
EncryptedVersion1Schema,
2829
HexPrefixedSchema,
2930
JsonSignCustomSessionKeyRequestForPkpReturnSchema,
@@ -670,7 +671,7 @@ export const _createNagaLitClient = async (
670671
unifiedAccessControlConditions: params.unifiedAccessControlConditions,
671672
connectionInfo: currentConnectionInfo,
672673
version: networkModule.version,
673-
chain: params.chain,
674+
chain: ChainSchema.parse(params.chain),
674675
jitContext,
675676
})) as RequestItem<z.infer<typeof EncryptedVersion1Schema>>[];
676677

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,28 @@
11
import { z } from 'zod';
22
import { MultipleAccessControlConditionsSchema } from '@lit-protocol/access-control-conditions-schemas';
33
import { AuthSigSchema } from '@lit-protocol/schemas';
4+
import { FormattedMultipleAccs } from '@lit-protocol/types';
5+
import { getFormattedAccessControlConditions } from '@lit-protocol/access-control-conditions';
46

57
export const DecryptRequestDataSchema =
68
MultipleAccessControlConditionsSchema.extend({
79
ciphertext: z.string(),
810
dataToEncryptHash: z.string(),
911
authSig: AuthSigSchema,
1012
chain: z.string(),
13+
}).transform((data) => {
14+
const {
15+
formattedAccessControlConditions,
16+
formattedEVMContractConditions,
17+
formattedSolRpcConditions,
18+
formattedUnifiedAccessControlConditions,
19+
}: FormattedMultipleAccs = getFormattedAccessControlConditions(data);
20+
21+
return {
22+
...data,
23+
accessControlConditions: formattedAccessControlConditions,
24+
evmContractConditions: formattedEVMContractConditions,
25+
solRpcConditions: formattedSolRpcConditions,
26+
unifiedAccessControlConditions: formattedUnifiedAccessControlConditions,
27+
};
1128
});

packages/networks/src/storage/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { PKPInfo } from '@lit-protocol/types';
1+
import { PKPData } from '@lit-protocol/schemas';
22

33
export interface PKPStorageProvider {
44
readPKPTokens?(params: {
@@ -37,11 +37,11 @@ export interface PKPStorageProvider {
3737
readPKPs?(params: {
3838
authMethodType: number | bigint;
3939
authMethodId: string;
40-
}): Promise<PKPInfo[] | null>;
40+
}): Promise<PKPData[] | null>;
4141

4242
writePKPs?(params: {
4343
authMethodType: number | bigint;
4444
authMethodId: string;
45-
pkps: PKPInfo[];
45+
pkps: PKPData[];
4646
}): Promise<void>;
4747
}

packages/schemas/src/lib/schemas.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -218,14 +218,14 @@ export const JsonSchema: z.ZodType<Json> = z.lazy(() =>
218218
);
219219

220220
export const HexSchema = z.string().regex(/^0x[0-9a-fA-F]+$/);
221-
export const ChainSchema = z.string();
221+
export const ChainSchema = z.string().default('ethereum');
222222
export const EvmChainSchema = z.enum(LIT_CHAINS_KEYS);
223223

224224
export const ChainedSchema = z.object({
225225
/**
226226
* The chain name of the chain that will be used. See LIT_CHAINS for currently supported chains.
227227
*/
228-
chain: ChainSchema,
228+
chain: ChainSchema.optional(),
229229
});
230230

231231
export const PricedSchema = z.object({

0 commit comments

Comments
 (0)