Contract Overview
My Name Tag:
Not Available
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xc2f5d4d6c7fd6be2bac25959e8f594a0b6873e94e21f17b5982a62838c91137a | Set Implementati... | 63946445 | 24 days 21 hrs ago | Bro Kwon's Booty: Deployer | IN | 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 | 0 ETH | 0.00004363 | |
0xa70820ad4886255757b3460ba05463b3013b8251a91d1611a11cb8496f968537 | 0x61014060 | 63946401 | 24 days 21 hrs ago | Bro Kwon's Booty: Deployer | IN | Contract Creation | 0 ETH | 0.00125731 |
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Similar Match Source Code
Note: This contract matches the deployed ByteCode of the Source Code for Contract 0x96C7dC9d473e621a1e3968Cb862803EAEDe21888
Contract Name:
LiquidityPoolProxy
Compiler Version
v0.8.10+commit.fc410830
Optimization Enabled:
Yes with 10000000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Cowri Labs Inc. pragma solidity =0.8.10; import "@openzeppelin/contracts/access/Ownable.sol"; import {LiquidityPool} from "./LiquidityPool.sol"; import {ILiquidityPoolImplementation, SpecifiedToken} from "./ILiquidityPoolImplementation.sol"; contract LiquidityPoolProxy is LiquidityPool, Ownable { ILiquidityPoolImplementation public implementation; bool public poolFrozen = false; event ImplementationChanged( address operator, address oldImplementation, address newImplementation ); event PoolFrozen( address operator ); modifier notFrozen() { require(poolFrozen == false, "Pool is frozen"); _; } constructor( uint256 xToken_, uint256 yToken_, address ocean_, uint256 initialLpTokenSupply_ ) LiquidityPool( xToken_, yToken_, ocean_, initialLpTokenSupply_, address(0) ) { // External calls with enums rely on both contracts using the same // mapping between enum fields and uint8 values. assert(uint8(SpecifiedToken.X) == 0); assert(uint8(SpecifiedToken.Y) == 1); } function setImplementation(address _implementation) external onlyOwner { emit ImplementationChanged( msg.sender, address(implementation), _implementation ); implementation = ILiquidityPoolImplementation(_implementation); } function freezePool(bool freeze) external onlyOwner { emit PoolFrozen(msg.sender); poolFrozen = freeze; } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance */ function swapGivenInputAmount( uint256 inputToken, uint256 inputAmount) public view override notFrozen returns (uint256 outputAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); outputAmount = implementation.swapGivenInputAmount( xBalance, yBalance, inputAmount, _specifiedToken(inputToken) ); } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply to get the lpTokenSupply */ function depositGivenInputAmount( uint256 depositToken, uint256 depositAmount ) public view override notFrozen returns (uint256 mintAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); uint256 totalSupply = _getTotalSupply(); mintAmount = implementation.depositGivenInputAmount( xBalance, yBalance, totalSupply, depositAmount, _specifiedToken(depositToken) ); } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply to get the lpTokenSupply */ function withdrawGivenInputAmount( uint256 withdrawnToken, uint256 burnAmount ) public view override notFrozen returns (uint256 withdrawnAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); uint256 totalSupply = _getTotalSupply(); withdrawnAmount = implementation.withdrawGivenInputAmount( xBalance, yBalance, totalSupply, burnAmount, _specifiedToken(withdrawnToken) ); } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance */ function swapGivenOutputAmount( uint256 outputToken, uint256 outputAmount ) public view override notFrozen returns (uint256 inputAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); inputAmount = implementation.swapGivenOutputAmount( xBalance, yBalance, outputAmount, _specifiedToken(outputToken) ); } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply() to get the lpTokenSupply */ function depositGivenOutputAmount( uint256 depositToken, uint256 mintAmount ) public view override notFrozen returns (uint256 depositAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); uint256 totalSupply = _getTotalSupply(); depositAmount = implementation.depositGivenOutputAmount( xBalance, yBalance, totalSupply, mintAmount, _specifiedToken(depositToken) ); } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply() to get the lpTokenSupply */ function withdrawGivenOutputAmount( uint256 withdrawnToken, uint256 withdrawnAmount ) public view override notFrozen returns (uint256 burnAmount) { (uint256 xBalance, uint256 yBalance) = _getBalances(); uint256 totalSupply = _getTotalSupply(); burnAmount = implementation.withdrawGivenOutputAmount( xBalance, yBalance, totalSupply, withdrawnAmount, _specifiedToken(withdrawnToken) ); } function _specifiedToken(uint256 tokenId) private view returns (SpecifiedToken) { if (tokenId == xToken) { return SpecifiedToken.X; } else { assert(tokenId == yToken); return SpecifiedToken.Y; } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @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 { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _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 { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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: MIT // Cowri Labs Inc. pragma solidity =0.8.10; import "../ocean/IOceanPrimitive.sol"; import "../ocean/IOceanToken.sol"; interface IERC1155 { function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); } enum ComputeType { Deposit, Swap, Withdraw } abstract contract LiquidityPool is IOceanPrimitive { /// @notice The primitive delegates its state management and accounting to /// this external contract. address public immutable ocean; /// @notice The oceanId of the first token in the base pair uint256 public immutable xToken; /// @notice The oceanId of the second token in the base pair uint256 public immutable yToken; /// @notice The oceanId of the Liquidity Provider token for this pool. This /// value is given to the primitive by the ocean in the constructor. uint256 public immutable lpTokenId; /// @notice Only this address can provide the initial liquidity. /// Claiming initial liquidity is done by calling computeOutputAmount /// twice, once with the xToken as the input and the lpTokenId as the output, /// and once with the yToken as the input and the lpTokenId as the output. address private immutable claimerOrDeployer; /// @notice The first call to computeOutputAmount while claiming inital liquidity /// returns (initialLpTokenSupply / 2) as the output amount. The second call /// does the same. uint256 private immutable initialLpTokenSupply; /// @dev default state for initialSupplyClaimed uint256 private constant UNCLAIMED = 2; /// @dev State the pool is in when only xToken or yToken has been provided uint256 private constant HALF_CLAIMED = 1; /// @dev State the pool is in when both tokens have been provided. uint256 private constant CLAIMED = 0; /// @dev State variable that ensures liquidity is provided correctly before /// enabling full pool functionality. uint256 private initialSupplyClaimed = UNCLAIMED; /// @notice the total supply of the LP token. The ocean keeps track of /// who owns the LP token and how many tokens they have. However, the /// ocean uses an ERC-1155 ledger to do so, which does not track token /// supply. Wrapped tokens on the ocean do not require a total supply. /// Some registered tokens will need a total supply, and others won't. /// The primitive registering the token knows whether total supply must be /// tracked, and so it is most economical for the primitive to privately /// track the total supply of the token. uint256 private lpTokenSupply = 0; event Swap( uint256 inputToken, uint256 inputAmount, uint256 outputAmount, bytes32 slippageProtection, address user, bool computeOutput ); event Deposit( uint256 inputToken, uint256 inputAmount, uint256 outputAmount, bytes32 slippageProtection, address user, bool computeOutput ); event Withdraw( uint256 outputToken, uint256 inputAmount, uint256 outputAmount, bytes32 slippageProtection, address user, bool computeOutput ); event InitialLiquidity( uint256 inputToken, uint256 inputAmount, uint256 outputAmount, address user, bool active ); /** * @notice Sets up the immtuable variables. Makes one external call to the * provided ocean to register its Liquidity Provider token Id. This allows * the pool to mint its token on the ocean when users deposit, and burn * its token on the ocean when users withdraw. * @param xToken_ one of the two tokens that make up the base pair * @param yToken_ the other of the two tokens that make up the base pair * @param ocean_ the address of the contract that handles the pool's * accounting and order routing. The pool must only change its internal * state when it is called by the ocean. All other public functions must * have no side effects. * @param initialLpTokenSupply_ the initial supply of the Liquidity Provider * token. The process of seeding the pool with initial liquidity results * in this many LP tokens being minted. It should be an even number. * @param claimer This is an optional argument. If address(0) is passed, * the claimerOrDeployer state variable is set to the deployer * (msg.sender). If any other value is passed, the claimerOrDeployer is * set to the passed value. The immutable state variable claimerOrDeployer * guards the initial liquidity seeding. Without this, anyone could claim * the initial liquidity using any amount of xToken or yToken. */ constructor( uint256 xToken_, uint256 yToken_, address ocean_, uint256 initialLpTokenSupply_, address claimer ) { claimerOrDeployer = claimer == address(0) ? msg.sender : claimer; initialLpTokenSupply = initialLpTokenSupply_; ocean = ocean_; xToken = xToken_; yToken = yToken_; uint256[] memory registeredToken = IOceanToken(ocean_) .registerNewTokens(0, 1); lpTokenId = registeredToken[0]; } /// @dev this MUST be applied to every PUBLIC or EXTERNAL function that is /// not PURE or VIEW. modifier onlyOcean() { require(msg.sender == ocean); _; } /// @dev this MUST be applied to every PUBLIC or EXTERNAL function that is /// not PURE or VIEW, except for computeOutputAmount. computeOutputAmount /// has its own guard for this condition. modifier onlyClaimed() { require(initialSupplyClaimed == CLAIMED); _; } /** * @dev The ocean must always know the input and output tokens in order to * do the accounting. One of the token amounts is chosen by the user, and * the other amount is chosen by the pool. When computeOutputAmount is * called, the user provides the inputAmount, and the pool uses this to * compute the outputAmount * @dev This function delegates to a handler when the initalSupply has yet been * claimed. It MUST have the modifier onlyOcean. * @param inputToken The user is giving this token to the pool * @param outputToken The pool is giving this token to the user * @param inputAmount The amount of the inputToken the user is giving to the pool * @param userAddress The address of the user, passed from the accounting system. * The userAddress is used in this case to determine if the user is allowed to * claim the initial mint. * @dev the unusued param is a bytes32 field called metadata, which the user * provides the ocean, and the ocean passes directly to the primitive. */ function computeOutputAmount( uint256 inputToken, uint256 outputToken, uint256 inputAmount, address userAddress, bytes32 minimumOutputAmount ) external override onlyOcean returns (uint256 outputAmount) { ComputeType action = _determineComputeType(inputToken, outputToken); if (initialSupplyClaimed != CLAIMED) { outputAmount = _handleInitialMints( inputToken, inputAmount, userAddress, action ); lpTokenSupply += outputAmount; emit InitialLiquidity( inputToken, inputAmount, outputAmount, userAddress, (initialSupplyClaimed == CLAIMED) ); } else if (action == ComputeType.Swap) { // Swap action + computeOutput context => swapGivenInputAmount() outputAmount = swapGivenInputAmount(inputToken, inputAmount); emit Swap( inputToken, inputAmount, outputAmount, minimumOutputAmount, userAddress, true ); } else if (action == ComputeType.Deposit) { // Deposit action + computeOutput context => depositGivenInputAmount() outputAmount = depositGivenInputAmount(inputToken, inputAmount); // Deposit, therefore outputToken is the LP token. This means the // ocean is going to mint the outputAmount to the user. We // need to increase the totalSupply by the mint (output) amount. lpTokenSupply += outputAmount; emit Deposit( inputToken, inputAmount, outputAmount, minimumOutputAmount, userAddress, true ); } else { // Because the enum only has three values, if the third branch // is not a withdraw, the code must be wrong, so we use an assert. assert(action == ComputeType.Withdraw); // Withdraw action + computeOutput context => withdrawGivenInputAmount() outputAmount = withdrawGivenInputAmount(outputToken, inputAmount); // Withdraw, therefore inputToken is the LP token. This means the // ocean is going to burn the inputAmount from the user. We // need to decrease the totalSupply by the burn (input) amount. lpTokenSupply -= inputAmount; emit Withdraw( outputToken, inputAmount, outputAmount, minimumOutputAmount, userAddress, true ); } require( uint256(minimumOutputAmount) <= outputAmount, "Slippage limit exceeded" ); } /** * @dev The ocean must always know the input and output tokens in order to * do the accounting. One of the token amounts is chosen by the user, and * the other amount is chosen by the pool. When computeInputAmount is * called, the user provides the outputAmount, and the pool uses this to * compute the inputAmount necessary to receive the provided outputAmount. * @dev this function MUST have the modifiers onlyOcean and onlyClaimed * @param inputToken The user is giving this token to the pool * @param outputToken The pool is giving this token to the user * @param outputAmount The amount of the outputToken the pool will give to the user * @dev The first unusued param is the address of the user, passed from the * accounting system. * @dev The second unusued param is a bytes32 field called metadata, which the * user provides the ocean, and the ocean passes directly to the primitive. */ function computeInputAmount( uint256 inputToken, uint256 outputToken, uint256 outputAmount, address userAddress, bytes32 maximumInputAmount ) external override onlyOcean onlyClaimed returns (uint256 inputAmount) { ComputeType action = _determineComputeType(inputToken, outputToken); if (action == ComputeType.Swap) { // Swap action + computeInput context => swapGivenOutputAmount() inputAmount = swapGivenOutputAmount(outputToken, outputAmount); emit Swap( inputToken, inputAmount, outputAmount, maximumInputAmount, userAddress, false ); } else if (action == ComputeType.Deposit) { // Deposit action + computeInput context => depositGivenOutputAmount() inputAmount = depositGivenOutputAmount(inputToken, outputAmount); // Deposit, therefore outputToken is the LP token. This means the // ocean is going to mint the outputAmount to the user. We // need to increase the totalSupply by the mint (output) amount. lpTokenSupply += outputAmount; emit Deposit( inputToken, inputAmount, outputAmount, maximumInputAmount, userAddress, false ); } else { // Because the enum only has three values, if the third branch // is not a withdraw, the code must be wrong, so we use an assert. assert(action == ComputeType.Withdraw); // Withdraw action + computeInput context => withdrawGivenOutputAmount() inputAmount = withdrawGivenOutputAmount(outputToken, outputAmount); // Withdraw, therefore inputToken is the LP token. This means the // ocean is going to burn the inputAmount from the user. We // need to decrease the totalSupply by the burn (input) amount. lpTokenSupply -= inputAmount; emit Withdraw( outputToken, inputAmount, outputAmount, maximumInputAmount, userAddress, false ); } if (uint256(maximumInputAmount) > 0) { require( uint256(maximumInputAmount) >= inputAmount, "Slippage limit exceeded" ); } } /// @notice part of the IOceanPrimitive interface, a standard way for /// primitives to expose the total supply of their registered tokens /// if they chose to. function getTokenSupply(uint256 tokenId) external view override returns (uint256 totalSupply) { require(tokenId == lpTokenId, "invalid tokenId"); totalSupply = lpTokenSupply; } /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance */ function swapGivenInputAmount(uint256 inputToken, uint256 inputAmount) public view virtual returns (uint256 outputAmount); /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply to get the lpTokenSupply */ function depositGivenInputAmount( uint256 depositToken, uint256 depositAmount ) public view virtual returns (uint256 mintAmount); /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply to get the lpTokenSupply */ function withdrawGivenInputAmount( uint256 withdrawnToken, uint256 burnAmount ) public view virtual returns (uint256 withdrawnAmount); /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance */ function swapGivenOutputAmount(uint256 outputToken, uint256 outputAmount) public view virtual returns (uint256 inputAmount); /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply() to get the lpTokenSupply */ function depositGivenOutputAmount(uint256 depositToken, uint256 mintAmount) public view virtual returns (uint256 depositAmount); /** * @dev this function should begin by calling _getBalances() to get the * xBalance and yBalance and _getTotalSupply() to get the lpTokenSupply */ function withdrawGivenOutputAmount( uint256 withdrawnToken, uint256 withdrawnAmount ) public view virtual returns (uint256 burnAmount); /// @dev Gets the pool's current balance of the xToken and the yToken from /// the ocean. function _getBalances() internal view returns (uint256 xBalance, uint256 yBalance) { address[] memory accounts = new address[](2); uint256[] memory ids = new uint256[](2); accounts[0] = accounts[1] = address(this); ids[0] = xToken; ids[1] = yToken; uint256[] memory result = IERC1155(ocean).balanceOfBatch(accounts, ids); (xBalance, yBalance) = (result[0], result[1]); } /// @dev Provides a read only view of the current supply of the LP token /// @dev this is needed because the lpTokenSupply variable is private, since /// contracts that inherit from this abstract contract should not modify the /// lpTokenSupply directly. function _getTotalSupply() internal view returns (uint256 totalSupply) { totalSupply = lpTokenSupply; } /// @dev Manages the state transitions between UNCLAIMED, HALF_CLAIMED, and CLAIMED /// @dev Only accessible through computeOutputAmount. The ComputeType MUST BE a /// Deposit. /// @dev Only the claimerOrDeployer can perform the initial mints function _handleInitialMints( uint256 inputToken, uint256 inputAmount, address userAddress, ComputeType action ) private returns (uint256 outputAmount) { require(userAddress == claimerOrDeployer); require(action == ComputeType.Deposit); require(inputAmount >= 10**12); assert(initialSupplyClaimed != CLAIMED); (uint256 xBalance, uint256 yBalance) = _getBalances(); if (initialSupplyClaimed == UNCLAIMED) { assert(_getTotalSupply() == 0); assert((xBalance == 0) && (yBalance == 0)); outputAmount = initialLpTokenSupply / 2; initialSupplyClaimed = HALF_CLAIMED; } else if ((initialSupplyClaimed == HALF_CLAIMED) && (xBalance == 0)) { assert(_getTotalSupply() == initialLpTokenSupply / 2); assert(yBalance > 0); require(inputToken == xToken); outputAmount = initialLpTokenSupply / 2; initialSupplyClaimed = CLAIMED; } else { assert( (initialSupplyClaimed == HALF_CLAIMED) && (yBalance == 0) && (_getTotalSupply() == initialLpTokenSupply / 2) ); require(inputToken == yToken); outputAmount = initialLpTokenSupply / 2; initialSupplyClaimed = CLAIMED; } } /** * @dev Uses the inputToken and outputToken to determine the ComputeType * (input: xToken, output: yToken) | (input: yToken, output: xToken) => SWAP * base := xToken | yToken * (input: base, output: lpToken) => DEPOSIT * (input: lpToken, output: base) => WITHDRAW */ function _determineComputeType(uint256 inputToken, uint256 outputToken) private view returns (ComputeType computeType) { if ( ((inputToken == xToken) && (outputToken == yToken)) || ((inputToken == yToken) && (outputToken == xToken)) ) { return ComputeType.Swap; } else if ( ((inputToken == xToken) || (inputToken == yToken)) && (outputToken == lpTokenId) ) { return ComputeType.Deposit; } else if ( (inputToken == lpTokenId) && ((outputToken == xToken) || (outputToken == yToken)) ) { return ComputeType.Withdraw; } else { revert("Invalid ComputeType"); } } }
// SPDX-License-Identifier: MIT // Cowri Labs Inc. pragma solidity =0.8.10; enum SpecifiedToken { X, Y } interface ILiquidityPoolImplementation { function swapGivenInputAmount( uint256 xBalance, uint256 yBalance, uint256 inputAmount, SpecifiedToken inputToken ) external view returns (uint256 outputAmount); function depositGivenInputAmount( uint256 xBalance, uint256 yBalance, uint256 totalSupply, uint256 depositedAmount, SpecifiedToken depositedToken ) external view returns (uint256 mintedAmount); function withdrawGivenInputAmount( uint256 xBalance, uint256 yBalance, uint256 totalSupply, uint256 burnedAmount, SpecifiedToken withdrawnToken ) external view returns (uint256 withdrawnAmount); function swapGivenOutputAmount( uint256 xBalance, uint256 yBalance, uint256 outputAmount, SpecifiedToken outputToken ) external view returns (uint256 inputAmount); function depositGivenOutputAmount( uint256 xBalance, uint256 yBalance, uint256 totalSupply, uint256 mintedAmount, SpecifiedToken depositedToken ) external view returns (uint256 depositedAmount); function withdrawGivenOutputAmount( uint256 xBalance, uint256 yBalance, uint256 totalSupply, uint256 withdrawnAmount, SpecifiedToken withdrawnToken ) external view returns (uint256 burnedAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: unlicensed // Cowri Labs Inc. pragma solidity =0.8.10; /// @notice Implementing this allows a primitive to be called by the Ocean's /// defi framework. interface IOceanPrimitive { function computeOutputAmount( uint256 inputToken, uint256 outputToken, uint256 inputAmount, address userAddress, bytes32 metadata ) external returns (uint256 outputAmount); function computeInputAmount( uint256 inputToken, uint256 outputToken, uint256 outputAmount, address userAddress, bytes32 metadata ) external returns (uint256 inputAmount); function getTokenSupply(uint256 tokenId) external view returns (uint256 totalSupply); }
// SPDX-License-Identifier: unlicensed // Cowri Labs Inc. pragma solidity =0.8.10; /** * @title Interface for external contracts that issue tokens on the Ocean's * public multitoken ledger * @dev Implemented by OceanERC1155. */ interface IOceanToken { function registerNewTokens( uint256 currentNumberOfTokens, uint256 numberOfAdditionalTokens ) external returns (uint256[] memory); }
{ "optimizer": { "enabled": true, "runs": 10000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
[{"inputs":[{"internalType":"uint256","name":"xToken_","type":"uint256"},{"internalType":"uint256","name":"yToken_","type":"uint256"},{"internalType":"address","name":"ocean_","type":"address"},{"internalType":"uint256","name":"initialLpTokenSupply_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"inputToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"slippageProtection","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"computeOutput","type":"bool"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"address","name":"oldImplementation","type":"address"},{"indexed":false,"internalType":"address","name":"newImplementation","type":"address"}],"name":"ImplementationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"inputToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"InitialLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"}],"name":"PoolFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"inputToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"slippageProtection","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"computeOutput","type":"bool"}],"name":"Swap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"outputToken","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"slippageProtection","type":"bytes32"},{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"bool","name":"computeOutput","type":"bool"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"inputToken","type":"uint256"},{"internalType":"uint256","name":"outputToken","type":"uint256"},{"internalType":"uint256","name":"outputAmount","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes32","name":"maximumInputAmount","type":"bytes32"}],"name":"computeInputAmount","outputs":[{"internalType":"uint256","name":"inputAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inputToken","type":"uint256"},{"internalType":"uint256","name":"outputToken","type":"uint256"},{"internalType":"uint256","name":"inputAmount","type":"uint256"},{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes32","name":"minimumOutputAmount","type":"bytes32"}],"name":"computeOutputAmount","outputs":[{"internalType":"uint256","name":"outputAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositToken","type":"uint256"},{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"name":"depositGivenInputAmount","outputs":[{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"depositToken","type":"uint256"},{"internalType":"uint256","name":"mintAmount","type":"uint256"}],"name":"depositGivenOutputAmount","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"freeze","type":"bool"}],"name":"freezePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenSupply","outputs":[{"internalType":"uint256","name":"totalSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementation","outputs":[{"internalType":"contract ILiquidityPoolImplementation","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ocean","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFrozen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_implementation","type":"address"}],"name":"setImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"inputToken","type":"uint256"},{"internalType":"uint256","name":"inputAmount","type":"uint256"}],"name":"swapGivenInputAmount","outputs":[{"internalType":"uint256","name":"outputAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"outputToken","type":"uint256"},{"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"swapGivenOutputAmount","outputs":[{"internalType":"uint256","name":"inputAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawnToken","type":"uint256"},{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"name":"withdrawGivenInputAmount","outputs":[{"internalType":"uint256","name":"withdrawnAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"withdrawnToken","type":"uint256"},{"internalType":"uint256","name":"withdrawnAmount","type":"uint256"}],"name":"withdrawGivenOutputAmount","outputs":[{"internalType":"uint256","name":"burnAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"xToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"yToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
610140604052600260009081556001556003805460ff60a01b191690553480156200002957600080fd5b50604051620022ba380380620022ba8339810160408190526200004c9162000192565b838383836000336001600160a01b03908116610100526101208390528316608081905260a086905260c085905260405163215835b360e01b815260006004820181905260016024830152919063215835b3906044016000604051808303816000875af1158015620000c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000eb9190810190620001f6565b905080600081518110620001035762000103620002bf565b602002602001015160e08181525050505050505050620001326200012c6200013c60201b60201c565b62000140565b50505050620002d5565b3390565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060008060808587031215620001a957600080fd5b84516020860151604087015191955093506001600160a01b0381168114620001d057600080fd5b6060959095015193969295505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200020a57600080fd5b82516001600160401b03808211156200022257600080fd5b818501915085601f8301126200023757600080fd5b8151818111156200024c576200024c620001e0565b8060051b604051601f19603f83011681018181108582111715620002745762000274620001e0565b6040529182528482019250838101850191888311156200029357600080fd5b938501935b82851015620002b35784518452938501939285019262000298565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e0516101005161012051611eed620003cd600039600081816117c60152818161181201528181611889015281816118d6015261193e015260006116e8015260008181610176015281816104da015281816115c901526115fa015260008181610210015281816112f601528181611488015281816114f00152818161151a0152818161159e0152818161164d015261190d0152600081816101b0015281816112b601528181611458015281816114c601528181611544015281816115750152818161162401526118580152600081816102dd0152818161058301528181610d2101526113730152611eed6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80638da5cb5b116100cd578063d784d42611610081578063f2fde38b11610066578063f2fde38b1461036d578063fd67bc9b14610380578063fec49c6f1461039357600080fd5b8063d784d42614610347578063e92ebd3a1461035a57600080fd5b8063a6ec335f116100b2578063a6ec335f146102d8578063a9b419ba146102ff578063add9383f1461031257600080fd5b80638da5cb5b146102a75780639fc6d323146102c557600080fd5b806349bfcca1116101245780635c60da1b116101095780635c60da1b14610245578063715018a61461028a5780637969d9d41461029457600080fd5b806349bfcca11461020b5780634fa6393d1461023257600080fd5b80630bdf8240116101555780630bdf8240146101d257806319b88edb146101e55780633fc20d4f146101f857600080fd5b80630242d71214610171578063088b699e146101ab575b600080fd5b6101987f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101987f000000000000000000000000000000000000000000000000000000000000000081565b6101986101e0366004611a6b565b6103a6565b6101986101f3366004611a8d565b6104d6565b610198610206366004611aca565b610569565b6101987f000000000000000000000000000000000000000000000000000000000000000081565b610198610240366004611a6b565b6108ae565b6003546102659073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b6102926109e9565b005b6101986102a2366004611a6b565b6109fd565b60025473ffffffffffffffffffffffffffffffffffffffff16610265565b6101986102d3366004611a6b565b610abf565b6102657f000000000000000000000000000000000000000000000000000000000000000081565b61019861030d366004611a6b565b610b8f565b6003546103379074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101a2565b610292610355366004611b11565b610c5f565b610198610368366004611aca565b610d07565b61029261037b366004611b11565b610fc3565b61019861038e366004611a6b565b61107a565b6102926103a1366004611b33565b61114a565b60035460009074010000000000000000000000000000000000000000900460ff1615610433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e00000000000000000000000000000000000060448201526064015b60405180910390fd5b60008061043e6111cf565b600354919350915073ffffffffffffffffffffffffffffffffffffffff1663012e351f83838761046d8a611454565b6040518563ffffffff1660e01b815260040161048c9493929190611bbf565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd9190611be1565b95945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008214610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420746f6b656e49640000000000000000000000000000000000604482015260640161042a565b505060015490565b60003373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105ad57600080fd5b60006105b987876114c2565b90506000805414610656576105d0878686846116e4565b915081600160008282546105e49190611c29565b9091555050600054604080518981526020810188905290810184905273ffffffffffffffffffffffffffffffffffffffff86166060820152901560808201527fbc61078fc39a3aa9a2dc50dc9d27523ddbc40ace9534b9ebf7e4fc7438156aac9060a0015b60405180910390a161083a565b600181600281111561066a5761066a611b55565b14156106e55761067a87866103a6565b60408051898152602081018890529081018290526060810185905273ffffffffffffffffffffffffffffffffffffffff86166080820152600160a08201529092507f976ffbca84869d39bddd7057048dffc33e97641e3c7fe06fd7fc2b039c17b6e59060c001610649565b60008160028111156106f9576106f9611b55565b141561078a5761070987866108ae565b9150816001600082825461071d9190611c29565b909155505060408051888152602081018790529081018390526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600160a08201527f884d9201fa8b7681d1481b193805aec6deb56538f54e2abef3286e2c5bf28ff39060c001610649565b600281600281111561079e5761079e611b55565b146107ab576107ab611c41565b6107b58686610abf565b915084600160008282546107c99190611c70565b909155505060408051878152602081018790529081018390526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600160a08201527f2e0d08763feb8b33376106fd02b993cd22509e7a3381381573d3c80818c275099060c00160405180910390a15b818311156108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f536c697070616765206c696d6974206578636565646564000000000000000000604482015260640161042a565b5095945050505050565b60035460009074010000000000000000000000000000000000000000900460ff1615610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b6000806109416111cf565b91509150600061095060015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff1663b97621d88484848961097e8c611454565b6040518663ffffffff1660e01b815260040161099e959493929190611c87565b602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611be1565b9695505050505050565b6109f1611973565b6109fb60006119f4565b565b60035460009074010000000000000000000000000000000000000000900460ff1615610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610a906111cf565b600354919350915073ffffffffffffffffffffffffffffffffffffffff16631c510e4183838761046d8a611454565b60035460009074010000000000000000000000000000000000000000900460ff1615610b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610b526111cf565b915091506000610b6160015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff16634aa025c58484848961097e8c611454565b60035460009074010000000000000000000000000000000000000000900460ff1615610c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610c226111cf565b915091506000610c3160015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff16631e829cdc8484848961097e8c611454565b610c67611973565b6003546040805133815273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f9adadd1ca2a8bbfabc8e8ec75578b750d87e49c03146662ba9a2b996af6380069181900360600190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d4b57600080fd5b60005415610d5857600080fd5b6000610d6487876114c2565b90506001816002811115610d7a57610d7a611b55565b1415610dfe57610d8a86866109fd565b60408051898152602081018390529081018790526060810185905273ffffffffffffffffffffffffffffffffffffffff86166080820152600060a08201529092507f976ffbca84869d39bddd7057048dffc33e97641e3c7fe06fd7fc2b039c17b6e59060c0015b60405180910390a1610f53565b6000816002811115610e1257610e12611b55565b1415610ea357610e228786610b8f565b91508460016000828254610e369190611c29565b909155505060408051888152602081018490529081018690526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600060a08201527f884d9201fa8b7681d1481b193805aec6deb56538f54e2abef3286e2c5bf28ff39060c001610df1565b6002816002811115610eb757610eb7611b55565b14610ec457610ec4611c41565b610ece868661107a565b91508160016000828254610ee29190611c70565b909155505060408051878152602081018490529081018690526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600060a08201527f2e0d08763feb8b33376106fd02b993cd22509e7a3381381573d3c80818c275099060c00160405180910390a15b82156108a457818310156108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f536c697070616765206c696d6974206578636565646564000000000000000000604482015260640161042a565b610fcb611973565b73ffffffffffffffffffffffffffffffffffffffff811661106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161042a565b611077816119f4565b50565b60035460009074010000000000000000000000000000000000000000900460ff1615611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b60008061110d6111cf565b91509150600061111c60015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff1663fa274d8b8484848961097e8c611454565b611152611973565b6040513381527fb2568b4c84afb6a6a67d89e5c8af97aeeb6a26ead48d288bf5dc50298ea5652f9060200160405180910390a16003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b604080516002808252606082018352600092839283929091602083019080368337505060408051600280825260608201835293945060009390925090602083019080368337019050509050308260018151811061122e5761122e611ce0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152508260008151811061127a5761127a611ce0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106112e8576112e8611ce0565b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061132857611328611ce0565b60209081029190910101526040517f4e1273f400000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634e1273f4906113aa9086908690600401611d0f565b600060405180830381865afa1580156113c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261140d9190810190611da0565b90508060008151811061142257611422611ce0565b60200260200101518160018151811061143d5761143d611ce0565b602002602001015180955081965050505050509091565b60007f000000000000000000000000000000000000000000000000000000000000000082141561148657506000919050565b7f000000000000000000000000000000000000000000000000000000000000000082146114b5576114b5611c41565b506001919050565b919050565b60007f00000000000000000000000000000000000000000000000000000000000000008314801561151257507f000000000000000000000000000000000000000000000000000000000000000082145b8061156657507f00000000000000000000000000000000000000000000000000000000000000008314801561156657507f000000000000000000000000000000000000000000000000000000000000000082145b15611573575060016116de565b7f00000000000000000000000000000000000000000000000000000000000000008314806115c057507f000000000000000000000000000000000000000000000000000000000000000083145b80156115eb57507f000000000000000000000000000000000000000000000000000000000000000082145b156115f8575060006116de565b7f00000000000000000000000000000000000000000000000000000000000000008314801561166f57507f000000000000000000000000000000000000000000000000000000000000000082148061166f57507f000000000000000000000000000000000000000000000000000000000000000082145b1561167c575060026116de565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c696420436f6d707574655479706500000000000000000000000000604482015260640161042a565b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461173e57600080fd5b600082600281111561175257611752611b55565b1461175c57600080fd5b64e8d4a5100084101561176e57600080fd5b60005461177d5761177d611c41565b6000806117886111cf565b91509150600260005414156117f657600154156117a7576117a7611c41565b811580156117b3575080155b6117bf576117bf611c41565b6117ea60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b60016000559250611969565b6001600054148015611806575081155b156118b85761183660027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b6001541461184657611846611c41565b6000811161185657611856611c41565b7f0000000000000000000000000000000000000000000000000000000000000000871461188257600080fd5b6118ad60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b600080559250611969565b60016000541480156118c8575080155b80156118ff57506118fa60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b600154145b61190b5761190b611c41565b7f0000000000000000000000000000000000000000000000000000000000000000871461193757600080fd5b61196260027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b6000805592505b5050949350505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146109fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042a565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060408385031215611a7e57600080fd5b50508035926020909101359150565b600060208284031215611a9f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146114bd57600080fd5b600080600080600060a08688031215611ae257600080fd5b853594506020860135935060408601359250611b0060608701611aa6565b949793965091946080013592915050565b600060208284031215611b2357600080fd5b611b2c82611aa6565b9392505050565b600060208284031215611b4557600080fd5b81358015158114611b2c57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110611bbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016104cd6060830184611b84565b600060208284031215611bf357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611c3c57611c3c611bfa565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611c8257611c82611bfa565b500390565b600060a0820190508682528560208301528460408301528360608301526109df6080830184611b84565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015611d5e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611d2c565b5050508381038285015284518082528583019183019060005b81811015611d9357835183529284019291840191600101611d77565b5090979650505050505050565b60006020808385031215611db357600080fd5b825167ffffffffffffffff80821115611dcb57600080fd5b818501915085601f830112611ddf57600080fd5b815181811115611df157611df1611cb1565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611e3457611e34611cb1565b604052918252848201925083810185019188831115611e5257600080fd5b938501935b82851015611e7057845184529385019392850192611e57565b98975050505050505050565b600082611eb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea26469706673582212200e6a1ac9a980f562f22f20e71bdec13c575c61637877293449ad4680c4a65a4864736f6c634300080a00330d5800510d08ad952a6ce46bcfea8d8ca79fac4a0d7bba1a61c9466ec89111d494ba45375f692d30ba350c4ab1f8b86afb2eca05bb25e84db3dc2285ba154922000000000000000000000000c32eb36f886f638fffd836df44c124074cfe358400000000000000000000000000000000000000000000003635c9adc5dea00000
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.