Source Code
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PoolFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 10000 runs
Other Settings:
shanghai EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.25;
import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { LiquidityManager } from "./LiquidityManager.sol";
interface IPoolFactory {
function createPool(address _agent, address _token, uint256 _amountToBuy) external returns (address);
}
contract PoolFactory is IPoolFactory, Ownable {
IERC20 public currencyToken;
uint256 public tradingFee;
uint256 public targetPrice;
constructor(IERC20 _currencyToken, uint256 _tradingFee, uint256 _targetPrice) Ownable(msg.sender) {
currencyToken = _currencyToken;
tradingFee = _tradingFee;
targetPrice = _targetPrice;
}
function createPool(address _agent, address _token, uint256 _amountToBuy) external returns (address) {
IERC20 token = IERC20(_token);
LiquidityManager manager = new LiquidityManager(currencyToken, token, _agent, targetPrice, tradingFee);
token.transfer(address(manager), token.totalSupply());
manager.initializeBootstrapPool();
if (_amountToBuy > 0) {
manager.bootstrapPool().buy(_amountToBuy, msg.sender);
}
emit PoolCreated(_agent, address(manager));
return address(manager);
}
function setCurrencyToken(IERC20 _currencyToken) external onlyOwner {
currencyToken = _currencyToken;
}
function setTradingFee(uint256 _tradingFee) external onlyOwner {
tradingFee = _tradingFee;
}
function setTargetPrice(uint256 _targetPrice) external onlyOwner {
targetPrice = _targetPrice;
}
function transfer(address currency, address recipient, uint256 amount) external onlyOwner returns (bool) {
return IERC20(currency).transfer(recipient, amount);
}
/// @notice Emitted when a new AIAgent is created
event PoolCreated(address indexed agent, address manager);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../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.
*
* The initial owner is set to the address provided by the deployer. 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;
/**
* @dev The caller account is not authorized to perform an operation.
*/
error OwnableUnauthorizedAccount(address account);
/**
* @dev The owner is not a valid owner account. (eg. `address(0)`)
*/
error OwnableInvalidOwner(address owner);
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the address provided by the deployer as the initial owner.
*/
constructor(address initialOwner) {
if (initialOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(initialOwner);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby disabling any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(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 {
if (newOwner == address(0)) {
revert OwnableInvalidOwner(address(0));
}
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.25;
import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol";
import { IFraxswapPair } from "dev-fraxswap/src/contracts/core/interfaces/IFraxswapPair.sol";
import { IFraxswapFactory } from "dev-fraxswap/src/contracts/core/interfaces/IFraxswapFactory.sol";
import { BootstrapPool } from "./BootstrapPool.sol";
contract LiquidityManager {
address public immutable agent;
bool public initialized = false;
IERC20 public immutable agentToken;
IERC20 public immutable currencyToken;
BootstrapPool public bootstrapPool;
uint256 public immutable targetPrice;
uint256 public immutable fee;
IFraxswapFactory public constant fraxswapFactory = IFraxswapFactory(0xE30521fe7f3bEB6Ad556887b50739d6C7CA667E6);
// TODO: move to constructor
uint256 constant BOOTSTRAP_AMOUNT = 15_000; // 150% of total supply
uint256 constant BOOTSTRAP_SELL_AMOUNT = 4400; // 44% of total supply
uint256 constant LIQUIDITY_AMOUNT = 3100; // 31% of total supply
constructor(IERC20 _currencyToken, IERC20 _agentToken, address _agent, uint256 _targetPrice, uint256 _fee) {
agent = _agent;
currencyToken = _currencyToken;
agentToken = _agentToken;
targetPrice = _targetPrice;
fee = _fee;
}
function initializeBootstrapPool() external {
require(!initialized, "BootstrapPool already initialized");
// TODO: fix initial price 0
bootstrapPool = new BootstrapPool(
currencyToken, agentToken, agent, 0, agentToken.totalSupply() * BOOTSTRAP_AMOUNT / 10_000, fee
);
agentToken.transfer(address(bootstrapPool), agentToken.totalSupply() * BOOTSTRAP_SELL_AMOUNT / 10_000);
initialized = true;
}
function moveLiquidity() external {
require(!bootstrapPool.killed(), "BootstrapPool already killed");
uint256 price = bootstrapPool.getPrice();
require(price >= targetPrice, "Bootstrap end-criterion not reached");
bootstrapPool.kill();
// TODO check Fraxswap price, before adding liquidity
// Determine liquidity amount to add
uint256 liquidityAmount = agentToken.totalSupply() * LIQUIDITY_AMOUNT / 10_000;
uint256 currencyAmount = liquidityAmount * price / 1e18;
if (currencyAmount > currencyToken.balanceOf(address(this))) {
currencyAmount = currencyToken.balanceOf(address(this));
liquidityAmount = currencyAmount * 1e18 / price;
}
// Add liquidity to Fraxswap
IFraxswapPair fraxswapPair =
IFraxswapPair(fraxswapFactory.createPair(address(currencyToken), address(agentToken), fee));
agentToken.transfer(address(fraxswapPair), liquidityAmount);
currencyToken.transfer(address(fraxswapPair), currencyAmount);
fraxswapPair.mint(agent);
// Send all remaining tokens to the owner.
agentToken.transfer(address(agent), agentToken.balanceOf(address(this)));
currencyToken.transfer(address(agent), currencyToken.balanceOf(address(this)));
// TODO: send collected fees to AgentFactory & think about reward for creator
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @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;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity ^0.8.0;
import { IUniswapV2Pair } from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol";
/// @dev Fraxswap LP Pair Interface
interface IFraxswapPair is IUniswapV2Pair {
// TWAMM
struct TWAPObservation {
uint256 timestamp;
uint256 price0CumulativeLast;
uint256 price1CumulativeLast;
}
function TWAPObservationHistory(uint256 index) external view returns (TWAPObservation memory);
event LongTermSwap0To1(address indexed addr, uint256 orderId, uint256 amount0In, uint256 numberOfTimeIntervals);
event LongTermSwap1To0(address indexed addr, uint256 orderId, uint256 amount1In, uint256 numberOfTimeIntervals);
event CancelLongTermOrder(
address indexed addr,
uint256 orderId,
address sellToken,
uint256 unsoldAmount,
address buyToken,
uint256 purchasedAmount
);
event WithdrawProceedsFromLongTermOrder(
address indexed addr,
uint256 orderId,
address indexed proceedToken,
uint256 proceeds,
bool orderExpired
);
function fee() external view returns (uint256);
function longTermSwapFrom0To1(uint256 amount0In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function longTermSwapFrom1To0(uint256 amount1In, uint256 numberOfTimeIntervals) external returns (uint256 orderId);
function cancelLongTermSwap(uint256 orderId) external;
function withdrawProceedsFromLongTermSwap(
uint256 orderId
) external returns (bool is_expired, address rewardTkn, uint256 totalReward);
function executeVirtualOrders(uint256 blockTimestamp) external;
function getAmountOut(uint256 amountIn, address tokenIn) external view returns (uint256);
function getAmountIn(uint256 amountOut, address tokenOut) external view returns (uint256);
function orderTimeInterval() external returns (uint256);
function getTWAPHistoryLength() external view returns (uint256);
function getTwammReserves()
external
view
returns (
uint112 _reserve0,
uint112 _reserve1,
uint32 _blockTimestampLast,
uint112 _twammReserve0,
uint112 _twammReserve1,
uint256 _fee
);
function getReserveAfterTwamm(
uint256 blockTimestamp
)
external
view
returns (
uint112 _reserve0,
uint112 _reserve1,
uint256 lastVirtualOrderTimestamp,
uint112 _twammReserve0,
uint112 _twammReserve1
);
function getNextOrderID() external view returns (uint256);
function getOrderIDsForUser(address user) external view returns (uint256[] memory);
function getOrderIDsForUserLength(address user) external view returns (uint256);
function twammUpToDate() external view returns (bool);
function getTwammState()
external
view
returns (
uint256 token0Rate,
uint256 token1Rate,
uint256 lastVirtualOrderTimestamp,
uint256 orderTimeInterval_rtn,
uint256 rewardFactorPool0,
uint256 rewardFactorPool1
);
function getTwammSalesRateEnding(
uint256 _blockTimestamp
) external view returns (uint256 orderPool0SalesRateEnding, uint256 orderPool1SalesRateEnding);
function getTwammRewardFactor(
uint256 _blockTimestamp
) external view returns (uint256 rewardFactorPool0AtTimestamp, uint256 rewardFactorPool1AtTimestamp);
function getTwammOrder(
uint256 orderId
)
external
view
returns (
uint256 id,
uint256 creationTimestamp,
uint256 expirationTimestamp,
uint256 saleRate,
address owner,
address sellTokenAddr,
address buyTokenAddr
);
function getTwammOrderProceedsView(
uint256 orderId,
uint256 blockTimestamp
) external view returns (bool orderExpired, uint256 totalReward);
function getTwammOrderProceeds(uint256 orderId) external returns (bool orderExpired, uint256 totalReward);
function togglePauseNewSwaps() external;
}pragma solidity ^0.8.0;
import { IUniswapV2Factory } from "@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol";
interface IFraxswapFactory is IUniswapV2Factory {
function createPair(address tokenA, address tokenB, uint256 fee) external returns (address pair);
function globalPause() external view returns (bool);
function toggleGlobalPause() external;
}// SPDX-License-Identifier: UNLICENSED
pragma solidity >=0.8.25;
import { IERC20 } from "@openzeppelin/contracts/interfaces/IERC20.sol";
import { ReentrancyGuard } from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
contract BootstrapPool is ReentrancyGuard {
address public immutable owner;
uint256 public immutable fee;
IERC20 public immutable agentToken;
IERC20 public immutable currencyToken;
uint256 phantomAmount;
uint256 tokenAmount;
uint256 public immutable minCurrencyAmount;
bool public killed;
modifier notKilled() {
if (killed) revert BootstrapPoolKilled();
_;
}
modifier onlyOwner() {
if (msg.sender != owner) revert NotOwner();
_;
}
constructor(
IERC20 _currencyToken,
IERC20 _agentToken,
address _agent,
uint256 _initialPrice,
uint256 _bootstrapAmount,
uint256 _fee
) {
owner = _agent;
fee = 10_000 - _fee; // TODO: why?
currencyToken = _currencyToken;
agentToken = _agentToken;
tokenAmount = _bootstrapAmount;
phantomAmount = _initialPrice * tokenAmount / 1e18;
}
function buy(uint256 _amountIn) external returns (uint256) {
return buy(_amountIn, msg.sender);
}
function buy(uint256 _amountIn, address _recipient) public nonReentrant notKilled returns (uint256) {
uint256 _amountOut = getAmountOut(_amountIn, address(currencyToken));
tokenAmount -= _amountOut;
currencyToken.transferFrom(msg.sender, address(this), _amountIn);
agentToken.transfer(_recipient, _amountOut);
emit swap(address(currencyToken), address(agentToken), _amountIn, _amountOut);
return _amountOut;
}
function sell(uint256 _amountIn) external returns (uint256) {
return sell(_amountIn, msg.sender);
}
function sell(uint256 _amountIn, address _recipient) public nonReentrant notKilled returns (uint256) {
uint256 _amountOut = getAmountOut(_amountIn, address(agentToken));
tokenAmount += _amountIn;
agentToken.transferFrom(msg.sender, address(this), _amountIn);
currencyToken.transfer(_recipient, _amountOut);
emit swap(address(agentToken), address(currencyToken), _amountIn, _amountOut);
return _amountOut;
}
function kill() external nonReentrant onlyOwner {
killed = true;
agentToken.transfer(owner, agentToken.balanceOf(address(this)));
currencyToken.transfer(owner, currencyToken.balanceOf(address(this)));
}
function getPrice() external view notKilled returns (uint256 _price) {
_price = (phantomAmount + currencyToken.balanceOf(address(this))) * 1e18 / tokenAmount;
}
function getAmountOut(uint256 _amountIn, address _tokenIn) public view notKilled returns (uint256 _amountOut) {
uint256 _reserveIn;
uint256 _reserveOut;
if (_tokenIn == address(currencyToken)) {
_reserveIn = phantomAmount + currencyToken.balanceOf(address(this));
_reserveOut = tokenAmount;
} else if (_tokenIn == address(agentToken)) {
_reserveIn = tokenAmount;
_reserveOut = phantomAmount + currencyToken.balanceOf(address(this));
}
require(_amountIn > 0 && _reserveIn > 0 && _reserveOut > 0); // INSUFFICIENT_INPUT_AMOUNT,
// INSUFFICIENT_LIQUIDITY
uint256 _amountInWithFee = _amountIn * fee;
uint256 _numerator = _amountInWithFee * _reserveOut;
uint256 _denominator = (_reserveIn * 10_000) + _amountInWithFee;
_amountOut = _numerator / _denominator;
}
error BootstrapPoolKilled();
error NotOwner();
/// @notice Emitted when there is a swap in the pool
event swap(address indexed tokenIn, address indexed tokenOut, uint256 amountIn, uint256 amountOut);
}pragma solidity >=0.5.0;
interface IUniswapV2Pair {
event Approval(address indexed owner, address indexed spender, uint value);
event Transfer(address indexed from, address indexed to, uint value);
function name() external pure returns (string memory);
function symbol() external pure returns (string memory);
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint);
function balanceOf(address owner) external view returns (uint);
function allowance(address owner, address spender) external view returns (uint);
function approve(address spender, uint value) external returns (bool);
function transfer(address to, uint value) external returns (bool);
function transferFrom(address from, address to, uint value) external returns (bool);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function PERMIT_TYPEHASH() external pure returns (bytes32);
function nonces(address owner) external view returns (uint);
function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external;
event Mint(address indexed sender, uint amount0, uint amount1);
event Burn(address indexed sender, uint amount0, uint amount1, address indexed to);
event Swap(
address indexed sender,
uint amount0In,
uint amount1In,
uint amount0Out,
uint amount1Out,
address indexed to
);
event Sync(uint112 reserve0, uint112 reserve1);
function MINIMUM_LIQUIDITY() external pure returns (uint);
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
function price0CumulativeLast() external view returns (uint);
function price1CumulativeLast() external view returns (uint);
function kLast() external view returns (uint);
function mint(address to) external returns (uint liquidity);
function burn(address to) external returns (uint amount0, uint amount1);
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external;
function skim(address to) external;
function sync() external;
function initialize(address, address) external;
}pragma solidity >=0.5.0;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}{
"remappings": [
"@chainlink/=node_modules/@chainlink/",
"@eth-optimism/=node_modules/@eth-optimism/",
"@openzeppelin/=node_modules/@openzeppelin/",
"@prb/test/=node_modules/dev-fraxswap/node_modules/@prb/test/",
"@uniswap/=node_modules/@uniswap/",
"dev-fraxswap/=node_modules/dev-fraxswap/",
"ds-test/=node_modules/ds-test/",
"forge-std/=node_modules/forge-std/",
"frax-standard-solidity/=node_modules/frax-standard-solidity/",
"frax-std/=node_modules/dev-fraxswap/node_modules/frax-standard-solidity/src/",
"solidity-bytes-utils/=node_modules/solidity-bytes-utils/"
],
"optimizer": {
"enabled": true,
"runs": 10000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "shanghai",
"viaIR": false,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract IERC20","name":"_currencyToken","type":"address"},{"internalType":"uint256","name":"_tradingFee","type":"uint256"},{"internalType":"uint256","name":"_targetPrice","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"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":"agent","type":"address"},{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"PoolCreated","type":"event"},{"inputs":[{"internalType":"address","name":"_agent","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amountToBuy","type":"uint256"}],"name":"createPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currencyToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_currencyToken","type":"address"}],"name":"setCurrencyToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_targetPrice","type":"uint256"}],"name":"setTargetPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tradingFee","type":"uint256"}],"name":"setTradingFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"targetPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tradingFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"currency","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
608060405234801561000f575f80fd5b506040516130f03803806130f083398101604081905261002e916100d8565b338061005357604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61005c81610089565b50600180546001600160a01b0319166001600160a01b039490941693909317909255600255600355610117565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f805f606084860312156100ea575f80fd5b83516001600160a01b0381168114610100575f80fd5b602085015160409095015190969495509392505050565b612fcc806101245f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063beabacc811610058578063beabacc81461019c578063dc38679c146101bf578063f2fde38b146101c8575f80fd5b8063715018a6146101645780638da5cb5b1461016c578063b0d54bcf14610189575f80fd5b806356f43352116100ad57806356f433521461011a5780636a64eff8146101315780636b2fa37414610144575f80fd5b806309f5b226146100c857806351810fb5146100dd575b5f80fd5b6100db6100d63660046107c4565b6101db565b005b6100f06100eb3660046107e6565b61022a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012360025481565b604051908152602001610111565b6100db61013f366004610824565b610594565b6001546100f09073ffffffffffffffffffffffffffffffffffffffff1681565b6100db6105a1565b5f5473ffffffffffffffffffffffffffffffffffffffff166100f0565b6100db610197366004610824565b6105b4565b6101af6101aa3660046107e6565b6105c1565b6040519015158152602001610111565b61012360035481565b6100db6101d63660046107c4565b610668565b6101e36106d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6001546003546002546040515f938693859373ffffffffffffffffffffffffffffffffffffffff9092169285928a929161026390610796565b73ffffffffffffffffffffffffffffffffffffffff958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103905ff0801580156102b7573d5f803e3d5ffd5b5090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610344919061083b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156103b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d59190610852565b508073ffffffffffffffffffffffffffffffffffffffff16637b9df2816040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561041b575f80fd5b505af115801561042d573d5f803e3d5ffd5b505050505f84111561053e578073ffffffffffffffffffffffffffffffffffffffff16637269bdc66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a69190610871565b6040517f7deb60250000000000000000000000000000000000000000000000000000000081526004810186905233602482015273ffffffffffffffffffffffffffffffffffffffff9190911690637deb6025906044016020604051808303815f875af1158015610518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061053c919061083b565b505b60405173ffffffffffffffffffffffffffffffffffffffff82811682528716907f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48969060200160405180910390a295945050505050565b61059c6106d0565b600355565b6105a96106d0565b6105b25f610722565b565b6105bc6106d0565b600255565b5f6105ca6106d0565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af115801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190610852565b949350505050565b6106706106d0565b73ffffffffffffffffffffffffffffffffffffffff81166106c4576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6106cd81610722565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146105b2576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016106bb565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127338061088d83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146106cd575f80fd5b5f602082840312156107d4575f80fd5b81356107df816107a3565b9392505050565b5f805f606084860312156107f8575f80fd5b8335610803816107a3565b92506020840135610813816107a3565b929592945050506040919091013590565b5f60208284031215610834575f80fd5b5035919050565b5f6020828403121561084b575f80fd5b5051919050565b5f60208284031215610862575f80fd5b815180151581146107df575f80fd5b5f60208284031215610881575f80fd5b81516107df816107a356fe6101206040525f805460ff19169055348015610019575f80fd5b5060405161273338038061273383398101604081905261003891610074565b6001600160a01b0392831660805293821660c052911660a05260e052610100526100ce565b6001600160a01b0381168114610071575f80fd5b50565b5f805f805f60a08688031215610088575f80fd5b85516100938161005d565b60208701519095506100a48161005d565b60408701519094506100b58161005d565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161259661019d5f395f81816101dc015281816103c90152610bda01525f81816101a701526107d801525f818160e3015281816102be015281816109fb01528181610aae01528181610b8b01528181610d67015261101801525f8181610178015281816102df015281816103280152818161048f015281816104f30152818161090b01528181610bb301528181610cae0152610eb001525f81816102030152818161030001528181610e0f01528181610eee015261105601526125965ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c8063b05707e911610072578063dc38679c11610058578063dc38679c146101a2578063ddca3f43146101d7578063f5ff5c76146101fe575f80fd5b8063b05707e914610173578063b90a26ab1461019a575f80fd5b80637269bdc6116100a25780637269bdc61461012a57806375268ff71461014e5780637b9df28114610169575f80fd5b8063158ef93e146100bd5780636b2fa374146100de575b5f80fd5b5f546100c99060ff1681565b60405190151581526020015b60405180910390f35b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d5565b5f5461010590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b61010573e30521fe7f3beb6ad556887b50739d6c7ca667e681565b610171610225565b005b6101057f000000000000000000000000000000000000000000000000000000000000000081565b610171610650565b6101c97f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016100d5565b6101c97f000000000000000000000000000000000000000000000000000000000000000081565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460ff16156102bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f426f6f747374726170506f6f6c20616c726561647920696e697469616c697a6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005f612710613a987f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561038f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b39190611165565b6103bd919061117c565b6103c791906111be565b7f00000000000000000000000000000000000000000000000000000000000000006040516103f490611158565b73ffffffffffffffffffffffffffffffffffffffff968716815294861660208601529490921660408401526060830152608082015260a081019190915260c001604051809103905ff08015801561044d573d5f803e3d5ffd5b505f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106111307f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561055a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057e9190611165565b610588919061117c565b61059291906111be565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156105ff573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062391906111f6565b505f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f3a0e416040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106de91906111f6565b15610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f6f747374726170506f6f6c20616c7265616479206b696c6c65640000000060448201526064016102b3565b5f8060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d49190611165565b90507f0000000000000000000000000000000000000000000000000000000000000000811015610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f426f6f74737472617020656e642d637269746572696f6e206e6f74207265616360448201527f686564000000000000000000000000000000000000000000000000000000000060648201526084016102b3565b5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341c0e1b56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156108ec575f80fd5b505af11580156108fe573d5f803e3d5ffd5b505050505f612710610c1c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109969190611165565b6109a0919061117c565b6109aa91906111be565b90505f670de0b6b3a76400006109c0848461117c565b6109ca91906111be565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a799190611165565b811115610b4e576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2c9190611165565b905082610b4182670de0b6b3a764000061117c565b610b4b91906111be565b91505b6040517f6b600d1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201527f000000000000000000000000000000000000000000000000000000000000000060448201525f9073e30521fe7f3beb6ad556887b50739d6c7ca667e690636b600d1c906064016020604051808303815f875af1158015610c3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5f919061121c565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152602482018690529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015610cf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1a91906111f6565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610dad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd191906111f6565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152821690636a627842906024016020604051808303815f875af1158015610e5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190611165565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa158015610f34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f589190611165565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610fc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe991906111f6565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa15801561109c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c09190611165565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af115801561112d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115191906111f6565b5050505050565b61133a8061125083390190565b5f60208284031215611175575f80fd5b5051919050565b80820281158282048414176111b8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b5f826111f1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215611206575f80fd5b81518015158114611215575f80fd5b9392505050565b5f6020828403121561122c575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114611215575f80fdfe610120604052348015610010575f80fd5b5060405161133a38038061133a83398101604081905261002f916100aa565b60015f556001600160a01b03841660805261004c81612710610123565b60a0526001600160a01b0380871660e052851660c0526002829055670de0b6b3a764000061007a838561013c565b6100849190610153565b60015550610172945050505050565b6001600160a01b03811681146100a7575f80fd5b50565b5f805f805f8060c087890312156100bf575f80fd5b86516100ca81610093565b60208801519096506100db81610093565b60408801519095506100ec81610093565b80945050606087015192506080870151915060a087015190509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b818103818111156101365761013661010f565b92915050565b80820281158282048414176101365761013661010f565b5f8261016d57634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e051610100516110f86102425f395f61013001525f8181610157015281816103f7015281816104640152818161075b015281816108ed0152818161096401528181610ad401528181610bb301528181610cb801528181610d370152610e5501525f81816101e5015281816102b40152818161032b0152818161049b0152818161060801528181610a3001528181610a9d0152610dd001525f818161021f0152610f0a01525f81816101b60152818161054301528181610631015261079901526110f85ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80638da5cb5b11610088578063d96a094a11610063578063d96a094a14610207578063ddca3f431461021a578063e4849b3214610241578063f140a35a14610254575f80fd5b80638da5cb5b146101b157806398d5fdca146101d8578063b05707e9146101e0575f80fd5b80634d290349116100b85780634d2903491461012b5780636b2fa374146101525780637deb60251461019e575f80fd5b80631f3a0e41146100de5780634189a68e1461010057806341c0e1b514610121575b5f80fd5b6003546100eb9060ff1681565b60405190151581526020015b60405180910390f35b61011361010e366004610faf565b610267565b6040519081526020016100f7565b610129610523565b005b6101137f000000000000000000000000000000000000000000000000000000000000000081565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f7565b6101136101ac366004610faf565b6108a0565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b610113610b43565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b610113610215366004610ff5565b610c5f565b6101137f000000000000000000000000000000000000000000000000000000000000000081565b61011361024f366004610ff5565b610c6a565b610113610262366004610faf565b610c75565b5f610270610f6e565b60035460ff16156102ad576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102d8847f0000000000000000000000000000000000000000000000000000000000000000610c75565b90508360025f8282546102eb9190611039565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610386573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103aa919061104c565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561043d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610461919061104c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167ffe029156f2bc7af96741c1678949bfdb3f20c6924bfe76f411d60125b988ddf2868460405161050a929190918252602082015260400190565b60405180910390a3905061051d60015f55565b92915050565b61052b610f6e565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461059a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa158015610677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069b9190611072565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610708573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072c919061104c565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa1580156107df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190611072565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610894919061104c565b5061089e60015f55565b565b5f6108a9610f6e565b60035460ff16156108e6576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610911847f0000000000000000000000000000000000000000000000000000000000000000610c75565b90508060025f8282546109249190611089565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af11580156109bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e3919061104c565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9a919061104c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167ffe029156f2bc7af96741c1678949bfdb3f20c6924bfe76f411d60125b988ddf2868460405161050a929190918252602082015260400190565b6003545f9060ff1615610b82576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610c0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c319190611072565b600154610c3e9190611039565b610c5090670de0b6b3a764000061109c565b610c5a91906110b3565b905090565b5f61051d82336108a0565b5f61051d8233610267565b6003545f9060ff1615610cb4576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610dce576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610d91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db59190611072565b600154610dc29190611039565b91506002549050610ee3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610ee3576002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed39190611072565b600154610ee09190611039565b90505b5f85118015610ef157505f82115b8015610efc57505f81115b610f04575f80fd5b5f610f2f7f00000000000000000000000000000000000000000000000000000000000000008761109c565b90505f610f3c838361109c565b90505f82610f4c8661271061109c565b610f569190611039565b9050610f6281836110b3565b98975050505050505050565b60025f5403610fa9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f8060408385031215610fc0575f80fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff81168114610fea575f80fd5b809150509250929050565b5f60208284031215611005575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561051d5761051d61100c565b5f6020828403121561105c575f80fd5b8151801515811461106b575f80fd5b9392505050565b5f60208284031215611082575f80fd5b5051919050565b8181038181111561051d5761051d61100c565b808202811582820484141761051d5761051d61100c565b5f826110e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000819000aa164736f6c6343000819000aa164736f6c6343000819000a0000000000000000000000006efb84bda519726fa1c65558e520b92b51712101000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000032
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063715018a61161007d578063beabacc811610058578063beabacc81461019c578063dc38679c146101bf578063f2fde38b146101c8575f80fd5b8063715018a6146101645780638da5cb5b1461016c578063b0d54bcf14610189575f80fd5b806356f43352116100ad57806356f433521461011a5780636a64eff8146101315780636b2fa37414610144575f80fd5b806309f5b226146100c857806351810fb5146100dd575b5f80fd5b6100db6100d63660046107c4565b6101db565b005b6100f06100eb3660046107e6565b61022a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b61012360025481565b604051908152602001610111565b6100db61013f366004610824565b610594565b6001546100f09073ffffffffffffffffffffffffffffffffffffffff1681565b6100db6105a1565b5f5473ffffffffffffffffffffffffffffffffffffffff166100f0565b6100db610197366004610824565b6105b4565b6101af6101aa3660046107e6565b6105c1565b6040519015158152602001610111565b61012360035481565b6100db6101d63660046107c4565b610668565b6101e36106d0565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6001546003546002546040515f938693859373ffffffffffffffffffffffffffffffffffffffff9092169285928a929161026390610796565b73ffffffffffffffffffffffffffffffffffffffff958616815293851660208501529390911660408301526060820152608081019190915260a001604051809103905ff0801580156102b7573d5f803e3d5ffd5b5090508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb828473ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610320573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610344919061083b565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156103b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103d59190610852565b508073ffffffffffffffffffffffffffffffffffffffff16637b9df2816040518163ffffffff1660e01b81526004015f604051808303815f87803b15801561041b575f80fd5b505af115801561042d573d5f803e3d5ffd5b505050505f84111561053e578073ffffffffffffffffffffffffffffffffffffffff16637269bdc66040518163ffffffff1660e01b8152600401602060405180830381865afa158015610482573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a69190610871565b6040517f7deb60250000000000000000000000000000000000000000000000000000000081526004810186905233602482015273ffffffffffffffffffffffffffffffffffffffff9190911690637deb6025906044016020604051808303815f875af1158015610518573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061053c919061083b565b505b60405173ffffffffffffffffffffffffffffffffffffffff82811682528716907f4f2ce4e40f623ca765fc0167a25cb7842ceaafb8d82d3dec26ca0d0e0d2d48969060200160405180910390a295945050505050565b61059c6106d0565b600355565b6105a96106d0565b6105b25f610722565b565b6105bc6106d0565b600255565b5f6105ca6106d0565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301526024820184905285169063a9059cbb906044016020604051808303815f875af115801561063c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106609190610852565b949350505050565b6106706106d0565b73ffffffffffffffffffffffffffffffffffffffff81166106c4576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b6106cd81610722565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146105b2576040517f118cdaa70000000000000000000000000000000000000000000000000000000081523360048201526024016106bb565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6127338061088d83390190565b73ffffffffffffffffffffffffffffffffffffffff811681146106cd575f80fd5b5f602082840312156107d4575f80fd5b81356107df816107a3565b9392505050565b5f805f606084860312156107f8575f80fd5b8335610803816107a3565b92506020840135610813816107a3565b929592945050506040919091013590565b5f60208284031215610834575f80fd5b5035919050565b5f6020828403121561084b575f80fd5b5051919050565b5f60208284031215610862575f80fd5b815180151581146107df575f80fd5b5f60208284031215610881575f80fd5b81516107df816107a356fe6101206040525f805460ff19169055348015610019575f80fd5b5060405161273338038061273383398101604081905261003891610074565b6001600160a01b0392831660805293821660c052911660a05260e052610100526100ce565b6001600160a01b0381168114610071575f80fd5b50565b5f805f805f60a08688031215610088575f80fd5b85516100938161005d565b60208701519095506100a48161005d565b60408701519094506100b58161005d565b6060870151608090970151959894975095949392505050565b60805160a05160c05160e0516101005161259661019d5f395f81816101dc015281816103c90152610bda01525f81816101a701526107d801525f818160e3015281816102be015281816109fb01528181610aae01528181610b8b01528181610d67015261101801525f8181610178015281816102df015281816103280152818161048f015281816104f30152818161090b01528181610bb301528181610cae0152610eb001525f81816102030152818161030001528181610e0f01528181610eee015261105601526125965ff3fe608060405234801561000f575f80fd5b50600436106100b9575f3560e01c8063b05707e911610072578063dc38679c11610058578063dc38679c146101a2578063ddca3f43146101d7578063f5ff5c76146101fe575f80fd5b8063b05707e914610173578063b90a26ab1461019a575f80fd5b80637269bdc6116100a25780637269bdc61461012a57806375268ff71461014e5780637b9df28114610169575f80fd5b8063158ef93e146100bd5780636b2fa374146100de575b5f80fd5b5f546100c99060ff1681565b60405190151581526020015b60405180910390f35b6101057f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d5565b5f5461010590610100900473ffffffffffffffffffffffffffffffffffffffff1681565b61010573e30521fe7f3beb6ad556887b50739d6c7ca667e681565b610171610225565b005b6101057f000000000000000000000000000000000000000000000000000000000000000081565b610171610650565b6101c97f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016100d5565b6101c97f000000000000000000000000000000000000000000000000000000000000000081565b6101057f000000000000000000000000000000000000000000000000000000000000000081565b5f5460ff16156102bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f426f6f747374726170506f6f6c20616c726561647920696e697469616c697a6560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000005f612710613a987f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561038f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103b39190611165565b6103bd919061117c565b6103c791906111be565b7f00000000000000000000000000000000000000000000000000000000000000006040516103f490611158565b73ffffffffffffffffffffffffffffffffffffffff968716815294861660208601529490921660408401526060830152608082015260a081019190915260c001604051809103905ff08015801561044d573d5f803e3d5ffd5b505f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff166127106111307f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561055a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061057e9190611165565b610588919061117c565b61059291906111be565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af11580156105ff573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062391906111f6565b505f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631f3a0e416040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106ba573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106de91906111f6565b15610745576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f426f6f747374726170506f6f6c20616c7265616479206b696c6c65640000000060448201526064016102b3565b5f8060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166398d5fdca6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107b0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107d49190611165565b90507f0000000000000000000000000000000000000000000000000000000000000000811015610886576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f426f6f74737472617020656e642d637269746572696f6e206e6f74207265616360448201527f686564000000000000000000000000000000000000000000000000000000000060648201526084016102b3565b5f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166341c0e1b56040518163ffffffff1660e01b81526004015f604051808303815f87803b1580156108ec575f80fd5b505af11580156108fe573d5f803e3d5ffd5b505050505f612710610c1c7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610972573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109969190611165565b6109a0919061117c565b6109aa91906111be565b90505f670de0b6b3a76400006109c0848461117c565b6109ca91906111be565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529091507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610a55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a799190611165565b811115610b4e576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610b08573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b2c9190611165565b905082610b4182670de0b6b3a764000061117c565b610b4b91906111be565b91505b6040517f6b600d1c00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000811660048301527f00000000000000000000000000000000000000000000000000000000000000001660248201527f000000000000000000000000000000000000000000000000000000000000000060448201525f9073e30521fe7f3beb6ad556887b50739d6c7ca667e690636b600d1c906064016020604051808303815f875af1158015610c3b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c5f919061121c565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8083166004830152602482018690529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015610cf6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d1a91906111f6565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8281166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610dad573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dd191906111f6565b506040517f6a62784200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152821690636a627842906024016020604051808303815f875af1158015610e5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e819190611165565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa158015610f34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f589190611165565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610fc5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe991906111f6565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa15801561109c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110c09190611165565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af115801561112d573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061115191906111f6565b5050505050565b61133a8061125083390190565b5f60208284031215611175575f80fd5b5051919050565b80820281158282048414176111b8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b92915050565b5f826111f1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b5f60208284031215611206575f80fd5b81518015158114611215575f80fd5b9392505050565b5f6020828403121561122c575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114611215575f80fdfe610120604052348015610010575f80fd5b5060405161133a38038061133a83398101604081905261002f916100aa565b60015f556001600160a01b03841660805261004c81612710610123565b60a0526001600160a01b0380871660e052851660c0526002829055670de0b6b3a764000061007a838561013c565b6100849190610153565b60015550610172945050505050565b6001600160a01b03811681146100a7575f80fd5b50565b5f805f805f8060c087890312156100bf575f80fd5b86516100ca81610093565b60208801519096506100db81610093565b60408801519095506100ec81610093565b80945050606087015192506080870151915060a087015190509295509295509295565b634e487b7160e01b5f52601160045260245ffd5b818103818111156101365761013661010f565b92915050565b80820281158282048414176101365761013661010f565b5f8261016d57634e487b7160e01b5f52601260045260245ffd5b500490565b60805160a05160c05160e051610100516110f86102425f395f61013001525f8181610157015281816103f7015281816104640152818161075b015281816108ed0152818161096401528181610ad401528181610bb301528181610cb801528181610d370152610e5501525f81816101e5015281816102b40152818161032b0152818161049b0152818161060801528181610a3001528181610a9d0152610dd001525f818161021f0152610f0a01525f81816101b60152818161054301528181610631015261079901526110f85ff3fe608060405234801561000f575f80fd5b50600436106100da575f3560e01c80638da5cb5b11610088578063d96a094a11610063578063d96a094a14610207578063ddca3f431461021a578063e4849b3214610241578063f140a35a14610254575f80fd5b80638da5cb5b146101b157806398d5fdca146101d8578063b05707e9146101e0575f80fd5b80634d290349116100b85780634d2903491461012b5780636b2fa374146101525780637deb60251461019e575f80fd5b80631f3a0e41146100de5780634189a68e1461010057806341c0e1b514610121575b5f80fd5b6003546100eb9060ff1681565b60405190151581526020015b60405180910390f35b61011361010e366004610faf565b610267565b6040519081526020016100f7565b610129610523565b005b6101137f000000000000000000000000000000000000000000000000000000000000000081565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100f7565b6101136101ac366004610faf565b6108a0565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b610113610b43565b6101797f000000000000000000000000000000000000000000000000000000000000000081565b610113610215366004610ff5565b610c5f565b6101137f000000000000000000000000000000000000000000000000000000000000000081565b61011361024f366004610ff5565b610c6a565b610113610262366004610faf565b610c75565b5f610270610f6e565b60035460ff16156102ad576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6102d8847f0000000000000000000000000000000000000000000000000000000000000000610c75565b90508360025f8282546102eb9190611039565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af1158015610386573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103aa919061104c565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af115801561043d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610461919061104c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167ffe029156f2bc7af96741c1678949bfdb3f20c6924bfe76f411d60125b988ddf2868460405161050a929190918252602082015260400190565b60405180910390a3905061051d60015f55565b92915050565b61052b610f6e565b3373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461059a576040517f30cd747100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa158015610677573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061069b9190611072565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610708573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072c919061104c565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063a9059cbb907f00000000000000000000000000000000000000000000000000000000000000009083906370a0823190602401602060405180830381865afa1580156107df573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108039190611072565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff909216600483015260248201526044016020604051808303815f875af1158015610870573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610894919061104c565b5061089e60015f55565b565b5f6108a9610f6e565b60035460ff16156108e6576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f610911847f0000000000000000000000000000000000000000000000000000000000000000610c75565b90508060025f8282546109249190611089565b90915550506040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018590527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303815f875af11580156109bf573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109e3919061104c565b506040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015610a76573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a9a919061104c565b507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167ffe029156f2bc7af96741c1678949bfdb3f20c6924bfe76f411d60125b988ddf2868460405161050a929190918252602082015260400190565b6003545f9060ff1615610b82576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610c0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c319190611072565b600154610c3e9190611039565b610c5090670de0b6b3a764000061109c565b610c5a91906110b3565b905090565b5f61051d82336108a0565b5f61051d8233610267565b6003545f9060ff1615610cb4576040517f873187d800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610dce576040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610d91573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db59190611072565b600154610dc29190611039565b91506002549050610ee3565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603610ee3576002546040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529092507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015610eaf573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ed39190611072565b600154610ee09190611039565b90505b5f85118015610ef157505f82115b8015610efc57505f81115b610f04575f80fd5b5f610f2f7f00000000000000000000000000000000000000000000000000000000000000008761109c565b90505f610f3c838361109c565b90505f82610f4c8661271061109c565b610f569190611039565b9050610f6281836110b3565b98975050505050505050565b60025f5403610fa9576040517f3ee5aeb500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60025f55565b5f8060408385031215610fc0575f80fd5b82359150602083013573ffffffffffffffffffffffffffffffffffffffff81168114610fea575f80fd5b809150509250929050565b5f60208284031215611005575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561051d5761051d61100c565b5f6020828403121561105c575f80fd5b8151801515811461106b575f80fd5b9392505050565b5f60208284031215611082575f80fd5b5051919050565b8181038181111561051d5761051d61100c565b808202811582820484141761051d5761051d61100c565b5f826110e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000819000aa164736f6c6343000819000aa164736f6c6343000819000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000006efb84bda519726fa1c65558e520b92b51712101000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000032
-----Decoded View---------------
Arg [0] : _currencyToken (address): 0x6EFB84bda519726Fa1c65558e520B92b51712101
Arg [1] : _tradingFee (uint256): 10
Arg [2] : _targetPrice (uint256): 50
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000006efb84bda519726fa1c65558e520b92b51712101
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000032
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in FRAX
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
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.