Contract 0x86ed939B500E121C0C5f493F399084Db596dAd20 1

 
 
Txn Hash
Method
Block
From
To
Value
0x1bfa5f33eed7dfa01e0113b66cc744742d39f11ac60a4ae14c6e17d2195b432dApprove153212902022-08-11 14:44:2213 mins ago0x491336a7d4e49996f5f4c07d51dfc4eb501a541e IN  SpaceChainV2: SPC Token0 Ether0.‍0017330537.‍2652
0xcd82e6b822cc97f0896e97a14fff8dabe6afeabc476ff47f50408426fe81f078Transfer153212862022-08-11 14:42:3415 mins agoBittrex IN  SpaceChainV2: SPC Token0 Ether0.‍0016107731.‍16159776
0x15de8dfd43e5d47865962936ace21fbf8fbd7294c2be1b88670718ff5028edf4Transfer153211572022-08-11 14:08:0049 mins ago0x3cbb6166ac506dbbae6f14a28911561592e722c2 IN  SpaceChainV2: SPC Token0 Ether0.‍00056165 18.‍85317505
0x03112b4b7365226260dbc4b5aea1865dddaee989df6354b5a651e9dc8a0027eeApprove153199222022-08-11 9:32:125 hrs 25 mins ago0xc77f7a0a9c99a6c454832b51fbeca5e3cdd7b9e1 IN  SpaceChainV2: SPC Token0 Ether0.‍00072824 15.‍6590629
0x9dd6e0d71c56364ac56513bc49397a670fd1c0591d910a81a17c535518e78d00Approve153191292022-08-11 6:26:148 hrs 31 mins ago0xd0ce021bceff33ca74c7b26a108fbbef75bc060d IN  SpaceChainV2: SPC Token0 Ether0.‍0009221819.‍82947119
0x34056897f3877f4e9bc644724654f2221a54fdc5638e12c4533543cb7cd4fe40Transfer153191212022-08-11 6:24:018 hrs 33 mins agoBittrex IN  SpaceChainV2: SPC Token0 Ether0.‍0015503730
0x06bc8a84633b928ca0fe5ce8f9223f2592416d2506ed099655936ea1802c1e54Transfer153147352022-08-10 13:56:311 day 1 hr ago0xe54a7280d7ecb310a846af470da701df152c3595 IN  SpaceChainV2: SPC Token0 Ether0.‍00140798 30.‍01914506
0xaaafe3971907b47cc00557bbe3a7d3d61b47be77dd92e28cee205c23559afce1Approve153146472022-08-10 13:38:481 day 1 hr ago0x2404abd75bc23dc46ddcd2b28f8bc316e57b3359 IN  SpaceChainV2: SPC Token0 Ether0.‍0017672238
0x7aef5542b734b0c8943c6beec740d424a67c7da4651c998f62a3cd18c402f6f8Transfer153146302022-08-10 13:35:341 day 1 hr agoBittrex IN  SpaceChainV2: SPC Token0 Ether0.‍0030295758.‍62294398
0xf35458ba9d24745a17e8f37f14306eefb5f664ebfb04081bf970251945808f30Transfer153145772022-08-10 13:22:541 day 1 hr ago0xbb649f69eb9b29a5c7fc3cc4a51f72bbef3a243c IN  SpaceChainV2: SPC Token0 Ether0.‍00093895 31.‍50540262
0xeeb850fa4230255d1a46101e90ed5a28839686d4afaf176d02f5b164a7be2b2aApprove153144692022-08-10 12:59:401 day 1 hr ago0x491336a7d4e49996f5f4c07d51dfc4eb501a541e IN  SpaceChainV2: SPC Token0 Ether0.‍002325350
0xb8c7ce236469f3d7e9cbae6ae300d22d13b582848b1658d71434d059344ab6adTransfer153144632022-08-10 12:58:421 day 1 hr agoBittrex IN  SpaceChainV2: SPC Token0 Ether0.‍0033820965.‍42912775
0x92716c9d3b1f099bf59933147ea34a6341c52d6a2d8a54f7361445425a88df80Transfer153143572022-08-10 12:35:231 day 2 hrs ago0xbb649f69eb9b29a5c7fc3cc4a51f72bbef3a243c IN  SpaceChainV2: SPC Token0 Ether0.‍00143374 48.‍10746475
0x77a893eb86ec86c5aed215d2b7d4dd77db35eab03137526821ccbc5cba640285Transfer153137742022-08-10 10:19:321 day 4 hrs ago0x31a1e6aa487b15c3680adb58affeddf3ba09d99e IN  SpaceChainV2: SPC Token0 Ether0.‍00078203 16.‍67344464
0xe30473fea2da8818228364626d771126e0f3b866f5cf5e14b7f4f39e73f4db1cTransfer153112622022-08-10 0:41:011 day 14 hrs ago0xbb649f69eb9b29a5c7fc3cc4a51f72bbef3a243c IN  SpaceChainV2: SPC Token0 Ether0.‍00033188 7.‍08143872
0x1f0c064217d2f94ba2e14674f3363f0679b74e39185ffce89220a66fedcd052fTransfer153036552022-08-08 20:15:252 days 18 hrs ago0xfb48ceebce3700278947ef44349f94cf66c5f2c9 IN  SpaceChainV2: SPC Token0 Ether0.‍00074353 24.‍94837657
0xafb06946f9c4985104c59212e4ce33c6a061dfce14909059a65f071d8fa6a48eApprove153023562022-08-08 15:29:472 days 23 hrs ago0x4741783ed607d1496f65749d2d9c94cf6c23352a IN  SpaceChainV2: SPC Token0 Ether0.‍00136604 29.‍37348438
0xf39f29d41157ff9431f7ddff36158b79b0de72c8591c90d25f8628ed8e2c3afaTransfer153021262022-08-08 14:34:423 days 23 mins ago0x9b668517ab0174931dc81082f10301d77004ca87 IN  SpaceChainV2: SPC Token0 Ether0.‍0008911519
0x4f36b72b9bacc4d81c6961aa6b46fe89444c1bf3c883bd32ea42d59a4f696672Approve153008202022-08-08 9:45:393 days 5 hrs ago0x263a13fbe5416661d8ff67c5d98624d1553900ae IN  SpaceChainV2: SPC Token0 Ether0.‍00052004 11.‍18225166
0xf4980884896bb6edee9c64ddc83ad01989f9a3e4adecfe162b3f3bdba4cde640Approve152996692022-08-08 5:14:413 days 9 hrs ago0xf720ec326eb688e156188284108b3e16d8f60f0c IN  SpaceChainV2: SPC Token0 Ether0.‍0003964 8.‍52370501
0xddb60b3c0e5ff223e2957231aa2f50c8803bf9b00ce8998a6774d17e265f20d1Approve152989552022-08-08 2:28:283 days 12 hrs ago0x0f01761d7c3f73c13022c25cbd3b2963f115b777 IN  SpaceChainV2: SPC Token0 Ether0.‍00042644 9.‍16962068
0xb06da40592e70d5a85e13fc86dbd713a9dfefc71efb500b6a6806a27d18dca4dTransfer152984152022-08-08 0:25:223 days 14 hrs ago0x7b4e60b5af13d36b2425b6dcbcd27b7cb6d656bd IN  SpaceChainV2: SPC Token0 Ether0.‍00059229 12.‍62493001
0xaf712e88541140801000df4245da4a31866818ff5bf5d1748be5df74f187d735Transfer152948262022-08-07 11:14:124 days 3 hrs agoBittrex IN  SpaceChainV2: SPC Token0 Ether0.‍0010373730
0x404f70f4631f40a58b162064c19d7abfdfb2afe1875e1852991a688c6eb9e345Approve152907702022-08-06 20:01:454 days 18 hrs ago0x24320aeb8dcb248a10cb86cde1254cd6cbce5d74 IN  SpaceChainV2: SPC Token0 Ether0.‍00024892 5.‍35243964
0x391e506e0553d8ea7785e063c50ed69bd70a5f9ef45c478451bbe87ccd460bc5Transfer152906702022-08-06 19:42:534 days 19 hrs ago0x22350910c40735c0abd6f6f81616cb541d199591 IN  SpaceChainV2: SPC Token0 Ether0.‍00024394 8.‍1917163
[ Download CSV Export 

OVERVIEW

The enhanced version (v2) will grant holders access to collateral and lending pools in decentralized exchanges, unlocking liquidity, and growth opportunities in a fully peer-to-peer environment.

Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x1ea0d5ca01a8840d8f07cbd56de1c7e4b03ccf91a5acb47ac48db43211648c7f150822652022-07-05 11:39:5337 days 3 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x2a41e87ee7d81bd396b0eb045384c00a22cfd54365f63a1006d52ebfbcdab861146910272022-05-01 8:55:29102 days 6 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xe3b4943255079c74604260c8dc19c263f3443ab41359d2cf40a31cfa88c07c1d145210232022-04-04 18:02:38128 days 20 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x87afed25710abe28a421e7038784fa36148709888a5d773dded7de41c7a6fbb8143699842022-03-12 5:06:35152 days 9 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x87f9e521f3ecd7cd22853fb606dc640f676679effabf8e5bf657197b9975dba5142856952022-02-27 2:59:50165 days 11 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xdd64ed0b28f6d509485540c3ddcbaf1708928e62fa82fc072771aad3ef5cdd46139707002022-01-09 10:05:17214 days 4 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x9171b68e4382d47a86fad786ab1bd0d6f430b861d5852820996afd2039675ce4134452792021-10-19 1:35:20296 days 13 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xe946f3d7a8fa9fbf616e67622796e34e96f5af97d99a5d397ec71138870e2f8f132817042021-09-23 11:22:30322 days 3 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xfcc1dd9f7e187ad5477c1f616bfbf09b19bffe142d554bbf47cc128522d920da130732642021-08-22 5:36:34354 days 9 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x477706959f15e495447d4adf6759c8daed3a74a6194bfaf13beba97dbe98c537130568592021-08-19 16:40:37356 days 22 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xe0eca64a3d54be1640543bbd0741b79542557805238dc519141b83569c29bb5d129775912021-08-07 11:18:19369 days 3 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x5f5d95984cbac9f2743259de28c7ed043ea1e83b22448d1f9db9712a75a33497129493992021-08-03 1:17:39373 days 13 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x2af120806289ef5b5316de12bec6425c3f7280503217e52b1de54bc4f482ee71129059372021-07-27 4:06:43380 days 10 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x2f9a2a3129cd8e539c831337d2b932d9f02e77b81a610a1d3c3cb52dd80442be128966872021-07-25 17:18:38381 days 21 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xe13a8ee49cedf2e8231128d21bc834c74169282c58f8ec8bed02c83bf9969d1d128963512021-07-25 15:58:41381 days 22 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xc896da05120954eeb7e009338cb7335c404197e9025fc1b63e397f61b65caac0128786542021-07-22 21:39:41384 days 17 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x1f5586b0aa69ea07a460797604e056b910df97e72b5fa48029b52bf91f8140ea128703052021-07-21 14:24:20386 days 33 mins ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x34eb1372b7ed214db09eaf78afc8de72dfc77b95580e130e623799d3a5b42ba9127872022021-07-08 14:24:25399 days 33 mins ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xa7def0ef6c997bedb97ee7b54b7508f59dd8dacb44e858ba1ec5f4ac0d9859b4127433332021-07-01 18:14:42405 days 20 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x795a3a03d2a9d684a183da42a2ebe68df6f046c2a5825a9c91a4bd5fa25fc94a127393642021-07-01 3:18:46406 days 11 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x2ac12ea44d87e896420861da6d9925a2802d40f6da0d1557a6657d4a5c89c259127367802021-06-30 17:44:23406 days 21 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xc78119dd335a248a96c566ed6345db62254646e130f1fbc99e3f8df4695796df127028802021-06-25 11:01:54412 days 3 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x175a6f412cb7ba34e4c04549b2a9779fe68d82ea372b039ae936cdfca4c80a26126714992021-06-20 13:32:12417 days 1 hr ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0xefd57d31dc0dcbc5c795946cb10feb6a1bccb82913a464fecb5f28fcc47e0f1f126527152021-06-17 15:23:59419 days 23 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
0x393c122dc435b46cc6cf7777e6ebd2a0eb94e958eb1231e90eaf04b654145284126443932021-06-16 8:25:21421 days 6 hrs ago SpaceChainV2: SPC Token  Contract Creation0 Ether
[ Download CSV Export 
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SpaceChain

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2020-09-19
*/

// File: @openzeppelin/contracts/GSN/Context.sol
// SPDX-License-Identifier: MIT


pragma solidity ^0.6.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol



pragma solidity ^0.6.0;

/**
 * @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);

    /**
     * @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);

    /**
     * @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);
}

// File: @openzeppelin/contracts/math/SafeMath.sol



pragma solidity ^0.6.0;

/**
 * @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.
     */
    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.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        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.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        require(b != 0, errorMessage);
        return a % b;
    }
}

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.6.2;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // According to EIP-1052, 0x0 is the value returned for not-yet created accounts
        // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned
        // for accounts without code, i.e. `keccak256('')`
        bytes32 codehash;
        bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470;
        // solhint-disable-next-line no-inline-assembly
        assembly { codehash := extcodehash(account) }
        return (codehash != accountHash && codehash != 0x0);
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain`call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
      return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        return _functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        return _functionCallWithValue(target, data, value, errorMessage);
    }

    function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) {
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: weiValue }(data);
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol



pragma solidity ^0.6.0;





/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin guidelines: functions revert instead
 * of returning `false` on failure. This behavior is nonetheless conventional
 * and does not conflict with the expectations of ERC20 applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20 {
    using SafeMath for uint256;
    using Address for address;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowances;

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;
    uint8 private _decimals;

    /**
     * @dev Sets the values for {name} and {symbol}, initializes {decimals} with
     * a default value of 18.
     *
     * To select a different value for {decimals}, use {_setupDecimals}.
     *
     * All three of these values are immutable: they can only be set once during
     * construction.
     */
    constructor (string memory name, string memory symbol) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
    }

    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei. This is the value {ERC20} uses, unless {_setupDecimals} is
     * called.
     *
     * NOTE: This information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * {IERC20-balanceOf} and {IERC20-transfer}.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view override returns (uint256) {
        return _balances[account];
    }

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, amount);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20};
     *
     * Requirements:
     * - `sender` and `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     * - the caller must have allowance for ``sender``'s tokens of at least
     * `amount`.
     */
    function transferFrom(address sender, address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(sender, recipient, amount);
        _approve(sender, _msgSender(), _allowances[sender][_msgSender()].sub(amount, "ERC20: transfer amount exceeds allowance"));
        return true;
    }

    /**
     * @dev Atomically increases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].add(addedValue));
        return true;
    }

    /**
     * @dev Atomically decreases the allowance granted to `spender` by the caller.
     *
     * This is an alternative to {approve} that can be used as a mitigation for
     * problems described in {IERC20-approve}.
     *
     * Emits an {Approval} event indicating the updated allowance.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `spender` must have allowance for the caller of at least
     * `subtractedValue`.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][spender].sub(subtractedValue, "ERC20: decreased allowance below zero"));
        return true;
    }

    /**
     * @dev Moves tokens `amount` from `sender` to `recipient`.
     *
     * This is internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `sender` cannot be the zero address.
     * - `recipient` cannot be the zero address.
     * - `sender` must have a balance of at least `amount`.
     */
    function _transfer(address sender, address recipient, uint256 amount) internal virtual {
        require(sender != address(0), "ERC20: transfer from the zero address");
        require(recipient != address(0), "ERC20: transfer to the zero address");

        _beforeTokenTransfer(sender, recipient, amount);

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

    /** @dev Creates `amount` tokens and assigns them to `account`, increasing
     * the total supply.
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * Requirements
     *
     * - `to` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

        _beforeTokenTransfer(address(0), account, amount);

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

    /**
     * @dev Destroys `amount` tokens from `account`, reducing the
     * total supply.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * Requirements
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens.
     */
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");

        _beforeTokenTransfer(account, address(0), amount);

        _balances[account] = _balances[account].sub(amount, "ERC20: burn amount exceeds balance");
        _totalSupply = _totalSupply.sub(amount);
        emit Transfer(account, address(0), amount);
    }

    /**
     * @dev Sets `amount` as the allowance of `spender` over the `owner`s tokens.
     *
     * This is internal function is equivalent to `approve`, and can be used to
     * e.g. set automatic allowances for certain subsystems, etc.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `owner` cannot be the zero address.
     * - `spender` cannot be the zero address.
     */
    function _approve(address owner, address spender, uint256 amount) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve to the zero address");

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

    /**
     * @dev Sets {decimals} to a value other than the default one of 18.
     *
     * WARNING: This function should only be called from the constructor. Most
     * applications that interact with token contracts will not expect
     * {decimals} to ever change, and may work incorrectly if it does.
     */
    function _setupDecimals(uint8 decimals_) internal {
        _decimals = decimals_;
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be to transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 amount) internal virtual { }
}

// File: @openzeppelin/contracts/token/ERC20/ERC20Burnable.sol



pragma solidity ^0.6.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        uint256 decreasedAllowance = allowance(account, _msgSender()).sub(amount, "ERC20: burn amount exceeds allowance");

        _approve(account, _msgSender(), decreasedAllowance);
        _burn(account, amount);
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.6.0;

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(_owner == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/TokenUpgrader.sol

pragma solidity ^0.6.6;

contract TokenUpgrader is Ownable {
    ERC20Burnable public token = ERC20Burnable(0x8069080a922834460C3A092FB2c1510224dc066b);
    address public tokenHolder;

    constructor(address _tokenHolder) public {
        tokenHolder = _tokenHolder;
    }

    function burn(uint256 _amount) public onlyOwner {
        // burn token from contract's balance
        token.burn(_amount);
    }

    function withdraw(uint256 _amount) public {
        require(_msgSender() == tokenHolder);
        token.transfer(_msgSender(), _amount);
    }
}

// File: contracts/SpaceChain.sol




pragma solidity ^0.6.6;

contract SpaceChain is ERC20Burnable {
    mapping(address => TokenUpgrader) public tokenUpgrader;

    constructor() public ERC20("SpaceChainV2", "SPC") {}

    function migrateV1tokens() public {
        require(
            address(tokenUpgrader[_msgSender()]) != address(0x0),
            "Upgrader contract not created"
        );
        TokenUpgrader upgrader = tokenUpgrader[_msgSender()];
        IERC20 tokenv1 = IERC20(0x8069080a922834460C3A092FB2c1510224dc066b);
        uint256 amount = tokenv1.balanceOf(address(upgrader));
        upgrader.burn(amount);
        _mint(_msgSender(), amount);
    }

    function createUpgrader() public {
        require(
            address(tokenUpgrader[_msgSender()]) == address(0x0),
            "Already created upgrader contract"
        );
        tokenUpgrader[_msgSender()] = new TokenUpgrader(_msgSender());
    }
}

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":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":[{"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":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"createUpgrader","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":[{"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":"migrateV1tokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenUpgrader","outputs":[{"internalType":"contract TokenUpgrader","name":"","type":"address"}],"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"}]

608060405234801561001057600080fd5b506040518060400160405280600c81526020016b29b830b1b2a1b430b4b72b1960a11b8152506040518060400160405280600381526020016253504360e81b8152508160039080519060200190610068929190610091565b50805161007c906004906020840190610091565b50506005805460ff1916601217905550610124565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106100d257805160ff19168380011785556100ff565b828001600101855582156100ff579182015b828111156100ff5782518255916020019190600101906100e4565b5061010b92915061010f565b5090565b5b8082111561010b5760008155600101610110565b61169180620001346000396000f3fe608060405234801561001057600080fd5b50600436106101005760003560e01c80636aae118211610097578063a457c2d711610066578063a457c2d7146102e5578063a9059cbb14610311578063ba9363f71461033d578063dd62ed3e1461037f57610100565b80636aae11821461028357806370a082311461028b57806379cc6790146102b157806395d89b41146102dd57610100565b8063313ce567116100d3578063313ce5671461021257806339509351146102305780633eadbf7e1461025c57806342966c681461026657610100565b806306fdde0314610105578063095ea7b31461018257806318160ddd146101c257806323b872dd146101dc575b600080fd5b61010d6103ad565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561014757818101518382015260200161012f565b50505050905090810190601f1680156101745780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6101ae6004803603604081101561019857600080fd5b506001600160a01b038135169060200135610443565b604080519115158252519081900360200190f35b6101ca610460565b60408051918252519081900360200190f35b6101ae600480360360608110156101f257600080fd5b506001600160a01b03813581169160208101359091169060400135610466565b61021a6104ed565b6040805160ff9092168252519081900360200190f35b6101ae6004803603604081101561024657600080fd5b506001600160a01b0381351690602001356104f6565b610264610544565b005b6102646004803603602081101561027c57600080fd5b50356106ec565b610264610700565b6101ca600480360360208110156102a157600080fd5b50356001600160a01b03166107e7565b610264600480360360408110156102c757600080fd5b506001600160a01b038135169060200135610802565b61010d610857565b6101ae600480360360408110156102fb57600080fd5b506001600160a01b0381351690602001356108b8565b6101ae6004803603604081101561032757600080fd5b506001600160a01b038135169060200135610920565b6103636004803603602081101561035357600080fd5b50356001600160a01b0316610934565b604080516001600160a01b039092168252519081900360200190f35b6101ca6004803603604081101561039557600080fd5b506001600160a01b038135811691602001351661094f565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104395780601f1061040e57610100808354040283529160200191610439565b820191906000526020600020905b81548152906001019060200180831161041c57829003601f168201915b5050505050905090565b600061045761045061097a565b848461097e565b50600192915050565b60025490565b6000610473848484610a6a565b6104e38461047f61097a565b6104de85604051806060016040528060288152602001611560602891396001600160a01b038a166000908152600160205260408120906104bd61097a565b6001600160a01b031681526020810191909152604001600020549190610bc5565b61097e565b5060019392505050565b60055460ff1690565b600061045761050361097a565b846104de856001600061051461097a565b6001600160a01b03908116825260208083019390935260409182016000908120918c168152925290205490610c5c565b600060068161055161097a565b6001600160a01b0390811682526020820192909252604001600020541614156105c1576040805162461bcd60e51b815260206004820152601d60248201527f557067726164657220636f6e7472616374206e6f742063726561746564000000604482015290519081900360640190fd5b6000600660006105cf61097a565b6001600160a01b039081168252602080830193909352604091820160009081205483516370a0823160e01b81529216600483018190529251929450738069080a922834460c3a092fb2c1510224dc066b93909284926370a08231926024808301939192829003018186803b15801561064657600080fd5b505afa15801561065a573d6000803e3d6000fd5b505050506040513d602081101561067057600080fd5b505160408051630852cd8d60e31b81526004810183905290519192506001600160a01b038516916342966c689160248082019260009290919082900301818387803b1580156106be57600080fd5b505af11580156106d2573d6000803e3d6000fd5b505050506106e76106e161097a565b82610cbd565b505050565b6106fd6106f761097a565b82610dad565b50565b600060068161070d61097a565b6001600160a01b03908116825260208201929092526040016000205416146107665760405162461bcd60e51b81526004018080602001828103825260218152602001806116166021913960400191505060405180910390fd5b61076e61097a565b60405161077a90610eeb565b6001600160a01b03909116815260405190819003602001906000f0801580156107a7573d6000803e3d6000fd5b50600660006107b461097a565b6001600160a01b039081168252602082019290925260400160002080546001600160a01b03191692909116919091179055565b6001600160a01b031660009081526020819052604090205490565b600061083982604051806060016040528060248152602001611588602491396108328661082d61097a565b61094f565b9190610bc5565b905061084d8361084761097a565b8361097e565b6106e78383610dad565b60048054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156104395780601f1061040e57610100808354040283529160200191610439565b60006104576108c561097a565b846104de8560405180606001604052806025815260200161163760259139600160006108ef61097a565b6001600160a01b03908116825260208083019390935260409182016000908120918d16815292529020549190610bc5565b600061045761092d61097a565b8484610a6a565b6006602052600090815260409020546001600160a01b031681565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b3390565b6001600160a01b0383166109c35760405162461bcd60e51b81526004018080602001828103825260248152602001806115f26024913960400191505060405180910390fd5b6001600160a01b038216610a085760405162461bcd60e51b81526004018080602001828103825260228152602001806115186022913960400191505060405180910390fd5b6001600160a01b03808416600081815260016020908152604080832094871680845294825291829020859055815185815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a3505050565b6001600160a01b038316610aaf5760405162461bcd60e51b81526004018080602001828103825260258152602001806115cd6025913960400191505060405180910390fd5b6001600160a01b038216610af45760405162461bcd60e51b81526004018080602001828103825260238152602001806114d36023913960400191505060405180910390fd5b610aff8383836106e7565b610b3c8160405180606001604052806026815260200161153a602691396001600160a01b0386166000908152602081905260409020549190610bc5565b6001600160a01b038085166000908152602081905260408082209390935590841681522054610b6b9082610c5c565b6001600160a01b038084166000818152602081815260409182902094909455805185815290519193928716927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef92918290030190a3505050565b60008184841115610c545760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015610c19578181015183820152602001610c01565b50505050905090810190601f168015610c465780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600082820183811015610cb6576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b6001600160a01b038216610d18576040805162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015290519081900360640190fd5b610d24600083836106e7565b600254610d319082610c5c565b6002556001600160a01b038216600090815260208190526040902054610d579082610c5c565b6001600160a01b0383166000818152602081815260408083209490945583518581529351929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a35050565b6001600160a01b038216610df25760405162461bcd60e51b81526004018080602001828103825260218152602001806115ac6021913960400191505060405180910390fd5b610dfe826000836106e7565b610e3b816040518060600160405280602281526020016114f6602291396001600160a01b0385166000908152602081905260409020549190610bc5565b6001600160a01b038316600090815260208190526040902055600254610e619082610ea9565b6002556040805182815290516000916001600160a01b038516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050565b6000610cb683836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610bc5565b6105da80610ef98339019056fe6080604052600180546001600160a01b031916738069080a922834460c3a092fb2c1510224dc066b17905534801561003657600080fd5b506040516105da3803806105da8339818101604052602081101561005957600080fd5b505160006100656100d4565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600280546001600160a01b0319166001600160a01b03929092169190911790556100d8565b3390565b6104f3806100e76000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063715018a61161005b578063715018a6146100e25780638da5cb5b146100ea578063f2fde38b146100f2578063fc0c546a146101185761007d565b80632e1a7d4d14610082578063420a83e7146100a157806342966c68146100c5575b600080fd5b61009f6004803603602081101561009857600080fd5b5035610120565b005b6100a96101d6565b604080516001600160a01b039092168252519081900360200190f35b61009f600480360360208110156100db57600080fd5b50356101e5565b61009f6102b7565b6100a961036b565b61009f6004803603602081101561010857600080fd5b50356001600160a01b031661037a565b6100a9610484565b6002546001600160a01b0316610134610493565b6001600160a01b03161461014757600080fd5b6001546001600160a01b031663a9059cbb610160610493565b836040518363ffffffff1660e01b815260040180836001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156101a757600080fd5b505af11580156101bb573d6000803e3d6000fd5b505050506040513d60208110156101d157600080fd5b505050565b6002546001600160a01b031681565b6101ed610493565b6000546001600160a01b0390811691161461024f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60015460408051630852cd8d60e31b81526004810184905290516001600160a01b03909216916342966c689160248082019260009290919082900301818387803b15801561029c57600080fd5b505af11580156102b0573d6000803e3d6000fd5b5050505050565b6102bf610493565b6000546001600160a01b03908116911614610321576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031690565b610382610493565b6000546001600160a01b039081169116146103e4576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166104295760405162461bcd60e51b81526004018080602001828103825260268152602001806104986026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001546001600160a01b031681565b339056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373a2646970667358221220a06398f7c82ba555924dc1a231f5f5658856ccfffd91a206c9e4b7b663f4e1e364736f6c634300060c003345524332303a207472616e7366657220746f20746865207a65726f206164647265737345524332303a206275726e20616d6f756e7420657863656564732062616c616e636545524332303a20617070726f766520746f20746865207a65726f206164647265737345524332303a207472616e7366657220616d6f756e7420657863656564732062616c616e636545524332303a207472616e7366657220616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e20616d6f756e74206578636565647320616c6c6f77616e636545524332303a206275726e2066726f6d20746865207a65726f206164647265737345524332303a207472616e736665722066726f6d20746865207a65726f206164647265737345524332303a20617070726f76652066726f6d20746865207a65726f2061646472657373416c7265616479206372656174656420757067726164657220636f6e747261637445524332303a2064656372656173656420616c6c6f77616e63652062656c6f77207a65726fa2646970667358221220ba00bf8333f9460de9340f2687c5e7bbd266f6f14a4d2ebb170c7a5a645ed0a964736f6c634300060c0033

Deployed ByteCode Sourcemap

30625:896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17633:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19739:169;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19739:169:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18708:100;;;:::i;:::-;;;;;;;;;;;;;;;;20382:321;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;20382:321:0;;;;;;;;;;;;;;;;;:::i;18560:83::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;;21112:218;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21112:218:0;;;;;;;;:::i;30792:459::-;;;:::i;:::-;;26930:91;;;;;;;;;;;;;;;;-1:-1:-1;26930:91:0;;:::i;31259:259::-;;;:::i;18871:119::-;;;;;;;;;;;;;;;;-1:-1:-1;18871:119:0;-1:-1:-1;;;;;18871:119:0;;:::i;27340:295::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27340:295:0;;;;;;;;:::i;17835:87::-;;;:::i;21833:269::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;21833:269:0;;;;;;;;:::i;19203:175::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19203:175:0;;;;;;;;:::i;30669:54::-;;;;;;;;;;;;;;;;-1:-1:-1;30669:54:0;-1:-1:-1;;;;;30669:54:0;;:::i;:::-;;;;-1:-1:-1;;;;;30669:54:0;;;;;;;;;;;;;;19441:151;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;19441:151:0;;;;;;;;;;:::i;17633:83::-;17703:5;17696:12;;;;;;;;-1:-1:-1;;17696:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17670:13;;17696:12;;17703:5;;17696:12;;17703:5;17696:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17633:83;:::o;19739:169::-;19822:4;19839:39;19848:12;:10;:12::i;:::-;19862:7;19871:6;19839:8;:39::i;:::-;-1:-1:-1;19896:4:0;19739:169;;;;:::o;18708:100::-;18788:12;;18708:100;:::o;20382:321::-;20488:4;20505:36;20515:6;20523:9;20534:6;20505:9;:36::i;:::-;20552:121;20561:6;20569:12;:10;:12::i;:::-;20583:89;20621:6;20583:89;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;20583:19:0;;;;;;:11;:19;;;;;;20603:12;:10;:12::i;:::-;-1:-1:-1;;;;;20583:33:0;;;;;;;;;;;;-1:-1:-1;20583:33:0;;;:89;:37;:89::i;:::-;20552:8;:121::i;:::-;-1:-1:-1;20691:4:0;20382:321;;;;;:::o;18560:83::-;18626:9;;;;18560:83;:::o;21112:218::-;21200:4;21217:83;21226:12;:10;:12::i;:::-;21240:7;21249:50;21288:10;21249:11;:25;21261:12;:10;:12::i;:::-;-1:-1:-1;;;;;21249:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21249:25:0;;;:34;;;;;;;;;;;:38;:50::i;30792:459::-;30907:3;30867:13;30907:3;30881:12;:10;:12::i;:::-;-1:-1:-1;;;;;30867:27:0;;;;;;;;;;;;;;-1:-1:-1;30867:27:0;;;30859:52;;30837:131;;;;;-1:-1:-1;;;30837:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;30979:22;31004:13;:27;31018:12;:10;:12::i;:::-;-1:-1:-1;;;;;31004:27:0;;;;;;;;;;;;;;;;;-1:-1:-1;31004:27:0;;;;31137:36;;-1:-1:-1;;;31137:36:0;;31004:27;;31137:36;;;;;;;;31004:27;;-1:-1:-1;31066:42:0;;-1:-1:-1;;31066:42:0;;31137:17;;:36;;;;;31004:27;;31137:36;;;;;31066:42;31137:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31137:36:0;31184:21;;;-1:-1:-1;;;31184:21:0;;;;;;;;;;31137:36;;-1:-1:-1;;;;;;31184:13:0;;;;;:21;;;;;-1:-1:-1;;31184:21:0;;;;;;;;-1:-1:-1;31184:13:0;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31216:27;31222:12;:10;:12::i;:::-;31236:6;31216:5;:27::i;:::-;30792:459;;;:::o;26930:91::-;26986:27;26992:12;:10;:12::i;:::-;27006:6;26986:5;:27::i;:::-;26930:91;:::o;31259:259::-;31373:3;31333:13;31373:3;31347:12;:10;:12::i;:::-;-1:-1:-1;;;;;31333:27:0;;;;;;;;;;;;;;-1:-1:-1;31333:27:0;;;31325:52;31303:135;;;;-1:-1:-1;;;31303:135:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31497:12;:10;:12::i;:::-;31479:31;;;;;:::i;:::-;-1:-1:-1;;;;;31479:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31449:13;:27;31463:12;:10;:12::i;:::-;-1:-1:-1;;;;;31449:27:0;;;;;;;;;;;;;;-1:-1:-1;31449:27:0;:61;;-1:-1:-1;;;;;;31449:61:0;;;;;;;;;;;31259:259::o;18871:119::-;-1:-1:-1;;;;;18964:18:0;18937:7;18964:18;;;;;;;;;;;;18871:119::o;27340:295::-;27417:26;27446:84;27483:6;27446:84;;;;;;;;;;;;;;;;;:32;27456:7;27465:12;:10;:12::i;:::-;27446:9;:32::i;:::-;:36;:84;:36;:84::i;:::-;27417:113;;27543:51;27552:7;27561:12;:10;:12::i;:::-;27575:18;27543:8;:51::i;:::-;27605:22;27611:7;27620:6;27605:5;:22::i;17835:87::-;17907:7;17900:14;;;;;;;;-1:-1:-1;;17900:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17874:13;;17900:14;;17907:7;;17900:14;;17907:7;17900:14;;;;;;;;;;;;;;;;;;;;;;;;21833:269;21926:4;21943:129;21952:12;:10;:12::i;:::-;21966:7;21975:96;22014:15;21975:96;;;;;;;;;;;;;;;;;:11;:25;21987:12;:10;:12::i;:::-;-1:-1:-1;;;;;21975:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;21975:25:0;;;:34;;;;;;;;;;;:96;:38;:96::i;19203:175::-;19289:4;19306:42;19316:12;:10;:12::i;:::-;19330:9;19341:6;19306:9;:42::i;30669:54::-;;;;;;;;;;;;-1:-1:-1;;;;;30669:54:0;;:::o;19441:151::-;-1:-1:-1;;;;;19557:18:0;;;19530:7;19557:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;19441:151::o;657:106::-;745:10;657:106;:::o;24980:346::-;-1:-1:-1;;;;;25082:19:0;;25074:68;;;;-1:-1:-1;;;25074:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25161:21:0;;25153:68;;;;-1:-1:-1;;;25153:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;25234:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;25286:32;;;;;;;;;;;;;;;;;24980:346;;;:::o;22592:539::-;-1:-1:-1;;;;;22698:20:0;;22690:70;;;;-1:-1:-1;;;22690:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22779:23:0;;22771:71;;;;-1:-1:-1;;;22771:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22855:47;22876:6;22884:9;22895:6;22855:20;:47::i;:::-;22935:71;22957:6;22935:71;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;22935:17:0;;:9;:17;;;;;;;;;;;;:71;:21;:71::i;:::-;-1:-1:-1;;;;;22915:17:0;;;:9;:17;;;;;;;;;;;:91;;;;23040:20;;;;;;;:32;;23065:6;23040:24;:32::i;:::-;-1:-1:-1;;;;;23017:20:0;;;:9;:20;;;;;;;;;;;;:55;;;;23088:35;;;;;;;23017:20;;23088:35;;;;;;;;;;;;;22592:539;;;:::o;5642:192::-;5728:7;5764:12;5756:6;;;;5748:29;;;;-1:-1:-1;;;5748:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5800:5:0;;;5642:192::o;4739:181::-;4797:7;4829:5;;;4853:6;;;;4845:46;;;;;-1:-1:-1;;;4845:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4911:1;4739:181;-1:-1:-1;;;4739:181:0:o;23412:378::-;-1:-1:-1;;;;;23496:21:0;;23488:65;;;;;-1:-1:-1;;;23488:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23566:49;23595:1;23599:7;23608:6;23566:20;:49::i;:::-;23643:12;;:24;;23660:6;23643:16;:24::i;:::-;23628:12;:39;-1:-1:-1;;;;;23699:18:0;;:9;:18;;;;;;;;;;;:30;;23722:6;23699:22;:30::i;:::-;-1:-1:-1;;;;;23678:18:0;;:9;:18;;;;;;;;;;;:51;;;;23745:37;;;;;;;23678:18;;:9;;23745:37;;;;;;;;;;23412:378;;:::o;24122:418::-;-1:-1:-1;;;;;24206:21:0;;24198:67;;;;-1:-1:-1;;;24198:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24278:49;24299:7;24316:1;24320:6;24278:20;:49::i;:::-;24361:68;24384:6;24361:68;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24361:18:0;;:9;:18;;;;;;;;;;;;:68;:22;:68::i;:::-;-1:-1:-1;;;;;24340:18:0;;:9;:18;;;;;;;;;;:89;24455:12;;:24;;24472:6;24455:16;:24::i;:::-;24440:12;:39;24495:37;;;;;;;;24521:1;;-1:-1:-1;;;;;24495:37:0;;;;;;;;;;;;24122:418;;:::o;5203:136::-;5261:7;5288:43;5292:1;5295;5288:43;;;;;;;;;;;;;;;;;:3;:43::i;-1:-1:-1:-;;;;;;;;:::o

Swarm Source

ipfs://ba00bf8333f9460de9340f2687c5e7bbd266f6f14a4d2ebb170c7a5a645ed0a9
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.