Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0xBB5b65FE42B1965eD412fDe45B9b336a2cFba43b
Contract Name:
VeDist
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "../../lib/Math.sol"; import "../../interface/IERC20.sol"; import "../../interface/IVeDist.sol"; import "../../interface/IVe.sol"; import "../../lib/SafeERC20.sol"; contract VeDist is IVeDist { using SafeERC20 for IERC20; event CheckpointToken( uint time, uint tokens ); event Claimed( uint tokenId, uint amount, uint claimEpoch, uint maxEpoch ); struct ClaimCalculationResult { uint toDistribute; uint userEpoch; uint weekCursor; uint maxUserEpoch; bool success; } uint constant WEEK = 7 * 86400; uint public startTime; uint public timeCursor; mapping(uint => uint) public timeCursorOf; mapping(uint => uint) public userEpochOf; uint public lastTokenTime; uint[1000000000000000] public tokensPerWeek; address public votingEscrow; address public token; uint public tokenLastBalance; uint[1000000000000000] public veSupply; address public depositor; constructor(address _votingEscrow) { uint _t = block.timestamp / WEEK * WEEK; startTime = _t; lastTokenTime = _t; timeCursor = _t; address _token = IVe(_votingEscrow).token(); token = _token; votingEscrow = _votingEscrow; depositor = msg.sender; IERC20(_token).safeIncreaseAllowance(_votingEscrow, type(uint).max); } function timestamp() external view returns (uint) { return block.timestamp / WEEK * WEEK; } function _checkpointToken() internal { uint tokenBalance = IERC20(token).balanceOf(address(this)); uint toDistribute = tokenBalance - tokenLastBalance; tokenLastBalance = tokenBalance; uint t = lastTokenTime; uint sinceLast = block.timestamp - t; lastTokenTime = block.timestamp; uint thisWeek = t / WEEK * WEEK; uint nextWeek = 0; for (uint i = 0; i < 20; i++) { nextWeek = thisWeek + WEEK; if (block.timestamp < nextWeek) { tokensPerWeek[thisWeek] += _adjustToDistribute(toDistribute, block.timestamp, t, sinceLast); break; } else { tokensPerWeek[thisWeek] += _adjustToDistribute(toDistribute, nextWeek, t, sinceLast); } t = nextWeek; thisWeek = nextWeek; } emit CheckpointToken(block.timestamp, toDistribute); } /// @dev For testing purposes. function adjustToDistribute( uint toDistribute, uint t0, uint t1, uint sinceLastCall ) external pure returns (uint) { return _adjustToDistribute( toDistribute, t0, t1, sinceLastCall ); } function _adjustToDistribute( uint toDistribute, uint t0, uint t1, uint sinceLast ) internal pure returns (uint) { if (t0 <= t1 || t0 - t1 == 0 || sinceLast == 0) { return toDistribute; } return toDistribute * (t0 - t1) / sinceLast; } function checkpointToken() external override { require(msg.sender == depositor, "!depositor"); _checkpointToken(); } function _findTimestampEpoch(address ve, uint _timestamp) internal view returns (uint) { uint _min = 0; uint _max = IVe(ve).epoch(); for (uint i = 0; i < 128; i++) { if (_min >= _max) break; uint _mid = (_min + _max + 2) / 2; IVe.Point memory pt = IVe(ve).pointHistory(_mid); if (pt.ts <= _timestamp) { _min = _mid; } else { _max = _mid - 1; } } return _min; } function findTimestampUserEpoch(address ve, uint tokenId, uint _timestamp, uint maxUserEpoch) external view returns (uint) { return _findTimestampUserEpoch(ve, tokenId, _timestamp, maxUserEpoch); } function _findTimestampUserEpoch(address ve, uint tokenId, uint _timestamp, uint maxUserEpoch) internal view returns (uint) { uint _min = 0; uint _max = maxUserEpoch; for (uint i = 0; i < 128; i++) { if (_min >= _max) break; uint _mid = (_min + _max + 2) / 2; IVe.Point memory pt = IVe(ve).userPointHistory(tokenId, _mid); if (pt.ts <= _timestamp) { _min = _mid; } else { _max = _mid - 1; } } return _min; } function veForAt(uint _tokenId, uint _timestamp) external view returns (uint) { address ve = votingEscrow; uint maxUserEpoch = IVe(ve).userPointEpoch(_tokenId); uint epoch = _findTimestampUserEpoch(ve, _tokenId, _timestamp, maxUserEpoch); IVe.Point memory pt = IVe(ve).userPointHistory(_tokenId, epoch); return uint(int256(Math.positiveInt128(pt.bias - pt.slope * (int128(int256(_timestamp - pt.ts)))))); } function _checkpointTotalSupply() internal { address ve = votingEscrow; uint t = timeCursor; uint roundedTimestamp = block.timestamp / WEEK * WEEK; IVe(ve).checkpoint(); // assume will be called more frequently than 20 weeks for (uint i = 0; i < 20; i++) { if (t > roundedTimestamp) { break; } else { uint epoch = _findTimestampEpoch(ve, t); IVe.Point memory pt = IVe(ve).pointHistory(epoch); veSupply[t] = _adjustVeSupply(t, pt.ts, pt.bias, pt.slope); } t += WEEK; } timeCursor = t; } function adjustVeSupply(uint t, uint ptTs, int128 ptBias, int128 ptSlope) external pure returns (uint) { return _adjustVeSupply(t, ptTs, ptBias, ptSlope); } function _adjustVeSupply(uint t, uint ptTs, int128 ptBias, int128 ptSlope) internal pure returns (uint) { if (t < ptTs) { return 0; } int128 dt = int128(int256(t - ptTs)); if (ptBias < ptSlope * dt) { return 0; } return uint(int256(Math.positiveInt128(ptBias - ptSlope * dt))); } function checkpointTotalSupply() external override { _checkpointTotalSupply(); } function _claim(uint _tokenId, address ve, uint _lastTokenTime) internal returns (uint) { ClaimCalculationResult memory result = _calculateClaim(_tokenId, ve, _lastTokenTime); if (result.success) { userEpochOf[_tokenId] = result.userEpoch; timeCursorOf[_tokenId] = result.weekCursor; emit Claimed(_tokenId, result.toDistribute, result.userEpoch, result.maxUserEpoch); } return result.toDistribute; } function _calculateClaim(uint _tokenId, address ve, uint _lastTokenTime) internal view returns (ClaimCalculationResult memory) { uint userEpoch; uint toDistribute; uint maxUserEpoch = IVe(ve).userPointEpoch(_tokenId); uint _startTime = startTime; if (maxUserEpoch == 0) { return ClaimCalculationResult(0, 0, 0, 0, false); } uint weekCursor = timeCursorOf[_tokenId]; if (weekCursor == 0) { userEpoch = _findTimestampUserEpoch(ve, _tokenId, _startTime, maxUserEpoch); } else { userEpoch = userEpochOf[_tokenId]; } if (userEpoch == 0) userEpoch = 1; IVe.Point memory userPoint = IVe(ve).userPointHistory(_tokenId, userEpoch); if (weekCursor == 0) { weekCursor = (userPoint.ts + WEEK - 1) / WEEK * WEEK; } if (weekCursor >= lastTokenTime) { return ClaimCalculationResult(0, 0, 0, 0, false); } if (weekCursor < _startTime) { weekCursor = _startTime; } IVe.Point memory oldUserPoint; { for (uint i = 0; i < 50; i++) { if (weekCursor >= _lastTokenTime) { break; } if (weekCursor >= userPoint.ts && userEpoch <= maxUserEpoch) { userEpoch += 1; oldUserPoint = userPoint; if (userEpoch > maxUserEpoch) { userPoint = IVe.Point(0, 0, 0, 0); } else { userPoint = IVe(ve).userPointHistory(_tokenId, userEpoch); } } else { int128 dt = int128(int256(weekCursor - oldUserPoint.ts)); uint balanceOf = uint(int256(Math.positiveInt128(oldUserPoint.bias - dt * oldUserPoint.slope))); if (balanceOf == 0 && userEpoch > maxUserEpoch) { break; } toDistribute += balanceOf * tokensPerWeek[weekCursor] / veSupply[weekCursor]; weekCursor += WEEK; } } } return ClaimCalculationResult( toDistribute, Math.min(maxUserEpoch, userEpoch - 1), weekCursor, maxUserEpoch, true ); } function claimable(uint _tokenId) external view returns (uint) { uint _lastTokenTime = lastTokenTime / WEEK * WEEK; ClaimCalculationResult memory result = _calculateClaim(_tokenId, votingEscrow, _lastTokenTime); return result.toDistribute; } function claim(uint _tokenId) external returns (uint) { if (block.timestamp >= timeCursor) _checkpointTotalSupply(); uint _lastTokenTime = lastTokenTime; _lastTokenTime = _lastTokenTime / WEEK * WEEK; uint amount = _claim(_tokenId, votingEscrow, _lastTokenTime); if (amount != 0) { IVe(votingEscrow).depositFor(_tokenId, amount); tokenLastBalance -= amount; } return amount; } function claimMany(uint[] memory _tokenIds) external returns (bool) { if (block.timestamp >= timeCursor) _checkpointTotalSupply(); uint _lastTokenTime = lastTokenTime; _lastTokenTime = _lastTokenTime / WEEK * WEEK; address _votingEscrow = votingEscrow; uint total = 0; for (uint i = 0; i < _tokenIds.length; i++) { uint _tokenId = _tokenIds[i]; if (_tokenId == 0) break; uint amount = _claim(_tokenId, _votingEscrow, _lastTokenTime); if (amount != 0) { IVe(_votingEscrow).depositFor(_tokenId, amount); total += amount; } } if (total != 0) { tokenLastBalance -= total; } return true; } // Once off event on contract initialize function setDepositor(address _depositor) external { require(msg.sender == depositor, "!depositor"); depositor = _depositor; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function positiveInt128(int128 value) internal pure returns (int128) { return value < 0 ? int128(0) : value; } function closeTo(uint a, uint b, uint target) internal pure returns (bool) { if (a > b) { if (a - b <= target) { return true; } } else { if (b - a <= target) { return true; } } return false; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IVeDist { function checkpointToken() external; function checkpointTotalSupply() external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; interface IVe { enum DepositType { DEPOSIT_FOR_TYPE, CREATE_LOCK_TYPE, INCREASE_LOCK_AMOUNT, INCREASE_UNLOCK_TIME, MERGE_TYPE } struct Point { int128 bias; int128 slope; // # -dweight / dt uint ts; uint blk; // block } /* We cannot really do block numbers per se b/c slope is per time, not per block * and per block could be fairly bad b/c Ethereum changes blocktimes. * What we can do is to extrapolate ***At functions */ struct LockedBalance { int128 amount; uint end; } function token() external view returns (address); function balanceOfNFT(uint) external view returns (uint); function isApprovedOrOwner(address, uint) external view returns (bool); function createLockFor(uint, uint, address) external returns (uint); function userPointEpoch(uint tokenId) external view returns (uint); function epoch() external view returns (uint); function userPointHistory(uint tokenId, uint loc) external view returns (Point memory); function pointHistory(uint loc) external view returns (Point memory); function checkpoint() external; function depositFor(uint tokenId, uint value) external; function attachToken(uint tokenId) external; function detachToken(uint tokenId) external; function voting(uint tokenId) external; function abstain(uint tokenId) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.13; import "../interface/IERC20.sol"; import "./Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint value ) internal { uint newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.13; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_votingEscrow","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"CheckpointToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"claimEpoch","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxEpoch","type":"uint256"}],"name":"Claimed","type":"event"},{"inputs":[{"internalType":"uint256","name":"toDistribute","type":"uint256"},{"internalType":"uint256","name":"t0","type":"uint256"},{"internalType":"uint256","name":"t1","type":"uint256"},{"internalType":"uint256","name":"sinceLastCall","type":"uint256"}],"name":"adjustToDistribute","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"t","type":"uint256"},{"internalType":"uint256","name":"ptTs","type":"uint256"},{"internalType":"int128","name":"ptBias","type":"int128"},{"internalType":"int128","name":"ptSlope","type":"int128"}],"name":"adjustVeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"checkpointToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkpointTotalSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimMany","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"claimable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"ve","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"},{"internalType":"uint256","name":"maxUserEpoch","type":"uint256"}],"name":"findTimestampUserEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTokenTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_depositor","type":"address"}],"name":"setDepositor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timeCursor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"timeCursorOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLastBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensPerWeek","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userEpochOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"veForAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"veSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"votingEscrow","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b50604051620021223803806200212283398101604081905262000034916200042d565b600062093a806200004681426200046e565b62000052919062000491565b90508060008190555080600481905550806001819055506000826001600160a01b031663fc0c546a6040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000aa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000d091906200042d565b66038d7ea4c6800680546001600160a01b038084166001600160a01b0319928316811790935566038d7ea4c68005805491881691831691909117905566071afd498d00088054909116331790559091506200013e90846000196200083262000147602090811b91909117901c565b5050506200058e565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa15801562000199573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001bf9190620004b3565b620001cb9190620004cd565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663095ea7b360e01b1790915291925062000227918691906200022d16565b50505050565b600062000289826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200031460201b6200090c179092919060201c565b8051909150156200030f5780806020019051810190620002aa9190620004e8565b6200030f5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084015b60405180910390fd5b505050565b60606001600160a01b0384163b6200036f5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640162000306565b600080856001600160a01b0316856040516200038c91906200053b565b6000604051808303816000865af19150503d8060008114620003cb576040519150601f19603f3d011682016040523d82523d6000602084013e620003d0565b606091505b509092509050620003e3828286620003ef565b925050505b9392505050565b6060831562000400575081620003e8565b825115620004115782518084602001fd5b8160405162461bcd60e51b815260040162000306919062000559565b6000602082840312156200044057600080fd5b81516001600160a01b0381168114620003e857600080fd5b634e487b7160e01b600052601160045260246000fd5b6000826200048c57634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615620004ae57620004ae62000458565b500290565b600060208284031215620004c657600080fd5b5051919050565b60008219821115620004e357620004e362000458565b500190565b600060208284031215620004fb57600080fd5b81518015158114620003e857600080fd5b60005b83811015620005295781810151838201526020016200050f565b83811115620002275750506000910152565b600082516200054f8184602087016200050c565b9190910192915050565b60208152600082518060208401526200057a8160408501602087016200050c565b601f01601f19169190910160400192915050565b611b84806200059e6000396000f3fe608060405234801561001057600080fd5b50600436106101425760003560e01c8063939ea66b116100b8578063c7c4ff461161007c578063c7c4ff4614610284578063c9e14ed21461029d578063d1d58b25146102b0578063e32890c4146102c3578063f2c098b7146102e3578063fc0c546a146102f657600080fd5b8063939ea66b1461024557806398bdfdee1461024e5780639abd185c14610261578063b80777ea14610274578063bee5dc321461027c57600080fd5b80634f2bfe5b1161010a5780634f2bfe5b146101bd57806378e97925146101ee5780638736659b146101f7578063899519be146102005780638ec8468a14610213578063925489a81461022257600080fd5b80630f6592ef14610147578063326a94071461016d578063379607f5146101775780633935c8021461018a5780634607bf601461019d575b600080fd5b61015a61015536600461165a565b61030f565b6040519081526020015b60405180910390f35b610175610332565b005b61015a61018536600461165a565b61033c565b61015a61019836600461168f565b610426565b61015a6101ab36600461165a565b60026020526000908152604090205481565b66038d7ea4c68005546101d6906001600160a01b031681565b6040516001600160a01b039091168152602001610164565b61015a60005481565b61015a60015481565b61015a61020e36600461165a565b61043f565b61015a66038d7ea4c680075481565b61023561023036600461170f565b610455565b6040519015158152602001610164565b61015a60045481565b61015a61025c3660046117b5565b61059b565b61015a61026f3660046117e7565b6105a9565b61015a6106ea565b610175610709565b66071afd498d0008546101d6906001600160a01b031681565b61015a6102ab36600461181b565b610763565b61015a6102be36600461165a565b610771565b61015a6102d136600461165a565b60036020526000908152604090205481565b6101756102f1366004611865565b6107bd565b66038d7ea4c68006546101d6906001600160a01b031681565b66038d7ea4c680088166038d7ea4c68000811061032b57600080fd5b0154905081565b61033a6109dc565b565b6000600154421061034f5761034f6109dc565b60045462093a806103608183611896565b61036a91906118b8565b66038d7ea4c680055490915060009061038e9085906001600160a01b031684610b57565b9050801561041f5766038d7ea4c680055460405163076426ed60e11b815260048101869052602481018390526001600160a01b0390911690630ec84dda90604401600060405180830381600087803b1580156103e957600080fd5b505af11580156103fd573d6000803e3d6000fd5b505050508066038d7ea4c68007600082825461041991906118d7565b90915550505b9392505050565b600061043485858585610bea565b90505b949350505050565b60058166038d7ea4c68000811061032b57600080fd5b60006001544210610468576104686109dc565b60045462093a806104798183611896565b61048391906118b8565b66038d7ea4c68005549091506001600160a01b03166000805b855181101561056b5760008682815181106104b9576104b96118ee565b60200260200101519050806000036104d1575061056b565b60006104de828688610b57565b905080156105565760405163076426ed60e11b815260048101839052602481018290526001600160a01b03861690630ec84dda90604401600060405180830381600087803b15801561052f57600080fd5b505af1158015610543573d6000803e3d6000fd5b5050505080846105539190611904565b93505b505080806105639061191c565b91505061049c565b508015610590578066038d7ea4c68007600082825461058a91906118d7565b90915550505b506001949350505050565b600061043485858585610cde565b66038d7ea4c680055460405163e58f594760e01b8152600481018490526000916001600160a01b0316908290829063e58f594790602401602060405180830381865afa1580156105fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106219190611935565b9050600061063183878785610bea565b6040516322565a1560e11b815260048101889052602481018290529091506000906001600160a01b038516906344acb42a90604401608060405180830381865afa158015610683573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106a7919061194e565b90506106dc8160400151876106bc91906118d7565b82602001516106cb91906119c3565b82516106d79190611a61565b610d2a565b600f0b979650505050505050565b600062093a806106fa8142611896565b61070491906118b8565b905090565b66071afd498d0008546001600160a01b0316331461075b5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b60448201526064015b60405180910390fd5b61033a610d45565b600061043485858585610f08565b60008062093a80806004546107869190611896565b61079091906118b8565b66038d7ea4c68005549091506000906107b49085906001600160a01b031684610f6d565b51949350505050565b66071afd498d0008546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820152600a60248201526910b232b837b9b4ba37b960b11b6044820152606401610752565b66071afd498d000880546001600160a01b0319166001600160a01b0392909216919091179055565b604051636eb1769f60e11b81523060048201526001600160a01b038381166024830152600091839186169063dd62ed3e90604401602060405180830381865afa158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a79190611935565b6108b19190611904565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790529091506109069085906113df565b50505050565b60606001600160a01b0384163b6109655760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610752565b600080856001600160a01b0316856040516109809190611add565b6000604051808303816000865af19150503d80600081146109bd576040519150601f19603f3d011682016040523d82523d6000602084013e6109c2565b606091505b50915091506109d28282866114b6565b9695505050505050565b66038d7ea4c68005546001546001600160a01b0390911690600062093a80610a048142611896565b610a0e91906118b8565b9050826001600160a01b031663c2c4c5c16040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610a4b57600080fd5b505af1158015610a5f573d6000803e3d6000fd5b5050505060005b6014811015610b4f57818311610b4f576000610a8285856114ef565b604051638ad4c44760e01b8152600481018290529091506000906001600160a01b03871690638ad4c44790602401608060405180830381865afa158015610acd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610af1919061194e565b9050610b0b85826040015183600001518460200151610f08565b66038d7ea4c680088666038d7ea4c680008110610b2a57610b2a6118ee565b01555050610b3b62093a8084611904565b925080610b478161191c565b915050610a66565b505060015550565b600080610b65858585610f6d565b90508060800151156107b45760208181018051600088815260038452604080822092909255818501516002855290829020558351915160608086015183518b815295860194909452918401528201527fcae2990aa9af8eb1c64713b7eddb3a80bf18e49a94a13fe0d0002b5d61d58f009060800160405180910390a151949350505050565b60008082815b6080811015610cd25781831015610cd25760006002610c0f8486611904565b610c1a906002611904565b610c249190611896565b6040516322565a1560e11b8152600481018a9052602481018290529091506000906001600160a01b038b16906344acb42a90604401608060405180830381865afa158015610c76573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c9a919061194e565b905087816040015111610caf57819450610cbd565b610cba6001836118d7565b93505b50508080610cca9061191c565b915050610bf0565b50909695505050505050565b60008284111580610cf65750610cf483856118d7565b155b80610cff575081155b15610d0b575083610437565b81610d1684866118d7565b610d2090876118b8565b6104349190611896565b60008082600f0b12610d3c5781610d3f565b60005b92915050565b66038d7ea4c68006546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610db89190611935565b9050600066038d7ea4c680075482610dd091906118d7565b66038d7ea4c680078390556004549091506000610ded82426118d7565b426004559050600062093a80610e038185611896565b610e0d91906118b8565b90506000805b6014811015610ec657610e2962093a8084611904565b915081421015610e7357610e3f86428787610cde565b60058466038d7ea4c680008110610e5857610e586118ee565b016000828254610e689190611904565b90915550610ec69050565b610e7f86838787610cde565b60058466038d7ea4c680008110610e9857610e986118ee565b016000828254610ea89190611904565b90915550508194508192508080610ebe9061191c565b915050610e13565b5060408051428152602081018790527fce749457b74e10f393f2c6b1ce4261b78791376db5a3f501477a809f03f500d6910160405180910390a1505050505050565b600083851015610f1a57506000610437565b6000610f2685876118d7565b9050610f3281846119c3565b600f0b84600f0b1215610f49576000915050610437565b610f60610f5682856119c3565b6106d79086611a61565b600f0b9695505050505050565b610fa16040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525090565b6000806000856001600160a01b031663e58f5947886040518263ffffffff1660e01b8152600401610fd491815260200190565b602060405180830381865afa158015610ff1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110159190611935565b6000805491925082900361105c576040518060a00160405280600081526020016000815260200160008152602001600081526020016000151581525094505050505061041f565b600088815260026020526040812054908190036110865761107f888a8486610bea565b9450611098565b60008981526003602052604090205494505b846000036110a557600194505b6040516322565a1560e11b8152600481018a9052602481018690526000906001600160a01b038a16906344acb42a90604401608060405180830381865afa1580156110f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611118919061194e565b90508160000361115d5762093a8080600162093a80846040015161113c9190611904565b61114691906118d7565b6111509190611896565b61115a91906118b8565b91505b60045482106111a1576040518060a001604052806000815260200160008152602001600081526020016000815260200160001515815250965050505050505061041f565b828210156111ad578291505b6040805160808101825260008082526020820181905291810182905260608101829052905b6032811015611390578984101561139057826040015184101580156111f75750858811155b156112bd57611207600189611904565b9750829150858811156112465760405180608001604052806000600f0b81526020016000600f0b8152602001600081526020016000815250925061137e565b6040516322565a1560e11b8152600481018d9052602481018990526001600160a01b038c16906344acb42a90604401608060405180830381865afa158015611292573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112b6919061194e565b925061137e565b60008260400151856112cf91906118d7565b905060006112f28460200151836112e691906119c3565b85516106d79190611a61565b600f0b9050801580156113045750878a115b15611310575050611390565b66038d7ea4c680088666038d7ea4c68000811061132f5761132f6118ee565b015460058766038d7ea4c68000811061134a5761134a6118ee565b015461135690836118b8565b6113609190611896565b61136a908a611904565b985061137962093a8087611904565b955050505b806113888161191c565b9150506111d2565b506040518060a001604052808781526020016113b88760018b6113b391906118d7565b611644565b81526020810194909452604084019590955250506001606090910152509695505050505050565b6000611434826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661090c9092919063ffffffff16565b8051909150156114b157808060200190518101906114529190611af9565b6114b15760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610752565b505050565b606083156114c557508161041f565b8251156114d55782518084602001fd5b8160405162461bcd60e51b81526004016107529190611b1b565b600080600090506000846001600160a01b031663900cf0cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611536573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061155a9190611935565b905060005b608081101561163a578183101561163a576000600261157e8486611904565b611589906002611904565b6115939190611896565b604051638ad4c44760e01b8152600481018290529091506000906001600160a01b03891690638ad4c44790602401608060405180830381865afa1580156115de573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611602919061194e565b90508681604001511161161757819450611625565b6116226001836118d7565b93505b505080806116329061191c565b91505061155f565b5090949350505050565b6000818310611653578161041f565b5090919050565b60006020828403121561166c57600080fd5b5035919050565b80356001600160a01b038116811461168a57600080fd5b919050565b600080600080608085870312156116a557600080fd5b6116ae85611673565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611707576117076116c8565b604052919050565b6000602080838503121561172257600080fd5b823567ffffffffffffffff8082111561173a57600080fd5b818501915085601f83011261174e57600080fd5b813581811115611760576117606116c8565b8060051b91506117718483016116de565b818152918301840191848101908884111561178b57600080fd5b938501935b838510156117a957843582529385019390850190611790565b98975050505050505050565b600080600080608085870312156117cb57600080fd5b5050823594602084013594506040840135936060013592509050565b600080604083850312156117fa57600080fd5b50508035926020909101359150565b80600f0b811461181857600080fd5b50565b6000806000806080858703121561183157600080fd5b8435935060208501359250604085013561184a81611809565b9150606085013561185a81611809565b939692955090935050565b60006020828403121561187757600080fd5b61041f82611673565b634e487b7160e01b600052601160045260246000fd5b6000826118b357634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156118d2576118d2611880565b500290565b6000828210156118e9576118e9611880565b500390565b634e487b7160e01b600052603260045260246000fd5b6000821982111561191757611917611880565b500190565b60006001820161192e5761192e611880565b5060010190565b60006020828403121561194757600080fd5b5051919050565b60006080828403121561196057600080fd5b6040516080810181811067ffffffffffffffff82111715611983576119836116c8565b604052825161199181611809565b815260208301516119a181611809565b6020820152604083810151908201526060928301519281019290925250919050565b600081600f0b83600f0b60016001607f1b036000821360008413838304851182821616156119f3576119f3611880565b6f7fffffffffffffffffffffffffffffff196000851282811687830587121615611a1f57611a1f611880565b60008712925085820587128484161615611a3b57611a3b611880565b85850587128184161615611a5157611a51611880565b5050509290910295945050505050565b600081600f0b83600f0b600081128160016001607f1b031901831281151615611a8c57611a8c611880565b8160016001607f1b03018313811615611aa757611aa7611880565b5090039392505050565b60005b83811015611acc578181015183820152602001611ab4565b838111156109065750506000910152565b60008251611aef818460208701611ab1565b9190910192915050565b600060208284031215611b0b57600080fd5b8151801515811461041f57600080fd5b6020815260008251806020840152611b3a816040850160208701611ab1565b601f01601f1916919091016040019291505056fea264697066735822122071a1e3668dbc77df3ccf73c953817c85c51a07c01f580fbbac5192c7fe214df464736f6c634300080d00330000000000000000000000000841097f62a82c2fef8aa943a2f80b59773e5e02
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.