pragma solidity 0.5.11;
contract IToken {
function balanceOf(address) public view returns (uint256);
function transfer(address to, uint value) public;
}
contract Manageable {
mapping(address => bool) public admins;
constructor() public {
admins[msg.sender] = true;
}
modifier onlyAdmins() {
require(admins[msg.sender]);
_;
}
function modifyAdmins(address[] memory newAdmins, address[] memory removedAdmins) public onlyAdmins {
for(uint256 index; index < newAdmins.length; index++) {
admins[newAdmins[index]] = true;
}
for(uint256 index; index < removedAdmins.length; index++) {
admins[removedAdmins[index]] = false;
}
}
}
contract HotWallet is Manageable {
mapping(uint256 => bool) public isPaid;
event Transfer(uint256 transactionRequestId, address coinAddress, uint256 value, address payable to);
function transfer(uint256 transactionRequestId, address coinAddress, uint256 value, address payable to) public onlyAdmins {
require(!isPaid[transactionRequestId]);
isPaid[transactionRequestId] = true;
emit Transfer(transactionRequestId, coinAddress, value, to);
if (coinAddress == address(0)) {
return to.transfer(value);
}
IToken(coinAddress).transfer(to, value);
}
function getBalances(address coinAddress) public view returns (uint256 balance) {
if (coinAddress == address(0)) {
return address(this).balance;
}
return IToken(coinAddress).balanceOf(address(this));
}
function () external payable {}
}
{
"compilationTarget": {
"browser/HotWallet.sol": "HotWallet"
},
"evmVersion": "petersburg",
"libraries": {},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"constant":false,"inputs":[{"internalType":"address[]","name":"newAdmins","type":"address[]"},{"internalType":"address[]","name":"removedAdmins","type":"address[]"}],"name":"modifyAdmins","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"transactionRequestId","type":"uint256"},{"internalType":"address","name":"coinAddress","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"coinAddress","type":"address"}],"name":"getBalances","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"isPaid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"transactionRequestId","type":"uint256"},{"indexed":false,"internalType":"address","name":"coinAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"},{"indexed":false,"internalType":"address payable","name":"to","type":"address"}],"name":"Transfer","type":"event"}]