Simulacrum
  • Overview
  • Existential Attestation
    • Validators
  • Synthetic Blockchain
    • Organization
      • Indexer
        • Sources
          • X
          • Telegram
          • TBD
      • Blocks
      • Mempool
      • Commands
        • Wallet
        • Metaprotocols
        • Modifiers
        • Arguments
        • Keyword Arguments
      • Effects
    • Roadmap
  • Metaprotocols
    • The Drops
      • Modules
        • Tokens
          • Token Deployment
          • Airdrops
          • Trading
          • Liquidity
        • Trading
        • Vaults
      • Points
    • MiniGame (TBD)
    • Sportsbook (TBD)
    • Lottery (TBD)
  • Revenue
    • $EMP Staking
  • Fair Witness API
    • Integration
  • FAQ
  • Guides
  • Website
  • X
  • Empyreal
  • Empyreal Docs
Powered by GitBook
On this page
  1. Fair Witness API

Integration

Here's an example of how a bounty can be established that will be paid out when sufficient replies to a user's twitter account are met by a user.

/*
 * This contract is to demonstrate some basic features of the fair witness.
 * In this example, a bounty is paid to a recipient once a single user has
 * replied to a set number of tweets.  So if the score is 20, once a user has
 * replied 20 times, the bounty is paid.
 */

contract ReplyBounty {
    // user to create the bounty for
    bytes32 targetUser;
    // amount of the bounty
    uint256 bounty;
    IAttestationOracle public oracle;
    // who will receive the bounty
    address payable recipient;

    bytes32 constant _dataType = "FAIR_WITNESS_TWEET_v0.1";

    mapping(bytes32 => mapping(bytes32 => bool)) private replies;
    mapping(bytes32 => bool) private validConversation;
    mapping(bytes32 => uint256) private userReplyScore;
    
    uint256 targetScore;
    
    constructor(bytes32 _targetUserId, IAttestationOracle _oracle, address payable _recipient, uint256 _targetScore) payable {
        targetUserId = _targetUserId;
        oracle = _oracle;
        bounty = msg.value;
        recipient = _recipient;
        targetScore = _targetScore;
    }

    function pushUserTweet(TweetLib.Tweet memory tweet, bytes memory attestation) external {
        require(oracle.verify(_dataType, tweet.asBytes(), attestation), "must be verified by oracle");

        // TODO: push to conversation mapping
        require(tweet.userId == targetUser);
        validConverstion[tweet.conversationId] = true;
    }

    function pushReply(TweetLib.Tweet memory tweet, bytes memory attestation) external {
        require(oracle.verify(_dataType, tweet.asBytes(), verificationData), "must be verified by oracle");

        require(validConversation[tweet.conversationId]);
        require(replies[tweet.userId][tweet.conversationId] == false, "tweet already indexed");
        replies[tweet.userId][tweet.conversationId] = true;
        userReplyScore += 1;
        
        if (getScore(tweet.userId) > targetScore) {
            deliverBounty();
        }
    }

    function getScore(bytes32 userId) external view returns(uint256) {
        return userReplyScore[userId];
    }
    
    function deliverBounty() public {
        recipient.call{value: bounty}("");
    }
}
PreviousFair Witness APINextFAQ

Last updated 7 months ago