Contract Overview
Balance:
0 ETH
ETH Value:
$0.00
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xda1ad4f726028503739d78e778a1e51b8376a80c99f8ec4e574d559b4764629c | 0x60806040 | 50095 | 361 days 4 hrs ago | 0x904b5993fc92979eeedc19ccc58bed6b7216667c | IN | Create: MCBVestingUpgradeable | 0 ETH | 0.009644177714 ETH |
[ Download CSV Export ]
Latest 8 internal transactions
[ Download CSV Export ]
Contract Name:
MCBVestingUpgradeable
Compiler Version
v0.7.4+commit.3f05b770
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED pragma solidity 0.7.4; import "@openzeppelin/contracts-upgradeable/utils/ReentrancyGuardUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/math/SafeMathUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/token/ERC20/SafeERC20Upgradeable.sol"; import "@openzeppelin/contracts-upgradeable/proxy/Initializable.sol"; contract MCBVestingUpgradeable is Initializable, ReentrancyGuardUpgradeable, OwnableUpgradeable { using SafeMathUpgradeable for uint256; using SafeERC20Upgradeable for IERC20Upgradeable; string public constant name = "MCBVesting"; address public constant MCB_TOKEN_ADDRESS = 0x4e352cF164E64ADCBad318C3a1e222E9EBa4Ce42; /// @notice The EIP-712 typehash for the contract's domain bytes32 public constant DOMAIN_TYPEHASH = keccak256("EIP712Domain(string name,uint256 chainId,address verifyingContract)"); /// @notice The EIP-712 typehash for the delegation struct used by the contract bytes32 public constant UPDATE_BENEFICIARY_TYPEHASH = keccak256( "UpdateBeneficiary(address oldBeneficiary,address newBeneficiary,uint256 nonce,uint256 expiration)" ); struct TokenBalance { uint96 remaining; uint96 cumulative; } struct VestingAccount { uint96 claimed; uint96 cumulativeRef; uint96 commitment; } uint96 public totalCommitment; uint256 public beginTime; TokenBalance public tokenBalance; mapping(address => VestingAccount) public accounts; mapping(address => uint256) public nonces; event Claim(address indexed beneficiary, uint96 amount); event AddBeneficiaries(address[] beneficiaries, uint96[] amounts); event UpdateBeneficiary(address indexed oldBeneficiary, address indexed newBeneficiary); function initialize( uint256 beginTime_, address[] memory beneficiaries_, uint96[] memory amounts_ ) external initializer { require(beneficiaries_.length == amounts_.length, "length of parameters are not match"); __ReentrancyGuard_init(); __Ownable_init(); beginTime = beginTime_; uint96 totalCommitment_; for (uint256 i = 0; i < beneficiaries_.length; i++) { (address beneficiary, uint96 amount) = (beneficiaries_[i], amounts_[i]); require(beneficiary != address(0), "beneficiary cannot be zero address"); require(amount != 0, "amount cannot be zero"); accounts[beneficiary] = VestingAccount({ commitment: amount, cumulativeRef: 0, claimed: 0 }); totalCommitment_ = _add96(totalCommitment, _safe96(amount)); } totalCommitment = totalCommitment_; emit AddBeneficiaries(beneficiaries_, amounts_); } /** * @notice Update beneficiary address and claiming status. */ function updateBeneficiary(address oldBeneficiary, address newBeneficiary) external onlyOwner { _updateBeneficiary(oldBeneficiary, newBeneficiary); } /** * @notice Update beneficiary address and claiming status for a signed request. */ function updateBeneficiaryBySignature( address oldBeneficiary, address newBeneficiary, uint256 nonce, uint256 expiration, uint8 v, bytes32 r, bytes32 s ) external { bytes32 domainSeparator = keccak256( abi.encode(DOMAIN_TYPEHASH, keccak256(bytes(name)), _chainId(), address(this)) ); bytes32 structHash = keccak256( abi.encode( UPDATE_BENEFICIARY_TYPEHASH, oldBeneficiary, newBeneficiary, nonce, expiration ) ); bytes32 digest = keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash)); address signer = ecrecover(digest, v, r, s); require(signer != address(0), "invalid signature"); require(nonce == nonces[signer], "invalid nonce"); require(block.timestamp <= expiration, "signature expired"); require(oldBeneficiary == signer, "signer is not the old beneficiary"); _updateBeneficiary(oldBeneficiary, newBeneficiary); nonces[signer]++; } function commitments(address beneficiary) public view returns (uint96) { return accounts[beneficiary].commitment; } function claimedBalances(address beneficiary) public view returns (uint96) { return accounts[beneficiary].claimed; } /** * @notice The share of commitment amount in total amount. The value will not change during vesting. */ function shareOf(address beneficiary) public view returns (uint96) { return _wdivFloor96(accounts[beneficiary].commitment, totalCommitment); } /** * @notice The amount can be claimed for an account. */ function claimableToken(address beneficiary) external view returns (uint256) { (uint96 claimable, ) = _claimableToken(beneficiary); return claimable; } /** * @notice Claim token. */ function claim() external nonReentrant { address beneficiary = msg.sender; require(_blockTimestamp() >= beginTime, "claim is not active now"); (uint96 claimable, uint96 cumulativeReceived) = _claimableToken(beneficiary); require(claimable > 0, "no token to claim"); VestingAccount storage account = accounts[beneficiary]; account.claimed = _add96(account.claimed, claimable); account.cumulativeRef = cumulativeReceived; _mcbToken().safeTransfer(beneficiary, claimable); tokenBalance.remaining = _safe96(_mcbBalance()); tokenBalance.cumulative = cumulativeReceived; emit Claim(beneficiary, claimable); } function _claimableToken(address beneficiary) internal view returns (uint96 claimable, uint96 cumulativeReceived) { // get received token tokenBalance uint96 incrementalReceived = _sub96(_safe96(_mcbBalance()), tokenBalance.remaining); cumulativeReceived = _add96(tokenBalance.cumulative, incrementalReceived); // calc claimable of beneficiary VestingAccount storage account = accounts[beneficiary]; uint96 maxUnclaimed = _sub96(account.commitment, account.claimed); if (maxUnclaimed != 0 && cumulativeReceived > account.cumulativeRef) { claimable = _sub96(cumulativeReceived, account.cumulativeRef); claimable = _wmul96(claimable, shareOf(beneficiary)); claimable = claimable < maxUnclaimed ? claimable : maxUnclaimed; } else { claimable = 0; } } function _updateBeneficiary(address oldBeneficiary, address newBeneficiary) internal { require(newBeneficiary != address(0), "new beneficiary is zero address"); VestingAccount storage oldAccount = accounts[oldBeneficiary]; VestingAccount storage newAccount = accounts[newBeneficiary]; require(oldAccount.commitment > 0, "old beneficiary has no commitments"); require(newAccount.commitment == 0, "new beneficiary must has no commitments"); require( oldAccount.claimed != oldAccount.commitment, "old beneficiary has no more token to claim" ); newAccount.commitment = oldAccount.commitment; newAccount.cumulativeRef = oldAccount.cumulativeRef; newAccount.claimed = oldAccount.claimed; oldAccount.commitment = 0; oldAccount.cumulativeRef = 0; oldAccount.claimed = 0; emit UpdateBeneficiary(oldBeneficiary, newBeneficiary); } function _mcbBalance() internal view virtual returns (uint96) { return _safe96(_mcbToken().balanceOf(address(this))); } function _mcbToken() internal view virtual returns (IERC20Upgradeable) { return IERC20Upgradeable(MCB_TOKEN_ADDRESS); } function _blockTimestamp() internal view virtual returns (uint256) { return block.timestamp; } // math libs function _add96(uint96 a, uint96 b) internal pure returns (uint96) { uint96 c = a + b; require(c >= a, "addition overflow"); return c; } function _sub96(uint96 a, uint96 b) internal pure returns (uint96) { require(b <= a, "subtraction overflow"); return a - b; } function _safe96(uint256 n) internal pure returns (uint96) { return _safe96(n, "conversion to uint96 overflow"); } function _safe96(uint256 n, string memory errorMessage) internal pure returns (uint96) { require(n < 2**96, errorMessage); return uint96(n); } function _wmul96(uint256 x, uint256 y) internal pure returns (uint96 z) { z = _safe96(x.mul(y) / 1e18, "multiplication overflow"); } function _wdivFloor96(uint256 x, uint256 y) internal pure returns (uint96 z) { z = _safe96(x.mul(1e18).div(y), "division overflow"); } function _chainId() internal pure returns (uint256) { uint256 chainId; assembly { chainId := chainid() } return chainId; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuardUpgradeable is Initializable { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; function __ReentrancyGuard_init() internal initializer { __ReentrancyGuard_init_unchained(); } function __ReentrancyGuard_init_unchained() internal initializer { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathUpgradeable { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../utils/ContextUpgradeable.sol"; import "../proxy/Initializable.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal initializer { __Context_init_unchained(); __Ownable_init_unchained(); } function __Ownable_init_unchained() internal initializer { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } uint256[49] private __gap; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20Upgradeable { /** * @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.6.0 <0.8.0; import "./IERC20Upgradeable.sol"; import "../../math/SafeMathUpgradeable.sol"; import "../../utils/AddressUpgradeable.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 SafeERC20Upgradeable { using SafeMathUpgradeable for uint256; using AddressUpgradeable for address; function safeTransfer(IERC20Upgradeable token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20Upgradeable token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20Upgradeable token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20Upgradeable token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20Upgradeable token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT // solhint-disable-next-line compiler-version pragma solidity >=0.4.24 <0.8.0; import "../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {UpgradeableProxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Modifier to protect an initializer function from being invoked twice. */ modifier initializer() { require(_initializing || _isConstructor() || !_initialized, "Initializable: contract is already initialized"); bool isTopLevelCall = !_initializing; if (isTopLevelCall) { _initializing = true; _initialized = true; } _; if (isTopLevelCall) { _initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function _isConstructor() private view returns (bool) { return !AddressUpgradeable.isContract(address(this)); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "../proxy/Initializable.sol"; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract ContextUpgradeable is Initializable { function __Context_init() internal initializer { __Context_init_unchained(); } function __Context_init_unchained() internal initializer { } function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } uint256[50] private __gap; }
{ "optimizer": { "enabled": true, "runs": 1000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"beneficiaries","type":"address[]"},{"indexed":false,"internalType":"uint96[]","name":"amounts","type":"uint96[]"}],"name":"AddBeneficiaries","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint96","name":"amount","type":"uint96"}],"name":"Claim","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":true,"internalType":"address","name":"oldBeneficiary","type":"address"},{"indexed":true,"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"UpdateBeneficiary","type":"event"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MCB_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UPDATE_BENEFICIARY_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"accounts","outputs":[{"internalType":"uint96","name":"claimed","type":"uint96"},{"internalType":"uint96","name":"cumulativeRef","type":"uint96"},{"internalType":"uint96","name":"commitment","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beginTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"claimableToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"claimedBalances","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"commitments","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"beginTime_","type":"uint256"},{"internalType":"address[]","name":"beneficiaries_","type":"address[]"},{"internalType":"uint96[]","name":"amounts_","type":"uint96[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"}],"name":"shareOf","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenBalance","outputs":[{"internalType":"uint96","name":"remaining","type":"uint96"},{"internalType":"uint96","name":"cumulative","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCommitment","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldBeneficiary","type":"address"},{"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"updateBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldBeneficiary","type":"address"},{"internalType":"address","name":"newBeneficiary","type":"address"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"expiration","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"updateBeneficiaryBySignature","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506122ad806100206000396000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80637ecebe00116100cd578063cff2418111610081578063e12e05a711610066578063e12e05a714610521578063e8fcf72314610547578063f2fde38b1461056d5761016c565b8063cff24181146104f3578063d42b779d146104fb5761016c565b80638da5cb5b116100b25780638da5cb5b146104475780639e1a4d191461046b578063aca810ef146104a25761016c565b80637ecebe001461041957806388149fb91461043f5761016c565b806347e7f998116101245780635e5c06e2116101095780635e5c06e214610392578063715018a6146103e35780637249d9d9146103eb5761016c565b806347e7f998146103825780634e71d92d1461038a5761016c565b806320606b701161015557806320606b701461021257806321e5e2c41461022c57806344f07fec146102525761016c565b806301ecefa11461017157806306fdde0314610195575b600080fd5b610179610593565b604080516001600160601b039092168252519081900360200190f35b61019d6105a2565b6040805160208082528351818301528351919283929083019185019080838360005b838110156101d75781810151838201526020016101bf565b50505050905090810190601f1680156102045780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61021a6105c8565b60408051918252519081900360200190f35b6101796004803603602081101561024257600080fd5b50356001600160a01b03166105ec565b6103806004803603606081101561026857600080fd5b8135919081019060408101602082013564010000000081111561028a57600080fd5b82018360208201111561029c57600080fd5b803590602001918460208302840111640100000000831117156102be57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561030e57600080fd5b82018360208201111561032057600080fd5b8035906020019184602083028401116401000000008311171561034257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610627945050505050565b005b61021a61099c565b6103806109c0565b6103b8600480360360208110156103a857600080fd5b50356001600160a01b0316610c16565b604080516001600160601b039485168152928416602084015292168183015290519081900360600190f35b610380610c46565b6103806004803603604081101561040157600080fd5b506001600160a01b0381358116916020013516610d11565b61021a6004803603602081101561042f57600080fd5b50356001600160a01b0316610d93565b61021a610da5565b61044f610dab565b604080516001600160a01b039092168252519081900360200190f35b610473610dba565b60405180836001600160601b03168152602001826001600160601b031681526020019250505060405180910390f35b610380600480360360e08110156104b857600080fd5b506001600160a01b03813581169160208101359091169060408101359060608101359060ff6080820135169060a08101359060c00135610dd4565b61044f611146565b6101796004803603602081101561051157600080fd5b50356001600160a01b031661115e565b61021a6004803603602081101561053757600080fd5b50356001600160a01b0316611182565b6101796004803603602081101561055d57600080fd5b50356001600160a01b031661119f565b6103806004803603602081101561058357600080fd5b50356001600160a01b03166111c6565b6097546001600160601b031681565b6040518060400160405280600a8152602001694d434256657374696e6760b01b81525081565b7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b6001600160a01b0381166000908152609a6020526040812060010154609754610621916001600160601b0390811691166112e8565b92915050565b600054610100900460ff1680610640575061064061134b565b8061064e575060005460ff16155b6106895760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff161580156106b4576000805460ff1961ff0019909116610100171660011790555b81518351146106f45760405162461bcd60e51b815260040180806020018281038252602281526020018061220a6022913960400191505060405180910390fd5b6106fc61135c565b610704611406565b60988490556000805b84518110156108a55760008086838151811061072557fe5b602002602001015186848151811061073957fe5b60200260200101519150915060006001600160a01b0316826001600160a01b031614156107975760405162461bcd60e51b81526004018080602001828103825260228152602001806121056022913960400191505060405180910390fd5b6001600160601b0381166107f2576040805162461bcd60e51b815260206004820152601560248201527f616d6f756e742063616e6e6f74206265207a65726f0000000000000000000000604482015290519081900360640190fd5b60408051606081018252600080825260208083018281526001600160601b038681168587018181526001600160a01b038a168652609a909452959093209351845491518416600160601b026bffffffffffffffffffffffff60601b199185166bffffffffffffffffffffffff199384161791909116178455905160019093018054938316939091169290921790915560975461089992911690610894906114a3565b6114e4565b9350505060010161070d565b50609780546bffffffffffffffffffffffff19166001600160601b0383161790556040805181815285519181019190915284517fac0af1721d2eb4558a6983d9837129300017658c7330eae6433d605b1a0028b891869186919081906020808301916060840191808801910280838360005b8381101561092f578181015183820152602001610917565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561096e578181015183820152602001610956565b5050505090500194505050505060405180910390a1508015610996576000805461ff00191690555b50505050565b7f490c8906bb4d8e8d10a06aa558c598c78155a12f238053f2cdedf1fa788c587581565b60026001541415610a18576040805162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001556098543390610a2a61154a565b1015610a7d576040805162461bcd60e51b815260206004820152601760248201527f636c61696d206973206e6f7420616374697665206e6f77000000000000000000604482015290519081900360640190fd5b600080610a898361154e565b915091506000826001600160601b031611610aeb576040805162461bcd60e51b815260206004820152601160248201527f6e6f20746f6b656e20746f20636c61696d000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0383166000908152609a602052604090208054610b18906001600160601b0316846114e4565b81546bffffffffffffffffffffffff19166001600160601b03918216176bffffffffffffffffffffffff60601b1916600160601b84831602178255610b739085908516610b63611679565b6001600160a01b03169190611691565b610b8c610b7e611716565b6001600160601b03166114a3565b609980546bffffffffffffffffffffffff19166001600160601b03928316176bffffffffffffffffffffffff60601b1916600160601b85841602179055604080519185168252516001600160a01b038616917fe969a1021868fa58bb930e28b52ce8343509419f7505b7ea8221dfffbe217c0c916020918190039190910190a25050600180555050565b609a60205260009081526040902080546001909101546001600160601b0380831692600160601b90048116911683565b610c4e6117a5565b6001600160a01b0316610c5f610dab565b6001600160a01b031614610cba576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6065546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36065805473ffffffffffffffffffffffffffffffffffffffff19169055565b610d196117a5565b6001600160a01b0316610d2a610dab565b6001600160a01b031614610d85576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b610d8f82826117a9565b5050565b609b6020526000908152604090205481565b60985481565b6065546001600160a01b031690565b6099546001600160601b0380821691600160601b90041682565b60408051808201909152600a8152694d434256657374696e6760b01b60209091015260007f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a8667f10830d2312f54198eba58545dfa540c2eaae759beeddbfef4998c842646a93b6610e426119d7565b60408051602080820195909552808201939093526060830191909152306080808401919091528151808403909101815260a0830182528051908401207f490c8906bb4d8e8d10a06aa558c598c78155a12f238053f2cdedf1fa788c587560c08401526001600160a01b038c811660e08501528b1661010084015261012083018a90526101408084018a905282518085039091018152610160840183528051908501207f190100000000000000000000000000000000000000000000000000000000000061018085015261018284018290526101a2808501829052835180860390910181526101c285018085528151918701919091206000918290526101e2860180865281905260ff8b1661020287015261022286018a90526102428601899052935192965090949293909260019261026280840193601f198301929081900390910190855afa158015610f99573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116611001576040805162461bcd60e51b815260206004820152601160248201527f696e76616c6964207369676e6174757265000000000000000000000000000000604482015290519081900360640190fd5b6001600160a01b0381166000908152609b6020526040902054891461106d576040805162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e636500000000000000000000000000000000000000604482015290519081900360640190fd5b874211156110c2576040805162461bcd60e51b815260206004820152601160248201527f7369676e61747572652065787069726564000000000000000000000000000000604482015290519081900360640190fd5b806001600160a01b03168b6001600160a01b0316146111125760405162461bcd60e51b815260040180806020018281038252602181526020018061219a6021913960400191505060405180910390fd5b61111c8b8b6117a9565b6001600160a01b03166000908152609b602052604090208054600101905550505050505050505050565b734e352cf164e64adcbad318c3a1e222e9eba4ce4281565b6001600160a01b03166000908152609a60205260409020546001600160601b031690565b60008061118e8361154e565b506001600160601b03169392505050565b6001600160a01b03166000908152609a60205260409020600101546001600160601b031690565b6111ce6117a5565b6001600160a01b03166111df610dab565b6001600160a01b03161461123a576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b03811661127f5760405162461bcd60e51b81526004018080602001828103825260268152602001806121276026913960400191505060405180910390fd5b6065546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36065805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006113446113098361130386670de0b6b3a76400006119db565b90611a34565b6040518060400160405280601181526020017f6469766973696f6e206f766572666c6f77000000000000000000000000000000815250611a9b565b9392505050565b600061135630611b35565b15905090565b600054610100900460ff1680611375575061137561134b565b80611383575060005460ff16155b6113be5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff161580156113e9576000805460ff1961ff0019909116610100171660011790555b6113f1611b3b565b8015611403576000805461ff00191690555b50565b600054610100900460ff168061141f575061141f61134b565b8061142d575060005460ff16155b6114685760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff16158015611493576000805460ff1961ff0019909116610100171660011790555b61149b611be0565b6113f1611c80565b6000610621826040518060400160405280601d81526020017f636f6e76657273696f6e20746f2075696e743936206f766572666c6f77000000815250611a9b565b60008282016001600160601b038085169082161015611344576040805162461bcd60e51b815260206004820152601160248201527f6164646974696f6e206f766572666c6f77000000000000000000000000000000604482015290519081900360640190fd5b4290565b6000806000611572611561610b7e611716565b6099546001600160601b0316611d86565b60995490915061159290600160601b90046001600160601b0316826114e4565b6001600160a01b0385166000908152609a602052604081206001810154815493955090926115cc916001600160601b039081169116611d86565b90506001600160601b038116158015906115fa575081546001600160601b03600160601b9091048116908516115b1561166c57815461161c908590600160601b90046001600160601b0316611d86565b9450611642856001600160601b0316611634886105ec565b6001600160601b0316611df5565b9450806001600160601b0316856001600160601b0316106116635780611665565b845b9450611671565b600094505b505050915091565b734e352cf164e64adcbad318c3a1e222e9eba4ce4290565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611711908490611e50565b505050565b60006117a0611723611679565b6001600160a01b03166370a08231306040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561176f57600080fd5b505afa158015611783573d6000803e3d6000fd5b505050506040513d602081101561179957600080fd5b50516114a3565b905090565b3390565b6001600160a01b038116611804576040805162461bcd60e51b815260206004820152601f60248201527f6e65772062656e6566696369617279206973207a65726f206164647265737300604482015290519081900360640190fd5b6001600160a01b038083166000908152609a60205260408082209284168252902060018201546001600160601b031661186e5760405162461bcd60e51b81526004018080602001828103825260228152602001806122566022913960400191505060405180910390fd5b60018101546001600160601b0316156118b85760405162461bcd60e51b815260040180806020018281038252602781526020018061214d6027913960400191505060405180910390fd5b600182015482546001600160601b03908116911614156119095760405162461bcd60e51b815260040180806020018281038252602a8152602001806120db602a913960400191505060405180910390fd5b6001828101805491830180546001600160601b039384166bffffffffffffffffffffffff1991821617909155845484546bffffffffffffffffffffffff60601b1916600160601b9182900485169091021780855585549093169281169290921783558054909116905581547fffffffffffffffff0000000000000000000000000000000000000000000000001682556040516001600160a01b0384811691908616907faf70e45966588f4fb41f7cf7d28fec68e5dc5210226e64b15380dd691a71776f90600090a350505050565b4690565b6000826119ea57506000610621565b828202828482816119f757fe5b04146113445760405162461bcd60e51b81526004018080602001828103825260218152602001806121e96021913960400191505060405180910390fd5b6000808211611a8a576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b818381611a9357fe5b049392505050565b600081600160601b8410611b2d5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611af2578181015183820152602001611ada565b50505050905090810190601f168015611b1f5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b509192915050565b3b151590565b600054610100900460ff1680611b545750611b5461134b565b80611b62575060005460ff16155b611b9d5760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff16158015611bc8576000805460ff1961ff0019909116610100171660011790555b600180558015611403576000805461ff001916905550565b600054610100900460ff1680611bf95750611bf961134b565b80611c07575060005460ff16155b611c425760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff161580156113f1576000805460ff1961ff0019909116610100171660011790558015611403576000805461ff001916905550565b600054610100900460ff1680611c995750611c9961134b565b80611ca7575060005460ff16155b611ce25760405162461bcd60e51b815260040180806020018281038252602e8152602001806121bb602e913960400191505060405180910390fd5b600054610100900460ff16158015611d0d576000805460ff1961ff0019909116610100171660011790555b6000611d176117a5565b6065805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508015611403576000805461ff001916905550565b6000826001600160601b0316826001600160601b03161115611def576040805162461bcd60e51b815260206004820152601460248201527f7375627472616374696f6e206f766572666c6f77000000000000000000000000604482015290519081900360640190fd5b50900390565b6000611344670de0b6b3a7640000611e0d85856119db565b81611e1457fe5b046040518060400160405280601781526020017f6d756c7469706c69636174696f6e206f766572666c6f77000000000000000000815250611a9b565b6060611ea5826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611f019092919063ffffffff16565b80519091501561171157808060200190516020811015611ec457600080fd5b50516117115760405162461bcd60e51b815260040180806020018281038252602a81526020018061222c602a913960400191505060405180910390fd5b6060611f108484600085611f18565b949350505050565b606082471015611f595760405162461bcd60e51b81526004018080602001828103825260268152602001806121746026913960400191505060405180910390fd5b611f6285611b35565b611fb3576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310611ff25780518252601f199092019160209182019101611fd3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612054576040519150601f19603f3d011682016040523d82523d6000602084013e612059565b606091505b5091509150612069828286612074565b979650505050505050565b60608315612083575081611344565b8251156120935782518084602001fd5b60405162461bcd60e51b8152602060048201818152845160248401528451859391928392604401919085019080838360008315611af2578181015183820152602001611ada56fe6f6c642062656e656669636961727920686173206e6f206d6f726520746f6b656e20746f20636c61696d62656e65666963696172792063616e6e6f74206265207a65726f20616464726573734f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573736e65772062656e6566696369617279206d75737420686173206e6f20636f6d6d69746d656e7473416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c7369676e6572206973206e6f7420746865206f6c642062656e6566696369617279496e697469616c697a61626c653a20636f6e747261637420697320616c726561647920696e697469616c697a6564536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f776c656e677468206f6620706172616d657465727320617265206e6f74206d617463685361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565646f6c642062656e656669636961727920686173206e6f20636f6d6d69746d656e7473a264697066735822122003c13f1fee207e196658a7b4554e384a091438bc4f93d8612bc9fad529fcd09b64736f6c63430007040033
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.