/** * Source Code first verified at https://etherscan.io on Tuesday, March 19, 2019 (UTC) */ pragma solidity ^0.5.0; contract Ownable { bool private stopped; address private _owner; address private _master; event Stopped(); event Started(); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event MasterRoleTransferred(address indexed previousMaster, address indexed newMaster); constructor () internal { stopped = false; _owner = msg.sender; _master = msg.sender; emit OwnershipTransferred(address(0), _owner); emit MasterRoleTransferred(address(0), _master); } function owner() public view returns (address) { return _owner; } function master() public view returns (address) { return _master; } modifier onlyOwner() { require(isOwner()); _; } modifier onlyMaster() { require(isMaster() || isOwner()); _; } modifier onlyWhenNotStopped() { require(!isStopped()); _; } function isOwner() public view returns (bool) { return msg.sender == _owner; } function isMaster() public view returns (bool) { return msg.sender == _master; } function transferOwnership(address newOwner) external onlyOwner { _transferOwnership(newOwner); } function transferMasterRole(address newMaster) external onlyOwner { _transferMasterRole(newMaster); } function isStopped() public view returns (bool) { return stopped; } function stop() public onlyOwner { _stop(); } function start() public onlyOwner { _start(); } function _transferOwnership(address newOwner) internal { require(newOwner != address(0)); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } function _transferMasterRole(address newMaster) internal { require(newMaster != address(0)); emit MasterRoleTransferred(_master, newMaster); _master = newMaster; } function _stop() internal { emit Stopped(); stopped = true; } function _start() internal { emit Started(); stopped = false; } } contract AccountWallet is Ownable { mapping(string => string) private btc; mapping(string => address) private eth; event SetAddress(string account, string btcAddress, address ethAddress); event UpdateAddress(string from, string to); event DeleteAddress(string account); constructor (address newMaster) public { _transferMasterRole(newMaster); } function version() external pure returns(string memory) { return '0.0.1'; } function getAddress(string calldata account) external view returns (string memory, address) { return (btc[account], eth[account]); } function setAddress(string calldata account, string calldata btcAddress, address ethAddress) external onlyMaster onlyWhenNotStopped { require(bytes(account).length > 0); btc[account] = btcAddress; eth[account] = ethAddress; emit SetAddress(account, btcAddress, ethAddress); } function updateAccount(string calldata from, string calldata to) external onlyMaster onlyWhenNotStopped { require(bytes(from).length > 0); require(bytes(to).length > 0); btc[to] = btc[from]; eth[to] = eth[from]; btc[from] = ''; eth[from] = address(0); emit UpdateAddress(from, to); } function deleteAccount(string calldata account) external onlyMaster onlyWhenNotStopped { require(bytes(account).length > 0); btc[account] = ''; eth[account] = address(0); emit DeleteAddress(account); } }