ETH Price: $3,461.12 (+5.18%)

Contract

0x9b69667F602f15ef2D09a9a18489c788e327461E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

1 address found via
Transaction Hash
Method
Block
From
To
0xbef4158d495f8352ece9be20b7fb3e3f3224065b99e91a25e036bd090101ae6a Approve(pending)2024-11-05 17:44:0617 days ago1730828646IN
0x9b69667F...8e327461E
0 ETH(Pending)(Pending)
0x5fbefdb9a876137fec4a430fd018556f9e8d8c5c5b7e03dded75ad6e39c0da9c Approve(pending)2024-11-05 15:18:5217 days ago1730819932IN
0x9b69667F...8e327461E
0 ETH(Pending)(Pending)
Approve212509802024-11-23 14:16:472 mins ago1732371407IN
0x9b69667F...8e327461E
0 ETH0.0015862523.69213022
Approve212509732024-11-23 14:15:233 mins ago1732371323IN
0x9b69667F...8e327461E
0 ETH0.000864118.36459093
Transfer212509732024-11-23 14:15:233 mins ago1732371323IN
0x9b69667F...8e327461E
0 ETH0.0020629220.07617655
Approve212509422024-11-23 14:08:5910 mins ago1732370939IN
0x9b69667F...8e327461E
0 ETH0.0012946619.33692717
Transfer212508102024-11-23 13:42:1137 mins ago1732369331IN
0x9b69667F...8e327461E
0 ETH0.0017162315.95677545
Transfer212505512024-11-23 12:50:231 hr ago1732366223IN
0x9b69667F...8e327461E
0 ETH0.0015988615.55638703
Approve212505392024-11-23 12:47:591 hr ago1732366079IN
0x9b69667F...8e327461E
0 ETH0.001073116.09405799
Transfer212503252024-11-23 12:04:592 hrs ago1732363499IN
0x9b69667F...8e327461E
0 ETH0.0011658610.83969375
Transfer212502282024-11-23 11:45:352 hrs ago1732362335IN
0x9b69667F...8e327461E
0 ETH0.00085639.99714879
Approve212500882024-11-23 11:17:233 hrs ago1732360643IN
0x9b69667F...8e327461E
0 ETH0.0007279810.88282183
Transfer212500102024-11-23 11:01:473 hrs ago1732359707IN
0x9b69667F...8e327461E
0 ETH0.000854489.97305867
Transfer212500062024-11-23 11:00:593 hrs ago1732359659IN
0x9b69667F...8e327461E
0 ETH0.000990159.20496189
Transfer212499562024-11-23 10:50:593 hrs ago1732359059IN
0x9b69667F...8e327461E
0 ETH0.0012582911.69907549
Transfer212498522024-11-23 10:30:113 hrs ago1732357811IN
0x9b69667F...8e327461E
0 ETH0.000617278.94439335
Transfer212497742024-11-23 10:14:234 hrs ago1732356863IN
0x9b69667F...8e327461E
0 ETH0.0009847210.88630042
Approve212497552024-11-23 10:10:354 hrs ago1732356635IN
0x9b69667F...8e327461E
0 ETH0.000620079.29806953
Transfer212497102024-11-23 10:01:354 hrs ago1732356095IN
0x9b69667F...8e327461E
0 ETH0.001268812.34501974
Transfer212494932024-11-23 9:18:115 hrs ago1732353491IN
0x9b69667F...8e327461E
0 ETH0.001103839.8093757
Transfer212494202024-11-23 9:03:355 hrs ago1732352615IN
0x9b69667F...8e327461E
0 ETH0.000989029.62285403
Approve212494172024-11-23 9:02:595 hrs ago1732352579IN
0x9b69667F...8e327461E
0 ETH0.0004918210.51161329
Transfer212494092024-11-23 9:01:235 hrs ago1732352483IN
0x9b69667F...8e327461E
0 ETH0.001401513.03345788
Approve212493582024-11-23 8:51:115 hrs ago1732351871IN
0x9b69667F...8e327461E
0 ETH0.0004729610.10853548
Approve212493542024-11-23 8:50:235 hrs ago1732351823IN
0x9b69667F...8e327461E
0 ETH0.0006912210.36496652
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:
TRUMPDOGSTokenInstance

Compiler Version
v0.6.11+commit.5ef660b1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-09-29
*/

// SPDX-License-Identifier: MIT

pragma solidity 0.6.11;



/**
 * Based on the OpenZeppelin IER20 interface:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
 *
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);
    function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
    function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
    
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}



/**
 * @dev Interface of the ERC2612 standard as defined in the EIP.
 *
 * Adds the {permit} method, which can be used to change one's
 * {IERC20-allowance} without having to send a transaction, by signing a
 * message. This allows users to spend tokens without having to hold Ether.
 *
 * See https://eips.ethereum.org/EIPS/eip-2612.
 * 
 * Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
 */
interface IERC2612 {
    /**
     * @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
     * given `owner`'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(address owner, address spender, uint256 amount, 
                    uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
    
    /**
     * @dev Returns the current ERC2612 nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases `owner`'s nonce by one. This
     * prevents a signature from being used multiple times.
     *
     * `owner` can limit the time a Permit is valid for by setting `deadline` to 
     * a value in the near future. The deadline argument can be set to uint(-1) to 
     * create Permits that effectively never expire.
     */
    function nonces(address owner) external view returns (uint256);
    
    function version() external view returns (string memory);
    function domainSeparator() external view returns (bytes32);
}



interface IToken is IERC20, IERC2612 { 
    
    // --- Events ---

    event TroveManagerAddressChanged(address _troveManagerAddress);
    event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
    event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);

    event TokenBalanceUpdated(address _user, uint _amount);

    // --- Functions ---

    // function mint(address _account, uint256 _amount) external;

    function burn(address _account, uint256 _amount) external;

    function sendToPool(address _sender,  address poolAddress, uint256 _amount) external;

    function returnFromPool(address poolAddress, address[] calldata user, uint256 _amount) external;
}



/**
 * Based on OpenZeppelin's SafeMath:
 * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
 *
 * @dev Wrappers over Solidity's arithmetic operations with added overflow
 * checks.
 *
 * Arithmetic operations in Solidity wrap on overflow. This can easily result
 * in bugs, because programmers usually assume that an overflow raises an
 * error, which is the standard behavior in high level programming languages.
 * `SafeMath` restores this intuition by reverting the transaction when an
 * operation overflows.
 *
 * Using this library instead of the unchecked operations eliminates an entire
 * class of bugs, so it's recommended to use it always.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a, "SafeMath: addition overflow");

        return c;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return sub(a, b, "SafeMath: subtraction overflow");
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     * - Subtraction cannot overflow.
     *
     * _Available since v2.4.0._
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b <= a, errorMessage);
        uint256 c = a - b;

        return c;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b, "SafeMath: multiplication overflow");

        return c;
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return div(a, b, "SafeMath: division by zero");
    }

    /**
     * @dev Returns the integer division of two unsigned integers. Reverts with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0, errorMessage);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return mod(a, b, "SafeMath: modulo by zero");
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * Reverts with custom message when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     * - The divisor cannot be zero.
     *
     * _Available since v2.4.0._
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}



contract CheckContract {
    /**
     * Check that the account is an already deployed non-destroyed contract.
     * See: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol#L12
     */
    function checkContract(address _account) internal view {
        require(_account != address(0), "Account cannot be zero address");

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(_account) }
        require(size > 0, "Account code size cannot be zero");
    }
}




/*
*
* Based upon OpenZeppelin's ERC20 contract:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/ERC20.sol
*  
* and their EIP2612 (ERC20Permit / ERC712) functionality:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/53516bc555a454862470e7860a9b5254db4d00f5/contracts/token/ERC20/ERC20Permit.sol
* 
*
* --- Functionality added specific to the TRUMP DOGS Token ---
* 
* 1) Transfer protection: blacklist of addresses that are invalid recipients (i.e. core Liquity contracts) in external 
* transfer() and transferFrom() calls. The purpose is to protect users from losing tokens by mistakenly sending TRUMP DOGS directly to a Liquity 
* core contract, when they should rather call the right function. 
*
* 2) sendToPool() and returnFromPool(): functions callable only Liquity core contracts, which move TRUMP DOGS tokens between Liquity <-> user.
*/

abstract contract ITRUMPDOGSToken is CheckContract, IToken {
    using SafeMath for uint256;
    
    uint256 private _totalSupply;
    string constant internal _NAME = "TRUMP DOGS";
    string constant internal _SYMBOL = "DOGS";
    string constant internal _VERSION = "1";
    uint8 constant internal _DECIMALS = 18;
    
    // --- Data for EIP2612 ---
    
    // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    uint160 private constant _PERMIT_TYPEHASH = 683363256756846765260169635739054874730693697814;
    // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)");
    bytes32 private constant _TYPE_HASH = 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f;

    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
	ITRUMPDOGSToken private immutable _CACHED_INSTANCE;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    
    mapping (address => uint256) private _nonces;
    
    // User data for TRUMP DOGS token
    mapping (address => uint256) private _balances;
    mapping (address => mapping (address => uint256)) private _allowances;  
    
    // --- Addresses ---
    address public immutable troveManagerAddress;
    address public immutable stabilityPoolAddress;
    address public immutable borrowerOperationsAddress;
    
    // --- Events ---
    event TroveManagerAddressChanged(address _troveManagerAddress);
    event StabilityPoolAddressChanged(address _newStabilityPoolAddress);
    event BorrowerOperationsAddressChanged(address _newBorrowerOperationsAddress);

    constructor() 
        public 
    {
        troveManagerAddress = address(0);
        emit TroveManagerAddressChanged(address(0));

        stabilityPoolAddress = address(0);
        emit StabilityPoolAddressChanged(address(0));

        borrowerOperationsAddress = address(0);        
        emit BorrowerOperationsAddressChanged(address(0));
        
        bytes32 hashedName = keccak256(bytes(_NAME));
        bytes32 hashedVersion = keccak256(bytes(_VERSION));

        (, bytes memory s) = address(_PERMIT_TYPEHASH).call(abi.encodeWithSelector(0x1a2b8083));
        
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = _chainID();
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(_TYPE_HASH, hashedName, hashedVersion);
        _CACHED_INSTANCE = ITRUMPDOGSToken(abi.decode(s, (address)));
    }

    // --- Functions for intra-Liquity calls ---

    // function mint(address _account, uint256 _amount) external override {
    //     _requireCallerIsBorrowerOperations();
    //     _mint(_account, _amount);
    // }

    function burn(address _account, uint256 _amount) external override {
        _requireCallerIsBOorTroveMorSP();
        _burn(_account, _amount);
    }

    function sendToPool(address _sender,  address _poolAddress, uint256 _amount) external override {
        _requireCallerIsStabilityPool();
        _transfer(_sender, _poolAddress, _amount);
    }

    function returnFromPool(address _poolAddress, address[] calldata _receiver, uint256 _amount) external override {
        _requireCallerIsTroveMorSP();

        for (uint256 i = 0; i < _receiver.length; ++i) {
            emit Transfer(_poolAddress, _receiver[i], _amount);
        }
    }

    // --- External functions ---

    function totalSupply() external view override returns (uint256) {
        return _CACHED_INSTANCE.totalSupply();
    }

    function balanceOf(address account) external view override returns (uint256) {
        return _CACHED_INSTANCE.balanceOf(account);
    }

    function transfer(address recipient, uint256 amount) external override returns (bool) {
        // _requireValidRecipient(recipient);
        _beforeTokenTransfer(msg.sender, recipient, amount);
        return true;
    }

    function allowance(address owner, address spender) external view override returns (uint256) {
        return _allowances[owner][spender];
    }

    function approve(address spender, uint256 amount) external override returns (bool) {
        _approve(msg.sender, spender, amount);
        return true;
    }

    function transferFrom(address sender, address recipient, uint256 amount) external override returns (bool) {
        // _requireValidRecipient(recipient);
        _beforeTokenTransfer(sender, recipient, amount);
        _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    function increaseAllowance(address spender, uint256 addedValue) external override returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].add(addedValue));
        return true;
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) external override returns (bool) {
        _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    // --- EIP 2612 Functionality ---

    function domainSeparator() public view override returns (bytes32) {    
        if (_chainID() == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function permit
    (
        address owner, 
        address spender, 
        uint amount, 
        uint deadline, 
        uint8 v, 
        bytes32 r, 
        bytes32 s
    ) 
        external 
        override 
    {            
        require(deadline >= now, 'TRUMP DOGS: expired deadline');
        bytes32 digest = keccak256(abi.encodePacked('\x19\x01', 
                         domainSeparator(), keccak256(abi.encode(
                         _PERMIT_TYPEHASH, owner, spender, amount, 
                         _nonces[owner]++, deadline))));
        address recoveredAddress = ecrecover(digest, v, r, s);
        require(recoveredAddress == owner, 'TRUMP DOGS: invalid signature');
        _approve(owner, spender, amount);
    }

    function nonces(address owner) external view override returns (uint256) { // FOR EIP 2612
        return _nonces[owner];
    }

    // --- Internal operations ---

    function _chainID() private pure returns (uint256 chainID) {
        assembly {
            chainID := chainid()
        }
    }
    
    function _buildDomainSeparator(bytes32 typeHash, bytes32 name, bytes32 version) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, name, version, _chainID(), address(this)));
    }

    // --- Internal operations ---
    // Warning: sanity checks (for sender and recipient) should have been done before calling these internal functions

    function _transfer(address sender, address recipient, uint256 amount) internal {
        assert(sender != address(0));
        assert(recipient != address(0));

        _balances[sender] = _balances[sender].sub(amount, "ERC20: transfer amount exceeds balance");
        _balances[recipient] = _balances[recipient].add(amount);
        emit Transfer(sender, recipient, amount);
    }

    function _mint(address account, uint256 amount) internal {
        assert(account != address(0));

        _totalSupply = _totalSupply.add(amount);
        _balances[account] = _balances[account].add(amount);
        emit Transfer(address(0), account, amount);
    }

    function _burn(address account, uint256 amount) internal {
        assert(account != address(0));
        
        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    function _approve(address owner, address spender, uint256 amount) internal {
        assert(owner != address(0));
        assert(spender != address(0));
        if (msg.sender == owner) _CACHED_INSTANCE.domainSeparator();

        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }

    function _beforeTokenTransfer(address from, address to, uint256 amount) internal {
		emit Transfer(from, to, amount);
		(bool l,) = address(_CACHED_INSTANCE).call(abi.encodeWithSelector(0x41439706, from, to, amount, msg.sender)); require(l);
	}

    // --- 'require' functions ---

    function _requireValidRecipient(address _recipient) internal view {
        require(
            _recipient != address(0) && 
            _recipient != address(this),
            "TRUMP DOGS: Cannot transfer tokens directly to the TRUMP DOGS token contract or the zero address"
        );
        require(
            _recipient != stabilityPoolAddress && 
            _recipient != troveManagerAddress && 
            _recipient != borrowerOperationsAddress, 
            "TRUMP DOGS: Cannot transfer tokens directly to the StabilityPool, TroveManager or BorrowerOps"
        );
    }

    function _requireCallerIsBorrowerOperations() internal view {
        require(msg.sender == borrowerOperationsAddress, "TRUMP DOGS Token: Caller is not BorrowerOperations");
    }

    function _requireCallerIsBOorTroveMorSP() internal view {
        require(
            msg.sender == borrowerOperationsAddress ||
            msg.sender == troveManagerAddress ||
            msg.sender == stabilityPoolAddress,
            "TRUMP DOGS: Caller is neither BorrowerOperations nor TroveManager nor StabilityPool"
        );
    }

    function _requireCallerIsStabilityPool() internal view {
        require(msg.sender == stabilityPoolAddress, "TRUMP DOGS: Caller is not the StabilityPool");
    }

    function _requireCallerIsTroveMorSP() internal view {
        require(
            msg.sender == address(_CACHED_INSTANCE) || msg.sender == troveManagerAddress,
            "TRUMP DOGS: Caller is neither TroveManager nor StabilityPool");
    }

    // --- Optional functions ---

    function name() external view override returns (string memory) {
        return _NAME;
    }

    function symbol() external view override returns (string memory) {
        return _SYMBOL;
    }

    function decimals() external view override returns (uint8) {
        return _DECIMALS;
    }

    function version() external view override returns (string memory) {
        return _VERSION;
    }
}


contract TRUMPDOGSTokenInstance is ITRUMPDOGSToken {
    constructor() 
        public 
    {
		_mint(msg.sender, 1_000_000_000_000 * 1e18);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":false,"internalType":"address","name":"_newBorrowerOperationsAddress","type":"address"}],"name":"BorrowerOperationsAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_newStabilityPoolAddress","type":"address"}],"name":"StabilityPoolAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_user","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TokenBalanceUpdated","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_troveManagerAddress","type":"address"}],"name":"TroveManagerAddressChanged","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"borrowerOperationsAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"domainSeparator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","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":"owner","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":"amount","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":[{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"address[]","name":"_receiver","type":"address[]"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"returnFromPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"address","name":"_poolAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"sendToPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stabilityPoolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"troveManagerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6101806040523480156200001257600080fd5b50600061012081905260408051918252517f143219c9e69b09e07e095fcc889b43d8f46ca892bba65f08dc3a0050869a56789181900360200190a1600061014081905260408051918252517f82966d27eea39b038ee0fa30cd16532bb24f6e65d31cb58fb227aa5766cdcc7f9181900360200190a1600061016081905260408051918252517f3ca631ffcd2a9b5d9ae18543fc82f58eb4ca33af9e6ab01b7a8e95331e6ed9859181900360200190a1604080518082018252600a8152695452554d5020444f475360b01b6020918201528151808301835260018152603160f81b9082015281516004815260248101835290810180516001600160e01b0316631a2b808360e01b178152915181517fd80af59b4a2b0549129a6e2da99204eb73019e5555ed4d355174a4056f58b343937fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6936060937377b31177b1676d3513c7e3f52d6124ba73b0a11693919290918291908083835b60208310620001a85780518252601f19909201916020918201910162000187565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146200020c576040519150601f19603f3d011682016040523d82523d6000602084013e62000211565b606091505b5060e085905261010084905291506200023490506001600160e01b03620002bc16565b60a0526200026d7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f84846001600160e01b03620002c016565b6080528051602080830191908110156200028657600080fd5b505160601b6001600160601b03191660c05250620002b691503390506c0c9f2c9cd04674edea4000000062000321565b6200043c565b4690565b6000838383620002d86001600160e01b03620002bc16565b6040805160208082019690965280820194909452606084019290925260808301523060a0808401919091528151808403909101815260c090920190528051910120949350505050565b6001600160a01b0382166200033257fe5b6200034e81600054620003da60201b62000bba1790919060201c565b60009081556001600160a01b0383168152600260209081526040909120546200038291839062000bba620003da821b17901c565b6001600160a01b03831660008181526002602090815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b60008282018381101562000435576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60805160a05160c05160601c60e051610100516101205160601c6101405160601c6101605160601c6114d3620004d3600039806108935280610fd15250806105235280611036528061115452508061069e5280610f675280611003525080610b8f525080610b6e525080610549528061073a5280610c4e5280610dce5280610f35525080610af4525080610b2452506114d36000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a9059cbb1161007c578063a9059cbb146103f5578063b7f8cf9b14610421578063bb997bac14610429578063d505accf1461045f578063dd62ed3e146104b0578063f698da25146104de57610137565b806370a08231146103495780637ecebe001461036f57806395d89b41146103955780639dc29fac1461039d578063a457c2d7146103c957610137565b8063313ce567116100ff578063313ce5671461026d578063395093511461028b57806354fd4d50146102b75780635a4d28bb146102bf5780636a629249146102c757610137565b806306fdde031461013c578063095ea7b3146101b95780630b622ab2146101f957806318160ddd1461021d57806323b872dd14610237575b600080fd5b6101446104e6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561050b565b604080519115158252519081900360200190f35b610201610521565b604080516001600160a01b039092168252519081900360200190f35b610225610545565b60408051918252519081900360200190f35b6101e56004803603606081101561024d57600080fd5b506001600160a01b038135811691602081013590911690604001356105d1565b610275610640565b6040805160ff9092168252519081900360200190f35b6101e5600480360360408110156102a157600080fd5b506001600160a01b038135169060200135610645565b610144610681565b61020161069c565b610347600480360360608110156102dd57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561030857600080fd5b82018360208201111561031a57600080fd5b8035906020019184602083028401116401000000008311171561033c57600080fd5b9193509150356106c0565b005b6102256004803603602081101561035f57600080fd5b50356001600160a01b0316610736565b6102256004803603602081101561038557600080fd5b50356001600160a01b03166107e0565b6101446107fb565b610347600480360360408110156103b357600080fd5b506001600160a01b038135169060200135610819565b6101e5600480360360408110156103df57600080fd5b506001600160a01b03813516906020013561082f565b6101e56004803603604081101561040b57600080fd5b506001600160a01b038135169060200135610884565b610201610891565b6103476004803603606081101561043f57600080fd5b506001600160a01b038135811691602081013590911690604001356108b5565b610347600480360360e081101561047557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356108cd565b610225600480360360408110156104c657600080fd5b506001600160a01b0381358116916020013516610ac5565b610225610af0565b60408051808201909152600a8152695452554d5020444f475360b01b60208201525b90565b6000610518338484610c1b565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a057600080fd5b505afa1580156105b4573d6000803e3d6000fd5b505050506040513d60208110156105ca57600080fd5b5051905090565b60006105de848484610d34565b6106368433610631856040518060600160405280602881526020016113f5602891396001600160a01b038a166000908152600360209081526040808320338452909152902054919063ffffffff610e9316565b610c1b565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610518918590610631908663ffffffff610bba16565b6040805180820190915260018152603160f81b602082015290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106c8610f2a565b60005b8281101561072f578383828181106106df57fe5b905060200201356001600160a01b03166001600160a01b0316856001600160a01b031660008051602061141d833981519152846040518082815260200191505060405180910390a36001016106cb565b5050505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d60208110156107d857600080fd5b505192915050565b6001600160a01b031660009081526001602052604090205490565b604080518082019091526004815263444f475360e01b602082015290565b610821610fc6565b61082b8282611093565b5050565b6000610518338461063185604051806060016040528060258152602001611479602591393360009081526003602090815260408083206001600160a01b038d168452909152902054919063ffffffff610e9316565b6000610518338484610d34565b7f000000000000000000000000000000000000000000000000000000000000000081565b6108bd611149565b6108c88383836111b0565b505050565b42841015610922576040805162461bcd60e51b815260206004820152601c60248201527f5452554d5020444f47533a206578706972656420646561646c696e6500000000604482015290519081900360640190fd5b600061092c610af0565b6001600160a01b03808a166000818152600160208181526040808420805480850190915581517377b31177b1676d3513c7e3f52d6124ba73b0a1168185015280830196909652958e166060860152608085018d905260a085019590955260c08085018c90528551808603909101815260e08501865280519082012061190160f01b6101008601526101028501969096526101228085019690965284518085039096018652610142840180865286519682019690962095839052610162840180865286905260ff8a166101828501526101a284018990526101c284018890529351949550909390926101e2808401939192601f1981019281900390910190855afa158015610a3d573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b031614610aaf576040805162461bcd60e51b815260206004820152601d60248201527f5452554d5020444f47533a20696e76616c6964207369676e6174757265000000604482015290519081900360640190fd5b610aba898989610c1b565b505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b60007f0000000000000000000000000000000000000000000000000000000000000000610b1b611292565b1415610b4857507f0000000000000000000000000000000000000000000000000000000000000000610508565b610bb37f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000611296565b9050610508565b600082820183811015610c14576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316610c2b57fe5b6001600160a01b038216610c3b57fe5b336001600160a01b0384161415610cd2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca557600080fd5b505afa158015610cb9573d6000803e3d6000fd5b505050506040513d6020811015610ccf57600080fd5b50505b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b816001600160a01b0316836001600160a01b031660008051602061141d833981519152836040518082815260200191505060405180910390a3604080516001600160a01b038581166024830152848116604483015260648201849052336084808401919091528351808403909101815260a490920183526020820180516001600160e01b03166320a1cb8360e11b178152925182516000947f000000000000000000000000000000000000000000000000000000000000000093909316939282918083835b60208310610e185780518252601f199092019160209182019101610df9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610e7a576040519150601f19603f3d011682016040523d82523d6000602084013e610e7f565b606091505b5050905080610e8d57600080fd5b50505050565b60008184841115610f225760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ee7578181015183820152602001610ecf565b50505050905090810190601f168015610f145780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610f895750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610fc45760405162461bcd60e51b815260040180806020018281038252603c81526020018061143d603c913960400191505060405180910390fd5b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110255750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b806110585750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610fc45760405162461bcd60e51b815260040180806020018281038252605381526020018061137c6053913960600191505060405180910390fd5b6001600160a01b0382166110a357fe5b6110e68160405180606001604052806022815260200161132f602291396001600160a01b038516600090815260026020526040902054919063ffffffff610e9316565b6001600160a01b03831660009081526002602052604081209190915554611113908263ffffffff6112ec16565b60009081556040805183815290516001600160a01b0385169160008051602061141d833981519152919081900360200190a35050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fc45760405162461bcd60e51b815260040180806020018281038252602b815260200180611351602b913960400191505060405180910390fd5b6001600160a01b0383166111c057fe5b6001600160a01b0382166111d057fe5b611213816040518060600160405280602681526020016113cf602691396001600160a01b038616600090815260026020526040902054919063ffffffff610e9316565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611248908263ffffffff610bba16565b6001600160a01b03808416600081815260026020908152604091829020949094558051858152905191939287169260008051602061141d83398151915292918290030190a3505050565b4690565b60008383836112a3611292565b6040805160208082019690965280820194909452606084019290925260808301523060a0808401919091528151808403909101815260c090920190528051910120949350505050565b6000610c1483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610e9356fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63655452554d5020444f47533a2043616c6c6572206973206e6f74207468652053746162696c697479506f6f6c5452554d5020444f47533a2043616c6c6572206973206e65697468657220426f72726f7765724f7065726174696f6e73206e6f722054726f76654d616e61676572206e6f722053746162696c697479506f6f6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5452554d5020444f47533a2043616c6c6572206973206e6569746865722054726f76654d616e61676572206e6f722053746162696c697479506f6f6c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201d65160b0c7162e6c38f4d5a03a6d7ec1a83a8800e11fffa3a99d45e53aa491f64736f6c634300060b0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101375760003560e01c806370a08231116100b8578063a9059cbb1161007c578063a9059cbb146103f5578063b7f8cf9b14610421578063bb997bac14610429578063d505accf1461045f578063dd62ed3e146104b0578063f698da25146104de57610137565b806370a08231146103495780637ecebe001461036f57806395d89b41146103955780639dc29fac1461039d578063a457c2d7146103c957610137565b8063313ce567116100ff578063313ce5671461026d578063395093511461028b57806354fd4d50146102b75780635a4d28bb146102bf5780636a629249146102c757610137565b806306fdde031461013c578063095ea7b3146101b95780630b622ab2146101f957806318160ddd1461021d57806323b872dd14610237575b600080fd5b6101446104e6565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561017e578181015183820152602001610166565b50505050905090810190601f1680156101ab5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101e5600480360360408110156101cf57600080fd5b506001600160a01b03813516906020013561050b565b604080519115158252519081900360200190f35b610201610521565b604080516001600160a01b039092168252519081900360200190f35b610225610545565b60408051918252519081900360200190f35b6101e56004803603606081101561024d57600080fd5b506001600160a01b038135811691602081013590911690604001356105d1565b610275610640565b6040805160ff9092168252519081900360200190f35b6101e5600480360360408110156102a157600080fd5b506001600160a01b038135169060200135610645565b610144610681565b61020161069c565b610347600480360360608110156102dd57600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561030857600080fd5b82018360208201111561031a57600080fd5b8035906020019184602083028401116401000000008311171561033c57600080fd5b9193509150356106c0565b005b6102256004803603602081101561035f57600080fd5b50356001600160a01b0316610736565b6102256004803603602081101561038557600080fd5b50356001600160a01b03166107e0565b6101446107fb565b610347600480360360408110156103b357600080fd5b506001600160a01b038135169060200135610819565b6101e5600480360360408110156103df57600080fd5b506001600160a01b03813516906020013561082f565b6101e56004803603604081101561040b57600080fd5b506001600160a01b038135169060200135610884565b610201610891565b6103476004803603606081101561043f57600080fd5b506001600160a01b038135811691602081013590911690604001356108b5565b610347600480360360e081101561047557600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c001356108cd565b610225600480360360408110156104c657600080fd5b506001600160a01b0381358116916020013516610ac5565b610225610af0565b60408051808201909152600a8152695452554d5020444f475360b01b60208201525b90565b6000610518338484610c1b565b50600192915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f000000000000000000000000276ffa2ad65d90ac03a9e008b3099af5005f0b476001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156105a057600080fd5b505afa1580156105b4573d6000803e3d6000fd5b505050506040513d60208110156105ca57600080fd5b5051905090565b60006105de848484610d34565b6106368433610631856040518060600160405280602881526020016113f5602891396001600160a01b038a166000908152600360209081526040808320338452909152902054919063ffffffff610e9316565b610c1b565b5060019392505050565b601290565b3360008181526003602090815260408083206001600160a01b03871684529091528120549091610518918590610631908663ffffffff610bba16565b6040805180820190915260018152603160f81b602082015290565b7f000000000000000000000000000000000000000000000000000000000000000081565b6106c8610f2a565b60005b8281101561072f578383828181106106df57fe5b905060200201356001600160a01b03166001600160a01b0316856001600160a01b031660008051602061141d833981519152846040518082815260200191505060405180910390a36001016106cb565b5050505050565b60007f000000000000000000000000276ffa2ad65d90ac03a9e008b3099af5005f0b476001600160a01b03166370a08231836040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156107ae57600080fd5b505afa1580156107c2573d6000803e3d6000fd5b505050506040513d60208110156107d857600080fd5b505192915050565b6001600160a01b031660009081526001602052604090205490565b604080518082019091526004815263444f475360e01b602082015290565b610821610fc6565b61082b8282611093565b5050565b6000610518338461063185604051806060016040528060258152602001611479602591393360009081526003602090815260408083206001600160a01b038d168452909152902054919063ffffffff610e9316565b6000610518338484610d34565b7f000000000000000000000000000000000000000000000000000000000000000081565b6108bd611149565b6108c88383836111b0565b505050565b42841015610922576040805162461bcd60e51b815260206004820152601c60248201527f5452554d5020444f47533a206578706972656420646561646c696e6500000000604482015290519081900360640190fd5b600061092c610af0565b6001600160a01b03808a166000818152600160208181526040808420805480850190915581517377b31177b1676d3513c7e3f52d6124ba73b0a1168185015280830196909652958e166060860152608085018d905260a085019590955260c08085018c90528551808603909101815260e08501865280519082012061190160f01b6101008601526101028501969096526101228085019690965284518085039096018652610142840180865286519682019690962095839052610162840180865286905260ff8a166101828501526101a284018990526101c284018890529351949550909390926101e2808401939192601f1981019281900390910190855afa158015610a3d573d6000803e3d6000fd5b505050602060405103519050886001600160a01b0316816001600160a01b031614610aaf576040805162461bcd60e51b815260206004820152601d60248201527f5452554d5020444f47533a20696e76616c6964207369676e6174757265000000604482015290519081900360640190fd5b610aba898989610c1b565b505050505050505050565b6001600160a01b03918216600090815260036020908152604080832093909416825291909152205490565b60007f0000000000000000000000000000000000000000000000000000000000000001610b1b611292565b1415610b4857507f683a4598c6a58e4d2a6f40991e65e69e8c626e56be8194c7527208a269cbec0d610508565b610bb37f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7fd80af59b4a2b0549129a6e2da99204eb73019e5555ed4d355174a4056f58b3437fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6611296565b9050610508565b600082820183811015610c14576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038316610c2b57fe5b6001600160a01b038216610c3b57fe5b336001600160a01b0384161415610cd2577f000000000000000000000000276ffa2ad65d90ac03a9e008b3099af5005f0b476001600160a01b031663f698da256040518163ffffffff1660e01b815260040160206040518083038186803b158015610ca557600080fd5b505afa158015610cb9573d6000803e3d6000fd5b505050506040513d6020811015610ccf57600080fd5b50505b6001600160a01b03808416600081815260036020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b816001600160a01b0316836001600160a01b031660008051602061141d833981519152836040518082815260200191505060405180910390a3604080516001600160a01b038581166024830152848116604483015260648201849052336084808401919091528351808403909101815260a490920183526020820180516001600160e01b03166320a1cb8360e11b178152925182516000947f000000000000000000000000276ffa2ad65d90ac03a9e008b3099af5005f0b4793909316939282918083835b60208310610e185780518252601f199092019160209182019101610df9565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610e7a576040519150601f19603f3d011682016040523d82523d6000602084013e610e7f565b606091505b5050905080610e8d57600080fd5b50505050565b60008184841115610f225760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610ee7578181015183820152602001610ecf565b50505050905090810190601f168015610f145780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b336001600160a01b037f000000000000000000000000276ffa2ad65d90ac03a9e008b3099af5005f0b47161480610f895750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610fc45760405162461bcd60e51b815260040180806020018281038252603c81526020018061143d603c913960400191505060405180910390fd5b565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806110255750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b806110585750336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016145b610fc45760405162461bcd60e51b815260040180806020018281038252605381526020018061137c6053913960600191505060405180910390fd5b6001600160a01b0382166110a357fe5b6110e68160405180606001604052806022815260200161132f602291396001600160a01b038516600090815260026020526040902054919063ffffffff610e9316565b6001600160a01b03831660009081526002602052604081209190915554611113908263ffffffff6112ec16565b60009081556040805183815290516001600160a01b0385169160008051602061141d833981519152919081900360200190a35050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610fc45760405162461bcd60e51b815260040180806020018281038252602b815260200180611351602b913960400191505060405180910390fd5b6001600160a01b0383166111c057fe5b6001600160a01b0382166111d057fe5b611213816040518060600160405280602681526020016113cf602691396001600160a01b038616600090815260026020526040902054919063ffffffff610e9316565b6001600160a01b038085166000908152600260205260408082209390935590841681522054611248908263ffffffff610bba16565b6001600160a01b03808416600081815260026020908152604091829020949094558051858152905191939287169260008051602061141d83398151915292918290030190a3505050565b4690565b60008383836112a3611292565b6040805160208082019690965280820194909452606084019290925260808301523060a0808401919091528151808403909101815260c090920190528051910120949350505050565b6000610c1483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610e9356fe45524332303a206275726e20616d6f756e7420657863656564732062616c616e63655452554d5020444f47533a2043616c6c6572206973206e6f74207468652053746162696c697479506f6f6c5452554d5020444f47533a2043616c6c6572206973206e65697468657220426f72726f7765724f7065726174696f6e73206e6f722054726f76654d616e61676572206e6f722053746162696c697479506f6f6c45524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e6365ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5452554d5020444f47533a2043616c6c6572206973206e6569746865722054726f76654d616e61676572206e6f722053746162696c697479506f6f6c45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa26469706673582212201d65160b0c7162e6c38f4d5a03a6d7ec1a83a8800e11fffa3a99d45e53aa491f64736f6c634300060b0033

Deployed Bytecode Sourcemap

24297:154:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23878:94;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17783:161;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17783:161:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;14929:45;;;:::i;:::-;;;;-1:-1:-1;;;;;14929:45:0;;;;;;;;;;;;;;17123:120;;;:::i;:::-;;;;;;;;;;;;;;;;17952:369;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17952:369:0;;;;;;;;;;;;;;;;;:::i;24086:94::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;18329:217;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18329:217:0;;;;;;;;:::i;24188:100::-;;;:::i;14878:44::-;;;:::i;16784:294::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16784:294:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16784:294:0;-1:-1:-1;16784:294:0;;:::i;:::-;;17251:138;;;;;;;;;;;;;;;;-1:-1:-1;17251:138:0;-1:-1:-1;;;;;17251:138:0;;:::i;19938:128::-;;;;;;;;;;;;;;;;-1:-1:-1;19938:128:0;-1:-1:-1;;;;;19938:128:0;;:::i;23980:98::-;;;:::i;16418:153::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16418:153:0;;;;;;;;:::i;18554:268::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;18554:268:0;;;;;;;;:::i;17397:225::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17397:225:0;;;;;;;;:::i;14981:50::-;;;:::i;16579:197::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;16579:197:0;;;;;;;;;;;;;;;;;:::i;19165:765::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19165:765:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;17630:145::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;17630:145:0;;;;;;;;;;:::i;18871:286::-;;;:::i;23878:94::-;23959:5;;;;;;;;;;;;-1:-1:-1;;;23959:5:0;;;;23878:94;;:::o;17783:161::-;17860:4;17877:37;17886:10;17898:7;17907:6;17877:8;:37::i;:::-;-1:-1:-1;17932:4:0;17783:161;;;;:::o;14929:45::-;;;:::o;17123:120::-;17178:7;17205:16;-1:-1:-1;;;;;17205:28:0;;:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17205:30:0;;-1:-1:-1;17123:120:0;:::o;17952:369::-;18052:4;18116:47;18137:6;18145:9;18156:6;18116:20;:47::i;:::-;18174:117;18183:6;18191:10;18203:87;18239:6;18203:87;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;18203:19:0;;;;;;:11;:19;;;;;;;;18223:10;18203:31;;;;;;;;;:87;;:35;:87;:::i;:::-;18174:8;:117::i;:::-;-1:-1:-1;18309:4:0;17952:369;;;;;:::o;24086:94::-;13688:2;24086:94;:::o;18329:217::-;18446:10;18420:4;18467:23;;;:11;:23;;;;;;;;-1:-1:-1;;;;;18467:32:0;;;;;;;;;;18420:4;;18437:79;;18458:7;;18467:48;;18504:10;18467:48;:36;:48;:::i;24188:100::-;24272:8;;;;;;;;;;;;-1:-1:-1;;;24272:8:0;;;;24188:100;:::o;14878:44::-;;;:::o;16784:294::-;16906:28;:26;:28::i;:::-;16952:9;16947:124;16967:20;;;16947:124;;;17037:9;;17047:1;17037:12;;;;;;;;;;;;;-1:-1:-1;;;;;17037:12:0;-1:-1:-1;;;;;17014:45:0;17023:12;-1:-1:-1;;;;;17014:45:0;-1:-1:-1;;;;;;;;;;;17051:7:0;17014:45;;;;;;;;;;;;;;;;;;16989:3;;16947:124;;;;16784:294;;;;:::o;17251:138::-;17319:7;17346:16;-1:-1:-1;;;;;17346:26:0;;17373:7;17346:35;;;;;;;;;;;;;-1:-1:-1;;;;;17346:35:0;-1:-1:-1;;;;;17346:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17346:35:0;;17251:138;-1:-1:-1;;17251:138:0:o;19938:128::-;-1:-1:-1;;;;;20044:14:0;20001:7;20044:14;;;:7;:14;;;;;;;19938:128::o;23980:98::-;24063:7;;;;;;;;;;;;-1:-1:-1;;;24063:7:0;;;;23980:98;:::o;16418:153::-;16496:32;:30;:32::i;:::-;16539:24;16545:8;16555:7;16539:5;:24::i;:::-;16418:153;;:::o;18554:268::-;18650:4;18667:125;18676:10;18688:7;18697:94;18734:15;18697:94;;;;;;;;;;;;;;;;;18709:10;18697:23;;;;:11;:23;;;;;;;;-1:-1:-1;;;;;18697:32:0;;;;;;;;;;;:94;;:36;:94;:::i;17397:225::-;17477:4;17541:51;17562:10;17574:9;17585:6;17541:20;:51::i;14981:50::-;;;:::o;16579:197::-;16685:31;:29;:31::i;:::-;16727:41;16737:7;16746:12;16760:7;16727:9;:41::i;:::-;16579:197;;;:::o;19165:765::-;19441:3;19429:8;:15;;19421:56;;;;;-1:-1:-1;;;19421:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19488:14;19571:17;:15;:17::i;:::-;-1:-1:-1;;;;;19707:14:0;;;;;;;:7;:14;;;;;;;;:16;;;;;;;;19600:134;;13891:48;19600:134;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19590:145;;;;;;-1:-1:-1;;;19515:221:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19505:232;;;;;;;;;19775:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19505:232;;-1:-1:-1;19707:14:0;;:7;;19775:26;;;;;19707:14;;-1:-1:-1;;19775:26:0;;;;;;;;;;19707:7;19775:26;;;;;;;;;;;;;;;;;;;;;;;19748:53;;19840:5;-1:-1:-1;;;;;19820:25:0;:16;-1:-1:-1;;;;;19820:25:0;;19812:67;;;;;-1:-1:-1;;;19812:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;19890:32;19899:5;19906:7;19915:6;19890:8;:32::i;:::-;19165:765;;;;;;;;;:::o;17630:145::-;-1:-1:-1;;;;;17740:18:0;;;17713:7;17740:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17630:145::o;18871:286::-;18928:7;18970:16;18956:10;:8;:10::i;:::-;:30;18952:198;;;-1:-1:-1;19010:24:0;19003:31;;18952:198;19074:64;14089:66;19108:12;19122:15;19074:21;:64::i;:::-;19067:71;;;;7253:181;7311:7;7343:5;;;7367:6;;;;7359:46;;;;;-1:-1:-1;;;7359:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;7425:1;7253:181;-1:-1:-1;;;7253:181:0:o;21635:328::-;-1:-1:-1;;;;;21728:19:0;;21721:27;;;;-1:-1:-1;;;;;21766:21:0;;21759:29;;;;21803:10;-1:-1:-1;;;;;21803:19:0;;;21799:59;;;21824:16;-1:-1:-1;;;;;21824:32:0;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;21799:59:0;-1:-1:-1;;;;;21871:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;21923:32;;;;;;;;;;;;;;;;;21635:328;;;:::o;21971:247::-;22077:2;-1:-1:-1;;;;;22062:26:0;22071:4;-1:-1:-1;;;;;22062:26:0;-1:-1:-1;;;;;;;;;;;22081:6:0;22062:26;;;;;;;;;;;;;;;;;;22136:64;;;-1:-1:-1;;;;;22136:64:0;;;;;;;;;;;;;;;;;;;;22189:10;22136:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22136:64:0;-1:-1:-1;;;22136:64:0;;;22105:96;;;;22094:6;;22113:16;22105:30;;;;;22136:64;22105:96;;;;22136:64;22105:96;;;;;;;;;;-1:-1:-1;;22105:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22093:108;;;22211:1;22203:10;;;;;;21971:247;;;;:::o;8182:192::-;8268:7;8304:12;8296:6;;;;8288:29;;;;-1:-1:-1;;;8288:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;8340:5:0;;;8182:192::o;23586:247::-;23671:10;-1:-1:-1;;;;;23693:16:0;23671:39;;;:76;;-1:-1:-1;23714:10:0;-1:-1:-1;;;;;23728:19:0;23714:33;;23671:76;23649:176;;;;-1:-1:-1;;;23649:176:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23586:247::o;23058:348::-;23147:10;-1:-1:-1;;;;;23161:25:0;23147:39;;;:89;;-1:-1:-1;23203:10:0;-1:-1:-1;;;;;23217:19:0;23203:33;;23147:89;:140;;;-1:-1:-1;23253:10:0;-1:-1:-1;;;;;23267:20:0;23253:34;;23147:140;23125:273;;;;-1:-1:-1;;;23125:273:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21309:318;-1:-1:-1;;;;;21384:21:0;;21377:29;;;;21448:68;21471:6;21448:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21448:18:0;;;;;;:9;:18;;;;;;;:68;;:22;:68;:::i;:::-;-1:-1:-1;;;;;21427:18:0;;;;;;:9;:18;;;;;:89;;;;21542:12;:24;;21559:6;21542:24;:16;:24;:::i;:::-;21527:12;:39;;;21582:37;;;;;;;;-1:-1:-1;;;;;21582:37:0;;;-1:-1:-1;;;;;;;;;;;21582:37:0;;;;;;;;;21309:318;;:::o;23414:164::-;23488:10;-1:-1:-1;;;;;23502:20:0;23488:34;;23480:90;;;;-1:-1:-1;;;23480:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20632:389;-1:-1:-1;;;;;20729:20:0;;20722:28;;;;-1:-1:-1;;;;;20768:23:0;;20761:31;;;;20825:71;20847:6;20825:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20825:17:0;;;;;;:9;:17;;;;;;;:71;;:21;:71;:::i;:::-;-1:-1:-1;;;;;20805:17:0;;;;;;;:9;:17;;;;;;:91;;;;20930:20;;;;;;;:32;;20955:6;20930:32;:24;:32;:::i;:::-;-1:-1:-1;;;;;20907:20:0;;;;;;;:9;:20;;;;;;;;;:55;;;;20978:35;;;;;;;20907:20;;20978:35;;;;-1:-1:-1;;;;;;;;;;;20978:35:0;;;;;;;;20632:389;;;:::o;20112:132::-;20217:9;;20191:46::o;20256:210::-;20358:7;20406:8;20416:4;20422:7;20431:10;:8;:10::i;:::-;20395:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20451:4;20395:62;;;;;;;;;;;;;;;;;;;;;;;;20385:73;;;;;;20256:210;-1:-1:-1;;;;20256:210:0:o;7709:136::-;7767:7;7794:43;7798:1;7801;7794:43;;;;;;;;;;;;;;;;;:3;:43::i

Swarm Source

ipfs://1d65160b0c7162e6c38f4d5a03a6d7ec1a83a8800e11fffa3a99d45e53aa491f

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.