ETH Price: $1,986.15 (+0.68%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Push218944972025-02-21 11:44:5928 days ago1740138299IN
0x1E86CB08...BDba2aCEb
0 ETH0.000124361.14892412
Hook218944932025-02-21 11:44:1128 days ago1740138251IN
0x1E86CB08...BDba2aCEb
0 ETH0.000061551.24286927
Pick218944902025-02-21 11:43:3528 days ago1740138215IN
0x1E86CB08...BDba2aCEb
0 ETH0.000057551.16265672
Push218874742025-02-20 12:08:4729 days ago1740053327IN
0x1E86CB08...BDba2aCEb
0 ETH0.000143741.32790389
Hook218874702025-02-20 12:07:5929 days ago1740053279IN
0x1E86CB08...BDba2aCEb
0 ETH0.00006181.2479852
Pick218874672025-02-20 12:07:2329 days ago1740053243IN
0x1E86CB08...BDba2aCEb
0 ETH0.000063671.2863441
Push218802352025-02-19 11:52:4730 days ago1739965967IN
0x1E86CB08...BDba2aCEb
0 ETH0.000118931.30490383
Hook218802322025-02-19 11:52:1130 days ago1739965931IN
0x1E86CB08...BDba2aCEb
0 ETH0.000061331.23832812
Pick218802292025-02-19 11:51:3530 days ago1739965895IN
0x1E86CB08...BDba2aCEb
0 ETH0.000063651.28589476
Push218731812025-02-18 12:13:1131 days ago1739880791IN
0x1E86CB08...BDba2aCEb
0 ETH0.000114531.25665338
Hook218731762025-02-18 12:12:1131 days ago1739880731IN
0x1E86CB08...BDba2aCEb
0 ETH0.000065711.32681347
Pick218731732025-02-18 12:11:3531 days ago1739880695IN
0x1E86CB08...BDba2aCEb
0 ETH0.000065881.33085998
Push218446372025-02-14 12:15:1135 days ago1739535311IN
0x1E86CB08...BDba2aCEb
0 ETH0.000167551.547904
Hook218446342025-02-14 12:14:3535 days ago1739535275IN
0x1E86CB08...BDba2aCEb
0 ETH0.000075521.52501663
Pick218446312025-02-14 12:13:5935 days ago1739535239IN
0x1E86CB08...BDba2aCEb
0 ETH0.000075691.52915255
Push218372912025-02-13 11:33:3536 days ago1739446415IN
0x1E86CB08...BDba2aCEb
0 ETH0.000202381.86963618
Hook218372852025-02-13 11:32:2336 days ago1739446343IN
0x1E86CB08...BDba2aCEb
0 ETH0.000093971.89749478
Pick218372812025-02-13 11:31:3536 days ago1739446295IN
0x1E86CB08...BDba2aCEb
0 ETH0.000068021.37420061
Push218372552025-02-13 11:26:2336 days ago1739445983IN
0x1E86CB08...BDba2aCEb
0 ETH0.000142281.31449577
Hook218372512025-02-13 11:25:3536 days ago1739445935IN
0x1E86CB08...BDba2aCEb
0 ETH0.000065391.3204179
Pick218372472025-02-13 11:24:4736 days ago1739445887IN
0x1E86CB08...BDba2aCEb
0 ETH0.000063871.29022428
Push218174592025-02-10 16:57:4739 days ago1739206667IN
0x1E86CB08...BDba2aCEb
0 ETH0.000132581.45461444
Hook218174562025-02-10 16:57:1139 days ago1739206631IN
0x1E86CB08...BDba2aCEb
0 ETH0.000073691.48793099
Pick218174532025-02-10 16:56:3539 days ago1739206595IN
0x1E86CB08...BDba2aCEb
0 ETH0.00007231.46065307
Push218174402025-02-10 16:53:5939 days ago1739206439IN
0x1E86CB08...BDba2aCEb
0 ETH0.000187551.73269838
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RwaMultiSwapOutputConduit

Compiler Version
v0.6.12+commit.27d51765

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : RwaMultiSwapOutputConduit.sol
// SPDX-FileCopyrightText: © 2021 Lev Livnev <[email protected]>
// SPDX-FileCopyrightText: © 2022 Dai Foundation <www.daifoundation.org>
// SPDX-License-Identifier: AGPL-3.0-or-later
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.
pragma solidity 0.6.12;

import {DaiAbstract} from "dss-interfaces/dss/DaiAbstract.sol";
import {PsmAbstract} from "dss-interfaces/dss/PsmAbstract.sol";
import {GemAbstract} from "dss-interfaces/ERC/GemAbstract.sol";
import {GemJoinAbstract} from "dss-interfaces/dss/GemJoinAbstract.sol";

/**
 * @author Lev Livnev <[email protected]>
 * @author 0xDecr1pto <[email protected]>
 * @title An Output Conduit for real-world assets (RWA).
 * @dev This contract differs from the original [RwaSwapOutputConduit](https://github.com/makerdao/rwa-toolkit/blob/92c79aac24ef7645902ce4be57ba41b19e6c7dd5/src/conduits/RwaSwapOutputConduit.sol):
 * - This conduit can handle multiple PSM. (`pal` whitelist of PSM's)
 * - Using `clap/slap` for managing the PSM whitelist.
 * - Using `hook` method for choosing PSM address. (PSM address should be whitelisted)
 * - `push` and `push(amt)` swap DAI to GEM using selected (`hooked`) PSM address.
 * - It's not possible to make `pick` and `push` permissionless by `hope`ing and `mate`ing `address(0)`. We realized that output conduits should never be permissionless.
 */
contract RwaMultiSwapOutputConduit {
    /// @notice DAI token contract address.
    DaiAbstract public immutable dai;

    /// @notice Addresses with admin access on this contract. `wards[usr]`
    mapping(address => uint256) public wards;
    /// @dev Addresses with operator access on this contract. `can[usr]`
    mapping(address => uint256) public can;
    /// @notice Whitelist for addresses which can be picked. `bud[who]`
    mapping(address => uint256) public bud;
    /// @notice Addresses with push access on this contract. `may[usr]`
    mapping(address => uint256) public may;
    /// @notice PSM addresses whitelist. `pal[psm]`
    mapping(address => uint256) public pal;

    /// @notice PSM contract address.
    address public psm;
    /// @notice GEM Recipient address.
    address public to;
    /// @notice Destination address for DAI after calling `quit`.
    address public quitTo;

    /**
     * @notice `usr` was granted admin access.
     * @param usr The user address.
     */
    event Rely(address indexed usr);
    /**
     * @notice `usr` admin access was revoked.
     * @param usr The user address.
     */
    event Deny(address indexed usr);
    /**
     * @notice `usr` was granted operator access.
     * @param usr The user address.
     */
    event Hope(address indexed usr);
    /**
     * @notice `usr` operator access was revoked.
     * @param usr The user address.
     */
    event Nope(address indexed usr);
    /**
     * @notice `usr` was granted push access.
     * @param usr The user address.
     */
    event Mate(address indexed usr);
    /**
     * @notice `usr` push access was revoked.
     * @param usr The user address.
     */
    event Hate(address indexed usr);
    /**
     * @notice `who` address whitelisted for pick.
     * @param who The user address.
     */
    event Kiss(address indexed who);
    /**
     * @notice `who` address was removed from whitelist.
     * @param who The user address.
     */
    event Diss(address indexed who);
    /**
     * @notice `psm` address whitelisted for hook.
     * @param psm The PSM address.
     */
    event Clap(address indexed psm);
    /**
     * @notice `psm` address was removed from whitelist.
     * @param psm The user address.
     */
    event Slap(address indexed psm);
    /**
     * @notice `psm` address was choosen.
     * @param psm The PSM address.
     */
    event Hook(address indexed psm);
    /**
     * @notice `who` address was picked as the recipient.
     * @param who The user address.
     */
    event Pick(address indexed who);
    /**
     * @notice `amt` amount of GEM was pushed to the recipient `to` using `psm`.
     * @param psm PSM address used for swap.
     * @param gem GEM token address used.
     * @param to Destination address for GEM.
     * @param amt The amount of GEM.
     */
    event Push(address indexed psm, address indexed gem, address indexed to, uint256 amt);
    /**
     * @notice A contract parameter was updated.
     * @param what The changed parameter name. Currently the supported values are: "quitTo", "psm".
     * @param data The new value of the parameter.
     */
    event File(bytes32 indexed what, address data);
    /**
     * @notice The conduit outstanding DAI balance was flushed out to `quitTo` address.
     * @param quitTo The quitTo address.
     * @param wad The amount of DAI flushed out.
     */
    event Quit(address indexed quitTo, uint256 wad);
    /**
     * @notice `amt` outstanding `token` balance was flushed out to `usr`.
     * @param token The token address.
     * @param usr The destination address.
     * @param amt The amount of `token` flushed out.
     */
    event Yank(address indexed token, address indexed usr, uint256 amt);

    modifier auth() {
        require(wards[msg.sender] == 1, "RwaMultiSwapOutputConduit/not-authorized");
        _;
    }

    modifier onlyOperator() {
        require(can[msg.sender] == 1, "RwaMultiSwapOutputConduit/not-operator");
        _;
    }

    modifier onlyMate() {
        require(may[msg.sender] == 1, "RwaMultiSwapOutputConduit/not-mate");
        _;
    }

    /**
     * @notice Defines addresses and gives `msg.sender` admin access.
     * @param _dai DAI contract address.
     */
    constructor(address _dai) public {
        require(_dai != address(0), "RwaMultiSwapOutputConduit/wrong-dai-address");

        dai = DaiAbstract(_dai);

        wards[msg.sender] = 1;
        emit Rely(msg.sender);
    }

    /*//////////////////////////////////
               Authorization
    //////////////////////////////////*/

    /**
     * @notice Grants `usr` admin access to this contract.
     * @param usr The user address.
     */
    function rely(address usr) external auth {
        wards[usr] = 1;
        emit Rely(usr);
    }

    /**
     * @notice Revokes `usr` admin access from this contract.
     * @param usr The user address.
     */
    function deny(address usr) external auth {
        wards[usr] = 0;
        emit Deny(usr);
    }

    /**
     * @notice Grants `usr` operator access to this contract.
     * @param usr The user address.
     */
    function hope(address usr) external auth {
        can[usr] = 1;
        emit Hope(usr);
    }

    /**
     * @notice Revokes `usr` operator access from this contract.
     * @param usr The user address.
     */
    function nope(address usr) external auth {
        can[usr] = 0;
        emit Nope(usr);
    }

    /**
     * @notice Grants `usr` push access to this contract.
     * @param usr The user address.
     */
    function mate(address usr) external auth {
        may[usr] = 1;
        emit Mate(usr);
    }

    /**
     * @notice Revokes `usr` push access from this contract.
     * @param usr The user address.
     */
    function hate(address usr) external auth {
        may[usr] = 0;
        emit Hate(usr);
    }

    /**
     * @notice Whitelist `who` address for `pick`.
     * @param who The user address.
     */
    function kiss(address who) external auth {
        bud[who] = 1;
        emit Kiss(who);
    }

    /**
     * @notice Remove `who` address from `pick` whitelist.
     * @param who The user address.
     */
    function diss(address who) external auth {
        if (to == who) to = address(0);
        bud[who] = 0;
        emit Diss(who);
    }

    /**
     * @notice Whitelist `psm` address for `hook`.
     * @param _psm The PSM address.
     */
    function clap(address _psm) external auth {
        require(PsmAbstract(_psm).dai() == address(dai), "RwaMultiSwapOutputConduit/wrong-dai-for-psm");

        // Check if GEM `decimals` is not greater then DAI decimals.
        // We assume that DAI will always have 18 decimals
        require(
            GemAbstract(GemJoinAbstract(PsmAbstract(_psm).gemJoin()).gem()).decimals() <= 18,
            "RwaMultiSwapOutputConduit/unsupported-gem-decimals"
        );

        // Give unlimited approval to PSM
        dai.approve(_psm, type(uint256).max);

        pal[_psm] = 1;
        emit Clap(_psm);
    }

    /**
     * @notice Remove `psm` address from `hook` whitelist.
     * @param _psm The PSM address.
     */
    function slap(address _psm) external auth {
        dai.approve(address(_psm), 0);

        if (psm == _psm) psm = address(0);
        pal[_psm] = 0;
        emit Slap(_psm);
    }

    /*//////////////////////////////////
               Administration
    //////////////////////////////////*/

    /**
     * @notice Updates a contract parameter.
     * @param what The changed parameter name. `"quitTo"`.
     * @param data The new value of the parameter.
     */
    function file(bytes32 what, address data) external auth {
        if (what == "quitTo") {
            quitTo = data;
        } else {
            revert("RwaMultiSwapOutputConduit/unrecognised-param");
        }

        emit File(what, data);
    }

    /**
     * @notice Sets `who` address as the recipient.
     * @param who Recipient address.
     * @dev `who` address should have been whitelisted using `kiss`.
     */
    function pick(address who) external onlyOperator {
        require(bud[who] == 1 || who == address(0), "RwaMultiSwapOutputConduit/not-bud");
        to = who;
        emit Pick(who);
    }

    /**
     * @notice Sets `psm` address which will be used for swap DAI -> GEM.
     * @param _psm PSM address.
     * @dev `psm` address should have been whitelisted using `clap`.
     */
    function hook(address _psm) external onlyOperator {
        require(pal[_psm] == 1 || _psm == address(0), "RwaMultiSwapOutputConduit/not-pal");

        psm = _psm;

        emit Hook(_psm);
    }

    /*//////////////////////////////////
               Operations
    //////////////////////////////////*/

    /**
     * @notice Swaps the DAI balance of this contract into GEM through the PSM and push it into the recipient address.
     * @dev `msg.sender` must have received push access through `mate()`.
     */
    function push() external onlyMate {
        _doPush(dai.balanceOf(address(this)));
    }

    /**
     * @notice Swaps the specified amount of DAI into GEM through the PSM and push it to the recipient address.
     * @dev `msg.sender` must have received push access through `mate()`.
     * @param wad DAI amount.
     */
    function push(uint256 wad) external onlyMate {
        _doPush(wad);
    }

    /**
     * @notice Flushes out any DAI balance to `quitTo` address.
     * @dev `msg.sender` must have received push access through `mate()`.
     */
    function quit() external onlyMate {
        _doQuit(dai.balanceOf(address(this)));
    }

    /**
     * @notice Flushes out the specified amount of DAI to the `quitTo` address.
     * @dev `msg.sender` must have received push access through `mate()`.
     * @param wad DAI amount.
     */
    function quit(uint256 wad) external onlyMate {
        _doQuit(wad);
    }

    /**
     * @notice Flushes out `amt` of `token` sitting in this contract to `usr` address.
     * @dev Can only be called by the admin.
     * @param token Token address.
     * @param usr Destination address.
     * @param amt Token amount.
     */
    function yank(
        address token,
        address usr,
        uint256 amt
    ) external auth {
        GemAbstract(token).transfer(usr, amt);
        emit Yank(token, usr, amt);
    }

    /**
     * @notice Return Gem address of the selected PSM
     * @return gem Gem address.
     */
    function gem() external view returns (address) {
        return psm == address(0) ? address(0) : GemJoinAbstract(PsmAbstract(psm).gemJoin()).gem();
    }

    /**
     * @notice Calculates the amount of GEM received for swapping `wad` of DAI.
     * @param _psm The PSM instance.
     * @param wad DAI amount.
     * @return amt Expected GEM amount.
     */
    function expectedGemAmt(address _psm, uint256 wad) public view returns (uint256 amt) {
        uint256 decimals = GemAbstract(GemJoinAbstract(PsmAbstract(_psm).gemJoin()).gem()).decimals();
        // By using any PSM, we cannot guarantee its gem has 18 decimals or less, so we need SafeMath.
        uint256 to18ConversionFactor = 10**_sub(18, decimals);
        return _mul(wad, WAD) / _mul(_add(WAD, PsmAbstract(_psm).tout()), to18ConversionFactor);
    }

    /**
     * @notice Calculates the required amount of DAI to get `amt` amount of GEM.
     * @param _psm The PSM instance.
     * @param amt GEM amount.
     * @return wad Required DAI amount.
     */
    function requiredDaiWad(address _psm, uint256 amt) external view returns (uint256 wad) {
        uint256 decimals = GemAbstract(GemJoinAbstract(PsmAbstract(_psm).gemJoin()).gem()).decimals();
        // By using any PSM, we cannot guarantee its gem has 18 decimals or less, so we need SafeMath.
        uint256 to18ConversionFactor = 10**_sub(18, decimals);
        uint256 amt18 = _mul(amt, to18ConversionFactor);
        uint256 fee = _mul(amt18, PsmAbstract(_psm).tout()) / WAD;
        return _add(amt18, fee);
    }

    /**
     * @notice Swaps the specified amount of DAI into GEM through the PSM and push it to the recipient address.
     * @param wad DAI amount.
     */
    function _doPush(uint256 wad) internal {
        require(to != address(0), "RwaMultiSwapOutputConduit/to-not-picked");
        require(psm != address(0), "RwaMultiSwapOutputConduit/psm-not-hooked");

        // We might lose some dust here because of rounding errors. I.e.: USDC has 6 dec and DAI has 18.
        uint256 gemAmt = expectedGemAmt(psm, wad);
        require(gemAmt > 0, "RwaMultiSwapOutputConduit/insufficient-swap-gem-amount");

        address recipient = to;
        address _psm = psm;
        address _gem = GemJoinAbstract(PsmAbstract(psm).gemJoin()).gem();
        to = address(0);
        psm = address(0);

        PsmAbstract(_psm).buyGem(recipient, gemAmt);
        emit Push(_psm, _gem, recipient, gemAmt);
    }

    /**
     * @notice Flushes out the specified amount of DAI to `quitTo` address.
     * @param wad The DAI amount.
     */
    function _doQuit(uint256 wad) internal {
        require(quitTo != address(0), "RwaMultiSwapOutputConduit/invalid-quit-to-address");

        dai.transfer(quitTo, wad);
        emit Quit(quitTo, wad);
    }

    /*//////////////////////////////////
                    Math
    //////////////////////////////////*/

    uint256 internal constant WAD = 10**18;

    function _add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x, "Math/add-overflow");
    }

    function _sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x, "Math/sub-overflow");
    }

    function _mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x, "Math/mul-overflow");
    }
}

File 2 of 5 : DaiAbstract.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.5.12;

// https://github.com/makerdao/dss/blob/master/src/dai.sol
interface DaiAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function version() external view returns (string memory);
    function decimals() external view returns (uint8);
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function allowance(address, address) external view returns (uint256);
    function nonces(address) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
    function PERMIT_TYPEHASH() external view returns (bytes32);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
    function mint(address, uint256) external;
    function burn(address, uint256) external;
    function approve(address, uint256) external returns (bool);
    function push(address, uint256) external;
    function pull(address, uint256) external;
    function move(address, address, uint256) external;
    function permit(address, address, uint256, uint256, bool, uint8, bytes32, bytes32) external;
}

File 3 of 5 : PsmAbstract.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.5.12;

// https://github.com/makerdao/dss-psm/blob/master/src/psm.sol
interface PsmAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function vat() external view returns (address);
    function gemJoin() external view returns (address);
    function dai() external view returns (address);
    function daiJoin() external view returns (address);
    function ilk() external view returns (bytes32);
    function vow() external view returns (address);
    function tin() external view returns (uint256);
    function tout() external view returns (uint256);
    function file(bytes32 what, uint256 data) external;
    function hope(address) external;
    function nope(address) external;
    function sellGem(address usr, uint256 gemAmt) external;
    function buyGem(address usr, uint256 gemAmt) external;
}

File 4 of 5 : GemAbstract.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.5.12;

// A base ERC-20 abstract class
// https://eips.ethereum.org/EIPS/eip-20
interface GemAbstract {
    function totalSupply() external view returns (uint256);
    function balanceOf(address) external view returns (uint256);
    function allowance(address, address) external view returns (uint256);
    function approve(address, uint256) external returns (bool);
    function transfer(address, uint256) external returns (bool);
    function transferFrom(address, address, uint256) external returns (bool);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function decimals() external view returns (uint8);
}

File 5 of 5 : GemJoinAbstract.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity >=0.5.12;

// https://github.com/makerdao/dss/blob/master/src/join.sol
interface GemJoinAbstract {
    function wards(address) external view returns (uint256);
    function rely(address) external;
    function deny(address) external;
    function vat() external view returns (address);
    function ilk() external view returns (bytes32);
    function gem() external view returns (address);
    function dec() external view returns (uint256);
    function live() external view returns (uint256);
    function cage() external;
    function join(address, uint256) external;
    function exit(address, uint256) external;
}

Settings
{
  "remappings": [
    "clipper-mom/=lib/dss-exec-lib/lib/clipper-mom/src/",
    "ds-auth/=lib/ds-token/lib/ds-auth/src/",
    "ds-math/=lib/ds-math/src/",
    "ds-note/=lib/ds-value/lib/ds-thing/lib/ds-note/src/",
    "ds-pause/=lib/dss-gem-joins/lib/dss-deploy/lib/ds-pause/src/",
    "ds-proxy/=lib/dss-exec-lib/lib/ds-proxy/src/",
    "ds-stop/=lib/dss-exec-lib/lib/osm-mom/lib/osm/lib/ds-stop/src/",
    "ds-test/=lib/ds-test/src/",
    "ds-thing/=lib/ds-value/lib/ds-thing/src/",
    "ds-token/=lib/ds-token/src/",
    "ds-value/=lib/ds-value/src/",
    "dss-auto-line/=lib/dss-exec-lib/lib/dss-auto-line/src/",
    "dss-chain-log/=lib/mip21-toolkit/lib/dss-chain-log/src/",
    "dss-deploy/=lib/dss-gem-joins/lib/dss-deploy/src/",
    "dss-direct-deposit/=lib/dss-exec-lib/lib/dss-direct-deposit/src/",
    "dss-exec-lib/=lib/dss-exec-lib/src/",
    "dss-gem-joins/=lib/dss-gem-joins/src/",
    "dss-interfaces/=lib/dss-interfaces/src/",
    "dss-lerp/=lib/dss-exec-lib/lib/dss-lerp/src/",
    "dss-psm/=lib/mip21-toolkit/lib/dss-psm/src/",
    "dss/=lib/dss/src/",
    "esm/=lib/dss-gem-joins/lib/dss-deploy/lib/esm/src/",
    "flipper-mom/=lib/dss-exec-lib/lib/flipper-mom/src/",
    "forge-std/=lib/forge-std/src/",
    "forward-proxy/=lib/forward-proxy/src/",
    "ilk-registry/=lib/mip21-toolkit/lib/ilk-registry/src/",
    "median/=lib/dss-exec-lib/lib/median/src/",
    "mip21-toolkit/=lib/mip21-toolkit/src/",
    "mkr-authority/=lib/dss-exec-lib/lib/mkr-authority/src/",
    "osm-mom/=lib/dss-exec-lib/lib/osm-mom/src/",
    "osm/=lib/dss-exec-lib/lib/osm-mom/lib/osm/src/",
    "univ2-lp-oracle/=lib/dss-exec-lib/lib/univ2-lp-oracle/src/"
  ],
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "istanbul",
  "libraries": {
    "src/shared/ChecksummedAddress.sol": {
      "ChecksummedAddress": "0xf2a8cd9d87fa6cc5ce564137fb134a342ce671ab"
    },
    "src/shared/SolidityTypeConversions.sol": {
      "SolidityTypeConversions": "0x0b4dd91c5eacbfe63f73e092f76744701c2508b5"
    },
    "src/shared/Strings.sol": {
      "Strings": "0xd19e0062093449614e21ef44cb50301aba2d5839"
    }
  }
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_dai","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"psm","type":"address"}],"name":"Clap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Deny","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Diss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"what","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"File","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Hate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"psm","type":"address"}],"name":"Hook","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Hope","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Kiss","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Mate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Nope","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"who","type":"address"}],"name":"Pick","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"psm","type":"address"},{"indexed":true,"internalType":"address","name":"gem","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Push","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"quitTo","type":"address"},{"indexed":false,"internalType":"uint256","name":"wad","type":"uint256"}],"name":"Quit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"usr","type":"address"}],"name":"Rely","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"psm","type":"address"}],"name":"Slap","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"usr","type":"address"},{"indexed":false,"internalType":"uint256","name":"amt","type":"uint256"}],"name":"Yank","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"bud","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"can","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_psm","type":"address"}],"name":"clap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dai","outputs":[{"internalType":"contract DaiAbstract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"deny","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"diss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_psm","type":"address"},{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"expectedGemAmt","outputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"what","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"file","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"gem","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"hate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_psm","type":"address"}],"name":"hook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"hope","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"kiss","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"mate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"may","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"nope","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"who","type":"address"}],"name":"pick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"psm","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"push","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"push","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"name":"quit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quitTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"usr","type":"address"}],"name":"rely","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_psm","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"requiredDaiWad","outputs":[{"internalType":"uint256","name":"wad","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_psm","type":"address"}],"name":"slap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"to","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"wards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"usr","type":"address"},{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"yank","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040523480156200001157600080fd5b5060405162003a2738038062003a27833981810160405260208110156200003757600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620000d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b815260200180620039fc602b913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a25060805160601c613831620001cb6000398061155c52806122bb52806127885280612a895280612c015280612cc05280612fcc52506138316000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80639c52a7f111610104578063d6631594116100a2578063f29c29c411610071578063f29c29c4146108f5578063f41a6f4414610939578063f4b9fa751461097d578063fc2b8cc3146109b1576101da565b8063d6631594146107cb578063daddce52146107ff578063dbde38d21461086d578063dc4d20fa146108b1576101da565b8063a81de4f8116100de578063a81de4f814610689578063bc206b0a146106cd578063bf353dbb14610725578063d4e8be831461077d576101da565b80639c52a7f1146105bd578063a0eba25914610601578063a3b22fc414610645576101da565b80634fce7a2a1161017c5780637bd2bea71161014b5780637bd2bea7146104ef5780638035f0ce14610523578063888e717f1461052d578063959ac4841461058f576101da565b80634fce7a2a146103cb57806359ac371b1461042357806365c4ce7a1461046757806365fae35e146104ab576101da565b806322b366fd116101b857806322b366fd1461028b578063298a2e45146102ed578063344cbc6814610345578063453638ce14610373576101da565b806304bda262146101df57806313151981146102135780632250b56a14610247575b600080fd5b6101e76109bb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021b6109e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102896004803603602081101561025d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a07565b005b6102d7600480360360408110156102a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bf4565b6040518082815260200191505060405180910390f35b61032f6004803603602081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4e565b6040518082815260200191505060405180910390f35b6103716004803603602081101561035b57600080fd5b8101908080359060200190929190505050610e66565b005b6103b56004803603602081101561038957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f0a565b6040518082815260200191505060405180910390f35b61040d600480360360208110156103e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f22565b6040518082815260200191505060405180910390f35b6104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f3a565b005b6104a96004803603602081101561047d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105c565b005b6104ed600480360360208110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611217565b005b6104f7611338565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61052b6114bf565b005b6105796004803603604081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611623565b6040518082815260200191505060405180910390f35b6105bb600480360360208110156105a557600080fd5b8101908080359060200190929190505050611881565b005b6105ff600480360360208110156105d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611925565b005b6106436004803603602081101561061757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a46565b005b6106876004803603602081101561065b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c33565b005b6106cb6004803603602081101561069f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d54565b005b61070f600480360360208110156106e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e76565b6040518082815260200191505060405180910390f35b6107676004803603602081101561073b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e8e565b6040518082815260200191505060405180910390f35b6107c96004803603604081101561079357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b005b6107d361204e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086b6004803603606081101561081557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612074565b005b6108af6004803603602081101561088357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612222565b005b6108f3600480360360208110156108c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ab565b005b6109376004803603602081101561090b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125cd565b005b61097b6004803603602081101561094f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ef565b005b610985612bff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109b9612c23565b005b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061377e6026913960400191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610b185750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061375d6021913960400191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ff1254cfe8cda2983bd67bed9a74899622072c7629fb1aa4fa6cd04749a79663b60405160405180910390a250565b6000808373ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3d57600080fd5b505afa158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbd57600080fd5b505afa158015610cd1573d6000803e3d6000fd5b505050506040513d6020811015610ce757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3d57600080fd5b505afa158015610d51573d6000803e3d6000fd5b505050506040513d6020811015610d6757600080fd5b810190808051906020019092919050505060ff1690506000610d8a601283612d87565b600a0a9050610e2a610e24670de0b6b3a76400008773ffffffffffffffffffffffffffffffffffffffff1663fae036d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610de457600080fd5b505afa158015610df8573d6000803e3d6000fd5b505050506040513d6020811015610e0e57600080fd5b8101908080519060200190929190505050612e0a565b82612e8d565b610e3c85670de0b6b3a7640000612e8d565b81610e4357fe5b049250505092915050565b60046020528060005260406000206000915090505481565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610efe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b610f0781612f22565b50565b60036020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610fd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f04942e12b9e2310f85c952df158815306377bb9f797dc3677d03be357427c53b60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561118c576000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b757600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561147757600080fd5b505afa15801561148b573d6000803e3d6000fd5b505050506040513d60208110156114a157600080fd5b81019080805190602001909291905050506114ba565b60005b905090565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b6116217f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115e157600080fd5b505afa1580156115f5573d6000803e3d6000fd5b505050506040513d602081101561160b57600080fd5b810190808051906020019092919050505061312c565b565b6000808373ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561166c57600080fd5b505afa158015611680573d6000803e3d6000fd5b505050506040513d602081101561169657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d602081101561171657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561176c57600080fd5b505afa158015611780573d6000803e3d6000fd5b505050506040513d602081101561179657600080fd5b810190808051906020019092919050505060ff16905060006117b9601283612d87565b600a0a905060006117ca8583612e8d565b90506000670de0b6b3a7640000611861838973ffffffffffffffffffffffffffffffffffffffff1663fae036d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561182157600080fd5b505afa158015611835573d6000803e3d6000fd5b505050506040513d602081101561184b57600080fd5b8101908080519060200190929190505050612e8d565b8161186857fe5b0490506118758282612e0a565b94505050505092915050565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b6119228161312c565b50565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061377e6026913960400191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480611b575750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611bac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061360b6021913960400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fd867ca092b2baf182819d4b4f6bcb8081f4d47861bc99983f2e701f36a1ba46860405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611cca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f3a21b662999d3fc0ceca48751a22bf61a806dcf3631e136271f02f7cb981fd4360405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611deb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fe25de3b40ce055247fe4ef6c00f96c8c3b6530536701ba1c48296b30b4bb0d9560405160405180910390a250565b60016020528060005260406000206000915090505481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611f3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f71756974546f0000000000000000000000000000000000000000000000000000821415611fab5780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ffc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061370a602c913960400191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461210b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561217c57600080fd5b505af1158015612190573d6000803e3d6000fd5b505050506040513d60208110156121a657600080fd5b8101908080519060200190929190505050508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f3336d8973868f7727fbbf287f4fd9fb0237fe2696b301f8a46c563cb46d7b419836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b38260006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561234b57600080fd5b505af115801561235f573d6000803e3d6000fd5b505050506040513d602081101561237557600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612420576000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f213a712c65163d1d2c5f29a94038457aef2fd8ba97cb65275a89f4649156dc2c60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f9cd85b2ca76a06c46be663a514e012af1aea8954b0e53f42146cd9b1ebb21ebc60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612664576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb24460405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612786576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b15801561280357600080fd5b505afa158015612817573d6000803e3d6000fd5b505050506040513d602081101561282d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146128aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061365d602b913960400191505060405180910390fd5b60128173ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f257600080fd5b505afa158015612906573d6000803e3d6000fd5b505050506040513d602081101561291c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561297257600080fd5b505afa158015612986573d6000803e3d6000fd5b505050506040513d602081101561299c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f257600080fd5b505afa158015612a06573d6000803e3d6000fd5b505050506040513d6020811015612a1c57600080fd5b810190808051906020019092919050505060ff161115612a87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806136b06032913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3857600080fd5b505af1158015612b4c573d6000803e3d6000fd5b505050506040513d6020811015612b6257600080fd5b8101908080519060200190929190505050506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f650d7c8fc53fb0e39ab40467fee29e40e2036cfe4864f3101844a85dc553d10660405160405180910390a250565b7f000000000000000000000000000000000000000000000000000000000000000081565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612cbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b612d857f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d6020811015612d6f57600080fd5b8101908080519060200190929190505050612f22565b565b6000828284039150811115612e04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f7375622d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b6000828284019150811015612e87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f6164642d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b600080821480612eaa5750828283850292508281612ea757fe5b04145b612f1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f6d756c2d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061362c6031913960400191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561307d57600080fd5b505af1158015613091573d6000803e3d6000fd5b505050506040513d60208110156130a757600080fd5b810190808051906020019092919050505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fc81bfec1ac9d038698c3b15fc900dafbff3af4b9f26062f895dd08a676ec78ae826040518082815260200191505060405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806137366027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561327c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136886028913960400191505060405180910390fd5b60006132aa600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610bf4565b905060008111613305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806137a46036913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156133bd57600080fd5b505afa1580156133d1573d6000803e3d6000fd5b505050506040513d60208110156133e757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b810190808051906020019092919050505090506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16638d7ef9bb84866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561356f57600080fd5b505af1158015613583573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fa1d78ba217ab765a0cd05f65bd1369e128821cc891563c9c9721078ed865c5c6876040518082815260200191505060405180910390a4505050505056fe5277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6275645277614d756c7469537761704f7574707574436f6e647569742f696e76616c69642d717569742d746f2d616464726573735277614d756c7469537761704f7574707574436f6e647569742f77726f6e672d6461692d666f722d70736d5277614d756c7469537761704f7574707574436f6e647569742f70736d2d6e6f742d686f6f6b65645277614d756c7469537761704f7574707574436f6e647569742f756e737570706f727465642d67656d2d646563696d616c735277614d756c7469537761704f7574707574436f6e647569742f6e6f742d617574686f72697a65645277614d756c7469537761704f7574707574436f6e647569742f756e7265636f676e697365642d706172616d5277614d756c7469537761704f7574707574436f6e647569742f746f2d6e6f742d7069636b65645277614d756c7469537761704f7574707574436f6e647569742f6e6f742d70616c5277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6f70657261746f725277614d756c7469537761704f7574707574436f6e647569742f696e73756666696369656e742d737761702d67656d2d616d6f756e745277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6d617465a26469706673582212204db3d3aa7ed716d82a769e1b27d3acb0d3e564eed01e6ea2533e609bed272edd64736f6c634300060c00335277614d756c7469537761704f7574707574436f6e647569742f77726f6e672d6461692d616464726573730000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80639c52a7f111610104578063d6631594116100a2578063f29c29c411610071578063f29c29c4146108f5578063f41a6f4414610939578063f4b9fa751461097d578063fc2b8cc3146109b1576101da565b8063d6631594146107cb578063daddce52146107ff578063dbde38d21461086d578063dc4d20fa146108b1576101da565b8063a81de4f8116100de578063a81de4f814610689578063bc206b0a146106cd578063bf353dbb14610725578063d4e8be831461077d576101da565b80639c52a7f1146105bd578063a0eba25914610601578063a3b22fc414610645576101da565b80634fce7a2a1161017c5780637bd2bea71161014b5780637bd2bea7146104ef5780638035f0ce14610523578063888e717f1461052d578063959ac4841461058f576101da565b80634fce7a2a146103cb57806359ac371b1461042357806365c4ce7a1461046757806365fae35e146104ab576101da565b806322b366fd116101b857806322b366fd1461028b578063298a2e45146102ed578063344cbc6814610345578063453638ce14610373576101da565b806304bda262146101df57806313151981146102135780632250b56a14610247575b600080fd5b6101e76109bb565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61021b6109e1565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102896004803603602081101561025d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a07565b005b6102d7600480360360408110156102a157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610bf4565b6040518082815260200191505060405180910390f35b61032f6004803603602081101561030357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e4e565b6040518082815260200191505060405180910390f35b6103716004803603602081101561035b57600080fd5b8101908080359060200190929190505050610e66565b005b6103b56004803603602081101561038957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f0a565b6040518082815260200191505060405180910390f35b61040d600480360360208110156103e157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f22565b6040518082815260200191505060405180910390f35b6104656004803603602081101561043957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f3a565b005b6104a96004803603602081101561047d57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061105c565b005b6104ed600480360360208110156104c157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611217565b005b6104f7611338565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61052b6114bf565b005b6105796004803603604081101561054357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611623565b6040518082815260200191505060405180910390f35b6105bb600480360360208110156105a557600080fd5b8101908080359060200190929190505050611881565b005b6105ff600480360360208110156105d357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611925565b005b6106436004803603602081101561061757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611a46565b005b6106876004803603602081101561065b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c33565b005b6106cb6004803603602081101561069f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611d54565b005b61070f600480360360208110156106e357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e76565b6040518082815260200191505060405180910390f35b6107676004803603602081101561073b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611e8e565b6040518082815260200191505060405180910390f35b6107c96004803603604081101561079357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611ea6565b005b6107d361204e565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61086b6004803603606081101561081557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612074565b005b6108af6004803603602081101561088357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612222565b005b6108f3600480360360208110156108c757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506124ab565b005b6109376004803603602081101561090b57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506125cd565b005b61097b6004803603602081101561094f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506126ef565b005b610985612bff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6109b9612c23565b005b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061377e6026913960400191505060405180910390fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480610b185750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610b6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061375d6021913960400191505060405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167ff1254cfe8cda2983bd67bed9a74899622072c7629fb1aa4fa6cd04749a79663b60405160405180910390a250565b6000808373ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b158015610c3d57600080fd5b505afa158015610c51573d6000803e3d6000fd5b505050506040513d6020811015610c6757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b158015610cbd57600080fd5b505afa158015610cd1573d6000803e3d6000fd5b505050506040513d6020811015610ce757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b158015610d3d57600080fd5b505afa158015610d51573d6000803e3d6000fd5b505050506040513d6020811015610d6757600080fd5b810190808051906020019092919050505060ff1690506000610d8a601283612d87565b600a0a9050610e2a610e24670de0b6b3a76400008773ffffffffffffffffffffffffffffffffffffffff1663fae036d56040518163ffffffff1660e01b815260040160206040518083038186803b158015610de457600080fd5b505afa158015610df8573d6000803e3d6000fd5b505050506040513d6020811015610e0e57600080fd5b8101908080519060200190929190505050612e0a565b82612e8d565b610e3c85670de0b6b3a7640000612e8d565b81610e4357fe5b049250505092915050565b60046020528060005260406000206000915090505481565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610efe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b610f0781612f22565b50565b60036020528060005260406000206000915090505481565b60026020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610fd1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f04942e12b9e2310f85c952df158815306377bb9f797dc3677d03be357427c53b60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561118c576000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f12fdafd291eb287a54e3416070923d22aa5072f5ee04c4fb8361615e7508a37c60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146114b757600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156113f757600080fd5b505afa15801561140b573d6000803e3d6000fd5b505050506040513d602081101561142157600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561147757600080fd5b505afa15801561148b573d6000803e3d6000fd5b505050506040513d60208110156114a157600080fd5b81019080805190602001909291905050506114ba565b60005b905090565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611557576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b6116217f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b1580156115e157600080fd5b505afa1580156115f5573d6000803e3d6000fd5b505050506040513d602081101561160b57600080fd5b810190808051906020019092919050505061312c565b565b6000808373ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b15801561166c57600080fd5b505afa158015611680573d6000803e3d6000fd5b505050506040513d602081101561169657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b1580156116ec57600080fd5b505afa158015611700573d6000803e3d6000fd5b505050506040513d602081101561171657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561176c57600080fd5b505afa158015611780573d6000803e3d6000fd5b505050506040513d602081101561179657600080fd5b810190808051906020019092919050505060ff16905060006117b9601283612d87565b600a0a905060006117ca8583612e8d565b90506000670de0b6b3a7640000611861838973ffffffffffffffffffffffffffffffffffffffff1663fae036d56040518163ffffffff1660e01b815260040160206040518083038186803b15801561182157600080fd5b505afa158015611835573d6000803e3d6000fd5b505050506040513d602081101561184b57600080fd5b8101908080519060200190929190505050612e8d565b8161186857fe5b0490506118758282612e0a565b94505050505092915050565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611919576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b6119228161312c565b50565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602681526020018061377e6026913960400191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541480611b575750600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b611bac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602181526020018061360b6021913960400191505060405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff167fd867ca092b2baf182819d4b4f6bcb8081f4d47861bc99983f2e701f36a1ba46860405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611cca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f3a21b662999d3fc0ceca48751a22bf61a806dcf3631e136271f02f7cb981fd4360405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611deb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fe25de3b40ce055247fe4ef6c00f96c8c3b6530536701ba1c48296b30b4bb0d9560405160405180910390a250565b60016020528060005260406000206000915090505481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414611f3d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f71756974546f0000000000000000000000000000000000000000000000000000821415611fab5780600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611ffc565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c81526020018061370a602c913960400191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461210b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561217c57600080fd5b505af1158015612190573d6000803e3d6000fd5b505050506040513d60208110156121a657600080fd5b8101908080519060200190929190505050508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f3336d8973868f7727fbbf287f4fd9fb0237fe2696b301f8a46c563cb46d7b419836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146122b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b38260006040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561234b57600080fd5b505af115801561235f573d6000803e3d6000fd5b505050506040513d602081101561237557600080fd5b8101908080519060200190929190505050508073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612420576000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f213a712c65163d1d2c5f29a94038457aef2fd8ba97cb65275a89f4649156dc2c60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612542576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f9cd85b2ca76a06c46be663a514e012af1aea8954b0e53f42146cd9b1ebb21ebc60405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612664576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b6001600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f6ffc0fabf0709270e42087e84a3bfc36041d3b281266d04ae1962185092fb24460405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612786576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136e26028913960400191505060405180910390fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663f4b9fa756040518163ffffffff1660e01b815260040160206040518083038186803b15801561280357600080fd5b505afa158015612817573d6000803e3d6000fd5b505050506040513d602081101561282d57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16146128aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b81526020018061365d602b913960400191505060405180910390fd5b60128173ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156128f257600080fd5b505afa158015612906573d6000803e3d6000fd5b505050506040513d602081101561291c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561297257600080fd5b505afa158015612986573d6000803e3d6000fd5b505050506040513d602081101561299c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156129f257600080fd5b505afa158015612a06573d6000803e3d6000fd5b505050506040513d6020811015612a1c57600080fd5b810190808051906020019092919050505060ff161115612a87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260328152602001806136b06032913960400191505060405180910390fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015612b3857600080fd5b505af1158015612b4c573d6000803e3d6000fd5b505050506040513d6020811015612b6257600080fd5b8101908080519060200190929190505050506001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f650d7c8fc53fb0e39ab40467fee29e40e2036cfe4864f3101844a85dc553d10660405160405180910390a250565b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f81565b6001600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414612cbb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806137da6022913960400191505060405180910390fd5b612d857f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015612d4557600080fd5b505afa158015612d59573d6000803e3d6000fd5b505050506040513d6020811015612d6f57600080fd5b8101908080519060200190929190505050612f22565b565b6000828284039150811115612e04576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f7375622d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b6000828284019150811015612e87576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f6164642d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b600080821480612eaa5750828283850292508281612ea757fe5b04145b612f1c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260118152602001807f4d6174682f6d756c2d6f766572666c6f7700000000000000000000000000000081525060200191505060405180910390fd5b92915050565b600073ffffffffffffffffffffffffffffffffffffffff16600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612fca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603181526020018061362c6031913960400191505060405180910390fd5b7f0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561307d57600080fd5b505af1158015613091573d6000803e3d6000fd5b505050506040513d60208110156130a757600080fd5b810190808051906020019092919050505050600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fc81bfec1ac9d038698c3b15fc900dafbff3af4b9f26062f895dd08a676ec78ae826040518082815260200191505060405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff16600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156131d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806137366027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561327c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806136886028913960400191505060405180910390fd5b60006132aa600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1683610bf4565b905060008111613305576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806137a46036913960400191505060405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506000600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166301664f666040518163ffffffff1660e01b815260040160206040518083038186803b1580156133bd57600080fd5b505afa1580156133d1573d6000803e3d6000fd5b505050506040513d60208110156133e757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16637bd2bea76040518163ffffffff1660e01b815260040160206040518083038186803b15801561343d57600080fd5b505afa158015613451573d6000803e3d6000fd5b505050506040513d602081101561346757600080fd5b810190808051906020019092919050505090506000600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff16638d7ef9bb84866040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050600060405180830381600087803b15801561356f57600080fd5b505af1158015613583573d6000803e3d6000fd5b505050508273ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fa1d78ba217ab765a0cd05f65bd1369e128821cc891563c9c9721078ed865c5c6876040518082815260200191505060405180910390a4505050505056fe5277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6275645277614d756c7469537761704f7574707574436f6e647569742f696e76616c69642d717569742d746f2d616464726573735277614d756c7469537761704f7574707574436f6e647569742f77726f6e672d6461692d666f722d70736d5277614d756c7469537761704f7574707574436f6e647569742f70736d2d6e6f742d686f6f6b65645277614d756c7469537761704f7574707574436f6e647569742f756e737570706f727465642d67656d2d646563696d616c735277614d756c7469537761704f7574707574436f6e647569742f6e6f742d617574686f72697a65645277614d756c7469537761704f7574707574436f6e647569742f756e7265636f676e697365642d706172616d5277614d756c7469537761704f7574707574436f6e647569742f746f2d6e6f742d7069636b65645277614d756c7469537761704f7574707574436f6e647569742f6e6f742d70616c5277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6f70657261746f725277614d756c7469537761704f7574707574436f6e647569742f696e73756666696369656e742d737761702d67656d2d616d6f756e745277614d756c7469537761704f7574707574436f6e647569742f6e6f742d6d617465a26469706673582212204db3d3aa7ed716d82a769e1b27d3acb0d3e564eed01e6ea2533e609bed272edd64736f6c634300060c0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f

-----Decoded View---------------
Arg [0] : _dai (address): 0x6B175474E89094C44Da98b954EedeAC495271d0F

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006b175474e89094c44da98b954eedeac495271d0f


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.