Contract 0x26FA3fFFB6EfE8c1E69103aCb4044C26B9A106a9 5

 
Txn Hash Method
Block
From
To
Value
0x0632b9ffa8d903e44c9a900fd6018722676f47d7caab6099e3563b37b6aee790Mint(pending)2022-01-29 2:36:3715 hrs 9 mins ago0x3f6364f662b0127a3430bb9a9fc16b602da9a188 IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x9f104e4404fe402426967b2543498adc299d8c93a4ea4f2bcedcfec44d7c927eBurn(pending)2022-01-28 3:08:361 day 14 hrs ago0x794da300f518554eae9f21b6e2cee9a51434b75a IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x5c3a4c9afb64c616d709884602d861d7e1848f9234574a6fc52eccbf2ed64348Burn(pending)2022-01-27 20:37:121 day 21 hrs ago0x794da300f518554eae9f21b6e2cee9a51434b75a IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x77700b4d0cbe2198b1a26bbfa8308794186025184935866b150e46cda3a32fa4Mint(pending)2022-01-23 4:11:586 days 13 hrs ago0x9d1b7ca5f321df7c10f38903a25fc49a30b4458b IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0xc763ba36947ecb26148f7cfdaca13383d63c4838afe23a1880b52ffc2cca1d77Mint(pending)2022-01-23 4:11:586 days 13 hrs ago0x9d1b7ca5f321df7c10f38903a25fc49a30b4458b IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x96392c447e8baee96be623b0bc09c7982d129fe16435c9b3487561876f921a09Mint(pending)2022-01-23 4:11:586 days 13 hrs ago0x9d1b7ca5f321df7c10f38903a25fc49a30b4458b IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x49cbe755fb764bd04cd7691b7bcddd9bd5a0d06451c2c02ea4a23a4986c91fffBurn(pending)2022-01-23 3:52:286 days 13 hrs ago0x261ff063e735acdf61e16da8f5fccc35867740e4 IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x92fbdaacbfc9629420352e974d298a177e84491f2fd61b287bde0093a3a2bab5Approve(pending)2022-01-23 2:58:146 days 14 hrs ago0x261ff063e735acdf61e16da8f5fccc35867740e4 IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x3e8a478fa13dbb4099b98fbc7c42a3d2ce00990350ae4e6958ba86a40cd5e391Mint(pending)2022-01-23 2:40:136 days 15 hrs ago0x9d1b7ca5f321df7c10f38903a25fc49a30b4458b IN Abracadabra.money: sSPELL Token0 Ether(Pending)(Pending)
0x9d6af224d679e459b8bbb9c91c947f51663006b23cfb89655868229a540d1a2fMint141020652022-01-29 17:43:053 mins ago0xeb308d89b1cf09e04d0838b4618f115a5c4b2083 IN  Abracadabra.money: sSPELL Token0 Ether0.007086757727 106.749178724
0x2e996ddaa7f233a8d17356a187d1ed983e94836506303efc75d9b05bd6ef5f17Mint141020572022-01-29 17:41:135 mins ago0x5fc79e21ceca2aa0f7a0aac71ef3ddde8f004e9e IN  Abracadabra.money: sSPELL Token0 Ether0.005128752883 104.033608869
0xbf76faa5238e656bf4576faef366db0ae682337b979e6ce08be45c23e2882f77Mint141019752022-01-29 17:23:0623 mins agoENS Name ghodl.eth IN  Abracadabra.money: sSPELL Token0 Ether0.007278925591 147.684492695
0xfe53050d0f439bfb030e6a376d8138c330e8c86c91cd6cb626dd933efeb36f25Mint141019452022-01-29 17:16:0830 mins ago0x161fda6b1b857a09819408f1dc6483cec430515d IN  Abracadabra.money: sSPELL Token0 Ether0.006325603776 128.31099568
0x6a533580772a0251f009005ba4e69dea35452334890095c06901a41fb4e3b235Mint141018982022-01-29 17:07:0439 mins ago0xd608fb109124da6d3e8eca45d789ecaf8641ea77 IN  Abracadabra.money: sSPELL Token0 Ether0.006774146888 137.44287315
0x7e4448a512ad6a1bbfa6c811b388b7213868f131eb7ce7eaaf95bbd7854b5027Burn141018842022-01-29 17:03:4842 mins ago0x698048df5c46d5560aec774e520423411ff41fe5 IN  Abracadabra.money: sSPELL Token0 Ether0.010404150346 150.549145489
0x4ed313e38a3843dbb1bcc9cb77f33b5e11f83db4d05479ea2d1baa52a8676492Burn141018272022-01-29 16:49:0457 mins ago0xf2918b11780f2df5ec6ed814275e5f2873bf2e53 IN  Abracadabra.money: sSPELL Token0 Ether0.005156069217 74.634781101
0xdf3d0a27215d993e2a73f63eec4a3eaecd9c9a493d299424f507177cdf89eba6Burn141017902022-01-29 16:42:381 hr 3 mins agoENS Name naimish.eth IN  Abracadabra.money: sSPELL Token0 Ether0.007356655086 106.451569811
0xb5646c8575ca71e300098eb2c87dcad6d619ee3fb1b8c4bbc421d9ed26f0019eBurn141017702022-01-29 16:37:401 hr 8 mins ago0x850b36896dbfe6b707e827617f72754551427dba IN  Abracadabra.money: sSPELL Token0 Ether0.006727139849 97.342418376
0x860291ac4a0b0a38573becb5810aa11813770763325510551ccf1498cdaa6f5bMint141017262022-01-29 16:28:381 hr 17 mins ago0xa19ed0ae46e89461e56063f1ed268a0dc225745f IN  Abracadabra.money: sSPELL Token0 Ether0.006943398037 104.551927201
0x17bdbd19e460bc45d3093a99bdb248d7147f0be7fb57d22031408e6df268829dBurn141017102022-01-29 16:24:551 hr 21 mins agoENS Name lazerblazer.eth IN  Abracadabra.money: sSPELL Token0 Ether0.006211055859 89.874628976
0x206ae6543a854e7827f6aae8e87763b4cc75646a15d828b01145ccb12822d421Mint141016852022-01-29 16:19:391 hr 26 mins ago0xa1dad3d8b7a8b8a7e21337cda99f9c0674914b1c IN  Abracadabra.money: sSPELL Token0 Ether0.006861517157 103.356337194
0xff95aef63a169130db23e4ae89e670557ecf4336c79225fa6715881212f95afcMint141016682022-01-29 16:16:021 hr 30 mins ago0xa4f42b8c80fcc9a945f0075d7ab00ffd1ea2a17f IN  Abracadabra.money: sSPELL Token0 Ether0.006692506233 100.810493528
0xa49487783e256e5a32f3798f9364dfc180bdb6fadb0a4f8566a8f6482b5a481aMint141015972022-01-29 16:01:541 hr 44 mins ago0x7d79a186a6950b2331a6b8f0951317ace0dd7cc0 IN  Abracadabra.money: sSPELL Token0 Ether0.004390740092 104.83346687
0xeb5a1005378114137de2e145d59c4e790e866bef538815d3f10117887ca23470Mint141015972022-01-29 16:01:541 hr 44 mins ago0x7d79a186a6950b2331a6b8f0951317ace0dd7cc0 IN  Abracadabra.money: sSPELL Token0 Ether0.006927637866 104.33346687
0xc7fac85a57b4a7b41d5b38aafee32f462705926e0129ecec7bb0cc55b183e6e9Mint141015862022-01-29 15:59:521 hr 46 mins ago0x0ac8fdb954ddbe81470cac48fb7567bad6a86122 IN  Abracadabra.money: sSPELL Token0 Ether0.005087148227 103.214807698
[ Download CSV Export 

OVERVIEW

Abracadabra.money is a lending protocol that allows users to borrow a stablecoin (MIM) using interest-bearing tokens as collateral.

View more zero value Internal Transactions in Advanced View mode
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
sSpellV1

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-05-25
*/

// SPDX-License-Identifier: MIXED

// File @boringcrypto/boring-solidity/contracts/libraries/[email protected]
// License-Identifier: MIT
pragma solidity 0.6.12;
pragma experimental ABIEncoderV2;

/// @notice A library for performing overflow-/underflow-safe math,
/// updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math).
library BoringMath {
    function add(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require((c = a + b) >= b, "BoringMath: Add Overflow");
    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require((c = a - b) <= a, "BoringMath: Underflow");
    }

    function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
        require(b == 0 || (c = a * b) / b == a, "BoringMath: Mul Overflow");
    }

    function to128(uint256 a) internal pure returns (uint128 c) {
        require(a <= uint128(-1), "BoringMath: uint128 Overflow");
        c = uint128(a);
    }

    function to64(uint256 a) internal pure returns (uint64 c) {
        require(a <= uint64(-1), "BoringMath: uint64 Overflow");
        c = uint64(a);
    }

    function to32(uint256 a) internal pure returns (uint32 c) {
        require(a <= uint32(-1), "BoringMath: uint32 Overflow");
        c = uint32(a);
    }
}

/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint128.
library BoringMath128 {
    function add(uint128 a, uint128 b) internal pure returns (uint128 c) {
        require((c = a + b) >= b, "BoringMath: Add Overflow");
    }

    function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {
        require((c = a - b) <= a, "BoringMath: Underflow");
    }
}

/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint64.
library BoringMath64 {
    function add(uint64 a, uint64 b) internal pure returns (uint64 c) {
        require((c = a + b) >= b, "BoringMath: Add Overflow");
    }

    function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {
        require((c = a - b) <= a, "BoringMath: Underflow");
    }
}

/// @notice A library for performing overflow-/underflow-safe addition and subtraction on uint32.
library BoringMath32 {
    function add(uint32 a, uint32 b) internal pure returns (uint32 c) {
        require((c = a + b) >= b, "BoringMath: Add Overflow");
    }

    function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {
        require((c = a - b) <= a, "BoringMath: Underflow");
    }
}

// File @boringcrypto/boring-solidity/contracts/interfaces/[email protected]
// License-Identifier: MIT

interface IERC20 {
    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 amount) external returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 value);
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /// @notice EIP 2612
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;
}

// File @boringcrypto/boring-solidity/contracts/libraries/[email protected]
// License-Identifier: MIT

// solhint-disable avoid-low-level-calls

library BoringERC20 {
    bytes4 private constant SIG_SYMBOL = 0x95d89b41; // symbol()
    bytes4 private constant SIG_NAME = 0x06fdde03; // name()
    bytes4 private constant SIG_DECIMALS = 0x313ce567; // decimals()
    bytes4 private constant SIG_TRANSFER = 0xa9059cbb; // transfer(address,uint256)
    bytes4 private constant SIG_TRANSFER_FROM = 0x23b872dd; // transferFrom(address,address,uint256)

    function returnDataToString(bytes memory data) internal pure returns (string memory) {
        if (data.length >= 64) {
            return abi.decode(data, (string));
        } else if (data.length == 32) {
            uint8 i = 0;
            while(i < 32 && data[i] != 0) {
                i++;
            }
            bytes memory bytesArray = new bytes(i);
            for (i = 0; i < 32 && data[i] != 0; i++) {
                bytesArray[i] = data[i];
            }
            return string(bytesArray);
        } else {
            return "???";
        }
    }

    /// @notice Provides a safe ERC20.symbol version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token symbol.
    function safeSymbol(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_SYMBOL));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.name version which returns '???' as fallback string.
    /// @param token The address of the ERC-20 token contract.
    /// @return (string) Token name.
    function safeName(IERC20 token) internal view returns (string memory) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_NAME));
        return success ? returnDataToString(data) : "???";
    }

    /// @notice Provides a safe ERC20.decimals version which returns '18' as fallback value.
    /// @param token The address of the ERC-20 token contract.
    /// @return (uint8) Token decimals.
    function safeDecimals(IERC20 token) internal view returns (uint8) {
        (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(SIG_DECIMALS));
        return success && data.length == 32 ? abi.decode(data, (uint8)) : 18;
    }

    /// @notice Provides a safe ERC20.transfer version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransfer(
        IERC20 token,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed");
    }

    /// @notice Provides a safe ERC20.transferFrom version for different ERC-20 implementations.
    /// Reverts on a failed transfer.
    /// @param token The address of the ERC-20 token.
    /// @param from Transfer tokens from.
    /// @param to Transfer tokens to.
    /// @param amount The token amount.
    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(SIG_TRANSFER_FROM, from, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed");
    }
}

// File @boringcrypto/boring-solidity/contracts/[email protected]
// License-Identifier: MIT
// Based on code and smartness by Ross Campbell and Keno
// Uses immutable to store the domain separator to reduce gas usage
// If the chain id changes due to a fork, the forked chain will calculate on the fly.

// solhint-disable no-inline-assembly

contract Domain {
    bytes32 private constant DOMAIN_SEPARATOR_SIGNATURE_HASH = keccak256("EIP712Domain(uint256 chainId,address verifyingContract)");
    // See https://eips.ethereum.org/EIPS/eip-191
    string private constant EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA = "\x19\x01";

    // solhint-disable var-name-mixedcase
    bytes32 private immutable _DOMAIN_SEPARATOR;
    uint256 private immutable DOMAIN_SEPARATOR_CHAIN_ID;    

    /// @dev Calculate the DOMAIN_SEPARATOR
    function _calculateDomainSeparator(uint256 chainId) private view returns (bytes32) {
        return keccak256(
            abi.encode(
                DOMAIN_SEPARATOR_SIGNATURE_HASH,
                chainId,
                address(this)
            )
        );
    }

    constructor() public {
        uint256 chainId; assembly {chainId := chainid()}
        _DOMAIN_SEPARATOR = _calculateDomainSeparator(DOMAIN_SEPARATOR_CHAIN_ID = chainId);
    }

    /// @dev Return the DOMAIN_SEPARATOR
    // It's named internal to allow making it public from the contract that uses it by creating a simple view function
    // with the desired public name, such as DOMAIN_SEPARATOR or domainSeparator.
    // solhint-disable-next-line func-name-mixedcase
    function _domainSeparator() internal view returns (bytes32) {
        uint256 chainId; assembly {chainId := chainid()}
        return chainId == DOMAIN_SEPARATOR_CHAIN_ID ? _DOMAIN_SEPARATOR : _calculateDomainSeparator(chainId);
    }

    function _getDigest(bytes32 dataHash) internal view returns (bytes32 digest) {
        digest =
            keccak256(
                abi.encodePacked(
                    EIP191_PREFIX_FOR_EIP712_STRUCTURED_DATA,
                    _domainSeparator(),
                    dataHash
                )
            );
    }
}

// File @boringcrypto/boring-solidity/contracts/[email protected]
// License-Identifier: MIT

// solhint-disable no-inline-assembly
// solhint-disable not-rely-on-time

// Data part taken out for building of contracts that receive delegate calls
contract ERC20Data {
    /// @notice owner > balance mapping.
    mapping(address => uint256) public balanceOf;
    /// @notice owner > spender > allowance mapping.
    mapping(address => mapping(address => uint256)) public allowance;
    /// @notice owner > nonce mapping. Used in `permit`.
    mapping(address => uint256) public nonces;
}

abstract contract ERC20 is IERC20, Domain {
    /// @notice owner > balance mapping.
    mapping(address => uint256) public override balanceOf;
    /// @notice owner > spender > allowance mapping.
    mapping(address => mapping(address => uint256)) public override allowance;
    /// @notice owner > nonce mapping. Used in `permit`.
    mapping(address => uint256) public nonces;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /// @notice Transfers `amount` tokens from `msg.sender` to `to`.
    /// @param to The address to move the tokens.
    /// @param amount of the tokens to move.
    /// @return (bool) Returns True if succeeded.
    function transfer(address to, uint256 amount) public returns (bool) {
        // If `amount` is 0, or `msg.sender` is `to` nothing happens
        if (amount != 0 || msg.sender == to) {
            uint256 srcBalance = balanceOf[msg.sender];
            require(srcBalance >= amount, "ERC20: balance too low");
            if (msg.sender != to) {
                require(to != address(0), "ERC20: no zero address"); // Moved down so low balance calls safe some gas

                balanceOf[msg.sender] = srcBalance - amount; // Underflow is checked
                balanceOf[to] += amount;
            }
        }
        emit Transfer(msg.sender, to, amount);
        return true;
    }

    /// @notice Transfers `amount` tokens from `from` to `to`. Caller needs approval for `from`.
    /// @param from Address to draw tokens from.
    /// @param to The address to move the tokens.
    /// @param amount The token amount to move.
    /// @return (bool) Returns True if succeeded.
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public returns (bool) {
        // If `amount` is 0, or `from` is `to` nothing happens
        if (amount != 0) {
            uint256 srcBalance = balanceOf[from];
            require(srcBalance >= amount, "ERC20: balance too low");

            if (from != to) {
                uint256 spenderAllowance = allowance[from][msg.sender];
                // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).
                if (spenderAllowance != type(uint256).max) {
                    require(spenderAllowance >= amount, "ERC20: allowance too low");
                    allowance[from][msg.sender] = spenderAllowance - amount; // Underflow is checked
                }
                require(to != address(0), "ERC20: no zero address"); // Moved down so other failed calls safe some gas

                balanceOf[from] = srcBalance - amount; // Underflow is checked
                balanceOf[to] += amount;
            }
        }
        emit Transfer(from, to, amount);
        return true;
    }

    /// @notice Approves `amount` from sender to be spend by `spender`.
    /// @param spender Address of the party that can draw from msg.sender's account.
    /// @param amount The maximum collective amount that `spender` can draw.
    /// @return (bool) Returns True if approved.
    function approve(address spender, uint256 amount) public override returns (bool) {
        allowance[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32) {
        return _domainSeparator();
    }

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /// @notice Approves `value` from `owner_` to be spend by `spender`.
    /// @param owner_ Address of the owner.
    /// @param spender The address of the spender that gets approved to draw from `owner_`.
    /// @param value The maximum collective amount that `spender` can draw.
    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).
    function permit(
        address owner_,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(owner_ != address(0), "ERC20: Owner cannot be 0");
        require(block.timestamp < deadline, "ERC20: Expired");
        require(
            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==
                owner_,
            "ERC20: Invalid Signature"
        );
        allowance[owner_][spender] = value;
        emit Approval(owner_, spender, value);
    }
}

contract ERC20WithSupply is IERC20, ERC20 {
    uint256 public override totalSupply;

    function _mint(address user, uint256 amount) private {
        uint256 newTotalSupply = totalSupply + amount;
        require(newTotalSupply >= totalSupply, "Mint overflow");
        totalSupply = newTotalSupply;
        balanceOf[user] += amount;
    }

    function _burn(address user, uint256 amount) private {
        require(balanceOf[user] >= amount, "Burn too much");
        totalSupply -= amount;
        balanceOf[user] -= amount;
    }
}

// File @boringcrypto/boring-solidity/contracts/[email protected]
// License-Identifier: MIT

// solhint-disable avoid-low-level-calls
// solhint-disable no-inline-assembly

// Audit on 5-Jan-2021 by Keno and BoringCrypto

contract BaseBoringBatchable {
    /// @dev Helper function to extract a useful revert message from a failed call.
    /// If the returned data is malformed or not correctly abi encoded then this call can fail itself.
    function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) {
        // If the _res length is less than 68, then the transaction failed silently (without a revert message)
        if (_returnData.length < 68) return "Transaction reverted silently";

        assembly {
            // Slice the sighash.
            _returnData := add(_returnData, 0x04)
        }
        return abi.decode(_returnData, (string)); // All that remains is the revert string
    }

    /// @notice Allows batched call to self (this contract).
    /// @param calls An array of inputs for each call.
    /// @param revertOnFail If True then reverts after a failed call and stops doing further calls.
    // F1: External is ok here because this is the batch function, adding it to a batch makes no sense
    // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value
    // C3: The length of the loop is fully under user control, so can't be exploited
    // C7: Delegatecall is only used on the same contract, so it's safe
    function batch(bytes[] calldata calls, bool revertOnFail) external payable {
        for (uint256 i = 0; i < calls.length; i++) {
            (bool success, bytes memory result) = address(this).delegatecall(calls[i]);
            if (!success && revertOnFail) {
                revert(_getRevertMsg(result));
            }
        }
    }
}

contract BoringBatchable is BaseBoringBatchable {
    /// @notice Call wrapper that performs `ERC20.permit` on `token`.
    /// Lookup `IERC20.permit`.
    // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert)
    //     if part of a batch this could be used to grief once as the second call would not need the permit
    function permitToken(
        IERC20 token,
        address from,
        address to,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public {
        token.permit(from, to, amount, deadline, v, r, s);
    }
}

// File contracts/sSpell.sol
//License-Identifier: MIT

// Staking in sSpell inspired by Chef Nomi's SushiBar - MIT license (originally WTFPL)
// modified by BoringCrypto for DictatorDAO

contract sSpellV1 is IERC20, Domain {
    using BoringMath for uint256;
    using BoringMath128 for uint128;
    using BoringERC20 for IERC20;

    string public constant symbol = "sSPELL";
    string public constant name = "Staked Spell Tokens";
    uint8 public constant decimals = 18;
    uint256 public override totalSupply;
    uint256 private constant LOCK_TIME = 24 hours;

    IERC20 public immutable token;

    constructor(IERC20 _token) public {
        token = _token;
    }

    struct User {
        uint128 balance;
        uint128 lockedUntil;
    }

    /// @notice owner > balance mapping.
    mapping(address => User) public users;
    /// @notice owner > spender > allowance mapping.
    mapping(address => mapping(address => uint256)) public override allowance;
    /// @notice owner > nonce mapping. Used in `permit`.
    mapping(address => uint256) public nonces;

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    function balanceOf(address user) public view override returns (uint256 balance) {
        return users[user].balance;
    }

    function _transfer(
        address from,
        address to,
        uint256 shares
    ) internal {
        User memory fromUser = users[from];
        require(block.timestamp >= fromUser.lockedUntil, "Locked");
        if (shares != 0) {
            require(fromUser.balance >= shares, "Low balance");
            if (from != to) {
                require(to != address(0), "Zero address"); // Moved down so other failed calls safe some gas
                User memory toUser = users[to];
                users[from].balance = fromUser.balance - shares.to128(); // Underflow is checked
                users[to].balance = toUser.balance + shares.to128(); // Can't overflow because totalSupply would be greater than 2^128-1;
            }
        }
        emit Transfer(from, to, shares);
    }

    function _useAllowance(address from, uint256 shares) internal {
        if (msg.sender == from) {
            return;
        }
        uint256 spenderAllowance = allowance[from][msg.sender];
        // If allowance is infinite, don't decrease it to save on gas (breaks with EIP-20).
        if (spenderAllowance != type(uint256).max) {
            require(spenderAllowance >= shares, "Low allowance");
            allowance[from][msg.sender] = spenderAllowance - shares; // Underflow is checked
        }
    }

    /// @notice Transfers `shares` tokens from `msg.sender` to `to`.
    /// @param to The address to move the tokens.
    /// @param shares of the tokens to move.
    /// @return (bool) Returns True if succeeded.
    function transfer(address to, uint256 shares) public returns (bool) {
        _transfer(msg.sender, to, shares);
        return true;
    }

    /// @notice Transfers `shares` tokens from `from` to `to`. Caller needs approval for `from`.
    /// @param from Address to draw tokens from.
    /// @param to The address to move the tokens.
    /// @param shares The token shares to move.
    /// @return (bool) Returns True if succeeded.
    function transferFrom(
        address from,
        address to,
        uint256 shares
    ) public returns (bool) {
        _useAllowance(from, shares);
        _transfer(from, to, shares);
        return true;
    }

    /// @notice Approves `amount` from sender to be spend by `spender`.
    /// @param spender Address of the party that can draw from msg.sender's account.
    /// @param amount The maximum collective amount that `spender` can draw.
    /// @return (bool) Returns True if approved.
    function approve(address spender, uint256 amount) public override returns (bool) {
        allowance[msg.sender][spender] = amount;
        emit Approval(msg.sender, spender, amount);
        return true;
    }

    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32) {
        return _domainSeparator();
    }

    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 private constant PERMIT_SIGNATURE_HASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    /// @notice Approves `value` from `owner_` to be spend by `spender`.
    /// @param owner_ Address of the owner.
    /// @param spender The address of the spender that gets approved to draw from `owner_`.
    /// @param value The maximum collective amount that `spender` can draw.
    /// @param deadline This permit must be redeemed before this deadline (UTC timestamp in seconds).
    function permit(
        address owner_,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external override {
        require(owner_ != address(0), "Zero owner");
        require(block.timestamp < deadline, "Expired");
        require(
            ecrecover(_getDigest(keccak256(abi.encode(PERMIT_SIGNATURE_HASH, owner_, spender, value, nonces[owner_]++, deadline))), v, r, s) ==
                owner_,
            "Invalid Sig"
        );
        allowance[owner_][spender] = value;
        emit Approval(owner_, spender, value);
    }

    /// math is ok, because amount, totalSupply and shares is always 0 <= amount <= 100.000.000 * 10^18
    /// theoretically you can grow the amount/share ratio, but it's not practical and useless
    function mint(uint256 amount) public returns (bool) {
        require(msg.sender != address(0), "Zero address");
        User memory user = users[msg.sender];

        uint256 totalTokens = token.balanceOf(address(this));
        uint256 shares = totalSupply == 0 ? amount : (amount * totalSupply) / totalTokens;
        user.balance += shares.to128();
        user.lockedUntil = (block.timestamp + LOCK_TIME).to128();
        users[msg.sender] = user;
        totalSupply += shares;

        token.safeTransferFrom(msg.sender, address(this), amount);

        emit Transfer(address(0), msg.sender, shares);
        return true;
    }

    function _burn(
        address from,
        address to,
        uint256 shares
    ) internal {
        require(to != address(0), "Zero address");
        User memory user = users[from];
        require(block.timestamp >= user.lockedUntil, "Locked");
        uint256 amount = (shares * token.balanceOf(address(this))) / totalSupply;
        users[from].balance = user.balance.sub(shares.to128()); // Must check underflow
        totalSupply -= shares;

        token.safeTransfer(to, amount);

        emit Transfer(from, address(0), shares);
    }

    function burn(address to, uint256 shares) public returns (bool) {
        _burn(msg.sender, to, shares);
        return true;
    }

    function burnFrom(
        address from,
        address to,
        uint256 shares
    ) public returns (bool) {
        _useAllowance(from, shares);
        _burn(from, to, shares);
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"burn","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"users","outputs":[{"internalType":"uint128","name":"balance","type":"uint128"},{"internalType":"uint128","name":"lockedUntil","type":"uint128"}],"stateMutability":"view","type":"function"}]

60e06040523480156200001157600080fd5b5060405162001cd638038062001cd68339810160408190526200003491620000b5565b4660a081905262000045816200005f565b6080525060601b6001600160601b03191660c05262000104565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a7946921882306040516020016200009893929190620000e5565b604051602081830303815290604052805190602001209050919050565b600060208284031215620000c7578081fd5b81516001600160a01b0381168114620000de578182fd5b9392505050565b92835260208301919091526001600160a01b0316604082015260600190565b60805160a05160c05160601c611b8e62000148600039806104c45280610638528061095f5280610f33528061105e525080610da4525080610dd95250611b8e6000f3fe608060405234801561001057600080fd5b506004361061011b5760003560e01c806395d89b41116100b2578063a9059cbb11610081578063dd62ed3e11610066578063dd62ed3e14610240578063ec60bcf314610253578063fc0c546a146102665761011b565b8063a9059cbb14610218578063d505accf1461022b5761011b565b806395d89b41146101c95780639dc29fac146101d1578063a0712d68146101e4578063a87430ba146101f75761011b565b8063313ce567116100ee578063313ce567146101865780633644e5151461019b57806370a08231146101a35780637ecebe00146101b65761011b565b806306fdde0314610120578063095ea7b31461013e57806318160ddd1461015e57806323b872dd14610173575b600080fd5b61012861027b565b6040516101359190611826565b60405180910390f35b61015161014c366004611652565b6102b4565b6040516101359190611787565b61016661032c565b6040516101359190611792565b61015161018136600461159f565b610332565b61018e610353565b6040516101359190611af5565b610166610358565b6101666101b1366004611549565b610367565b6101666101c4366004611549565b6103a1565b6101286103b3565b6101516101df366004611652565b6103ec565b6101516101f236600461169c565b610402565b61020a610205366004611549565b6106bd565b604051610135929190611ad2565b610151610226366004611652565b6106f9565b61023e6102393660046115df565b610706565b005b61016661024e36600461156b565b610929565b61015161026136600461159f565b610946565b61026e61095d565b604051610135919061170f565b6040518060400160405280601381526020017f5374616b6564205370656c6c20546f6b656e730000000000000000000000000081525081565b33600081815260026020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259061031a908690611792565b60405180910390a35060015b92915050565b60005481565b600061033e8483610981565b610349848484610a72565b5060019392505050565b601281565b6000610362610d9f565b905090565b73ffffffffffffffffffffffffffffffffffffffff166000908152600160205260409020546fffffffffffffffffffffffffffffffff1690565b60036020526000908152604090205481565b6040518060400160405280600681526020017f735350454c4c000000000000000000000000000000000000000000000000000081525081565b60006103f9338484610dff565b50600192915050565b600033610444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b9061198a565b60405180910390fd5b61044c61150e565b503360009081526001602090815260408083208151808301835290546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041692810192909252517f70a082310000000000000000000000000000000000000000000000000000000081529091907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a082319061050e90309060040161170f565b60206040518083038186803b15801561052657600080fd5b505afa15801561053a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055e91906116b4565b90506000805460001461057e578160005486028161057857fe5b04610580565b845b905061058b816110f2565b8351016fffffffffffffffffffffffffffffffff1683526105b06201518042016110f2565b6fffffffffffffffffffffffffffffffff90811660208086019182523360008181526001909252604082208751815494518616700100000000000000000000000000000000029086167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909516949094179094169290921790925581548301909155610675907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16903088611142565b60405133906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906106aa908590611792565b60405180910390a3506001949350505050565b6001602052600090815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b60006103f9338484610a72565b73ffffffffffffffffffffffffffffffffffffffff8716610753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b90611a64565b83421061078c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b90611a9b565b73ffffffffffffffffffffffffffffffffffffffff87166000818152600360209081526040918290208054600181810190925592519092610817926107fc927f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9928e928e928e92918e910161179b565b604051602081830303815290604052805190602001206112ad565b858585604051600081526020016040526040516108379493929190611808565b6020604051602081039080840390855afa158015610859573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16146108b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b906119f8565b73ffffffffffffffffffffffffffffffffffffffff8088166000818152600260209081526040808320948b168084529490915290819020889055517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610918908990611792565b60405180910390a350505050505050565b600260209081526000928352604080842090915290825290205481565b60006109528483610981565b610349848484610dff565b7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff831614156109a457610a6e565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610a6c5781811015610a36576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b9061191c565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600260209081526040808320338452909152902082820390555b505b5050565b610a7a61150e565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600160209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff808216845270010000000000000000000000000000000090910416908201819052421015610b18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b906118ae565b8115610d345780516fffffffffffffffffffffffffffffffff16821115610b6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b90611953565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614610d345773ffffffffffffffffffffffffffffffffffffffff8316610beb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b9061198a565b610bf361150e565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600160209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff80821684527001000000000000000000000000000000009091041690820152610c5f836110f2565b825173ffffffffffffffffffffffffffffffffffffffff8716600090815260016020526040902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016929091036fffffffffffffffffffffffffffffffff16919091179055610ccf836110f2565b905173ffffffffffffffffffffffffffffffffffffffff8516600090815260016020526040902080547fffffffffffffffffffffffffffffffff0000000000000000000000000000000016919092016fffffffffffffffffffffffffffffffff161790555b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610d919190611792565b60405180910390a350505050565b6000467f00000000000000000000000000000000000000000000000000000000000000008114610dd757610dd28161131d565b610df9565b7f00000000000000000000000000000000000000000000000000000000000000005b91505090565b73ffffffffffffffffffffffffffffffffffffffff8216610e4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b9061198a565b610e5461150e565b5073ffffffffffffffffffffffffffffffffffffffff83166000908152600160209081526040918290208251808401909352546fffffffffffffffffffffffffffffffff808216845270010000000000000000000000000000000090910416908201819052421015610ef2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b906118ae565b600080546040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610f6890309060040161170f565b60206040518083038186803b158015610f8057600080fd5b505afa158015610f94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb891906116b4565b840281610fc157fe5b049050610fea610fd0846110f2565b83516fffffffffffffffffffffffffffffffff1690611354565b73ffffffffffffffffffffffffffffffffffffffff868116600090815260016020526040812080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000166fffffffffffffffffffffffffffffffff94909416939093179092558154859003909155611085907f00000000000000000000000000000000000000000000000000000000000000001685836113a6565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef856040516110e39190611792565b60405180910390a35050505050565b60006fffffffffffffffffffffffffffffffff82111561113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b906119c1565b5090565b600060608573ffffffffffffffffffffffffffffffffffffffff166323b872dd60e01b86868660405160240161117a93929190611730565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161120391906116cc565b6000604051808303816000865af19150503d8060008114611240576040519150601f19603f3d011682016040523d82523d6000602084013e611245565b606091505b509150915081801561126f57508051158061126f57508080602001905181019061126f919061167c565b6112a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b90611a2f565b505050505050565b60006040518060400160405280600281526020017f19010000000000000000000000000000000000000000000000000000000000008152506112ed610d9f565b83604051602001611300939291906116e8565b604051602081830303815290604052805190602001209050919050565b60007f47e79534a245952e8b16893a336b85a3d9ea9fa8c573f3d803afb92a794692188230604051602001611300939291906117dc565b8082036fffffffffffffffffffffffffffffffff8084169082161115610326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b90611877565b600060608473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb60e01b85856040516024016113dc929190611761565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161146591906116cc565b6000604051808303816000865af19150503d80600081146114a2576040519150601f19603f3d011682016040523d82523d6000602084013e6114a7565b606091505b50915091508180156114d15750805115806114d15750808060200190518101906114d1919061167c565b611507576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161043b906118e5565b5050505050565b604080518082019091526000808252602082015290565b803573ffffffffffffffffffffffffffffffffffffffff8116811461032657600080fd5b60006020828403121561155a578081fd5b6115648383611525565b9392505050565b6000806040838503121561157d578081fd5b6115878484611525565b91506115968460208501611525565b90509250929050565b6000806000606084860312156115b3578081fd5b83356115be81611b33565b925060208401356115ce81611b33565b929592945050506040919091013590565b600080600080600080600060e0888a0312156115f9578283fd5b6116038989611525565b96506116128960208a01611525565b95506040880135945060608801359350608088013560ff81168114611635578384fd5b9699959850939692959460a0840135945060c09093013592915050565b60008060408385031215611664578182fd5b61166e8484611525565b946020939093013593505050565b60006020828403121561168d578081fd5b81518015158114611564578182fd5b6000602082840312156116ad578081fd5b5035919050565b6000602082840312156116c5578081fd5b5051919050565b600082516116de818460208701611b03565b9190910192915050565b600084516116fa818460208901611b03565b91909101928352506020820152604001919050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9384168152919092166020820152604081019190915260600190565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b901515815260200190565b90815260200190565b95865273ffffffffffffffffffffffffffffffffffffffff94851660208701529290931660408501526060840152608083019190915260a082015260c00190565b928352602083019190915273ffffffffffffffffffffffffffffffffffffffff16604082015260600190565b93845260ff9290921660208401526040830152606082015260800190565b6000602082528251806020840152611845816040850160208701611b03565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b60208082526015908201527f426f72696e674d6174683a20556e646572666c6f770000000000000000000000604082015260600190565b60208082526006908201527f4c6f636b65640000000000000000000000000000000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b6020808252600d908201527f4c6f7720616c6c6f77616e636500000000000000000000000000000000000000604082015260600190565b6020808252600b908201527f4c6f772062616c616e6365000000000000000000000000000000000000000000604082015260600190565b6020808252600c908201527f5a65726f20616464726573730000000000000000000000000000000000000000604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b6020808252600b908201527f496e76616c696420536967000000000000000000000000000000000000000000604082015260600190565b6020808252818101527f426f72696e6745524332303a205472616e7366657246726f6d206661696c6564604082015260600190565b6020808252600a908201527f5a65726f206f776e657200000000000000000000000000000000000000000000604082015260600190565b60208082526007908201527f4578706972656400000000000000000000000000000000000000000000000000604082015260600190565b6fffffffffffffffffffffffffffffffff92831681529116602082015260400190565b60ff91909116815260200190565b60005b83811015611b1e578181015183820152602001611b06565b83811115611b2d576000848401525b50505050565b73ffffffffffffffffffffffffffffffffffffffff81168114611b5557600080fd5b5056fea26469706673582212206b133f8f02cff08e545e9b72bfa6d2aa3fed362b9ab85ea8046ceccba486368464736f6c634300060c0033000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6

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

000000000000000000000000090185f2135308bad17527004364ebcc2d37e5f6

-----Decoded View---------------
Arg [0] : _token (address): 0x090185f2135308bad17527004364ebcc2d37e5f6

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


Deployed ByteCode Sourcemap

18381:7213:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18581:51;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22144:214;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;18681:35::-;;;:::i;:::-;;;;;;;:::i;21623:226::-;;;;;;:::i;:::-;;:::i;18639:35::-;;;:::i;:::-;;;;;;;:::i;22420:104::-;;;:::i;19472:125::-;;;;;;:::i;:::-;;:::i;19252:41::-;;;;;;:::i;:::-;;:::i;18534:40::-;;;:::i;25231:134::-;;;;;;:::i;:::-;;:::i;24001:649::-;;;;;;:::i;:::-;;:::i;19016:37::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;21174:142::-;;;;;;:::i;:::-;;:::i;23153:640::-;;;;;;:::i;:::-;;:::i;:::-;;19114:73;;;;;;:::i;:::-;;:::i;25373:218::-;;;;;;:::i;:::-;;:::i;18777:29::-;;;:::i;:::-;;;;;;;:::i;18581:51::-;;;;;;;;;;;;;;;;;;;:::o;22144:214::-;22246:10;22219:4;22236:21;;;:9;:21;;;;;;;;;:30;;;;;;;;;;:39;;;22291:37;22219:4;;22236:30;;22291:37;;;;22269:6;;22291:37;:::i;:::-;;;;;;;;-1:-1:-1;22346:4:0;22144:214;;;;;:::o;18681:35::-;;;;:::o;21623:226::-;21737:4;21754:27;21768:4;21774:6;21754:13;:27::i;:::-;21792;21802:4;21808:2;21812:6;21792:9;:27::i;:::-;-1:-1:-1;21837:4:0;21623:226;;;;;:::o;18639:35::-;18672:2;18639:35;:::o;22420:104::-;22471:7;22498:18;:16;:18::i;:::-;22491:25;;22420:104;:::o;19472:125::-;19570:11;;19535:15;19570:11;;;:5;:11;;;;;:19;;;;19472:125::o;19252:41::-;;;;;;;;;;;;;:::o;18534:40::-;;;;;;;;;;;;;;;;;;;:::o;25231:134::-;25289:4;25306:29;25312:10;25324:2;25328:6;25306:5;:29::i;:::-;-1:-1:-1;25353:4:0;25231:134;;;;:::o;24001:649::-;24047:4;24072:10;24064:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;24124:16;;:::i;:::-;-1:-1:-1;24149:10:0;24143:17;;;;:5;:17;;;;;;;;24124:36;;;;;;;;;;;;;;;;;;;;;;;;;;;24195:30;;;;24124:36;;24143:17;24195:5;24143:17;24195:15;;;;:30;;24219:4;;24195:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24173:52;;24236:14;24253:11;;24268:1;24253:16;:64;;24306:11;24291;;24282:6;:20;24281:36;;;;;;24253:64;;;24272:6;24253:64;24236:81;;24344:14;:6;:12;:14::i;:::-;24328:30;;;;;;;24388:37;18760:8;24389:15;:27;24388:35;:37::i;:::-;24369:56;;;;:16;;;;:56;;;24442:10;24436:17;;;;:5;:17;;;;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24471:21;;;;;;;24505:57;;:5;24436:17;24505:22;;24548:4;24555:6;24505:22;:57::i;:::-;24580:40;;24601:10;;24597:1;;24580:40;;;;24613:6;;24580:40;:::i;:::-;;;;;;;;-1:-1:-1;24638:4:0;;24001:649;-1:-1:-1;;;;24001:649:0:o;19016:37::-;;;;;;;;;;;;;;;;;;;;;;:::o;21174:142::-;21236:4;21253:33;21263:10;21275:2;21279:6;21253:9;:33::i;23153:640::-;23373:20;;;23365:43;;;;;;;;;;;;:::i;:::-;23445:8;23427:15;:26;23419:46;;;;;;;;;;;;:::i;:::-;23498:155;;;23540:21;23587:14;;;:6;:14;;;;;;;;;:16;;23498:128;23587:16;;;;;;23529:85;;23498:128;;23508:108;;23529:85;;22686:66;;23647:6;;23571:7;;23580:5;;23587:16;23605:8;;23529:85;;:::i;:::-;;;;;;;;;;;;;23519:96;;;;;;23508:10;:108::i;:::-;23618:1;23621;23624;23498:128;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:155;;;23476:216;;;;;;;;;;;;:::i;:::-;23703:17;;;;;;;;:9;:17;;;;;;;;:26;;;;;;;;;;;;;;:34;;;23753:32;;;;;23732:5;;23753:32;:::i;:::-;;;;;;;;23153:640;;;;;;;:::o;19114:73::-;;;;;;;;;;;;;;;;;;;;;;;;:::o;25373:218::-;25483:4;25500:27;25514:4;25520:6;25500:13;:27::i;:::-;25538:23;25544:4;25550:2;25554:6;25538:5;:23::i;18777:29::-;;;:::o;20427:521::-;20504:10;:18;;;;20500:57;;;20539:7;;20500:57;20594:15;;;20567:24;20594:15;;;:9;:15;;;;;;;;20610:10;20594:27;;;;;;;;20749:17;20729:37;;20725:216;;20811:6;20791:16;:26;;20783:52;;;;;;;;;;;;:::i;:::-;20850:15;;;;;;;:9;:15;;;;;;;;20866:10;20850:27;;;;;;;20880:25;;;20850:55;;20725:216;20427:521;;;;:::o;19605:814::-;19720:20;;:::i;:::-;-1:-1:-1;19743:11:0;;;;;;;:5;:11;;;;;;;;;19720:34;;;;;;;;;;;;;;;;;;;;;;;;;;19773:15;:39;;19765:58;;;;;;;;;;;;:::i;:::-;19838:11;;19834:536;;19874:16;;:26;;;-1:-1:-1;19874:26:0;19866:50;;;;;;;;;;;;:::i;:::-;19943:2;19935:10;;:4;:10;;;19931:428;;19974:16;;;19966:41;;;;;;;;;;;;:::i;:::-;20076:18;;:::i;:::-;-1:-1:-1;20097:9:0;;;;;;;:5;:9;;;;;;;;;20076:30;;;;;;;;;;;;;;;;;;;;;;;;20166:14;:6;:12;:14::i;:::-;20147:16;;20125:11;;;20147:16;20125:11;;;:5;:11;;;;;:55;;;;20147:33;;;;20125:55;;;;;;;;20260:14;:6;:12;:14::i;:::-;20243;;20223:9;;;20243:14;20223:9;;;:5;:9;;;;;:51;;;;20243:31;;;;20223:51;;;;;19931:428;20400:2;20385:26;;20394:4;20385:26;;;20404:6;20385:26;;;;;;:::i;:::-;;;;;;;;19605:814;;;;:::o;8900:237::-;8951:7;9009:9;9047:25;9036:36;;:93;;9095:34;9121:7;9095:25;:34::i;:::-;9036:93;;;9075:17;9036:93;9029:100;;;8900:237;:::o;24658:565::-;24777:16;;;24769:41;;;;;;;;;;;;:::i;:::-;24821:16;;:::i;:::-;-1:-1:-1;24840:11:0;;;;;;;:5;:11;;;;;;;;;24821:30;;;;;;;;;;;;;;;;;;;;;;;;;;24870:15;:35;;24862:54;;;;;;;;;;;;:::i;:::-;24927:14;24988:11;;24954:30;;;;;:15;:5;:15;;;;:30;;24978:4;;24954:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;24945:6;:39;24944:55;;;;;;24927:72;;25032:32;25049:14;:6;:12;:14::i;:::-;25032:12;;:16;;;;:32::i;:::-;25010:11;;;;;;;;:5;:11;;;;;:54;;;;;;;;;;;;;;;;25099:21;;;;;;;;25133:30;;:5;:18;25152:2;25156:6;25133:18;:30::i;:::-;25204:1;25181:34;;25190:4;25181:34;;;25208:6;25181:34;;;;;;:::i;:::-;;;;;;;;24658:565;;;;;:::o;845:161::-;894:9;924:16;;;;916:57;;;;;;;;;;;;:::i;:::-;-1:-1:-1;996:1:0;845:161::o;6891:382::-;7037:12;7051:17;7080:5;7072:19;;3936:10;7115:17;;7134:4;7140:2;7144:6;7092:59;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7072:80;;;;7092:59;7072:80;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7036:116;;;;7171:7;:57;;;;-1:-1:-1;7183:11:0;;:16;;:44;;;7214:4;7203:24;;;;;;;;;;;;:::i;:::-;7163:102;;;;;;;;;;;;:::i;:::-;6891:382;;;;;;:::o;9145:331::-;9206:14;9322:40;;;;;;;;;;;;;;;;;9385:18;:16;:18::i;:::-;9426:8;9283:170;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9255:213;;;;;;9233:235;;9145:331;;;:::o;8128:277::-;8202:7;7714:68;8332:7;8366:4;8253:133;;;;;;;;;;:::i;1619:138::-;1712:5;;;1707:16;;;;;;;;;1699:50;;;;;;;;;;;;:::i;6228:340::-;6347:12;6361:17;6390:5;6382:19;;3846:10;6425:12;;6439:2;6443:6;6402:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6382:69;;;;6402:48;6382:69;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6346:105;;;;6470:7;:57;;;;-1:-1:-1;6482:11:0;;:16;;:44;;;6513:4;6502:24;;;;;;;;;;;;:::i;:::-;6462:98;;;;;;;;;;;;:::i;:::-;6228:340;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;:::o;5:130::-;72:20;;21094:42;21083:54;;22123:35;;22113:2;;22172:1;;22162:12;825:241;;929:2;917:9;908:7;904:23;900:32;897:2;;;-1:-1;;935:12;897:2;997:53;1042:7;1018:22;997:53;:::i;:::-;987:63;891:175;-1:-1;;;891:175::o;1073:366::-;;;1194:2;1182:9;1173:7;1169:23;1165:32;1162:2;;;-1:-1;;1200:12;1162:2;1262:53;1307:7;1283:22;1262:53;:::i;:::-;1252:63;;1370:53;1415:7;1352:2;1395:9;1391:22;1370:53;:::i;:::-;1360:63;;1156:283;;;;;:::o;1446:491::-;;;;1584:2;1572:9;1563:7;1559:23;1555:32;1552:2;;;-1:-1;;1590:12;1552:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1642:63;-1:-1;1742:2;1781:22;;72:20;97:33;72:20;97:33;:::i;:::-;1546:391;;1750:63;;-1:-1;;;1850:2;1889:22;;;;481:20;;1546:391::o;1944:991::-;;;;;;;;2148:3;2136:9;2127:7;2123:23;2119:33;2116:2;;;-1:-1;;2155:12;2116:2;2217:53;2262:7;2238:22;2217:53;:::i;:::-;2207:63;;2325:53;2370:7;2307:2;2350:9;2346:22;2325:53;:::i;:::-;2315:63;;2415:2;2458:9;2454:22;481:20;2423:63;;2523:2;2566:9;2562:22;481:20;2531:63;;2631:3;2673:9;2669:22;757:20;21299:4;22637:5;21288:16;22614:5;22611:33;22601:2;;-1:-1;;22648:12;22601:2;2110:825;;;;-1:-1;2110:825;;;;2640:61;2738:3;2778:22;;344:20;;-1:-1;2847:3;2887:22;;;344:20;;2110:825;-1:-1;;2110:825::o;2942:366::-;;;3063:2;3051:9;3042:7;3038:23;3034:32;3031:2;;;-1:-1;;3069:12;3031:2;3131:53;3176:7;3152:22;3131:53;:::i;:::-;3121:63;3221:2;3260:22;;;;481:20;;-1:-1;;;3025:283::o;3315:257::-;;3427:2;3415:9;3406:7;3402:23;3398:32;3395:2;;;-1:-1;;3433:12;3395:2;223:6;217:13;22269:5;20796:13;20789:21;22247:5;22244:32;22234:2;;-1:-1;;22280:12;3579:241;;3683:2;3671:9;3662:7;3658:23;3654:32;3651:2;;;-1:-1;;3689:12;3651:2;-1:-1;481:20;;3645:175;-1:-1;3645:175::o;3827:263::-;;3942:2;3930:9;3921:7;3917:23;3913:32;3910:2;;;-1:-1;;3948:12;3910:2;-1:-1;629:13;;3904:186;-1:-1;3904:186::o;9782:271::-;;4767:5;19983:12;4878:52;4923:6;4918:3;4911:4;4904:5;4900:16;4878:52;:::i;:::-;4942:16;;;;;9916:137;-1:-1;;9916:137::o;10060:553::-;;4767:5;19983:12;4878:52;4923:6;4918:3;4911:4;4904:5;4900:16;4878:52;:::i;:::-;4942:16;;;;4399:37;;;-1:-1;4911:4;10465:12;;4399:37;10576:12;;;10252:361;-1:-1;10252:361::o;10620:222::-;21094:42;21083:54;;;;4168:37;;10747:2;10732:18;;10718:124::o;10849:444::-;21094:42;21083:54;;;4168:37;;21083:54;;;;11196:2;11181:18;;4168:37;11279:2;11264:18;;4399:37;;;;11032:2;11017:18;;11003:290::o;11300:333::-;21094:42;21083:54;;;;4168:37;;11619:2;11604:18;;4399:37;11455:2;11440:18;;11426:207::o;11640:210::-;20796:13;;20789:21;4282:34;;11761:2;11746:18;;11732:118::o;11857:222::-;4399:37;;;11984:2;11969:18;;11955:124::o;12086:780::-;4399:37;;;21094:42;21083:54;;;12518:2;12503:18;;4168:37;21083:54;;;;12601:2;12586:18;;4168:37;12684:2;12669:18;;4399:37;12767:3;12752:19;;4399:37;;;;12851:3;12836:19;;4399:37;12353:3;12338:19;;12324:542::o;12873:444::-;4399:37;;;13220:2;13205:18;;4399:37;;;;21094:42;21083:54;13303:2;13288:18;;4168:37;13056:2;13041:18;;13027:290::o;13324:548::-;4399:37;;;21299:4;21288:16;;;;13692:2;13677:18;;9735:35;13775:2;13760:18;;4399:37;13858:2;13843:18;;4399:37;13531:3;13516:19;;13502:370::o;14136:310::-;;14283:2;14304:17;14297:47;5276:5;19983:12;20422:6;14283:2;14272:9;14268:18;20410:19;5370:52;5415:6;20450:14;14272:9;20450:14;14283:2;5396:5;5392:16;5370:52;:::i;:::-;22047:2;22027:14;22043:7;22023:28;5434:39;;;;20450:14;5434:39;;14254:192;-1:-1;;14254:192::o;14453:416::-;14653:2;14667:47;;;6077:2;14638:18;;;20410:19;6113:23;20450:14;;;6093:44;6156:12;;;14624:245::o;14876:416::-;15076:2;15090:47;;;6407:1;15061:18;;;20410:19;6442:8;20450:14;;;6422:29;6470:12;;;15047:245::o;15299:416::-;15499:2;15513:47;;;6721:2;15484:18;;;20410:19;6757:30;20450:14;;;6737:51;6807:12;;;15470:245::o;15722:416::-;15922:2;15936:47;;;7058:2;15907:18;;;20410:19;7094:15;20450:14;;;7074:36;7129:12;;;15893:245::o;16145:416::-;16345:2;16359:47;;;7380:2;16330:18;;;20410:19;7416:13;20450:14;;;7396:34;7449:12;;;16316:245::o;16568:416::-;16768:2;16782:47;;;7700:2;16753:18;;;20410:19;7736:14;20450;;;7716:35;7770:12;;;16739:245::o;16991:416::-;17191:2;17205:47;;;8021:2;17176:18;;;20410:19;8057:30;20450:14;;;8037:51;8107:12;;;17162:245::o;17414:416::-;17614:2;17628:47;;;8358:2;17599:18;;;20410:19;8394:13;20450:14;;;8374:34;8427:12;;;17585:245::o;17837:416::-;18037:2;18051:47;;;18022:18;;;20410:19;8714:34;20450:14;;;8694:55;8768:12;;;18008:245::o;18260:416::-;18460:2;18474:47;;;9019:2;18445:18;;;20410:19;9055:12;20450:14;;;9035:33;9087:12;;;18431:245::o;18683:416::-;18883:2;18897:47;;;9338:1;18868:18;;;20410:19;9373:9;20450:14;;;9353:30;9402:12;;;18854:245::o;19106:333::-;20974:34;20963:46;;;9499:37;;20963:46;;19425:2;19410:18;;9499:37;19261:2;19246:18;;19232:207::o;19675:214::-;21299:4;21288:16;;;;9735:35;;19798:2;19783:18;;19769:120::o;21602:268::-;21667:1;21674:101;21688:6;21685:1;21682:13;21674:101;;;21755:11;;;21749:18;21736:11;;;21729:39;21710:2;21703:10;21674:101;;;21790:6;21787:1;21784:13;21781:2;;;21667:1;21846:6;21841:3;21837:16;21830:27;21781:2;;21651:219;;;:::o;22064:117::-;21094:42;22151:5;21083:54;22126:5;22123:35;22113:2;;22172:1;;22162:12;22113:2;22107:74;:::o

Swarm Source

ipfs://6b133f8f02cff08e545e9b72bfa6d2aa3fed362b9ab85ea8046ceccba4863684
Block Transaction Difficulty Gas Used Reward
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.

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.