@cofhe/sdk 0.6.1 → 0.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/acps/acp.ts +411 -0
- package/acps/index.ts +70 -0
- package/{permits → acps}/onchain-utils.ts +49 -24
- package/acps/sealing.ts +90 -0
- package/acps/signature.ts +89 -0
- package/acps/store.ts +172 -0
- package/acps/test/acp.test.ts +615 -0
- package/acps/test/localstorage.test.ts +105 -0
- package/acps/test/sealing.test.ts +77 -0
- package/acps/test/store.test.ts +88 -0
- package/acps/test/validation.test.ts +361 -0
- package/acps/test-utils.ts +32 -0
- package/acps/types.ts +252 -0
- package/acps/validation.ts +392 -0
- package/adapters/test/ethers5.test.ts +4 -1
- package/adapters/test/ethers6.test.ts +4 -1
- package/adapters/test/wagmi.test.ts +5 -2
- package/chains/chains/stagingCofhe.ts +21 -0
- package/chains/index.ts +3 -1
- package/chains/test/chains.test.ts +2 -1
- package/core/acps.ts +625 -0
- package/core/client.ts +136 -39
- package/core/clientTypes.ts +52 -41
- package/core/config.ts +66 -5
- package/core/decrypt/MockThresholdNetworkAbi.ts +20 -11
- package/core/decrypt/apiError.ts +104 -0
- package/core/decrypt/cofheMocksDecryptForTx.ts +11 -11
- package/core/decrypt/cofheMocksDecryptForView.ts +7 -7
- package/core/decrypt/decryptForTxBuilder.ts +102 -102
- package/core/decrypt/decryptForViewBuilder.ts +90 -90
- package/core/decrypt/submitRetry.ts +38 -30
- package/core/decrypt/tnDecryptV1.ts +5 -5
- package/core/decrypt/tnDecryptV2.ts +25 -21
- package/core/decrypt/tnSealOutputV1.ts +4 -3
- package/core/decrypt/tnSealOutputV2.ts +24 -18
- package/core/encrypt/cofheMocksZkVerifySign.ts +59 -74
- package/core/encrypt/encryptInputsBuilder.ts +86 -52
- package/core/encrypt/zkPackProveVerify.ts +25 -18
- package/core/error.ts +34 -6
- package/core/index.ts +4 -14
- package/core/test/acpDefaults.test.ts +52 -0
- package/core/test/acps.test.ts +596 -0
- package/core/test/apiError.test.ts +130 -0
- package/core/test/client.test.ts +22 -19
- package/core/test/config.test.ts +25 -5
- package/core/test/decrypt.test.ts +40 -35
- package/core/test/decryptBuilders.test.ts +68 -68
- package/core/test/decryptErrorCodes.test.ts +217 -0
- package/core/test/encryptInputsBuilder.test.ts +72 -41
- package/core/test/pollCallbacks.test.ts +89 -18
- package/core/test/stagingRedirect.ts +18 -0
- package/core/test/submitRetry.test.ts +182 -0
- package/core/types.ts +9 -69
- package/dist/acp-Wi6isVQI.d.cts +407 -0
- package/dist/acp-Wi6isVQI.d.ts +407 -0
- package/dist/acps.cjs +1081 -0
- package/dist/acps.d.cts +480 -0
- package/dist/acps.d.ts +480 -0
- package/dist/acps.js +2 -0
- package/dist/chains.cjs +14 -1
- package/dist/chains.d.cts +30 -1
- package/dist/chains.d.ts +30 -1
- package/dist/chains.js +1 -1
- package/dist/{chunk-NOC3PYB7.js → chunk-43USWPEH.js} +930 -580
- package/dist/{chunk-MTRAXQXC.js → chunk-N6IDQRRU.js} +14 -2
- package/dist/chunk-Q7CBWGQX.js +1029 -0
- package/dist/{clientTypes-CyUvRRzA.d.ts → clientTypes-BN3nbzYM.d.ts} +342 -165
- package/dist/{clientTypes-BDy1qIBu.d.cts → clientTypes-CYZjFznO.d.cts} +342 -165
- package/dist/core.cjs +1358 -1002
- package/dist/core.d.cts +31 -9
- package/dist/core.d.ts +31 -9
- package/dist/core.js +3 -3
- package/dist/node.cjs +1293 -952
- package/dist/node.d.cts +2 -2
- package/dist/node.d.ts +2 -2
- package/dist/node.js +3 -3
- package/dist/web.cjs +1293 -952
- package/dist/web.d.cts +2 -2
- package/dist/web.d.ts +2 -2
- package/dist/web.js +3 -3
- package/node/test/inherited.test.ts +75 -65
- package/node/test/tfheinit.test.ts +23 -8
- package/package.json +6 -6
- package/web/test/client.web.test.ts +5 -1
- package/web/test/inherited.web.test.ts +75 -65
- package/web/test/tfheinit.web.test.ts +14 -5
- package/web/test/worker.config.web.test.ts +38 -23
- package/web/test/worker.output.web.test.ts +25 -24
- package/core/encrypt/encryptUtils.ts +0 -67
- package/core/permits.ts +0 -216
- package/core/test/permits.test.ts +0 -596
- package/dist/chunk-VB62WYPL.js +0 -978
- package/dist/permit-DnVMDT5h.d.cts +0 -376
- package/dist/permit-DnVMDT5h.d.ts +0 -376
- package/dist/permits.cjs +0 -1026
- package/dist/permits.d.cts +0 -353
- package/dist/permits.d.ts +0 -353
- package/dist/permits.js +0 -2
- package/permits/index.ts +0 -68
- package/permits/permit.ts +0 -385
- package/permits/sealing.ts +0 -131
- package/permits/signature.ts +0 -79
- package/permits/store.ts +0 -157
- package/permits/test/localstorage.test.ts +0 -113
- package/permits/test/permit.test.ts +0 -557
- package/permits/test/sealing.test.ts +0 -84
- package/permits/test/store.test.ts +0 -88
- package/permits/test/validation.test.ts +0 -361
- package/permits/test-utils.ts +0 -28
- package/permits/types.ts +0 -204
- package/permits/validation.ts +0 -327
- /package/{permits → acps}/utils.ts +0 -0
package/permits/store.ts
DELETED
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { createStore } from 'zustand/vanilla';
|
|
2
|
-
import { persist } from 'zustand/middleware';
|
|
3
|
-
import { produce } from 'immer';
|
|
4
|
-
import { type Permit, type SerializedPermit } from './types.js';
|
|
5
|
-
import { PermitUtils } from './permit.js';
|
|
6
|
-
|
|
7
|
-
type ChainRecord<T> = Record<number, T>;
|
|
8
|
-
type AccountRecord<T> = Record<string, T>;
|
|
9
|
-
type HashRecord<T> = Record<string, T>;
|
|
10
|
-
|
|
11
|
-
type PermitsStore = {
|
|
12
|
-
permits: ChainRecord<AccountRecord<HashRecord<SerializedPermit | undefined>>>;
|
|
13
|
-
activePermitHash: ChainRecord<AccountRecord<string | undefined>>;
|
|
14
|
-
};
|
|
15
|
-
|
|
16
|
-
// Stores generated permits for each user, a hash indicating the active permit for each user
|
|
17
|
-
// Can be used to create reactive hooks
|
|
18
|
-
export const PERMIT_STORE_DEFAULTS: PermitsStore = {
|
|
19
|
-
permits: {},
|
|
20
|
-
activePermitHash: {},
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
export const _permitStore = createStore<PermitsStore>()(
|
|
24
|
-
persist(() => PERMIT_STORE_DEFAULTS, { name: 'cofhesdk-permits' })
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
export const clearStaleStore = () => {
|
|
28
|
-
// Any is used here because we do not have types of the previous store
|
|
29
|
-
const state = _permitStore.getState() as any;
|
|
30
|
-
|
|
31
|
-
// Check if the store has the expected structure
|
|
32
|
-
const hasExpectedStructure =
|
|
33
|
-
state &&
|
|
34
|
-
typeof state === 'object' &&
|
|
35
|
-
'permits' in state &&
|
|
36
|
-
'activePermitHash' in state &&
|
|
37
|
-
typeof state.permits === 'object' &&
|
|
38
|
-
typeof state.activePermitHash === 'object';
|
|
39
|
-
|
|
40
|
-
if (hasExpectedStructure) return;
|
|
41
|
-
// Invalid structure detected - clear the store
|
|
42
|
-
_permitStore.setState({ permits: {}, activePermitHash: {} });
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
export const getPermit = (
|
|
46
|
-
chainId: number | undefined,
|
|
47
|
-
account: string | undefined,
|
|
48
|
-
hash: string | undefined
|
|
49
|
-
): Permit | undefined => {
|
|
50
|
-
clearStaleStore();
|
|
51
|
-
if (chainId == null || account == null || hash == null) return;
|
|
52
|
-
|
|
53
|
-
const savedPermit = _permitStore.getState().permits[chainId]?.[account]?.[hash];
|
|
54
|
-
if (savedPermit == null) return;
|
|
55
|
-
|
|
56
|
-
return PermitUtils.deserialize(savedPermit);
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
export const getActivePermit = (chainId: number | undefined, account: string | undefined): Permit | undefined => {
|
|
60
|
-
clearStaleStore();
|
|
61
|
-
if (chainId == null || account == null) return;
|
|
62
|
-
|
|
63
|
-
const activePermitHash = _permitStore.getState().activePermitHash[chainId]?.[account];
|
|
64
|
-
return getPermit(chainId, account, activePermitHash);
|
|
65
|
-
};
|
|
66
|
-
|
|
67
|
-
export const getPermits = (chainId: number | undefined, account: string | undefined): Record<string, Permit> => {
|
|
68
|
-
clearStaleStore();
|
|
69
|
-
if (chainId == null || account == null) return {};
|
|
70
|
-
|
|
71
|
-
return Object.entries(_permitStore.getState().permits[chainId]?.[account] ?? {}).reduce(
|
|
72
|
-
(acc, [hash, permit]) => {
|
|
73
|
-
if (permit == undefined) return acc;
|
|
74
|
-
return { ...acc, [hash]: PermitUtils.deserialize(permit) };
|
|
75
|
-
},
|
|
76
|
-
{} as Record<string, Permit>
|
|
77
|
-
);
|
|
78
|
-
};
|
|
79
|
-
|
|
80
|
-
export const setPermit = (chainId: number, account: string, permit: Permit) => {
|
|
81
|
-
clearStaleStore();
|
|
82
|
-
_permitStore.setState(
|
|
83
|
-
produce<PermitsStore>((state) => {
|
|
84
|
-
if (state.permits[chainId] == null) state.permits[chainId] = {};
|
|
85
|
-
if (state.permits[chainId][account] == null) state.permits[chainId][account] = {};
|
|
86
|
-
state.permits[chainId][account][permit.hash] = PermitUtils.serialize(permit);
|
|
87
|
-
})
|
|
88
|
-
);
|
|
89
|
-
};
|
|
90
|
-
|
|
91
|
-
export const removePermit = (chainId: number, account: string, hash: string) => {
|
|
92
|
-
clearStaleStore();
|
|
93
|
-
_permitStore.setState(
|
|
94
|
-
produce<PermitsStore>((state) => {
|
|
95
|
-
if (state.permits[chainId] == null) state.permits[chainId] = {};
|
|
96
|
-
if (state.activePermitHash[chainId] == null) state.activePermitHash[chainId] = {};
|
|
97
|
-
|
|
98
|
-
const accountPermits = state.permits[chainId][account];
|
|
99
|
-
if (accountPermits == null) return;
|
|
100
|
-
|
|
101
|
-
if (accountPermits[hash] == null) return;
|
|
102
|
-
|
|
103
|
-
if (state.activePermitHash[chainId][account] === hash) {
|
|
104
|
-
// if the active permit is the one to be removed - unset it
|
|
105
|
-
state.activePermitHash[chainId][account] = undefined;
|
|
106
|
-
}
|
|
107
|
-
// Remove the permit
|
|
108
|
-
accountPermits[hash] = undefined;
|
|
109
|
-
})
|
|
110
|
-
);
|
|
111
|
-
};
|
|
112
|
-
|
|
113
|
-
export const getActivePermitHash = (chainId: number | undefined, account: string | undefined): string | undefined => {
|
|
114
|
-
clearStaleStore();
|
|
115
|
-
if (chainId == null || account == null) return undefined;
|
|
116
|
-
return _permitStore.getState().activePermitHash[chainId]?.[account];
|
|
117
|
-
};
|
|
118
|
-
|
|
119
|
-
export const setActivePermitHash = (chainId: number, account: string, hash: string) => {
|
|
120
|
-
clearStaleStore();
|
|
121
|
-
_permitStore.setState(
|
|
122
|
-
produce<PermitsStore>((state) => {
|
|
123
|
-
if (state.activePermitHash[chainId] == null) state.activePermitHash[chainId] = {};
|
|
124
|
-
state.activePermitHash[chainId][account] = hash;
|
|
125
|
-
})
|
|
126
|
-
);
|
|
127
|
-
};
|
|
128
|
-
|
|
129
|
-
export const removeActivePermitHash = (chainId: number, account: string) => {
|
|
130
|
-
clearStaleStore();
|
|
131
|
-
_permitStore.setState(
|
|
132
|
-
produce<PermitsStore>((state) => {
|
|
133
|
-
if (state.activePermitHash[chainId]) state.activePermitHash[chainId][account] = undefined;
|
|
134
|
-
})
|
|
135
|
-
);
|
|
136
|
-
};
|
|
137
|
-
|
|
138
|
-
export const resetStore = () => {
|
|
139
|
-
clearStaleStore();
|
|
140
|
-
_permitStore.setState({ permits: {}, activePermitHash: {} });
|
|
141
|
-
};
|
|
142
|
-
|
|
143
|
-
export const permitStore = {
|
|
144
|
-
store: _permitStore,
|
|
145
|
-
|
|
146
|
-
getPermit,
|
|
147
|
-
getActivePermit,
|
|
148
|
-
getPermits,
|
|
149
|
-
setPermit,
|
|
150
|
-
removePermit,
|
|
151
|
-
|
|
152
|
-
getActivePermitHash,
|
|
153
|
-
setActivePermitHash,
|
|
154
|
-
removeActivePermitHash,
|
|
155
|
-
|
|
156
|
-
resetStore,
|
|
157
|
-
};
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @vitest-environment happy-dom
|
|
3
|
-
*/
|
|
4
|
-
|
|
5
|
-
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
6
|
-
import {
|
|
7
|
-
getPermit,
|
|
8
|
-
setPermit,
|
|
9
|
-
removePermit,
|
|
10
|
-
getActivePermitHash,
|
|
11
|
-
setActivePermitHash,
|
|
12
|
-
PermitUtils,
|
|
13
|
-
permitStore,
|
|
14
|
-
} from '../index.js';
|
|
15
|
-
import { createMockPermit } from '../test-utils.js';
|
|
16
|
-
|
|
17
|
-
// Type declarations for happy-dom environment
|
|
18
|
-
declare const localStorage: {
|
|
19
|
-
clear: () => void;
|
|
20
|
-
getItem: (name: string) => string | null;
|
|
21
|
-
setItem: (name: string, value: string) => void;
|
|
22
|
-
};
|
|
23
|
-
|
|
24
|
-
describe('Permits localStorage Tests', () => {
|
|
25
|
-
const chainId = 1;
|
|
26
|
-
const account = '0x1234567890123456789012345678901234567890';
|
|
27
|
-
|
|
28
|
-
beforeEach(() => {
|
|
29
|
-
// Clear localStorage and reset store state
|
|
30
|
-
localStorage.clear();
|
|
31
|
-
permitStore.resetStore();
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
afterEach(() => {
|
|
35
|
-
// Clean up after each test
|
|
36
|
-
localStorage.clear();
|
|
37
|
-
permitStore.resetStore();
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it('should persist permits to localStorage', async () => {
|
|
41
|
-
const permit = await createMockPermit();
|
|
42
|
-
|
|
43
|
-
setPermit(chainId, account, permit);
|
|
44
|
-
|
|
45
|
-
// Verify data is stored in localStorage
|
|
46
|
-
const storedData = localStorage.getItem('cofhesdk-permits');
|
|
47
|
-
expect(storedData).toBeDefined();
|
|
48
|
-
|
|
49
|
-
const parsedData = JSON.parse(storedData!);
|
|
50
|
-
expect(parsedData.state.permits[chainId][account][permit.hash]).toBeDefined();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it('should persist active permit hash to localStorage', async () => {
|
|
54
|
-
const permit = await createMockPermit();
|
|
55
|
-
|
|
56
|
-
setPermit(chainId, account, permit);
|
|
57
|
-
setActivePermitHash(chainId, account, permit.hash);
|
|
58
|
-
|
|
59
|
-
// Verify active permit hash is stored
|
|
60
|
-
const storedData = localStorage.getItem('cofhesdk-permits');
|
|
61
|
-
expect(storedData).toBeDefined();
|
|
62
|
-
|
|
63
|
-
const parsedData = JSON.parse(storedData!);
|
|
64
|
-
expect(parsedData.state.activePermitHash[chainId][account]).toBe(permit.hash);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
it('should restore permits from localStorage', async () => {
|
|
68
|
-
const permit = await createMockPermit();
|
|
69
|
-
|
|
70
|
-
// Add permit to localStorage
|
|
71
|
-
setPermit(chainId, account, permit);
|
|
72
|
-
setActivePermitHash(chainId, account, permit.hash);
|
|
73
|
-
const serializedPermit = PermitUtils.serialize(permit);
|
|
74
|
-
|
|
75
|
-
// Verify data is restored
|
|
76
|
-
const retrievedPermit = getPermit(chainId, account, permit.hash);
|
|
77
|
-
expect(retrievedPermit).toBeDefined();
|
|
78
|
-
expect(PermitUtils.serialize(retrievedPermit!)).toEqual(serializedPermit);
|
|
79
|
-
|
|
80
|
-
const activeHash = getActivePermitHash(chainId, account);
|
|
81
|
-
expect(activeHash).toBe(permit.hash);
|
|
82
|
-
});
|
|
83
|
-
|
|
84
|
-
it('should handle corrupted localStorage data gracefully', () => {
|
|
85
|
-
// Set invalid JSON in localStorage
|
|
86
|
-
localStorage.setItem('cofhesdk-permits', 'invalid json');
|
|
87
|
-
|
|
88
|
-
// Store should handle this gracefully
|
|
89
|
-
expect(() => {
|
|
90
|
-
permitStore.store.getState();
|
|
91
|
-
}).not.toThrow();
|
|
92
|
-
});
|
|
93
|
-
|
|
94
|
-
it('should clean up localStorage when permits are removed', async () => {
|
|
95
|
-
const permit = await createMockPermit();
|
|
96
|
-
|
|
97
|
-
setPermit(chainId, account, permit);
|
|
98
|
-
setActivePermitHash(chainId, account, permit.hash);
|
|
99
|
-
|
|
100
|
-
// Verify data exists
|
|
101
|
-
let storedData = localStorage.getItem('cofhesdk-permits');
|
|
102
|
-
expect(storedData).toBeDefined();
|
|
103
|
-
|
|
104
|
-
// Remove permit
|
|
105
|
-
removePermit(chainId, account, permit.hash);
|
|
106
|
-
|
|
107
|
-
// Verify data is cleaned up
|
|
108
|
-
storedData = localStorage.getItem('cofhesdk-permits');
|
|
109
|
-
const parsedData = JSON.parse(storedData!);
|
|
110
|
-
expect(parsedData.state.permits[chainId][account][permit.hash]).toBeUndefined();
|
|
111
|
-
expect(parsedData.state.activePermitHash[chainId][account]).toBeUndefined();
|
|
112
|
-
});
|
|
113
|
-
});
|