Integration Doc

Smart Contract

pragma solidity ^0.8.0;

pragma experimental ABIEncoderV2;

interface IProofRegistry {
    function verify(address collection, uint256 tokenId, uint256 isBlock, bytes32[] calldata merkleProof) external view returns (bool);
}

contract SwapGuard {

    struct SwapItem {
        address collection;
        uint256 tokenId;
        uint256 isBlock;
        bytes32[] merkleProof;
    }

    IProofRegistry public proofRegistry;

    constructor(address proofRegistry_) public {
        proofRegistry = IProofRegistry(proofRegistry_);
    }

    function swap(SwapItem[] memory items) public {
        uint256 numSwaps = items.length;
        for (uint256 i; i < numSwaps; ) {
            bool isBlockd = proofRegistry.verify(
                items[i].collection,
                items[i].tokenId,
                items[i].isBlock,
                items[i].merkleProof
            );
            require(!isBlockd, "token blocked");
            // keep swap
        }
    }
}

Retrieve Proof

From API


async function fetchProof(collection, tokenId) {
    const req = await fetch(`https://api.0xsauce.xyz/api/getProof?collection=${collection}&tokenId=${tokenId}`);
    const res = await req.json();
    return res.results ? res.results[0] : null
};

const proof = await fetchProof('0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d', 1);
console.log('proof', proof)

From IPFS

const prooRegistry = new ethers.Contract(registryAddr, RegistryABI, provider);
const proof = await prooRegistry.getProof(collection);
console.log('ipfs proof', proof.url)

Swap

const swapWithGuard = new ethers.Contract(SwapGuardAddr, SwapGuardABI, provider);

const tokenId = 1;
const collection = = "0xbc4ca0eda7647a8ab7c2061c2e118a18a936f13d";

// retrieve proof
const proof = await fetchProof(collection, tokenId);

// take with proof
await swapWithGuard.swap(
    [
        {
            collection,
            tokenId,
            proof.isBlock,
            proof.merkleProof
        }
    ]
)