APE Price: $0.71 (-3.20%)

Contract

0xdFDDF22aB729D1e2F43FaBe60F99eBcA710F2D34

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Parent Transaction Hash Block From To
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ApeBombNftWinnerClaim

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
File 1 of 1 : ApeBombNftWinnerClaim.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.28;

interface INFTShadow {
    function locked(uint256 tokenId) external view returns (bool);
    function ownerOf(uint256 tokenId) external view returns (address);
}

interface IApeBomb {
    function owner() external view returns (address);
}

struct Winner {
    address contractAddress;
    uint96 amount;
    uint64 tokenId;
    uint40 timestamp;
    bool claimed;
    bool reclaimed;
}

contract ApeBombNftWinnerClaim {
    error NoWinner();
    error NotExpired();
    error NotApeBombContract();
    error InvalidCaller();
    error AlreadyClaimed();
    error TransferFailed();
    error TokenIsLocked();
    error NotOwner();

    event WinnerSet(uint256 tournamentId, Winner winner);
    event Claimed(uint256 tournamentId, address winner, uint256 amount);
    event Reclaimed(uint256 tournamentId, address winner, uint256 amount);

    mapping(uint256 tournamentId => Winner) public winners;
    address public immutable APE_BOMB_CONTRACT_ADDRESS;
    uint256 public constant EXPIRATION = 30 days;

    constructor(address _apeBombContract) {
        APE_BOMB_CONTRACT_ADDRESS = _apeBombContract;
    }

    /**
     * @dev Set the winner of the tournament.
     * @param tournamentId The ID of the tournament.
     * @param contractAddress The address of the NFT contract.
     * @param tokenId The ID of the NFT.
     */
    function setWinner(uint256 tournamentId, address contractAddress, uint256 tokenId) external payable {
        if (msg.sender != APE_BOMB_CONTRACT_ADDRESS) revert NotApeBombContract();

        winners[tournamentId] = Winner({
            contractAddress: contractAddress,
            amount: uint96(msg.value),
            tokenId: uint64(tokenId),
            timestamp: uint40(block.timestamp),
            claimed: false,
            reclaimed: false
        });

        emit WinnerSet(tournamentId, winners[tournamentId]);
    }

    /**
     * @dev Claim the winner's NFT.
     * @param tournamentId The ID of the tournament.
     */
    function claim(uint256 tournamentId) external {
        if (winners[tournamentId].amount == 0) revert NoWinner();

        INFTShadow nftShadow = INFTShadow(winners[tournamentId].contractAddress);
        if (winners[tournamentId].claimed || winners[tournamentId].reclaimed) revert AlreadyClaimed();

        winners[tournamentId].claimed = true;

        uint256 tokenId = winners[tournamentId].tokenId;
        if (nftShadow.locked(tokenId)) revert TokenIsLocked();
        if (nftShadow.ownerOf(tokenId) != msg.sender) revert NotOwner();

        (bool success,) = payable(msg.sender).call{value: winners[tournamentId].amount}("");
        if (!success) revert TransferFailed();

        emit Claimed(tournamentId, msg.sender, winners[tournamentId].amount);
    }

    /**
     * @dev If the winner does not claim within 30 days, 90% of the funds will be added to the current ApeBomb tournament
     * and the remaining 10% will be sent to the ApeBomb owner.
     * @param tournamentId The ID of the tournament.
     */
    function reclaim(uint256 tournamentId) external {
        if (winners[tournamentId].amount == 0) revert NoWinner();
        if (winners[tournamentId].claimed || winners[tournamentId].reclaimed) revert AlreadyClaimed();

        if (block.timestamp < winners[tournamentId].timestamp + EXPIRATION) revert NotExpired();

        winners[tournamentId].reclaimed = true;

        uint256 totalAmount = winners[tournamentId].amount;
        uint256 amountToTournament = totalAmount * 90 / 100;
        uint256 amountToOwner = totalAmount - amountToTournament;

        (bool success,) = payable(APE_BOMB_CONTRACT_ADDRESS).call{value: amountToTournament}("");
        if (!success) revert TransferFailed();

        (success,) = payable(IApeBomb(APE_BOMB_CONTRACT_ADDRESS).owner()).call{value: amountToOwner}("");
        if (!success) revert TransferFailed();

        emit Reclaimed(tournamentId, APE_BOMB_CONTRACT_ADDRESS, winners[tournamentId].amount);
    }
}

Settings
{
  "remappings": [
    "@pythnetwork/entropy-sdk-solidity/=node_modules/@pythnetwork/entropy-sdk-solidity/",
    "solady/=lib/solady/src/",
    "forge-std/=lib/forge-std/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_apeBombContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[],"name":"InvalidCaller","type":"error"},{"inputs":[],"name":"NoWinner","type":"error"},{"inputs":[],"name":"NotApeBombContract","type":"error"},{"inputs":[],"name":"NotExpired","type":"error"},{"inputs":[],"name":"NotOwner","type":"error"},{"inputs":[],"name":"TokenIsLocked","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"indexed":false,"internalType":"address","name":"winner","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reclaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tournamentId","type":"uint256"},{"components":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint64","name":"tokenId","type":"uint64"},{"internalType":"uint40","name":"timestamp","type":"uint40"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"reclaimed","type":"bool"}],"indexed":false,"internalType":"struct Winner","name":"winner","type":"tuple"}],"name":"WinnerSet","type":"event"},{"inputs":[],"name":"APE_BOMB_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"EXPIRATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"}],"name":"reclaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"setWinner","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tournamentId","type":"uint256"}],"name":"winners","outputs":[{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint96","name":"amount","type":"uint96"},{"internalType":"uint64","name":"tokenId","type":"uint64"},{"internalType":"uint40","name":"timestamp","type":"uint40"},{"internalType":"bool","name":"claimed","type":"bool"},{"internalType":"bool","name":"reclaimed","type":"bool"}],"stateMutability":"view","type":"function"}]

60a060405234801561000f575f5ffd5b50604051610bdf380380610bdf83398101604081905261002e9161003f565b6001600160a01b031660805261006c565b5f6020828403121561004f575f5ffd5b81516001600160a01b0381168114610065575f5ffd5b9392505050565b608051610b4061009f5f395f8181606901528181610337015281816103c6015281816104cb01526108200152610b405ff3fe608060405260043610610054575f3560e01c80631f886e6b146100585780632dabbeed146100a8578063379607f5146100c957806351b42283146100e8578063a2fb1175146100fb578063bb4b5734146101d0575b5f5ffd5b348015610063575f5ffd5b5061008b7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b3575f5ffd5b506100c76100c2366004610974565b6101f4565b005b3480156100d4575f5ffd5b506100c76100e3366004610974565b610542565b6100c76100f63660046109a2565b610815565b348015610106575f5ffd5b50610179610115366004610974565b5f60208190529081526040902080546001909101546001600160a01b038216916001600160601b03600160a01b909104169067ffffffffffffffff81169064ffffffffff600160401b8204169060ff600160681b8204811691600160701b90041686565b604080516001600160a01b0390971687526001600160601b03909516602087015267ffffffffffffffff9093169385019390935264ffffffffff1660608401529015156080830152151560a082015260c00161009f565b3480156101db575f5ffd5b506101e662278d0081565b60405190815260200161009f565b5f81815260208190526040812054600160a01b90046001600160601b0316900361023157604051638b9ae95f60e01b815260040160405180910390fd5b5f81815260208190526040902060010154600160681b900460ff168061026e57505f81815260208190526040902060010154600160701b900460ff165b1561028c57604051630c8d9eab60e31b815260040160405180910390fd5b5f818152602081905260409020600101546102b99062278d0090600160401b900464ffffffffff166109eb565b4210156102d95760405163d0404f8560e01b815260040160405180910390fd5b5f81815260208190526040812060018101805460ff60701b1916600160701b179055546001600160601b03600160a01b9091041690606461031b83605a610a04565b6103259190610a1b565b90505f6103328284610a3a565b90505f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836040515f6040518083038185875af1925050503d805f811461039d576040519150601f19603f3d011682016040523d82523d5f602084013e6103a2565b606091505b50509050806103c4576040516312171d8360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610420573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104449190610a4d565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f811461048b576040519150601f19603f3d011682016040523d82523d5f602084013e610490565b606091505b505080915050806104b4576040516312171d8360e31b815260040160405180910390fd5b5f85815260208181526040918290205482518881527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316928101929092526001600160601b03600160a01b909104168183015290517fe79f76d3ef42e7845b4f718917861642d857a02a4e690c28e79e5af7f5f8f2d39181900360600190a15050505050565b5f81815260208190526040812054600160a01b90046001600160601b0316900361057f57604051638b9ae95f60e01b815260040160405180910390fd5b5f81815260208190526040902080546001909101546001600160a01b0390911690600160681b900460ff16806105cc57505f82815260208190526040902060010154600160701b900460ff165b156105ea57604051630c8d9eab60e31b815260040160405180910390fd5b5f82815260208190526040908190206001018054600160681b60ff60681b198216179091559051635a2d1e0760e11b815267ffffffffffffffff90911660048201819052906001600160a01b0383169063b45a3c0e90602401602060405180830381865afa15801561065e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106829190610a6f565b156106a05760405163c066bae760e01b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa1580156106e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107099190610a4d565b6001600160a01b031614610730576040516330cd747160e01b815260040160405180910390fd5b5f838152602081905260408082205490513391600160a01b90046001600160601b0316908381818185875af1925050503d805f811461078a576040519150601f19603f3d011682016040523d82523d5f602084013e61078f565b606091505b50509050806107b1576040516312171d8360e31b815260040160405180910390fd5b5f848152602081815260409182902054825187815233928101929092526001600160601b03600160a01b909104168183015290517f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269181900360600190a150505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461085e576040516339a78b7d60e11b815260040160405180910390fd5b6040805160c0810182526001600160a01b0380851682526001600160601b03348116602080850191825267ffffffffffffffff80881686880190815264ffffffffff428116606089019081525f60808a0181815260a08b018281528f835296829052908b902099519651909716600160a01b0295909716949094178755516001870180549651955193511515600160701b0260ff60701b19941515600160681b029490941661ffff60681b1996909516600160401b026cffffffffffffffffffffffffff19909716919092161794909417929092161717905590517f398209caf1bcaecd286ab47767a44aa435a3ded2db7ae6de4baf4bc4f5f6ebf39161096791869190610a8e565b60405180910390a1505050565b5f60208284031215610984575f5ffd5b5035919050565b6001600160a01b038116811461099f575f5ffd5b50565b5f5f5f606084860312156109b4575f5ffd5b8335925060208401356109c68161098b565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156109fe576109fe6109d7565b92915050565b80820281158282048414176109fe576109fe6109d7565b5f82610a3557634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156109fe576109fe6109d7565b5f60208284031215610a5d575f5ffd5b8151610a688161098b565b9392505050565b5f60208284031215610a7f575f5ffd5b81518015158114610a68575f5ffd5b82815281546001600160a01b038116602083015260a090811c604080840191909152600184015467ffffffffffffffff811660608501529081901c64ffffffffff16608084015260e0830191610aee908401606883901c60ff1615159052565b610b0260c0840160ff8360701c1615159052565b50939250505056fea26469706673582212201c07fe6beb3700d2fb98ed334e7f58fab5a6aaaf8bf72bc06233b9eecb94bb6c64736f6c634300081c0033000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f

Deployed Bytecode

0x608060405260043610610054575f3560e01c80631f886e6b146100585780632dabbeed146100a8578063379607f5146100c957806351b42283146100e8578063a2fb1175146100fb578063bb4b5734146101d0575b5f5ffd5b348015610063575f5ffd5b5061008b7f000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f81565b6040516001600160a01b0390911681526020015b60405180910390f35b3480156100b3575f5ffd5b506100c76100c2366004610974565b6101f4565b005b3480156100d4575f5ffd5b506100c76100e3366004610974565b610542565b6100c76100f63660046109a2565b610815565b348015610106575f5ffd5b50610179610115366004610974565b5f60208190529081526040902080546001909101546001600160a01b038216916001600160601b03600160a01b909104169067ffffffffffffffff81169064ffffffffff600160401b8204169060ff600160681b8204811691600160701b90041686565b604080516001600160a01b0390971687526001600160601b03909516602087015267ffffffffffffffff9093169385019390935264ffffffffff1660608401529015156080830152151560a082015260c00161009f565b3480156101db575f5ffd5b506101e662278d0081565b60405190815260200161009f565b5f81815260208190526040812054600160a01b90046001600160601b0316900361023157604051638b9ae95f60e01b815260040160405180910390fd5b5f81815260208190526040902060010154600160681b900460ff168061026e57505f81815260208190526040902060010154600160701b900460ff165b1561028c57604051630c8d9eab60e31b815260040160405180910390fd5b5f818152602081905260409020600101546102b99062278d0090600160401b900464ffffffffff166109eb565b4210156102d95760405163d0404f8560e01b815260040160405180910390fd5b5f81815260208190526040812060018101805460ff60701b1916600160701b179055546001600160601b03600160a01b9091041690606461031b83605a610a04565b6103259190610a1b565b90505f6103328284610a3a565b90505f7f000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f6001600160a01b0316836040515f6040518083038185875af1925050503d805f811461039d576040519150601f19603f3d011682016040523d82523d5f602084013e6103a2565b606091505b50509050806103c4576040516312171d8360e31b815260040160405180910390fd5b7f000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f6001600160a01b0316638da5cb5b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610420573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104449190610a4d565b6001600160a01b0316826040515f6040518083038185875af1925050503d805f811461048b576040519150601f19603f3d011682016040523d82523d5f602084013e610490565b606091505b505080915050806104b4576040516312171d8360e31b815260040160405180910390fd5b5f85815260208181526040918290205482518881527f000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f6001600160a01b0316928101929092526001600160601b03600160a01b909104168183015290517fe79f76d3ef42e7845b4f718917861642d857a02a4e690c28e79e5af7f5f8f2d39181900360600190a15050505050565b5f81815260208190526040812054600160a01b90046001600160601b0316900361057f57604051638b9ae95f60e01b815260040160405180910390fd5b5f81815260208190526040902080546001909101546001600160a01b0390911690600160681b900460ff16806105cc57505f82815260208190526040902060010154600160701b900460ff165b156105ea57604051630c8d9eab60e31b815260040160405180910390fd5b5f82815260208190526040908190206001018054600160681b60ff60681b198216179091559051635a2d1e0760e11b815267ffffffffffffffff90911660048201819052906001600160a01b0383169063b45a3c0e90602401602060405180830381865afa15801561065e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106829190610a6f565b156106a05760405163c066bae760e01b815260040160405180910390fd5b6040516331a9108f60e11b81526004810182905233906001600160a01b03841690636352211e90602401602060405180830381865afa1580156106e5573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107099190610a4d565b6001600160a01b031614610730576040516330cd747160e01b815260040160405180910390fd5b5f838152602081905260408082205490513391600160a01b90046001600160601b0316908381818185875af1925050503d805f811461078a576040519150601f19603f3d011682016040523d82523d5f602084013e61078f565b606091505b50509050806107b1576040516312171d8360e31b815260040160405180910390fd5b5f848152602081815260409182902054825187815233928101929092526001600160601b03600160a01b909104168183015290517f4ec90e965519d92681267467f775ada5bd214aa92c0dc93d90a5e880ce9ed0269181900360600190a150505050565b336001600160a01b037f000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f161461085e576040516339a78b7d60e11b815260040160405180910390fd5b6040805160c0810182526001600160a01b0380851682526001600160601b03348116602080850191825267ffffffffffffffff80881686880190815264ffffffffff428116606089019081525f60808a0181815260a08b018281528f835296829052908b902099519651909716600160a01b0295909716949094178755516001870180549651955193511515600160701b0260ff60701b19941515600160681b029490941661ffff60681b1996909516600160401b026cffffffffffffffffffffffffff19909716919092161794909417929092161717905590517f398209caf1bcaecd286ab47767a44aa435a3ded2db7ae6de4baf4bc4f5f6ebf39161096791869190610a8e565b60405180910390a1505050565b5f60208284031215610984575f5ffd5b5035919050565b6001600160a01b038116811461099f575f5ffd5b50565b5f5f5f606084860312156109b4575f5ffd5b8335925060208401356109c68161098b565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808201808211156109fe576109fe6109d7565b92915050565b80820281158282048414176109fe576109fe6109d7565b5f82610a3557634e487b7160e01b5f52601260045260245ffd5b500490565b818103818111156109fe576109fe6109d7565b5f60208284031215610a5d575f5ffd5b8151610a688161098b565b9392505050565b5f60208284031215610a7f575f5ffd5b81518015158114610a68575f5ffd5b82815281546001600160a01b038116602083015260a090811c604080840191909152600184015467ffffffffffffffff811660608501529081901c64ffffffffff16608084015260e0830191610aee908401606883901c60ff1615159052565b610b0260c0840160ff8360701c1615159052565b50939250505056fea26469706673582212201c07fe6beb3700d2fb98ed334e7f58fab5a6aaaf8bf72bc06233b9eecb94bb6c64736f6c634300081c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f

-----Decoded View---------------
Arg [0] : _apeBombContract (address): 0xC1932844eDcc3193ae2622089c4B57ae5F023D7f

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c1932844edcc3193ae2622089c4b57ae5f023d7f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.