Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit 5a785ed

Browse files
committed
Improve private key import/export via Gemstone
1 parent 1a202f0 commit 5a785ed

3 files changed

Lines changed: 12 additions & 54 deletions

File tree

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,29 @@
11
package com.gemwallet.android.blockchain.operators.walletcore
22

33
import com.gemwallet.android.blockchain.operators.LoadPrivateDataOperator
4+
import com.gemwallet.android.ext.toChainType
45
import com.gemwallet.android.math.decodeHex
56
import com.gemwallet.android.math.toHexString
7+
import com.wallet.core.primitives.ChainType
68
import com.wallet.core.primitives.Wallet
79
import com.wallet.core.primitives.WalletType
10+
import wallet.core.jni.Base58
811
import wallet.core.jni.StoredKey
912

1013
class WCLoadPrivateDataOperator(
1114
private val keyStoreDir: String
1215
) : LoadPrivateDataOperator {
1316
override suspend fun invoke(wallet: Wallet, password: String): String {
1417
val storeKey = StoredKey.load("$keyStoreDir/${wallet.id}")
15-
return if (wallet.type == WalletType.PrivateKey)
16-
storeKey.decryptPrivateKey(password.decodeHex()).toHexString()
17-
else
18+
return if (wallet.type == WalletType.PrivateKey) {
19+
val bytes = storeKey.decryptPrivateKey(password.decodeHex())
20+
when (wallet.accounts.first().chain.toChainType()) {
21+
ChainType.Bitcoin, ChainType.Solana -> Base58.encodeNoCheck(bytes)
22+
else -> bytes.toHexString()
23+
}
24+
} else {
1825
storeKey.decryptMnemonic(password.decodeHex())
26+
}
1927
}
2028

2129
}

data/repositories/src/main/kotlin/com/gemwallet/android/data/repositoreis/wallets/PhraseAddressImportWalletService.kt

Lines changed: 1 addition & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -15,22 +15,15 @@ import com.gemwallet.android.cases.wallet.ImportError
1515
import com.gemwallet.android.cases.wallet.ImportWalletService
1616
import com.gemwallet.android.data.repositoreis.assets.AssetsRepository
1717
import com.gemwallet.android.data.repositoreis.session.SessionRepository
18-
import com.gemwallet.android.ext.keyEncodingTypes
19-
import com.gemwallet.android.math.decodeHex
2018
import com.gemwallet.android.math.toHexString
2119
import com.gemwallet.android.model.ImportType
2220
import com.wallet.core.primitives.AddressStatus
2321
import com.wallet.core.primitives.BannerEvent
2422
import com.wallet.core.primitives.BannerState
2523
import com.wallet.core.primitives.Chain
26-
import com.wallet.core.primitives.EncodingType
2724
import com.wallet.core.primitives.Wallet
2825
import com.wallet.core.primitives.WalletSource
2926
import com.wallet.core.primitives.WalletType
30-
import kotlinx.coroutines.Dispatchers
31-
import kotlinx.coroutines.withContext
32-
import wallet.core.jni.Base32
33-
import wallet.core.jni.Base58
3427
import wallet.core.jni.PrivateKey
3528

3629
class PhraseAddressImportWalletService(
@@ -172,43 +165,7 @@ class PhraseAddressImportWalletService(
172165
companion object {
173166

174167
fun decodePrivateKey(chain: Chain, data: String): ByteArray {
175-
chain.keyEncodingTypes.forEach { type ->
176-
when (type) {
177-
EncodingType.Base58 -> {
178-
val decoded = Base58.decodeNoCheck(data)
179-
?.takeIf { it.size % 32 == 0 }?.slice(0..< 32)
180-
?.toByteArray()
181-
if (decoded != null) {
182-
return decoded
183-
}
184-
}
185-
EncodingType.Base32 -> {
186-
val decoded = decodeBase32(chain, data)
187-
if (decoded != null) {
188-
return decoded
189-
}
190-
}
191-
EncodingType.Hex -> return data.decodeHex()
192-
}
193-
}
194-
throw IllegalArgumentException("Invalid private key encoding")
195-
}
196-
197-
fun decodeBase32(chain: Chain, data: String): ByteArray? {
198-
return when (chain) {
199-
Chain.Stellar -> {
200-
if (data.length != 56 || !data.startsWith("S")) {
201-
return null
202-
}
203-
val decoded = Base32.decode(data)
204-
if (decoded.size == 35 && decoded[0] == 0x90.toByte()) {
205-
decoded.slice(1 .. 32).toByteArray()
206-
} else {
207-
null
208-
}
209-
}
210-
else -> null
211-
}
168+
return uniffi.gemstone.decodePrivateKey(chain = chain.string, data)
212169
}
213170
}
214171
}

gemcore/src/main/kotlin/com/gemwallet/android/ext/Chain.kt

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,13 +226,6 @@ fun BitcoinChain.fullAddress(address: String) = when (this) {
226226
else -> address
227227
}
228228

229-
val Chain.keyEncodingTypes: List<EncodingType>
230-
get() = when (this) {
231-
Chain.Solana -> listOf(EncodingType.Base58, EncodingType.Hex)
232-
Chain.Stellar -> listOf(EncodingType.Base32, EncodingType.Hex)
233-
else -> listOf(EncodingType.Hex)
234-
}
235-
236229
fun uniffi.gemstone.Chain.toChain(): Chain? {
237230
return Chain.entries.firstOrNull { it.string == this }
238231
}

0 commit comments

Comments
 (0)