/**
*Submitted for verification at Etherscan.io on 2021-11-26
*/
/**
*Submitted for verification at Etherscan.io on 2021-10-15
*/
pragma solidity ^0.4.21;
/**
* @title SafeMath
* @dev Math operations with safety checks that throw on error
*/
library SafeMath {
/**
* mul
* @dev Safe math multiply function
*/
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a * b;
assert(a == 0 || c / a == b);
return c;
}
/**
* add
* @dev Safe math addition function
*/
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
assert(c >= a);
return c;
}
}
/**
* @title Ownable
* @dev Ownable has an owner address to simplify "user permissions".
*/
contract Ownable {
address public owner;
/**
* Ownable
* @dev Ownable constructor sets the `owner` of the contract to sender
*/
function Ownable() public {
owner = 0x5ff4e128e7dC3a3ab4f2a61510272472fDd759A4; //msg.sender;
}
/**
* ownerOnly
* @dev Throws an error if called by any account other than the owner.
*/
modifier onlyOwner() {
require(msg.sender == owner);
_;
}
/**
* transferOwnership
* @dev Allows the current owner to transfer control of the contract to a newOwner.
* @param newOwner The address to transfer ownership to.
*/
function transferOwnership(address newOwner) public onlyOwner {
require(newOwner != address(0));
owner = newOwner;
}
}
/**
* @title Token
* @dev API interface for interacting with the WILD Token contract
*/
interface Token {
function transfer(address _to, uint256 _value) external returns (bool);
function balanceOf(address _owner) external constant returns (uint256 balance);
}
/**
* @title ShareringSwap
* @dev ShareringSwap contract is Ownable
**/
contract ShareringSwap is Ownable {
using SafeMath for uint256;
Token token;
address public requester;
address public approver;
struct typeTxInfo {
address to;
uint256 value;
bytes32 transactionId;
uint status;
}
mapping(bytes32 => typeTxInfo) public Txs;
/**
* RequestSwap
* @dev Log swap request
*/
event RequestSwap(bytes32 transactionId, address indexed to, uint256 value);
/**
* Reject Swap
* @dev Log swap approval
*/
event RejectSwap(bytes32 transactionId, address indexed to, uint256 value);
/**
* ApprovalSwap
* @dev Log swap approval
*/
event ApprovalSwap(bytes32 transactionId, address indexed to, uint256 value);
/**
* onlyApprover
* @dev Throws an error if called by any account other than the approver.
**/
modifier onlyApprover() {
require(msg.sender == approver);
_;
}
/**
* onlyRequester
* @dev Throws an error if called by any account other than the approver.
**/
modifier onlyRequester() {
require(msg.sender == requester);
_;
}
/**
* ShareringSwap
* @dev ShareringSwap constructor
**/
function ShareringSwap(address _tokenAddr, address _requester, address _approver) public {
require(_tokenAddr != 0);
token = Token(_tokenAddr);
requester = _requester;
approver = _approver;
}
/**
* tokensAvailable
* @dev returns the number of tokens allocated to this contract
**/
function tokensAvailable() public constant returns (uint256) {
return token.balanceOf(this);
}
/**
* withdraw
**/
function withdraw() onlyOwner public {
// Transfer tokens back to owner
uint256 balance = token.balanceOf(this);
assert(balance > 0);
token.transfer(owner, balance);
}
/**
* set Approval Address
**/
function setApprover(address _approver) onlyOwner public {
approver = _approver;
}
/**
* set Requester Address
**/
function setRequester(address _requester) onlyOwner public {
requester = _requester;
}
/**
* tx info
* @dev returns the tx info
**/
function txInfo(bytes32 _transactionId) public constant returns (address, uint256, uint) {
return (Txs[_transactionId].to, Txs[_transactionId].value, Txs[_transactionId].status);
}
/**
* Request swap
**/
function requestSwap(bytes32 _transactionId, address _to, uint256 _amount) onlyRequester public {
Txs[_transactionId].transactionId = _transactionId;
Txs[_transactionId].to = _to;
Txs[_transactionId].value = _amount;
Txs[_transactionId].status = 1;
emit RequestSwap(_transactionId, _to, _amount);
}
/**
* Reject swap
**/
function rejectSwap(bytes32 _transactionId) onlyApprover public {
assert(Txs[_transactionId].status == 1);
Txs[_transactionId].status = 3;
emit RejectSwap(_transactionId, Txs[_transactionId].to, Txs[_transactionId].value);
}
/**
* Reject multi swap
**/
function rejectMultiSwap(bytes32[] _transactionIds) onlyApprover public {
for (uint i = 0; i < _transactionIds.length; i++) {
rejectSwap(_transactionIds[i]);
}
}
/**
* Approve swap
**/
function approveSwap(bytes32 _transactionId) onlyApprover public {
uint256 balance = token.balanceOf(this);
assert(balance > Txs[_transactionId].value);
assert(Txs[_transactionId].status == 1);
token.transfer(Txs[_transactionId].to, Txs[_transactionId].value);
Txs[_transactionId].status = 2;
emit ApprovalSwap(_transactionId, Txs[_transactionId].to, Txs[_transactionId].value);
}
/**
* Approve multi swap
**/
function approveMultiSwap(bytes32[] _transactionIds) onlyApprover public {
for (uint i = 0; i < _transactionIds.length; i++) {
approveSwap(_transactionIds[i]);
}
}
}
{
"compilationTarget": {
"ShareringSwap.sol": "ShareringSwap"
},
"evmVersion": "byzantium",
"libraries": {},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"constant":true,"inputs":[{"name":"_transactionId","type":"bytes32"}],"name":"txInfo","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"approver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_requester","type":"address"}],"name":"setRequester","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_transactionIds","type":"bytes32[]"}],"name":"rejectMultiSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_approver","type":"address"}],"name":"setApprover","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensAvailable","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionIds","type":"bytes32[]"}],"name":"approveMultiSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionId","type":"bytes32"}],"name":"rejectSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"requester","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionId","type":"bytes32"}],"name":"approveSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"Txs","outputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"},{"name":"transactionId","type":"bytes32"},{"name":"status","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_transactionId","type":"bytes32"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"requestSwap","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_tokenAddr","type":"address"},{"name":"_requester","type":"address"},{"name":"_approver","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"transactionId","type":"bytes32"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"RequestSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"transactionId","type":"bytes32"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"RejectSwap","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"transactionId","type":"bytes32"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"ApprovalSwap","type":"event"}]