Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Registry
Compiler Version
v0.6.6+commit.6c089d02
Contract Source Code (Solidity Multiple files format)
pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; import "./MultiRole.sol"; import "./RegistryInterface.sol"; import "./SafeMath.sol"; /** * @title Registry for financial contracts and approved financial contract creators. * @dev Maintains a whitelist of financial contract creators that are allowed * to register new financial contracts and stores party members of a financial contract. */ contract Registry is RegistryInterface, MultiRole { using SafeMath for uint256; /**************************************** * INTERNAL VARIABLES AND STORAGE * ****************************************/ enum Roles { Owner, // The owner manages the set of ContractCreators. ContractCreator // Can register financial contracts. } // This enum is required because a `WasValid` state is required // to ensure that financial contracts cannot be re-registered. enum Validity { Invalid, Valid } // Local information about a contract. struct FinancialContract { Validity valid; uint128 index; } struct Party { address[] contracts; // Each financial contract address is stored in this array. // The address of each financial contract is mapped to its index for constant time look up and deletion. mapping(address => uint256) contractIndex; } // Array of all contracts that are approved to use the UMA Oracle. address[] public registeredContracts; // Map of financial contract contracts to the associated FinancialContract struct. mapping(address => FinancialContract) public contractMap; // Map each party member to their their associated Party struct. mapping(address => Party) private partyMap; /**************************************** * EVENTS * ****************************************/ event NewContractRegistered(address indexed contractAddress, address indexed creator, address[] parties); event PartyAdded(address indexed contractAddress, address indexed party); event PartyRemoved(address indexed contractAddress, address indexed party); /** * @notice Construct the Registry contract. */ constructor() public { _createExclusiveRole(uint256(Roles.Owner), uint256(Roles.Owner), msg.sender); // Start with no contract creators registered. _createSharedRole(uint256(Roles.ContractCreator), uint256(Roles.Owner), new address[](0)); } /**************************************** * REGISTRATION FUNCTIONS * ****************************************/ /** * @notice Registers a new financial contract. * @dev Only authorized contract creators can call this method. * @param parties array of addresses who become parties in the contract. * @param contractAddress address of the contract against which the parties are registered. */ function registerContract(address[] calldata parties, address contractAddress) external override onlyRoleHolder(uint256(Roles.ContractCreator)) { FinancialContract storage financialContract = contractMap[contractAddress]; require(contractMap[contractAddress].valid == Validity.Invalid, "Can only register once"); // Store contract address as a registered contract. registeredContracts.push(contractAddress); // No length check necessary because we should never hit (2^127 - 1) contracts. financialContract.index = uint128(registeredContracts.length.sub(1)); // For all parties in the array add them to the contract's parties. financialContract.valid = Validity.Valid; for (uint256 i = 0; i < parties.length; i = i.add(1)) { _addPartyToContract(parties[i], contractAddress); } emit NewContractRegistered(contractAddress, msg.sender, parties); } /** * @notice Adds a party member to the calling contract. * @dev msg.sender will be used to determine the contract that this party is added to. * @param party new party for the calling contract. */ function addPartyToContract(address party) external override { address contractAddress = msg.sender; require(contractMap[contractAddress].valid == Validity.Valid, "Can only add to valid contract"); _addPartyToContract(party, contractAddress); } /** * @notice Removes a party member from the calling contract. * @dev msg.sender will be used to determine the contract that this party is removed from. * @param partyAddress address to be removed from the calling contract. */ function removePartyFromContract(address partyAddress) external override { address contractAddress = msg.sender; Party storage party = partyMap[partyAddress]; uint256 numberOfContracts = party.contracts.length; require(numberOfContracts != 0, "Party has no contracts"); require(contractMap[contractAddress].valid == Validity.Valid, "Remove only from valid contract"); require(isPartyMemberOfContract(partyAddress, contractAddress), "Can only remove existing party"); // Index of the current location of the contract to remove. uint256 deleteIndex = party.contractIndex[contractAddress]; // Store the last contract's address to update the lookup map. address lastContractAddress = party.contracts[numberOfContracts - 1]; // Swap the contract to be removed with the last contract. party.contracts[deleteIndex] = lastContractAddress; // Update the lookup index with the new location. party.contractIndex[lastContractAddress] = deleteIndex; // Pop the last contract from the array and update the lookup map. party.contracts.pop(); delete party.contractIndex[contractAddress]; emit PartyRemoved(contractAddress, partyAddress); } /**************************************** * REGISTRY STATE GETTERS * ****************************************/ /** * @notice Returns whether the contract has been registered with the registry. * @dev If it is registered, it is an authorized participant in the UMA system. * @param contractAddress address of the financial contract. * @return bool indicates whether the contract is registered. */ function isContractRegistered(address contractAddress) external override view returns (bool) { return contractMap[contractAddress].valid == Validity.Valid; } /** * @notice Returns a list of all contracts that are associated with a particular party. * @param party address of the party. * @return an array of the contracts the party is registered to. */ function getRegisteredContracts(address party) external override view returns (address[] memory) { return partyMap[party].contracts; } /** * @notice Returns all registered contracts. * @return all registered contract addresses within the system. */ function getAllRegisteredContracts() external override view returns (address[] memory) { return registeredContracts; } /** * @notice checks if an address is a party of a contract. * @param party party to check. * @param contractAddress address to check against the party. * @return bool indicating if the address is a party of the contract. */ function isPartyMemberOfContract(address party, address contractAddress) public override view returns (bool) { uint256 index = partyMap[party].contractIndex[contractAddress]; return partyMap[party].contracts.length > index && partyMap[party].contracts[index] == contractAddress; } /**************************************** * INTERNAL FUNCTIONS * ****************************************/ function _addPartyToContract(address party, address contractAddress) internal { require(!isPartyMemberOfContract(party, contractAddress), "Can only register a party once"); uint256 contractIndex = partyMap[party].contracts.length; partyMap[party].contracts.push(contractAddress); partyMap[party].contractIndex[contractAddress] = contractIndex; emit PartyAdded(contractAddress, party); } }
pragma solidity ^0.6.0; library Exclusive { struct RoleMembership { address member; } function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) { return roleMembership.member == memberToCheck; } function resetMember(RoleMembership storage roleMembership, address newMember) internal { require(newMember != address(0x0), "Cannot set an exclusive role to 0x0"); roleMembership.member = newMember; } function getMember(RoleMembership storage roleMembership) internal view returns (address) { return roleMembership.member; } function init(RoleMembership storage roleMembership, address initialMember) internal { resetMember(roleMembership, initialMember); } } library Shared { struct RoleMembership { mapping(address => bool) members; } function isMember(RoleMembership storage roleMembership, address memberToCheck) internal view returns (bool) { return roleMembership.members[memberToCheck]; } function addMember(RoleMembership storage roleMembership, address memberToAdd) internal { require(memberToAdd != address(0x0), "Cannot add 0x0 to a shared role"); roleMembership.members[memberToAdd] = true; } function removeMember(RoleMembership storage roleMembership, address memberToRemove) internal { roleMembership.members[memberToRemove] = false; } function init(RoleMembership storage roleMembership, address[] memory initialMembers) internal { for (uint256 i = 0; i < initialMembers.length; i++) { addMember(roleMembership, initialMembers[i]); } } } /** * @title Base class to manage permissions for the derived class. */ abstract contract MultiRole { using Exclusive for Exclusive.RoleMembership; using Shared for Shared.RoleMembership; enum RoleType { Invalid, Exclusive, Shared } struct Role { uint256 managingRole; RoleType roleType; Exclusive.RoleMembership exclusiveRoleMembership; Shared.RoleMembership sharedRoleMembership; } mapping(uint256 => Role) private roles; event ResetExclusiveMember(uint256 indexed roleId, address indexed newMember, address indexed manager); event AddedSharedMember(uint256 indexed roleId, address indexed newMember, address indexed manager); event RemovedSharedMember(uint256 indexed roleId, address indexed oldMember, address indexed manager); /** * @notice Reverts unless the caller is a member of the specified roleId. */ modifier onlyRoleHolder(uint256 roleId) { require(holdsRole(roleId, msg.sender), "Sender does not hold required role"); _; } /** * @notice Reverts unless the caller is a member of the manager role for the specified roleId. */ modifier onlyRoleManager(uint256 roleId) { require(holdsRole(roles[roleId].managingRole, msg.sender), "Can only be called by a role manager"); _; } /** * @notice Reverts unless the roleId represents an initialized, exclusive roleId. */ modifier onlyExclusive(uint256 roleId) { require(roles[roleId].roleType == RoleType.Exclusive, "Must be called on an initialized Exclusive role"); _; } /** * @notice Reverts unless the roleId represents an initialized, shared roleId. */ modifier onlyShared(uint256 roleId) { require(roles[roleId].roleType == RoleType.Shared, "Must be called on an initialized Shared role"); _; } /** * @notice Whether `memberToCheck` is a member of roleId. * @dev Reverts if roleId does not correspond to an initialized role. * @param roleId the Role to check. * @param memberToCheck the address to check. * @return True if `memberToCheck` is a member of `roleId`. */ function holdsRole(uint256 roleId, address memberToCheck) public view returns (bool) { Role storage role = roles[roleId]; if (role.roleType == RoleType.Exclusive) { return role.exclusiveRoleMembership.isMember(memberToCheck); } else if (role.roleType == RoleType.Shared) { return role.sharedRoleMembership.isMember(memberToCheck); } revert("Invalid roleId"); } /** * @notice Changes the exclusive role holder of `roleId` to `newMember`. * @dev Reverts if the caller is not a member of the managing role for `roleId` or if `roleId` is not an * initialized, ExclusiveRole. * @param roleId the ExclusiveRole membership to modify. * @param newMember the new ExclusiveRole member. */ function resetMember(uint256 roleId, address newMember) public onlyExclusive(roleId) onlyRoleManager(roleId) { roles[roleId].exclusiveRoleMembership.resetMember(newMember); emit ResetExclusiveMember(roleId, newMember, msg.sender); } /** * @notice Gets the current holder of the exclusive role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, exclusive role. * @param roleId the ExclusiveRole membership to check. * @return the address of the current ExclusiveRole member. */ function getMember(uint256 roleId) public view onlyExclusive(roleId) returns (address) { return roles[roleId].exclusiveRoleMembership.getMember(); } /** * @notice Adds `newMember` to the shared role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the * managing role for `roleId`. * @param roleId the SharedRole membership to modify. * @param newMember the new SharedRole member. */ function addMember(uint256 roleId, address newMember) public onlyShared(roleId) onlyRoleManager(roleId) { roles[roleId].sharedRoleMembership.addMember(newMember); emit AddedSharedMember(roleId, newMember, msg.sender); } /** * @notice Removes `memberToRemove` from the shared role, `roleId`. * @dev Reverts if `roleId` does not represent an initialized, SharedRole or if the caller is not a member of the * managing role for `roleId`. * @param roleId the SharedRole membership to modify. * @param memberToRemove the current SharedRole member to remove. */ function removeMember(uint256 roleId, address memberToRemove) public onlyShared(roleId) onlyRoleManager(roleId) { roles[roleId].sharedRoleMembership.removeMember(memberToRemove); emit RemovedSharedMember(roleId, memberToRemove, msg.sender); } /** * @notice Removes caller from the role, `roleId`. * @dev Reverts if the caller is not a member of the role for `roleId` or if `roleId` is not an * initialized, SharedRole. * @param roleId the SharedRole membership to modify. */ function renounceMembership(uint256 roleId) public onlyShared(roleId) onlyRoleHolder(roleId) { roles[roleId].sharedRoleMembership.removeMember(msg.sender); emit RemovedSharedMember(roleId, msg.sender, msg.sender); } /** * @notice Reverts if `roleId` is not initialized. */ modifier onlyValidRole(uint256 roleId) { require(roles[roleId].roleType != RoleType.Invalid, "Attempted to use an invalid roleId"); _; } /** * @notice Reverts if `roleId` is initialized. */ modifier onlyInvalidRole(uint256 roleId) { require(roles[roleId].roleType == RoleType.Invalid, "Cannot use a pre-existing role"); _; } /** * @notice Internal method to initialize a shared role, `roleId`, which will be managed by `managingRoleId`. * `initialMembers` will be immediately added to the role. * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already * initialized. */ function _createSharedRole( uint256 roleId, uint256 managingRoleId, address[] memory initialMembers ) internal onlyInvalidRole(roleId) { Role storage role = roles[roleId]; role.roleType = RoleType.Shared; role.managingRole = managingRoleId; role.sharedRoleMembership.init(initialMembers); require( roles[managingRoleId].roleType != RoleType.Invalid, "Attempted to use an invalid role to manage a shared role" ); } /** * @notice Internal method to initialize an exclusive role, `roleId`, which will be managed by `managingRoleId`. * `initialMember` will be immediately added to the role. * @dev Should be called by derived contracts, usually at construction time. Will revert if the role is already * initialized. */ function _createExclusiveRole( uint256 roleId, uint256 managingRoleId, address initialMember ) internal onlyInvalidRole(roleId) { Role storage role = roles[roleId]; role.roleType = RoleType.Exclusive; role.managingRole = managingRoleId; role.exclusiveRoleMembership.init(initialMember); require( roles[managingRoleId].roleType != RoleType.Invalid, "Attempted to use an invalid role to manage an exclusive role" ); } }
pragma solidity ^0.6.0; pragma experimental ABIEncoderV2; /** * @title Interface for a registry of contracts and contract creators. */ interface RegistryInterface { /** * @notice Registers a new contract. * @dev Only authorized contract creators can call this method. * @param parties an array of addresses who become parties in the contract. * @param contractAddress defines the address of the deployed contract. */ function registerContract(address[] calldata parties, address contractAddress) external; /** * @notice Returns whether the contract has been registered with the registry. * @dev If it is registered, it is an authorized participant in the UMA system. * @param contractAddress address of the contract. * @return bool indicates whether the contract is registered. */ function isContractRegistered(address contractAddress) external view returns (bool); /** * @notice Returns a list of all contracts that are associated with a particular party. * @param party address of the party. * @return an array of the contracts the party is registered to. */ function getRegisteredContracts(address party) external view returns (address[] memory); /** * @notice Returns all registered contracts. * @return all registered contract addresses within the system. */ function getAllRegisteredContracts() external view returns (address[] memory); /** * @notice Adds a party to the calling contract. * @dev msg.sender must be the contract to which the party member is added. * @param party address to be added to the contract. */ function addPartyToContract(address party) external; /** * @notice Removes a party member to the calling contract. * @dev msg.sender must be the contract to which the party member is added. * @param party address to be removed from the contract. */ function removePartyFromContract(address party) external; /** * @notice checks if an address is a party in a contract. * @param party party to check. * @param contractAddress address to check against the party. * @return bool indicating if the address is a party of the contract. */ function isPartyMemberOfContract(address party, address contractAddress) external view returns (bool); }
pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"AddedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"creator","type":"address"},{"indexed":false,"internalType":"address[]","name":"parties","type":"address[]"}],"name":"NewContractRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"party","type":"address"}],"name":"PartyAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"contractAddress","type":"address"},{"indexed":true,"internalType":"address","name":"party","type":"address"}],"name":"PartyRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"oldMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"RemovedSharedMember","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"roleId","type":"uint256"},{"indexed":true,"internalType":"address","name":"newMember","type":"address"},{"indexed":true,"internalType":"address","name":"manager","type":"address"}],"name":"ResetExclusiveMember","type":"event"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"addMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"party","type":"address"}],"name":"addPartyToContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"contractMap","outputs":[{"internalType":"enum Registry.Validity","name":"valid","type":"uint8"},{"internalType":"uint128","name":"index","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllRegisteredContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"getMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"party","type":"address"}],"name":"getRegisteredContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToCheck","type":"address"}],"name":"holdsRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isContractRegistered","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"party","type":"address"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"isPartyMemberOfContract","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"parties","type":"address[]"},{"internalType":"address","name":"contractAddress","type":"address"}],"name":"registerContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"registeredContracts","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"memberToRemove","type":"address"}],"name":"removeMember","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"partyAddress","type":"address"}],"name":"removePartyFromContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"}],"name":"renounceMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"roleId","type":"uint256"},{"internalType":"address","name":"newMember","type":"address"}],"name":"resetMember","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5062000029600080336001600160e01b036200005616565b6040805160008082526020820190925262000050916001916001600160e01b036200012916565b62000422565b826000808281526020819052604090206001015460ff1660028111156200007957fe5b14620000a25760405162461bcd60e51b815260040162000099906200035c565b60405180910390fd5b60008481526020819052604090206001808201805460ff191682800217905550838155620000e06002820184620001eb602090811b620013e917901c565b60008481526020819052604081206001015460ff1660028111156200010157fe5b1415620001225760405162461bcd60e51b8152600401620000999062000310565b5050505050565b826000808281526020819052604090206001015460ff1660028111156200014c57fe5b146200016c5760405162461bcd60e51b815260040162000099906200035c565b60008481526020818152604090912060018101805460ff1916600217905584815590620001a99060038301908590620013f362000204821b17901c565b60008481526020819052604081206001015460ff166002811115620001ca57fe5b1415620001225760405162461bcd60e51b81526004016200009990620003d6565b6200020082826001600160e01b036200024516565b5050565b60005b8151811015620002405762000237838383815181106200022357fe5b60200260200101516200028b60201b60201c565b60010162000207565b505050565b6001600160a01b0381166200026e5760405162461bcd60e51b8152600401620000999062000393565b81546001600160a01b0319166001600160a01b0391909116179055565b6001600160a01b038116620002b45760405162461bcd60e51b81526004016200009990620002d9565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b6020808252601f908201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c6500604082015260600190565b6020808252603c908201526000805160206200189183398151915260408201527f20746f206d616e61676520616e206578636c757369766520726f6c6500000000606082015260800190565b6020808252601e908201527f43616e6e6f74207573652061207072652d6578697374696e6720726f6c650000604082015260600190565b60208082526023908201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060408201526203078360ec1b606082015260800190565b60208082526038908201526000805160206200189183398151915260408201527f20746f206d616e61676520612073686172656420726f6c650000000000000000606082015260800190565b61145f80620004326000396000f3fe608060405234801561001057600080fd5b50600436106100f55760003560e01c806374d0a67611610097578063ab3545e511610066578063ab3545e5146101f3578063d97c05be14610213578063e33c4cd214610226578063f9f6b49b14610239576100f5565b806374d0a6761461019a5780637a3edab0146101ad5780637cdc1cb9146101cd578063aaa14ca3146101e0576100f5565b8063303118d0116100d3578063303118d0146101405780633c0af3441461015357806366c8c250146101745780636be7658b14610187576100f5565b80631676ddc3146100fa578063167cdde714610118578063188c6ff81461012d575b600080fd5b61010261024c565b60405161010f9190610fae565b60405180910390f35b61012b610126366004610e41565b6102ae565b005b61010261013b366004610e41565b610302565b61012b61014e366004610e41565b610378565b610166610161366004610e41565b610530565b60405161010f929190611006565b61012b610182366004610e90565b61055e565b61012b610195366004610f29565b6106ff565b61012b6101a8366004610f29565b6107d5565b6101c06101bb366004610e5c565b6108ab565b60405161010f9190610ffb565b6101c06101db366004610f29565b61092e565b61012b6101ee366004610f11565b6109b7565b610206610201366004610f11565b610a73565b60405161010f9190610f4c565b61012b610221366004610f29565b610ad6565b610206610234366004610f11565b610bac565b6101c0610247366004610e41565b610bd3565b606060018054806020026020016040519081016040528092919081815260200182805480156102a457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610286575b5050505050905090565b3360008181526002602052604090205460019060ff16818111156102ce57fe5b146102f45760405162461bcd60e51b81526004016102eb906111c1565b60405180910390fd5b6102fe8282610c05565b5050565b6001600160a01b03811660009081526003602090815260409182902080548351818402810184019094528084526060939283018282801561036c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161034e575b50505050509050919050565b6001600160a01b03811660009081526003602052604090208054339190806103b25760405162461bcd60e51b81526004016102eb9061118a565b60016001600160a01b03841660009081526002602052604090205460ff1660018111156103db57fe5b146103f85760405162461bcd60e51b81526004016102eb906110bf565b61040284846108ab565b61041e5760405162461bcd60e51b81526004016102eb906113b2565b6001600160a01b038316600090815260018301602052604081205483549091908490600019850190811061044e57fe5b60009182526020909120015484546001600160a01b039091169150819085908490811061047757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600186019091526040902082905583548490806104bd57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0387811680845260018801909252604080842084905551908916927f8e0a870c3ff65bd1f2852048eb92d693833891a8c0ab0827347177544464c57091a3505050505050565b60026020526000908152604090205460ff81169061010090046fffffffffffffffffffffffffffffffff1682565b600161056a813361092e565b6105865760405162461bcd60e51b81526004016102eb90611244565b6001600160a01b0382166000908152600260205260408120805490919060ff1660018111156105b157fe5b146105ce5760405162461bcd60e51b81526004016102eb90611344565b60018054808201825560008290527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038616179055805461062291610ca8565b815460016fffffffffffffffffffffffffffffffff929092166101000270ffffffffffffffffffffffffffffffff00199091161760ff191617815560005b848110156106aa5761069286868381811061067757fe5b905060200201602081019061068c9190610e41565b85610c05565b6106a381600163ffffffff610cea16565b9050610660565b50336001600160a01b0316836001600160a01b03167f1b0bc775e5162f873356bcc1733155bd2eb9509f1774770f54b4f938287bcf0387876040516106f0929190610f60565b60405180910390a35050505050565b81600260008281526020819052604090206001015460ff16600281111561072257fe5b1461073f5760405162461bcd60e51b81526004016102eb906111f8565b600083815260208190526040902054839061075a903361092e565b6107765760405162461bcd60e51b81526004016102eb90611300565b6000848152602081905260409020610797906003018463ffffffff610d0f16565b60405133906001600160a01b0385169086907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a450505050565b81600260008281526020819052604090206001015460ff1660028111156107f857fe5b146108155760405162461bcd60e51b81526004016102eb906111f8565b6000838152602081905260409020548390610830903361092e565b61084c5760405162461bcd60e51b81526004016102eb90611300565b600084815260208190526040902061086d906003018463ffffffff610d3116565b60405133906001600160a01b0385169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b6001600160a01b03808316600081815260036020818152604080842095871684526001860182528320549383525291548110801561092457506001600160a01b0384811660009081526003602052604090208054918516918390811061090d57fe5b6000918252602090912001546001600160a01b0316145b9150505b92915050565b600082815260208190526040812060018082015460ff16600281111561095057fe5b141561097157610969600282018463ffffffff610d7c16565b915050610928565b6002600182015460ff16600281111561098657fe5b141561099f57610969600382018463ffffffff610d8f16565b60405162461bcd60e51b81526004016102eb9061137b565b80600260008281526020819052604090206001015460ff1660028111156109da57fe5b146109f75760405162461bcd60e51b81526004016102eb906111f8565b81610a02813361092e565b610a1e5760405162461bcd60e51b81526004016102eb90611244565b6000838152602081905260409020610a3f906003013363ffffffff610d0f16565b6040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff166002811115610a9857fe5b14610ab55760405162461bcd60e51b81526004016102eb9061112d565b6000838152602081905260409020610acf90600201610dae565b9392505050565b81600160008281526020819052604090206001015460ff166002811115610af957fe5b14610b165760405162461bcd60e51b81526004016102eb9061112d565b6000838152602081905260409020548390610b31903361092e565b610b4d5760405162461bcd60e51b81526004016102eb90611300565b6000848152602081905260409020610b6e906002018463ffffffff610dbb16565b60405133906001600160a01b0385169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b60018181548110610bb957fe5b6000918252602090912001546001600160a01b0316905081565b600060016001600160a01b03831660009081526002602052604090205460ff166001811115610bfe57fe5b1492915050565b610c0f82826108ab565b15610c2c5760405162461bcd60e51b81526004016102eb90611286565b6001600160a01b038281166000818152600360209081526040808320805460018082018355828652848620820180546001600160a01b031916988a169889179055878652909101909252808320829055519093917f4b920dd33e12e37712086438f2afcecb921cefe83b717ca990222f53d7e2845491a3505050565b6000610acf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610dfe565b600082820183811015610acf5760405162461bcd60e51b81526004016102eb906110f6565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038116610d575760405162461bcd60e51b81526004016102eb90611088565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b90546001600160a01b0391821691161490565b6001600160a01b03166000908152602091909152604090205460ff1690565b546001600160a01b031690565b6001600160a01b038116610de15760405162461bcd60e51b81526004016102eb906112bd565b81546001600160a01b0319166001600160a01b0391909116179055565b60008184841115610e225760405162461bcd60e51b81526004016102eb9190611035565b505050900390565b80356001600160a01b038116811461092857600080fd5b600060208284031215610e52578081fd5b610acf8383610e2a565b60008060408385031215610e6e578081fd5b610e788484610e2a565b9150610e878460208501610e2a565b90509250929050565b600080600060408486031215610ea4578081fd5b833567ffffffffffffffff80821115610ebb578283fd5b81860187601f820112610ecc578384fd5b8035925081831115610edc578384fd5b8760208085028301011115610eef578384fd5b602081019550505080925050610f088560208601610e2a565b90509250925092565b600060208284031215610f22578081fd5b5035919050565b60008060408385031215610f3b578182fd5b82359150610e878460208501610e2a565b6001600160a01b0391909116815260200190565b60208082528181018390526000908460408401835b86811015610fa3578383016001600160a01b03610f928286610e2a565b168352925090830190600101610f75565b509695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610fef5783516001600160a01b031683529284019291840191600101610fca565b50909695505050505050565b901515815260200190565b604081016002841061101457fe5b9281526fffffffffffffffffffffffffffffffff9190911660209091015290565b6000602080835283518082850152825b8181101561106157858101830151858201604001528201611045565b818111156110725783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601f908201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c6500604082015260600190565b6020808252601f908201527f52656d6f7665206f6e6c792066726f6d2076616c696420636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602f908201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460408201527f204578636c757369766520726f6c650000000000000000000000000000000000606082015260800190565b60208082526016908201527f506172747920686173206e6f20636f6e74726163747300000000000000000000604082015260600190565b6020808252601e908201527f43616e206f6e6c792061646420746f2076616c696420636f6e74726163740000604082015260600190565b6020808252602c908201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460408201526b2053686172656420726f6c6560a01b606082015260800190565b60208082526022908201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f6040820152616c6560f01b606082015260800190565b6020808252601e908201527f43616e206f6e6c792072656769737465722061207061727479206f6e63650000604082015260600190565b60208082526023908201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060408201526203078360ec1b606082015260800190565b60208082526024908201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60408201526330b3b2b960e11b606082015260800190565b60208082526016908201527f43616e206f6e6c79207265676973746572206f6e636500000000000000000000604082015260600190565b6020808252600e908201527f496e76616c696420726f6c654964000000000000000000000000000000000000604082015260600190565b6020808252601e908201527f43616e206f6e6c792072656d6f7665206578697374696e672070617274790000604082015260600190565b6102fe8282610dbb565b60005b81518110156114245761141c8383838151811061140f57fe5b6020026020010151610d31565b6001016113f6565b50505056fea2646970667358221220213cd3641e73404c660417360e3680ba6d199604dec08172b4daa2ac9aa0a75d64736f6c63430006060033417474656d7074656420746f2075736520616e20696e76616c696420726f6c65
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106100f55760003560e01c806374d0a67611610097578063ab3545e511610066578063ab3545e5146101f3578063d97c05be14610213578063e33c4cd214610226578063f9f6b49b14610239576100f5565b806374d0a6761461019a5780637a3edab0146101ad5780637cdc1cb9146101cd578063aaa14ca3146101e0576100f5565b8063303118d0116100d3578063303118d0146101405780633c0af3441461015357806366c8c250146101745780636be7658b14610187576100f5565b80631676ddc3146100fa578063167cdde714610118578063188c6ff81461012d575b600080fd5b61010261024c565b60405161010f9190610fae565b60405180910390f35b61012b610126366004610e41565b6102ae565b005b61010261013b366004610e41565b610302565b61012b61014e366004610e41565b610378565b610166610161366004610e41565b610530565b60405161010f929190611006565b61012b610182366004610e90565b61055e565b61012b610195366004610f29565b6106ff565b61012b6101a8366004610f29565b6107d5565b6101c06101bb366004610e5c565b6108ab565b60405161010f9190610ffb565b6101c06101db366004610f29565b61092e565b61012b6101ee366004610f11565b6109b7565b610206610201366004610f11565b610a73565b60405161010f9190610f4c565b61012b610221366004610f29565b610ad6565b610206610234366004610f11565b610bac565b6101c0610247366004610e41565b610bd3565b606060018054806020026020016040519081016040528092919081815260200182805480156102a457602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610286575b5050505050905090565b3360008181526002602052604090205460019060ff16818111156102ce57fe5b146102f45760405162461bcd60e51b81526004016102eb906111c1565b60405180910390fd5b6102fe8282610c05565b5050565b6001600160a01b03811660009081526003602090815260409182902080548351818402810184019094528084526060939283018282801561036c57602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161034e575b50505050509050919050565b6001600160a01b03811660009081526003602052604090208054339190806103b25760405162461bcd60e51b81526004016102eb9061118a565b60016001600160a01b03841660009081526002602052604090205460ff1660018111156103db57fe5b146103f85760405162461bcd60e51b81526004016102eb906110bf565b61040284846108ab565b61041e5760405162461bcd60e51b81526004016102eb906113b2565b6001600160a01b038316600090815260018301602052604081205483549091908490600019850190811061044e57fe5b60009182526020909120015484546001600160a01b039091169150819085908490811061047757fe5b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559183168152600186019091526040902082905583548490806104bd57fe5b60008281526020808220830160001990810180546001600160a01b03191690559092019092556001600160a01b0387811680845260018801909252604080842084905551908916927f8e0a870c3ff65bd1f2852048eb92d693833891a8c0ab0827347177544464c57091a3505050505050565b60026020526000908152604090205460ff81169061010090046fffffffffffffffffffffffffffffffff1682565b600161056a813361092e565b6105865760405162461bcd60e51b81526004016102eb90611244565b6001600160a01b0382166000908152600260205260408120805490919060ff1660018111156105b157fe5b146105ce5760405162461bcd60e51b81526004016102eb90611344565b60018054808201825560008290527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60180546001600160a01b0319166001600160a01b038616179055805461062291610ca8565b815460016fffffffffffffffffffffffffffffffff929092166101000270ffffffffffffffffffffffffffffffff00199091161760ff191617815560005b848110156106aa5761069286868381811061067757fe5b905060200201602081019061068c9190610e41565b85610c05565b6106a381600163ffffffff610cea16565b9050610660565b50336001600160a01b0316836001600160a01b03167f1b0bc775e5162f873356bcc1733155bd2eb9509f1774770f54b4f938287bcf0387876040516106f0929190610f60565b60405180910390a35050505050565b81600260008281526020819052604090206001015460ff16600281111561072257fe5b1461073f5760405162461bcd60e51b81526004016102eb906111f8565b600083815260208190526040902054839061075a903361092e565b6107765760405162461bcd60e51b81526004016102eb90611300565b6000848152602081905260409020610797906003018463ffffffff610d0f16565b60405133906001600160a01b0385169086907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a450505050565b81600260008281526020819052604090206001015460ff1660028111156107f857fe5b146108155760405162461bcd60e51b81526004016102eb906111f8565b6000838152602081905260409020548390610830903361092e565b61084c5760405162461bcd60e51b81526004016102eb90611300565b600084815260208190526040902061086d906003018463ffffffff610d3116565b60405133906001600160a01b0385169086907f63502af7324ff6db91ab38f8236a648727d9385ea6c782073dd4882d8a61a48f90600090a450505050565b6001600160a01b03808316600081815260036020818152604080842095871684526001860182528320549383525291548110801561092457506001600160a01b0384811660009081526003602052604090208054918516918390811061090d57fe5b6000918252602090912001546001600160a01b0316145b9150505b92915050565b600082815260208190526040812060018082015460ff16600281111561095057fe5b141561097157610969600282018463ffffffff610d7c16565b915050610928565b6002600182015460ff16600281111561098657fe5b141561099f57610969600382018463ffffffff610d8f16565b60405162461bcd60e51b81526004016102eb9061137b565b80600260008281526020819052604090206001015460ff1660028111156109da57fe5b146109f75760405162461bcd60e51b81526004016102eb906111f8565b81610a02813361092e565b610a1e5760405162461bcd60e51b81526004016102eb90611244565b6000838152602081905260409020610a3f906003013363ffffffff610d0f16565b6040513390819085907feb3e33034c392e69263b04ec0fa376dc12784a41b6676c7f31b936cbc0fbb5af90600090a4505050565b600081600160008281526020819052604090206001015460ff166002811115610a9857fe5b14610ab55760405162461bcd60e51b81526004016102eb9061112d565b6000838152602081905260409020610acf90600201610dae565b9392505050565b81600160008281526020819052604090206001015460ff166002811115610af957fe5b14610b165760405162461bcd60e51b81526004016102eb9061112d565b6000838152602081905260409020548390610b31903361092e565b610b4d5760405162461bcd60e51b81526004016102eb90611300565b6000848152602081905260409020610b6e906002018463ffffffff610dbb16565b60405133906001600160a01b0385169086907f3b855c56b409b671c7112789d022675eb639d0bcb8896f1b6197c132f799e74690600090a450505050565b60018181548110610bb957fe5b6000918252602090912001546001600160a01b0316905081565b600060016001600160a01b03831660009081526002602052604090205460ff166001811115610bfe57fe5b1492915050565b610c0f82826108ab565b15610c2c5760405162461bcd60e51b81526004016102eb90611286565b6001600160a01b038281166000818152600360209081526040808320805460018082018355828652848620820180546001600160a01b031916988a169889179055878652909101909252808320829055519093917f4b920dd33e12e37712086438f2afcecb921cefe83b717ca990222f53d7e2845491a3505050565b6000610acf83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250610dfe565b600082820183811015610acf5760405162461bcd60e51b81526004016102eb906110f6565b6001600160a01b0316600090815260209190915260409020805460ff19169055565b6001600160a01b038116610d575760405162461bcd60e51b81526004016102eb90611088565b6001600160a01b0316600090815260209190915260409020805460ff19166001179055565b90546001600160a01b0391821691161490565b6001600160a01b03166000908152602091909152604090205460ff1690565b546001600160a01b031690565b6001600160a01b038116610de15760405162461bcd60e51b81526004016102eb906112bd565b81546001600160a01b0319166001600160a01b0391909116179055565b60008184841115610e225760405162461bcd60e51b81526004016102eb9190611035565b505050900390565b80356001600160a01b038116811461092857600080fd5b600060208284031215610e52578081fd5b610acf8383610e2a565b60008060408385031215610e6e578081fd5b610e788484610e2a565b9150610e878460208501610e2a565b90509250929050565b600080600060408486031215610ea4578081fd5b833567ffffffffffffffff80821115610ebb578283fd5b81860187601f820112610ecc578384fd5b8035925081831115610edc578384fd5b8760208085028301011115610eef578384fd5b602081019550505080925050610f088560208601610e2a565b90509250925092565b600060208284031215610f22578081fd5b5035919050565b60008060408385031215610f3b578182fd5b82359150610e878460208501610e2a565b6001600160a01b0391909116815260200190565b60208082528181018390526000908460408401835b86811015610fa3578383016001600160a01b03610f928286610e2a565b168352925090830190600101610f75565b509695505050505050565b6020808252825182820181905260009190848201906040850190845b81811015610fef5783516001600160a01b031683529284019291840191600101610fca565b50909695505050505050565b901515815260200190565b604081016002841061101457fe5b9281526fffffffffffffffffffffffffffffffff9190911660209091015290565b6000602080835283518082850152825b8181101561106157858101830151858201604001528201611045565b818111156110725783604083870101525b50601f01601f1916929092016040019392505050565b6020808252601f908201527f43616e6e6f74206164642030783020746f20612073686172656420726f6c6500604082015260600190565b6020808252601f908201527f52656d6f7665206f6e6c792066726f6d2076616c696420636f6e747261637400604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602f908201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460408201527f204578636c757369766520726f6c650000000000000000000000000000000000606082015260800190565b60208082526016908201527f506172747920686173206e6f20636f6e74726163747300000000000000000000604082015260600190565b6020808252601e908201527f43616e206f6e6c792061646420746f2076616c696420636f6e74726163740000604082015260600190565b6020808252602c908201527f4d7573742062652063616c6c6564206f6e20616e20696e697469616c697a656460408201526b2053686172656420726f6c6560a01b606082015260800190565b60208082526022908201527f53656e64657220646f6573206e6f7420686f6c6420726571756972656420726f6040820152616c6560f01b606082015260800190565b6020808252601e908201527f43616e206f6e6c792072656769737465722061207061727479206f6e63650000604082015260600190565b60208082526023908201527f43616e6e6f742073657420616e206578636c757369766520726f6c6520746f2060408201526203078360ec1b606082015260800190565b60208082526024908201527f43616e206f6e6c792062652063616c6c6564206279206120726f6c65206d616e60408201526330b3b2b960e11b606082015260800190565b60208082526016908201527f43616e206f6e6c79207265676973746572206f6e636500000000000000000000604082015260600190565b6020808252600e908201527f496e76616c696420726f6c654964000000000000000000000000000000000000604082015260600190565b6020808252601e908201527f43616e206f6e6c792072656d6f7665206578697374696e672070617274790000604082015260600190565b6102fe8282610dbb565b60005b81518110156114245761141c8383838151811061140f57fe5b6020026020010151610d31565b6001016113f6565b50505056fea2646970667358221220213cd3641e73404c660417360e3680ba6d199604dec08172b4daa2ac9aa0a75d64736f6c63430006060033
Deployed Bytecode Sourcemap
407:7961:1:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;407:7961:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;7099:130:1;;;:::i;:::-;;;;;;;;;;;;;;;;4151:273;;;;;;;;;:::i;:::-;;6814:146;;;;;;;;;:::i;4682:1278::-;;;;;;;;;:::i;1567:56::-;;;;;;;;;:::i;:::-;;;;;;;;;2943:979;;;;;;;;;:::i;6365:262:0:-;;;;;;;;;:::i;5751:239::-;;;;;;;;;:::i;7489:300:1:-;;;;;;;;;:::i;:::-;;;;;;;;3906:428:0;;;;;;;;;:::i;6894:235::-;;;;;;;;;:::i;5245:160::-;;;;;;;;;:::i;:::-;;;;;;;;4692:252;;;;;;;;;:::i;1437:36:1:-;;;;;;;;;:::i;6420:169::-;;;;;;;;;:::i;7099:130::-;7168:16;7203:19;7196:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7196:26:1;;;;;;;;;;;;;;;;;;;;;;;7099:130;:::o;4151:273::-;4248:10;4276:28;;;;:11;:28;;;;;:34;4314:14;;4276:34;;:52;;;;;;;;;4268:95;;;;-1:-1:-1;;;4268:95:1;;;;;;;;;;;;;;;;;4374:43;4394:5;4401:15;4374:19;:43::i;:::-;4151:273;;:::o;6814:146::-;-1:-1:-1;;;;;6928:15:1;;;;;;:8;:15;;;;;;;;;6921:32;;;;;;;;;;;;;;;;;6893:16;;6921:32;;;6928:15;6921:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;6921:32:1;;;;;;;;;;;;;;;;;;;;;;;6814:146;;;:::o;4682:1278::-;-1:-1:-1;;;;;4833:22:1;;4765:23;4833:22;;;:8;:22;;;;;4893;;4791:10;;4833:22;4934;4926:57;;;;-1:-1:-1;;;4926:57:1;;;;;;;;;5039:14;-1:-1:-1;;;;;5001:28:1;;;;;;:11;:28;;;;;:34;;;;:52;;;;;;;;4993:96;;;;-1:-1:-1;;;4993:96:1;;;;;;;;;5107:54;5131:12;5145:15;5107:23;:54::i;:::-;5099:97;;;;-1:-1:-1;;;5099:97:1;;;;;;;;;-1:-1:-1;;;;;5297:36:1;;5275:19;5297:36;;;:19;;;:36;;;;;;5445:38;;5297:36;;5275:19;5297:5;;-1:-1:-1;;5461:21:1;;;5445:38;;;;;;;;;;;;;;;;5561:28;;-1:-1:-1;;;;;5445:38:1;;;;-1:-1:-1;5445:38:1;;5561:5;;5577:11;;5561:28;;;;;;;;;;;;;;;;;;:50;;-1:-1:-1;;;;;;5561:50:1;-1:-1:-1;;;;;5561:50:1;;;;;;5680:40;;;;;-1:-1:-1;5680:19:1;;:40;;;;;;:54;;;5820:21;;5680:19;;5820:21;;;;;;;;;;;;;;;-1:-1:-1;;5820:21:1;;;;;-1:-1:-1;;;;;;5820:21:1;;;;;;;;;-1:-1:-1;;;;;5858:36:1;;;;;;5820:21;5858:19;;:36;;;;;;;5851:43;;;5910;;;;;;;;4682:1278;;;;;;:::o;1567:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;2943:979::-;3087:21;2674:29:0;2684:6;2692:10;2674:9;:29::i;:::-;2666:76;;;;-1:-1:-1;;;2666:76:0;;;;;;;;;-1:-1:-1;;;;;3171:28:1;::::1;3125:43;3171:28:::0;;;:11:::1;:28;::::0;;;;3217:34;;3171:28;;3125:43;3217:34:::1;;::::0;:54;::::1;;;;;;;3209:89;;;;-1:-1:-1::0;;;3209:89:1::1;;;;;;;;;3369:19;27:10:-1::0;;23:18;;::::1;45:23:::0;;-1:-1;3369:41:1;;;;::::1;::::0;;-1:-1:-1;;;;;;3369:41:1::1;-1:-1:-1::0;;;;;3369:41:1;::::1;;::::0;;3543:26;;:33:::1;::::0;:30:::1;:33::i;:::-;3509:68:::0;;-1:-1:-1;3509:68:1::1;::::0;;;::::1;;;-1:-1:-1::0;;3509:68:1;;::::1;;-1:-1:-1::0;;3664:40:1::1;;::::0;;-1:-1:-1;3714:127:1::1;3734:18:::0;;::::1;3714:127;;;3782:48;3802:7;;3810:1;3802:10;;;;;;;;;;;;;;;;;;;;;;3814:15;3782:19;:48::i;:::-;3758:8;:1:::0;3764::::1;3758:8;:5;:8;:::i;:::-;3754:12;;3714:127;;;;3895:10;-1:-1:-1::0;;;;;3856:59:1::1;3878:15;-1:-1:-1::0;;;;;3856:59:1::1;;3907:7;;3856:59;;;;;;;;;;;;;;;;2752:1:0;2943:979:1::0;;;;:::o;6365:262:0:-;6445:6;3512:15;3486:5;:13;;;;;;;;;;:22;;;;;:41;;;;;;;;;3478:98;;;;-1:-1:-1;;;3478:98:0;;;;;;;;;2950:5:::1;:13:::0;;;::::1;::::0;;;;;;:26;6469:6;;2940:49:::1;::::0;2978:10:::1;2940:9;:49::i;:::-;2932:98;;;;-1:-1:-1::0;;;2932:98:0::1;;;;;;;;;6487:5:::2;:13:::0;;;::::2;::::0;;;;;;:63:::2;::::0;:34:::2;;6535:14:::0;6487:63:::2;:47;:63;:::i;:::-;6565:55;::::0;6609:10:::2;::::0;-1:-1:-1;;;;;6565:55:0;::::2;::::0;6585:6;;6565:55:::2;::::0;;;::::2;3586:1:::1;6365:262:::0;;;:::o;5751:239::-;5823:6;3512:15;3486:5;:13;;;;;;;;;;:22;;;;;:41;;;;;;;;;3478:98;;;;-1:-1:-1;;;3478:98:0;;;;;;;;;2950:5:::1;:13:::0;;;::::1;::::0;;;;;;:26;5847:6;;2940:49:::1;::::0;2978:10:::1;2940:9;:49::i;:::-;2932:98;;;;-1:-1:-1::0;;;2932:98:0::1;;;;;;;;;5865:5:::2;:13:::0;;;::::2;::::0;;;;;;:55:::2;::::0;:34:::2;;5910:9:::0;5865:55:::2;:44;:55;:::i;:::-;5935:48;::::0;5972:10:::2;::::0;-1:-1:-1;;;;;5935:48:0;::::2;::::0;5953:6;;5935:48:::2;::::0;;;::::2;3586:1:::1;5751:239:::0;;;:::o;7489:300:1:-;-1:-1:-1;;;;;7624:15:1;;;7592:4;7624:15;;;:8;:15;;;;;;;;:46;;;;;:29;;;:46;;;;;7687:15;;;;:32;;:40;-1:-1:-1;7687:95:1;;;;-1:-1:-1;;;;;;7731:15:1;;;;;;;:8;:15;;;;;:32;;:51;;;;7757:5;;7731:32;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7731:32:1;:51;7687:95;7680:102;;;7489:300;;;;;:::o;3906:428:0:-;3985:4;4021:13;;;;;;;;;;4065:18;4048:13;;;;;;:35;;;;;;;;;4044:250;;;4106:52;:28;;;4144:13;4106:52;:37;:52;:::i;:::-;4099:59;;;;;4044:250;4196:15;4179:13;;;;;;:32;;;;;;;;;4175:119;;;4234:49;:25;;;4269:13;4234:49;:34;:49;:::i;4175:119::-;4303:24;;-1:-1:-1;;;4303:24:0;;;;;;;;6894:235;6956:6;3512:15;3486:5;:13;;;;;;;;;;:22;;;;;:41;;;;;;;;;3478:98;;;;-1:-1:-1;;;3478:98:0;;;;;;;;;6979:6:::1;2674:29;2684:6;2692:10;2674:9;:29::i;:::-;2666:76;;;;-1:-1:-1::0;;;2666:76:0::1;;;;;;;;;6997:5:::2;:13:::0;;;::::2;::::0;;;;;;:59:::2;::::0;:34:::2;;7045:10;6997:59;:47;:59;:::i;:::-;7071:51;::::0;7111:10:::2;::::0;;;7091:6;;7071:51:::2;::::0;;;::::2;3586:1:::1;6894:235:::0;;:::o;5245:160::-;5323:7;5306:6;3239:18;3213:5;:13;;;;;;;;;;:22;;;;;:44;;;;;;;;;3205:104;;;;-1:-1:-1;;;3205:104:0;;;;;;;;;5349:5:::1;:13:::0;;;::::1;::::0;;;;;;:49:::1;::::0;:37:::1;;:47;:49::i;:::-;5342:56:::0;5245:160;-1:-1:-1;;;5245:160:0:o;4692:252::-;4769:6;3239:18;3213:5;:13;;;;;;;;;;:22;;;;;:44;;;;;;;;;3205:104;;;;-1:-1:-1;;;3205:104:0;;;;;;;;;2950:5:::1;:13:::0;;;::::1;::::0;;;;;;:26;4793:6;;2940:49:::1;::::0;2978:10:::1;2940:9;:49::i;:::-;2932:98;;;;-1:-1:-1::0;;;2932:98:0::1;;;;;;;;;4811:5:::2;:13:::0;;;::::2;::::0;;;;;;:60:::2;::::0;:37:::2;;4861:9:::0;4811:60:::2;:49;:60;:::i;:::-;4886:51;::::0;4926:10:::2;::::0;-1:-1:-1;;;;;4886:51:0;::::2;::::0;4907:6;;4886:51:::2;::::0;;;::::2;3319:1:::1;4692:252:::0;;;:::o;1437:36:1:-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1437:36:1;;-1:-1:-1;1437:36:1;:::o;6420:169::-;6507:4;6568:14;-1:-1:-1;;;;;6530:28:1;;;;;;:11;:28;;;;;:34;;;;:52;;;;;;;;;6420:169;-1:-1:-1;;6420:169:1:o;7935:431::-;8032:47;8056:5;8063:15;8032:23;:47::i;:::-;8031:48;8023:91;;;;-1:-1:-1;;;8023:91:1;;;;;;;;;-1:-1:-1;;;;;8148:15:1;;;8124:21;8148:15;;;:8;:15;;;;;;;;:32;;39:1:-1;23:18;;;45:23;;8190:47:1;;;;;;;;;;-1:-1:-1;;;;;;8190:47:1;;;;;;;;;8247:46;;;:29;;;:46;;;;;;:62;;;8325:34;8148:32;;8190:47;8325:34;;;7935:431;;;:::o;1274:134:3:-;1332:7;1358:43;1362:1;1365;1358:43;;;;;;;;;;;;;;;;;:3;:43::i;834:176::-;892:7;923:5;;;946:6;;;;938:46;;;;-1:-1:-1;;;938:46:3;;;;;;;;1311:157:0;-1:-1:-1;;;;;1415:38:0;1456:5;1415:38;;;;;;;;;;;:46;;-1:-1:-1;;1415:46:0;;;1311:157::o;1077:228::-;-1:-1:-1;;;;;1183:27:0;;1175:71;;;;-1:-1:-1;;;1175:71:0;;;;;;;;;-1:-1:-1;;;;;1256:35:0;:22;:35;;;;;;;;;;;:42;;-1:-1:-1;;1256:42:0;1294:4;1256:42;;;1077:228::o;109:171::-;235:21;;-1:-1:-1;;;;;235:38:0;;;:21;;:38;;109:171::o;901:170::-;-1:-1:-1;;;;;1027:37:0;1004:4;1027:37;;;;;;;;;;;;;;;901:170::o;513:135::-;620:21;-1:-1:-1;;;;;620:21:0;;513:135::o;286:221::-;-1:-1:-1;;;;;392:25:0;;384:73;;;;-1:-1:-1;;;384:73:0;;;;;;;;;467:33;;-1:-1:-1;;;;;;467:33:0;-1:-1:-1;;;;;467:33:0;;;;;;;286:221::o;1692:187:3:-;1778:7;1813:12;1805:6;;;;1797:29;;;;-1:-1:-1;;;1797:29:3;;;;;;;;;;-1:-1:-1;;;1848:5:3;;;1692:187::o;5:130:-1:-;72:20;;-1:-1;;;;;19378:54;;20211:35;;20201:2;;20260:1;;20250:12;657:241;;761:2;749:9;740:7;736:23;732:32;729:2;;;-1:-1;;767:12;729:2;829:53;874:7;850:22;829:53;;905:366;;;1026:2;1014:9;1005:7;1001:23;997:32;994:2;;;-1:-1;;1032:12;994:2;1094:53;1139:7;1115:22;1094:53;;;1084:63;;1202:53;1247:7;1184:2;1227:9;1223:22;1202:53;;;1192:63;;988:283;;;;;;1278:522;;;;1434:2;1422:9;1413:7;1409:23;1405:32;1402:2;;;-1:-1;;1440:12;1402:2;1498:17;1485:31;1536:18;;1528:6;1525:30;1522:2;;;-1:-1;;1558:12;1522:2;1659:6;1648:9;1644:22;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;318:30;;1536:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;434:4;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;434:4;426:6;422:17;1586:90;;;;;;;;1731:53;1776:7;434:4;1756:9;1752:22;1731:53;;;1721:63;;1396:404;;;;;;1807:241;;1911:2;1899:9;1890:7;1886:23;1882:32;1879:2;;;-1:-1;;1917:12;1879:2;-1:-1;587:20;;1873:175;-1:-1;1873:175;2055:366;;;2176:2;2164:9;2155:7;2151:23;2147:32;2144:2;;;-1:-1;;2182:12;2144:2;2265:22;587:20;2234:63;;2352:53;2397:7;2334:2;2377:9;2373:22;2352:53;;9955:213;-1:-1;;;;;19378:54;;;;2671:37;;10073:2;10058:18;;10044:124;10175:381;10353:2;10367:47;;;10338:18;;;18501:19;;;10175:381;;3196:21;18541:14;;;10175:381;3223:291;3248:6;3245:1;3242:13;3223:291;;;10353:2;3344:6;18842:12;-1:-1;;;;;18816:39;18842:12;3344:6;18816:39;;;19378:54;2671:37;;3435:72;-1:-1;2582:14;;;;3270:1;3263:9;3223:291;;;-1:-1;10420:126;10324:232;-1:-1;;;;;;10324:232;10563:361;10731:2;10745:47;;;17980:12;;10716:18;;;18501:19;;;10563:361;;10731:2;17834:14;;;;18541;;;;10563:361;3983:260;4008:6;4005:1;4002:13;3983:260;;;4069:13;;-1:-1;;;;;19378:54;2671:37;;18241:14;;;;2582;;;;4030:1;4023:9;3983:260;;;-1:-1;10798:116;;10702:222;-1:-1;;;;;;10702:222;10931:201;19033:13;;19026:21;4338:34;;11043:2;11028:18;;11014:118;11139:344;11295:2;11280:18;;20123:1;20113:12;;20103:2;;20129:9;20103:2;4465:60;;;19269:34;19258:46;;;;11469:2;11454:18;;;9906:37;11266:217;;11490:301;;11628:2;;11649:17;11642:47;4682:5;17980:12;18513:6;11628:2;11617:9;11613:18;18501:19;-1:-1;19733:101;19747:6;19744:1;19741:13;19733:101;;;19814:11;;;;;19808:18;19795:11;;;18541:14;19795:11;19788:39;19762:10;;19733:101;;;19849:6;19846:1;19843:13;19840:2;;;-1:-1;18541:14;19905:6;11617:9;19896:16;;19889:27;19840:2;-1:-1;20021:7;20005:14;-1:-1;;20001:28;4840:39;;;;18541:14;4840:39;;11599:192;-1:-1;;;11599:192;11798:407;11989:2;12003:47;;;5116:2;11974:18;;;18501:19;5152:33;18541:14;;;5132:54;5205:12;;;11960:245;12212:407;12403:2;12417:47;;;5456:2;12388:18;;;18501:19;5492:33;18541:14;;;5472:54;5545:12;;;12374:245;12626:407;12817:2;12831:47;;;5796:2;12802:18;;;18501:19;5832:29;18541:14;;;5812:50;5881:12;;;12788:245;13040:407;13231:2;13245:47;;;6132:2;13216:18;;;18501:19;6168:34;18541:14;;;6148:55;6237:17;6223:12;;;6216:39;6274:12;;;13202:245;13454:407;13645:2;13659:47;;;6525:2;13630:18;;;18501:19;6561:24;18541:14;;;6541:45;6605:12;;;13616:245;13868:407;14059:2;14073:47;;;6856:2;14044:18;;;18501:19;6892:32;18541:14;;;6872:53;6944:12;;;14030:245;14282:407;14473:2;14487:47;;;7195:2;14458:18;;;18501:19;7231:34;18541:14;;;7211:55;-1:-1;;;7286:12;;;7279:36;7334:12;;;14444:245;14696:407;14887:2;14901:47;;;7585:2;14872:18;;;18501:19;7621:34;18541:14;;;7601:55;-1:-1;;;7676:12;;;7669:26;7714:12;;;14858:245;15110:407;15301:2;15315:47;;;7965:2;15286:18;;;18501:19;8001:32;18541:14;;;7981:53;8053:12;;;15272:245;15524:407;15715:2;15729:47;;;8304:2;15700:18;;;18501:19;8340:34;18541:14;;;8320:55;-1:-1;;;8395:12;;;8388:27;8434:12;;;15686:245;15938:407;16129:2;16143:47;;;8685:2;16114:18;;;18501:19;8721:34;18541:14;;;8701:55;-1:-1;;;8776:12;;;8769:28;8816:12;;;16100:245;16352:407;16543:2;16557:47;;;9067:2;16528:18;;;18501:19;9103:24;18541:14;;;9083:45;9147:12;;;16514:245;16766:407;16957:2;16971:47;;;9398:2;16942:18;;;18501:19;9434:16;18541:14;;;9414:37;9470:12;;;16928:245;17180:407;17371:2;17385:47;;;9721:2;17356:18;;;18501:19;9757:32;18541:14;;;9737:53;9809:12;;;17342:245;;749:42:0;761:14;777:13;749:11;:42::i;1474:232::-;1584:9;1579:121;1603:14;:21;1599:1;:25;1579:121;;;1645:44;1655:14;1671;1686:1;1671:17;;;;;;;;;;;;;;1645:9;:44::i;:::-;1626:3;;1579:121;;;;1474:232;;:::o
Swarm Source
ipfs://213cd3641e73404c660417360e3680ba6d199604dec08172b4daa2ac9aa0a75d
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.