1
1
import { Config , Extensions , GenericTree , Payload } from '@0xsequence/wallet-primitives'
2
2
import { Shared } from './manager.js'
3
3
import { Address , Hex , Provider , RpcTransport } from 'ox'
4
- import { RecoverySigner } from './types/signer.js'
4
+ import { Kinds , RecoverySigner } from './types/signer.js'
5
5
import { Envelope } from '@0xsequence/wallet-core'
6
6
import { QueuedRecoveryPayload } from './types/recovery.js'
7
7
import { Actions } from './types/index.js'
8
+ import { MnemonicHandler } from './handlers/mnemonic.js'
8
9
9
10
export class Recovery {
10
11
constructor ( private readonly shared : Shared ) { }
@@ -31,7 +32,12 @@ export class Recovery {
31
32
return
32
33
}
33
34
34
- const genericTree = await this . shared . sequence . stateProvider . getTree ( ext )
35
+ const sapientSigner = modules [ idx ]
36
+ if ( ! sapientSigner ) {
37
+ throw new Error ( 'recovery-module-not-found' )
38
+ }
39
+
40
+ const genericTree = await this . shared . sequence . stateProvider . getTree ( sapientSigner . imageHash )
35
41
if ( ! genericTree ) {
36
42
throw new Error ( 'recovery-module-tree-not-found' )
37
43
}
@@ -129,11 +135,25 @@ export class Recovery {
129
135
} )
130
136
}
131
137
132
- async addRecoverySigner ( address : Address . Address ) {
133
- const { modules } = await this . shared . modules . wallets . getConfigurationParts ( address )
138
+ async addRecoveryMnemonic ( wallet : Address . Address , mnemonic : string ) {
139
+ const signer = MnemonicHandler . toSigner ( mnemonic )
140
+ if ( ! signer ) {
141
+ throw new Error ( 'invalid-mnemonic' )
142
+ }
143
+
144
+ await signer . witness ( this . shared . sequence . stateProvider , wallet , {
145
+ isForRecovery : true ,
146
+ signerKind : Kinds . RecoveryMnemonic ,
147
+ } )
148
+
149
+ return this . addRecoverySigner ( wallet , signer . address )
150
+ }
151
+
152
+ async addRecoverySigner ( wallet : Address . Address , address : Address . Address ) {
153
+ const { modules } = await this . shared . modules . wallets . getConfigurationParts ( wallet )
134
154
await this . addRecoverySignerToModules ( modules , address )
135
155
return this . shared . modules . wallets . requestConfigurationUpdate (
136
- address ,
156
+ wallet ,
137
157
{
138
158
modules,
139
159
} ,
@@ -142,17 +162,26 @@ export class Recovery {
142
162
)
143
163
}
144
164
145
- async removeRecoverySigner ( address : Address . Address ) {
146
- const { modules } = await this . shared . modules . wallets . getConfigurationParts ( address )
165
+ async removeRecoverySigner ( wallet : Address . Address , address : Address . Address ) {
166
+ const { modules } = await this . shared . modules . wallets . getConfigurationParts ( wallet )
147
167
await this . removeRecoverySignerFromModules ( modules , address )
148
168
return this . shared . modules . wallets . requestConfigurationUpdate (
149
- address ,
169
+ wallet ,
150
170
{ modules } ,
151
171
Actions . RemoveRecoverySigner ,
152
172
'wallet-webapp' ,
153
173
)
154
174
}
155
175
176
+ async completeRecoveryUpdate ( requestId : string ) {
177
+ const request = await this . shared . modules . signatures . get ( requestId )
178
+ if ( request . action !== 'add-recovery-signer' && request . action !== 'remove-recovery-signer' ) {
179
+ throw new Error ( 'invalid-recovery-update-action' )
180
+ }
181
+
182
+ return this . shared . modules . wallets . completeConfigurationUpdate ( requestId )
183
+ }
184
+
156
185
async getRecoverySigners ( address : Address . Address ) : Promise < RecoverySigner [ ] | undefined > {
157
186
const { raw } = await this . shared . modules . wallets . getConfiguration ( { wallet : address } )
158
187
const recoveryLeaf = raw . modules . find ( ( m ) => m . address === this . shared . sequence . extensions . recovery )
@@ -171,11 +200,17 @@ export class Recovery {
171
200
throw new Error ( 'recovery-module-tree-incomplete' )
172
201
}
173
202
203
+ const kos = await this . shared . modules . signers . resolveKinds (
204
+ address ,
205
+ leaves . map ( ( l ) => l . signer ) ,
206
+ )
207
+
174
208
return leaves
175
209
. filter ( ( l ) => l . signer !== '0x0000000000000000000000000000000000000000' )
176
210
. map ( ( l ) => ( {
177
211
address : l . signer ,
178
- kind : 'recovery' ,
212
+ kind : kos . find ( ( s ) => s . address === l . signer ) ?. kind || 'unknown' ,
213
+ isRecovery : true ,
179
214
minTimestamp : l . minTimestamp ,
180
215
requiredDeltaTime : l . requiredDeltaTime ,
181
216
} ) )
0 commit comments