Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
0x60806040 | 6885689 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885521 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885518 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885517 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH | |||
0x60806040 | 6885489 | 149 days ago | Contract Creation | 0 ETH |
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x80831158...523272907 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
IdFactory
Compiler Version
v0.8.17+commit.8df45f5f
Optimization Enabled:
No with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.17; import "../proxy/IdentityProxy.sol"; import "./IIdFactory.sol"; import "../interface/IERC734.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; contract IdFactory is IIdFactory, Ownable { mapping(address => bool) private _tokenFactories; // address of the _implementationAuthority contract making the link to the implementation contract address private immutable _implementationAuthority; // as it is not possible to deploy 2 times the same contract address, this mapping allows us to check which // salt is taken and which is not mapping(string => bool) private _saltTaken; // ONCHAINID of the wallet owner mapping(address => address) private _userIdentity; // wallets currently linked to an ONCHAINID mapping(address => address[]) private _wallets; // ONCHAINID of the token mapping(address => address) private _tokenIdentity; // token linked to an ONCHAINID mapping(address => address) private _tokenAddress; // setting constructor (address implementationAuthority) { require(implementationAuthority != address(0), "invalid argument - zero address"); _implementationAuthority = implementationAuthority; } /** * @dev See {IdFactory-addTokenFactory}. */ function addTokenFactory(address _factory) external override onlyOwner { require(_factory != address(0), "invalid argument - zero address"); require(!isTokenFactory(_factory), "already a factory"); _tokenFactories[_factory] = true; emit TokenFactoryAdded(_factory); } /** * @dev See {IdFactory-removeTokenFactory}. */ function removeTokenFactory(address _factory) external override onlyOwner { require(_factory != address(0), "invalid argument - zero address"); require(isTokenFactory(_factory), "not a factory"); _tokenFactories[_factory] = false; emit TokenFactoryRemoved(_factory); } /** * @dev See {IdFactory-createIdentity}. */ function createIdentity( address _wallet, string memory _salt) external onlyOwner override returns (address) { require(_wallet != address(0), "invalid argument - zero address"); require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string"); string memory oidSalt = string.concat("OID",_salt); require (!_saltTaken[oidSalt], "salt already taken"); require (_userIdentity[_wallet] == address(0), "wallet already linked to an identity"); address identity = _deployIdentity(oidSalt, _implementationAuthority, _wallet); _saltTaken[oidSalt] = true; _userIdentity[_wallet] = identity; _wallets[identity].push(_wallet); emit WalletLinked(_wallet, identity); return identity; } /** * @dev See {IdFactory-createIdentityWithManagementKeys}. */ function createIdentityWithManagementKeys( address _wallet, string memory _salt, bytes32[] memory _managementKeys ) external onlyOwner override returns (address) { require(_wallet != address(0), "invalid argument - zero address"); require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string"); string memory oidSalt = string.concat("OID",_salt); require (!_saltTaken[oidSalt], "salt already taken"); require (_userIdentity[_wallet] == address(0), "wallet already linked to an identity"); require(_managementKeys.length > 0, "invalid argument - empty list of keys"); address identity = _deployIdentity(oidSalt, _implementationAuthority, address(this)); for (uint i = 0; i < _managementKeys.length; i++) { require( _managementKeys[i] != keccak256(abi.encode(_wallet)) , "invalid argument - wallet is also listed in management keys"); IERC734(identity).addKey( _managementKeys[i], 1, 1 ); } IERC734(identity).removeKey( keccak256(abi.encode(address(this))), 1 ); _saltTaken[oidSalt] = true; _userIdentity[_wallet] = identity; _wallets[identity].push(_wallet); emit WalletLinked(_wallet, identity); return identity; } /** * @dev See {IdFactory-createTokenIdentity}. */ function createTokenIdentity( address _token, address _tokenOwner, string memory _salt) external override returns (address) { require(isTokenFactory(msg.sender) || msg.sender == owner(), "only Factory or owner can call"); require(_token != address(0), "invalid argument - zero address"); require(_tokenOwner != address(0), "invalid argument - zero address"); require(keccak256(abi.encode(_salt)) != keccak256(abi.encode("")), "invalid argument - empty string"); string memory tokenIdSalt = string.concat("Token",_salt); require(!_saltTaken[tokenIdSalt], "salt already taken"); require(_tokenIdentity[_token] == address(0), "token already linked to an identity"); address identity = _deployIdentity(tokenIdSalt, _implementationAuthority, _tokenOwner); _saltTaken[tokenIdSalt] = true; _tokenIdentity[_token] = identity; _tokenAddress[identity] = _token; emit TokenLinked(_token, identity); return identity; } /** * @dev See {IdFactory-linkWallet}. */ function linkWallet(address _newWallet) external override { require(_newWallet != address(0), "invalid argument - zero address"); require(_userIdentity[msg.sender] != address(0), "wallet not linked to an identity contract"); require(_userIdentity[_newWallet] == address(0), "new wallet already linked"); require(_tokenIdentity[_newWallet] == address(0), "invalid argument - token address"); address identity = _userIdentity[msg.sender]; require(_wallets[identity].length < 101, "max amount of wallets per ID exceeded"); _userIdentity[_newWallet] = identity; _wallets[identity].push(_newWallet); emit WalletLinked(_newWallet, identity); } /** * @dev See {IdFactory-unlinkWallet}. */ function unlinkWallet(address _oldWallet) external override { require(_oldWallet != address(0), "invalid argument - zero address"); require(_oldWallet != msg.sender, "cannot be called on sender address"); require(_userIdentity[msg.sender] == _userIdentity[_oldWallet], "only a linked wallet can unlink"); address _identity = _userIdentity[_oldWallet]; delete _userIdentity[_oldWallet]; uint256 length = _wallets[_identity].length; for (uint256 i = 0; i < length; i++) { if (_wallets[_identity][i] == _oldWallet) { _wallets[_identity][i] = _wallets[_identity][length - 1]; _wallets[_identity].pop(); break; } } emit WalletUnlinked(_oldWallet, _identity); } /** * @dev See {IdFactory-getIdentity}. */ function getIdentity(address _wallet) external override view returns (address) { if(_tokenIdentity[_wallet] != address(0)) { return _tokenIdentity[_wallet]; } else { return _userIdentity[_wallet]; } } /** * @dev See {IdFactory-isSaltTaken}. */ function isSaltTaken(string calldata _salt) external override view returns (bool) { return _saltTaken[_salt]; } /** * @dev See {IdFactory-getWallets}. */ function getWallets(address _identity) external override view returns (address[] memory) { return _wallets[_identity]; } /** * @dev See {IdFactory-getToken}. */ function getToken(address _identity) external override view returns (address) { return _tokenAddress[_identity]; } /** * @dev See {IdFactory-isTokenFactory}. */ function isTokenFactory(address _factory) public override view returns(bool) { return _tokenFactories[_factory]; } /** * @dev See {IdFactory-implementationAuthority}. */ function implementationAuthority() public override view returns (address) { return _implementationAuthority; } // deploy function with create2 opcode call // returns the address of the contract created function _deploy(string memory salt, bytes memory bytecode) private returns (address) { bytes32 saltBytes = bytes32(keccak256(abi.encodePacked(salt))); address addr; // solhint-disable-next-line no-inline-assembly assembly { let encoded_data := add(0x20, bytecode) // load initialization code. let encoded_size := mload(bytecode) // load init code's length. addr := create2(0, encoded_data, encoded_size, saltBytes) if iszero(extcodesize(addr)) { revert(0, 0) } } emit Deployed(addr); return addr; } // function used to deploy an identity using CREATE2 function _deployIdentity ( string memory _salt, address implementationAuthority, address _wallet ) private returns (address){ bytes memory _code = type(IdentityProxy).creationCode; bytes memory _constructData = abi.encode(implementationAuthority, _wallet); bytes memory bytecode = abi.encodePacked(_code, _constructData); return _deploy(_salt, bytecode); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) 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() { _transferOwnership(_msgSender()); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) 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: GPL-3.0 pragma solidity 0.8.17; interface IIdFactory { /// events // event emitted whenever a single contract is deployed by the factory event Deployed(address indexed _addr); // event emitted when a wallet is linked to an ONCHAINID contract event WalletLinked(address indexed wallet, address indexed identity); // event emitted when a token is linked to an ONCHAINID contract event TokenLinked(address indexed token, address indexed identity); // event emitted when a wallet is unlinked from an ONCHAINID contract event WalletUnlinked(address indexed wallet, address indexed identity); // event emitted when an address is registered on the factory as a Token // factory address, granting this address the privilege to issue // Onchain identities for tokens event TokenFactoryAdded(address indexed factory); // event emitted when a previously recorded token factory address is removed event TokenFactoryRemoved(address indexed factory); /// functions /** * @dev function used to create a new Identity proxy from the factory * @param _wallet the wallet address of the primary owner of this ONCHAINID contract * @param _salt the salt used by create2 to issue the contract * requires a new salt for each deployment * _wallet cannot be linked to another ONCHAINID * only Owner can call => Owner is supposed to be a smart contract, managing the accessibility * of the function, including calls to oracles for multichain * deployment security (avoid identity theft), defining payment requirements, etc. */ function createIdentity(address _wallet, string memory _salt) external returns (address); /** * @dev function used to create a new Identity proxy from the factory, setting the wallet and listed keys as * MANAGEMENT keys. * @param _wallet the wallet address of the primary owner of this ONCHAINID contract * @param _salt the salt used by create2 to issue the contract * @param _managementKeys A list of keys hash (keccak256(abiEncoded())) to add as MANAGEMENT keys. * requires a new salt for each deployment * _wallet cannot be linked to another ONCHAINID * only Owner can call => Owner is supposed to be a smart contract, managing the accessibility * of the function, including calls to oracles for multichain * deployment security (avoid identity theft), defining payment requirements, etc. */ function createIdentityWithManagementKeys( address _wallet, string memory _salt, bytes32[] memory _managementKeys ) external returns (address); /** * @dev function used to create a new Token Identity proxy from the factory * @param _token the address of the token contract * @param _tokenOwner the owner address of the token * @param _salt the salt used by create2 to issue the contract * requires a new salt for each deployment * _token cannot be linked to another ONCHAINID * only Token factory or owner can call (owner should only use its privilege * for tokens not issued by a Token factory onchain */ function createTokenIdentity(address _token, address _tokenOwner, string memory _salt) external returns (address); /** * @dev function used to link a new wallet to an existing identity * @param _newWallet the address of the wallet to link * requires msg.sender to be linked to an existing onchainid * the _newWallet will be linked to the same OID contract as msg.sender * _newWallet cannot be linked to an OID yet * _newWallet cannot be address 0 * cannot link more than 100 wallets to an OID, for gas consumption reason */ function linkWallet(address _newWallet) external; /** * @dev function used to unlink a wallet from an existing identity * @param _oldWallet the address of the wallet to unlink * requires msg.sender to be linked to the same onchainid as _oldWallet * msg.sender cannot be _oldWallet to keep at least 1 wallet linked to any OID * _oldWallet cannot be address 0 */ function unlinkWallet(address _oldWallet) external; /** * @dev function used to register an address as a token factory * @param _factory the address of the token factory * can be called only by Owner * _factory cannot be registered yet * once the factory has been registered it can deploy token identities */ function addTokenFactory(address _factory) external; /** * @dev function used to unregister an address previously registered as a token factory * @param _factory the address of the token factory * can be called only by Owner * _factory has to be registered previously * once the factory has been unregistered it cannot deploy token identities anymore */ function removeTokenFactory(address _factory) external; /** * @dev getter for OID contract corresponding to a wallet/token * @param _wallet the wallet/token address */ function getIdentity(address _wallet) external view returns (address); /** * @dev getter to fetch the array of wallets linked to an OID contract * @param _identity the address of the OID contract * returns an array of addresses linked to the OID */ function getWallets(address _identity) external view returns (address[] memory); /** * @dev getter to fetch the token address linked to an OID contract * @param _identity the address of the OID contract * returns the address linked to the OID */ function getToken(address _identity) external view returns (address); /** * @dev getter to know if an address is registered as token factory or not * @param _factory the address of the factory * returns true if the address corresponds to a registered factory */ function isTokenFactory(address _factory) external view returns(bool); /** * @dev getter to know if a salt is taken for the create2 deployment * @param _salt the salt used for deployment */ function isSaltTaken(string calldata _salt) external view returns (bool); /** * @dev getter for the implementation authority used by this factory. */ function implementationAuthority() external view returns (address); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.17; /** * @dev interface of the ERC734 (Key Holder) standard as defined in the EIP. */ interface IERC734 { /** * @dev Emitted when an execution request was approved. * * Specification: MUST be triggered when approve was successfully called. */ event Approved(uint256 indexed executionId, bool approved); /** * @dev Emitted when an execute operation was approved and successfully performed. * * Specification: MUST be triggered when approve was called and the execution was successfully approved. */ event Executed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data); /** * @dev Emitted when an execution request was performed via `execute`. * * Specification: MUST be triggered when execute was successfully called. */ event ExecutionRequested(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data); /** * @dev Emitted when an execute operation was called and failed * * Specification: MUST be triggered when execute call failed */ event ExecutionFailed(uint256 indexed executionId, address indexed to, uint256 indexed value, bytes data); /** * @dev Emitted when a key was added to the Identity. * * Specification: MUST be triggered when addKey was successfully called. */ event KeyAdded(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType); /** * @dev Emitted when a key was removed from the Identity. * * Specification: MUST be triggered when removeKey was successfully called. */ event KeyRemoved(bytes32 indexed key, uint256 indexed purpose, uint256 indexed keyType); /** * @dev Adds a _key to the identity. The _purpose specifies the purpose of the key. * * Triggers Event: `KeyAdded` * * Specification: MUST only be done by keys of purpose 1, or the identity * itself. If it's the identity itself, the approval process will determine its approval. */ function addKey(bytes32 _key, uint256 _purpose, uint256 _keyType) external returns (bool success); /** * @dev Approves an execution. * * Triggers Event: `Approved` * Triggers on execution successful Event: `Executed` * Triggers on execution failure Event: `ExecutionFailed` */ function approve(uint256 _id, bool _approve) external returns (bool success); /** * @dev Removes _purpose for _key from the identity. * * Triggers Event: `KeyRemoved` * * Specification: MUST only be done by keys of purpose 1, or the identity itself. * If it's the identity itself, the approval process will determine its approval. */ function removeKey(bytes32 _key, uint256 _purpose) external returns (bool success); /** * @dev Passes an execution instruction to an ERC734 identity. * How the execution is handled is up to the identity implementation: * An execution COULD be requested and require `approve` to be called with one or more keys of purpose 1 or 2 to * approve this execution. * Execute COULD be used as the only accessor for `addKey` and `removeKey`. * * Triggers Event: ExecutionRequested * Triggers on direct execution Event: Executed */ function execute(address _to, uint256 _value, bytes calldata _data) external payable returns (uint256 executionId); /** * @dev Returns the full key data, if present in the identity. */ function getKey(bytes32 _key) external view returns (uint256[] memory purposes, uint256 keyType, bytes32 key); /** * @dev Returns the list of purposes associated with a key. */ function getKeyPurposes(bytes32 _key) external view returns(uint256[] memory _purposes); /** * @dev Returns an array of public key bytes32 held by this identity. */ function getKeysByPurpose(uint256 _purpose) external view returns (bytes32[] memory keys); /** * @dev Returns TRUE if a key is present and has the given purpose. If the key is not present it returns FALSE. */ function keyHasPurpose(bytes32 _key, uint256 _purpose) external view returns (bool exists); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.17; interface IImplementationAuthority { // event emitted when the implementation contract is updated event UpdatedImplementation(address newAddress); /** * @dev updates the address used as implementation by the proxies linked * to this ImplementationAuthority contract * @param _newImplementation the address of the new implementation contract * only Owner can call */ function updateImplementation(address _newImplementation) external; /** * @dev returns the address of the implementation */ function getImplementation() external view returns(address); }
// SPDX-License-Identifier: GPL-3.0 pragma solidity 0.8.17; import "../interface/IImplementationAuthority.sol"; contract IdentityProxy { /** * @dev constructor of the proxy Identity contract * @param _implementationAuthority the implementation Authority contract address * @param initialManagementKey the management key at deployment * the proxy is going to use the logic deployed on the implementation contract * deployed at an address listed in the ImplementationAuthority contract */ constructor(address _implementationAuthority, address initialManagementKey) { require(_implementationAuthority != address(0), "invalid argument - zero address"); require(initialManagementKey != address(0), "invalid argument - zero address"); // solhint-disable-next-line no-inline-assembly assembly { sstore(0x821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc, _implementationAuthority) } address logic = IImplementationAuthority(_implementationAuthority).getImplementation(); // solhint-disable-next-line avoid-low-level-calls (bool success,) = logic.delegatecall(abi.encodeWithSignature("initialize(address)", initialManagementKey)); require(success, "Initialization failed."); } /** * @dev fallback proxy function used for any transaction call that is made using * the Identity contract ABI and called on the proxy contract * The proxy will update its local storage depending on the behaviour requested * by the implementation contract given by the Implementation Authority */ // solhint-disable-next-line no-complex-fallback fallback() external payable { address logic = IImplementationAuthority(implementationAuthority()).getImplementation(); // solhint-disable-next-line no-inline-assembly assembly { calldatacopy(0x0, 0x0, calldatasize()) let success := delegatecall(sub(gas(), 10000), logic, 0x0, calldatasize(), 0, 0) let retSz := returndatasize() returndatacopy(0, 0, retSz) switch success case 0 { revert(0, retSz) } default { return(0, retSz) } } } function implementationAuthority() public view returns(address) { address implemAuth; // solhint-disable-next-line no-inline-assembly assembly { implemAuth := sload(0x821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc) } return implemAuth; } }
{ "optimizer": { "enabled": false, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"implementationAuthority","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_addr","type":"address"}],"name":"Deployed","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":true,"internalType":"address","name":"factory","type":"address"}],"name":"TokenFactoryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"factory","type":"address"}],"name":"TokenFactoryRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"identity","type":"address"}],"name":"TokenLinked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"identity","type":"address"}],"name":"WalletLinked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":true,"internalType":"address","name":"identity","type":"address"}],"name":"WalletUnlinked","type":"event"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"addTokenFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"string","name":"_salt","type":"string"}],"name":"createIdentity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"},{"internalType":"string","name":"_salt","type":"string"},{"internalType":"bytes32[]","name":"_managementKeys","type":"bytes32[]"}],"name":"createIdentityWithManagementKeys","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"string","name":"_salt","type":"string"}],"name":"createTokenIdentity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getIdentity","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_identity","type":"address"}],"name":"getWallets","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"implementationAuthority","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_salt","type":"string"}],"name":"isSaltTaken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"isTokenFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newWallet","type":"address"}],"name":"linkWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"}],"name":"removeTokenFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oldWallet","type":"address"}],"name":"unlinkWallet","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620001185760003560e01c8063715018a611620000a55780639ce19365116200006f5780639ce193651462000327578063b8bb81261462000347578063f2fde38b1462000367578063fe5cd59a14620003875762000118565b8063715018a614620002a35780638da5cb5b14620002af5780638e952bfe14620002d1578063937529ef14620003075762000118565b80633e3bc3d711620000e75780633e3bc3d714620001e1578063422c29a414620002175780635027dbe2146200024d57806359770438146200026d5762000118565b80632307f882146200011d5780632fea7b81146200013f5780633a50045114620001755780633d56ff6614620001ab575b600080fd5b62000127620003bd565b6040516200013691906200291f565b60405180910390f35b6200015d600480360381019062000157919062002981565b620003e5565b6040516200016c91906200291f565b60405180910390f35b6200019360048036038101906200018d919062002a21565b6200054a565b604051620001a2919062002a93565b60405180910390f35b620001c96004803603810190620001c3919062002c0d565b62000584565b604051620001d891906200291f565b60405180910390f35b620001ff6004803603810190620001f9919062002981565b62000abe565b6040516200020e919062002a93565b60405180910390f35b6200023560048036038101906200022f919062002981565b62000b14565b60405162000244919062002d56565b60405180910390f35b6200026b600480360381019062000265919062002981565b62000be3565b005b6200028b600480360381019062000285919062002981565b620011ec565b6040516200029a91906200291f565b60405180910390f35b620002ad62001255565b005b620002b96200126d565b604051620002c891906200291f565b60405180910390f35b620002ef6004803603810190620002e9919062002d7a565b62001296565b604051620002fe91906200291f565b60405180910390f35b6200032560048036038101906200031f919062002981565b620016fc565b005b6200034560048036038101906200033f919062002981565b62001863565b005b6200036560048036038101906200035f919062002981565b620019ca565b005b6200038560048036038101906200037f919062002981565b62001f17565b005b620003a560048036038101906200039f919062002ef1565b62001fa1565b604051620003b491906200291f565b60405180910390f35b60007f000000000000000000000000e315280c7f1c6ec8b710ba3986fbcba7cb3e31ac905090565b60008073ffffffffffffffffffffffffffffffffffffffff16600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620004e257600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905062000545565b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505b919050565b6000600283836040516200056092919062002fbf565b908152602001604051809103902060009054906101000a900460ff16905092915050565b6000620005913362000abe565b80620005d15750620005a26200126d565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b62000613576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200060a906200303b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160362000685576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200067c90620030ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620006f7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006ee90620030ad565b60405180910390fd5b6040516020016200070890620030f9565b604051602081830303815290604052805190602001208260405160200162000731919062003193565b60405160208183030381529060405280519060200120036200078a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007819062003207565b60405180910390fd5b6000826040516020016200079f919062003286565b6040516020818303038152906040529050600281604051620007c29190620032b0565b908152602001604051809103902060009054906101000a900460ff161562000821576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008189062003319565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620008f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008e990620033b1565b60405180910390fd5b600062000921827f000000000000000000000000e315280c7f1c6ec8b710ba3986fbcba7cb3e31ac876200264e565b90506001600283604051620009379190620032b0565b908152602001604051809103902060006101000a81548160ff02191690831515021790555080600560008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fa8261d398ddc63db24cc53cd0c63c9464cabad1bc478ede2107b32c1c4010b7a60405160405180910390a380925050509392505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6060600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080548060200260200160405190810160405280929190818152602001828054801562000bd757602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000b8c575b50505050509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000c55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c4c90620030ad565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362000cc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000cbd9062003449565b60405180910390fd5b600360008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000df5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000dec90620034bb565b60405180910390fd5b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002080549050905060005b818110156200118c578373ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020828154811062000f795762000f78620034dd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036200117657600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001836200100e919062003545565b81548110620010225762001021620034dd565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600460008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208281548110620010a157620010a0620034dd565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806200113b576200113a62003580565b5b6001900381819060005260206000200160006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905590556200118c565b80806200118390620035af565b91505062000f05565b508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f35e6fc363a4bf723d53b26c1a751674aca9c3ead425f0591f84f5540ede86f1260405160405180910390a3505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6200125f620026e1565b6200126b600062002766565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000620012a2620026e1565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160362001314576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200130b90620030ad565b60405180910390fd5b6040516020016200132590620030f9565b60405160208183030381529060405280519060200120826040516020016200134e919062003193565b6040516020818303038152906040528051906020012003620013a7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200139e9062003207565b60405180910390fd5b600082604051602001620013bc919062003622565b6040516020818303038152906040529050600281604051620013df9190620032b0565b908152602001604051809103902060009054906101000a900460ff16156200143e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620014359062003319565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200150f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200150690620036c2565b60405180910390fd5b60006200153e827f000000000000000000000000e315280c7f1c6ec8b710ba3986fbcba7cb3e31ac876200264e565b90506001600283604051620015549190620032b0565b908152602001604051809103902060006101000a81548160ff02191690831515021790555080600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020859080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f8e0c709111388f5480579514d86663489ab1f206fe6da1a0c4d03ac8c318b3c660405160405180910390a3809250505092915050565b62001706620026e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001778576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200176f90620030ad565b60405180910390fd5b620017838162000abe565b620017c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620017bc9062003734565b60405180910390fd5b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167fd1fd5274f793d20291c0abfe42e1ef63213a11b34996d485f7afb8fe0142485160405160405180910390a250565b6200186d620026e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620018df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620018d690620030ad565b60405180910390fd5b620018ea8162000abe565b156200192d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200192490620037a6565b60405180910390fd5b60018060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f45eb8ac5344d2d3f306550fe6e969ca4190526313c512afed851d052bf2ab2fd60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001a3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001a3390620030ad565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160362001b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001b04906200383e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462001bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001bd590620038b0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462001caf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001ca69062003922565b60405180910390fd5b6000600360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690506065600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020805490501062001d9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001d9290620039ba565b60405180910390fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8e0c709111388f5480579514d86663489ab1f206fe6da1a0c4d03ac8c318b3c660405160405180910390a35050565b62001f21620026e1565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160362001f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162001f8a9062003a52565b60405180910390fd5b62001f9e8162002766565b50565b600062001fad620026e1565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036200201f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200201690620030ad565b60405180910390fd5b6040516020016200203090620030f9565b604051602081830303815290604052805190602001208360405160200162002059919062003193565b6040516020818303038152906040528051906020012003620020b2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620020a99062003207565b60405180910390fd5b600083604051602001620020c7919062003622565b6040516020818303038152906040529050600281604051620020ea9190620032b0565b908152602001604051809103902060009054906101000a900460ff161562002149576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620021409062003319565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200221a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200221190620036c2565b60405180910390fd5b600083511162002261576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620022589062003aea565b60405180910390fd5b600062002290827f000000000000000000000000e315280c7f1c6ec8b710ba3986fbcba7cb3e31ac306200264e565b905060005b8451811015620023e35786604051602001620022b291906200291f565b60405160208183030381529060405280519060200120858281518110620022de57620022dd620034dd565b5b60200260200101510362002329576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620023209062003b82565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff16631d3812408683815181106200235b576200235a620034dd565b5b60200260200101516001806040518463ffffffff1660e01b8152600401620023869392919062003c02565b6020604051808303816000875af1158015620023a6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620023cc919062003c70565b508080620023da90620035af565b91505062002295565b508073ffffffffffffffffffffffffffffffffffffffff166353d413c5306040516020016200241391906200291f565b6040516020818303038152906040528051906020012060016040518363ffffffff1660e01b81526004016200244a92919062003ca2565b6020604051808303816000875af11580156200246a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062002490919062003c70565b506001600283604051620024a59190620032b0565b908152602001604051809103902060006101000a81548160ff02191690831515021790555080600360008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600460008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020869080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8e0c709111388f5480579514d86663489ab1f206fe6da1a0c4d03ac8c318b3c660405160405180910390a380925050509392505050565b600080604051806020016200266390620028cc565b6020820181038252601f19601f820116604052509050600084846040516020016200269092919062003ccf565b604051602081830303815290604052905060008282604051602001620026b892919062003d49565b6040516020818303038152906040529050620026d587826200282a565b93505050509392505050565b620026eb620028c4565b73ffffffffffffffffffffffffffffffffffffffff166200270b6200126d565b73ffffffffffffffffffffffffffffffffffffffff161462002764576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200275b9062003dc1565b60405180910390fd5b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008083604051602001620028409190620032b0565b60405160208183030381529060405280519060200120905060008360200184518381836000f59250823b6200287457600080fd5b50508073ffffffffffffffffffffffffffffffffffffffff167ff40fcec21964ffb566044d083b4073f29f7f7929110ea19e1b3ebe375d89055e60405160405180910390a2809250505092915050565b600033905090565b6107728062003de483390190565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200290782620028da565b9050919050565b6200291981620028fa565b82525050565b60006020820190506200293660008301846200290e565b92915050565b6000604051905090565b600080fd5b600080fd5b6200295b81620028fa565b81146200296757600080fd5b50565b6000813590506200297b8162002950565b92915050565b6000602082840312156200299a576200299962002946565b5b6000620029aa848285016200296a565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112620029db57620029da620029b3565b5b8235905067ffffffffffffffff811115620029fb57620029fa620029b8565b5b60208301915083600182028301111562002a1a5762002a19620029bd565b5b9250929050565b6000806020838503121562002a3b5762002a3a62002946565b5b600083013567ffffffffffffffff81111562002a5c5762002a5b6200294b565b5b62002a6a85828601620029c2565b92509250509250929050565b60008115159050919050565b62002a8d8162002a76565b82525050565b600060208201905062002aaa600083018462002a82565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62002b008262002ab5565b810181811067ffffffffffffffff8211171562002b225762002b2162002ac6565b5b80604052505050565b600062002b376200293c565b905062002b45828262002af5565b919050565b600067ffffffffffffffff82111562002b685762002b6762002ac6565b5b62002b738262002ab5565b9050602081019050919050565b82818337600083830152505050565b600062002ba662002ba08462002b4a565b62002b2b565b90508281526020810184848401111562002bc55762002bc462002ab0565b5b62002bd284828562002b80565b509392505050565b600082601f83011262002bf25762002bf1620029b3565b5b813562002c0484826020860162002b8f565b91505092915050565b60008060006060848603121562002c295762002c2862002946565b5b600062002c39868287016200296a565b935050602062002c4c868287016200296a565b925050604084013567ffffffffffffffff81111562002c705762002c6f6200294b565b5b62002c7e8682870162002bda565b9150509250925092565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b62002cbf81620028fa565b82525050565b600062002cd3838362002cb4565b60208301905092915050565b6000602082019050919050565b600062002cf98262002c88565b62002d05818562002c93565b935062002d128362002ca4565b8060005b8381101562002d4957815162002d2d888262002cc5565b975062002d3a8362002cdf565b92505060018101905062002d16565b5085935050505092915050565b6000602082019050818103600083015262002d72818462002cec565b905092915050565b6000806040838503121562002d945762002d9362002946565b5b600062002da4858286016200296a565b925050602083013567ffffffffffffffff81111562002dc85762002dc76200294b565b5b62002dd68582860162002bda565b9150509250929050565b600067ffffffffffffffff82111562002dfe5762002dfd62002ac6565b5b602082029050602081019050919050565b6000819050919050565b62002e248162002e0f565b811462002e3057600080fd5b50565b60008135905062002e448162002e19565b92915050565b600062002e6162002e5b8462002de0565b62002b2b565b9050808382526020820190506020840283018581111562002e875762002e86620029bd565b5b835b8181101562002eb4578062002e9f888262002e33565b84526020840193505060208101905062002e89565b5050509392505050565b600082601f83011262002ed65762002ed5620029b3565b5b813562002ee884826020860162002e4a565b91505092915050565b60008060006060848603121562002f0d5762002f0c62002946565b5b600062002f1d868287016200296a565b935050602084013567ffffffffffffffff81111562002f415762002f406200294b565b5b62002f4f8682870162002bda565b925050604084013567ffffffffffffffff81111562002f735762002f726200294b565b5b62002f818682870162002ebe565b9150509250925092565b600081905092915050565b600062002fa4838562002f8b565b935062002fb383858462002b80565b82840190509392505050565b600062002fce82848662002f96565b91508190509392505050565b600082825260208201905092915050565b7f6f6e6c7920466163746f7279206f72206f776e65722063616e2063616c6c0000600082015250565b600062003023601e8362002fda565b9150620030308262002feb565b602082019050919050565b60006020820190508181036000830152620030568162003014565b9050919050565b7f696e76616c696420617267756d656e74202d207a65726f206164647265737300600082015250565b600062003095601f8362002fda565b9150620030a2826200305d565b602082019050919050565b60006020820190508181036000830152620030c88162003086565b9050919050565b50565b6000620030e160008362002fda565b9150620030ee82620030cf565b600082019050919050565b600060208201905081810360008301526200311481620030d2565b9050919050565b600081519050919050565b60005b838110156200314657808201518184015260208101905062003129565b60008484015250505050565b60006200315f826200311b565b6200316b818562002fda565b93506200317d81856020860162003126565b620031888162002ab5565b840191505092915050565b60006020820190508181036000830152620031af818462003152565b905092915050565b7f696e76616c696420617267756d656e74202d20656d70747920737472696e6700600082015250565b6000620031ef601f8362002fda565b9150620031fc82620031b7565b602082019050919050565b600060208201905081810360008301526200322281620031e0565b9050919050565b7f546f6b656e000000000000000000000000000000000000000000000000000000815250565b60006200325c826200311b565b62003268818562002f8b565b93506200327a81856020860162003126565b80840191505092915050565b6000620032938262003229565b600582019150620032a582846200324f565b915081905092915050565b6000620032be82846200324f565b915081905092915050565b7f73616c7420616c72656164792074616b656e0000000000000000000000000000600082015250565b60006200330160128362002fda565b91506200330e82620032c9565b602082019050919050565b600060208201905081810360008301526200333481620032f2565b9050919050565b7f746f6b656e20616c7265616479206c696e6b656420746f20616e206964656e7460008201527f6974790000000000000000000000000000000000000000000000000000000000602082015250565b60006200339960238362002fda565b9150620033a6826200333b565b604082019050919050565b60006020820190508181036000830152620033cc816200338a565b9050919050565b7f63616e6e6f742062652063616c6c6564206f6e2073656e64657220616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b60006200343160228362002fda565b91506200343e82620033d3565b604082019050919050565b60006020820190508181036000830152620034648162003422565b9050919050565b7f6f6e6c792061206c696e6b65642077616c6c65742063616e20756e6c696e6b00600082015250565b6000620034a3601f8362002fda565b9150620034b0826200346b565b602082019050919050565b60006020820190508181036000830152620034d68162003494565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062003552826200350c565b91506200355f836200350c565b92508282039050818111156200357a576200357962003516565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6000620035bc826200350c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203620035f157620035f062003516565b5b600182019050919050565b7f4f49440000000000000000000000000000000000000000000000000000000000815250565b60006200362f82620035fc565b6003820191506200364182846200324f565b915081905092915050565b7f77616c6c657420616c7265616479206c696e6b656420746f20616e206964656e60008201527f7469747900000000000000000000000000000000000000000000000000000000602082015250565b6000620036aa60248362002fda565b9150620036b7826200364c565b604082019050919050565b60006020820190508181036000830152620036dd816200369b565b9050919050565b7f6e6f74206120666163746f727900000000000000000000000000000000000000600082015250565b60006200371c600d8362002fda565b91506200372982620036e4565b602082019050919050565b600060208201905081810360008301526200374f816200370d565b9050919050565b7f616c7265616479206120666163746f7279000000000000000000000000000000600082015250565b60006200378e60118362002fda565b91506200379b8262003756565b602082019050919050565b60006020820190508181036000830152620037c1816200377f565b9050919050565b7f77616c6c6574206e6f74206c696e6b656420746f20616e206964656e7469747960008201527f20636f6e74726163740000000000000000000000000000000000000000000000602082015250565b60006200382660298362002fda565b91506200383382620037c8565b604082019050919050565b60006020820190508181036000830152620038598162003817565b9050919050565b7f6e65772077616c6c657420616c7265616479206c696e6b656400000000000000600082015250565b60006200389860198362002fda565b9150620038a58262003860565b602082019050919050565b60006020820190508181036000830152620038cb8162003889565b9050919050565b7f696e76616c696420617267756d656e74202d20746f6b656e2061646472657373600082015250565b60006200390a60208362002fda565b91506200391782620038d2565b602082019050919050565b600060208201905081810360008301526200393d81620038fb565b9050919050565b7f6d617820616d6f756e74206f662077616c6c657473207065722049442065786360008201527f6565646564000000000000000000000000000000000000000000000000000000602082015250565b6000620039a260258362002fda565b9150620039af8262003944565b604082019050919050565b60006020820190508181036000830152620039d58162003993565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600062003a3a60268362002fda565b915062003a4782620039dc565b604082019050919050565b6000602082019050818103600083015262003a6d8162003a2b565b9050919050565b7f696e76616c696420617267756d656e74202d20656d707479206c697374206f6660008201527f206b657973000000000000000000000000000000000000000000000000000000602082015250565b600062003ad260258362002fda565b915062003adf8262003a74565b604082019050919050565b6000602082019050818103600083015262003b058162003ac3565b9050919050565b7f696e76616c696420617267756d656e74202d2077616c6c657420697320616c7360008201527f6f206c697374656420696e206d616e6167656d656e74206b6579730000000000602082015250565b600062003b6a603b8362002fda565b915062003b778262003b0c565b604082019050919050565b6000602082019050818103600083015262003b9d8162003b5b565b9050919050565b62003baf8162002e0f565b82525050565b6000819050919050565b6000819050919050565b600062003bea62003be462003bde8462003bb5565b62003bbf565b6200350c565b9050919050565b62003bfc8162003bc9565b82525050565b600060608201905062003c19600083018662003ba4565b62003c28602083018562003bf1565b62003c37604083018462003bf1565b949350505050565b62003c4a8162002a76565b811462003c5657600080fd5b50565b60008151905062003c6a8162003c3f565b92915050565b60006020828403121562003c895762003c8862002946565b5b600062003c998482850162003c59565b91505092915050565b600060408201905062003cb9600083018562003ba4565b62003cc8602083018462003bf1565b9392505050565b600060408201905062003ce660008301856200290e565b62003cf560208301846200290e565b9392505050565b600081519050919050565b600081905092915050565b600062003d1f8262003cfc565b62003d2b818562003d07565b935062003d3d81856020860162003126565b80840191505092915050565b600062003d57828562003d12565b915062003d65828462003d12565b91508190509392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600062003da960208362002fda565b915062003db68262003d71565b602082019050919050565b6000602082019050818103600083015262003ddc8162003d9a565b905091905056fe608060405234801561001057600080fd5b506040516107723803806107728339818101604052810190610032919061034a565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036100a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610098906103e7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610110576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610107906103e7565b60405180910390fd5b817f821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc5560008273ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa158015610180573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101a49190610407565b905060008173ffffffffffffffffffffffffffffffffffffffff16836040516024016101d09190610443565b6040516020818303038152906040527fc4d66de8000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161025a91906104cf565b600060405180830381855af49150503d8060008114610295576040519150601f19603f3d011682016040523d82523d6000602084013e61029a565b606091505b50509050806102de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102d590610532565b60405180910390fd5b50505050610552565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610317826102ec565b9050919050565b6103278161030c565b811461033257600080fd5b50565b6000815190506103448161031e565b92915050565b60008060408385031215610361576103606102e7565b5b600061036f85828601610335565b925050602061038085828601610335565b9150509250929050565b600082825260208201905092915050565b7f696e76616c696420617267756d656e74202d207a65726f206164647265737300600082015250565b60006103d1601f8361038a565b91506103dc8261039b565b602082019050919050565b60006020820190508181036000830152610400816103c4565b9050919050565b60006020828403121561041d5761041c6102e7565b5b600061042b84828501610335565b91505092915050565b61043d8161030c565b82525050565b60006020820190506104586000830184610434565b92915050565b600081519050919050565b600081905092915050565b60005b83811015610492578082015181840152602081019050610477565b60008484015250505050565b60006104a98261045e565b6104b38185610469565b93506104c3818560208601610474565b80840191505092915050565b60006104db828461049e565b915081905092915050565b7f496e697469616c697a6174696f6e206661696c65642e00000000000000000000600082015250565b600061051c60168361038a565b9150610527826104e6565b602082019050919050565b6000602082019050818103600083015261054b8161050f565b9050919050565b610211806105616000396000f3fe6080604052600436106100225760003560e01c80632307f882146100c857610023565b5b600061002d6100f3565b73ffffffffffffffffffffffffffffffffffffffff1663aaf10f426040518163ffffffff1660e01b8152600401602060405180830381865afa158015610077573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061009b9190610184565b90503660008037600080366000846127105a03f43d806000803e81600081146100c357816000f35b816000fd5b3480156100d457600080fd5b506100dd6100f3565b6040516100ea91906101c0565b60405180910390f35b6000807f821f3e4d3d679f19eacc940c87acf846ea6eae24a63058ea750304437a62aafc5490508091505090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061015182610126565b9050919050565b61016181610146565b811461016c57600080fd5b50565b60008151905061017e81610158565b92915050565b60006020828403121561019a57610199610121565b5b60006101a88482850161016f565b91505092915050565b6101ba81610146565b82525050565b60006020820190506101d560008301846101b1565b9291505056fea264697066735822122087108c0e411bfe27737deb09117917821789f7599cced8134d2683b7969e34ae64736f6c63430008110033a2646970667358221220c59db5c5d82b4f1521e06b7e58107aab1a6dfd1bb1bc8c2da3b4d1ff5ba727e464736f6c63430008110033
Loading...
Loading
Loading...
Loading
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.