false
true
0

Contract Address Details

0x135954d155898D42C90D2a57824C690e0c7BEf1B

Contract Name
Dog
Creator
0x3f6295–0a3306 at 0x7c5354–f2fd2e
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
1,139 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
27553764
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
Dog




Optimization enabled
false
Compiler version
v0.6.12+commit.27d51765




EVM Version
default




Verified at
2024-12-08T04:01:34.514545Z

Constructor Arguments

0x00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b

Arg [0] (address) : 0x35d1b3f3d7966a1dfe207aa4514c12a259a0492b

              

Contract source code

/**
 *Submitted for verification at Etherscan.io on 2021-04-16
*/

// SPDX-License-Identifier: AGPL-3.0-or-later

/// dog.sol -- Dai liquidation module 2.0

// Copyright (C) 2020 Maker Ecosystem Growth Holdings, INC.
//
// 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;

interface ClipperLike {
    function ilk() external view returns (bytes32);
    function kick(
        uint256 tab,
        uint256 lot,
        address usr,
        address kpr
    ) external returns (uint256);
}

interface VatLike {
    function ilks(bytes32) external view returns (
        uint256 Art,  // [wad]
        uint256 rate, // [ray]
        uint256 spot, // [ray]
        uint256 line, // [rad]
        uint256 dust  // [rad]
    );
    function urns(bytes32,address) external view returns (
        uint256 ink,  // [wad]
        uint256 art   // [wad]
    );
    function grab(bytes32,address,address,address,int256,int256) external;
    function hope(address) external;
    function nope(address) external;
}

interface VowLike {
    function fess(uint256) external;
}

contract Dog {
    // --- Auth ---
    mapping (address => uint256) public wards;
    function rely(address usr) external auth { wards[usr] = 1; emit Rely(usr); }
    function deny(address usr) external auth { wards[usr] = 0; emit Deny(usr); }
    modifier auth {
        require(wards[msg.sender] == 1, "Dog/not-authorized");
        _;
    }

    // --- Data ---
    struct Ilk {
        address clip;  // Liquidator
        uint256 chop;  // Liquidation Penalty                                          [wad]
        uint256 hole;  // Max DAI needed to cover debt+fees of active auctions per ilk [rad]
        uint256 dirt;  // Amt DAI needed to cover debt+fees of active auctions per ilk [rad]
    }

    VatLike immutable public vat;  // CDP Engine

    mapping (bytes32 => Ilk) public ilks;

    VowLike public vow;   // Debt Engine
    uint256 public live;  // Active Flag
    uint256 public Hole;  // Max DAI needed to cover debt+fees of active auctions [rad]
    uint256 public Dirt;  // Amt DAI needed to cover debt+fees of active auctions [rad]

    // --- Events ---
    event Rely(address indexed usr);
    event Deny(address indexed usr);

    event File(bytes32 indexed what, uint256 data);
    event File(bytes32 indexed what, address data);
    event File(bytes32 indexed ilk, bytes32 indexed what, uint256 data);
    event File(bytes32 indexed ilk, bytes32 indexed what, address clip);

    event Bark(
      bytes32 indexed ilk,
      address indexed urn,
      uint256 ink,
      uint256 art,
      uint256 due,
      address clip,
      uint256 indexed id
    );
    event Digs(bytes32 indexed ilk, uint256 rad);
    event Cage();

    // --- Init ---
    constructor(address vat_) public {
        vat = VatLike(vat_);
        live = 1;
        wards[msg.sender] = 1;
        emit Rely(msg.sender);
    }

    // --- Math ---
    uint256 constant WAD = 10 ** 18;

    function min(uint256 x, uint256 y) internal pure returns (uint256 z) {
        z = x <= y ? x : y;
    }
    function add(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x + y) >= x);
    }
    function sub(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require((z = x - y) <= x);
    }
    function mul(uint256 x, uint256 y) internal pure returns (uint256 z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    // --- Administration ---
    function file(bytes32 what, address data) external auth {
        if (what == "vow") vow = VowLike(data);
        else revert("Dog/file-unrecognized-param");
        emit File(what, data);
    }
    function file(bytes32 what, uint256 data) external auth {
        if (what == "Hole") Hole = data;
        else revert("Dog/file-unrecognized-param");
        emit File(what, data);
    }
    function file(bytes32 ilk, bytes32 what, uint256 data) external auth {
        if (what == "chop") {
            require(data >= WAD, "Dog/file-chop-lt-WAD");
            ilks[ilk].chop = data;
        } else if (what == "hole") ilks[ilk].hole = data;
        else revert("Dog/file-unrecognized-param");
        emit File(ilk, what, data);
    }
    function file(bytes32 ilk, bytes32 what, address clip) external auth {
        if (what == "clip") {
            require(ilk == ClipperLike(clip).ilk(), "Dog/file-ilk-neq-clip.ilk");
            ilks[ilk].clip = clip;
        } else revert("Dog/file-unrecognized-param");
        emit File(ilk, what, clip);
    }

    function chop(bytes32 ilk) external view returns (uint256) {
        return ilks[ilk].chop;
    }

    // --- CDP Liquidation: all bark and no bite ---
    //
    // Liquidate a Vault and start a Dutch auction to sell its collateral for DAI.
    //
    // The third argument is the address that will receive the liquidation reward, if any.
    //
    // The entire Vault will be liquidated except when the target amount of DAI to be raised in
    // the resulting auction (debt of Vault + liquidation penalty) causes either Dirt to exceed
    // Hole or ilk.dirt to exceed ilk.hole by an economically significant amount. In that
    // case, a partial liquidation is performed to respect the global and per-ilk limits on
    // outstanding DAI target. The one exception is if the resulting auction would likely
    // have too little collateral to be interesting to Keepers (debt taken from Vault < ilk.dust),
    // in which case the function reverts. Please refer to the code and comments within if
    // more detail is desired.
    function bark(bytes32 ilk, address urn, address kpr) external returns (uint256 id) {
        require(live == 1, "Dog/not-live");

        (uint256 ink, uint256 art) = vat.urns(ilk, urn);
        Ilk memory milk = ilks[ilk];
        uint256 dart;
        uint256 rate;
        uint256 dust;
        {
            uint256 spot;
            (,rate, spot,, dust) = vat.ilks(ilk);
            require(spot > 0 && mul(ink, spot) < mul(art, rate), "Dog/not-unsafe");

            // Get the minimum value between:
            // 1) Remaining space in the general Hole
            // 2) Remaining space in the collateral hole
            require(Hole > Dirt && milk.hole > milk.dirt, "Dog/liquidation-limit-hit");
            uint256 room = min(Hole - Dirt, milk.hole - milk.dirt);

            // uint256.max()/(RAD*WAD) = 115,792,089,237,316
            dart = min(art, mul(room, WAD) / rate / milk.chop);

            // Partial liquidation edge case logic
            if (art > dart) {
                if (mul(art - dart, rate) < dust) {

                    // If the leftover Vault would be dusty, just liquidate it entirely.
                    // This will result in at least one of dirt_i > hole_i or Dirt > Hole becoming true.
                    // The amount of excess will be bounded above by ceiling(dust_i * chop_i / WAD).
                    // This deviation is assumed to be small compared to both hole_i and Hole, so that
                    // the extra amount of target DAI over the limits intended is not of economic concern.
                    dart = art;
                } else {

                    // In a partial liquidation, the resulting auction should also be non-dusty.
                    require(mul(dart, rate) >= dust, "Dog/dusty-auction-from-partial-liquidation");
                }
            }
        }

        uint256 dink = mul(ink, dart) / art;

        require(dink > 0, "Dog/null-auction");
        require(dart <= 2**255 && dink <= 2**255, "Dog/overflow");

        vat.grab(
            ilk, urn, milk.clip, address(vow), -int256(dink), -int256(dart)
        );

        uint256 due = mul(dart, rate);
        vow.fess(due);

        {   // Avoid stack too deep
            // This calcuation will overflow if dart*rate exceeds ~10^14
            uint256 tab = mul(due, milk.chop) / WAD;
            Dirt = add(Dirt, tab);
            ilks[ilk].dirt = add(milk.dirt, tab);

            id = ClipperLike(milk.clip).kick({
                tab: tab,
                lot: dink,
                usr: urn,
                kpr: kpr
            });
        }

        emit Bark(ilk, urn, dink, dart, due, milk.clip, id);
    }

    function digs(bytes32 ilk, uint256 rad) external auth {
        Dirt = sub(Dirt, rad);
        ilks[ilk].dirt = sub(ilks[ilk].dirt, rad);
        emit Digs(ilk, rad);
    }

    function cage() external auth {
        live = 0;
        emit Cage();
    }
}
        

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[{"type":"address","name":"vat_","internalType":"address"}]},{"type":"event","name":"Bark","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32","indexed":true},{"type":"address","name":"urn","internalType":"address","indexed":true},{"type":"uint256","name":"ink","internalType":"uint256","indexed":false},{"type":"uint256","name":"art","internalType":"uint256","indexed":false},{"type":"uint256","name":"due","internalType":"uint256","indexed":false},{"type":"address","name":"clip","internalType":"address","indexed":false},{"type":"uint256","name":"id","internalType":"uint256","indexed":true}],"anonymous":false},{"type":"event","name":"Cage","inputs":[],"anonymous":false},{"type":"event","name":"Deny","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"event","name":"Digs","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32","indexed":true},{"type":"uint256","name":"rad","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"File","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32","indexed":true},{"type":"uint256","name":"data","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"File","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32","indexed":true},{"type":"address","name":"data","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"File","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"what","internalType":"bytes32","indexed":true},{"type":"uint256","name":"data","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"File","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32","indexed":true},{"type":"bytes32","name":"what","internalType":"bytes32","indexed":true},{"type":"address","name":"clip","internalType":"address","indexed":false}],"anonymous":false},{"type":"event","name":"Rely","inputs":[{"type":"address","name":"usr","internalType":"address","indexed":true}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Dirt","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"Hole","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"uint256","name":"id","internalType":"uint256"}],"name":"bark","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32"},{"type":"address","name":"urn","internalType":"address"},{"type":"address","name":"kpr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"cage","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"chop","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"deny","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"digs","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32"},{"type":"uint256","name":"rad","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"file","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32"},{"type":"bytes32","name":"what","internalType":"bytes32"},{"type":"uint256","name":"data","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"file","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32"},{"type":"uint256","name":"data","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"file","inputs":[{"type":"bytes32","name":"what","internalType":"bytes32"},{"type":"address","name":"data","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"file","inputs":[{"type":"bytes32","name":"ilk","internalType":"bytes32"},{"type":"bytes32","name":"what","internalType":"bytes32"},{"type":"address","name":"clip","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"clip","internalType":"address"},{"type":"uint256","name":"chop","internalType":"uint256"},{"type":"uint256","name":"hole","internalType":"uint256"},{"type":"uint256","name":"dirt","internalType":"uint256"}],"name":"ilks","inputs":[{"type":"bytes32","name":"","internalType":"bytes32"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"live","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"rely","inputs":[{"type":"address","name":"usr","internalType":"address"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract VatLike"}],"name":"vat","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"contract VowLike"}],"name":"vow","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"wards","inputs":[{"type":"address","name":"","internalType":"address"}]}]
              

Contract Creation Code

Verify & Publish
0x60a060405234801561001057600080fd5b50604051611f92380380611f928339818101604052602081101561003357600080fd5b81019080805190602001909291905050508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600160038190555060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a25060805160601c611e5b610137600039806109485280611414528061158d52806119bc5250611e5b6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063af7cfeb1116100a2578063d792653811610071578063d79265381461039e578063d9638d36146103e0578063ebecb39d1461044d578063ed998908146104a5578063eda6e121146105275761010b565b8063af7cfeb1146102a2578063bf353dbb146102c0578063c87193f414610318578063d4e8be83146103505761010b565b806365fae35e116100de57806365fae35e146101f25780636924500914610236578063957aa58c146102405780639c52a7f11461025e5761010b565b80631a0b287e1461011057806329ae81141461015257806336569e771461018a578063626cb3c5146101be575b600080fd5b6101506004803603606081101561012657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610545565b005b6101886004803603604081101561016857600080fd5b8101908080359060200190929190803590602001909291905050506107b4565b005b610192610946565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101c661096a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102346004803603602081101561020857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610990565b005b61023e610ace565b005b610248610bb8565b6040518082815260200191505060405180910390f35b6102a06004803603602081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bbe565b005b6102aa610cfc565b6040518082815260200191505060405180910390f35b610302600480360360208110156102d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d02565b6040518082815260200191505060405180910390f35b61034e6004803603604081101561032e57600080fd5b810190808035906020019092919080359060200190929190505050610d1a565b005b61039c6004803603604081101561036657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e56565b005b6103ca600480360360208110156103b457600080fd5b8101908080359060200190929190505050611038565b6040518082815260200191505060405180910390f35b61040c600480360360208110156103f657600080fd5b8101908080359060200190929190505050611058565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104a36004803603606081101561046357600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a8565b005b610511600480360360608110156104bb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611395565b6040518082815260200191505060405180910390f35b61052f611d3d565b6040518082815260200191505060405180910390f35b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f63686f70000000000000000000000000000000000000000000000000000000008214156106bf57670de0b6b3a764000081101561069f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f446f672f66696c652d63686f702d6c742d57414400000000000000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060010181905550610776565b7f686f6c650000000000000000000000000000000000000000000000000000000082141561070757806001600085815260200190815260200160002060020181905550610775565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b5b81837f851aa1caf4888170ad8875449d18f0f512fd6deb2a6571ea1a41fb9f95acbcd1836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f486f6c650000000000000000000000000000000000000000000000000000000082141561089c578060048190555061090a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c7826040518082815260200191505060405180910390a25050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60006003819055507f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda60405160405180910390a1565b60035481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60045481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b610dda60055482611d43565b600581905550610e00600160008481526020019081526020016000206003015482611d43565b6001600084815260200190815260200160002060030181905550817f54f095dc7308776bf01e8580e4dd40fd959ea4bf50b069975768320ef8d77d8a826040518082815260200191505060405180910390a25050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610f0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f766f770000000000000000000000000000000000000000000000000000000000821415610f785780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610fe6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600060016000838152602001908152602001600020600101549050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f636c6970000000000000000000000000000000000000000000000000000000008214156112d3578073ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d60208110156111f457600080fd5b81019080805190602001909291905050508314611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f66696c652d696c6b2d6e65712d636c69702e696c6b0000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611341565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b81837f4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3505050565b600060016003541461140f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6e6f742d6c697665000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632424be5c87876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d60408110156114ca57600080fd5b810190808051906020019092919080519060200190929190505050915091506114f1611dbd565b600160008881526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d9638d368c6040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d60a081101561162657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509091929350905080945081935082955050505060008111801561169357506116878684611d5d565b6116918883611d5d565b105b611705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f446f672f6e6f742d756e7361666500000000000000000000000000000000000081525060200191505060405180910390fd5b60055460045411801561171f575084606001518560400151115b611791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f6c69717569646174696f6e2d6c696d69742d6869740000000000000081525060200191505060405180910390fd5b60006117ad600554600454038760600151886040015103611d89565b90506117e0878760200151866117cb85670de0b6b3a7640000611d5d565b816117d257fe5b04816117da57fe5b04611d89565b94508487111561186957826117f786890386611d5d565b101561180557869450611868565b826118108686611d5d565b1015611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180611dfc602a913960400191505060405180910390fd5b5b5b50506000856118788886611d5d565b8161187f57fe5b049050600081116118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f446f672f6e756c6c2d61756374696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b7f8000000000000000000000000000000000000000000000000000000000000000841115801561194857507f80000000000000000000000000000000000000000000000000000000000000008111155b6119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bab3f408c8c8860000151600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866000038a6000036040518763ffffffff1660e01b8152600401808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019650505050505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b505050506000611ae78585611d5d565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663697efb78826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b505050506000670de0b6b3a7640000611b8f838960200151611d5d565b81611b9657fe5b049050611ba560055482611da3565b600581905550611bb9876060015182611da3565b600160008f815260200190815260200160002060030181905550866000015173ffffffffffffffffffffffffffffffffffffffff1663898eb26782858f8f6040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001945050505050602060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b8101908080519060200190929190505050995050888b73ffffffffffffffffffffffffffffffffffffffff168d7f85258d09e1e4ef299ff3fc11e74af99563f022d21f3f940db982229dc2a3358c8589868c60000151604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a450505050505050509392505050565b60055481565b6000828284039150811115611d5757600080fd5b92915050565b600080821480611d7a5750828283850292508281611d7757fe5b04145b611d8357600080fd5b92915050565b600081831115611d995781611d9b565b825b905092915050565b6000828284019150811015611db757600080fd5b92915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe446f672f64757374792d61756374696f6e2d66726f6d2d7061727469616c2d6c69717569646174696f6ea2646970667358221220754b5334ca9fce7b8537bcb8eb9bcf3b780458d72f8c2ab4f11d1379961ec2e664736f6c634300060c003300000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061010b5760003560e01c8063af7cfeb1116100a2578063d792653811610071578063d79265381461039e578063d9638d36146103e0578063ebecb39d1461044d578063ed998908146104a5578063eda6e121146105275761010b565b8063af7cfeb1146102a2578063bf353dbb146102c0578063c87193f414610318578063d4e8be83146103505761010b565b806365fae35e116100de57806365fae35e146101f25780636924500914610236578063957aa58c146102405780639c52a7f11461025e5761010b565b80631a0b287e1461011057806329ae81141461015257806336569e771461018a578063626cb3c5146101be575b600080fd5b6101506004803603606081101561012657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610545565b005b6101886004803603604081101561016857600080fd5b8101908080359060200190929190803590602001909291905050506107b4565b005b610192610946565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101c661096a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102346004803603602081101561020857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610990565b005b61023e610ace565b005b610248610bb8565b6040518082815260200191505060405180910390f35b6102a06004803603602081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bbe565b005b6102aa610cfc565b6040518082815260200191505060405180910390f35b610302600480360360208110156102d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d02565b6040518082815260200191505060405180910390f35b61034e6004803603604081101561032e57600080fd5b810190808035906020019092919080359060200190929190505050610d1a565b005b61039c6004803603604081101561036657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e56565b005b6103ca600480360360208110156103b457600080fd5b8101908080359060200190929190505050611038565b6040518082815260200191505060405180910390f35b61040c600480360360208110156103f657600080fd5b8101908080359060200190929190505050611058565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104a36004803603606081101561046357600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a8565b005b610511600480360360608110156104bb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611395565b6040518082815260200191505060405180910390f35b61052f611d3d565b6040518082815260200191505060405180910390f35b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f63686f70000000000000000000000000000000000000000000000000000000008214156106bf57670de0b6b3a764000081101561069f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f446f672f66696c652d63686f702d6c742d57414400000000000000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060010181905550610776565b7f686f6c650000000000000000000000000000000000000000000000000000000082141561070757806001600085815260200190815260200160002060020181905550610775565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b5b81837f851aa1caf4888170ad8875449d18f0f512fd6deb2a6571ea1a41fb9f95acbcd1836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f486f6c650000000000000000000000000000000000000000000000000000000082141561089c578060048190555061090a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c7826040518082815260200191505060405180910390a25050565b7f00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b81565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60006003819055507f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda60405160405180910390a1565b60035481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60045481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b610dda60055482611d43565b600581905550610e00600160008481526020019081526020016000206003015482611d43565b6001600084815260200190815260200160002060030181905550817f54f095dc7308776bf01e8580e4dd40fd959ea4bf50b069975768320ef8d77d8a826040518082815260200191505060405180910390a25050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610f0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f766f770000000000000000000000000000000000000000000000000000000000821415610f785780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610fe6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600060016000838152602001908152602001600020600101549050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f636c6970000000000000000000000000000000000000000000000000000000008214156112d3578073ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d60208110156111f457600080fd5b81019080805190602001909291905050508314611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f66696c652d696c6b2d6e65712d636c69702e696c6b0000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611341565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b81837f4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3505050565b600060016003541461140f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6e6f742d6c697665000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b73ffffffffffffffffffffffffffffffffffffffff16632424be5c87876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d60408110156114ca57600080fd5b810190808051906020019092919080519060200190929190505050915091506114f1611dbd565b600160008881526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000806000807f00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b73ffffffffffffffffffffffffffffffffffffffff1663d9638d368c6040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d60a081101561162657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509091929350905080945081935082955050505060008111801561169357506116878684611d5d565b6116918883611d5d565b105b611705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f446f672f6e6f742d756e7361666500000000000000000000000000000000000081525060200191505060405180910390fd5b60055460045411801561171f575084606001518560400151115b611791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f6c69717569646174696f6e2d6c696d69742d6869740000000000000081525060200191505060405180910390fd5b60006117ad600554600454038760600151886040015103611d89565b90506117e0878760200151866117cb85670de0b6b3a7640000611d5d565b816117d257fe5b04816117da57fe5b04611d89565b94508487111561186957826117f786890386611d5d565b101561180557869450611868565b826118108686611d5d565b1015611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180611dfc602a913960400191505060405180910390fd5b5b5b50506000856118788886611d5d565b8161187f57fe5b049050600081116118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f446f672f6e756c6c2d61756374696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b7f8000000000000000000000000000000000000000000000000000000000000000841115801561194857507f80000000000000000000000000000000000000000000000000000000000000008111155b6119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f00000000000000000000000035d1b3f3d7966a1dfe207aa4514c12a259a0492b73ffffffffffffffffffffffffffffffffffffffff16637bab3f408c8c8860000151600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866000038a6000036040518763ffffffff1660e01b8152600401808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019650505050505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b505050506000611ae78585611d5d565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663697efb78826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b505050506000670de0b6b3a7640000611b8f838960200151611d5d565b81611b9657fe5b049050611ba560055482611da3565b600581905550611bb9876060015182611da3565b600160008f815260200190815260200160002060030181905550866000015173ffffffffffffffffffffffffffffffffffffffff1663898eb26782858f8f6040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001945050505050602060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b8101908080519060200190929190505050995050888b73ffffffffffffffffffffffffffffffffffffffff168d7f85258d09e1e4ef299ff3fc11e74af99563f022d21f3f940db982229dc2a3358c8589868c60000151604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a450505050505050509392505050565b60055481565b6000828284039150811115611d5757600080fd5b92915050565b600080821480611d7a5750828283850292508281611d7757fe5b04145b611d8357600080fd5b92915050565b600081831115611d995781611d9b565b825b905092915050565b6000828284019150811015611db757600080fd5b92915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe446f672f64757374792d61756374696f6e2d66726f6d2d7061727469616c2d6c69717569646174696f6ea2646970667358221220754b5334ca9fce7b8537bcb8eb9bcf3b780458d72f8c2ab4f11d1379961ec2e664736f6c634300060c0033