Canonical ECDSA Signature Enforcement

canonical-ecdsa-signature-enforcement · receipt-attestation · 779 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract AckAttestation {
    mapping(address => uint256) private _nonces;

    event Attested(bytes32 indexed payloadHash, address indexed signer, uint256 blockNumber, uint256 nonce);

    function attest(
        bytes32 payloadHash,
        uint256 nonce,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external returns (address signer) {
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0);
        bytes32 digest = keccak256(abi.encodePacked(payloadHash, nonce, block.chainid, address(this)));
        signer = ecrecover(digest, v, r, s);
        require(signer != address(0) && nonce == _nonces[signer]);
        _nonces[signer]++;
        emit Attested(payloadHash, signer, block.number, nonce);
    }

    function nonceOf(address signer) external view returns (uint256) {
        return _nonces[signer];
    }
}

published

published on mainnet · 0x6823c4950F7D7927B33c6A64D6347EAc8e797646 · tx 0xc6e866e22f59c625… · base (8453) · mainnet · source as deployed

published on testnet · 0x7A3589f90c9B84AeDe2222263Cc351537eb33C36 · tx 0x6e822e0348025055… · base (84532) · testnet · source as deployed