Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 549 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Redeem Reward | 19855471 | 246 days ago | IN | 0 ETH | 0.0016545 | ||||
Redeem Reward | 19458795 | 302 days ago | IN | 0 ETH | 0.00618687 | ||||
Redeem Reward | 19172258 | 342 days ago | IN | 0 ETH | 0.00248918 | ||||
Redeem Reward | 17341450 | 599 days ago | IN | 0 ETH | 0.00569754 | ||||
Redeem Reward | 17326226 | 601 days ago | IN | 0 ETH | 0.00602081 | ||||
Redeem Reward | 17323189 | 601 days ago | IN | 0 ETH | 0.01194597 | ||||
Redeem Reward | 16905759 | 660 days ago | IN | 0 ETH | 0.00614815 | ||||
Redeem Reward | 16897321 | 662 days ago | IN | 0 ETH | 0.00798292 | ||||
Redeem Reward | 16896222 | 662 days ago | IN | 0 ETH | 0.00335763 | ||||
Redeem Reward | 16886110 | 663 days ago | IN | 0 ETH | 0.00337706 | ||||
Redeem Reward | 16669280 | 694 days ago | IN | 0 ETH | 0.00413479 | ||||
Redeem Reward | 16636959 | 698 days ago | IN | 0 ETH | 0.01704808 | ||||
Redeem Reward | 16478262 | 720 days ago | IN | 0 ETH | 0.0043363 | ||||
Redeem Reward | 16339869 | 740 days ago | IN | 0 ETH | 0.0024441 | ||||
Redeem Reward | 16270941 | 749 days ago | IN | 0 ETH | 0.0037311 | ||||
Redeem Reward | 16002606 | 787 days ago | IN | 0 ETH | 0.00217235 | ||||
Redeem Reward | 15983238 | 789 days ago | IN | 0 ETH | 0.00332226 | ||||
Redeem Reward | 15960627 | 793 days ago | IN | 0 ETH | 0.00210482 | ||||
Redeem Reward | 15948857 | 794 days ago | IN | 0 ETH | 0.00340833 | ||||
Redeem Reward | 15791686 | 816 days ago | IN | 0 ETH | 0.00567148 | ||||
Redeem Reward | 15664656 | 834 days ago | IN | 0 ETH | 0.0015841 | ||||
Redeem Reward | 15517592 | 855 days ago | IN | 0 ETH | 0.00147103 | ||||
Redeem Reward | 15517592 | 855 days ago | IN | 0 ETH | 0.00137427 | ||||
Redeem Reward | 15511131 | 856 days ago | IN | 0 ETH | 0.00515682 | ||||
Redeem Reward | 15256002 | 897 days ago | IN | 0 ETH | 0.00172137 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
SGN
Compiler Version
v0.5.17+commit.d19bba13
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-27 */ // File: openzeppelin-solidity/contracts/math/SafeMath.sol pragma solidity ^0.5.0; /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on 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); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol pragma solidity ^0.5.0; /** * @title ERC20 interface * @dev see https://github.com/ethereum/EIPs/issues/20 */ interface IERC20 { function transfer(address to, uint256 value) external returns (bool); function approve(address spender, uint256 value) external returns (bool); function transferFrom(address from, address to, uint256 value) external returns (bool); function totalSupply() external view returns (uint256); function balanceOf(address who) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); } // File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol pragma solidity ^0.5.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure. * 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; function safeTransfer(IERC20 token, address to, uint256 value) internal { require(token.transfer(to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { require(token.transferFrom(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' require((value == 0) || (token.allowance(address(this), spender) == 0)); require(token.approve(spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); require(token.approve(spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value); require(token.approve(spender, newAllowance)); } } // File: openzeppelin-solidity/contracts/access/Roles.sol pragma solidity ^0.5.0; /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev give an account access to this role */ function add(Role storage role, address account) internal { require(account != address(0)); require(!has(role, account)); role.bearer[account] = true; } /** * @dev remove an account's access to this role */ function remove(Role storage role, address account) internal { require(account != address(0)); require(has(role, account)); role.bearer[account] = false; } /** * @dev check if an account has this role * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0)); return role.bearer[account]; } } // File: openzeppelin-solidity/contracts/access/roles/PauserRole.sol pragma solidity ^0.5.0; contract PauserRole { using Roles for Roles.Role; event PauserAdded(address indexed account); event PauserRemoved(address indexed account); Roles.Role private _pausers; constructor () internal { _addPauser(msg.sender); } modifier onlyPauser() { require(isPauser(msg.sender)); _; } function isPauser(address account) public view returns (bool) { return _pausers.has(account); } function addPauser(address account) public onlyPauser { _addPauser(account); } function renouncePauser() public { _removePauser(msg.sender); } function _addPauser(address account) internal { _pausers.add(account); emit PauserAdded(account); } function _removePauser(address account) internal { _pausers.remove(account); emit PauserRemoved(account); } } // File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol pragma solidity ^0.5.0; /** * @title Pausable * @dev Base contract which allows children to implement an emergency stop mechanism. */ contract Pausable is PauserRole { event Paused(address account); event Unpaused(address account); bool private _paused; constructor () internal { _paused = false; } /** * @return true if the contract is paused, false otherwise. */ function paused() public view returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. */ modifier whenNotPaused() { require(!_paused); _; } /** * @dev Modifier to make a function callable only when the contract is paused. */ modifier whenPaused() { require(_paused); _; } /** * @dev called by the owner to pause, triggers stopped state */ function pause() public onlyPauser whenNotPaused { _paused = true; emit Paused(msg.sender); } /** * @dev called by the owner to unpause, returns to normal state */ function unpause() public onlyPauser whenPaused { _paused = false; emit Unpaused(msg.sender); } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol pragma solidity ^0.5.0; /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/lib/interface/ISGN.sol pragma solidity 0.5.17; /** * @title SGN interface */ interface ISGN { // functions function updateSidechainAddr(bytes calldata _sidechainAddr) external; function subscribe(uint _amount) external; function redeemReward(bytes calldata _rewardRequest) external; // events event UpdateSidechainAddr(address indexed candidate, bytes indexed oldSidechainAddr, bytes indexed newSidechainAddr); event AddSubscriptionBalance(address indexed consumer, uint amount); event RedeemReward(address indexed receiver, uint cumulativeMiningReward, uint serviceReward, uint servicePool); } // File: contracts/lib/interface/IDPoS.sol pragma solidity 0.5.17; /** * @title DPoS interface */ interface IDPoS { enum ValidatorChangeType { Add, Removal } // functions function contributeToMiningPool(uint _amount) external; function redeemMiningReward(address _receiver, uint _cumulativeReward) external; function registerSidechain(address _addr) external; function initializeCandidate(uint _minSelfStake, uint _commissionRate, uint _rateLockEndTime) external; function announceIncreaseCommissionRate(uint _newRate, uint _newLockEndTime) external; function confirmIncreaseCommissionRate() external; function nonIncreaseCommissionRate(uint _newRate, uint _newLockEndTime) external; function updateMinSelfStake(uint256 _minSelfStake) external; function delegate(address _candidateAddr, uint _amount) external; function withdrawFromUnbondedCandidate(address _candidateAddr, uint _amount) external; function intendWithdraw(address _candidateAddr, uint _amount) external; function confirmWithdraw(address _candidateAddr) external; function claimValidator() external; function confirmUnbondedCandidate(address _candidateAddr) external; function slash(bytes calldata _penaltyRequest) external; function validateMultiSigMessage(bytes calldata _request) external returns(bool); function isValidDPoS() external view returns (bool); function isValidator(address _addr) external view returns (bool); function getValidatorNum() external view returns (uint); function getMinStakingPool() external view returns (uint); function getCandidateInfo(address _candidateAddr) external view returns (bool, uint, uint, uint, uint, uint, uint); function getDelegatorInfo(address _candidateAddr, address _delegatorAddr) external view returns (uint, uint, uint[] memory, uint[] memory); function getMinQuorumStakingPool() external view returns(uint); function getTotalValidatorStakingPool() external view returns(uint); // TODO: interface can't be inherited, so VoteType is not declared here // function voteParam(uint _proposalId, VoteType _vote) external; // function confirmParamProposal(uint _proposalId) external; // function voteSidechain(uint _proposalId, VoteType _vote) external; // function confirmSidechainProposal(uint _proposalId) external; // events event InitializeCandidate(address indexed candidate, uint minSelfStake, uint commissionRate, uint rateLockEndTime); event CommissionRateAnnouncement(address indexed candidate, uint announcedRate, uint announcedLockEndTime); event UpdateCommissionRate(address indexed candidate, uint newRate, uint newLockEndTime); event UpdateMinSelfStake(address indexed candidate, uint minSelfStake); event Delegate(address indexed delegator, address indexed candidate, uint newStake, uint stakingPool); event ValidatorChange(address indexed ethAddr, ValidatorChangeType indexed changeType); event WithdrawFromUnbondedCandidate(address indexed delegator, address indexed candidate, uint amount); event IntendWithdraw(address indexed delegator, address indexed candidate, uint withdrawAmount, uint proposedTime); event ConfirmWithdraw(address indexed delegator, address indexed candidate, uint amount); event Slash(address indexed validator, address indexed delegator, uint amount); event UpdateDelegatedStake(address indexed delegator, address indexed candidate, uint delegatorStake, uint candidatePool); event Compensate(address indexed indemnitee, uint amount); event CandidateUnbonded(address indexed candidate); event RedeemMiningReward(address indexed receiver, uint reward, uint miningPool); event MiningPoolContribution(address indexed contributor, uint contribution, uint miningPoolSize); } // File: contracts/lib/data/Pb.sol pragma solidity 0.5.17; // runtime proto sol library library Pb { enum WireType { Varint, Fixed64, LengthDelim, StartGroup, EndGroup, Fixed32 } struct Buffer { uint idx; // the start index of next read. when idx=b.length, we're done bytes b; // hold serialized proto msg, readonly } // create a new in-memory Buffer object from raw msg bytes function fromBytes(bytes memory raw) internal pure returns (Buffer memory buf) { buf.b = raw; buf.idx = 0; } // whether there are unread bytes function hasMore(Buffer memory buf) internal pure returns (bool) { return buf.idx < buf.b.length; } // decode current field number and wiretype function decKey(Buffer memory buf) internal pure returns (uint tag, WireType wiretype) { uint v = decVarint(buf); tag = v / 8; wiretype = WireType(v & 7); } // count tag occurrences, return an array due to no memory map support // have to create array for (maxtag+1) size. cnts[tag] = occurrences // should keep buf.idx unchanged because this is only a count function function cntTags(Buffer memory buf, uint maxtag) internal pure returns (uint[] memory cnts) { uint originalIdx = buf.idx; cnts = new uint[](maxtag+1); // protobuf's tags are from 1 rather than 0 uint tag; WireType wire; while (hasMore(buf)) { (tag, wire) = decKey(buf); cnts[tag] += 1; skipValue(buf, wire); } buf.idx = originalIdx; } // read varint from current buf idx, move buf.idx to next read, return the int value function decVarint(Buffer memory buf) internal pure returns (uint v) { bytes10 tmp; // proto int is at most 10 bytes (7 bits can be used per byte) bytes memory bb = buf.b; // get buf.b mem addr to use in assembly v = buf.idx; // use v to save one additional uint variable assembly { tmp := mload(add(add(bb, 32), v)) // load 10 bytes from buf.b[buf.idx] to tmp } uint b; // store current byte content v = 0; // reset to 0 for return value for (uint i=0; i<10; i++) { assembly { b := byte(i, tmp) // don't use tmp[i] because it does bound check and costs extra } v |= (b & 0x7F) << (i * 7); if (b & 0x80 == 0) { buf.idx += i + 1; return v; } } revert(); // i=10, invalid varint stream } // read length delimited field and return bytes function decBytes(Buffer memory buf) internal pure returns (bytes memory b) { uint len = decVarint(buf); uint end = buf.idx + len; require(end <= buf.b.length); // avoid overflow b = new bytes(len); bytes memory bufB = buf.b; // get buf.b mem addr to use in assembly uint bStart; uint bufBStart = buf.idx; assembly { bStart := add(b, 32) bufBStart := add(add(bufB, 32), bufBStart) } for (uint i=0; i<len; i+=32) { assembly{ mstore(add(bStart, i), mload(add(bufBStart, i))) } } buf.idx = end; } // return packed ints function decPacked(Buffer memory buf) internal pure returns (uint[] memory t) { uint len = decVarint(buf); uint end = buf.idx + len; require(end <= buf.b.length); // avoid overflow // array in memory must be init w/ known length // so we have to create a tmp array w/ max possible len first uint[] memory tmp = new uint[](len); uint i; // count how many ints are there while (buf.idx < end) { tmp[i] = decVarint(buf); i++; } t = new uint[](i); // init t with correct length for (uint j=0; j<i; j++) { t[j] = tmp[j]; } return t; } // move idx pass current value field, to beginning of next tag or msg end function skipValue(Buffer memory buf, WireType wire) internal pure { if (wire == WireType.Varint) { decVarint(buf); } else if (wire == WireType.LengthDelim) { uint len = decVarint(buf); buf.idx += len; // skip len bytes value data require(buf.idx <= buf.b.length); // avoid overflow } else { revert(); } // unsupported wiretype } // type conversion help utils function _bool(uint x) internal pure returns (bool v) { return x != 0; } function _uint256(bytes memory b) internal pure returns (uint256 v) { require(b.length <= 32); // b's length must be smaller than or equal to 32 assembly { v := mload(add(b, 32)) } // load all 32bytes to v v = v >> (8 * (32 - b.length)); // only first b.length is valid } function _address(bytes memory b) internal pure returns (address v) { v = _addressPayable(b); } function _addressPayable(bytes memory b) internal pure returns (address payable v) { require(b.length == 20); //load 32bytes then shift right 12 bytes assembly { v := div(mload(add(b, 32)), 0x1000000000000000000000000) } } function _bytes32(bytes memory b) internal pure returns (bytes32 v) { require(b.length == 32); assembly { v := mload(add(b, 32)) } } // uint[] to uint8[] function uint8s(uint[] memory arr) internal pure returns (uint8[] memory t) { t = new uint8[](arr.length); for (uint i = 0; i < t.length; i++) { t[i] = uint8(arr[i]); } } function uint32s(uint[] memory arr) internal pure returns (uint32[] memory t) { t = new uint32[](arr.length); for (uint i = 0; i < t.length; i++) { t[i] = uint32(arr[i]); } } function uint64s(uint[] memory arr) internal pure returns (uint64[] memory t) { t = new uint64[](arr.length); for (uint i = 0; i < t.length; i++) { t[i] = uint64(arr[i]); } } function bools(uint[] memory arr) internal pure returns (bool[] memory t) { t = new bool[](arr.length); for (uint i = 0; i < t.length; i++) { t[i] = arr[i]!=0; } } } // File: contracts/lib/data/PbSgn.sol // Code generated by protoc-gen-sol. DO NOT EDIT. // source: sgn.proto pragma solidity 0.5.17; library PbSgn { using Pb for Pb.Buffer; // so we can call Pb funcs on Buffer obj struct MultiSigMessage { bytes msg; // tag: 1 bytes[] sigs; // tag: 2 } // end struct MultiSigMessage function decMultiSigMessage(bytes memory raw) internal pure returns (MultiSigMessage memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint[] memory cnts = buf.cntTags(2); m.sigs = new bytes[](cnts[2]); cnts[2] = 0; // reset counter for later use uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.msg = bytes(buf.decBytes()); } else if (tag == 2) { m.sigs[cnts[2]] = bytes(buf.decBytes()); cnts[2]++; } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder MultiSigMessage struct PenaltyRequest { bytes penalty; // tag: 1 bytes[] sigs; // tag: 2 } // end struct PenaltyRequest function decPenaltyRequest(bytes memory raw) internal pure returns (PenaltyRequest memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint[] memory cnts = buf.cntTags(2); m.sigs = new bytes[](cnts[2]); cnts[2] = 0; // reset counter for later use uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.penalty = bytes(buf.decBytes()); } else if (tag == 2) { m.sigs[cnts[2]] = bytes(buf.decBytes()); cnts[2]++; } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder PenaltyRequest struct RewardRequest { bytes reward; // tag: 1 bytes[] sigs; // tag: 2 } // end struct RewardRequest function decRewardRequest(bytes memory raw) internal pure returns (RewardRequest memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint[] memory cnts = buf.cntTags(2); m.sigs = new bytes[](cnts[2]); cnts[2] = 0; // reset counter for later use uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.reward = bytes(buf.decBytes()); } else if (tag == 2) { m.sigs[cnts[2]] = bytes(buf.decBytes()); cnts[2]++; } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder RewardRequest struct Penalty { uint64 nonce; // tag: 1 uint64 expireTime; // tag: 2 address validatorAddress; // tag: 3 AccountAmtPair[] penalizedDelegators; // tag: 4 AccountAmtPair[] beneficiaries; // tag: 5 } // end struct Penalty function decPenalty(bytes memory raw) internal pure returns (Penalty memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint[] memory cnts = buf.cntTags(5); m.penalizedDelegators = new AccountAmtPair[](cnts[4]); cnts[4] = 0; // reset counter for later use m.beneficiaries = new AccountAmtPair[](cnts[5]); cnts[5] = 0; // reset counter for later use uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.nonce = uint64(buf.decVarint()); } else if (tag == 2) { m.expireTime = uint64(buf.decVarint()); } else if (tag == 3) { m.validatorAddress = Pb._address(buf.decBytes()); } else if (tag == 4) { m.penalizedDelegators[cnts[4]] = decAccountAmtPair(buf.decBytes()); cnts[4]++; } else if (tag == 5) { m.beneficiaries[cnts[5]] = decAccountAmtPair(buf.decBytes()); cnts[5]++; } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder Penalty struct AccountAmtPair { address account; // tag: 1 uint256 amt; // tag: 2 } // end struct AccountAmtPair function decAccountAmtPair(bytes memory raw) internal pure returns (AccountAmtPair memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.account = Pb._address(buf.decBytes()); } else if (tag == 2) { m.amt = Pb._uint256(buf.decBytes()); } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder AccountAmtPair struct Reward { address receiver; // tag: 1 uint256 cumulativeMiningReward; // tag: 2 uint256 cumulativeServiceReward; // tag: 3 } // end struct Reward function decReward(bytes memory raw) internal pure returns (Reward memory m) { Pb.Buffer memory buf = Pb.fromBytes(raw); uint tag; Pb.WireType wire; while (buf.hasMore()) { (tag, wire) = buf.decKey(); if (false) {} // solidity has no switch/case else if (tag == 1) { m.receiver = Pb._address(buf.decBytes()); } else if (tag == 2) { m.cumulativeMiningReward = Pb._uint256(buf.decBytes()); } else if (tag == 3) { m.cumulativeServiceReward = Pb._uint256(buf.decBytes()); } else { buf.skipValue(wire); } // skip value of unknown tag } } // end decoder Reward } // File: contracts/lib/DPoSCommon.sol pragma solidity 0.5.17; /** * @title DPoS contract common Library * @notice Common items used in DPoS contract */ library DPoSCommon { // Unbonded: not a validator and not responsible for previous validator behaviors if any. // Delegators now are free to withdraw stakes (directly). // Bonded: active validator. Delegators have to wait for slashTimeout to withdraw stakes. // Unbonding: transitional status from Bonded to Unbonded. Candidate has lost the right of // validator but is still responsible for any misbehaviour done during being validator. // Delegators should wait until candidate's unbondTime to freely withdraw stakes. enum CandidateStatus { Unbonded, Bonded, Unbonding } } // File: contracts/SGN.sol pragma solidity 0.5.17; /** * @title Sidechain contract of State Guardian Network * @notice This contract implements the mainchain logic of Celer State Guardian Network sidechain * @dev specs: https://www.celer.network/docs/celercore/sgn/sidechain.html#mainchain-contracts */ contract SGN is ISGN, Ownable, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; IERC20 public celerToken; IDPoS public dPoSContract; mapping(address => uint256) public subscriptionDeposits; uint256 public servicePool; mapping(address => uint256) public redeemedServiceReward; mapping(address => bytes) public sidechainAddrMap; /** * @notice Throws if SGN sidechain is not valid * @dev Check this before sidechain's operations */ modifier onlyValidSidechain() { require(dPoSContract.isValidDPoS(), 'DPoS is not valid'); _; } /** * @notice SGN constructor * @dev Need to deploy DPoS contract first before deploying SGN contract * @param _celerTokenAddress address of Celer Token Contract * @param _DPoSAddress address of DPoS Contract */ constructor(address _celerTokenAddress, address _DPoSAddress) public { celerToken = IERC20(_celerTokenAddress); dPoSContract = IDPoS(_DPoSAddress); } /** * @notice Owner drains one type of tokens when the contract is paused * @dev This is for emergency situations. * @param _amount drained token amount */ function drainToken(uint256 _amount) external whenPaused onlyOwner { celerToken.safeTransfer(msg.sender, _amount); } /** * @notice Update sidechain address * @dev Note that the "sidechain address" here means the address in the offchain sidechain system, which is different from the sidechain contract address * @param _sidechainAddr the new address in the offchain sidechain system */ function updateSidechainAddr(bytes calldata _sidechainAddr) external { address msgSender = msg.sender; (bool initialized, , , uint256 status, , , ) = dPoSContract.getCandidateInfo(msgSender); require( status == uint256(DPoSCommon.CandidateStatus.Unbonded), 'msg.sender is not unbonded' ); require(initialized, 'Candidate is not initialized'); bytes memory oldSidechainAddr = sidechainAddrMap[msgSender]; sidechainAddrMap[msgSender] = _sidechainAddr; emit UpdateSidechainAddr(msgSender, oldSidechainAddr, _sidechainAddr); } /** * @notice Subscribe the guardian service * @param _amount subscription fee paid along this function call in CELR tokens */ function subscribe(uint256 _amount) external whenNotPaused onlyValidSidechain { address msgSender = msg.sender; servicePool = servicePool.add(_amount); subscriptionDeposits[msgSender] = subscriptionDeposits[msgSender].add(_amount); celerToken.safeTransferFrom(msgSender, address(this), _amount); emit AddSubscriptionBalance(msgSender, _amount); } /** * @notice Redeem rewards * @dev The rewards include both the service reward and mining reward * @dev SGN contract acts as an interface for users to redeem mining rewards * @param _rewardRequest reward request bytes coded in protobuf */ function redeemReward(bytes calldata _rewardRequest) external whenNotPaused onlyValidSidechain { require( dPoSContract.validateMultiSigMessage(_rewardRequest), 'Validator sigs verification failed' ); PbSgn.RewardRequest memory rewardRequest = PbSgn.decRewardRequest(_rewardRequest); PbSgn.Reward memory reward = PbSgn.decReward(rewardRequest.reward); uint256 newServiceReward = reward.cumulativeServiceReward.sub( redeemedServiceReward[reward.receiver] ); require(servicePool >= newServiceReward, 'Service pool is smaller than new service reward'); redeemedServiceReward[reward.receiver] = reward.cumulativeServiceReward; servicePool = servicePool.sub(newServiceReward); dPoSContract.redeemMiningReward(reward.receiver, reward.cumulativeMiningReward); celerToken.safeTransfer(reward.receiver, newServiceReward); emit RedeemReward( reward.receiver, reward.cumulativeMiningReward, newServiceReward, servicePool ); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_celerTokenAddress","type":"address"},{"internalType":"address","name":"_DPoSAddress","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"consumer","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AddSubscriptionBalance","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PauserRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"cumulativeMiningReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"serviceReward","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"servicePool","type":"uint256"}],"name":"RedeemReward","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"candidate","type":"address"},{"indexed":true,"internalType":"bytes","name":"oldSidechainAddr","type":"bytes"},{"indexed":true,"internalType":"bytes","name":"newSidechainAddr","type":"bytes"}],"name":"UpdateSidechainAddr","type":"event"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addPauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"celerToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"dPoSContract","outputs":[{"internalType":"contract IDPoS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"drainToken","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_rewardRequest","type":"bytes"}],"name":"redeemReward","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"redeemedServiceReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renouncePauser","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"servicePool","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"sidechainAddrMap","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"subscribe","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"subscriptionDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"_sidechainAddr","type":"bytes"}],"name":"updateSidechainAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620019da380380620019da833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633178082556040516001600160a01b039190911691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36200009d336001600160e01b03620000d816565b600280546001600160a81b0319166101006001600160a01b0394851602179055600380546001600160a01b03191691909216179055620001b9565b620000f38160016200012a60201b620015cf1790919060201c565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b0381166200013e57600080fd5b6200015382826001600160e01b036200018316565b156200015e57600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b60006001600160a01b0382166200019957600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61181180620001c96000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806382dc1ec4116100ad578063c6c21e9d11610071578063c6c21e9d146102f7578063e02f39bd146102ff578063e27b41101461036f578063e42a06c81461040a578063f2fde38b146104125761012c565b806382dc1ec4146102935780638456cb59146102b95780638da5cb5b146102c15780638f32d59b146102c9578063c57f6661146102d15761012c565b806346fbf68e116100f457806346fbf68e146101d15780635c975abb1461020b5780636ef8d66d14610213578063715018a61461021b57806373a6e450146102235761012c565b80630f574ba714610131578063145aa116146101505780631e77733a1461016d578063291a3eb2146101a55780633f4ba83a146101c9575b600080fd5b61014e6004803603602081101561014757600080fd5b5035610438565b005b61014e6004803603602081101561016657600080fd5b50356105c4565b6101936004803603602081101561018357600080fd5b50356001600160a01b0316610603565b60408051918252519081900360200190f35b6101ad610615565b604080516001600160a01b039092168252519081900360200190f35b61014e610624565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b0316610684565b604080519115158252519081900360200190f35b6101f761069f565b61014e6106a9565b61014e6106b4565b61014e6004803603602081101561023957600080fd5b81019060208101813564010000000081111561025457600080fd5b82018360208201111561026657600080fd5b8035906020019184600183028401116401000000008311171561028857600080fd5b50909250905061070f565b61014e600480360360208110156102a957600080fd5b50356001600160a01b0316610ab1565b61014e610acc565b6101ad610b30565b6101f7610b3f565b610193600480360360208110156102e757600080fd5b50356001600160a01b0316610b50565b6101ad610b62565b61014e6004803603602081101561031557600080fd5b81019060208101813564010000000081111561033057600080fd5b82018360208201111561034257600080fd5b8035906020019184600183028401116401000000008311171561036457600080fd5b509092509050610b76565b6103956004803603602081101561038557600080fd5b50356001600160a01b0316610e23565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103cf5781810151838201526020016103b7565b50505050905090810190601f1680156103fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610193610ebe565b61014e6004803603602081101561042857600080fd5b50356001600160a01b0316610ec4565b60025460ff161561044857600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561049657600080fd5b505afa1580156104aa573d6000803e3d6000fd5b505050506040513d60208110156104c057600080fd5b5051610507576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600554339061051c908363ffffffff610ede16565b6005556001600160a01b038116600090815260046020526040902054610548908363ffffffff610ede16565b6001600160a01b03808316600090815260046020526040902091909155600254610581916101009091041682308563ffffffff610ef716565b6040805183815290516001600160a01b038316917fac095ced75d400384d8404a37883183a56b937b8ff8195fa0c52c3ccc8bb8a49919081900360200190a25050565b60025460ff166105d357600080fd5b6105db610b3f565b6105e457600080fd5b6002546106009061010090046001600160a01b03163383610f8d565b50565b60046020526000908152604090205481565b6003546001600160a01b031681565b61062d33610684565b61063657600080fd5b60025460ff1661064557600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061069760018363ffffffff61102716565b90505b919050565b60025460ff165b90565b6106b23361105c565b565b6106bc610b3f565b6106c557600080fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025460ff161561071f57600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d602081101561079757600080fd5b50516107de576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600354604051631c0efd9d60e01b8152602060048201908152602482018490526001600160a01b0390921691631c0efd9d91859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506040513d602081101561087f57600080fd5b50516108bc5760405162461bcd60e51b815260040180806020018281038252602281526020018061178c6022913960400191505060405180910390fd5b6108c4611695565b61090383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110a492505050565b905061090d6116af565b8151610918906111fb565b80516001600160a01b03166000908152600660205260408082205490830151929350909161094b9163ffffffff6112c016565b905080600554101561098e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806117ae602f913960400191505060405180910390fd5b60408083015183516001600160a01b03166000908152600660205291909120556005546109c1908263ffffffff6112c016565b6005556003548251602084015160408051630fbd844360e11b81526001600160a01b0393841660048201526024810192909252519190921691631f7b088691604480830192600092919082900301818387803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b50508351600254610a56935061010090046001600160a01b0316915083610f8d565b8151602080840151600554604080519283529282018590528183015290516001600160a01b03909216917f09251621f2e88c5e7f8df91fe1d9e9a70610e20e122945470fddd48af05104269181900360600190a25050505050565b610aba33610684565b610ac357600080fd5b610600816112d5565b610ad533610684565b610ade57600080fd5b60025460ff1615610aee57600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60066020526000908152604090205481565b60025461010090046001600160a01b031681565b600354604080516328bde1e160e01b815233600482018190529151919260009283926001600160a01b03909216916328bde1e19160248083019260e0929190829003018186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d60e0811015610bf357600080fd5b50805160609091015190925090508015610c54576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e646572206973206e6f7420756e626f6e646564000000000000604482015290519081900360640190fd5b81610ca6576040805162461bcd60e51b815260206004820152601c60248201527f43616e646964617465206973206e6f7420696e697469616c697a656400000000604482015290519081900360640190fd5b6001600160a01b03831660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050506001600160a01b0386166000908152600760205260409020919250610d7191905087876116d9565b5085856040518083838082843760405192018290038220865190955086945091925082916020850191508083835b60208310610dbe5780518252601f199092019160209182019101610d9f565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03881691507f16de3299ab034ce7e21b22d55f4f9a1474bd3c4d20dbd1cc9bcd39c1ad3d5a2c90600090a4505050505050565b60076020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b505050505081565b60055481565b610ecc610b3f565b610ed557600080fd5b6106008161131d565b600082820183811015610ef057600080fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b505050506040513d6020811015610f7c57600080fd5b5051610f8757600080fd5b50505050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b505161102257600080fd5b505050565b60006001600160a01b03821661103c57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61106d60018263ffffffff61138b16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6110ac611695565b6110b4611757565b6110bd836113d3565b905060606110d282600263ffffffff6113ea16565b9050806002815181106110e157fe5b602002602001015160405190808252806020026020018201604052801561111c57816020015b60608152602001906001900390816111075790505b50836020018190525060008160028151811061113457fe5b6020026020010181815250506000805b61114d8461147a565b156111f25761115b84611486565b9092509050816001141561117957611172846114b3565b85526111ed565b81600214156111dd5761118b846114b3565b85602001518460028151811061119d57fe5b6020026020010151815181106111af57fe5b6020026020010181905250826002815181106111c757fe5b60209081029190910101805160010190526111ed565b6111ed848263ffffffff61154016565b611144565b50505050919050565b6112036116af565b61120b611757565b611214836113d3565b90506000805b6112238361147a565b156112b85761123183611486565b909250905081600114156112605761125061124b846114b3565b6115a1565b6001600160a01b031684526112b3565b81600214156112845761127a611275846114b3565b6115ac565b60208501526112b3565b81600314156112a357611299611275846114b3565b60408501526112b3565b6112b3838263ffffffff61154016565b61121a565b505050919050565b6000828211156112cf57600080fd5b50900390565b6112e660018263ffffffff6115cf16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b03811661133057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661139e57600080fd5b6113a88282611027565b6113b157600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6113db611757565b60208101919091526000815290565b81516040805160018401808252602080820283010190925260609291801561141c578160200160208202803883390190505b5091506000805b61142c8661147a565b156114715761143a86611486565b8092508193505050600184838151811061145057fe5b60200260200101818151019150818152505061146c8682611540565b611423565b50509092525090565b60208101515190511090565b60008060006114948461161b565b90506008810492508060071660058111156114ab57fe5b915050915091565b606060006114c08361161b565b83516020850151519192508201908111156114da57600080fd5b816040519080825280601f01601f191660200182016040528015611505576020820181803883390190505b50602080860151865192955091818601919083010160005b8581101561153557818101518382015260200161151d565b505050935250919050565b600081600581111561154e57fe5b14156115635761155d8261161b565b5061159d565b600281600581111561157157fe5b141561012c5760006115828361161b565b83518101808552602085015151919250111561155d57600080fd5b5050565b600061069782611676565b60006020825111156115bd57600080fd5b50602081810151915160089103021c90565b6001600160a01b0381166115e257600080fd5b6115ec8282611027565b156115f657600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b602080820151825181019091015160009182805b600a8110156116705783811a91508060070282607f16901b8517945081608016600014156116685785510160010185525061069a915050565b60010161162f565b50600080fd5b6000815160141461168657600080fd5b5060200151600160601b900490565b604051806040016040528060608152602001606081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061171a5782800160ff19823516178555611747565b82800160010185558215611747579182015b8281111561174757823582559160200191906001019061172c565b50611753929150611771565b5090565b604051806040016040528060008152602001606081525090565b6106a691905b80821115611753576000815560010161177756fe56616c696461746f72207369677320766572696669636174696f6e206661696c65645365727669636520706f6f6c20697320736d616c6c6572207468616e206e6577207365727669636520726577617264a265627a7a723158200ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a64736f6c634300051100320000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c6670000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806382dc1ec4116100ad578063c6c21e9d11610071578063c6c21e9d146102f7578063e02f39bd146102ff578063e27b41101461036f578063e42a06c81461040a578063f2fde38b146104125761012c565b806382dc1ec4146102935780638456cb59146102b95780638da5cb5b146102c15780638f32d59b146102c9578063c57f6661146102d15761012c565b806346fbf68e116100f457806346fbf68e146101d15780635c975abb1461020b5780636ef8d66d14610213578063715018a61461021b57806373a6e450146102235761012c565b80630f574ba714610131578063145aa116146101505780631e77733a1461016d578063291a3eb2146101a55780633f4ba83a146101c9575b600080fd5b61014e6004803603602081101561014757600080fd5b5035610438565b005b61014e6004803603602081101561016657600080fd5b50356105c4565b6101936004803603602081101561018357600080fd5b50356001600160a01b0316610603565b60408051918252519081900360200190f35b6101ad610615565b604080516001600160a01b039092168252519081900360200190f35b61014e610624565b6101f7600480360360208110156101e757600080fd5b50356001600160a01b0316610684565b604080519115158252519081900360200190f35b6101f761069f565b61014e6106a9565b61014e6106b4565b61014e6004803603602081101561023957600080fd5b81019060208101813564010000000081111561025457600080fd5b82018360208201111561026657600080fd5b8035906020019184600183028401116401000000008311171561028857600080fd5b50909250905061070f565b61014e600480360360208110156102a957600080fd5b50356001600160a01b0316610ab1565b61014e610acc565b6101ad610b30565b6101f7610b3f565b610193600480360360208110156102e757600080fd5b50356001600160a01b0316610b50565b6101ad610b62565b61014e6004803603602081101561031557600080fd5b81019060208101813564010000000081111561033057600080fd5b82018360208201111561034257600080fd5b8035906020019184600183028401116401000000008311171561036457600080fd5b509092509050610b76565b6103956004803603602081101561038557600080fd5b50356001600160a01b0316610e23565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103cf5781810151838201526020016103b7565b50505050905090810190601f1680156103fc5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610193610ebe565b61014e6004803603602081101561042857600080fd5b50356001600160a01b0316610ec4565b60025460ff161561044857600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561049657600080fd5b505afa1580156104aa573d6000803e3d6000fd5b505050506040513d60208110156104c057600080fd5b5051610507576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600554339061051c908363ffffffff610ede16565b6005556001600160a01b038116600090815260046020526040902054610548908363ffffffff610ede16565b6001600160a01b03808316600090815260046020526040902091909155600254610581916101009091041682308563ffffffff610ef716565b6040805183815290516001600160a01b038316917fac095ced75d400384d8404a37883183a56b937b8ff8195fa0c52c3ccc8bb8a49919081900360200190a25050565b60025460ff166105d357600080fd5b6105db610b3f565b6105e457600080fd5b6002546106009061010090046001600160a01b03163383610f8d565b50565b60046020526000908152604090205481565b6003546001600160a01b031681565b61062d33610684565b61063657600080fd5b60025460ff1661064557600080fd5b6002805460ff191690556040805133815290517f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa9181900360200190a1565b600061069760018363ffffffff61102716565b90505b919050565b60025460ff165b90565b6106b23361105c565b565b6106bc610b3f565b6106c557600080fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b60025460ff161561071f57600080fd5b600360009054906101000a90046001600160a01b03166001600160a01b031663eab2ed8c6040518163ffffffff1660e01b815260040160206040518083038186803b15801561076d57600080fd5b505afa158015610781573d6000803e3d6000fd5b505050506040513d602081101561079757600080fd5b50516107de576040805162461bcd60e51b815260206004820152601160248201527011141bd4c81a5cc81b9bdd081d985b1a59607a1b604482015290519081900360640190fd5b600354604051631c0efd9d60e01b8152602060048201908152602482018490526001600160a01b0390921691631c0efd9d91859185918190604401848480828437600081840152601f19601f8201169050808301925050509350505050602060405180830381600087803b15801561085557600080fd5b505af1158015610869573d6000803e3d6000fd5b505050506040513d602081101561087f57600080fd5b50516108bc5760405162461bcd60e51b815260040180806020018281038252602281526020018061178c6022913960400191505060405180910390fd5b6108c4611695565b61090383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506110a492505050565b905061090d6116af565b8151610918906111fb565b80516001600160a01b03166000908152600660205260408082205490830151929350909161094b9163ffffffff6112c016565b905080600554101561098e5760405162461bcd60e51b815260040180806020018281038252602f8152602001806117ae602f913960400191505060405180910390fd5b60408083015183516001600160a01b03166000908152600660205291909120556005546109c1908263ffffffff6112c016565b6005556003548251602084015160408051630fbd844360e11b81526001600160a01b0393841660048201526024810192909252519190921691631f7b088691604480830192600092919082900301818387803b158015610a2057600080fd5b505af1158015610a34573d6000803e3d6000fd5b50508351600254610a56935061010090046001600160a01b0316915083610f8d565b8151602080840151600554604080519283529282018590528183015290516001600160a01b03909216917f09251621f2e88c5e7f8df91fe1d9e9a70610e20e122945470fddd48af05104269181900360600190a25050505050565b610aba33610684565b610ac357600080fd5b610600816112d5565b610ad533610684565b610ade57600080fd5b60025460ff1615610aee57600080fd5b6002805460ff191660011790556040805133815290517f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2589181900360200190a1565b6000546001600160a01b031690565b6000546001600160a01b0316331490565b60066020526000908152604090205481565b60025461010090046001600160a01b031681565b600354604080516328bde1e160e01b815233600482018190529151919260009283926001600160a01b03909216916328bde1e19160248083019260e0929190829003018186803b158015610bc957600080fd5b505afa158015610bdd573d6000803e3d6000fd5b505050506040513d60e0811015610bf357600080fd5b50805160609091015190925090508015610c54576040805162461bcd60e51b815260206004820152601a60248201527f6d73672e73656e646572206973206e6f7420756e626f6e646564000000000000604482015290519081900360640190fd5b81610ca6576040805162461bcd60e51b815260206004820152601c60248201527f43616e646964617465206973206e6f7420696e697469616c697a656400000000604482015290519081900360640190fd5b6001600160a01b03831660009081526007602090815260409182902080548351601f6002600019610100600186161502019093169290920491820184900484028101840190945280845260609392830182828015610d455780601f10610d1a57610100808354040283529160200191610d45565b820191906000526020600020905b815481529060010190602001808311610d2857829003601f168201915b505050506001600160a01b0386166000908152600760205260409020919250610d7191905087876116d9565b5085856040518083838082843760405192018290038220865190955086945091925082916020850191508083835b60208310610dbe5780518252601f199092019160209182019101610d9f565b5181516020939093036101000a6000190180199091169216919091179052604051920182900382209350506001600160a01b03881691507f16de3299ab034ce7e21b22d55f4f9a1474bd3c4d20dbd1cc9bcd39c1ad3d5a2c90600090a4505050505050565b60076020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610eb65780601f10610e8b57610100808354040283529160200191610eb6565b820191906000526020600020905b815481529060010190602001808311610e9957829003601f168201915b505050505081565b60055481565b610ecc610b3f565b610ed557600080fd5b6106008161131d565b600082820183811015610ef057600080fd5b9392505050565b604080516323b872dd60e01b81526001600160a01b0385811660048301528481166024830152604482018490529151918616916323b872dd916064808201926020929091908290030181600087803b158015610f5257600080fd5b505af1158015610f66573d6000803e3d6000fd5b505050506040513d6020811015610f7c57600080fd5b5051610f8757600080fd5b50505050565b826001600160a01b031663a9059cbb83836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015610fed57600080fd5b505af1158015611001573d6000803e3d6000fd5b505050506040513d602081101561101757600080fd5b505161102257600080fd5b505050565b60006001600160a01b03821661103c57600080fd5b506001600160a01b03166000908152602091909152604090205460ff1690565b61106d60018263ffffffff61138b16565b6040516001600160a01b038216907fcd265ebaf09df2871cc7bd4133404a235ba12eff2041bb89d9c714a2621c7c7e90600090a250565b6110ac611695565b6110b4611757565b6110bd836113d3565b905060606110d282600263ffffffff6113ea16565b9050806002815181106110e157fe5b602002602001015160405190808252806020026020018201604052801561111c57816020015b60608152602001906001900390816111075790505b50836020018190525060008160028151811061113457fe5b6020026020010181815250506000805b61114d8461147a565b156111f25761115b84611486565b9092509050816001141561117957611172846114b3565b85526111ed565b81600214156111dd5761118b846114b3565b85602001518460028151811061119d57fe5b6020026020010151815181106111af57fe5b6020026020010181905250826002815181106111c757fe5b60209081029190910101805160010190526111ed565b6111ed848263ffffffff61154016565b611144565b50505050919050565b6112036116af565b61120b611757565b611214836113d3565b90506000805b6112238361147a565b156112b85761123183611486565b909250905081600114156112605761125061124b846114b3565b6115a1565b6001600160a01b031684526112b3565b81600214156112845761127a611275846114b3565b6115ac565b60208501526112b3565b81600314156112a357611299611275846114b3565b60408501526112b3565b6112b3838263ffffffff61154016565b61121a565b505050919050565b6000828211156112cf57600080fd5b50900390565b6112e660018263ffffffff6115cf16565b6040516001600160a01b038216907f6719d08c1888103bea251a4ed56406bd0c3e69723c8a1686e017e7bbe159b6f890600090a250565b6001600160a01b03811661133057600080fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b03811661139e57600080fd5b6113a88282611027565b6113b157600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6113db611757565b60208101919091526000815290565b81516040805160018401808252602080820283010190925260609291801561141c578160200160208202803883390190505b5091506000805b61142c8661147a565b156114715761143a86611486565b8092508193505050600184838151811061145057fe5b60200260200101818151019150818152505061146c8682611540565b611423565b50509092525090565b60208101515190511090565b60008060006114948461161b565b90506008810492508060071660058111156114ab57fe5b915050915091565b606060006114c08361161b565b83516020850151519192508201908111156114da57600080fd5b816040519080825280601f01601f191660200182016040528015611505576020820181803883390190505b50602080860151865192955091818601919083010160005b8581101561153557818101518382015260200161151d565b505050935250919050565b600081600581111561154e57fe5b14156115635761155d8261161b565b5061159d565b600281600581111561157157fe5b141561012c5760006115828361161b565b83518101808552602085015151919250111561155d57600080fd5b5050565b600061069782611676565b60006020825111156115bd57600080fd5b50602081810151915160089103021c90565b6001600160a01b0381166115e257600080fd5b6115ec8282611027565b156115f657600080fd5b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b602080820151825181019091015160009182805b600a8110156116705783811a91508060070282607f16901b8517945081608016600014156116685785510160010185525061069a915050565b60010161162f565b50600080fd5b6000815160141461168657600080fd5b5060200151600160601b900490565b604051806040016040528060608152602001606081525090565b604051806060016040528060006001600160a01b0316815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061171a5782800160ff19823516178555611747565b82800160010185558215611747579182015b8281111561174757823582559160200191906001019061172c565b50611753929150611771565b5090565b604051806040016040528060008152602001606081525090565b6106a691905b80821115611753576000815560010161177756fe56616c696461746f72207369677320766572696669636174696f6e206661696c65645365727669636520706f6f6c20697320736d616c6c6572207468616e206e6577207365727669636520726577617264a265627a7a723158200ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a64736f6c63430005110032
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c6670000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82
-----Decoded View---------------
Arg [0] : _celerTokenAddress (address): 0x4F9254C83EB525f9FCf346490bbb3ed28a81C667
Arg [1] : _DPoSAddress (address): 0x5216Db4d4cB22d1BA38866867c38d8E862974E82
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f9254c83eb525f9fcf346490bbb3ed28a81c667
Arg [1] : 0000000000000000000000005216db4d4cb22d1ba38866867c38d8e862974e82
Deployed Bytecode Sourcemap
28962:4312:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28962:4312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31452:402;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;31452:402:0;;:::i;:::-;;30218:130;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;30218:130:0;;:::i;29140:55::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29140:55:0;-1:-1:-1;;;;;29140:55:0;;:::i;:::-;;;;;;;;;;;;;;;;29108:25;;;:::i;:::-;;;;-1:-1:-1;;;;;29108:25:0;;;;;;;;;;;;;;7832:118;;;:::i;6010:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6010:109:0;-1:-1:-1;;;;;6010:109:0;;:::i;:::-;;;;;;;;;;;;;;;;;;7085:78;;;:::i;6227:77::-;;;:::i;9419:140::-;;;:::i;32137:1134::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;32137:1134:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;32137:1134:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;32137:1134:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;32137:1134:0;;-1:-1:-1;32137:1134:0;-1:-1:-1;32137:1134:0;:::i;6127:92::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;6127:92:0;-1:-1:-1;;;;;6127:92:0;;:::i;7621:116::-;;;:::i;8706:79::-;;;:::i;9041:92::-;;;:::i;29235:56::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29235:56:0;-1:-1:-1;;;;;29235:56:0;;:::i;29077:24::-;;;:::i;30663:631::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;30663:631:0;;;;;;;;21:11:-1;5:28;;2:2;;;46:1;43;36:12;2:2;30663:631:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;30663:631:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;30663:631:0;;-1:-1:-1;30663:631:0;-1:-1:-1;30663:631:0;:::i;29298:49::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29298:49:0;-1:-1:-1;;;;;29298:49:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;29298:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29202:26;;;:::i;9736:109::-;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;9736:109:0;-1:-1:-1;;;;;9736:109:0;;:::i;31452:402::-;7322:7;;;;7321:8;7313:17;;;;;;29530:12;;;;;;;;;-1:-1:-1;;;;;29530:12:0;-1:-1:-1;;;;;29530:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29530:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29530:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29530:26:0;29522:56;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;;;;31598:11;;31561:10;;31598:24;;31614:7;31598:24;:15;:24;:::i;:::-;31584:11;:38;-1:-1:-1;;;;;31667:31:0;;;;;;:20;:31;;;;;;:44;;31703:7;31667:44;:35;:44;:::i;:::-;-1:-1:-1;;;;;31633:31:0;;;;;;;:20;:31;;;;;:78;;;;31724:10;;:62;;:10;;;;;31654:9;31771:4;31778:7;31724:62;:27;:62;:::i;:::-;31804:42;;;;;;;;-1:-1:-1;;;;;31804:42:0;;;;;;;;;;;;;29589:1;31452:402;:::o;30218:130::-;7501:7;;;;7493:16;;;;;;8918:9;:7;:9::i;:::-;8910:18;;;;;;30296:10;;:44;;:10;;;-1:-1:-1;;;;;30296:10:0;30320;30332:7;30296:23;:44::i;:::-;30218:130;:::o;29140:55::-;;;;;;;;;;;;;:::o;29108:25::-;;;-1:-1:-1;;;;;29108:25:0;;:::o;7832:118::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;7501:7;;;;7493:16;;;;;;7891:7;:15;;-1:-1:-1;;7891:15:0;;;7922:20;;;7931:10;7922:20;;;;;;;;;;;;;7832:118::o;6010:109::-;6066:4;6090:21;:8;6103:7;6090:21;:12;:21;:::i;:::-;6083:28;;6010:109;;;;:::o;7085:78::-;7148:7;;;;7085:78;;:::o;6227:77::-;6271:25;6285:10;6271:13;:25::i;:::-;6227:77::o;9419:140::-;8918:9;:7;:9::i;:::-;8910:18;;;;;;9518:1;9502:6;;9481:40;;-1:-1:-1;;;;;9502:6:0;;;;9481:40;;9518:1;;9481:40;9549:1;9532:19;;-1:-1:-1;;;;;;9532:19:0;;;9419:140::o;32137:1134::-;7322:7;;;;7321:8;7313:17;;;;;;29530:12;;;;;;;;;-1:-1:-1;;;;;29530:12:0;-1:-1:-1;;;;;29530:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;29530:26:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29530:26:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;29530:26:0;29522:56;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;-1:-1:-1;;;29522:56:0;;;;;;;;;;;;;;;32265:12;;:52;;-1:-1:-1;;;32265:52:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;32265:12:0;;;;:36;;32302:14;;;;32265:52;;;;32302:14;;;;32265:52;1:33:-1;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;32265:52:0;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;32265:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;32265:52:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;32265:52:0;32243:136;;;;-1:-1:-1;;;32243:136:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32392:40;;:::i;:::-;32435:38;32458:14;;32435:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;32435:22:0;;-1:-1:-1;;;32435:38:0:i;:::-;32392:81;;32484:26;;:::i;:::-;32529:20;;32513:37;;:15;:37::i;:::-;32659:15;;-1:-1:-1;;;;;32637:38:0;32561:24;32637:38;;;:21;:38;;;;;;;32588:30;;;;32484:66;;-1:-1:-1;32561:24:0;;32588:98;;;:34;:98;:::i;:::-;32561:125;;32722:16;32707:11;;:31;;32699:91;;;;-1:-1:-1;;;32699:91:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32842:30;;;;;32823:15;;-1:-1:-1;;;;;32801:38:0;;;;;:21;:38;;;;;;:71;32897:11;;:33;;32913:16;32897:33;:15;:33;:::i;:::-;32883:11;:47;32943:12;;32975:15;;32992:29;;;;32943:79;;;-1:-1:-1;;;32943:79:0;;-1:-1:-1;;;;;32943:79:0;;;;;;;;;;;;;;;:12;;;;;:31;;:79;;;;;:12;;:79;;;;;;;:12;;:79;;;5:2:-1;;;;30:1;27;20:12;5:2;32943:79:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;33057:15:0;;33033:10;;:58;;-1:-1:-1;33033:10:0;;;-1:-1:-1;;;;;33033:10:0;;-1:-1:-1;33074:16:0;33033:23;:58::i;:::-;33136:15;;33166:29;;;;;33241:11;;33109:154;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;33109:154:0;;;;;;;;;;;;;29589:1;;;32137:1134;;:::o;6127:92::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;6192:19;6203:7;6192:10;:19::i;7621:116::-;5961:20;5970:10;5961:8;:20::i;:::-;5953:29;;;;;;7322:7;;;;7321:8;7313:17;;;;;;7681:7;:14;;-1:-1:-1;;7681:14:0;7691:4;7681:14;;;7711:18;;;7718:10;7711:18;;;;;;;;;;;;;7621:116::o;8706:79::-;8744:7;8771:6;-1:-1:-1;;;;;8771:6:0;8706:79;:::o;9041:92::-;9081:4;9119:6;-1:-1:-1;;;;;9119:6:0;9105:10;:20;;9041:92::o;29235:56::-;;;;;;;;;;;;;:::o;29077:24::-;;;;;;-1:-1:-1;;;;;29077:24:0;;:::o;30663:631::-;30833:12;;:40;;;-1:-1:-1;;;30833:40:0;;30763:10;30833:40;;;;;;;;30763:10;;30743:17;;;;-1:-1:-1;;;;;30833:12:0;;;;:29;;:40;;;;;;;;;;;;;;:12;:40;;;5:2:-1;;;;30:1;27;20:12;5:2;30833:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;30833:40:0;;;;;;;13:3:-1;8;5:12;2:2;;;30:1;27;20:12;2:2;-1:-1;30833:40:0;;;;;;;;;-1:-1:-1;30833:40:0;-1:-1:-1;30906:54:0;;30884:130;;;;;-1:-1:-1;;;30884:130:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31033:11;31025:52;;;;;-1:-1:-1;;;31025:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31122:27:0;;;;;;:16;:27;;;;;;;;;31090:59;;;;;;-1:-1:-1;;31090:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:29;;:59;;;31122:27;31090:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;31160:27:0;;;;;;:16;:27;;;;;31090:59;;-1:-1:-1;31160:44:0;;:27;-1:-1:-1;31190:14:0;;31160:44;:::i;:::-;;31271:14;;31222:64;;;;;30:3:-1;22:6;14;1:33;31222:64:0;;45:16:-1;;31222:64:0;;;;;;;;;-1:-1:-1;31253:16:0;;-1:-1:-1;31222:64:0;;-1:-1:-1;31222:64:0;;;;;;-1:-1:-1;31222:64:0;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;299:10;344;;263:2;259:12;;;;254:3;250:22;-1:-1;;246:30;311:9;;295:26;;;340:21;;377:20;;;;365:33;;31222:64:0;;;;;;;;;;-1:-1:-1;;;;;;;31222:64:0;;;-1:-1:-1;31222:64:0;;-1:-1:-1;;31222:64:0;30663:631;;;;;;:::o;29298:49::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;29298:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;29202:26::-;;;;:::o;9736:109::-;8918:9;:7;:9::i;:::-;8910:18;;;;;;9809:28;9828:8;9809:18;:28::i;1542:150::-;1600:7;1632:5;;;1656:6;;;;1648:15;;;;;;1683:1;1542:150;-1:-1:-1;;;1542:150:0:o;3405:153::-;3514:35;;;-1:-1:-1;;;3514:35:0;;-1:-1:-1;;;;;3514:35:0;;;;;;;;;;;;;;;;;;;;;;:18;;;;;;:35;;;;;;;;;;;;;;;-1:-1:-1;3514:18:0;:35;;;5:2:-1;;;;30:1;27;20:12;5:2;3514:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3514:35:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3514:35:0;3506:44;;;;;;3405:153;;;;:::o;3272:125::-;3363:5;-1:-1:-1;;;;;3363:14:0;;3378:2;3382:5;3363:25;;;;;;;;;;;;;-1:-1:-1;;;;;3363:25:0;-1:-1:-1;;;;;3363:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;3363:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3363:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;-1:-1;3363:25:0;3355:34;;;;;;3272:125;;;:::o;5374:165::-;5446:4;-1:-1:-1;;;;;5471:21:0;;5463:30;;;;;;-1:-1:-1;;;;;;5511:20:0;:11;:20;;;;;;;;;;;;;;;5374:165::o;6442:130::-;6502:24;:8;6518:7;6502:24;:15;:24;:::i;:::-;6542:22;;-1:-1:-1;;;;;6542:22:0;;;;;;;;6442:130;:::o;23578:798::-;23645:22;;:::i;:::-;23680:20;;:::i;:::-;23703:17;23716:3;23703:12;:17::i;:::-;23680:40;-1:-1:-1;23733:18:0;23754:14;23680:40;23766:1;23754:14;:11;:14;:::i;:::-;23733:35;;23800:4;23805:1;23800:7;;;;;;;;;;;;;;23788:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23779:1;:6;;:29;;;;23829:1;23819:4;23824:1;23819:7;;;;;;;;;;;;;:11;;;;;23883:8;23902:16;23929:440;23936:13;:3;:11;:13::i;:::-;23929:440;;;23980:12;:3;:10;:12::i;:::-;23966:26;;-1:-1:-1;23966:26:0;-1:-1:-1;24074:3:0;24081:1;24074:8;24070:259;;;24120:14;:3;:12;:14::i;:::-;24103:32;;24070:259;;;24174:3;24181:1;24174:8;24170:159;;;24227:14;:3;:12;:14::i;:::-;24203:1;:6;;;24210:4;24215:1;24210:7;;;;;;;;;;;;;;24203:15;;;;;;;;;;;;;:39;;;;24261:4;24266:1;24261:7;;;;;;;;;;;;;;;;;:9;;;;;;24170:159;;;24307:19;:3;24321:4;24307:19;:13;:19;:::i;:::-;23929:440;;;23578:798;;;;;;;:::o;27058:752::-;27118:15;;:::i;:::-;27146:20;;:::i;:::-;27169:17;27182:3;27169:12;:17::i;:::-;27146:40;;27199:8;27218:16;27245:558;27252:13;:3;:11;:13::i;:::-;27245:558;;;27296:12;:3;:10;:12::i;:::-;27282:26;;-1:-1:-1;27282:26:0;-1:-1:-1;27390:3:0;27397:1;27390:8;27386:377;;;27432:27;27444:14;:3;:12;:14::i;:::-;27432:11;:27::i;:::-;-1:-1:-1;;;;;27419:40:0;;;27386:377;;;27498:3;27505:1;27498:8;27494:269;;;27554:27;27566:14;:3;:12;:14::i;:::-;27554:11;:27::i;:::-;27527:24;;;:54;27494:269;;;27620:3;27627:1;27620:8;27616:147;;;27677:27;27689:14;:3;:12;:14::i;27677:27::-;27649:25;;;:55;27616:147;;;27741:19;:3;27755:4;27741:19;:13;:19;:::i;:::-;27245:558;;;27058:752;;;;;;:::o;1306:150::-;1364:7;1397:1;1392;:6;;1384:15;;;;;;-1:-1:-1;1422:5:0;;;1306:150::o;6312:122::-;6369:21;:8;6382:7;6369:21;:12;:21;:::i;:::-;6406:20;;-1:-1:-1;;;;;6406:20:0;;;;;;;;6312:122;:::o;9995:187::-;-1:-1:-1;;;;;10069:22:0;;10061:31;;;;;;10129:6;;;10108:38;;-1:-1:-1;;;;;10108:38:0;;;;10129:6;;;10108:38;;;10157:6;:17;;-1:-1:-1;;;;;;10157:17:0;-1:-1:-1;;;;;10157:17:0;;;;;;;;;;9995:187::o;5091:189::-;-1:-1:-1;;;;;5171:21:0;;5163:30;;;;;;5212:18;5216:4;5222:7;5212:3;:18::i;:::-;5204:27;;;;;;-1:-1:-1;;;;;5244:20:0;5267:5;5244:20;;;;;;;;;;;:28;;-1:-1:-1;;5244:28:0;;;5091:189::o;15262:131::-;15322:17;;:::i;:::-;15352:5;;;:11;;;;15384:1;15374:11;;15352:3;15262:131::o;16026:442::-;16148:7;;16173:20;;;16191:1;16184:8;;16173:20;;;;;;;;;;;;;16098:18;;16148:7;16173:20;;;;;;;29:2:-1;21:6;17:15;117:4;105:10;97:6;88:34;136:17;;-1:-1;16173:20:0;;16166:27;;16249:8;16268:13;16292:137;16299:12;16307:3;16299:7;:12::i;:::-;16292:137;;;16342:11;16349:3;16342:6;:11::i;:::-;16328:25;;;;;;;;16381:1;16368:4;16373:3;16368:9;;;;;;;;;;;;;:14;;;;;;;;;;;16397:20;16407:3;16412:4;16397:9;:20::i;:::-;16292:137;;;-1:-1:-1;;16439:21:0;;;-1:-1:-1;16026:442:0;:::o;15440:113::-;15533:5;;;;:12;15523:7;;:22;;15440:113::o;15610:188::-;15668:8;15678:17;15708:6;15717:14;15727:3;15717:9;:14::i;:::-;15708:23;-1:-1:-1;15752:1:0;15708:23;15748:5;15742:11;;15784:1;15788;15784:5;15775:15;;;;;;;;15764:26;;15610:188;;;;:::o;17540:677::-;17600:14;17627:8;17638:14;17648:3;17638:9;:14::i;:::-;17674:7;;17713:5;;;;:12;17627:25;;-1:-1:-1;17674:13:0;;;17706:19;;;17698:28;;;;;;17770:3;17760:14;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;17760:14:0;87:34:-1;135:17;;-1:-1;17760:14:0;-1:-1:-1;17805:5:0;;;;;17902:7;;17756:18;;-1:-1:-1;17805:5:0;17954:10;;;;17991:29;;;;17863:11;18041:145;18058:3;18056:1;:5;18041:145;;;18141:17;;;18135:24;18119:14;;;18112:48;18066:2;18063:5;18041:145;;;-1:-1:-1;;;18196:13:0;;-1:-1:-1;17540:677:0;;-1:-1:-1;17540:677:0:o;19030:402::-;19120:15;19112:4;:23;;;;;;;;;19108:292;;;19139:14;19149:3;19139:9;:14::i;:::-;;19108:292;;;19183:20;19175:4;:28;;;;;;;;;19171:229;;;19220:8;19231:14;19241:3;19231:9;:14::i;:::-;19260;;;;;;;19337:5;;;;:12;19220:25;;-1:-1:-1;19326:23:0;;19318:32;;;;;19171:229;19030:402;;:::o;19883:109::-;19940:9;19966:18;19982:1;19966:15;:18::i;19569:306::-;19626:9;19668:2;19656:1;:8;:14;;19648:23;;;;;;-1:-1:-1;19762:2:0;19755:10;;;19749:17;19824:8;;19814:1;19819:13;;19814:19;19808:26;;19569:306::o;4826:186::-;-1:-1:-1;;;;;4903:21:0;;4895:30;;;;;;4945:18;4949:4;4955:7;4945:3;:18::i;:::-;4944:19;4936:28;;;;;;-1:-1:-1;;;;;4977:20:0;:11;:20;;;;;;;;;;;:27;;-1:-1:-1;;4977:27:0;5000:4;4977:27;;;4826:186::o;16566:913::-;16750:5;;;;;16812:7;;16914:19;;;;;16908:26;16627:6;;;;17093:329;17110:2;17108:1;:4;17093:329;;;17175:3;17172:1;17167:12;17162:17;;17293:1;17297;17293:5;17279:1;17283:4;17279:8;17278:21;;17273:26;;;;17318:1;17322:4;17318:8;17330:1;17318:13;17314:97;;;17352:16;;;17367:1;17352:16;;;-1:-1:-1;17387:8:0;;-1:-1:-1;;17387:8:0;17314:97;17114:3;;17093:329;;;;17432:8;;;20000:254;20064:17;20102:1;:8;20114:2;20102:14;20094:23;;;;;;-1:-1:-1;20211:2:0;20204:10;20198:17;-1:-1:-1;;;20194:51:0;;;20187:60::o;28962:4312::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;;;;;28962:4312:0;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;28962:4312:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28962:4312:0;;;-1:-1:-1;28962:4312:0;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;
Swarm Source
bzzr://0ef48f0fa8c2c39f174999979f900f8eed58c0a95e79562343d0db5c5f94678a
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.