Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60806040 | 18451526 | 394 days ago | IN | 0 ETH | 0.02705647 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
PositionFactory
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./Position.sol"; import "./interface/IFrankencoin.sol"; contract PositionFactory { /** * Create a completely new position in a newly deployed contract. * Must be called through minting hub to be recognized as valid position. */ function createNewPosition( address _owner, address _zchf, address _collateral, uint256 _minCollateral, uint256 _initialLimit, uint256 _initPeriod, uint256 _duration, uint64 _challengePeriod, uint32 _annualInterestPPM, uint256 _liqPrice, uint32 _reserve ) external returns (address) { return address( new Position( _owner, msg.sender, _zchf, _collateral, _minCollateral, _initialLimit, _initPeriod, _duration, _challengePeriod, _annualInterestPPM, _liqPrice, _reserve ) ); } /** * @notice clone an existing position. This can be a clone of another clone, * or an original position. * @param _existing address of the position we want to clone * @return address of the newly created clone position */ function clonePosition(address _existing) external returns (address) { Position existing = Position(_existing); Position clone = Position(_createClone(existing.original())); return address(clone); } // github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol function _createClone(address target) internal returns (address result) { bytes20 targetBytes = bytes20(target); assembly { let clone := mload(0x40) mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone, 0x14), targetBytes) mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) result := create(0, clone, 0x37) } require(result != address(0), "ERC1167: create failed"); } }
/** * SPDX-License-Identifier: MIT * * Copyright (c) 2016-2019 zOS Global Limited * */ pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. Does not include * the optional functions; to access them see `ERC20Detailed`. */ interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); /** * @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 always true. Throws error on failure. * * 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 can change 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. * * > 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 always true. Throws error on failure. * * 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 "./IERC20.sol"; import "./IReserve.sol"; interface IFrankencoin is IERC20 { function suggestMinter(address _minter, uint256 _applicationPeriod, uint256 _applicationFee, string calldata _message) external; function registerPosition(address position) external; function denyMinter(address minter, address[] calldata helpers, string calldata message) external; function reserve() external view returns (IReserve); function minterReserve() external view returns (uint256); function calculateAssignedReserve(uint256 mintedAmount, uint32 _reservePPM) external view returns (uint256); function equity() external view returns (uint256); function isMinter(address minter) external view returns (bool); function getPositionParent(address position) external view returns (address); function mint(address target, uint256 amount) external; function mintWithReserve(address target, uint256 amount, uint32 reservePPM, uint32 feePPM) external; function burnFrom(address target, uint256 amount) external; function burnWithoutReserve(uint256 amountIncludingReserve, uint32 reservePPM) external; function burnFromWithReserve(address payer, uint256 targetTotalBurnAmount, uint32 _reservePPM) external returns (uint256); function burnWithReserve(uint256 amountExcludingReserve, uint32 reservePPM) external returns (uint256); function coverLoss(address source, uint256 amount) external; function collectProfits(address source, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; import "./IReserve.sol"; import "./IFrankencoin.sol"; interface IPosition { function original() external returns (address); function collateral() external returns (IERC20); function minimumCollateral() external returns (uint256); function challengePeriod() external returns (uint64); function expiration() external returns (uint256); function price() external returns (uint256); function reduceLimitForClone(uint256 amount) external; function initializeClone(address owner, uint256 _price, uint256 _coll, uint256 _mint, uint256 expiration) external; function deny(address[] calldata helpers, string calldata message) external; function mint(address target, uint256 amount) external; function minted() external returns (uint256); function reserveContribution() external returns (uint32); function getUsableMint(uint256 totalMint, bool beforeFees) external view returns (uint256); function challengeData(uint256 challengeStart) external view returns (uint256 liqPrice, uint64 phase1, uint64 phase2); function notifyChallengeStarted(uint256 size) external; function notifyChallengeAverted(uint256 size) external; function notifyChallengeSucceeded(address _bidder, uint256 _size) external returns (address, uint256, uint256, uint32); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC20.sol"; interface IReserve is IERC20 { function invest(uint256 amount, uint256 expected) external returns (uint256); function checkQualified(address sender, address[] calldata helpers) external view; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./utils/Ownable.sol"; import "./utils/MathUtil.sol"; import "./interface/IERC20.sol"; import "./interface/IPosition.sol"; import "./interface/IReserve.sol"; import "./interface/IFrankencoin.sol"; /** * @title Position * @notice A collateralized minting position. */ contract Position is Ownable, IPosition, MathUtil { /** * @notice Note that this contract is intended to be cloned. All clones will share the same values for * the constant and immutable fields, but have their own values for the other fields. */ /** * @notice The zchf price per unit of the collateral below which challenges succeed, (36 - collateral.decimals) decimals */ uint256 public price; /** * @notice Net minted amount, including reserve. */ uint256 public minted; /** * @notice Amount of the collateral that is currently under a challenge. * Used to figure out whether there are pending challenges. */ uint256 public challengedAmount; /** * @notice Challenge period in seconds. */ uint64 public immutable challengePeriod; /** * @notice End of the latest cooldown. If this is in the future, minting is suspended. */ uint256 public cooldown; /** * @notice How much can be minted at most. */ uint256 public limit; /** * @notice Timestamp when minting can start and the position no longer denied. */ uint256 public immutable start; /** * @notice Timestamp of the expiration of the position. After expiration, challenges cannot be averted * any more. This is also the basis for fee calculations. */ uint256 public expiration; /** * @notice The original position to help identifying clones. */ address public immutable original; /** * @notice Pointer to the minting hub. */ address public immutable hub; /** * @notice The Frankencoin contract. */ IFrankencoin public immutable zchf; /** * @notice The collateral token. */ IERC20 public immutable override collateral; /** * @notice Minimum acceptable collateral amount to prevent dust. */ uint256 public immutable override minimumCollateral; /** * @notice Always pay interest for at least four weeks. */ uint256 private constant MIN_INTEREST_DURATION = 4 weeks; /** * @notice The interest in parts per million per year that is deducted when minting Frankencoins. * To be paid upfront. */ uint32 public immutable annualInterestPPM; /** * @notice The reserve contribution in parts per million of the minted amount. */ uint32 public immutable reserveContribution; event MintingUpdate(uint256 collateral, uint256 price, uint256 minted, uint256 limit); event PositionDenied(address indexed sender, string message); // emitted if closed by governance error InsufficientCollateral(); error TooLate(); error RepaidTooMuch(uint256 excess); error LimitExceeded(); error ChallengeTooSmall(); error Expired(); error Hot(); error Challenged(); error NotHub(); modifier alive() { if (block.timestamp >= expiration) revert Expired(); _; } modifier noCooldown() { if (block.timestamp <= cooldown) revert Hot(); _; } modifier noChallenge() { if (challengedAmount > 0) revert Challenged(); _; } modifier onlyHub() { if (msg.sender != address(hub)) revert NotHub(); _; } /** * @dev See MintingHub.openPosition */ constructor( address _owner, address _hub, address _zchf, address _collateral, uint256 _minCollateral, uint256 _initialLimit, uint256 _initPeriod, uint256 _duration, uint64 _challengePeriod, uint32 _annualInterestPPM, uint256 _liqPrice, uint32 _reservePPM ) { require(_initPeriod >= 3 days); // must be at least three days, recommended to use higher values _setOwner(_owner); original = address(this); hub = _hub; zchf = IFrankencoin(_zchf); collateral = IERC20(_collateral); annualInterestPPM = _annualInterestPPM; reserveContribution = _reservePPM; minimumCollateral = _minCollateral; challengePeriod = _challengePeriod; start = block.timestamp + _initPeriod; // at least three days time to deny the position cooldown = start; expiration = start + _duration; limit = _initialLimit; _setPrice(_liqPrice); } /** * @notice Method to initialize a freshly created clone. It is the responsibility of the creator to make sure this is only * called once and to call reduceLimitForClone on the original position before initializing the clone. */ function initializeClone( address owner, uint256 _price, uint256 _coll, uint256 _initialMint, uint256 expirationTime ) external onlyHub { if (_coll < minimumCollateral) revert InsufficientCollateral(); uint256 impliedPrice = (_initialMint * ONE_DEC18) / _coll; _initialMint = (impliedPrice * _coll) / ONE_DEC18; // to cancel potential rounding errors if (impliedPrice > _price) revert InsufficientCollateral(); _setOwner(owner); limit = _initialMint; expiration = expirationTime; _setPrice(impliedPrice); _mint(owner, _initialMint, _coll); } function limitForClones() public view returns (uint256) { uint256 backedLimit = (_collateralBalance() * price) / ONE_DEC18; if (backedLimit >= limit) { return 0; } else { // due to invariants, this is always below (limit - minted) return limit - backedLimit; } } /** * @notice Adjust this position's limit to allow a clone to mint its own Frankencoins. * Invariant: global limit stays the same. * * Cloning a position is only allowed if the position is not challenged, not expired and not in cooldown. */ function reduceLimitForClone(uint256 mint_) external noChallenge noCooldown alive onlyHub { if (mint_ > limitForClones()) revert LimitExceeded(); limit -= mint_; } /** * @notice Qualified pool share holders can call this method to immediately expire a freshly proposed position. */ function deny(address[] calldata helpers, string calldata message) external { if (block.timestamp >= start) revert TooLate(); IReserve(zchf.reserve()).checkQualified(msg.sender, helpers); _close(); // since expiration is immutable, we put it under eternal cooldown emit PositionDenied(msg.sender, message); } function _close() internal { cooldown = type(uint256).max; } function isClosed() public view returns (bool) { return cooldown == type(uint256).max; } /** * @notice This is how much the minter can actually use when minting ZCHF, with the rest being used * assigned to the minter reserve or (if applicable) fees. */ function getUsableMint(uint256 totalMint, bool afterFees) external view returns (uint256) { if (afterFees) { return (totalMint * (1000_000 - reserveContribution - calculateCurrentFee())) / 1000_000; } else { return (totalMint * (1000_000 - reserveContribution)) / 1000_000; } } /** * @notice "All in one" function to adjust the outstanding amount of ZCHF, the collateral amount, * and the price in one transaction. */ function adjust(uint256 newMinted, uint256 newCollateral, uint256 newPrice) external onlyOwner { uint256 colbal = _collateralBalance(); if (newCollateral > colbal) { collateral.transferFrom(msg.sender, address(this), newCollateral - colbal); } // Must be called after collateral deposit, but before withdrawal if (newMinted < minted) { zchf.burnFromWithReserve(msg.sender, minted - newMinted, reserveContribution); minted = newMinted; } if (newCollateral < colbal) { withdrawCollateral(msg.sender, colbal - newCollateral); } // Must be called after collateral withdrawal if (newMinted > minted) { mint(msg.sender, newMinted - minted); } if (newPrice != price) { adjustPrice(newPrice); } } /** * @notice Allows the position owner to adjust the liquidation price as long as there is no pending challenge. * Lowering the liquidation price can be done with immediate effect, given that there is enough collateral. * Increasing the liquidation price triggers a cooldown period of 3 days, during which minting is suspended. */ function adjustPrice(uint256 newPrice) public onlyOwner noChallenge { if (newPrice > price) { _restrictMinting(3 days); } else { _checkCollateral(_collateralBalance(), newPrice); } _setPrice(newPrice); emit MintingUpdate(_collateralBalance(), price, minted, limit); } function _setPrice(uint256 newPrice) internal { require(newPrice * minimumCollateral <= limit * ONE_DEC18); // sanity check price = newPrice; } function _collateralBalance() internal view returns (uint256) { return IERC20(collateral).balanceOf(address(this)); } /** * @notice Mint ZCHF as long as there is no open challenge, the position is not subject to a cooldown, * and there is sufficient collateral. */ function mint(address target, uint256 amount) public onlyOwner noChallenge noCooldown alive { _mint(target, amount, _collateralBalance()); } function calculateCurrentFee() public view returns (uint32) { uint256 exp = expiration; uint256 time = block.timestamp < start ? start : block.timestamp; uint256 timePassed = time >= exp - MIN_INTEREST_DURATION ? MIN_INTEREST_DURATION : exp - time; // Time resolution is in the range of minutes for typical interest rates. return uint32((timePassed * annualInterestPPM) / 365 days); } function _mint(address target, uint256 amount, uint256 collateral_) internal { if (minted + amount > limit) revert LimitExceeded(); zchf.mintWithReserve(target, amount, reserveContribution, calculateCurrentFee()); minted += amount; _checkCollateral(collateral_, price); emit MintingUpdate(_collateralBalance(), price, minted, limit); } function _restrictMinting(uint256 period) internal { uint256 horizon = block.timestamp + period; if (horizon > cooldown) { cooldown = horizon; } } /** * @notice Repay some ZCHF. If too much is repaid, the call fails. * It is possible to repay while there are challenges, but the collateral is locked until all is clear again. * * The repaid amount should fulfill the following equation in order to close the position, * i.e. bring the minted amount to 0: * minted = amount + zchf.calculateAssignedReserve(amount, reservePPM) * * Under normal circumstances, this implies: * amount = minted * (1000000 - reservePPM) * * E.g. if minted is 50 and reservePPM is 200000, it is necessary to repay 40 to be able to close the position. */ function repay(uint256 amount) public { IERC20(zchf).transferFrom(msg.sender, address(this), amount); uint256 actuallyRepaid = IFrankencoin(zchf).burnWithReserve(amount, reserveContribution); _notifyRepaid(actuallyRepaid); emit MintingUpdate(_collateralBalance(), price, minted, limit); } function _notifyRepaid(uint256 amount) internal { if (amount > minted) revert RepaidTooMuch(amount - minted); minted -= amount; } /** * @notice Withdraw any ERC20 token that might have ended up on this address. * Withdrawing collateral is subject to the same restrictions as withdrawCollateral(...). */ function withdraw(address token, address target, uint256 amount) external onlyOwner { if (token == address(collateral)) { withdrawCollateral(target, amount); } else { uint256 balance = _collateralBalance(); IERC20(token).transfer(target, amount); require(balance == _collateralBalance()); // guard against double-entry-point tokens } } /** * @notice Withdraw collateral from the position up to the extent that it is still well collateralized afterwards. * Not possible as long as there is an open challenge or the contract is subject to a cooldown. * * Withdrawing collateral below the minimum collateral amount formally closes the position. */ function withdrawCollateral(address target, uint256 amount) public onlyOwner noChallenge { if (block.timestamp <= cooldown && !isClosed()) revert Hot(); uint256 balance = _withdrawCollateral(target, amount); _checkCollateral(balance, price); if (balance < minimumCollateral && balance > 0) revert InsufficientCollateral(); // Prevent dust amounts } function _withdrawCollateral(address target, uint256 amount) internal returns (uint256) { if (amount > 0) { // Some weird tokens fail when trying to transfer 0 amounts IERC20(collateral).transfer(target, amount); } uint256 balance = _collateralBalance(); _considerClose(balance); emit MintingUpdate(balance, price, minted, limit); return balance; } function _considerClose(uint256 collateralBalance) internal { if (collateralBalance < minimumCollateral && challengedAmount == 0) { // This leaves a slightly unsatisfying possibility open: if the withdrawal happens due to a successful // challenge, there might be a small amount of collateral left that is not withheld in case there are no // other pending challenges. The only way to cleanly solve this would be to have two distinct cooldowns, // one for minting and one for withdrawals. _close(); } } /** * @notice This invariant must always hold and must always be checked when any of the three * variables change in an adverse way. */ function _checkCollateral(uint256 collateralReserve, uint256 atPrice) internal view { if (collateralReserve * atPrice < minted * ONE_DEC18) revert InsufficientCollateral(); } /** * @notice Returns the liquidation price and the durations for phase1 and phase2 of the challenge. * Both phases are usually of equal duration, but near expiration, phase one is adjusted such that * it cannot last beyond the expiration date of the position. */ function challengeData(uint256 challengeStart) external view returns (uint256 liqPrice, uint64 phase1, uint64 phase2) { uint256 timeToExpiration = challengeStart >= expiration ? 0 : expiration - challengeStart; return (price, uint64(_min(timeToExpiration, challengePeriod)), challengePeriod); } function notifyChallengeStarted(uint256 size) external onlyHub { // Require minimum size. Collateral balance can be below minimum if it was partially challenged before. if (size < minimumCollateral && size < _collateralBalance()) revert ChallengeTooSmall(); if (size == 0) revert ChallengeTooSmall(); challengedAmount += size; } /** * @param size amount of collateral challenged (dec18) */ function notifyChallengeAverted(uint256 size) external onlyHub { challengedAmount -= size; // Don't allow minter to close the position immediately so challenge can be repeated before // the owner has a chance to mint more on an undercollateralized position _restrictMinting(1 days); // If this was the last open challenge and there is only a dust amount of collateral left, the position should be closed _considerClose(_collateralBalance()); } /** * @notice Notifies the position that a challenge was successful. * Triggers the payout of the challenged part of the collateral. * Everything else is assumed to be handled by the hub. * * @param _bidder address of the bidder that receives the collateral * @param _size amount of the collateral bid for * @return (position owner, effective challenge size in ZCHF, amount to be repaid, reserve ppm) */ function notifyChallengeSucceeded( address _bidder, uint256 _size ) external onlyHub returns (address, uint256, uint256, uint32) { challengedAmount -= _size; uint256 colBal = _collateralBalance(); if (colBal < _size) { _size = colBal; } uint256 repayment = colBal == 0 ? 0 : minted * _size / colBal; // for enormous colBal, this could be rounded to 0, which is ok _notifyRepaid(repayment); // we assume the caller takes care of the actual repayment // Give time for additional challenges before the owner can mint again. In particular, // the owner might have added collateral only seconds before the challenge ended, preventing a close. _restrictMinting(3 days); _withdrawCollateral(_bidder, _size); // transfer collateral to the bidder and emit update return (owner, _size, repayment, reserveContribution); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title Functions for share valuation */ contract MathUtil { uint256 internal constant ONE_DEC18 = 10 ** 18; // Let's go for 12 digits of precision (18-6) uint256 internal constant THRESH_DEC18 = 10 ** 6; /** * @notice Cubic root with Halley approximation * Number 1e18 decimal * @param _v number for which we calculate x**(1/3) * @return returns _v**(1/3) */ function _cubicRoot(uint256 _v) internal pure returns (uint256) { // Good first guess for _v slightly above 1.0, which is often the case in the Frankencoin system uint256 x = _v > ONE_DEC18 && _v < 10 ** 19 ? (_v - ONE_DEC18) / 3 + ONE_DEC18 : ONE_DEC18; uint256 diff; do { uint256 powX3 = _mulD18(_mulD18(x, x), x); uint256 xnew = x * (powX3 + 2 * _v) / (2 * powX3 + _v); diff = xnew > x ? xnew - x : x - xnew; x = xnew; } while (diff > THRESH_DEC18); return x; } function _mulD18(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a * _b) / ONE_DEC18; } function _divD18(uint256 _a, uint256 _b) internal pure returns (uint256) { return (_a * ONE_DEC18) / _b; } function _power3(uint256 _x) internal pure returns (uint256) { return _mulD18(_mulD18(_x, _x), _x); } function _min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } }
// SPDX-License-Identifier: MIT // // From https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol // // Modifications: // - Replaced Context._msgSender() with msg.sender // - Made leaner pragma solidity ^0.8.0; /** * @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}. */ contract Ownable { address public owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); error NotOwner(); /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public onlyOwner { _setOwner(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _setOwner(address newOwner) internal { require(newOwner != address(0x0)); address oldOwner = owner; owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } function _requireOwner(address sender) internal view { if (owner != sender) revert NotOwner(); } modifier onlyOwner() { _requireOwner(msg.sender); _; } }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "evmVersion": "paris", "metadata": { "useLiteralContent": true }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_existing","type":"address"}],"name":"clonePosition","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_zchf","type":"address"},{"internalType":"address","name":"_collateral","type":"address"},{"internalType":"uint256","name":"_minCollateral","type":"uint256"},{"internalType":"uint256","name":"_initialLimit","type":"uint256"},{"internalType":"uint256","name":"_initPeriod","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"uint64","name":"_challengePeriod","type":"uint64"},{"internalType":"uint32","name":"_annualInterestPPM","type":"uint32"},{"internalType":"uint256","name":"_liqPrice","type":"uint256"},{"internalType":"uint32","name":"_reserve","type":"uint32"}],"name":"createNewPosition","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506124ff806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063b3e891801461003b578063c3fd1c371461006a575b600080fd5b61004e61004936600461027b565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e6100783660046102b8565b6100f7565b60008082905060006100ef826001600160a01b03166346c715fa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ea9190610376565b6101b0565b949350505050565b60008b338c8c8c8c8c8c8c8c8c8c60405161011190610256565b6001600160a01b039c8d1681529a8c1660208c0152988b1660408b0152969099166060890152608088019490945260a087019290925260c086015260e085015267ffffffffffffffff1661010084015263ffffffff9384166101208401526101408301529190911661016082015261018001604051809103906000f08015801561019f573d6000803e3d6000fd5b509c9b505050505050505050505050565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250506001600160a01b0382166102505760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015260640160405180910390fd5b50919050565b6121368061039483390190565b6001600160a01b038116811461027857600080fd5b50565b60006020828403121561028d57600080fd5b813561029881610263565b9392505050565b803563ffffffff811681146102b357600080fd5b919050565b60008060008060008060008060008060006101608c8e0312156102da57600080fd5b8b356102e581610263565b9a5060208c01356102f581610263565b995060408c013561030581610263565b985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013567ffffffffffffffff8116811461033e57600080fd5b935061034d6101008d0161029f565b92506101208c013591506103646101408d0161029f565b90509295989b509295989b9093969950565b60006020828403121561038857600080fd5b81516102988161026356fe6101a06040523480156200001257600080fd5b5060405162002136380380620021368339810160408190526200003591620001ac565b6203f4808610156200004657600080fd5b620000518c620000dd565b3060c0526001600160a01b038b811660e0528a81166101005289166101205263ffffffff808416610160528116610180526101408890526001600160401b038416608052620000a1864262000296565b60a08190526004819055620000b890869062000296565b6006556005879055620000cb8262000141565b505050505050505050505050620002cc565b6001600160a01b038116620000f157600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a7640000600554620001599190620002b2565b61014051620001699083620002b2565b11156200017557600080fd5b600155565b80516001600160a01b03811681146200019257600080fd5b919050565b805163ffffffff811681146200019257600080fd5b6000806000806000806000806000806000806101808d8f031215620001d057600080fd5b620001db8d6200017a565b9b50620001eb60208e016200017a565b9a50620001fb60408e016200017a565b99506200020b60608e016200017a565b985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015160018060401b03811681146200024457600080fd5b9350620002556101208e0162000197565b92506101408d015191506200026e6101608e0162000197565b90509295989b509295989b509295989b565b634e487b7160e01b600052601160045260246000fd5b80820180821115620002ac57620002ac62000280565b92915050565b8082028115828204841417620002ac57620002ac62000280565b60805160a05160c05160e0516101005161012051610140516101605161018051611d206200041660003960008181610319015281816105c00152818161061c0152818161089801528181610a3d01528181610f1e01526117160152600081816103e10152610bc101526000818161045b0152818161093a01528181610cc80152818161111c01528181611820015261187801526000818161051f01528181610dfb0152818161136b0152818161146b015261157d0152600081816104bf01528181610689015281816109ac01528181610a6701528181610eb201526116e50152600081816102aa015281816107cc01528181610c8801528181610d5f015281816110dc015261125b0152600061036f0152600081816104820152818161064901528181610b370152610b6401526000818161056c0152818161130401526113390152611d206000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063787a08a61161011a578063babe7c74116100ad578063d6e8f96b1161007c578063d6e8f96b146104e1578063d8dfeb451461051a578063d9caed1214610541578063f2fde38b14610554578063f3f480d91461056757600080fd5b8063babe7c7414610456578063be9a65551461047d578063c2b6b58c146104a4578063c4d4803a146104ba57600080fd5b8063a4d66daf116100e9578063a4d66daf1461041f578063a9ced3f014610428578063aee1a95914610430578063b0c2ec821461044357600080fd5b8063787a08a6146103d35780637bd6fb9b146103dc5780638da5cb5b14610403578063a035b1fe1461041657600080fd5b80633a7c29fb1161019d57806346c715fa1161016c57806346c715fa1461036a57806349746f10146103915780634f02c420146103a45780636f871cec146103ad57806372bf079e146103c057600080fd5b80633a7c29fb1461031457806340c10f191461033b57806342d020411461034e5780634665096d1461036157600080fd5b8063350c35e9116101d9578063350c35e914610292578063365a86fc146102a5578063371fd8e6146102e4578063383ef46e146102f757600080fd5b8063082629401461020b5780631bbea34c1461023157806320aa9e721461024657806324e657fe14610289575b600080fd5b61021e610219366004611936565b6105a7565b6040519081526020015b60405180910390f35b61024461023f366004611966565b610647565b005b610259610254366004611a40565b6107bc565b604080516001600160a01b03909516855260208501939093529183015263ffffffff166060820152608001610228565b61021e60035481565b6102446102a0366004611a40565b6108c0565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610228565b6102446102f2366004611a6c565b61098a565b6102ff610b2e565b60405163ffffffff9091168152602001610228565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b610244610349366004611a40565b610bf9565b61024461035c366004611a6c565b610c7d565b61021e60065481565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b61024461039f366004611a6c565b610d54565b61021e60025481565b6102446103bb366004611a85565b610dd4565b6102446103ce366004611a6c565b610fda565b61021e60045481565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b6000546102cc906001600160a01b031681565b61021e60015481565b61021e60055481565b61021e61107f565b61024461043e366004611ab1565b6110d1565b610244610451366004611a6c565b6111eb565b61021e7f000000000000000000000000000000000000000000000000000000000000000081565b61021e7f000000000000000000000000000000000000000000000000000000000000000081565b6004546040516000199091148152602001610228565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b6104f46104ef366004611a6c565b6112d3565b6040805193845267ffffffffffffffff9283166020850152911690820152606001610228565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b61024461054f366004611af5565b611360565b610244610562366004611b36565b611441565b61058e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610228565b6000811561061357620f42406105bb610b2e565b6105e87f0000000000000000000000000000000000000000000000000000000000000000620f4240611b69565b6105f29190611b69565b6106029063ffffffff1685611b8d565b61060c9190611ba4565b9050610641565b620f42406105f27f000000000000000000000000000000000000000000000000000000000000000082611b69565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000042106106875760405163ecdd1c2960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd3293de6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107099190611bc6565b6001600160a01b031663352e3a833386866040518463ffffffff1660e01b815260040161073893929190611be3565b60006040518083038186803b15801561075057600080fd5b505afa158015610764573d6000803e3d6000fd5b50505050610773600019600455565b336001600160a01b03167faca80c800ec0d2aa9d9d31b7f886a1dd3067d4676abc637626a18ffb9381653d83836040516107ae929190611c3f565b60405180910390a250505050565b6000808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461080a576040516313bd2e8360e31b815260040160405180910390fd5b846003600082825461081c9190611c6e565b909155506000905061082c611453565b90508581101561083a578095505b600081156108605781876002546108519190611b8d565b61085b9190611ba4565b610863565b60005b905061086e816114e3565b61087a6203f480611531565b610884888861154f565b506000546001600160a01b031698969750957f000000000000000000000000000000000000000000000000000000000000000095509350505050565b6108c933611646565b600354156108ea5760405163d26e2de960e01b815260040160405180910390fd5b6004544211158015610900575060045460001914155b1561091e57604051631c02820f60e21b815260040160405180910390fd5b600061092a838361154f565b905061093881600154611674565b7f0000000000000000000000000000000000000000000000000000000000000000811080156109675750600081115b1561098557604051633a23d82560e01b815260040160405180910390fd5b505050565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156109fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a219190611c81565b5060405163a47d75ad60e01b81526004810182905263ffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d75ad906044016020604051808303816000875af1158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190611c9e565b9050610ae7816114e3565b600080516020611ccb833981519152610afe611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a15050565b600654600090817f00000000000000000000000000000000000000000000000000000000000000004210610b625742610b84565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000610b956224ea0084611c6e565b821015610bab57610ba68284611c6e565b610bb0565b6224ea005b90506301e13380610be763ffffffff7f00000000000000000000000000000000000000000000000000000000000000001683611b8d565b610bf19190611ba4565b935050505090565b610c0233611646565b60035415610c235760405163d26e2de960e01b815260040160405180910390fd5b6004544211610c4557604051631c02820f60e21b815260040160405180910390fd5b6006544210610c6757604051630407b05b60e31b815260040160405180910390fd5b610c798282610c74611453565b6116b3565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cc6576040516313bd2e8360e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081108015610cfb5750610cf8611453565b81105b15610d1957604051633c80636b60e21b815260040160405180910390fd5b80600003610d3a57604051633c80636b60e21b815260040160405180910390fd5b8060036000828254610d4c9190611cb7565b909155505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d9d576040516313bd2e8360e31b815260040160405180910390fd5b8060036000828254610daf9190611c6e565b90915550610dc1905062015180611531565b610dd1610dcc611453565b61181e565b50565b610ddd33611646565b6000610de7611453565b905080831115610ea6576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd3330610e2c8588611c6e565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190611c81565b505b600254841015610f90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663315f3e723386600254610eee9190611c6e565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015263ffffffff7f00000000000000000000000000000000000000000000000000000000000000001660448201526064016020604051808303816000875af1158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190611c9e565b5060028490555b80831015610fa657610fa6336102a08584611c6e565b600254841115610fc257610fc233600254866103499190611c6e565b6001548214610fd457610fd482610fda565b50505050565b610fe333611646565b600354156110045760405163d26e2de960e01b815260040160405180910390fd5b60015481111561101f5761101a6203f480611531565b611030565b61103061102a611453565b82611674565b6110398161185d565b600080516020611ccb833981519152611050611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a150565b600080670de0b6b3a7640000600154611096611453565b6110a09190611b8d565b6110aa9190611ba4565b905060055481106110bd57600091505090565b806005546110cb9190611c6e565b91505090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461111a576040516313bd2e8360e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083101561115b57604051633a23d82560e01b815260040160405180910390fd5b600083611170670de0b6b3a764000085611b8d565b61117a9190611ba4565b9050670de0b6b3a764000061118f8583611b8d565b6111999190611ba4565b9250848111156111bc57604051633a23d82560e01b815260040160405180910390fd5b6111c5866118ad565b600583905560068290556111d88161185d565b6111e38684866116b3565b505050505050565b6003541561120c5760405163d26e2de960e01b815260040160405180910390fd5b600454421161122e57604051631c02820f60e21b815260040160405180910390fd5b600654421061125057604051630407b05b60e31b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611299576040516313bd2e8360e31b815260040160405180910390fd5b6112a161107f565b8111156112c157604051631930e3c960e11b815260040160405180910390fd5b8060056000828254610d4c9190611c6e565b6000806000806006548510156112f657846006546112f19190611c6e565b6112f9565b60005b9050600154611332827f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16611910565b90969095507f0000000000000000000000000000000000000000000000000000000000000000945092505050565b61136933611646565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036113ac5761098582826108c0565b60006113b6611453565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529192509085169063a9059cbb906044016020604051808303816000875af1158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190611c81565b50611436611453565b8114610fd457600080fd5b61144a33611646565b610dd1816118ad565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de9190611c9e565b905090565b60025481111561151f576002546114fa9082611c6e565b604051635795d46960e11b815260040161151691815260200190565b60405180910390fd5b8060026000828254610d4c9190611c6e565b600061153d8242611cb7565b9050600454811115610c795760045550565b600081156115ec5760405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156115c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ea9190611c81565b505b60006115f6611453565b90506116018161181e565b6001546002546005546040805185815260208101949094528301919091526060820152600080516020611ccb8339815191529060800160405180910390a19392505050565b6000546001600160a01b03828116911614610dd1576040516330cd747160e01b815260040160405180910390fd5b670de0b6b3a764000060025461168a9190611b8d565b6116948284611b8d565b1015610c7957604051633a23d82560e01b815260040160405180910390fd5b600554826002546116c49190611cb7565b11156116e357604051631930e3c960e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638112eb2b84847f000000000000000000000000000000000000000000000000000000000000000061173d610b2e565b6040516001600160e01b031960e087901b1681526001600160a01b039094166004850152602484019290925263ffffffff9081166044840152166064820152608401600060405180830381600087803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b5050505081600260008282546117c39190611cb7565b925050819055506117d681600154611674565b600080516020611ccb8339815191526117ed611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a1505050565b7f00000000000000000000000000000000000000000000000000000000000000008110801561184d5750600354155b15610dd157610dd1600019600455565b670de0b6b3a76400006005546118739190611b8d565b61189d7f000000000000000000000000000000000000000000000000000000000000000083611b8d565b11156118a857600080fd5b600155565b6001600160a01b0381166118c057600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081831061191f5781611921565b825b9392505050565b8015158114610dd157600080fd5b6000806040838503121561194957600080fd5b82359150602083013561195b81611928565b809150509250929050565b6000806000806040858703121561197c57600080fd5b843567ffffffffffffffff8082111561199457600080fd5b818701915087601f8301126119a857600080fd5b8135818111156119b757600080fd5b8860208260051b85010111156119cc57600080fd5b6020928301965094509086013590808211156119e757600080fd5b818701915087601f8301126119fb57600080fd5b813581811115611a0a57600080fd5b886020828501011115611a1c57600080fd5b95989497505060200194505050565b6001600160a01b0381168114610dd157600080fd5b60008060408385031215611a5357600080fd5b8235611a5e81611a2b565b946020939093013593505050565b600060208284031215611a7e57600080fd5b5035919050565b600080600060608486031215611a9a57600080fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215611ac957600080fd5b8535611ad481611a2b565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215611b0a57600080fd5b8335611b1581611a2b565b92506020840135611b2581611a2b565b929592945050506040919091013590565b600060208284031215611b4857600080fd5b813561192181611a2b565b634e487b7160e01b600052601160045260246000fd5b63ffffffff828116828216039080821115611b8657611b86611b53565b5092915050565b808202811582820484141761064157610641611b53565b600082611bc157634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611bd857600080fd5b815161192181611a2b565b6001600160a01b03848116825260406020808401829052908301849052600091859160608501845b87811015611c32578435611c1e81611a2b565b841682529382019390820190600101611c0b565b5098975050505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b8181038181111561064157610641611b53565b600060208284031215611c9357600080fd5b815161192181611928565b600060208284031215611cb057600080fd5b5051919050565b8082018082111561064157610641611b5356fecb2040b7eb3265a4335698c9ecbe81a5f9857e92aa32e07ce235f44c321a7e35a264697066735822122033a1d869823b066283198911926f6f789832b83aa6f7e1ee38d0848552f7e9e664736f6c63430008140033a26469706673582212202846eb6087cb12a006adf4100f31dc6bf5fc0ee131f0fa8e9e26b89b60a82b1064736f6c63430008140033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100365760003560e01c8063b3e891801461003b578063c3fd1c371461006a575b600080fd5b61004e61004936600461027b565b61007d565b6040516001600160a01b03909116815260200160405180910390f35b61004e6100783660046102b8565b6100f7565b60008082905060006100ef826001600160a01b03166346c715fa6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156100c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100ea9190610376565b6101b0565b949350505050565b60008b338c8c8c8c8c8c8c8c8c8c60405161011190610256565b6001600160a01b039c8d1681529a8c1660208c0152988b1660408b0152969099166060890152608088019490945260a087019290925260c086015260e085015267ffffffffffffffff1661010084015263ffffffff9384166101208401526101408301529190911661016082015261018001604051809103906000f08015801561019f573d6000803e3d6000fd5b509c9b505050505050505050505050565b6000808260601b9050604051733d602d80600a3d3981f3363d3d373d3d3d363d7360601b81528160148201526e5af43d82803e903d91602b57fd5bf360881b60288201526037816000f09250506001600160a01b0382166102505760405162461bcd60e51b8152602060048201526016602482015275115490cc4c4d8dce8818dc99585d194819985a5b195960521b604482015260640160405180910390fd5b50919050565b6121368061039483390190565b6001600160a01b038116811461027857600080fd5b50565b60006020828403121561028d57600080fd5b813561029881610263565b9392505050565b803563ffffffff811681146102b357600080fd5b919050565b60008060008060008060008060008060006101608c8e0312156102da57600080fd5b8b356102e581610263565b9a5060208c01356102f581610263565b995060408c013561030581610263565b985060608c0135975060808c0135965060a08c0135955060c08c0135945060e08c013567ffffffffffffffff8116811461033e57600080fd5b935061034d6101008d0161029f565b92506101208c013591506103646101408d0161029f565b90509295989b509295989b9093969950565b60006020828403121561038857600080fd5b81516102988161026356fe6101a06040523480156200001257600080fd5b5060405162002136380380620021368339810160408190526200003591620001ac565b6203f4808610156200004657600080fd5b620000518c620000dd565b3060c0526001600160a01b038b811660e0528a81166101005289166101205263ffffffff808416610160528116610180526101408890526001600160401b038416608052620000a1864262000296565b60a08190526004819055620000b890869062000296565b6006556005879055620000cb8262000141565b505050505050505050505050620002cc565b6001600160a01b038116620000f157600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b670de0b6b3a7640000600554620001599190620002b2565b61014051620001699083620002b2565b11156200017557600080fd5b600155565b80516001600160a01b03811681146200019257600080fd5b919050565b805163ffffffff811681146200019257600080fd5b6000806000806000806000806000806000806101808d8f031215620001d057600080fd5b620001db8d6200017a565b9b50620001eb60208e016200017a565b9a50620001fb60408e016200017a565b99506200020b60608e016200017a565b985060808d0151975060a08d0151965060c08d0151955060e08d015194506101008d015160018060401b03811681146200024457600080fd5b9350620002556101208e0162000197565b92506101408d015191506200026e6101608e0162000197565b90509295989b509295989b509295989b565b634e487b7160e01b600052601160045260246000fd5b80820180821115620002ac57620002ac62000280565b92915050565b8082028115828204841417620002ac57620002ac62000280565b60805160a05160c05160e0516101005161012051610140516101605161018051611d206200041660003960008181610319015281816105c00152818161061c0152818161089801528181610a3d01528181610f1e01526117160152600081816103e10152610bc101526000818161045b0152818161093a01528181610cc80152818161111c01528181611820015261187801526000818161051f01528181610dfb0152818161136b0152818161146b015261157d0152600081816104bf01528181610689015281816109ac01528181610a6701528181610eb201526116e50152600081816102aa015281816107cc01528181610c8801528181610d5f015281816110dc015261125b0152600061036f0152600081816104820152818161064901528181610b370152610b6401526000818161056c0152818161130401526113390152611d206000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c8063787a08a61161011a578063babe7c74116100ad578063d6e8f96b1161007c578063d6e8f96b146104e1578063d8dfeb451461051a578063d9caed1214610541578063f2fde38b14610554578063f3f480d91461056757600080fd5b8063babe7c7414610456578063be9a65551461047d578063c2b6b58c146104a4578063c4d4803a146104ba57600080fd5b8063a4d66daf116100e9578063a4d66daf1461041f578063a9ced3f014610428578063aee1a95914610430578063b0c2ec821461044357600080fd5b8063787a08a6146103d35780637bd6fb9b146103dc5780638da5cb5b14610403578063a035b1fe1461041657600080fd5b80633a7c29fb1161019d57806346c715fa1161016c57806346c715fa1461036a57806349746f10146103915780634f02c420146103a45780636f871cec146103ad57806372bf079e146103c057600080fd5b80633a7c29fb1461031457806340c10f191461033b57806342d020411461034e5780634665096d1461036157600080fd5b8063350c35e9116101d9578063350c35e914610292578063365a86fc146102a5578063371fd8e6146102e4578063383ef46e146102f757600080fd5b8063082629401461020b5780631bbea34c1461023157806320aa9e721461024657806324e657fe14610289575b600080fd5b61021e610219366004611936565b6105a7565b6040519081526020015b60405180910390f35b61024461023f366004611966565b610647565b005b610259610254366004611a40565b6107bc565b604080516001600160a01b03909516855260208501939093529183015263ffffffff166060820152608001610228565b61021e60035481565b6102446102a0366004611a40565b6108c0565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610228565b6102446102f2366004611a6c565b61098a565b6102ff610b2e565b60405163ffffffff9091168152602001610228565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b610244610349366004611a40565b610bf9565b61024461035c366004611a6c565b610c7d565b61021e60065481565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b61024461039f366004611a6c565b610d54565b61021e60025481565b6102446103bb366004611a85565b610dd4565b6102446103ce366004611a6c565b610fda565b61021e60045481565b6102ff7f000000000000000000000000000000000000000000000000000000000000000081565b6000546102cc906001600160a01b031681565b61021e60015481565b61021e60055481565b61021e61107f565b61024461043e366004611ab1565b6110d1565b610244610451366004611a6c565b6111eb565b61021e7f000000000000000000000000000000000000000000000000000000000000000081565b61021e7f000000000000000000000000000000000000000000000000000000000000000081565b6004546040516000199091148152602001610228565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b6104f46104ef366004611a6c565b6112d3565b6040805193845267ffffffffffffffff9283166020850152911690820152606001610228565b6102cc7f000000000000000000000000000000000000000000000000000000000000000081565b61024461054f366004611af5565b611360565b610244610562366004611b36565b611441565b61058e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610228565b6000811561061357620f42406105bb610b2e565b6105e87f0000000000000000000000000000000000000000000000000000000000000000620f4240611b69565b6105f29190611b69565b6106029063ffffffff1685611b8d565b61060c9190611ba4565b9050610641565b620f42406105f27f000000000000000000000000000000000000000000000000000000000000000082611b69565b92915050565b7f000000000000000000000000000000000000000000000000000000000000000042106106875760405163ecdd1c2960e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663cd3293de6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107099190611bc6565b6001600160a01b031663352e3a833386866040518463ffffffff1660e01b815260040161073893929190611be3565b60006040518083038186803b15801561075057600080fd5b505afa158015610764573d6000803e3d6000fd5b50505050610773600019600455565b336001600160a01b03167faca80c800ec0d2aa9d9d31b7f886a1dd3067d4676abc637626a18ffb9381653d83836040516107ae929190611c3f565b60405180910390a250505050565b6000808080336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461080a576040516313bd2e8360e31b815260040160405180910390fd5b846003600082825461081c9190611c6e565b909155506000905061082c611453565b90508581101561083a578095505b600081156108605781876002546108519190611b8d565b61085b9190611ba4565b610863565b60005b905061086e816114e3565b61087a6203f480611531565b610884888861154f565b506000546001600160a01b031698969750957f000000000000000000000000000000000000000000000000000000000000000095509350505050565b6108c933611646565b600354156108ea5760405163d26e2de960e01b815260040160405180910390fd5b6004544211158015610900575060045460001914155b1561091e57604051631c02820f60e21b815260040160405180910390fd5b600061092a838361154f565b905061093881600154611674565b7f0000000000000000000000000000000000000000000000000000000000000000811080156109675750600081115b1561098557604051633a23d82560e01b815260040160405180910390fd5b505050565b6040516323b872dd60e01b8152336004820152306024820152604481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af11580156109fd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a219190611c81565b5060405163a47d75ad60e01b81526004810182905263ffffffff7f00000000000000000000000000000000000000000000000000000000000000001660248201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a47d75ad906044016020604051808303816000875af1158015610ab8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610adc9190611c9e565b9050610ae7816114e3565b600080516020611ccb833981519152610afe611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a15050565b600654600090817f00000000000000000000000000000000000000000000000000000000000000004210610b625742610b84565b7f00000000000000000000000000000000000000000000000000000000000000005b90506000610b956224ea0084611c6e565b821015610bab57610ba68284611c6e565b610bb0565b6224ea005b90506301e13380610be763ffffffff7f00000000000000000000000000000000000000000000000000000000000000001683611b8d565b610bf19190611ba4565b935050505090565b610c0233611646565b60035415610c235760405163d26e2de960e01b815260040160405180910390fd5b6004544211610c4557604051631c02820f60e21b815260040160405180910390fd5b6006544210610c6757604051630407b05b60e31b815260040160405180910390fd5b610c798282610c74611453565b6116b3565b5050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610cc6576040516313bd2e8360e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000081108015610cfb5750610cf8611453565b81105b15610d1957604051633c80636b60e21b815260040160405180910390fd5b80600003610d3a57604051633c80636b60e21b815260040160405180910390fd5b8060036000828254610d4c9190611cb7565b909155505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d9d576040516313bd2e8360e31b815260040160405180910390fd5b8060036000828254610daf9190611c6e565b90915550610dc1905062015180611531565b610dd1610dcc611453565b61181e565b50565b610ddd33611646565b6000610de7611453565b905080831115610ea6576001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd3330610e2c8588611c6e565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190611c81565b505b600254841015610f90577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663315f3e723386600254610eee9190611c6e565b6040516001600160e01b031960e085901b1681526001600160a01b039092166004830152602482015263ffffffff7f00000000000000000000000000000000000000000000000000000000000000001660448201526064016020604051808303816000875af1158015610f65573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f899190611c9e565b5060028490555b80831015610fa657610fa6336102a08584611c6e565b600254841115610fc257610fc233600254866103499190611c6e565b6001548214610fd457610fd482610fda565b50505050565b610fe333611646565b600354156110045760405163d26e2de960e01b815260040160405180910390fd5b60015481111561101f5761101a6203f480611531565b611030565b61103061102a611453565b82611674565b6110398161185d565b600080516020611ccb833981519152611050611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a150565b600080670de0b6b3a7640000600154611096611453565b6110a09190611b8d565b6110aa9190611ba4565b905060055481106110bd57600091505090565b806005546110cb9190611c6e565b91505090565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461111a576040516313bd2e8360e31b815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000083101561115b57604051633a23d82560e01b815260040160405180910390fd5b600083611170670de0b6b3a764000085611b8d565b61117a9190611ba4565b9050670de0b6b3a764000061118f8583611b8d565b6111999190611ba4565b9250848111156111bc57604051633a23d82560e01b815260040160405180910390fd5b6111c5866118ad565b600583905560068290556111d88161185d565b6111e38684866116b3565b505050505050565b6003541561120c5760405163d26e2de960e01b815260040160405180910390fd5b600454421161122e57604051631c02820f60e21b815260040160405180910390fd5b600654421061125057604051630407b05b60e31b815260040160405180910390fd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614611299576040516313bd2e8360e31b815260040160405180910390fd5b6112a161107f565b8111156112c157604051631930e3c960e11b815260040160405180910390fd5b8060056000828254610d4c9190611c6e565b6000806000806006548510156112f657846006546112f19190611c6e565b6112f9565b60005b9050600154611332827f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16611910565b90969095507f0000000000000000000000000000000000000000000000000000000000000000945092505050565b61136933611646565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316036113ac5761098582826108c0565b60006113b6611453565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590529192509085169063a9059cbb906044016020604051808303816000875af1158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190611c81565b50611436611453565b8114610fd457600080fd5b61144a33611646565b610dd1816118ad565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156114ba573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114de9190611c9e565b905090565b60025481111561151f576002546114fa9082611c6e565b604051635795d46960e11b815260040161151691815260200190565b60405180910390fd5b8060026000828254610d4c9190611c6e565b600061153d8242611cb7565b9050600454811115610c795760045550565b600081156115ec5760405163a9059cbb60e01b81526001600160a01b038481166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303816000875af11580156115c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115ea9190611c81565b505b60006115f6611453565b90506116018161181e565b6001546002546005546040805185815260208101949094528301919091526060820152600080516020611ccb8339815191529060800160405180910390a19392505050565b6000546001600160a01b03828116911614610dd1576040516330cd747160e01b815260040160405180910390fd5b670de0b6b3a764000060025461168a9190611b8d565b6116948284611b8d565b1015610c7957604051633a23d82560e01b815260040160405180910390fd5b600554826002546116c49190611cb7565b11156116e357604051631930e3c960e11b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316638112eb2b84847f000000000000000000000000000000000000000000000000000000000000000061173d610b2e565b6040516001600160e01b031960e087901b1681526001600160a01b039094166004850152602484019290925263ffffffff9081166044840152166064820152608401600060405180830381600087803b15801561179957600080fd5b505af11580156117ad573d6000803e3d6000fd5b5050505081600260008282546117c39190611cb7565b925050819055506117d681600154611674565b600080516020611ccb8339815191526117ed611453565b60015460025460055460408051948552602085019390935291830152606082015260800160405180910390a1505050565b7f00000000000000000000000000000000000000000000000000000000000000008110801561184d5750600354155b15610dd157610dd1600019600455565b670de0b6b3a76400006005546118739190611b8d565b61189d7f000000000000000000000000000000000000000000000000000000000000000083611b8d565b11156118a857600080fd5b600155565b6001600160a01b0381166118c057600080fd5b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081831061191f5781611921565b825b9392505050565b8015158114610dd157600080fd5b6000806040838503121561194957600080fd5b82359150602083013561195b81611928565b809150509250929050565b6000806000806040858703121561197c57600080fd5b843567ffffffffffffffff8082111561199457600080fd5b818701915087601f8301126119a857600080fd5b8135818111156119b757600080fd5b8860208260051b85010111156119cc57600080fd5b6020928301965094509086013590808211156119e757600080fd5b818701915087601f8301126119fb57600080fd5b813581811115611a0a57600080fd5b886020828501011115611a1c57600080fd5b95989497505060200194505050565b6001600160a01b0381168114610dd157600080fd5b60008060408385031215611a5357600080fd5b8235611a5e81611a2b565b946020939093013593505050565b600060208284031215611a7e57600080fd5b5035919050565b600080600060608486031215611a9a57600080fd5b505081359360208301359350604090920135919050565b600080600080600060a08688031215611ac957600080fd5b8535611ad481611a2b565b97602087013597506040870135966060810135965060800135945092505050565b600080600060608486031215611b0a57600080fd5b8335611b1581611a2b565b92506020840135611b2581611a2b565b929592945050506040919091013590565b600060208284031215611b4857600080fd5b813561192181611a2b565b634e487b7160e01b600052601160045260246000fd5b63ffffffff828116828216039080821115611b8657611b86611b53565b5092915050565b808202811582820484141761064157610641611b53565b600082611bc157634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215611bd857600080fd5b815161192181611a2b565b6001600160a01b03848116825260406020808401829052908301849052600091859160608501845b87811015611c32578435611c1e81611a2b565b841682529382019390820190600101611c0b565b5098975050505050505050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b8181038181111561064157610641611b53565b600060208284031215611c9357600080fd5b815161192181611928565b600060208284031215611cb057600080fd5b5051919050565b8082018082111561064157610641611b5356fecb2040b7eb3265a4335698c9ecbe81a5f9857e92aa32e07ce235f44c321a7e35a264697066735822122033a1d869823b066283198911926f6f789832b83aa6f7e1ee38d0848552f7e9e664736f6c63430008140033a26469706673582212202846eb6087cb12a006adf4100f31dc6bf5fc0ee131f0fa8e9e26b89b60a82b1064736f6c63430008140033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.