ERCs

ERC-4494 — Permit for ERC-721

eips.ethereum.org/EIPS/eip-4494

ERC-2612 permit ported to NFTs. The owner signs an off-chain authorization for a specific tokenId; any party submits the permit to authorize the spender.

import { parse } from "valibot";
import { AddressSchema, BytesSchema, Uint256Schema } from "@ethernauta/core";
import { permit } from "@ethernauta/erc/4494";
import type { Provider } from "@ethernauta/eip/1193";
import { create_provider, encode_chain_id } from "@ethernauta/transport";
import { eip155_1 } from "@ethernauta/chain/eip155-1";

const CHAIN_ID = encode_chain_id({ namespace: "eip155", reference: eip155_1.chainId });
declare const provider: Provider; // see /eips/6963 for discovery
const { signer } = create_provider(provider);

const collection = parse(AddressSchema, "0xBC4CA0EdA7647A8aB7C2061c2E118A18a936f13D");
const spender = parse(AddressSchema, "0x70997970C51812dc3A010C7d01b50e0d17dc79C8");
const tokenId = parse(Uint256Schema, "0x1");
const deadline = parse(Uint256Schema, "0xffffffff");
const sig = parse(BytesSchema, "0x");

const signed = await permit({ spender, tokenId, deadline, sig })(
  signer({ chain_id: CHAIN_ID, to: collection }),
);
void signed;

Surface

MethodShapePurpose
permit({ spender, token_id, deadline, sig })Signable<Hash32>Submit the permit.
nonces({ token_id })Callable<Uint256>Per-token nonce.
DOMAIN_SEPARATOR()Callable<Bytes32>EIP-712 domain.

See also