Contract
0x11DEE30E710B8d4a8630392781Cc3c0046365d4c
7
Contract Overview
Balance:
0 Ether
EtherValue:
$0.00
Txn Hash | Method |
Index
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
0x7d3349777632de190008bb64aa100fa7c0844a5931b3522341c90173ae88d2e2 | Add Oracle | 19142 | 232 days 10 hrs ago | 0x11799622f4d98a24514011e8527b969f7488ef47 | IN | 0x11dee30e710b8d4a8630392781cc3c0046365d4c | 0 Ether | 0.000914448611 | |
0x7e9bf4259cd60b03dfc681a91391f8329b7e33f1f6d2a79cef0efb38efe207e5 | Remove Oracle | 19140 | 232 days 10 hrs ago | 0x11799622f4d98a24514011e8527b969f7488ef47 | IN | 0x11dee30e710b8d4a8630392781cc3c0046365d4c | 0 Ether | 0.000911425202 | |
GENESIS_11dee30e710b8d4a8630392781cc3c0046365d4c | 0x60806040 | 0 | 534 days 10 hrs ago | GENESIS | IN | Create: OffchainOracle | 0 Ether | 0 |
[ Download CSV Export ]
Contract Name:
OffchainOracle
Compiler Version
v0.7.6+commit.3b061308
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/EnumerableSet.sol"; import "./interfaces/IOracle.sol"; import "./interfaces/IWrapper.sol"; import "./MultiWrapper.sol"; contract OffchainOracle is Ownable { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; enum OracleType { WETH, ETH, WETH_ETH } event OracleAdded(IOracle oracle, OracleType oracleType); event OracleRemoved(IOracle oracle, OracleType oracleType); event ConnectorAdded(IERC20 connector); event ConnectorRemoved(IERC20 connector); event MultiWrapperUpdated(MultiWrapper multiWrapper); EnumerableSet.AddressSet private _wethOracles; EnumerableSet.AddressSet private _ethOracles; EnumerableSet.AddressSet private _connectors; MultiWrapper public multiWrapper; IERC20 private constant _BASE = IERC20(0x0000000000000000000000000000000000000000); IERC20 private immutable _wBase; constructor(MultiWrapper _multiWrapper, IOracle[] memory existingOracles, OracleType[] memory oracleTypes, IERC20[] memory existingConnectors, IERC20 wBase) { require(existingOracles.length == oracleTypes.length, "Arrays length mismatch"); multiWrapper = _multiWrapper; emit MultiWrapperUpdated(_multiWrapper); for (uint256 i = 0; i < existingOracles.length; i++) { if (oracleTypes[i] == OracleType.WETH) { require(_wethOracles.add(address(existingOracles[i])), "Oracle already added"); } else if (oracleTypes[i] == OracleType.ETH) { require(_ethOracles.add(address(existingOracles[i])), "Oracle already added"); } else if (oracleTypes[i] == OracleType.WETH_ETH) { require(_wethOracles.add(address(existingOracles[i])), "Oracle already added"); require(_ethOracles.add(address(existingOracles[i])), "Oracle already added"); } else { revert("Invalid OracleTokenKind"); } emit OracleAdded(existingOracles[i], oracleTypes[i]); } for (uint256 i = 0; i < existingConnectors.length; i++) { require(_connectors.add(address(existingConnectors[i])), "Connector already added"); emit ConnectorAdded(existingConnectors[i]); } _wBase = wBase; } function oracles() public view returns (IOracle[] memory allOracles, OracleType[] memory oracleTypes) { IOracle[] memory oraclesBuffer = new IOracle[](_wethOracles._inner._values.length + _ethOracles._inner._values.length); OracleType[] memory oracleTypesBuffer = new OracleType[](oraclesBuffer.length); for (uint256 i = 0; i < _wethOracles._inner._values.length; i++) { oraclesBuffer[i] = IOracle(uint256(_wethOracles._inner._values[i])); oracleTypesBuffer[i] = OracleType.WETH; } uint256 actualItemsCount = _wethOracles._inner._values.length; for (uint256 i = 0; i < _ethOracles._inner._values.length; i++) { OracleType kind = OracleType.ETH; uint256 oracleIndex = actualItemsCount; IOracle oracle = IOracle(uint256(_ethOracles._inner._values[i])); for (uint j = 0; j < oraclesBuffer.length; j++) { if (oraclesBuffer[j] == oracle) { oracleIndex = j; kind = OracleType.WETH_ETH; break; } } if (kind == OracleType.ETH) { actualItemsCount++; } oraclesBuffer[oracleIndex] = oracle; oracleTypesBuffer[oracleIndex] = kind; } allOracles = new IOracle[](actualItemsCount); oracleTypes = new OracleType[](actualItemsCount); for (uint256 i = 0; i < actualItemsCount; i++) { allOracles[i] = oraclesBuffer[i]; oracleTypes[i] = oracleTypesBuffer[i]; } } function connectors() external view returns (IERC20[] memory allConnectors) { allConnectors = new IERC20[](_connectors.length()); for (uint256 i = 0; i < allConnectors.length; i++) { allConnectors[i] = IERC20(uint256(_connectors._inner._values[i])); } } function setMultiWrapper(MultiWrapper _multiWrapper) external onlyOwner { multiWrapper = _multiWrapper; emit MultiWrapperUpdated(_multiWrapper); } function addOracle(IOracle oracle, OracleType oracleKind) external onlyOwner { if (oracleKind == OracleType.WETH) { require(_wethOracles.add(address(oracle)), "Oracle already added"); } else if (oracleKind == OracleType.ETH) { require(_ethOracles.add(address(oracle)), "Oracle already added"); } else if (oracleKind == OracleType.WETH_ETH) { require(_wethOracles.add(address(oracle)), "Oracle already added"); require(_ethOracles.add(address(oracle)), "Oracle already added"); } else { revert("Invalid OracleTokenKind"); } emit OracleAdded(oracle, oracleKind); } function removeOracle(IOracle oracle, OracleType oracleKind) external onlyOwner { if (oracleKind == OracleType.WETH) { require(_wethOracles.remove(address(oracle)), "Unknown oracle"); } else if (oracleKind == OracleType.ETH) { require(_ethOracles.remove(address(oracle)), "Unknown oracle"); } else if (oracleKind == OracleType.WETH_ETH) { require(_wethOracles.remove(address(oracle)), "Unknown oracle"); require(_ethOracles.remove(address(oracle)), "Unknown oracle"); } else { revert("Invalid OracleTokenKind"); } emit OracleRemoved(oracle, oracleKind); } function addConnector(IERC20 connector) external onlyOwner { require(_connectors.add(address(connector)), "Connector already added"); emit ConnectorAdded(connector); } function removeConnector(IERC20 connector) external onlyOwner { require(_connectors.remove(address(connector)), "Unknown connector"); emit ConnectorRemoved(connector); } /* WARNING! Usage of the dex oracle on chain is highly discouraged! getRate function can be easily manipulated inside transaction! */ function getRate(IERC20 srcToken, IERC20 dstToken, bool useWrappers) external view returns (uint256 weightedRate) { require(srcToken != dstToken, "Tokens should not be the same"); uint256 totalWeight; (IOracle[] memory allOracles, ) = oracles(); (IERC20[] memory wrappedSrcTokens, uint256[] memory srcRates) = _getWrappedTokens(srcToken, useWrappers); (IERC20[] memory wrappedDstTokens, uint256[] memory dstRates) = _getWrappedTokens(dstToken, useWrappers); bytes32[] memory connectors_ = _connectors._inner._values; for (uint256 k1 = 0; k1 < wrappedSrcTokens.length; k1++) { for (uint256 k2 = 0; k2 < wrappedDstTokens.length; k2++) { if (wrappedSrcTokens[k1] == wrappedDstTokens[k2]) { return srcRates[k1].mul(dstRates[k2]).div(1e18); } for (uint256 j = 0; j < connectors_.length; j++) { if (IERC20(uint256(connectors_[j])) == wrappedSrcTokens[k1] || IERC20(uint256(connectors_[j])) == wrappedDstTokens[k2]) { continue; } for (uint256 i = 0; i < allOracles.length; i++) { try allOracles[i].getRate(wrappedSrcTokens[k1], wrappedDstTokens[k2], IERC20(uint256(connectors_[j]))) returns (uint256 rate, uint256 weight) { rate = rate.mul(srcRates[k1]).mul(dstRates[k2]).div(1e36); weight = weight.mul(weight); weightedRate = weightedRate.add(rate.mul(weight)); totalWeight = totalWeight.add(weight); } catch {} // solhint-disable-line no-empty-blocks } } } } if (totalWeight > 0) { weightedRate = weightedRate.div(totalWeight); } } /// @dev Same as `getRate` but checks against `ETH` and `WETH` only function getRateToEth(IERC20 srcToken, bool useSrcWrappers) external view returns (uint256 weightedRate) { uint256 totalWeight; (IERC20[] memory wrappedSrcTokens, uint256[] memory srcRates) = _getWrappedTokens(srcToken, useSrcWrappers); IERC20[2] memory wrappedDstTokens = [_BASE, _wBase]; bytes32[][2] memory wrappedOracles = [_ethOracles._inner._values, _wethOracles._inner._values]; bytes32[] memory connectors_ = _connectors._inner._values; for (uint256 k1 = 0; k1 < wrappedSrcTokens.length; k1++) { for (uint256 k2 = 0; k2 < wrappedDstTokens.length; k2++) { if (wrappedSrcTokens[k1] == wrappedDstTokens[k2]) { return srcRates[k1]; } for (uint256 j = 0; j < connectors_.length; j++) { IERC20 connector = IERC20(uint256(connectors_[j])); if (connector == wrappedSrcTokens[k1] || connector == wrappedDstTokens[k2]) { continue; } for (uint256 i = 0; i < wrappedOracles[k2].length; i++) { try IOracle(uint256(wrappedOracles[k2][i])).getRate(wrappedSrcTokens[k1], wrappedDstTokens[k2], connector) returns (uint256 rate, uint256 weight) { rate = rate.mul(srcRates[k1]).div(1e18); weight = weight.mul(weight); weightedRate = weightedRate.add(rate.mul(weight)); totalWeight = totalWeight.add(weight); } catch {} // solhint-disable-line no-empty-blocks } } } } if (totalWeight > 0) { weightedRate = weightedRate.div(totalWeight); } } function _getWrappedTokens(IERC20 token, bool useWrappers) internal view returns (IERC20[] memory wrappedTokens, uint256[] memory rates) { if (useWrappers) { return multiWrapper.getWrappedTokens(token); } wrappedTokens = new IERC20[](1); wrappedTokens[0] = token; rates = new uint256[](1); rates[0] = uint256(1e18); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "@openzeppelin/contracts/access/Ownable.sol"; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/utils/EnumerableSet.sol"; import "./interfaces/IWrapper.sol"; contract MultiWrapper is Ownable { using SafeMath for uint256; using EnumerableSet for EnumerableSet.AddressSet; event WrapperAdded(IWrapper connector); event WrapperRemoved(IWrapper connector); EnumerableSet.AddressSet private _wrappers; constructor(IWrapper[] memory existingWrappers) { for (uint256 i = 0; i < existingWrappers.length; i++) { require(_wrappers.add(address(existingWrappers[i])), "Wrapper already added"); emit WrapperAdded(existingWrappers[i]); } } function wrappers() external view returns (IWrapper[] memory allWrappers) { allWrappers = new IWrapper[](_wrappers.length()); for (uint256 i = 0; i < allWrappers.length; i++) { allWrappers[i] = IWrapper(uint256(_wrappers._inner._values[i])); } } function addWrapper(IWrapper wrapper) external onlyOwner { require(_wrappers.add(address(wrapper)), "Wrapper already added"); emit WrapperAdded(wrapper); } function removeWrapper(IWrapper wrapper) external onlyOwner { require(_wrappers.remove(address(wrapper)), "Unknown wrapper"); emit WrapperRemoved(wrapper); } function getWrappedTokens(IERC20 token) external view returns (IERC20[] memory wrappedTokens, uint256[] memory rates) { IERC20[] memory memWrappedTokens = new IERC20[](20); uint256[] memory memRates = new uint256[](20); uint256 len = 0; for (uint256 i = 0; i < _wrappers._inner._values.length; i++) { try IWrapper(uint256(_wrappers._inner._values[i])).wrap(token) returns (IERC20 wrappedToken, uint256 rate) { memWrappedTokens[len] = wrappedToken; memRates[len] = rate; len += 1; for (uint256 j = 0; j < _wrappers._inner._values.length; j++) { if (i != j) { try IWrapper(uint256(_wrappers._inner._values[j])).wrap(wrappedToken) returns (IERC20 wrappedToken2, uint256 rate2) { bool used = false; for (uint256 k = 0; k < len; k++) { if (wrappedToken2 == memWrappedTokens[k]) { used = true; break; } } if (!used) { memWrappedTokens[len] = wrappedToken2; memRates[len] = rate.mul(rate2).div(1e18); len += 1; } } catch { continue; } } } } catch { continue; } } wrappedTokens = new IERC20[](len + 1); rates = new uint256[](len + 1); for (uint256 i = 0; i < len; i++) { wrappedTokens[i] = memWrappedTokens[i]; rates[i] = memRates[i]; } wrappedTokens[len] = token; rates[len] = 1e18; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IWrapper { function wrap(IERC20 token) external view returns (IERC20 wrappedToken, uint256 rate); }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.7.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping (bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } }
// SPDX-License-Identifier: MIT pragma solidity 0.7.6; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IOracle { function getRate(IERC20 srcToken, IERC20 dstToken, IERC20 connector) external view returns (uint256 rate, uint256 weight); }
{ "optimizer": { "enabled": true, "runs": 1000000 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "metadata": { "useLiteralContent": true } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract MultiWrapper","name":"_multiWrapper","type":"address"},{"internalType":"contract IOracle[]","name":"existingOracles","type":"address[]"},{"internalType":"enum OffchainOracle.OracleType[]","name":"oracleTypes","type":"uint8[]"},{"internalType":"contract IERC20[]","name":"existingConnectors","type":"address[]"},{"internalType":"contract IERC20","name":"wBase","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"connector","type":"address"}],"name":"ConnectorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"connector","type":"address"}],"name":"ConnectorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract MultiWrapper","name":"multiWrapper","type":"address"}],"name":"MultiWrapperUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IOracle","name":"oracle","type":"address"},{"indexed":false,"internalType":"enum OffchainOracle.OracleType","name":"oracleType","type":"uint8"}],"name":"OracleAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IOracle","name":"oracle","type":"address"},{"indexed":false,"internalType":"enum OffchainOracle.OracleType","name":"oracleType","type":"uint8"}],"name":"OracleRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"contract IERC20","name":"connector","type":"address"}],"name":"addConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"oracle","type":"address"},{"internalType":"enum OffchainOracle.OracleType","name":"oracleKind","type":"uint8"}],"name":"addOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"connectors","outputs":[{"internalType":"contract IERC20[]","name":"allConnectors","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"contract IERC20","name":"dstToken","type":"address"},{"internalType":"bool","name":"useWrappers","type":"bool"}],"name":"getRate","outputs":[{"internalType":"uint256","name":"weightedRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"srcToken","type":"address"},{"internalType":"bool","name":"useSrcWrappers","type":"bool"}],"name":"getRateToEth","outputs":[{"internalType":"uint256","name":"weightedRate","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiWrapper","outputs":[{"internalType":"contract MultiWrapper","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracles","outputs":[{"internalType":"contract IOracle[]","name":"allOracles","type":"address[]"},{"internalType":"enum OffchainOracle.OracleType[]","name":"oracleTypes","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"connector","type":"address"}],"name":"removeConnector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IOracle","name":"oracle","type":"address"},{"internalType":"enum OffchainOracle.OracleType","name":"oracleKind","type":"uint8"}],"name":"removeOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract MultiWrapper","name":"_multiWrapper","type":"address"}],"name":"setMultiWrapper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040525a6200000f62000867565b8015620000265760008062000023620008c3565b50505b506040516200353238038062003532833981810160405260a0811015620000575760008062000054620008c3565b50505b810190808051929190602001805160405193929190846401000000008211156200008b5760008062000088620008c3565b50505b908301906020820185811115620000ac57600080620000a9620008c3565b50505b8251866020820283011164010000000082111715620000d557600080620000d2620008c3565b50505b825250602001908051906020019060200280838360005b8381101562000106578082015183820152602001620000ec565b50505050905001604052602001805160405193929190846401000000008211156200013b5760008062000138620008c3565b50505b9083019060208201858111156200015c5760008062000159620008c3565b50505b8251866020820283011164010000000082111715620001855760008062000182620008c3565b50505b825250602001908051906020019060200280838360005b83811015620001b65780820151838201526020016200019c565b5050505090500160405260200180516040519392919084640100000000821115620001eb57600080620001e8620008c3565b50505b9083019060208201858111156200020c5760008062000209620008c3565b50505b8251866020820283011164010000000082111715620002355760008062000232620008c3565b50505b825250602001908051906020019060200280838360005b83811015620002665780820151838201526020016200024c565b50505050905001604052602001805192506000915062000287905062000782565b90508060006001816200029962000930565b816001600160a01b0302191690836001600160a01b0316021790620002bd6200097d565b5050506001600160a01b03811660007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35082518451146200035a5760405162461bcd60e51b815260206004820152601660248201527f417272617973206c656e677468206d69736d617463680000000000000000000060448201526064016040518091039062000357620008c3565b50505b8460076001816200036a62000930565b816001600160a01b0302191690836001600160a01b03160217906200038e6200097d565b5050507f1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f52856040516001600160a01b03909116815260200160405180910390a160005b845181101562000673576000848281518110620003ea57fe5b60200260200101516002811115620003fe57fe5b14156200049657620004348582815181106200041657fe5b602002602001015160016200079460201b620020a91790919060201c565b620004905760405162461bcd60e51b815260206004820152601460248201527f4f7261636c6520616c72656164792061646465640000000000000000000000006044820152606401604051809103906200048d620008c3565b50505b620005ee565b6001848281518110620004a557fe5b60200260200101516002811115620004b957fe5b1415620004ef5762000434858281518110620004d157fe5b602002602001015160036200079460201b620020a91790919060201c565b6002848281518110620004fe57fe5b602002602001015160028111156200051257fe5b141562000597576200052a8582815181106200041657fe5b620005865760405162461bcd60e51b815260206004820152601460248201527f4f7261636c6520616c726561647920616464656400000000000000000000000060448201526064016040518091039062000583620008c3565b50505b62000434858281518110620004d157fe5b60405162461bcd60e51b815260206004820152601760248201527f496e76616c6964204f7261636c65546f6b656e4b696e64000000000000000000604482015260640160405180910390620005eb620008c3565b50505b7f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f6228582815181106200061c57fe5b60200260200101518583815181106200063157fe5b602002602001015160405180836001600160a01b031681526020018260028111156200065957fe5b81526020019250505060405180910390a1600101620003d1565b5060005b82518110156200076657620006b08382815181106200069257fe5b602002602001015160056200079460201b620020a91790919060201c565b6200070c5760405162461bcd60e51b815260206004820152601760248201527f436f6e6e6563746f7220616c726561647920616464656400000000000000000060448201526064016040518091039062000709620008c3565b50505b7fff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d8382815181106200073a57fe5b60200260200101516040516001600160a01b03909116815260200160405180910390a160010162000677565b5060601b6001600160601b0319166080525062000a1392505050565b60005a6200078f620009cc565b905090565b6000620007ab836001600160a01b038416620007b4565b90505b92915050565b6000620007c2838362000844565b6200083b57818380600181620007d762000930565b018082620007e46200097d565b505060009283526000190191602091502001620008006200097d565b50839050806200080f62000930565b6000848152600186016020529091506040902081906200082e6200097d565b50505060019050620007ae565b506000620007ae565b600081815260018301602052604081206200085e62000930565b15159392505050565b63a8c4c5ec598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015620008be57600082820152602001620008a5565b505050565b632a2a7adb598160e01b8152600481016020815285602082015260005b86811015620008fd578086015182820160400152602001620008e0565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020620008a5565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b600081526020620008a5565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020620008a5565b60805160601c612b0162000a3160003980610c585250612b016000f3fe60806040525a61000d6127e2565b80156100215760008061001e612837565b50505b50600436106100f05760003560e01c80638da5cb5b1161009d578063b77910dc11610077578063b77910dc14610396578063d06265181461039e578063f0b92e40146103da578063f2fde38b1461041f576100f0565b80638da5cb5b146102e45780639d4d7b1c14610315578063aa16d4c01461035a576100f0565b8063715018a6116100ce578063715018a6146102385780637de4fd1014610240578063802431fb14610296576100f0565b80631a6c6a98146100fe5780632857373a1461013c57806365050a68146101dd575b6000806100fb612837565b50505b61013a6004803603602081101561011d5760008061011a612837565b50505b503573ffffffffffffffffffffffffffffffffffffffff1661045b565b005b6101446105d6565b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015610188578082015183820152602001610170565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156101c75780820151838201526020016101af565b5050505090500194505050505060405180910390f35b6101e5610a00565b60405160208082528190810183818151815260200191508051906020019060200280838360005b8381101561022457808201518382015260200161020c565b505050509050019250505060405180910390f35b61013a610ac7565b6102846004803603604081101561025f5760008061025c612837565b50505b5073ffffffffffffffffffffffffffffffffffffffff81351690602001351515610c31565b60405190815260200160405180910390f35b610284600480360360608110156102b5576000806102b2612837565b50505b5073ffffffffffffffffffffffffffffffffffffffff8135811691602081013590911690604001351515611129565b6102ec6115fd565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b61013a6004803603604081101561033457600080610331612837565b50505b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff1661162b565b61013a6004803603602081101561037957600080610376612837565b50505b503573ffffffffffffffffffffffffffffffffffffffff16611901565b6102ec611a7c565b61013a600480360360208110156103bd576000806103ba612837565b50505b503573ffffffffffffffffffffffffffffffffffffffff16611aa8565b61013a600480360360408110156103f9576000806103f6612837565b50505b50803573ffffffffffffffffffffffffffffffffffffffff16906020013560ff16611bf2565b61013a6004803603602081101561043e5760008061043b612837565b50505b503573ffffffffffffffffffffffffffffffffffffffff16611eb3565b6104636120cb565b73ffffffffffffffffffffffffffffffffffffffff166104816115fd565b73ffffffffffffffffffffffffffffffffffffffff161461050b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390610508612837565b50505b6105166005826120db565b610589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f556e6b6e6f776e20636f6e6e6563746f72000000000000000000000000000000604482015260640160405180910390610586612837565b50505b7f6825b26a0827e9c2ceca01d6289ce4a40e629dc074ec48ea4727d1afbff359f58160405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b60608060006003806105e66128a2565b90506001806105f36128a2565b90500167ffffffffffffffff8111801561061557600080610612612837565b50505b5060405190808252806020026020018201604052801561063f578160200160208202803683370190505b5090506000815167ffffffffffffffff8111801561066557600080610662612837565b50505b5060405190808252806020026020018201604052801561068f578160200160208202803683370190505b50905060005b6001806106a06128a2565b905081101561074e57600181816106b56128a2565b81106106bd57fe5b906000526020600020016106cf6128a2565b8382815181106106db57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600082828151811061072357fe5b6020026020010190600281111561073657fe5b9081600281111561074357fe5b905250600101610695565b50600060018061075c6128a2565b9050905060005b60038061076e6128a2565b90508110156108ad576001826000600384816107886128a2565b811061079057fe5b906000526020600020016107a26128a2565b905060005b875181101561080b578173ffffffffffffffffffffffffffffffffffffffff168882815181106107d357fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610803578092506002935061080b565b6001016107a7565b50600183600281111561081a57fe5b1415610827576001909401935b8087838151811061083457fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508286838151811061087b57fe5b6020026020010190600281111561088e57fe5b9081600281111561089b57fe5b90525050600190920191506107639050565b508067ffffffffffffffff811180156108ce576000806108cb612837565b50505b506040519080825280602002602001820160405280156108f8578160200160208202803683370190505b5094508067ffffffffffffffff8111801561091b57600080610918612837565b50505b50604051908082528060200260200182016040528015610945578160200160208202803683370190505b50935060005b818110156109f85783818151811061095f57fe5b602002602001015186828151811061097357fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508281815181106109b957fe5b60200260200101518582815181106109cd57fe5b602002602001019060028111156109e057fe5b908160028111156109ed57fe5b90525060010161094b565b505050509091565b6060610a0c60056120fd565b67ffffffffffffffff81118015610a2b57600080610a28612837565b50505b50604051908082528060200260200182016040528015610a55578160200160208202803683370190505b50905060005b8151811015610ac35760058181610a706128a2565b8110610a7857fe5b90600052602060002001610a8a6128a2565b828281518110610a9657fe5b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101610a5b565b5090565b610acf6120cb565b73ffffffffffffffffffffffffffffffffffffffff16610aed6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614610b77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390610b74612837565b50505b60008080610b836128a2565b906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3600080600181610bf06128a2565b8173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790610c2c6128ee565b505050565b600080600080610c418686612108565b9150915060006040516040808201815260008083527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166020840152919250516040808201905280600380610ca96128a2565b806020026020016040519081016040528181529190602083018280610ccc6128a2565b8015610cfe57602002820191906000526020600020905b81610cec6128a2565b81526020019060010190808311610ce3575b5050509183525050602001600180610d146128a2565b806020026020016040519081016040528181529190602083018280610d376128a2565b8015610d6957602002820191906000526020600020905b81610d576128a2565b81526020019060010190808311610d4e575b505050919092525090915060009050600580610d836128a2565b806020026020016040519081016040528181529190602083018280610da66128a2565b8015610dd857602002820191906000526020600020905b81610dc66128a2565b81526020019060010190808311610dbd575b5050505050905060005b85518110156111085760005b60028110156110ff57848160028110610e0357fe5b602002015173ffffffffffffffffffffffffffffffffffffffff16878381518110610e2a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610e7157858281518110610e5a57fe5b602002602001015198505050505050505050611123565b60005b83518110156110f6576000848281518110610e8b57fe5b60200260200101519050888481518110610ea157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480610f1d5750868360028110610ee957fe5b602002015173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b15610f2857506110ee565b60005b868460028110610f3757fe5b6020020151518110156110eb57868460028110610f5057fe5b60200201518181518110610f6057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166314999e798b8781518110610f8f57fe5b60200260200101518a8760028110610fa357fe5b6020020151856040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff9384166004820152918316602483015290911660448201526064016040805180830381868061101761293c565b15801561102c57600080611029612837565b50505b505a611036612988565b505050505092505050801561107757506040513d60408110156110615760008061105e612837565b50505b8101908080519291906020018051925060019150505b611080576110e3565b6110b0670de0b6b3a76400006110aa8d8a8151811061109b57fe5b60200260200101518590612453565b906124d5565b91506110bc8180612453565b90506110d26110cb8383612453565b8f9061255e565b9d506110de8d8261255e565b9c5050505b600101610f2b565b50505b600101610e74565b50600101610dee565b50600101610de2565b50851561111c5761111987876124d5565b96505b5050505050505b92915050565b60008273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156111ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f546f6b656e732073686f756c64206e6f74206265207468652073616d650000006044820152606401604051809103906111cb612837565b50505b6000806111d96105d6565b5090506000806111e98887612108565b915091506000806111fa8989612108565b9092509050600060058061120c6128a2565b80602002602001604051908101604052818152919060208301828061122f6128a2565b801561126157602002820191906000526020600020905b8161124f6128a2565b81526020019060010190808311611246575b5050505050905060005b85518110156115da5760005b84518110156115d15784818151811061128c57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168783815181106112b657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561132757611317670de0b6b3a76400006110aa8684815181106112f557fe5b602002602001015189868151811061130957fe5b602002602001015190612453565b99505050505050505050506115f6565b60005b83518110156115c85787838151811061133f57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1684828151811061136957fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1614806113e4575085828151811061139a57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168482815181106113c457fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16145b156113ee576115c0565b60005b89518110156115be5789818151811061140657fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff166314999e798a868151811061143557fe5b602002602001015189868151811061144957fe5b602002602001015188868151811061145d57fe5b60200260200101516040517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606401604080518083038186806114d361293c565b1580156114e8576000806114e5612837565b50505b505a6114f2612988565b505050505092505050801561153357506040513d604081101561151d5760008061151a612837565b50505b8101908080519291906020018051925060019150505b61153c576115b6565b61158a6ec097ce7bc90715b34b9f10000000006110aa8a888151811061155e57fe5b60200260200101516115848e8b8151811061157557fe5b60200260200101518790612453565b90612453565b91506115968180612453565b90506115a56110cb8383612453565b9d506115b18d8261255e565b9c5050505b6001016113f1565b505b60010161132a565b50600101611277565b5060010161126b565b5086156115ee576115eb88886124d5565b97505b505050505050505b9392505050565b600080806116096128a2565b906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116336120cb565b73ffffffffffffffffffffffffffffffffffffffff166116516115fd565b73ffffffffffffffffffffffffffffffffffffffff16146116db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401604051809103906116d8612837565b50505b60008160028111156116e957fe5b1415611772576116fa6001836120a9565b61176d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4f7261636c6520616c726561647920616464656400000000000000000000000060448201526064016040518091039061176a612837565b50505b61189d565b600181600281111561178057fe5b1415611791576116fa6003836120a9565b600281600281111561179f57fe5b141561182e576117b06001836120a9565b611823576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f4f7261636c6520616c7265616479206164646564000000000000000000000000604482015260640160405180910390611820612837565b50505b6116fa6003836120a9565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964204f7261636c65546f6b656e4b696e6400000000000000000060448201526064016040518091039061189a612837565b50505b7f5874b2072ff37562df54063dd700c59d45f311bdf6f9cabb5a15f0ffb2e9f6228282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018260028111156118ec57fe5b81526020019250505060405180910390a15050565b6119096120cb565b73ffffffffffffffffffffffffffffffffffffffff166119276115fd565b73ffffffffffffffffffffffffffffffffffffffff16146119b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401604051809103906119ae612837565b50505b6119bc6005826120a9565b611a2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f436f6e6e6563746f7220616c7265616479206164646564000000000000000000604482015260640160405180910390611a2c612837565b50505b7fff88af5d962d47fd25d87755e8267a029fad5a91740c67d0dade2bdbe5268a1d8160405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b60006007611a886128a2565b906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611ab06120cb565b73ffffffffffffffffffffffffffffffffffffffff16611ace6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611b58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390611b55612837565b50505b806007600181611b666128a2565b8173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790611ba26128ee565b5050507f1030152fe2062b574a830e6b9f13c65995990df31e4dc708d142533bb3ad0f528160405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b611bfa6120cb565b73ffffffffffffffffffffffffffffffffffffffff16611c186115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611ca2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390611c9f612837565b50505b6000816002811115611cb057fe5b1415611d3957611cc16001836120db565b611d34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f556e6b6e6f776e206f7261636c65000000000000000000000000000000000000604482015260640160405180910390611d31612837565b50505b611e64565b6001816002811115611d4757fe5b1415611d5857611cc16003836120db565b6002816002811115611d6657fe5b1415611df557611d776001836120db565b611dea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f556e6b6e6f776e206f7261636c65000000000000000000000000000000000000604482015260640160405180910390611de7612837565b50505b611cc16003836120db565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f496e76616c6964204f7261636c65546f6b656e4b696e64000000000000000000604482015260640160405180910390611e61612837565b50505b7f7a7f56716fe703fb190529c336e57df71ab88188ba47e8d786bac684b61ab9a68282604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018260028111156118ec57fe5b611ebb6120cb565b73ffffffffffffffffffffffffffffffffffffffff16611ed96115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611f63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390611f60612837565b50505b73ffffffffffffffffffffffffffffffffffffffff8116611fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612aba6026913960400191505060405180910390611fd5612837565b50505b8073ffffffffffffffffffffffffffffffffffffffff16600080611ffa6128a2565b906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a38060006001816120676128a2565b8173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217906120a36128ee565b50505050565b60006115f68373ffffffffffffffffffffffffffffffffffffffff84166125d7565b60005a6120d6612a73565b905090565b60006115f68373ffffffffffffffffffffffffffffffffffffffff8416612676565b6000611123826127b5565b606080821561239a576000600761211d6128a2565b906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663cb991d94856040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff909116600482015260240160006040518083038186806121b561293c565b1580156121ca576000806121c7612837565b50505b505a6121d4612988565b50505050501580156121f3573d6000803e3d60006121f0612837565b50505b505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604090815281101561224357600080612240612837565b50505b810190808051604051939291908464010000000082111561226c57600080612269612837565b50505b90830190602082018581111561228a57600080612287612837565b50505b82518660208202830111640100000000821117156122b0576000806122ad612837565b50505b825250602001908051906020019060200280838360005b838110156122df5780820151838201526020016122c7565b50505050905001604052602001805160405193929190846401000000008211156123115760008061230e612837565b50505b90830190602082018581111561232f5760008061232c612837565b50505b825186602082028301116401000000008211171561235557600080612352612837565b50505b825250602001908051906020019060200280838360005b8381101561238457808201518382015260200161236c565b505050509050016040525050509150915061244c565b60016040519080825280602002602001820160405280156123c5578160200160208202803683370190505b50915083826000815181106123d657fe5b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526001604051908082528060200260200182016040528015612426578160200160208202803683370190505b509050670de0b6b3a76400008160008151811061243f57fe5b6020026020010181815250505b9250929050565b60008261246257506000611123565b8282028284828161246f57fe5b04146115f6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612ae060219139604001915050604051809103906124cc612837565b50509392505050565b600080821161254d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f00000000000060448201526064016040518091039061254a612837565b50505b81838161255657fe5b049392505050565b6000828201838110156115f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f7700000000006044820152606401604051809103906124cc612837565b60006125e383836127c1565b61266e578183806001816125f56128a2565b0180826126006128ee565b505060009283527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01916020915020016126386128ee565b50839050806126456128a2565b6000848152600186016020529091506040902081906126626128ee565b50505060019050611123565b506000611123565b600081815260018301602052806040812061268f6128a2565b905080156127ab577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81016000600186806126c86128a2565b905003905060008660000182816126dd6128a2565b81106126e557fe5b906000526020600020016126f76128a2565b9050808784816127056128a2565b811061270d57fe5b9060005260206000200181906127216128ee565b505050600081815260018881016020528401906040902081906127426128ee565b50505086600001806127526128a2565b8061275957fe5b600190038181906000526020600020016000906127746128ee565b50509061277f6128ee565b50506000868152600188016020526040902060009061279c6128ee565b50506001945050505050611123565b6000915050611123565b600081806115f66128a2565b600081815260018301602052604081206127d96128a2565b15159392505050565b63a8c4c5ec598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051935060005b6040811015610c2c57600082820152602001612820565b632a2a7adb598160e01b8152600481016020815285602082015260005b8681101561286f578086015182820160400152602001612854565b506020828760640184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b505050565b6303daa959598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020612820565b6322bd64c0598160e01b8152836004820152846024820152600081604483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b600081526020612820565b638435035b598160e01b8152836004820152602081602483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b80516000825293506020612820565b638540661f598160e01b81526129b9565b8080831115611123575090919050565b8080831015611123575090919050565b836004820152846024820152606060448201528660648201526084810160005b888110156129f15780880151828201526020016129d9565b506060828960a40184336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b815160408301513d6000853e8b8b82606087013350600060045af15059612a468d3d6129a9565b8c01612a528187612999565b5b82811015612a675760008152602001612a53565b50929c50505050505050565b6373509064598160e01b8152602081600483336000905af158600e01573d6000803e3d6000fd5b3d6001141558600a015760016000f35b8051600082529350602061282056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000054431918cec22932fcf97e54769f4e00f646690f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000004200000000000000000000000000000000000006
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000004200000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000100000000000000000000000054431918cec22932fcf97e54769f4e00f646690f000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000004200000000000000000000000000000000000006
-----Decoded View---------------
Arg [0] : _multiWrapper (address): 0xa0446d8804611944f1b527ecd37d7dcbe442caba
Arg [1] : existingOracles (address[]): 0x54431918cec22932fcf97e54769f4e00f646690f
Arg [2] : oracleTypes (uint8[]): 0
Arg [3] : existingConnectors (address[]): 0xffffffffffffffffffffffffffffffffffffffff,0x4200000000000000000000000000000000000006
Arg [4] : wBase (address): 0x4200000000000000000000000000000000000006
-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 000000000000000000000000a0446d8804611944f1b527ecd37d7dcbe442caba
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [4] : 0000000000000000000000004200000000000000000000000000000000000006
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [6] : 00000000000000000000000054431918cec22932fcf97e54769f4e00f646690f
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [10] : 000000000000000000000000ffffffffffffffffffffffffffffffffffffffff
Arg [11] : 0000000000000000000000004200000000000000000000000000000000000006
Deployed ByteCode Sourcemap
321:10305:6:-:0;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;6091:189;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;6091:189:6;;;;:::i;:::-;;2467:1601;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4074:293;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1700:145:0;;;:::i;8426:1810:6:-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;8426:1810:6;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;6452:1896;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;6452:1896:6;;;;;;;;;;;;;;;;;;;;:::i;1068:85:0:-;;;:::i;:::-;;;;;;;;;;;;;;;;;;4545:674:6;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;4545:674:6;;;;;;;;;;;:::i;5898:187::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;5898:187:6;;;;:::i;920:32::-;;;:::i;4373:166::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;4373:166:6;;;;:::i;5225:667::-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;5225:667:6;;;;;;;;;;;:::i;1994:240:0:-;;;;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;1994:240:0;;;;:::i;6091:189:6:-;1291:12:0;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;6171:38:6::1;:11;6198:9:::0;6171:18:::1;:38::i;:::-;6163:68;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;6246:27;6263:9;6246:27;;;::::0;;::::1;::::0;;::::1;;;;;;;;;6091:189:::0;:::o;2467:1601::-;2507:27;;2579:30;2663:11;;:33;;:::i;:::-;;-1:-1:-1;2626:12:6;;:34;;:::i;:::-;;;:70;2612:85;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2612:85:6;;2579:118;;2707:37;2764:13;:20;2747:38;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2747:38:6;;2707:78;;2800:9;2795:209;2819:12;;:34;;:::i;:::-;;;2815:1;:38;2795:209;;;2909:12;2937:1;2909:12;:30;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;2874:13;2888:1;2874:13;:16;;;;;;;;;;;;:67;;;;;;;;;;;2978:15;2955:17;2973:1;2955:20;;;;;;;;;;;;;:38;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2855:3:6;;2795:209;;;-1:-1:-1;3014:24:6;3041:12;;:34;;:::i;:::-;;;3014:61;;3091:9;3086:699;3110:11;;:33;;:::i;:::-;;;3106:1;:37;3086:699;;;3182:14;3232:16;3164:15;3295:11;3322:1;3295:11;:29;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3287:38;-1:-1:-1;3287:38:6;3340:243;3361:13;:20;3357:1;:24;3340:243;;;3430:6;3410:26;;:13;3424:1;3410:16;;;;;;;;;;;;;;:26;;;3406:163;;;3474:1;3460:15;;3504:19;3497:26;;3545:5;;3406:163;3383:3;;3340:243;;;-1:-1:-1;3608:14:6;3600:4;:22;;;;;;;;;3596:79;;;3642:18;;;;;3596:79;3717:6;3688:13;3702:11;3688:26;;;;;;;;;;;;;:35;;;;;;;;;;;3770:4;3737:17;3755:11;3737:30;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;3145:3:6;;;;;-1:-1:-1;3086:699:6;;-1:-1:-1;3086:699:6;;;3822:16;3808:31;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3808:31:6;;3795:44;;3880:16;3863:34;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3863:34:6;;3849:48;;3912:9;3907:155;3931:16;3927:1;:20;3907:155;;;3984:13;3998:1;3984:16;;;;;;;;;;;;;;3968:10;3979:1;3968:13;;;;;;;;;;;;;:32;;;;;;;;;;;4031:17;4049:1;4031:20;;;;;;;;;;;;;;4014:11;4026:1;4014:14;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3949:3:6;;3907:155;;;;2467:1601;;;;;:::o;4074:293::-;4119:29;4189:20;:11;:18;:20::i;:::-;4176:34;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4176:34:6;;4160:50;;4225:9;4220:141;4244:13;:20;4240:1;:24;4220:141;;;4319:11;4346:1;4319:11;:29;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;4285:13;4299:1;4285:13;:16;;;;;;;:65;;;;:16;;;;;;;;;;;:65;4266:3;;4220:141;;;;4074:293;:::o;1700:145:0:-;1291:12;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;1806:1:::1;::::0;;1790:6:::1;;:::i;:::-;;;;;;;;1769:40;;;;;;;;;;;;1836:1;::::0;1819:19;1836:1;1819:19:::1;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;1700:145::o:0;8426:1810:6:-;8509:20;8541:19;8571:32;8605:25;8634:43;8652:8;8662:14;8634:17;:43::i;:::-;8570:107;;;;8687:33;:51;;;;;;;;998:42;8687:51;;;8731:6;8687:51;;;;;;;;-1:-1:-1;8748:94:6;;;;;;;;8786:11;;8748:94;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;8748:94:6;;;-1:-1:-1;;8748:94:6;;8814:12;;8748:94;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;-1:-1:-1;;;8748:94:6;;;;-1:-1:-1;8748:94:6;;-1:-1:-1;8852:28:6;;-1:-1:-1;8883:11:6;;8852:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;8925:10;8920:1211;8946:16;:23;8941:2;:28;8920:1211;;;8996:10;8991:1130;9017:23;9012:2;:28;8991:1130;;;9094:16;9111:2;9094:20;;;;;;;;;;;9070:44;;:16;9087:2;9070:20;;;;;;;;;;;;;;:44;;;9066:110;;;9145:8;9154:2;9145:12;;;;;;;;;;;;;;9138:19;;;;;;;;;;;;9066:110;9198:9;9193:914;9217:11;:18;9213:1;:22;9193:914;;;9264:16;9298:11;9310:1;9298:14;;;;;;;;;;;;;;9290:23;-1:-1:-1;9353:16:6;9370:2;9353:16;:20;;;;;;;;;;;;;9340:33;;:9;:33;;;:70;;;;9390:16;9407:2;9390:20;;;;;;;;;;;9377:33;;:9;:33;;;9340:70;9336:133;;;9438:8;;;9336:133;9495:9;9490:599;9514:14;9529:2;9514:18;;;;;;;;;;;:25;9510:1;:29;9490:599;;;9592:14;9607:2;9592:18;;;;;;;;;;;9611:1;9592:21;;;;;;;;;;;;;;9576:47;;;9624:16;9641:2;9624:16;:20;;;;;;;;;;;;;9646:16;9663:2;9646:20;;;;;;;;;;;9668:9;9576:102;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;9576:102:6;;-1:-1:-1;;9576:102:6;9572:454;;;;;9755:32;9782:4;9755:22;9764:8;9773:2;9764:12;;;;;;;;;;;;;;9755:4;;:8;:22::i;:::-;:26;;:32::i;:::-;9748:39;-1:-1:-1;9826:18:6;9837:6;;9826:10;:18::i;:::-;9817:27;-1:-1:-1;9889:34:6;9906:16;:4;9817:27;9906:8;:16::i;:::-;9889:12;;:16;:34::i;:::-;9874:49;-1:-1:-1;9967:23:6;:11;9983:6;9967:15;:23::i;:::-;9953:37;;9679:338;;9572:454;9541:3;;9490:599;;;;9193:914;;9237:3;;9193:914;;;-1:-1:-1;9042:4:6;;8991:1130;;;-1:-1:-1;8971:4:6;;8920:1211;;;-1:-1:-1;10144:15:6;;10140:90;;10190:29;:12;10207:11;10190:16;:29::i;:::-;10175:44;;10140:90;8426:1810;;;;;;;;;;;:::o;6452:1896::-;6544:20;6596:8;6584:20;;:8;:20;;;;6576:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;6648:19;6678:27;6711:9;:7;:9::i;:::-;6677:43;;;6731:32;6765:25;6794:40;6812:8;6822:11;6794:17;:40::i;:::-;6730:104;;;;6845:32;6879:25;6908:40;6926:8;6936:11;6908:17;:40::i;:::-;6844:104;;-1:-1:-1;6844:104:6;-1:-1:-1;6958:28:6;6989:11;;6958:57;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;7031:10;7026:1217;7052:16;:23;7047:2;:28;7026:1217;;;7102:10;7097:1136;7123:16;:23;7118:2;:28;7097:1136;;;7200:16;7217:2;7200:20;;;;;;;;;;;;;;7176:44;;:16;7193:2;7176:20;;;;;;;;;;;;;;:44;;;7172:138;;;7251:40;7286:4;7251:30;7268:8;7277:2;7268:12;;;;;;;;;;;;;;7251:8;7260:2;7251:12;;;;;;;;;;;;;;:16;;:30::i;:40::-;7244:47;;;;;;;;;;;;;7172:138;7332:9;7327:892;7351:11;:18;7347:1;:22;7327:892;;;7437:16;7454:2;7437:20;;;;;;;;;;;;;;7402:55;;7417:11;7429:1;7417:14;;;;;;;;;;;;;;7402:55;;;;:114;;;7496:16;7513:2;7496:20;;;;;;;;;;;;;;7461:55;;7476:11;7488:1;7476:14;;;;;;;;;;;;;;7461:55;;;7402:114;7398:177;;;7544:8;;7398:177;7601:9;7596:605;7620:10;:17;7616:1;:21;7596:605;;;7674:10;7685:1;7674:13;;;;;;;;;;;;;;:21;;;7696:16;7713:2;7696:20;;;;;;;;;;;;;;7718:16;7735:2;7718:20;;;;;;;;;;;;;;7755:11;7767:1;7755:14;;;;;;;;;;;;;;7674:98;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;-1:-1:-1;7674:98:6;;-1:-1:-1;;7674:98:6;7670:468;;;;;7849:50;7894:4;7849:40;7876:8;7885:2;7876:12;;;;;;;;;;;;;;7849:22;7858:8;7867:2;7858:12;;;;;;;;;;;;;;7849:4;;:8;:22::i;:::-;:26;;:40::i;:50::-;7842:57;-1:-1:-1;7938:18:6;7949:6;;7938:10;:18::i;:::-;7929:27;-1:-1:-1;8001:34:6;8018:16;:4;7929:27;8018:8;:16::i;8001:34::-;7986:49;-1:-1:-1;8079:23:6;:11;8095:6;8079:15;:23::i;:::-;8065:37;;7773:356;;7670:468;7639:3;;7596:605;;;;7327:892;7371:3;;7327:892;;;-1:-1:-1;7148:4:6;;7097:1136;;;-1:-1:-1;7077:4:6;;7026:1217;;;-1:-1:-1;8256:15:6;;8252:90;;8302:29;:12;8319:11;8302:16;:29::i;:::-;8287:44;;8252:90;6452:1896;;;;;;;;;;;;;:::o;1068:85:0:-;1114:7;;;1140:6;;:::i;:::-;;;;;;;;1133:13;;1068:85;:::o;4545:674:6:-;1291:12:0;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4650:15:6::1;4636:10;:29;;;;;;;;;4632:535;;;4689:33;:12;4714:6:::0;4689:16:::1;:33::i;:::-;4681:66;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;4632:535;;;4782:14;4768:10;:28;;;;;;;;;4764:403;;;4820:32;:11;4844:6:::0;4820:15:::1;:32::i;4764:403::-;4912:19;4898:10;:33;;;;;;;;;4894:273;;;4955:33;:12;4980:6:::0;4955:16:::1;:33::i;:::-;4947:66;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;5035:32;:11;5059:6:::0;5035:15:::1;:32::i;4894:273::-;5123:33;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;4894:273;5181:31;5193:6;5201:10;5181:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4545:674:::0;;:::o;5898:187::-;1291:12:0;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;5975:35:6::1;:11;5999:9:::0;5975:15:::1;:35::i;:::-;5967:71;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;6053:25;6068:9;6053:25;;;::::0;;::::1;::::0;;::::1;;;;;;;;;5898:187:::0;:::o;920:32::-;;;;;:::i;:::-;;;;;;;;;:::o;4373:166::-;1291:12:0;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4470:13:6;4455:12:::1;:28:::0;:12;:28:::1;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;4498:34;4518:13;4498:34;;;::::0;;::::1;::::0;;::::1;;;;;;;;;4373:166:::0;:::o;5225:667::-;1291:12:0;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;5333:15:6::1;5319:10;:29;;;;;;;;;5315:523;;;5372:36;:12;5400:6:::0;5372:19:::1;:36::i;:::-;5364:63;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;5315:523;;;5462:14;5448:10;:28;;;;;;;;;5444:394;;;5500:35;:11;5527:6:::0;5500:18:::1;:35::i;5444:394::-;5589:19;5575:10;:33;;;;;;;;;5571:267;;;5632:36;:12;5660:6:::0;5632:19:::1;:36::i;:::-;5624:63;;;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;;5709:35;:11;5736:6:::0;5709:18:::1;:35::i;5571:267::-;5794:33;;;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;::::1;;;;;;;;:::i;:::-;;;5571:267;5852:33;5866:6;5874:10;5852:33;;;;;;;;;;;;;;;;;;1994:240:0::0;1291:12;:10;:12::i;:::-;1280:23;;:7;:5;:7::i;:::-;:23;;;1272:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2082:22:::1;::::0;::::1;2074:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;2191:8;2162:38;;2183:6;::::0;::::1;;:::i;:::-;;;;;;;;2162:38;;;;;;;;;;;;2219:8:::0;2210:6:::1;:17:::0;:6;:17:::1;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;1994:240:::0;:::o;6421:150:4:-;6491:4;6514:50;6519:3;6539:23;;;6514:4;:50::i;598:104:3:-;651:15;685:10;;;:::i;:::-;678:17;;598:104;:::o;6739:156:4:-;6812:4;6835:53;6843:3;6863:23;;;6835:7;:53::i;7222:115::-;7285:7;7311:19;7319:3;7311:7;:19::i;10242:382:6:-;10324:29;10355:22;10393:11;10389:85;;;10427:12;;;;:::i;:::-;;;;;;;;:29;;;10457:5;10427:36;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10427:36:6;;;;;;;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;10427:36:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;10427:36:6;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10420:43;;;;;;10389:85;10513:1;10500:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10500:15:6;;10484:31;;10544:5;10525:13;10539:1;10525:16;;;;;;;;:24;;;;:16;;;;;;;;;;;:24;10581:1;10567:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;10567:16:6;;10559:24;;10612:4;10593:5;10599:1;10593:8;;;;;;;;;;;;;:24;;;;;10242:382;;;;;;:::o;3530:215:1:-;3588:7;3611:6;3607:20;;-1:-1:-1;3626:1:1;3619:8;;3607:20;3649:5;;;3653:1;3649;:5;:1;3672:5;;;;;:10;3664:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;3737:1;3530:215;-1:-1:-1;;;3530:215:1:o;4209:150::-;4267:7;4298:1;4294;:5;4286:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;4351:1;4347;:5;;;;;;;4209:150;-1:-1:-1;;;4209:150:1:o;2682:175::-;2740:7;2771:5;;;2794:6;;;;2786:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;1632:404:4:-;1695:4;1716:21;1726:3;1731:5;1716:9;:21::i;:::-;1711:319;;1770:5;1753:3;;:23;:3;:23;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1;;1753:23:4;;;;;;;;;-1:-1:-1;1753:23:4;;;;:::i;:::-;-1:-1:-1;1933:3:4;;-1:-1:-1;1933:3:4;:18;;:::i;:::-;1911:19;;;;:12;;;:19;;1933:18;;-1:-1:-1;1911:19:4;;;:40;;;;:::i;:::-;;;;1972:4;1965:11;;;;1711:319;-1:-1:-1;2014:5:4;2007:12;;2204:1512;2270:4;2407:19;;;:12;;;:19;;2270:4;2407:19;2270:4;2407:19;;;:::i;:::-;2386:40;-1:-1:-1;2441:15:4;;2437:1273;;2822:14;;;2798:21;2835:1;2870:3;;:18;;:::i;:::-;;;:22;2850:42;;3132:17;3152:3;:11;;3164:9;3152:22;;;:::i;:::-;;;;;;;;;;;;;;;;:::i;:::-;3132:42;-1:-1:-1;3132:42:4;3266:3;3278:13;3266:3;:26;;:::i;:::-;;;;;;;;;;;;;;:38;;;;:::i;:::-;-1:-1:-1;;;3370:23:4;;;;3412:1;3370:12;;;:23;;3396:17;;;3370:23;;;:43;;;;:::i;:::-;;;;3519:3;:11;;:17;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;:::i;:::-;-1:-1:-1;;3611:19:4;;;;:12;;;:19;;;;;3604:26;;;;:::i;:::-;;;3652:4;3645:11;;;;;;;;2437:1273;3694:5;3687:12;;;;;4005:107;4061:7;4087:3;;:18;;:::i;3797:127::-;3870:4;3893:19;;;:12;;;:19;;;3870:4;3893:19;;;:::i;:::-;:24;;;3797:127;-1:-1:-1;;;3797:127:4:o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.