@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,233 @@
|
|
|
1
|
+
import { Address, Hex } from 'ox'
|
|
2
|
+
import { MaybePromise, Provider } from './index.js'
|
|
3
|
+
import { Config, Context, GenericTree, Payload, Signature } from '@0xsequence/wallet-primitives'
|
|
4
|
+
|
|
5
|
+
export class Cached implements Provider {
|
|
6
|
+
constructor(
|
|
7
|
+
private readonly args: {
|
|
8
|
+
readonly source: Provider
|
|
9
|
+
readonly cache: Provider
|
|
10
|
+
},
|
|
11
|
+
) {}
|
|
12
|
+
|
|
13
|
+
async getConfiguration(imageHash: Hex.Hex): Promise<Config.Config | undefined> {
|
|
14
|
+
const cached = await this.args.cache.getConfiguration(imageHash)
|
|
15
|
+
if (cached) {
|
|
16
|
+
return cached
|
|
17
|
+
}
|
|
18
|
+
const config = await this.args.source.getConfiguration(imageHash)
|
|
19
|
+
|
|
20
|
+
if (config) {
|
|
21
|
+
await this.args.cache.saveConfiguration(config)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
return config
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async getDeploy(wallet: Address.Address): Promise<{ imageHash: Hex.Hex; context: Context.Context } | undefined> {
|
|
28
|
+
const cached = await this.args.cache.getDeploy(wallet)
|
|
29
|
+
if (cached) {
|
|
30
|
+
return cached
|
|
31
|
+
}
|
|
32
|
+
const deploy = await this.args.source.getDeploy(wallet)
|
|
33
|
+
if (deploy) {
|
|
34
|
+
await this.args.cache.saveDeploy(deploy.imageHash, deploy.context)
|
|
35
|
+
}
|
|
36
|
+
return deploy
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async getWallets(signer: Address.Address): Promise<{
|
|
40
|
+
[wallet: Address.Address]: {
|
|
41
|
+
chainId: bigint
|
|
42
|
+
payload: Payload.Parented
|
|
43
|
+
signature: Signature.SignatureOfSignerLeaf
|
|
44
|
+
}
|
|
45
|
+
}> {
|
|
46
|
+
// Get both from cache and source
|
|
47
|
+
const cached = await this.args.cache.getWallets(signer)
|
|
48
|
+
const source = await this.args.source.getWallets(signer)
|
|
49
|
+
|
|
50
|
+
// Merge and deduplicate
|
|
51
|
+
const deduplicated = { ...cached, ...source }
|
|
52
|
+
|
|
53
|
+
// Sync values to source that are not in cache, and vice versa
|
|
54
|
+
for (const [wallet, data] of Object.entries(deduplicated)) {
|
|
55
|
+
const walletAddress = Address.from(wallet)
|
|
56
|
+
if (!source[walletAddress]) {
|
|
57
|
+
await this.args.source.saveWitnesses(walletAddress, data.chainId, data.payload, {
|
|
58
|
+
type: 'unrecovered-signer',
|
|
59
|
+
weight: 1n,
|
|
60
|
+
signature: data.signature,
|
|
61
|
+
})
|
|
62
|
+
}
|
|
63
|
+
if (!cached[walletAddress]) {
|
|
64
|
+
await this.args.cache.saveWitnesses(walletAddress, data.chainId, data.payload, {
|
|
65
|
+
type: 'unrecovered-signer',
|
|
66
|
+
weight: 1n,
|
|
67
|
+
signature: data.signature,
|
|
68
|
+
})
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
return deduplicated
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
async getWalletsForSapient(
|
|
76
|
+
signer: Address.Address,
|
|
77
|
+
imageHash: Hex.Hex,
|
|
78
|
+
): Promise<{
|
|
79
|
+
[wallet: Address.Address]: {
|
|
80
|
+
chainId: bigint
|
|
81
|
+
payload: Payload.Parented
|
|
82
|
+
signature: Signature.SignatureOfSapientSignerLeaf
|
|
83
|
+
}
|
|
84
|
+
}> {
|
|
85
|
+
const cached = await this.args.cache.getWalletsForSapient(signer, imageHash)
|
|
86
|
+
const source = await this.args.source.getWalletsForSapient(signer, imageHash)
|
|
87
|
+
|
|
88
|
+
const deduplicated = { ...cached, ...source }
|
|
89
|
+
|
|
90
|
+
// Sync values to source that are not in cache, and vice versa
|
|
91
|
+
for (const [wallet, data] of Object.entries(deduplicated)) {
|
|
92
|
+
const walletAddress = Address.from(wallet)
|
|
93
|
+
if (!source[walletAddress]) {
|
|
94
|
+
await this.args.source.saveWitnesses(walletAddress, data.chainId, data.payload, {
|
|
95
|
+
type: 'unrecovered-signer',
|
|
96
|
+
weight: 1n,
|
|
97
|
+
signature: data.signature,
|
|
98
|
+
})
|
|
99
|
+
}
|
|
100
|
+
if (!cached[walletAddress]) {
|
|
101
|
+
await this.args.cache.saveWitnesses(walletAddress, data.chainId, data.payload, {
|
|
102
|
+
type: 'unrecovered-signer',
|
|
103
|
+
weight: 1n,
|
|
104
|
+
signature: data.signature,
|
|
105
|
+
})
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
return deduplicated
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
async getWitnessFor(
|
|
113
|
+
wallet: Address.Address,
|
|
114
|
+
signer: Address.Address,
|
|
115
|
+
): Promise<{ chainId: bigint; payload: Payload.Parented; signature: Signature.SignatureOfSignerLeaf } | undefined> {
|
|
116
|
+
const cached = await this.args.cache.getWitnessFor(wallet, signer)
|
|
117
|
+
if (cached) {
|
|
118
|
+
return cached
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const source = await this.args.source.getWitnessFor(wallet, signer)
|
|
122
|
+
if (source) {
|
|
123
|
+
await this.args.cache.saveWitnesses(wallet, source.chainId, source.payload, {
|
|
124
|
+
type: 'unrecovered-signer',
|
|
125
|
+
weight: 1n,
|
|
126
|
+
signature: source.signature,
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
return source
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async getWitnessForSapient(
|
|
134
|
+
wallet: Address.Address,
|
|
135
|
+
signer: Address.Address,
|
|
136
|
+
imageHash: Hex.Hex,
|
|
137
|
+
): Promise<
|
|
138
|
+
{ chainId: bigint; payload: Payload.Parented; signature: Signature.SignatureOfSapientSignerLeaf } | undefined
|
|
139
|
+
> {
|
|
140
|
+
const cached = await this.args.cache.getWitnessForSapient(wallet, signer, imageHash)
|
|
141
|
+
if (cached) {
|
|
142
|
+
return cached
|
|
143
|
+
}
|
|
144
|
+
const source = await this.args.source.getWitnessForSapient(wallet, signer, imageHash)
|
|
145
|
+
if (source) {
|
|
146
|
+
await this.args.cache.saveWitnesses(wallet, source.chainId, source.payload, {
|
|
147
|
+
type: 'unrecovered-signer',
|
|
148
|
+
weight: 1n,
|
|
149
|
+
signature: source.signature,
|
|
150
|
+
})
|
|
151
|
+
}
|
|
152
|
+
return source
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
async getConfigurationUpdates(
|
|
156
|
+
wallet: Address.Address,
|
|
157
|
+
fromImageHash: Hex.Hex,
|
|
158
|
+
options?: { allUpdates?: boolean },
|
|
159
|
+
): Promise<Array<{ imageHash: Hex.Hex; signature: Signature.RawSignature }>> {
|
|
160
|
+
// TODO: Cache this
|
|
161
|
+
return this.args.source.getConfigurationUpdates(wallet, fromImageHash, options)
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
async getTree(rootHash: Hex.Hex): Promise<GenericTree.Tree | undefined> {
|
|
165
|
+
const cached = await this.args.cache.getTree(rootHash)
|
|
166
|
+
if (cached) {
|
|
167
|
+
return cached
|
|
168
|
+
}
|
|
169
|
+
const source = await this.args.source.getTree(rootHash)
|
|
170
|
+
if (source) {
|
|
171
|
+
await this.args.cache.saveTree(source)
|
|
172
|
+
}
|
|
173
|
+
return source
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
// Write methods are not cached, they are directly forwarded to the source
|
|
177
|
+
saveWallet(deployConfiguration: Config.Config, context: Context.Context): MaybePromise<void> {
|
|
178
|
+
return this.args.source.saveWallet(deployConfiguration, context)
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
saveWitnesses(
|
|
182
|
+
wallet: Address.Address,
|
|
183
|
+
chainId: bigint,
|
|
184
|
+
payload: Payload.Parented,
|
|
185
|
+
signatures: Signature.RawTopology,
|
|
186
|
+
): MaybePromise<void> {
|
|
187
|
+
return this.args.source.saveWitnesses(wallet, chainId, payload, signatures)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
saveUpdate(
|
|
191
|
+
wallet: Address.Address,
|
|
192
|
+
configuration: Config.Config,
|
|
193
|
+
signature: Signature.RawSignature,
|
|
194
|
+
): MaybePromise<void> {
|
|
195
|
+
return this.args.source.saveUpdate(wallet, configuration, signature)
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
saveTree(tree: GenericTree.Tree): MaybePromise<void> {
|
|
199
|
+
return this.args.source.saveTree(tree)
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
saveConfiguration(config: Config.Config): MaybePromise<void> {
|
|
203
|
+
return this.args.source.saveConfiguration(config)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
saveDeploy(imageHash: Hex.Hex, context: Context.Context): MaybePromise<void> {
|
|
207
|
+
return this.args.source.saveDeploy(imageHash, context)
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
async getPayload(opHash: Hex.Hex): Promise<
|
|
211
|
+
| {
|
|
212
|
+
chainId: bigint
|
|
213
|
+
payload: Payload.Parented
|
|
214
|
+
wallet: Address.Address
|
|
215
|
+
}
|
|
216
|
+
| undefined
|
|
217
|
+
> {
|
|
218
|
+
const cached = await this.args.cache.getPayload(opHash)
|
|
219
|
+
if (cached) {
|
|
220
|
+
return cached
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
const source = await this.args.source.getPayload(opHash)
|
|
224
|
+
if (source) {
|
|
225
|
+
await this.args.cache.savePayload(source.wallet, source.payload, source.chainId)
|
|
226
|
+
}
|
|
227
|
+
return source
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
savePayload(wallet: Address.Address, payload: Payload.Parented, chainId: bigint): MaybePromise<void> {
|
|
231
|
+
return this.args.source.savePayload(wallet, payload, chainId)
|
|
232
|
+
}
|
|
233
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import { Address, Hex } from 'ox'
|
|
2
|
+
import { Context, Config, Payload, Signature, GenericTree } from '@0xsequence/wallet-primitives'
|
|
3
|
+
|
|
4
|
+
export type Provider = Reader & Writer
|
|
5
|
+
|
|
6
|
+
export interface Reader {
|
|
7
|
+
getConfiguration(imageHash: Hex.Hex): MaybePromise<Config.Config | undefined>
|
|
8
|
+
|
|
9
|
+
getDeploy(wallet: Address.Address): MaybePromise<{ imageHash: Hex.Hex; context: Context.Context } | undefined>
|
|
10
|
+
|
|
11
|
+
getWallets(signer: Address.Address): MaybePromise<{
|
|
12
|
+
[wallet: Address.Address]: {
|
|
13
|
+
chainId: bigint
|
|
14
|
+
payload: Payload.Parented
|
|
15
|
+
signature: Signature.SignatureOfSignerLeaf
|
|
16
|
+
}
|
|
17
|
+
}>
|
|
18
|
+
|
|
19
|
+
getWalletsForSapient(
|
|
20
|
+
signer: Address.Address,
|
|
21
|
+
imageHash: Hex.Hex,
|
|
22
|
+
): MaybePromise<{
|
|
23
|
+
[wallet: Address.Address]: {
|
|
24
|
+
chainId: bigint
|
|
25
|
+
payload: Payload.Parented
|
|
26
|
+
signature: Signature.SignatureOfSapientSignerLeaf
|
|
27
|
+
}
|
|
28
|
+
}>
|
|
29
|
+
|
|
30
|
+
getWitnessFor(
|
|
31
|
+
wallet: Address.Address,
|
|
32
|
+
signer: Address.Address,
|
|
33
|
+
): MaybePromise<
|
|
34
|
+
{ chainId: bigint; payload: Payload.Parented; signature: Signature.SignatureOfSignerLeaf } | undefined
|
|
35
|
+
>
|
|
36
|
+
|
|
37
|
+
getWitnessForSapient(
|
|
38
|
+
wallet: Address.Address,
|
|
39
|
+
signer: Address.Address,
|
|
40
|
+
imageHash: Hex.Hex,
|
|
41
|
+
): MaybePromise<
|
|
42
|
+
{ chainId: bigint; payload: Payload.Parented; signature: Signature.SignatureOfSapientSignerLeaf } | undefined
|
|
43
|
+
>
|
|
44
|
+
|
|
45
|
+
getConfigurationUpdates(
|
|
46
|
+
wallet: Address.Address,
|
|
47
|
+
fromImageHash: Hex.Hex,
|
|
48
|
+
options?: { allUpdates?: boolean },
|
|
49
|
+
): MaybePromise<Array<{ imageHash: Hex.Hex; signature: Signature.RawSignature }>>
|
|
50
|
+
|
|
51
|
+
getTree(rootHash: Hex.Hex): MaybePromise<GenericTree.Tree | undefined>
|
|
52
|
+
getPayload(
|
|
53
|
+
opHash: Hex.Hex,
|
|
54
|
+
): MaybePromise<{ chainId: bigint; payload: Payload.Parented; wallet: Address.Address } | undefined>
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export interface Writer {
|
|
58
|
+
saveWallet(deployConfiguration: Config.Config, context: Context.Context): MaybePromise<void>
|
|
59
|
+
|
|
60
|
+
saveWitnesses(
|
|
61
|
+
wallet: Address.Address,
|
|
62
|
+
chainId: bigint,
|
|
63
|
+
payload: Payload.Parented,
|
|
64
|
+
signatures: Signature.RawTopology,
|
|
65
|
+
): MaybePromise<void>
|
|
66
|
+
|
|
67
|
+
saveUpdate(
|
|
68
|
+
wallet: Address.Address,
|
|
69
|
+
configuration: Config.Config,
|
|
70
|
+
signature: Signature.RawSignature,
|
|
71
|
+
): MaybePromise<void>
|
|
72
|
+
|
|
73
|
+
saveTree(tree: GenericTree.Tree): MaybePromise<void>
|
|
74
|
+
|
|
75
|
+
saveConfiguration(config: Config.Config): MaybePromise<void>
|
|
76
|
+
saveDeploy(imageHash: Hex.Hex, context: Context.Context): MaybePromise<void>
|
|
77
|
+
savePayload(wallet: Address.Address, payload: Payload.Parented, chainId: bigint): MaybePromise<void>
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
export type MaybePromise<T> = T | Promise<T>
|
|
81
|
+
|
|
82
|
+
export * as Local from './local/index.js'
|
|
83
|
+
export * from './utils.js'
|
|
84
|
+
export * as Remote from './remote/index.js'
|
|
85
|
+
export * from './cached.js'
|