Smart Contract

ETHUtils

A.d2abb5dbf5e08666.ETHUtils

Deployed

1d ago
Feb 26, 2026, 10:29:26 PM UTC

Dependents

0 imports
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