ETH Price: $2,695.56 (+2.18%)

Contract

0xa0Eb570C2222d74D8110292C55f90bB7091deA78
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Redeem171496342023-04-29 5:19:47517 days ago1682745587IN
0xa0Eb570C...7091deA78
0 ETH0.0025671529.79903486
Redeem171358962023-04-27 7:00:11519 days ago1682578811IN
0xa0Eb570C...7091deA78
0 ETH0.0048913432.81656211
Redeem171358942023-04-27 6:59:47519 days ago1682578787IN
0xa0Eb570C...7091deA78
0 ETH0.0027392632.00492824
Redeem171358902023-04-27 6:58:59519 days ago1682578739IN
0xa0Eb570C...7091deA78
0 ETH0.0028267333.02681518
Redeem171358902023-04-27 6:58:59519 days ago1682578739IN
0xa0Eb570C...7091deA78
0 ETH0.0028277233.03845518
Redeem171358862023-04-27 6:58:11519 days ago1682578691IN
0xa0Eb570C...7091deA78
0 ETH0.0029654634.64777749
Redeem171358852023-04-27 6:57:59519 days ago1682578679IN
0xa0Eb570C...7091deA78
0 ETH0.0028665333.49183831
Redeem171358852023-04-27 6:57:59519 days ago1682578679IN
0xa0Eb570C...7091deA78
0 ETH0.0028665333.49183831
Redeem171358822023-04-27 6:57:23519 days ago1682578643IN
0xa0Eb570C...7091deA78
0 ETH0.0027652132.30811265
Redeem171358782023-04-27 6:56:35519 days ago1682578595IN
0xa0Eb570C...7091deA78
0 ETH0.0032213437.63738243
Redeem171358772023-04-27 6:56:23519 days ago1682578583IN
0xa0Eb570C...7091deA78
0 ETH0.0064396837.24102456
Redeem171358722023-04-27 6:55:23519 days ago1682578523IN
0xa0Eb570C...7091deA78
0 ETH0.003226737.7
Redeem171358672023-04-27 6:54:23519 days ago1682578463IN
0xa0Eb570C...7091deA78
0 ETH0.0031610336.93277716
Redeem171358572023-04-27 6:52:23519 days ago1682578343IN
0xa0Eb570C...7091deA78
0 ETH0.0031529636.83839424
Redeem171358542023-04-27 6:51:47519 days ago1682578307IN
0xa0Eb570C...7091deA78
0 ETH0.0029202534.1195694
Redeem171358542023-04-27 6:51:47519 days ago1682578307IN
0xa0Eb570C...7091deA78
0 ETH0.0029953234.1195694
Redeem171358532023-04-27 6:51:35519 days ago1682578295IN
0xa0Eb570C...7091deA78
0 ETH0.0028871633.73288345
Redeem171358482023-04-27 6:50:35519 days ago1682578235IN
0xa0Eb570C...7091deA78
0 ETH0.0029300234.2336194
Redeem171358452023-04-27 6:49:47519 days ago1682578187IN
0xa0Eb570C...7091deA78
0 ETH0.0030167935.24745056
Redeem171358432023-04-27 6:49:23519 days ago1682578163IN
0xa0Eb570C...7091deA78
0 ETH0.0033679739.3505894
Redeem171358392023-04-27 6:48:35519 days ago1682578115IN
0xa0Eb570C...7091deA78
0 ETH0.0026572331.04648628
Redeem171358382023-04-27 6:48:23519 days ago1682578103IN
0xa0Eb570C...7091deA78
0 ETH0.0027913932.61392727
Redeem171358372023-04-27 6:48:11519 days ago1682578091IN
0xa0Eb570C...7091deA78
0 ETH0.0036231433.55197243
Redeem171358352023-04-27 6:47:47519 days ago1682578067IN
0xa0Eb570C...7091deA78
0 ETH0.0027170331.74518409
Redeem171358282023-04-27 6:46:23519 days ago1682577983IN
0xa0Eb570C...7091deA78
0 ETH0.0048851432.74618459
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RankingRedeemer

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 2 : RankingRedeemer.sol
// SPDX-License-Identifier: MIT
// Copyright 2023 PROOF Holdings Inc
pragma solidity ^0.8.0;

import {IRedeemableToken} from "./interfaces/IRedeemableToken.sol";

interface RankingRedeemerEvents {
    /**
     * @notice Emitted on redemption.
     */
    event VoucherRedeemedAndRankingCommited(
        address indexed sender, IRedeemableToken indexed voucher, uint256 indexed tokenId, uint8[] ranking
    );
}

/**
 * @notice Redeemes a token with a submitted ranking of choices, emitting an event containing the ranking as proof.
 * @dev The choices are numbered from 0 to `numChoices - 1`.
 */
contract RankingRedeemer is RankingRedeemerEvents {
    /**
     * @notice Thrown when the ranking length is not equal to the number of choices.
     */
    error InvalidRankingLength(Redemption, uint256 actual, uint256 expected);

    /**
     * @notice Thrown if not all choices were included in a given ranking.
     */
    error InvalidRanking(Redemption, uint256 choicesBitmask);

    /**
     * @notice The number of choices.
     */
    uint8 internal immutable _numChoices;

    /**
     * @notice The bitmask containing all choices.
     */
    uint256 internal immutable _happyBitmask;

    constructor(uint8 numChoices) {
        _numChoices = numChoices;
        _happyBitmask = (1 << numChoices) - 1;
    }

    /**
     * @notice Redeems a redeemable voucher and emits an event containing the ranking of choices as proof.
     * @dev The ranking must contain all choices exactly once, reverts otherwise.
     */
    function _redeem(Redemption calldata r) internal virtual {
        if (r.ranking.length != _numChoices) {
            revert InvalidRankingLength(r, r.ranking.length, _numChoices);
        }

        uint256 choicesBitmask;
        for (uint256 i; i < r.ranking.length; ++i) {
            choicesBitmask |= 1 << r.ranking[i];
        }

        if (choicesBitmask != _happyBitmask) {
            revert InvalidRanking(r, choicesBitmask);
        }

        emit VoucherRedeemedAndRankingCommited(msg.sender, r.redeemable, r.tokenId, r.ranking);
        r.redeemable.redeem(msg.sender, r.tokenId);
    }

    struct Redemption {
        IRedeemableToken redeemable;
        uint256 tokenId;
        uint8[] ranking;
    }

    /**
     * @notice Redeems multiple vouchers and emits events containing the rankings as proof.
     */
    function redeem(Redemption[] calldata redemptions) public virtual {
        for (uint256 i; i < redemptions.length; ++i) {
            _redeem(redemptions[i]);
        }
    }
}

File 2 of 2 : IRedeemableToken.sol
// SPDX-License-Identifier: MIT
// Copyright 2023 PROOF Holdings Inc
pragma solidity ^0.8.0;

/**
 * @notice Interface for a redeemable Voucher token preventing double spending
 * through internal book-keeping (e.g. burning the token, token property, etc.).
 * @dev Voucher tokens are intendent to be redeemed through a redeemer contract.
 */
interface IRedeemableToken {
    /**
     * @notice Thrown if the redemption caller is not allowed to spend a given
     * voucher.
     */
    error RedeemerCallerNotAllowedToSpendVoucher(address sender, uint256 tokenId);

    /**
     * @notice Interface through which a `IRedeemer` contract informs the
     * voucher about its redemption.
     * @param sender The address that initiate the redemption on the
     * redeemer contract.
     * @param tokenId The voucher token to be redeemed.
     * @dev This function MUST be called by redeemer contracts.
     * @dev MUST revert with `RedeemerNotApproved` if the calling redeemer
     * contract is not approved to spend this voucher.
     * @dev MUST revert with `RedeemerCallerNotAllowedToSpendVoucher` if
     * sender is not allowed to spend tokenId.
     */
    function redeem(address sender, uint256 tokenId) external;
}

Settings
{
  "remappings": [
    "@divergencetech/ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
    "@openzeppelin-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    "@openzeppelin-4.7/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    "@openzeppelin/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
    "ERC721A/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/contracts/",
    "ERC721A_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
    "artblocks-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/contracts/",
    "artblocks-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/artblocks-contracts_fa1dc466/",
    "delegation-registry/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/src/",
    "delegation-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/delegation-registry_2d1a158b/",
    "ds-test/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/src/",
    "ds-test_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ds-test_013e6c64/",
    "erc721a/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ERC721A_4-2-3/",
    "ethier/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/contracts/",
    "ethier_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/ethier_0-55-0/",
    "forge-std/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/forge-std_1-4-0/src/",
    "openzeppelin-contracts-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/contracts/",
    "openzeppelin-contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
    "openzeppelin-contracts/contracts/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/contracts/",
    "openzeppelin-contracts_root-4-7-0/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-7-0_exact_remap/",
    "openzeppelin-contracts_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/openzeppelin-contracts_4-8-1/",
    "operator-filter-registry/src/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/src/",
    "operator-filter-registry_root/=/home/dave/.cache/bazel/_bazel_dave/b9a57168317213f9241a484d2ee2d038/external/operator-filter-registry_1-4-1/",
    "proof/artblocks/=/home/dave/proof/proof-seller/contracts/artblocks/src/",
    "proof/constants/=/home/dave/proof/proof-seller/contracts/constants/src/",
    "proof/redemption/=/home/dave/proof/proof-seller/contracts/redemption/src/",
    "proof/sellers/=/home/dave/proof/proof-seller/contracts/sellers/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint8","name":"numChoices","type":"uint8"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"components":[{"internalType":"contract IRedeemableToken","name":"redeemable","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8[]","name":"ranking","type":"uint8[]"}],"internalType":"struct RankingRedeemer.Redemption","name":"","type":"tuple"},{"internalType":"uint256","name":"choicesBitmask","type":"uint256"}],"name":"InvalidRanking","type":"error"},{"inputs":[{"components":[{"internalType":"contract IRedeemableToken","name":"redeemable","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8[]","name":"ranking","type":"uint8[]"}],"internalType":"struct RankingRedeemer.Redemption","name":"","type":"tuple"},{"internalType":"uint256","name":"actual","type":"uint256"},{"internalType":"uint256","name":"expected","type":"uint256"}],"name":"InvalidRankingLength","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"contract IRedeemableToken","name":"voucher","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint8[]","name":"ranking","type":"uint8[]"}],"name":"VoucherRedeemedAndRankingCommited","type":"event"},{"inputs":[{"components":[{"internalType":"contract IRedeemableToken","name":"redeemable","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint8[]","name":"ranking","type":"uint8[]"}],"internalType":"struct RankingRedeemer.Redemption[]","name":"redemptions","type":"tuple[]"}],"name":"redeem","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405234801561001057600080fd5b5060405161079c38038061079c83398101604081905261002f91610050565b60ff811660808190526100479060019081901b61007a565b60a052506100a1565b60006020828403121561006257600080fd5b815160ff8116811461007357600080fd5b9392505050565b8181038181111561009b57634e487b7160e01b600052601160045260246000fd5b92915050565b60805160a0516106d06100cc60003960006101a10152600081816095015261010501526106d06000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b3f903e014610030575b600080fd5b61004361003e366004610304565b610045565b005b60005b8181101561008c5761007c83838381811061006557610065610379565b905060200281019061007791906103a8565b610091565b610085816103e6565b9050610048565b505050565b60ff7f0000000000000000000000000000000000000000000000000000000000000000166100c26040830183610445565b90501461013657806100d76040820182610445565b6040517f02e75c0b00000000000000000000000000000000000000000000000000000000815261012d9392507f0000000000000000000000000000000000000000000000000000000000000000906004016105c9565b60405180910390fd5b6000805b6101476040840184610445565b905081101561019e5761015d6040840184610445565b8281811061016d5761016d610379565b905060200201602081019061018291906105f5565b60ff166001901b8217915080610197906103e6565b905061013a565b507f000000000000000000000000000000000000000000000000000000000000000081146101fc5781816040517f1504f8ec00000000000000000000000000000000000000000000000000000000815260040161012d929190610617565b6020820180359061020d9084610639565b73ffffffffffffffffffffffffffffffffffffffff16337f5d91ab0394e910ccee855e471cfcd5400990911bf127ed49def138b610711c1b6102526040870187610445565b604051610260929190610654565b60405180910390a46102756020830183610639565b6040517f1e9a69500000000000000000000000000000000000000000000000000000000081523360048201526020840135602482015273ffffffffffffffffffffffffffffffffffffffff9190911690631e9a695090604401600060405180830381600087803b1580156102e857600080fd5b505af11580156102fc573d6000803e3d6000fd5b505050505050565b6000806020838503121561031757600080fd5b823567ffffffffffffffff8082111561032f57600080fd5b818501915085601f83011261034357600080fd5b81358181111561035257600080fd5b8660208260051b850101111561036757600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126103dc57600080fd5b9190910192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361043e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261047a57600080fd5b83018035915067ffffffffffffffff82111561049557600080fd5b6020019150600581901b36038213156104ad57600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104d857600080fd5b919050565b803560ff811681146104d857600080fd5b60006060830173ffffffffffffffffffffffffffffffffffffffff610512846104b4565b1684526020808401358186015260408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811261055457600080fd5b8401818101903567ffffffffffffffff81111561057057600080fd5b8060051b360382131561058257600080fd5b606060408801529283905291600090608087015b818310156105be5760ff6105a9866104dd565b16815293830193600192909201918301610596565b979650505050505050565b6060815260006105dc60608301866104ee565b905083602083015260ff83166040830152949350505050565b60006020828403121561060757600080fd5b610610826104dd565b9392505050565b60408152600061062a60408301856104ee565b90508260208301529392505050565b60006020828403121561064b57600080fd5b610610826104b4565b60208082528181018390526000908460408401835b8681101561068f5760ff61067c846104dd565b1682529183019190830190600101610669565b50969550505050505056fea2646970667358221220cbc0a64fb70fe47594aa7cd534be34aaca041471fac3af551038327bc8c6eac764736f6c634300081100330000000000000000000000000000000000000000000000000000000000000015

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061002b5760003560e01c8063b3f903e014610030575b600080fd5b61004361003e366004610304565b610045565b005b60005b8181101561008c5761007c83838381811061006557610065610379565b905060200281019061007791906103a8565b610091565b610085816103e6565b9050610048565b505050565b60ff7f0000000000000000000000000000000000000000000000000000000000000015166100c26040830183610445565b90501461013657806100d76040820182610445565b6040517f02e75c0b00000000000000000000000000000000000000000000000000000000815261012d9392507f0000000000000000000000000000000000000000000000000000000000000015906004016105c9565b60405180910390fd5b6000805b6101476040840184610445565b905081101561019e5761015d6040840184610445565b8281811061016d5761016d610379565b905060200201602081019061018291906105f5565b60ff166001901b8217915080610197906103e6565b905061013a565b507f00000000000000000000000000000000000000000000000000000000001fffff81146101fc5781816040517f1504f8ec00000000000000000000000000000000000000000000000000000000815260040161012d929190610617565b6020820180359061020d9084610639565b73ffffffffffffffffffffffffffffffffffffffff16337f5d91ab0394e910ccee855e471cfcd5400990911bf127ed49def138b610711c1b6102526040870187610445565b604051610260929190610654565b60405180910390a46102756020830183610639565b6040517f1e9a69500000000000000000000000000000000000000000000000000000000081523360048201526020840135602482015273ffffffffffffffffffffffffffffffffffffffff9190911690631e9a695090604401600060405180830381600087803b1580156102e857600080fd5b505af11580156102fc573d6000803e3d6000fd5b505050505050565b6000806020838503121561031757600080fd5b823567ffffffffffffffff8082111561032f57600080fd5b818501915085601f83011261034357600080fd5b81358181111561035257600080fd5b8660208260051b850101111561036757600080fd5b60209290920196919550909350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa18336030181126103dc57600080fd5b9190910192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361043e577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b5060010190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe184360301811261047a57600080fd5b83018035915067ffffffffffffffff82111561049557600080fd5b6020019150600581901b36038213156104ad57600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff811681146104d857600080fd5b919050565b803560ff811681146104d857600080fd5b60006060830173ffffffffffffffffffffffffffffffffffffffff610512846104b4565b1684526020808401358186015260408401357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe185360301811261055457600080fd5b8401818101903567ffffffffffffffff81111561057057600080fd5b8060051b360382131561058257600080fd5b606060408801529283905291600090608087015b818310156105be5760ff6105a9866104dd565b16815293830193600192909201918301610596565b979650505050505050565b6060815260006105dc60608301866104ee565b905083602083015260ff83166040830152949350505050565b60006020828403121561060757600080fd5b610610826104dd565b9392505050565b60408152600061062a60408301856104ee565b90508260208301529392505050565b60006020828403121561064b57600080fd5b610610826104b4565b60208082528181018390526000908460408401835b8681101561068f5760ff61067c846104dd565b1682529183019190830190600101610669565b50969550505050505056fea2646970667358221220cbc0a64fb70fe47594aa7cd534be34aaca041471fac3af551038327bc8c6eac764736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000015

-----Decoded View---------------
Arg [0] : numChoices (uint8): 21

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


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
Loading...
Loading
[ Download: CSV Export  ]

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.