@@ -1256,39 +1256,52 @@ class KeyStoreRestoreViewModel : ViewModel() {
12561256 // Create EVMAccountInfo for keystore registration
12571257 val evmAccountInfo = try {
12581258 val storage = getStorage()
1259- val privateKeyHex = cryptoProvider.getPrivateKey()
1260- val key = PrivateKey .create(storage).apply {
1261- val keyBytes = privateKeyHex.removePrefix(" 0x" ).hexToBytes()
1262- importPrivateKey(keyBytes, KeyFormat .RAW )
1263- }
1259+ if (currentMnemonic.isNullOrBlank().not ()) {
1260+ val hdWallet = wallet.core.jni.HDWallet (currentMnemonic, " " )
1261+ val evmDerivationPath = " m/44'/60'/0'/0/0"
1262+ val evmPrivateKey = hdWallet.getKeyByCurve(wallet.core.jni.Curve .SECP256K1 , evmDerivationPath)
1263+ val evmPublicKey = evmPrivateKey.getPublicKeySecp256k1(false )
1264+ val evmAddress = wallet.core.jni.AnyAddress (evmPublicKey, wallet.core.jni.CoinType .ETHEREUM ).description()
1265+ val jwtHash = Hash .keccak256(firebaseJwt.toByteArray(Charsets .UTF_8 ))
1266+ val signatureData = evmPrivateKey.sign(jwtHash, wallet.core.jni.Curve .SECP256K1 )
1267+ val evmSignature = " 0x" + signatureData.joinToString(" " ) { " %02x" .format(it) }
1268+ EvmAccountInfo (eoaAddress = evmAddress, signature = evmSignature)
1269+ } else {
1270+ val privateKeyHex = cryptoProvider.getPrivateKey()
1271+ val key = PrivateKey .create(storage).apply {
1272+ val keyBytes = privateKeyHex.removePrefix(" 0x" ).hexToBytes()
1273+ importPrivateKey(keyBytes, KeyFormat .RAW )
1274+ }
12641275
1265- // Get secp256k1 public key for EVM address derivation
1266- val evmPublicKeyBytes = key.publicKey(SigningAlgorithm .ECDSA_secp256k1 )
1267- if (evmPublicKeyBytes != null ) {
1268- // Derive EVM address from public key using Keccak256
1269- val publicKeyForHash = if (evmPublicKeyBytes.size == 65 && evmPublicKeyBytes[0 ] == 0x04 .toByte()) {
1270- evmPublicKeyBytes.copyOfRange(1 , evmPublicKeyBytes.size)
1276+ // Get secp256k1 public key for EVM address derivation
1277+ val evmPublicKeyBytes = key.publicKey(SigningAlgorithm .ECDSA_secp256k1 )
1278+ if (evmPublicKeyBytes != null ) {
1279+ // Derive EVM address from public key using Keccak256
1280+ val publicKeyForHash = if (evmPublicKeyBytes.size == 65 && evmPublicKeyBytes[0 ] == 0x04 .toByte()) {
1281+ evmPublicKeyBytes.copyOfRange(1 , evmPublicKeyBytes.size)
1282+ } else {
1283+ evmPublicKeyBytes
1284+ }
1285+ val addressHash = Hash .keccak256(publicKeyForHash)
1286+ val evmAddress = " 0x" + addressHash.copyOfRange(12 , 32 ).joinToString(" " ) { " %02x" .format(it) }
1287+ logd(" KeyStoreRestoreViewModel" , " Derived EVM address: $evmAddress " )
1288+
1289+ // Sign Firebase JWT for EVM with secp256k1 key
1290+ val dataToSign = DomainTag .User .bytes + firebaseJwt.toByteArray(Charsets .UTF_8 )
1291+ val evmSignatureBytes = key.sign(dataToSign, SigningAlgorithm .ECDSA_secp256k1 , HashingAlgorithm .SHA2_256 )
1292+ val evmSignature = evmSignatureBytes.joinToString(" " ) { " %02x" .format(it) }
1293+ logd(" KeyStoreRestoreViewModel" , " Generated EVM signature, length: ${evmSignature.length} " )
1294+
1295+ EvmAccountInfo (
1296+ eoaAddress = evmAddress,
1297+ signature = evmSignature
1298+ )
12711299 } else {
1272- evmPublicKeyBytes
1300+ logd(" KeyStoreRestoreViewModel" , " Could not derive secp256k1 public key, skipping EVM account" )
1301+ null
12731302 }
1274- val addressHash = Hash .keccak256(publicKeyForHash)
1275- val evmAddress = " 0x" + addressHash.copyOfRange(12 , 32 ).joinToString(" " ) { " %02x" .format(it) }
1276- logd(" KeyStoreRestoreViewModel" , " Derived EVM address: $evmAddress " )
1277-
1278- // Sign Firebase JWT for EVM with secp256k1 key
1279- val dataToSign = DomainTag .User .bytes + firebaseJwt.toByteArray(Charsets .UTF_8 )
1280- val evmSignatureBytes = key.sign(dataToSign, SigningAlgorithm .ECDSA_secp256k1 , HashingAlgorithm .SHA2_256 )
1281- val evmSignature = evmSignatureBytes.joinToString(" " ) { " %02x" .format(it) }
1282- logd(" KeyStoreRestoreViewModel" , " Generated EVM signature, length: ${evmSignature.length} " )
1283-
1284- EvmAccountInfo (
1285- eoaAddress = evmAddress,
1286- signature = evmSignature
1287- )
1288- } else {
1289- logd(" KeyStoreRestoreViewModel" , " Could not derive secp256k1 public key, skipping EVM account" )
1290- null
12911303 }
1304+
12921305 } catch (e: Exception ) {
12931306 logd(" KeyStoreRestoreViewModel" , " Error creating EVM account info: ${e.message} " )
12941307 null
0 commit comments