diff --git a/index.html b/index.html index 6291802..5b0a2de 100644 --- a/index.html +++ b/index.html @@ -2775,6 +2775,8 @@ value.startsWith('suiprivkey1') ) { isValid = true; + } else if (value.startsWith('S') && value.length === 56) { + isValid = true; } else { try { isValid = !!floCrypto.getPubKeyHex(value); } catch (e) { } } @@ -2845,7 +2847,33 @@ }); if (!activeChain) return; } - else if (privateKey.startsWith('S') && privateKey.length === 56) activeChain = 'XLM'; + else if (privateKey.startsWith('S') && privateKey.length === 56) { + activeChain = 'XLM'; + try { + const BASE32_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567"; + let bits = 0; + let value = 0; + let output = []; + for (let i = 0; i < privateKey.length; i++) { + let val = BASE32_ALPHABET.indexOf(privateKey[i].toUpperCase()); + if (val < 0) throw new Error("Invalid Base32 character"); + value = (value << 5) | val; + bits += 5; + if (bits >= 8) { + output.push((value >>> (bits - 8)) & 255); + bits -= 8; + } + } + // First byte is version, next 32 bytes are Ed25519 seed + const seedBytes = output.slice(1, 33); + const seedHex = Crypto.util.bytesToHex(seedBytes); + let key = new Bitcoin.ECKey(seedHex); + key.setCompressed(true); + privateKey = key.getBitcoinWalletImportFormat(); + } catch (e) { + console.error("Failed to decode XLM key", e); + } + } else if (privateKey.startsWith('R')) activeChain = 'FLO'; else activeChain = 'UNKNOWN'; }