Source Code
Latest 25 from a total of 139 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Swap Enabled | 14441321 | 1398 days ago | IN | 0 ETH | 0.00120528 | ||||
| Set Swap Enabled | 14441318 | 1398 days ago | IN | 0 ETH | 0.00132746 | ||||
| Exit Pool | 14413806 | 1403 days ago | IN | 0 ETH | 0.01124462 | ||||
| Set Swap Enabled | 14390525 | 1406 days ago | IN | 0 ETH | 0.00053165 | ||||
| Exit Pool | 14386586 | 1407 days ago | IN | 0 ETH | 0.01375039 | ||||
| Set Swap Enabled | 14386581 | 1407 days ago | IN | 0 ETH | 0.00226928 | ||||
| Exit Pool | 14385741 | 1407 days ago | IN | 0 ETH | 0.01032745 | ||||
| Set Swap Enabled | 14385702 | 1407 days ago | IN | 0 ETH | 0.0014274 | ||||
| Set Swap Enabled | 14366972 | 1410 days ago | IN | 0 ETH | 0.00153659 | ||||
| Set Swap Enabled | 14365888 | 1410 days ago | IN | 0 ETH | 0.00084103 | ||||
| Create Auction | 14361567 | 1411 days ago | IN | 0 ETH | 0.18051153 | ||||
| Create Auction | 14358162 | 1411 days ago | IN | 0 ETH | 0.12563381 | ||||
| Create Auction | 14350890 | 1412 days ago | IN | 0 ETH | 0.16770036 | ||||
| Exit Pool | 14314659 | 1418 days ago | IN | 0 ETH | 0.01413574 | ||||
| Set Swap Enabled | 14314648 | 1418 days ago | IN | 0 ETH | 0.00280598 | ||||
| Exit Pool | 14305938 | 1419 days ago | IN | 0 ETH | 0.00711069 | ||||
| Set Swap Enabled | 14295327 | 1421 days ago | IN | 0 ETH | 0.00201995 | ||||
| Create Auction | 14294391 | 1421 days ago | IN | 0 ETH | 0.16193739 | ||||
| Exit Pool | 14278005 | 1424 days ago | IN | 0 ETH | 0.03573296 | ||||
| Set Swap Enabled | 14272298 | 1425 days ago | IN | 0 ETH | 0.00323751 | ||||
| Set Swap Enabled | 14272294 | 1425 days ago | IN | 0 ETH | 0.00332807 | ||||
| Set Swap Enabled | 14258588 | 1427 days ago | IN | 0 ETH | 0.00646523 | ||||
| Exit Pool | 14256325 | 1427 days ago | IN | 0 ETH | 0.01355835 | ||||
| Create Auction | 14253271 | 1427 days ago | IN | 0 ETH | 0.267638 | ||||
| Create Auction | 14250115 | 1428 days ago | IN | 0 ETH | 0.6305369 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CopperProxy
Compiler Version
v0.8.7+commit.e28d00a7
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;
import {TransferHelper} from "@uniswap/lib/contracts/libraries/TransferHelper.sol";
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {EnumerableSet} from "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
interface LBPFactory {
function create(
string memory name,
string memory symbol,
address[] memory tokens,
uint256[] memory weights,
uint256 swapFeePercentage,
address owner,
bool swapEnabledOnStart
) external returns (address);
}
interface Vault {
struct JoinPoolRequest {
address[] assets;
uint256[] maxAmountsIn;
bytes userData;
bool fromInternalBalance;
}
struct ExitPoolRequest {
address[] assets;
uint256[] minAmountsOut;
bytes userData;
bool toInternalBalance;
}
function joinPool(
bytes32 poolId,
address sender,
address recipient,
JoinPoolRequest memory request
) external;
function exitPool(
bytes32 poolId,
address sender,
address recipient,
ExitPoolRequest memory request
) external;
function getPoolTokens(bytes32 poolId)
external
view
returns (
address[] memory tokens,
uint256[] memory balances,
uint256 lastChangeBlock
);
}
interface LBP {
function updateWeightsGradually(
uint256 startTime,
uint256 endTime,
uint256[] memory endWeights
) external;
function setSwapEnabled(bool swapEnabled) external;
function getPoolId() external returns (bytes32 poolID);
}
/// @title CopperProxy
/// @notice This contract allows for simplified creation and management of Balancer LBPs
/// It currently supports:
/// - LBPs with 2 tokens
/// - Withdrawl of the full liquidity at once
/// - Charging a fee on the amount raised
contract CopperProxy is Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
struct PoolData {
address owner;
bool isCorrectOrder;
uint256 fundTokenInputAmount;
}
mapping(address => PoolData) private _poolData;
EnumerableSet.AddressSet private _pools;
address public constant VAULT = address(0xBA12222222228d8Ba445958a75a0704d566BF2C8);
address public immutable _LBPFactoryAddress;
uint256 public immutable _feeBPS;
address public _feeRecipient;
constructor(
uint256 feeBPS,
address feeRecipient,
address LBPFactoryAddress
) {
_feeBPS = feeBPS;
_feeRecipient = feeRecipient;
_LBPFactoryAddress = LBPFactoryAddress;
}
// Events
event PoolCreated(
address indexed pool,
bytes32 poolId,
string name,
string symbol,
address[] tokens,
uint256[] weights,
uint256 swapFeePercentage,
address owner,
bool swapEnabledOnStart
);
event JoinedPool(address indexed pool, address[] tokens, uint256[] amounts, bytes userData);
event GradualWeightUpdateScheduled(address indexed pool, uint256 startTime, uint256 endTime, uint256[] endWeights);
event SwapEnabledSet(address indexed pool, bool swapEnabled);
event TransferedPoolOwnership(address indexed pool, address previousOwner, address newOwner);
event ExitedPool(address indexed pool, address[] tokens, uint256[] minAmountsOut, bytes userData);
event TransferedFee(address indexed pool, address token, address feeRecipient, uint256 feeAmount);
event TransferedToken(address indexed pool, address token, address to, uint256 amount);
event ChangedFeeRecipient(address previousRecipient, address newRecipient);
event Skimmed(address token, address to, uint256 balance);
// Pool access control
modifier onlyPoolOwner(address pool) {
require(msg.sender == _poolData[pool].owner, "!owner");
_;
}
function isPool(address pool) external view returns (bool valid) {
return _pools.contains(pool);
}
function poolCount() external view returns (uint256 count) {
return _pools.length();
}
function getPoolAt(uint256 index) external view returns (address pool) {
return _pools.at(index);
}
function getPools() external view returns (address[] memory pools) {
return _pools.values();
}
function getPoolData(address pool) external view returns (PoolData memory poolData) {
return _poolData[pool];
}
function getBPTTokenBalance(address pool) external view returns (uint256 bptBalance) {
return IERC20(pool).balanceOf(address(this));
}
struct PoolConfig {
string name;
string symbol;
address[] tokens;
uint256[] amounts;
uint256[] weights;
uint256[] endWeights;
bool isCorrectOrder;
uint256 swapFeePercentage;
bytes userData;
uint256 startTime;
uint256 endTime;
}
function createAuction(PoolConfig memory poolConfig) external returns (address) {
// 1: deposit tokens and approve vault
require(poolConfig.tokens.length == 2, "only two tokens");
TransferHelper.safeTransferFrom(poolConfig.tokens[0], msg.sender, address(this), poolConfig.amounts[0]);
TransferHelper.safeTransferFrom(poolConfig.tokens[1], msg.sender, address(this), poolConfig.amounts[1]);
TransferHelper.safeApprove(poolConfig.tokens[0], VAULT, poolConfig.amounts[0]);
TransferHelper.safeApprove(poolConfig.tokens[1], VAULT, poolConfig.amounts[1]);
// 2: pool creation
address pool = LBPFactory(_LBPFactoryAddress).create(
poolConfig.name,
poolConfig.symbol,
poolConfig.tokens,
poolConfig.weights,
poolConfig.swapFeePercentage,
address(this), // owner set to this proxy
false // swaps disabled on start
);
bytes32 poolId = LBP(pool).getPoolId();
emit PoolCreated(
pool,
poolId,
poolConfig.name,
poolConfig.symbol,
poolConfig.tokens,
poolConfig.weights,
poolConfig.swapFeePercentage,
address(this),
false
);
// 3: store pool data
_poolData[pool] = PoolData(
msg.sender,
poolConfig.isCorrectOrder,
poolConfig.amounts[poolConfig.isCorrectOrder ? 0 : 1]
);
require(_pools.add(pool), "exists already");
// 4: deposit tokens into pool
Vault(VAULT).joinPool(
poolId,
address(this), // sender
address(this), // recipient
Vault.JoinPoolRequest(poolConfig.tokens, poolConfig.amounts, poolConfig.userData, false)
);
emit JoinedPool(pool, poolConfig.tokens, poolConfig.amounts, poolConfig.userData);
// 5: configure weights
LBP(pool).updateWeightsGradually(poolConfig.startTime, poolConfig.endTime, poolConfig.endWeights);
emit GradualWeightUpdateScheduled(pool, poolConfig.startTime, poolConfig.endTime, poolConfig.endWeights);
return pool;
}
function setSwapEnabled(address pool, bool swapEnabled) external onlyPoolOwner(pool) {
LBP(pool).setSwapEnabled(swapEnabled);
emit SwapEnabledSet(pool, swapEnabled);
}
function transferPoolOwnership(address pool, address newOwner) external onlyPoolOwner(pool) {
address previousOwner = _poolData[pool].owner;
_poolData[pool].owner = newOwner;
emit TransferedPoolOwnership(pool, previousOwner, newOwner);
}
enum ExitKind {
EXACT_BPT_IN_FOR_ONE_TOKEN_OUT,
EXACT_BPT_IN_FOR_TOKENS_OUT,
BPT_IN_FOR_EXACT_TOKENS_OUT
}
/**
* Exit a pool, burn the BPT token and transfer back the tokens.
* If maxBPTTokenOut is passed as 0, the function will use the total balance available for the BPT token.
* If maxBPTTokenOut is between 0 and the total of BPT available, that will be the amount used to burn.
* maxBPTTokenOut must be grader or equal than 0
*/
function exitPool(address pool, uint256[] calldata minAmountsOut, uint256 maxBPTTokenOut) external onlyPoolOwner(pool) {
// 1. Get pool data
bytes32 poolId = LBP(pool).getPoolId();
(address[] memory poolTokens, , ) = Vault(VAULT).getPoolTokens(poolId);
require(poolTokens.length == minAmountsOut.length, "invalid input length");
PoolData memory poolData = _poolData[pool];
// 2. Specify the exact BPT amount to burn
uint256 bptToBurn;
uint256 bptBalance = IERC20(pool).balanceOf(address(this));
require(maxBPTTokenOut <= bptBalance, "Not enough BPT token amount");
require(bptBalance > 0, "invalid pool");
if (maxBPTTokenOut == 0 ) {
bptToBurn = bptBalance;
} else {
bptToBurn = maxBPTTokenOut;
}
bytes memory userData = abi.encode(ExitKind.EXACT_BPT_IN_FOR_TOKENS_OUT, bptToBurn);
Vault.ExitPoolRequest memory exitRequest = Vault.ExitPoolRequest(poolTokens, minAmountsOut, userData, false);
// 3. Exit pool and keep tokens in contract
Vault(VAULT).exitPool(poolId, address(this), payable(address(this)), exitRequest);
emit ExitedPool(pool, poolTokens, minAmountsOut, userData);
// 4. Calculate and transfer fee to recipient
address fundToken = poolTokens[poolData.isCorrectOrder ? 0 : 1];
uint256 fundTokenBalance = IERC20(fundToken).balanceOf(address(this));
if (fundTokenBalance > poolData.fundTokenInputAmount) {
uint256 feeAmount = ((fundTokenBalance - poolData.fundTokenInputAmount) * _feeBPS) / 10_000;
TransferHelper.safeTransfer(fundToken, _feeRecipient, feeAmount);
emit TransferedFee(pool, fundToken, _feeRecipient, feeAmount);
}
// 5. Transfer to user
uint256 firstTokenBalance = IERC20(poolTokens[0]).balanceOf(address(this));
TransferHelper.safeTransfer(
poolTokens[0],
msg.sender,
firstTokenBalance
);
emit TransferedToken(pool, poolTokens[0], msg.sender, firstTokenBalance);
uint256 secondTokenBalance = IERC20(poolTokens[1]).balanceOf(address(this));
TransferHelper.safeTransfer(
poolTokens[1],
msg.sender,
secondTokenBalance
);
emit TransferedToken(pool, poolTokens[1], msg.sender, secondTokenBalance);
}
function changeFeeRecipient(address newRecipient) external onlyOwner {
address previousFeeReciepient = _feeRecipient;
_feeRecipient = newRecipient;
emit ChangedFeeRecipient(previousFeeReciepient, newRecipient);
}
function skim(address token, address recipient) external onlyOwner {
require(!_pools.contains(token), "can't skim LBP token");
uint256 balance = IERC20(token).balanceOf(address(this));
TransferHelper.safeTransfer(token, recipient, balance);
emit Skimmed(token, recipient, balance);
}
}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeApprove: approve failed'
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::safeTransfer: transfer failed'
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(
success && (data.length == 0 || abi.decode(data, (bool))),
'TransferHelper::transferFrom: transferFrom failed'
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(success, 'TransferHelper::safeTransferETH: ETH transfer failed');
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @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.0;
import "../utils/Context.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 Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
/**
* @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 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 Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"uint256","name":"feeBPS","type":"uint256"},{"internalType":"address","name":"feeRecipient","type":"address"},{"internalType":"address","name":"LBPFactoryAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousRecipient","type":"address"},{"indexed":false,"internalType":"address","name":"newRecipient","type":"address"}],"name":"ChangedFeeRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"userData","type":"bytes"}],"name":"ExitedPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endTime","type":"uint256"},{"indexed":false,"internalType":"uint256[]","name":"endWeights","type":"uint256[]"}],"name":"GradualWeightUpdateScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"indexed":false,"internalType":"bytes","name":"userData","type":"bytes"}],"name":"JoinedPool","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":"pool","type":"address"},{"indexed":false,"internalType":"bytes32","name":"poolId","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address[]","name":"tokens","type":"address[]"},{"indexed":false,"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"indexed":false,"internalType":"uint256","name":"swapFeePercentage","type":"uint256"},{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"bool","name":"swapEnabledOnStart","type":"bool"}],"name":"PoolCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"balance","type":"uint256"}],"name":"Skimmed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"SwapEnabledSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"feeRecipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeAmount","type":"uint256"}],"name":"TransferedFee","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TransferedPoolOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pool","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TransferedToken","type":"event"},{"inputs":[],"name":"VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_LBPFactoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeBPS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_feeRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"changeFeeRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"weights","type":"uint256[]"},{"internalType":"uint256[]","name":"endWeights","type":"uint256[]"},{"internalType":"bool","name":"isCorrectOrder","type":"bool"},{"internalType":"uint256","name":"swapFeePercentage","type":"uint256"},{"internalType":"bytes","name":"userData","type":"bytes"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"endTime","type":"uint256"}],"internalType":"struct CopperProxy.PoolConfig","name":"poolConfig","type":"tuple"}],"name":"createAuction","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"uint256[]","name":"minAmountsOut","type":"uint256[]"},{"internalType":"uint256","name":"maxBPTTokenOut","type":"uint256"}],"name":"exitPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getBPTTokenBalance","outputs":[{"internalType":"uint256","name":"bptBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getPoolAt","outputs":[{"internalType":"address","name":"pool","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"getPoolData","outputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"bool","name":"isCorrectOrder","type":"bool"},{"internalType":"uint256","name":"fundTokenInputAmount","type":"uint256"}],"internalType":"struct CopperProxy.PoolData","name":"poolData","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPools","outputs":[{"internalType":"address[]","name":"pools","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"}],"name":"isPool","outputs":[{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolCount","outputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"bool","name":"swapEnabled","type":"bool"}],"name":"setSwapEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"}],"name":"skim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pool","type":"address"},{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferPoolOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162002a1f38038062002a1f8339810160408190526200003491620000e8565b6200003f336200007b565b60a092909252600480546001600160a01b0319166001600160a01b039290921691909117905560601b6001600160601b03191660805262000129565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000e357600080fd5b919050565b600080600060608486031215620000fe57600080fd5b835192506200011060208501620000cb565b91506200012060408501620000cb565b90509250925092565b60805160601c60a0516128bf620001606000396000818161032101526108e701526000818161015b0152610ed001526128bf6000f3fe608060405234801561001057600080fd5b50600436106101515760003560e01c8063673a2a1f116100cd578063a342f23811610081578063ee9ee0e411610066578063ee9ee0e414610377578063f2fde38b1461038a578063f525cb681461039d57600080fd5b8063a342f23814610351578063cac626bb1461036457600080fd5b8063715018a6116100b2578063715018a6146103035780638da5cb5b1461030b5780639c37ebb61461031c57600080fd5b8063673a2a1f146102db578063712b772f146102f057600080fd5b8063236040711161012457806346cf3e6e1161010957806346cf3e6e1461029257806351d48cea146102a55780635b16ebb7146102b857600080fd5b80632360407114610264578063411557d11461027757600080fd5b806301b1aff6146101565780630563cd7c1461019a57806305ea2183146101af57806313d21cdf146101c2575b600080fd5b61017d7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ad6101a8366004612048565b6103a5565b005b61017d6101bd36600461238c565b610c29565b6102376101d0366004611fd5565b6040805160608101825260008082526020820181905291810191909152506001600160a01b03908116600090815260016020818152604092839020835160608101855281549586168152600160a01b90950460ff1615159185019190915201549082015290565b6040805182516001600160a01b031681526020808401511515908201529181015190820152606001610191565b6101ad610272366004611fd5565b610c3c565b61017d73ba12222222228d8ba445958a75a0704d566bf2c881565b61017d6102a036600461220f565b610d04565b6101ad6102b33660046120d6565b611320565b6102cb6102c6366004611fd5565b611432565b6040519015158152602001610191565b6102e361143f565b60405161019191906124c2565b6101ad6102fe36600461200f565b611450565b6101ad6115d9565b6000546001600160a01b031661017d565b6103437f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610191565b60045461017d906001600160a01b031681565b610343610372366004611fd5565b61163f565b6101ad61038536600461200f565b6116b9565b6101ad610398366004611fd5565b611789565b61034361186b565b6001600160a01b0384811660009081526001602052604090205485911633146103fe5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064015b60405180910390fd5b6000856001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561043b57600080fd5b505af115801561044f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047391906121f6565b6040517ff94d46680000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ba12222222228d8ba445958a75a0704d566bf2c89063f94d46689060240160006040518083038186803b1580156104dd57600080fd5b505afa1580156104f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105199190810190612104565b50508051909150851461056e5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420696e707574206c656e67746800000000000000000000000060448201526064016103f5565b6001600160a01b038781166000818152600160208181526040808420815160608101835281549788168152600160a01b90970460ff1615159287019290925291015484820152516370a0823160e01b8152306004820152909182916370a082319060240160206040518083038186803b1580156105ea57600080fd5b505afa1580156105fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062291906121f6565b9050808711156106745760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682042505420746f6b656e20616d6f756e74000000000060448201526064016103f5565b600081116106c45760405162461bcd60e51b815260206004820152600c60248201527f696e76616c696420706f6f6c000000000000000000000000000000000000000060448201526064016103f5565b866106d1578091506106d5565b8691505b60006001836040516020016106eb929190612651565b6040516020818303038152906040529050600060405180608001604052808781526020018c8c80806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093855250505060208201859052604091820152517f8bdb391300000000000000000000000000000000000000000000000000000000815290915073ba12222222228d8ba445958a75a0704d566bf2c890638bdb3913906107a8908a9030908190879060040161259d565b600060405180830381600087803b1580156107c257600080fd5b505af11580156107d6573d6000803e3d6000fd5b505050508b6001600160a01b03167ffbbb3d684cc731f4eff666c8534337f397ecf7937c1ed574f8626f6cb718cc01878d8d8660405161081994939291906124d5565b60405180910390a26000868660200151610834576001610837565b60005b60ff168151811061084a5761084a61283a565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d291906121f6565b905086604001518111156109c05760006127107f000000000000000000000000000000000000000000000000000000000000000089604001518461091691906127dd565b61092091906127be565b61092a919061279c565b6004549091506109459084906001600160a01b031683611877565b8e6001600160a01b03167f52b4a48c36f647498ba38efeaed299eb5e0f7688e76359a58f55738ff7725af284600460009054906101000a90046001600160a01b0316846040516109b6939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60405180910390a2505b6000886000815181106109d5576109d561283a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906121f6565b9050610a7f89600081518110610a7057610a7061283a565b60200260200101513383611877565b8e6001600160a01b03167f235d80db0a4b8dc1e99bba791b835d938cbc8cb023a88fdaba36aafd2aa9b2768a600081518110610abd57610abd61283a565b602090810291909101810151604080516001600160a01b039092168252339282019290925290810184905260600160405180910390a2600089600181518110610b0857610b0861283a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b5357600080fd5b505afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906121f6565b9050610ba38a600181518110610a7057610a7061283a565b8f6001600160a01b03167f235d80db0a4b8dc1e99bba791b835d938cbc8cb023a88fdaba36aafd2aa9b2768b600181518110610be157610be161283a565b602090810291909101810151604080516001600160a01b039092168252339282019290925290810184905260600160405180910390a250505050505050505050505050505050565b6000610c366002836119d1565b92915050565b6000546001600160a01b03163314610c965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b600480546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff1983168117909355604080519190921680825260208201939093527fc335ca37f71e695337f94e5078421114aee3f4c5d97e824efaf8578318e5e8c8910160405180910390a15050565b6000816040015151600214610d5b5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c792074776f20746f6b656e73000000000000000000000000000000000060448201526064016103f5565b610da38260400151600081518110610d7557610d7561283a565b602002602001015133308560600151600081518110610d9657610d9661283a565b60200260200101516119e4565b610dde8260400151600181518110610dbd57610dbd61283a565b602002602001015133308560600151600181518110610d9657610d9661283a565b610e398260400151600081518110610df857610df861283a565b602002602001015173ba12222222228d8ba445958a75a0704d566bf2c88460600151600081518110610e2c57610e2c61283a565b6020026020010151611b47565b610e878260400151600181518110610e5357610e5361283a565b602002602001015173ba12222222228d8ba445958a75a0704d566bf2c88460600151600181518110610e2c57610e2c61283a565b81516020830151604080850151608086015160e087015192517f236797190000000000000000000000000000000000000000000000000000000081526000956001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001695632367971995610f0b959294919330908a9060040161267d565b602060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190611ff2565b90506000816001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9c57600080fd5b505af1158015610fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd491906121f6565b9050816001600160a01b03167f2b416ce78f01c3304331a3a35005ee09bfb64c878f2be9849fc9909101bc61ac8286600001518760200151886040015189608001518a60e001513060006040516110329897969594939291906125cf565b60405180910390a26040518060600160405280336001600160a01b031681526020018560c001511515815260200185606001518660c00151611075576001611078565b60005b60ff168151811061108b5761108b61283a565b6020908102919091018101519091526001600160a01b038085166000908152600180845260409182902085518154958701511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009096169416939093179390931782559290920151910155611108600283611c9a565b6111545760405162461bcd60e51b815260206004820152600e60248201527f65786973747320616c726561647900000000000000000000000000000000000060448201526064016103f5565b6040805160808101825285820151815260608087015160208301526101008701518284015260009082015290517fb95cac2800000000000000000000000000000000000000000000000000000000815273ba12222222228d8ba445958a75a0704d566bf2c89163b95cac28916111d29185913091829160040161259d565b600060405180830381600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b50505050816001600160a01b03167f5dcdc6c8b7b09c26d0c867e99f2b7389b69d982aa8f10b1373f84667a8f58b358560400151866060015187610100015160405161124e9392919061255a565b60405180910390a2816001600160a01b0316633e5692058561012001518661014001518760a001516040518463ffffffff1660e01b8152600401611294939291906126f5565b600060405180830381600087803b1580156112ae57600080fd5b505af11580156112c2573d6000803e3d6000fd5b50505050816001600160a01b03167f5b604c3eb0508fc702242270d353c7673f02b609e03862e244766785e39c278c8561012001518661014001518760a00151604051611311939291906126f5565b60405180910390a25092915050565b6001600160a01b0382811660009081526001602052604090205483911633146113745760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064016103f5565b6040517fe01af92c00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0384169063e01af92c90602401600060405180830381600087803b1580156113d057600080fd5b505af11580156113e4573d6000803e3d6000fd5b50505050826001600160a01b03167fdc5bc5b27f91cbe9bad8b85e20c9519fb6d126629108f16d474af76579696ea983604051611425911515815260200190565b60405180910390a2505050565b6000610c36600283611caf565b606061144b6002611cd1565b905090565b6000546001600160a01b031633146114aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b6114b5600283611caf565b156115025760405162461bcd60e51b815260206004820152601460248201527f63616e277420736b696d204c425020746f6b656e00000000000000000000000060448201526064016103f5565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906121f6565b9050611589838383611877565b604080516001600160a01b038086168252841660208201529081018290527f0cfb7d414a57e3fd35da9f4b61341e65026c225646228ba0262d9264f541c32e9060600160405180910390a1505050565b6000546001600160a01b031633146116335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b61163d6000611cde565b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561168157600080fd5b505afa158015611695573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3691906121f6565b6001600160a01b03828116600090815260016020526040902054839116331461170d5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064016103f5565b6001600160a01b03838116600081815260016020908152604091829020805487861673ffffffffffffffffffffffffffffffffffffffff19821681179092558351951680865291850152927f794fb907c01822765502a338368bdc2f31ef538f609dcc19be5629fee0cedcd8910160405180910390a250505050565b6000546001600160a01b031633146117e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b6001600160a01b03811661185f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103f5565b61186881611cde565b50565b600061144b6002611d3b565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916118ec91906124a6565b6000604051808303816000865af19150503d8060008114611929576040519150601f19603f3d011682016040523d82523d6000602084013e61192e565b606091505b509150915081801561195857508051158061195857508080602001905181019061195891906121d9565b6119ca5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016103f5565b5050505050565b60006119dd8383611d45565b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691611a6191906124a6565b6000604051808303816000865af19150503d8060008114611a9e576040519150601f19603f3d011682016040523d82523d6000602084013e611aa3565b606091505b5091509150818015611acd575080511580611acd575080806020019051810190611acd91906121d9565b611b3f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016103f5565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167f095ea7b3000000000000000000000000000000000000000000000000000000001790529151600092839290871691611bbc91906124a6565b6000604051808303816000865af19150503d8060008114611bf9576040519150601f19603f3d011682016040523d82523d6000602084013e611bfe565b606091505b5091509150818015611c28575080511580611c28575080806020019051810190611c2891906121d9565b6119ca5760405162461bcd60e51b815260206004820152602b60248201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060448201527f726f7665206661696c656400000000000000000000000000000000000000000060648201526084016103f5565b60006119dd836001600160a01b038416611d6f565b6001600160a01b038116600090815260018301602052604081205415156119dd565b606060006119dd83611dbe565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c36825490565b6000826000018281548110611d5c57611d5c61283a565b9060005260206000200154905092915050565b6000818152600183016020526040812054611db657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c36565b506000610c36565b606081600001805480602002602001604051908101604052809291908181526020018280548015611e0e57602002820191906000526020600020905b815481526020019060010190808311611dfa575b50505050509050919050565b600082601f830112611e2b57600080fd5b81356020611e40611e3b83612778565b612747565b80838252828201915082860187848660051b8901011115611e6057600080fd5b60005b85811015611e88578135611e7681612866565b84529284019290840190600101611e63565b5090979650505050505050565b600082601f830112611ea657600080fd5b81356020611eb6611e3b83612778565b80838252828201915082860187848660051b8901011115611ed657600080fd5b60005b85811015611e8857813584529284019290840190600101611ed9565b600082601f830112611f0657600080fd5b81516020611f16611e3b83612778565b80838252828201915082860187848660051b8901011115611f3657600080fd5b60005b85811015611e8857815184529284019290840190600101611f39565b8035611f608161287b565b919050565b600082601f830112611f7657600080fd5b813567ffffffffffffffff811115611f9057611f90612850565b611fa3601f8201601f1916602001612747565b818152846020838601011115611fb857600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611fe757600080fd5b81356119dd81612866565b60006020828403121561200457600080fd5b81516119dd81612866565b6000806040838503121561202257600080fd5b823561202d81612866565b9150602083013561203d81612866565b809150509250929050565b6000806000806060858703121561205e57600080fd5b843561206981612866565b9350602085013567ffffffffffffffff8082111561208657600080fd5b818701915087601f83011261209a57600080fd5b8135818111156120a957600080fd5b8860208260051b85010111156120be57600080fd5b95986020929092019750949560400135945092505050565b600080604083850312156120e957600080fd5b82356120f481612866565b9150602083013561203d8161287b565b60008060006060848603121561211957600080fd5b835167ffffffffffffffff8082111561213157600080fd5b818601915086601f83011261214557600080fd5b81516020612155611e3b83612778565b8083825282820191508286018b848660051b890101111561217557600080fd5b600096505b848710156121a157805161218d81612866565b83526001969096019591830191830161217a565b50918901519197509093505050808211156121bb57600080fd5b506121c886828701611ef5565b925050604084015190509250925092565b6000602082840312156121eb57600080fd5b81516119dd8161287b565b60006020828403121561220857600080fd5b5051919050565b60006020828403121561222157600080fd5b813567ffffffffffffffff8082111561223957600080fd5b90830190610160828603121561224e57600080fd5b61225661271d565b82358281111561226557600080fd5b61227187828601611f65565b82525060208301358281111561228657600080fd5b61229287828601611f65565b6020830152506040830135828111156122aa57600080fd5b6122b687828601611e1a565b6040830152506060830135828111156122ce57600080fd5b6122da87828601611e95565b6060830152506080830135828111156122f257600080fd5b6122fe87828601611e95565b60808301525060a08301358281111561231657600080fd5b61232287828601611e95565b60a08301525061233460c08401611f55565b60c082015260e083013560e0820152610100808401358381111561235757600080fd5b61236388828701611f65565b918301919091525061012083810135908201526101409283013592810192909252509392505050565b60006020828403121561239e57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156123de5781516001600160a01b0316875295820195908201906001016123b9565b509495945050505050565b600081518084526020808501945080840160005b838110156123de578151875295820195908201906001016123fd565b600081518084526124318160208601602086016127f4565b601f01601f19169290920160200192915050565b600081516080845261245a60808501826123a5565b90506020830151848203602086015261247382826123e9565b9150506040830151848203604086015261248d8282612419565b9150506060830151151560608501528091505092915050565b600082516124b88184602087016127f4565b9190910192915050565b6020815260006119dd60208301846123a5565b6060815260006124e860608301876123a5565b82810360208401528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561252057600080fd5b8460051b808760208401378082019150506020810160008152602084830301604085015261254e8186612419565b98975050505050505050565b60608152600061256d60608301866123a5565b828103602084015261257f81866123e9565b905082810360408401526125938185612419565b9695505050505050565b84815260006001600160a01b038086166020840152808516604084015250608060608301526125936080830184612445565b60006101008a83528060208401526125e98184018b612419565b905082810360408401526125fd818a612419565b9050828103606084015261261181896123a5565b9050828103608084015261262581886123e9565b60a084019690965250506001600160a01b039290921660c0830152151560e09091015295945050505050565b604081016003841061267357634e487b7160e01b600052602160045260246000fd5b9281526020015290565b60e08152600061269060e083018a612419565b82810360208401526126a2818a612419565b905082810360408401526126b681896123a5565b905082810360608401526126ca81886123e9565b608084019690965250506001600160a01b039290921660a0830152151560c090910152949350505050565b83815282602082015260606040820152600061271460608301846123e9565b95945050505050565b604051610160810167ffffffffffffffff8111828210171561274157612741612850565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561277057612770612850565b604052919050565b600067ffffffffffffffff82111561279257612792612850565b5060051b60200190565b6000826127b957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156127d8576127d8612824565b500290565b6000828210156127ef576127ef612824565b500390565b60005b8381101561280f5781810151838201526020016127f7565b8381111561281e576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461186857600080fd5b801515811461186857600080fdfea264697066735822122042a3dba6191267f03d154b0d787539e0facad823111d685024b1a9c60bb699d464736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c80000000000000000000000005f9fbc77c3022b3492166869ca148169804967ee0000000000000000000000000f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101515760003560e01c8063673a2a1f116100cd578063a342f23811610081578063ee9ee0e411610066578063ee9ee0e414610377578063f2fde38b1461038a578063f525cb681461039d57600080fd5b8063a342f23814610351578063cac626bb1461036457600080fd5b8063715018a6116100b2578063715018a6146103035780638da5cb5b1461030b5780639c37ebb61461031c57600080fd5b8063673a2a1f146102db578063712b772f146102f057600080fd5b8063236040711161012457806346cf3e6e1161010957806346cf3e6e1461029257806351d48cea146102a55780635b16ebb7146102b857600080fd5b80632360407114610264578063411557d11461027757600080fd5b806301b1aff6146101565780630563cd7c1461019a57806305ea2183146101af57806313d21cdf146101c2575b600080fd5b61017d7f0000000000000000000000000f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e81565b6040516001600160a01b0390911681526020015b60405180910390f35b6101ad6101a8366004612048565b6103a5565b005b61017d6101bd36600461238c565b610c29565b6102376101d0366004611fd5565b6040805160608101825260008082526020820181905291810191909152506001600160a01b03908116600090815260016020818152604092839020835160608101855281549586168152600160a01b90950460ff1615159185019190915201549082015290565b6040805182516001600160a01b031681526020808401511515908201529181015190820152606001610191565b6101ad610272366004611fd5565b610c3c565b61017d73ba12222222228d8ba445958a75a0704d566bf2c881565b61017d6102a036600461220f565b610d04565b6101ad6102b33660046120d6565b611320565b6102cb6102c6366004611fd5565b611432565b6040519015158152602001610191565b6102e361143f565b60405161019191906124c2565b6101ad6102fe36600461200f565b611450565b6101ad6115d9565b6000546001600160a01b031661017d565b6103437f00000000000000000000000000000000000000000000000000000000000000c881565b604051908152602001610191565b60045461017d906001600160a01b031681565b610343610372366004611fd5565b61163f565b6101ad61038536600461200f565b6116b9565b6101ad610398366004611fd5565b611789565b61034361186b565b6001600160a01b0384811660009081526001602052604090205485911633146103fe5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064015b60405180910390fd5b6000856001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381600087803b15801561043b57600080fd5b505af115801561044f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061047391906121f6565b6040517ff94d46680000000000000000000000000000000000000000000000000000000081526004810182905290915060009073ba12222222228d8ba445958a75a0704d566bf2c89063f94d46689060240160006040518083038186803b1580156104dd57600080fd5b505afa1580156104f1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526105199190810190612104565b50508051909150851461056e5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420696e707574206c656e67746800000000000000000000000060448201526064016103f5565b6001600160a01b038781166000818152600160208181526040808420815160608101835281549788168152600160a01b90970460ff1615159287019290925291015484820152516370a0823160e01b8152306004820152909182916370a082319060240160206040518083038186803b1580156105ea57600080fd5b505afa1580156105fe573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062291906121f6565b9050808711156106745760405162461bcd60e51b815260206004820152601b60248201527f4e6f7420656e6f7567682042505420746f6b656e20616d6f756e74000000000060448201526064016103f5565b600081116106c45760405162461bcd60e51b815260206004820152600c60248201527f696e76616c696420706f6f6c000000000000000000000000000000000000000060448201526064016103f5565b866106d1578091506106d5565b8691505b60006001836040516020016106eb929190612651565b6040516020818303038152906040529050600060405180608001604052808781526020018c8c80806020026020016040519081016040528093929190818152602001838360200280828437600092018290525093855250505060208201859052604091820152517f8bdb391300000000000000000000000000000000000000000000000000000000815290915073ba12222222228d8ba445958a75a0704d566bf2c890638bdb3913906107a8908a9030908190879060040161259d565b600060405180830381600087803b1580156107c257600080fd5b505af11580156107d6573d6000803e3d6000fd5b505050508b6001600160a01b03167ffbbb3d684cc731f4eff666c8534337f397ecf7937c1ed574f8626f6cb718cc01878d8d8660405161081994939291906124d5565b60405180910390a26000868660200151610834576001610837565b60005b60ff168151811061084a5761084a61283a565b60209081029190910101516040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561089a57600080fd5b505afa1580156108ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108d291906121f6565b905086604001518111156109c05760006127107f00000000000000000000000000000000000000000000000000000000000000c889604001518461091691906127dd565b61092091906127be565b61092a919061279c565b6004549091506109459084906001600160a01b031683611877565b8e6001600160a01b03167f52b4a48c36f647498ba38efeaed299eb5e0f7688e76359a58f55738ff7725af284600460009054906101000a90046001600160a01b0316846040516109b6939291906001600160a01b039384168152919092166020820152604081019190915260600190565b60405180910390a2505b6000886000815181106109d5576109d561283a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a2057600080fd5b505afa158015610a34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a5891906121f6565b9050610a7f89600081518110610a7057610a7061283a565b60200260200101513383611877565b8e6001600160a01b03167f235d80db0a4b8dc1e99bba791b835d938cbc8cb023a88fdaba36aafd2aa9b2768a600081518110610abd57610abd61283a565b602090810291909101810151604080516001600160a01b039092168252339282019290925290810184905260600160405180910390a2600089600181518110610b0857610b0861283a565b60209081029190910101516040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610b5357600080fd5b505afa158015610b67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8b91906121f6565b9050610ba38a600181518110610a7057610a7061283a565b8f6001600160a01b03167f235d80db0a4b8dc1e99bba791b835d938cbc8cb023a88fdaba36aafd2aa9b2768b600181518110610be157610be161283a565b602090810291909101810151604080516001600160a01b039092168252339282019290925290810184905260600160405180910390a250505050505050505050505050505050565b6000610c366002836119d1565b92915050565b6000546001600160a01b03163314610c965760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b600480546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff1983168117909355604080519190921680825260208201939093527fc335ca37f71e695337f94e5078421114aee3f4c5d97e824efaf8578318e5e8c8910160405180910390a15050565b6000816040015151600214610d5b5760405162461bcd60e51b815260206004820152600f60248201527f6f6e6c792074776f20746f6b656e73000000000000000000000000000000000060448201526064016103f5565b610da38260400151600081518110610d7557610d7561283a565b602002602001015133308560600151600081518110610d9657610d9661283a565b60200260200101516119e4565b610dde8260400151600181518110610dbd57610dbd61283a565b602002602001015133308560600151600181518110610d9657610d9661283a565b610e398260400151600081518110610df857610df861283a565b602002602001015173ba12222222228d8ba445958a75a0704d566bf2c88460600151600081518110610e2c57610e2c61283a565b6020026020010151611b47565b610e878260400151600181518110610e5357610e5361283a565b602002602001015173ba12222222228d8ba445958a75a0704d566bf2c88460600151600181518110610e2c57610e2c61283a565b81516020830151604080850151608086015160e087015192517f236797190000000000000000000000000000000000000000000000000000000081526000956001600160a01b037f0000000000000000000000000f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e1695632367971995610f0b959294919330908a9060040161267d565b602060405180830381600087803b158015610f2557600080fd5b505af1158015610f39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f5d9190611ff2565b90506000816001600160a01b03166338fff2d06040518163ffffffff1660e01b8152600401602060405180830381600087803b158015610f9c57600080fd5b505af1158015610fb0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd491906121f6565b9050816001600160a01b03167f2b416ce78f01c3304331a3a35005ee09bfb64c878f2be9849fc9909101bc61ac8286600001518760200151886040015189608001518a60e001513060006040516110329897969594939291906125cf565b60405180910390a26040518060600160405280336001600160a01b031681526020018560c001511515815260200185606001518660c00151611075576001611078565b60005b60ff168151811061108b5761108b61283a565b6020908102919091018101519091526001600160a01b038085166000908152600180845260409182902085518154958701511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009096169416939093179390931782559290920151910155611108600283611c9a565b6111545760405162461bcd60e51b815260206004820152600e60248201527f65786973747320616c726561647900000000000000000000000000000000000060448201526064016103f5565b6040805160808101825285820151815260608087015160208301526101008701518284015260009082015290517fb95cac2800000000000000000000000000000000000000000000000000000000815273ba12222222228d8ba445958a75a0704d566bf2c89163b95cac28916111d29185913091829160040161259d565b600060405180830381600087803b1580156111ec57600080fd5b505af1158015611200573d6000803e3d6000fd5b50505050816001600160a01b03167f5dcdc6c8b7b09c26d0c867e99f2b7389b69d982aa8f10b1373f84667a8f58b358560400151866060015187610100015160405161124e9392919061255a565b60405180910390a2816001600160a01b0316633e5692058561012001518661014001518760a001516040518463ffffffff1660e01b8152600401611294939291906126f5565b600060405180830381600087803b1580156112ae57600080fd5b505af11580156112c2573d6000803e3d6000fd5b50505050816001600160a01b03167f5b604c3eb0508fc702242270d353c7673f02b609e03862e244766785e39c278c8561012001518661014001518760a00151604051611311939291906126f5565b60405180910390a25092915050565b6001600160a01b0382811660009081526001602052604090205483911633146113745760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064016103f5565b6040517fe01af92c00000000000000000000000000000000000000000000000000000000815282151560048201526001600160a01b0384169063e01af92c90602401600060405180830381600087803b1580156113d057600080fd5b505af11580156113e4573d6000803e3d6000fd5b50505050826001600160a01b03167fdc5bc5b27f91cbe9bad8b85e20c9519fb6d126629108f16d474af76579696ea983604051611425911515815260200190565b60405180910390a2505050565b6000610c36600283611caf565b606061144b6002611cd1565b905090565b6000546001600160a01b031633146114aa5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b6114b5600283611caf565b156115025760405162461bcd60e51b815260206004820152601460248201527f63616e277420736b696d204c425020746f6b656e00000000000000000000000060448201526064016103f5565b6040516370a0823160e01b81523060048201526000906001600160a01b038416906370a082319060240160206040518083038186803b15801561154457600080fd5b505afa158015611558573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157c91906121f6565b9050611589838383611877565b604080516001600160a01b038086168252841660208201529081018290527f0cfb7d414a57e3fd35da9f4b61341e65026c225646228ba0262d9264f541c32e9060600160405180910390a1505050565b6000546001600160a01b031633146116335760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b61163d6000611cde565b565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561168157600080fd5b505afa158015611695573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c3691906121f6565b6001600160a01b03828116600090815260016020526040902054839116331461170d5760405162461bcd60e51b815260206004820152600660248201526510b7bbb732b960d11b60448201526064016103f5565b6001600160a01b03838116600081815260016020908152604091829020805487861673ffffffffffffffffffffffffffffffffffffffff19821681179092558351951680865291850152927f794fb907c01822765502a338368bdc2f31ef538f609dcc19be5629fee0cedcd8910160405180910390a250505050565b6000546001600160a01b031633146117e35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103f5565b6001600160a01b03811661185f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016103f5565b61186881611cde565b50565b600061144b6002611d3b565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916118ec91906124a6565b6000604051808303816000865af19150503d8060008114611929576040519150601f19603f3d011682016040523d82523d6000602084013e61192e565b606091505b509150915081801561195857508051158061195857508080602001905181019061195891906121d9565b6119ca5760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016103f5565b5050505050565b60006119dd8383611d45565b9392505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691611a6191906124a6565b6000604051808303816000865af19150503d8060008114611a9e576040519150601f19603f3d011682016040523d82523d6000602084013e611aa3565b606091505b5091509150818015611acd575080511580611acd575080806020019051810190611acd91906121d9565b611b3f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016103f5565b505050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b03167f095ea7b3000000000000000000000000000000000000000000000000000000001790529151600092839290871691611bbc91906124a6565b6000604051808303816000865af19150503d8060008114611bf9576040519150601f19603f3d011682016040523d82523d6000602084013e611bfe565b606091505b5091509150818015611c28575080511580611c28575080806020019051810190611c2891906121d9565b6119ca5760405162461bcd60e51b815260206004820152602b60248201527f5472616e7366657248656c7065723a3a73616665417070726f76653a2061707060448201527f726f7665206661696c656400000000000000000000000000000000000000000060648201526084016103f5565b60006119dd836001600160a01b038416611d6f565b6001600160a01b038116600090815260018301602052604081205415156119dd565b606060006119dd83611dbe565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000610c36825490565b6000826000018281548110611d5c57611d5c61283a565b9060005260206000200154905092915050565b6000818152600183016020526040812054611db657508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610c36565b506000610c36565b606081600001805480602002602001604051908101604052809291908181526020018280548015611e0e57602002820191906000526020600020905b815481526020019060010190808311611dfa575b50505050509050919050565b600082601f830112611e2b57600080fd5b81356020611e40611e3b83612778565b612747565b80838252828201915082860187848660051b8901011115611e6057600080fd5b60005b85811015611e88578135611e7681612866565b84529284019290840190600101611e63565b5090979650505050505050565b600082601f830112611ea657600080fd5b81356020611eb6611e3b83612778565b80838252828201915082860187848660051b8901011115611ed657600080fd5b60005b85811015611e8857813584529284019290840190600101611ed9565b600082601f830112611f0657600080fd5b81516020611f16611e3b83612778565b80838252828201915082860187848660051b8901011115611f3657600080fd5b60005b85811015611e8857815184529284019290840190600101611f39565b8035611f608161287b565b919050565b600082601f830112611f7657600080fd5b813567ffffffffffffffff811115611f9057611f90612850565b611fa3601f8201601f1916602001612747565b818152846020838601011115611fb857600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215611fe757600080fd5b81356119dd81612866565b60006020828403121561200457600080fd5b81516119dd81612866565b6000806040838503121561202257600080fd5b823561202d81612866565b9150602083013561203d81612866565b809150509250929050565b6000806000806060858703121561205e57600080fd5b843561206981612866565b9350602085013567ffffffffffffffff8082111561208657600080fd5b818701915087601f83011261209a57600080fd5b8135818111156120a957600080fd5b8860208260051b85010111156120be57600080fd5b95986020929092019750949560400135945092505050565b600080604083850312156120e957600080fd5b82356120f481612866565b9150602083013561203d8161287b565b60008060006060848603121561211957600080fd5b835167ffffffffffffffff8082111561213157600080fd5b818601915086601f83011261214557600080fd5b81516020612155611e3b83612778565b8083825282820191508286018b848660051b890101111561217557600080fd5b600096505b848710156121a157805161218d81612866565b83526001969096019591830191830161217a565b50918901519197509093505050808211156121bb57600080fd5b506121c886828701611ef5565b925050604084015190509250925092565b6000602082840312156121eb57600080fd5b81516119dd8161287b565b60006020828403121561220857600080fd5b5051919050565b60006020828403121561222157600080fd5b813567ffffffffffffffff8082111561223957600080fd5b90830190610160828603121561224e57600080fd5b61225661271d565b82358281111561226557600080fd5b61227187828601611f65565b82525060208301358281111561228657600080fd5b61229287828601611f65565b6020830152506040830135828111156122aa57600080fd5b6122b687828601611e1a565b6040830152506060830135828111156122ce57600080fd5b6122da87828601611e95565b6060830152506080830135828111156122f257600080fd5b6122fe87828601611e95565b60808301525060a08301358281111561231657600080fd5b61232287828601611e95565b60a08301525061233460c08401611f55565b60c082015260e083013560e0820152610100808401358381111561235757600080fd5b61236388828701611f65565b918301919091525061012083810135908201526101409283013592810192909252509392505050565b60006020828403121561239e57600080fd5b5035919050565b600081518084526020808501945080840160005b838110156123de5781516001600160a01b0316875295820195908201906001016123b9565b509495945050505050565b600081518084526020808501945080840160005b838110156123de578151875295820195908201906001016123fd565b600081518084526124318160208601602086016127f4565b601f01601f19169290920160200192915050565b600081516080845261245a60808501826123a5565b90506020830151848203602086015261247382826123e9565b9150506040830151848203604086015261248d8282612419565b9150506060830151151560608501528091505092915050565b600082516124b88184602087016127f4565b9190910192915050565b6020815260006119dd60208301846123a5565b6060815260006124e860608301876123a5565b82810360208401528481527f07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85111561252057600080fd5b8460051b808760208401378082019150506020810160008152602084830301604085015261254e8186612419565b98975050505050505050565b60608152600061256d60608301866123a5565b828103602084015261257f81866123e9565b905082810360408401526125938185612419565b9695505050505050565b84815260006001600160a01b038086166020840152808516604084015250608060608301526125936080830184612445565b60006101008a83528060208401526125e98184018b612419565b905082810360408401526125fd818a612419565b9050828103606084015261261181896123a5565b9050828103608084015261262581886123e9565b60a084019690965250506001600160a01b039290921660c0830152151560e09091015295945050505050565b604081016003841061267357634e487b7160e01b600052602160045260246000fd5b9281526020015290565b60e08152600061269060e083018a612419565b82810360208401526126a2818a612419565b905082810360408401526126b681896123a5565b905082810360608401526126ca81886123e9565b608084019690965250506001600160a01b039290921660a0830152151560c090910152949350505050565b83815282602082015260606040820152600061271460608301846123e9565b95945050505050565b604051610160810167ffffffffffffffff8111828210171561274157612741612850565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561277057612770612850565b604052919050565b600067ffffffffffffffff82111561279257612792612850565b5060051b60200190565b6000826127b957634e487b7160e01b600052601260045260246000fd5b500490565b60008160001904831182151516156127d8576127d8612824565b500290565b6000828210156127ef576127ef612824565b500390565b60005b8381101561280f5781810151838201526020016127f7565b8381111561281e576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461186857600080fd5b801515811461186857600080fdfea264697066735822122042a3dba6191267f03d154b0d787539e0facad823111d685024b1a9c60bb699d464736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000c80000000000000000000000005f9fbc77c3022b3492166869ca148169804967ee0000000000000000000000000f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e
-----Decoded View---------------
Arg [0] : feeBPS (uint256): 200
Arg [1] : feeRecipient (address): 0x5F9FBC77C3022b3492166869cA148169804967Ee
Arg [2] : LBPFactoryAddress (address): 0x0F3e0c4218b7b0108a3643cFe9D3ec0d4F57c54e
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c8
Arg [1] : 0000000000000000000000005f9fbc77c3022b3492166869ca148169804967ee
Arg [2] : 0000000000000000000000000f3e0c4218b7b0108a3643cfe9d3ec0d4f57c54e
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.