@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,157 @@
1
+ import { Address } from 'ox';
2
+ export class Cached {
3
+ args;
4
+ constructor(args) {
5
+ this.args = args;
6
+ }
7
+ async getConfiguration(imageHash) {
8
+ const cached = await this.args.cache.getConfiguration(imageHash);
9
+ if (cached) {
10
+ return cached;
11
+ }
12
+ const config = await this.args.source.getConfiguration(imageHash);
13
+ if (config) {
14
+ await this.args.cache.saveConfiguration(config);
15
+ }
16
+ return config;
17
+ }
18
+ async getDeploy(wallet) {
19
+ const cached = await this.args.cache.getDeploy(wallet);
20
+ if (cached) {
21
+ return cached;
22
+ }
23
+ const deploy = await this.args.source.getDeploy(wallet);
24
+ if (deploy) {
25
+ await this.args.cache.saveDeploy(deploy.imageHash, deploy.context);
26
+ }
27
+ return deploy;
28
+ }
29
+ async getWallets(signer) {
30
+ // Get both from cache and source
31
+ const cached = await this.args.cache.getWallets(signer);
32
+ const source = await this.args.source.getWallets(signer);
33
+ // Merge and deduplicate
34
+ const deduplicated = { ...cached, ...source };
35
+ // Sync values to source that are not in cache, and vice versa
36
+ for (const [wallet, data] of Object.entries(deduplicated)) {
37
+ const walletAddress = Address.from(wallet);
38
+ if (!source[walletAddress]) {
39
+ await this.args.source.saveWitnesses(walletAddress, data.chainId, data.payload, {
40
+ type: 'unrecovered-signer',
41
+ weight: 1n,
42
+ signature: data.signature,
43
+ });
44
+ }
45
+ if (!cached[walletAddress]) {
46
+ await this.args.cache.saveWitnesses(walletAddress, data.chainId, data.payload, {
47
+ type: 'unrecovered-signer',
48
+ weight: 1n,
49
+ signature: data.signature,
50
+ });
51
+ }
52
+ }
53
+ return deduplicated;
54
+ }
55
+ async getWalletsForSapient(signer, imageHash) {
56
+ const cached = await this.args.cache.getWalletsForSapient(signer, imageHash);
57
+ const source = await this.args.source.getWalletsForSapient(signer, imageHash);
58
+ const deduplicated = { ...cached, ...source };
59
+ // Sync values to source that are not in cache, and vice versa
60
+ for (const [wallet, data] of Object.entries(deduplicated)) {
61
+ const walletAddress = Address.from(wallet);
62
+ if (!source[walletAddress]) {
63
+ await this.args.source.saveWitnesses(walletAddress, data.chainId, data.payload, {
64
+ type: 'unrecovered-signer',
65
+ weight: 1n,
66
+ signature: data.signature,
67
+ });
68
+ }
69
+ if (!cached[walletAddress]) {
70
+ await this.args.cache.saveWitnesses(walletAddress, data.chainId, data.payload, {
71
+ type: 'unrecovered-signer',
72
+ weight: 1n,
73
+ signature: data.signature,
74
+ });
75
+ }
76
+ }
77
+ return deduplicated;
78
+ }
79
+ async getWitnessFor(wallet, signer) {
80
+ const cached = await this.args.cache.getWitnessFor(wallet, signer);
81
+ if (cached) {
82
+ return cached;
83
+ }
84
+ const source = await this.args.source.getWitnessFor(wallet, signer);
85
+ if (source) {
86
+ await this.args.cache.saveWitnesses(wallet, source.chainId, source.payload, {
87
+ type: 'unrecovered-signer',
88
+ weight: 1n,
89
+ signature: source.signature,
90
+ });
91
+ }
92
+ return source;
93
+ }
94
+ async getWitnessForSapient(wallet, signer, imageHash) {
95
+ const cached = await this.args.cache.getWitnessForSapient(wallet, signer, imageHash);
96
+ if (cached) {
97
+ return cached;
98
+ }
99
+ const source = await this.args.source.getWitnessForSapient(wallet, signer, imageHash);
100
+ if (source) {
101
+ await this.args.cache.saveWitnesses(wallet, source.chainId, source.payload, {
102
+ type: 'unrecovered-signer',
103
+ weight: 1n,
104
+ signature: source.signature,
105
+ });
106
+ }
107
+ return source;
108
+ }
109
+ async getConfigurationUpdates(wallet, fromImageHash, options) {
110
+ // TODO: Cache this
111
+ return this.args.source.getConfigurationUpdates(wallet, fromImageHash, options);
112
+ }
113
+ async getTree(rootHash) {
114
+ const cached = await this.args.cache.getTree(rootHash);
115
+ if (cached) {
116
+ return cached;
117
+ }
118
+ const source = await this.args.source.getTree(rootHash);
119
+ if (source) {
120
+ await this.args.cache.saveTree(source);
121
+ }
122
+ return source;
123
+ }
124
+ // Write methods are not cached, they are directly forwarded to the source
125
+ saveWallet(deployConfiguration, context) {
126
+ return this.args.source.saveWallet(deployConfiguration, context);
127
+ }
128
+ saveWitnesses(wallet, chainId, payload, signatures) {
129
+ return this.args.source.saveWitnesses(wallet, chainId, payload, signatures);
130
+ }
131
+ saveUpdate(wallet, configuration, signature) {
132
+ return this.args.source.saveUpdate(wallet, configuration, signature);
133
+ }
134
+ saveTree(tree) {
135
+ return this.args.source.saveTree(tree);
136
+ }
137
+ saveConfiguration(config) {
138
+ return this.args.source.saveConfiguration(config);
139
+ }
140
+ saveDeploy(imageHash, context) {
141
+ return this.args.source.saveDeploy(imageHash, context);
142
+ }
143
+ async getPayload(opHash) {
144
+ const cached = await this.args.cache.getPayload(opHash);
145
+ if (cached) {
146
+ return cached;
147
+ }
148
+ const source = await this.args.source.getPayload(opHash);
149
+ if (source) {
150
+ await this.args.cache.savePayload(source.wallet, source.payload, source.chainId);
151
+ }
152
+ return source;
153
+ }
154
+ savePayload(wallet, payload, chainId) {
155
+ return this.args.source.savePayload(wallet, payload, chainId);
156
+ }
157
+ }
@@ -0,0 +1,61 @@
1
+ import { Address, Hex } from 'ox';
2
+ import { Context, Config, Payload, Signature, GenericTree } from '@0xsequence/wallet-primitives';
3
+ export type Provider = Reader & Writer;
4
+ export interface Reader {
5
+ getConfiguration(imageHash: Hex.Hex): MaybePromise<Config.Config | undefined>;
6
+ getDeploy(wallet: Address.Address): MaybePromise<{
7
+ imageHash: Hex.Hex;
8
+ context: Context.Context;
9
+ } | undefined>;
10
+ getWallets(signer: Address.Address): MaybePromise<{
11
+ [wallet: Address.Address]: {
12
+ chainId: bigint;
13
+ payload: Payload.Parented;
14
+ signature: Signature.SignatureOfSignerLeaf;
15
+ };
16
+ }>;
17
+ getWalletsForSapient(signer: Address.Address, imageHash: Hex.Hex): MaybePromise<{
18
+ [wallet: Address.Address]: {
19
+ chainId: bigint;
20
+ payload: Payload.Parented;
21
+ signature: Signature.SignatureOfSapientSignerLeaf;
22
+ };
23
+ }>;
24
+ getWitnessFor(wallet: Address.Address, signer: Address.Address): MaybePromise<{
25
+ chainId: bigint;
26
+ payload: Payload.Parented;
27
+ signature: Signature.SignatureOfSignerLeaf;
28
+ } | undefined>;
29
+ getWitnessForSapient(wallet: Address.Address, signer: Address.Address, imageHash: Hex.Hex): MaybePromise<{
30
+ chainId: bigint;
31
+ payload: Payload.Parented;
32
+ signature: Signature.SignatureOfSapientSignerLeaf;
33
+ } | undefined>;
34
+ getConfigurationUpdates(wallet: Address.Address, fromImageHash: Hex.Hex, options?: {
35
+ allUpdates?: boolean;
36
+ }): MaybePromise<Array<{
37
+ imageHash: Hex.Hex;
38
+ signature: Signature.RawSignature;
39
+ }>>;
40
+ getTree(rootHash: Hex.Hex): MaybePromise<GenericTree.Tree | undefined>;
41
+ getPayload(opHash: Hex.Hex): MaybePromise<{
42
+ chainId: bigint;
43
+ payload: Payload.Parented;
44
+ wallet: Address.Address;
45
+ } | undefined>;
46
+ }
47
+ export interface Writer {
48
+ saveWallet(deployConfiguration: Config.Config, context: Context.Context): MaybePromise<void>;
49
+ saveWitnesses(wallet: Address.Address, chainId: bigint, payload: Payload.Parented, signatures: Signature.RawTopology): MaybePromise<void>;
50
+ saveUpdate(wallet: Address.Address, configuration: Config.Config, signature: Signature.RawSignature): MaybePromise<void>;
51
+ saveTree(tree: GenericTree.Tree): MaybePromise<void>;
52
+ saveConfiguration(config: Config.Config): MaybePromise<void>;
53
+ saveDeploy(imageHash: Hex.Hex, context: Context.Context): MaybePromise<void>;
54
+ savePayload(wallet: Address.Address, payload: Payload.Parented, chainId: bigint): MaybePromise<void>;
55
+ }
56
+ export type MaybePromise<T> = T | Promise<T>;
57
+ export * as Local from './local/index.js';
58
+ export * from './utils.js';
59
+ export * as Remote from './remote/index.js';
60
+ export * from './cached.js';
61
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/state/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * as Local from './local/index.js';
2
+ export * from './utils.js';
3
+ export * as Remote from './remote/index.js';
4
+ export * from './cached.js';
@@ -0,0 +1,98 @@
1
+ import { Context, Payload, Signature, Config, Extensions, GenericTree } from '@0xsequence/wallet-primitives';
2
+ import { Address, Hex } from 'ox';
3
+ import { Provider as ProviderInterface } from '../index.js';
4
+ export interface Store {
5
+ loadConfig: (imageHash: Hex.Hex) => Promise<Config.Config | undefined>;
6
+ saveConfig: (imageHash: Hex.Hex, config: Config.Config) => Promise<void>;
7
+ loadCounterfactualWallet: (wallet: Address.Address) => Promise<{
8
+ imageHash: Hex.Hex;
9
+ context: Context.Context;
10
+ } | undefined>;
11
+ saveCounterfactualWallet: (wallet: Address.Address, imageHash: Hex.Hex, context: Context.Context) => Promise<void>;
12
+ loadPayloadOfSubdigest: (subdigest: Hex.Hex) => Promise<{
13
+ content: Payload.Parented;
14
+ chainId: bigint;
15
+ wallet: Address.Address;
16
+ } | undefined>;
17
+ savePayloadOfSubdigest: (subdigest: Hex.Hex, payload: {
18
+ content: Payload.Parented;
19
+ chainId: bigint;
20
+ wallet: Address.Address;
21
+ }) => Promise<void>;
22
+ loadSubdigestsOfSigner: (signer: Address.Address) => Promise<Hex.Hex[]>;
23
+ loadSignatureOfSubdigest: (signer: Address.Address, subdigest: Hex.Hex) => Promise<Signature.SignatureOfSignerLeaf | undefined>;
24
+ saveSignatureOfSubdigest: (signer: Address.Address, subdigest: Hex.Hex, signature: Signature.SignatureOfSignerLeaf) => Promise<void>;
25
+ loadSubdigestsOfSapientSigner: (signer: Address.Address, imageHash: Hex.Hex) => Promise<Hex.Hex[]>;
26
+ loadSapientSignatureOfSubdigest: (signer: Address.Address, subdigest: Hex.Hex, imageHash: Hex.Hex) => Promise<Signature.SignatureOfSapientSignerLeaf | undefined>;
27
+ saveSapientSignatureOfSubdigest: (signer: Address.Address, subdigest: Hex.Hex, imageHash: Hex.Hex, signature: Signature.SignatureOfSapientSignerLeaf) => Promise<void>;
28
+ loadTree: (rootHash: Hex.Hex) => Promise<GenericTree.Tree | undefined>;
29
+ saveTree: (rootHash: Hex.Hex, tree: GenericTree.Tree) => Promise<void>;
30
+ }
31
+ export declare class Provider implements ProviderInterface {
32
+ private readonly store;
33
+ readonly extensions: Extensions.Extensions;
34
+ constructor(store?: Store, extensions?: Extensions.Extensions);
35
+ getConfiguration(imageHash: Hex.Hex): Promise<Config.Config | undefined>;
36
+ saveWallet(deployConfiguration: Config.Config, context: Context.Context): Promise<void>;
37
+ saveConfig(config: Config.Config): Promise<void>;
38
+ saveCounterfactualWallet(wallet: Address.Address, imageHash: Hex.Hex, context: Context.Context): void | Promise<void>;
39
+ getDeploy(wallet: Address.Address): Promise<{
40
+ imageHash: Hex.Hex;
41
+ context: Context.Context;
42
+ } | undefined>;
43
+ private getWalletsGeneric;
44
+ getWallets(signer: Address.Address): Promise<{
45
+ [wallet: `0x${string}`]: {
46
+ chainId: bigint;
47
+ payload: Payload.Parented;
48
+ signature: Signature.SignatureOfSignerLeaf;
49
+ };
50
+ }>;
51
+ getWalletsForSapient(signer: Address.Address, imageHash: Hex.Hex): Promise<{
52
+ [wallet: `0x${string}`]: {
53
+ chainId: bigint;
54
+ payload: Payload.Parented;
55
+ signature: Signature.SignatureOfSapientSignerLeaf;
56
+ };
57
+ }>;
58
+ getWitnessFor(wallet: Address.Address, signer: Address.Address): {
59
+ chainId: bigint;
60
+ payload: Payload.Parented;
61
+ signature: Signature.SignatureOfSignerLeaf;
62
+ } | Promise<{
63
+ chainId: bigint;
64
+ payload: Payload.Parented;
65
+ signature: Signature.SignatureOfSignerLeaf;
66
+ } | undefined> | undefined;
67
+ getWitnessForSapient(wallet: Address.Address, signer: Address.Address, imageHash: Hex.Hex): {
68
+ chainId: bigint;
69
+ payload: Payload.Parented;
70
+ signature: Signature.SignatureOfSapientSignerLeaf;
71
+ } | Promise<{
72
+ chainId: bigint;
73
+ payload: Payload.Parented;
74
+ signature: Signature.SignatureOfSapientSignerLeaf;
75
+ } | undefined> | undefined;
76
+ saveWitnesses(wallet: Address.Address, chainId: bigint, payload: Payload.Parented, signatures: Signature.RawTopology): Promise<void>;
77
+ getConfigurationUpdates(wallet: Address.Address, fromImageHash: Hex.Hex, options?: {
78
+ allUpdates?: boolean;
79
+ }): Promise<{
80
+ imageHash: Hex.Hex;
81
+ signature: Signature.RawSignature;
82
+ }[]>;
83
+ saveUpdate(wallet: Address.Address, configuration: Config.Config, signature: Signature.RawSignature): Promise<void>;
84
+ saveSignature(subdigest: Hex.Hex, topology: Signature.RawTopology): Promise<void>;
85
+ getTree(rootHash: Hex.Hex): GenericTree.Tree | Promise<GenericTree.Tree | undefined> | undefined;
86
+ saveTree(tree: GenericTree.Tree): void | Promise<void>;
87
+ saveConfiguration(config: Config.Config): Promise<void>;
88
+ saveDeploy(imageHash: Hex.Hex, context: Context.Context): Promise<void>;
89
+ getPayload(opHash: Hex.Hex): Promise<{
90
+ chainId: bigint;
91
+ payload: Payload.Parented;
92
+ wallet: Address.Address;
93
+ } | undefined>;
94
+ savePayload(wallet: Address.Address, payload: Payload.Parented, chainId: bigint): Promise<void>;
95
+ }
96
+ export * from './memory.js';
97
+ export * from './indexed-db.js';
98
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/state/local/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,247 @@
1
+ import { Payload, Signature, Config, Address as SequenceAddress, Extensions, GenericTree, } from '@0xsequence/wallet-primitives';
2
+ import { Address, Bytes, Hex, PersonalMessage, Secp256k1 } from 'ox';
3
+ import { MemoryStore } from './memory.js';
4
+ export class Provider {
5
+ store;
6
+ extensions;
7
+ constructor(store = new MemoryStore(), extensions = Extensions.Dev1) {
8
+ this.store = store;
9
+ this.extensions = extensions;
10
+ }
11
+ getConfiguration(imageHash) {
12
+ return this.store.loadConfig(imageHash);
13
+ }
14
+ async saveWallet(deployConfiguration, context) {
15
+ // Save both the configuration and the deploy hash
16
+ await this.saveConfig(deployConfiguration);
17
+ const imageHash = Config.hashConfiguration(deployConfiguration);
18
+ await this.saveCounterfactualWallet(SequenceAddress.from(imageHash, context), Hex.fromBytes(imageHash), context);
19
+ }
20
+ async saveConfig(config) {
21
+ const imageHash = Bytes.toHex(Config.hashConfiguration(config));
22
+ const previous = await this.store.loadConfig(imageHash);
23
+ if (previous) {
24
+ const combined = Config.mergeTopology(previous.topology, config.topology);
25
+ return this.store.saveConfig(imageHash, { ...previous, topology: combined });
26
+ }
27
+ else {
28
+ return this.store.saveConfig(imageHash, config);
29
+ }
30
+ }
31
+ saveCounterfactualWallet(wallet, imageHash, context) {
32
+ this.store.saveCounterfactualWallet(wallet, imageHash, context);
33
+ }
34
+ getDeploy(wallet) {
35
+ return this.store.loadCounterfactualWallet(wallet);
36
+ }
37
+ async getWalletsGeneric(subdigests, loadSignatureFn) {
38
+ const payloads = await Promise.all(subdigests.map((sd) => this.store.loadPayloadOfSubdigest(sd)));
39
+ const response = {};
40
+ for (const payload of payloads) {
41
+ if (!payload || response[payload.wallet]) {
42
+ continue;
43
+ }
44
+ const subdigest = Hex.fromBytes(Payload.hash(payload.wallet, payload.chainId, payload.content));
45
+ const signature = await loadSignatureFn(subdigest);
46
+ if (!signature)
47
+ continue;
48
+ response[payload.wallet] = {
49
+ chainId: payload.chainId,
50
+ payload: payload.content,
51
+ signature,
52
+ };
53
+ }
54
+ return response;
55
+ }
56
+ async getWallets(signer) {
57
+ return this.getWalletsGeneric(await this.store.loadSubdigestsOfSigner(signer), (subdigest) => this.store.loadSignatureOfSubdigest(signer, subdigest));
58
+ }
59
+ async getWalletsForSapient(signer, imageHash) {
60
+ return this.getWalletsGeneric(await this.store.loadSubdigestsOfSapientSigner(signer, imageHash), (subdigest) => this.store.loadSapientSignatureOfSubdigest(signer, subdigest, imageHash));
61
+ }
62
+ getWitnessFor(wallet, signer) {
63
+ return this.getWallets(signer).then((wallets) => wallets[wallet]);
64
+ }
65
+ getWitnessForSapient(wallet, signer, imageHash) {
66
+ return this.getWalletsForSapient(signer, imageHash).then((wallets) => wallets[wallet]);
67
+ }
68
+ async saveWitnesses(wallet, chainId, payload, signatures) {
69
+ const subdigest = Hex.fromBytes(Payload.hash(wallet, chainId, payload));
70
+ await Promise.all([
71
+ this.saveSignature(subdigest, signatures),
72
+ this.store.savePayloadOfSubdigest(subdigest, { content: payload, chainId, wallet }),
73
+ ]);
74
+ return;
75
+ }
76
+ async getConfigurationUpdates(wallet, fromImageHash, options) {
77
+ let fromConfig = await this.store.loadConfig(fromImageHash);
78
+ if (!fromConfig) {
79
+ return [];
80
+ }
81
+ const { signers, sapientSigners } = Config.getSigners(fromConfig);
82
+ const subdigestsOfSigner = await Promise.all([
83
+ ...signers.map((s) => this.store.loadSubdigestsOfSigner(s)),
84
+ ...sapientSigners.map((s) => this.store.loadSubdigestsOfSapientSigner(s.address, s.imageHash)),
85
+ ]);
86
+ const subdigests = [...new Set(subdigestsOfSigner.flat())];
87
+ const payloads = await Promise.all(subdigests.map((subdigest) => this.store.loadPayloadOfSubdigest(subdigest)));
88
+ const nextCandidates = await Promise.all(payloads
89
+ .filter((p) => p?.content && Payload.isConfigUpdate(p.content))
90
+ .map(async (p) => ({
91
+ payload: p,
92
+ nextImageHash: p.content.imageHash,
93
+ config: await this.store.loadConfig(p.content.imageHash),
94
+ })));
95
+ let best;
96
+ const nextCandidatesSorted = nextCandidates
97
+ .filter((c) => c.config && c.config.checkpoint > fromConfig.checkpoint)
98
+ .sort((a, b) =>
99
+ // If we are looking for the longest path, sort by ascending checkpoint
100
+ // because we want to find the smalles jump, and we should start with the
101
+ // closest one. If we are not looking for the longest path, sort by
102
+ // descending checkpoint, because we want to find the largest jump.
103
+ //
104
+ // We don't have a guarantee that all "next configs" will be valid
105
+ // so worst case scenario we will need to try all of them.
106
+ // But we can try to optimize for the most common case.
107
+ a.config.checkpoint > b.config.checkpoint ? (options?.allUpdates ? 1 : -1) : options?.allUpdates ? -1 : 1);
108
+ for (const candidate of nextCandidatesSorted) {
109
+ if (best) {
110
+ if (options?.allUpdates) {
111
+ // Only consider candidates earlier than our current best
112
+ if (candidate.config.checkpoint <= best.checkpoint) {
113
+ continue;
114
+ }
115
+ }
116
+ else {
117
+ // Only consider candidates later than our current best
118
+ if (candidate.config.checkpoint <= best.checkpoint) {
119
+ continue;
120
+ }
121
+ }
122
+ }
123
+ // Get all signatures (for all signers) for this subdigest
124
+ const expectedSubdigest = Hex.fromBytes(Payload.hash(wallet, candidate.payload.chainId, candidate.payload.content));
125
+ const signaturesOfSigners = await Promise.all([
126
+ ...signers.map(async (signer) => {
127
+ return { signer, signature: await this.store.loadSignatureOfSubdigest(signer, expectedSubdigest) };
128
+ }),
129
+ ...sapientSigners.map(async (signer) => {
130
+ return {
131
+ signer: signer.address,
132
+ imageHash: signer.imageHash,
133
+ signature: await this.store.loadSapientSignatureOfSubdigest(signer.address, expectedSubdigest, signer.imageHash),
134
+ };
135
+ }),
136
+ ]);
137
+ let totalWeight = 0n;
138
+ const encoded = Signature.fillLeaves(fromConfig.topology, (leaf) => {
139
+ if (Config.isSapientSignerLeaf(leaf)) {
140
+ const sapientSignature = signaturesOfSigners.find(({ signer, imageHash }) => {
141
+ return imageHash && Address.isEqual(signer, leaf.address) && imageHash === leaf.imageHash;
142
+ })?.signature;
143
+ if (sapientSignature) {
144
+ totalWeight += leaf.weight;
145
+ return sapientSignature;
146
+ }
147
+ }
148
+ const signature = signaturesOfSigners.find(({ signer }) => Address.isEqual(signer, leaf.address))?.signature;
149
+ if (!signature) {
150
+ return undefined;
151
+ }
152
+ totalWeight += leaf.weight;
153
+ return signature;
154
+ });
155
+ if (totalWeight < fromConfig.threshold) {
156
+ continue;
157
+ }
158
+ best = {
159
+ nextImageHash: candidate.nextImageHash,
160
+ checkpoint: candidate.config.checkpoint,
161
+ signature: {
162
+ noChainId: true,
163
+ configuration: {
164
+ threshold: fromConfig.threshold,
165
+ checkpoint: fromConfig.checkpoint,
166
+ topology: encoded,
167
+ },
168
+ },
169
+ };
170
+ }
171
+ if (!best) {
172
+ return [];
173
+ }
174
+ const nextStep = await this.getConfigurationUpdates(wallet, best.nextImageHash, { allUpdates: true });
175
+ return [
176
+ {
177
+ imageHash: best.nextImageHash,
178
+ signature: best.signature,
179
+ },
180
+ ...nextStep,
181
+ ];
182
+ }
183
+ async saveUpdate(wallet, configuration, signature) {
184
+ const nextImageHash = Bytes.toHex(Config.hashConfiguration(configuration));
185
+ const payload = {
186
+ type: 'config-update',
187
+ imageHash: nextImageHash,
188
+ };
189
+ const subdigest = Payload.hash(wallet, 0n, payload);
190
+ await this.store.savePayloadOfSubdigest(Hex.fromBytes(subdigest), { content: payload, chainId: 0n, wallet });
191
+ await this.saveConfig(configuration);
192
+ await this.saveSignature(Hex.fromBytes(subdigest), signature.configuration.topology);
193
+ }
194
+ async saveSignature(subdigest, topology) {
195
+ if (Signature.isRawNode(topology)) {
196
+ await Promise.all([this.saveSignature(subdigest, topology[0]), this.saveSignature(subdigest, topology[1])]);
197
+ return;
198
+ }
199
+ if (Signature.isRawNestedLeaf(topology)) {
200
+ return this.saveSignature(subdigest, topology.tree);
201
+ }
202
+ if (Signature.isRawSignerLeaf(topology)) {
203
+ const type = topology.signature.type;
204
+ if (type === 'eth_sign' || type === 'hash') {
205
+ const address = Secp256k1.recoverAddress({
206
+ payload: type === 'eth_sign' ? PersonalMessage.getSignPayload(subdigest) : subdigest,
207
+ signature: topology.signature,
208
+ });
209
+ return this.store.saveSignatureOfSubdigest(address, subdigest, topology.signature);
210
+ }
211
+ if (Signature.isSignatureOfSapientSignerLeaf(topology.signature)) {
212
+ switch (topology.signature.address.toLowerCase()) {
213
+ case this.extensions.passkeys.toLowerCase():
214
+ const decoded = Extensions.Passkeys.decode(Bytes.fromHex(topology.signature.data));
215
+ if (!Extensions.Passkeys.isValidSignature(subdigest, decoded)) {
216
+ throw new Error('Invalid passkey signature');
217
+ }
218
+ return this.store.saveSapientSignatureOfSubdigest(topology.signature.address, subdigest, Extensions.Passkeys.rootFor(decoded.publicKey), topology.signature);
219
+ default:
220
+ throw new Error(`Unsupported sapient signer: ${topology.signature.address}`);
221
+ }
222
+ }
223
+ }
224
+ }
225
+ getTree(rootHash) {
226
+ return this.store.loadTree(rootHash);
227
+ }
228
+ saveTree(tree) {
229
+ return this.store.saveTree(GenericTree.hash(tree), tree);
230
+ }
231
+ saveConfiguration(config) {
232
+ return this.store.saveConfig(Bytes.toHex(Config.hashConfiguration(config)), config);
233
+ }
234
+ saveDeploy(imageHash, context) {
235
+ return this.store.saveCounterfactualWallet(SequenceAddress.from(Bytes.fromHex(imageHash), context), imageHash, context);
236
+ }
237
+ async getPayload(opHash) {
238
+ const data = await this.store.loadPayloadOfSubdigest(opHash);
239
+ return data ? { chainId: data.chainId, payload: data.content, wallet: data.wallet } : undefined;
240
+ }
241
+ savePayload(wallet, payload, chainId) {
242
+ const subdigest = Hex.fromBytes(Payload.hash(wallet, chainId, payload));
243
+ return this.store.savePayloadOfSubdigest(subdigest, { content: payload, chainId, wallet });
244
+ }
245
+ }
246
+ export * from './memory.js';
247
+ export * from './indexed-db.js';
@@ -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 IndexedDbStore implements Store {
5
+ private _db;
6
+ private dbName;
7
+ constructor(dbName?: string);
8
+ private openDB;
9
+ private get;
10
+ private put;
11
+ private getSet;
12
+ private putSet;
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=indexed-db.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexed-db.d.ts","sourceRoot":"","sources":["../../../src/state/local/indexed-db.ts"],"names":[],"mappings":"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"}