Overview
ETH Balance
0 ETH
ETH Value
$0.00More Info
Private Name Tags
ContractCreator
Sponsored
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 56655819 | 623 days ago | IN | 0 ETH | 0.001470046483 |
Loading...
Loading
Contract Name:
OfferFactory
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity Standard Json-Input format)
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity ^0.8.0; import "./Offer.sol"; import "./IOffer.sol"; import "./IOfferFactory.sol"; contract OfferFactory is IOfferFactory{ // It must be possible to predict the address of the offer so one can pre-fund the allowance. function predictOfferAddress(bytes32 salt, address buyer, IDraggable token, uint256 pricePerShare, IERC20 currency, uint256 quorum, uint256 votePeriod) external view returns (address) { bytes32 initCodeHash = keccak256(abi.encodePacked(type(Offer).creationCode, abi.encode(buyer, token, pricePerShare, currency, quorum, votePeriod))); bytes32 hashResult = keccak256(abi.encodePacked(bytes1(0xff), address(this), salt, initCodeHash)); return address(uint160(uint256(hashResult))); } // Do not call directly, msg.sender must be the token to be acquired function create(bytes32 salt, address buyer, uint256 pricePerShare, IERC20 currency, uint256 quorum, uint256 votePeriod) override external payable returns (IOffer) { IOffer offer = new Offer{value: msg.value, salt: salt}(buyer, IDraggable(msg.sender), pricePerShare, currency, quorum, votePeriod); return offer; } }
/** * SPDX-License-Identifier: MIT * * Copyright (c) 2016-2019 zOS Global Limited * */ pragma solidity ^0.8.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 { // Optional functions function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; import "./IOffer.sol"; interface IDraggable { function wrapped() external view returns (IERC20); function unwrap(uint256 amount) external; function offer() external view returns (IOffer); function oracle() external view returns (address); function drag(address buyer, IERC20 currency) external; function notifyOfferEnded() external; function votingPower(address voter) external returns (uint256); function totalVotingTokens() external view returns (uint256); function notifyVoted(address voter) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; interface IOffer { function makeCompetingOffer(IOffer newOffer) external; // if there is a token transfer while an offer is open, the votes get transfered too function notifyMoved(address from, address to, uint256 value) external; function currency() external view returns (IERC20); function price() external view returns (uint256); function isWellFunded() external view returns (bool); function voteYes() external; function voteNo() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; import "./IOffer.sol"; interface IOfferFactory { function create( bytes32 salt, address buyer, uint256 pricePerShare, IERC20 currency, uint256 quorum, uint256 votePeriod ) external payable returns (IOffer); }
/** * SPDX-License-Identifier: LicenseRef-Aktionariat * * MIT License with Automated License Fee Payments * * Copyright (c) 2020 Aktionariat AG (aktionariat.com) * * Permission is hereby granted to any person obtaining a copy of this software * and associated documentation files (the "Software"), to deal in the Software * without restriction, including without limitation the rights to use, copy, * modify, merge, publish, distribute, sublicense, and/or sell copies of the * Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * - The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * - All automated license fee payments integrated into this and related Software * are preserved. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ pragma solidity ^0.8.0; import "../ERC20/IERC20.sol"; import "./IDraggable.sol"; import "./IOffer.sol"; /** * @title A public offer to acquire all tokens * @author Luzius Meisser, [email protected] */ contract Offer is IOffer { address private constant LICENSE_FEE_ADDRESS = 0x29Fe8914e76da5cE2d90De98a64d0055f199d06D; uint256 private constant AQUISITION_GRACE_PERIOD = 30 days; // buyer has thirty days to complete acquisition after voting ends uint256 private constant BPS_MUL = 10000; // basis point multiplier to be used with quorum uint256 public immutable quorum; // Percentage of votes needed to start drag-along process in BPS, i.e. 10'000 = 100% IDraggable public immutable token; address public immutable buyer; // who made the offer IERC20 override public immutable currency; uint256 override public immutable price; // the price offered per share enum Vote { NONE, YES, NO } // Used internally, represents not voted yet or yes/no vote. mapping (address => Vote) private votes; // Who votes what uint256 public yesVotes; // total number of yes votes, including external votes uint256 public noVotes; // total number of no votes, including external votes uint256 public noExternal; // number of external no votes reported by oracle uint256 public yesExternal; // number of external yes votes reported by oracle uint256 public immutable voteEnd; // end of vote period in block time (seconds after 1.1.1970) event VotesChanged(uint256 yesVotes, uint256 noVotes); event OfferCreated(address indexed buyer, IDraggable indexed token, uint256 pricePerShare, IERC20 indexed currency); event OfferEnded(address indexed buyer, bool success, string message); // not sure if it makes sense to index success here // Not checked here, but buyer should make sure it is well funded from the beginning constructor( address _buyer, IDraggable _token, uint256 _price, IERC20 _currency, uint256 _quorum, uint256 _votePeriod ) payable { buyer = _buyer; token = _token; currency = _currency; price = _price; quorum = _quorum; // rely on time stamp is ok, no exact time stamp needed // solhint-disable-next-line not-rely-on-time voteEnd = block.timestamp + _votePeriod; emit OfferCreated(_buyer, _token, _price, _currency); // License Fee to Aktionariat AG, also ensures that offer is serious. // Any circumvention of this license fee payment is a violation of the copyright terms. payable(LICENSE_FEE_ADDRESS).transfer(3 ether); } function makeCompetingOffer(IOffer betterOffer) external override { require(msg.sender == address(token), "invalid caller"); require(!isAccepted(), "old already accepted"); require(currency == betterOffer.currency() && betterOffer.price() > price, "old offer better"); require(betterOffer.isWellFunded(), "not funded"); kill(false, "replaced"); } function hasExpired() internal view returns (bool) { // rely on time stamp is ok, no exact time stamp needed // solhint-disable-next-line not-rely-on-time return block.timestamp > voteEnd + AQUISITION_GRACE_PERIOD; } function contest() external { if (hasExpired()) { kill(false, "expired"); } else if (isDeclined()) { kill(false, "declined"); } else if (!isWellFunded()) { kill(false, "lack of funds"); } } function cancel() external { require(msg.sender == buyer, "invalid caller"); kill(false, "cancelled"); } function execute() external { require(msg.sender == buyer, "not buyer"); require(isAccepted(), "not accepted"); uint256 totalPrice = getTotalPrice(); require(currency.transferFrom(buyer, address(token), totalPrice), "transfer failed"); token.drag(buyer, currency); kill(true, "success"); } function getTotalPrice() internal view returns (uint256) { IERC20 tok = IERC20(address(token)); return (tok.totalSupply() - tok.balanceOf(buyer)) * price; } function isWellFunded() public view override returns (bool) { uint256 buyerBalance = currency.balanceOf(buyer); uint256 totalPrice = getTotalPrice(); return totalPrice <= buyerBalance; } function isAccepted() public view returns (bool) { if (isVotingOpen()) { // is it already clear that more than the quorum requiered will vote yes even though the vote is not over yet? return yesVotes * BPS_MUL >= quorum * token.totalVotingTokens(); } else { // did more than the quorum requiered votes say 'yes'? return yesVotes * BPS_MUL >= quorum * (yesVotes + noVotes); } } function isDeclined() public view returns (bool) { if (isVotingOpen()) { // is it already clear that 25% will vote no even though the vote is not over yet? uint256 supply = token.totalVotingTokens(); return (supply - noVotes) * BPS_MUL < quorum * supply; } else { // did quorum% of all cast votes say 'no'? return BPS_MUL * yesVotes < quorum * (yesVotes + noVotes); } } function notifyMoved(address from, address to, uint256 value) external override { require(msg.sender == address(token), "invalid caller"); if (isVotingOpen()) { Vote fromVoting = votes[from]; Vote toVoting = votes[to]; update(fromVoting, toVoting, value); } } function update(Vote previousVote, Vote newVote, uint256 votes_) internal { if (previousVote != newVote) { if (previousVote == Vote.NO) { noVotes -= votes_; } else if (previousVote == Vote.YES) { yesVotes -= votes_; } if (newVote == Vote.NO) { noVotes += votes_; } else if (newVote == Vote.YES) { yesVotes += votes_; } emit VotesChanged(yesVotes, noVotes); } } function isVotingOpen() public view returns (bool) { // rely on time stamp is ok, no exact time stamp needed // solhint-disable-next-line not-rely-on-time return block.timestamp <= voteEnd; } modifier votingOpen() { require(isVotingOpen(), "vote ended"); _; } /** * Function to allow the oracle to report the votes of external votes (e.g. shares tokenized on other blockchains). * This functions is idempotent and sets the number of external yes and no votes. So when more votes come in, the * oracle should always report the total number of yes and no votes. Abstentions are not counted. */ function reportExternalVotes(uint256 yes, uint256 no) external { require(msg.sender == token.oracle(), "not oracle"); require(yes + no + IERC20(address(token)).totalSupply() <= token.totalVotingTokens(), "too many votes"); // adjust total votes taking into account that the oralce might have reported different counts before yesVotes = yesVotes - yesExternal + yes; noVotes = noVotes - noExternal + no; // remember how the oracle voted in case the oracle later reports updated numbers yesExternal = yes; noExternal = no; } function voteYes() external override{ vote(Vote.YES); } function voteNo() external override{ vote(Vote.NO); } function vote(Vote newVote) internal votingOpen() { Vote previousVote = votes[msg.sender]; votes[msg.sender] = newVote; if(previousVote == Vote.NONE){ token.notifyVoted(msg.sender); } update(previousVote, newVote, token.votingPower(msg.sender)); } function hasVotedYes(address voter) external view returns (bool) { return votes[voter] == Vote.YES; } function hasVotedNo(address voter) external view returns (bool) { return votes[voter] == Vote.NO; } function kill(bool success, string memory message) internal { emit OfferEnded(buyer, success, message); token.notifyOfferEnded(); selfdestruct(payable(buyer)); } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 200 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"contract IERC20","name":"currency","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"votePeriod","type":"uint256"}],"name":"create","outputs":[{"internalType":"contract IOffer","name":"","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"address","name":"buyer","type":"address"},{"internalType":"contract IDraggable","name":"token","type":"address"},{"internalType":"uint256","name":"pricePerShare","type":"uint256"},{"internalType":"contract IERC20","name":"currency","type":"address"},{"internalType":"uint256","name":"quorum","type":"uint256"},{"internalType":"uint256","name":"votePeriod","type":"uint256"}],"name":"predictOfferAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b50611e8e806100206000396000f3fe6080604052600436106100295760003560e01c8063452784bc1461002e5780634dc5e4311461006a575b600080fd5b34801561003a57600080fd5b5061004e6100493660046101c7565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e610078366004610238565b61014e565b60008060405180602001610090906101a2565b601f1982820381018352601f9091011660408190526100bd908a908a908a908a908a908a90602001610294565b60408051601f19818403018152908290526100db9291602001610309565b60408051601f1981840301815282825280516020918201206001600160f81b0319828501523060601b6bffffffffffffffffffffffff19166021850152603584019c909c5260558084019c909c528151808403909c018c5260759092019052895199019890982098975050505050505050565b600080348890883389898989604051610166906101a2565b61017596959493929190610294565b82906040518091039083f591505080158015610195573d6000803e3d6000fd5b5098975050505050505050565b611b328061032783390190565b6001600160a01b03811681146101c457600080fd5b50565b600080600080600080600060e0888a0312156101e257600080fd5b8735965060208801356101f4816101af565b95506040880135610204816101af565b945060608801359350608088013561021b816101af565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060c0878903121561025157600080fd5b863595506020870135610263816101af565b945060408701359350606087013561027a816101af565b9598949750929560808101359460a0909101359350915050565b6001600160a01b0396871681529486166020860152604085019390935293166060830152608082019290925260a081019190915260c00190565b6000815160005b818110156102ef57602081850181015186830152016102d5565b818111156102fe576000828601525b509290920192915050565b600061031e61031883866102ce565b846102ce565b94935050505056fe61014060405260405162001b3238038062001b3283398101604081905262000027916200010c565b6001600160a01b0380871660c05285811660a052831660e05261010084905260808290526200005781426200017c565b610120526040518481526001600160a01b0380851691878216918916907f4f05be72ad7f57c27e555ace8452f56d8b1e82c9e6e1cd4fd282f34518b7729a9060200160405180910390a46040517329fe8914e76da5ce2d90de98a64d0055f199d06d906000906729a2241af62c00009082818181858883f19350505050158015620000e6573d6000803e3d6000fd5b50505050505050620001a3565b6001600160a01b03811681146200010957600080fd5b50565b60008060008060008060c087890312156200012657600080fd5b86516200013381620000f3565b60208801519096506200014681620000f3565b6040880151606089015191965094506200016081620000f3565b809350506080870151915060a087015190509295509295509295565b600082198211156200019e57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a05160c05160e0516101005161012051611843620002ef60003960008181610298015281816103190152818161047f0152818161085201528181610c4f015281816111db01526115ed01526000818161025501528181610f0301526110ef0152600081816102da015281816103b40152818161069e0152818161078a0152610ed10152600081816101f30152818161038701528181610582015281816106440152818161076201528181610d67015281816110a20152818161139c015261147201526000818161034e015281816104a60152818161066c015281816107b20152818161087b0152818161099a01528181610a6901528181610aeb01528181610c1001528181610ddb015281816110cd0152818161129a0152818161132401526113ff01526000818161017e0152818161052c01528181610903015261095f01526118436000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063a035b1fe116100c3578063e5a6b10f1161007c578063e5a6b10f146102d5578063ea8a1af0146102fc578063f6c8c41e14610304578063fa7f1bae14610317578063fb286c6514610340578063fc0c546a1461034957600080fd5b8063a035b1fe14610250578063b5b47f4214610277578063bd3bc1d314610280578063ddbe8f0914610293578063e1a1810f146102ba578063e3ac83da146102cd57600080fd5b80635051a5ec116101155780635051a5ec146101de57806361461954146101e65780637150d8ae146101ee5780638f1b4c6f1461022d57806390cf581c146102405780639b4e88aa1461024857600080fd5b806311a439a01461015d5780631703a01814610179578063354e5629146101a05780633f5e3e7f146101a957806341c12a70146101c1578063448ab4c6146101cb575b600080fd5b61016660045481565b6040519081526020015b60405180910390f35b6101667f000000000000000000000000000000000000000000000000000000000000000081565b61016660035481565b6101b1610370565b6040519015158152602001610170565b6101c9610436565b005b6101b16101d936600461162d565b610442565b6101b161047b565b6101c9610577565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610170565b6101b161023b36600461162d565b61083b565b6101c9610844565b6101b161084e565b6101667f000000000000000000000000000000000000000000000000000000000000000081565b61016660025481565b6101c961028e366004611651565b610998565b6101667f000000000000000000000000000000000000000000000000000000000000000081565b6101c96102c8366004611673565b610c05565b6101c9610cb1565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6101c9610d5c565b6101c961031236600461162d565b610dd0565b7f00000000000000000000000000000000000000000000000000000000000000004211156101b1565b61016660015481565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f91906116b4565b9050600061042b61108b565b919091111592915050565b61044060026111d9565b565b600060015b6001600160a01b03831660009081526020819052604090205460ff166002811115610474576104746116cd565b1492915050565b60007f00000000000000000000000000000000000000000000000000000000000000004211610567577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052691906116b4565b610550907f00000000000000000000000000000000000000000000000000000000000000006116f9565b61271060015461056091906116f9565b1015905090565b6002546001546105269190611718565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105e05760405162461bcd60e51b81526020600482015260096024820152683737ba10313abcb2b960b91b60448201526064015b60405180910390fd5b6105e861047b565b6106235760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd081858d8d95c1d195960a21b60448201526064016105d7565b600061062d61108b565b6040516323b872dd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af11580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190611730565b61074b5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016105d7565b604051637e5bcd3f60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063fcb79a7e90604401600060405180830381600087803b1580156107f657600080fd5b505af115801561080a573d6000803e3d6000fd5b505050506108386001604051806040016040528060078152602001667375636365737360c81b81525061139a565b50565b60006002610447565b61044060016111d9565b60007f000000000000000000000000000000000000000000000000000000000000000042116109495760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb91906116b4565b9050610927817f00000000000000000000000000000000000000000000000000000000000000006116f9565b612710600254836109389190611752565b61094291906116f9565b1091505090565b6002546001546109599190611718565b610983907f00000000000000000000000000000000000000000000000000000000000000006116f9565b600154610992906127106116f9565b10905090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a9190611769565b6001600160a01b0316336001600160a01b031614610a675760405162461bcd60e51b815260206004820152600a6024820152696e6f74206f7261636c6560b01b60448201526064016105d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b91906116b4565b610b758385611718565b610b7f9190611718565b1115610bbe5760405162461bcd60e51b815260206004820152600e60248201526d746f6f206d616e7920766f74657360901b60448201526064016105d7565b81600454600154610bcf9190611752565b610bd99190611718565b6001556003546002548291610bed91611752565b610bf79190611718565b600255600491909155600355565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4d5760405162461bcd60e51b81526004016105d790611786565b7f00000000000000000000000000000000000000000000000000000000000000004211610cac576001600160a01b0380841660009081526020819052604080822054928516825290205460ff9182169116610ca982828561149c565b50505b505050565b610cb96115e2565b15610ce857610440600060405180604001604052806007815260200166195e1c1a5c995960ca1b81525061139a565b610cf061084e565b15610d2057610440600060405180604001604052806008815260200167191958db1a5b995960c21b81525061139a565b610d28610370565b6104405761044060006040518060400160405280600d81526020016c6c61636b206f662066756e647360981b81525061139a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da45760405162461bcd60e51b81526004016105d790611786565b61044060006040518060400160405280600981526020016818d85b98d95b1b195960ba1b81525061139a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e185760405162461bcd60e51b81526004016105d790611786565b610e2061047b565b15610e645760405162461bcd60e51b81526020600482015260146024820152731bdb1908185b1c9958591e481858d8d95c1d195960621b60448201526064016105d7565b806001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec69190611769565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015610f8657507f0000000000000000000000000000000000000000000000000000000000000000816001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8491906116b4565b115b610fc55760405162461bcd60e51b815260206004820152601060248201526f37b6321037b33332b9103132ba3a32b960811b60448201526064016105d7565b806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611730565b6110605760405162461bcd60e51b815260206004820152600a6024820152691b9bdd08199d5b99195960b21b60448201526064016105d7565b6108386000604051806040016040528060088152602001671c995c1b1858d95960c21b81525061139a565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091908316906370a0823190602401602060405180830381865afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d91906116b4565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf91906116b4565b6111c99190611752565b6111d391906116f9565b91505090565b7f00000000000000000000000000000000000000000000000000000000000000004211156112365760405162461bcd60e51b815260206004820152600a6024820152691d9bdd1948195b99195960b21b60448201526064016105d7565b336000908152602081905260409020805460ff811691839160ff19166001836002811115611266576112666116cd565b0217905550600081600281111561127f5761127f6116cd565b14156112ff576040516345c8a62b60e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906345c8a62b90602401600060405180830381600087803b1580156112e657600080fd5b505af11580156112fa573d6000803e3d6000fd5b505050505b60405163603a39fb60e11b815233600482015261139690829084906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c07473f6906024016020604051808303816000875af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139191906116b4565b61149c565b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fba01adb1638f647e6baa43cb5d8d3a05ed7e59ac18415bf4c64adba235c5b2b083836040516113f59291906117ae565b60405180910390a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332bc320b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316ff5b8160028111156114ae576114ae6116cd565b8360028111156114c0576114c06116cd565b14610cac5760028360028111156114d9576114d96116cd565b14156114fc5780600260008282546114f19190611752565b9091555061152e9050565b6001836002811115611510576115106116cd565b141561152e5780600160008282546115289190611752565b90915550505b6002826002811115611542576115426116cd565b141561156557806002600082825461155a9190611718565b909155506115979050565b6001826002811115611579576115796116cd565b14156115975780600160008282546115919190611718565b90915550505b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c2566001546002546040516115d5929190918252602082015260400190565b60405180910390a1505050565b600061161162278d007f0000000000000000000000000000000000000000000000000000000000000000611718565b4211905090565b6001600160a01b038116811461083857600080fd5b60006020828403121561163f57600080fd5b813561164a81611618565b9392505050565b6000806040838503121561166457600080fd5b50508035926020909101359150565b60008060006060848603121561168857600080fd5b833561169381611618565b925060208401356116a381611618565b929592945050506040919091013590565b6000602082840312156116c657600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611713576117136116e3565b500290565b6000821982111561172b5761172b6116e3565b500190565b60006020828403121561174257600080fd5b8151801515811461164a57600080fd5b600082821015611764576117646116e3565b500390565b60006020828403121561177b57600080fd5b815161164a81611618565b6020808252600e908201526d34b73b30b634b21031b0b63632b960911b604082015260600190565b821515815260006020604081840152835180604085015260005b818110156117e4578581018301518582016060015282016117c8565b818111156117f6576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212209c0e5234a9af85b022b3ce5511d61d5b842027888fa9db15901a91a3aff33e3864736f6c634300080c0033a26469706673582212205b492f16e0409ae614acc3b86e02142f0c61d1349bebafe89dbe7580d786767564736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106100295760003560e01c8063452784bc1461002e5780634dc5e4311461006a575b600080fd5b34801561003a57600080fd5b5061004e6100493660046101c7565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e610078366004610238565b61014e565b60008060405180602001610090906101a2565b601f1982820381018352601f9091011660408190526100bd908a908a908a908a908a908a90602001610294565b60408051601f19818403018152908290526100db9291602001610309565b60408051601f1981840301815282825280516020918201206001600160f81b0319828501523060601b6bffffffffffffffffffffffff19166021850152603584019c909c5260558084019c909c528151808403909c018c5260759092019052895199019890982098975050505050505050565b600080348890883389898989604051610166906101a2565b61017596959493929190610294565b82906040518091039083f591505080158015610195573d6000803e3d6000fd5b5098975050505050505050565b611b328061032783390190565b6001600160a01b03811681146101c457600080fd5b50565b600080600080600080600060e0888a0312156101e257600080fd5b8735965060208801356101f4816101af565b95506040880135610204816101af565b945060608801359350608088013561021b816101af565b9699959850939692959460a0840135945060c09093013592915050565b60008060008060008060c0878903121561025157600080fd5b863595506020870135610263816101af565b945060408701359350606087013561027a816101af565b9598949750929560808101359460a0909101359350915050565b6001600160a01b0396871681529486166020860152604085019390935293166060830152608082019290925260a081019190915260c00190565b6000815160005b818110156102ef57602081850181015186830152016102d5565b818111156102fe576000828601525b509290920192915050565b600061031e61031883866102ce565b846102ce565b94935050505056fe61014060405260405162001b3238038062001b3283398101604081905262000027916200010c565b6001600160a01b0380871660c05285811660a052831660e05261010084905260808290526200005781426200017c565b610120526040518481526001600160a01b0380851691878216918916907f4f05be72ad7f57c27e555ace8452f56d8b1e82c9e6e1cd4fd282f34518b7729a9060200160405180910390a46040517329fe8914e76da5ce2d90de98a64d0055f199d06d906000906729a2241af62c00009082818181858883f19350505050158015620000e6573d6000803e3d6000fd5b50505050505050620001a3565b6001600160a01b03811681146200010957600080fd5b50565b60008060008060008060c087890312156200012657600080fd5b86516200013381620000f3565b60208801519096506200014681620000f3565b6040880151606089015191965094506200016081620000f3565b809350506080870151915060a087015190509295509295509295565b600082198211156200019e57634e487b7160e01b600052601160045260246000fd5b500190565b60805160a05160c05160e0516101005161012051611843620002ef60003960008181610298015281816103190152818161047f0152818161085201528181610c4f015281816111db01526115ed01526000818161025501528181610f0301526110ef0152600081816102da015281816103b40152818161069e0152818161078a0152610ed10152600081816101f30152818161038701528181610582015281816106440152818161076201528181610d67015281816110a20152818161139c015261147201526000818161034e015281816104a60152818161066c015281816107b20152818161087b0152818161099a01528181610a6901528181610aeb01528181610c1001528181610ddb015281816110cd0152818161129a0152818161132401526113ff01526000818161017e0152818161052c01528181610903015261095f01526118436000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063a035b1fe116100c3578063e5a6b10f1161007c578063e5a6b10f146102d5578063ea8a1af0146102fc578063f6c8c41e14610304578063fa7f1bae14610317578063fb286c6514610340578063fc0c546a1461034957600080fd5b8063a035b1fe14610250578063b5b47f4214610277578063bd3bc1d314610280578063ddbe8f0914610293578063e1a1810f146102ba578063e3ac83da146102cd57600080fd5b80635051a5ec116101155780635051a5ec146101de57806361461954146101e65780637150d8ae146101ee5780638f1b4c6f1461022d57806390cf581c146102405780639b4e88aa1461024857600080fd5b806311a439a01461015d5780631703a01814610179578063354e5629146101a05780633f5e3e7f146101a957806341c12a70146101c1578063448ab4c6146101cb575b600080fd5b61016660045481565b6040519081526020015b60405180910390f35b6101667f000000000000000000000000000000000000000000000000000000000000000081565b61016660035481565b6101b1610370565b6040519015158152602001610170565b6101c9610436565b005b6101b16101d936600461162d565b610442565b6101b161047b565b6101c9610577565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610170565b6101b161023b36600461162d565b61083b565b6101c9610844565b6101b161084e565b6101667f000000000000000000000000000000000000000000000000000000000000000081565b61016660025481565b6101c961028e366004611651565b610998565b6101667f000000000000000000000000000000000000000000000000000000000000000081565b6101c96102c8366004611673565b610c05565b6101c9610cb1565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6101c9610d5c565b6101c961031236600461162d565b610dd0565b7f00000000000000000000000000000000000000000000000000000000000000004211156101b1565b61016660015481565b6102157f000000000000000000000000000000000000000000000000000000000000000081565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f91906116b4565b9050600061042b61108b565b919091111592915050565b61044060026111d9565b565b600060015b6001600160a01b03831660009081526020819052604090205460ff166002811115610474576104746116cd565b1492915050565b60007f00000000000000000000000000000000000000000000000000000000000000004211610567577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061052691906116b4565b610550907f00000000000000000000000000000000000000000000000000000000000000006116f9565b61271060015461056091906116f9565b1015905090565b6002546001546105269190611718565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105e05760405162461bcd60e51b81526020600482015260096024820152683737ba10313abcb2b960b91b60448201526064015b60405180910390fd5b6105e861047b565b6106235760405162461bcd60e51b815260206004820152600c60248201526b1b9bdd081858d8d95c1d195960a21b60448201526064016105d7565b600061062d61108b565b6040516323b872dd60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f000000000000000000000000000000000000000000000000000000000000000081166024830152604482018390529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303816000875af11580156106e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061070d9190611730565b61074b5760405162461bcd60e51b815260206004820152600f60248201526e1d1c985b9cd9995c8819985a5b1959608a1b60448201526064016105d7565b604051637e5bcd3f60e11b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301527f0000000000000000000000000000000000000000000000000000000000000000811660248301527f0000000000000000000000000000000000000000000000000000000000000000169063fcb79a7e90604401600060405180830381600087803b1580156107f657600080fd5b505af115801561080a573d6000803e3d6000fd5b505050506108386001604051806040016040528060078152602001667375636365737360c81b81525061139a565b50565b60006002610447565b61044060016111d9565b60007f000000000000000000000000000000000000000000000000000000000000000042116109495760007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108d7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108fb91906116b4565b9050610927817f00000000000000000000000000000000000000000000000000000000000000006116f9565b612710600254836109389190611752565b61094291906116f9565b1091505090565b6002546001546109599190611718565b610983907f00000000000000000000000000000000000000000000000000000000000000006116f9565b600154610992906127106116f9565b10905090565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316637dc0d1d06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109f6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a1a9190611769565b6001600160a01b0316336001600160a01b031614610a675760405162461bcd60e51b815260206004820152600a6024820152696e6f74206f7261636c6560b01b60448201526064016105d7565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630a81b2de6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ae991906116b4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b47573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b6b91906116b4565b610b758385611718565b610b7f9190611718565b1115610bbe5760405162461bcd60e51b815260206004820152600e60248201526d746f6f206d616e7920766f74657360901b60448201526064016105d7565b81600454600154610bcf9190611752565b610bd99190611718565b6001556003546002548291610bed91611752565b610bf79190611718565b600255600491909155600355565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4d5760405162461bcd60e51b81526004016105d790611786565b7f00000000000000000000000000000000000000000000000000000000000000004211610cac576001600160a01b0380841660009081526020819052604080822054928516825290205460ff9182169116610ca982828561149c565b50505b505050565b610cb96115e2565b15610ce857610440600060405180604001604052806007815260200166195e1c1a5c995960ca1b81525061139a565b610cf061084e565b15610d2057610440600060405180604001604052806008815260200167191958db1a5b995960c21b81525061139a565b610d28610370565b6104405761044060006040518060400160405280600d81526020016c6c61636b206f662066756e647360981b81525061139a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610da45760405162461bcd60e51b81526004016105d790611786565b61044060006040518060400160405280600981526020016818d85b98d95b1b195960ba1b81525061139a565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e185760405162461bcd60e51b81526004016105d790611786565b610e2061047b565b15610e645760405162461bcd60e51b81526020600482015260146024820152731bdb1908185b1c9958591e481858d8d95c1d195960621b60448201526064016105d7565b806001600160a01b031663e5a6b10f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ea2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ec69190611769565b6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316148015610f8657507f0000000000000000000000000000000000000000000000000000000000000000816001600160a01b031663a035b1fe6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8491906116b4565b115b610fc55760405162461bcd60e51b815260206004820152601060248201526f37b6321037b33332b9103132ba3a32b960811b60448201526064016105d7565b806001600160a01b0316633f5e3e7f6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611003573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110279190611730565b6110605760405162461bcd60e51b815260206004820152600a6024820152691b9bdd08199d5b99195960b21b60448201526064016105d7565b6108386000604051806040016040528060088152602001671c995c1b1858d95960c21b81525061139a565b6040516370a0823160e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000917f000000000000000000000000000000000000000000000000000000000000000091908316906370a0823190602401602060405180830381865afa158015611139573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061115d91906116b4565b826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561119b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111bf91906116b4565b6111c99190611752565b6111d391906116f9565b91505090565b7f00000000000000000000000000000000000000000000000000000000000000004211156112365760405162461bcd60e51b815260206004820152600a6024820152691d9bdd1948195b99195960b21b60448201526064016105d7565b336000908152602081905260409020805460ff811691839160ff19166001836002811115611266576112666116cd565b0217905550600081600281111561127f5761127f6116cd565b14156112ff576040516345c8a62b60e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906345c8a62b90602401600060405180830381600087803b1580156112e657600080fd5b505af11580156112fa573d6000803e3d6000fd5b505050505b60405163603a39fb60e11b815233600482015261139690829084906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063c07473f6906024016020604051808303816000875af115801561136d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061139191906116b4565b61149c565b5050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fba01adb1638f647e6baa43cb5d8d3a05ed7e59ac18415bf4c64adba235c5b2b083836040516113f59291906117ae565b60405180910390a27f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166332bc320b6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561145857600080fd5b505af115801561146c573d6000803e3d6000fd5b505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316ff5b8160028111156114ae576114ae6116cd565b8360028111156114c0576114c06116cd565b14610cac5760028360028111156114d9576114d96116cd565b14156114fc5780600260008282546114f19190611752565b9091555061152e9050565b6001836002811115611510576115106116cd565b141561152e5780600160008282546115289190611752565b90915550505b6002826002811115611542576115426116cd565b141561156557806002600082825461155a9190611718565b909155506115979050565b6001826002811115611579576115796116cd565b14156115975780600160008282546115919190611718565b90915550505b7f8fcc50c2c4edd06d51ae66e9e21ed76b32a1766c57f491788e1aa24a1b58c2566001546002546040516115d5929190918252602082015260400190565b60405180910390a1505050565b600061161162278d007f0000000000000000000000000000000000000000000000000000000000000000611718565b4211905090565b6001600160a01b038116811461083857600080fd5b60006020828403121561163f57600080fd5b813561164a81611618565b9392505050565b6000806040838503121561166457600080fd5b50508035926020909101359150565b60008060006060848603121561168857600080fd5b833561169381611618565b925060208401356116a381611618565b929592945050506040919091013590565b6000602082840312156116c657600080fd5b5051919050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615611713576117136116e3565b500290565b6000821982111561172b5761172b6116e3565b500190565b60006020828403121561174257600080fd5b8151801515811461164a57600080fd5b600082821015611764576117646116e3565b500390565b60006020828403121561177b57600080fd5b815161164a81611618565b6020808252600e908201526d34b73b30b634b21031b0b63632b960911b604082015260600190565b821515815260006020604081840152835180604085015260005b818110156117e4578581018301518582016060015282016117c8565b818111156117f6576000606083870101525b50601f01601f19169290920160600194935050505056fea26469706673582212209c0e5234a9af85b022b3ce5511d61d5b842027888fa9db15901a91a3aff33e3864736f6c634300080c0033a26469706673582212205b492f16e0409ae614acc3b86e02142f0c61d1349bebafe89dbe7580d786767564736f6c634300080c0033
Loading...
Loading
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.