Contract 0x448a5065aebb8e423f0896e6c5d525c040f59af3

Maker 

 

TxHash Block Age From To Value [TxFee]
0x45f727f502ffcfdc9048216762a23b02c13b2765ab87803e9e270c7c3d15dc96(pending)4 hrs 51 mins ago0x84c287da53a299c525359dc06abc09f84d2fe82d  IN  0x448a5065aebb8e423f0896e6c5d525c040f59af30 Ether(Pending)
0x2b2e77d51269a72097e33fd5a78c6bc6078a6b29ef51f633314238d43a70ebcd(pending)20 hrs 39 mins ago0xf0e4d5bf84feb9332c118dd4155832339136f5a5  IN  0x448a5065aebb8e423f0896e6c5d525c040f59af30 Ether(Pending)
0x1752ea9adb688c65593aab15681b0be5edc889a87a6481a1c73bb82fac739574722522445 mins ago0xcad89b3219b706f0c55df99745e730bb87893303  IN   Maker_10 Ether0.000255932
0xe9f0bfb8c21918f604d084cae1229e674f7d436061acf53555a601b01832503672251341 hr 15 mins ago0xef764bac8a438e7e498c2e5fccf0f174c3e3f8db  IN   Maker_10 Ether0.000140388
0x6eb5da7c40bcd55b304986c905b638f9d92efb4467e6d205f3c1064a80c1e3fc72246254 hrs 15 mins ago0xe9942b61307f2e723bab91668b9b988a76a7e3cb  IN   Maker_10 Ether0.000427539
0x35398e3979f45377718096fac944b8f0f87f35d3637193659752bee88337fde172245184 hrs 53 mins ago0xef764bac8a438e7e498c2e5fccf0f174c3e3f8db  IN   Maker_10 Ether0.00070258
0x2ae8e6c0f092db628f27ce7d4fae6ba9f2fcfcccb4bab136c3b2c01fcc485a8d72244945 hrs 3 mins ago0xe9942b61307f2e723bab91668b9b988a76a7e3cb  IN   Maker_10 Ether0.0001457148
0xacfffc93a064445051e78a46b19eb80bab44c1105ae89b5ff5c467bfb1a2bacb72241896 hrs 45 mins ago0x72112e0b260e200e423367c074ba77493a09103d  IN   Maker_10 Ether0.0006926
0xe0b5ed4547135d8f1e4553ac2c70f2489a9af24f9da2f426ee9c588e5cd385d972241886 hrs 45 mins ago0x72112e0b260e200e423367c074ba77493a09103d  IN   Maker_10 Ether0.0005281278
0x88b5dbb8ae1154b55d925b41f296d4e36a0f20bd41f36de6fa10036ddf396b0b72241397 hrs ago0xe9942b61307f2e723bab91668b9b988a76a7e3cb  IN   Maker_10 Ether0.0008715492
0x748b40de2f94cc00766f88e0b3b72876899ce57231a5ed1f1df9115ce921532972239827 hrs 56 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00502176
0x25715ed424fd606c300851c46a106b26182c0cb7d198028253e8a4e5ccb500d772239807 hrs 56 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00198776
0xe1b0ec8dc9b46ae89b5bb33d1f41aa3e956f1e772d89e465e4145c41f4e660f772239777 hrs 56 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00310872
0xdbb3e23b8cf849a98aecc91a07be48865cade0cb52477d008585e08f591dfc9072239678 hrs ago0x69c024cad17cf1268363897a23580c423719dfff  IN   Maker_10 Ether0.000369754
0xff73891a96bc58f0e1075fee762f09dbaa30cb01be77260860180f20739acf4572239638 hrs 1 min ago0xc2ac1e79b9780e8bb1b6b12efe1bc28f1c365f72  IN   Maker_10 Ether0.001671293105
0xae56f00737fd3e587d66bdabc5d0742c906e608cfa57c2c80ad372bf7e4b1d9672239408 hrs 7 mins ago0xb435871b0959561226b4d903b1abf79528177e81  IN   Maker_10 Ether0.001662986
0x4eab49e8e052b0d72d270a784c629fa47ba5d8588725765c1b8bcc20299226fe72239168 hrs 14 mins ago0x3b38df411221126688b7ca4cd3b5c08144e558e5  IN   Maker_10 Ether0.0004067295
0xc020e8a33be1e0cdb7a9789fe166f46a43f810c2262104f7590afb01ac0804d872238728 hrs 28 mins ago0x3b38df411221126688b7ca4cd3b5c08144e558e5  IN   Maker_10 Ether0.000424047704
0xbdd6825e0aafa7a8b3f768be4c7e6018a02bd5e31d674ad0f1d4bbc868baa2ec72238618 hrs 32 mins ago0x3b38df411221126688b7ca4cd3b5c08144e558e5  IN   Maker_10 Ether0.000785600533
0x811251a9212275dcbfc785e48578d2c8287ecf6a242e3d15b70c2f564a14a76a72238008 hrs 55 mins ago0xb435871b0959561226b4d903b1abf79528177e81  IN   Maker_10 Ether0.001533096
0x4b409ad7033f82562895aa031a39b62fe1c1cf764badc526d889ce71921e762e722293913 hrs 46 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00140644
0xd1b20f477d16680edbb3837a4d04e7a62488a9c3c2e922c3357c3dac376a7771722293713 hrs 47 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00183236
0x675542ad8386fe7a1aa6db50e209cbe91a2e0911ada1ec4a731919d2f2a80367722293513 hrs 47 mins ago0x65e2125083af000ef62e40c7872f0a7718b9cb94  IN   Maker_10 Ether0.00253652
0xf72c53ffacf823527c9aeb7722b16118ffc24da0c6e9bccf8dc0d3890e73f7c5722293313 hrs 47 mins ago0x7143a19c74ff007cac92820a243324911407ac5d  IN   Maker_10 Ether0.00070322
0xf2dee95c47441d4e53ed6c02da3ab6b68e8a1bc90ec52715a65dc141b7790e70722292913 hrs 48 mins ago0x7143a19c74ff007cac92820a243324911407ac5d  IN   Maker_10 Ether0.00092346
[ Download CSV Export 

Latest 1 Internal Transaction Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0xa066bef4d74ad5433cc89ea21799d7df3e2f37ec0879f9ca74c419e861064fbf4752011424 days 19 hrs ago0xec4d29fd22066e75746eb68cb51d8a7df7d28356  Contract Creation0 Ether
[ Download CSV Export 
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity), NestedArrayFunctionCallDecoder (medium-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)
Contract Name: SaiTub
Compiler Version: v0.4.19+commit.c4cbbb05
Optimization Enabled: Yes
Runs (Optimizer):  200


Contract Source Code
// hevm: flattened sources of src/tub.sol
pragma solidity ^0.4.18;

////// lib/ds-guard/lib/ds-auth/src/auth.sol
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

contract DSAuthority {
    function canCall(
        address src, address dst, bytes4 sig
    ) public view returns (bool);
}

contract DSAuthEvents {
    event LogSetAuthority (address indexed authority);
    event LogSetOwner     (address indexed owner);
}

contract DSAuth is DSAuthEvents {
    DSAuthority  public  authority;
    address      public  owner;

    function DSAuth() public {
        owner = msg.sender;
        LogSetOwner(msg.sender);
    }

    function setOwner(address owner_)
        public
        auth
    {
        owner = owner_;
        LogSetOwner(owner);
    }

    function setAuthority(DSAuthority authority_)
        public
        auth
    {
        authority = authority_;
        LogSetAuthority(authority);
    }

    modifier auth {
        require(isAuthorized(msg.sender, msg.sig));
        _;
    }

    function isAuthorized(address src, bytes4 sig) internal view returns (bool) {
        if (src == address(this)) {
            return true;
        } else if (src == owner) {
            return true;
        } else if (authority == DSAuthority(0)) {
            return false;
        } else {
            return authority.canCall(src, this, sig);
        }
    }
}

////// lib/ds-spell/lib/ds-note/src/note.sol
/// note.sol -- the `note' modifier, for logging calls as events

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

contract DSNote {
    event LogNote(
        bytes4   indexed  sig,
        address  indexed  guy,
        bytes32  indexed  foo,
        bytes32  indexed  bar,
        uint              wad,
        bytes             fax
    ) anonymous;

    modifier note {
        bytes32 foo;
        bytes32 bar;

        assembly {
            foo := calldataload(4)
            bar := calldataload(36)
        }

        LogNote(msg.sig, msg.sender, foo, bar, msg.value, msg.data);

        _;
    }
}

////// lib/ds-thing/lib/ds-math/src/math.sol
/// math.sol -- mixin for inline numerical wizardry

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

contract DSMath {
    function add(uint x, uint y) internal pure returns (uint z) {
        require((z = x + y) >= x);
    }
    function sub(uint x, uint y) internal pure returns (uint z) {
        require((z = x - y) <= x);
    }
    function mul(uint x, uint y) internal pure returns (uint z) {
        require(y == 0 || (z = x * y) / y == x);
    }

    function min(uint x, uint y) internal pure returns (uint z) {
        return x <= y ? x : y;
    }
    function max(uint x, uint y) internal pure returns (uint z) {
        return x >= y ? x : y;
    }
    function imin(int x, int y) internal pure returns (int z) {
        return x <= y ? x : y;
    }
    function imax(int x, int y) internal pure returns (int z) {
        return x >= y ? x : y;
    }

    uint constant WAD = 10 ** 18;
    uint constant RAY = 10 ** 27;

    function wmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), WAD / 2) / WAD;
    }
    function rmul(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, y), RAY / 2) / RAY;
    }
    function wdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, WAD), y / 2) / y;
    }
    function rdiv(uint x, uint y) internal pure returns (uint z) {
        z = add(mul(x, RAY), y / 2) / y;
    }

    // This famous algorithm is called "exponentiation by squaring"
    // and calculates x^n with x as fixed-point and n as regular unsigned.
    //
    // It's O(log n), instead of O(n) for naive repeated multiplication.
    //
    // These facts are why it works:
    //
    //  If n is even, then x^n = (x^2)^(n/2).
    //  If n is odd,  then x^n = x * x^(n-1),
    //   and applying the equation for even x gives
    //    x^n = x * (x^2)^((n-1) / 2).
    //
    //  Also, EVM division is flooring and
    //    floor[(n-1) / 2] = floor[n / 2].
    //
    function rpow(uint x, uint n) internal pure returns (uint z) {
        z = n % 2 != 0 ? x : RAY;

        for (n /= 2; n != 0; n /= 2) {
            x = rmul(x, x);

            if (n % 2 != 0) {
                z = rmul(z, x);
            }
        }
    }
}

////// lib/ds-thing/src/thing.sol
// thing.sol - `auth` with handy mixins. your things should be DSThings

// Copyright (C) 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

/* import 'ds-auth/auth.sol'; */
/* import 'ds-note/note.sol'; */
/* import 'ds-math/math.sol'; */

contract DSThing is DSAuth, DSNote, DSMath {

    function S(string s) internal pure returns (bytes4) {
        return bytes4(keccak256(s));
    }

}

////// lib/ds-token/lib/ds-stop/src/stop.sol
/// stop.sol -- mixin for enable/disable functionality

// Copyright (C) 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

/* import "ds-auth/auth.sol"; */
/* import "ds-note/note.sol"; */

contract DSStop is DSNote, DSAuth {

    bool public stopped;

    modifier stoppable {
        require(!stopped);
        _;
    }
    function stop() public auth note {
        stopped = true;
    }
    function start() public auth note {
        stopped = false;
    }

}

////// lib/ds-token/lib/erc20/src/erc20.sol
/// erc20.sol -- API for the ERC20 token standard

// See <https://github.com/ethereum/EIPs/issues/20>.

// This file likely does not meet the threshold of originality
// required for copyright to apply.  As a result, this is free and
// unencumbered software belonging to the public domain.

/* pragma solidity ^0.4.8; */

contract ERC20Events {
    event Approval(address indexed src, address indexed guy, uint wad);
    event Transfer(address indexed src, address indexed dst, uint wad);
}

contract ERC20 is ERC20Events {
    function totalSupply() public view returns (uint);
    function balanceOf(address guy) public view returns (uint);
    function allowance(address src, address guy) public view returns (uint);

    function approve(address guy, uint wad) public returns (bool);
    function transfer(address dst, uint wad) public returns (bool);
    function transferFrom(
        address src, address dst, uint wad
    ) public returns (bool);
}

////// lib/ds-token/src/base.sol
/// base.sol -- basic ERC20 implementation

// Copyright (C) 2015, 2016, 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

/* import "erc20/erc20.sol"; */
/* import "ds-math/math.sol"; */

contract DSTokenBase is ERC20, DSMath {
    uint256                                            _supply;
    mapping (address => uint256)                       _balances;
    mapping (address => mapping (address => uint256))  _approvals;

    function DSTokenBase(uint supply) public {
        _balances[msg.sender] = supply;
        _supply = supply;
    }

    function totalSupply() public view returns (uint) {
        return _supply;
    }
    function balanceOf(address src) public view returns (uint) {
        return _balances[src];
    }
    function allowance(address src, address guy) public view returns (uint) {
        return _approvals[src][guy];
    }

    function transfer(address dst, uint wad) public returns (bool) {
        return transferFrom(msg.sender, dst, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        returns (bool)
    {
        if (src != msg.sender) {
            _approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
        }

        _balances[src] = sub(_balances[src], wad);
        _balances[dst] = add(_balances[dst], wad);

        Transfer(src, dst, wad);

        return true;
    }

    function approve(address guy, uint wad) public returns (bool) {
        _approvals[msg.sender][guy] = wad;

        Approval(msg.sender, guy, wad);

        return true;
    }
}

////// lib/ds-token/src/token.sol
/// token.sol -- ERC20 implementation with minting and burning

// Copyright (C) 2015, 2016, 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

/* import "ds-stop/stop.sol"; */

/* import "./base.sol"; */

contract DSToken is DSTokenBase(0), DSStop {

    bytes32  public  symbol;
    uint256  public  decimals = 18; // standard token precision. override to customize

    function DSToken(bytes32 symbol_) public {
        symbol = symbol_;
    }

    event Mint(address indexed guy, uint wad);
    event Burn(address indexed guy, uint wad);

    function approve(address guy) public stoppable returns (bool) {
        return super.approve(guy, uint(-1));
    }

    function approve(address guy, uint wad) public stoppable returns (bool) {
        return super.approve(guy, wad);
    }

    function transferFrom(address src, address dst, uint wad)
        public
        stoppable
        returns (bool)
    {
        if (src != msg.sender && _approvals[src][msg.sender] != uint(-1)) {
            _approvals[src][msg.sender] = sub(_approvals[src][msg.sender], wad);
        }

        _balances[src] = sub(_balances[src], wad);
        _balances[dst] = add(_balances[dst], wad);

        Transfer(src, dst, wad);

        return true;
    }

    function push(address dst, uint wad) public {
        transferFrom(msg.sender, dst, wad);
    }
    function pull(address src, uint wad) public {
        transferFrom(src, msg.sender, wad);
    }
    function move(address src, address dst, uint wad) public {
        transferFrom(src, dst, wad);
    }

    function mint(uint wad) public {
        mint(msg.sender, wad);
    }
    function burn(uint wad) public {
        burn(msg.sender, wad);
    }
    function mint(address guy, uint wad) public auth stoppable {
        _balances[guy] = add(_balances[guy], wad);
        _supply = add(_supply, wad);
        Mint(guy, wad);
    }
    function burn(address guy, uint wad) public auth stoppable {
        if (guy != msg.sender && _approvals[guy][msg.sender] != uint(-1)) {
            _approvals[guy][msg.sender] = sub(_approvals[guy][msg.sender], wad);
        }

        _balances[guy] = sub(_balances[guy], wad);
        _supply = sub(_supply, wad);
        Burn(guy, wad);
    }

    // Optional token name
    bytes32   public  name = "";

    function setName(bytes32 name_) public auth {
        name = name_;
    }
}

////// lib/ds-value/src/value.sol
/// value.sol - a value is a simple thing, it can be get and set

// Copyright (C) 2017  DappHub, LLC

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.13; */

/* import 'ds-thing/thing.sol'; */

contract DSValue is DSThing {
    bool    has;
    bytes32 val;
    function peek() public view returns (bytes32, bool) {
        return (val,has);
    }
    function read() public view returns (bytes32) {
        var (wut, haz) = peek();
        assert(haz);
        return wut;
    }
    function poke(bytes32 wut) public note auth {
        val = wut;
        has = true;
    }
    function void() public note auth {  // unset the value
        has = false;
    }
}

////// src/vox.sol
/// vox.sol -- target price feed

// Copyright (C) 2016, 2017  Nikolai Mushegian <[email protected]>
// Copyright (C) 2016, 2017  Daniel Brockman <[email protected]>
// Copyright (C) 2017        Rain Break <[email protected]>

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.18; */

/* import "ds-thing/thing.sol"; */

contract SaiVox is DSThing {
    uint256  _par;
    uint256  _way;

    uint256  public  fix;
    uint256  public  how;
    uint256  public  tau;

    function SaiVox(uint par_) public {
        _par = fix = par_;
        _way = RAY;
        tau  = era();
    }

    function era() public view returns (uint) {
        return block.timestamp;
    }

    function mold(bytes32 param, uint val) public note auth {
        if (param == 'way') _way = val;
    }

    // Dai Target Price (ref per dai)
    function par() public returns (uint) {
        prod();
        return _par;
    }
    function way() public returns (uint) {
        prod();
        return _way;
    }

    function tell(uint256 ray) public note auth {
        fix = ray;
    }
    function tune(uint256 ray) public note auth {
        how = ray;
    }

    function prod() public note {
        var age = era() - tau;
        if (age == 0) return;  // optimised
        tau = era();

        if (_way != RAY) _par = rmul(_par, rpow(_way, age));  // optimised

        if (how == 0) return;  // optimised
        var wag = int128(how * age);
        _way = inj(prj(_way) + (fix < _par ? wag : -wag));
    }

    function inj(int128 x) internal pure returns (uint256) {
        return x >= 0 ? uint256(x) + RAY
            : rdiv(RAY, RAY + uint256(-x));
    }
    function prj(uint256 x) internal pure returns (int128) {
        return x >= RAY ? int128(x - RAY)
            : int128(RAY) - int128(rdiv(RAY, x));
    }
}

////// src/tub.sol
/// tub.sol -- simplified CDP engine (baby brother of `vat')

// Copyright (C) 2017  Nikolai Mushegian <[email protected]>
// Copyright (C) 2017  Daniel Brockman <[email protected]>
// Copyright (C) 2017  Rain Break <[email protected]>

// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU 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 General Public License for more details.

// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <http://www.gnu.org/licenses/>.

/* pragma solidity ^0.4.18; */

/* import "ds-thing/thing.sol"; */
/* import "ds-token/token.sol"; */
/* import "ds-value/value.sol"; */

/* import "./vox.sol"; */

contract SaiTubEvents {
    event LogNewCup(address indexed lad, bytes32 cup);
}

contract SaiTub is DSThing, SaiTubEvents {
    DSToken  public  sai;  // Stablecoin
    DSToken  public  sin;  // Debt (negative sai)

    DSToken  public  skr;  // Abstracted collateral
    ERC20    public  gem;  // Underlying collateral

    DSToken  public  gov;  // Governance token

    SaiVox   public  vox;  // Target price feed
    DSValue  public  pip;  // Reference price feed
    DSValue  public  pep;  // Governance price feed

    address  public  tap;  // Liquidator
    address  public  pit;  // Governance Vault

    uint256  public  axe;  // Liquidation penalty
    uint256  public  cap;  // Debt ceiling
    uint256  public  mat;  // Liquidation ratio
    uint256  public  tax;  // Stability fee
    uint256  public  fee;  // Governance fee
    uint256  public  gap;  // Join-Exit Spread

    bool     public  off;  // Cage flag
    bool     public  out;  // Post cage exit

    uint256  public  fit;  // REF per SKR (just before settlement)

    uint256  public  rho;  // Time of last drip
    uint256         _chi;  // Accumulated Tax Rates
    uint256         _rhi;  // Accumulated Tax + Fee Rates
    uint256  public  rum;  // Total normalised debt

    uint256                   public  cupi;
    mapping (bytes32 => Cup)  public  cups;

    struct Cup {
        address  lad;      // CDP owner
        uint256  ink;      // Locked collateral (in SKR)
        uint256  art;      // Outstanding normalised debt (tax only)
        uint256  ire;      // Outstanding normalised debt
    }

    function lad(bytes32 cup) public view returns (address) {
        return cups[cup].lad;
    }
    function ink(bytes32 cup) public view returns (uint) {
        return cups[cup].ink;
    }
    function tab(bytes32 cup) public returns (uint) {
        return rmul(cups[cup].art, chi());
    }
    function rap(bytes32 cup) public returns (uint) {
        return sub(rmul(cups[cup].ire, rhi()), tab(cup));
    }

    // Total CDP Debt
    function din() public returns (uint) {
        return rmul(rum, chi());
    }
    // Backing collateral
    function air() public view returns (uint) {
        return skr.balanceOf(this);
    }
    // Raw collateral
    function pie() public view returns (uint) {
        return gem.balanceOf(this);
    }

    //------------------------------------------------------------------

    function SaiTub(
        DSToken  sai_,
        DSToken  sin_,
        DSToken  skr_,
        ERC20    gem_,
        DSToken  gov_,
        DSValue  pip_,
        DSValue  pep_,
        SaiVox   vox_,
        address  pit_
    ) public {
        gem = gem_;
        skr = skr_;

        sai = sai_;
        sin = sin_;

        gov = gov_;
        pit = pit_;

        pip = pip_;
        pep = pep_;
        vox = vox_;

        axe = RAY;
        mat = RAY;
        tax = RAY;
        fee = RAY;
        gap = WAD;

        _chi = RAY;
        _rhi = RAY;

        rho = era();
    }

    function era() public constant returns (uint) {
        return block.timestamp;
    }

    //--Risk-parameter-config-------------------------------------------

    function mold(bytes32 param, uint val) public note auth {
        if      (param == 'cap') cap = val;
        else if (param == 'mat') { require(val >= RAY); mat = val; }
        else if (param == 'tax') { require(val >= RAY); drip(); tax = val; }
        else if (param == 'fee') { require(val >= RAY); drip(); fee = val; }
        else if (param == 'axe') { require(val >= RAY); axe = val; }
        else if (param == 'gap') { require(val >= WAD); gap = val; }
        else return;
    }

    //--Price-feed-setters----------------------------------------------

    function setPip(DSValue pip_) public note auth {
        pip = pip_;
    }
    function setPep(DSValue pep_) public note auth {
        pep = pep_;
    }
    function setVox(SaiVox vox_) public note auth {
        vox = vox_;
    }

    //--Tap-setter------------------------------------------------------
    function turn(address tap_) public note {
        require(tap  == 0);
        require(tap_ != 0);
        tap = tap_;
    }

    //--Collateral-wrapper----------------------------------------------

    // Wrapper ratio (gem per skr)
    function per() public view returns (uint ray) {
        return skr.totalSupply() == 0 ? RAY : rdiv(pie(), skr.totalSupply());
    }
    // Join price (gem per skr)
    function ask(uint wad) public view returns (uint) {
        return rmul(wad, wmul(per(), gap));
    }
    // Exit price (gem per skr)
    function bid(uint wad) public view returns (uint) {
        return rmul(wad, wmul(per(), sub(2 * WAD, gap)));
    }
    function join(uint wad) public note {
        require(!off);
        require(ask(wad) > 0);
        require(gem.transferFrom(msg.sender, this, ask(wad)));
        skr.mint(msg.sender, wad);
    }
    function exit(uint wad) public note {
        require(!off || out);
        require(gem.transfer(msg.sender, bid(wad)));
        skr.burn(msg.sender, wad);
    }

    //--Stability-fee-accumulation--------------------------------------

    // Accumulated Rates
    function chi() public returns (uint) {
        drip();
        return _chi;
    }
    function rhi() public returns (uint) {
        drip();
        return _rhi;
    }
    function drip() public note {
        if (off) return;

        var rho_ = era();
        var age = rho_ - rho;
        if (age == 0) return;    // optimised
        rho = rho_;

        var inc = RAY;

        if (tax != RAY) {  // optimised
            var _chi_ = _chi;
            inc = rpow(tax, age);
            _chi = rmul(_chi, inc);
            sai.mint(tap, rmul(sub(_chi, _chi_), rum));
        }

        // optimised
        if (fee != RAY) inc = rmul(inc, rpow(fee, age));
        if (inc != RAY) _rhi = rmul(_rhi, inc);
    }


    //--CDP-risk-indicator----------------------------------------------

    // Abstracted collateral price (ref per skr)
    function tag() public view returns (uint wad) {
        return off ? fit : wmul(per(), uint(pip.read()));
    }
    // Returns true if cup is well-collateralized
    function safe(bytes32 cup) public returns (bool) {
        var pro = rmul(tag(), ink(cup));
        var con = rmul(vox.par(), tab(cup));
        var min = rmul(con, mat);
        return pro >= min;
    }


    //--CDP-operations--------------------------------------------------

    function open() public note returns (bytes32 cup) {
        require(!off);
        cupi = add(cupi, 1);
        cup = bytes32(cupi);
        cups[cup].lad = msg.sender;
        LogNewCup(msg.sender, cup);
    }
    function give(bytes32 cup, address guy) public note {
        require(msg.sender == cups[cup].lad);
        require(guy != 0);
        cups[cup].lad = guy;
    }

    function lock(bytes32 cup, uint wad) public note {
        require(!off);
        cups[cup].ink = add(cups[cup].ink, wad);
        skr.pull(msg.sender, wad);
        require(cups[cup].ink == 0 || cups[cup].ink > 0.005 ether);
    }
    function free(bytes32 cup, uint wad) public note {
        require(msg.sender == cups[cup].lad);
        cups[cup].ink = sub(cups[cup].ink, wad);
        skr.push(msg.sender, wad);
        require(safe(cup));
        require(cups[cup].ink == 0 || cups[cup].ink > 0.005 ether);
    }

    function draw(bytes32 cup, uint wad) public note {
        require(!off);
        require(msg.sender == cups[cup].lad);
        require(rdiv(wad, chi()) > 0);

        cups[cup].art = add(cups[cup].art, rdiv(wad, chi()));
        rum = add(rum, rdiv(wad, chi()));

        cups[cup].ire = add(cups[cup].ire, rdiv(wad, rhi()));
        sai.mint(cups[cup].lad, wad);

        require(safe(cup));
        require(sai.totalSupply() <= cap);
    }
    function wipe(bytes32 cup, uint wad) public note {
        require(!off);

        var owe = rmul(wad, rdiv(rap(cup), tab(cup)));

        cups[cup].art = sub(cups[cup].art, rdiv(wad, chi()));
        rum = sub(rum, rdiv(wad, chi()));

        cups[cup].ire = sub(cups[cup].ire, rdiv(add(wad, owe), rhi()));
        sai.burn(msg.sender, wad);

        var (val, ok) = pep.peek();
        if (ok && val != 0) gov.move(msg.sender, pit, wdiv(owe, uint(val)));
    }

    function shut(bytes32 cup) public note {
        require(!off);
        require(msg.sender == cups[cup].lad);
        if (tab(cup) != 0) wipe(cup, tab(cup));
        if (ink(cup) != 0) free(cup, ink(cup));
        delete cups[cup];
    }

    function bite(bytes32 cup) public note {
        require(!safe(cup) || off);

        // Take on all of the debt, except unpaid fees
        var rue = tab(cup);
        sin.mint(tap, rue);
        rum = sub(rum, cups[cup].art);
        cups[cup].art = 0;
        cups[cup].ire = 0;

        // Amount owed in SKR, including liquidation penalty
        var owe = rdiv(rmul(rmul(rue, axe), vox.par()), tag());

        if (owe > cups[cup].ink) {
            owe = cups[cup].ink;
        }

        skr.push(tap, owe);
        cups[cup].ink = sub(cups[cup].ink, owe);
    }

    //------------------------------------------------------------------

    function cage(uint fit_, uint jam) public note auth {
        require(!off && fit_ != 0);
        off = true;
        axe = RAY;
        gap = WAD;
        fit = fit_;         // ref per skr
        require(gem.transfer(tap, jam));
    }
    function flow() public note auth {
        require(off);
        out = true;
    }
}

Contract ABI
[{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"join","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"sin","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"skr","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gov","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"era","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"cup","type":"bytes32"}],"name":"ink","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rho","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"air","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rhi","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"flow","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"}],"name":"bite","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"},{"name":"wad","type":"uint256"}],"name":"draw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"wad","type":"uint256"}],"name":"bid","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"cupi","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"axe","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tag","outputs":[{"name":"wad","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"off","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"vox","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"gap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"}],"name":"rap","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"},{"name":"wad","type":"uint256"}],"name":"wipe","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"gem","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"tap_","type":"address"}],"name":"turn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"per","outputs":[{"name":"ray","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint256"}],"name":"exit","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"pip_","type":"address"}],"name":"setPip","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pie","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"fit_","type":"uint256"},{"name":"jam","type":"uint256"}],"name":"cage","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rum","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"sai","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"param","type":"bytes32"},{"name":"val","type":"uint256"}],"name":"mold","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tax","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"drip","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"},{"name":"wad","type":"uint256"}],"name":"free","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mat","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pep","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"out","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"},{"name":"wad","type":"uint256"}],"name":"lock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"}],"name":"shut","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"},{"name":"guy","type":"address"}],"name":"give","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"fit","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"chi","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"vox_","type":"address"}],"name":"setVox","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pip","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"pep_","type":"address"}],"name":"setPep","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"fee","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"cup","type":"bytes32"}],"name":"lad","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"din","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"wad","type":"uint256"}],"name":"ask","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"}],"name":"safe","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"pit","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"cup","type":"bytes32"}],"name":"tab","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"open","outputs":[{"name":"cup","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tap","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"cups","outputs":[{"name":"lad","type":"address"},{"name":"ink","type":"uint256"},{"name":"art","type":"uint256"},{"name":"ire","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"sai_","type":"address"},{"name":"sin_","type":"address"},{"name":"skr_","type":"address"},{"name":"gem_","type":"address"},{"name":"gov_","type":"address"},{"name":"pip_","type":"address"},{"name":"pep_","type":"address"},{"name":"vox_","type":"address"},{"name":"pit_","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"lad","type":"address"},{"indexed":false,"name":"cup","type":"bytes32"}],"name":"LogNewCup","type":"event"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"guy","type":"address"},{"indexed":true,"name":"foo","type":"bytes32"},{"indexed":true,"name":"bar","type":"bytes32"},{"indexed":false,"name":"wad","type":"uint256"},{"indexed":false,"name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"}]

Contract Creation Code
6060604052341561000f57600080fd5b6040516101208062002a2383398101604052808051919060200180519190602001805191906020018051919060200180519190602001805191906020018051919060200180519190602001805160018054600160a060020a03191633600160a060020a031690811790915590925090507fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a260058054600160a060020a0319908116600160a060020a03898116919091179092556004805482168a84161790556002805482168c84161790556003805482168b8416179055600680548216888416179055600b80548216848416179055600880548216878416179055600980548216868416179055600780549091169184169190911790556b033b2e3c9fd0803ce8000000600c819055600e819055600f8190556010819055670de0b6b3a7640000601155601581905560165561017b64010000000061018d8102610a6c1704565b60145550610191975050505050505050565b4290565b61288280620001a16000396000f3006060604052600436106102b05763ffffffff60e060020a600035041663049878f381146102b5578063071bafb5146102cd5780630f8a771e146102fc57806312d43a511461030f57806313af403514610322578063143e55e0146103415780631f3634ed1461036657806320aba08b1461037c57806327e7e21e1461038f578063338a0261146103a2578063343aad82146103b5578063355274ea146103c857806340cc8854146103db578063440f19ba146103f1578063454a2ab31461040a5780634995543114610420578063509bf2bf1461043357806351f91066146104465780636626b26d1461045957806367550a35146104805780636c32c0a6146104935780636f78ee0d146104a657806373b38101146104bc5780637a9e5e4b146104d55780637bd2bea7146104f45780637e74325f146105075780637ec9c3b8146105265780637f8661a11461053957806382bf9a751461054f5780638a95a7461461056e5780638ceedb47146105815780638cf0c1911461059a5780638da5cb5b146105ad5780639166cba4146105c057806392b0d721146105d357806399c8d556146105ec5780639f678cca146105ff578063a5cd184e14610612578063ab0783da1461062b578063ace237f51461063e578063b2a1449b14610651578063b3b77a5114610664578063b84d21061461067d578063baa8529c14610693578063bf7e214f146106b5578063c8e13bb4146106c8578063c92aecc4146106db578063cf48d1a6146106ee578063d741e2f91461070d578063d9c27cc614610720578063ddca3f431461073f578063de5f551714610752578063e0ae96e914610768578063e47e7e661461077b578063e95823ad14610791578063f03c7c6e146107a7578063f7c8d634146107ba578063fcfff16f146107d0578063fd221031146107e3578063fdac0025146107f6575b600080fd5b34156102c057600080fd5b6102cb600435610849565b005b34156102d857600080fd5b6102e06109cd565b604051600160a060020a03909116815260200160405180910390f35b341561030757600080fd5b6102e06109dc565b341561031a57600080fd5b6102e06109eb565b341561032d57600080fd5b6102cb600160a060020a03600435166109fa565b341561034c57600080fd5b610354610a6c565b60405190815260200160405180910390f35b341561037157600080fd5b610354600435610a70565b341561038757600080fd5b610354610a85565b341561039a57600080fd5b610354610a8b565b34156103ad57600080fd5b610354610b05565b34156103c057600080fd5b6102cb610b16565b34156103d357600080fd5b610354610bb1565b34156103e657600080fd5b6102cb600435610bb7565b34156103fc57600080fd5b6102cb600435602435610e4b565b341561041557600080fd5b610354600435611077565b341561042b57600080fd5b6103546110af565b341561043e57600080fd5b6103546110b5565b341561045157600080fd5b6103546110bb565b341561046457600080fd5b61046c611149565b604051901515815260200160405180910390f35b341561048b57600080fd5b6102e0611152565b341561049e57600080fd5b610354611161565b34156104b157600080fd5b610354600435611167565b34156104c757600080fd5b6102cb600435602435611197565b34156104e057600080fd5b6102cb600160a060020a0360043516611422565b34156104ff57600080fd5b6102e0611494565b341561051257600080fd5b6102cb600160a060020a03600435166114a3565b341561053157600080fd5b610354611548565b341561054457600080fd5b6102cb600435611636565b341561055a57600080fd5b6102cb600160a060020a0360043516611793565b341561057957600080fd5b61035461182e565b341561058c57600080fd5b6102cb600435602435611889565b34156105a557600080fd5b6103546119d7565b34156105b857600080fd5b6102e06119dd565b34156105cb57600080fd5b6102e06119ec565b34156105de57600080fd5b6102cb6004356024356119fb565b34156105f757600080fd5b610354611c2c565b341561060a57600080fd5b6102cb611c32565b341561061d57600080fd5b6102cb600435602435611dd6565b341561063657600080fd5b610354611f47565b341561064957600080fd5b6102e0611f4d565b341561065c57600080fd5b61046c611f5c565b341561066f57600080fd5b6102cb600435602435611f6a565b341561068857600080fd5b6102cb6004356120ad565b341561069e57600080fd5b6102cb600435600160a060020a03602435166121ac565b34156106c057600080fd5b6102e061226e565b34156106d357600080fd5b61035461227d565b34156106e657600080fd5b610354612283565b34156106f957600080fd5b6102cb600160a060020a0360043516612294565b341561071857600080fd5b6102e061232f565b341561072b57600080fd5b6102cb600160a060020a036004351661233e565b341561074a57600080fd5b6103546123d9565b341561075d57600080fd5b6102e06004356123df565b341561077357600080fd5b6103546123fa565b341561078657600080fd5b61035460043561240a565b341561079c57600080fd5b61046c600435612423565b34156107b257600080fd5b6102e06124ca565b34156107c557600080fd5b6103546004356124d9565b34156107db57600080fd5b6103546124f7565b34156107ee57600080fd5b6102e06125d5565b341561080157600080fd5b61080c6004356125e4565b6040518085600160a060020a0316600160a060020a0316815260200184815260200183815260200182815260200194505050505060405180910390f35b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff16156108af57600080fd5b60006108ba8461240a565b116108c457600080fd5b600554600160a060020a03166323b872dd33306108e08761240a565b60006040516020015260405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401602060405180830381600087803b151561093857600080fd5b6102c65a03f1151561094957600080fd5b50505060405180519050151561095e57600080fd5b600454600160a060020a03166340c10f19338560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156109b457600080fd5b6102c65a03f115156109c557600080fd5b505050505050565b600354600160a060020a031681565b600454600160a060020a031681565b600654600160a060020a031681565b610a1033600035600160e060020a031916612615565b1515610a1b57600080fd5b60018054600160a060020a031916600160a060020a038381169190911791829055167fce241d7ca1f669fee44b6fc00b8eba2df3bb514eed0f6f668f8f89096e81ed9460405160405180910390a250565b4290565b60009081526019602052604090206001015490565b60145481565b600454600090600160a060020a03166370a0823130836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ae657600080fd5b6102c65a03f11515610af757600080fd5b505050604051805191505090565b6000610b0f611c32565b5060165490565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a4610b8233600035600160e060020a031916612615565b1515610b8d57600080fd5b60125460ff161515610b9e57600080fd5b50506012805461ff001916610100179055565b600d5481565b6000806004356024358082600160a060020a033316600160e060020a031986351634873660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a4610c1685612423565b1580610c24575060125460ff165b1515610c2f57600080fd5b610c38856124d9565b600354600a54919550600160a060020a03908116916340c10f1991168660405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610c9857600080fd5b6102c65a03f11515610ca957600080fd5b5050601754600087815260196020526040902060020154610cca925061270b565b60175560008581526019602052604081206002810182905560030155600c54610d7190610d6490610cfc90879061271b565b600754600160a060020a031663495d32cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610d4457600080fd5b6102c65a03f11515610d5557600080fd5b5050506040518051905061271b565b610d6c6110bb565b61275e565b600086815260196020526040902060010154909350831115610da25760008581526019602052604090206001015492505b600454600a54600160a060020a039182169163b753a98c91168560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610dff57600080fd5b6102c65a03f11515610e1057600080fd5b505050600085815260196020526040902060010154610e2f908461270b565b6000958652601960205260409095206001019490945550505050565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff1615610eb157600080fd5b60008481526019602052604090205433600160a060020a03908116911614610ed857600080fd5b6000610ee684610d6c612283565b11610ef057600080fd5b600084815260196020526040902060020154610f1790610f1285610d6c612283565b612782565b600085815260196020526040902060020155601754610f3c90610f1285610d6c612283565b601755600084815260196020526040902060030154610f6190610f1285610d6c610b05565b6000858152601960205260409081902060038101929092556002549154600160a060020a03928316926340c10f199291169086905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515610fd657600080fd5b6102c65a03f11515610fe757600080fd5b505050610ff384612423565b1515610ffe57600080fd5b600d54600254600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561104957600080fd5b6102c65a03f1151561105a57600080fd5b505050604051805190501115151561107157600080fd5b50505050565b60006110a9826110a4611088611548565b61109f670de0b6b3a764000060020260115461270b565b612792565b61271b565b92915050565b60185481565b600c5481565b60125460009060ff166111405761113b6110d3611548565b600854600160a060020a03166357de26a46000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561111b57600080fd5b6102c65a03f1151561112c57600080fd5b50505060405180519050612792565b611144565b6013545b905090565b60125460ff1681565b600754600160a060020a031681565b60115481565b6000818152601960205260408120600301546110a990611189906110a4610b05565b611192846124d9565b61270b565b600080806004356024358082600160a060020a033316600160e060020a031986351634873660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff16156111fe57600080fd5b611217866110a461120e8a611167565b610d6c8b6124d9565b60008881526019602052604090206002015490955061123c9061119288610d6c612283565b6000888152601960205260409020600201556017546112619061119288610d6c612283565b60175560008781526019602052604090206003015461128f906111926112878989612782565b610d6c610b05565b6000888152601960205260409081902060030191909155600254600160a060020a031690639dc29fac90339089905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156112fe57600080fd5b6102c65a03f1151561130f57600080fd5b5050600954600160a060020a031690506359e02dd76000604051604001526040518163ffffffff1660e060020a0281526004016040805180830381600087803b151561135a57600080fd5b6102c65a03f1151561136b57600080fd5b505050604051805190602001805190509350935082801561138b57508315155b1561141957600654600b54600160a060020a039182169163bb35783b913391166113b589896127ba565b60405160e060020a63ffffffff8616028152600160a060020a0393841660048201529190921660248201526044810191909152606401600060405180830381600087803b151561140457600080fd5b6102c65a03f1151561141557600080fd5b5050505b50505050505050565b61143833600035600160e060020a031916612615565b151561144357600080fd5b60008054600160a060020a031916600160a060020a038381169190911791829055167f1abebea81bfa2637f28358c371278fb15ede7ea8dd28d2e03b112ff6d936ada460405160405180910390a250565b600554600160a060020a031681565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a4600a54600160a060020a03161561150f57600080fd5b600160a060020a038316151561152457600080fd5b5050600a8054600160a060020a031916600160a060020a0392909216919091179055565b600454600090600160a060020a03166318160ddd82604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561159257600080fd5b6102c65a03f115156115a357600080fd5b50505060405180511590506116255761113b6115bd61182e565b600454600160a060020a03166318160ddd6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561160557600080fd5b6102c65a03f1151561161657600080fd5b5050506040518051905061275e565b506b033b2e3c9fd0803ce800000090565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff1615806116a55750601254610100900460ff165b15156116b057600080fd5b600554600160a060020a031663a9059cbb336116cb86611077565b60006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b151561171757600080fd5b6102c65a03f1151561172857600080fd5b50505060405180519050151561173d57600080fd5b600454600160a060020a0316639dc29fac338560405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b15156109b457600080fd5b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a46117ff33600035600160e060020a031916612615565b151561180a57600080fd5b505060088054600160a060020a031916600160a060020a0392909216919091179055565b600554600090600160a060020a03166370a0823130836040516020015260405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401602060405180830381600087803b1515610ae657600080fd5b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a46118f533600035600160e060020a031916612615565b151561190057600080fd5b60125460ff1615801561191257508315155b151561191d57600080fd5b6012805460ff191660011790556b033b2e3c9fd0803ce8000000600c55670de0b6b3a76400006011556013849055600554600a54600160a060020a039182169163a9059cbb91168560006040516020015260405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401602060405180830381600087803b15156119b157600080fd5b6102c65a03f115156119c257600080fd5b50505060405180519050151561107157600080fd5b60175481565b600154600160a060020a031681565b600254600160a060020a031681565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a4611a6733600035600160e060020a031916612615565b1515611a7257600080fd5b7f6361700000000000000000000000000000000000000000000000000000000000841415611aa457600d839055611071565b7f6d61740000000000000000000000000000000000000000000000000000000000841415611aef576b033b2e3c9fd0803ce8000000831015611ae557600080fd5b600e839055611071565b7f7461780000000000000000000000000000000000000000000000000000000000841415611b42576b033b2e3c9fd0803ce8000000831015611b3057600080fd5b611b38611c32565b600f839055611071565b7f6665650000000000000000000000000000000000000000000000000000000000841415611b95576b033b2e3c9fd0803ce8000000831015611b8357600080fd5b611b8b611c32565b6010839055611071565b7f6178650000000000000000000000000000000000000000000000000000000000841415611be0576b033b2e3c9fd0803ce8000000831015611bd657600080fd5b600c839055611071565b7f6761700000000000000000000000000000000000000000000000000000000000841415611c2757670de0b6b3a7640000831015611c1d57600080fd5b6011839055611071565b611071565b600f5481565b60008080806004356024358082600160a060020a033316600160e060020a031986351634873660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff1615611c9a576109c5565b611ca2610a6c565b9550601454860394508460001415611cb9576109c5565b6014869055600f546b033b2e3c9fd0803ce800000094508414611d84576015549250611ce7600f54866127d2565b9350611cf56015548561271b565b6015819055600254600a54600160a060020a03918216926340c10f199290911690611d2c90611d24908861270b565b60175461271b565b60405160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611d6f57600080fd5b6102c65a03f11515611d8057600080fd5b5050505b6010546b033b2e3c9fd0803ce800000014611dac57611da9846110a4601054886127d2565b93505b6b033b2e3c9fd0803ce800000084146109c557611dcb6016548561271b565b601655505050505050565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460008481526019602052604090205433600160a060020a03908116911614611e5357600080fd5b600084815260196020526040902060010154611e6f908461270b565b6000858152601960205260409081902060010191909155600454600160a060020a03169063b753a98c90339086905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b1515611ede57600080fd5b6102c65a03f11515611eef57600080fd5b505050611efb84612423565b1515611f0657600080fd5b6000848152601960205260409020600101541580611f3c57506000848152601960205260409020600101546611c37937e0800090115b151561107157600080fd5b600e5481565b600954600160a060020a031681565b601254610100900460ff1681565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff1615611fd057600080fd5b600084815260196020526040902060010154611fec9084612782565b6000858152601960205260409081902060010191909155600454600160a060020a03169063f2d5d56b90339086905160e060020a63ffffffff8516028152600160a060020a0390921660048301526024820152604401600060405180830381600087803b151561205b57600080fd5b6102c65a03f1151561206c57600080fd5b5050506000848152601960205260409020600101541580611f3c57506000848152601960205260409020600101546611c37937e08000901161107157600080fd5b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff161561211357600080fd5b60008381526019602052604090205433600160a060020a0390811691161461213a57600080fd5b612143836124d9565b1561215a5761215a83612155856124d9565b611197565b61216383610a70565b1561217a5761217a8361217585610a70565b611dd6565b505060009081526019602052604081208054600160a060020a0319168155600181018290556002810182905560030155565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460008481526019602052604090205433600160a060020a0390811691161461222957600080fd5b600160a060020a038316151561223e57600080fd5b50506000918252601960205260409091208054600160a060020a031916600160a060020a03909216919091179055565b600054600160a060020a031681565b60135481565b600061228d611c32565b5060155490565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a461230033600035600160e060020a031916612615565b151561230b57600080fd5b505060078054600160a060020a031916600160a060020a0392909216919091179055565b600854600160a060020a031681565b600435602435808233600160a060020a031660008035600160e060020a0319169034903660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a46123aa33600035600160e060020a031916612615565b15156123b557600080fd5b505060098054600160a060020a031916600160a060020a0392909216919091179055565b60105481565b600090815260196020526040902054600160a060020a031690565b60006111446017546110a4612283565b60006110a9826110a461241b611548565b601154612792565b60008060008061243d6124346110bb565b6110a487610a70565b6007549093506124b090600160a060020a031663495d32cb6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561248c57600080fd5b6102c65a03f1151561249d57600080fd5b505050604051805190506110a4876124d9565b91506124be82600e5461271b565b90921015949350505050565b600b54600160a060020a031681565b6000818152601960205260408120600201546110a9906110a4612283565b60006004356024358082600160a060020a033316600160e060020a031986351634873660405183815260406020820181815290820183905260608201848480828437820191505094505050505060405180910390a460125460ff161561255c57600080fd5b6125696018546001612782565b6018819055600081815260196020526040908190208054600160a060020a03191633600160a060020a03169081179091559194507f89b8893b806db50897c8e2362c71571cfaeb9761ee40727f683f1793cda9df169085905190815260200160405180910390a2505090565b600a54600160a060020a031681565b6019602052600090815260409020805460018201546002830154600390930154600160a060020a0390921692909184565b600030600160a060020a031683600160a060020a03161415612639575060016110a9565b600154600160a060020a0384811691161415612657575060016110a9565b600054600160a060020a03161515612671575060006110a9565b60008054600160a060020a03169063b7009613908590309086906040516020015260405160e060020a63ffffffff8616028152600160a060020a039384166004820152919092166024820152600160e060020a03199091166044820152606401602060405180830381600087803b15156126ea57600080fd5b6102c65a03f115156126fb57600080fd5b5050506040518051949350505050565b808203828111156110a957600080fd5b60006b033b2e3c9fd0803ce800000061274d612737858561282e565b60026b033b2e3c9fd0803ce80000005b04612782565b81151561275657fe5b049392505050565b60008161274d61277a856b033b2e3c9fd0803ce800000061282e565b600285612747565b808201828110156110a957600080fd5b6000670de0b6b3a764000061274d6127aa858561282e565b6002670de0b6b3a7640000612747565b60008161274d61277a85670de0b6b3a764000061282e565b60006002820615156127f0576b033b2e3c9fd0803ce80000006127f2565b825b90506002820491505b81156110a95761280b838461271b565b9250600282061561282357612820818461271b565b90505b6002820491506127fb565b600081158061284b57505080820282828281151561284857fe5b04145b15156110a957600080fd00a165627a7a72305820ea44dc4fd11cb9cfac4feb3bb7d7020723d56b79a953b9c62e00db617a06e100002900000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a2326035900000000000000000000000079f6d0f646706e1261acf0b93dcb864f357d4680000000000000000000000000f53ad2c6851052a81b42133467480961b2321c09000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc20000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b00000000000000000000000099041f808d598b782d5a3e498681c2452a31da080000000000000000000000009b0f70df76165442ca6092939132bbaea77f2d7a00000000000000000000000069076e44a9c70a67d5b79d95795aba299083c275


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

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000089d24a6b4ccb1b6faa2625fe562bdd9a23260359
Arg [1] : 00000000000000000000000079f6d0f646706e1261acf0b93dcb864f357d4680
Arg [2] : 000000000000000000000000f53ad2c6851052a81b42133467480961b2321c09
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 0000000000000000000000009f8f72aa9304c8b593d555f12ef6589cc3a579a2
Arg [5] : 000000000000000000000000729d19f657bd0614b4985cf1d82531c67569197b
Arg [6] : 00000000000000000000000099041f808d598b782d5a3e498681c2452a31da08
Arg [7] : 0000000000000000000000009b0f70df76165442ca6092939132bbaea77f2d7a
Arg [8] : 00000000000000000000000069076e44a9c70a67d5b79d95795aba299083c275


   Swarm Source:
bzzr://ea44dc4fd11cb9cfac4feb3bb7d7020723d56b79a953b9c62e00db617a06e100
Block Age transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.