Contract 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887

 

Contract Overview

Balance:
0 ETH

ETH Value:
$0.00

Token:
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xc2f5d4d6c7fd6be2bac25959e8f594a0b6873e94e21f17b5982a62838c91137aSet Implementati...639464452023-02-24 1:05:3324 days 21 hrs agoBro Kwon's Booty: Deployer IN  0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH0.00004363 0.1
0xa70820ad4886255757b3460ba05463b3013b8251a91d1611a11cb8496f9685370x61014060639464012023-02-24 1:05:2124 days 21 hrs agoBro Kwon's Booty: Deployer IN  Contract Creation0 ETH0.00125731 0.1
[ Download CSV Export 
Latest 25 internal transaction
Parent Txn Hash Block From To Value
0x58c4a0411c1bd208cc9b544666349604e02f45bc7c4266cf69162ab606ca5907719232602023-03-20 22:59:142 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x58c4a0411c1bd208cc9b544666349604e02f45bc7c4266cf69162ab606ca5907719232602023-03-20 22:59:142 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x58c4a0411c1bd208cc9b544666349604e02f45bc7c4266cf69162ab606ca5907719232602023-03-20 22:59:142 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0x1cf0c4ffbff8d1038975ca8bbdf78e9cd5b223cf2cff16ea37160175c711cc36719229522023-03-20 22:57:524 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x1cf0c4ffbff8d1038975ca8bbdf78e9cd5b223cf2cff16ea37160175c711cc36719229522023-03-20 22:57:524 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x1cf0c4ffbff8d1038975ca8bbdf78e9cd5b223cf2cff16ea37160175c711cc36719229522023-03-20 22:57:524 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0x10c2b7e5523a7839ae9ae2ab521edb9f96b4b3c630b8a2f7e2481eb823e7395c719224712023-03-20 22:55:436 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x10c2b7e5523a7839ae9ae2ab521edb9f96b4b3c630b8a2f7e2481eb823e7395c719224712023-03-20 22:55:436 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x10c2b7e5523a7839ae9ae2ab521edb9f96b4b3c630b8a2f7e2481eb823e7395c719224712023-03-20 22:55:436 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0x1e5acbc4bed2f807f175eb2484960e3eee106529e8da271f4b6fedd91b337405719222282023-03-20 22:54:397 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x1e5acbc4bed2f807f175eb2484960e3eee106529e8da271f4b6fedd91b337405719222282023-03-20 22:54:397 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x1e5acbc4bed2f807f175eb2484960e3eee106529e8da271f4b6fedd91b337405719222282023-03-20 22:54:397 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0x874a932e649b28964b0738b2950a84441cb7de80b4926433a18034c9b6ab43ff719220282023-03-20 22:53:448 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0xea414b8b90cc1ac8069865888484c794da2045adf8c02a3f62cd49ab58ac97f5719216602023-03-20 22:52:129 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0xea414b8b90cc1ac8069865888484c794da2045adf8c02a3f62cd49ab58ac97f5719216602023-03-20 22:52:129 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0xea414b8b90cc1ac8069865888484c794da2045adf8c02a3f62cd49ab58ac97f5719216602023-03-20 22:52:129 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0xaf92d48c38c3498849cb2fe2be8c3eba082785c6f527617c1f93d5dcee5cbf86719216492023-03-20 22:52:089 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
0xaf92d48c38c3498849cb2fe2be8c3eba082785c6f527617c1f93d5dcee5cbf86719216492023-03-20 22:52:089 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 Shell Protocol0 ETH
0xaf92d48c38c3498849cb2fe2be8c3eba082785c6f527617c1f93d5dcee5cbf86719216492023-03-20 22:52:089 mins ago Shell Protocol 0x2eab95a938d1fabb1b62132bdb0c5a2405a578870 ETH
0xae05ef511157a36a40321e3728514eaf972b6644a88a347ee21470b3c0fa5084719212402023-03-20 22:50:1811 mins ago 0x2eab95a938d1fabb1b62132bdb0c5a2405a57887 0x56db613ccbe5469a467dc43eee923947bd124a290 ETH
[ Download CSV Export 
Loading

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)

File 1 of 7 : LiquidityPoolProxy.sol
// 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;
        }
    }
}

File 2 of 7 : Ownable.sol
// 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);
    }
}

File 3 of 7 : LiquidityPool.sol
// 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");
        }
    }
}

File 4 of 7 : ILiquidityPoolImplementation.sol
// 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);
}

File 5 of 7 : Context.sol
// 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;
    }
}

File 6 of 7 : IOceanPrimitive.sol
// 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);
}

File 7 of 7 : IOceanToken.sol
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 10000000
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract ABI

[{"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"}]

610140604052600260009081556001556003805460ff60a01b191690553480156200002957600080fd5b50604051620022ba380380620022ba8339810160408190526200004c9162000192565b838383836000336001600160a01b03908116610100526101208390528316608081905260a086905260c085905260405163215835b360e01b815260006004820181905260016024830152919063215835b3906044016000604051808303816000875af1158015620000c1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620000eb9190810190620001f6565b905080600081518110620001035762000103620002bf565b602002602001015160e08181525050505050505050620001326200012c6200013c60201b60201c565b62000140565b50505050620002d5565b3390565b600280546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060008060808587031215620001a957600080fd5b84516020860151604087015191955093506001600160a01b0381168114620001d057600080fd5b6060959095015193969295505050565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200020a57600080fd5b82516001600160401b03808211156200022257600080fd5b818501915085601f8301126200023757600080fd5b8151818111156200024c576200024c620001e0565b8060051b604051601f19603f83011681018181108582111715620002745762000274620001e0565b6040529182528482019250838101850191888311156200029357600080fd5b938501935b82851015620002b35784518452938501939285019262000298565b98975050505050505050565b634e487b7160e01b600052603260045260246000fd5b60805160a05160c05160e0516101005161012051611eed620003cd600039600081816117c60152818161181201528181611889015281816118d6015261193e015260006116e8015260008181610176015281816104da015281816115c901526115fa015260008181610210015281816112f601528181611488015281816114f00152818161151a0152818161159e0152818161164d015261190d0152600081816101b0015281816112b601528181611458015281816114c601528181611544015281816115750152818161162401526118580152600081816102dd0152818161058301528181610d2101526113730152611eed6000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80638da5cb5b116100cd578063d784d42611610081578063f2fde38b11610066578063f2fde38b1461036d578063fd67bc9b14610380578063fec49c6f1461039357600080fd5b8063d784d42614610347578063e92ebd3a1461035a57600080fd5b8063a6ec335f116100b2578063a6ec335f146102d8578063a9b419ba146102ff578063add9383f1461031257600080fd5b80638da5cb5b146102a75780639fc6d323146102c557600080fd5b806349bfcca1116101245780635c60da1b116101095780635c60da1b14610245578063715018a61461028a5780637969d9d41461029457600080fd5b806349bfcca11461020b5780634fa6393d1461023257600080fd5b80630bdf8240116101555780630bdf8240146101d257806319b88edb146101e55780633fc20d4f146101f857600080fd5b80630242d71214610171578063088b699e146101ab575b600080fd5b6101987f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020015b60405180910390f35b6101987f000000000000000000000000000000000000000000000000000000000000000081565b6101986101e0366004611a6b565b6103a6565b6101986101f3366004611a8d565b6104d6565b610198610206366004611aca565b610569565b6101987f000000000000000000000000000000000000000000000000000000000000000081565b610198610240366004611a6b565b6108ae565b6003546102659073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b6102926109e9565b005b6101986102a2366004611a6b565b6109fd565b60025473ffffffffffffffffffffffffffffffffffffffff16610265565b6101986102d3366004611a6b565b610abf565b6102657f000000000000000000000000000000000000000000000000000000000000000081565b61019861030d366004611a6b565b610b8f565b6003546103379074010000000000000000000000000000000000000000900460ff1681565b60405190151581526020016101a2565b610292610355366004611b11565b610c5f565b610198610368366004611aca565b610d07565b61029261037b366004611b11565b610fc3565b61019861038e366004611a6b565b61107a565b6102926103a1366004611b33565b61114a565b60035460009074010000000000000000000000000000000000000000900460ff1615610433576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e00000000000000000000000000000000000060448201526064015b60405180910390fd5b60008061043e6111cf565b600354919350915073ffffffffffffffffffffffffffffffffffffffff1663012e351f83838761046d8a611454565b6040518563ffffffff1660e01b815260040161048c9493929190611bbf565b602060405180830381865afa1580156104a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cd9190611be1565b95945050505050565b60007f00000000000000000000000000000000000000000000000000000000000000008214610561576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c696420746f6b656e49640000000000000000000000000000000000604482015260640161042a565b505060015490565b60003373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146105ad57600080fd5b60006105b987876114c2565b90506000805414610656576105d0878686846116e4565b915081600160008282546105e49190611c29565b9091555050600054604080518981526020810188905290810184905273ffffffffffffffffffffffffffffffffffffffff86166060820152901560808201527fbc61078fc39a3aa9a2dc50dc9d27523ddbc40ace9534b9ebf7e4fc7438156aac9060a0015b60405180910390a161083a565b600181600281111561066a5761066a611b55565b14156106e55761067a87866103a6565b60408051898152602081018890529081018290526060810185905273ffffffffffffffffffffffffffffffffffffffff86166080820152600160a08201529092507f976ffbca84869d39bddd7057048dffc33e97641e3c7fe06fd7fc2b039c17b6e59060c001610649565b60008160028111156106f9576106f9611b55565b141561078a5761070987866108ae565b9150816001600082825461071d9190611c29565b909155505060408051888152602081018790529081018390526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600160a08201527f884d9201fa8b7681d1481b193805aec6deb56538f54e2abef3286e2c5bf28ff39060c001610649565b600281600281111561079e5761079e611b55565b146107ab576107ab611c41565b6107b58686610abf565b915084600160008282546107c99190611c70565b909155505060408051878152602081018790529081018390526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600160a08201527f2e0d08763feb8b33376106fd02b993cd22509e7a3381381573d3c80818c275099060c00160405180910390a15b818311156108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f536c697070616765206c696d6974206578636565646564000000000000000000604482015260640161042a565b5095945050505050565b60035460009074010000000000000000000000000000000000000000900460ff1615610936576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b6000806109416111cf565b91509150600061095060015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff1663b97621d88484848961097e8c611454565b6040518663ffffffff1660e01b815260040161099e959493929190611c87565b602060405180830381865afa1580156109bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109df9190611be1565b9695505050505050565b6109f1611973565b6109fb60006119f4565b565b60035460009074010000000000000000000000000000000000000000900460ff1615610a85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610a906111cf565b600354919350915073ffffffffffffffffffffffffffffffffffffffff16631c510e4183838761046d8a611454565b60035460009074010000000000000000000000000000000000000000900460ff1615610b47576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610b526111cf565b915091506000610b6160015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff16634aa025c58484848961097e8c611454565b60035460009074010000000000000000000000000000000000000000900460ff1615610c17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b600080610c226111cf565b915091506000610c3160015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff16631e829cdc8484848961097e8c611454565b610c67611973565b6003546040805133815273ffffffffffffffffffffffffffffffffffffffff928316602082015291831682820152517f9adadd1ca2a8bbfabc8e8ec75578b750d87e49c03146662ba9a2b996af6380069181900360600190a1600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60003373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614610d4b57600080fd5b60005415610d5857600080fd5b6000610d6487876114c2565b90506001816002811115610d7a57610d7a611b55565b1415610dfe57610d8a86866109fd565b60408051898152602081018390529081018790526060810185905273ffffffffffffffffffffffffffffffffffffffff86166080820152600060a08201529092507f976ffbca84869d39bddd7057048dffc33e97641e3c7fe06fd7fc2b039c17b6e59060c0015b60405180910390a1610f53565b6000816002811115610e1257610e12611b55565b1415610ea357610e228786610b8f565b91508460016000828254610e369190611c29565b909155505060408051888152602081018490529081018690526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600060a08201527f884d9201fa8b7681d1481b193805aec6deb56538f54e2abef3286e2c5bf28ff39060c001610df1565b6002816002811115610eb757610eb7611b55565b14610ec457610ec4611c41565b610ece868661107a565b91508160016000828254610ee29190611c70565b909155505060408051878152602081018490529081018690526060810184905273ffffffffffffffffffffffffffffffffffffffff85166080820152600060a08201527f2e0d08763feb8b33376106fd02b993cd22509e7a3381381573d3c80818c275099060c00160405180910390a15b82156108a457818310156108a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f536c697070616765206c696d6974206578636565646564000000000000000000604482015260640161042a565b610fcb611973565b73ffffffffffffffffffffffffffffffffffffffff811661106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161042a565b611077816119f4565b50565b60035460009074010000000000000000000000000000000000000000900460ff1615611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f506f6f6c2069732066726f7a656e000000000000000000000000000000000000604482015260640161042a565b60008061110d6111cf565b91509150600061111c60015490565b60035490915073ffffffffffffffffffffffffffffffffffffffff1663fa274d8b8484848961097e8c611454565b611152611973565b6040513381527fb2568b4c84afb6a6a67d89e5c8af97aeeb6a26ead48d288bf5dc50298ea5652f9060200160405180910390a16003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b604080516002808252606082018352600092839283929091602083019080368337505060408051600280825260608201835293945060009390925090602083019080368337019050509050308260018151811061122e5761122e611ce0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152508260008151811061127a5761127a611ce0565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f0000000000000000000000000000000000000000000000000000000000000000816000815181106112e8576112e8611ce0565b6020026020010181815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061132857611328611ce0565b60209081029190910101526040517f4e1273f400000000000000000000000000000000000000000000000000000000815260009073ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690634e1273f4906113aa9086908690600401611d0f565b600060405180830381865afa1580156113c7573d6000803e3d6000fd5b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261140d9190810190611da0565b90508060008151811061142257611422611ce0565b60200260200101518160018151811061143d5761143d611ce0565b602002602001015180955081965050505050509091565b60007f000000000000000000000000000000000000000000000000000000000000000082141561148657506000919050565b7f000000000000000000000000000000000000000000000000000000000000000082146114b5576114b5611c41565b506001919050565b919050565b60007f00000000000000000000000000000000000000000000000000000000000000008314801561151257507f000000000000000000000000000000000000000000000000000000000000000082145b8061156657507f00000000000000000000000000000000000000000000000000000000000000008314801561156657507f000000000000000000000000000000000000000000000000000000000000000082145b15611573575060016116de565b7f00000000000000000000000000000000000000000000000000000000000000008314806115c057507f000000000000000000000000000000000000000000000000000000000000000083145b80156115eb57507f000000000000000000000000000000000000000000000000000000000000000082145b156115f8575060006116de565b7f00000000000000000000000000000000000000000000000000000000000000008314801561166f57507f000000000000000000000000000000000000000000000000000000000000000082148061166f57507f000000000000000000000000000000000000000000000000000000000000000082145b1561167c575060026116de565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c696420436f6d707574655479706500000000000000000000000000604482015260640161042a565b92915050565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461173e57600080fd5b600082600281111561175257611752611b55565b1461175c57600080fd5b64e8d4a5100084101561176e57600080fd5b60005461177d5761177d611c41565b6000806117886111cf565b91509150600260005414156117f657600154156117a7576117a7611c41565b811580156117b3575080155b6117bf576117bf611c41565b6117ea60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b60016000559250611969565b6001600054148015611806575081155b156118b85761183660027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b6001541461184657611846611c41565b6000811161185657611856611c41565b7f0000000000000000000000000000000000000000000000000000000000000000871461188257600080fd5b6118ad60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b600080559250611969565b60016000541480156118c8575080155b80156118ff57506118fa60027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b600154145b61190b5761190b611c41565b7f0000000000000000000000000000000000000000000000000000000000000000871461193757600080fd5b61196260027f0000000000000000000000000000000000000000000000000000000000000000611e7c565b6000805592505b5050949350505050565b60025473ffffffffffffffffffffffffffffffffffffffff1633146109fb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161042a565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008060408385031215611a7e57600080fd5b50508035926020909101359150565b600060208284031215611a9f57600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146114bd57600080fd5b600080600080600060a08688031215611ae257600080fd5b853594506020860135935060408601359250611b0060608701611aa6565b949793965091946080013592915050565b600060208284031215611b2357600080fd5b611b2c82611aa6565b9392505050565b600060208284031215611b4557600080fd5b81358015158114611b2c57600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60028110611bbb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9052565b8481526020810184905260408101839052608081016104cd6060830184611b84565b600060208284031215611bf357600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115611c3c57611c3c611bfa565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b600082821015611c8257611c82611bfa565b500390565b600060a0820190508682528560208301528460408301528360608301526109df6080830184611b84565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b604080825283519082018190526000906020906060840190828701845b82811015611d5e57815173ffffffffffffffffffffffffffffffffffffffff1684529284019290840190600101611d2c565b5050508381038285015284518082528583019183019060005b81811015611d9357835183529284019291840191600101611d77565b5090979650505050505050565b60006020808385031215611db357600080fd5b825167ffffffffffffffff80821115611dcb57600080fd5b818501915085601f830112611ddf57600080fd5b815181811115611df157611df1611cb1565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611e3457611e34611cb1565b604052918252848201925083810185019188831115611e5257600080fd5b938501935b82851015611e7057845184529385019392850192611e57565b98975050505050505050565b600082611eb2577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b50049056fea26469706673582212200e6a1ac9a980f562f22f20e71bdec13c575c61637877293449ad4680c4a65a4864736f6c634300080a00330d5800510d08ad952a6ce46bcfea8d8ca79fac4a0d7bba1a61c9466ec89111d494ba45375f692d30ba350c4ab1f8b86afb2eca05bb25e84db3dc2285ba154922000000000000000000000000c32eb36f886f638fffd836df44c124074cfe358400000000000000000000000000000000000000000000003635c9adc5dea00000

Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.