pragma solidity >0.6.11; // SPDX-License-Identifier: GPL-3.0-or-later contract CustodialAccountIndex { address[] public entry; mapping(address => uint256) public entryIndex; uint256 public count; mapping(address => bool) writers; address public owner; address newOwner; event AccountAdded(address indexed addedAccount, uint256 indexed accountIndex); // AccountsIndex event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); // EIP173 constructor() public { owner = msg.sender; entry.push(address(0)); count = 1; } function addWriter(address _writer) public returns (bool) { require(owner == msg.sender); writers[_writer] = true; return true; } function deleteWriter(address _writer) public returns (bool) { require(owner == msg.sender); delete writers[_writer]; return true; } function add(address _account) external returns (bool) { require(writers[msg.sender]); require(entryIndex[_account] == 0); entry.push(_account); entryIndex[_account] = count; count++; emit AccountAdded(_account, count-1); return true; } function have(address _account) external view returns (bool) { return entryIndex[_account] > 0; } function entryCount() public returns (uint256) { return count; } function transferOwnership(address _newOwner) public returns (bool) { require(msg.sender == owner); newOwner = _newOwner; } function acceptOwnership() public returns (bool) { address oldOwner; require(msg.sender == newOwner); oldOwner = owner; owner = newOwner; newOwner = address(0); emit OwnershipTransferred(oldOwner, owner); } function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xcbdb05c7) { // AccountsIndex return true; } if (_sum == 0x01ffc9a7) { // EIP165 return true; } if (_sum == 0x9493f8b2) { // EIP173 return true; } if (_sum == 0x37a47be4) { // OwnedAccepter return true; } return false; } }