ERC-6147: NFT Guard (Multi-Sig Transfer Protection)
ERC-6147 introduces a guard address per token: a designated co-signer whose approval is required before the token can be transferred or burned. Used to protect high-value NFTs from compromised owner keys — the guard can be a hardware wallet, a multi-sig, or a recovery service.
Required Interface
function changeGuard(uint256 tokenId, address guard, uint64 expires) external;
function guardOf(uint256 tokenId) external view returns (address guard, uint64 expires);
function removeGuard(uint256 tokenId) external;Transfer / burn operations check guardOf(tokenId) and require both the owner's authorization AND the guard's authorization (until expires).
Neo Equivalent: Direct Port
The mirror's contract pair adopts a guard-takes-over delegate model on both sides: while a guard is set, only the guard can transfer the token; once cleared, control returns to the owner. This single-required-signer shape is what's consistently expressible in both Solidity (one msg.sender per call) and Neo C# (one Runtime.CheckWitness call), keeping the two implementations behaviorally aligned.
Live on Neo TestNet
Both implementations are deployed on Neo N3 TestNet (network magic 894710606).
| Implementation | Contract Hash | Deploy Tx |
|---|---|---|
Solidity (neo-solc) | 0xaf32605e284ccf3e5e281af082f72605c506064f | (v2 redeploy — see explorer) |
Neo C# (nccs) | 0x274c031d361e30a518d30035d527eb95efac19df | (v2 redeploy — see explorer) |
Cross-implementation invocations match on mint and transfer (with the guard-or-owner authorization gate). Source pairs under docs/standards-mirror/deployments/erc-6147/.
