# Update - 4 1. I finalised on the architecure while setting up the everything required for the wallet, you can read more about it here: https://hackmd.io/4CoD1N-sR0O16HhUL40YFQ 2. I created a version of Keyring controller that will control all the keyrings of wallets. Every keyring by wallet must implement the following interface: ```typescript! export interface Keyring { type: string; serialize: () => Promise<object>; deserialize: (data: object) => Promise<void>; addAccounts: (numberOfAccounts?: number) => Promise<string[]>; getAccounts: () => Promise<string[]>; signTransaction: ( address: string, userOperation: Partial<UserOperationStruct>, options?: object ) => Promise<UserOperationStruct>; signMessage: ( address: string, data: any, options?: object ) => Promise<Buffer>; signPersonalMessage: ( address: string, data: any, options?: object ) => Promise<Buffer>; getEncryptionPublicKey: ( address: string, options?: object ) => Promise<Buffer>; decryptMessage: ( address: string, data: any, options?: object ) => Promise<Buffer>; signTypedData: ( address: string, data: any, options?: object ) => Promise<Buffer>; getAppKeyAddress: (_address: string, origin: string) => Promise<string>; exportAccount: (address: string, options?: object) => Promise<string>; generateRandomMnemonic?: () => void; init?: () => Promise<void>; removeAccount?: (address: string) => void; forgetDevice?: () => any; } ``` 3. So far, I am able to initialise the `keyring` with a password, securely store the keyring's state in localstorage & recover the keyring from the localstorage if password or temperory recovery-key was provided. 4. I also defined the service architecture for my chrome exgtension. Everything in the background & sandbox runs within services which listens to chrome runtime messages to communicate between each other.