ERC-667 was an early proposal to add transferAndCall functionality to ERC-20 tokens on Ethereum. It predates the similar and much more widely known ERC-677, and the two are frequently confused.

What it proposed#

Like ERC-677, ERC-667 aimed to solve the two-step approve + transferFrom pattern by combining a token transfer with a smart contract callback in a single transaction. The core idea was identical: call a function on the receiving contract immediately after transferring tokens, so the recipient can react atomically.

The proposed interface was essentially:

1
2
3
4
5
6
7
interface IERC667 is IERC20 {
    function transferAndCall(
        address to,
        uint256 value,
        bytes calldata data
    ) external returns (bool);
}

Why it didn’t take off#

ERC-667 never advanced beyond the discussion stage and has no notable token implementations. ERC-677 – proposed shortly after – covered the same ground and gained traction through Chainlink’s adoption for the LINK token. The later ERC-1363 standard further superseded both by adding approveAndCall and a safer magic-value callback pattern.

In practice, most references to “ERC-667” in documentation and forum posts are either:

  • Mistaken references to ERC-677, or
  • Historical citations of the original discussion thread.