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");
}
}
}
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";
const proof = await fetchProof(collection, tokenId);
await swapWithGuard.swap(
[
{
collection,
tokenId,
proof.isBlock,
proof.merkleProof
}
]
)