ETH Price: $2,847.81 (-11.08%)
Gas: 16 Gwei

Contract

0xf2f5BB5d80413Dd1fEea6254786465109ADF4b9E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
Create Org156769422022-10-04 19:45:35639 days ago1664912735IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0027488516.04741168
Create Org156761782022-10-04 17:12:11639 days ago1664903531IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.004993329.15016388
Create Org156757202022-10-04 15:40:11639 days ago1664898011IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0027747616.1986409
Create Org156704472022-10-03 21:56:23640 days ago1664834183IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0029611317.28664339
Create Org156553542022-10-01 19:21:23642 days ago1664652083IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.001491558.70744253
Create Org156480182022-09-30 18:43:35643 days ago1664563415IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0029429717.18066316
Create Org156468502022-09-30 14:48:23643 days ago1664549303IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0032157218.77293359
Create Org156429112022-09-30 1:35:59644 days ago1664501759IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.002073712.1059462
Create Org156423262022-09-29 23:38:47644 days ago1664494727IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.001838710.73407337
Create Org156338232022-09-28 19:07:11645 days ago1664392031IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0037479421.87990599
Create Org156327972022-09-28 15:41:11645 days ago1664379671IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0028275716.50692759
Create Org156193502022-09-26 18:32:35647 days ago1664217155IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0033834319.75195456
Create Org156178652022-09-26 13:32:35647 days ago1664199155IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0034583420.18929804
Create Org155787592022-09-21 2:08:23653 days ago1663726103IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0020123811.74800871
Create Org155787582022-09-21 2:08:11653 days ago1663726091IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0020176111.77852847
Create Org155787542022-09-21 2:07:23653 days ago1663726043IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.001695249.89658261
Create Org155763302022-09-20 17:59:35653 days ago1663696775IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0032221518.81046738
Create Org155760472022-09-20 17:02:11653 days ago1663693331IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0065475638.22370537
Create Org155698572022-09-19 20:13:23654 days ago1663618403IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0026114815.24542608
Create Org155481792022-09-16 19:13:23657 days ago1663355603IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0022443713.10231651
Create Org155479852022-09-16 18:34:35657 days ago1663353275IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.002297713.41362655
Create Org155463942022-09-16 13:12:11657 days ago1663333931IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.00142368.31077253
Create Org155411652022-09-15 19:27:47658 days ago1663270067IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0022595213.19078947
Create Org155408072022-09-15 18:15:11658 days ago1663265711IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0039993323.34913321
Create Org155340522022-09-14 16:50:13659 days ago1663174213IN
0xf2f5BB5d...09ADF4b9E
0 ETH0.0028693616.75092256
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To Value
156769422022-10-04 19:45:35639 days ago1664912735
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156761782022-10-04 17:12:11639 days ago1664903531
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156757202022-10-04 15:40:11639 days ago1664898011
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156704472022-10-03 21:56:23640 days ago1664834183
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156553542022-10-01 19:21:23642 days ago1664652083
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156480182022-09-30 18:43:35643 days ago1664563415
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156468502022-09-30 14:48:23643 days ago1664549303
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156429112022-09-30 1:35:59644 days ago1664501759
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156423262022-09-29 23:38:47644 days ago1664494727
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156338232022-09-28 19:07:11645 days ago1664392031
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156327972022-09-28 15:41:11645 days ago1664379671
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156193502022-09-26 18:32:35647 days ago1664217155
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
156178652022-09-26 13:32:35647 days ago1664199155
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155787592022-09-21 2:08:23653 days ago1663726103
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155787582022-09-21 2:08:11653 days ago1663726091
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155787542022-09-21 2:07:23653 days ago1663726043
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155763302022-09-20 17:59:35653 days ago1663696775
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155760472022-09-20 17:02:11653 days ago1663693331
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155698572022-09-19 20:13:23654 days ago1663618403
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155481792022-09-16 19:13:23657 days ago1663355603
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155479852022-09-16 18:34:35657 days ago1663353275
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155463942022-09-16 13:12:11657 days ago1663333931
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155411652022-09-15 19:27:47658 days ago1663270067
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155408072022-09-15 18:15:11658 days ago1663265711
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
155340522022-09-14 16:50:13659 days ago1663174213
0xf2f5BB5d...09ADF4b9E
 Contract Creation0 ETH
View All Internal Transactions
Loading...
Loading

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
File 1 of 13 : OrgFactory.sol
// 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]);
  }
}

File 2 of 13 : EndaomentAdminStorage.sol
// 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;
  }
}

File 3 of 13 : Org.sol
// 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;
  }
}

File 4 of 13 : ProxyFactory.sol
// 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");
    }
  }
}

File 5 of 13 : Administratable.sol
// 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));
  }
}

File 6 of 13 : EndaomentAdmin.sol
// 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.");
    }
    _;
  }
}

File 7 of 13 : IEndaomentAdmin.sol
// 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);
}

File 8 of 13 : IFactory.sol
// SPDX-License-Identifier: BSD 3-Clause

pragma solidity ^0.6.10;

interface IFactory {
  function endaomentAdmin() external view returns (address);
}

File 9 of 13 : IERC20.sol
// 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);
}

File 10 of 13 : SafeERC20.sol
// 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");
        }
    }
}

File 11 of 13 : Initializable.sol
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;
}

File 12 of 13 : SafeMath.sol
// 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;
    }
}

File 13 of 13 : Address.sol
// 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");
    }
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

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


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.