Smart Contract
ETHUtils
A.d2abb5dbf5e08666.ETHUtils
1/**
2> Reference: https://github.com/onflow/flow-cadence-eth-utils
3
4# ETHUtils
5
6*/
7
8access(all) contract ETHUtils {
9 /// Verify a EVM signature from a message using a public key
10 ///
11 access(all)
12 view fun verifySignature(hexPublicKey: String, hexSignature: String, message: String) : Bool {
13 let decodedHexPublicKey = hexPublicKey.decodeHex()
14 let decodedHexSignature = hexSignature.decodeHex()
15
16 let ethereumMessagePrefix: String = "\u{0019}Ethereum Signed Message:\n".concat(message.length.toString())
17 let fullMessage: String = ethereumMessagePrefix.concat(message)
18
19 let publicKey = PublicKey(
20 publicKey: decodedHexPublicKey,
21 signatureAlgorithm: SignatureAlgorithm.ECDSA_secp256k1
22 )
23
24 let isValid = publicKey.verify(
25 signature: decodedHexSignature,
26 signedData: fullMessage.utf8,
27 domainSeparationTag: "",
28 hashAlgorithm: HashAlgorithm.KECCAK_256
29 )
30
31 return isValid
32 }
33
34 /// Get the EVM address from a public key
35 ///
36 access(all)
37 view fun getETHAddressFromPublicKey(hexPublicKey: String) : String {
38 let decodedHexPublicKey = hexPublicKey.decodeHex()
39 let digest = HashAlgorithm.KECCAK_256.hash(decodedHexPublicKey)
40 let hexDigest = String.encodeHex(digest)
41 let ethAddress = "0x".concat(hexDigest.slice(from: hexDigest.length-40, upTo: hexDigest.length))
42 return ethAddress.toLower()
43 }
44}
45