11import { Config , Extensions , GenericTree , Payload } from '@0xsequence/wallet-primitives'
22import { Shared } from './manager.js'
33import { Address , Hex , Provider , RpcTransport } from 'ox'
4- import { RecoverySigner } from './types/signer.js'
4+ import { Kinds , RecoverySigner } from './types/signer.js'
55import { Envelope } from '@0xsequence/wallet-core'
66import { QueuedRecoveryPayload } from './types/recovery.js'
77import { Actions } from './types/index.js'
8+ import { MnemonicHandler } from './handlers/mnemonic.js'
89
910export class Recovery {
1011 constructor ( private readonly shared : Shared ) { }
@@ -31,7 +32,12 @@ export class Recovery {
3132 return
3233 }
3334
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 )
3541 if ( ! genericTree ) {
3642 throw new Error ( 'recovery-module-tree-not-found' )
3743 }
@@ -129,11 +135,25 @@ export class Recovery {
129135 } )
130136 }
131137
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 )
134154 await this . addRecoverySignerToModules ( modules , address )
135155 return this . shared . modules . wallets . requestConfigurationUpdate (
136- address ,
156+ wallet ,
137157 {
138158 modules,
139159 } ,
@@ -142,17 +162,26 @@ export class Recovery {
142162 )
143163 }
144164
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 )
147167 await this . removeRecoverySignerFromModules ( modules , address )
148168 return this . shared . modules . wallets . requestConfigurationUpdate (
149- address ,
169+ wallet ,
150170 { modules } ,
151171 Actions . RemoveRecoverySigner ,
152172 'wallet-webapp' ,
153173 )
154174 }
155175
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+
156185 async getRecoverySigners ( address : Address . Address ) : Promise < RecoverySigner [ ] | undefined > {
157186 const { raw } = await this . shared . modules . wallets . getConfiguration ( { wallet : address } )
158187 const recoveryLeaf = raw . modules . find ( ( m ) => m . address === this . shared . sequence . extensions . recovery )
@@ -171,11 +200,17 @@ export class Recovery {
171200 throw new Error ( 'recovery-module-tree-incomplete' )
172201 }
173202
203+ const kos = await this . shared . modules . signers . resolveKinds (
204+ address ,
205+ leaves . map ( ( l ) => l . signer ) ,
206+ )
207+
174208 return leaves
175209 . filter ( ( l ) => l . signer !== '0x0000000000000000000000000000000000000000' )
176210 . map ( ( l ) => ( {
177211 address : l . signer ,
178- kind : 'recovery' ,
212+ kind : kos . find ( ( s ) => s . address === l . signer ) ?. kind || 'unknown' ,
213+ isRecovery : true ,
179214 minTimestamp : l . minTimestamp ,
180215 requiredDeltaTime : l . requiredDeltaTime ,
181216 } ) )
0 commit comments