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
Latest 25 from a total of 930 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Create Org | 15676942 | 866 days ago | IN | 0 ETH | 0.00274885 | ||||
Create Org | 15676178 | 866 days ago | IN | 0 ETH | 0.0049933 | ||||
Create Org | 15675720 | 866 days ago | IN | 0 ETH | 0.00277476 | ||||
Create Org | 15670447 | 867 days ago | IN | 0 ETH | 0.00296113 | ||||
Create Org | 15655354 | 869 days ago | IN | 0 ETH | 0.00149155 | ||||
Create Org | 15648018 | 870 days ago | IN | 0 ETH | 0.00294297 | ||||
Create Org | 15646850 | 870 days ago | IN | 0 ETH | 0.00321572 | ||||
Create Org | 15642911 | 871 days ago | IN | 0 ETH | 0.0020737 | ||||
Create Org | 15642326 | 871 days ago | IN | 0 ETH | 0.0018387 | ||||
Create Org | 15633823 | 872 days ago | IN | 0 ETH | 0.00374794 | ||||
Create Org | 15632797 | 872 days ago | IN | 0 ETH | 0.00282757 | ||||
Create Org | 15619350 | 874 days ago | IN | 0 ETH | 0.00338343 | ||||
Create Org | 15617865 | 874 days ago | IN | 0 ETH | 0.00345834 | ||||
Create Org | 15578759 | 880 days ago | IN | 0 ETH | 0.00201238 | ||||
Create Org | 15578758 | 880 days ago | IN | 0 ETH | 0.00201761 | ||||
Create Org | 15578754 | 880 days ago | IN | 0 ETH | 0.00169524 | ||||
Create Org | 15576330 | 880 days ago | IN | 0 ETH | 0.00322215 | ||||
Create Org | 15576047 | 880 days ago | IN | 0 ETH | 0.00654756 | ||||
Create Org | 15569857 | 881 days ago | IN | 0 ETH | 0.00261148 | ||||
Create Org | 15548179 | 884 days ago | IN | 0 ETH | 0.00224437 | ||||
Create Org | 15547985 | 884 days ago | IN | 0 ETH | 0.0022977 | ||||
Create Org | 15546394 | 884 days ago | IN | 0 ETH | 0.0014236 | ||||
Create Org | 15541165 | 885 days ago | IN | 0 ETH | 0.00225952 | ||||
Create Org | 15540807 | 885 days ago | IN | 0 ETH | 0.00399933 | ||||
Create Org | 15534052 | 886 days ago | IN | 0 ETH | 0.00286936 |
Latest 25 internal transactions (View All)
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
OrgFactory
Compiler Version
v0.6.12+commit.27d51765
Optimization Enabled:
No with 999999 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; import "./EndaomentAdminStorage.sol"; import "./Org.sol"; import "./ProxyFactory.sol"; //ORG FACTORY CONTRACT /** * @title OrgFactory * @author rheeger * @notice OrgFactory is a contract that allows the EndaomentAdmin to * instantiate new Org contracts. It also provides for fetching of * individual Org contract addresses as well as a list of all * allowedOrgs. */ contract OrgFactory is ProxyFactory, EndaomentAdminStorage { // ========== EVENTS=================== event OrgCreated(address indexed newAddress); event OrgStatusChanged(address indexed orgAddress, bool indexed isAllowed); event OrgLogicDeployed(address logicAddress); // ========== STATE VARIABLES========== mapping(address => bool) public allowedOrgs; address public immutable orgLogic; // logic template for all Org contracts // ========== CONSTRUCTOR ========== /** * @notice Creates new Org Factory and emits a `EndaomentAdminChanged` event * @param adminContractAddress Address of EndaomentAdmin contract. */ constructor(address adminContractAddress) public { // Set endaoment admin require(adminContractAddress != address(0), "OrgFactory: Admin cannot be the zero address"); endaomentAdmin = adminContractAddress; emit EndaomentAdminChanged(address(0), adminContractAddress); // Deploy and initialize Org logic contract (used to deploy minimal proxies in createOrg) // We set the EIN to 999999999, since it is unlikely to be a real EIN. Even if it is a real // EIN, that is ok because (1) there is no check against duplicate EINs, and (2) this instance // is not used as anything other than a logic template, so the EIN value doesn't matter Org orgLogicContract = new Org(); orgLogicContract.initializeOrg(999999999, address(this)); // Save off address so we can reference for all future deployments orgLogic = address(orgLogicContract); emit OrgLogicDeployed(address(orgLogicContract)); } // ========== Org Creation & Management ========== /** * @notice Creates new Org Contract and emits a `OrgCreated` event * @param ein The U.S. Tax Identification Number for the Organization */ function createOrg(uint256 ein) public onlyAdminOrRole(endaomentAdmin, IEndaomentAdmin.Role.ACCOUNTANT) { require(ein >= 10000000 && ein <= 999999999, "Org: Must provide a valid EIN"); bytes memory payload = abi.encodeWithSignature( "initializeOrg(uint256,address)", ein, address(this) ); address newOrg = deployMinimal(orgLogic, payload); allowedOrgs[newOrg] = true; emit OrgCreated(newOrg); } /** * @notice Toggles whether Org is allowed and emits a `OrgStatusChanged` event * @param orgAddress THe address of the Org contract. */ function toggleOrg(address orgAddress) public onlyAdminOrRole(endaomentAdmin, IEndaomentAdmin.Role.REVIEWER) { require(Org(orgAddress).taxId() != 0, "OrgFactory: Not a valid org."); allowedOrgs[orgAddress] = !allowedOrgs[orgAddress]; emit OrgStatusChanged(orgAddress, allowedOrgs[orgAddress]); } }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; import "./Administratable.sol"; // ENDAOMENT ADMIN STORAGE CONTRACT /** * @title EndaomentAdminStorage * @author rheeger * @notice Stores the contract address of the EndaomentAdmin, * for use in references by the Org and Fund factories and * subsequently deployed Org and Fund contracts. */ contract EndaomentAdminStorage is Administratable { address public endaomentAdmin; event EndaomentAdminChanged(address indexed oldAddress, address indexed newAddress); /** * @notice Updates address of the endaomentAdmin contract and emits `EndaomentAdminChanged` event. * @param newAdmin New address of the endaomentAdmin contract */ function updateEndaomentAdmin(address newAdmin) public onlyAdmin(endaomentAdmin) { // Validate that contract has a valid admin address set require(newAdmin != address(0), "EndaomentAdminStorage: New admin cannot be the zero address"); EndaomentAdmin endaomentAdminContract = EndaomentAdmin(newAdmin); address admin = endaomentAdminContract.getRoleAddress(IEndaomentAdmin.Role.ADMIN); require(admin != address(0), "EndaomentAdminStorage: Admin cannot be the zero address"); emit EndaomentAdminChanged(endaomentAdmin, newAdmin); endaomentAdmin = newAdmin; } }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; pragma experimental ABIEncoderV2; import "./Administratable.sol"; import "./interfaces/IFactory.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/upgrades/contracts/Initializable.sol"; //ORG CONTRACT /** * @title Org * @author rheeger * @notice Org is a contract that serves as a smart wallet for US nonprofit * organizations. It holds the organization's federal Tax ID number as taxID, * and allows for an address to submit a Claim struct to the contract whereby * the organization can directly receive grant awards from Endaoment Funds. */ contract Org is Initializable, Administratable { using SafeERC20 for IERC20; // ========== STRUCTS & EVENTS ========== struct Claim { string firstName; string lastName; string eMail; address desiredWallet; } event CashOutComplete(uint256 cashOutAmount); event ClaimCreated(string claimId, Claim claim); event ClaimApproved(string claimId, Claim claim); event ClaimRejected(string claimId, Claim claim); // ========== STATE VARIABLES ========== IFactory public orgFactoryContract; uint256 public taxId; mapping(string => Claim) public pendingClaims; // claim UUID to Claim Claim public activeClaim; // ========== CONSTRUCTOR ========== /** * @notice Create new Organization Contract * @dev Using initializer instead of constructor for minimal proxy support. This function * can only be called once in the contract's lifetime * @param ein The U.S. Tax Identification Number for the Organization * @param orgFactory Address of the Factory contract. */ function initializeOrg(uint256 ein, address orgFactory) public initializer { require(orgFactory != address(0), "Org: Factory cannot be null address."); taxId = ein; orgFactoryContract = IFactory(orgFactory); } // ========== Org Management & Info ========== /** * @notice Creates Organization Claim and emits a `ClaimCreated` event * @param claimId UUID representing this claim * @param fName First name of Administrator * @param lName Last name of Administrator * @param eMail Email contact for Organization Administrator. * @param orgAdminWalletAddress Wallet address of Organization's Administrator. */ function claimRequest( string calldata claimId, string calldata fName, string calldata lName, string calldata eMail, address orgAdminWalletAddress ) public { require(!isEqual(claimId, ""), "Org: Must provide claimId"); require(!isEqual(fName, ""), "Org: Must provide the first name of the administrator"); require(!isEqual(lName, ""), "Org: Must provide the last name of the administrator"); require(!isEqual(eMail, ""), "Org: Must provide the email address of the administrator"); require(orgAdminWalletAddress != address(0), "Org: Wallet address cannot be the zero address"); require( pendingClaims[claimId].desiredWallet == address(0), "Org: Pending Claim with Id already exists" ); Claim memory newClaim = Claim({ firstName: fName, lastName: lName, eMail: eMail, desiredWallet: orgAdminWalletAddress }); emit ClaimCreated(claimId, newClaim); pendingClaims[claimId] = newClaim; } /** * @notice Approves an Organization Claim and emits a `ClaimApproved` event * @param claimId UUID of the claim being approved */ function approveClaim(string calldata claimId) public onlyAdminOrRole(orgFactoryContract.endaomentAdmin(), IEndaomentAdmin.Role.REVIEWER) { require(!isEqual(claimId, ""), "Fund: Must provide a claimId"); Claim storage claim = pendingClaims[claimId]; require(claim.desiredWallet != address(0), "Org: claim does not exist"); emit ClaimApproved(claimId, claim); activeClaim = claim; delete pendingClaims[claimId]; } /** * @notice Rejects an Organization Claim and emits a 'ClaimRejected` event * @param claimId UUID of the claim being rejected */ function rejectClaim(string calldata claimId) public onlyAdminOrRole(orgFactoryContract.endaomentAdmin(), IEndaomentAdmin.Role.REVIEWER) { require(!isEqual(claimId, ""), "Fund: Must provide a claimId"); Claim storage claim = pendingClaims[claimId]; require(claim.desiredWallet != address(0), "Org: claim does not exist"); emit ClaimRejected(claimId, claim); delete pendingClaims[claimId]; } /** * @notice Cashes out Organization Contract and emits a `CashOutComplete` event * @param tokenAddress ERC20 address of desired token withdrawal */ function cashOutOrg(address tokenAddress) public onlyAdminOrRole(orgFactoryContract.endaomentAdmin(), IEndaomentAdmin.Role.ACCOUNTANT) { require(tokenAddress != address(0), "Org: Token address cannot be the zero address"); address payoutAddr = orgWallet(); require(payoutAddr != address(0), "Org: Cannot cashout unclaimed Org"); IERC20 tokenContract = IERC20(tokenAddress); uint256 cashOutAmount = tokenContract.balanceOf(address(this)); tokenContract.safeTransfer(orgWallet(), cashOutAmount); emit CashOutComplete(cashOutAmount); } /** * @notice Retrieves Token Balance of Org Contract * @param tokenAddress Address of desired token to query for balance * @return Balance of conract in token base unit of provided tokenAddress */ function getTokenBalance(address tokenAddress) external view returns (uint256) { IERC20 tokenContract = IERC20(tokenAddress); uint256 balance = tokenContract.balanceOf(address(this)); return balance; } /** * @notice Org Wallet convenience accessor * @return The wallet specified in the active, approved claim */ function orgWallet() public view returns (address) { return activeClaim.desiredWallet; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.7; contract ProxyFactory { /** * @dev This function enables deployment of EIP-1167 minimal proxies. The code below * was copied from the OpenZeppelin ProxyFactory.sol contract, as there is currently * no package that has a version compatible with Solidity ^0.6.0. At the time of writing * copy/pasting the file in this manner is considered the best practice for ^0.6.0: * https://forum.openzeppelin.com/t/best-practice-for-using-proxyfactory-sol-in-a-solidity-0-6-project-deploying-minimal-proxies/3478 * * EIP-1167 references: * The EIP and associated CloneFactory repo * - https://eips.ethereum.org/EIPS/eip-1167 * Open Zeppelin blog post and discussion * - https://blog.openzeppelin.com/deep-dive-into-the-minimal-proxy-contract/ * - https://forum.openzeppelin.com/t/deep-dive-into-the-minimal-proxy-contract/1928 */ function deployMinimal(address _logic, bytes memory _data) public returns (address proxy) { // Adapted from https://github.com/optionality/clone-factory/blob/32782f82dfc5a00d103a7e61a17a5dedbd1e8e9d/contracts/CloneFactory.sol bytes20 targetBytes = bytes20(_logic); assembly { let clone := mload(0x40) mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(clone, 0x14), targetBytes) mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) proxy := create(0, clone, 0x37) } if (_data.length > 0) { (bool success, ) = proxy.call(_data); require(success, "ProxyFactory: Initialization of proxy failed"); } } }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; import "./EndaomentAdmin.sol"; //ADMINISTRATABLE /** * @title Administratable * @author rheeger * @notice Provides two modifiers allowing contracts administered * by the EndaomentAdmin contract to properly restrict method calls * based on the a given role. Also provides a utility function for * validating string input arguments. */ contract Administratable { /** * @notice onlyAdmin checks that the caller is the EndaomentAdmin * @param adminContractAddress is the supplied EndaomentAdmin contract address */ modifier onlyAdmin(address adminContractAddress) { require( adminContractAddress != address(0), "Administratable: Admin must not be the zero address" ); EndaomentAdmin endaomentAdmin = EndaomentAdmin(adminContractAddress); require( msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.ADMIN), "Administratable: only ADMIN can access." ); _; } /** * @notice onlyAdminOrRole checks that the caller is either the Admin or the provided role. * @param adminContractAddress supplied EndaomentAdmin address * @param role The role to require unless the caller is the owner. Permitted * roles are ADMIN (6), ACCOUNTANT (2), REVIEWER (3), FUND_FACTORY (4) and ORG_FACTORY(5). */ modifier onlyAdminOrRole(address adminContractAddress, IEndaomentAdmin.Role role) { _onlyAdminOrRole(adminContractAddress, role); _; } /** * @notice _onlyAdminOrRole checks that the caller is either the Admin or the provided role. * @param adminContractAddress supplied EndaomentAdmin address * @param role The role to require unless the caller is the owner. Permitted * roles are ADMIN (6), ACCOUNTANT (2), REVIEWER (3), FUND_FACTORY (4) and ORG_FACTORY(5). */ function _onlyAdminOrRole(address adminContractAddress, IEndaomentAdmin.Role role) private view { require( adminContractAddress != address(0), "Administratable: Admin must not be the zero address" ); EndaomentAdmin endaomentAdmin = EndaomentAdmin(adminContractAddress); bool isAdmin = (msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.ADMIN)); if (!isAdmin) { if (endaomentAdmin.isPaused(role)) { revert("Administratable: requested role is paused"); } if (role == IEndaomentAdmin.Role.ACCOUNTANT) { require( msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.ACCOUNTANT), "Administratable: only ACCOUNTANT can access" ); } if (role == IEndaomentAdmin.Role.REVIEWER) { require( msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.REVIEWER), "Administratable: only REVIEWER can access" ); } if (role == IEndaomentAdmin.Role.FUND_FACTORY) { require( msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.FUND_FACTORY), "Administratable: only FUND_FACTORY can access" ); } if (role == IEndaomentAdmin.Role.ORG_FACTORY) { require( msg.sender == endaomentAdmin.getRoleAddress(IEndaomentAdmin.Role.ORG_FACTORY), "Administratable: only ORG_FACTORY can access" ); } } } /** * @notice Checks that the caller is either a provided address, admin or role. * @param allowedAddress An exempt address provided that shall be allowed to proceed. * @param adminContractAddress The EndaomentAdmin contract address. * @param role The desired IEndaomentAdmin.Role to check against. Permitted * roles are ADMIN (6), ACCOUNTANT (2), REVIEWER (3), FUND_FACTORY (4) and ORG_FACTORY(5). */ modifier onlyAddressOrAdminOrRole( address allowedAddress, address adminContractAddress, IEndaomentAdmin.Role role ) { require( allowedAddress != address(0), "Administratable: Allowed address must not be the zero address" ); bool isAllowed = (msg.sender == allowedAddress); if (!isAllowed) { _onlyAdminOrRole(adminContractAddress, role); } _; } /** * @notice Returns true if two strings are equal, false otherwise * @param s1 First string to compare * @param s2 Second string to compare */ function isEqual(string memory s1, string memory s2) internal pure returns (bool) { return keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2)); } }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; import "./interfaces/IEndaomentAdmin.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. * * In order to transfer ownership, a recipient must be specified, at which point * the specified recipient can call `acceptOwnership` and take ownership. */ contract TwoStepOwnable { address private _owner; address private _newPotentialOwner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event TransferInitiated(address indexed newOwner); event TransferCancelled(address indexed newPotentialOwner); /** * @dev Initialize contract by setting transaction submitter as initial owner. */ constructor() internal { _owner = tx.origin; emit OwnershipTransferred(address(0), _owner); } /** * @dev Returns the address of the current owner. */ function getOwner() external view returns (address) { return _owner; } /** * @dev Returns the address of the current potential new owner. */ function getNewPotentialOwner() external view returns (address) { return _newPotentialOwner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(isOwner(), "TwoStepOwnable: caller is not the owner."); _; } /** * @dev Returns true if the caller is the current owner. */ function isOwner() public view returns (bool) { return msg.sender == _owner; } /** * @dev Allows a new account (`newOwner`) to accept ownership. * Can only be called by the current owner. */ function transferOwnership(address newPotentialOwner) public onlyOwner { require( newPotentialOwner != address(0), "TwoStepOwnable: new potential owner is the zero address." ); _newPotentialOwner = newPotentialOwner; emit TransferInitiated(address(newPotentialOwner)); } /** * @dev Cancel a transfer of ownership to a new account. * Can only be called by the current owner. */ function cancelOwnershipTransfer() public onlyOwner { emit TransferCancelled(address(_newPotentialOwner)); delete _newPotentialOwner; } /** * @dev Transfers ownership of the contract to the caller. * Can only be called by a new potential owner set by the current owner. */ function acceptOwnership() public { require( msg.sender == _newPotentialOwner, "TwoStepOwnable: current owner must set caller as new potential owner." ); delete _newPotentialOwner; emit OwnershipTransferred(_owner, msg.sender); _owner = msg.sender; } } /** * @title EndaomentAdmin * @author rheeger * @notice Provides admin controls for the Endaoment contract ecosystem using * a roles-based system. Available roles are PAUSER (1), ACCOUNTANT (2), * REVIEWER (3), FUND_FACTORY (4), ORG_FACTORY (5), and ADMIN (6). */ contract EndaomentAdmin is IEndaomentAdmin, TwoStepOwnable { // Maintain a role status mapping with assigned accounts and paused states. mapping(uint256 => RoleStatus) private _roles; /** * @notice Set a new account on a given role and emit a `RoleModified` event * if the role holder has changed. Only the owner may call this function. * @param role The role that the account will be set for. * @param account The account to set as the designated role bearer. */ function setRole(Role role, address account) public override onlyOwner { require(account != address(0), "EndaomentAdmin: Must supply an account."); _setRole(role, account); } /** * @notice Remove any current role bearer for a given role and emit a * `RoleModified` event if a role holder was previously set. Only the owner * may call this function. * @param role The role that the account will be removed from. */ function removeRole(Role role) public override onlyOwner { _setRole(role, address(0)); } /** * @notice Pause a currently unpaused role and emit a `RolePaused` event. Only * the owner or the designated pauser may call this function. Also, bear in * mind that only the owner may unpause a role once paused. * @param role The role to pause. */ function pause(Role role) public override onlyAdminOr(Role.PAUSER) { RoleStatus storage storedRoleStatus = _roles[uint256(role)]; require(!storedRoleStatus.paused, "EndaomentAdmin: Role in question is already paused."); storedRoleStatus.paused = true; emit RolePaused(role); } /** * @notice Unpause a currently paused role and emit a `RoleUnpaused` event. * Only the owner may call this function. * @param role The role to pause. */ function unpause(Role role) public override onlyOwner { RoleStatus storage storedRoleStatus = _roles[uint256(role)]; require(storedRoleStatus.paused, "EndaomentAdmin: Role in question is already unpaused."); storedRoleStatus.paused = false; emit RoleUnpaused(role); } /** * @notice External view function to check whether or not the functionality * associated with a given role is currently paused or not. The owner or the * pauser may pause any given role (including the pauser itself), but only the * owner may unpause functionality. Additionally, the owner may call paused * functions directly. * @param role The role to check the pause status on. * @return A boolean to indicate if the functionality associated with * the role in question is currently paused. */ function isPaused(Role role) external override view returns (bool) { return _isPaused(role); } /** * @notice External view function to check whether the caller is the current * role holder. * @param role The role to check for. * @return A boolean indicating if the caller has the specified role. */ function isRole(Role role) external override view returns (bool) { return _isRole(role); } /** * @notice External view function to check the account currently holding the * given role. * @param role The desired role to fetch the current address of. * @return The address of the requested role, or the null * address if none is set. */ function getRoleAddress(Role role) external override view returns (address) { require( _roles[uint256(role)].account != address(0), "EndaomentAdmin: Role bearer is null address." ); return _roles[uint256(role)].account; } /** * @notice Private function to set a new account on a given role and emit a * `RoleModified` event if the role holder has changed. * @param role The role that the account will be set for. * @param account The account to set as the designated role bearer. */ function _setRole(Role role, address account) private { RoleStatus storage storedRoleStatus = _roles[uint256(role)]; if (account != storedRoleStatus.account) { storedRoleStatus.account = account; emit RoleModified(role, account); } } /** * @notice Private view function to check whether the caller is the current * role holder. * @param role The role to check for. * @return A boolean indicating if the caller has the specified role. */ function _isRole(Role role) private view returns (bool) { return msg.sender == _roles[uint256(role)].account; } /** * @notice Private view function to check whether the given role is paused or * not. * @param role The role to check for. * @return A boolean indicating if the specified role is paused or not. */ function _isPaused(Role role) private view returns (bool) { return _roles[uint256(role)].paused; } /** * @notice Modifier that throws if called by any account other than the owner * or the supplied role, or if the caller is not the owner and the role in * question is paused. * @param role The role to require unless the caller is the owner. */ modifier onlyAdminOr(Role role) { if (!isOwner()) { require(_isRole(role), "EndaomentAdmin: Caller does not have a required role."); require(!_isPaused(role), "EndaomentAdmin: Role in question is currently paused."); } _; } }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; /** * @dev Interface of the EndaomentAdmin contract */ interface IEndaomentAdmin { event RoleModified(Role indexed role, address account); event RolePaused(Role indexed role); event RoleUnpaused(Role indexed role); enum Role { EMPTY, PAUSER, ACCOUNTANT, REVIEWER, FUND_FACTORY, ORG_FACTORY, ADMIN } struct RoleStatus { address account; bool paused; } function setRole(Role role, address account) external; function removeRole(Role role) external; function pause(Role role) external; function unpause(Role role) external; function isPaused(Role role) external view returns (bool); function isRole(Role role) external view returns (bool); function getRoleAddress(Role role) external view returns (address); }
// SPDX-License-Identifier: BSD 3-Clause pragma solidity ^0.6.10; interface IFactory { function endaomentAdmin() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. // A Solidity high level call has three parts: // 1. The target address is checked to verify it contains contract code // 2. The call itself is made, and success asserted // 3. The return value is decoded, which in turn checks the size of the returned data. // solhint-disable-next-line max-line-length require(address(token).isContract(), "SafeERC20: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = address(token).call(data); require(success, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
pragma solidity >=0.4.24 <0.7.0; /** * @title Initializable * * @dev Helper contract to support initializer functions. To use it, replace * the constructor with a function that has the `initializer` modifier. * WARNING: Unlike constructors, initializer functions must be manually * invoked. This applies both to deploying an Initializable contract, as well * as extending an Initializable contract via inheritance. * WARNING: When used with inheritance, manual care must be taken to not invoke * a parent initializer twice, or ensure that all initializers are idempotent, * because this is not dealt with automatically as with constructors. */ contract Initializable { /** * @dev Indicates that the contract has been initialized. */ bool private initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private initializing; /** * @dev Modifier to use in the initializer function of a contract. */ modifier initializer() { require(initializing || isConstructor() || !initialized, "Contract instance has already been initialized"); bool isTopLevelCall = !initializing; if (isTopLevelCall) { initializing = true; initialized = true; } _; if (isTopLevelCall) { initializing = false; } } /// @dev Returns true if and only if the function is running in the constructor function isConstructor() private view returns (bool) { // extcodesize checks the size of the code stored in an address, and // address returns the current address. Since the code is still not // deployed when running a constructor, any checks on its code size will // yield zero, making it an effective way to detect if a contract is // under construction or not. address self = address(this); uint256 cs; assembly { cs := extcodesize(self) } return cs == 0; } // Reserved storage space to allow for layout changes in the future. uint256[50] private ______gap; }
// SPDX-License-Identifier: MIT 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; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // According to EIP-1052, 0x0 is the value returned for not-yet created accounts // and 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470 is returned // for accounts without code, i.e. `keccak256('')` bytes32 codehash; bytes32 accountHash = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; // solhint-disable-next-line no-inline-assembly assembly { codehash := extcodehash(account) } return (codehash != accountHash && codehash != 0x0); } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } }
{ "optimizer": { "enabled": false, "runs": 999999 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"adminContractAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAddress","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"EndaomentAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"OrgCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"logicAddress","type":"address"}],"name":"OrgLogicDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"orgAddress","type":"address"},{"indexed":true,"internalType":"bool","name":"isAllowed","type":"bool"}],"name":"OrgStatusChanged","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allowedOrgs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"ein","type":"uint256"}],"name":"createOrg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"deployMinimal","outputs":[{"internalType":"address","name":"proxy","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endaomentAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"orgLogic","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"orgAddress","type":"address"}],"name":"toggleOrg","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"updateEndaomentAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a060405234801561001057600080fd5b506040516200511e3803806200511e8339818101604052602081101561003557600080fd5b8101908080519060200190929190505050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156100cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180620050f2602c913960400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f61e8476299043da99a7256ce656552660ee0aefc410b14ec390c1e524b8042a960405160405180910390a36000604051610176906102ad565b604051809103906000f080158015610192573d6000803e3d6000fd5b5090508073ffffffffffffffffffffffffffffffffffffffff1663c117a3e5633b9ac9ff306040518363ffffffff1660e01b8152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b15801561020a57600080fd5b505af115801561021e573d6000803e3d6000fd5b505050508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250507f2fdcb9e889cba1babd1c88025c6a7b116d02f005af6ab6b8bc8e13ee5d5cffad81604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150506102bb565b61372180620019d183390190565b60805160601c6116f3620002de6000398061030152806106ef52506116f36000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a4b9adf31161005b578063a4b9adf314610128578063b3eeb5e21461016c578063b51fb1b814610271578063dfb475cf146102a55761007d565b80633ad7a763146100825780637861e297146100b657806391ad700a146100fa575b600080fd5b61008a6102ff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100f8600480360360208110156100cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610323565b005b6101266004803603602081101561011057600080fd5b8101908080359060200190929190505050610582565b005b61016a6004803603602081101561013e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107b7565b005b6102456004803603604081101561018257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101bf57600080fd5b8201836020820111156101d157600080fd5b803590602001918460018302840111640100000000831117156101f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bec565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610279610d71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102e7600480360360208110156102bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d95565b60405180821515815260200191505060405180910390f35b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660036103508282610db5565b60008373ffffffffffffffffffffffffffffffffffffffff166356869c586040518163ffffffff1660e01b815260040160206040518083038186803b15801561039857600080fd5b505afa1580156103ac573d6000803e3d6000fd5b505050506040513d60208110156103c257600080fd5b81019080805190602001909291905050501415610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4f7267466163746f72793a204e6f7420612076616c6964206f72672e0000000081525060200191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615158373ffffffffffffffffffffffffffffffffffffffff167f5f45b75024e7f357913c615d31342115540c905182154ca8a72393e3893e7f1560405160405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660026105af8282610db5565b6298968083101580156105c65750633b9ac9ff8311155b610638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f72673a204d7573742070726f7669646520612076616c69642045494e00000081525060200191505060405180910390fd5b60608330604051602401808381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001925050506040516020818303038152906040527fc117a3e5000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006107147f000000000000000000000000000000000000000000000000000000000000000083610bec565b905060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fbfb9ad60f655d2464e1afd1a9bbd59beaf6099d623019ce5ebc3a31d916a426560405160405180910390a25050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061168b6033913960400191505060405180910390fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b8152600401808260068111156108a057fe5b815260200191505060206040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d60208110156108ea57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806114f06027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180611627603b913960400191505060405180910390fd5b600083905060008173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b815260040180826006811115610a4857fe5b815260200191505060206040518083038186803b158015610a6857600080fd5b505afa158015610a7c573d6000803e3d6000fd5b505050506040513d6020811015610a9257600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806115f06037913960400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f61e8476299043da99a7256ce656552660ee0aefc410b14ec390c1e524b8042a960405160405180910390a3846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0925050600083511115610d6a5760008273ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b60208310610ca75780518252602082019150602081019050602083039250610c84565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d09576040519150601f19603f3d011682016040523d82523d6000602084013e610d0e565b606091505b5050905080610d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611517602c913960400191505060405180910390fd5b505b5092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061168b6033913960400191505060405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b815260040180826006811115610e7f57fe5b815260200191505060206040518083038186803b158015610e9f57600080fd5b505afa158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ec957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050806114e9578173ffffffffffffffffffffffffffffffffffffffff1663bc61e733846040518263ffffffff1660e01b815260040180826006811115610f4b57fe5b815260200191505060206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d6020811015610f9557600080fd5b810190808051906020019092919050505015610ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061156f6029913960400191505060405180910390fd5b6002600681111561100957fe5b83600681111561101557fe5b1415611137578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760026040518263ffffffff1660e01b81526004018082600681111561105857fe5b815260200191505060206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d60208110156110a257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115c5602b913960400191505060405180910390fd5b5b6003600681111561114457fe5b83600681111561115057fe5b1415611272578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760036040518263ffffffff1660e01b81526004018082600681111561119357fe5b815260200191505060206040518083038186803b1580156111b357600080fd5b505afa1580156111c7573d6000803e3d6000fd5b505050506040513d60208110156111dd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806116626029913960400191505060405180910390fd5b5b6004600681111561127f57fe5b83600681111561128b57fe5b14156113ad578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760046040518263ffffffff1660e01b8152600401808260068111156112ce57fe5b815260200191505060206040518083038186803b1580156112ee57600080fd5b505afa158015611302573d6000803e3d6000fd5b505050506040513d602081101561131857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180611598602d913960400191505060405180910390fd5b5b600560068111156113ba57fe5b8360068111156113c657fe5b14156114e8578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760056040518263ffffffff1660e01b81526004018082600681111561140957fe5b815260200191505060206040518083038186803b15801561142957600080fd5b505afa15801561143d573d6000803e3d6000fd5b505050506040513d602081101561145357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611543602c913960400191505060405180910390fd5b5b5b5050505056fe41646d696e69737472617461626c653a206f6e6c792041444d494e2063616e206163636573732e50726f7879466163746f72793a20496e697469616c697a6174696f6e206f662070726f7879206661696c656441646d696e69737472617461626c653a206f6e6c79204f52475f464143544f52592063616e2061636365737341646d696e69737472617461626c653a2072657175657374656420726f6c652069732070617573656441646d696e69737472617461626c653a206f6e6c792046554e445f464143544f52592063616e2061636365737341646d696e69737472617461626c653a206f6e6c79204143434f554e54414e542063616e20616363657373456e64616f6d656e7441646d696e53746f726167653a2041646d696e2063616e6e6f7420626520746865207a65726f2061646472657373456e64616f6d656e7441646d696e53746f726167653a204e65772061646d696e2063616e6e6f7420626520746865207a65726f206164647265737341646d696e69737472617461626c653a206f6e6c792052455649455745522063616e2061636365737341646d696e69737472617461626c653a2041646d696e206d757374206e6f7420626520746865207a65726f2061646472657373a264697066735822122010ffa7037e23116c04f445733b2d418d1e4d3dae8bc9fce0712d429e9990dc1364736f6c634300060c0033608060405234801561001057600080fd5b50613701806100206000396000f3fe608060405234801561001057600080fd5b50600436106100c95760003560e01c806388d70e1e11610081578063c19f829b1161005b578063c19f829b146101df578063da6d1be9146101fb578063e100bc7d1461021c576100c9565b806388d70e1e14610189578063a10c048b146101a5578063c117a3e5146101c3576100c9565b80633aecd0e3116100b25780633aecd0e31461011f57806356869c581461014f578063781fdd3c1461016d576100c9565b80630570e49d146100ce5780630e74231714610101575b600080fd5b6100e860048036038101906100e39190612518565b610238565b6040516100f8949392919061317d565b60405180910390f35b610109610466565b6040516101169190613091565b60405180910390f35b61013960048036038101906101349190612370565b610493565b6040516101469190613477565b60405180910390f35b610157610530565b6040516101649190613477565b60405180910390f35b61018760048036038101906101829190612370565b610536565b005b6101a3600480360381019061019e91906123eb565b6107d1565b005b6101ad610a8e565b6040516101ba91906130d5565b60405180910390f35b6101dd60048036038101906101d89190612582565b610ab4565b005b6101f960048036038101906101f49190612430565b610c56565b005b610203611202565b604051610213949392919061317d565b60405180910390f35b610236600480360381019061023191906123eb565b611408565b005b603581805160208101820180518482526020830160208501208183528095505050505050600091509050806000018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102fa5780601f106102cf576101008083540402835291602001916102fa565b820191906000526020600020905b8154815290600101906020018083116102dd57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103985780601f1061036d57610100808354040283529160200191610398565b820191906000526020600020905b81548152906001019060200180831161037b57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156104365780601f1061040b57610100808354040283529160200191610436565b820191906000526020600020905b81548152906001019060200180831161041957829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b6000603660030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60008082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016104d49190613091565b60206040518083038186803b1580156104ec57600080fd5b505afa158015610500573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105249190612559565b90508092505050919050565b60345481565b603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b51fb1b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561059e57600080fd5b505afa1580156105b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105d69190612399565b60026105e282826117aa565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161064990613317565b60405180910390fd5b600061065c610466565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156106ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c5906132d7565b60405180910390fd5b600084905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040161070e9190613091565b60206040518083038186803b15801561072657600080fd5b505afa15801561073a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075e9190612559565b905061079261076b610466565b828473ffffffffffffffffffffffffffffffffffffffff16611e0c9092919063ffffffff16565b7f3156059007da31a35bc9f0cbfff629959dcece2846fb3aa33548f49330a3cb7a816040516107c19190613477565b60405180910390a1505050505050565b603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b51fb1b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561083957600080fd5b505afa15801561084d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108719190612399565b600361087d82826117aa565b6108da84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b1561091a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091190613237565b60405180910390fd5b60006035858560405161092e929190613061565b90815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156109d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c9906132f7565b60405180910390fd5b7ff3ebddfc14d8680bb42723194804b77b8927560eac8d4533a7ec916b38bc327e858583604051610a0593929190613144565b60405180910390a160358585604051610a1f929190613061565b908152602001604051809103902060008082016000610a3e91906120bf565b600182016000610a4e91906120bf565b600282016000610a5e91906120bf565b6003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050505050565b603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060019054906101000a900460ff1680610ad35750610ad2611eeb565b5b80610ae9575060008054906101000a900460ff16155b610b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1f90613377565b60405180910390fd5b60008060019054906101000a900460ff161590508015610b78576001600060016101000a81548160ff02191690831515021790555060016000806101000a81548160ff0219169083151502179055505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90613297565b60405180910390fd5b8260348190555081603360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508015610c515760008060016101000a81548160ff0219169083151502179055505b505050565b610cb389898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b15610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea90613337565b60405180910390fd5b610d5087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b15610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790613357565b60405180910390fd5b610ded85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b15610e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e24906132b7565b60405180910390fd5b610e8a83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b15610eca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec1906133d7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3190613397565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660358a8a604051610f64929190613061565b908152602001604051809103902060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610fec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe3906131d7565b60405180910390fd5b610ff4612107565b604051806080016040528089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200187878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505081526020018373ffffffffffffffffffffffffffffffffffffffff1681525090507fbe378d7e6b4c06a7d42bbbe2de17e1d88abb080f3d708cdf49fd16c5bf4fe8d48a8a8360405161112c9392919061310b565b60405180910390a18060358b8b604051611147929190613061565b90815260200160405180910390206000820151816000019080519060200190611171929190612145565b50602082015181600101908051906020019061118e929190612145565b5060408201518160020190805190602001906111ab929190612145565b5060608201518160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555090505050505050505050505050565b6036806000018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561129c5780601f106112715761010080835404028352916020019161129c565b820191906000526020600020905b81548152906001019060200180831161127f57829003601f168201915b505050505090806001018054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561133a5780601f1061130f5761010080835404028352916020019161133a565b820191906000526020600020905b81548152906001019060200180831161131d57829003601f168201915b505050505090806002018054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113d85780601f106113ad576101008083540402835291602001916113d8565b820191906000526020600020905b8154815290600101906020018083116113bb57829003601f168201915b5050505050908060030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905084565b603360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b51fb1b86040518163ffffffff1660e01b815260040160206040518083038186803b15801561147057600080fd5b505afa158015611484573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114a89190612399565b60036114b482826117aa565b61151184848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505060405180602001604052806000815250611e92565b15611551576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154890613237565b60405180910390fd5b600060358585604051611565929190613061565b90815260200160405180910390209050600073ffffffffffffffffffffffffffffffffffffffff168160030160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611609576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611600906132f7565b60405180910390fd5b7fb8b20b4badbcb0b002036ccbb8ed99db4b891caadbc595ea674014ee09111f3085858360405161163c93929190613144565b60405180910390a18060366000820181600001908054600181600116156101000203166002900461166e9291906121c5565b50600182018160010190805460018160011615610100020316600290046116969291906121c5565b50600282018160020190805460018160011615610100020316600290046116be9291906121c5565b506003820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160030160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055509050506035858560405161173b929190613061565b90815260200160405180910390206000808201600061175a91906120bf565b60018201600061176a91906120bf565b60028201600061177a91906120bf565b6003820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905550505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181190613457565b60405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b815260040161185b91906130f0565b60206040518083038186803b15801561187357600080fd5b505afa158015611887573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118ab9190612399565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905080611e06578173ffffffffffffffffffffffffffffffffffffffff1663bc61e733846040518263ffffffff1660e01b815260040161191991906130f0565b60206040518083038186803b15801561193157600080fd5b505afa158015611945573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061196991906123c2565b156119a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a090613217565b60405180910390fd5b600260068111156119b657fe5b8360068111156119c257fe5b1415611ac0578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760026040518263ffffffff1660e01b8152600401611a0291906130f0565b60206040518083038186803b158015611a1a57600080fd5b505afa158015611a2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a529190612399565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611abf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab6906133b7565b60405180910390fd5b5b60036006811115611acd57fe5b836006811115611ad957fe5b1415611bd7578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760036040518263ffffffff1660e01b8152600401611b1991906130f0565b60206040518083038186803b158015611b3157600080fd5b505afa158015611b45573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b699190612399565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bcd90613437565b60405180910390fd5b5b60046006811115611be457fe5b836006811115611bf057fe5b1415611cee578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760046040518263ffffffff1660e01b8152600401611c3091906130f0565b60206040518083038186803b158015611c4857600080fd5b505afa158015611c5c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c809190612399565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ced576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce490613257565b60405180910390fd5b5b60056006811115611cfb57fe5b836006811115611d0757fe5b1415611e05578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760056040518263ffffffff1660e01b8152600401611d4791906130f0565b60206040518083038186803b158015611d5f57600080fd5b505afa158015611d73573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d979190612399565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611e04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dfb906131f7565b60405180910390fd5b5b5b50505050565b611e8d8363a9059cbb60e01b8484604051602401611e2b9291906130ac565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f02565b505050565b600081604051602001611ea5919061307a565b6040516020818303038152906040528051906020012083604051602001611ecc919061307a565b6040516020818303038152906040528051906020012014905092915050565b6000803090506000813b9050600081149250505090565b611f218273ffffffffffffffffffffffffffffffffffffffff16612074565b611f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5790613417565b60405180910390fd5b600060608373ffffffffffffffffffffffffffffffffffffffff1683604051611f89919061304a565b6000604051808303816000865af19150503d8060008114611fc6576040519150601f19603f3d011682016040523d82523d6000602084013e611fcb565b606091505b509150915081612010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200790613277565b60405180910390fd5b60008151111561206e578080602001905181019061202e91906123c2565b61206d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612064906133f7565b60405180910390fd5b5b50505050565b60008060007fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060001b9050833f91508082141580156120b657506000801b8214155b92505050919050565b50805460018160011615610100020316600290046000825580601f106120e55750612104565b601f016020900490600052602060002090810190612103919061224c565b5b50565b6040518060800160405280606081526020016060815260200160608152602001600073ffffffffffffffffffffffffffffffffffffffff1681525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061218657805160ff19168380011785556121b4565b828001600101855582156121b4579182015b828111156121b3578251825591602001919060010190612198565b5b5090506121c1919061224c565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106121fe578054855561223b565b8280016001018555821561223b57600052602060002091601f016020900482015b8281111561223a57825482559160010191906001019061221f565b5b509050612248919061224c565b5090565b5b8082111561226557600081600090555060010161224d565b5090565b60008135905061227881613686565b92915050565b60008151905061228d81613686565b92915050565b6000815190506122a28161369d565b92915050565b60008083601f8401126122ba57600080fd5b8235905067ffffffffffffffff8111156122d357600080fd5b6020830191508360018202830111156122eb57600080fd5b9250929050565b600082601f83011261230357600080fd5b8135612316612311826134bf565b613492565b9150808252602083016020830185838301111561233257600080fd5b61233d8382846135ff565b50505092915050565b600081359050612355816136b4565b92915050565b60008151905061236a816136b4565b92915050565b60006020828403121561238257600080fd5b600061239084828501612269565b91505092915050565b6000602082840312156123ab57600080fd5b60006123b98482850161227e565b91505092915050565b6000602082840312156123d457600080fd5b60006123e284828501612293565b91505092915050565b600080602083850312156123fe57600080fd5b600083013567ffffffffffffffff81111561241857600080fd5b612424858286016122a8565b92509250509250929050565b600080600080600080600080600060a08a8c03121561244e57600080fd5b60008a013567ffffffffffffffff81111561246857600080fd5b6124748c828d016122a8565b995099505060208a013567ffffffffffffffff81111561249357600080fd5b61249f8c828d016122a8565b975097505060408a013567ffffffffffffffff8111156124be57600080fd5b6124ca8c828d016122a8565b955095505060608a013567ffffffffffffffff8111156124e957600080fd5b6124f58c828d016122a8565b935093505060806125088c828d01612269565b9150509295985092959850929598565b60006020828403121561252a57600080fd5b600082013567ffffffffffffffff81111561254457600080fd5b612550848285016122f2565b91505092915050565b60006020828403121561256b57600080fd5b60006125798482850161235b565b91505092915050565b6000806040838503121561259557600080fd5b60006125a385828601612346565b92505060206125b485828601612269565b9150509250929050565b6125c78161356e565b82525050565b6125d68161356e565b82525050565b60006125e782613500565b6125f18185613516565b935061260181856020860161360e565b80840191505092915050565b612616816135c9565b82525050565b612625816135ed565b82525050565b60006126378385613532565b93506126448385846135ff565b61264d8361365b565b840190509392505050565b60006126648385613543565b93506126718385846135ff565b82840190509392505050565b60006126888261350b565b6126928185613521565b93506126a281856020860161360e565b6126ab8161365b565b840191505092915050565b60006126c18261350b565b6126cb8185613532565b93506126db81856020860161360e565b6126e48161365b565b840191505092915050565b60006126fa8261350b565b6127048185613543565b935061271481856020860161360e565b80840191505092915050565b60008154600181166000811461273d5760018114612763576127a7565b607f600283041661274e8187613521565b955060ff1983168652602086019350506127a7565b600282046127718187613521565b955061277c856134eb565b60005b8281101561279e5781548189015260018201915060208101905061277f565b80880195505050505b505092915050565b60006127bc602983613532565b91507f4f72673a2050656e64696e6720436c61696d207769746820496420616c72656160008301527f64792065786973747300000000000000000000000000000000000000000000006020830152604082019050919050565b6000612822602c83613532565b91507f41646d696e69737472617461626c653a206f6e6c79204f52475f464143544f5260008301527f592063616e2061636365737300000000000000000000000000000000000000006020830152604082019050919050565b6000612888602983613532565b91507f41646d696e69737472617461626c653a2072657175657374656420726f6c652060008301527f69732070617573656400000000000000000000000000000000000000000000006020830152604082019050919050565b60006128ee601c83613532565b91507f46756e643a204d7573742070726f76696465206120636c61696d4964000000006000830152602082019050919050565b600061292e602d83613532565b91507f41646d696e69737472617461626c653a206f6e6c792046554e445f464143544f60008301527f52592063616e20616363657373000000000000000000000000000000000000006020830152604082019050919050565b6000612994602083613532565b91507f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65646000830152602082019050919050565b60006129d4602483613532565b91507f4f72673a20466163746f72792063616e6e6f74206265206e756c6c206164647260008301527f6573732e000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a3a603483613532565b91507f4f72673a204d7573742070726f7669646520746865206c617374206e616d652060008301527f6f66207468652061646d696e6973747261746f720000000000000000000000006020830152604082019050919050565b6000612aa0602183613532565b91507f4f72673a2043616e6e6f7420636173686f757420756e636c61696d6564204f7260008301527f67000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b06601983613532565b91507f4f72673a20636c61696d20646f6573206e6f74206578697374000000000000006000830152602082019050919050565b6000612b46602d83613532565b91507f4f72673a20546f6b656e20616464726573732063616e6e6f742062652074686560008301527f207a65726f2061646472657373000000000000000000000000000000000000006020830152604082019050919050565b6000612bac601983613532565b91507f4f72673a204d7573742070726f7669646520636c61696d4964000000000000006000830152602082019050919050565b6000612bec603583613532565b91507f4f72673a204d7573742070726f7669646520746865206669727374206e616d6560008301527f206f66207468652061646d696e6973747261746f7200000000000000000000006020830152604082019050919050565b6000612c52602e83613532565b91507f436f6e747261637420696e7374616e63652068617320616c726561647920626560008301527f656e20696e697469616c697a65640000000000000000000000000000000000006020830152604082019050919050565b6000612cb8602e83613532565b91507f4f72673a2057616c6c657420616464726573732063616e6e6f7420626520746860008301527f65207a65726f20616464726573730000000000000000000000000000000000006020830152604082019050919050565b6000612d1e602b83613532565b91507f41646d696e69737472617461626c653a206f6e6c79204143434f554e54414e5460008301527f2063616e206163636573730000000000000000000000000000000000000000006020830152604082019050919050565b6000612d84603883613532565b91507f4f72673a204d7573742070726f766964652074686520656d61696c206164647260008301527f657373206f66207468652061646d696e6973747261746f7200000000000000006020830152604082019050919050565b6000612dea602a83613532565b91507f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008301527f6f742073756363656564000000000000000000000000000000000000000000006020830152604082019050919050565b6000612e50601f83613532565b91507f5361666545524332303a2063616c6c20746f206e6f6e2d636f6e7472616374006000830152602082019050919050565b6000612e90602983613532565b91507f41646d696e69737472617461626c653a206f6e6c79205245564945574552206360008301527f616e2061636365737300000000000000000000000000000000000000000000006020830152604082019050919050565b6000612ef6603383613532565b91507f41646d696e69737472617461626c653a2041646d696e206d757374206e6f742060008301527f626520746865207a65726f2061646472657373000000000000000000000000006020830152604082019050919050565b60006080830160008301518482036000860152612f6c828261267d565b91505060208301518482036020860152612f86828261267d565b91505060408301518482036040860152612fa0828261267d565b9150506060830151612fb560608601826125be565b508091505092915050565b60006080830160008084018583036000870152612fdd8382612720565b925050600184018583036020870152612ff68382612720565b92505060028401858303604087015261300f8382612720565b9250506003840154905061302281613641565b61302f60608701826125be565b50819250505092915050565b613044816135bf565b82525050565b600061305682846125dc565b915081905092915050565b600061306e828486612658565b91508190509392505050565b600061308682846126ef565b915081905092915050565b60006020820190506130a660008301846125cd565b92915050565b60006040820190506130c160008301856125cd565b6130ce602083018461303b565b9392505050565b60006020820190506130ea600083018461260d565b92915050565b6000602082019050613105600083018461261c565b92915050565b6000604082019050818103600083015261312681858761262b565b9050818103602083015261313a8184612f4f565b9050949350505050565b6000604082019050818103600083015261315f81858761262b565b905081810360208301526131738184612fc0565b9050949350505050565b6000608082019050818103600083015261319781876126b6565b905081810360208301526131ab81866126b6565b905081810360408301526131bf81856126b6565b90506131ce60608301846125cd565b95945050505050565b600060208201905081810360008301526131f0816127af565b9050919050565b6000602082019050818103600083015261321081612815565b9050919050565b600060208201905081810360008301526132308161287b565b9050919050565b60006020820190508181036000830152613250816128e1565b9050919050565b6000602082019050818103600083015261327081612921565b9050919050565b6000602082019050818103600083015261329081612987565b9050919050565b600060208201905081810360008301526132b0816129c7565b9050919050565b600060208201905081810360008301526132d081612a2d565b9050919050565b600060208201905081810360008301526132f081612a93565b9050919050565b6000602082019050818103600083015261331081612af9565b9050919050565b6000602082019050818103600083015261333081612b39565b9050919050565b6000602082019050818103600083015261335081612b9f565b9050919050565b6000602082019050818103600083015261337081612bdf565b9050919050565b6000602082019050818103600083015261339081612c45565b9050919050565b600060208201905081810360008301526133b081612cab565b9050919050565b600060208201905081810360008301526133d081612d11565b9050919050565b600060208201905081810360008301526133f081612d77565b9050919050565b6000602082019050818103600083015261341081612ddd565b9050919050565b6000602082019050818103600083015261343081612e43565b9050919050565b6000602082019050818103600083015261345081612e83565b9050919050565b6000602082019050818103600083015261347081612ee9565b9050919050565b600060208201905061348c600083018461303b565b92915050565b6000604051905081810181811067ffffffffffffffff821117156134b557600080fd5b8060405250919050565b600067ffffffffffffffff8211156134d657600080fd5b601f19601f8301169050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006135798261359f565b9050919050565b60008115159050919050565b600081905061359a82613679565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135d4826135db565b9050919050565b60006135e68261359f565b9050919050565b60006135f88261358c565b9050919050565b82818337600083830152505050565b60005b8381101561362c578082015181840152602081019050613611565b8381111561363b576000848401525b50505050565b600061365461364f8361366c565b61354e565b9050919050565b6000601f19601f8301169050919050565b60008160001c9050919050565b6007811061368357fe5b50565b61368f8161356e565b811461369a57600080fd5b50565b6136a681613580565b81146136b157600080fd5b50565b6136bd816135bf565b81146136c857600080fd5b5056fea2646970667358221220c4557a8b1ab57d909efa7d07ea5b590ba99cdf5c949b6f6a5e499f8f5e3a4cd264736f6c634300060c00334f7267466163746f72793a2041646d696e2063616e6e6f7420626520746865207a65726f20616464726573730000000000000000000000002a108b1810890482fdb3be188616c56dd0170a8e
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063a4b9adf31161005b578063a4b9adf314610128578063b3eeb5e21461016c578063b51fb1b814610271578063dfb475cf146102a55761007d565b80633ad7a763146100825780637861e297146100b657806391ad700a146100fa575b600080fd5b61008a6102ff565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100f8600480360360208110156100cc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610323565b005b6101266004803603602081101561011057600080fd5b8101908080359060200190929190505050610582565b005b61016a6004803603602081101561013e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506107b7565b005b6102456004803603604081101561018257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001906401000000008111156101bf57600080fd5b8201836020820111156101d157600080fd5b803590602001918460018302840111640100000000831117156101f357600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050509192919290505050610bec565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610279610d71565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6102e7600480360360208110156102bb57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d95565b60405180821515815260200191505060405180910390f35b7f00000000000000000000000082ede3557f4044057ecca56dc6e5908053fc92d281565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660036103508282610db5565b60008373ffffffffffffffffffffffffffffffffffffffff166356869c586040518163ffffffff1660e01b815260040160206040518083038186803b15801561039857600080fd5b505afa1580156103ac573d6000803e3d6000fd5b505050506040513d60208110156103c257600080fd5b81019080805190602001909291905050501415610447576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601c8152602001807f4f7267466163746f72793a204e6f7420612076616c6964206f72672e0000000081525060200191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615158373ffffffffffffffffffffffffffffffffffffffff167f5f45b75024e7f357913c615d31342115540c905182154ca8a72393e3893e7f1560405160405180910390a3505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660026105af8282610db5565b6298968083101580156105c65750633b9ac9ff8311155b610638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f4f72673a204d7573742070726f7669646520612076616c69642045494e00000081525060200191505060405180910390fd5b60608330604051602401808381526020018273ffffffffffffffffffffffffffffffffffffffff168152602001925050506040516020818303038152906040527fc117a3e5000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905060006107147f00000000000000000000000082ede3557f4044057ecca56dc6e5908053fc92d283610bec565b905060018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fbfb9ad60f655d2464e1afd1a9bbd59beaf6099d623019ce5ebc3a31d916a426560405160405180910390a25050505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061168b6033913960400191505060405180910390fd5b60008190508073ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b8152600401808260068111156108a057fe5b815260200191505060206040518083038186803b1580156108c057600080fd5b505afa1580156108d4573d6000803e3d6000fd5b505050506040513d60208110156108ea57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461097e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001806114f06027913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603b815260200180611627603b913960400191505060405180910390fd5b600083905060008173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b815260040180826006811115610a4857fe5b815260200191505060206040518083038186803b158015610a6857600080fd5b505afa158015610a7c573d6000803e3d6000fd5b505050506040513d6020811015610a9257600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b2b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260378152602001806115f06037913960400191505060405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f61e8476299043da99a7256ce656552660ee0aefc410b14ec390c1e524b8042a960405160405180910390a3846000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050565b6000808360601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf3000000000000000000000000000000000060288201526037816000f0925050600083511115610d6a5760008273ffffffffffffffffffffffffffffffffffffffff16846040518082805190602001908083835b60208310610ca75780518252602082019150602081019050602083039250610c84565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114610d09576040519150601f19603f3d011682016040523d82523d6000602084013e610d0e565b606091505b5050905080610d68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611517602c913960400191505060405180910390fd5b505b5092915050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915054906101000a900460ff1681565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603381526020018061168b6033913960400191505060405180910390fd5b600082905060008173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760066040518263ffffffff1660e01b815260040180826006811115610e7f57fe5b815260200191505060206040518083038186803b158015610e9f57600080fd5b505afa158015610eb3573d6000803e3d6000fd5b505050506040513d6020811015610ec957600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16149050806114e9578173ffffffffffffffffffffffffffffffffffffffff1663bc61e733846040518263ffffffff1660e01b815260040180826006811115610f4b57fe5b815260200191505060206040518083038186803b158015610f6b57600080fd5b505afa158015610f7f573d6000803e3d6000fd5b505050506040513d6020811015610f9557600080fd5b810190808051906020019092919050505015610ffc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602981526020018061156f6029913960400191505060405180910390fd5b6002600681111561100957fe5b83600681111561101557fe5b1415611137578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760026040518263ffffffff1660e01b81526004018082600681111561105857fe5b815260200191505060206040518083038186803b15801561107857600080fd5b505afa15801561108c573d6000803e3d6000fd5b505050506040513d60208110156110a257600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611136576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115c5602b913960400191505060405180910390fd5b5b6003600681111561114457fe5b83600681111561115057fe5b1415611272578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760036040518263ffffffff1660e01b81526004018082600681111561119357fe5b815260200191505060206040518083038186803b1580156111b357600080fd5b505afa1580156111c7573d6000803e3d6000fd5b505050506040513d60208110156111dd57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611271576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001806116626029913960400191505060405180910390fd5b5b6004600681111561127f57fe5b83600681111561128b57fe5b14156113ad578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760046040518263ffffffff1660e01b8152600401808260068111156112ce57fe5b815260200191505060206040518083038186803b1580156112ee57600080fd5b505afa158015611302573d6000803e3d6000fd5b505050506040513d602081101561131857600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180611598602d913960400191505060405180910390fd5b5b600560068111156113ba57fe5b8360068111156113c657fe5b14156114e8578173ffffffffffffffffffffffffffffffffffffffff1663c600bc7760056040518263ffffffff1660e01b81526004018082600681111561140957fe5b815260200191505060206040518083038186803b15801561142957600080fd5b505afa15801561143d573d6000803e3d6000fd5b505050506040513d602081101561145357600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146114e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c815260200180611543602c913960400191505060405180910390fd5b5b5b5050505056fe41646d696e69737472617461626c653a206f6e6c792041444d494e2063616e206163636573732e50726f7879466163746f72793a20496e697469616c697a6174696f6e206f662070726f7879206661696c656441646d696e69737472617461626c653a206f6e6c79204f52475f464143544f52592063616e2061636365737341646d696e69737472617461626c653a2072657175657374656420726f6c652069732070617573656441646d696e69737472617461626c653a206f6e6c792046554e445f464143544f52592063616e2061636365737341646d696e69737472617461626c653a206f6e6c79204143434f554e54414e542063616e20616363657373456e64616f6d656e7441646d696e53746f726167653a2041646d696e2063616e6e6f7420626520746865207a65726f2061646472657373456e64616f6d656e7441646d696e53746f726167653a204e65772061646d696e2063616e6e6f7420626520746865207a65726f206164647265737341646d696e69737472617461626c653a206f6e6c792052455649455745522063616e2061636365737341646d696e69737472617461626c653a2041646d696e206d757374206e6f7420626520746865207a65726f2061646472657373a264697066735822122010ffa7037e23116c04f445733b2d418d1e4d3dae8bc9fce0712d429e9990dc1364736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002a108b1810890482fdb3be188616c56dd0170a8e
-----Decoded View---------------
Arg [0] : adminContractAddress (address): 0x2a108b1810890482fDB3bE188616c56dD0170A8E
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000002a108b1810890482fdb3be188616c56dd0170a8e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.