ETH Price: $2,453.24 (+2.27%)

Token

Bird+ (BIRD+)
 

Overview

Max Total Supply

10,000,000 BIRD+

Holders

19

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BirdPlus

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 2021-03-08
*/

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @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) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

    /**
     * @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");
        require(isContract(target), "Address: call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.3._
     */
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
        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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol

pragma solidity >=0.6.0 <0.8.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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol

pragma solidity >=0.6.0 <0.8.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: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/SafeERC20.sol

pragma solidity >=0.6.0 <0.8.0;




/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;
    using Address for address;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        // solhint-disable-next-line max-line-length
        require((value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero");
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) { // Return data is optional
            // solhint-disable-next-line max-line-length
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/TokenTimelock.sol

pragma solidity >=0.6.0 <0.8.0;


/**
 * @dev A token holder contract that will allow a beneficiary to extract the
 * tokens after a given release time.
 *
 * Useful for simple vesting schedules like "advisors get all of their tokens
 * after 1 year".
 */
contract TokenTimelock {
    using SafeERC20 for IERC20;

    // ERC20 basic token contract being held
    IERC20 private _token;

    // beneficiary of tokens after they are released
    address private _beneficiary;

    // timestamp when token release is enabled
    uint256 private _releaseTime;

    constructor (IERC20 token_, address beneficiary_, uint256 releaseTime_) public {
        // solhint-disable-next-line not-rely-on-time
        require(releaseTime_ > block.timestamp, "TokenTimelock: release time is before current time");
        _token = token_;
        _beneficiary = beneficiary_;
        _releaseTime = releaseTime_;
    }

    /**
     * @return the token being held.
     */
    function token() public view returns (IERC20) {
        return _token;
    }

    /**
     * @return the beneficiary of the tokens.
     */
    function beneficiary() public view returns (address) {
        return _beneficiary;
    }

    /**
     * @return the time when the tokens are released.
     */
    function releaseTime() public view returns (uint256) {
        return _releaseTime;
    }

    /**
     * @notice Transfers tokens held by timelock to beneficiary.
     */
    function release() public virtual {
        // solhint-disable-next-line not-rely-on-time
        require(block.timestamp >= _releaseTime, "TokenTimelock: current time is before release time");

        uint256 amount = _token.balanceOf(address(this));
        require(amount > 0, "TokenTimelock: no tokens to release");

        _token.safeTransfer(_beneficiary, amount);
    }
}

// File: browser/BirdPlus.sol

pragma solidity ^0.6.2;
pragma experimental ABIEncoderV2;




contract BirdPlus {
    
    using SafeMath for uint256;

    /// @notice EIP-20 token name for this token
    string public constant name = "Bird+";

    /// @notice EIP-20 token symbol for this token
    string public constant symbol = "BIRD+";

    /// @notice EIP-20 token decimals for this token
    uint8 public constant decimals = 18;

    /// @notice Total number of tokens in circulation
    uint256 public constant totalSupply = 10000000e18; // 10 million BirdPlus

    uint256 public constant marketDistributionPercentage = 50; // Tokens % to suppliers and borrowers: 2.5M each (Total: 5M)
    uint256 public constant foundersPercentage = 10; // Token % to Founders: 1M (2 years vesting)
    uint256 public constant investorsPercentage = 10; // Token % to Investors: 1M (2 years vesting)
    uint256 public constant advisorsPercentage = 10; // Token % to Advisors: 1M (2 years vesting)
    uint256 public constant employeesPercentage = 10; // Token % to employees: 1M (2 years vesting)
    uint256 public constant reservedPercentage = 10; // Token % reserved on Protocol
    
    TokenTimelock public founderTimelock;   // Founder timelock contract
    TokenTimelock public investorTimelock;  // Investor timelock contract
    TokenTimelock public advisorTimelock;   // Advisor timelock contract
    TokenTimelock public employeeTimelock;  // Employee timelock contract
    
    address public foundersFund;    // Founder escrow address
    address public investorsFund;   // Investor escrow address
    address public advisorsFund;    // Advisor escrow address
    address public employeesFund;   // Employee escrow address
    
    address public marketDistributionFund;  // BirdCore address: distributed the tokens on the market's user
    
    address public protocolAddress;         // Protocol account that holds the reserved tokens
    
    // Vesting schedules: Releases the tokens to respective group after this releaseTime
    uint256 public releaseTime;
    
    /// @dev Allowance amounts on behalf of others
    mapping (address => mapping (address => uint256)) internal allowances;

    /// @dev Official record of token balances for each account
    mapping (address => uint256) internal balances;

    /// @notice The standard EIP-20 transfer event
    event Transfer(address indexed from, address indexed to, uint256 amount);

    /// @notice The standard EIP-20 approval event
    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /**
     * @notice Construct a new BirdPlus token
     * @param account The initial Protocol account that hold the reserved tokens
     * @param marketDistributionFund_ The BirdCore address that hold the market distribution tokens
     * @param foundersFund_ The founder escrow address that hold the founders tokens
     * @param investorsFund_ The investor escrow address that hold the investors tokens
     * @param advisorsFund_ The advisor escrow address that hold the advisors tokens
     * @param employeesFund_ The employee escrow address that hold the employees tokens
     * @param releaseTime_ The locktime for founders, investors, advisors and employees tokens
     */
    constructor(address account, address marketDistributionFund_, address foundersFund_, address investorsFund_, address advisorsFund_, address employeesFund_, uint256 releaseTime_) public {
        protocolAddress = account;

        marketDistributionFund = marketDistributionFund_;
        foundersFund = foundersFund_;
        investorsFund = investorsFund_;
        advisorsFund = advisorsFund_;
        employeesFund = employeesFund_;
        releaseTime = releaseTime_;

        founderTimelock = new TokenTimelock(IERC20(address(this)), foundersFund, releaseTime);
        investorTimelock = new TokenTimelock(IERC20(address(this)), investorsFund, releaseTime);
        advisorTimelock = new TokenTimelock(IERC20(address(this)), advisorsFund, releaseTime);
        employeeTimelock = new TokenTimelock(IERC20(address(this)), employeesFund, releaseTime);
        
        balances[address(founderTimelock)] = totalSupply.mul(foundersPercentage).div(100);           // allocating 1M tokens
        balances[address(investorTimelock)] = totalSupply.mul(investorsPercentage).div(100);         // allocating 1M tokens
        balances[address(advisorTimelock)] = totalSupply.mul(advisorsPercentage).div(100);           // allocating 1M tokens
        balances[address(employeeTimelock)] = totalSupply.mul(employeesPercentage).div(100);         // allocating 1M tokens
        
        balances[marketDistributionFund] = totalSupply.mul(marketDistributionPercentage).div(100);   // allocating 5M tokens (2.5M each for suppliers and borrowers)
        balances[protocolAddress] = totalSupply.mul(reservedPercentage).div(100);                    // allocating 1M tokens
    }

    /**
     * @notice Get the number of tokens `spender` is approved to spend on behalf of `account`
     * @param account The address of the account holding the funds
     * @param spender The address of the account spending the funds
     * @return The number of tokens approved
     */
    function allowance(address account, address spender) external view returns (uint) {
        return allowances[account][spender];
    }

    /**
     * @notice Approve `spender` to transfer up to `amount` from `src`
     * @dev This will overwrite the approval amount for `spender`
     *  and is subject to issues noted [here](https://eips.ethereum.org/EIPS/eip-20#approve)
     * @param spender The address of the account which may transfer tokens
     * @param amount The number of tokens that are approved (2^256-1 means infinite)
     * @return Whether or not the approval succeeded
     */
    function approve(address spender,  uint256 amount) external returns (bool) {
        allowances[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);
        return true;
    }

    /**
     * @notice Get the number of tokens held by the `account`
     * @param account The address of the account to get the balance of
     * @return The number of tokens held
     */
    function balanceOf(address account) external view returns (uint) {
        return balances[account];
    }

    /**
     * @notice Transfer `amount` tokens from `msg.sender` to `dst`
     * @param dst The address of the destination account
     * @return Whether or not the transfer succeeded
     */
    function transfer(address dst, uint256 amount) external returns (bool) {
        _transferTokens(msg.sender, dst, amount);
        return true;
    }

    /**
     * @notice Transfer `amount` tokens from `src` to `dst`
     * @param src The address of the source account
     * @param dst The address of the destination account
     * @param amount The number of tokens to transfer
     * @return Whether or not the transfer succeeded
     */
    function transferFrom(address src, address dst, uint256 amount) external returns (bool) {
        address spender = msg.sender;
        uint256 spenderAllowance = allowances[src][spender];

        if (spender != src && spenderAllowance != uint256(-1)) {
            uint256 newAllowance = spenderAllowance.sub(amount);
            allowances[src][spender] = newAllowance;

            emit Approval(src, spender, newAllowance);
        }

        _transferTokens(src, dst, amount);
        return true;
    }

    function _transferTokens(address src, address dst, uint256 amount) internal {
        require(src != address(0), "BirdPlus::_transferTokens: cannot transfer from the zero address");
        require(dst != address(0), "BirdPlus::_transferTokens: cannot transfer to the zero address");

        balances[src] = balances[src].sub(amount);
        balances[dst] = balances[dst].add(amount);
        emit Transfer(src, dst, amount);
    }
    
    /**
     * @notice Transfers tokens held by timelock to founder address.
     */
    function releaseFounderFund() external returns (bool) {
        founderTimelock.release();
        return true;
    }
    
    /**
     * @notice Transfers tokens held by timelock to investor address.
     */
    function releaseInvestorFund() external returns (bool) {
        investorTimelock.release();
        return true;
    }
    
    /**
     * @notice Transfers tokens held by timelock to advisor address.
     */
    function releaseAdvisorFund() external returns (bool) {
        advisorTimelock.release();
        return true;
    }
    
    /**
     * @notice Transfers tokens held by timelock to employees address.
     */
    function releaseEmployeeFund() external returns (bool) {
        employeeTimelock.release();
        return true;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"marketDistributionFund_","type":"address"},{"internalType":"address","name":"foundersFund_","type":"address"},{"internalType":"address","name":"investorsFund_","type":"address"},{"internalType":"address","name":"advisorsFund_","type":"address"},{"internalType":"address","name":"employeesFund_","type":"address"},{"internalType":"uint256","name":"releaseTime_","type":"uint256"}],"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":"amount","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":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"advisorTimelock","outputs":[{"internalType":"contract TokenTimelock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advisorsFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"advisorsPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","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":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"employeeTimelock","outputs":[{"internalType":"contract TokenTimelock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"employeesFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"employeesPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founderTimelock","outputs":[{"internalType":"contract TokenTimelock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"foundersPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorTimelock","outputs":[{"internalType":"contract TokenTimelock","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorsFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"investorsPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketDistributionFund","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketDistributionPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protocolAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releaseAdvisorFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseEmployeeFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseFounderFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseInvestorFund","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"releaseTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"src","type":"address"},{"internalType":"address","name":"dst","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162001a0c38038062001a0c833981016040819052620000349162000512565b600980546001600160a01b03199081166001600160a01b038a81169190911790925560088054821689841617905560048054821688841617908190556005805483168885161790556006805483168785161790556007805490921685841617909155600a839055604051309291909116908390620000b290620004ec565b620000c093929190620005a3565b604051809103906000f080158015620000dd573d6000803e3d6000fd5b50600080546001600160a01b0319166001600160a01b03928316179055600554600a54604051309392909216916200011590620004ec565b6200012393929190620005a3565b604051809103906000f08015801562000140573d6000803e3d6000fd5b50600180546001600160a01b0319166001600160a01b03928316179055600654600a54604051309392909216916200017890620004ec565b6200018693929190620005a3565b604051809103906000f080158015620001a3573d6000803e3d6000fd5b50600280546001600160a01b0319166001600160a01b03928316179055600754600a5460405130939290921691620001db90620004ec565b620001e993929190620005a3565b604051809103906000f08015801562000206573d6000803e3d6000fd5b50600360006101000a8154816001600160a01b0302191690836001600160a01b031602179055506200026d606462000259600a6a084595161401484a0000006200041560201b620006fd1790919060201c565b6200046760201b620007471790919060201c565b600080546001600160a01b03168152600c6020908152604090912091909155620002b89060649062000259906a084595161401484a00000090600a90620006fd62000415821b17901c565b6001546001600160a01b03166000908152600c6020908152604090912091909155620003059060649062000259906a084595161401484a00000090600a90620006fd62000415821b17901c565b6002546001600160a01b03166000908152600c6020908152604090912091909155620003529060649062000259906a084595161401484a00000090600a90620006fd62000415821b17901c565b6003546001600160a01b03166000908152600c60209081526040909120919091556200039f9060649062000259906a084595161401484a00000090603290620006fd62000415821b17901c565b6008546001600160a01b03166000908152600c6020908152604090912091909155620003ec9060649062000259906a084595161401484a00000090600a90620006fd62000415821b17901c565b6009546001600160a01b03166000908152600c6020526040902055506200065e95505050505050565b600082620004265750600062000461565b828202828482816200043457fe5b04146200045e5760405162461bcd60e51b815260040162000455906200061d565b60405180910390fd5b90505b92915050565b60006200045e83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250620004b160201b60201c565b60008183620004d55760405162461bcd60e51b8152600401620004559190620005c7565b506000838581620004e257fe5b0495945050505050565b610774806200129883390190565b80516001600160a01b03811681146200046157600080fd5b600080600080600080600060e0888a0312156200052d578283fd5b620005398989620004fa565b96506200054a8960208a01620004fa565b95506200055b8960408a01620004fa565b94506200056c8960608a01620004fa565b93506200057d8960808a01620004fa565b92506200058e8960a08a01620004fa565b915060c0880151905092959891949750929550565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6000602080835283518082850152825b81811015620005f557858101830151858201604001528201620005d7565b81811115620006075783604083870101525b50601f01601f1916929092016040019392505050565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b610c2a806200066e6000396000f3fe608060405234801561001057600080fd5b50600436106101d95760003560e01c80635960b74f11610104578063af5623e1116100a2578063c440008e11610071578063c440008e14610304578063dd62ed3e1461030c578063de186ccb1461031f578063ec9a9b7c14610327576101d9565b8063af5623e1146102f4578063b771a5fc146102a6578063b7ed066b146102a6578063b91d4001146102fc576101d9565b806380780455116100de57806380780455146102d157806395d89b41146102d9578063a9059cbb146102e1578063ad70f637146102a6576101d9565b80635960b74f146102ae57806370a08231146102b657806375ae8102146102c9576101d9565b8063313ce5671161017c57806346f2cf4e1161014b57806346f2cf4e14610296578063486ca1571461029e57806353c08ea2146102a6578063579048be146102a6576101d9565b8063313ce567146102695780633908ccca1461027e5780633d736fa5146102865780634585c2061461028e576101d9565b8063095ea7b3116101b8578063095ea7b314610219578063150876f41461023957806318160ddd1461024157806323b872dd14610256576101d9565b8062173e83146101de5780630676c1b7146101fc57806306fdde0314610204575b600080fd5b6101e661032f565b6040516101f39190610a20565b60405180910390f35b6101e661033e565b61020c61034d565b6040516101f39190610a3f565b61022c6102273660046109f6565b61036e565b6040516101f39190610a34565b6101e66103d9565b6102496103e8565b6040516101f39190610bc5565b61022c6102643660046109b6565b6103f7565b6102716104c3565b6040516101f39190610bce565b6102496104c8565b6101e66104cd565b61022c6104dc565b6101e6610540565b6101e661054f565b61024961055e565b6101e6610563565b6102496102c4366004610967565b610572565b6101e661058d565b61022c61059c565b61020c6105ed565b61022c6102ef3660046109f6565b61060e565b61022c610624565b610249610669565b6101e661066f565b61024961031a366004610982565b61067e565b61022c6106a9565b6101e66106ee565b6007546001600160a01b031681565b6009546001600160a01b031681565b60405180604001604052806005815260200164426972642b60d81b81525081565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103c7908690610bc5565b60405180910390a35060015b92915050565b6006546001600160a01b031681565b6a084595161401484a00000081565b6001600160a01b0383166000818152600b602090815260408083203380855292528220549192909190821480159061043157506000198114155b156104ac5760006104428286610789565b6001600160a01b038089166000818152600b6020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104a2908590610bc5565b60405180910390a3505b6104b78686866107cb565b50600195945050505050565b601281565b603281565b6001546001600160a01b031681565b600154604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b505050506001905090565b6008546001600160a01b031681565b6000546001600160a01b031681565b600a81565b6002546001600160a01b031681565b6001600160a01b03166000908152600c602052604090205490565b6005546001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b03166386d1a69f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561052157600080fd5b60405180604001604052806005815260200164424952442b60d81b81525081565b600061061b3384846107cb565b50600192915050565b600354604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b600a5481565b6004546001600160a01b031681565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b600254604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b6003546001600160a01b031681565b60008261070c575060006103d3565b8282028284828161071957fe5b04146107405760405162461bcd60e51b815260040161073790610b26565b60405180910390fd5b9392505050565b600061074083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506108c8565b600061074083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108ff565b6001600160a01b0383166107f15760405162461bcd60e51b815260040161073790610b67565b6001600160a01b0382166108175760405162461bcd60e51b815260040161073790610ac9565b6001600160a01b0383166000908152600c602052604090205461083a9082610789565b6001600160a01b038085166000908152600c60205260408082209390935590841681522054610869908261092b565b6001600160a01b038084166000818152600c602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108bb908590610bc5565b60405180910390a3505050565b600081836108e95760405162461bcd60e51b81526004016107379190610a3f565b5060008385816108f557fe5b0495945050505050565b600081848411156109235760405162461bcd60e51b81526004016107379190610a3f565b505050900390565b6000828201838110156107405760405162461bcd60e51b815260040161073790610a92565b80356001600160a01b03811681146103d357600080fd5b600060208284031215610978578081fd5b6107408383610950565b60008060408385031215610994578081fd5b61099e8484610950565b91506109ad8460208501610950565b90509250929050565b6000806000606084860312156109ca578081fd5b83356109d581610bdc565b925060208401356109e581610bdc565b929592945050506040919091013590565b60008060408385031215610a08578182fd5b610a128484610950565b946020939093013593505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b81811015610a6b57858101830151858201604001528201610a4f565b81811115610a7c5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603e908201527f42697264506c75733a3a5f7472616e73666572546f6b656e733a2063616e6e6f60408201527f74207472616e7366657220746f20746865207a65726f20616464726573730000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260409082018190527f42697264506c75733a3a5f7472616e73666572546f6b656e733a2063616e6e6f908201527f74207472616e736665722066726f6d20746865207a65726f2061646472657373606082015260800190565b90815260200190565b60ff91909116815260200190565b6001600160a01b0381168114610bf157600080fd5b5056fea2646970667358221220af5d349a62bcb97836c96b4b77da7a1add89455b5583714f8c0bb101c409f88b64736f6c634300060c0033608060405234801561001057600080fd5b5060405161077438038061077483398101604081905261002f9161008f565b4281116100575760405162461bcd60e51b815260040161004e906100d1565b60405180910390fd5b600080546001600160a01b039485166001600160a01b031991821617909155600180549390941692169190911790915560025561013b565b6000806000606084860312156100a3578283fd5b83516100ae81610123565b60208501519093506100bf81610123565b80925050604084015190509250925092565b60208082526032908201527f546f6b656e54696d656c6f636b3a2072656c656173652074696d65206973206260408201527165666f72652063757272656e742074696d6560701b606082015260800190565b6001600160a01b038116811461013857600080fd5b50565b61062a8061014a6000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806338af3eed1461005157806386d1a69f1461006f578063b91d400114610079578063fc0c546a1461008e575b600080fd5b610059610096565b60405161006691906103ff565b60405180910390f35b6100776100a5565b005b610081610193565b60405161006691906105bb565b610059610199565b6001546001600160a01b031690565b6002544210156100d05760405162461bcd60e51b81526004016100c79061045f565b60405180910390fd5b600080546040516370a0823160e01b81526001600160a01b03909116906370a08231906101019030906004016103ff565b60206040518083038186803b15801561011957600080fd5b505afa15801561012d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061015191906103cb565b9050600081116101735760405162461bcd60e51b81526004016100c790610578565b600154600054610190916001600160a01b039182169116836101a8565b50565b60025490565b6000546001600160a01b031690565b6101fe8363a9059cbb60e01b84846040516024016101c7929190610413565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152610203565b505050565b6060610258826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166102929092919063ffffffff16565b8051909150156101fe578080602001905181019061027691906103ab565b6101fe5760405162461bcd60e51b81526004016100c79061052e565b60606102a184846000856102ab565b90505b9392505050565b6060824710156102cd5760405162461bcd60e51b81526004016100c7906104b1565b6102d68561036c565b6102f25760405162461bcd60e51b81526004016100c7906104f7565b60006060866001600160a01b0316858760405161030f91906103e3565b60006040518083038185875af1925050503d806000811461034c576040519150601f19603f3d011682016040523d82523d6000602084013e610351565b606091505b5091509150610361828286610372565b979650505050505050565b3b151590565b606083156103815750816102a4565b8251156103915782518084602001fd5b8160405162461bcd60e51b81526004016100c7919061042c565b6000602082840312156103bc578081fd5b815180151581146102a4578182fd5b6000602082840312156103dc578081fd5b5051919050565b600082516103f58184602087016105c4565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b600060208252825180602084015261044b8160408501602087016105c4565b601f01601f19169190910160400192915050565b60208082526032908201527f546f6b656e54696d656c6f636b3a2063757272656e742074696d65206973206260408201527165666f72652072656c656173652074696d6560701b606082015260800190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f546f6b656e54696d656c6f636b3a206e6f20746f6b656e7320746f2072656c6560408201526261736560e81b606082015260800190565b90815260200190565b60005b838110156105df5781810151838201526020016105c7565b838111156105ee576000848401525b5050505056fea2646970667358221220baa407c4a506b460c64a41bf97ac9cc885d4807ca06ffd02003c8b71a6d7e36464736f6c634300060c003300000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666000000000000000000000000980d11ac1c26f737ca467bec2c0ed292d06a258c00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d26660000000000000000000000000000000000000000000000000000000062268e70

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101d95760003560e01c80635960b74f11610104578063af5623e1116100a2578063c440008e11610071578063c440008e14610304578063dd62ed3e1461030c578063de186ccb1461031f578063ec9a9b7c14610327576101d9565b8063af5623e1146102f4578063b771a5fc146102a6578063b7ed066b146102a6578063b91d4001146102fc576101d9565b806380780455116100de57806380780455146102d157806395d89b41146102d9578063a9059cbb146102e1578063ad70f637146102a6576101d9565b80635960b74f146102ae57806370a08231146102b657806375ae8102146102c9576101d9565b8063313ce5671161017c57806346f2cf4e1161014b57806346f2cf4e14610296578063486ca1571461029e57806353c08ea2146102a6578063579048be146102a6576101d9565b8063313ce567146102695780633908ccca1461027e5780633d736fa5146102865780634585c2061461028e576101d9565b8063095ea7b3116101b8578063095ea7b314610219578063150876f41461023957806318160ddd1461024157806323b872dd14610256576101d9565b8062173e83146101de5780630676c1b7146101fc57806306fdde0314610204575b600080fd5b6101e661032f565b6040516101f39190610a20565b60405180910390f35b6101e661033e565b61020c61034d565b6040516101f39190610a3f565b61022c6102273660046109f6565b61036e565b6040516101f39190610a34565b6101e66103d9565b6102496103e8565b6040516101f39190610bc5565b61022c6102643660046109b6565b6103f7565b6102716104c3565b6040516101f39190610bce565b6102496104c8565b6101e66104cd565b61022c6104dc565b6101e6610540565b6101e661054f565b61024961055e565b6101e6610563565b6102496102c4366004610967565b610572565b6101e661058d565b61022c61059c565b61020c6105ed565b61022c6102ef3660046109f6565b61060e565b61022c610624565b610249610669565b6101e661066f565b61024961031a366004610982565b61067e565b61022c6106a9565b6101e66106ee565b6007546001600160a01b031681565b6009546001600160a01b031681565b60405180604001604052806005815260200164426972642b60d81b81525081565b336000818152600b602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103c7908690610bc5565b60405180910390a35060015b92915050565b6006546001600160a01b031681565b6a084595161401484a00000081565b6001600160a01b0383166000818152600b602090815260408083203380855292528220549192909190821480159061043157506000198114155b156104ac5760006104428286610789565b6001600160a01b038089166000818152600b6020908152604080832094891680845294909152908190208490555192935090917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906104a2908590610bc5565b60405180910390a3505b6104b78686866107cb565b50600195945050505050565b601281565b603281565b6001546001600160a01b031681565b600154604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b505af1158015610535573d6000803e3d6000fd5b505050506001905090565b6008546001600160a01b031681565b6000546001600160a01b031681565b600a81565b6002546001600160a01b031681565b6001600160a01b03166000908152600c602052604090205490565b6005546001600160a01b031681565b60008060009054906101000a90046001600160a01b03166001600160a01b03166386d1a69f6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561052157600080fd5b60405180604001604052806005815260200164424952442b60d81b81525081565b600061061b3384846107cb565b50600192915050565b600354604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b600a5481565b6004546001600160a01b031681565b6001600160a01b039182166000908152600b6020908152604080832093909416825291909152205490565b600254604080516386d1a69f60e01b815290516000926001600160a01b0316916386d1a69f916004808301928692919082900301818387803b15801561052157600080fd5b6003546001600160a01b031681565b60008261070c575060006103d3565b8282028284828161071957fe5b04146107405760405162461bcd60e51b815260040161073790610b26565b60405180910390fd5b9392505050565b600061074083836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506108c8565b600061074083836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f7700008152506108ff565b6001600160a01b0383166107f15760405162461bcd60e51b815260040161073790610b67565b6001600160a01b0382166108175760405162461bcd60e51b815260040161073790610ac9565b6001600160a01b0383166000908152600c602052604090205461083a9082610789565b6001600160a01b038085166000908152600c60205260408082209390935590841681522054610869908261092b565b6001600160a01b038084166000818152600c602052604090819020939093559151908516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906108bb908590610bc5565b60405180910390a3505050565b600081836108e95760405162461bcd60e51b81526004016107379190610a3f565b5060008385816108f557fe5b0495945050505050565b600081848411156109235760405162461bcd60e51b81526004016107379190610a3f565b505050900390565b6000828201838110156107405760405162461bcd60e51b815260040161073790610a92565b80356001600160a01b03811681146103d357600080fd5b600060208284031215610978578081fd5b6107408383610950565b60008060408385031215610994578081fd5b61099e8484610950565b91506109ad8460208501610950565b90509250929050565b6000806000606084860312156109ca578081fd5b83356109d581610bdc565b925060208401356109e581610bdc565b929592945050506040919091013590565b60008060408385031215610a08578182fd5b610a128484610950565b946020939093013593505050565b6001600160a01b0391909116815260200190565b901515815260200190565b6000602080835283518082850152825b81811015610a6b57858101830151858201604001528201610a4f565b81811115610a7c5783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252603e908201527f42697264506c75733a3a5f7472616e73666572546f6b656e733a2063616e6e6f60408201527f74207472616e7366657220746f20746865207a65726f20616464726573730000606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b602080825260409082018190527f42697264506c75733a3a5f7472616e73666572546f6b656e733a2063616e6e6f908201527f74207472616e736665722066726f6d20746865207a65726f2061646472657373606082015260800190565b90815260200190565b60ff91909116815260200190565b6001600160a01b0381168114610bf157600080fd5b5056fea2646970667358221220af5d349a62bcb97836c96b4b77da7a1add89455b5583714f8c0bb101c409f88b64736f6c634300060c0033

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

00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666000000000000000000000000980d11ac1c26f737ca467bec2c0ed292d06a258c00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d266600000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d26660000000000000000000000000000000000000000000000000000000062268e70

-----Decoded View---------------
Arg [0] : account (address): 0x60b6a57b71f23a8c602eD71b60272FdA321D2666
Arg [1] : marketDistributionFund_ (address): 0x980D11Ac1C26F737CA467BeC2c0ed292d06a258C
Arg [2] : foundersFund_ (address): 0x60b6a57b71f23a8c602eD71b60272FdA321D2666
Arg [3] : investorsFund_ (address): 0x60b6a57b71f23a8c602eD71b60272FdA321D2666
Arg [4] : advisorsFund_ (address): 0x60b6a57b71f23a8c602eD71b60272FdA321D2666
Arg [5] : employeesFund_ (address): 0x60b6a57b71f23a8c602eD71b60272FdA321D2666
Arg [6] : releaseTime_ (uint256): 1646694000

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666
Arg [1] : 000000000000000000000000980d11ac1c26f737ca467bec2c0ed292d06a258c
Arg [2] : 00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666
Arg [3] : 00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666
Arg [4] : 00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666
Arg [5] : 00000000000000000000000060b6a57b71f23a8c602ed71b60272fda321d2666
Arg [6] : 0000000000000000000000000000000000000000000000000000000062268e70


Deployed Bytecode Sourcemap

22321:8896:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23929:28;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24115:30;;;:::i;22437:37::-;;;:::i;:::-;;;;;;;:::i;28170:211::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23866:27::-;;;:::i;22736:49::-;;;:::i;:::-;;;;;;;:::i;29357:522::-;;;;;;:::i;:::-;;:::i;22637:35::-;;;:::i;:::-;;;;;;;:::i;22817:57::-;;;:::i;23509:37::-;;;:::i;30648:122::-;;;:::i;23999:37::-;;;:::i;23435:36::-;;;:::i;22943:47::-;;;:::i;23584:36::-;;;:::i;28584:108::-;;;;;;:::i;:::-;;:::i;23802:28::-;;;:::i;30427:120::-;;;:::i;22535:39::-;;;:::i;28898:152::-;;;;;;:::i;:::-;;:::i;31092:122::-;;;:::i;24307:26::-;;;:::i;23739:27::-;;;:::i;27559:136::-;;;;;;:::i;:::-;;:::i;30870:120::-;;;:::i;23658:37::-;;;:::i;23929:28::-;;;-1:-1:-1;;;;;23929:28:0;;:::o;24115:30::-;;;-1:-1:-1;;;;;24115:30:0;;:::o;22437:37::-;;;;;;;;;;;;;;-1:-1:-1;;;22437:37:0;;;;:::o;28170:211::-;28267:10;28239:4;28256:22;;;:10;:22;;;;;;;;-1:-1:-1;;;;;28256:31:0;;;;;;;;;;:40;;;28314:37;28239:4;;28256:31;;28314:37;;;;28290:6;;28314:37;:::i;:::-;;;;;;;;-1:-1:-1;28369:4:0;28170:211;;;;;:::o;23866:27::-;;;-1:-1:-1;;;;;23866:27:0;;:::o;22736:49::-;22774:11;22736:49;:::o;29357:522::-;-1:-1:-1;;;;;29522:15:0;;29439:4;29522:15;;;:10;:15;;;;;;;;29474:10;29522:24;;;;;;;;29439:4;;29474:10;;29522:24;29563:14;;;;;:49;;;-1:-1:-1;;29581:16:0;:31;;29563:49;29559:245;;;29629:20;29652:28;:16;29673:6;29652:20;:28::i;:::-;-1:-1:-1;;;;;29695:15:0;;;;;;;:10;:15;;;;;;;;:24;;;;;;;;;;;;;;:39;;;29756:36;29629:51;;-1:-1:-1;29695:24:0;;29756:36;;;;29629:51;;29756:36;:::i;:::-;;;;;;;;29559:245;;29816:33;29832:3;29837;29842:6;29816:15;:33::i;:::-;-1:-1:-1;29867:4:0;;29357:522;-1:-1:-1;;;;;29357:522:0:o;22637:35::-;22670:2;22637:35;:::o;22817:57::-;22872:2;22817:57;:::o;23509:37::-;;;-1:-1:-1;;;;;23509:37:0;;:::o;30648:122::-;30714:16;;:26;;;-1:-1:-1;;;30714:26:0;;;;30697:4;;-1:-1:-1;;;;;30714:16:0;;:24;;:26;;;;;30697:4;;30714:26;;;;;;;30697:4;30714:16;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30758:4;30751:11;;30648:122;:::o;23999:37::-;;;-1:-1:-1;;;;;23999:37:0;;:::o;23435:36::-;;;-1:-1:-1;;;;;23435:36:0;;:::o;22943:47::-;22988:2;22943:47;:::o;23584:36::-;;;-1:-1:-1;;;;;23584:36:0;;:::o;28584:108::-;-1:-1:-1;;;;;28667:17:0;28643:4;28667:17;;;:8;:17;;;;;;;28584:108::o;23802:28::-;;;-1:-1:-1;;;;;23802:28:0;;:::o;30427:120::-;30475:4;30492:15;;;;;;;;;-1:-1:-1;;;;;30492:15:0;-1:-1:-1;;;;;30492:23:0;;:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22535:39;;;;;;;;;;;;;;-1:-1:-1;;;22535:39:0;;;;:::o;28898:152::-;28963:4;28980:40;28996:10;29008:3;29013:6;28980:15;:40::i;:::-;-1:-1:-1;29038:4:0;28898:152;;;;:::o;31092:122::-;31158:16;;:26;;;-1:-1:-1;;;31158:26:0;;;;31141:4;;-1:-1:-1;;;;;31158:16:0;;:24;;:26;;;;;31141:4;;31158:26;;;;;;;31141:4;31158:16;:26;;;;;;;;;;24307;;;;:::o;23739:27::-;;;-1:-1:-1;;;;;23739:27:0;;:::o;27559:136::-;-1:-1:-1;;;;;27659:19:0;;;27635:4;27659:19;;;:10;:19;;;;;;;;:28;;;;;;;;;;;;;27559:136::o;30870:120::-;30935:15;;:25;;;-1:-1:-1;;;30935:25:0;;;;30918:4;;-1:-1:-1;;;;;30935:15:0;;:23;;:25;;;;;30918:4;;30935:25;;;;;;;30918:4;30935:15;:25;;;;;;;;;;23658:37;;;-1:-1:-1;;;;;23658:37:0;;:::o;10453:471::-;10511:7;10756:6;10752:47;;-1:-1:-1;10786:1:0;10779:8;;10752:47;10823:5;;;10827:1;10823;:5;:1;10847:5;;;;;:10;10839:56;;;;-1:-1:-1;;;10839:56:0;;;;;;;:::i;:::-;;;;;;;;;10915:1;10453:471;-1:-1:-1;;;10453:471:0:o;11400:132::-;11458:7;11485:39;11489:1;11492;11485:39;;;;;;;;;;;;;;;;;:3;:39::i;9563:136::-;9621:7;9648:43;9652:1;9655;9648:43;;;;;;;;;;;;;;;;;:3;:43::i;29887:440::-;-1:-1:-1;;;;;29982:17:0;;29974:94;;;;-1:-1:-1;;;29974:94:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30087:17:0;;30079:92;;;;-1:-1:-1;;;30079:92:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30200:13:0;;;;;;:8;:13;;;;;;:25;;30218:6;30200:17;:25::i;:::-;-1:-1:-1;;;;;30184:13:0;;;;;;;:8;:13;;;;;;:41;;;;30252:13;;;;;;;:25;;30270:6;30252:17;:25::i;:::-;-1:-1:-1;;;;;30236:13:0;;;;;;;:8;:13;;;;;;;:41;;;;30293:26;;;;;;;;;;30312:6;;30293:26;:::i;:::-;;;;;;;;29887:440;;;:::o;12028:278::-;12114:7;12149:12;12142:5;12134:28;;;;-1:-1:-1;;;12134:28:0;;;;;;;;:::i;:::-;;12173:9;12189:1;12185;:5;;;;;;;12028:278;-1:-1:-1;;;;;12028:278:0:o;10002:192::-;10088:7;10124:12;10116:6;;;;10108:29;;;;-1:-1:-1;;;10108:29:0;;;;;;;;:::i;:::-;-1:-1:-1;;;10160:5:0;;;10002:192::o;9099:181::-;9157:7;9189:5;;;9213:6;;;;9205:46;;;;-1:-1:-1;;;9205:46:0;;;;;;;:::i;5:130:-1:-;72:20;;-1:-1;;;;;8027:54;;9007:35;;8997:2;;9056:1;;9046:12;279:241;;383:2;371:9;362:7;358:23;354:32;351:2;;;-1:-1;;389:12;351:2;451:53;496:7;472:22;451:53;:::i;527:366::-;;;648:2;636:9;627:7;623:23;619:32;616:2;;;-1:-1;;654:12;616:2;716:53;761:7;737:22;716:53;:::i;:::-;706:63;;824:53;869:7;806:2;849:9;845:22;824:53;:::i;:::-;814:63;;610:283;;;;;:::o;900:491::-;;;;1038:2;1026:9;1017:7;1013:23;1009:32;1006:2;;;-1:-1;;1044:12;1006:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1096:63;-1:-1;1196:2;1235:22;;72:20;97:33;72:20;97:33;:::i;:::-;1000:391;;1204:63;;-1:-1;;;1304:2;1343:22;;;;209:20;;1000:391::o;1398:366::-;;;1519:2;1507:9;1498:7;1494:23;1490:32;1487:2;;;-1:-1;;1525:12;1487:2;1587:53;1632:7;1608:22;1587:53;:::i;:::-;1577:63;1677:2;1716:22;;;;209:20;;-1:-1;;;1481:283::o;4298:222::-;-1:-1;;;;;8027:54;;;;1842:37;;4425:2;4410:18;;4396:124::o;4527:210::-;7939:13;;7932:21;1956:34;;4648:2;4633:18;;4619:118::o;5015:310::-;;5162:2;;5183:17;5176:47;2322:5;7562:12;7719:6;5162:2;5151:9;5147:18;7707:19;-1:-1;8639:101;8653:6;8650:1;8647:13;8639:101;;;8720:11;;;;;8714:18;8701:11;;;7747:14;8701:11;8694:39;8668:10;;8639:101;;;8755:6;8752:1;8749:13;8746:2;;;-1:-1;7747:14;8811:6;5151:9;8802:16;;8795:27;8746:2;-1:-1;8927:7;8911:14;-1:-1;;8907:28;2480:39;;;;7747:14;2480:39;;5133:192;-1:-1;;;5133:192::o;5332:416::-;5532:2;5546:47;;;2756:2;5517:18;;;7707:19;2792:29;7747:14;;;2772:50;2841:12;;;5503:245::o;5755:416::-;5955:2;5969:47;;;3092:2;5940:18;;;7707:19;3128:34;7747:14;;;3108:55;3197:32;3183:12;;;3176:54;3249:12;;;5926:245::o;6178:416::-;6378:2;6392:47;;;3500:2;6363:18;;;7707:19;3536:34;7747:14;;;3516:55;-1:-1;;;3591:12;;;3584:25;3628:12;;;6349:245::o;6601:416::-;6801:2;6815:47;;;3879:2;6786:18;;;7707:19;;;3915:34;7747:14;;;3895:55;3984:34;3970:12;;;3963:56;4038:12;;;6772:245::o;7024:222::-;4135:37;;;7151:2;7136:18;;7122:124::o;7253:214::-;8243:4;8232:16;;;;4251:35;;7376:2;7361:18;;7347:120::o;8948:117::-;-1:-1;;;;;8027:54;;9007:35;;8997:2;;9056:1;;9046:12;8997:2;8991:74;:::o

Swarm Source

ipfs://baa407c4a506b460c64a41bf97ac9cc885d4807ca06ffd02003c8b71a6d7e364
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.