Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
ExpiryV2
Compiler Version
v0.5.7+commit.6da8b019
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2019-08-29 */ /* Copyright 2019 dYdX Trading Inc. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ pragma solidity 0.5.7; pragma experimental ABIEncoderV2; // File: openzeppelin-solidity/contracts/math/SafeMath.sol /** * @title SafeMath * @dev Unsigned math operations with safety checks that revert on error */ library SafeMath { /** * @dev Multiplies two unsigned integers, reverts on overflow. */ function mul(uint256 a, uint256 b) internal pure returns (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-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b); return c; } /** * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend). */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a); uint256 c = a - b; return c; } /** * @dev Adds two unsigned integers, reverts on overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a); return c; } /** * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo), * reverts when dividing by zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0); return a % b; } } // File: openzeppelin-solidity/contracts/ownership/Ownable.sol /** * @title Ownable * @dev The Ownable contract has an owner address, and provides basic authorization control * functions, this simplifies the implementation of "user permissions". */ contract Ownable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev The Ownable constructor sets the original `owner` of the contract to the sender * account. */ constructor () internal { _owner = msg.sender; emit OwnershipTransferred(address(0), _owner); } /** * @return the address of the owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner()); _; } /** * @return true if `msg.sender` is the owner of the contract. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows the current owner to relinquish control of the contract. * @notice Renouncing to ownership will leave the contract without an owner. * It will not be possible to call the functions with the `onlyOwner` * modifier anymore. */ function renounceOwnership() public onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Allows the current owner to transfer control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function transferOwnership(address newOwner) public onlyOwner { _transferOwnership(newOwner); } /** * @dev Transfers control of the contract to a newOwner. * @param newOwner The address to transfer ownership to. */ function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/protocol/lib/Require.sol /** * @title Require * @author dYdX * * Stringifies parameters to pretty-print revert messages. Costs more gas than regular require() */ library Require { // ============ Constants ============ uint256 constant ASCII_ZERO = 48; // '0' uint256 constant ASCII_RELATIVE_ZERO = 87; // 'a' - 10 uint256 constant ASCII_LOWER_EX = 120; // 'x' bytes2 constant COLON = 0x3a20; // ': ' bytes2 constant COMMA = 0x2c20; // ', ' bytes2 constant LPAREN = 0x203c; // ' <' byte constant RPAREN = 0x3e; // '>' uint256 constant FOUR_BIT_MASK = 0xf; // ============ Library Functions ============ function that( bool must, bytes32 file, bytes32 reason ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason) ) ) ); } } function that( bool must, bytes32 file, bytes32 reason, uint256 payloadA ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason), LPAREN, stringify(payloadA), RPAREN ) ) ); } } function that( bool must, bytes32 file, bytes32 reason, uint256 payloadA, uint256 payloadB ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason), LPAREN, stringify(payloadA), COMMA, stringify(payloadB), RPAREN ) ) ); } } function that( bool must, bytes32 file, bytes32 reason, address payloadA ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason), LPAREN, stringify(payloadA), RPAREN ) ) ); } } function that( bool must, bytes32 file, bytes32 reason, address payloadA, uint256 payloadB ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason), LPAREN, stringify(payloadA), COMMA, stringify(payloadB), RPAREN ) ) ); } } function that( bool must, bytes32 file, bytes32 reason, address payloadA, uint256 payloadB, uint256 payloadC ) internal pure { if (!must) { revert( string( abi.encodePacked( stringify(file), COLON, stringify(reason), LPAREN, stringify(payloadA), COMMA, stringify(payloadB), COMMA, stringify(payloadC), RPAREN ) ) ); } } // ============ Private Functions ============ function stringify( bytes32 input ) private pure returns (bytes memory) { // put the input bytes into the result bytes memory result = abi.encodePacked(input); // determine the length of the input by finding the location of the last non-zero byte for (uint256 i = 32; i > 0; ) { // reverse-for-loops with unsigned integer /* solium-disable-next-line security/no-modify-for-iter-var */ i--; // find the last non-zero byte in order to determine the length if (result[i] != 0) { uint256 length = i + 1; /* solium-disable-next-line security/no-inline-assembly */ assembly { mstore(result, length) // r.length = length; } return result; } } // all bytes are zero return new bytes(0); } function stringify( uint256 input ) private pure returns (bytes memory) { if (input == 0) { return "0"; } // get the final string length uint256 j = input; uint256 length; while (j != 0) { length++; j /= 10; } // allocate the string bytes memory bstr = new bytes(length); // populate the string starting with the least-significant character j = input; for (uint256 i = length; i > 0; ) { // reverse-for-loops with unsigned integer /* solium-disable-next-line security/no-modify-for-iter-var */ i--; // take last decimal digit bstr[i] = byte(uint8(ASCII_ZERO + (j % 10))); // remove the last decimal digit j /= 10; } return bstr; } function stringify( address input ) private pure returns (bytes memory) { uint256 z = uint256(input); // addresses are "0x" followed by 20 bytes of data which take up 2 characters each bytes memory result = new bytes(42); // populate the result with "0x" result[0] = byte(uint8(ASCII_ZERO)); result[1] = byte(uint8(ASCII_LOWER_EX)); // for each byte (starting from the lowest byte), populate the result with two characters for (uint256 i = 0; i < 20; i++) { // each byte takes two characters uint256 shift = i * 2; // populate the least-significant character result[41 - shift] = char(z & FOUR_BIT_MASK); z = z >> 4; // populate the most-significant character result[40 - shift] = char(z & FOUR_BIT_MASK); z = z >> 4; } return result; } function char( uint256 input ) private pure returns (byte) { // return ASCII digit (0-9) if (input < 10) { return byte(uint8(input + ASCII_ZERO)); } // return ASCII letter (a-f) return byte(uint8(input + ASCII_RELATIVE_ZERO)); } } // File: contracts/protocol/lib/Math.sol /** * @title Math * @author dYdX * * Library for non-standard Math functions */ library Math { using SafeMath for uint256; // ============ Constants ============ bytes32 constant FILE = "Math"; // ============ Library Functions ============ /* * Return target * (numerator / denominator). */ function getPartial( uint256 target, uint256 numerator, uint256 denominator ) internal pure returns (uint256) { return target.mul(numerator).div(denominator); } /* * Return target * (numerator / denominator), but rounded up. */ function getPartialRoundUp( uint256 target, uint256 numerator, uint256 denominator ) internal pure returns (uint256) { if (target == 0 || numerator == 0) { // SafeMath will check for zero denominator return SafeMath.div(0, denominator); } return target.mul(numerator).sub(1).div(denominator).add(1); } function to128( uint256 number ) internal pure returns (uint128) { uint128 result = uint128(number); Require.that( result == number, FILE, "Unsafe cast to uint128" ); return result; } function to96( uint256 number ) internal pure returns (uint96) { uint96 result = uint96(number); Require.that( result == number, FILE, "Unsafe cast to uint96" ); return result; } function to32( uint256 number ) internal pure returns (uint32) { uint32 result = uint32(number); Require.that( result == number, FILE, "Unsafe cast to uint32" ); return result; } function min( uint256 a, uint256 b ) internal pure returns (uint256) { return a < b ? a : b; } function max( uint256 a, uint256 b ) internal pure returns (uint256) { return a > b ? a : b; } } // File: contracts/protocol/lib/Types.sol /** * @title Types * @author dYdX * * Library for interacting with the basic structs used in Solo */ library Types { using Math for uint256; // ============ AssetAmount ============ enum AssetDenomination { Wei, // the amount is denominated in wei Par // the amount is denominated in par } enum AssetReference { Delta, // the amount is given as a delta from the current value Target // the amount is given as an exact number to end up at } struct AssetAmount { bool sign; // true if positive AssetDenomination denomination; AssetReference ref; uint256 value; } // ============ Par (Principal Amount) ============ // Total borrow and supply values for a market struct TotalPar { uint128 borrow; uint128 supply; } // Individual principal amount for an account struct Par { bool sign; // true if positive uint128 value; } function zeroPar() internal pure returns (Par memory) { return Par({ sign: false, value: 0 }); } function sub( Par memory a, Par memory b ) internal pure returns (Par memory) { return add(a, negative(b)); } function add( Par memory a, Par memory b ) internal pure returns (Par memory) { Par memory result; if (a.sign == b.sign) { result.sign = a.sign; result.value = SafeMath.add(a.value, b.value).to128(); } else { if (a.value >= b.value) { result.sign = a.sign; result.value = SafeMath.sub(a.value, b.value).to128(); } else { result.sign = b.sign; result.value = SafeMath.sub(b.value, a.value).to128(); } } return result; } function equals( Par memory a, Par memory b ) internal pure returns (bool) { if (a.value == b.value) { if (a.value == 0) { return true; } return a.sign == b.sign; } return false; } function negative( Par memory a ) internal pure returns (Par memory) { return Par({ sign: !a.sign, value: a.value }); } function isNegative( Par memory a ) internal pure returns (bool) { return !a.sign && a.value > 0; } function isPositive( Par memory a ) internal pure returns (bool) { return a.sign && a.value > 0; } function isZero( Par memory a ) internal pure returns (bool) { return a.value == 0; } // ============ Wei (Token Amount) ============ // Individual token amount for an account struct Wei { bool sign; // true if positive uint256 value; } function zeroWei() internal pure returns (Wei memory) { return Wei({ sign: false, value: 0 }); } function sub( Wei memory a, Wei memory b ) internal pure returns (Wei memory) { return add(a, negative(b)); } function add( Wei memory a, Wei memory b ) internal pure returns (Wei memory) { Wei memory result; if (a.sign == b.sign) { result.sign = a.sign; result.value = SafeMath.add(a.value, b.value); } else { if (a.value >= b.value) { result.sign = a.sign; result.value = SafeMath.sub(a.value, b.value); } else { result.sign = b.sign; result.value = SafeMath.sub(b.value, a.value); } } return result; } function equals( Wei memory a, Wei memory b ) internal pure returns (bool) { if (a.value == b.value) { if (a.value == 0) { return true; } return a.sign == b.sign; } return false; } function negative( Wei memory a ) internal pure returns (Wei memory) { return Wei({ sign: !a.sign, value: a.value }); } function isNegative( Wei memory a ) internal pure returns (bool) { return !a.sign && a.value > 0; } function isPositive( Wei memory a ) internal pure returns (bool) { return a.sign && a.value > 0; } function isZero( Wei memory a ) internal pure returns (bool) { return a.value == 0; } } // File: contracts/protocol/lib/Account.sol /** * @title Account * @author dYdX * * Library of structs and functions that represent an account */ library Account { // ============ Enums ============ /* * Most-recently-cached account status. * * Normal: Can only be liquidated if the account values are violating the global margin-ratio. * Liquid: Can be liquidated no matter the account values. * Can be vaporized if there are no more positive account values. * Vapor: Has only negative (or zeroed) account values. Can be vaporized. * */ enum Status { Normal, Liquid, Vapor } // ============ Structs ============ // Represents the unique key that specifies an account struct Info { address owner; // The address that owns the account uint256 number; // A nonce that allows a single address to control many accounts } // The complete storage for any account struct Storage { mapping (uint256 => Types.Par) balances; // Mapping from marketId to principal Status status; } // ============ Library Functions ============ function equals( Info memory a, Info memory b ) internal pure returns (bool) { return a.owner == b.owner && a.number == b.number; } } // File: contracts/protocol/interfaces/IAutoTrader.sol /** * @title IAutoTrader * @author dYdX * * Interface that Auto-Traders for Solo must implement in order to approve trades. */ contract IAutoTrader { // ============ Public Functions ============ /** * Allows traders to make trades approved by this smart contract. The active trader's account is * the takerAccount and the passive account (for which this contract approves trades * on-behalf-of) is the makerAccount. * * @param inputMarketId The market for which the trader specified the original amount * @param outputMarketId The market for which the trader wants the resulting amount specified * @param makerAccount The account for which this contract is making trades * @param takerAccount The account requesting the trade * @param oldInputPar The old principal amount for the makerAccount for the inputMarketId * @param newInputPar The new principal amount for the makerAccount for the inputMarketId * @param inputWei The change in token amount for the makerAccount for the inputMarketId * @param data Arbitrary data passed in by the trader * @return The AssetAmount for the makerAccount for the outputMarketId */ function getTradeCost( uint256 inputMarketId, uint256 outputMarketId, Account.Info memory makerAccount, Account.Info memory takerAccount, Types.Par memory oldInputPar, Types.Par memory newInputPar, Types.Wei memory inputWei, bytes memory data ) public returns (Types.AssetAmount memory); } // File: contracts/protocol/interfaces/ICallee.sol /** * @title ICallee * @author dYdX * * Interface that Callees for Solo must implement in order to ingest data. */ contract ICallee { // ============ Public Functions ============ /** * Allows users to send this contract arbitrary data. * * @param sender The msg.sender to Solo * @param accountInfo The account from which the data is being sent * @param data Arbitrary data given by the sender */ function callFunction( address sender, Account.Info memory accountInfo, bytes memory data ) public; } // File: contracts/protocol/lib/Decimal.sol /** * @title Decimal * @author dYdX * * Library that defines a fixed-point number with 18 decimal places. */ library Decimal { using SafeMath for uint256; // ============ Constants ============ uint256 constant BASE = 10**18; // ============ Structs ============ struct D256 { uint256 value; } // ============ Functions ============ function one() internal pure returns (D256 memory) { return D256({ value: BASE }); } function onePlus( D256 memory d ) internal pure returns (D256 memory) { return D256({ value: d.value.add(BASE) }); } function mul( uint256 target, D256 memory d ) internal pure returns (uint256) { return Math.getPartial(target, d.value, BASE); } function div( uint256 target, D256 memory d ) internal pure returns (uint256) { return Math.getPartial(target, BASE, d.value); } } // File: contracts/protocol/lib/Monetary.sol /** * @title Monetary * @author dYdX * * Library for types involving money */ library Monetary { /* * The price of a base-unit of an asset. */ struct Price { uint256 value; } /* * Total value of an some amount of an asset. Equal to (price * amount). */ struct Value { uint256 value; } } // File: contracts/protocol/lib/Time.sol /** * @title Time * @author dYdX * * Library for dealing with time, assuming timestamps fit within 32 bits (valid until year 2106) */ library Time { // ============ Library Functions ============ function currentTime() internal view returns (uint32) { return Math.to32(block.timestamp); } } // File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol /** * @title Helps contracts guard against reentrancy attacks. * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]> * @dev If you mark a function `nonReentrant`, you should also * mark it `external`. */ contract ReentrancyGuard { /// @dev counter to allow mutex lock with only one SSTORE operation uint256 private _guardCounter; constructor () internal { // The counter starts at one to prevent changing it from zero to a non-zero // value, which is a more expensive operation. _guardCounter = 1; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { _guardCounter += 1; uint256 localCounter = _guardCounter; _; require(localCounter == _guardCounter); } } // File: contracts/protocol/Getters.sol /** * @title Getters * @author dYdX * * Public read-only functions that allow transparency into the state of Solo */ contract Getters { // ============ Constants ============ bytes32 FILE = "Getters"; // ============ Getters for Risk ============ /* ... */ // ============ Getters for Markets ============ /** * Get the total number of markets. * * @return The number of markets */ function getNumMarkets() public view returns (uint256); /** * Get the ERC20 token address for a market. * * @param marketId The market to query * @return The token address */ function getMarketTokenAddress( uint256 marketId ) public view returns (address); /** * Get the total principal amounts (borrowed and supplied) for a market. * * @param marketId The market to query * @return The total principal amounts */ function getMarketTotalPar( uint256 marketId ) public view returns (Types.TotalPar memory); /* ... */ /** * Get the margin premium for a market. A margin premium makes it so that any positions that * include the market require a higher collateralization to avoid being liquidated. * * @param marketId The market to query * @return The market's margin premium */ function getMarketMarginPremium( uint256 marketId ) public view returns (Decimal.D256 memory); /** * Get the spread premium for a market. A spread premium makes it so that any liquidations * that include the market have a higher spread than the global default. * * @param marketId The market to query * @return The market's spread premium */ function getMarketSpreadPremium( uint256 marketId ) public view returns (Decimal.D256 memory); /** * Return true if a particular market is in closing mode. Additional borrows cannot be taken * from a market that is closing. * * @param marketId The market to query * @return True if the market is closing */ function getMarketIsClosing( uint256 marketId ) public view returns (bool); /** * Get the price of the token for a market. * * @param marketId The market to query * @return The price of each atomic unit of the token */ function getMarketPrice( uint256 marketId ) public view returns (Monetary.Price memory); /* ... */ /** * Get the adjusted liquidation spread for some market pair. This is equal to the global * liquidation spread multiplied by (1 + spreadPremium) for each of the two markets. * * @param heldMarketId The market for which the account has collateral * @param owedMarketId The market for which the account has borrowed tokens * @return The adjusted liquidation spread */ function getLiquidationSpreadForPair( uint256 heldMarketId, uint256 owedMarketId ) public view returns (Decimal.D256 memory); /* ... */ /** * Get the number of excess tokens for a market. The number of excess tokens is calculated * by taking the current number of tokens held in Solo, adding the number of tokens owed to Solo * by borrowers, and subtracting the number of tokens owed to suppliers by Solo. * * @param marketId The market to query * @return The number of excess tokens */ function getNumExcessTokens( uint256 marketId ) public view returns (Types.Wei memory); // ============ Getters for Accounts ============ /** * Get the principal value for a particular account and market. * * @param account The account to query * @param marketId The market to query * @return The principal value */ function getAccountPar( Account.Info memory account, uint256 marketId ) public view returns (Types.Par memory); /** * Get the token balance for a particular account and market. * * @param account The account to query * @param marketId The market to query * @return The token amount */ function getAccountWei( Account.Info memory account, uint256 marketId ) public view returns (Types.Wei memory); /** * Get the status of an account (Normal, Liquidating, or Vaporizing). * * @param account The account to query * @return The account's status */ function getAccountStatus( Account.Info memory account ) public view returns (Account.Status); /** * Get the total supplied and total borrowed value of an account. * * @param account The account to query * @return The following values: * - The supplied value of the account * - The borrowed value of the account */ function getAccountValues( Account.Info memory account ) public view returns (Monetary.Value memory, Monetary.Value memory); /** * Get the total supplied and total borrowed values of an account adjusted by the marginPremium * of each market. Supplied values are divided by (1 + marginPremium) for each market and * borrowed values are multiplied by (1 + marginPremium) for each market. Comparing these * adjusted values gives the margin-ratio of the account which will be compared to the global * margin-ratio when determining if the account can be liquidated. * * @param account The account to query * @return The following values: * - The supplied value of the account (adjusted for marginPremium) * - The borrowed value of the account (adjusted for marginPremium) */ function getAdjustedAccountValues( Account.Info memory account ) public view returns (Monetary.Value memory, Monetary.Value memory); /** * Get an account's summary for each market. * * @param account The account to query * @return The following values: * - The ERC20 token address for each market * - The account's principal value for each market * - The account's (supplied or borrowed) number of tokens for each market */ function getAccountBalances( Account.Info memory account ) public view returns ( address[] memory, Types.Par[] memory, Types.Wei[] memory ); // ============ Getters for Permissions ============ /** * Return true if a particular address is approved as an operator for an owner's accounts. * Approved operators can act on the accounts of the owner as if it were the operator's own. * * @param owner The owner of the accounts * @param operator The possible operator * @return True if operator is approved for owner's accounts */ function getIsLocalOperator( address owner, address operator ) public view returns (bool); /** * Return true if a particular address is approved as a global operator. Such an address can * act on any account as if it were the operator's own. * * @param operator The address to query * @return True if operator is a global operator */ function getIsGlobalOperator( address operator ) public view returns (bool); } // File: contracts/protocol/SoloMargin.sol /** * @title SoloMargin * @author dYdX * * Main contract that inherits from other contracts */ contract SoloMargin is Getters { /* ... */ } // File: contracts/external/helpers/OnlySolo.sol /** * @title OnlySolo * @author dYdX * * Inheritable contract that restricts the calling of certain functions to Solo only */ contract OnlySolo { // ============ Constants ============ bytes32 constant FILE = "OnlySolo"; // ============ Storage ============ SoloMargin public SOLO_MARGIN; // ============ Constructor ============ constructor ( address soloMargin ) public { SOLO_MARGIN = SoloMargin(soloMargin); } // ============ Modifiers ============ modifier onlySolo(address from) { Require.that( from == address(SOLO_MARGIN), FILE, "Only Solo can call function", from ); _; } } // File: contracts/external/traders/ExpiryV2.sol /** * @title ExpiryV2 * @author dYdX * * Expiry contract that also allows approved senders to set expiry to be 28 days in the future. */ contract ExpiryV2 is Ownable, OnlySolo, ICallee, IAutoTrader { using Math for uint256; using SafeMath for uint32; using SafeMath for uint256; using Types for Types.Par; using Types for Types.Wei; // ============ Constants ============ bytes32 constant FILE = "ExpiryV2"; // ============ Enums ============ enum CallFunctionType { SetExpiry, SetApproval } // ============ Structs ============ struct SetExpiryArg { Account.Info account; uint256 marketId; uint32 timeDelta; bool forceUpdate; } struct SetApprovalArg { address sender; uint32 minTimeDelta; } // ============ Events ============ event ExpirySet( address owner, uint256 number, uint256 marketId, uint32 time ); event LogExpiryRampTimeSet( uint256 expiryRampTime ); event LogSenderApproved( address approver, address sender, uint32 minTimeDelta ); // ============ Storage ============ // owner => number => market => time mapping (address => mapping (uint256 => mapping (uint256 => uint32))) g_expiries; // owner => sender => minimum time delta mapping (address => mapping (address => uint32)) public g_approvedSender; // time over which the liquidation ratio goes from zero to maximum uint256 public g_expiryRampTime; // ============ Constructor ============ constructor ( address soloMargin, uint256 expiryRampTime ) public OnlySolo(soloMargin) { g_expiryRampTime = expiryRampTime; } // ============ Admin Functions ============ function ownerSetExpiryRampTime( uint256 newExpiryRampTime ) external onlyOwner { emit LogExpiryRampTimeSet(newExpiryRampTime); g_expiryRampTime = newExpiryRampTime; } // ============ Approval Functions ============ function approveSender( address sender, uint32 minTimeDelta ) external { setApproval(msg.sender, sender, minTimeDelta); } // ============ Only-Solo Functions ============ function callFunction( address /* sender */, Account.Info memory account, bytes memory data ) public onlySolo(msg.sender) { CallFunctionType callType = abi.decode(data, (CallFunctionType)); if (callType == CallFunctionType.SetExpiry) { callFunctionSetExpiry(account.owner, data); } else { callFunctionSetApproval(account.owner, data); } } function getTradeCost( uint256 inputMarketId, uint256 outputMarketId, Account.Info memory makerAccount, Account.Info memory /* takerAccount */, Types.Par memory oldInputPar, Types.Par memory newInputPar, Types.Wei memory inputWei, bytes memory data ) public onlySolo(msg.sender) returns (Types.AssetAmount memory) { // return zero if input amount is zero if (inputWei.isZero()) { return Types.AssetAmount({ sign: true, denomination: Types.AssetDenomination.Par, ref: Types.AssetReference.Delta, value: 0 }); } (uint256 owedMarketId, uint32 maxExpiry) = abi.decode(data, (uint256, uint32)); uint32 expiry = getExpiry(makerAccount, owedMarketId); // validate expiry Require.that( expiry != 0, FILE, "Expiry not set", makerAccount.owner, makerAccount.number, owedMarketId ); Require.that( expiry <= Time.currentTime(), FILE, "Borrow not yet expired", expiry ); Require.that( expiry <= maxExpiry, FILE, "Expiry past maxExpiry", expiry ); return getTradeCostInternal( inputMarketId, outputMarketId, makerAccount, oldInputPar, newInputPar, inputWei, owedMarketId, expiry ); } // ============ Getters ============ function getExpiry( Account.Info memory account, uint256 marketId ) public view returns (uint32) { return g_expiries[account.owner][account.number][marketId]; } function getSpreadAdjustedPrices( uint256 heldMarketId, uint256 owedMarketId, uint32 expiry ) public view returns ( Monetary.Price memory, Monetary.Price memory ) { Decimal.D256 memory spread = SOLO_MARGIN.getLiquidationSpreadForPair( heldMarketId, owedMarketId ); uint256 expiryAge = Time.currentTime().sub(expiry); if (expiryAge < g_expiryRampTime) { spread.value = Math.getPartial(spread.value, expiryAge, g_expiryRampTime); } Monetary.Price memory heldPrice = SOLO_MARGIN.getMarketPrice(heldMarketId); Monetary.Price memory owedPrice = SOLO_MARGIN.getMarketPrice(owedMarketId); owedPrice.value = owedPrice.value.add(Decimal.mul(owedPrice.value, spread)); return (heldPrice, owedPrice); } // ============ Private Functions ============ function callFunctionSetExpiry( address sender, bytes memory data ) private { ( CallFunctionType callType, SetExpiryArg[] memory expiries ) = abi.decode(data, (CallFunctionType, SetExpiryArg[])); assert(callType == CallFunctionType.SetExpiry); for (uint256 i = 0; i < expiries.length; i++) { SetExpiryArg memory exp = expiries[i]; if (exp.account.owner != sender) { // don't do anything if sender is not approved for this action uint32 minApprovedTimeDelta = g_approvedSender[exp.account.owner][sender]; if (minApprovedTimeDelta == 0 || exp.timeDelta < minApprovedTimeDelta) { continue; } } // if timeDelta is zero, interpret it as unset expiry if ( exp.timeDelta != 0 && SOLO_MARGIN.getAccountPar(exp.account, exp.marketId).isNegative() ) { // only change non-zero values if forceUpdate is true if (exp.forceUpdate || getExpiry(exp.account, exp.marketId) == 0) { uint32 newExpiryTime = Time.currentTime().add(exp.timeDelta).to32(); setExpiry(exp.account, exp.marketId, newExpiryTime); } } else { // timeDelta is zero or account has non-negative balance setExpiry(exp.account, exp.marketId, 0); } } } function callFunctionSetApproval( address sender, bytes memory data ) private { ( CallFunctionType callType, SetApprovalArg memory approvalArg ) = abi.decode(data, (CallFunctionType, SetApprovalArg)); assert(callType == CallFunctionType.SetApproval); setApproval(sender, approvalArg.sender, approvalArg.minTimeDelta); } function getTradeCostInternal( uint256 inputMarketId, uint256 outputMarketId, Account.Info memory makerAccount, Types.Par memory oldInputPar, Types.Par memory newInputPar, Types.Wei memory inputWei, uint256 owedMarketId, uint32 expiry ) private returns (Types.AssetAmount memory) { Types.AssetAmount memory output; Types.Wei memory maxOutputWei = SOLO_MARGIN.getAccountWei(makerAccount, outputMarketId); if (inputWei.isPositive()) { Require.that( inputMarketId == owedMarketId, FILE, "inputMarket mismatch", inputMarketId ); Require.that( !newInputPar.isPositive(), FILE, "Borrows cannot be overpaid", newInputPar.value ); assert(oldInputPar.isNegative()); Require.that( maxOutputWei.isPositive(), FILE, "Collateral must be positive", outputMarketId, maxOutputWei.value ); output = owedWeiToHeldWei( inputWei, outputMarketId, inputMarketId, expiry ); // clear expiry if borrow is fully repaid if (newInputPar.isZero()) { setExpiry(makerAccount, owedMarketId, 0); } } else { Require.that( outputMarketId == owedMarketId, FILE, "outputMarket mismatch", outputMarketId ); Require.that( !newInputPar.isNegative(), FILE, "Collateral cannot be overused", newInputPar.value ); assert(oldInputPar.isPositive()); Require.that( maxOutputWei.isNegative(), FILE, "Borrows must be negative", outputMarketId, maxOutputWei.value ); output = heldWeiToOwedWei( inputWei, inputMarketId, outputMarketId, expiry ); // clear expiry if borrow is fully repaid if (output.value == maxOutputWei.value) { setExpiry(makerAccount, owedMarketId, 0); } } Require.that( output.value <= maxOutputWei.value, FILE, "outputMarket too small", output.value, maxOutputWei.value ); assert(output.sign != maxOutputWei.sign); return output; } function setExpiry( Account.Info memory account, uint256 marketId, uint32 time ) private { g_expiries[account.owner][account.number][marketId] = time; emit ExpirySet( account.owner, account.number, marketId, time ); } function setApproval( address approver, address sender, uint32 minTimeDelta ) private { g_approvedSender[approver][sender] = minTimeDelta; emit LogSenderApproved(approver, sender, minTimeDelta); } function heldWeiToOwedWei( Types.Wei memory heldWei, uint256 heldMarketId, uint256 owedMarketId, uint32 expiry ) private view returns (Types.AssetAmount memory) { ( Monetary.Price memory heldPrice, Monetary.Price memory owedPrice ) = getSpreadAdjustedPrices( heldMarketId, owedMarketId, expiry ); uint256 owedAmount = Math.getPartialRoundUp( heldWei.value, heldPrice.value, owedPrice.value ); return Types.AssetAmount({ sign: true, denomination: Types.AssetDenomination.Wei, ref: Types.AssetReference.Delta, value: owedAmount }); } function owedWeiToHeldWei( Types.Wei memory owedWei, uint256 heldMarketId, uint256 owedMarketId, uint32 expiry ) private view returns (Types.AssetAmount memory) { ( Monetary.Price memory heldPrice, Monetary.Price memory owedPrice ) = getSpreadAdjustedPrices( heldMarketId, owedMarketId, expiry ); uint256 heldAmount = Math.getPartial( owedWei.value, owedPrice.value, heldPrice.value ); return Types.AssetAmount({ sign: false, denomination: Types.AssetDenomination.Wei, ref: Types.AssetReference.Delta, value: heldAmount }); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"g_approvedSender","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"SOLO_MARGIN","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"components":[{"name":"owner","type":"address"},{"name":"number","type":"uint256"}],"name":"account","type":"tuple"},{"name":"marketId","type":"uint256"}],"name":"getExpiry","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sender","type":"address"},{"name":"minTimeDelta","type":"uint32"}],"name":"approveSender","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"inputMarketId","type":"uint256"},{"name":"outputMarketId","type":"uint256"},{"components":[{"name":"owner","type":"address"},{"name":"number","type":"uint256"}],"name":"makerAccount","type":"tuple"},{"components":[{"name":"owner","type":"address"},{"name":"number","type":"uint256"}],"name":"","type":"tuple"},{"components":[{"name":"sign","type":"bool"},{"name":"value","type":"uint128"}],"name":"oldInputPar","type":"tuple"},{"components":[{"name":"sign","type":"bool"},{"name":"value","type":"uint128"}],"name":"newInputPar","type":"tuple"},{"components":[{"name":"sign","type":"bool"},{"name":"value","type":"uint256"}],"name":"inputWei","type":"tuple"},{"name":"data","type":"bytes"}],"name":"getTradeCost","outputs":[{"components":[{"name":"sign","type":"bool"},{"name":"denomination","type":"uint8"},{"name":"ref","type":"uint8"},{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"","type":"address"},{"components":[{"name":"owner","type":"address"},{"name":"number","type":"uint256"}],"name":"account","type":"tuple"},{"name":"data","type":"bytes"}],"name":"callFunction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"heldMarketId","type":"uint256"},{"name":"owedMarketId","type":"uint256"},{"name":"expiry","type":"uint32"}],"name":"getSpreadAdjustedPrices","outputs":[{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"},{"components":[{"name":"value","type":"uint256"}],"name":"","type":"tuple"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"g_expiryRampTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newExpiryRampTime","type":"uint256"}],"name":"ownerSetExpiryRampTime","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"soloMargin","type":"address"},{"name":"expiryRampTime","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"number","type":"uint256"},{"indexed":false,"name":"marketId","type":"uint256"},{"indexed":false,"name":"time","type":"uint32"}],"name":"ExpirySet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"expiryRampTime","type":"uint256"}],"name":"LogExpiryRampTimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"approver","type":"address"},{"indexed":false,"name":"sender","type":"address"},{"indexed":false,"name":"minTimeDelta","type":"uint32"}],"name":"LogSenderApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405160408062002a5a8339810180604052620000339190810190620000cb565b600080546001600160a01b031916331780825560405184926001600160a01b039290921691907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3600180546001600160a01b0319166001600160a01b0392909216919091179055600455506200012c565b6000620000b682516200010a565b9392505050565b6000620000b6825162000129565b60008060408385031215620000df57600080fd5b6000620000ed8585620000a8565b92505060206200010085828601620000bd565b9150509250929050565b600062000117826200011d565b92915050565b6001600160a01b031690565b90565b61291e806200013c6000396000f3fe608060405234801561001057600080fd5b50600436106100df5760003560e01c80638b4187131161008c578063b139654211610066578063b1396542146101af578063d8862484146101d0578063f2fde38b146101e5578063f64e654c146101f8576100df565b80638b418713146101725780638da5cb5b146101855780638f32d59b1461019a576100df565b806320bed572116100bd57806320bed57214610135578063448f70651461014a578063715018a61461016a576100df565b80630bce846a146100e45780631b1fe68a1461010d5780631be7dd8314610122575b600080fd5b6100f76100f2366004611fc1565b61020b565b6040516101049190612712565b60405180910390f35b61011561022e565b6040516101049190612686565b6100f7610130366004612144565b61024a565b610148610143366004612060565b610294565b005b61015d6101583660046121ce565b6102a3565b60405161010491906126a5565b6101486104c4565b610148610180366004611ffb565b610544565b61018d6105fd565b604051610104919061260d565b6101a2610619565b6040516101049190612678565b6101c26101bd366004612299565b610637565b6040516101049291906126ce565b6101d86108d0565b60405161010491906126e9565b6101486101f3366004611fa3565b6108d6565b6101486102063660046121b0565b6108f3565b600360209081526000928352604080842090915290825290205463ffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b815173ffffffffffffffffffffffffffffffffffffffff166000908152600260209081526040808320828601518452825280832084845290915290205463ffffffff165b92915050565b61029f338383610940565b5050565b6102ab611ba5565b60015433906103149073ffffffffffffffffffffffffffffffffffffffff1682147f4f6e6c79536f6c6f0000000000000000000000000000000000000000000000007f4f6e6c7920536f6c6f2063616e2063616c6c2066756e6374696f6e0000000000846109e1565b61031d84610ae6565b1561034f57604080516080810190915260018082526020820190815260200160008152602001600081525091506104b7565b6000808480602001905161036691908101906122dc565b9150915060006103768b8461024a565b90506103d88163ffffffff16600014157f45787069727956320000000000000000000000000000000000000000000000007f457870697279206e6f74207365740000000000000000000000000000000000008e600001518f6020015188610af2565b6104406103e3610bea565b63ffffffff168263ffffffff1611157f45787069727956320000000000000000000000000000000000000000000000007f426f72726f77206e6f74207965742065787069726564000000000000000000008463ffffffff16610bfa565b6104a18263ffffffff168263ffffffff1611157f45787069727956320000000000000000000000000000000000000000000000007f4578706972792070617374206d617845787069727900000000000000000000008463ffffffff16610bfa565b6104b18d8d8d8c8c8c8988610c5c565b94505050505b5098975050505050505050565b6104cc610619565b6104d557600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015433906105ad9073ffffffffffffffffffffffffffffffffffffffff1682147f4f6e6c79536f6c6f0000000000000000000000000000000000000000000000007f4f6e6c7920536f6c6f2063616e2063616c6c2066756e6374696f6e0000000000846109e1565b6000828060200190516105c39190810190612090565b905060008160018111156105d357fe5b14156105ea5783516105e59084611040565b6105f6565b83516105f6908461129f565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b61063f611bce565b610647611bce565b61064f611bce565b6001546040517fd24c48bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d24c48bc906106a790899089906004016126f7565b60206040518083038186803b1580156106bf57600080fd5b505afa1580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106f79190810190612126565b905060006107218563ffffffff1661070d610bea565b63ffffffff166112ea90919063ffffffff16565b90506004548110156107415761073e8260000151826004546112ff565b82525b610749611bce565b6001546040517f8928378e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690638928378e9061079f908b906004016126e9565b60206040518083038186803b1580156107b757600080fd5b505afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107ef9190810190612126565b90506107f9611bce565b6001546040517f8928378e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690638928378e9061084f908b906004016126e9565b60206040518083038186803b15801561086757600080fd5b505afa15801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061089f9190810190612126565b90506108c06108b282600001518661132b565b82519063ffffffff61134416565b8152909890975095505050505050565b60045481565b6108de610619565b6108e757600080fd5b6108f081611356565b50565b6108fb610619565b61090457600080fd5b7fd08f204a092297d87c6a408c8d66cb1b189734e8284e655f896717b45a93a5368160405161093391906126e9565b60405180910390a1600455565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600360209081526040808320938616835292905281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8416179055517f6d39d55c693043fe0327fddb80edde3a40fb0419a6299d29592cc2f11e728b9c906109d49085908590859061261b565b60405180910390a1505050565b83610ae0576109ef83611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610a1984611403565b7f203c000000000000000000000000000000000000000000000000000000000000610a43856114e3565b604051610a799594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001612499565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610ad791600401612694565b60405180910390fd5b50505050565b6020810151155b919050565b85610be257610b0085611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610b2a86611403565b7f203c000000000000000000000000000000000000000000000000000000000000610b54876114e3565b7f2c20000000000000000000000000000000000000000000000000000000000000610b7e8861165a565b7f2c20000000000000000000000000000000000000000000000000000000000000610ba88961165a565b604051610a79999897969594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001612573565b505050505050565b6000610bf542611769565b905090565b83610ae057610c0883611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610c3284611403565b7f203c000000000000000000000000000000000000000000000000000000000000610a438561165a565b610c64611ba5565b610c6c611ba5565b610c74611be1565b6001546040517fc190c2ec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c190c2ec90610ccc908c908e906004016126b3565b604080518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d1b9190810190612192565b9050610d26866117bf565b15610e7957610d79858c147f45787069727956320000000000000000000000000000000000000000000000007f696e7075744d61726b6574206d69736d617463680000000000000000000000008e610bfa565b610de4610d85886117d5565b157f45787069727956320000000000000000000000000000000000000000000000007f426f72726f77732063616e6e6f74206265206f766572706169640000000000008a602001516fffffffffffffffffffffffffffffffff16610bfa565b610ded886117fd565b610df357fe5b610e4c610dff826117bf565b7f45787069727956320000000000000000000000000000000000000000000000007f436f6c6c61746572616c206d75737420626520706f73697469766500000000008d8560200151611826565b610e58868b8d876118ea565b9150610e6387611961565b15610e7457610e748986600061197b565b610fc4565b610ec7858b147f45787069727956320000000000000000000000000000000000000000000000007f6f75747075744d61726b6574206d69736d6174636800000000000000000000008d610bfa565b610f32610ed3886117fd565b157f45787069727956320000000000000000000000000000000000000000000000007f436f6c6c61746572616c2063616e6e6f74206265206f766572757365640000008a602001516fffffffffffffffffffffffffffffffff16610bfa565b610f3b886117d5565b610f4157fe5b610f9a610f4d82611a1e565b7f45787069727956320000000000000000000000000000000000000000000000007f426f72726f7773206d757374206265206e6567617469766500000000000000008d8560200151611826565b610fa6868c8c87611a35565b9150806020015182606001511415610fc457610fc48986600061197b565b602081015160608301516110219180821115917f4578706972795632000000000000000000000000000000000000000000000000917f6f75747075744d61726b657420746f6f20736d616c6c000000000000000000009190611826565b805182511515901515141561103257fe5b509998505050505050505050565b600060608280602001905161105891908101906120ae565b9092509050600082600181111561106b57fe5b1461107257fe5b60005b81518110156105f657611086611bf8565b82828151811061109257fe5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff1681600001516000015173ffffffffffffffffffffffffffffffffffffffff161461113d5780515173ffffffffffffffffffffffffffffffffffffffff9081166000908152600360209081526040808320938a168352929052205463ffffffff1680158061112f57508063ffffffff16826040015163ffffffff16105b1561113b575050611297565b505b604081015163ffffffff16158015906112025750600154815160208301516040517f47d1b53c0000000000000000000000000000000000000000000000000000000081526112029373ffffffffffffffffffffffffffffffffffffffff16926347d1b53c926111ae926004016126b3565b604080518083038186803b1580156111c557600080fd5b505afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111fd9190810190612174565b6117fd565b156112815780606001518061122c57506112248160000151826020015161024a565b63ffffffff16155b1561127c576000611265611260836040015163ffffffff1661124c610bea565b63ffffffff1661134490919063ffffffff16565b611769565b905061127a826000015183602001518361197b565b505b611295565b61129581600001518260200151600061197b565b505b600101611075565b60006112a9611be1565b828060200190516112bd91908101906120f6565b909250905060018260018111156112d057fe5b146112d757fe5b610ae08482600001518360200151610940565b6000828211156112f957600080fd5b50900390565b600061132182611315868663ffffffff611a9216565b9063ffffffff611ab916565b90505b9392505050565b6000611324838360000151670de0b6b3a76400006112ff565b60008282018381101561132457600080fd5b73ffffffffffffffffffffffffffffffffffffffff811661137657600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606080826040516020016114179190612453565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060205b80156114c85781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019082908290811061148357fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000060f891821c90911b16156114c35760010181529050610aed565b61144a565b5060408051600080825260208201909252905b509392505050565b60408051602a808252606082810190935273ffffffffffffffffffffffffffffffffffffffff8416918391602082018180388339019050509050603060f81b8160008151811061152f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350607860f81b8160018151811061157057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b60148110156114db57600281026115bb600f8516611adb565b8382602903815181106115ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600484901c935061160c600f8516611adb565b83826028038151811061161b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060049290921c916001016115a2565b60608161169b575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610aed565b8160005b81156116b357600101600a8204915061169f565b6060816040519080825280601f01601f1916602001820160405280156116e0576020820181803883390190505b508593509050815b8015611760577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600a840660300160f81b82828151811061172657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506116e8565b50949350505050565b60008161028e63ffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7433320000000000000000000000611afd565b8051600090801561028e57505060200151151590565b8051600090801561028e575050602001516fffffffffffffffffffffffffffffffff16151590565b805160009015801561028e575050602001516fffffffffffffffffffffffffffffffff16151590565b846105f65761183484611403565b7f3a2000000000000000000000000000000000000000000000000000000000000061185e85611403565b7f203c0000000000000000000000000000000000000000000000000000000000006118888661165a565b7f2c200000000000000000000000000000000000000000000000000000000000006118b28761165a565b604051610a7997969594939291907f3e00000000000000000000000000000000000000000000000000000000000000906020016124f7565b6118f2611ba5565b6118fa611bce565b611902611bce565b61190d868686610637565b91509150600061192a8860200151836000015185600001516112ff565b604080516080810190915260008082529192509060208201905b81526020016000815260200191909152925050505b949350505050565b602001516fffffffffffffffffffffffffffffffff161590565b825173ffffffffffffffffffffffffffffffffffffffff166000908152600260209081526040808320828701805185529083528184208685529092529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff85161790558451905191517ecee2201664da23900ada76f5e96bcae576e5d7253b36f10dc1b379597d521b926109d4929186908690612643565b805160009015801561028e57505060200151151590565b611a3d611ba5565b611a45611bce565b611a4d611bce565b611a58868686610637565b915091506000611a75886020015184600001518460000151611b4c565b604080516080810190915260018152909150602081016000611944565b600082611aa15750600061028e565b82820282848281611aae57fe5b041461132457600080fd5b6000808211611ac757600080fd5b6000828481611ad257fe5b04949350505050565b6000600a821015611af357506030810160f81b610aed565b5060570160f81b90565b82611b4757611b0b82611403565b7f3a20000000000000000000000000000000000000000000000000000000000000611b3583611403565b604051602001610a7993929190612468565b505050565b6000831580611b59575082155b15611b7057611b69600083611ab9565b9050611324565b6113216001611b998461131583611b8d8a8a63ffffffff611a9216565b9063ffffffff6112ea16565b9063ffffffff61134416565b604080516080810190915260008082526020820190815260200160008152602001600081525090565b6040518060200160405280600081525090565b604080518082019091526000808252602082015290565b6040518060a00160405280611c0b611be1565b81526000602082018190526040820181905260609091015290565b600061132482356127bb565b600061132482516127bb565b600082601f830112611c4f57600080fd5b8151611c62611c5d82612747565b612720565b915081818352602084019350602081019050838560a0840282011115611c8757600080fd5b60005b83811015611cb55781611c9d8882611e98565b84525060209092019160a09190910190600101611c8a565b5050505092915050565b600061132482356127c6565b600061132482516127c6565b600082601f830112611ce857600080fd5b8135611cf6611c5d82612768565b91508082526020830160208301858383011115611d1257600080fd5b611d1d838284612884565b50505092915050565b6000611324825161284a565b600060208284031215611d4457600080fd5b611d4e6020612720565b90506000611d5c8484611f7f565b82525092915050565b600060408284031215611d7757600080fd5b611d816040612720565b90506000611d8f8484611c32565b8252506020611da084848301611f7f565b60208301525092915050565b600060408284031215611dbe57600080fd5b611dc86040612720565b90506000611dd68484611c26565b8252506020611da084848301611f73565b600060408284031215611df957600080fd5b611e036040612720565b90506000611e118484611cbf565b8252506020611da084848301611f5b565b600060408284031215611e3457600080fd5b611e3e6040612720565b90506000611e4c8484611ccb565b8252506020611da084848301611f67565b600060408284031215611e6f57600080fd5b611e796040612720565b90506000611e878484611c32565b8252506020611da084848301611f97565b600060a08284031215611eaa57600080fd5b611eb46080612720565b90506000611ec28484611d65565b8252506040611ed384848301611f7f565b6020830152506060611ee784828501611f97565b6040830152506080611efb84828501611ccb565b60608301525092915050565b600060408284031215611f1957600080fd5b611f236040612720565b90506000611dd68484611cbf565b600060408284031215611f4357600080fd5b611f4d6040612720565b90506000611d8f8484611ccb565b60006113248235612859565b60006113248251612859565b60006113248235612815565b60006113248251612815565b60006113248235612841565b60006113248251612841565b600060208284031215611fb557600080fd5b60006119598484611c26565b60008060408385031215611fd457600080fd5b6000611fe08585611c26565b9250506020611ff185828601611c26565b9150509250929050565b60008060006080848603121561201057600080fd5b600061201c8686611c26565b935050602061202d86828701611dac565b925050606084013567ffffffffffffffff81111561204a57600080fd5b61205686828701611cd7565b9150509250925092565b6000806040838503121561207357600080fd5b600061207f8585611c26565b9250506020611ff185828601611f8b565b6000602082840312156120a257600080fd5b60006119598484611d26565b600080604083850312156120c157600080fd5b60006120cd8585611d26565b925050602083015167ffffffffffffffff8111156120ea57600080fd5b611ff185828601611c3e565b6000806060838503121561210957600080fd5b60006121158585611d26565b9250506020611ff185828601611e5d565b60006020828403121561213857600080fd5b60006119598484611d32565b6000806060838503121561215757600080fd5b60006121638585611dac565b9250506040611ff185828601611f73565b60006040828403121561218657600080fd5b60006119598484611e22565b6000604082840312156121a457600080fd5b60006119598484611f31565b6000602082840312156121c257600080fd5b60006119598484611f73565b6000806000806000806000806101a0898b0312156121eb57600080fd5b60006121f78b8b611f73565b98505060206122088b828c01611f73565b97505060406122198b828c01611dac565b965050608061222a8b828c01611dac565b95505060c061223b8b828c01611de7565b94505061010061224d8b828c01611de7565b93505061014061225f8b828c01611f07565b92505061018089013567ffffffffffffffff81111561227d57600080fd5b6122898b828c01611cd7565b9150509295985092959890939650565b6000806000606084860312156122ae57600080fd5b60006122ba8686611f73565b93505060206122cb86828701611f73565b925050604061205686828701611f8b565b600080604083850312156122ef57600080fd5b60006122fb8585611f7f565b9250506020611ff185828601611f97565b612315816127bb565b82525050565b612315816127c6565b612315612330826127cb565b612815565b612315612330826127f0565b61231561233082612815565b6000612358826127ae565b6123628185610aed565b9350612372818560208601612890565b9290920192915050565b6123158161286e565b61231581612879565b6000612399826127ae565b6123a381856127b2565b93506123b3818560208601612890565b6123bc816128bc565b9093019392505050565b805160808301906123d7848261231b565b5060208201516123ea6020850182612385565b5060408201516123fd6040850182612385565b506060820151610ae06060850182612441565b80516040830190612421848261230c565b506020820151610ae06020850182612441565b80516020830190610ae084825b61231581612815565b61231581612841565b600061245f8284612341565b50602001919050565b6000612474828661234d565b91506124808285612335565b600282019150612490828461234d565b95945050505050565b60006124a5828961234d565b91506124b18288612335565b6002820191506124c1828761234d565b91506124cd8286612335565b6002820191506124dd828561234d565b91506124e98284612324565b506001019695505050505050565b6000612503828b61234d565b915061250f828a612335565b60028201915061251f828961234d565b915061252b8288612335565b60028201915061253b828761234d565b91506125478286612335565b600282019150612557828561234d565b91506125638284612324565b5060010198975050505050505050565b600061257f828d61234d565b915061258b828c612335565b60028201915061259b828b61234d565b91506125a7828a612335565b6002820191506125b7828961234d565b91506125c38288612335565b6002820191506125d3828761234d565b91506125df8286612335565b6002820191506125ef828561234d565b91506125fb8284612324565b506001019a9950505050505050505050565b6020810161028e828461230c565b60608101612629828661230c565b612636602083018561230c565b611959604083018461244a565b60808101612651828761230c565b61265e6020830186612441565b61266b6040830185612441565b612490606083018461244a565b6020810161028e828461231b565b6020810161028e828461237c565b60208082528101611324818461238e565b6080810161028e82846123c6565b606081016126c18285612410565b6113246040830184612441565b604081016126dc8285612434565b6113246020830184612434565b6020810161028e8284612441565b604081016127058285612441565b6113246020830184612441565b6020810161028e828461244a565b60405181810167ffffffffffffffff8111828210171561273f57600080fd5b604052919050565b600067ffffffffffffffff82111561275e57600080fd5b5060209081020190565b600067ffffffffffffffff82111561277f57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b90815260200190565b600061028e82612828565b151590565b7fff000000000000000000000000000000000000000000000000000000000000001690565b7fffff0000000000000000000000000000000000000000000000000000000000001690565b90565b60006002821061282457fe5b5090565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60006002821061282457600080fd5b6fffffffffffffffffffffffffffffffff1690565b600061028e826127bb565b600061028e82612818565b82818337506000910152565b60005b838110156128ab578181015183820152602001612893565b83811115610ae05750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fea265627a7a723058201fb5cd76566f136dd46aeb846f717b0de53b65aa3702601b2fed00de2dcc85d56c6578706572696d656e74616cf500370000000000000000000000001e0447b19bb6ecfdae1e4ae1694b0c3659614e4e0000000000000000000000000000000000000000000000000000000000000e10
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100df5760003560e01c80638b4187131161008c578063b139654211610066578063b1396542146101af578063d8862484146101d0578063f2fde38b146101e5578063f64e654c146101f8576100df565b80638b418713146101725780638da5cb5b146101855780638f32d59b1461019a576100df565b806320bed572116100bd57806320bed57214610135578063448f70651461014a578063715018a61461016a576100df565b80630bce846a146100e45780631b1fe68a1461010d5780631be7dd8314610122575b600080fd5b6100f76100f2366004611fc1565b61020b565b6040516101049190612712565b60405180910390f35b61011561022e565b6040516101049190612686565b6100f7610130366004612144565b61024a565b610148610143366004612060565b610294565b005b61015d6101583660046121ce565b6102a3565b60405161010491906126a5565b6101486104c4565b610148610180366004611ffb565b610544565b61018d6105fd565b604051610104919061260d565b6101a2610619565b6040516101049190612678565b6101c26101bd366004612299565b610637565b6040516101049291906126ce565b6101d86108d0565b60405161010491906126e9565b6101486101f3366004611fa3565b6108d6565b6101486102063660046121b0565b6108f3565b600360209081526000928352604080842090915290825290205463ffffffff1681565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b815173ffffffffffffffffffffffffffffffffffffffff166000908152600260209081526040808320828601518452825280832084845290915290205463ffffffff165b92915050565b61029f338383610940565b5050565b6102ab611ba5565b60015433906103149073ffffffffffffffffffffffffffffffffffffffff1682147f4f6e6c79536f6c6f0000000000000000000000000000000000000000000000007f4f6e6c7920536f6c6f2063616e2063616c6c2066756e6374696f6e0000000000846109e1565b61031d84610ae6565b1561034f57604080516080810190915260018082526020820190815260200160008152602001600081525091506104b7565b6000808480602001905161036691908101906122dc565b9150915060006103768b8461024a565b90506103d88163ffffffff16600014157f45787069727956320000000000000000000000000000000000000000000000007f457870697279206e6f74207365740000000000000000000000000000000000008e600001518f6020015188610af2565b6104406103e3610bea565b63ffffffff168263ffffffff1611157f45787069727956320000000000000000000000000000000000000000000000007f426f72726f77206e6f74207965742065787069726564000000000000000000008463ffffffff16610bfa565b6104a18263ffffffff168263ffffffff1611157f45787069727956320000000000000000000000000000000000000000000000007f4578706972792070617374206d617845787069727900000000000000000000008463ffffffff16610bfa565b6104b18d8d8d8c8c8c8988610c5c565b94505050505b5098975050505050505050565b6104cc610619565b6104d557600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60015433906105ad9073ffffffffffffffffffffffffffffffffffffffff1682147f4f6e6c79536f6c6f0000000000000000000000000000000000000000000000007f4f6e6c7920536f6c6f2063616e2063616c6c2066756e6374696f6e0000000000846109e1565b6000828060200190516105c39190810190612090565b905060008160018111156105d357fe5b14156105ea5783516105e59084611040565b6105f6565b83516105f6908461129f565b5050505050565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff16331490565b61063f611bce565b610647611bce565b61064f611bce565b6001546040517fd24c48bc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063d24c48bc906106a790899089906004016126f7565b60206040518083038186803b1580156106bf57600080fd5b505afa1580156106d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506106f79190810190612126565b905060006107218563ffffffff1661070d610bea565b63ffffffff166112ea90919063ffffffff16565b90506004548110156107415761073e8260000151826004546112ff565b82525b610749611bce565b6001546040517f8928378e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690638928378e9061079f908b906004016126e9565b60206040518083038186803b1580156107b757600080fd5b505afa1580156107cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506107ef9190810190612126565b90506107f9611bce565b6001546040517f8928378e00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690638928378e9061084f908b906004016126e9565b60206040518083038186803b15801561086757600080fd5b505afa15801561087b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525061089f9190810190612126565b90506108c06108b282600001518661132b565b82519063ffffffff61134416565b8152909890975095505050505050565b60045481565b6108de610619565b6108e757600080fd5b6108f081611356565b50565b6108fb610619565b61090457600080fd5b7fd08f204a092297d87c6a408c8d66cb1b189734e8284e655f896717b45a93a5368160405161093391906126e9565b60405180910390a1600455565b73ffffffffffffffffffffffffffffffffffffffff8381166000908152600360209081526040808320938616835292905281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff8416179055517f6d39d55c693043fe0327fddb80edde3a40fb0419a6299d29592cc2f11e728b9c906109d49085908590859061261b565b60405180910390a1505050565b83610ae0576109ef83611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610a1984611403565b7f203c000000000000000000000000000000000000000000000000000000000000610a43856114e3565b604051610a799594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001612499565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290527f08c379a0000000000000000000000000000000000000000000000000000000008252610ad791600401612694565b60405180910390fd5b50505050565b6020810151155b919050565b85610be257610b0085611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610b2a86611403565b7f203c000000000000000000000000000000000000000000000000000000000000610b54876114e3565b7f2c20000000000000000000000000000000000000000000000000000000000000610b7e8861165a565b7f2c20000000000000000000000000000000000000000000000000000000000000610ba88961165a565b604051610a79999897969594939291907f3e0000000000000000000000000000000000000000000000000000000000000090602001612573565b505050505050565b6000610bf542611769565b905090565b83610ae057610c0883611403565b7f3a20000000000000000000000000000000000000000000000000000000000000610c3284611403565b7f203c000000000000000000000000000000000000000000000000000000000000610a438561165a565b610c64611ba5565b610c6c611ba5565b610c74611be1565b6001546040517fc190c2ec00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091169063c190c2ec90610ccc908c908e906004016126b3565b604080518083038186803b158015610ce357600080fd5b505afa158015610cf7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250610d1b9190810190612192565b9050610d26866117bf565b15610e7957610d79858c147f45787069727956320000000000000000000000000000000000000000000000007f696e7075744d61726b6574206d69736d617463680000000000000000000000008e610bfa565b610de4610d85886117d5565b157f45787069727956320000000000000000000000000000000000000000000000007f426f72726f77732063616e6e6f74206265206f766572706169640000000000008a602001516fffffffffffffffffffffffffffffffff16610bfa565b610ded886117fd565b610df357fe5b610e4c610dff826117bf565b7f45787069727956320000000000000000000000000000000000000000000000007f436f6c6c61746572616c206d75737420626520706f73697469766500000000008d8560200151611826565b610e58868b8d876118ea565b9150610e6387611961565b15610e7457610e748986600061197b565b610fc4565b610ec7858b147f45787069727956320000000000000000000000000000000000000000000000007f6f75747075744d61726b6574206d69736d6174636800000000000000000000008d610bfa565b610f32610ed3886117fd565b157f45787069727956320000000000000000000000000000000000000000000000007f436f6c6c61746572616c2063616e6e6f74206265206f766572757365640000008a602001516fffffffffffffffffffffffffffffffff16610bfa565b610f3b886117d5565b610f4157fe5b610f9a610f4d82611a1e565b7f45787069727956320000000000000000000000000000000000000000000000007f426f72726f7773206d757374206265206e6567617469766500000000000000008d8560200151611826565b610fa6868c8c87611a35565b9150806020015182606001511415610fc457610fc48986600061197b565b602081015160608301516110219180821115917f4578706972795632000000000000000000000000000000000000000000000000917f6f75747075744d61726b657420746f6f20736d616c6c000000000000000000009190611826565b805182511515901515141561103257fe5b509998505050505050505050565b600060608280602001905161105891908101906120ae565b9092509050600082600181111561106b57fe5b1461107257fe5b60005b81518110156105f657611086611bf8565b82828151811061109257fe5b602002602001015190508573ffffffffffffffffffffffffffffffffffffffff1681600001516000015173ffffffffffffffffffffffffffffffffffffffff161461113d5780515173ffffffffffffffffffffffffffffffffffffffff9081166000908152600360209081526040808320938a168352929052205463ffffffff1680158061112f57508063ffffffff16826040015163ffffffff16105b1561113b575050611297565b505b604081015163ffffffff16158015906112025750600154815160208301516040517f47d1b53c0000000000000000000000000000000000000000000000000000000081526112029373ffffffffffffffffffffffffffffffffffffffff16926347d1b53c926111ae926004016126b3565b604080518083038186803b1580156111c557600080fd5b505afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506111fd9190810190612174565b6117fd565b156112815780606001518061122c57506112248160000151826020015161024a565b63ffffffff16155b1561127c576000611265611260836040015163ffffffff1661124c610bea565b63ffffffff1661134490919063ffffffff16565b611769565b905061127a826000015183602001518361197b565b505b611295565b61129581600001518260200151600061197b565b505b600101611075565b60006112a9611be1565b828060200190516112bd91908101906120f6565b909250905060018260018111156112d057fe5b146112d757fe5b610ae08482600001518360200151610940565b6000828211156112f957600080fd5b50900390565b600061132182611315868663ffffffff611a9216565b9063ffffffff611ab916565b90505b9392505050565b6000611324838360000151670de0b6b3a76400006112ff565b60008282018381101561132457600080fd5b73ffffffffffffffffffffffffffffffffffffffff811661137657600080fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b606080826040516020016114179190612453565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052905060205b80156114c85781517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9091019082908290811061148357fe5b01602001517fff0000000000000000000000000000000000000000000000000000000000000060f891821c90911b16156114c35760010181529050610aed565b61144a565b5060408051600080825260208201909252905b509392505050565b60408051602a808252606082810190935273ffffffffffffffffffffffffffffffffffffffff8416918391602082018180388339019050509050603060f81b8160008151811061152f57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350607860f81b8160018151811061157057fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060005b60148110156114db57600281026115bb600f8516611adb565b8382602903815181106115ca57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600484901c935061160c600f8516611adb565b83826028038151811061161b57fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053505060049290921c916001016115a2565b60608161169b575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610aed565b8160005b81156116b357600101600a8204915061169f565b6060816040519080825280601f01601f1916602001820160405280156116e0576020820181803883390190505b508593509050815b8015611760577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01600a840660300160f81b82828151811061172657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a840493506116e8565b50949350505050565b60008161028e63ffffffff821682147f4d617468000000000000000000000000000000000000000000000000000000007f556e73616665206361737420746f2075696e7433320000000000000000000000611afd565b8051600090801561028e57505060200151151590565b8051600090801561028e575050602001516fffffffffffffffffffffffffffffffff16151590565b805160009015801561028e575050602001516fffffffffffffffffffffffffffffffff16151590565b846105f65761183484611403565b7f3a2000000000000000000000000000000000000000000000000000000000000061185e85611403565b7f203c0000000000000000000000000000000000000000000000000000000000006118888661165a565b7f2c200000000000000000000000000000000000000000000000000000000000006118b28761165a565b604051610a7997969594939291907f3e00000000000000000000000000000000000000000000000000000000000000906020016124f7565b6118f2611ba5565b6118fa611bce565b611902611bce565b61190d868686610637565b91509150600061192a8860200151836000015185600001516112ff565b604080516080810190915260008082529192509060208201905b81526020016000815260200191909152925050505b949350505050565b602001516fffffffffffffffffffffffffffffffff161590565b825173ffffffffffffffffffffffffffffffffffffffff166000908152600260209081526040808320828701805185529083528184208685529092529182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffff000000001663ffffffff85161790558451905191517ecee2201664da23900ada76f5e96bcae576e5d7253b36f10dc1b379597d521b926109d4929186908690612643565b805160009015801561028e57505060200151151590565b611a3d611ba5565b611a45611bce565b611a4d611bce565b611a58868686610637565b915091506000611a75886020015184600001518460000151611b4c565b604080516080810190915260018152909150602081016000611944565b600082611aa15750600061028e565b82820282848281611aae57fe5b041461132457600080fd5b6000808211611ac757600080fd5b6000828481611ad257fe5b04949350505050565b6000600a821015611af357506030810160f81b610aed565b5060570160f81b90565b82611b4757611b0b82611403565b7f3a20000000000000000000000000000000000000000000000000000000000000611b3583611403565b604051602001610a7993929190612468565b505050565b6000831580611b59575082155b15611b7057611b69600083611ab9565b9050611324565b6113216001611b998461131583611b8d8a8a63ffffffff611a9216565b9063ffffffff6112ea16565b9063ffffffff61134416565b604080516080810190915260008082526020820190815260200160008152602001600081525090565b6040518060200160405280600081525090565b604080518082019091526000808252602082015290565b6040518060a00160405280611c0b611be1565b81526000602082018190526040820181905260609091015290565b600061132482356127bb565b600061132482516127bb565b600082601f830112611c4f57600080fd5b8151611c62611c5d82612747565b612720565b915081818352602084019350602081019050838560a0840282011115611c8757600080fd5b60005b83811015611cb55781611c9d8882611e98565b84525060209092019160a09190910190600101611c8a565b5050505092915050565b600061132482356127c6565b600061132482516127c6565b600082601f830112611ce857600080fd5b8135611cf6611c5d82612768565b91508082526020830160208301858383011115611d1257600080fd5b611d1d838284612884565b50505092915050565b6000611324825161284a565b600060208284031215611d4457600080fd5b611d4e6020612720565b90506000611d5c8484611f7f565b82525092915050565b600060408284031215611d7757600080fd5b611d816040612720565b90506000611d8f8484611c32565b8252506020611da084848301611f7f565b60208301525092915050565b600060408284031215611dbe57600080fd5b611dc86040612720565b90506000611dd68484611c26565b8252506020611da084848301611f73565b600060408284031215611df957600080fd5b611e036040612720565b90506000611e118484611cbf565b8252506020611da084848301611f5b565b600060408284031215611e3457600080fd5b611e3e6040612720565b90506000611e4c8484611ccb565b8252506020611da084848301611f67565b600060408284031215611e6f57600080fd5b611e796040612720565b90506000611e878484611c32565b8252506020611da084848301611f97565b600060a08284031215611eaa57600080fd5b611eb46080612720565b90506000611ec28484611d65565b8252506040611ed384848301611f7f565b6020830152506060611ee784828501611f97565b6040830152506080611efb84828501611ccb565b60608301525092915050565b600060408284031215611f1957600080fd5b611f236040612720565b90506000611dd68484611cbf565b600060408284031215611f4357600080fd5b611f4d6040612720565b90506000611d8f8484611ccb565b60006113248235612859565b60006113248251612859565b60006113248235612815565b60006113248251612815565b60006113248235612841565b60006113248251612841565b600060208284031215611fb557600080fd5b60006119598484611c26565b60008060408385031215611fd457600080fd5b6000611fe08585611c26565b9250506020611ff185828601611c26565b9150509250929050565b60008060006080848603121561201057600080fd5b600061201c8686611c26565b935050602061202d86828701611dac565b925050606084013567ffffffffffffffff81111561204a57600080fd5b61205686828701611cd7565b9150509250925092565b6000806040838503121561207357600080fd5b600061207f8585611c26565b9250506020611ff185828601611f8b565b6000602082840312156120a257600080fd5b60006119598484611d26565b600080604083850312156120c157600080fd5b60006120cd8585611d26565b925050602083015167ffffffffffffffff8111156120ea57600080fd5b611ff185828601611c3e565b6000806060838503121561210957600080fd5b60006121158585611d26565b9250506020611ff185828601611e5d565b60006020828403121561213857600080fd5b60006119598484611d32565b6000806060838503121561215757600080fd5b60006121638585611dac565b9250506040611ff185828601611f73565b60006040828403121561218657600080fd5b60006119598484611e22565b6000604082840312156121a457600080fd5b60006119598484611f31565b6000602082840312156121c257600080fd5b60006119598484611f73565b6000806000806000806000806101a0898b0312156121eb57600080fd5b60006121f78b8b611f73565b98505060206122088b828c01611f73565b97505060406122198b828c01611dac565b965050608061222a8b828c01611dac565b95505060c061223b8b828c01611de7565b94505061010061224d8b828c01611de7565b93505061014061225f8b828c01611f07565b92505061018089013567ffffffffffffffff81111561227d57600080fd5b6122898b828c01611cd7565b9150509295985092959890939650565b6000806000606084860312156122ae57600080fd5b60006122ba8686611f73565b93505060206122cb86828701611f73565b925050604061205686828701611f8b565b600080604083850312156122ef57600080fd5b60006122fb8585611f7f565b9250506020611ff185828601611f97565b612315816127bb565b82525050565b612315816127c6565b612315612330826127cb565b612815565b612315612330826127f0565b61231561233082612815565b6000612358826127ae565b6123628185610aed565b9350612372818560208601612890565b9290920192915050565b6123158161286e565b61231581612879565b6000612399826127ae565b6123a381856127b2565b93506123b3818560208601612890565b6123bc816128bc565b9093019392505050565b805160808301906123d7848261231b565b5060208201516123ea6020850182612385565b5060408201516123fd6040850182612385565b506060820151610ae06060850182612441565b80516040830190612421848261230c565b506020820151610ae06020850182612441565b80516020830190610ae084825b61231581612815565b61231581612841565b600061245f8284612341565b50602001919050565b6000612474828661234d565b91506124808285612335565b600282019150612490828461234d565b95945050505050565b60006124a5828961234d565b91506124b18288612335565b6002820191506124c1828761234d565b91506124cd8286612335565b6002820191506124dd828561234d565b91506124e98284612324565b506001019695505050505050565b6000612503828b61234d565b915061250f828a612335565b60028201915061251f828961234d565b915061252b8288612335565b60028201915061253b828761234d565b91506125478286612335565b600282019150612557828561234d565b91506125638284612324565b5060010198975050505050505050565b600061257f828d61234d565b915061258b828c612335565b60028201915061259b828b61234d565b91506125a7828a612335565b6002820191506125b7828961234d565b91506125c38288612335565b6002820191506125d3828761234d565b91506125df8286612335565b6002820191506125ef828561234d565b91506125fb8284612324565b506001019a9950505050505050505050565b6020810161028e828461230c565b60608101612629828661230c565b612636602083018561230c565b611959604083018461244a565b60808101612651828761230c565b61265e6020830186612441565b61266b6040830185612441565b612490606083018461244a565b6020810161028e828461231b565b6020810161028e828461237c565b60208082528101611324818461238e565b6080810161028e82846123c6565b606081016126c18285612410565b6113246040830184612441565b604081016126dc8285612434565b6113246020830184612434565b6020810161028e8284612441565b604081016127058285612441565b6113246020830184612441565b6020810161028e828461244a565b60405181810167ffffffffffffffff8111828210171561273f57600080fd5b604052919050565b600067ffffffffffffffff82111561275e57600080fd5b5060209081020190565b600067ffffffffffffffff82111561277f57600080fd5b506020601f919091017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0160190565b5190565b90815260200190565b600061028e82612828565b151590565b7fff000000000000000000000000000000000000000000000000000000000000001690565b7fffff0000000000000000000000000000000000000000000000000000000000001690565b90565b60006002821061282457fe5b5090565b73ffffffffffffffffffffffffffffffffffffffff1690565b63ffffffff1690565b60006002821061282457600080fd5b6fffffffffffffffffffffffffffffffff1690565b600061028e826127bb565b600061028e82612818565b82818337506000910152565b60005b838110156128ab578181015183820152602001612893565b83811115610ae05750506000910152565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169056fea265627a7a723058201fb5cd76566f136dd46aeb846f717b0de53b65aa3702601b2fed00de2dcc85d56c6578706572696d656e74616cf50037
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001e0447b19bb6ecfdae1e4ae1694b0c3659614e4e0000000000000000000000000000000000000000000000000000000000000e10
-----Decoded View---------------
Arg [0] : soloMargin (address): 0x1E0447b19BB6EcFdAe1e4AE1694b0C3659614e4e
Arg [1] : expiryRampTime (uint256): 3600
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000001e0447b19bb6ecfdae1e4ae1694b0c3659614e4e
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000e10
Deployed Bytecode Sourcemap
37135:12987:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37135:12987:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38468:72;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;36452:29;;;:::i;:::-;;;;;;;;41697:229;;;;;;;;;:::i;39244:172::-;;;;;;;;;:::i;:::-;;39948:1697;;;;;;;;;:::i;:::-;;;;;;;;4071:140;;;:::i;39480:460::-;;;;;;;;;:::i;3358:79::-;;;:::i;:::-;;;;;;;;3693:92;;;:::i;:::-;;;;;;;;41934:923;;;;;;;;;:::i;:::-;;;;;;;;;38621:31;;;:::i;:::-;;;;;;;;4388:109;;;;;;;;;:::i;38954:227::-;;;;;;;;;:::i;38468:72::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36452:29::-;;;;;;:::o;41697:229::-;41878:13;;41867:25;;41836:6;41867:25;;;:10;:25;;;;;;;;41893:14;;;;41867:41;;;;;;;:51;;;;;;;;;;;41697:229;;;;;:::o;39244:172::-;39363:45;39375:10;39387:6;39395:12;39363:11;:45::i;:::-;39244:172;;:::o;39948:1697::-;40340:24;;:::i;:::-;36803:11;;40310:10;;36760:148;;36803:11;;36787:28;;36830:4;36760:148;40310:10;36760:12;:148::i;:::-;40434:17;:8;:15;:17::i;:::-;40430:257;;;40475:200;;;;;;;;;40518:4;40475:200;;;;;;;;;;;40606:26;40475:200;;;;40658:1;40475:200;;;40468:207;;;;40430:257;40700:20;40722:16;40753:4;40742:35;;;;;;;;;;;;;;40699:78;;;;40790:13;40806:37;40816:12;40830;40806:9;:37::i;:::-;40790:53;;40884:193;40911:6;:11;;40921:1;40911:11;;40937:4;40884:193;40987:12;:18;;;41020:12;:19;;;41054:12;40884;:193::i;:::-;41088:145;41125:18;:16;:18::i;:::-;41115:28;;:6;:28;;;;41158:4;41088:145;41216:6;41088:145;;:12;:145::i;:::-;41244:135;41281:9;41271:19;;:6;:19;;;;41305:4;41244:135;41362:6;41244:135;;:12;:135::i;:::-;41399:238;41434:13;41462:14;41491:12;41518:11;41544;41570:8;41593:12;41620:6;41399:20;:238::i;:::-;41392:245;;;;;36919:1;39948:1697;;;;;;;;;;;:::o;4071:140::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;4170:1;4154:6;;4133:40;;;4154:6;;;;4133:40;;4170:1;;4133:40;4201:1;4184:19;;;;;;4071:140::o;39480:460::-;36803:11;;39640:10;;36760:148;;36803:11;;36787:28;;36830:4;36760:148;39640:10;36760:12;:148::i;:::-;39668:25;39707:4;39696:36;;;;;;;;;;;;;;39668:64;-1:-1:-1;39759:26:0;39747:8;:38;;;;;;;;;39743:190;;;39824:13;;39802:42;;39839:4;39802:21;:42::i;:::-;39743:190;;;39901:13;;39877:44;;39916:4;39877:23;:44::i;:::-;36919:1;39480:460;;;;:::o;3358:79::-;3396:7;3423:6;;;3358:79;:::o;3693:92::-;3733:4;3771:6;;;3757:10;:20;;3693:92::o;41934:923::-;42122:21;;:::i;:::-;42158;;:::i;:::-;42207:26;;:::i;:::-;42236:11;;:104;;;;;:11;;;;;:39;;:104;;42290:12;;42317;;42236:104;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42236:104:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42236:104:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42236:104:0;;;;;;;;;42207:133;;42353:17;42373:30;42396:6;42373:30;;:18;:16;:18::i;:::-;:22;;;;:30;;;;:::i;:::-;42353:50;;42432:16;;42420:9;:28;42416:134;;;42480:58;42496:6;:12;;;42510:9;42521:16;;42480:15;:58::i;:::-;42465:73;;42416:134;42562:31;;:::i;:::-;42596:11;;:40;;;;;:11;;;;;:26;;:40;;42623:12;;42596:40;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42596:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42596:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42596:40:0;;;;;;;;;42562:74;;42647:31;;:::i;:::-;42681:11;;:40;;;;;:11;;;;;:26;;:40;;42708:12;;42681:40;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;42681:40:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;42681:40:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;42681:40:0;;;;;;;;;42647:74;;42750:57;42770:36;42782:9;:15;;;42799:6;42770:11;:36::i;:::-;42750:15;;;:57;:19;:57;:::i;:::-;42732:75;;42828:9;;42732:75;;-1:-1:-1;41934:923:0;-1:-1:-1;;;;;;41934:923:0:o;38621:31::-;;;;:::o;4388:109::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;4461:28;4480:8;4461:18;:28::i;:::-;4388:109;:::o;38954:227::-;3570:9;:7;:9::i;:::-;3562:18;;;;;;39087:39;39108:17;39087:39;;;;;;;;;;;;;;;39137:16;:36;38954:227::o;48180:265::-;48323:26;;;;;;;;:16;:26;;;;;;;;:34;;;;;;;;;;;:49;;;;;;;;;;48388;;;;;48323:26;;:34;;:49;;48388;;;;;;;;;;48180:265;;;:::o;7228:566::-;7397:4;7392:395;;7515:15;7525:4;7515:9;:15::i;:::-;7557:5;7589:17;7599:6;7589:9;:17::i;:::-;7633:6;7666:19;7676:8;7666:9;:19::i;:::-;7472:269;;;;;;;;;7712:6;;7472:269;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;7472:269:0;;;;7418:357;;;;;;;;;;;;;;;;;7392:395;7228:566;;;;:::o;20303:145::-;20428:7;;;;:12;20303:145;;;;:::o;8481:776::-;8704:4;8699:551;;8822:15;8832:4;8822:9;:15::i;:::-;8864:5;8896:17;8906:6;8896:9;:17::i;:::-;8940:6;8973:19;8983:8;8973:9;:19::i;:::-;9019:5;9051:19;9061:8;9051:9;:19::i;:::-;9097:5;9129:19;9139:8;9129:9;:19::i;:::-;8779:425;;;;;;;;;;;;;9175:6;;8779:425;;;;8699:551;8481:776;;;;;;:::o;26186:138::-;26259:6;26290:26;26300:15;26290:9;:26::i;:::-;26283:33;;26186:138;:::o;5975:566::-;6144:4;6139:395;;6262:15;6272:4;6262:9;:15::i;:::-;6304:5;6336:17;6346:6;6336:9;:17::i;:::-;6380:6;6413:19;6423:8;6413:9;:19::i;44931:2886::-;45280:24;;:::i;:::-;45322:31;;:::i;:::-;45364:29;;:::i;:::-;45396:11;;:55;;;;;:11;;;;;:25;;:55;;45422:12;;45436:14;;45396:55;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;45396:55:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;45396:55:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;45396:55:0;;;;;;;;;45364:87;;45468:21;:8;:19;:21::i;:::-;45464:2066;;;45506:171;45554:12;45537:13;:29;45585:4;45506:171;45649:13;45506:12;:171::i;:::-;45692:177;45724:24;:11;:22;:24::i;:::-;45723:25;45767:4;45692:177;45837:11;:17;;;45692:177;;:12;:177::i;:::-;45891:24;:11;:22;:24::i;:::-;45884:32;;;;45931:212;45962:25;:12;:23;:25::i;:::-;46006:4;45931:212;46077:14;46110:12;:18;;;45931:12;:212::i;:::-;46167:148;46202:8;46229:14;46262:13;46294:6;46167:16;:148::i;:::-;46158:157;;46391:20;:11;:18;:20::i;:::-;46387:101;;;46432:40;46442:12;46456;46470:1;46432:9;:40::i;:::-;45464:2066;;;46520:174;46569:12;46551:14;:30;46600:4;46520:174;46665:14;46520:12;:174::i;:::-;46709:180;46741:24;:11;:22;:24::i;:::-;46740:25;46784:4;46709:180;46857:11;:17;;;46709:180;;:12;:180::i;:::-;46911:24;:11;:22;:24::i;:::-;46904:32;;;;46951:209;46982:25;:12;:23;:25::i;:::-;47026:4;46951:209;47094:14;47127:12;:18;;;46951:12;:209::i;:::-;47184:148;47219:8;47246:13;47278:14;47311:6;47184:16;:148::i;:::-;47175:157;;47424:12;:18;;;47408:6;:12;;;:34;47404:115;;;47463:40;47473:12;47487;47501:1;47463:9;:40::i;:::-;47585:18;;;;47569:12;;;;47542:190;;47569:34;;;;;47618:4;;47542:190;;47569:12;47542;:190::i;:::-;47765:17;;47750:11;;:32;;;;;;;47743:40;;;;-1:-1:-1;47803:6:0;44931:2886;-1:-1:-1;;;;;;;;;44931:2886:0:o;42919:1573::-;43058:25;43098:30;43153:4;43142:52;;;;;;;;;;;;;;43043:151;;-1:-1:-1;43043:151:0;-1:-1:-1;43226:26:0;43214:8;:38;;;;;;;;;43207:46;;;;43271:9;43266:1219;43290:8;:15;43286:1;:19;43266:1219;;;43327:23;;:::i;:::-;43353:8;43362:1;43353:11;;;;;;;;;;;;;;43327:37;;43404:6;43383:27;;:3;:11;;;:17;;;:27;;;43379:361;;43558:11;;:17;43541:35;;;;43511:27;43541:35;;;:16;:35;;;;;;;;:43;;;;;;;;;;;;43607:25;;;:65;;;43652:20;43636:36;;:3;:13;;;:36;;;43607:65;43603:122;;;43697:8;;;;43603:122;43379:361;;43845:13;;;;:18;;;;;;:104;;-1:-1:-1;43884:11:0;;43910;;43923:12;;;;43884:52;;;;;:65;;:11;;;:25;;:52;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;43884:52:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43884:52:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;43884:52:0;;;;;;;;;:63;:65::i;:::-;43823:651;;;44059:3;:15;;;:60;;;;44078:36;44088:3;:11;;;44101:3;:12;;;44078:9;:36::i;:::-;:41;;;44059:60;44055:250;;;44144:20;44167:44;:37;44190:3;:13;;;44167:37;;:18;:16;:18::i;:::-;:22;;;;:37;;;;:::i;:::-;:42;:44::i;:::-;44144:67;;44234:51;44244:3;:11;;;44257:3;:12;;;44271:13;44234:9;:51::i;:::-;44055:250;;43823:651;;;44419:39;44429:3;:11;;;44442:3;:12;;;44456:1;44419:9;:39::i;:::-;43266:1219;;43307:3;;43266:1219;;44500:423;44641:25;44681:33;;:::i;:::-;44739:4;44728:52;;;;;;;;;;;;;;44626:154;;-1:-1:-1;44626:154:0;-1:-1:-1;44810:28:0;44798:8;:40;;;;;;;;;44791:48;;;;44850:65;44862:6;44870:11;:18;;;44890:11;:24;;;44850:11;:65::i;1961:150::-;2019:7;2052:1;2047;:6;;2039:15;;;;;;-1:-1:-1;2077:5:0;;;1961:150::o;13016:238::-;13176:7;13208:38;13234:11;13208:21;:6;13219:9;13208:21;:10;:21;:::i;:::-;:25;:38;:25;:38;:::i;:::-;13201:45;;13016:238;;;;;;:::o;25086:197::-;25205:7;25237:38;25253:6;25261:1;:7;;;24607:6;25237:15;:38::i;2197:150::-;2255:7;2287:5;;;2311:6;;;;2303:15;;;;;4647:187;4721:22;;;4713:31;;;;;;4781:6;;;4760:38;;;;;;;4781:6;;;4760:38;;;4809:6;:17;;;;;;;;;;;;;;;4647:187::o;9319:988::-;9418:12;9496:19;9535:5;9518:23;;;;;;;;;;;;;22:32:-1;26:21;;;22:32;6:49;;9518:23:0;;;;-1:-1:-1;49:4;9650:587:0;9671:5;;9650:587;;9928:9;;9827:3;;;;;9928:6;;9827:3;;9928:9;;;;;;;;;;:14;:9;;;;;;;:14;;9924:302;;9984:1;9980:5;10114:22;;10121:6;-1:-1:-1;10197:13:0;;9924:302;9650:587;;;-1:-1:-1;10287:12:0;;;10297:1;10287:12;;;;;;;;;;;-1:-1:-1;10280:19:0;9319:988;-1:-1:-1;;;9319:988:0:o;11272:993::-;11554:13;;;11564:2;11554:13;;;11371:12;11554:13;;;;;;11413:14;;;;11371:12;;11554:13;;;21:6:-1;;104:10;11554:13:0;87:34:-1;135:17;;-1:-1;11554:13:0;11532:35;;5137:2;11634:23;;11622:6;11629:1;11622:9;;;;;;;;;;;:35;;;;;;;;;;;5247:3;11680:27;;11668:6;11675:1;11668:9;;;;;;;;;;;:39;;;;;;;;;;-1:-1:-1;11824:9:0;11819:413;11843:2;11839:1;:6;11819:413;;;11934:1;11930:5;;12030:23;5474:3;12035:17;;12030:4;:23::i;:::-;12009:6;12021:5;12016:2;:10;12009:18;;;;;;;;;;;:44;;;;;;;;;;;12077:1;12072;:6;;12068:10;;12172:23;5474:3;12177:1;:17;12172:4;:23::i;:::-;12151:6;12163:5;12158:2;:10;12151:18;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;;12219:1:0;12214:6;;;;;11847:3;;11819:413;;10315:949;10414:12;10448:10;10444:53;;-1:-1:-1;10475:10:0;;;;;;;;;;;;;;;;;;;10444:53;10561:5;10549:9;10602:72;10609:6;;10602:72;;10632:8;;10660:2;10655:7;;;;10602:72;;;10718:17;10748:6;10738:17;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;104:10;10738:17:0;87:34:-1;135:17;;-1:-1;10738:17:0;-1:-1:-1;10850:5:0;;-1:-1:-1;10718:37:0;-1:-1:-1;10883:6:0;10866:367;10891:5;;10866:367;;11047:3;;11146:2;11142:1;:6;5137:2;11128:21;11117:34;;11107:4;11112:1;11107:7;;;;;;;;;;;:44;;;;;;;;;;-1:-1:-1;11219:2:0;11214:7;;;;10866:367;;;-1:-1:-1;11252:4:0;10315:949;-1:-1:-1;;;;10315:949:0:o;14406:304::-;14502:6;14549;14567:111;14594:16;;;;;14625:4;14567:111;:12;:111::i;20137:158::-;20266:6;;20237:4;;20266:21;;;;-1:-1:-1;;20276:7:0;;;:11;;;20137:158::o;17894:::-;18023:6;;17994:4;;18023:21;;;;-1:-1:-1;;18033:7:0;;;:11;;;;;17894:158::o;17727:159::-;17857:6;;17827:4;;17856:7;:22;;;;-1:-1:-1;;17867:7:0;;;:11;;;;;17727:159::o;6549:671::-;6745:4;6740:473;;6863:15;6873:4;6863:9;:15::i;:::-;6905:5;6937:17;6947:6;6937:9;:17::i;:::-;6981:6;7014:19;7024:8;7014:9;:19::i;:::-;7060:5;7092:19;7102:8;7092:9;:19::i;:::-;6820:347;;;;;;;;;;;7138:6;;6820:347;;;;49293:826;49496:24;;:::i;:::-;49553:31;;:::i;:::-;49599;;:::i;:::-;49644:109;49682:12;49709;49736:6;49644:23;:109::i;:::-;49538:215;;;;49766:18;49787:114;49817:7;:13;;;49845:9;:15;;;49875:9;:15;;;49787;:114::i;:::-;49921:190;;;;;;;;;-1:-1:-1;49921:190:0;;;49766:135;;-1:-1:-1;49921:190:0;;;;;;;;;;50041:26;49921:190;;;;;;;;49914:197;-1:-1:-1;;;49293:826:0;;;;;;;:::o;18060:145::-;18185:7;;;:12;;;;18060:145::o;47825:347::-;47982:13;;47971:25;;;;;;:10;:25;;;;;;;;47997:14;;;;;47971:41;;;;;;;;:51;;;;;;;;;;:58;;;;;;;;;;48069:13;;48097:14;;48045:119;;;;;;48069:13;47971:51;;:58;;48045:119;;19970:159;20100:6;;20070:4;;20099:7;:22;;;;-1:-1:-1;;20110:7:0;;;:11;;;19970:159::o;48453:832::-;48656:24;;:::i;:::-;48713:31;;:::i;:::-;48759;;:::i;:::-;48804:109;48842:12;48869;48896:6;48804:23;:109::i;:::-;48698:215;;;;48926:18;48947:121;48984:7;:13;;;49012:9;:15;;;49042:9;:15;;;48947:22;:121::i;:::-;49088:189;;;;;;;;;49127:4;49088:189;;48926:142;;-1:-1:-1;49088:189:0;;;-1:-1:-1;49088:189:0;;956:433;1014:7;1258:6;1254:47;;-1:-1:-1;1288:1:0;1281:8;;1254:47;1325:5;;;1329:1;1325;:5;:1;1349:5;;;;;:10;1341:19;;;;;1522:303;1580:7;1679:1;1675;:5;1667:14;;;;;;1692:9;1708:1;1704;:5;;;;;;;1522:303;-1:-1:-1;;;;1522:303:0:o;12273:339::-;12367:4;12438:2;12430:5;:10;12426:81;;;-1:-1:-1;5137:2:0;12475:18;;12464:31;;12457:38;;12426:81;-1:-1:-1;5192:2:0;12575:27;12564:40;;;12273:339::o;5540:427::-;5682:4;5677:283;;5800:15;5810:4;5800:9;:15::i;:::-;5842:5;5874:17;5884:6;5874:9;:17::i;:::-;5757:157;;;;;;;;;;;5677:283;5540:427;;;:::o;13346:423::-;13513:7;13542:11;;;:29;;-1:-1:-1;13557:14:0;;13542:29;13538:154;;;13652:28;13665:1;13668:11;13652:12;:28::i;:::-;13645:35;;;;13538:154;13709:52;13759:1;13709:45;13742:11;13709:28;13759:1;13709:21;:6;13720:9;13709:21;:10;:21;:::i;:::-;:25;:28;:25;:28;:::i;:45::-;:49;:52;:49;:52;:::i;37135:12987::-;;;;;;;;;;-1:-1:-1;37135:12987:0;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;-1:-1:-1;37135:12987:0;;;;;;;;:::o;:::-;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;:::o;5:118:-1:-;;72:46;110:6;97:20;72:46;;130:122;;208:39;239:6;233:13;208:39;;298:792;;448:3;441:4;433:6;429:17;425:27;415:2;;466:1;463;456:12;415:2;496:6;490:13;518:102;533:86;612:6;533:86;;;518:102;;;509:111;;637:5;662:6;655:5;648:21;692:4;684:6;680:17;670:27;;714:4;709:3;705:14;698:21;;767:6;814:3;806:4;798:6;794:17;789:3;785:27;782:36;779:2;;;831:1;828;821:12;779:2;856:1;841:243;866:6;863:1;860:13;841:243;;;924:3;946:74;1016:3;1004:10;946:74;;;934:87;;-1:-1;1044:4;1035:14;;;;1072:4;1063:14;;;;;888:1;881:9;841:243;;;845:14;408:682;;;;;;;;1098:112;;1162:43;1197:6;1184:20;1162:43;;1217:116;;1292:36;1320:6;1314:13;1292:36;;1341:440;;1442:3;1435:4;1427:6;1423:17;1419:27;1409:2;;1460:1;1457;1450:12;1409:2;1497:6;1484:20;1519:64;1534:48;1575:6;1534:48;;1519:64;1510:73;;1603:6;1596:5;1589:21;1639:4;1631:6;1627:17;1672:4;1665:5;1661:16;1707:3;1698:6;1693:3;1689:16;1686:25;1683:2;;;1724:1;1721;1714:12;1683:2;1734:41;1768:6;1763:3;1758;1734:41;;;1402:379;;;;;;;;1789:164;;1888:60;1940:6;1934:13;1888:60;;1986:342;;2108:4;2096:9;2091:3;2087:19;2083:30;2080:2;;;2126:1;2123;2116:12;2080:2;2144:20;2159:4;2144:20;;;2135:29;-1:-1;2215:1;2246:60;2302:3;2282:9;2246:60;;;2222:85;;-1:-1;2233:5;2074:254;-1:-1;;2074:254;2361:495;;2479:4;2467:9;2462:3;2458:19;2454:30;2451:2;;;2497:1;2494;2487:12;2451:2;2515:20;2530:4;2515:20;;;2506:29;-1:-1;2586:1;2617:60;2673:3;2653:9;2617:60;;;2593:85;;-1:-1;2741:2;2774:60;2830:3;2806:22;;;2774:60;;;2767:4;2760:5;2756:16;2749:86;2699:147;2445:411;;;;;2889:466;;3000:4;2988:9;2983:3;2979:19;2975:30;2972:2;;;3018:1;3015;3008:12;2972:2;3036:20;3051:4;3036:20;;;3027:29;-1:-1;3107:1;3138:49;3183:3;3163:9;3138:49;;;3114:74;;-1:-1;3251:2;3284:49;3329:3;3305:22;;;3284:49;;3385:459;;3494:4;3482:9;3477:3;3473:19;3469:30;3466:2;;;3512:1;3509;3502:12;3466:2;3530:20;3545:4;3530:20;;;3521:29;-1:-1;3600:1;3631:46;3673:3;3653:9;3631:46;;;3607:71;;-1:-1;3740:2;3773:49;3818:3;3794:22;;;3773:49;;3874:492;;3994:4;3982:9;3977:3;3973:19;3969:30;3966:2;;;4012:1;4009;4002:12;3966:2;4030:20;4045:4;4030:20;;;4021:29;-1:-1;4100:1;4131:57;4184:3;4164:9;4131:57;;;4107:82;;-1:-1;4251:2;4284:60;4340:3;4316:22;;;4284:60;;4788:511;;4916:4;4904:9;4899:3;4895:19;4891:30;4888:2;;;4934:1;4931;4924:12;4888:2;4952:20;4967:4;4952:20;;;4943:29;-1:-1;5024:1;5055:60;5111:3;5091:9;5055:60;;;5031:85;;-1:-1;5185:2;5218:59;5273:3;5249:22;;;5218:59;;5341:844;;5467:4;5455:9;5450:3;5446:19;5442:30;5439:2;;;5485:1;5482;5475:12;5439:2;5503:20;5518:4;5503:20;;;5494:29;-1:-1;5576:1;5607:78;5681:3;5661:9;5607:78;;;5583:103;;-1:-1;5751:2;5784:60;5840:3;5816:22;;;5784:60;;;5777:4;5770:5;5766:16;5759:86;5707:149;5911:2;5944:59;5999:3;5990:6;5979:9;5975:22;5944:59;;;5937:4;5930:5;5926:16;5919:85;5866:149;6072:3;6106:57;6159:3;6150:6;6139:9;6135:22;6106:57;;;6099:4;6092:5;6088:16;6081:83;6025:150;5433:752;;;;;6215:460;;6325:4;6313:9;6308:3;6304:19;6300:30;6297:2;;;6343:1;6340;6333:12;6297:2;6361:20;6376:4;6361:20;;;6352:29;-1:-1;6431:1;6462:46;6504:3;6484:9;6462:46;;6705:493;;6826:4;6814:9;6809:3;6805:19;6801:30;6798:2;;;6844:1;6841;6834:12;6798:2;6862:20;6877:4;6862:20;;;6853:29;-1:-1;6932:1;6963:57;7016:3;6996:9;6963:57;;7205:118;;7272:46;7310:6;7297:20;7272:46;;7330:122;;7408:39;7439:6;7433:13;7408:39;;7459:118;;7526:46;7564:6;7551:20;7526:46;;7584:122;;7662:39;7693:6;7687:13;7662:39;;7713:116;;7779:45;7816:6;7803:20;7779:45;;7836:120;;7913:38;7943:6;7937:13;7913:38;;7963:241;;8067:2;8055:9;8046:7;8042:23;8038:32;8035:2;;;8083:1;8080;8073:12;8035:2;8118:1;8135:53;8180:7;8160:9;8135:53;;8211:366;;;8332:2;8320:9;8311:7;8307:23;8303:32;8300:2;;;8348:1;8345;8338:12;8300:2;8383:1;8400:53;8445:7;8425:9;8400:53;;;8390:63;;8362:97;8490:2;8508:53;8553:7;8544:6;8533:9;8529:22;8508:53;;;8498:63;;8469:98;8294:283;;;;;;8584:640;;;;8753:3;8741:9;8732:7;8728:23;8724:33;8721:2;;;8770:1;8767;8760:12;8721:2;8805:1;8822:53;8867:7;8847:9;8822:53;;;8812:63;;8784:97;8912:2;8930:75;8997:7;8988:6;8977:9;8973:22;8930:75;;;8920:85;;8891:120;9070:2;9059:9;9055:18;9042:32;9094:18;9086:6;9083:30;9080:2;;;9126:1;9123;9116:12;9080:2;9146:62;9200:7;9191:6;9180:9;9176:22;9146:62;;;9136:72;;9021:193;8715:509;;;;;;9231:364;;;9351:2;9339:9;9330:7;9326:23;9322:32;9319:2;;;9367:1;9364;9357:12;9319:2;9402:1;9419:53;9464:7;9444:9;9419:53;;;9409:63;;9381:97;9509:2;9527:52;9571:7;9562:6;9551:9;9547:22;9527:52;;9602:305;;9738:2;9726:9;9717:7;9713:23;9709:32;9706:2;;;9754:1;9751;9744:12;9706:2;9789:1;9806:85;9883:7;9863:9;9806:85;;9914:614;;;10114:2;10102:9;10093:7;10089:23;10085:32;10082:2;;;10130:1;10127;10120:12;10082:2;10165:1;10182:85;10259:7;10239:9;10182:85;;;10172:95;;10144:129;10325:2;10314:9;10310:18;10304:25;10349:18;10341:6;10338:30;10335:2;;;10381:1;10378;10371:12;10335:2;10401:111;10504:7;10495:6;10484:9;10480:22;10401:111;;10535:497;;;10716:2;10704:9;10695:7;10691:23;10687:32;10684:2;;;10732:1;10729;10722:12;10684:2;10767:1;10784:85;10861:7;10841:9;10784:85;;;10774:95;;10746:129;10906:2;10924:92;11008:7;10999:6;10988:9;10984:22;10924:92;;11039:307;;11176:2;11164:9;11155:7;11151:23;11147:32;11144:2;;;11192:1;11189;11182:12;11144:2;11227:1;11244:86;11322:7;11302:9;11244:86;;11353:410;;;11496:2;11484:9;11475:7;11471:23;11467:32;11464:2;;;11512:1;11509;11502:12;11464:2;11547:1;11564:75;11631:7;11611:9;11564:75;;;11554:85;;11526:119;11676:2;11694:53;11739:7;11730:6;11719:9;11715:22;11694:53;;11770:303;;11905:2;11893:9;11884:7;11880:23;11876:32;11873:2;;;11921:1;11918;11911:12;11873:2;11956:1;11973:84;12049:7;12029:9;11973:84;;12396:305;;12532:2;12520:9;12511:7;12507:23;12503:32;12500:2;;;12548:1;12545;12538:12;12500:2;12583:1;12600:85;12677:7;12657:9;12600:85;;12708:241;;12812:2;12800:9;12791:7;12787:23;12783:32;12780:2;;;12828:1;12825;12818:12;12780:2;12863:1;12880:53;12925:7;12905:9;12880:53;;12956:1436;;;;;;;;;13293:3;13281:9;13272:7;13268:23;13264:33;13261:2;;;13310:1;13307;13300:12;13261:2;13345:1;13362:53;13407:7;13387:9;13362:53;;;13352:63;;13324:97;13452:2;13470:53;13515:7;13506:6;13495:9;13491:22;13470:53;;;13460:63;;13431:98;13560:2;13578:75;13645:7;13636:6;13625:9;13621:22;13578:75;;;13568:85;;13539:120;13690:3;13709:75;13776:7;13767:6;13756:9;13752:22;13709:75;;;13699:85;;13669:121;13821:3;13840:73;13905:7;13896:6;13885:9;13881:22;13840:73;;;13830:83;;13800:119;13950:3;13969:73;14034:7;14025:6;14014:9;14010:22;13969:73;;;13959:83;;13929:119;14079:3;14098:74;14164:7;14155:6;14144:9;14140:22;14098:74;;;14088:84;;14058:120;14237:3;14226:9;14222:19;14209:33;14262:18;14254:6;14251:30;14248:2;;;14294:1;14291;14284:12;14248:2;14314:62;14368:7;14359:6;14348:9;14344:22;14314:62;;;14304:72;;14188:194;13255:1137;;;;;;;;;;;;14399:489;;;;14536:2;14524:9;14515:7;14511:23;14507:32;14504:2;;;14552:1;14549;14542:12;14504:2;14587:1;14604:53;14649:7;14629:9;14604:53;;;14594:63;;14566:97;14694:2;14712:53;14757:7;14748:6;14737:9;14733:22;14712:53;;;14702:63;;14673:98;14802:2;14820:52;14864:7;14855:6;14844:9;14840:22;14820:52;;14895:397;;;15026:2;15014:9;15005:7;15001:23;14997:32;14994:2;;;15042:1;15039;15032:12;14994:2;15077:1;15094:64;15150:7;15130:9;15094:64;;;15084:74;;15056:108;15195:2;15213:63;15268:7;15259:6;15248:9;15244:22;15213:63;;15299:110;15372:31;15397:5;15372:31;;;15367:3;15360:44;15354:55;;;15543:101;15610:28;15632:5;15610:28;;15769:155;15868:50;15887:30;15911:5;15887:30;;;15868:50;;15931:155;16030:50;16049:30;16073:5;16049:30;;16093:159;16194:52;16214:31;16239:5;16214:31;;16259:356;;16387:38;16419:5;16387:38;;;16437:88;16518:6;16513:3;16437:88;;;16430:95;;16530:52;16575:6;16570:3;16563:4;16556:5;16552:16;16530:52;;;16594:16;;;;;16367:248;-1:-1;;16367:248;16622:164;16724:56;16774:5;16724:56;;16793:154;16885:56;16935:5;16885:56;;17109:347;;17221:39;17254:5;17221:39;;;17272:71;17336:6;17331:3;17272:71;;;17265:78;;17348:52;17393:6;17388:3;17381:4;17374:5;17370:16;17348:52;;;17421:29;17443:6;17421:29;;;17412:39;;;;17201:255;-1:-1;;;17201:255;17522:817;17736:22;;17671:4;17662:14;;;17764:55;17666:3;17736:22;17764:55;;;17691:134;17905:4;17898:5;17894:16;17888:23;17917:81;17992:4;17987:3;17983:14;17970:11;17917:81;;;17835:169;18075:4;18068:5;18064:16;18058:23;18087:78;18159:4;18154:3;18150:14;18137:11;18087:78;;;18014:157;18244:4;18237:5;18233:16;18227:23;18256:62;18312:4;18307:3;18303:14;18290:11;18256:62;;18395:467;18598:22;;18532:4;18523:14;;;18626:61;18527:3;18598:22;18626:61;;;18552:141;18767:4;18760:5;18756:16;18750:23;18779:62;18835:4;18830:3;18826:14;18813:11;18779:62;;19441:315;19646:22;;19580:4;19571:14;;;19674:61;19575:3;19646:22;19763:110;19836:31;19861:5;19836:31;;20007:117;20088:30;20112:5;20088:30;;20131:244;;20250:75;20321:3;20312:6;20250:75;;;-1:-1;20347:2;20338:12;;20238:137;-1:-1;20238:137;20382:553;;20598:93;20687:3;20678:6;20598:93;;;20591:100;;20702:73;20771:3;20762:6;20702:73;;;20797:1;20792:3;20788:11;20781:18;;20817:93;20906:3;20897:6;20817:93;;;20810:100;20579:356;-1:-1;;;;;20579:356;20942:978;;21256:93;21345:3;21336:6;21256:93;;;21249:100;;21360:73;21429:3;21420:6;21360:73;;;21455:1;21450:3;21446:11;21439:18;;21475:93;21564:3;21555:6;21475:93;;;21468:100;;21579:73;21648:3;21639:6;21579:73;;;21674:1;21669:3;21665:11;21658:18;;21694:93;21783:3;21774:6;21694:93;;;21687:100;;21798:73;21867:3;21858:6;21798:73;;;-1:-1;21893:1;21884:11;;21237:683;-1:-1;;;;;;21237:683;21927:1269;;22313:93;22402:3;22393:6;22313:93;;;22306:100;;22417:73;22486:3;22477:6;22417:73;;;22512:1;22507:3;22503:11;22496:18;;22532:93;22621:3;22612:6;22532:93;;;22525:100;;22636:73;22705:3;22696:6;22636:73;;;22731:1;22726:3;22722:11;22715:18;;22751:93;22840:3;22831:6;22751:93;;;22744:100;;22855:73;22924:3;22915:6;22855:73;;;22950:1;22945:3;22941:11;22934:18;;22970:93;23059:3;23050:6;22970:93;;;22963:100;;23074:73;23143:3;23134:6;23074:73;;;-1:-1;23169:1;23160:11;;22294:902;-1:-1;;;;;;;;22294:902;23203:1560;;23661:93;23750:3;23741:6;23661:93;;;23654:100;;23765:73;23834:3;23825:6;23765:73;;;23860:1;23855:3;23851:11;23844:18;;23880:93;23969:3;23960:6;23880:93;;;23873:100;;23984:73;24053:3;24044:6;23984:73;;;24079:1;24074:3;24070:11;24063:18;;24099:93;24188:3;24179:6;24099:93;;;24092:100;;24203:73;24272:3;24263:6;24203:73;;;24298:1;24293:3;24289:11;24282:18;;24318:93;24407:3;24398:6;24318:93;;;24311:100;;24422:73;24491:3;24482:6;24422:73;;;24517:1;24512:3;24508:11;24501:18;;24537:93;24626:3;24617:6;24537:93;;;24530:100;;24641:73;24710:3;24701:6;24641:73;;;-1:-1;24736:1;24727:11;;23642:1121;-1:-1;;;;;;;;;;23642:1121;24770:213;24888:2;24873:18;;24902:71;24877:9;24946:6;24902:71;;24990:431;25162:2;25147:18;;25176:71;25151:9;25220:6;25176:71;;;25258:72;25326:2;25315:9;25311:18;25302:6;25258:72;;;25341:70;25407:2;25396:9;25392:18;25383:6;25341:70;;25428:543;25628:3;25613:19;;25643:71;25617:9;25687:6;25643:71;;;25725:72;25793:2;25782:9;25778:18;25769:6;25725:72;;;25808;25876:2;25865:9;25861:18;25852:6;25808:72;;;25891:70;25957:2;25946:9;25942:18;25933:6;25891:70;;25978:201;26090:2;26075:18;;26104:65;26079:9;26142:6;26104:65;;26186:251;26323:2;26308:18;;26337:90;26312:9;26400:6;26337:90;;26444:301;26582:2;26596:47;;;26567:18;;26657:78;26567:18;26721:6;26657:78;;26752:326;26926:3;26911:19;;26941:127;26915:9;27041:6;26941:127;;27085:412;27275:2;27260:18;;27289:115;27264:9;27377:6;27289:115;;;27415:72;27483:2;27472:9;27468:18;27459:6;27415:72;;27915:508;28153:2;28138:18;;28167:117;28142:9;28257:6;28167:117;;;28295:118;28409:2;28398:9;28394:18;28385:6;28295:118;;28430:213;28548:2;28533:18;;28562:71;28537:9;28606:6;28562:71;;28650:324;28796:2;28781:18;;28810:71;28785:9;28854:6;28810:71;;;28892:72;28960:2;28949:9;28945:18;28936:6;28892:72;;28981:209;29097:2;29082:18;;29111:69;29086:9;29153:6;29111:69;;29197:256;29259:2;29253:9;29285:17;;;29360:18;29345:34;;29381:22;;;29342:62;29339:2;;;29417:1;29414;29407:12;29339:2;29433;29426:22;29237:216;;-1:-1;29237:216;29460:280;;29641:18;29633:6;29630:30;29627:2;;;29673:1;29670;29663:12;29627:2;-1:-1;29702:4;29690:17;;;29720:15;;29564:176;29747:258;;29890:18;29882:6;29879:30;29876:2;;;29922:1;29919;29912:12;29876:2;-1:-1;29995:4;29966;29943:17;;;;29962:9;29939:33;29985:15;;29813:192;30012:91;30086:12;;30070:33;30363:163;30466:19;;;30515:4;30506:14;;30459:67;30534:105;;30603:31;30628:5;30603:31;;30646:92;30719:13;30712:21;;30695:43;30745:151;30824:66;30813:78;;30796:100;30903:151;30982:66;30971:78;;30954:100;31061:79;31130:5;31113:27;31147:138;;31246:1;31239:5;31236:12;31226:2;;31252:9;31226:2;-1:-1;31275:5;31220:65;31434:128;31514:42;31503:54;;31486:76;31655:95;31734:10;31723:22;;31706:44;31968:141;;32067:1;32060:5;32057:12;32047:2;;32083:1;32080;32073:12;32116:120;32196:34;32185:46;;32168:68;32566:159;;32664:56;32714:5;32664:56;;32873:155;;32971:52;33017:5;32971:52;;33192:145;33273:6;33268:3;33263;33250:30;-1:-1;33329:1;33311:16;;33304:27;33243:94;33346:268;33411:1;33418:101;33432:6;33429:1;33426:13;33418:101;;;33499:11;;;33493:18;33480:11;;;33473:39;33454:2;33447:10;33418:101;;;33534:6;33531:1;33528:13;33525:2;;;-1:-1;;33599:1;33581:16;;33574:27;33395:219;33863:97;33951:2;33931:14;33947:7;33927:28;;33911:49
Swarm Source
bzzr://1fb5cd76566f136dd46aeb846f717b0de53b65aa3702601b2fed00de2dcc85d5
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.