const ethers = require("ethers") const pk = "0x0471c746523d16e93d4738f882d9b0beebf66c68caa0f895db15686b57b878cfc7b3e09813ba94f1bbfaa91a06566d3d18bbf69d10bcc947325bbcd6fea97ed692" const ad = "0xcD3edF915387E2555A829567cE0dBbC919834B82" getPubKey = async () => { const infuraProvider = new ethers.providers.JsonRpcProvider( "https://ropsten.infura.io/v3/" ) const tx = await infuraProvider.getTransaction( "0x07035a057bdddc9c0e1c07c32b341f6082f9d6be2dc39452753587c2e69fbf96" ) const expandedSig = { r: tx.r, s: tx.s, v: tx.v } const signature = ethers.utils.joinSignature(expandedSig) const txData = { gasPrice: tx.gasPrice, gasLimit: tx.gasLimit, value: tx.value, nonce: tx.nonce, data: tx.data, chainId: tx.chainId, to: tx.to } const rsTx = await ethers.utils.resolveProperties(txData) const raw = ethers.utils.serializeTransaction(rsTx) // returns RLP encoded tx const msgHash = ethers.utils.keccak256(raw) // as specified by ECDSA const msgBytes = ethers.utils.arrayify(msgHash) // create binary hash const recoveredPubKey = ethers.utils.recoverPublicKey(msgBytes, signature) const recoveredAddress = ethers.utils.recoverAddress(msgBytes, signature) console.log(recoveredAddress) console.log(recoveredPubKey) console.log("Correct public key:", recoveredPubKey === pk) console.log("Correct address:", recoveredAddress === ad) } getPubKey()