Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 20 from a total of 20 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Transfer Ownersh... | 15218582 | 777 days ago | IN | 0 ETH | 0.00214672 | ||||
Update Pod Ens R... | 15122678 | 791 days ago | IN | 0 ETH | 0.00232488 | ||||
Migrate Pod Cont... | 14032543 | 965 days ago | IN | 0 ETH | 0.01716222 | ||||
Migrate Pod Cont... | 14032466 | 965 days ago | IN | 0 ETH | 0.01638948 | ||||
Migrate Pod Cont... | 14011751 | 968 days ago | IN | 0 ETH | 0.02182931 | ||||
Migrate Pod Cont... | 14011708 | 968 days ago | IN | 0 ETH | 0.01888371 | ||||
Migrate Pod Cont... | 14011702 | 968 days ago | IN | 0 ETH | 0.02069343 | ||||
Migrate Pod Cont... | 14011692 | 968 days ago | IN | 0 ETH | 0.02927784 | ||||
Migrate Pod Cont... | 14011016 | 968 days ago | IN | 0 ETH | 0.02780228 | ||||
Update Pod Ens R... | 14005549 | 969 days ago | IN | 0 ETH | 0.0058122 | ||||
Create Pod With ... | 13992763 | 971 days ago | IN | 0 ETH | 0.08376357 | ||||
Create Pod With ... | 13986862 | 972 days ago | IN | 0 ETH | 0.09264537 | ||||
Create Pod With ... | 13957063 | 977 days ago | IN | 0 ETH | 0.05753371 | ||||
Create Pod With ... | 13957029 | 977 days ago | IN | 0 ETH | 0.0640328 | ||||
Create Pod With ... | 13954474 | 977 days ago | IN | 0 ETH | 0.09826524 | ||||
Create Pod With ... | 13717365 | 1014 days ago | IN | 0 ETH | 0.07836852 | ||||
Create Pod With ... | 13715408 | 1015 days ago | IN | 0 ETH | 0.05017835 | ||||
Create Pod With ... | 13679747 | 1020 days ago | IN | 0 ETH | 0.07701399 | ||||
Create Pod With ... | 13641901 | 1026 days ago | IN | 0 ETH | 0.04636569 | ||||
0x61010060 | 13640492 | 1026 days ago | IN | 0 ETH | 0.519259 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
Controller
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity 0.8.7; /* solhint-disable indent */ import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IController.sol"; import "./interfaces/IMemberToken.sol"; import "./interfaces/IControllerRegistry.sol"; import "./SafeTeller.sol"; import "./ens/IPodEnsRegistrar.sol"; contract Controller is IController, SafeTeller, Ownable { event CreatePod(uint256 podId, address safe, address admin, string ensName); event UpdatePodAdmin(uint256 podId, address admin); IMemberToken public immutable memberToken; IControllerRegistry public immutable controllerRegistry; IPodEnsRegistrar public podEnsRegistrar; mapping(address => uint256) public safeToPodId; mapping(uint256 => address) public podIdToSafe; mapping(uint256 => address) public podAdmin; uint8 internal constant CREATE_EVENT = 0x01; /** * @dev Will instantiate safe teller with gnosis master and proxy addresses * @param _memberToken The address of the MemberToken contract * @param _controllerRegistry The address of the ControllerRegistry contract * @param _proxyFactoryAddress The proxy factory address * @param _gnosisMasterAddress The gnosis master address */ constructor( address _memberToken, address _controllerRegistry, address _proxyFactoryAddress, address _gnosisMasterAddress, address _podEnsRegistrar ) SafeTeller(_proxyFactoryAddress, _gnosisMasterAddress) { require(_memberToken != address(0), "Invalid address"); require(_controllerRegistry != address(0), "Invalid address"); require(_proxyFactoryAddress != address(0), "Invalid address"); require(_gnosisMasterAddress != address(0), "Invalid address"); require(_podEnsRegistrar != address(0), "Invalid address"); memberToken = IMemberToken(_memberToken); controllerRegistry = IControllerRegistry(_controllerRegistry); podEnsRegistrar = IPodEnsRegistrar(_podEnsRegistrar); } function updatePodEnsRegistrar(address _podEnsRegistrar) external onlyOwner { require(_podEnsRegistrar != address(0), "Invalid address"); podEnsRegistrar = IPodEnsRegistrar(_podEnsRegistrar); } /** * @param _members The addresses of the members of the pod * @param threshold The number of members that are required to sign a transaction * @param _admin The address of the pod admin * @param _label label hash of pod name (i.e labelhash('mypod')) * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz') */ function createPod( address[] memory _members, uint256 threshold, address _admin, bytes32 _label, string memory _ensString ) external { address safe = createSafe(_members, threshold); _createPod(_members, safe, _admin, _label, _ensString); } /** * @dev Used to create a pod with an existing safe * @dev Will automatically distribute membership NFTs to current safe members * @param _admin The address of the pod admin * @param _safe The address of existing safe * @param _label label hash of pod name (i.e labelhash('mypod')) * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz') */ function createPodWithSafe( address _admin, address _safe, bytes32 _label, string memory _ensString ) external { require(_safe != address(0), "invalid safe address"); require(safeToPodId[_safe] == 0, "safe already in use"); require(isSafeModuleEnabled(_safe), "safe module must be enabled"); require( isSafeMember(_safe, msg.sender) || msg.sender == _safe, "caller must be safe or member" ); address[] memory members = getSafeMembers(_safe); _createPod(members, _safe, _admin, _label, _ensString); } /** * @param _members The addresses of the members of the pod * @param _admin The address of the pod admin * @param _safe The address of existing safe * @param _label label hash of pod name (i.e labelhash('mypod')) * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz') */ function _createPod( address[] memory _members, address _safe, address _admin, bytes32 _label, string memory _ensString ) private { // add create event flag to token data bytes memory data = new bytes(1); data[0] = bytes1(uint8(CREATE_EVENT)); uint256 podId = memberToken.createPod(_members, data); emit CreatePod(podId, _safe, _admin, _ensString); emit UpdatePodAdmin(podId, _admin); if (_admin != address(0)) podAdmin[podId] = _admin; podIdToSafe[podId] = _safe; safeToPodId[_safe] = podId; // setup pod ENS address reverseRegistrar = podEnsRegistrar.registerPod( _label, _safe, msg.sender ); setupSafeReverseResolver(_safe, reverseRegistrar, _ensString); } /** * @param _podId The id number of the pod * @param _newAdmin The address of the new pod admin */ function updatePodAdmin(uint256 _podId, address _newAdmin) external { address admin = podAdmin[_podId]; address safe = podIdToSafe[_podId]; require(safe != address(0), "Pod doesn't exist"); // if there is no admin it can only be added by safe if (admin == address(0)) { require(msg.sender == safe, "Only safe can add new admin"); } else { require(msg.sender == admin, "Only admin can update admin"); } podAdmin[_podId] = _newAdmin; emit UpdatePodAdmin(_podId, _newAdmin); } /** * @dev This will nullify all pod state on this controller * @dev Update state on _newController * @dev Update controller to _newController in Safe and MemberToken * @param _podId The id number of the pod * @param _newController The address of the new pod controller * @param _prevModule The module that points to the orca module in the safe's ModuleManager linked list */ function migratePodController( uint256 _podId, address _newController, address _prevModule ) external { require(_newController != address(0), "Invalid address"); require( controllerRegistry.isRegistered(_newController), "Controller not registered" ); address admin = podAdmin[_podId]; address safe = podIdToSafe[_podId]; require( msg.sender == admin || msg.sender == safe, "User not authorized" ); Controller newController = Controller(_newController); // nullify current pod state podAdmin[_podId] = address(0); podIdToSafe[_podId] = address(0); safeToPodId[safe] = 0; // update controller in MemberToken memberToken.migrateMemberController(_podId, _newController); // update safe module to _newController migrateSafeTeller(safe, _newController, _prevModule); // update pod state in _newController newController.updatePodState(_podId, admin, safe); } /** * @dev This is called by another version of controller to migrate a pod to this version * @dev Will only accept calls from registered controllers * @dev Can only be called once. * @param _podId The id number of the pod * @param _podAdmin The address of the pod admin * @param _safeAddress The address of the safe */ function updatePodState( uint256 _podId, address _podAdmin, address _safeAddress ) external { require(_safeAddress != address(0), "Invalid address"); require( controllerRegistry.isRegistered(msg.sender), "Controller not registered" ); require( podAdmin[_podId] == address(0) && podIdToSafe[_podId] == address(0) && safeToPodId[_safeAddress] == 0, "Pod already exists" ); podAdmin[_podId] = _podAdmin; podIdToSafe[_podId] = _safeAddress; safeToPodId[_safeAddress] = _podId; emit UpdatePodAdmin(_podId, _podAdmin); } /** * @param operator The address that initiated the action * @param from The address sending the membership token * @param to The address recieveing the membership token * @param ids An array of membership token ids to be transfered * @param data Passes a flag for an initial creation event */ function beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory, bytes memory data ) external override { require(msg.sender == address(memberToken), "Not Authorized"); // if create event than side effects have been pre-handled // only recognise data flags from this controller if (operator == address(this) && uint8(data[0]) == CREATE_EVENT) return; for (uint256 i = 0; i < ids.length; i += 1) { uint256 podId = ids[i]; address safe = podIdToSafe[podId]; address admin = podAdmin[podId]; if (from == address(0)) { // mint event // there are no rules operator must be admin, safe or controller require( operator == safe || operator == admin || operator == address(this), "No Rules Set" ); onMint(to, safe); } else if (to == address(0)) { // burn event // there are no rules operator must be admin, safe or controller require( operator == safe || operator == admin || operator == address(this), "No Rules Set" ); onBurn(from, safe); } else { // transfer event onTransfer(from, to, safe); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @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"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
pragma solidity 0.8.7; import "@openzeppelin/contracts/utils/Address.sol"; import "./interfaces/IGnosisSafe.sol"; import "./interfaces/IGnosisSafeProxyFactory.sol"; contract SafeTeller { using Address for address; // mainnet: 0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B; address public immutable proxyFactoryAddress; // mainnet: 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F; address public immutable gnosisMasterAddress; string public constant FUNCTION_SIG_SETUP = "setup(address[],uint256,address,bytes,address,address,uint256,address)"; string public constant FUNCTION_SIG_EXEC = "execTransaction(address,uint256,bytes,uint8,uint256,uint256,uint256,address,address,bytes)"; string public constant FUNCTION_SIG_ENABLE = "delegateSetup(address)"; address internal constant SENTINEL = address(0x1); /** * @param _proxyFactoryAddress The proxy factory address * @param _gnosisMasterAddress The gnosis master address */ constructor(address _proxyFactoryAddress, address _gnosisMasterAddress) { proxyFactoryAddress = _proxyFactoryAddress; gnosisMasterAddress = _gnosisMasterAddress; } /** * @param _safe The address of the safe * @param _newSafeTeller The address of the new safe teller contract */ function migrateSafeTeller( address _safe, address _newSafeTeller, address _prevModule ) internal { // add new safeTeller bytes memory enableData = abi.encodeWithSignature( "enableModule(address)", _newSafeTeller ); bool enableSuccess = IGnosisSafe(_safe).execTransactionFromModule( _safe, 0, enableData, IGnosisSafe.Operation.Call ); require(enableSuccess, "Migration failed on enable"); // validate prevModule of current safe teller (address[] memory moduleBuffer, ) = IGnosisSafe(_safe) .getModulesPaginated(_prevModule, 1); require(moduleBuffer[0] == address(this), "incorrect prevModule"); // disable current safeTeller bytes memory disableData = abi.encodeWithSignature( "disableModule(address,address)", _prevModule, address(this) ); bool disableSuccess = IGnosisSafe(_safe).execTransactionFromModule( _safe, 0, disableData, IGnosisSafe.Operation.Call ); require(disableSuccess, "Migration failed on disable"); } function getSafeMembers(address safe) public view returns (address[] memory) { return IGnosisSafe(safe).getOwners(); } function isSafeModuleEnabled(address safe) public view returns (bool) { return IGnosisSafe(safe).isModuleEnabled(address(this)); } function isSafeMember(address safe, address member) public view returns (bool) { return IGnosisSafe(safe).isOwner(member); } /** * @param _owners The addresses to be owners of the safe * @param _threshold The number of owners that are required to sign a transaciton * @return safeAddress The address of the new safe */ function createSafe(address[] memory _owners, uint256 _threshold) internal returns (address safeAddress) { bytes memory data = abi.encodeWithSignature( FUNCTION_SIG_ENABLE, address(this) ); // encode the setup call that will be called on the new proxy safe // from the proxy factory bytes memory setupData = abi.encodeWithSignature( FUNCTION_SIG_SETUP, _owners, _threshold, this, data, address(0), address(0), uint256(0), address(0) ); try IGnosisSafeProxyFactory(proxyFactoryAddress).createProxy( gnosisMasterAddress, setupData ) returns (address newSafeAddress) { return newSafeAddress; } catch (bytes memory) { revert("Create Proxy With Data Failed"); } } /** * @param to The account address to add as an owner * @param safe The address of the safe */ function onMint(address to, address safe) internal { uint256 threshold = IGnosisSafe(safe).getThreshold(); bytes memory data = abi.encodeWithSignature( "addOwnerWithThreshold(address,uint256)", to, threshold ); bool success = IGnosisSafe(safe).execTransactionFromModule( safe, 0, data, IGnosisSafe.Operation.Call ); require(success, "Module Transaction Failed"); } /** * @param from The address to be removed as an owner * @param safe The address of the safe */ function onBurn(address from, address safe) internal { uint256 threshold = IGnosisSafe(safe).getThreshold(); address[] memory owners = IGnosisSafe(safe).getOwners(); //look for the address pointing to address from address prevFrom = address(0); for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == from) { if (i == 0) { prevFrom = SENTINEL; } else { prevFrom = owners[i - 1]; } } } if (owners.length - 1 < threshold) threshold -= 1; bytes memory data = abi.encodeWithSignature( "removeOwner(address,address,uint256)", prevFrom, from, threshold ); bool success = IGnosisSafe(safe).execTransactionFromModule( safe, 0, data, IGnosisSafe.Operation.Call ); require(success, "Module Transaction Failed"); } /** * @param from The address being removed as an owner * @param to The address being added as an owner * @param safe The address of the safe */ function onTransfer( address from, address to, address safe ) internal { address[] memory owners = IGnosisSafe(safe).getOwners(); //look for the address pointing to address from address prevFrom; for (uint256 i = 0; i < owners.length; i++) { if (owners[i] == from) { if (i == 0) { prevFrom = SENTINEL; } else { prevFrom = owners[i - 1]; } } } bytes memory data = abi.encodeWithSignature( "swapOwner(address,address,address)", prevFrom, from, to ); bool success = IGnosisSafe(safe).execTransactionFromModule( safe, 0, data, IGnosisSafe.Operation.Call ); require(success, "Module Transaction Failed"); } /** * @dev This will execute a tx from the safe that will update the safe's ENS in the reverse resolver * @param safe safe address * @param reverseRegistrar The ENS default reverseRegistar * @param _ensString string of pod ens name (i.e.'mypod.pod.xyz') */ function setupSafeReverseResolver( address safe, address reverseRegistrar, string memory _ensString ) internal { bytes memory data = abi.encodeWithSignature( "setName(string)", _ensString ); bool success = IGnosisSafe(safe).execTransactionFromModule( reverseRegistrar, 0, data, IGnosisSafe.Operation.Call ); require(success, "Module Transaction Failed"); } // TODO: move to library // Used in a delegate call to enable module add on setup function enableModule(address module) external { require(module == address(0)); } function delegateSetup(address _context) external { this.enableModule(_context); } }
pragma solidity 0.8.7; interface IPodEnsRegistrar { function registerPod(bytes32 label, address podSafe, address podCreator) external returns (address); function register(bytes32 label, address owner) external; }
pragma solidity 0.8.7; interface IController{ /** * @param operator The account address that initiated the action * @param from The account address sending the membership token * @param to The account address recieving the membership token * @param ids An array of membership token ids to be transfered * @param amounts The amount of each membership token type to transfer * @param data Arbitrary data */ function beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) external; }
pragma solidity 0.8.7; interface IControllerRegistry{ /** * @param _controller Address to check if registered as a controller * @return Boolean representing if the address is a registered as a controller */ function isRegistered(address _controller) external view returns (bool); }
pragma solidity 0.8.7; interface IGnosisSafe { enum Operation {Call, DelegateCall} /// @dev Allows a Module to execute a Safe transaction without any further confirmations. /// @param to Destination address of module transaction. /// @param value Ether value of module transaction. /// @param data Data payload of module transaction. /// @param operation Operation type of module transaction. function execTransactionFromModule( address to, uint256 value, bytes calldata data, Operation operation ) external returns (bool success); /// @dev Returns array of owners. /// @return Array of Safe owners. function getOwners() external view returns (address[] memory); function isOwner(address owner) external view returns (bool); function getThreshold() external returns (uint256); /// @dev Returns array of modules. /// @param start Start of the page. /// @param pageSize Maximum number of modules that should be returned. /// @return array Array of modules. /// @return next Start of the next page. function getModulesPaginated(address start, uint256 pageSize) external view returns (address[] memory array, address next); /// @dev Returns if an module is enabled /// @return True if the module is enabled function isModuleEnabled(address module) external view returns (bool); }
pragma solidity 0.8.7; interface IGnosisSafeProxyFactory { /// @dev Allows to create new proxy contact and execute a message call to the new proxy within one transaction. /// @param singleton Address of singleton contract. /// @param data Payload for message call sent to new proxy contract. function createProxy(address singleton, bytes memory data) external returns (address); }
pragma solidity 0.8.7; import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol"; interface IMemberToken is IERC1155 { /** * @dev Total amount of tokens in with a given id. */ function totalSupply(uint256 id) external view returns (uint256); /** * @dev Indicates weither any token exist with a given id, or not. */ function exists(uint256 id) external view returns (bool); function getNextAvailablePodId() external view returns (uint256); /** * @param _podId The pod id number * @param _newController The address of the new controller */ function migrateMemberController(uint256 _podId, address _newController) external; /** * @param _account The account address to transfer the membership token to * @param _id The membership token id to mint * @param data Arbitrary data */ function mint( address _account, uint256 _id, bytes memory data ) external; /** * @param _accounts The account addresses to transfer the membership tokens to * @param _id The membership token id to mint * @param data Arbitrary data */ function mintSingleBatch( address[] memory _accounts, uint256 _id, bytes memory data ) external; function createPod(address[] memory _accounts, bytes memory data) external returns (uint256); }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_memberToken","type":"address"},{"internalType":"address","name":"_controllerRegistry","type":"address"},{"internalType":"address","name":"_proxyFactoryAddress","type":"address"},{"internalType":"address","name":"_gnosisMasterAddress","type":"address"},{"internalType":"address","name":"_podEnsRegistrar","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podId","type":"uint256"},{"indexed":false,"internalType":"address","name":"safe","type":"address"},{"indexed":false,"internalType":"address","name":"admin","type":"address"},{"indexed":false,"internalType":"string","name":"ensName","type":"string"}],"name":"CreatePod","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"podId","type":"uint256"},{"indexed":false,"internalType":"address","name":"admin","type":"address"}],"name":"UpdatePodAdmin","type":"event"},{"inputs":[],"name":"FUNCTION_SIG_ENABLE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FUNCTION_SIG_EXEC","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FUNCTION_SIG_SETUP","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"beforeTokenTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"controllerRegistry","outputs":[{"internalType":"contract IControllerRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_members","type":"address[]"},{"internalType":"uint256","name":"threshold","type":"uint256"},{"internalType":"address","name":"_admin","type":"address"},{"internalType":"bytes32","name":"_label","type":"bytes32"},{"internalType":"string","name":"_ensString","type":"string"}],"name":"createPod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_admin","type":"address"},{"internalType":"address","name":"_safe","type":"address"},{"internalType":"bytes32","name":"_label","type":"bytes32"},{"internalType":"string","name":"_ensString","type":"string"}],"name":"createPodWithSafe","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_context","type":"address"}],"name":"delegateSetup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"module","type":"address"}],"name":"enableModule","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"}],"name":"getSafeMembers","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gnosisMasterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"},{"internalType":"address","name":"member","type":"address"}],"name":"isSafeMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"safe","type":"address"}],"name":"isSafeModuleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"memberToken","outputs":[{"internalType":"contract IMemberToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_podId","type":"uint256"},{"internalType":"address","name":"_newController","type":"address"},{"internalType":"address","name":"_prevModule","type":"address"}],"name":"migratePodController","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"podAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"podEnsRegistrar","outputs":[{"internalType":"contract IPodEnsRegistrar","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"podIdToSafe","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyFactoryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"safeToPodId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_podId","type":"uint256"},{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"updatePodAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_podEnsRegistrar","type":"address"}],"name":"updatePodEnsRegistrar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_podId","type":"uint256"},{"internalType":"address","name":"_podAdmin","type":"address"},{"internalType":"address","name":"_safeAddress","type":"address"}],"name":"updatePodState","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b506040516200308538038062003085833981016040819052620000359162000289565b6001600160601b0319606084811b821660805283901b1660a052620000616200005b3390565b6200021c565b6001600160a01b038516620000af5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b60448201526064015b60405180910390fd5b6001600160a01b038416620000f95760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b038316620001435760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b0382166200018d5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b6001600160a01b038116620001d75760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606401620000a6565b606094851b6001600160601b031990811660c0529390941b90921660e0525050600180546001600160a01b0319166001600160a01b03909216919091179055620002f9565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146200028457600080fd5b919050565b600080600080600060a08688031215620002a257600080fd5b620002ad866200026c565b9450620002bd602087016200026c565b9350620002cd604087016200026c565b9250620002dd606087016200026c565b9150620002ed608087016200026c565b90509295509295909350565b60805160601c60a05160601c60c05160601c60e05160601c612d1562000370600039600081816103a00152818161087e0152610d930152600081816102bc01528181610f6301528181611060015261174d01526000818161037901526115b80152600081816103c7015261158b0152612d156000f3fe608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d092f5d116100ee578063c7e2a4fc11610097578063e1fc2cc111610071578063e1fc2cc11461043f578063f0f39f5d14610452578063f2fde38b14610465578063fe258da71461047857600080fd5b8063c7e2a4fc146103e9578063cf00cec91461040c578063d5a844911461042c57600080fd5b8063b06a4120116100c8578063b06a412014610374578063bbc4541b1461039b578063be5405d2146103c257600080fd5b80638d092f5d146103275780638da5cb5b14610350578063afe5c8ff1461036157600080fd5b8063514648bb1161015b57806362067cd11161013557806362067cd1146102f1578063715018a61461030457806374d4f6d01461030c578063827be3cc1461031f57600080fd5b8063514648bb146102a45780635cb54384146102b7578063610b5925146102de57600080fd5b806337c591fa1161018c57806337c591fa1461022d578063436f8d031461025b5780634a9b5db71461029c57600080fd5b806326a13d30146101b35780632c8cde8214610205578063346e5c481461021a575b600080fd5b6101ef6040518060400160405280601681526020017f64656c656761746553657475702861646472657373290000000000000000000081525081565b6040516101fc9190612aca565b60405180910390f35b610218610213366004612772565b61048b565b005b6102186102283660046128b4565b6104ae565b61024d61023b366004612550565b60026020526000908152604090205481565b6040519081526020016101fc565b610284610269366004612882565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b6101ef610653565b6102186102b2366004612682565b61066f565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102186102ec366004612550565b61080a565b6102186102ff3660046128d9565b610821565b610218610a81565b61021861031a366004612550565b610ae7565b6101ef610b3c565b610284610335366004612882565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610284565b600154610284906001600160a01b031681565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6102847f000000000000000000000000000000000000000000000000000000000000000081565b6103fc6103f7366004612550565b610b58565b60405190151581526020016101fc565b61041f61041a366004612550565b610bf1565b6040516101fc9190612a20565b61021861043a366004612550565b610c68565b61021861044d3660046128d9565b610d2c565b6102186104603660046125c3565b611055565b610218610473366004612550565b6112b8565b6103fc61048636600461258a565b611397565b60006104978686611434565b90506104a686828686866116b2565b505050505050565b6000828152600460209081526040808320546003909252909120546001600160a01b039182169116806105285760405162461bcd60e51b815260206004820152601160248201527f506f6420646f65736e277420657869737400000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821661059357336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920736166652063616e20616464206e65772061646d696e0000000000604482015260640161051f565b6105eb565b336001600160a01b038316146105eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792061646d696e2063616e207570646174652061646d696e0000000000604482015260640161051f565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a150505050565b6040518060800160405280605a8152602001612c40605a913981565b6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420736166652061646472657373000000000000000000000000604482015260640161051f565b6001600160a01b0383166000908152600260205260409020541561072b5760405162461bcd60e51b815260206004820152601360248201527f7361666520616c726561647920696e2075736500000000000000000000000000604482015260640161051f565b61073483610b58565b6107805760405162461bcd60e51b815260206004820152601b60248201527f73616665206d6f64756c65206d75737420626520656e61626c65640000000000604482015260640161051f565b61078a8333611397565b8061079d5750336001600160a01b038416145b6107e95760405162461bcd60e51b815260206004820152601d60248201527f63616c6c6572206d7573742062652073616665206f72206d656d626572000000604482015260640161051f565b60006107f484610bf1565b905061080381858786866116b2565b5050505050565b6001600160a01b0381161561081e57600080fd5b50565b6001600160a01b0381166108695760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c3c5a5479060240160206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190612860565b61094c5760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460205260409020546001600160a01b031615801561098657506000838152600360205260409020546001600160a01b0316155b80156109a857506001600160a01b038116600090815260026020526040902054155b6109f45760405162461bcd60e51b815260206004820152601260248201527f506f6420616c7265616479206578697374730000000000000000000000000000604482015260640161051f565b600083815260046020908152604080832080546001600160a01b038781166001600160a01b03199283168117909355600385528386208054918816919092168117909155845260028352928190208690558051868152918201929092527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a1505050565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b610ae5600061197a565b565b60405163610b592560e01b81526001600160a01b0382166004820152309063610b592590602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610803573d6000803e3d6000fd5b604051806080016040528060468152602001612c9a6046913981565b6040517f2d9ad53d0000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b03831690632d9ad53d9060240160206040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610beb9190612860565b92915050565b6060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c2c57600080fd5b505afa158015610c40573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610beb91908101906126ee565b6000546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063c3c5a5479060240160206040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612860565b610e595760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460209081526040808320546003909252909120546001600160a01b03918216911633821480610e975750336001600160a01b038216145b610ee35760405162461bcd60e51b815260206004820152601360248201527f55736572206e6f7420617574686f72697a656400000000000000000000000000604482015260640161051f565b600085815260046020818152604080842080546001600160a01b031990811690915560038352818520805490911690556001600160a01b03858116855260029092528084209390935591517f82786654000000000000000000000000000000000000000000000000000000008152908101879052858216602482015285917f00000000000000000000000000000000000000000000000000000000000000001690638278665490604401600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050610fca8286866119ca565b6040517f62067cd1000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03848116602483015283811660448301528216906362067cd190606401600060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b50505050505050505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146110cd5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420417574686f72697a6564000000000000000000000000000000000000604482015260640161051f565b6001600160a01b038616301480156111025750600160ff16816000815181106110f8576110f8612bfe565b016020015160f81c145b1561110c576104a6565b60005b83518110156112af57600084828151811061112c5761112c612bfe565b60209081029190910181015160008181526003835260408082205460049094529020549092506001600160a01b03918216919081169089166111f657816001600160a01b03168a6001600160a01b031614806111995750806001600160a01b03168a6001600160a01b0316145b806111ac57506001600160a01b038a1630145b6111e75760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18883611d3a565b611298565b6001600160a01b03881661128d57816001600160a01b03168a6001600160a01b031614806112355750806001600160a01b03168a6001600160a01b0316145b8061124857506001600160a01b038a1630145b6112835760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18983611eeb565b6112988989846121c7565b5050506001816112a89190612b6e565b905061110f565b50505050505050565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b03811661138e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051f565b61081e8161197a565b6040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009190841690632f54bf6e9060240160206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612860565b9392505050565b604080518082018252601681527f64656c656761746553657475702861646472657373290000000000000000000060208201529051306024820152600091829160440160408051601f1981840301815290829052916114929161298b565b60405180910390206001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000604051806080016040528060468152602001612c9a60469139858530856000806000806040516024016114fb989796959493929190612a61565b60408051601f1981840301815290829052916115169161298b565b60408051918290039091206020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052517f61b69abd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906361b69abd906115e2907f00000000000000000000000000000000000000000000000000000000000000009085906004016129a7565b602060405180830381600087803b1580156115fc57600080fd5b505af192505050801561162c575060408051601f3d908101601f191682019092526116299181019061256d565b60015b6116a8573d80801561165a576040519150601f19603f3d011682016040523d82523d6000602084013e61165f565b606091505b5060405162461bcd60e51b815260206004820152601d60248201527f4372656174652050726f787920576974682044617461204661696c6564000000604482015260640161051f565b9250610beb915050565b604080516001808252818301909252600091602082018180368337019050509050600160f81b816000815181106116eb576116eb612bfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040517f9aa0055e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639aa0055e90611784908a908690600401612a33565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d6919061289b565b90507fb298a97e1ae845f4ac62f176cde255ccfe5ac42197eae12459c99761bad66a488187878660405161180d9493929190612add565b60405180910390a1604080518281526001600160a01b03871660208201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a16001600160a01b0385161561188d57600081815260046020526040902080546001600160a01b0319166001600160a01b0387161790555b600081815260036020908152604080832080546001600160a01b0319166001600160a01b038b8116918217909255808552600290935281842085905560015491517f98eed3e900000000000000000000000000000000000000000000000000000000815260048101899052602481019390935233604484015216906398eed3e990606401602060405180830381600087803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061256d565b9050611970878286612369565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260009060440160408051601f198184030181529181526020820180516001600160e01b031663610b592560e01b1790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611a429088908590879082906004016129c9565b602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a949190612860565b905080611ae35760405162461bcd60e51b815260206004820152601a60248201527f4d6967726174696f6e206661696c6564206f6e20656e61626c65000000000000604482015260640161051f565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301526000919087169063cc2f84529060440160006040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b84919081019061272b565b509050306001600160a01b031681600081518110611ba457611ba4612bfe565b60200260200101516001600160a01b031614611c025760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420707265764d6f64756c65000000000000000000000000604482015260640161051f565b6040516001600160a01b038516602482015230604482015260009060640160408051601f198184030181529181526020820180516001600160e01b03167fe009cfde000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0389169063468721a790611c99908b908590879082906004016129c9565b602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190612860565b9050806119705760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e206661696c6564206f6e2064697361626c650000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf919061289b565b6040516001600160a01b03851660248201526044810182905290915060009060640160408051601f198184030181529181526020820180516001600160e01b03167f0d582f13000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0385169063468721a790611e4a9087908590879082906004016129c9565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190612860565b9050806108035760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061289b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd991908101906126ee565b90506000805b825181101561206257856001600160a01b031683828151811061200457612004612bfe565b60200260200101516001600160a01b0316141561205057806120295760019150612050565b82612035600183612b86565b8151811061204557612045612bfe565b602002602001015191505b8061205a81612bcd565b915050611fdf565b5082600183516120729190612b86565b101561208657612083600184612b86565b92505b6040516001600160a01b038083166024830152861660448201526064810184905260009060840160408051601f198184030181529181526020820180516001600160e01b03167ff8dc5dd9000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0387169063468721a7906121269089908590879082906004016129c9565b602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190612860565b9050806112af5760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223e91908101906126ee565b90506000805b82518110156122c757856001600160a01b031683828151811061226957612269612bfe565b60200260200101516001600160a01b031614156122b5578061228e57600191506122b5565b8261229a600183612b86565b815181106122aa576122aa612bfe565b602002602001015191505b806122bf81612bcd565b915050612244565b506040516001600160a01b03808316602483015280871660448301528516606482015260009060840160408051601f198184030181529181526020820180516001600160e01b03167fe318b52b000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a7906121269088908590879082906004016129c9565b60008160405160240161237c9190612aca565b60408051601f198184030181529181526020820180516001600160e01b03167fc47f0027000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611e4a9087908590879082906004016129c9565b803561240081612c2a565b919050565b600082601f83011261241657600080fd5b8151602061242b61242683612b4a565b612b19565b80838252828201915082860187848660051b890101111561244b57600080fd5b60005b8581101561247357815161246181612c2a565b8452928401929084019060010161244e565b5090979650505050505050565b600082601f83011261249157600080fd5b813560206124a161242683612b4a565b80838252828201915082860187848660051b89010111156124c157600080fd5b60005b85811015612473578135845292840192908401906001016124c4565b600082601f8301126124f157600080fd5b813567ffffffffffffffff81111561250b5761250b612c14565b61251e601f8201601f1916602001612b19565b81815284602083860101111561253357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561256257600080fd5b813561142d81612c2a565b60006020828403121561257f57600080fd5b815161142d81612c2a565b6000806040838503121561259d57600080fd5b82356125a881612c2a565b915060208301356125b881612c2a565b809150509250929050565b60008060008060008060c087890312156125dc57600080fd5b86356125e781612c2a565b955060208701356125f781612c2a565b9450604087013561260781612c2a565b9350606087013567ffffffffffffffff8082111561262457600080fd5b6126308a838b01612480565b9450608089013591508082111561264657600080fd5b6126528a838b01612480565b935060a089013591508082111561266857600080fd5b5061267589828a016124e0565b9150509295509295509295565b6000806000806080858703121561269857600080fd5b84356126a381612c2a565b935060208501356126b381612c2a565b925060408501359150606085013567ffffffffffffffff8111156126d657600080fd5b6126e2878288016124e0565b91505092959194509250565b60006020828403121561270057600080fd5b815167ffffffffffffffff81111561271757600080fd5b61272384828501612405565b949350505050565b6000806040838503121561273e57600080fd5b825167ffffffffffffffff81111561275557600080fd5b61276185828601612405565b92505060208301516125b881612c2a565b600080600080600060a0868803121561278a57600080fd5b853567ffffffffffffffff808211156127a257600080fd5b818801915088601f8301126127b657600080fd5b813560206127c661242683612b4a565b8083825282820191508286018d848660051b89010111156127e657600080fd5b600096505b848710156128125780356127fe81612c2a565b8352600196909601959183019183016127eb565b5099505089013596506128299050604089016123f5565b945060608801359350608088013591508082111561284657600080fd5b50612853888289016124e0565b9150509295509295909350565b60006020828403121561287257600080fd5b8151801515811461142d57600080fd5b60006020828403121561289457600080fd5b5035919050565b6000602082840312156128ad57600080fd5b5051919050565b600080604083850312156128c757600080fd5b8235915060208301356125b881612c2a565b6000806000606084860312156128ee57600080fd5b83359250602084013561290081612c2a565b9150604084013561291081612c2a565b809150509250925092565b600081518084526020808501945080840160005b838110156129545781516001600160a01b03168752958201959082019060010161292f565b509495945050505050565b60008151808452612977816020860160208601612b9d565b601f01601f19169290920160200192915050565b6000825161299d818460208701612b9d565b9190910192915050565b6001600160a01b0383168152604060208201526000612723604083018461295f565b6001600160a01b03851681528360208201526080604082015260006129f1608083018561295f565b905060028310612a1157634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60208152600061142d602083018461291b565b604081526000612a46604083018561291b565b8281036020840152612a58818561295f565b95945050505050565b6000610100808352612a758184018c61291b565b90508960208401526001600160a01b03808a1660408501528382036060850152612a9f828a61295f565b978116608085015295861660a0840152505060c081019290925290911660e090910152949350505050565b60208152600061142d602083018461295f565b84815260006001600160a01b03808616602084015280851660408401525060806060830152612b0f608083018461295f565b9695505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b4257612b42612c14565b604052919050565b600067ffffffffffffffff821115612b6457612b64612c14565b5060051b60200190565b60008219821115612b8157612b81612be8565b500190565b600082821015612b9857612b98612be8565b500390565b60005b83811015612bb8578181015183820152602001612ba0565b83811115612bc7576000848401525b50505050565b6000600019821415612be157612be1612be8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461081e57600080fdfe657865635472616e73616374696f6e28616464726573732c75696e743235362c62797465732c75696e74382c75696e743235362c75696e743235362c75696e743235362c616464726573732c616464726573732c627974657329736574757028616464726573735b5d2c75696e743235362c616464726573732c62797465732c616464726573732c616464726573732c75696e743235362c6164647265737329a264697066735822122058befbc87262d571b2abbe14e0c814db466a05fd13d281d0d304977114fe8ce964736f6c634300080700330000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae30000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f000000000000000000000000a6b71e26c5e0845f74c812102ca7114b6a896ab2000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee7095520000000000000000000000005cec7fec214e7366304d82cdebf755004c969e05
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101ae5760003560e01c80638d092f5d116100ee578063c7e2a4fc11610097578063e1fc2cc111610071578063e1fc2cc11461043f578063f0f39f5d14610452578063f2fde38b14610465578063fe258da71461047857600080fd5b8063c7e2a4fc146103e9578063cf00cec91461040c578063d5a844911461042c57600080fd5b8063b06a4120116100c8578063b06a412014610374578063bbc4541b1461039b578063be5405d2146103c257600080fd5b80638d092f5d146103275780638da5cb5b14610350578063afe5c8ff1461036157600080fd5b8063514648bb1161015b57806362067cd11161013557806362067cd1146102f1578063715018a61461030457806374d4f6d01461030c578063827be3cc1461031f57600080fd5b8063514648bb146102a45780635cb54384146102b7578063610b5925146102de57600080fd5b806337c591fa1161018c57806337c591fa1461022d578063436f8d031461025b5780634a9b5db71461029c57600080fd5b806326a13d30146101b35780632c8cde8214610205578063346e5c481461021a575b600080fd5b6101ef6040518060400160405280601681526020017f64656c656761746553657475702861646472657373290000000000000000000081525081565b6040516101fc9190612aca565b60405180910390f35b610218610213366004612772565b61048b565b005b6102186102283660046128b4565b6104ae565b61024d61023b366004612550565b60026020526000908152604090205481565b6040519081526020016101fc565b610284610269366004612882565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b0390911681526020016101fc565b6101ef610653565b6102186102b2366004612682565b61066f565b6102847f0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae381565b6102186102ec366004612550565b61080a565b6102186102ff3660046128d9565b610821565b610218610a81565b61021861031a366004612550565b610ae7565b6101ef610b3c565b610284610335366004612882565b6003602052600090815260409020546001600160a01b031681565b6000546001600160a01b0316610284565b600154610284906001600160a01b031681565b6102847f000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee70955281565b6102847f0000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f81565b6102847f000000000000000000000000a6b71e26c5e0845f74c812102ca7114b6a896ab281565b6103fc6103f7366004612550565b610b58565b60405190151581526020016101fc565b61041f61041a366004612550565b610bf1565b6040516101fc9190612a20565b61021861043a366004612550565b610c68565b61021861044d3660046128d9565b610d2c565b6102186104603660046125c3565b611055565b610218610473366004612550565b6112b8565b6103fc61048636600461258a565b611397565b60006104978686611434565b90506104a686828686866116b2565b505050505050565b6000828152600460209081526040808320546003909252909120546001600160a01b039182169116806105285760405162461bcd60e51b815260206004820152601160248201527f506f6420646f65736e277420657869737400000000000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b03821661059357336001600160a01b0382161461058e5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c7920736166652063616e20616464206e65772061646d696e0000000000604482015260640161051f565b6105eb565b336001600160a01b038316146105eb5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792061646d696e2063616e207570646174652061646d696e0000000000604482015260640161051f565b60008481526004602090815260409182902080546001600160a01b0319166001600160a01b0387169081179091558251878152918201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a150505050565b6040518060800160405280605a8152602001612c40605a913981565b6001600160a01b0383166106c55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420736166652061646472657373000000000000000000000000604482015260640161051f565b6001600160a01b0383166000908152600260205260409020541561072b5760405162461bcd60e51b815260206004820152601360248201527f7361666520616c726561647920696e2075736500000000000000000000000000604482015260640161051f565b61073483610b58565b6107805760405162461bcd60e51b815260206004820152601b60248201527f73616665206d6f64756c65206d75737420626520656e61626c65640000000000604482015260640161051f565b61078a8333611397565b8061079d5750336001600160a01b038416145b6107e95760405162461bcd60e51b815260206004820152601d60248201527f63616c6c6572206d7573742062652073616665206f72206d656d626572000000604482015260640161051f565b60006107f484610bf1565b905061080381858786866116b2565b5050505050565b6001600160a01b0381161561081e57600080fd5b50565b6001600160a01b0381166108695760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81523360048201527f0000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f6001600160a01b03169063c3c5a5479060240160206040518083038186803b1580156108c857600080fd5b505afa1580156108dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109009190612860565b61094c5760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460205260409020546001600160a01b031615801561098657506000838152600360205260409020546001600160a01b0316155b80156109a857506001600160a01b038116600090815260026020526040902054155b6109f45760405162461bcd60e51b815260206004820152601260248201527f506f6420616c7265616479206578697374730000000000000000000000000000604482015260640161051f565b600083815260046020908152604080832080546001600160a01b038781166001600160a01b03199283168117909355600385528386208054918816919092168117909155845260028352928190208690558051868152918201929092527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a1505050565b6000546001600160a01b03163314610adb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b610ae5600061197a565b565b60405163610b592560e01b81526001600160a01b0382166004820152309063610b592590602401600060405180830381600087803b158015610b2857600080fd5b505af1158015610803573d6000803e3d6000fd5b604051806080016040528060468152602001612c9a6046913981565b6040517f2d9ad53d0000000000000000000000000000000000000000000000000000000081523060048201526000906001600160a01b03831690632d9ad53d9060240160206040518083038186803b158015610bb357600080fd5b505afa158015610bc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610beb9190612860565b92915050565b6060816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015610c2c57600080fd5b505afa158015610c40573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610beb91908101906126ee565b6000546001600160a01b03163314610cc25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b038116610d0a5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038216610d745760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640161051f565b60405163c3c5a54760e01b81526001600160a01b0383811660048301527f0000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f169063c3c5a5479060240160206040518083038186803b158015610dd557600080fd5b505afa158015610de9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e0d9190612860565b610e595760405162461bcd60e51b815260206004820152601960248201527f436f6e74726f6c6c6572206e6f74207265676973746572656400000000000000604482015260640161051f565b6000838152600460209081526040808320546003909252909120546001600160a01b03918216911633821480610e975750336001600160a01b038216145b610ee35760405162461bcd60e51b815260206004820152601360248201527f55736572206e6f7420617574686f72697a656400000000000000000000000000604482015260640161051f565b600085815260046020818152604080842080546001600160a01b031990811690915560038352818520805490911690556001600160a01b03858116855260029092528084209390935591517f82786654000000000000000000000000000000000000000000000000000000008152908101879052858216602482015285917f0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae31690638278665490604401600060405180830381600087803b158015610fa757600080fd5b505af1158015610fbb573d6000803e3d6000fd5b50505050610fca8286866119ca565b6040517f62067cd1000000000000000000000000000000000000000000000000000000008152600481018790526001600160a01b03848116602483015283811660448301528216906362067cd190606401600060405180830381600087803b15801561103557600080fd5b505af1158015611049573d6000803e3d6000fd5b50505050505050505050565b336001600160a01b037f0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae316146110cd5760405162461bcd60e51b815260206004820152600e60248201527f4e6f7420417574686f72697a6564000000000000000000000000000000000000604482015260640161051f565b6001600160a01b038616301480156111025750600160ff16816000815181106110f8576110f8612bfe565b016020015160f81c145b1561110c576104a6565b60005b83518110156112af57600084828151811061112c5761112c612bfe565b60209081029190910181015160008181526003835260408082205460049094529020549092506001600160a01b03918216919081169089166111f657816001600160a01b03168a6001600160a01b031614806111995750806001600160a01b03168a6001600160a01b0316145b806111ac57506001600160a01b038a1630145b6111e75760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18883611d3a565b611298565b6001600160a01b03881661128d57816001600160a01b03168a6001600160a01b031614806112355750806001600160a01b03168a6001600160a01b0316145b8061124857506001600160a01b038a1630145b6112835760405162461bcd60e51b815260206004820152600c60248201526b139bc8149d5b195cc814d95d60a21b604482015260640161051f565b6111f18983611eeb565b6112988989846121c7565b5050506001816112a89190612b6e565b905061110f565b50505050505050565b6000546001600160a01b031633146113125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161051f565b6001600160a01b03811661138e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161051f565b61081e8161197a565b6040517f2f54bf6e0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260009190841690632f54bf6e9060240160206040518083038186803b1580156113f557600080fd5b505afa158015611409573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061142d9190612860565b9392505050565b604080518082018252601681527f64656c656761746553657475702861646472657373290000000000000000000060208201529051306024820152600091829160440160408051601f1981840301815290829052916114929161298b565b60405180910390206001600160e01b0319166020820180516001600160e01b03838183161783525050505090506000604051806080016040528060468152602001612c9a60469139858530856000806000806040516024016114fb989796959493929190612a61565b60408051601f1981840301815290829052916115169161298b565b60408051918290039091206020830180516001600160e01b03167fffffffff00000000000000000000000000000000000000000000000000000000909216919091179052517f61b69abd0000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000a6b71e26c5e0845f74c812102ca7114b6a896ab216906361b69abd906115e2907f000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee7095529085906004016129a7565b602060405180830381600087803b1580156115fc57600080fd5b505af192505050801561162c575060408051601f3d908101601f191682019092526116299181019061256d565b60015b6116a8573d80801561165a576040519150601f19603f3d011682016040523d82523d6000602084013e61165f565b606091505b5060405162461bcd60e51b815260206004820152601d60248201527f4372656174652050726f787920576974682044617461204661696c6564000000604482015260640161051f565b9250610beb915050565b604080516001808252818301909252600091602082018180368337019050509050600160f81b816000815181106116eb576116eb612bfe565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506040517f9aa0055e0000000000000000000000000000000000000000000000000000000081526000906001600160a01b037f0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae31690639aa0055e90611784908a908690600401612a33565b602060405180830381600087803b15801561179e57600080fd5b505af11580156117b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117d6919061289b565b90507fb298a97e1ae845f4ac62f176cde255ccfe5ac42197eae12459c99761bad66a488187878660405161180d9493929190612add565b60405180910390a1604080518281526001600160a01b03871660208201527ffef38cfc44da305e6203142455e0a2b129109e8fd7b40914acff6874f170e3df910160405180910390a16001600160a01b0385161561188d57600081815260046020526040902080546001600160a01b0319166001600160a01b0387161790555b600081815260036020908152604080832080546001600160a01b0319166001600160a01b038b8116918217909255808552600290935281842085905560015491517f98eed3e900000000000000000000000000000000000000000000000000000000815260048101899052602481019390935233604484015216906398eed3e990606401602060405180830381600087803b15801561192b57600080fd5b505af115801561193f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611963919061256d565b9050611970878286612369565b5050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b038316602482015260009060440160408051601f198184030181529181526020820180516001600160e01b031663610b592560e01b1790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611a429088908590879082906004016129c9565b602060405180830381600087803b158015611a5c57600080fd5b505af1158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a949190612860565b905080611ae35760405162461bcd60e51b815260206004820152601a60248201527f4d6967726174696f6e206661696c6564206f6e20656e61626c65000000000000604482015260640161051f565b6040517fcc2f84520000000000000000000000000000000000000000000000000000000081526001600160a01b038481166004830152600160248301526000919087169063cc2f84529060440160006040518083038186803b158015611b4857600080fd5b505afa158015611b5c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611b84919081019061272b565b509050306001600160a01b031681600081518110611ba457611ba4612bfe565b60200260200101516001600160a01b031614611c025760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420707265764d6f64756c65000000000000000000000000604482015260640161051f565b6040516001600160a01b038516602482015230604482015260009060640160408051601f198184030181529181526020820180516001600160e01b03167fe009cfde000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0389169063468721a790611c99908b908590879082906004016129c9565b602060405180830381600087803b158015611cb357600080fd5b505af1158015611cc7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ceb9190612860565b9050806119705760405162461bcd60e51b815260206004820152601b60248201527f4d6967726174696f6e206661696c6564206f6e2064697361626c650000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611d7757600080fd5b505af1158015611d8b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611daf919061289b565b6040516001600160a01b03851660248201526044810182905290915060009060640160408051601f198184030181529181526020820180516001600160e01b03167f0d582f13000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0385169063468721a790611e4a9087908590879082906004016129c9565b602060405180830381600087803b158015611e6457600080fd5b505af1158015611e78573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e9c9190612860565b9050806108035760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663e75235b86040518163ffffffff1660e01b8152600401602060405180830381600087803b158015611f2857600080fd5b505af1158015611f3c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f60919061289b565b90506000826001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b158015611f9d57600080fd5b505afa158015611fb1573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611fd991908101906126ee565b90506000805b825181101561206257856001600160a01b031683828151811061200457612004612bfe565b60200260200101516001600160a01b0316141561205057806120295760019150612050565b82612035600183612b86565b8151811061204557612045612bfe565b602002602001015191505b8061205a81612bcd565b915050611fdf565b5082600183516120729190612b86565b101561208657612083600184612b86565b92505b6040516001600160a01b038083166024830152861660448201526064810184905260009060840160408051601f198184030181529181526020820180516001600160e01b03167ff8dc5dd9000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0387169063468721a7906121269089908590879082906004016129c9565b602060405180830381600087803b15801561214057600080fd5b505af1158015612154573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121789190612860565b9050806112af5760405162461bcd60e51b815260206004820152601960248201527f4d6f64756c65205472616e73616374696f6e204661696c656400000000000000604482015260640161051f565b6000816001600160a01b031663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b15801561220257600080fd5b505afa158015612216573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223e91908101906126ee565b90506000805b82518110156122c757856001600160a01b031683828151811061226957612269612bfe565b60200260200101516001600160a01b031614156122b5578061228e57600191506122b5565b8261229a600183612b86565b815181106122aa576122aa612bfe565b602002602001015191505b806122bf81612bcd565b915050612244565b506040516001600160a01b03808316602483015280871660448301528516606482015260009060840160408051601f198184030181529181526020820180516001600160e01b03167fe318b52b000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a7906121269088908590879082906004016129c9565b60008160405160240161237c9190612aca565b60408051601f198184030181529181526020820180516001600160e01b03167fc47f0027000000000000000000000000000000000000000000000000000000001790525163468721a760e01b81529091506000906001600160a01b0386169063468721a790611e4a9087908590879082906004016129c9565b803561240081612c2a565b919050565b600082601f83011261241657600080fd5b8151602061242b61242683612b4a565b612b19565b80838252828201915082860187848660051b890101111561244b57600080fd5b60005b8581101561247357815161246181612c2a565b8452928401929084019060010161244e565b5090979650505050505050565b600082601f83011261249157600080fd5b813560206124a161242683612b4a565b80838252828201915082860187848660051b89010111156124c157600080fd5b60005b85811015612473578135845292840192908401906001016124c4565b600082601f8301126124f157600080fd5b813567ffffffffffffffff81111561250b5761250b612c14565b61251e601f8201601f1916602001612b19565b81815284602083860101111561253357600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561256257600080fd5b813561142d81612c2a565b60006020828403121561257f57600080fd5b815161142d81612c2a565b6000806040838503121561259d57600080fd5b82356125a881612c2a565b915060208301356125b881612c2a565b809150509250929050565b60008060008060008060c087890312156125dc57600080fd5b86356125e781612c2a565b955060208701356125f781612c2a565b9450604087013561260781612c2a565b9350606087013567ffffffffffffffff8082111561262457600080fd5b6126308a838b01612480565b9450608089013591508082111561264657600080fd5b6126528a838b01612480565b935060a089013591508082111561266857600080fd5b5061267589828a016124e0565b9150509295509295509295565b6000806000806080858703121561269857600080fd5b84356126a381612c2a565b935060208501356126b381612c2a565b925060408501359150606085013567ffffffffffffffff8111156126d657600080fd5b6126e2878288016124e0565b91505092959194509250565b60006020828403121561270057600080fd5b815167ffffffffffffffff81111561271757600080fd5b61272384828501612405565b949350505050565b6000806040838503121561273e57600080fd5b825167ffffffffffffffff81111561275557600080fd5b61276185828601612405565b92505060208301516125b881612c2a565b600080600080600060a0868803121561278a57600080fd5b853567ffffffffffffffff808211156127a257600080fd5b818801915088601f8301126127b657600080fd5b813560206127c661242683612b4a565b8083825282820191508286018d848660051b89010111156127e657600080fd5b600096505b848710156128125780356127fe81612c2a565b8352600196909601959183019183016127eb565b5099505089013596506128299050604089016123f5565b945060608801359350608088013591508082111561284657600080fd5b50612853888289016124e0565b9150509295509295909350565b60006020828403121561287257600080fd5b8151801515811461142d57600080fd5b60006020828403121561289457600080fd5b5035919050565b6000602082840312156128ad57600080fd5b5051919050565b600080604083850312156128c757600080fd5b8235915060208301356125b881612c2a565b6000806000606084860312156128ee57600080fd5b83359250602084013561290081612c2a565b9150604084013561291081612c2a565b809150509250925092565b600081518084526020808501945080840160005b838110156129545781516001600160a01b03168752958201959082019060010161292f565b509495945050505050565b60008151808452612977816020860160208601612b9d565b601f01601f19169290920160200192915050565b6000825161299d818460208701612b9d565b9190910192915050565b6001600160a01b0383168152604060208201526000612723604083018461295f565b6001600160a01b03851681528360208201526080604082015260006129f1608083018561295f565b905060028310612a1157634e487b7160e01b600052602160045260246000fd5b82606083015295945050505050565b60208152600061142d602083018461291b565b604081526000612a46604083018561291b565b8281036020840152612a58818561295f565b95945050505050565b6000610100808352612a758184018c61291b565b90508960208401526001600160a01b03808a1660408501528382036060850152612a9f828a61295f565b978116608085015295861660a0840152505060c081019290925290911660e090910152949350505050565b60208152600061142d602083018461295f565b84815260006001600160a01b03808616602084015280851660408401525060806060830152612b0f608083018461295f565b9695505050505050565b604051601f8201601f1916810167ffffffffffffffff81118282101715612b4257612b42612c14565b604052919050565b600067ffffffffffffffff821115612b6457612b64612c14565b5060051b60200190565b60008219821115612b8157612b81612be8565b500190565b600082821015612b9857612b98612be8565b500390565b60005b83811015612bb8578181015183820152602001612ba0565b83811115612bc7576000848401525b50505050565b6000600019821415612be157612be1612be8565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461081e57600080fdfe657865635472616e73616374696f6e28616464726573732c75696e743235362c62797465732c75696e74382c75696e743235362c75696e743235362c75696e743235362c616464726573732c616464726573732c627974657329736574757028616464726573735b5d2c75696e743235362c616464726573732c62797465732c616464726573732c616464726573732c75696e743235362c6164647265737329a264697066735822122058befbc87262d571b2abbe14e0c814db466a05fd13d281d0d304977114fe8ce964736f6c63430008070033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae30000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f000000000000000000000000a6b71e26c5e0845f74c812102ca7114b6a896ab2000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee7095520000000000000000000000005cec7fec214e7366304d82cdebf755004c969e05
-----Decoded View---------------
Arg [0] : _memberToken (address): 0x0762aA185b6ed2dCA77945Ebe92De705e0C37AE3
Arg [1] : _controllerRegistry (address): 0x0d97643EE1051B523E4e3b66Df3640bBA6C0F79f
Arg [2] : _proxyFactoryAddress (address): 0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2
Arg [3] : _gnosisMasterAddress (address): 0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552
Arg [4] : _podEnsRegistrar (address): 0x5ceC7FeC214e7366304D82CdEBF755004C969E05
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000762aa185b6ed2dca77945ebe92de705e0c37ae3
Arg [1] : 0000000000000000000000000d97643ee1051b523e4e3b66df3640bba6c0f79f
Arg [2] : 000000000000000000000000a6b71e26c5e0845f74c812102ca7114b6a896ab2
Arg [3] : 000000000000000000000000d9db270c1b5e3bd161e8c8503c55ceabee709552
Arg [4] : 0000000000000000000000005cec7fec214e7366304d82cdebf755004c969e05
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.