Skip to content

Permit Functions with EIP712 Signatures#

Example of testing a permit function with EIP712 signatures.

@dataclass
class Permit:
    owner: Address
    spender: Address
    value: uint256
    nonce: uint256
    deadline: uint256

@flow()
def flow_permit(self) -> None:
    owner = random_account()
    spender = random_account()
    value = random_int(0, 2**256 - 1)

    permit = Permit(
        owner.address,
        spender.address,
        value,
        self.token.nonces(owner),
        self.token.chain.blocks["latest"].timestamp + 100_000
    )

    signature = owner.sign_structured(permit, Eip712Domain(
        name=self.token.name(),
        version="1",
        chainId=self.token.chain.chain_id,
        verifyingContract=self.token.address,
    ))

    with may_revert() as e:
        self.token.permit(
            permit.owner,
            permit.spender,
            permit.value,
            permit.deadline,
            signature[64],  # v
            signature[:32], # r
            signature[32:64], # s
            from_=random_account()
        )