More Info
Private Name Tags
ContractCreator
Latest 9 from a total of 9 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 17018938 | 599 days ago | IN | 0 ETH | 0.00546577 | ||||
Withdraw | 15198004 | 860 days ago | IN | 0 ETH | 0.00051704 | ||||
Withdraw | 15127211 | 871 days ago | IN | 0 ETH | 0.00116384 | ||||
Withdraw | 15087161 | 877 days ago | IN | 0 ETH | 0.00189486 | ||||
Withdraw | 15087120 | 877 days ago | IN | 0 ETH | 0.00162242 | ||||
Transfer Ownersh... | 12368255 | 1305 days ago | IN | 0 ETH | 0.00231692 | ||||
Set Distribution... | 12366910 | 1305 days ago | IN | 0 ETH | 0.00225475 | ||||
Finalize Partici... | 12366791 | 1305 days ago | IN | 0 ETH | 0.00192358 | ||||
Add Participants | 12366790 | 1305 days ago | IN | 0 ETH | 0.01444946 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
MultipleDistribution
Compiler Version
v0.5.12+commit.7709ece9
Optimization Enabled:
Yes with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.5.12; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; import "openzeppelin-solidity/contracts/utils/Address.sol"; import "./Token/OilerToken.sol"; import "./IMultipleDistribution.sol"; import "./IDistribution.sol"; /// @dev Distributes STAKE tokens for Private Offering and Advisors Reward. contract MultipleDistribution is Ownable, IMultipleDistribution { using SafeMath for uint256; using Address for address; /// @dev Emits when `initialize` method has been called. /// @param token The address of ERC677MultiBridgeToken contract. /// @param caller The address of the caller. event Initialized(address token, address caller); /// @dev Emits when the `Distribution` address has been set. /// @param distribution `Distribution` contract address. /// @param caller The address of the caller. event DistributionAddressSet(address distribution, address caller); /// @dev Emits when `withdraw` method has been called. /// @param recipient Recipient address. /// @param value Transferred value. event Withdrawn(address recipient, uint256 value); /// @dev Emits when `burn` method has been called. /// @param value Burnt value. event Burnt(uint256 value); /// @dev Emits when `addParticipants` method has been called. /// @param participants Participants addresses. /// @param stakes Participants stakes. /// @param caller The address of the caller. event ParticipantsAdded(address[] participants, uint256[] stakes, address caller); /// @dev Emits when `editParticipant` method has been called. /// @param participant Participant address. /// @param oldStake Old participant stake. /// @param newStake New participant stake. /// @param caller The address of the caller. event ParticipantEdited(address participant, uint256 oldStake, uint256 newStake, address caller); /// @dev Emits when `removeParticipant` method has been called. /// @param participant Participant address. /// @param stake Participant stake. /// @param caller The address of the caller. event ParticipantRemoved(address participant, uint256 stake, address caller); /// @dev Emits when `finalizeParticipants` method has been called. /// @param numberOfParticipants Number of participants. /// @param caller The address of the caller. event ParticipantsFinalized(uint256 numberOfParticipants, address caller); uint256 public TOTAL_STAKE; uint8 public POOL_NUMBER; /// @dev The instance of ERC677MultiBridgeToken contract. OilerToken public token; /// @dev Distribution contract address. address public distributionAddress; /// @dev Participants addresses. address[] public participants; /// @dev Stake for a specified participant. mapping (address => uint256) public participantStake; /// @dev Amount of tokens that have already been withdrawn by a specified participant. mapping (address => uint256) public paidAmount; /// @dev Contains max balance (sum of all installments). uint256 public maxBalance = 0; /// @dev Boolean variable that indicates whether the contract was initialized. bool public isInitialized = false; /// @dev Boolean variable that indicates whether the participant set was finalized. bool public isFinalized = false; /// @dev Contains current sum of stakes. uint256 public sumOfStakes = 0; /// @dev Checks that the contract is initialized. modifier initialized() { require(isInitialized, "not initialized"); _; } /// @dev Checks that the participant set is not finalized. modifier notFinalized() { require(!isFinalized, "already finalized"); _; } constructor(uint8 _pool) public { require(_pool == 3 || _pool == 4, "wrong pool number"); POOL_NUMBER = _pool; if (POOL_NUMBER == 3) { TOTAL_STAKE = 13_621_100 ether; // Private Offering supply. `ether` is used as the token has 18 decimals } if (POOL_NUMBER == 4) { TOTAL_STAKE = 7_066_668 ether; // Advisors Reward supply. `ether` is used as the token has 18 decimals } } /// @dev Adds participants. This function doesn't limit max gas consumption, /// so adding too many participants can cause it to reach the out-of-gas error. /// @param _participants The addresses of new participants. /// @param _stakes The amounts of the tokens that belong to each participant. function addParticipants( address[] calldata _participants, uint256[] calldata _stakes ) external onlyOwner notFinalized { require(_participants.length == _stakes.length, "different arrays sizes"); for (uint256 i = 0; i < _participants.length; i++) { require(_participants[i] != address(0), "invalid address"); require(_stakes[i] > 0, "the participant stake must be more than 0"); require(participantStake[_participants[i]] == 0, "participant already added"); participants.push(_participants[i]); participantStake[_participants[i]] = _stakes[i]; sumOfStakes = sumOfStakes.add(_stakes[i]); } require(sumOfStakes <= TOTAL_STAKE, "wrong sum of values"); emit ParticipantsAdded(_participants, _stakes, msg.sender); } /// @dev Edits participant stake. /// @param _participant Participant address. /// @param _newStake New stake of the participant. function editParticipant( address _participant, uint256 _newStake ) external onlyOwner notFinalized { require(_participant != address(0), "invalid address"); uint256 oldStake = participantStake[_participant]; require(oldStake > 0, "the participant doesn't exist"); require(_newStake > 0, "the participant stake must be more than 0"); sumOfStakes = sumOfStakes.sub(oldStake).add(_newStake); require(sumOfStakes <= TOTAL_STAKE, "wrong sum of values"); participantStake[_participant] = _newStake; emit ParticipantEdited(_participant, oldStake, _newStake, msg.sender); } /// @dev Removes participant. This function doesn't limit max gas consumption, /// so having too many participants can cause it to reach the out-of-gas error. /// @param _participant Participant address. function removeParticipant( address _participant ) external onlyOwner notFinalized { require(_participant != address(0), "invalid address"); uint256 stake = participantStake[_participant]; require(stake > 0, "the participant doesn't exist"); uint256 index = 0; uint256 participantsLength = participants.length; for (uint256 i = 0; i < participantsLength; i++) { if (participants[i] == _participant) { index = i; break; } } require(participants[index] == _participant, "the participant not found"); sumOfStakes = sumOfStakes.sub(stake); participantStake[_participant] = 0; address lastParticipant = participants[participants.length.sub(1)]; participants[index] = lastParticipant; participants.length = participants.length.sub(1); emit ParticipantRemoved(_participant, stake, msg.sender); } /// @dev Calculates unused stake and disables the following additions/edits. function finalizeParticipants() external onlyOwner notFinalized { uint256 unusedStake = TOTAL_STAKE.sub(sumOfStakes); if (unusedStake > 0) { participants.push(address(0)); participantStake[address(0)] = unusedStake; } isFinalized = true; emit ParticipantsFinalized(participants.length, msg.sender); } /// @dev Initializes the contract after the token is created. /// @param _tokenAddress The address of the STAKE token contract. function initialize( address _tokenAddress ) external { require(msg.sender == distributionAddress, "wrong sender"); require(!isInitialized, "already initialized"); require(isFinalized, "not finalized"); require(_tokenAddress != address(0)); token = OilerToken(_tokenAddress); isInitialized = true; emit Initialized(_tokenAddress, msg.sender); } /// @dev The removed implementation of the ownership renouncing. function renounceOwnership() public onlyOwner { revert("not implemented"); } /// @dev Sets the `Distribution` contract address. /// @param _distributionAddress The `Distribution` contract address. function setDistributionAddress(address _distributionAddress) external onlyOwner { require(distributionAddress == address(0), "already set"); require( address(this) == IDistribution(_distributionAddress).poolAddress(POOL_NUMBER), "wrong address" ); distributionAddress = _distributionAddress; emit DistributionAddressSet(distributionAddress, msg.sender); } /// @dev Transfers a share to participant. /// Can only be called by Private Offering or Advisors Reward participant /// to withdraw their currently available share. function withdraw() external { require(IDistribution(distributionAddress).isInitialized(), "Distribution should be initialized to enable withdrawals"); if (POOL_NUMBER == 3) { // Private Offering timelock for the first 5 days require(_now() >= IDistribution(distributionAddress).distributionStartTimestamp().add(5 days), "Private Offering withdrawals are locked during LBP event"); } uint256 amount = _withdraw(msg.sender); emit Withdrawn(msg.sender, amount); } /// @dev Transfers unclaimed part to address(0). function burn() external onlyOwner { uint256 amount = _withdraw(address(0)); emit Burnt(amount); } /// @dev Updates an internal value of the balance to use it for correct /// share calculation (see the `_withdraw` function) and prevents transferring /// tokens to this contract not from the `Distribution` contract. /// @param _from The address from which the tokens are transferred. /// @param _value The amount of transferred tokens. function onTokenTransfer( address _from, uint256 _value, bytes calldata ) external returns (bool) { require(msg.sender == address(token), "the caller can only be the token contract"); require(_from == distributionAddress, "the _from value can only be the distribution contract"); maxBalance = maxBalance.add(_value); return true; } /// @dev Returns a total amount of tokens. function poolStake() external view returns (uint256) { return TOTAL_STAKE; } /// @dev Returns an array of participants. function getParticipants() external view returns (address[] memory) { return participants; } /// @dev Transfers a share to participant or unclaimed part to address(0). /// Used by the `withdraw` and `burn` functions. /// @param _recipient The address of a participant or address(0). function _withdraw(address _recipient) internal initialized returns(uint256) { uint256 stake = participantStake[_recipient]; require(stake > 0, "you are not a participant"); uint256 maxShare = maxBalance.mul(stake).div(TOTAL_STAKE); uint256 currentShare = maxShare.sub(paidAmount[_recipient]); require(currentShare > 0, "no tokens available to withdraw"); paidAmount[_recipient] = paidAmount[_recipient].add(currentShare); token.transferDistribution(_recipient, currentShare); return currentShare; } function _now() internal view returns (uint256) { return now; // solium-disable-line security/no-block-members } }
pragma solidity 0.5.12; interface IDistribution { function isInitialized() external view returns (bool); function distributionStartTimestamp() external view returns (uint256); function supply() external view returns(uint256); function poolAddress(uint8) external view returns(address); }
pragma solidity 0.5.12; interface IMultipleDistribution { function initialize(address _tokenAddress) external; function poolStake() external view returns (uint256); }
pragma solidity 0.5.12; import "openzeppelin-solidity/contracts/token/ERC20/IERC20.sol"; import "openzeppelin-solidity/contracts/math/SafeMath.sol"; /** * @dev Implementation of the `IERC20` interface. * * This implementation was taken from * https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v2.3.0/contracts/token/ERC20/ERC20.sol * This differs from the original one only in the definition for the `_balances` * mapping: we made it `internal` instead of `private` since we use the `_balances` * in the `ERC677BridgeToken` child contract to be able to transfer tokens to address(0) * (see its `_superTransfer` function). The original OpenZeppelin implementation * doesn't allow transferring to address(0). * * 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 `ERC20Mintable`. * * *For a detailed writeup see our guide [How to implement supply * mechanisms](https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226).* * * 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 IERC20 { using SafeMath for uint256; mapping (address => uint256) internal _balances; // CHANGED: not private to write a custom transfer method mapping (address => mapping (address => uint256)) private _allowances; uint256 private _totalSupply; /** * @dev See `IERC20.totalSupply`. */ function totalSupply() public view returns (uint256) { return _totalSupply; } /** * @dev See `IERC20.balanceOf`. */ function balanceOf(address account) public view 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 returns (bool) { _transfer(msg.sender, recipient, amount); return true; } /** * @dev See `IERC20.allowance`. */ function allowance(address owner, address spender) public view returns (uint256) { return _allowances[owner][spender]; } /** * @dev See `IERC20.approve`. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public returns (bool) { _approve(msg.sender, spender, value); 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 `value`. * - the caller must have allowance for `sender`'s tokens of at least * `amount`. */ function transferFrom(address sender, address recipient, uint256 amount) public returns (bool) { _transfer(sender, recipient, amount); _approve(sender, msg.sender, _allowances[sender][msg.sender].sub(amount)); 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 returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][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 returns (bool) { _approve(msg.sender, spender, _allowances[msg.sender][spender].sub(subtractedValue)); 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 { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _balances[sender] = _balances[sender].sub(amount); _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 { require(account != address(0), "ERC20: mint to the zero address"); _totalSupply = _totalSupply.add(amount); _balances[account] = _balances[account].add(amount); emit Transfer(address(0), account, amount); } /** * @dev Destoys `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 value) internal { require(account != address(0), "ERC20: burn from the zero address"); _totalSupply = _totalSupply.sub(value); _balances[account] = _balances[account].sub(value); emit Transfer(account, address(0), value); } /** * @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 value) internal { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = value; emit Approval(owner, spender, value); } /** * @dev Destoys `amount` tokens from `account`.`amount` is then deducted * from the caller's allowance. * * See `_burn` and `_approve`. */ function _burnFrom(address account, uint256 amount) internal { _burn(account, amount); _approve(account, msg.sender, _allowances[account][msg.sender].sub(amount)); } }
pragma solidity 0.5.12; import "./ERC20.sol"; import "openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol"; /** * @title ERC20Permittable * @dev This is ERC20 contract extended by the `permit` function (see EIP712). */ contract ERC20Permittable is ERC20, ERC20Detailed { string public constant version = "1"; // EIP712 niceties bytes32 public DOMAIN_SEPARATOR; // bytes32 public constant PERMIT_TYPEHASH = keccak256("Permit(address holder,address spender,uint256 nonce,uint256 expiry,bool allowed)"); bytes32 public constant PERMIT_TYPEHASH = 0xea2aa0a1be11a07ed86d755c93467f4f82362b452371d1ba94d1715123511acb; mapping(address => uint256) public nonces; mapping(address => mapping(address => uint256)) public expirations; constructor( string memory _name, string memory _symbol, uint8 _decimals ) ERC20Detailed(_name, _symbol, _decimals) public { uint256 chainId = 0; assembly { chainId := chainid } DOMAIN_SEPARATOR = keccak256(abi.encode( keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"), keccak256(bytes(_name)), keccak256(bytes(version)), chainId, address(this) )); } /// @dev transferFrom in this contract works in a slightly different form than the generic /// transferFrom function. This contract allows for "unlimited approval". /// Should the user approve an address for the maximum uint256 value, /// then that address will have unlimited approval until told otherwise. /// @param _sender The address of the sender. /// @param _recipient The address of the recipient. /// @param _amount The value to transfer. /// @return Success status. function transferFrom(address _sender, address _recipient, uint256 _amount) public returns (bool) { _transfer(_sender, _recipient, _amount); if (_sender != msg.sender) { uint256 allowedAmount = allowance(_sender, msg.sender); if (allowedAmount != uint256(-1)) { // If allowance is limited, adjust it. // In this case `transferFrom` works like the generic _approve(_sender, msg.sender, allowedAmount.sub(_amount)); } else { // If allowance is unlimited by `permit`, `approve`, or `increaseAllowance` // function, don't adjust it. But the expiration date must be empty or in the future. // Note that the expiration timestamp can have a 900-second error: // https://github.com/ethereum/wiki/blob/c02254611f218f43cbb07517ca8e5d00fd6d6d75/Block-Protocol-2.0.md require( // solium-disable-next-line security/no-block-members expirations[_sender][msg.sender] == 0 || expirations[_sender][msg.sender] >= _now(), "expiry is in the past" ); } } else { // If `_sender` is `msg.sender`, // the function works just like `transfer()` } return true; } /// @dev An alias for `transfer` function. /// @param _to The address of the recipient. /// @param _amount The value to transfer. function push(address _to, uint256 _amount) public { transferFrom(msg.sender, _to, _amount); } /// @dev Makes a request to transfer the specified amount /// from the specified address to the caller's address. /// @param _from The address of the holder. /// @param _amount The value to transfer. function pull(address _from, uint256 _amount) public { transferFrom(_from, msg.sender, _amount); } /// @dev An alias for `transferFrom` function. /// @param _from The address of the sender. /// @param _to The address of the recipient. /// @param _amount The value to transfer. function move(address _from, address _to, uint256 _amount) public { transferFrom(_from, _to, _amount); } /// @dev Allows to spend holder's unlimited amount by the specified spender. /// The function can be called by anyone, but requires having allowance parameters /// signed by the holder according to EIP712. /// @param _holder The holder's address. /// @param _spender The spender's address. /// @param _nonce The nonce taken from `nonces(_holder)` public getter. /// @param _expiry The allowance expiration date (unix timestamp in UTC). /// Can be zero for no expiration. Forced to zero if `_allowed` is `false`. /// @param _allowed True to enable unlimited allowance for the spender by the holder. False to disable. /// @param _v A final byte of signature (ECDSA component). /// @param _r The first 32 bytes of signature (ECDSA component). /// @param _s The second 32 bytes of signature (ECDSA component). function permit( address _holder, address _spender, uint256 _nonce, uint256 _expiry, bool _allowed, uint8 _v, bytes32 _r, bytes32 _s ) external { require(_expiry == 0 || _now() <= _expiry, "invalid expiry"); bytes32 digest = keccak256(abi.encodePacked( "\x19\x01", DOMAIN_SEPARATOR, keccak256(abi.encode( PERMIT_TYPEHASH, _holder, _spender, _nonce, _expiry, _allowed )) )); require(_holder == ecrecover(digest, _v, _r, _s), "invalid signature or parameters"); require(_nonce == nonces[_holder]++, "invalid nonce"); uint256 amount = _allowed ? uint256(-1) : 0; _approve(_holder, _spender, amount); expirations[_holder][_spender] = _allowed ? _expiry : 0; } function _now() internal view returns(uint256) { return now; } }
pragma solidity 0.5.12; import "openzeppelin-solidity/contracts/utils/Address.sol"; import "openzeppelin-solidity/contracts/ownership/Ownable.sol"; import "openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol"; import "./ERC20Permittable.sol"; import "./Sacrifice.sol"; import "../IDistribution.sol"; // This is Vesting token // // We used xDAI vesting implementation: // https://github.com/xdaichain/stake-token/blob/master/contracts/Token/ERC677BridgeToken.sol // // Stripping it of any Bridges and other stuff contract OilerToken is Ownable, ERC20Permittable { using SafeERC20 for ERC20; using Address for address; /// @dev Distribution contract address. address public distributionAddress; /// @dev The PrivateOffering contract address. address public privateOfferingDistributionAddress; /// @dev The AdvisorsReward contract address. address public advisorsRewardDistributionAddress; /// @dev Mint event. /// @param to To address. /// @param amount Minted value. event Mint(address indexed to, uint256 amount); /// @dev Modified Transfer event with custom data. /// @param from From address. /// @param to To address. /// @param value Transferred value. /// @param data Custom data to call after transfer. event Transfer(address indexed from, address indexed to, uint256 value, bytes data); /// @dev Emits if custom call after transfer fails. /// @param from From address. /// @param to To address. /// @param value Transferred value. event ContractFallbackCallFailed(address from, address to, uint256 value); /// @dev Checks that the recipient address is valid. /// @param _recipient Recipient address. modifier validRecipient(address _recipient) { require(_recipient != address(0) && _recipient != address(this), "not a valid recipient"); _; } /// @dev Creates a token and mints the whole supply for the Distribution contract. /// @param _name Token name. /// @param _symbol Token symbol. /// @param _distributionAddress The address of the deployed Distribution contract. /// @param _privateOfferingDistributionAddress The address of the PrivateOffering contract. /// @param _advisorsRewardDistributionAddress The address of the AdvisorsReward contract. constructor( string memory _name, string memory _symbol, address _distributionAddress, address _privateOfferingDistributionAddress, address _advisorsRewardDistributionAddress ) ERC20Permittable(_name, _symbol, 18) public { require( _distributionAddress.isContract() && _privateOfferingDistributionAddress.isContract() && _advisorsRewardDistributionAddress.isContract(), "not a contract address" ); uint256 supply = IDistribution(_distributionAddress).supply(); require(supply > 0, "the supply must be more than 0"); _mint(_distributionAddress, supply); distributionAddress = _distributionAddress; privateOfferingDistributionAddress = _privateOfferingDistributionAddress; advisorsRewardDistributionAddress = _advisorsRewardDistributionAddress; emit Mint(_distributionAddress, supply); } /// @dev Extends transfer method with callback. /// @param _to The address of the recipient. /// @param _value The value to transfer. /// @param _data Custom data. /// @return Success status. function transferAndCall( address _to, uint256 _value, bytes calldata _data ) external validRecipient(_to) returns (bool) { _superTransfer(_to, _value); emit Transfer(msg.sender, _to, _value, _data); if (_to.isContract()) { require(_contractFallback(msg.sender, _to, _value, _data), "contract call failed"); } return true; } /// @dev Extends transfer method with event when the callback failed. /// @param _to The address of the recipient. /// @param _value The value to transfer. /// @return Success status. function transfer(address _to, uint256 _value) public returns (bool) { _superTransfer(_to, _value); _callAfterTransfer(msg.sender, _to, _value); return true; } /// @dev This is a copy of `transfer` function which can only be called by distribution contracts. /// Made to get rid of `onTokenTransfer` calling to save gas when distributing tokens. /// @param _to The address of the recipient. /// @param _value The value to transfer. /// @return Success status. function transferDistribution(address _to, uint256 _value) public returns (bool) { require( msg.sender == distributionAddress || msg.sender == privateOfferingDistributionAddress || msg.sender == advisorsRewardDistributionAddress, "wrong sender" ); _superTransfer(_to, _value); return true; } /// @dev Extends transferFrom method with event when the callback failed. /// @param _from The address of the sender. /// @param _to The address of the recipient. /// @param _value The value to transfer. /// @return Success status. function transferFrom(address _from, address _to, uint256 _value) public returns (bool) { _superTransferFrom(_from, _to, _value); _callAfterTransfer(_from, _to, _value); return true; } /// @dev If someone sent eth/tokens to the contract mistakenly then the owner can send them back. /// @param _token The token address to transfer. /// @param _to The address of the recipient. function claimTokens(address _token, address payable _to) public onlyOwner validRecipient(_to) { if (_token == address(0)) { uint256 value = address(this).balance; if (!_to.send(value)) { // solium-disable-line security/no-send // We use the `Sacrifice` trick to be sure the coins can be 100% sent to the receiver. // Otherwise, if the receiver is a contract which has a revert in its fallback function, // the sending will fail. (new Sacrifice).value(value)(_to); } } else { ERC20 token = ERC20(_token); uint256 balance = token.balanceOf(address(this)); token.safeTransfer(_to, balance); } } /// @dev The removed implementation of the ownership renouncing. function renounceOwnership() public onlyOwner { revert("not implemented"); } /// @dev Calls transfer method and reverts if it fails. /// @param _to The address of the recipient. /// @param _value The value to transfer. function _superTransfer(address _to, uint256 _value) internal { bool success; if ( msg.sender == distributionAddress || msg.sender == privateOfferingDistributionAddress || msg.sender == advisorsRewardDistributionAddress ) { // Allow sending tokens to `address(0)` by // Distribution, PrivateOffering, or AdvisorsReward contract // since `super.transfer` doesn't allow doing that. // This is needed when the `transferDistribution` function // is called by Distribution, PrivateOffering, AdvisorsReward contract // to send tokens to `address(0)`. // See `Distribution.preInitialize`, `MultipleDistribution.burn` functions. _balances[msg.sender] = _balances[msg.sender].sub(_value); _balances[_to] = _balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); success = true; } else { success = super.transfer(_to, _value); } require(success, "transfer failed"); } /// @dev Calls transferFrom method and reverts if it fails. /// @param _from The address of the sender. /// @param _to The address of the recipient. /// @param _value The value to transfer. function _superTransferFrom(address _from, address _to, uint256 _value) internal { bool success = super.transferFrom(_from, _to, _value); require(success, "transfer failed"); } /// @dev Used by the `transfer` and `transferFrom` functions. /// In case the recipient is a contract, tries to call its `onTokenTransfer` function. /// Reverts if `onTokenTransfer` fails and the recipient is a bridge/distribution contract. /// Emits an event if `onTokenTransfer` fails and the recipient is not a bridge/distribution contract. /// Needed for reverting transfer to a bridge when the bridge doesn't accept tokens due to daily limitations, /// and to revert transfer to a distribution contract (Distribution or MultipleDistribution) /// if the contract doesn't accept tokens due to its limitations defined in `onTokenTransfer` function. /// @param _from The address of the sender. /// @param _to The address of the recipient. /// @param _value The transferred value. function _callAfterTransfer(address _from, address _to, uint256 _value) internal { if (_to.isContract() && !_contractFallback(_from, _to, _value, new bytes(0))) { require(_to != distributionAddress, "you can't transfer to Distribution contract"); require(_to != privateOfferingDistributionAddress, "you can't transfer to PrivateOffering contract"); require(_to != advisorsRewardDistributionAddress, "you can't transfer to AdvisorsReward contract"); emit ContractFallbackCallFailed(_from, _to, _value); } } /// @dev Makes a callback after the transfer of tokens. /// @param _from The address of the sender. /// @param _to The address of the recipient. /// @param _value The transferred value. /// @param _data Custom data. /// @return Success status. function _contractFallback( address _from, address _to, uint256 _value, bytes memory _data ) private returns (bool) { string memory signature = "onTokenTransfer(address,uint256,bytes)"; // solium-disable-next-line security/no-low-level-calls (bool success, ) = _to.call(abi.encodeWithSignature(signature, _from, _value, _data)); return success; } }
pragma solidity 0.5.12; contract Sacrifice { constructor(address payable _recipient) public payable { selfdestruct(_recipient); } }
pragma solidity ^0.5.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) { require(b <= a, "SafeMath: subtraction overflow"); 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-solidity/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) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); 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) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } }
pragma solidity ^0.5.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. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be aplied to your functions to restrict their use to * the owner. */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @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(isOwner(), "Ownable: caller is not the owner"); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _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 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 onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
pragma solidity ^0.5.0; import "./IERC20.sol"; /** * @dev Optional functions from the ERC20 standard. */ contract ERC20Detailed is IERC20 { string private _name; string private _symbol; uint8 private _decimals; /** * @dev Sets the values for `name`, `symbol`, and `decimals`. All three of * these values are immutable: they can only be set once during * construction. */ constructor (string memory name, string memory symbol, uint8 decimals) public { _name = name; _symbol = symbol; _decimals = decimals; } /** * @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. * * > Note that 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; } }
pragma solidity ^0.5.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ 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. * * > 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); }
pragma solidity ^0.5.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @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 ERC20;` 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)); } 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); 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. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "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"); } } }
pragma solidity ^0.5.0; /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in 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; } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 999999 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint8","name":"_pool","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Burnt","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"distribution","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"DistributionAddressSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"oldStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newStake","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ParticipantEdited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"uint256","name":"stake","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ParticipantRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"participants","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"stakes","type":"uint256[]"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ParticipantsAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"numberOfParticipants","type":"uint256"},{"indexed":false,"internalType":"address","name":"caller","type":"address"}],"name":"ParticipantsFinalized","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Withdrawn","type":"event"},{"constant":true,"inputs":[],"name":"POOL_NUMBER","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOTAL_STAKE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"_participants","type":"address[]"},{"internalType":"uint256[]","name":"_stakes","type":"uint256[]"}],"name":"addParticipants","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"distributionAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_participant","type":"address"},{"internalType":"uint256","name":"_newStake","type":"uint256"}],"name":"editParticipant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finalizeParticipants","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getParticipants","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"initialize","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isFinalized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onTokenTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"paidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"participantStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"participants","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"poolStake","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_participant","type":"address"}],"name":"removeParticipant","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"_distributionAddress","type":"address"}],"name":"setDistributionAddress","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sumOfStakes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"internalType":"contract OilerToken","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060078190556008805461ffff191690556009553480156200002657600080fd5b5060405162002a3538038062002a35833981810160405260208110156200004c57600080fd5b5051600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a38060ff1660031480620000ad57508060ff166004145b6200011957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f77726f6e6720706f6f6c206e756d626572000000000000000000000000000000604482015290519081900360640190fd5b6002805460ff191660ff8381169190911791829055166003141562000148576a0b44614f824f3b9a3000006001555b60025460ff166004141562000167576a05d86cd703244b953000006001555b506128bd80620001786000396000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d4e4083116100ee578063c4d66de811610097578063f438399e11610071578063f438399e146104ab578063fc0c546a146104c9578063fd2639a3146104d1578063fd2f404914610593576101ae565b8063c4d66de81461040c578063f1a1ce521461043f578063f2fde38b14610478576101ae565b8063a4c0ed36116100c8578063a4c0ed361461033f578063a5a259fb146103d1578063b89fc89e146103d9576101ae565b80638d4e4083146103275780638da5cb5b1461032f5780638f32d59b14610337576101ae565b80635aa68ac01161015b578063674bc1e011610135578063674bc1e0146102dc578063715018a6146102e457806371d9a35b146102ec57806373ad468a1461031f576101ae565b80635aa68ac0146102375780635fd663201461028f578063668a2001146102a9576101ae565b8063392e53cd1161018c578063392e53cd1461020b5780633ccfd60b1461022757806344df8e701461022f576101ae565b80632eace73d146101b357806335c1d349146101bd57806337fb7e2114610203575b600080fd5b6101bb6105c6565b005b6101da600480360360208110156101d357600080fd5b50356107bd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101da6107f1565b61021361080d565b604080519115158252519081900360200190f35b6101bb610816565b6101bb610a5f565b61023f610b18565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561027b578181015183820152602001610263565b505050509050019250505060405180910390f35b610297610b88565b60408051918252519081900360200190f35b6101bb600480360360208110156102bf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b8e565b610297611002565b6101bb611008565b6102976004803603602081101561030257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166110e2565b6102976110f4565b6102136110fa565b6101da611108565b610213611124565b6102136004803603606081101561035557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561039257600080fd5b8201836020820111156103a457600080fd5b803590602001918460018302840111640100000000831117156103c657600080fd5b509092509050611142565b61029761124e565b6101bb600480360360208110156103ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611254565b6101bb6004803603602081101561042257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114f2565b6101bb6004803603604081101561045557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611731565b6101bb6004803603602081101561048e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a94565b6104b3611b13565b6040805160ff9092168252519081900360200190f35b6101da611b1c565b6101bb600480360360408110156104e757600080fd5b81019060208101813564010000000081111561050257600080fd5b82018360208201111561051457600080fd5b8035906020019184602083028401116401000000008311171561053657600080fd5b91939092909160208101903564010000000081111561055457600080fd5b82018360208201111561056657600080fd5b8035906020019184602083028401116401000000008311171561058857600080fd5b509092509050611b3d565b610297600480360360208110156105a957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661212b565b6105ce611124565b61063957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff16156106b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b60006106c960095460015461213d90919063ffffffff16565b905080156107525760048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc8190555b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556004546040805191825233602083015280517f6f3873b828d9c2e343ef08a4e3442d8e976ae181d434b13807e190b24947d8b59281900390910190a150565b600481815481106107ca57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60085460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663392e53cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561087e57600080fd5b505afa158015610892573d6000803e3d6000fd5b505050506040513d60208110156108a857600080fd5b50516108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061274b6038913960400191505060405180910390fd5b60025460ff1660031415610a13576109b462069780600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a3df582a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b50519063ffffffff6121b916565b6109bc612234565b1015610a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806127f36038913960400191505060405180910390fd5b6000610a1e33612238565b604080513381526020810183905281519293507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5929081900390910190a150565b610a67611124565b610ad257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000610ade6000612238565b6040805182815290519192507f4cd1cedac1faabaf2d2d626f6caa6a7df4cf69ec7ecc3bcae2f938bdedc86071919081900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610b7d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610b52575b505050505090505b90565b60015490565b610b96611124565b610c0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff1615610c7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cfa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205480610d8c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f746865207061727469636970616e7420646f65736e2774206578697374000000604482015290519081900360640190fd5b600454600090815b81811015610df8578473ffffffffffffffffffffffffffffffffffffffff1660048281548110610dc057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415610df057809250610df8565b600101610d94565b508373ffffffffffffffffffffffffffffffffffffffff1660048381548110610e1d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610eab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f746865207061727469636970616e74206e6f7420666f756e6400000000000000604482015290519081900360640190fd5b600954610ebe908463ffffffff61213d16565b60095573ffffffffffffffffffffffffffffffffffffffff8416600090815260056020526040812081905560048054610efe90600163ffffffff61213d16565b81548110610f0857fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff9092169250829185908110610f3e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600454610f9a90600161213d565b610fa5600482612703565b506040805173ffffffffffffffffffffffffffffffffffffffff8716815260208101869052338183015290517f9bca13282fa9ca7497422db1e17fca865dc4a7a90bdee14a2f8920b3226d65ef9181900360600190a15050505050565b60015481565b611010611124565b61107b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696d706c656d656e7465640000000000000000000000000000000000604482015290519081900360640190fd5b60066020526000908152604090205481565b60075481565b600854610100900460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b600254600090610100900473ffffffffffffffffffffffffffffffffffffffff1633146111ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061282b6029913960400191505060405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff86811691161461122d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806128546035913960400191505060405180910390fd5b600754611240908563ffffffff6121b916565b600755506001949350505050565b60095481565b61125c611124565b6112c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff161561134c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f616c726561647920736574000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254604080517f9972444f00000000000000000000000000000000000000000000000000000000815260ff90921660048301525173ffffffffffffffffffffffffffffffffffffffff831691639972444f916024808301926020929190829003018186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16301461146d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f77726f6e67206164647265737300000000000000000000000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040805192909116825233602083015280517fb34182e6e5b5dda898b235fcd7dc0992ba343056d61cdb49b8aef17661669deb9281900390910190a150565b60035473ffffffffffffffffffffffffffffffffffffffff16331461157857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f77726f6e672073656e6465720000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff16156115ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b600854610100900460ff1661166057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6e6f742066696e616c697a656400000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661168057600080fd5b600280547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff841690810291909117909155600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040805191825233602083015280517f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc29281900390910190a150565b611739611124565b6117a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff161561181b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661189d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260409020548061192f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f746865207061727469636970616e7420646f65736e2774206578697374000000604482015290519081900360640190fd5b60008211611988576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806127ca6029913960400191505060405180910390fd5b6119ad826119a18360095461213d90919063ffffffff16565b9063ffffffff6121b916565b60098190556001541015611a2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e672073756d206f662076616c75657300000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660008181526005602090815260409182902085905581519283528201839052818101849052336060830152517f455e22d38aa4a567332a55e9dd1f2591281fc15643adaa234bb8e33ee495b0fc9181900360800190a1505050565b611a9c611124565b611b0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611b1081612513565b50565b60025460ff1681565b600254610100900473ffffffffffffffffffffffffffffffffffffffff1681565b611b45611124565b611bb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff1615611c2757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b828114611c9557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f646966666572656e74206172726179732073697a657300000000000000000000604482015290519081900360640190fd5b60005b83811015611fae576000858583818110611cae57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d4e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b6000838383818110611d5c57fe5b9050602002013511611db9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806127ca6029913960400191505060405180910390fd5b60056000868684818110611dc957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600014611e8f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7061727469636970616e7420616c726561647920616464656400000000000000604482015290519081900360640190fd5b6004858583818110611e9d57fe5b835460018101855560009485526020948590200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590920293909301359390931692909217905550828282818110611f0a57fe5b9050602002013560056000878785818110611f2157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fa3838383818110611f8b57fe5b905060200201356009546121b990919063ffffffff16565b600955600101611c98565b50600154600954111561202257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e672073756d206f662076616c75657300000000000000000000000000604482015290519081900360640190fd5b7f7de93abfdf8777ffc2e2a296ba07dff1fa5d760bf1e79e78acfa8e780c884e9184848484336040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201829003995090975050505050505050a150505050565b60056020526000908152604090205481565b6000828211156121ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008282018381101561222d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b4290565b60085460009060ff166122ac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a65640000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260409020548061233e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f796f7520617265206e6f742061207061727469636970616e7400000000000000604482015290519081900360640190fd5b600061236760015461235b8460075461260c90919063ffffffff16565b9063ffffffff61267f16565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260066020526040812054919250906123a290839063ffffffff61213d16565b90506000811161241357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6e6f20746f6b656e7320617661696c61626c6520746f20776974686472617700604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260066020526040902054612449908263ffffffff6121b916565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526006602090815260408083209590955560025485517f238a3fe100000000000000000000000000000000000000000000000000000000815260048101949094526024840187905294516101009095049093169363238a3fe1936044808501949193918390030190829087803b1580156124de57600080fd5b505af11580156124f2573d6000803e3d6000fd5b505050506040513d602081101561250857600080fd5b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811661257f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127836026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008261261b575060006121b3565b8282028284828161262857fe5b041461222d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127a96021913960400191505060405180910390fd5b60008082116126ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816126fa57fe5b04949350505050565b8154818355818111156127275760008381526020902061272791810190830161272c565b505050565b610b8591905b808211156127465760008155600101612732565b509056fe446973747269627574696f6e2073686f756c6420626520696e697469616c697a656420746f20656e61626c65207769746864726177616c734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865207061727469636970616e74207374616b65206d757374206265206d6f7265207468616e203050726976617465204f66666572696e67207769746864726177616c7320617265206c6f636b656420647572696e67204c4250206576656e747468652063616c6c65722063616e206f6e6c792062652074686520746f6b656e20636f6e7472616374746865205f66726f6d2076616c75652063616e206f6e6c792062652074686520646973747269627574696f6e20636f6e7472616374a265627a7a72315820259c428b47c835b20206213f6a8d660211d42a3be2d14b58de7dffd24706613a64736f6c634300050c00320000000000000000000000000000000000000000000000000000000000000004
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d4e4083116100ee578063c4d66de811610097578063f438399e11610071578063f438399e146104ab578063fc0c546a146104c9578063fd2639a3146104d1578063fd2f404914610593576101ae565b8063c4d66de81461040c578063f1a1ce521461043f578063f2fde38b14610478576101ae565b8063a4c0ed36116100c8578063a4c0ed361461033f578063a5a259fb146103d1578063b89fc89e146103d9576101ae565b80638d4e4083146103275780638da5cb5b1461032f5780638f32d59b14610337576101ae565b80635aa68ac01161015b578063674bc1e011610135578063674bc1e0146102dc578063715018a6146102e457806371d9a35b146102ec57806373ad468a1461031f576101ae565b80635aa68ac0146102375780635fd663201461028f578063668a2001146102a9576101ae565b8063392e53cd1161018c578063392e53cd1461020b5780633ccfd60b1461022757806344df8e701461022f576101ae565b80632eace73d146101b357806335c1d349146101bd57806337fb7e2114610203575b600080fd5b6101bb6105c6565b005b6101da600480360360208110156101d357600080fd5b50356107bd565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b6101da6107f1565b61021361080d565b604080519115158252519081900360200190f35b6101bb610816565b6101bb610a5f565b61023f610b18565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561027b578181015183820152602001610263565b505050509050019250505060405180910390f35b610297610b88565b60408051918252519081900360200190f35b6101bb600480360360208110156102bf57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16610b8e565b610297611002565b6101bb611008565b6102976004803603602081101561030257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166110e2565b6102976110f4565b6102136110fa565b6101da611108565b610213611124565b6102136004803603606081101561035557600080fd5b73ffffffffffffffffffffffffffffffffffffffff8235169160208101359181019060608101604082013564010000000081111561039257600080fd5b8201836020820111156103a457600080fd5b803590602001918460018302840111640100000000831117156103c657600080fd5b509092509050611142565b61029761124e565b6101bb600480360360208110156103ef57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611254565b6101bb6004803603602081101561042257600080fd5b503573ffffffffffffffffffffffffffffffffffffffff166114f2565b6101bb6004803603604081101561045557600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135611731565b6101bb6004803603602081101561048e57600080fd5b503573ffffffffffffffffffffffffffffffffffffffff16611a94565b6104b3611b13565b6040805160ff9092168252519081900360200190f35b6101da611b1c565b6101bb600480360360408110156104e757600080fd5b81019060208101813564010000000081111561050257600080fd5b82018360208201111561051457600080fd5b8035906020019184602083028401116401000000008311171561053657600080fd5b91939092909160208101903564010000000081111561055457600080fd5b82018360208201111561056657600080fd5b8035906020019184602083028401116401000000008311171561058857600080fd5b509092509050611b3d565b610297600480360360208110156105a957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661212b565b6105ce611124565b61063957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff16156106b057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b60006106c960095460015461213d90919063ffffffff16565b905080156107525760048054600181019091557f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556000805260056020527f05b8ccbb9d4d8fb16ea74ce3c29a41f1b461fbdaff4714a0d9a8eb05499746bc8190555b600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790556004546040805191825233602083015280517f6f3873b828d9c2e343ef08a4e3442d8e976ae181d434b13807e190b24947d8b59281900390910190a150565b600481815481106107ca57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b60085460ff1681565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663392e53cd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561087e57600080fd5b505afa158015610892573d6000803e3d6000fd5b505050506040513d60208110156108a857600080fd5b50516108ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603881526020018061274b6038913960400191505060405180910390fd5b60025460ff1660031415610a13576109b462069780600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a3df582a6040518163ffffffff1660e01b815260040160206040518083038186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b50519063ffffffff6121b916565b6109bc612234565b1015610a13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260388152602001806127f36038913960400191505060405180910390fd5b6000610a1e33612238565b604080513381526020810183905281519293507f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5929081900390910190a150565b610a67611124565b610ad257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000610ade6000612238565b6040805182815290519192507f4cd1cedac1faabaf2d2d626f6caa6a7df4cf69ec7ecc3bcae2f938bdedc86071919081900360200190a150565b60606004805480602002602001604051908101604052809291908181526020018280548015610b7d57602002820191906000526020600020905b815473ffffffffffffffffffffffffffffffffffffffff168152600190910190602001808311610b52575b505050505090505b90565b60015490565b610b96611124565b610c0157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff1615610c7857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8116610cfa57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526005602052604090205480610d8c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f746865207061727469636970616e7420646f65736e2774206578697374000000604482015290519081900360640190fd5b600454600090815b81811015610df8578473ffffffffffffffffffffffffffffffffffffffff1660048281548110610dc057fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff161415610df057809250610df8565b600101610d94565b508373ffffffffffffffffffffffffffffffffffffffff1660048381548110610e1d57fe5b60009182526020909120015473ffffffffffffffffffffffffffffffffffffffff1614610eab57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f746865207061727469636970616e74206e6f7420666f756e6400000000000000604482015290519081900360640190fd5b600954610ebe908463ffffffff61213d16565b60095573ffffffffffffffffffffffffffffffffffffffff8416600090815260056020526040812081905560048054610efe90600163ffffffff61213d16565b81548110610f0857fe5b6000918252602090912001546004805473ffffffffffffffffffffffffffffffffffffffff9092169250829185908110610f3e57fe5b600091825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055600454610f9a90600161213d565b610fa5600482612703565b506040805173ffffffffffffffffffffffffffffffffffffffff8716815260208101869052338183015290517f9bca13282fa9ca7497422db1e17fca865dc4a7a90bdee14a2f8920b3226d65ef9181900360600190a15050505050565b60015481565b611010611124565b61107b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696d706c656d656e7465640000000000000000000000000000000000604482015290519081900360640190fd5b60066020526000908152604090205481565b60075481565b600854610100900460ff1681565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b600254600090610100900473ffffffffffffffffffffffffffffffffffffffff1633146111ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061282b6029913960400191505060405180910390fd5b60035473ffffffffffffffffffffffffffffffffffffffff86811691161461122d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806128546035913960400191505060405180910390fd5b600754611240908563ffffffff6121b916565b600755506001949350505050565b60095481565b61125c611124565b6112c757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60035473ffffffffffffffffffffffffffffffffffffffff161561134c57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f616c726561647920736574000000000000000000000000000000000000000000604482015290519081900360640190fd5b600254604080517f9972444f00000000000000000000000000000000000000000000000000000000815260ff90921660048301525173ffffffffffffffffffffffffffffffffffffffff831691639972444f916024808301926020929190829003018186803b1580156113be57600080fd5b505afa1580156113d2573d6000803e3d6000fd5b505050506040513d60208110156113e857600080fd5b505173ffffffffffffffffffffffffffffffffffffffff16301461146d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f77726f6e67206164647265737300000000000000000000000000000000000000604482015290519081900360640190fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83811691909117918290556040805192909116825233602083015280517fb34182e6e5b5dda898b235fcd7dc0992ba343056d61cdb49b8aef17661669deb9281900390910190a150565b60035473ffffffffffffffffffffffffffffffffffffffff16331461157857604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f77726f6e672073656e6465720000000000000000000000000000000000000000604482015290519081900360640190fd5b60085460ff16156115ea57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f616c726561647920696e697469616c697a656400000000000000000000000000604482015290519081900360640190fd5b600854610100900460ff1661166057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f6e6f742066696e616c697a656400000000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661168057600080fd5b600280547fffffffffffffffffffffff0000000000000000000000000000000000000000ff1661010073ffffffffffffffffffffffffffffffffffffffff841690810291909117909155600880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040805191825233602083015280517f3cd5ec01b1ae7cfec6ca1863e2cd6aa25d6d1702825803ff2b7cc95010fffdc29281900390910190a150565b611739611124565b6117a457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff161561181b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff821661189d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260409020548061192f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f746865207061727469636970616e7420646f65736e2774206578697374000000604482015290519081900360640190fd5b60008211611988576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806127ca6029913960400191505060405180910390fd5b6119ad826119a18360095461213d90919063ffffffff16565b9063ffffffff6121b916565b60098190556001541015611a2257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e672073756d206f662076616c75657300000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff831660008181526005602090815260409182902085905581519283528201839052818101849052336060830152517f455e22d38aa4a567332a55e9dd1f2591281fc15643adaa234bb8e33ee495b0fc9181900360800190a1505050565b611a9c611124565b611b0757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611b1081612513565b50565b60025460ff1681565b600254610100900473ffffffffffffffffffffffffffffffffffffffff1681565b611b45611124565b611bb057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600854610100900460ff1615611c2757604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f616c72656164792066696e616c697a6564000000000000000000000000000000604482015290519081900360640190fd5b828114611c9557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f646966666572656e74206172726179732073697a657300000000000000000000604482015290519081900360640190fd5b60005b83811015611fae576000858583818110611cae57fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611d4e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420616464726573730000000000000000000000000000000000604482015290519081900360640190fd5b6000838383818110611d5c57fe5b9050602002013511611db9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806127ca6029913960400191505060405180910390fd5b60056000868684818110611dc957fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600014611e8f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f7061727469636970616e7420616c726561647920616464656400000000000000604482015290519081900360640190fd5b6004858583818110611e9d57fe5b835460018101855560009485526020948590200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9590920293909301359390931692909217905550828282818110611f0a57fe5b9050602002013560056000878785818110611f2157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611fa3838383818110611f8b57fe5b905060200201356009546121b990919063ffffffff16565b600955600101611c98565b50600154600954111561202257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e672073756d206f662076616c75657300000000000000000000000000604482015290519081900360640190fd5b7f7de93abfdf8777ffc2e2a296ba07dff1fa5d760bf1e79e78acfa8e780c884e9184848484336040518080602001806020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018381038352888882818152602001925060200280828437600083820152601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169091018481038352868152602090810191508790870280828437600083820152604051601f9091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016909201829003995090975050505050505050a150505050565b60056020526000908152604090205481565b6000828211156121ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b508082035b92915050565b60008282018381101561222d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b4290565b60085460009060ff166122ac57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6e6f7420696e697469616c697a65640000000000000000000000000000000000604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600560205260409020548061233e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f796f7520617265206e6f742061207061727469636970616e7400000000000000604482015290519081900360640190fd5b600061236760015461235b8460075461260c90919063ffffffff16565b9063ffffffff61267f16565b73ffffffffffffffffffffffffffffffffffffffff8516600090815260066020526040812054919250906123a290839063ffffffff61213d16565b90506000811161241357604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6e6f20746f6b656e7320617661696c61626c6520746f20776974686472617700604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff8516600090815260066020526040902054612449908263ffffffff6121b916565b73ffffffffffffffffffffffffffffffffffffffff80871660008181526006602090815260408083209590955560025485517f238a3fe100000000000000000000000000000000000000000000000000000000815260048101949094526024840187905294516101009095049093169363238a3fe1936044808501949193918390030190829087803b1580156124de57600080fd5b505af11580156124f2573d6000803e3d6000fd5b505050506040513d602081101561250857600080fd5b509095945050505050565b73ffffffffffffffffffffffffffffffffffffffff811661257f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806127836026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60008261261b575060006121b3565b8282028284828161262857fe5b041461222d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806127a96021913960400191505060405180910390fd5b60008082116126ef57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b60008284816126fa57fe5b04949350505050565b8154818355818111156127275760008381526020902061272791810190830161272c565b505050565b610b8591905b808211156127465760008155600101612732565b509056fe446973747269627574696f6e2073686f756c6420626520696e697469616c697a656420746f20656e61626c65207769746864726177616c734f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77746865207061727469636970616e74207374616b65206d757374206265206d6f7265207468616e203050726976617465204f66666572696e67207769746864726177616c7320617265206c6f636b656420647572696e67204c4250206576656e747468652063616c6c65722063616e206f6e6c792062652074686520746f6b656e20636f6e7472616374746865205f66726f6d2076616c75652063616e206f6e6c792062652074686520646973747269627574696f6e20636f6e7472616374a265627a7a72315820259c428b47c835b20206213f6a8d660211d42a3be2d14b58de7dffd24706613a64736f6c634300050c0032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000004
-----Decoded View---------------
Arg [0] : _pool (uint8): 4
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000004
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.