@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.
Files changed (106) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +9 -0
  3. package/LICENSE +202 -0
  4. package/dist/envelope.d.ts +34 -0
  5. package/dist/envelope.d.ts.map +1 -0
  6. package/dist/envelope.js +96 -0
  7. package/dist/index.d.ts +6 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +5 -0
  10. package/dist/relayer/index.d.ts +4 -0
  11. package/dist/relayer/index.d.ts.map +1 -0
  12. package/dist/relayer/index.js +3 -0
  13. package/dist/relayer/local.d.ts +28 -0
  14. package/dist/relayer/local.d.ts.map +1 -0
  15. package/dist/relayer/local.js +101 -0
  16. package/dist/relayer/pk-relayer.d.ts +18 -0
  17. package/dist/relayer/pk-relayer.d.ts.map +1 -0
  18. package/dist/relayer/pk-relayer.js +88 -0
  19. package/dist/relayer/relayer.d.ts +39 -0
  20. package/dist/relayer/relayer.d.ts.map +1 -0
  21. package/dist/relayer/relayer.js +1 -0
  22. package/dist/signers/index.d.ts +23 -0
  23. package/dist/signers/index.d.ts.map +1 -0
  24. package/dist/signers/index.js +10 -0
  25. package/dist/signers/passkey.d.ts +41 -0
  26. package/dist/signers/passkey.d.ts.map +1 -0
  27. package/dist/signers/passkey.js +196 -0
  28. package/dist/signers/pk/encrypted.d.ts +37 -0
  29. package/dist/signers/pk/encrypted.d.ts.map +1 -0
  30. package/dist/signers/pk/encrypted.js +123 -0
  31. package/dist/signers/pk/index.d.ts +35 -0
  32. package/dist/signers/pk/index.d.ts.map +1 -0
  33. package/dist/signers/pk/index.js +51 -0
  34. package/dist/signers/session/explicit.d.ts +18 -0
  35. package/dist/signers/session/explicit.d.ts.map +1 -0
  36. package/dist/signers/session/explicit.js +126 -0
  37. package/dist/signers/session/implicit.d.ts +20 -0
  38. package/dist/signers/session/implicit.d.ts.map +1 -0
  39. package/dist/signers/session/implicit.js +120 -0
  40. package/dist/signers/session/index.d.ts +4 -0
  41. package/dist/signers/session/index.d.ts.map +1 -0
  42. package/dist/signers/session/index.js +3 -0
  43. package/dist/signers/session/session.d.ts +11 -0
  44. package/dist/signers/session/session.d.ts.map +1 -0
  45. package/dist/signers/session/session.js +1 -0
  46. package/dist/signers/session-manager.d.ts +33 -0
  47. package/dist/signers/session-manager.d.ts.map +1 -0
  48. package/dist/signers/session-manager.js +181 -0
  49. package/dist/state/cached.d.ts +59 -0
  50. package/dist/state/cached.d.ts.map +1 -0
  51. package/dist/state/cached.js +157 -0
  52. package/dist/state/index.d.ts +61 -0
  53. package/dist/state/index.d.ts.map +1 -0
  54. package/dist/state/index.js +4 -0
  55. package/dist/state/local/index.d.ts +98 -0
  56. package/dist/state/local/index.d.ts.map +1 -0
  57. package/dist/state/local/index.js +247 -0
  58. package/dist/state/local/indexed-db.d.ts +41 -0
  59. package/dist/state/local/indexed-db.d.ts.map +1 -0
  60. package/dist/state/local/indexed-db.js +149 -0
  61. package/dist/state/local/memory.d.ts +41 -0
  62. package/dist/state/local/memory.d.ts.map +1 -0
  63. package/dist/state/local/memory.js +77 -0
  64. package/dist/state/remote/dev-http.d.ts +57 -0
  65. package/dist/state/remote/dev-http.d.ts.map +1 -0
  66. package/dist/state/remote/dev-http.js +162 -0
  67. package/dist/state/remote/index.d.ts +2 -0
  68. package/dist/state/remote/index.d.ts.map +1 -0
  69. package/dist/state/remote/index.js +1 -0
  70. package/dist/state/utils.d.ts +12 -0
  71. package/dist/state/utils.d.ts.map +1 -0
  72. package/dist/state/utils.js +29 -0
  73. package/dist/wallet.d.ts +58 -0
  74. package/dist/wallet.d.ts.map +1 -0
  75. package/dist/wallet.js +306 -0
  76. package/package.json +33 -0
  77. package/src/envelope.ts +148 -0
  78. package/src/index.ts +6 -0
  79. package/src/relayer/index.ts +3 -0
  80. package/src/relayer/local.ts +125 -0
  81. package/src/relayer/pk-relayer.ts +110 -0
  82. package/src/relayer/relayer.ts +52 -0
  83. package/src/signers/index.ts +44 -0
  84. package/src/signers/passkey.ts +284 -0
  85. package/src/signers/pk/encrypted.ts +153 -0
  86. package/src/signers/pk/index.ts +77 -0
  87. package/src/signers/session/explicit.ts +173 -0
  88. package/src/signers/session/implicit.ts +145 -0
  89. package/src/signers/session/index.ts +3 -0
  90. package/src/signers/session/session.ts +26 -0
  91. package/src/signers/session-manager.ts +241 -0
  92. package/src/state/cached.ts +233 -0
  93. package/src/state/index.ts +85 -0
  94. package/src/state/local/index.ts +422 -0
  95. package/src/state/local/indexed-db.ts +204 -0
  96. package/src/state/local/memory.ts +126 -0
  97. package/src/state/remote/dev-http.ts +253 -0
  98. package/src/state/remote/index.ts +1 -0
  99. package/src/state/utils.ts +50 -0
  100. package/src/wallet.ts +390 -0
  101. package/test/constants.ts +15 -0
  102. package/test/session-manager.test.ts +451 -0
  103. package/test/setup.ts +63 -0
  104. package/test/wallet.test.ts +90 -0
  105. package/tsconfig.json +10 -0
  106. 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'