Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Multi Chain
Multichain Addresses
9 addresses found via
Latest 25 from a total of 254 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Tax Single | 17424438 | 114 days 10 hrs ago | IN | 0 ETH | 0.00224328 | ||||
Tax Single | 15678482 | 359 days 8 hrs ago | IN | 0 ETH | 0.00110039 | ||||
Tax Single | 15219414 | 429 days 15 hrs ago | IN | 0 ETH | 0.00263188 | ||||
Tax Single | 15195103 | 433 days 11 hrs ago | IN | 0 ETH | 0.002358 | ||||
Tax Single | 15111875 | 446 days 8 hrs ago | IN | 0 ETH | 0.00328284 | ||||
Tax Single | 14946251 | 474 days 12 hrs ago | IN | 0 ETH | 0.00242951 | ||||
Tax Single | 14938758 | 475 days 19 hrs ago | IN | 0 ETH | 0.0099815 | ||||
Tax Single | 14923455 | 478 days 10 hrs ago | IN | 0 ETH | 0.00695325 | ||||
Tax Single | 14903854 | 481 days 18 hrs ago | IN | 0 ETH | 0.00471661 | ||||
Tax Single | 14896776 | 482 days 22 hrs ago | IN | 0 ETH | 0.00439607 | ||||
Tax Single | 14890586 | 483 days 22 hrs ago | IN | 0 ETH | 0.00589125 | ||||
Tax Single | 14872698 | 486 days 20 hrs ago | IN | 0 ETH | 0.00364706 | ||||
Tax Single | 14866613 | 487 days 20 hrs ago | IN | 0 ETH | 0.00258477 | ||||
Tax Single | 14812311 | 496 days 16 hrs ago | IN | 0 ETH | 0.00747419 | ||||
Tax Single | 14752965 | 506 days 4 hrs ago | IN | 0 ETH | 0.00430282 | ||||
Tax Single | 14745112 | 507 days 10 hrs ago | IN | 0 ETH | 0.0075083 | ||||
Tax Single | 14736081 | 508 days 20 hrs ago | IN | 0 ETH | 0.00283984 | ||||
Tax Single | 14719222 | 511 days 13 hrs ago | IN | 0 ETH | 0.0069173 | ||||
Tax Single | 14712272 | 512 days 15 hrs ago | IN | 0 ETH | 0.007133 | ||||
Tax Single | 14704394 | 513 days 21 hrs ago | IN | 0 ETH | 0.00663581 | ||||
Tax Single | 14698024 | 514 days 21 hrs ago | IN | 0 ETH | 0.00664755 | ||||
Tax Single | 14685419 | 516 days 21 hrs ago | IN | 0 ETH | 0.00406745 | ||||
Tax Single | 14679010 | 517 days 21 hrs ago | IN | 0 ETH | 0.00378725 | ||||
Tax Single | 14672702 | 518 days 21 hrs ago | IN | 0 ETH | 0.00392341 | ||||
Tax Single | 14658984 | 521 days 1 hr ago | IN | 0 ETH | 0.00442307 |
Latest 1 internal transaction
Parent Txn Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
11848434 | 957 days 20 hrs ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
TaxCollector
Compiler Version
v0.6.7+commit.b8d736ae
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-13 */ // 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.6.7; abstract contract StructLike { function val(uint256 _id) virtual public view returns (uint256); } /** * @title LinkedList (Structured Link List) * @author Vittorio Minacori (https://github.com/vittominacori) * @dev A utility library for using sorted linked list data structures in your Solidity project. */ library LinkedList { uint256 private constant NULL = 0; uint256 private constant HEAD = 0; bool private constant PREV = false; bool private constant NEXT = true; struct List { mapping(uint256 => mapping(bool => uint256)) list; } /** * @dev Checks if the list exists * @param self stored linked list from contract * @return bool true if list exists, false otherwise */ function isList(List storage self) internal view returns (bool) { // if the head nodes previous or next pointers both point to itself, then there are no items in the list if (self.list[HEAD][PREV] != HEAD || self.list[HEAD][NEXT] != HEAD) { return true; } else { return false; } } /** * @dev Checks if the node exists * @param self stored linked list from contract * @param _node a node to search for * @return bool true if node exists, false otherwise */ function isNode(List storage self, uint256 _node) internal view returns (bool) { if (self.list[_node][PREV] == HEAD && self.list[_node][NEXT] == HEAD) { if (self.list[HEAD][NEXT] == _node) { return true; } else { return false; } } else { return true; } } /** * @dev Returns the number of elements in the list * @param self stored linked list from contract * @return uint256 */ function range(List storage self) internal view returns (uint256) { uint256 i; uint256 num; (, i) = adj(self, HEAD, NEXT); while (i != HEAD) { (, i) = adj(self, i, NEXT); num++; } return num; } /** * @dev Returns the links of a node as a tuple * @param self stored linked list from contract * @param _node id of the node to get * @return bool, uint256, uint256 true if node exists or false otherwise, previous node, next node */ function node(List storage self, uint256 _node) internal view returns (bool, uint256, uint256) { if (!isNode(self, _node)) { return (false, 0, 0); } else { return (true, self.list[_node][PREV], self.list[_node][NEXT]); } } /** * @dev Returns the link of a node `_node` in direction `_direction`. * @param self stored linked list from contract * @param _node id of the node to step from * @param _direction direction to step in * @return bool, uint256 true if node exists or false otherwise, node in _direction */ function adj(List storage self, uint256 _node, bool _direction) internal view returns (bool, uint256) { if (!isNode(self, _node)) { return (false, 0); } else { return (true, self.list[_node][_direction]); } } /** * @dev Returns the link of a node `_node` in direction `NEXT`. * @param self stored linked list from contract * @param _node id of the node to step from * @return bool, uint256 true if node exists or false otherwise, next node */ function next(List storage self, uint256 _node) internal view returns (bool, uint256) { return adj(self, _node, NEXT); } /** * @dev Returns the link of a node `_node` in direction `PREV`. * @param self stored linked list from contract * @param _node id of the node to step from * @return bool, uint256 true if node exists or false otherwise, previous node */ function prev(List storage self, uint256 _node) internal view returns (bool, uint256) { return adj(self, _node, PREV); } /** * @dev Can be used before `insert` to build an ordered list. * @dev Get the node and then `back` or `face` basing on your list order. * @dev If you want to order basing on other than `structure.val()` override this function * @param self stored linked list from contract * @param _struct the structure instance * @param _val value to seek * @return uint256 next node with a value less than StructLike(_struct).val(next_) */ function sort(List storage self, address _struct, uint256 _val) internal view returns (uint256) { if (range(self) == 0) { return 0; } bool exists; uint256 next_; (exists, next_) = adj(self, HEAD, NEXT); while ((next_ != 0) && ((_val < StructLike(_struct).val(next_)) != NEXT)) { next_ = self.list[next_][NEXT]; } return next_; } /** * @dev Creates a bidirectional link between two nodes on direction `_direction` * @param self stored linked list from contract * @param _node first node for linking * @param _link node to link to in the _direction */ function form(List storage self, uint256 _node, uint256 _link, bool _dir) internal { self.list[_link][!_dir] = _node; self.list[_node][_dir] = _link; } /** * @dev Insert node `_new` beside existing node `_node` in direction `_direction`. * @param self stored linked list from contract * @param _node existing node * @param _new new node to insert * @param _direction direction to insert node in * @return bool true if success, false otherwise */ function insert(List storage self, uint256 _node, uint256 _new, bool _direction) internal returns (bool) { if (!isNode(self, _new) && isNode(self, _node)) { uint256 c = self.list[_node][_direction]; form(self, _node, _new, _direction); form(self, _new, c, _direction); return true; } else { return false; } } /** * @dev Insert node `_new` beside existing node `_node` in direction `NEXT`. * @param self stored linked list from contract * @param _node existing node * @param _new new node to insert * @return bool true if success, false otherwise */ function face(List storage self, uint256 _node, uint256 _new) internal returns (bool) { return insert(self, _node, _new, NEXT); } /** * @dev Insert node `_new` beside existing node `_node` in direction `PREV`. * @param self stored linked list from contract * @param _node existing node * @param _new new node to insert * @return bool true if success, false otherwise */ function back(List storage self, uint256 _node, uint256 _new) internal returns (bool) { return insert(self, _node, _new, PREV); } /** * @dev Removes an entry from the linked list * @param self stored linked list from contract * @param _node node to remove from the list * @return uint256 the removed node */ function del(List storage self, uint256 _node) internal returns (uint256) { if ((_node == NULL) || (!isNode(self, _node))) { return 0; } form(self, self.list[_node][PREV], self.list[_node][NEXT], NEXT); delete self.list[_node][PREV]; delete self.list[_node][NEXT]; return _node; } /** * @dev Pushes an entry to the head or tail of the linked list * @param self stored linked list from contract * @param _node new entry to push to the head * @param _direction push to the head (NEXT) or tail (PREV) * @return bool true if success, false otherwise */ function push(List storage self, uint256 _node, bool _direction) internal returns (bool) { return insert(self, HEAD, _node, _direction); } /** * @dev Pops the first entry from the linked list * @param self stored linked list from contract * @param _direction pop from the head (NEXT) or the tail (PREV) * @return uint256 the removed node */ function pop(List storage self, bool _direction) internal returns (uint256) { bool exists; uint256 adj_; (exists, adj_) = adj(self, HEAD, _direction); return del(self, adj_); } } abstract contract SAFEEngineLike { function collateralTypes(bytes32) virtual public view returns ( uint256 debtAmount, // [wad] uint256 accumulatedRate // [ray] ); function updateAccumulatedRate(bytes32,address,int256) virtual external; function coinBalance(address) virtual public view returns (uint256); } contract TaxCollector { using LinkedList for LinkedList.List; // --- Auth --- mapping (address => uint256) public authorizedAccounts; /** * @notice Add auth to an account * @param account Account to add auth to */ function addAuthorization(address account) external isAuthorized { authorizedAccounts[account] = 1; emit AddAuthorization(account); } /** * @notice Remove auth from an account * @param account Account to remove auth from */ function removeAuthorization(address account) external isAuthorized { authorizedAccounts[account] = 0; emit RemoveAuthorization(account); } /** * @notice Checks whether msg.sender can call an authed function **/ modifier isAuthorized { require(authorizedAccounts[msg.sender] == 1, "TaxCollector/account-not-authorized"); _; } // --- Events --- event AddAuthorization(address account); event RemoveAuthorization(address account); event InitializeCollateralType(bytes32 collateralType); event ModifyParameters( bytes32 collateralType, bytes32 parameter, uint256 data ); event ModifyParameters(bytes32 parameter, uint256 data); event ModifyParameters(bytes32 parameter, address data); event ModifyParameters( bytes32 collateralType, uint256 position, uint256 val ); event ModifyParameters( bytes32 collateralType, uint256 position, uint256 taxPercentage, address receiverAccount ); event AddSecondaryReceiver( bytes32 indexed collateralType, uint256 secondaryReceiverNonce, uint256 latestSecondaryReceiver, uint256 secondaryReceiverAllotedTax, uint256 secondaryReceiverRevenueSources ); event ModifySecondaryReceiver( bytes32 indexed collateralType, uint256 secondaryReceiverNonce, uint256 latestSecondaryReceiver, uint256 secondaryReceiverAllotedTax, uint256 secondaryReceiverRevenueSources ); event CollectTax(bytes32 indexed collateralType, uint256 latestAccumulatedRate, int256 deltaRate); event DistributeTax(bytes32 indexed collateralType, address indexed target, int256 taxCut); // --- Data --- struct CollateralType { // Per second borrow rate for this specific collateral type uint256 stabilityFee; // When SF was last collected for this collateral type uint256 updateTime; } // SF receiver struct TaxReceiver { // Whether this receiver can accept a negative rate (taking SF from it) uint256 canTakeBackTax; // [bool] // Percentage of SF allocated to this receiver uint256 taxPercentage; // [ray%] } // Data about each collateral type mapping (bytes32 => CollateralType) public collateralTypes; // Percentage of each collateral's SF that goes to other addresses apart from the primary receiver mapping (bytes32 => uint256) public secondaryReceiverAllotedTax; // [%ray] // Whether an address is already used for a tax receiver mapping (address => uint256) public usedSecondaryReceiver; // [bool] // Address associated to each tax receiver index mapping (uint256 => address) public secondaryReceiverAccounts; // How many collateral types send SF to a specific tax receiver mapping (address => uint256) public secondaryReceiverRevenueSources; // Tax receiver data mapping (bytes32 => mapping(uint256 => TaxReceiver)) public secondaryTaxReceivers; address public primaryTaxReceiver; // Base stability fee charged to all collateral types uint256 public globalStabilityFee; // [ray%] // Number of secondary tax receivers ever added uint256 public secondaryReceiverNonce; // Max number of secondarytax receivers a collateral type can have uint256 public maxSecondaryReceivers; // Latest secondary tax receiver that still has at least one revenue source uint256 public latestSecondaryReceiver; // All collateral types bytes32[] public collateralList; // Linked list with tax receiver data LinkedList.List internal secondaryReceiverList; SAFEEngineLike public safeEngine; // --- Init --- constructor(address safeEngine_) public { authorizedAccounts[msg.sender] = 1; safeEngine = SAFEEngineLike(safeEngine_); emit AddAuthorization(msg.sender); } // --- Math --- function rpow(uint256 x, uint256 n, uint256 b) internal pure returns (uint256 z) { assembly { switch x case 0 {switch n case 0 {z := b} default {z := 0}} default { switch mod(n, 2) case 0 { z := b } default { z := x } let half := div(b, 2) // for rounding. for { n := div(n, 2) } n { n := div(n,2) } { let xx := mul(x, x) if iszero(eq(div(xx, x), x)) { revert(0,0) } let xxRound := add(xx, half) if lt(xxRound, xx) { revert(0,0) } x := div(xxRound, b) if mod(n,2) { let zx := mul(z, x) if and(iszero(iszero(x)), iszero(eq(div(zx, x), z))) { revert(0,0) } let zxRound := add(zx, half) if lt(zxRound, zx) { revert(0,0) } z := div(zxRound, b) } } } } } uint256 constant RAY = 10 ** 27; uint256 constant WHOLE_TAX_CUT = 10 ** 29; uint256 constant ONE = 1; int256 constant INT256_MIN = -2**255; function addition(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x + y; require(z >= x, "TaxCollector/add-uint-uint-overflow"); } function addition(int256 x, int256 y) internal pure returns (int256 z) { z = x + y; if (y <= 0) require(z <= x, "TaxCollector/add-int-int-underflow"); if (y > 0) require(z > x, "TaxCollector/add-int-int-overflow"); } function subtract(uint256 x, uint256 y) internal pure returns (uint256 z) { require((z = x - y) <= x, "TaxCollector/sub-uint-uint-underflow"); } function subtract(int256 x, int256 y) internal pure returns (int256 z) { z = x - y; require(y <= 0 || z <= x, "TaxCollector/sub-int-int-underflow"); require(y >= 0 || z >= x, "TaxCollector/sub-int-int-overflow"); } function deduct(uint256 x, uint256 y) internal pure returns (int256 z) { z = int256(x) - int256(y); require(int256(x) >= 0 && int256(y) >= 0, "TaxCollector/ded-invalid-numbers"); } function multiply(uint256 x, int256 y) internal pure returns (int256 z) { z = int256(x) * y; require(int256(x) >= 0, "TaxCollector/mul-uint-int-invalid-x"); require(y == 0 || z / y == int256(x), "TaxCollector/mul-uint-int-overflow"); } function multiply(int256 x, int256 y) internal pure returns (int256 z) { require(!both(x == -1, y == INT256_MIN), "TaxCollector/mul-int-int-overflow"); require(y == 0 || (z = x * y) / y == x, "TaxCollector/mul-int-int-invalid"); } function rmultiply(uint256 x, uint256 y) internal pure returns (uint256 z) { z = x * y; require(y == 0 || z / y == x, "TaxCollector/rmul-overflow"); z = z / RAY; } // --- Boolean Logic --- function both(bool x, bool y) internal pure returns (bool z) { assembly{ z := and(x, y)} } function either(bool x, bool y) internal pure returns (bool z) { assembly{ z := or(x, y)} } // --- Administration --- /** * @notice Initialize a brand new collateral type * @param collateralType Collateral type name (e.g ETH-A, TBTC-B) */ function initializeCollateralType(bytes32 collateralType) external isAuthorized { CollateralType storage collateralType_ = collateralTypes[collateralType]; require(collateralType_.stabilityFee == 0, "TaxCollector/collateral-type-already-init"); collateralType_.stabilityFee = RAY; collateralType_.updateTime = now; collateralList.push(collateralType); emit InitializeCollateralType(collateralType); } /** * @notice Modify collateral specific uint256 params * @param collateralType Collateral type who's parameter is modified * @param parameter The name of the parameter modified * @param data New value for the parameter */ function modifyParameters( bytes32 collateralType, bytes32 parameter, uint256 data ) external isAuthorized { require(now == collateralTypes[collateralType].updateTime, "TaxCollector/update-time-not-now"); if (parameter == "stabilityFee") collateralTypes[collateralType].stabilityFee = data; else revert("TaxCollector/modify-unrecognized-param"); emit ModifyParameters( collateralType, parameter, data ); } /** * @notice Modify general uint256 params * @param parameter The name of the parameter modified * @param data New value for the parameter */ function modifyParameters(bytes32 parameter, uint256 data) external isAuthorized { if (parameter == "globalStabilityFee") globalStabilityFee = data; else if (parameter == "maxSecondaryReceivers") maxSecondaryReceivers = data; else revert("TaxCollector/modify-unrecognized-param"); emit ModifyParameters(parameter, data); } /** * @notice Modify general address params * @param parameter The name of the parameter modified * @param data New value for the parameter */ function modifyParameters(bytes32 parameter, address data) external isAuthorized { require(data != address(0), "TaxCollector/null-data"); if (parameter == "primaryTaxReceiver") primaryTaxReceiver = data; else revert("TaxCollector/modify-unrecognized-param"); emit ModifyParameters(parameter, data); } /** * @notice Set whether a tax receiver can incur negative fees * @param collateralType Collateral type giving fees to the tax receiver * @param position Receiver position in the list * @param val Value that specifies whether a tax receiver can incur negative rates */ function modifyParameters( bytes32 collateralType, uint256 position, uint256 val ) external isAuthorized { if (both(secondaryReceiverList.isNode(position), secondaryTaxReceivers[collateralType][position].taxPercentage > 0)) { secondaryTaxReceivers[collateralType][position].canTakeBackTax = val; } else revert("TaxCollector/unknown-tax-receiver"); emit ModifyParameters( collateralType, position, val ); } /** * @notice Create or modify a secondary tax receiver's data * @param collateralType Collateral type that will give SF to the tax receiver * @param position Receiver position in the list. Used to determine whether a new tax receiver is created or an existing one is edited * @param taxPercentage Percentage of SF offered to the tax receiver * @param receiverAccount Receiver address */ function modifyParameters( bytes32 collateralType, uint256 position, uint256 taxPercentage, address receiverAccount ) external isAuthorized { (!secondaryReceiverList.isNode(position)) ? addSecondaryReceiver(collateralType, taxPercentage, receiverAccount) : modifySecondaryReceiver(collateralType, position, taxPercentage); emit ModifyParameters( collateralType, position, taxPercentage, receiverAccount ); } // --- Tax Receiver Utils --- /** * @notice Add a new secondary tax receiver * @param collateralType Collateral type that will give SF to the tax receiver * @param taxPercentage Percentage of SF offered to the tax receiver * @param receiverAccount Tax receiver address */ function addSecondaryReceiver(bytes32 collateralType, uint256 taxPercentage, address receiverAccount) internal { require(receiverAccount != address(0), "TaxCollector/null-account"); require(receiverAccount != primaryTaxReceiver, "TaxCollector/primary-receiver-cannot-be-secondary"); require(taxPercentage > 0, "TaxCollector/null-sf"); require(usedSecondaryReceiver[receiverAccount] == 0, "TaxCollector/account-already-used"); require(addition(secondaryReceiversAmount(), ONE) <= maxSecondaryReceivers, "TaxCollector/exceeds-max-receiver-limit"); require(addition(secondaryReceiverAllotedTax[collateralType], taxPercentage) < WHOLE_TAX_CUT, "TaxCollector/tax-cut-exceeds-hundred"); secondaryReceiverNonce = addition(secondaryReceiverNonce, 1); latestSecondaryReceiver = secondaryReceiverNonce; usedSecondaryReceiver[receiverAccount] = ONE; secondaryReceiverAllotedTax[collateralType] = addition(secondaryReceiverAllotedTax[collateralType], taxPercentage); secondaryTaxReceivers[collateralType][latestSecondaryReceiver].taxPercentage = taxPercentage; secondaryReceiverAccounts[latestSecondaryReceiver] = receiverAccount; secondaryReceiverRevenueSources[receiverAccount] = ONE; secondaryReceiverList.push(latestSecondaryReceiver, false); emit AddSecondaryReceiver( collateralType, secondaryReceiverNonce, latestSecondaryReceiver, secondaryReceiverAllotedTax[collateralType], secondaryReceiverRevenueSources[receiverAccount] ); } /** * @notice Update a secondary tax receiver's data (add a new SF source or modify % of SF taken from a collateral type) * @param collateralType Collateral type that will give SF to the tax receiver * @param position Receiver's position in the tax receiver list * @param taxPercentage Percentage of SF offered to the tax receiver (ray%) */ function modifySecondaryReceiver(bytes32 collateralType, uint256 position, uint256 taxPercentage) internal { if (taxPercentage == 0) { secondaryReceiverAllotedTax[collateralType] = subtract( secondaryReceiverAllotedTax[collateralType], secondaryTaxReceivers[collateralType][position].taxPercentage ); if (secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] == 1) { if (position == latestSecondaryReceiver) { (, uint256 prevReceiver) = secondaryReceiverList.prev(latestSecondaryReceiver); latestSecondaryReceiver = prevReceiver; } secondaryReceiverList.del(position); delete(usedSecondaryReceiver[secondaryReceiverAccounts[position]]); delete(secondaryTaxReceivers[collateralType][position]); delete(secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]]); delete(secondaryReceiverAccounts[position]); } else if (secondaryTaxReceivers[collateralType][position].taxPercentage > 0) { secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] = subtract(secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]], 1); delete(secondaryTaxReceivers[collateralType][position]); } } else { uint256 secondaryReceiverAllotedTax_ = addition( subtract(secondaryReceiverAllotedTax[collateralType], secondaryTaxReceivers[collateralType][position].taxPercentage), taxPercentage ); require(secondaryReceiverAllotedTax_ < WHOLE_TAX_CUT, "TaxCollector/tax-cut-too-big"); if (secondaryTaxReceivers[collateralType][position].taxPercentage == 0) { secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] = addition( secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]], 1 ); } secondaryReceiverAllotedTax[collateralType] = secondaryReceiverAllotedTax_; secondaryTaxReceivers[collateralType][position].taxPercentage = taxPercentage; } emit ModifySecondaryReceiver( collateralType, secondaryReceiverNonce, latestSecondaryReceiver, secondaryReceiverAllotedTax[collateralType], secondaryReceiverRevenueSources[secondaryReceiverAccounts[position]] ); } // --- Tax Collection Utils --- /** * @notice Check if multiple collateral types are up to date with taxation */ function collectedManyTax(uint256 start, uint256 end) public view returns (bool ok) { require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes"); for (uint256 i = start; i <= end; i++) { if (now > collateralTypes[collateralList[i]].updateTime) { ok = false; return ok; } } ok = true; } /** * @notice Check how much SF will be charged (to collateral types between indexes 'start' and 'end' * in the collateralList) during the next taxation * @param start Index in collateralList from which to start looping and calculating the tax outcome * @param end Index in collateralList at which we stop looping and calculating the tax outcome */ function taxManyOutcome(uint256 start, uint256 end) public view returns (bool ok, int256 rad) { require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes"); int256 primaryReceiverBalance = -int256(safeEngine.coinBalance(primaryTaxReceiver)); int256 deltaRate; uint256 debtAmount; for (uint256 i = start; i <= end; i++) { if (now > collateralTypes[collateralList[i]].updateTime) { (debtAmount, ) = safeEngine.collateralTypes(collateralList[i]); (, deltaRate) = taxSingleOutcome(collateralList[i]); rad = addition(rad, multiply(debtAmount, deltaRate)); } } if (rad < 0) { ok = (rad < primaryReceiverBalance) ? false : true; } else { ok = true; } } /** * @notice Get how much SF will be distributed after taxing a specific collateral type * @param collateralType Collateral type to compute the taxation outcome for * @return The newly accumulated rate as well as the delta between the new and the last accumulated rates */ function taxSingleOutcome(bytes32 collateralType) public view returns (uint256, int256) { (, uint256 lastAccumulatedRate) = safeEngine.collateralTypes(collateralType); uint256 newlyAccumulatedRate = rmultiply( rpow( addition( globalStabilityFee, collateralTypes[collateralType].stabilityFee ), subtract( now, collateralTypes[collateralType].updateTime ), RAY), lastAccumulatedRate); return (newlyAccumulatedRate, deduct(newlyAccumulatedRate, lastAccumulatedRate)); } // --- Tax Receiver Utils --- /** * @notice Get the secondary tax receiver list length */ function secondaryReceiversAmount() public view returns (uint256) { return secondaryReceiverList.range(); } /** * @notice Get the collateralList length */ function collateralListLength() public view returns (uint256) { return collateralList.length; } /** * @notice Check if a tax receiver is at a certain position in the list */ function isSecondaryReceiver(uint256 _receiver) public view returns (bool) { if (_receiver == 0) return false; return secondaryReceiverList.isNode(_receiver); } // --- Tax (Stability Fee) Collection --- /** * @notice Collect tax from multiple collateral types at once * @param start Index in collateralList from which to start looping and calculating the tax outcome * @param end Index in collateralList at which we stop looping and calculating the tax outcome */ function taxMany(uint256 start, uint256 end) external { require(both(start <= end, end < collateralList.length), "TaxCollector/invalid-indexes"); for (uint256 i = start; i <= end; i++) { taxSingle(collateralList[i]); } } /** * @notice Collect tax from a single collateral type * @param collateralType Collateral type to tax */ function taxSingle(bytes32 collateralType) public returns (uint256) { uint256 latestAccumulatedRate; if (now <= collateralTypes[collateralType].updateTime) { (, latestAccumulatedRate) = safeEngine.collateralTypes(collateralType); return latestAccumulatedRate; } (, int256 deltaRate) = taxSingleOutcome(collateralType); // Check how much debt has been generated for collateralType (uint256 debtAmount, ) = safeEngine.collateralTypes(collateralType); splitTaxIncome(collateralType, debtAmount, deltaRate); (, latestAccumulatedRate) = safeEngine.collateralTypes(collateralType); collateralTypes[collateralType].updateTime = now; emit CollectTax(collateralType, latestAccumulatedRate, deltaRate); return latestAccumulatedRate; } /** * @notice Split SF between all tax receivers * @param collateralType Collateral type to distribute SF for * @param deltaRate Difference between the last and the latest accumulate rates for the collateralType */ function splitTaxIncome(bytes32 collateralType, uint256 debtAmount, int256 deltaRate) internal { // Start looping from the latest tax receiver uint256 currentSecondaryReceiver = latestSecondaryReceiver; // While we still haven't gone through the entire tax receiver list while (currentSecondaryReceiver > 0) { // If the current tax receiver should receive SF from collateralType if (secondaryTaxReceivers[collateralType][currentSecondaryReceiver].taxPercentage > 0) { distributeTax( collateralType, secondaryReceiverAccounts[currentSecondaryReceiver], currentSecondaryReceiver, debtAmount, deltaRate ); } // Continue looping (, currentSecondaryReceiver) = secondaryReceiverList.prev(currentSecondaryReceiver); } // Distribute to primary receiver distributeTax(collateralType, primaryTaxReceiver, uint256(-1), debtAmount, deltaRate); } /** * @notice Give/withdraw SF from a tax receiver * @param collateralType Collateral type to distribute SF for * @param receiver Tax receiver address * @param receiverListPosition Position of receiver in the secondaryReceiverList (if the receiver is secondary) * @param debtAmount Total debt currently issued * @param deltaRate Difference between the latest and the last accumulated rates for the collateralType */ function distributeTax( bytes32 collateralType, address receiver, uint256 receiverListPosition, uint256 debtAmount, int256 deltaRate ) internal { require(safeEngine.coinBalance(receiver) < 2**255, "TaxCollector/coin-balance-does-not-fit-into-int256"); // Check how many coins the receiver has and negate the value int256 coinBalance = -int256(safeEngine.coinBalance(receiver)); // Compute the % out of SF that should be allocated to the receiver int256 currentTaxCut = (receiver == primaryTaxReceiver) ? multiply(subtract(WHOLE_TAX_CUT, secondaryReceiverAllotedTax[collateralType]), deltaRate) / int256(WHOLE_TAX_CUT) : multiply(int256(secondaryTaxReceivers[collateralType][receiverListPosition].taxPercentage), deltaRate) / int256(WHOLE_TAX_CUT); /** If SF is negative and a tax receiver doesn't have enough coins to absorb the loss, compute a new tax cut that can be absorbed **/ currentTaxCut = ( both(multiply(debtAmount, currentTaxCut) < 0, coinBalance > multiply(debtAmount, currentTaxCut)) ) ? coinBalance / int256(debtAmount) : currentTaxCut; /** If the tax receiver's tax cut is not null and if the receiver accepts negative SF offer/take SF to/from them **/ if (currentTaxCut != 0) { if ( either( receiver == primaryTaxReceiver, either( deltaRate >= 0, both(currentTaxCut < 0, secondaryTaxReceivers[collateralType][receiverListPosition].canTakeBackTax > 0) ) ) ) { safeEngine.updateAccumulatedRate(collateralType, receiver, currentTaxCut); emit DistributeTax(collateralType, receiver, currentTaxCut); } } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"safeEngine_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"AddAuthorization","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"latestSecondaryReceiver","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverAllotedTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverRevenueSources","type":"uint256"}],"name":"AddSecondaryReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"latestAccumulatedRate","type":"uint256"},{"indexed":false,"internalType":"int256","name":"deltaRate","type":"int256"}],"name":"CollectTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"int256","name":"taxCut","type":"int256"}],"name":"DistributeTax","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"InitializeCollateralType","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"data","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"parameter","type":"bytes32"},{"indexed":false,"internalType":"address","name":"data","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"val","type":"uint256"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"position","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"taxPercentage","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiverAccount","type":"address"}],"name":"ModifyParameters","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverNonce","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"latestSecondaryReceiver","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverAllotedTax","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"secondaryReceiverRevenueSources","type":"uint256"}],"name":"ModifySecondaryReceiver","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"RemoveAuthorization","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"authorizedAccounts","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"collateralList","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"collateralListLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"collateralTypes","outputs":[{"internalType":"uint256","name":"stabilityFee","type":"uint256"},{"internalType":"uint256","name":"updateTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"collectedManyTax","outputs":[{"internalType":"bool","name":"ok","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"globalStabilityFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"initializeCollateralType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_receiver","type":"uint256"}],"name":"isSecondaryReceiver","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestSecondaryReceiver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSecondaryReceivers","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"uint256","name":"taxPercentage","type":"uint256"},{"internalType":"address","name":"receiverAccount","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"uint256","name":"position","type":"uint256"},{"internalType":"uint256","name":"val","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"address","name":"data","type":"address"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"},{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"parameter","type":"bytes32"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"modifyParameters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"primaryTaxReceiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeAuthorization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"safeEngine","outputs":[{"internalType":"contract SAFEEngineLike","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryReceiverAccounts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"secondaryReceiverAllotedTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryReceiverNonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"secondaryReceiverRevenueSources","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"secondaryReceiversAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"secondaryTaxReceivers","outputs":[{"internalType":"uint256","name":"canTakeBackTax","type":"uint256"},{"internalType":"uint256","name":"taxPercentage","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"taxMany","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"end","type":"uint256"}],"name":"taxManyOutcome","outputs":[{"internalType":"bool","name":"ok","type":"bool"},{"internalType":"int256","name":"rad","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"taxSingle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"collateralType","type":"bytes32"}],"name":"taxSingleOutcome","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"usedSecondaryReceiver","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
608060405234801561001057600080fd5b506040516128e33803806128e38339818101604052602081101561003357600080fd5b5051336000818152602081815260409182902060019055600e80546001600160a01b0319166001600160a01b038616179055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a15061283d806100a66000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c806392a448a211610104578063d07900bb116100a2578063de8b062111610071578063de8b06211461052e578063e372ee4414610554578063f0cccf4314610577578063fe4f58901461057f576101da565b8063d07900bb146104ae578063d4b9311d146104cb578063d54635f4146104f4578063dd9dbe3114610511576101da565b8063b7536364116100de578063b753636414610455578063bf4320491461045d578063c78c829514610465578063cc780be214610488576101da565b806392a448a2146103eb57806394f3f81d14610427578063abfbc5b01461044d576101da565b8063498fb99a1161017c5780635e4128581161014b5780635e4128581461037d5780636614f0101461039a57806367aea313146103c65780636c50dbba146103ce576101da565b8063498fb99a14610313578063542f76a61461031b578063555ec74f1461032357806356c057641461034c576101da565b806324ba5884116101b857806324ba58841461026c5780632697dce2146102925780633024a912146102d057806335b28153146102ed576101da565b806315f5fb48146101df578063203dcb581461021857806324341e0114610232575b600080fd5b6101fc600480360360208110156101f557600080fd5b50356105a2565b604080516001600160a01b039092168252519081900360200190f35b6102206105bd565b60408051918252519081900360200190f35b61026a6004803603608081101561024857600080fd5b50803590602081013590604081013590606001356001600160a01b03166105c3565b005b6102206004803603602081101561028257600080fd5b50356001600160a01b0316610697565b6102b5600480360360408110156102a857600080fd5b50803590602001356106a9565b60408051921515835260208301919091528051918290030190f35b610220600480360360208110156102e657600080fd5b50356108dd565b61026a6004803603602081101561030357600080fd5b50356001600160a01b03166108fb565b61022061099b565b6101fc6109a1565b61026a6004803603606081101561033957600080fd5b50803590602081013590604001356109b0565b6103696004803603602081101561036257600080fd5b5035610ad8565b604080519115158252519081900360200190f35b61026a6004803603602081101561039357600080fd5b5035610b00565b61026a600480360360408110156103b057600080fd5b50803590602001356001600160a01b0316610c1b565b6101fc610d78565b610220600480360360208110156103e457600080fd5b5035610d87565b61040e6004803603604081101561040157600080fd5b5080359060200135610f89565b6040805192835260208301919091528051918290030190f35b61026a6004803603602081101561043d57600080fd5b50356001600160a01b0316610fad565b61022061104c565b610220611052565b610220611058565b6103696004803603604081101561047b57600080fd5b5080359060200135611069565b6102206004803603602081101561049e57600080fd5b50356001600160a01b031661112c565b61040e600480360360208110156104c457600080fd5b503561113e565b61026a600480360360608110156104e157600080fd5b5080359060208101359060400135611157565b6102206004803603602081101561050a57600080fd5b5035611278565b61040e6004803603602081101561052757600080fd5b503561128a565b6102206004803603602081101561054457600080fd5b50356001600160a01b0316611380565b61026a6004803603604081101561056a57600080fd5b5080359060200135611392565b61022061142d565b61026a6004803603604081101561059557600080fd5b5080359060200135611433565b6004602052600090815260409020546001600160a01b031681565b600b5481565b336000908152602081905260409020546001146106115760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610622600d8463ffffffff61150d16565b1561063757610632848484611585565b610642565b6106428483836118ef565b60408051858152602081018590528082018490526001600160a01b038316606082015290517fdd816bbb74e9c8d56d70daaa112136781e45da3cedaf93060401b5fa79cc21059181900360800190a150505050565b60006020819052908152604090205481565b6000806106c083851115600c805490508510611c21565b610711576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b600e5460075460408051633eaf7a0360e21b81526001600160a01b0392831660048201529051600093929092169163fabde80c91602480820192602092909190829003018186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d602081101561078f57600080fd5b50516000908103915080865b8681116108ac5760016000600c83815481106107b357fe5b90600052602060002001548152602001908152602001600020600101544211156108a457600e54600c80546001600160a01b039092169163d07900bb9190849081106107fb57fe5b90600052602060002001546040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d604081101561086357600080fd5b5051600c805491935061088a918390811061087a57fe5b906000526020600020015461128a565b93506108a190508561089c8486611c25565b611cb8565b94505b60010161079b565b5060008412156108ce578284126108c45760016108c7565b60005b94506108d3565b600194505b5050509250929050565b600c81815481106108ea57fe5b600091825260209091200154905081565b336000908152602081905260409020546001146109495760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b6007546001600160a01b031681565b336000908152602081905260409020546001146109fe5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610a36610a12600d8463ffffffff61150d16565b60008581526006602090815260408083208784529091529020600101541515611c21565b15610a5c5760008381526006602090815260408083208584529091529020819055610a93565b60405162461bcd60e51b815260040180806020018281038252602181526020018061268d6021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fab4951554135af54806ae8b8c0860008dbf001b33208f80e3ef0e8a54d23528b9181900360600190a1505050565b600081610ae757506000610afb565b610af8600d8363ffffffff61150d16565b90505b919050565b33600090815260208190526040902054600114610b4e5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6000818152600160205260409020805415610b9a5760405162461bcd60e51b81526004018080602001828103825260298152602001806126ae6029913960400191505060405180910390fd5b6b033b2e3c9fd0803ce8000000815542600180830191909155600c805491820181556000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018290556040805183815290517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359181900360200190a15050565b33600090815260208190526040902054600114610c695760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b038116610cbd576040805162461bcd60e51b8152602060048201526016602482015275546178436f6c6c6563746f722f6e756c6c2d6461746160501b604482015290519081900360640190fd5b8171383934b6b0b93caa30bc2932b1b2b4bb32b960711b1415610cfa57600780546001600160a01b0319166001600160a01b038316179055610d31565b60405162461bcd60e51b815260040180806020018281038252602681526020018061261c6026913960400191505060405180910390fd5b604080518381526001600160a01b038316602082015281517fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1929181900390910190a15050565b600e546001600160a01b031681565b60008181526001602081905260408220015481904211610e2257600e546040805163d07900bb60e01b81526004810186905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6040811015610e1457600080fd5b50602001519150610afb9050565b6000610e2d8461128a565b600e546040805163d07900bb60e01b8152600481018990528151939550600094506001600160a01b039092169263d07900bb926024808201939291829003018186803b158015610e7c57600080fd5b505afa158015610e90573d6000803e3d6000fd5b505050506040513d6040811015610ea657600080fd5b50519050610eb5858284611d49565b600e546040805163d07900bb60e01b81526004810188905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610efe57600080fd5b505afa158015610f12573d6000803e3d6000fd5b505050506040513d6040811015610f2857600080fd5b5060209081015160008781526001808452604091829020429101558051828152928301859052805191955087927f584c2e3a292b065d3d3a0edd7e25bb572b4c171192c33ab9c3b0f5d4448adf8b929081900390910190a250909392505050565b60066020908152600092835260408084209091529082529020805460019091015482565b33600090815260208190526040902054600114610ffb5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b60095481565b600c5490565b6000611064600d611dd7565b905090565b600061107f82841115600c805490508410611c21565b6110d0576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b825b8281116111205760016000600c83815481106110ea57fe5b9060005260206000200154815260200190815260200160002060010154421115611118575060009050611126565b6001016110d2565b50600190505b92915050565b60056020526000908152604090205481565b6001602081905260009182526040909120805491015482565b336000908152602081905260409020546001146111a55760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b60008381526001602081905260409091200154421461120b576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f7570646174652d74696d652d6e6f742d6e6f77604482015290519081900360640190fd5b816b73746162696c69747946656560a01b1415610cfa576000838152600160205260409020819055604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b60026020526000908152604090205481565b600e546040805163d07900bb60e01b8152600481018490528151600093849384936001600160a01b039092169263d07900bb926024808201939291829003018186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d604081101561130357600080fd5b50602090810151600854600087815260019093526040832054919350611368916113629161133091611e11565b61135042600160008b815260200190815260200160002060010154611e53565b6b033b2e3c9fd0803ce8000000611e95565b83611f53565b9050806113758284611fd1565b935093505050915091565b60036020526000908152604090205481565b600c546113a59082841115908310611c21565b6113f6576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b815b8181116114285761141f600c828154811061140f57fe5b9060005260206000200154610d87565b506001016113f8565b505050565b600a5481565b336000908152602081905260409020546001146114815760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b8171676c6f62616c53746162696c69747946656560701b14156114a85760088190556114ce565b81746d61785365636f6e6461727952656365697665727360581b1415610cfa57600a8190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b600081815260208381526040808320838052909152812054158015611548575060008281526020848152604080832060018452909152902054155b1561157d576000808052602084815260408083206001845290915290205482141561157557506001611126565b506000611126565b506001611126565b806117325760008381526002602090815260408083205460068352818420868552909252909120600101546115ba9190611e53565b60008481526002602090815260408083209390935584825260048152828220546001600160a01b031682526005905220546001141561169957600b5482141561161b576000611615600b54600d61203790919063ffffffff16565b600b5550505b61162c600d8363ffffffff61205116565b50600082815260046020818152604080842080546001600160a01b03908116865260038452828620869055888652600684528286208887528452828620868155600101869055815416855260058352908420849055928590525280546001600160a01b031916905561172d565b60008381526006602090815260408083208584529091529020600101541561172d576000828152600460209081526040808320546001600160a01b0316835260059091529020546116eb906001611e53565b6000838152600460209081526040808320546001600160a01b031683526005825280832093909355858252600681528282208583529052908120818155600101555b61186d565b6000838152600260209081526040808320546006835281842086855290925282206001015461176a9161176491611e53565b83611e11565b90506c01431e0fae6d7217caa000000081106117cd576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f7461782d6375742d746f6f2d62696700000000604482015290519081900360640190fd5b6000848152600660209081526040808320868452909152902060010154611844576000838152600460209081526040808320546001600160a01b03168352600590915290205461181e906001611e11565b6000848152600460209081526040808320546001600160a01b0316835260059091529020555b600084815260026020908152604080832093909355600681528282208583529052206001018190555b600954600b5460008581526002602090815260408083205487845260048352818420546001600160a01b031684526005835292819020548151958652918501939093528383019190915260608301525184917f93dd084738077accc9983c441821583d23638cfa27021cdfc189cf3a583810a9919081900360800190a2505050565b6001600160a01b03811661194a576040805162461bcd60e51b815260206004820152601960248201527f546178436f6c6c6563746f722f6e756c6c2d6163636f756e7400000000000000604482015290519081900360640190fd5b6007546001600160a01b03828116911614156119975760405162461bcd60e51b81526004018080602001828103825260318152602001806126d76031913960400191505060405180910390fd5b600082116119e3576040805162461bcd60e51b81526020600482015260146024820152732a30bc21b7b63632b1ba37b917b73ab63616b9b360611b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611a385760405162461bcd60e51b81526004018080602001828103825260218152602001806125d96021913960400191505060405180910390fd5b600a54611a4d611a46611058565b6001611e11565b1115611a8a5760405162461bcd60e51b81526004018080602001828103825260278152602001806126666027913960400191505060405180910390fd5b6000838152600260205260409020546c01431e0fae6d7217caa000000090611ab29084611e11565b10611aee5760405162461bcd60e51b81526004018080602001828103825260248152602001806127b26024913960400191505060405180910390fd5b611afb6009546001611e11565b6009819055600b556001600160a01b0381166000908152600360209081526040808320600190558583526002909152902054611b379083611e11565b60008481526002602090815260408083209390935560068152828220600b805484529082528383206001908101879055815484526004835284842080546001600160a01b0319166001600160a01b03881690811790915584526005909252928220559054611ba891600d91906120cf565b50600954600b546000858152600260209081526040808320546001600160a01b03871684526005835292819020548151958652918501939093528383019190915260608301525184917f086fff5d978796ef618ca584578a9142f3990d864bc943358a776080e73f754f919081900360800190a2505050565b1690565b8181026000831215611c685760405162461bcd60e51b815260040180806020018281038252602381526020018061276c6023913960400191505060405180910390fd5b811580611c7d575082828281611c7a57fe5b05145b6111265760405162461bcd60e51b815260040180806020018281038252602281526020018061274a6022913960400191505060405180910390fd5b81810160008213611d025782811315611d025760405162461bcd60e51b81526004018080602001828103825260228152602001806125fa6022913960400191505060405180910390fd5b6000821315611126578281136111265760405162461bcd60e51b81526004018080602001828103825260218152602001806127296021913960400191505060405180910390fd5b600b545b8015611db557600084815260066020908152604080832084845290915290206001015415611d9b57600081815260046020526040902054611d9b9085906001600160a01b03168386866120e6565b611dac600d8263ffffffff61203716565b9150611d4d9050565b600754611dd19085906001600160a01b031660001986866120e6565b50505050565b6000806000611de98460006001612416565b9250505b8115611e0a57611dff84836001612416565b925050600101611ded565b9392505050565b818101828110156111265760405162461bcd60e51b81526004018080602001828103825260238152602001806125b66023913960400191505060405180910390fd5b808203828111156111265760405162461bcd60e51b81526004018080602001828103825260248152602001806126426024913960400191505060405180910390fd5b6000838015611f3557600184168015611eb057859250611eb4565b8392505b50600283046002850494505b8415611f2f578586028687820414611ed757600080fd5b81810181811015611ee757600080fd5b8590049650506001851615611f24578583028387820414158715151615611f0d57600080fd5b81810181811015611f1d57600080fd5b8590049350505b600285049450611ec0565b50611f4b565b838015611f455760009250611f49565b8392505b505b509392505050565b818102811580611f6b575082828281611f6857fe5b04145b611fbc576040805162461bcd60e51b815260206004820152601a60248201527f546178436f6c6c6563746f722f726d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6b033b2e3c9fd0803ce8000000900492915050565b80820360008312801590611fe6575060008212155b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6465642d696e76616c69642d6e756d62657273604482015290519081900360640190fd5b60008061204684846000612416565b915091509250929050565b60008115806120675750612065838361150d565b155b1561207457506000611126565b60008281526020848152604080832083805290915280822054600180845291909220546120a592869290919061245a565b50600081815260209283526040808220828052909352828120819055600181529182209190915590565b60006120de846000858561248b565b949350505050565b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600160ff1b93929092169163fabde80c91602480820192602092909190829003018186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d602081101561216457600080fd5b5051106121a25760405162461bcd60e51b81526004018080602001828103825260328152602001806127d66032913960400191505060405180910390fd5b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600093929092169163fabde80c91602480820192602092909190829003018186803b1580156121f357600080fd5b505afa158015612207573d6000803e3d6000fd5b505050506040513d602081101561221d57600080fd5b5051600754600091820392506001600160a01b0387811691161461227e5760008781526006602090815260408083208884529091529020600101546c01431e0fae6d7217caa00000009061227190856124f5565b8161227857fe5b056122c8565b6c01431e0fae6d7217caa00000006122bf6122b96c01431e0fae6d7217caa0000000600260008c815260200190815260200160002054611e53565b85611c25565b816122c657fe5b055b90506122eb60006122d98684611c25565b126122e48684611c25565b8413611c21565b6122f55780612300565b8382816122fe57fe5b055b9050801561240d576007546000888152600660209081526040808320898452909152812054612353926001600160a01b038a81169116149161234e9181881215918391908712901515611c21565b6125b1565b1561240d57600e5460408051630e9e11d360e01b8152600481018a90526001600160a01b0389811660248301526044820185905291519190921691630e9e11d391606480830192600092919082900301818387803b1580156123b457600080fd5b505af11580156123c8573d6000803e3d6000fd5b50506040805184815290516001600160a01b038a1693508a92507f6d8843b6550b78e189b1bbdd8e46d5163232388e76a545e02013acb1879b3a459181900360200190a35b50505050505050565b600080612423858561150d565b61243257506000905080612452565b505060008281526020848152604080832084151584529091529020546001905b935093915050565b6000828152602085815260408083209315808452938252808320869055948252948552838120911581529352912055565b6000612497858461150d565b1580156124a957506124a9858561150d565b156124ea5760008481526020868152604080832085151584529091529020546124d48686868661245a565b6124e08685838661245a565b60019150506120de565b506000949350505050565b600061250b8360001914600160ff1b8414611c21565b156125475760405162461bcd60e51b81526004018080602001828103825260218152602001806127086021913960400191505060405180910390fd5b8115806125605750508082028282828161255d57fe5b05145b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6d756c2d696e742d696e742d696e76616c6964604482015290519081900360640190fd5b179056fe546178436f6c6c6563746f722f6164642d75696e742d75696e742d6f766572666c6f77546178436f6c6c6563746f722f6163636f756e742d616c72656164792d75736564546178436f6c6c6563746f722f6164642d696e742d696e742d756e646572666c6f77546178436f6c6c6563746f722f6d6f646966792d756e7265636f676e697a65642d706172616d546178436f6c6c6563746f722f7375622d75696e742d75696e742d756e646572666c6f77546178436f6c6c6563746f722f657863656564732d6d61782d72656365697665722d6c696d6974546178436f6c6c6563746f722f756e6b6e6f776e2d7461782d7265636569766572546178436f6c6c6563746f722f636f6c6c61746572616c2d747970652d616c72656164792d696e6974546178436f6c6c6563746f722f7072696d6172792d72656365697665722d63616e6e6f742d62652d7365636f6e64617279546178436f6c6c6563746f722f6d756c2d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6164642d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d696e76616c69642d78546178436f6c6c6563746f722f6163636f756e742d6e6f742d617574686f72697a6564546178436f6c6c6563746f722f7461782d6375742d657863656564732d68756e64726564546178436f6c6c6563746f722f636f696e2d62616c616e63652d646f65732d6e6f742d6669742d696e746f2d696e74323536a26469706673582212203776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d564736f6c63430006070033000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101da5760003560e01c806392a448a211610104578063d07900bb116100a2578063de8b062111610071578063de8b06211461052e578063e372ee4414610554578063f0cccf4314610577578063fe4f58901461057f576101da565b8063d07900bb146104ae578063d4b9311d146104cb578063d54635f4146104f4578063dd9dbe3114610511576101da565b8063b7536364116100de578063b753636414610455578063bf4320491461045d578063c78c829514610465578063cc780be214610488576101da565b806392a448a2146103eb57806394f3f81d14610427578063abfbc5b01461044d576101da565b8063498fb99a1161017c5780635e4128581161014b5780635e4128581461037d5780636614f0101461039a57806367aea313146103c65780636c50dbba146103ce576101da565b8063498fb99a14610313578063542f76a61461031b578063555ec74f1461032357806356c057641461034c576101da565b806324ba5884116101b857806324ba58841461026c5780632697dce2146102925780633024a912146102d057806335b28153146102ed576101da565b806315f5fb48146101df578063203dcb581461021857806324341e0114610232575b600080fd5b6101fc600480360360208110156101f557600080fd5b50356105a2565b604080516001600160a01b039092168252519081900360200190f35b6102206105bd565b60408051918252519081900360200190f35b61026a6004803603608081101561024857600080fd5b50803590602081013590604081013590606001356001600160a01b03166105c3565b005b6102206004803603602081101561028257600080fd5b50356001600160a01b0316610697565b6102b5600480360360408110156102a857600080fd5b50803590602001356106a9565b60408051921515835260208301919091528051918290030190f35b610220600480360360208110156102e657600080fd5b50356108dd565b61026a6004803603602081101561030357600080fd5b50356001600160a01b03166108fb565b61022061099b565b6101fc6109a1565b61026a6004803603606081101561033957600080fd5b50803590602081013590604001356109b0565b6103696004803603602081101561036257600080fd5b5035610ad8565b604080519115158252519081900360200190f35b61026a6004803603602081101561039357600080fd5b5035610b00565b61026a600480360360408110156103b057600080fd5b50803590602001356001600160a01b0316610c1b565b6101fc610d78565b610220600480360360208110156103e457600080fd5b5035610d87565b61040e6004803603604081101561040157600080fd5b5080359060200135610f89565b6040805192835260208301919091528051918290030190f35b61026a6004803603602081101561043d57600080fd5b50356001600160a01b0316610fad565b61022061104c565b610220611052565b610220611058565b6103696004803603604081101561047b57600080fd5b5080359060200135611069565b6102206004803603602081101561049e57600080fd5b50356001600160a01b031661112c565b61040e600480360360208110156104c457600080fd5b503561113e565b61026a600480360360608110156104e157600080fd5b5080359060208101359060400135611157565b6102206004803603602081101561050a57600080fd5b5035611278565b61040e6004803603602081101561052757600080fd5b503561128a565b6102206004803603602081101561054457600080fd5b50356001600160a01b0316611380565b61026a6004803603604081101561056a57600080fd5b5080359060200135611392565b61022061142d565b61026a6004803603604081101561059557600080fd5b5080359060200135611433565b6004602052600090815260409020546001600160a01b031681565b600b5481565b336000908152602081905260409020546001146106115760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610622600d8463ffffffff61150d16565b1561063757610632848484611585565b610642565b6106428483836118ef565b60408051858152602081018590528082018490526001600160a01b038316606082015290517fdd816bbb74e9c8d56d70daaa112136781e45da3cedaf93060401b5fa79cc21059181900360800190a150505050565b60006020819052908152604090205481565b6000806106c083851115600c805490508510611c21565b610711576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b600e5460075460408051633eaf7a0360e21b81526001600160a01b0392831660048201529051600093929092169163fabde80c91602480820192602092909190829003018186803b15801561076557600080fd5b505afa158015610779573d6000803e3d6000fd5b505050506040513d602081101561078f57600080fd5b50516000908103915080865b8681116108ac5760016000600c83815481106107b357fe5b90600052602060002001548152602001908152602001600020600101544211156108a457600e54600c80546001600160a01b039092169163d07900bb9190849081106107fb57fe5b90600052602060002001546040518263ffffffff1660e01b815260040180828152602001915050604080518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d604081101561086357600080fd5b5051600c805491935061088a918390811061087a57fe5b906000526020600020015461128a565b93506108a190508561089c8486611c25565b611cb8565b94505b60010161079b565b5060008412156108ce578284126108c45760016108c7565b60005b94506108d3565b600194505b5050509250929050565b600c81815481106108ea57fe5b600091825260209091200154905081565b336000908152602081905260409020546001146109495760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b0381166000818152602081815260409182902060019055815192835290517f599a298163e1678bb1c676052a8930bf0b8a1261ed6e01b8a2391e55f70001029281900390910190a150565b60085481565b6007546001600160a01b031681565b336000908152602081905260409020546001146109fe5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b610a36610a12600d8463ffffffff61150d16565b60008581526006602090815260408083208784529091529020600101541515611c21565b15610a5c5760008381526006602090815260408083208584529091529020819055610a93565b60405162461bcd60e51b815260040180806020018281038252602181526020018061268d6021913960400191505060405180910390fd5b604080518481526020810184905280820183905290517fab4951554135af54806ae8b8c0860008dbf001b33208f80e3ef0e8a54d23528b9181900360600190a1505050565b600081610ae757506000610afb565b610af8600d8363ffffffff61150d16565b90505b919050565b33600090815260208190526040902054600114610b4e5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6000818152600160205260409020805415610b9a5760405162461bcd60e51b81526004018080602001828103825260298152602001806126ae6029913960400191505060405180910390fd5b6b033b2e3c9fd0803ce8000000815542600180830191909155600c805491820181556000527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018290556040805183815290517f715b265758bcd4ecd311bede8dcca05c4b5819e0a2a5c4103abd702862ae2c359181900360200190a15050565b33600090815260208190526040902054600114610c695760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b038116610cbd576040805162461bcd60e51b8152602060048201526016602482015275546178436f6c6c6563746f722f6e756c6c2d6461746160501b604482015290519081900360640190fd5b8171383934b6b0b93caa30bc2932b1b2b4bb32b960711b1415610cfa57600780546001600160a01b0319166001600160a01b038316179055610d31565b60405162461bcd60e51b815260040180806020018281038252602681526020018061261c6026913960400191505060405180910390fd5b604080518381526001600160a01b038316602082015281517fd91f38cf03346b5dc15fb60f9076f866295231ad3c3841a1051f8443f25170d1929181900390910190a15050565b600e546001600160a01b031681565b60008181526001602081905260408220015481904211610e2257600e546040805163d07900bb60e01b81526004810186905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610dea57600080fd5b505afa158015610dfe573d6000803e3d6000fd5b505050506040513d6040811015610e1457600080fd5b50602001519150610afb9050565b6000610e2d8461128a565b600e546040805163d07900bb60e01b8152600481018990528151939550600094506001600160a01b039092169263d07900bb926024808201939291829003018186803b158015610e7c57600080fd5b505afa158015610e90573d6000803e3d6000fd5b505050506040513d6040811015610ea657600080fd5b50519050610eb5858284611d49565b600e546040805163d07900bb60e01b81526004810188905281516001600160a01b039093169263d07900bb92602480840193919291829003018186803b158015610efe57600080fd5b505afa158015610f12573d6000803e3d6000fd5b505050506040513d6040811015610f2857600080fd5b5060209081015160008781526001808452604091829020429101558051828152928301859052805191955087927f584c2e3a292b065d3d3a0edd7e25bb572b4c171192c33ab9c3b0f5d4448adf8b929081900390910190a250909392505050565b60066020908152600092835260408084209091529082529020805460019091015482565b33600090815260208190526040902054600114610ffb5760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b6001600160a01b03811660008181526020818152604080832092909255815192835290517f8834a87e641e9716be4f34527af5d23e11624f1ddeefede6ad75a9acfc31b9039281900390910190a150565b60095481565b600c5490565b6000611064600d611dd7565b905090565b600061107f82841115600c805490508410611c21565b6110d0576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b825b8281116111205760016000600c83815481106110ea57fe5b9060005260206000200154815260200190815260200160002060010154421115611118575060009050611126565b6001016110d2565b50600190505b92915050565b60056020526000908152604090205481565b6001602081905260009182526040909120805491015482565b336000908152602081905260409020546001146111a55760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b60008381526001602081905260409091200154421461120b576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f7570646174652d74696d652d6e6f742d6e6f77604482015290519081900360640190fd5b816b73746162696c69747946656560a01b1415610cfa576000838152600160205260409020819055604080518481526020810184905280820183905290517fc59b1109b54f213212d2f5af5c1dae5e887f9daa63b595578fae847cb048e8f49181900360600190a1505050565b60026020526000908152604090205481565b600e546040805163d07900bb60e01b8152600481018490528151600093849384936001600160a01b039092169263d07900bb926024808201939291829003018186803b1580156112d957600080fd5b505afa1580156112ed573d6000803e3d6000fd5b505050506040513d604081101561130357600080fd5b50602090810151600854600087815260019093526040832054919350611368916113629161133091611e11565b61135042600160008b815260200190815260200160002060010154611e53565b6b033b2e3c9fd0803ce8000000611e95565b83611f53565b9050806113758284611fd1565b935093505050915091565b60036020526000908152604090205481565b600c546113a59082841115908310611c21565b6113f6576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f696e76616c69642d696e646578657300000000604482015290519081900360640190fd5b815b8181116114285761141f600c828154811061140f57fe5b9060005260206000200154610d87565b506001016113f8565b505050565b600a5481565b336000908152602081905260409020546001146114815760405162461bcd60e51b815260040180806020018281038252602381526020018061278f6023913960400191505060405180910390fd5b8171676c6f62616c53746162696c69747946656560701b14156114a85760088190556114ce565b81746d61785365636f6e6461727952656365697665727360581b1415610cfa57600a8190555b604080518381526020810183905281517fac7c5c1afaef770ec56ac6268cd3f2fbb1035858ead2601d6553157c33036c3a929181900390910190a15050565b600081815260208381526040808320838052909152812054158015611548575060008281526020848152604080832060018452909152902054155b1561157d576000808052602084815260408083206001845290915290205482141561157557506001611126565b506000611126565b506001611126565b806117325760008381526002602090815260408083205460068352818420868552909252909120600101546115ba9190611e53565b60008481526002602090815260408083209390935584825260048152828220546001600160a01b031682526005905220546001141561169957600b5482141561161b576000611615600b54600d61203790919063ffffffff16565b600b5550505b61162c600d8363ffffffff61205116565b50600082815260046020818152604080842080546001600160a01b03908116865260038452828620869055888652600684528286208887528452828620868155600101869055815416855260058352908420849055928590525280546001600160a01b031916905561172d565b60008381526006602090815260408083208584529091529020600101541561172d576000828152600460209081526040808320546001600160a01b0316835260059091529020546116eb906001611e53565b6000838152600460209081526040808320546001600160a01b031683526005825280832093909355858252600681528282208583529052908120818155600101555b61186d565b6000838152600260209081526040808320546006835281842086855290925282206001015461176a9161176491611e53565b83611e11565b90506c01431e0fae6d7217caa000000081106117cd576040805162461bcd60e51b815260206004820152601c60248201527f546178436f6c6c6563746f722f7461782d6375742d746f6f2d62696700000000604482015290519081900360640190fd5b6000848152600660209081526040808320868452909152902060010154611844576000838152600460209081526040808320546001600160a01b03168352600590915290205461181e906001611e11565b6000848152600460209081526040808320546001600160a01b0316835260059091529020555b600084815260026020908152604080832093909355600681528282208583529052206001018190555b600954600b5460008581526002602090815260408083205487845260048352818420546001600160a01b031684526005835292819020548151958652918501939093528383019190915260608301525184917f93dd084738077accc9983c441821583d23638cfa27021cdfc189cf3a583810a9919081900360800190a2505050565b6001600160a01b03811661194a576040805162461bcd60e51b815260206004820152601960248201527f546178436f6c6c6563746f722f6e756c6c2d6163636f756e7400000000000000604482015290519081900360640190fd5b6007546001600160a01b03828116911614156119975760405162461bcd60e51b81526004018080602001828103825260318152602001806126d76031913960400191505060405180910390fd5b600082116119e3576040805162461bcd60e51b81526020600482015260146024820152732a30bc21b7b63632b1ba37b917b73ab63616b9b360611b604482015290519081900360640190fd5b6001600160a01b03811660009081526003602052604090205415611a385760405162461bcd60e51b81526004018080602001828103825260218152602001806125d96021913960400191505060405180910390fd5b600a54611a4d611a46611058565b6001611e11565b1115611a8a5760405162461bcd60e51b81526004018080602001828103825260278152602001806126666027913960400191505060405180910390fd5b6000838152600260205260409020546c01431e0fae6d7217caa000000090611ab29084611e11565b10611aee5760405162461bcd60e51b81526004018080602001828103825260248152602001806127b26024913960400191505060405180910390fd5b611afb6009546001611e11565b6009819055600b556001600160a01b0381166000908152600360209081526040808320600190558583526002909152902054611b379083611e11565b60008481526002602090815260408083209390935560068152828220600b805484529082528383206001908101879055815484526004835284842080546001600160a01b0319166001600160a01b03881690811790915584526005909252928220559054611ba891600d91906120cf565b50600954600b546000858152600260209081526040808320546001600160a01b03871684526005835292819020548151958652918501939093528383019190915260608301525184917f086fff5d978796ef618ca584578a9142f3990d864bc943358a776080e73f754f919081900360800190a2505050565b1690565b8181026000831215611c685760405162461bcd60e51b815260040180806020018281038252602381526020018061276c6023913960400191505060405180910390fd5b811580611c7d575082828281611c7a57fe5b05145b6111265760405162461bcd60e51b815260040180806020018281038252602281526020018061274a6022913960400191505060405180910390fd5b81810160008213611d025782811315611d025760405162461bcd60e51b81526004018080602001828103825260228152602001806125fa6022913960400191505060405180910390fd5b6000821315611126578281136111265760405162461bcd60e51b81526004018080602001828103825260218152602001806127296021913960400191505060405180910390fd5b600b545b8015611db557600084815260066020908152604080832084845290915290206001015415611d9b57600081815260046020526040902054611d9b9085906001600160a01b03168386866120e6565b611dac600d8263ffffffff61203716565b9150611d4d9050565b600754611dd19085906001600160a01b031660001986866120e6565b50505050565b6000806000611de98460006001612416565b9250505b8115611e0a57611dff84836001612416565b925050600101611ded565b9392505050565b818101828110156111265760405162461bcd60e51b81526004018080602001828103825260238152602001806125b66023913960400191505060405180910390fd5b808203828111156111265760405162461bcd60e51b81526004018080602001828103825260248152602001806126426024913960400191505060405180910390fd5b6000838015611f3557600184168015611eb057859250611eb4565b8392505b50600283046002850494505b8415611f2f578586028687820414611ed757600080fd5b81810181811015611ee757600080fd5b8590049650506001851615611f24578583028387820414158715151615611f0d57600080fd5b81810181811015611f1d57600080fd5b8590049350505b600285049450611ec0565b50611f4b565b838015611f455760009250611f49565b8392505b505b509392505050565b818102811580611f6b575082828281611f6857fe5b04145b611fbc576040805162461bcd60e51b815260206004820152601a60248201527f546178436f6c6c6563746f722f726d756c2d6f766572666c6f77000000000000604482015290519081900360640190fd5b6b033b2e3c9fd0803ce8000000900492915050565b80820360008312801590611fe6575060008212155b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6465642d696e76616c69642d6e756d62657273604482015290519081900360640190fd5b60008061204684846000612416565b915091509250929050565b60008115806120675750612065838361150d565b155b1561207457506000611126565b60008281526020848152604080832083805290915280822054600180845291909220546120a592869290919061245a565b50600081815260209283526040808220828052909352828120819055600181529182209190915590565b60006120de846000858561248b565b949350505050565b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600160ff1b93929092169163fabde80c91602480820192602092909190829003018186803b15801561213a57600080fd5b505afa15801561214e573d6000803e3d6000fd5b505050506040513d602081101561216457600080fd5b5051106121a25760405162461bcd60e51b81526004018080602001828103825260328152602001806127d66032913960400191505060405180910390fd5b600e5460408051633eaf7a0360e21b81526001600160a01b0387811660048301529151600093929092169163fabde80c91602480820192602092909190829003018186803b1580156121f357600080fd5b505afa158015612207573d6000803e3d6000fd5b505050506040513d602081101561221d57600080fd5b5051600754600091820392506001600160a01b0387811691161461227e5760008781526006602090815260408083208884529091529020600101546c01431e0fae6d7217caa00000009061227190856124f5565b8161227857fe5b056122c8565b6c01431e0fae6d7217caa00000006122bf6122b96c01431e0fae6d7217caa0000000600260008c815260200190815260200160002054611e53565b85611c25565b816122c657fe5b055b90506122eb60006122d98684611c25565b126122e48684611c25565b8413611c21565b6122f55780612300565b8382816122fe57fe5b055b9050801561240d576007546000888152600660209081526040808320898452909152812054612353926001600160a01b038a81169116149161234e9181881215918391908712901515611c21565b6125b1565b1561240d57600e5460408051630e9e11d360e01b8152600481018a90526001600160a01b0389811660248301526044820185905291519190921691630e9e11d391606480830192600092919082900301818387803b1580156123b457600080fd5b505af11580156123c8573d6000803e3d6000fd5b50506040805184815290516001600160a01b038a1693508a92507f6d8843b6550b78e189b1bbdd8e46d5163232388e76a545e02013acb1879b3a459181900360200190a35b50505050505050565b600080612423858561150d565b61243257506000905080612452565b505060008281526020848152604080832084151584529091529020546001905b935093915050565b6000828152602085815260408083209315808452938252808320869055948252948552838120911581529352912055565b6000612497858461150d565b1580156124a957506124a9858561150d565b156124ea5760008481526020868152604080832085151584529091529020546124d48686868661245a565b6124e08685838661245a565b60019150506120de565b506000949350505050565b600061250b8360001914600160ff1b8414611c21565b156125475760405162461bcd60e51b81526004018080602001828103825260218152602001806127086021913960400191505060405180910390fd5b8115806125605750508082028282828161255d57fe5b05145b611126576040805162461bcd60e51b815260206004820181905260248201527f546178436f6c6c6563746f722f6d756c2d696e742d696e742d696e76616c6964604482015290519081900360640190fd5b179056fe546178436f6c6c6563746f722f6164642d75696e742d75696e742d6f766572666c6f77546178436f6c6c6563746f722f6163636f756e742d616c72656164792d75736564546178436f6c6c6563746f722f6164642d696e742d696e742d756e646572666c6f77546178436f6c6c6563746f722f6d6f646966792d756e7265636f676e697a65642d706172616d546178436f6c6c6563746f722f7375622d75696e742d75696e742d756e646572666c6f77546178436f6c6c6563746f722f657863656564732d6d61782d72656365697665722d6c696d6974546178436f6c6c6563746f722f756e6b6e6f776e2d7461782d7265636569766572546178436f6c6c6563746f722f636f6c6c61746572616c2d747970652d616c72656164792d696e6974546178436f6c6c6563746f722f7072696d6172792d72656365697665722d63616e6e6f742d62652d7365636f6e64617279546178436f6c6c6563746f722f6d756c2d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6164642d696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d6f766572666c6f77546178436f6c6c6563746f722f6d756c2d75696e742d696e742d696e76616c69642d78546178436f6c6c6563746f722f6163636f756e742d6e6f742d617574686f72697a6564546178436f6c6c6563746f722f7461782d6375742d657863656564732d68756e64726564546178436f6c6c6563746f722f636f696e2d62616c616e63652d646f65732d6e6f742d6669742d696e746f2d696e74323536a26469706673582212203776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d564736f6c63430006070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962
-----Decoded View---------------
Arg [0] : safeEngine_ (address): 0xCC88a9d330da1133Df3A7bD823B95e52511A6962
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000cc88a9d330da1133df3a7bd823b95e52511a6962
Deployed Bytecode Sourcemap
9668:26242:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;9668:26242:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;13190:85:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13190:85:0;;:::i;:::-;;;;-1:-1:-1;;;;;13190:85:0;;;;;;;;;;;;;;14083:41;;;:::i;:::-;;;;;;;;;;;;;;;;21500:538;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;21500:538:0;;;;;;;;;;;;;;;;-1:-1:-1;;;;;21500:538:0;;:::i;:::-;;9763:54;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9763:54:0;-1:-1:-1;;;;;9763:54:0;;:::i;28065:846::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28065:846:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;14162:40;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;14162:40:0;;:::i;9927:156::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;9927:156:0;-1:-1:-1;;;;;9927:156:0;;:::i;13667:36::-;;;:::i;13565:::-;;;:::i;20517:533::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;20517:533:0;;;;;;;;;;;;:::i;30415:183::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30415:183:0;;:::i;:::-;;;;;;;;;;;;;;;;;;17901:461;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;17901:461:0;;:::i;19865:341::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19865:341:0;;;;;;-1:-1:-1;;;;;19865:341:0;;:::i;14308:32::-;;;:::i;31343:850::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31343:850:0;;:::i;13475:81::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13475:81:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;10202:162;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;10202:162:0;-1:-1:-1;;;;;10202:162:0;;:::i;13837:40::-;;;:::i;30205:109::-;;;:::i;30014:121::-;;;:::i;27263:404::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;27263:404:0;;;;;;;:::i;13351:91::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13351:91:0;-1:-1:-1;;;;;13351:91:0;;:::i;12654:75::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12654:75:0;;:::i;18626:520::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;18626:520:0;;;;;;;;;;;;:::i;12840:87::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;12840:87:0;;:::i;29220:674::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29220:674:0;;:::i;13019:81::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;13019:81:0;-1:-1:-1;;;;;13019:81:0;;:::i;30943:265::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;30943:265:0;;;;;;;:::i;13956:39::-;;;:::i;19324:363::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;19324:363:0;;;;;;;:::i;13190:85::-;;;;;;;;;;;;-1:-1:-1;;;;;13190:85:0;;:::o;14083:41::-;;;;:::o;21500:538::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21686:38:::1;:21;21715:8:::0;21686:38:::1;:28;:38;:::i;:::-;21685:39;21684:201;;21821:64;21845:14;21861:8;21871:13;21821:23;:64::i;:::-;21684:201;;;21739:68;21760:14;21776:13;21791:15;21739:20;:68::i;:::-;21901:129;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;-1:-1:-1;;;;;21901:129:0;::::1;::::0;;;;;;::::1;::::0;;;;;;;::::1;21500:538:::0;;;;:::o;9763:54::-;;;;;;;;;;;;;;:::o;28065:846::-;28138:7;28147:10;28178:47;28192:3;28183:5;:12;;28203:14;:21;;;;28197:3;:27;28178:4;:47::i;:::-;28170:88;;;;;-1:-1:-1;;;28170:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28310:10;;28333:18;;28310:42;;;-1:-1:-1;;;28310:42:0;;-1:-1:-1;;;;;28333:18:0;;;28310:42;;;;;;28269:30;;28310:10;;;;;:22;;:42;;;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;28310:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28310:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28310:42:0;28302:51;;;;;-1:-1:-1;28302:51:0;28438:5;28421:345;28450:3;28445:1;:8;28421:345;;28483:15;:34;28499:14;28514:1;28499:17;;;;;;;;;;;;;;;;28483:34;;;;;;;;;;;:45;;;28477:3;:51;28473:282;;;28562:10;;28589:14;:17;;-1:-1:-1;;;;;28562:10:0;;;;:26;;28589:14;28604:1;;28589:17;;;;;;;;;;;;;;28562:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;28562:45:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;28562:45:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;28562:45:0;28656:14;:17;;28562:45;;-1:-1:-1;28639:35:0;;28671:1;;28656:17;;;;;;;;;;;;;;28639:16;:35::i;:::-;28622:52;-1:-1:-1;28695:46:0;;-1:-1:-1;28704:3:0;28709:31;28718:10;28622:52;28709:8;:31::i;:::-;28695:8;:46::i;:::-;28689:52;;28473:282;28455:3;;28421:345;;;;28786:1;28780:3;:7;28776:128;;;28814:22;28808:3;:28;28807:45;;28848:4;28807:45;;;28840:5;28807:45;28802:50;;28776:128;;;28888:4;28883:9;;28776:128;28065:846;;;;;;;;:::o;14162:40::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14162:40:0;:::o;9927:156::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10003:27:0;::::1;:18;:27:::0;;;::::1;::::0;;;;;;;;10033:1:::1;10003:31:::0;;10050:25;;;;;;;::::1;::::0;;;;;;;;::::1;9927:156:::0;:::o;13667:36::-;;;;:::o;13565:::-;;;-1:-1:-1;;;;;13565:36:0;;:::o;20517:533::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20669:111:::1;20674:38;:21;20703:8:::0;20674:38:::1;:28;:38;:::i;:::-;20778:1;20714:37:::0;;;:21:::1;:37;::::0;;;;;;;:47;;;;;;;;:61:::1;;::::0;:65;;20669:4:::1;:111::i;:::-;20665:270;;;20797:37;::::0;;;:21:::1;:37;::::0;;;;;;;:47;;;;;;;;:68;;;20665:270:::1;;;20892:43;;-1:-1:-1::0;;;20892:43:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20665:270;20951:91;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;20517:533:::0;;;:::o;30415:183::-;30484:4;30505:14;30501:32;;-1:-1:-1;30528:5:0;30521:12;;30501:32;30551:39;:21;30580:9;30551:39;:28;:39;:::i;:::-;30544:46;;30415:183;;;;:::o;17901:461::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17992:38:::1;18033:31:::0;;;:15:::1;:31;::::0;;;;18083:28;;:33;18075:87:::1;;;;-1:-1:-1::0;;;18075:87:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:8;18173:34:::0;;18249:3:::1;18218:26;::::0;;::::1;:34:::0;;;;18263:14:::1;27:10:-1::0;;23:18;;::::1;45:23:::0;;18173:28:0::1;18263:35:::0;;::::1;::::0;;;18314:40:::1;::::0;;;;;;;::::1;::::0;;;;18263:35:::1;18314:40:::0;;::::1;10584:1;17901:461:::0;:::o;19865:341::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19965:18:0;::::1;19957:53;;;::::0;;-1:-1:-1;;;19957:53:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;19957:53:0;;;;;;;;;;;;;::::1;;20025:9;-1:-1:-1::0;;;20025:33:0::1;20021:128;;;20060:18;:25:::0;;-1:-1:-1;;;;;;20060:25:0::1;-1:-1:-1::0;;;;;20060:25:0;::::1;;::::0;;20021:128:::1;;;20101:48;;-1:-1:-1::0;;;20101:48:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20021:128;20165:33;::::0;;;;;-1:-1:-1;;;;;20165:33:0;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;;;;;;::::1;19865:341:::0;;:::o;14308:32::-;;;-1:-1:-1;;;;;14308:32:0;;:::o;31343:850::-;31402:7;31473:31;;;:15;:31;;;;;;;:42;;31402:7;;31466:3;:49;31462:191;;31558:10;;:42;;;-1:-1:-1;;;31558:42:0;;;;;;;;;;-1:-1:-1;;;;;31558:10:0;;;;:26;;:42;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31558:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31558:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31558:42:0;;;;-1:-1:-1;31613:28:0;;-1:-1:-1;31613:28:0;31462:191;31666:16;31686:32;31703:14;31686:16;:32::i;:::-;31824:10;;:42;;;-1:-1:-1;;;31824:42:0;;;;;;;;;;31663:55;;-1:-1:-1;31800:18:0;;-1:-1:-1;;;;;;31824:10:0;;;;:26;;:42;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31824:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31824:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31824:42:0;;-1:-1:-1;31877:53:0;31892:14;31824:42;31920:9;31877:14;:53::i;:::-;31969:10;;:42;;;-1:-1:-1;;;31969:42:0;;;;;;;;;;-1:-1:-1;;;;;31969:10:0;;;;:26;;:42;;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;31969:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;31969:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;31969:42:0;;;;;32022:31;;;;:15;:31;;;31969:42;32022:31;;;;32067:3;32022:42;;:48;32086:60;;;;;;;;;;;;;31969:42;;-1:-1:-1;32038:14:0;;32086:60;;;;;;;;;;;-1:-1:-1;32164:21:0;;31343:850;-1:-1:-1;;;31343:850:0:o;13475:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10202:162::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;10281:27:0;::::1;10311:1;10281:27:::0;;;::::1;::::0;;;;;;;:31;;;;10328:28;;;;;;;::::1;::::0;;;;;;;;::::1;10202:162:::0;:::o;13837:40::-;;;;:::o;30205:109::-;30285:14;:21;30205:109;:::o;30014:121::-;30071:7;30098:29;:21;:27;:29::i;:::-;30091:36;;30014:121;:::o;27263:404::-;27338:7;27366:47;27380:3;27371:5;:12;;27391:14;:21;;;;27385:3;:27;27366:4;:47::i;:::-;27358:88;;;;;-1:-1:-1;;;27358:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;27474:5;27457:183;27486:3;27481:1;:8;27457:183;;27519:15;:34;27535:14;27550:1;27535:17;;;;;;;;;;;;;;;;27519:34;;;;;;;;;;;:45;;;27513:3;:51;27509:120;;;-1:-1:-1;27586:5:0;;-1:-1:-1;27606:9:0;;27509:120;27491:3;;27457:183;;;;27655:4;27650:9;;27263:404;;;;;:::o;13351:91::-;;;;;;;;;;;;;:::o;12654:75::-;;;;;;;;;;;;;;;;;;;;:::o;18626:520::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18791:31:::1;::::0;;;:15:::1;:31;::::0;;;;;;;:42:::1;::::0;18784:3:::1;:49;18776:94;;;::::0;;-1:-1:-1;;;18776:94:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;18885:9;-1:-1:-1::0;;;18885:27:0::1;18881:148;;;18914:31;::::0;;;:15:::1;:31;::::0;;;;:51;;;19045:93:::1;::::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;::::1;::::0;;;;;;;::::1;18626:520:::0;;;:::o;12840:87::-;;;;;;;;;;;;;:::o;29220:674::-;29353:10;;:42;;;-1:-1:-1;;;29353:42:0;;;;;;;;;;29291:7;;;;;;-1:-1:-1;;;;;29353:10:0;;;;:26;;:42;;;;;;;;;;;;:10;:42;;;2:2:-1;;;;27:1;24;17:12;2:2;29353:42:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;29353:42:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;29353:42:0;;;;;29520:18;;29406:28;29557:31;;;:15;:31;;;29353:42;29557:31;;:44;29353:42;;-1:-1:-1;29448:347:0;;29472:290;;29493:125;;:8;:125::i;:::-;29635:108;29662:3;29684:15;:31;29700:14;29684:31;;;;;;;;;;;:42;;;29635:8;:108::i;:::-;15532:8;29472:4;:290::i;:::-;29775:19;29448:9;:347::i;:::-;29406:389;;29814:20;29836:49;29843:20;29865:19;29836:6;:49::i;:::-;29806:80;;;;;;29220:674;;;:::o;13019:81::-;;;;;;;;;;;;;:::o;30943:265::-;31041:14;:21;31016:47;;31021:12;;;;;31035:27;;31016:4;:47::i;:::-;31008:88;;;;;-1:-1:-1;;;31008:88:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;31124:5;31107:94;31136:3;31131:1;:8;31107:94;;31161:28;31171:14;31186:1;31171:17;;;;;;;;;;;;;;;;31161:9;:28::i;:::-;-1:-1:-1;31141:3:0;;31107:94;;;;30943:265;;:::o;13956:39::-;;;;:::o;19324:363::-;10517:10;10498:18;:30;;;;;;;;;;;10532:1;10498:35;10490:83;;;;-1:-1:-1;;;10490:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19420:9:::1;-1:-1:-1::0;;;19420:33:0::1;19416:214;;;19455:18;:25:::0;;;19416:214:::1;;;19500:9;-1:-1:-1::0;;;19500:36:0::1;19496:134;;;19538:21;:28:::0;;;19496:134:::1;19646:33;::::0;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;19324:363:::0;;:::o;2021:372::-;2094:4;2115:16;;;;;;;;;;;:22;;;;;;;;;:30;:64;;;;-1:-1:-1;1107:1:0;2149:16;;;;;;;;;;;1187:4;2149:22;;;;;;;;:30;2115:64;2111:275;;;2200:9;:15;;;;;;;;;;;1187:4;2200:21;;;;;;;;:30;;2196:135;;;-1:-1:-1;2258:4:0;2251:11;;2196:135;-1:-1:-1;2310:5:0;2303:12;;2111:275;-1:-1:-1;2370:4:0;2363:11;;24601:2519;24723:18;24719:2109;;24825:43;;;;:27;:43;;;;;;;;;24883:21;:37;;;;;:47;;;;;;;;;:61;;;24802:155;;24825:43;24802:8;:155::i;:::-;24756:43;;;;:27;:43;;;;;;;;:201;;;;25008:35;;;:25;:35;;;;;;-1:-1:-1;;;;;25008:35:0;24976:68;;:31;:68;;;;25008:35;24976:73;24972:992;;;25082:23;;25070:8;:35;25066:207;;;25127:20;25151:51;25178:23;;25151:21;:26;;:51;;;;:::i;:::-;25219:23;:38;-1:-1:-1;;25066:207:0;25287:35;:21;25313:8;25287:35;:25;:35;:::i;:::-;-1:-1:-1;25344:58:0;25366:35;;;:25;:35;;;;;;;;;;-1:-1:-1;;;;;25366:35:0;;;25344:58;;:21;:58;;;;;25337:66;;;25425:37;;;:21;:37;;;;;:47;;;;;;;;25418:55;;;25366:35;25418:55;;;;25527:35;;;25495:68;;:31;:68;;;;;25488:76;;;25586:35;;;;;25579:43;;-1:-1:-1;;;;;;25579:43:0;;;24972:992;;;25710:1;25646:37;;;:21;:37;;;;;;;;:47;;;;;;;;:61;;;:65;25642:322;;25808:68;25840:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;25840:35:0;25808:68;;:31;:68;;;;;;25799:81;;25840:35;25799:8;:81::i;:::-;25728:68;25760:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;25760:35:0;25728:68;;:31;:68;;;;;:152;;;;25902:37;;;:21;:37;;;;;:47;;;;;;;;25895:55;;;25760:35;25895:55;;25642:322;24719:2109;;;25994:36;26065:43;;;:27;:43;;;;;;;;;26110:21;:37;;;;;:47;;;;;;;;:61;;;26033:180;;26056:116;;:8;:116::i;:::-;26187:13;26033:8;:180::i;:::-;25994:219;;15580:8;26234:28;:44;26226:85;;;;;-1:-1:-1;;;26226:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;26328:37;;;;:21;:37;;;;;;;;:47;;;;;;;;:61;;;26324:298;;26507:68;26539:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;26539:35:0;26507:68;;:31;:68;;;;;;26482:126;;26539:35;26482:8;:126::i;:::-;26411:68;26443:35;;;:25;:35;;;;;;;;;-1:-1:-1;;;;;26443:35:0;26411:68;;:31;:68;;;;;:197;26324:298;26634:43;;;;:27;:43;;;;;;;;:92;;;;26739:21;:37;;;;;:47;;;;;;:61;;:77;;;24719:2109;26906:22;;26941:23;;26977:43;;;;:27;:43;;;;;;;;;27065:35;;;:25;:35;;;;;;-1:-1:-1;;;;;27065:35:0;27033:68;;:31;:68;;;;;;;26843:269;;;;;;;;;;;;;;;;;;;;;;;;26879:14;;26843:269;;;;;;;;;;24601:2519;;;:::o;22358:1861::-;-1:-1:-1;;;;;22488:29:0;;22480:67;;;;;-1:-1:-1;;;22480:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;22585:18;;-1:-1:-1;;;;;22566:37:0;;;22585:18;;22566:37;;22558:99;;;;-1:-1:-1;;;22558:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22692:1;22676:13;:17;22668:50;;;;;-1:-1:-1;;;22668:50:0;;;;;;;;;;;;-1:-1:-1;;;22668:50:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22737:38:0;;;;;;:21;:38;;;;;;:43;22729:89;;;;-1:-1:-1;;;22729:89:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22882:21;;22837:41;22846:26;:24;:26::i;:::-;15628:1;22837:8;:41::i;:::-;:66;;22829:118;;;;-1:-1:-1;;;22829:118:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22975:43;;;;:27;:43;;;;;;15580:8;;22966:68;;23020:13;22966:8;:68::i;:::-;:84;22958:133;;;;-1:-1:-1;;;22958:133:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23181:35;23190:22;;23214:1;23181:8;:35::i;:::-;23102:22;:114;;;23227:23;:101;-1:-1:-1;;;;;23339:38:0;;-1:-1:-1;23339:38:0;;;:21;:38;;;;;;;;15628:1;23339:82;;23520:43;;;:27;:43;;;;;;23511:68;;23565:13;23511:8;:68::i;:::-;23432:43;;;;:27;:43;;;;;;;;:147;;;;23590:21;:37;;;;;23628:23;;;23590:62;;;;;;;;:76;;;;:92;;;23719:23;;23693:50;;:25;:50;;;;;:94;;-1:-1:-1;;;;;;23693:94:0;-1:-1:-1;;;;;23693:94:0;;;;;;;;23798:48;;:31;:48;;;;;;:82;23918:23;;23891:58;;:21;;23918:23;23891:26;:58::i;:::-;-1:-1:-1;24025:22:0;;24060:23;;24096:43;;;;:27;:43;;;;;;;;;-1:-1:-1;;;;;24152:48:0;;;;:31;:48;;;;;;;23965:246;;;;;;;;;;;;;;;;;;;;;;;;23998:14;;23965:246;;;;;;;;;;22358:1861;;;:::o;17503:104::-;17590:9;;17583:17::o;16738:267::-;16825:13;;;16800:8;16857:14;;;16849:62;;;;-1:-1:-1;;;16849:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16930:6;;;:28;;;16956:1;16944;16940;:5;;;;;;:18;16930:28;16922:75;;;;-1:-1:-1;;;16922:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15858:249;15944:5;;;15919:8;15964:6;;15960:65;;15985:1;15980;:6;;15972:53;;;;-1:-1:-1;;;15972:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16045:1;16040;:6;16036:63;;;16060:1;16056;:5;16048:51;;;;-1:-1:-1;;;16048:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32443:1058;32639:23;;32750:605;32757:28;;32750:605;;32964:1;32884:37;;;:21;:37;;;;;;;;:63;;;;;;;;:77;;;:81;32880:337;;33043:51;;;;:25;:51;;;;;;32982:221;;33012:14;;-1:-1:-1;;;;;33043:51:0;33069:24;33152:10;33179:9;32982:13;:221::i;:::-;33291:52;:21;33318:24;33291:52;:26;:52;:::i;:::-;33260:83;-1:-1:-1;32750:605:0;;-1:-1:-1;32750:605:0;;33438:18;;33408:85;;33422:14;;-1:-1:-1;;;;;33438:18:0;-1:-1:-1;;33471:10:0;33483:9;33408:13;:85::i;:::-;32443:1058;;;;:::o;2552:278::-;2609:7;2629:9;2649:11;2679:21;2683:4;1107:1;1187:4;2679:3;:21::i;:::-;2671:29;-1:-1:-1;;2711:91:0;2718:9;;2711:91;;2752:18;2756:4;2762:1;1187:4;2752:3;:18::i;:::-;2744:26;-1:-1:-1;;2785:5:0;;2711:91;;;2819:3;2552:278;-1:-1:-1;;;2552:278:0:o;15685:167::-;15774:5;;;15798:6;;;;15790:54;;;;-1:-1:-1;;;15790:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16113:158;16211:5;;;16206:16;;;;16198:65;;;;-1:-1:-1;;;16198:65:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14587:906;14657:9;14704:1;14706:50;;;;14794:9;;;14804:17;;;;14837:1;14832:6;;14787:53;;14804:17;14818:1;14813:6;;14787:53;;14871:1;14868;14864:9;14921:1;14918;14914:9;14909:14;;14903:563;14926:1;14903:563;;;14978:1;14975;14971:9;15019:1;15015;15011:2;15007:10;15004:17;14994:2;;15034:1;15032;15025:11;14994:2;15075:4;15071:2;15067:13;15109:2;15100:7;15097:15;15094:2;;;15124:1;15122;15115:11;15094:2;15147:15;;;;-1:-1:-1;;15179:8:0;;;15176:2;;;15222:1;15219;15215:9;15288:1;15284;15280:2;15276:10;15273:17;15266:25;15261:1;15254:9;15247:17;15243:49;15240:2;;;15304:1;15302;15295:11;15240:2;15347:4;15343:2;15339:13;15383:2;15374:7;15371:15;15368:2;;;15398:1;15396;15389:11;15368:2;15423:15;;;;-1:-1:-1;;15176:2:0;14941:1;14939;14935:8;14930:13;;14903:563;;;14907:18;14697:780;;14706:50;14721:1;14723:15;;;;14753:1;14748:6;;14714:41;;14723:15;14736:1;14731:6;;14714:41;;14697:780;;14686:800;;;;;:::o;17270:195::-;17360:5;;;17384:6;;;:20;;;17403:1;17398;17394;:5;;;;;;:10;17384:20;17376:59;;;;;-1:-1:-1;;;17376:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;15532:8;17450:7;;;;-1:-1:-1;;17270:195:0:o;16529:203::-;16615:21;;;16590:8;16655:14;;;;;:32;;;16686:1;16680;16673:14;;16655:32;16647:77;;;;;-1:-1:-1;;;16647:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;4685:134;4756:4;4762:7;4789:22;4793:4;4799:5;1146;4789:3;:22::i;:::-;4782:29;;;;4685:134;;;;;:::o;8020:352::-;8085:7;8110:13;;;8109:41;;;8130:19;8137:4;8143:5;8130:6;:19::i;:::-;8129:20;8109:41;8105:82;;;-1:-1:-1;8174:1:0;8167:8;;8105:82;8208:9;:16;;;;;;;;;;;:22;;;;;;;;;;;8232;;;;;;;;8197:64;;8208:16;;:22;;8232;8197:4;:64::i;:::-;-1:-1:-1;8279:9:0;:16;;;;;;;;;;;:22;;;;;;;;;8272:29;;;8279:22;8319;;;;;8312:29;;;;8279:16;8020:352::o;8689:152::-;8772:4;8796:37;8803:4;1107:1;8815:5;8822:10;8796:6;:37::i;:::-;8789:44;8689:152;-1:-1:-1;;;;8689:152:0:o;33972:1935::-;34185:10;;:32;;;-1:-1:-1;;;34185:32:0;;-1:-1:-1;;;;;34185:32:0;;;;;;;;;-1:-1:-1;;;34220:6:0;34185:10;;;;;:22;;:32;;;;;;;;;;;;;;;:10;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34185:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34185:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34185:32:0;:41;34177:104;;;;-1:-1:-1;;;34177:104:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34394:10;;:32;;;-1:-1:-1;;;34394:32:0;;-1:-1:-1;;;;;34394:32:0;;;;;;;;;34363:18;;34394:10;;;;;:22;;:32;;;;;;;;;;;;;;;:10;:32;;;2:2:-1;;;;27:1;24;17:12;2:2;34394:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;34394:32:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;34394:32:0;34551:18;;34386:41;;;;;-1:-1:-1;;;;;;34539:30:0;;;34551:18;;34539:30;34538:299;;34727:37;;;;:21;:37;;;;;;;;:59;;;;;;;;:73;;;15580:8;;34711:102;;34803:9;34711:8;:102::i;:::-;:126;;;;;;34538:299;;;15580:8;34584:89;34593:68;15580:8;34617:27;:43;34645:14;34617:43;;;;;;;;;;;;34593:8;:68::i;:::-;34663:9;34584:8;:89::i;:::-;:113;;;;;;34538:299;34515:322;;35056:96;35099:1;35061:35;35070:10;35082:13;35061:8;:35::i;:::-;:39;35116:35;35125:10;35137:13;35116:8;:35::i;:::-;35102:11;:49;35056:4;:96::i;:::-;35043:171;;35201:13;35043:171;;;35187:10;35166:11;:32;;;;;;35043:171;35026:188;-1:-1:-1;35386:18:0;;35382:518;;35472:18;;;35589:37;;;:21;:37;;;;;;;;:59;;;;;;;;:74;35437:263;;-1:-1:-1;;;;;35460:30:0;;;35472:18;;35460:30;;35507:178;;35532:14;;;;;35507:178;;35570:17;;;;35589:78;;35565:4;:103::i;:::-;35507:6;:178::i;35437:263::-;35419:471;;;35729:10;;:73;;;-1:-1:-1;;;35729:73:0;;;;;;;;-1:-1:-1;;;;;35729:73:0;;;;;;;;;;;;;;;:10;;;;;:32;;:73;;;;;:10;;:73;;;;;;;:10;;:73;;;2:2:-1;;;;27:1;24;17:12;2:2;35729:73:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;-1:-1;;35822:54:0;;;;;;;;-1:-1:-1;;;;;35822:54:0;;;-1:-1:-1;35836:14:0;;-1:-1:-1;35822:54:0;;;;;;;;;35419:471;33972:1935;;;;;;;:::o;3727:266::-;3814:4;3820:7;3845:19;3852:4;3858:5;3845:6;:19::i;:::-;3840:146;;-1:-1:-1;3889:5:0;;-1:-1:-1;3889:5:0;3881:17;;3840:146;-1:-1:-1;;3945:9:0;:16;;;;;;;;;;;:28;;;;;;;;;;;3939:4;;3840:146;3727:266;;;;;;:::o;6004:174::-;6098:9;:16;;;;;;;;;;;6115:5;;6098:23;;;;;;;;;:31;;;6140:16;;;;;;;;;6098:23;;6140:22;;;;;;:30;6004:174::o;6528:405::-;6627:4;6649:18;6656:4;6662;6649:6;:18::i;:::-;6648:19;:42;;;;;6671:19;6678:4;6684:5;6671:6;:19::i;:::-;6644:282;;;6707:9;6719:16;;;;;;;;;;;:28;;;;;;;;;;;6762:35;6719:4;6729:5;6780:4;6736:10;6762:4;:35::i;:::-;6812:31;6817:4;6823;6829:1;6832:10;6812:4;:31::i;:::-;6865:4;6858:11;;;;;6644:282;-1:-1:-1;6909:5:0;6528:405;;;;;;:::o;17011:253::-;17072:8;17102:30;17107:1;-1:-1:-1;;17107:7:0;-1:-1:-1;;;17116:1:0;:15;17102:4;:30::i;:::-;17101:31;17093:77;;;;-1:-1:-1;;;17093:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17189:6;;;:30;;-1:-1:-1;;17204:5:0;;;17218:1;17213;17204:5;17213:1;17199:15;;;;;:20;17189:30;17181:75;;;;;-1:-1:-1;;;17181:75:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;17613:105;17702:8;;17695:16::o
Swarm Source
ipfs://3776e56da8953ece38b6fcc21aea3ccdc20cc4e5e4056338bc40d0ea0e2e19d5
Loading...
Loading
Loading...
Loading
OVERVIEW
The TaxCollector stores data about each CollateralType's stability fee. It also collects fees from currently opened SAFEs and distributes them to the AccountingEngine and to other auxiliary system components such as the StabilityFeeTreasury
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.