The ERC-721 standard helps make buying and selling unique digital items (NFTs) safe and reliable. It is crucial to secure transactions between two parties. That is where escrow services come in. They act like a safety net, holding an NFT until everyone agrees and all rules have been met. Let's explore how we can develop an escrow using the ERC-721 standard using OpenZeppelin implementation.
At first, the NFT asset holder needs to approve that a specific token can be used by someone else to transfer it. Only the owner of that token can execute this command.
With the implementation of OpenZeppelin ERC-721, we can call the approve(address to, uint256 tokenId)
function to delegate it.
// Send to ESCROW address
function sendToESCROW(address escrow, uint256 tokenId) public {
approve(escrow, tokenId);
}
In the code above, when the owner of the tokenId
calls this function, they delegate transfer functionality to the escrow
address. Now the escrow
account holder can transfer this NFT to another address.
We can get an approved address to check if the token has been delegated to another account. If it is a zero (0x
) address, that means it has not been delegated.
// Returns the ESCROW address
// 0x address means that this NFT has not been sent to ESCROW
function isSentToESCROW(uint256 tokenId) public view returns(address) {
return _getApproved(tokenId);
}
If the owner of the NFT changes their mind and wants to remove the delegation, they can do so by setting the approval address to zero (0x
) address. In Solidity language, there is no concept of null values. The default value of an address
type is zero (0x
).
// Remove from ESCROW
function removeFromESCROW(uint256 tokenId) public {
approve(address(0), tokenId);
}
Suppose the token has been delegated to an escrow. The escrow can transfer it from the current owner to a new one because it has the right to do it.
// Transfer to new owner from ESCROW
function transferFromEscrow(uint256 tokenId, address from, address to) public {
safeTransferFrom(from, to, tokenId);
}
The OpenZeppelin ERC-721 implementation has the function safeTransferFrom(address from, address to, uint256 tokenId)
that transfers a specific NFT tokenId
from one account from
to another to
. The token must be owned by the from
address. The caller is the escrow, and it has the right to move ownership of this NFT.
The ERC-721 standard and OpenZeppelin's implementation allow safe and reliable buying and selling of NFTs with escrow services. We can send an NFT to an escrow, check if an NFT has been delegated to an escrow, and remove an NFT from escrow. The escrow account holder can execute a transfer to a new owner. Using escrow allows all the parties to agree when the transfer happens when all the rules have been met.
Also published here.