Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Withdraw LQTY | 15373690 | 1282 days ago | IN | 0 ETH | 0.00095991 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| - | 12189054 | 1782 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
LockupContract
Compiler Version
v0.6.11+commit.5ef660b1
Optimization Enabled:
Yes with 100 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.6.11;
import "../Dependencies/SafeMath.sol";
import "../Interfaces/ILQTYToken.sol";
/*
* The lockup contract architecture utilizes a single LockupContract, with an unlockTime. The unlockTime is passed as an argument
* to the LockupContract's constructor. The contract's balance can be withdrawn by the beneficiary when block.timestamp > unlockTime.
* At construction, the contract checks that unlockTime is at least one year later than the Liquity system's deployment time.
* Within the first year from deployment, the deployer of the LQTYToken (Liquity AG's address) may transfer LQTY only to valid
* LockupContracts, and no other addresses (this is enforced in LQTYToken.sol's transfer() function).
*
* The above two restrictions ensure that until one year after system deployment, LQTY tokens originating from Liquity AG cannot
* enter circulating supply and cannot be staked to earn system revenue.
*/
contract LockupContract {
using SafeMath for uint;
// --- Data ---
string constant public NAME = "LockupContract";
uint constant public SECONDS_IN_ONE_YEAR = 31536000;
address public immutable beneficiary;
ILQTYToken public lqtyToken;
// Unlock time is the Unix point in time at which the beneficiary can withdraw.
uint public unlockTime;
// --- Events ---
event LockupContractCreated(address _beneficiary, uint _unlockTime);
event LockupContractEmptied(uint _LQTYwithdrawal);
// --- Functions ---
constructor
(
address _lqtyTokenAddress,
address _beneficiary,
uint _unlockTime
)
public
{
lqtyToken = ILQTYToken(_lqtyTokenAddress);
/*
* Set the unlock time to a chosen instant in the future, as long as it is at least 1 year after
* the system was deployed
*/
_requireUnlockTimeIsAtLeastOneYearAfterSystemDeployment(_unlockTime);
unlockTime = _unlockTime;
beneficiary = _beneficiary;
emit LockupContractCreated(_beneficiary, _unlockTime);
}
function withdrawLQTY() external {
_requireCallerIsBeneficiary();
_requireLockupDurationHasPassed();
ILQTYToken lqtyTokenCached = lqtyToken;
uint LQTYBalance = lqtyTokenCached.balanceOf(address(this));
lqtyTokenCached.transfer(beneficiary, LQTYBalance);
emit LockupContractEmptied(LQTYBalance);
}
// --- 'require' functions ---
function _requireCallerIsBeneficiary() internal view {
require(msg.sender == beneficiary, "LockupContract: caller is not the beneficiary");
}
function _requireLockupDurationHasPassed() internal view {
require(block.timestamp >= unlockTime, "LockupContract: The lockup duration must have passed");
}
function _requireUnlockTimeIsAtLeastOneYearAfterSystemDeployment(uint _unlockTime) internal view {
uint systemDeploymentTime = lqtyToken.getDeploymentStartTime();
require(_unlockTime >= systemDeploymentTime.add(SECONDS_IN_ONE_YEAR), "LockupContract: unlock time must be at least one year after system deployment");
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.11;
/**
* Based on OpenZeppelin's SafeMath:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/math/SafeMath.sol
*
* @dev Wrappers over Solidity's arithmetic operations with added overflow
* checks.
*
* Arithmetic operations in Solidity wrap on overflow. This can easily result
* in bugs, because programmers usually assume that an overflow raises an
* error, which is the standard behavior in high level programming languages.
* `SafeMath` restores this intuition by reverting the transaction when an
* operation overflows.
*
* Using this library instead of the unchecked operations eliminates an entire
* class of bugs, so it's recommended to use it always.
*/
library SafeMath {
/**
* @dev Returns the addition of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `+` operator.
*
* Requirements:
* - Addition cannot overflow.
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a, "SafeMath: addition overflow");
return c;
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*/
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return sub(a, b, "SafeMath: subtraction overflow");
}
/**
* @dev Returns the subtraction of two unsigned integers, reverting with custom message on
* overflow (when the result is negative).
*
* Counterpart to Solidity's `-` operator.
*
* Requirements:
* - Subtraction cannot overflow.
*
* _Available since v2.4.0._
*/
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}
/**
* @dev Returns the multiplication of two unsigned integers, reverting on
* overflow.
*
* Counterpart to Solidity's `*` operator.
*
* Requirements:
* - Multiplication cannot overflow.
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
// Gas optimization: this is cheaper than requiring 'a' not being zero, but the
// benefit is lost if 'b' is also tested.
// See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
if (a == 0) {
return 0;
}
uint256 c = a * b;
require(c / a == b, "SafeMath: multiplication overflow");
return c;
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts on
* division by zero. The result is rounded towards zero.
*
* Counterpart to Solidity's `/` operator. Note: this function uses a
* `revert` opcode (which leaves remaining gas untouched) while Solidity
* uses an invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return div(a, b, "SafeMath: division by zero");
}
/**
* @dev Returns the integer division of two unsigned integers. Reverts with custom message 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.
*
* _Available since v2.4.0._
*/
function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
// Solidity only automatically asserts when dividing by 0
require(b > 0, errorMessage);
uint256 c = a / b;
// assert(a == b * c + a % b); // There is no case in which this doesn't hold
return c;
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts when dividing by zero.
*
* Counterpart to Solidity's `%` operator. This function uses a `revert`
* opcode (which leaves remaining gas untouched) while Solidity uses an
* invalid opcode to revert (consuming all remaining gas).
*
* Requirements:
* - The divisor cannot be zero.
*/
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return mod(a, b, "SafeMath: modulo by zero");
}
/**
* @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
* Reverts with custom message 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.
*
* _Available since v2.4.0._
*/
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.11;
import "../Dependencies/IERC20.sol";
import "../Dependencies/IERC2612.sol";
interface ILQTYToken is IERC20, IERC2612 {
// --- Events ---
event CommunityIssuanceAddressSet(address _communityIssuanceAddress);
event LQTYStakingAddressSet(address _lqtyStakingAddress);
event LockupContractFactoryAddressSet(address _lockupContractFactoryAddress);
// --- Functions ---
function sendToLQTYStaking(address _sender, uint256 _amount) external;
function getDeploymentStartTime() external view returns (uint256);
function getLpRewardsEntitlement() external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.6.11;
/**
* Based on the OpenZeppelin IER20 interface:
* https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC20/IERC20.sol
*
* @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);
function increaseAllowance(address spender, uint256 addedValue) external returns (bool);
function decreaseAllowance(address spender, uint256 subtractedValue) external returns (bool);
/**
* @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);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
/**
* @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.11;
/**
* @dev Interface of the ERC2612 standard as defined in the EIP.
*
* Adds the {permit} method, which can be used to change one's
* {IERC20-allowance} without having to send a transaction, by signing a
* message. This allows users to spend tokens without having to hold Ether.
*
* See https://eips.ethereum.org/EIPS/eip-2612.
*
* Code adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/pull/2237/
*/
interface IERC2612 {
/**
* @dev Sets `amount` as the allowance of `spender` over `owner`'s tokens,
* given `owner`'s signed approval.
*
* IMPORTANT: The same issues {IERC20-approve} has related to transaction
* ordering also apply here.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
* - `deadline` must be a timestamp in the future.
* - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
* over the EIP712-formatted function arguments.
* - the signature must use ``owner``'s current nonce (see {nonces}).
*
* For more information on the signature format, see the
* https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
* section].
*/
function permit(address owner, address spender, uint256 amount,
uint256 deadline, uint8 v, bytes32 r, bytes32 s) external;
/**
* @dev Returns the current ERC2612 nonce for `owner`. This value must be
* included whenever a signature is generated for {permit}.
*
* Every successful call to {permit} increases `owner`'s nonce by one. This
* prevents a signature from being used multiple times.
*
* `owner` can limit the time a Permit is valid for by setting `deadline` to
* a value in the near future. The deadline argument can be set to uint(-1) to
* create Permits that effectively never expire.
*/
function nonces(address owner) external view returns (uint256);
function version() external view returns (string memory);
function permitTypeHash() external view returns (bytes32);
function domainSeparator() external view returns (bytes32);
}{
"optimizer": {
"enabled": true,
"runs": 100
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_lqtyTokenAddress","type":"address"},{"internalType":"address","name":"_beneficiary","type":"address"},{"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"_unlockTime","type":"uint256"}],"name":"LockupContractCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_LQTYwithdrawal","type":"uint256"}],"name":"LockupContractEmptied","type":"event"},{"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SECONDS_IN_ONE_YEAR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"beneficiary","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lqtyToken","outputs":[{"internalType":"contract ILQTYToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unlockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawLQTY","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a060405234801561001057600080fd5b506040516107243803806107248339818101604052606081101561003357600080fd5b5080516020820151604090920151600080546001600160a01b0319166001600160a01b038416179055909190610068816100cb565b60018190556001600160601b0319606083901b16608052604080516001600160a01b03841681526020810183905281517f5faee922186516bf77266643c1fda130acefc439d571400e8697106c6aed9b54929181900390910190a1505050610204565b60008060009054906101000a90046001600160a01b03166001600160a01b0316633c84b7c26040518163ffffffff1660e01b815260040160206040518083038186803b15801561011a57600080fd5b505afa15801561012e573d6000803e3d6000fd5b505050506040513d602081101561014457600080fd5b50519050610161816301e133806101a3602090811b61030a17901c565b82101561019f5760405162461bcd60e51b815260040180806020018281038252604d8152602001806106d7604d913960600191505060405180910390fd5b5050565b6000828201838110156101fd576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b60805160601c6104ac61022b600039806101535280610249528061037652506104ac6000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c80631f7af3c314610067578063251c1aa31461008b57806338af3eed146100a557806398e5f3c4146100ad578063a3f4df7e146100b5578063b9470a4614610132575b600080fd5b61006f61013c565b604080516001600160a01b039092168252519081900360200190f35b61009361014b565b60408051918252519081900360200190f35b61006f610151565b610093610175565b6100bd61017d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6101a7565b005b6000546001600160a01b031681565b60015481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6301e1338081565b6040518060400160405280600e81526020016d131bd8dadd5c10dbdb9d1c9858dd60921b81525081565b6101af61036b565b6101b76103d4565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216929183916370a08231916024808301926020929190829003018186803b15801561020557600080fd5b505afa158015610219573d6000803e3d6000fd5b505050506040513d602081101561022f57600080fd5b50516040805163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156102a757600080fd5b505af11580156102bb573d6000803e3d6000fd5b505050506040513d60208110156102d157600080fd5b50506040805182815290517f7d17cbc0f78ccfed33842dd29dab2872e8347bf3981293ab2cfe35ca16371a2f9181900360200190a15050565b600082820183811015610364576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146103d25760405162461bcd60e51b815260040180806020018281038252602d81526020018061044a602d913960400191505060405180910390fd5b565b6001544210156103d25760405162461bcd60e51b81526004018080602001828103825260348152602001806104166034913960400191505060405180910390fdfe4c6f636b7570436f6e74726163743a20546865206c6f636b7570206475726174696f6e206d7573742068617665207061737365644c6f636b7570436f6e74726163743a2063616c6c6572206973206e6f74207468652062656e6566696369617279a26469706673582212203c91a04be4f4eab03e00fa5912eefa3f457daaf696bd82924804f5ad34ef113e64736f6c634300060b00334c6f636b7570436f6e74726163743a20756e6c6f636b2074696d65206d757374206265206174206c65617374206f6e6520796561722061667465722073797374656d206465706c6f796d656e740000000000000000000000006dea81c8171d0ba574754ef6f8b412f2ed88c54d000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb00000000000000000000000000000000000000000000000000000000624bfec6
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100625760003560e01c80631f7af3c314610067578063251c1aa31461008b57806338af3eed146100a557806398e5f3c4146100ad578063a3f4df7e146100b5578063b9470a4614610132575b600080fd5b61006f61013c565b604080516001600160a01b039092168252519081900360200190f35b61009361014b565b60408051918252519081900360200190f35b61006f610151565b610093610175565b6100bd61017d565b6040805160208082528351818301528351919283929083019185019080838360005b838110156100f75781810151838201526020016100df565b50505050905090810190601f1680156101245780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61013a6101a7565b005b6000546001600160a01b031681565b60015481565b7f000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb81565b6301e1338081565b6040518060400160405280600e81526020016d131bd8dadd5c10dbdb9d1c9858dd60921b81525081565b6101af61036b565b6101b76103d4565b60008054604080516370a0823160e01b815230600482015290516001600160a01b03909216929183916370a08231916024808301926020929190829003018186803b15801561020557600080fd5b505afa158015610219573d6000803e3d6000fd5b505050506040513d602081101561022f57600080fd5b50516040805163a9059cbb60e01b81526001600160a01b037f000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb811660048301526024820184905291519293509084169163a9059cbb916044808201926020929091908290030181600087803b1580156102a757600080fd5b505af11580156102bb573d6000803e3d6000fd5b505050506040513d60208110156102d157600080fd5b50506040805182815290517f7d17cbc0f78ccfed33842dd29dab2872e8347bf3981293ab2cfe35ca16371a2f9181900360200190a15050565b600082820183811015610364576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b9392505050565b336001600160a01b037f000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb16146103d25760405162461bcd60e51b815260040180806020018281038252602d81526020018061044a602d913960400191505060405180910390fd5b565b6001544210156103d25760405162461bcd60e51b81526004018080602001828103825260348152602001806104166034913960400191505060405180910390fdfe4c6f636b7570436f6e74726163743a20546865206c6f636b7570206475726174696f6e206d7573742068617665207061737365644c6f636b7570436f6e74726163743a2063616c6c6572206973206e6f74207468652062656e6566696369617279a26469706673582212203c91a04be4f4eab03e00fa5912eefa3f457daaf696bd82924804f5ad34ef113e64736f6c634300060b0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006dea81c8171d0ba574754ef6f8b412f2ed88c54d000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb00000000000000000000000000000000000000000000000000000000624bfec6
-----Decoded View---------------
Arg [0] : _lqtyTokenAddress (address): 0x6DEA81C8171D0bA574754EF6F8b412F2Ed88c54D
Arg [1] : _beneficiary (address): 0x280ebd63C05776BA19a6a0f6497D5237635065Fb
Arg [2] : _unlockTime (uint256): 1649147590
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006dea81c8171d0ba574754ef6f8b412f2ed88c54d
Arg [1] : 000000000000000000000000280ebd63c05776ba19a6a0f6497d5237635065fb
Arg [2] : 00000000000000000000000000000000000000000000000000000000624bfec6
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.