Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
This contract has been partially verified via Sourcify.
View contract in Sourcify repository
- Contract name:
- DogFab
- Optimization enabled
- false
- Compiler version
- v0.6.12+commit.27d51765
- EVM Version
- istanbul
- Verified at
- 2026-05-18T09:18:36.712168Z
DogFab.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
/// DssDeploy.sol
// Copyright (C) 2018-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.5.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 DogFab {
function newDog(address owner, address vat) public returns (Dog dog) {
dog = new Dog(vat);
dog.rely(owner);
dog.deny(address(this));
}
}
Compiler Settings
{"remappings":[],"optimizer":{"runs":200,"enabled":false},"metadata":{"bytecodeHash":"ipfs"},"libraries":{},"evmVersion":"istanbul","compilationTarget":{"DogFab.sol":"DogFab"}}
Contract ABI
[{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"address","name":"dog","internalType":"contract Dog"}],"name":"newDog","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"vat","internalType":"address"}]}]
Contract Creation Code
0x608060405234801561001057600080fd5b506121e9806100206000396000f3fe608060405234801561001057600080fd5b506004361061002b5760003560e01c806312147c0f14610030575b600080fd5b6100926004803603604081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000816040516100cd90610214565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015610109573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff166365fae35e846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561017557600080fd5b505af1158015610189573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16639c52a7f1306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156101f657600080fd5b505af115801561020a573d6000803e3d6000fd5b5050505092915050565b611f92806102228339019056fe60a060405234801561001057600080fd5b50604051611f92380380611f928339818101604052602081101561003357600080fd5b81019080805190602001909291905050508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600160038190555060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a25060805160601c611e5b610137600039806109485280611414528061158d52806119bc5250611e5b6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063af7cfeb1116100a2578063d792653811610071578063d79265381461039e578063d9638d36146103e0578063ebecb39d1461044d578063ed998908146104a5578063eda6e121146105275761010b565b8063af7cfeb1146102a2578063bf353dbb146102c0578063c87193f414610318578063d4e8be83146103505761010b565b806365fae35e116100de57806365fae35e146101f25780636924500914610236578063957aa58c146102405780639c52a7f11461025e5761010b565b80631a0b287e1461011057806329ae81141461015257806336569e771461018a578063626cb3c5146101be575b600080fd5b6101506004803603606081101561012657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610545565b005b6101886004803603604081101561016857600080fd5b8101908080359060200190929190803590602001909291905050506107b4565b005b610192610946565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101c661096a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102346004803603602081101561020857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610990565b005b61023e610ace565b005b610248610bb8565b6040518082815260200191505060405180910390f35b6102a06004803603602081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bbe565b005b6102aa610cfc565b6040518082815260200191505060405180910390f35b610302600480360360208110156102d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d02565b6040518082815260200191505060405180910390f35b61034e6004803603604081101561032e57600080fd5b810190808035906020019092919080359060200190929190505050610d1a565b005b61039c6004803603604081101561036657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e56565b005b6103ca600480360360208110156103b457600080fd5b8101908080359060200190929190505050611038565b6040518082815260200191505060405180910390f35b61040c600480360360208110156103f657600080fd5b8101908080359060200190929190505050611058565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104a36004803603606081101561046357600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a8565b005b610511600480360360608110156104bb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611395565b6040518082815260200191505060405180910390f35b61052f611d3d565b6040518082815260200191505060405180910390f35b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f63686f70000000000000000000000000000000000000000000000000000000008214156106bf57670de0b6b3a764000081101561069f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f446f672f66696c652d63686f702d6c742d57414400000000000000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060010181905550610776565b7f686f6c650000000000000000000000000000000000000000000000000000000082141561070757806001600085815260200190815260200160002060020181905550610775565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b5b81837f851aa1caf4888170ad8875449d18f0f512fd6deb2a6571ea1a41fb9f95acbcd1836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f486f6c650000000000000000000000000000000000000000000000000000000082141561089c578060048190555061090a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c7826040518082815260200191505060405180910390a25050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60006003819055507f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda60405160405180910390a1565b60035481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60045481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b610dda60055482611d43565b600581905550610e00600160008481526020019081526020016000206003015482611d43565b6001600084815260200190815260200160002060030181905550817f54f095dc7308776bf01e8580e4dd40fd959ea4bf50b069975768320ef8d77d8a826040518082815260200191505060405180910390a25050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610f0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f766f770000000000000000000000000000000000000000000000000000000000821415610f785780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610fe6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600060016000838152602001908152602001600020600101549050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f636c6970000000000000000000000000000000000000000000000000000000008214156112d3578073ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d60208110156111f457600080fd5b81019080805190602001909291905050508314611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f66696c652d696c6b2d6e65712d636c69702e696c6b0000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611341565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b81837f4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3505050565b600060016003541461140f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6e6f742d6c697665000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632424be5c87876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d60408110156114ca57600080fd5b810190808051906020019092919080519060200190929190505050915091506114f1611dbd565b600160008881526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d9638d368c6040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d60a081101561162657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509091929350905080945081935082955050505060008111801561169357506116878684611d5d565b6116918883611d5d565b105b611705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f446f672f6e6f742d756e7361666500000000000000000000000000000000000081525060200191505060405180910390fd5b60055460045411801561171f575084606001518560400151115b611791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f6c69717569646174696f6e2d6c696d69742d6869740000000000000081525060200191505060405180910390fd5b60006117ad600554600454038760600151886040015103611d89565b90506117e0878760200151866117cb85670de0b6b3a7640000611d5d565b816117d257fe5b04816117da57fe5b04611d89565b94508487111561186957826117f786890386611d5d565b101561180557869450611868565b826118108686611d5d565b1015611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180611dfc602a913960400191505060405180910390fd5b5b5b50506000856118788886611d5d565b8161187f57fe5b049050600081116118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f446f672f6e756c6c2d61756374696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b7f8000000000000000000000000000000000000000000000000000000000000000841115801561194857507f80000000000000000000000000000000000000000000000000000000000000008111155b6119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bab3f408c8c8860000151600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866000038a6000036040518763ffffffff1660e01b8152600401808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019650505050505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b505050506000611ae78585611d5d565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663697efb78826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b505050506000670de0b6b3a7640000611b8f838960200151611d5d565b81611b9657fe5b049050611ba560055482611da3565b600581905550611bb9876060015182611da3565b600160008f815260200190815260200160002060030181905550866000015173ffffffffffffffffffffffffffffffffffffffff1663898eb26782858f8f6040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001945050505050602060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b8101908080519060200190929190505050995050888b73ffffffffffffffffffffffffffffffffffffffff168d7f85258d09e1e4ef299ff3fc11e74af99563f022d21f3f940db982229dc2a3358c8589868c60000151604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a450505050505050509392505050565b60055481565b6000828284039150811115611d5757600080fd5b92915050565b600080821480611d7a5750828283850292508281611d7757fe5b04145b611d8357600080fd5b92915050565b600081831115611d995781611d9b565b825b905092915050565b6000828284019150811015611db757600080fd5b92915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe446f672f64757374792d61756374696f6e2d66726f6d2d7061727469616c2d6c69717569646174696f6ea2646970667358221220754b5334ca9fce7b8537bcb8eb9bcf3b780458d72f8c2ab4f11d1379961ec2e664736f6c634300060c0033a26469706673582212202ac7cd2f2e9a03bdb528883489af1e6962f646245ad68c3bebe7f5f03dd03fb964736f6c634300060c0033
Deployed ByteCode
0x608060405234801561001057600080fd5b506004361061002b5760003560e01c806312147c0f14610030575b600080fd5b6100926004803603604081101561004657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506100be565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6000816040516100cd90610214565b808273ffffffffffffffffffffffffffffffffffffffff168152602001915050604051809103906000f080158015610109573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff166365fae35e846040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561017557600080fd5b505af1158015610189573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff16639c52a7f1306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b1580156101f657600080fd5b505af115801561020a573d6000803e3d6000fd5b5050505092915050565b611f92806102228339019056fe60a060405234801561001057600080fd5b50604051611f92380380611f928339818101604052602081101561003357600080fd5b81019080805190602001909291905050508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050600160038190555060016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055503373ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a25060805160601c611e5b610137600039806109485280611414528061158d52806119bc5250611e5b6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c8063af7cfeb1116100a2578063d792653811610071578063d79265381461039e578063d9638d36146103e0578063ebecb39d1461044d578063ed998908146104a5578063eda6e121146105275761010b565b8063af7cfeb1146102a2578063bf353dbb146102c0578063c87193f414610318578063d4e8be83146103505761010b565b806365fae35e116100de57806365fae35e146101f25780636924500914610236578063957aa58c146102405780639c52a7f11461025e5761010b565b80631a0b287e1461011057806329ae81141461015257806336569e771461018a578063626cb3c5146101be575b600080fd5b6101506004803603606081101561012657600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610545565b005b6101886004803603604081101561016857600080fd5b8101908080359060200190929190803590602001909291905050506107b4565b005b610192610946565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101c661096a565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102346004803603602081101561020857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610990565b005b61023e610ace565b005b610248610bb8565b6040518082815260200191505060405180910390f35b6102a06004803603602081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610bbe565b005b6102aa610cfc565b6040518082815260200191505060405180910390f35b610302600480360360208110156102d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d02565b6040518082815260200191505060405180910390f35b61034e6004803603604081101561032e57600080fd5b810190808035906020019092919080359060200190929190505050610d1a565b005b61039c6004803603604081101561036657600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e56565b005b6103ca600480360360208110156103b457600080fd5b8101908080359060200190929190505050611038565b6040518082815260200191505060405180910390f35b61040c600480360360208110156103f657600080fd5b8101908080359060200190929190505050611058565b604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390f35b6104a36004803603606081101561046357600080fd5b810190808035906020019092919080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506110a8565b005b610511600480360360608110156104bb57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611395565b6040518082815260200191505060405180910390f35b61052f611d3d565b6040518082815260200191505060405180910390f35b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146105f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f63686f70000000000000000000000000000000000000000000000000000000008214156106bf57670de0b6b3a764000081101561069f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f446f672f66696c652d63686f702d6c742d57414400000000000000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060010181905550610776565b7f686f6c650000000000000000000000000000000000000000000000000000000082141561070757806001600085815260200190815260200160002060020181905550610775565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b5b81837f851aa1caf4888170ad8875449d18f0f512fd6deb2a6571ea1a41fb9f95acbcd1836040518082815260200191505060405180910390a3505050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610868576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f486f6c650000000000000000000000000000000000000000000000000000000082141561089c578060048190555061090a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817fe986e40cc8c151830d4f61050f4fb2e4add8567caad2d5f5496f9158e91fe4c7826040518082815260200191505060405180910390a25050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610a44576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60016000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167fdd0e34038ac38b2a1ce960229778ac48a8719bc900b6c4f8d0475c6e8b385a6060405160405180910390a250565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610b82576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60006003819055507f2308ed18a14e800c39b86eb6ea43270105955ca385b603b64eca89f98ae8fbda60405160405180910390a1565b60035481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610c72576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508073ffffffffffffffffffffffffffffffffffffffff167f184450df2e323acec0ed3b5c7531b81f9b4cdef7914dfd4c0a4317416bb5251b60405160405180910390a250565b60045481565b60006020528060005260406000206000915090505481565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610dce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b610dda60055482611d43565b600581905550610e00600160008481526020019081526020016000206003015482611d43565b6001600084815260200190815260200160002060030181905550817f54f095dc7308776bf01e8580e4dd40fd959ea4bf50b069975768320ef8d77d8a826040518082815260200191505060405180910390a25050565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414610f0a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f766f770000000000000000000000000000000000000000000000000000000000821415610f785780600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610fe6565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b817f8fef588b5fc1afbf5b2f06c1a435d513f208da2e6704c3d8f0e0ec91167066ba82604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a25050565b600060016000838152602001908152602001600020600101549050919050565b60016020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020154908060030154905084565b60016000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020541461115c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f446f672f6e6f742d617574686f72697a6564000000000000000000000000000081525060200191505060405180910390fd5b7f636c6970000000000000000000000000000000000000000000000000000000008214156112d3578073ffffffffffffffffffffffffffffffffffffffff1663c5ce281e6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111ca57600080fd5b505afa1580156111de573d6000803e3d6000fd5b505050506040513d60208110156111f457600080fd5b81019080805190602001909291905050508314611279576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f66696c652d696c6b2d6e65712d636c69702e696c6b0000000000000081525060200191505060405180910390fd5b806001600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550611341565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f446f672f66696c652d756e7265636f676e697a65642d706172616d000000000081525060200191505060405180910390fd5b81837f4ff2caaa972a7c6629ea01fae9c93d73cc307d13ea4c369f9bbbb7f9b7e9461d83604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3505050565b600060016003541461140f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6e6f742d6c697665000000000000000000000000000000000000000081525060200191505060405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632424be5c87876040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050604080518083038186803b1580156114a057600080fd5b505afa1580156114b4573d6000803e3d6000fd5b505050506040513d60408110156114ca57600080fd5b810190808051906020019092919080519060200190929190505050915091506114f1611dbd565b600160008881526020019081526020016000206040518060800160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815260200160038201548152505090506000806000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d9638d368c6040518263ffffffff1660e01b81526004018082815260200191505060a06040518083038186803b1580156115fc57600080fd5b505afa158015611610573d6000803e3d6000fd5b505050506040513d60a081101561162657600080fd5b8101908080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291905050509091929350905080945081935082955050505060008111801561169357506116878684611d5d565b6116918883611d5d565b105b611705576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600e8152602001807f446f672f6e6f742d756e7361666500000000000000000000000000000000000081525060200191505060405180910390fd5b60055460045411801561171f575084606001518560400151115b611791576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f446f672f6c69717569646174696f6e2d6c696d69742d6869740000000000000081525060200191505060405180910390fd5b60006117ad600554600454038760600151886040015103611d89565b90506117e0878760200151866117cb85670de0b6b3a7640000611d5d565b816117d257fe5b04816117da57fe5b04611d89565b94508487111561186957826117f786890386611d5d565b101561180557869450611868565b826118108686611d5d565b1015611867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a815260200180611dfc602a913960400191505060405180910390fd5b5b5b50506000856118788886611d5d565b8161187f57fe5b049050600081116118f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260108152602001807f446f672f6e756c6c2d61756374696f6e0000000000000000000000000000000081525060200191505060405180910390fd5b7f8000000000000000000000000000000000000000000000000000000000000000841115801561194857507f80000000000000000000000000000000000000000000000000000000000000008111155b6119ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600c8152602001807f446f672f6f766572666c6f77000000000000000000000000000000000000000081525060200191505060405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16637bab3f408c8c8860000151600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16866000038a6000036040518763ffffffff1660e01b8152600401808781526020018673ffffffffffffffffffffffffffffffffffffffff1681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018281526020019650505050505050600060405180830381600087803b158015611ac357600080fd5b505af1158015611ad7573d6000803e3d6000fd5b505050506000611ae78585611d5d565b9050600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663697efb78826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015611b5e57600080fd5b505af1158015611b72573d6000803e3d6000fd5b505050506000670de0b6b3a7640000611b8f838960200151611d5d565b81611b9657fe5b049050611ba560055482611da3565b600581905550611bb9876060015182611da3565b600160008f815260200190815260200160002060030181905550866000015173ffffffffffffffffffffffffffffffffffffffff1663898eb26782858f8f6040518563ffffffff1660e01b8152600401808581526020018481526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001945050505050602060405180830381600087803b158015611c6e57600080fd5b505af1158015611c82573d6000803e3d6000fd5b505050506040513d6020811015611c9857600080fd5b8101908080519060200190929190505050995050888b73ffffffffffffffffffffffffffffffffffffffff168d7f85258d09e1e4ef299ff3fc11e74af99563f022d21f3f940db982229dc2a3358c8589868c60000151604051808581526020018481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200194505050505060405180910390a450505050505050509392505050565b60055481565b6000828284039150811115611d5757600080fd5b92915050565b600080821480611d7a5750828283850292508281611d7757fe5b04145b611d8357600080fd5b92915050565b600081831115611d995781611d9b565b825b905092915050565b6000828284019150811015611db757600080fd5b92915050565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600081526020016000815260200160008152509056fe446f672f64757374792d61756374696f6e2d66726f6d2d7061727469616c2d6c69717569646174696f6ea2646970667358221220754b5334ca9fce7b8537bcb8eb9bcf3b780458d72f8c2ab4f11d1379961ec2e664736f6c634300060c0033a26469706673582212202ac7cd2f2e9a03bdb528883489af1e6962f646245ad68c3bebe7f5f03dd03fb964736f6c634300060c0033