@0xsequence/wallet-core 0.0.0-20250520201059
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/.turbo/turbo-build.log +5 -0
- package/CHANGELOG.md +9 -0
- package/LICENSE +202 -0
- package/dist/envelope.d.ts +34 -0
- package/dist/envelope.d.ts.map +1 -0
- package/dist/envelope.js +96 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/relayer/index.d.ts +4 -0
- package/dist/relayer/index.d.ts.map +1 -0
- package/dist/relayer/index.js +3 -0
- package/dist/relayer/local.d.ts +28 -0
- package/dist/relayer/local.d.ts.map +1 -0
- package/dist/relayer/local.js +101 -0
- package/dist/relayer/pk-relayer.d.ts +18 -0
- package/dist/relayer/pk-relayer.d.ts.map +1 -0
- package/dist/relayer/pk-relayer.js +88 -0
- package/dist/relayer/relayer.d.ts +39 -0
- package/dist/relayer/relayer.d.ts.map +1 -0
- package/dist/relayer/relayer.js +1 -0
- package/dist/signers/index.d.ts +23 -0
- package/dist/signers/index.d.ts.map +1 -0
- package/dist/signers/index.js +10 -0
- package/dist/signers/passkey.d.ts +41 -0
- package/dist/signers/passkey.d.ts.map +1 -0
- package/dist/signers/passkey.js +196 -0
- package/dist/signers/pk/encrypted.d.ts +37 -0
- package/dist/signers/pk/encrypted.d.ts.map +1 -0
- package/dist/signers/pk/encrypted.js +123 -0
- package/dist/signers/pk/index.d.ts +35 -0
- package/dist/signers/pk/index.d.ts.map +1 -0
- package/dist/signers/pk/index.js +51 -0
- package/dist/signers/session/explicit.d.ts +18 -0
- package/dist/signers/session/explicit.d.ts.map +1 -0
- package/dist/signers/session/explicit.js +126 -0
- package/dist/signers/session/implicit.d.ts +20 -0
- package/dist/signers/session/implicit.d.ts.map +1 -0
- package/dist/signers/session/implicit.js +120 -0
- package/dist/signers/session/index.d.ts +4 -0
- package/dist/signers/session/index.d.ts.map +1 -0
- package/dist/signers/session/index.js +3 -0
- package/dist/signers/session/session.d.ts +11 -0
- package/dist/signers/session/session.d.ts.map +1 -0
- package/dist/signers/session/session.js +1 -0
- package/dist/signers/session-manager.d.ts +33 -0
- package/dist/signers/session-manager.d.ts.map +1 -0
- package/dist/signers/session-manager.js +181 -0
- package/dist/state/cached.d.ts +59 -0
- package/dist/state/cached.d.ts.map +1 -0
- package/dist/state/cached.js +157 -0
- package/dist/state/index.d.ts +61 -0
- package/dist/state/index.d.ts.map +1 -0
- package/dist/state/index.js +4 -0
- package/dist/state/local/index.d.ts +98 -0
- package/dist/state/local/index.d.ts.map +1 -0
- package/dist/state/local/index.js +247 -0
- package/dist/state/local/indexed-db.d.ts +41 -0
- package/dist/state/local/indexed-db.d.ts.map +1 -0
- package/dist/state/local/indexed-db.js +149 -0
- package/dist/state/local/memory.d.ts +41 -0
- package/dist/state/local/memory.d.ts.map +1 -0
- package/dist/state/local/memory.js +77 -0
- package/dist/state/remote/dev-http.d.ts +57 -0
- package/dist/state/remote/dev-http.d.ts.map +1 -0
- package/dist/state/remote/dev-http.js +162 -0
- package/dist/state/remote/index.d.ts +2 -0
- package/dist/state/remote/index.d.ts.map +1 -0
- package/dist/state/remote/index.js +1 -0
- package/dist/state/utils.d.ts +12 -0
- package/dist/state/utils.d.ts.map +1 -0
- package/dist/state/utils.js +29 -0
- package/dist/wallet.d.ts +58 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +306 -0
- package/package.json +33 -0
- package/src/envelope.ts +148 -0
- package/src/index.ts +6 -0
- package/src/relayer/index.ts +3 -0
- package/src/relayer/local.ts +125 -0
- package/src/relayer/pk-relayer.ts +110 -0
- package/src/relayer/relayer.ts +52 -0
- package/src/signers/index.ts +44 -0
- package/src/signers/passkey.ts +284 -0
- package/src/signers/pk/encrypted.ts +153 -0
- package/src/signers/pk/index.ts +77 -0
- package/src/signers/session/explicit.ts +173 -0
- package/src/signers/session/implicit.ts +145 -0
- package/src/signers/session/index.ts +3 -0
- package/src/signers/session/session.ts +26 -0
- package/src/signers/session-manager.ts +241 -0
- package/src/state/cached.ts +233 -0
- package/src/state/index.ts +85 -0
- package/src/state/local/index.ts +422 -0
- package/src/state/local/indexed-db.ts +204 -0
- package/src/state/local/memory.ts +126 -0
- package/src/state/remote/dev-http.ts +253 -0
- package/src/state/remote/index.ts +1 -0
- package/src/state/utils.ts +50 -0
- package/src/wallet.ts +390 -0
- package/test/constants.ts +15 -0
- package/test/session-manager.test.ts +451 -0
- package/test/setup.ts +63 -0
- package/test/wallet.test.ts +90 -0
- package/tsconfig.json +10 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
const DB_VERSION = 1;
|
|
2
|
+
const STORE_CONFIGS = 'configs';
|
|
3
|
+
const STORE_WALLETS = 'counterfactualWallets';
|
|
4
|
+
const STORE_PAYLOADS = 'payloads';
|
|
5
|
+
const STORE_SIGNER_SUBDIGESTS = 'signerSubdigests';
|
|
6
|
+
const STORE_SIGNATURES = 'signatures';
|
|
7
|
+
const STORE_SAPIENT_SIGNER_SUBDIGESTS = 'sapientSignerSubdigests';
|
|
8
|
+
const STORE_SAPIENT_SIGNATURES = 'sapientSignatures';
|
|
9
|
+
const STORE_TREES = 'trees';
|
|
10
|
+
export class IndexedDbStore {
|
|
11
|
+
_db = null;
|
|
12
|
+
dbName;
|
|
13
|
+
constructor(dbName = 'sequence-indexeddb') {
|
|
14
|
+
this.dbName = dbName;
|
|
15
|
+
}
|
|
16
|
+
async openDB() {
|
|
17
|
+
if (this._db)
|
|
18
|
+
return this._db;
|
|
19
|
+
return new Promise((resolve, reject) => {
|
|
20
|
+
const request = indexedDB.open(this.dbName, DB_VERSION);
|
|
21
|
+
request.onupgradeneeded = () => {
|
|
22
|
+
const db = request.result;
|
|
23
|
+
if (!db.objectStoreNames.contains(STORE_CONFIGS)) {
|
|
24
|
+
db.createObjectStore(STORE_CONFIGS);
|
|
25
|
+
}
|
|
26
|
+
if (!db.objectStoreNames.contains(STORE_WALLETS)) {
|
|
27
|
+
db.createObjectStore(STORE_WALLETS);
|
|
28
|
+
}
|
|
29
|
+
if (!db.objectStoreNames.contains(STORE_PAYLOADS)) {
|
|
30
|
+
db.createObjectStore(STORE_PAYLOADS);
|
|
31
|
+
}
|
|
32
|
+
if (!db.objectStoreNames.contains(STORE_SIGNER_SUBDIGESTS)) {
|
|
33
|
+
db.createObjectStore(STORE_SIGNER_SUBDIGESTS);
|
|
34
|
+
}
|
|
35
|
+
if (!db.objectStoreNames.contains(STORE_SIGNATURES)) {
|
|
36
|
+
db.createObjectStore(STORE_SIGNATURES);
|
|
37
|
+
}
|
|
38
|
+
if (!db.objectStoreNames.contains(STORE_SAPIENT_SIGNER_SUBDIGESTS)) {
|
|
39
|
+
db.createObjectStore(STORE_SAPIENT_SIGNER_SUBDIGESTS);
|
|
40
|
+
}
|
|
41
|
+
if (!db.objectStoreNames.contains(STORE_SAPIENT_SIGNATURES)) {
|
|
42
|
+
db.createObjectStore(STORE_SAPIENT_SIGNATURES);
|
|
43
|
+
}
|
|
44
|
+
if (!db.objectStoreNames.contains(STORE_TREES)) {
|
|
45
|
+
db.createObjectStore(STORE_TREES);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
request.onsuccess = () => {
|
|
49
|
+
this._db = request.result;
|
|
50
|
+
resolve(this._db);
|
|
51
|
+
};
|
|
52
|
+
request.onerror = () => {
|
|
53
|
+
reject(request.error);
|
|
54
|
+
};
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
async get(storeName, key) {
|
|
58
|
+
const db = await this.openDB();
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
const tx = db.transaction(storeName, 'readonly');
|
|
61
|
+
const store = tx.objectStore(storeName);
|
|
62
|
+
const req = store.get(key);
|
|
63
|
+
req.onsuccess = () => resolve(req.result);
|
|
64
|
+
req.onerror = () => reject(req.error);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
async put(storeName, key, value) {
|
|
68
|
+
const db = await this.openDB();
|
|
69
|
+
return new Promise((resolve, reject) => {
|
|
70
|
+
const tx = db.transaction(storeName, 'readwrite');
|
|
71
|
+
const store = tx.objectStore(storeName);
|
|
72
|
+
const req = store.put(value, key);
|
|
73
|
+
req.onsuccess = () => resolve();
|
|
74
|
+
req.onerror = () => reject(req.error);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
async getSet(storeName, key) {
|
|
78
|
+
const data = (await this.get(storeName, key)) || new Set();
|
|
79
|
+
return Array.isArray(data) ? new Set(data) : data;
|
|
80
|
+
}
|
|
81
|
+
async putSet(storeName, key, setData) {
|
|
82
|
+
await this.put(storeName, key, Array.from(setData));
|
|
83
|
+
}
|
|
84
|
+
getSignatureKey(signer, subdigest) {
|
|
85
|
+
return `${signer.toLowerCase()}-${subdigest.toLowerCase()}`;
|
|
86
|
+
}
|
|
87
|
+
getSapientSignatureKey(signer, subdigest, imageHash) {
|
|
88
|
+
return `${signer.toLowerCase()}-${imageHash.toLowerCase()}-${subdigest.toLowerCase()}`;
|
|
89
|
+
}
|
|
90
|
+
async loadConfig(imageHash) {
|
|
91
|
+
return this.get(STORE_CONFIGS, imageHash.toLowerCase());
|
|
92
|
+
}
|
|
93
|
+
async saveConfig(imageHash, config) {
|
|
94
|
+
await this.put(STORE_CONFIGS, imageHash.toLowerCase(), config);
|
|
95
|
+
}
|
|
96
|
+
async loadCounterfactualWallet(wallet) {
|
|
97
|
+
return this.get(STORE_WALLETS, wallet.toLowerCase());
|
|
98
|
+
}
|
|
99
|
+
async saveCounterfactualWallet(wallet, imageHash, context) {
|
|
100
|
+
await this.put(STORE_WALLETS, wallet.toLowerCase(), { imageHash, context });
|
|
101
|
+
}
|
|
102
|
+
async loadPayloadOfSubdigest(subdigest) {
|
|
103
|
+
return this.get(STORE_PAYLOADS, subdigest.toLowerCase());
|
|
104
|
+
}
|
|
105
|
+
async savePayloadOfSubdigest(subdigest, payload) {
|
|
106
|
+
await this.put(STORE_PAYLOADS, subdigest.toLowerCase(), payload);
|
|
107
|
+
}
|
|
108
|
+
async loadSubdigestsOfSigner(signer) {
|
|
109
|
+
const dataSet = await this.getSet(STORE_SIGNER_SUBDIGESTS, signer.toLowerCase());
|
|
110
|
+
return Array.from(dataSet);
|
|
111
|
+
}
|
|
112
|
+
async loadSignatureOfSubdigest(signer, subdigest) {
|
|
113
|
+
const key = this.getSignatureKey(signer, subdigest);
|
|
114
|
+
return this.get(STORE_SIGNATURES, key.toLowerCase());
|
|
115
|
+
}
|
|
116
|
+
async saveSignatureOfSubdigest(signer, subdigest, signature) {
|
|
117
|
+
const key = this.getSignatureKey(signer, subdigest);
|
|
118
|
+
await this.put(STORE_SIGNATURES, key.toLowerCase(), signature);
|
|
119
|
+
const signerKey = signer.toLowerCase();
|
|
120
|
+
const subdigestKey = subdigest.toLowerCase();
|
|
121
|
+
const dataSet = await this.getSet(STORE_SIGNER_SUBDIGESTS, signerKey);
|
|
122
|
+
dataSet.add(subdigestKey);
|
|
123
|
+
await this.putSet(STORE_SIGNER_SUBDIGESTS, signerKey, dataSet);
|
|
124
|
+
}
|
|
125
|
+
async loadSubdigestsOfSapientSigner(signer, imageHash) {
|
|
126
|
+
const key = `${signer.toLowerCase()}-${imageHash.toLowerCase()}`;
|
|
127
|
+
const dataSet = await this.getSet(STORE_SAPIENT_SIGNER_SUBDIGESTS, key);
|
|
128
|
+
return Array.from(dataSet);
|
|
129
|
+
}
|
|
130
|
+
async loadSapientSignatureOfSubdigest(signer, subdigest, imageHash) {
|
|
131
|
+
const key = this.getSapientSignatureKey(signer, subdigest, imageHash);
|
|
132
|
+
return this.get(STORE_SAPIENT_SIGNATURES, key.toLowerCase());
|
|
133
|
+
}
|
|
134
|
+
async saveSapientSignatureOfSubdigest(signer, subdigest, imageHash, signature) {
|
|
135
|
+
const fullKey = this.getSapientSignatureKey(signer, subdigest, imageHash).toLowerCase();
|
|
136
|
+
await this.put(STORE_SAPIENT_SIGNATURES, fullKey, signature);
|
|
137
|
+
const signerKey = `${signer.toLowerCase()}-${imageHash.toLowerCase()}`;
|
|
138
|
+
const subdigestKey = subdigest.toLowerCase();
|
|
139
|
+
const dataSet = await this.getSet(STORE_SAPIENT_SIGNER_SUBDIGESTS, signerKey);
|
|
140
|
+
dataSet.add(subdigestKey);
|
|
141
|
+
await this.putSet(STORE_SAPIENT_SIGNER_SUBDIGESTS, signerKey, dataSet);
|
|
142
|
+
}
|
|
143
|
+
async loadTree(rootHash) {
|
|
144
|
+
return this.get(STORE_TREES, rootHash.toLowerCase());
|
|
145
|
+
}
|
|
146
|
+
async saveTree(rootHash, tree) {
|
|
147
|
+
await this.put(STORE_TREES, rootHash.toLowerCase(), tree);
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Context, Payload, Signature, Config, GenericTree } from '@0xsequence/wallet-primitives';
|
|
2
|
+
import { Address, Hex } from 'ox';
|
|
3
|
+
import { Store } from './index.js';
|
|
4
|
+
export declare class MemoryStore implements Store {
|
|
5
|
+
private configs;
|
|
6
|
+
private counterfactualWallets;
|
|
7
|
+
private payloads;
|
|
8
|
+
private signerSubdigests;
|
|
9
|
+
private signatures;
|
|
10
|
+
private sapientSignerSubdigests;
|
|
11
|
+
private sapientSignatures;
|
|
12
|
+
private trees;
|
|
13
|
+
private getSignatureKey;
|
|
14
|
+
private getSapientSignatureKey;
|
|
15
|
+
loadConfig(imageHash: Hex.Hex): Promise<Config.Config | undefined>;
|
|
16
|
+
saveConfig(imageHash: Hex.Hex, config: Config.Config): Promise<void>;
|
|
17
|
+
loadCounterfactualWallet(wallet: Address.Address): Promise<{
|
|
18
|
+
imageHash: Hex.Hex;
|
|
19
|
+
context: Context.Context;
|
|
20
|
+
} | undefined>;
|
|
21
|
+
saveCounterfactualWallet(wallet: Address.Address, imageHash: Hex.Hex, context: Context.Context): Promise<void>;
|
|
22
|
+
loadPayloadOfSubdigest(subdigest: Hex.Hex): Promise<{
|
|
23
|
+
content: Payload.Parented;
|
|
24
|
+
chainId: bigint;
|
|
25
|
+
wallet: Address.Address;
|
|
26
|
+
} | undefined>;
|
|
27
|
+
savePayloadOfSubdigest(subdigest: Hex.Hex, payload: {
|
|
28
|
+
content: Payload.Parented;
|
|
29
|
+
chainId: bigint;
|
|
30
|
+
wallet: Address.Address;
|
|
31
|
+
}): Promise<void>;
|
|
32
|
+
loadSubdigestsOfSigner(signer: Address.Address): Promise<Hex.Hex[]>;
|
|
33
|
+
loadSignatureOfSubdigest(signer: Address.Address, subdigest: Hex.Hex): Promise<Signature.SignatureOfSignerLeaf | undefined>;
|
|
34
|
+
saveSignatureOfSubdigest(signer: Address.Address, subdigest: Hex.Hex, signature: Signature.SignatureOfSignerLeaf): Promise<void>;
|
|
35
|
+
loadSubdigestsOfSapientSigner(signer: Address.Address, imageHash: Hex.Hex): Promise<Hex.Hex[]>;
|
|
36
|
+
loadSapientSignatureOfSubdigest(signer: Address.Address, subdigest: Hex.Hex, imageHash: Hex.Hex): Promise<Signature.SignatureOfSapientSignerLeaf | undefined>;
|
|
37
|
+
saveSapientSignatureOfSubdigest(signer: Address.Address, subdigest: Hex.Hex, imageHash: Hex.Hex, signature: Signature.SignatureOfSapientSignerLeaf): Promise<void>;
|
|
38
|
+
loadTree(rootHash: Hex.Hex): Promise<GenericTree.Tree | undefined>;
|
|
39
|
+
saveTree(rootHash: Hex.Hex, tree: GenericTree.Tree): Promise<void>;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memory.d.ts","sourceRoot":"","sources":["../../../src/state/local/memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
export class MemoryStore {
|
|
2
|
+
configs = new Map();
|
|
3
|
+
counterfactualWallets = new Map();
|
|
4
|
+
payloads = new Map();
|
|
5
|
+
signerSubdigests = new Map();
|
|
6
|
+
signatures = new Map();
|
|
7
|
+
sapientSignerSubdigests = new Map();
|
|
8
|
+
sapientSignatures = new Map();
|
|
9
|
+
trees = new Map();
|
|
10
|
+
getSignatureKey(signer, subdigest) {
|
|
11
|
+
return `${signer.toLowerCase()}-${subdigest.toLowerCase()}`;
|
|
12
|
+
}
|
|
13
|
+
getSapientSignatureKey(signer, subdigest, imageHash) {
|
|
14
|
+
return `${signer.toLowerCase()}-${imageHash.toLowerCase()}-${subdigest.toLowerCase()}`;
|
|
15
|
+
}
|
|
16
|
+
async loadConfig(imageHash) {
|
|
17
|
+
return this.configs.get(imageHash.toLowerCase());
|
|
18
|
+
}
|
|
19
|
+
async saveConfig(imageHash, config) {
|
|
20
|
+
this.configs.set(imageHash.toLowerCase(), config);
|
|
21
|
+
}
|
|
22
|
+
async loadCounterfactualWallet(wallet) {
|
|
23
|
+
return this.counterfactualWallets.get(wallet.toLowerCase());
|
|
24
|
+
}
|
|
25
|
+
async saveCounterfactualWallet(wallet, imageHash, context) {
|
|
26
|
+
this.counterfactualWallets.set(wallet.toLowerCase(), { imageHash, context });
|
|
27
|
+
}
|
|
28
|
+
async loadPayloadOfSubdigest(subdigest) {
|
|
29
|
+
return this.payloads.get(subdigest.toLowerCase());
|
|
30
|
+
}
|
|
31
|
+
async savePayloadOfSubdigest(subdigest, payload) {
|
|
32
|
+
this.payloads.set(subdigest.toLowerCase(), payload);
|
|
33
|
+
}
|
|
34
|
+
async loadSubdigestsOfSigner(signer) {
|
|
35
|
+
const subdigests = this.signerSubdigests.get(signer.toLowerCase());
|
|
36
|
+
return subdigests ? Array.from(subdigests).map((s) => s) : [];
|
|
37
|
+
}
|
|
38
|
+
async loadSignatureOfSubdigest(signer, subdigest) {
|
|
39
|
+
const key = this.getSignatureKey(signer, subdigest);
|
|
40
|
+
return this.signatures.get(key);
|
|
41
|
+
}
|
|
42
|
+
async saveSignatureOfSubdigest(signer, subdigest, signature) {
|
|
43
|
+
const key = this.getSignatureKey(signer, subdigest);
|
|
44
|
+
this.signatures.set(key, signature);
|
|
45
|
+
const signerKey = signer.toLowerCase();
|
|
46
|
+
const subdigestKey = subdigest.toLowerCase();
|
|
47
|
+
if (!this.signerSubdigests.has(signerKey)) {
|
|
48
|
+
this.signerSubdigests.set(signerKey, new Set());
|
|
49
|
+
}
|
|
50
|
+
this.signerSubdigests.get(signerKey).add(subdigestKey);
|
|
51
|
+
}
|
|
52
|
+
async loadSubdigestsOfSapientSigner(signer, imageHash) {
|
|
53
|
+
const key = `${signer.toLowerCase()}-${imageHash.toLowerCase()}`;
|
|
54
|
+
const subdigests = this.sapientSignerSubdigests.get(key);
|
|
55
|
+
return subdigests ? Array.from(subdigests).map((s) => s) : [];
|
|
56
|
+
}
|
|
57
|
+
async loadSapientSignatureOfSubdigest(signer, subdigest, imageHash) {
|
|
58
|
+
const key = this.getSapientSignatureKey(signer, subdigest, imageHash);
|
|
59
|
+
return this.sapientSignatures.get(key);
|
|
60
|
+
}
|
|
61
|
+
async saveSapientSignatureOfSubdigest(signer, subdigest, imageHash, signature) {
|
|
62
|
+
const key = this.getSapientSignatureKey(signer, subdigest, imageHash);
|
|
63
|
+
this.sapientSignatures.set(key, signature);
|
|
64
|
+
const signerKey = `${signer.toLowerCase()}-${imageHash.toLowerCase()}`;
|
|
65
|
+
const subdigestKey = subdigest.toLowerCase();
|
|
66
|
+
if (!this.sapientSignerSubdigests.has(signerKey)) {
|
|
67
|
+
this.sapientSignerSubdigests.set(signerKey, new Set());
|
|
68
|
+
}
|
|
69
|
+
this.sapientSignerSubdigests.get(signerKey).add(subdigestKey);
|
|
70
|
+
}
|
|
71
|
+
async loadTree(rootHash) {
|
|
72
|
+
return this.trees.get(rootHash.toLowerCase());
|
|
73
|
+
}
|
|
74
|
+
async saveTree(rootHash, tree) {
|
|
75
|
+
this.trees.set(rootHash.toLowerCase(), tree);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { Address, Hex } from 'ox';
|
|
2
|
+
import { Config, Context, GenericTree, Payload, Signature } from '@0xsequence/wallet-primitives';
|
|
3
|
+
import { Provider } from '../index.js';
|
|
4
|
+
export declare class DevHttpProvider implements Provider {
|
|
5
|
+
private readonly baseUrl;
|
|
6
|
+
constructor(baseUrl: string);
|
|
7
|
+
private request;
|
|
8
|
+
getConfiguration(imageHash: Hex.Hex): Promise<Config.Config | undefined>;
|
|
9
|
+
getDeploy(wallet: Address.Address): Promise<{
|
|
10
|
+
imageHash: Hex.Hex;
|
|
11
|
+
context: Context.Context;
|
|
12
|
+
} | undefined>;
|
|
13
|
+
getWallets(signer: Address.Address): Promise<{
|
|
14
|
+
[wallet: Address.Address]: {
|
|
15
|
+
chainId: bigint;
|
|
16
|
+
payload: Payload.Parented;
|
|
17
|
+
signature: Signature.SignatureOfSignerLeaf;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
getWalletsForSapient(signer: Address.Address, imageHash: Hex.Hex): Promise<{
|
|
21
|
+
[wallet: Address.Address]: {
|
|
22
|
+
chainId: bigint;
|
|
23
|
+
payload: Payload.Parented;
|
|
24
|
+
signature: Signature.SignatureOfSapientSignerLeaf;
|
|
25
|
+
};
|
|
26
|
+
}>;
|
|
27
|
+
getWitnessFor(wallet: Address.Address, signer: Address.Address): Promise<{
|
|
28
|
+
chainId: bigint;
|
|
29
|
+
payload: Payload.Parented;
|
|
30
|
+
signature: Signature.SignatureOfSignerLeaf;
|
|
31
|
+
} | undefined>;
|
|
32
|
+
getWitnessForSapient(wallet: Address.Address, signer: Address.Address, imageHash: Hex.Hex): Promise<{
|
|
33
|
+
chainId: bigint;
|
|
34
|
+
payload: Payload.Parented;
|
|
35
|
+
signature: Signature.SignatureOfSapientSignerLeaf;
|
|
36
|
+
} | undefined>;
|
|
37
|
+
getConfigurationUpdates(wallet: Address.Address, fromImageHash: Hex.Hex, options?: {
|
|
38
|
+
allUpdates?: boolean;
|
|
39
|
+
}): Promise<Array<{
|
|
40
|
+
imageHash: Hex.Hex;
|
|
41
|
+
signature: Signature.RawSignature;
|
|
42
|
+
}>>;
|
|
43
|
+
getTree(rootHash: Hex.Hex): Promise<GenericTree.Tree | undefined>;
|
|
44
|
+
saveWallet(deployConfiguration: Config.Config, context: Context.Context): Promise<void>;
|
|
45
|
+
saveWitnesses(wallet: Address.Address, chainId: bigint, payload: Payload.Parented, signatures: Signature.RawTopology): Promise<void>;
|
|
46
|
+
saveUpdate(wallet: Address.Address, configuration: Config.Config, signature: Signature.RawSignature): Promise<void>;
|
|
47
|
+
saveTree(tree: GenericTree.Tree): Promise<void>;
|
|
48
|
+
saveConfiguration(config: Config.Config): Promise<void>;
|
|
49
|
+
saveDeploy(imageHash: Hex.Hex, context: Context.Context): Promise<void>;
|
|
50
|
+
getPayload(opHash: Hex.Hex): Promise<{
|
|
51
|
+
chainId: bigint;
|
|
52
|
+
payload: Payload.Parented;
|
|
53
|
+
wallet: Address.Address;
|
|
54
|
+
} | undefined>;
|
|
55
|
+
savePayload(wallet: Address.Address, payload: Payload.Parented, chainId: bigint): Promise<void>;
|
|
56
|
+
}
|
|
57
|
+
//# sourceMappingURL=dev-http.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dev-http.d.ts","sourceRoot":"","sources":["../../../src/state/remote/dev-http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { Utils } from '@0xsequence/wallet-primitives';
|
|
2
|
+
export class DevHttpProvider {
|
|
3
|
+
baseUrl;
|
|
4
|
+
constructor(baseUrl) {
|
|
5
|
+
// Remove trailing slash if present
|
|
6
|
+
this.baseUrl = baseUrl.endsWith('/') ? baseUrl.slice(0, -1) : baseUrl;
|
|
7
|
+
}
|
|
8
|
+
async request(method, path, body) {
|
|
9
|
+
const url = `${this.baseUrl}${path}`;
|
|
10
|
+
const options = {
|
|
11
|
+
method,
|
|
12
|
+
headers: {},
|
|
13
|
+
};
|
|
14
|
+
if (body && method === 'POST') {
|
|
15
|
+
options.headers = { 'Content-Type': 'application/json' };
|
|
16
|
+
options.body = Utils.toJSON(body);
|
|
17
|
+
}
|
|
18
|
+
let response;
|
|
19
|
+
try {
|
|
20
|
+
response = await fetch(url, options);
|
|
21
|
+
}
|
|
22
|
+
catch (networkError) {
|
|
23
|
+
// Handle immediate network errors (e.g., DNS resolution failure, refused connection)
|
|
24
|
+
console.error(`Network error during ${method} request to ${url}:`, networkError);
|
|
25
|
+
throw networkError; // Re-throw network errors
|
|
26
|
+
}
|
|
27
|
+
// --- Error Handling for HTTP Status ---
|
|
28
|
+
if (!response.ok) {
|
|
29
|
+
let errorPayload = { message: `HTTP error! Status: ${response.status}` };
|
|
30
|
+
try {
|
|
31
|
+
const errorText = await response.text();
|
|
32
|
+
const errorJson = await Utils.fromJSON(errorText);
|
|
33
|
+
errorPayload = { ...errorPayload, ...errorJson };
|
|
34
|
+
}
|
|
35
|
+
catch (e) {
|
|
36
|
+
try {
|
|
37
|
+
// If JSON parsing fails, try getting text for better error message
|
|
38
|
+
const errorText = await response.text();
|
|
39
|
+
errorPayload.body = errorText;
|
|
40
|
+
}
|
|
41
|
+
catch (textErr) {
|
|
42
|
+
// Ignore if reading text also fails
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
console.error('HTTP Request Failed:', errorPayload);
|
|
46
|
+
throw new Error(errorPayload.message || `Request failed for ${method} ${path} with status ${response.status}`);
|
|
47
|
+
}
|
|
48
|
+
// --- Response Body Handling (with fix for empty body) ---
|
|
49
|
+
try {
|
|
50
|
+
// Handle cases where POST might return 201/204 No Content
|
|
51
|
+
// 204 should definitely have no body. 201 might or might not.
|
|
52
|
+
if (response.status === 204) {
|
|
53
|
+
return undefined; // No content expected
|
|
54
|
+
}
|
|
55
|
+
if (response.status === 201 && method === 'POST') {
|
|
56
|
+
// Attempt to parse JSON (e.g., for { success: true }), but handle empty body gracefully
|
|
57
|
+
const text = await response.clone().text(); // Clone and check text first
|
|
58
|
+
if (text.trim() === '') {
|
|
59
|
+
return undefined; // Treat empty 201 as success with no specific return data
|
|
60
|
+
}
|
|
61
|
+
// If not empty, try parsing JSON
|
|
62
|
+
const responseText = await response.text();
|
|
63
|
+
return (await Utils.fromJSON(responseText));
|
|
64
|
+
}
|
|
65
|
+
// For 200 OK or other success statuses expecting a body
|
|
66
|
+
// Clone the response before attempting to read the body,
|
|
67
|
+
// so we can potentially read it again (as text) if json() fails.
|
|
68
|
+
const clonedResponse = response.clone();
|
|
69
|
+
const textContent = await clonedResponse.text(); // Read as text first
|
|
70
|
+
if (textContent.trim() === '') {
|
|
71
|
+
// If the body is empty (or only whitespace) and status was OK (checked above),
|
|
72
|
+
// treat this as the server sending 'undefined' or 'null'.
|
|
73
|
+
// Return `undefined` to match the expected optional types in the Provider interface.
|
|
74
|
+
return undefined;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
// If there is content, attempt to parse it as JSON.
|
|
78
|
+
// We use the original response here, which hasn't had its body consumed yet.
|
|
79
|
+
const responseText = await response.text();
|
|
80
|
+
const data = await Utils.fromJSON(responseText);
|
|
81
|
+
// BigInt Deserialization note remains the same: manual conversion may be needed by consumer.
|
|
82
|
+
return data;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
// This catch block now primarily handles errors from response.json()
|
|
87
|
+
// if the non-empty textContent wasn't valid JSON.
|
|
88
|
+
console.error(`Error processing response body for ${method} ${url}:`, error);
|
|
89
|
+
// Also include the raw text in the error if possible
|
|
90
|
+
try {
|
|
91
|
+
const text = await response.text(); // Try reading original response if not already done
|
|
92
|
+
throw new Error(`Failed to parse JSON response from server. Status: ${response.status}. Body: "${text}". Original error: ${error instanceof Error ? error.message : String(error)}`);
|
|
93
|
+
}
|
|
94
|
+
catch (readError) {
|
|
95
|
+
throw new Error(`Failed to parse JSON response from server and could not read response body as text. Status: ${response.status}. Original error: ${error instanceof Error ? error.message : String(error)}`);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// --- Reader Methods ---
|
|
100
|
+
async getConfiguration(imageHash) {
|
|
101
|
+
// The response needs careful handling if BigInts are involved (threshold, checkpoint)
|
|
102
|
+
const config = await this.request('GET', `/configuration/${imageHash}`);
|
|
103
|
+
// Manual conversion example (if needed by consumer):
|
|
104
|
+
// if (config?.threshold) config.threshold = BigInt(config.threshold);
|
|
105
|
+
// if (config?.checkpoint) config.checkpoint = BigInt(config.checkpoint);
|
|
106
|
+
return config;
|
|
107
|
+
}
|
|
108
|
+
async getDeploy(wallet) {
|
|
109
|
+
return this.request('GET', `/deploy/${wallet}`);
|
|
110
|
+
}
|
|
111
|
+
async getWallets(signer) {
|
|
112
|
+
// Response `chainId` will be a string/number, needs conversion if BigInt is strictly required upstream
|
|
113
|
+
return this.request('GET', `/wallets/signer/${signer}`);
|
|
114
|
+
}
|
|
115
|
+
async getWalletsForSapient(signer, imageHash) {
|
|
116
|
+
// Response `chainId` will be a string/number, needs conversion
|
|
117
|
+
return this.request('GET', `/wallets/sapient/${signer}/${imageHash}`);
|
|
118
|
+
}
|
|
119
|
+
async getWitnessFor(wallet, signer) {
|
|
120
|
+
// Response `chainId` will be a string/number, needs conversion
|
|
121
|
+
return this.request('GET', `/witness/${wallet}/signer/${signer}`);
|
|
122
|
+
}
|
|
123
|
+
async getWitnessForSapient(wallet, signer, imageHash) {
|
|
124
|
+
// Response `chainId` will be a string/number, needs conversion
|
|
125
|
+
return this.request('GET', `/witness/sapient/${wallet}/${signer}/${imageHash}`);
|
|
126
|
+
}
|
|
127
|
+
async getConfigurationUpdates(wallet, fromImageHash, options) {
|
|
128
|
+
const query = options?.allUpdates ? '?allUpdates=true' : '';
|
|
129
|
+
// Response signature object might contain BigInts (threshold, checkpoint) as strings
|
|
130
|
+
return this.request('GET', `/configuration-updates/${wallet}/from/${fromImageHash}${query}`);
|
|
131
|
+
}
|
|
132
|
+
async getTree(rootHash) {
|
|
133
|
+
return this.request('GET', `/tree/${rootHash}`);
|
|
134
|
+
}
|
|
135
|
+
// --- Writer Methods ---
|
|
136
|
+
async saveWallet(deployConfiguration, context) {
|
|
137
|
+
await this.request('POST', '/wallet', { deployConfiguration, context });
|
|
138
|
+
}
|
|
139
|
+
async saveWitnesses(wallet, chainId, payload, signatures) {
|
|
140
|
+
// chainId will be correctly stringified by the jsonReplacer
|
|
141
|
+
await this.request('POST', '/witnesses', { wallet, chainId, payload, signatures });
|
|
142
|
+
}
|
|
143
|
+
async saveUpdate(wallet, configuration, signature) {
|
|
144
|
+
// configuration and signature might contain BigInts, handled by replacer
|
|
145
|
+
await this.request('POST', '/update', { wallet, configuration, signature });
|
|
146
|
+
}
|
|
147
|
+
async saveTree(tree) {
|
|
148
|
+
await this.request('POST', '/tree', { tree });
|
|
149
|
+
}
|
|
150
|
+
saveConfiguration(config) {
|
|
151
|
+
return this.request('POST', '/configuration', { config });
|
|
152
|
+
}
|
|
153
|
+
saveDeploy(imageHash, context) {
|
|
154
|
+
return this.request('POST', '/deploy', { imageHash, context });
|
|
155
|
+
}
|
|
156
|
+
async getPayload(opHash) {
|
|
157
|
+
return this.request('GET', `/payload/${opHash}`);
|
|
158
|
+
}
|
|
159
|
+
async savePayload(wallet, payload, chainId) {
|
|
160
|
+
return this.request('POST', '/payload', { wallet, payload, chainId });
|
|
161
|
+
}
|
|
162
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/state/remote/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './dev-http.js';
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Payload, Signature } from '@0xsequence/wallet-primitives';
|
|
2
|
+
import { Address } from 'ox';
|
|
3
|
+
import { Reader } from './index.js';
|
|
4
|
+
import { SapientSigner, Signer } from '../signers/index.js';
|
|
5
|
+
export type WalletWithWitness<S extends Signer | SapientSigner> = {
|
|
6
|
+
wallet: Address.Address;
|
|
7
|
+
chainId: bigint;
|
|
8
|
+
payload: Payload.Parented;
|
|
9
|
+
signature: S extends SapientSigner ? Signature.SignatureOfSapientSignerLeaf : Signature.SignatureOfSignerLeaf;
|
|
10
|
+
};
|
|
11
|
+
export declare function getWalletsFor<S extends Signer | SapientSigner>(stateReader: Reader, signer: S): Promise<Array<WalletWithWitness<S>>>;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/state/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,OAAO,EAAO,MAAM,IAAI,CAAA;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AACnC,OAAO,EAAmB,aAAa,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5E,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,IAAI;IAChE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAA;IACvB,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,OAAO,CAAC,QAAQ,CAAA;IACzB,SAAS,EAAE,CAAC,SAAS,aAAa,GAAG,SAAS,CAAC,4BAA4B,GAAG,SAAS,CAAC,qBAAqB,CAAA;CAC9G,CAAA;AAED,wBAAsB,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,aAAa,EAClE,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,CAAC,GACR,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,CAWtC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Hex } from 'ox';
|
|
2
|
+
import { isSapientSigner } from '../signers/index.js';
|
|
3
|
+
export async function getWalletsFor(stateReader, signer) {
|
|
4
|
+
const wallets = await retrieveWallets(stateReader, signer);
|
|
5
|
+
return Object.entries(wallets).map(([wallet, { chainId, payload, signature }]) => {
|
|
6
|
+
Hex.assert(wallet);
|
|
7
|
+
return {
|
|
8
|
+
wallet,
|
|
9
|
+
chainId,
|
|
10
|
+
payload,
|
|
11
|
+
signature,
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async function retrieveWallets(stateReader, signer) {
|
|
16
|
+
if (isSapientSigner(signer)) {
|
|
17
|
+
const [signerAddress, signerImageHash] = await Promise.all([signer.address, signer.imageHash]);
|
|
18
|
+
if (signerImageHash) {
|
|
19
|
+
return stateReader.getWalletsForSapient(signerAddress, signerImageHash);
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
console.warn('Sapient signer has no imageHash');
|
|
23
|
+
return {};
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
return stateReader.getWallets(await signer.address);
|
|
28
|
+
}
|
|
29
|
+
}
|
package/dist/wallet.d.ts
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Config, Context, Payload, Signature as SequenceSignature } from '@0xsequence/wallet-primitives';
|
|
2
|
+
import { Address, Bytes, Hex, Provider } from 'ox';
|
|
3
|
+
import * as Envelope from './envelope.js';
|
|
4
|
+
import * as State from './state/index.js';
|
|
5
|
+
export type WalletOptions = {
|
|
6
|
+
context: Context.Context;
|
|
7
|
+
stateProvider: State.Provider;
|
|
8
|
+
guest: Address.Address;
|
|
9
|
+
};
|
|
10
|
+
export declare const DefaultWalletOptions: WalletOptions;
|
|
11
|
+
export type WalletStatus = {
|
|
12
|
+
address: Address.Address;
|
|
13
|
+
isDeployed: boolean;
|
|
14
|
+
implementation?: Address.Address;
|
|
15
|
+
stage?: 'stage1' | 'stage2';
|
|
16
|
+
configuration: Config.Config;
|
|
17
|
+
imageHash: Hex.Hex;
|
|
18
|
+
/** Pending updates in reverse chronological order (newest first) */
|
|
19
|
+
pendingUpdates: Array<{
|
|
20
|
+
imageHash: Hex.Hex;
|
|
21
|
+
signature: SequenceSignature.RawSignature;
|
|
22
|
+
}>;
|
|
23
|
+
chainId?: bigint;
|
|
24
|
+
};
|
|
25
|
+
export type WalletStatusWithOnchain = WalletStatus & {
|
|
26
|
+
onChainImageHash: Hex.Hex;
|
|
27
|
+
};
|
|
28
|
+
export declare class Wallet {
|
|
29
|
+
readonly address: Address.Address;
|
|
30
|
+
readonly context: Context.Context;
|
|
31
|
+
readonly guest: Address.Address;
|
|
32
|
+
readonly stateProvider: State.Provider;
|
|
33
|
+
constructor(address: Address.Address, options?: Partial<WalletOptions>);
|
|
34
|
+
static fromConfiguration(configuration: Config.Config, options?: Partial<WalletOptions>): Promise<Wallet>;
|
|
35
|
+
isDeployed(provider: Provider.Provider): Promise<boolean>;
|
|
36
|
+
buildDeployTransaction(): Promise<{
|
|
37
|
+
to: Address.Address;
|
|
38
|
+
data: Hex.Hex;
|
|
39
|
+
}>;
|
|
40
|
+
prepareUpdate(configuration: Config.Config): Promise<Envelope.Envelope<Payload.ConfigUpdate>>;
|
|
41
|
+
submitUpdate(envelope: Envelope.Signed<Payload.ConfigUpdate>, options?: {
|
|
42
|
+
validateSave?: boolean;
|
|
43
|
+
}): Promise<void>;
|
|
44
|
+
getStatus<T extends Provider.Provider | undefined = undefined>(provider?: T): Promise<T extends Provider.Provider ? WalletStatusWithOnchain : WalletStatus>;
|
|
45
|
+
getNonce(provider: Provider.Provider, space: bigint): Promise<bigint>;
|
|
46
|
+
prepareTransaction(provider: Provider.Provider, calls: Payload.Call[], options?: {
|
|
47
|
+
space?: bigint;
|
|
48
|
+
noConfigUpdate?: boolean;
|
|
49
|
+
}): Promise<Envelope.Envelope<Payload.Calls>>;
|
|
50
|
+
buildTransaction(provider: Provider.Provider, envelope: Envelope.Signed<Payload.Calls>): Promise<{
|
|
51
|
+
to: `0x${string}`;
|
|
52
|
+
data: `0x${string}`;
|
|
53
|
+
}>;
|
|
54
|
+
prepareMessageSignature(message: string | Hex.Hex | Payload.TypedDataToSign, chainId: bigint): Promise<Envelope.Envelope<Payload.Message>>;
|
|
55
|
+
buildMessageSignature(envelope: Envelope.Signed<Payload.Message>, provider?: Provider.Provider): Promise<Bytes.Bytes>;
|
|
56
|
+
private prepareBlankEnvelope;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=wallet.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|