diff --git a/index.html b/index.html index 0145e3b..3d0b0f7 100644 --- a/index.html +++ b/index.html @@ -155,6 +155,14 @@
+ @@ -832,10 +840,14 @@ } function checkSenderBalance() { let address; - const wif = getRef('private_key_input').value.trim() - if (!wif) + const privateKey = getRef('private_key_input').value.trim() + if (!privateKey) return notify(`Please enter sender's private key to check balance`) - address = floEthereum.ethAddressFromPrivateKey(coinjs.wif2privkey(wif).privkey) + if (privateKey.startsWith('R') || privateKey.startsWith('L') || privateKey.startsWith('K')) { + address = floEthereum.ethAddressFromPrivateKey(coinjs.wif2privkey(privateKey).privkey) + } else { + address = floEthereum.ethAddressFromPrivateKey(privateKey) + } getRef('sender_balance_container').classList.remove('hidden') renderElem(getRef('sender_balance_container'), html` Loading balance... `) const promises = [ethOperator.getBalance(address)] diff --git a/scripts/floEthereum.js b/scripts/floEthereum.js index 52488d0..2717684 100644 --- a/scripts/floEthereum.js +++ b/scripts/floEthereum.js @@ -4,47 +4,53 @@ 'use strict'; const floEthereum = EXPORTS; -const ethAddressFromPrivateKey = floEthereum.ethAddressFromPrivateKey = function(privateKey){ - var t1,t2,t3,t4; + const ethAddressFromPrivateKey = floEthereum.ethAddressFromPrivateKey = function (privateKey, onlyEvenY = false) { + var t1, t1_x, t1_y, t1_y_BigInt, t2, t3, t4; + var groupOrder = BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F"); - t1 = secp.Point.fromPrivateKey(hex.decode(privateKey)); - if (!t1.hasEvenY()) { t1 = t1.negate(); } - t2 = t1.x.toString(16) + t1.y.toString(16); - t3 = keccak.keccak_256(Crypto.util.hexToBytes(t2)); - t4 = keccak.extractLast20Bytes(t3); - return "0x" + t4; -} + t1 = bitjs.newPubkey(privateKey); + t1_x = t1.slice(2, 66); t1_y = t1.slice(-64); + if (onlyEvenY) { + t1_y_BigInt = BigInt("0x" + t1_y); + if (t1_y_BigInt % 2n !== 0n) { t1_y_BigInt = (groupOrder - t1_y_BigInt) % groupOrder; t1_y = t1_y_BigInt.toString(16) } + }; -const ethAddressFromCompressedPublicKey = floEthereum.ethAddressFromCompressedPublicKey = function(compressedPublicKey){ - var t1,t2,t3,t4; - t1 = coinjs.compressedToUncompressed(compressedPublicKey); - t2 = t1.slice(2); - t3 = keccak.keccak_256(Crypto.util.hexToBytes(t2)); - t4 = keccak.extractLast20Bytes(t3); - return "0x" + t4; -} + t2 = t1_x.toString(16) + t1_y.toString(16); + t3 = keccak.keccak_256(Crypto.util.hexToBytes(t2)); + t4 = keccak.extractLast20Bytes(t3); + return "0x" + t4; + } -const ethPrivateKeyFromUntweakedPrivateKey = floEthereum.ethPrivateKeyFromUntweakedPrivateKey = function(untweakedPrivateKey) { - var t1; - t1 = hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey))); - return t1; -} + const ethAddressFromCompressedPublicKey = floEthereum.ethAddressFromCompressedPublicKey = function (compressedPublicKey) { + var t1, t2, t3, t4; + t1 = coinjs.compressedToUncompressed(compressedPublicKey); + t2 = t1.slice(2); + t3 = keccak.keccak_256(Crypto.util.hexToBytes(t2)); + t4 = keccak.extractLast20Bytes(t3); + return "0x" + t4; + } -const ethAddressFromUntweakedPrivateKey = floEthereum.ethAddressFromUntweakedPrivateKey = function(untweakedPrivateKey) { - var t1,t2; - t1 = hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey))); - t2 = ethAddressFromPrivateKey(t1); - return t2; -} + const ethPrivateKeyFromUntweakedPrivateKey = floEthereum.ethPrivateKeyFromUntweakedPrivateKey = function (untweakedPrivateKey) { + var t1; + t1 = hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey))); + return t1; + } -const ethAddressFromTaprootAddress = floEthereum.ethAddressFromTaprootAddress = function(taprootAddress) { - var t1,t2,t3,t4; - t1 = coinjs.addressDecode(taprootAddress); - t2 = t1.outstring.slice(4); - t3 = "02" + t2; - t4 = ethAddressFromCompressedPublicKey(t3); - return t4; -} + const ethAddressFromUntweakedPrivateKey = floEthereum.ethAddressFromUntweakedPrivateKey = function (untweakedPrivateKey) { + var t1, t2; + t1 = hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey))); + t2 = ethAddressFromPrivateKey(t1); + return t2; + } + + const ethAddressFromTaprootAddress = floEthereum.ethAddressFromTaprootAddress = function (taprootAddress) { + var t1, t2, t3, t4; + t1 = coinjs.addressDecode(taprootAddress); + t2 = t1.outstring.slice(4); + t3 = "02" + t2; + t4 = ethAddressFromCompressedPublicKey(t3); + return t4; + } diff --git a/scripts/floEthereum.min.js b/scripts/floEthereum.min.js new file mode 100644 index 0000000..c39765f --- /dev/null +++ b/scripts/floEthereum.min.js @@ -0,0 +1 @@ +!function(EXPORTS){"use strict";const floEthereum="object"===typeof module?module.exports:window.floEthereum={},ethAddressFromPrivateKey=floEthereum.ethAddressFromPrivateKey=function(privateKey,onlyEvenY=!1){var t1,t1_x,t1_y,t1_y_BigInt,t2,t3,groupOrder=BigInt("0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F");return t1_x=(t1=bitjs.newPubkey(privateKey)).slice(2,66),t1_y=t1.slice(-64),onlyEvenY&&(t1_y_BigInt=BigInt("0x"+t1_y))%2n!==0n&&(t1_y=(t1_y_BigInt=(groupOrder-t1_y_BigInt)%groupOrder).toString(16)),t2=t1_x.toString(16)+t1_y.toString(16),t3=keccak.keccak_256(Crypto.util.hexToBytes(t2)),"0x"+keccak.extractLast20Bytes(t3)},ethAddressFromCompressedPublicKey=floEthereum.ethAddressFromCompressedPublicKey=function(compressedPublicKey){var t2,t3;return t2=coinjs.compressedToUncompressed(compressedPublicKey).slice(2),t3=keccak.keccak_256(Crypto.util.hexToBytes(t2)),"0x"+keccak.extractLast20Bytes(t3)};floEthereum.ethPrivateKeyFromUntweakedPrivateKey=function(untweakedPrivateKey){return hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey)))},floEthereum.ethAddressFromUntweakedPrivateKey=function(untweakedPrivateKey){var t1;return t1=hex.encode(taproot.taprootTweakPrivKey(hex.decode(untweakedPrivateKey))),ethAddressFromPrivateKey(t1)},floEthereum.ethAddressFromTaprootAddress=function(taprootAddress){var t2;return t2=coinjs.addressDecode(taprootAddress).outstring.slice(4),ethAddressFromCompressedPublicKey("02"+t2)}}(); \ No newline at end of file