文件 1 的 9:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 9:ERC20.sol
pragma solidity ^0.8.0;
import "./IERC20.sol";
import "./extensions/IERC20Metadata.sol";
import "../../utils/Context.sol";
contract ERC20 is Context, IERC20, IERC20Metadata {
mapping(address => uint256) private _balances;
mapping(address => mapping(address => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
function name() public view virtual override returns (string memory) {
return _name;
}
function symbol() public view virtual override returns (string memory) {
return _symbol;
}
function decimals() public view virtual override returns (uint8) {
return 18;
}
function totalSupply() public view virtual override returns (uint256) {
return _totalSupply;
}
function balanceOf(address account) public view virtual override returns (uint256) {
return _balances[account];
}
function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
_transfer(_msgSender(), recipient, amount);
return true;
}
function allowance(address owner, address spender) public view virtual override returns (uint256) {
return _allowances[owner][spender];
}
function approve(address spender, uint256 amount) public virtual override returns (bool) {
_approve(_msgSender(), spender, amount);
return true;
}
function transferFrom(
address sender,
address recipient,
uint256 amount
) public virtual override returns (bool) {
_transfer(sender, recipient, amount);
uint256 currentAllowance = _allowances[sender][_msgSender()];
require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
unchecked {
_approve(sender, _msgSender(), currentAllowance - amount);
}
return true;
}
function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
_approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue);
return true;
}
function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) {
uint256 currentAllowance = _allowances[_msgSender()][spender];
require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
unchecked {
_approve(_msgSender(), spender, currentAllowance - subtractedValue);
}
return true;
}
function _transfer(
address sender,
address recipient,
uint256 amount
) internal virtual {
require(sender != address(0), "ERC20: transfer from the zero address");
require(recipient != address(0), "ERC20: transfer to the zero address");
_beforeTokenTransfer(sender, recipient, amount);
uint256 senderBalance = _balances[sender];
require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
unchecked {
_balances[sender] = senderBalance - amount;
}
_balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
_afterTokenTransfer(sender, recipient, amount);
}
function _mint(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: mint to the zero address");
_beforeTokenTransfer(address(0), account, amount);
_totalSupply += amount;
_balances[account] += amount;
emit Transfer(address(0), account, amount);
_afterTokenTransfer(address(0), account, amount);
}
function _burn(address account, uint256 amount) internal virtual {
require(account != address(0), "ERC20: burn from the zero address");
_beforeTokenTransfer(account, address(0), amount);
uint256 accountBalance = _balances[account];
require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
unchecked {
_balances[account] = accountBalance - amount;
}
_totalSupply -= amount;
emit Transfer(account, address(0), amount);
_afterTokenTransfer(account, address(0), amount);
}
function _approve(
address owner,
address spender,
uint256 amount
) internal virtual {
require(owner != address(0), "ERC20: approve from the zero address");
require(spender != address(0), "ERC20: approve to the zero address");
_allowances[owner][spender] = amount;
emit Approval(owner, spender, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
function _afterTokenTransfer(
address from,
address to,
uint256 amount
) internal virtual {}
}
文件 3 的 9:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 4 的 9:IERC20Metadata.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
interface IERC20Metadata is IERC20 {
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
}
文件 5 的 9:MTGY.sol
pragma solidity ^0.8.4;
import '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import '@openzeppelin/contracts/utils/math/SafeMath.sol';
contract MTGY is IERC20 {
string public constant name = 'The moontography project';
string public constant symbol = 'MTGY';
uint8 public constant decimals = 18;
address public constant burnWallet =
0x000000000000000000000000000000000000dEaD;
address public constant devWallet =
0x3A3ffF4dcFCB7a36dADc40521e575380485FA5B8;
address public constant rewardsWallet =
0x87644cB97C1e2Cc676f278C88D0c4d56aC17e838;
mapping(address => uint256) balances;
mapping(address => mapping(address => uint256)) allowed;
event Spend(address indexed owner, uint256 value);
uint256 totalSupply_;
using SafeMath for uint256;
constructor(uint256 total) {
totalSupply_ = total;
balances[msg.sender] = totalSupply_;
}
function totalSupply() public view override returns (uint256) {
return totalSupply_;
}
function balanceOf(address tokenOwner)
public
view
override
returns (uint256)
{
return balances[tokenOwner];
}
function transfer(address receiver, uint256 numTokens)
public
override
returns (bool)
{
require(numTokens <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(numTokens);
balances[receiver] = balances[receiver].add(numTokens);
emit Transfer(msg.sender, receiver, numTokens);
return true;
}
function approve(address delegate, uint256 numTokens)
public
override
returns (bool)
{
allowed[msg.sender][delegate] = numTokens;
emit Approval(msg.sender, delegate, numTokens);
return true;
}
function allowance(address owner, address delegate)
public
view
override
returns (uint256)
{
return allowed[owner][delegate];
}
function transferFrom(
address owner,
address buyer,
uint256 numTokens
) public override returns (bool) {
require(numTokens <= balances[owner]);
require(numTokens <= allowed[owner][msg.sender]);
balances[owner] = balances[owner].sub(numTokens);
allowed[owner][msg.sender] = allowed[owner][msg.sender].sub(numTokens);
balances[buyer] = balances[buyer].add(numTokens);
emit Transfer(owner, buyer, numTokens);
return true;
}
function spendOnProduct(uint256 amountTokens) public returns (bool) {
require(amountTokens <= balances[msg.sender]);
balances[msg.sender] = balances[msg.sender].sub(amountTokens);
uint256 half = amountTokens / 2;
uint256 quarter = half / 2;
balances[burnWallet] = balances[burnWallet].add(half);
balances[rewardsWallet] = balances[rewardsWallet].add(quarter);
balances[devWallet] = balances[devWallet].add(
amountTokens - half - quarter
);
emit Spend(msg.sender, amountTokens);
return true;
}
}
文件 6 的 9:MTGYAtomicSwapInstance.sol
pragma solidity ^0.8.4;
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
import '@openzeppelin/contracts/access/Ownable.sol';
import './MTGY.sol';
import './MTGYSpend.sol';
contract MTGYAtomicSwapInstance is Ownable {
MTGY private _mtgy;
MTGYSpend private _spend;
ERC20 private _token;
address public tokenOwner;
address public oracleAddress;
uint256 public originalSupply;
uint256 public maxSwapAmount;
uint256 public mtgyServiceCost = 1 * 10**18;
uint256 public minimumGasForOperation = 2 * 10**15;
bool public isActive = true;
struct Swap {
bytes32 id;
uint256 origTimestamp;
uint256 currentTimestamp;
bool isOutbound;
bool isComplete;
bool isRefunded;
bool isSendGasFunded;
address swapAddress;
uint256 amount;
}
mapping(bytes32 => Swap) public swaps;
mapping(address => Swap) public lastUserSwap;
event ReceiveTokensFromSource(
bytes32 indexed id,
uint256 origTimestamp,
address sender,
uint256 amount
);
event SendTokensToDestination(
bytes32 indexed id,
address receiver,
uint256 amount
);
event RefundTokensToSource(
bytes32 indexed id,
address sender,
uint256 amount
);
event TokenOwnerUpdated(address previousOwner, address newOwner);
constructor(
address _mtgyAddress,
address _mtgySpendAddress,
address _oracleAddress,
address _tokenOwner,
address _tokenAddy,
uint256 _maxSwapAmount
) {
oracleAddress = _oracleAddress;
tokenOwner = _tokenOwner;
maxSwapAmount = _maxSwapAmount;
_mtgy = MTGY(_mtgyAddress);
_spend = MTGYSpend(_mtgySpendAddress);
_token = ERC20(_tokenAddy);
}
function getSwapTokenAddress() external view returns (address) {
return address(_token);
}
function changeActiveState(bool _isActive) external {
require(
msg.sender == owner() || msg.sender == tokenOwner,
'changeActiveState user must be contract creator'
);
isActive = _isActive;
}
function changeMtgyServiceCost(uint256 _newCost) external onlyOwner {
mtgyServiceCost = _newCost;
}
function updateSupply() external onlyOwner {
originalSupply = _token.balanceOf(address(this));
}
function changeOracleAddress(address _oracleAddress) external onlyOwner {
oracleAddress = _oracleAddress;
transferOwnership(oracleAddress);
}
function updateTokenOwner(address newOwner) external {
require(
msg.sender == tokenOwner || msg.sender == owner(),
'user must be current token owner to change it'
);
address previousOwner = tokenOwner;
tokenOwner = newOwner;
emit TokenOwnerUpdated(previousOwner, newOwner);
}
function depositTokens(uint256 _amount) external {
require(msg.sender == tokenOwner, 'depositTokens user must be token owner');
_token.transferFrom(msg.sender, address(this), _amount);
}
function withdrawTokens(uint256 _amount) external {
require(
msg.sender == tokenOwner,
'withdrawTokens user must be token owner'
);
_token.transfer(msg.sender, _amount);
}
function updateSwapCompletionStatus(bytes32 _id, bool _isComplete)
external
onlyOwner
{
swaps[_id].isComplete = _isComplete;
}
function updateMinimumGasForOperation(uint256 _amountGas) external onlyOwner {
minimumGasForOperation = _amountGas;
}
function receiveTokensFromSource(uint256 _amount)
external
payable
returns (bytes32, uint256)
{
require(isActive, 'this atomic swap instance is not active');
require(
msg.value >= minimumGasForOperation,
'you must also send enough gas to cover the target transaction'
);
require(
maxSwapAmount == 0 || _amount <= maxSwapAmount,
'trying to send more than maxSwapAmount'
);
if (mtgyServiceCost > 0) {
_mtgy.transferFrom(msg.sender, address(this), mtgyServiceCost);
_mtgy.approve(address(_spend), mtgyServiceCost);
_spend.spendOnProduct(mtgyServiceCost);
}
payable(oracleAddress).transfer(msg.value);
_token.transferFrom(msg.sender, address(this), _amount);
uint256 _ts = block.timestamp;
bytes32 _id = sha256(abi.encodePacked(msg.sender, _ts, _amount));
swaps[_id] = Swap({
id: _id,
origTimestamp: _ts,
currentTimestamp: _ts,
isOutbound: false,
isComplete: false,
isRefunded: false,
isSendGasFunded: false,
swapAddress: msg.sender,
amount: _amount
});
lastUserSwap[msg.sender] = swaps[_id];
emit ReceiveTokensFromSource(_id, _ts, msg.sender, _amount);
return (_id, _ts);
}
function unsetLastUserSwap(address _addy) external onlyOwner {
delete lastUserSwap[_addy];
}
function fundSendToDestinationGas(
bytes32 _id,
uint256 _origTimestamp,
uint256 _amount
) external payable {
require(
msg.value >= minimumGasForOperation,
'you must send enough gas to cover the send transaction'
);
require(
_id == sha256(abi.encodePacked(msg.sender, _origTimestamp, _amount)),
"we don't recognize this swap"
);
payable(oracleAddress).transfer(msg.value);
swaps[_id] = Swap({
id: _id,
origTimestamp: _origTimestamp,
currentTimestamp: block.timestamp,
isOutbound: true,
isComplete: false,
isRefunded: false,
isSendGasFunded: true,
swapAddress: msg.sender,
amount: _amount
});
}
function refundTokensFromSource(bytes32 _id) external {
require(isActive, 'this atomic swap instance is not active');
Swap storage swap = swaps[_id];
_confirmSwapExistsGasFundedAndSenderValid(swap);
swap.isRefunded = true;
_token.transfer(swap.swapAddress, swap.amount);
emit RefundTokensToSource(_id, swap.swapAddress, swap.amount);
}
function sendTokensToDestination(bytes32 _id) external returns (bytes32) {
require(isActive, 'this atomic swap instance is not active');
Swap storage swap = swaps[_id];
_confirmSwapExistsGasFundedAndSenderValid(swap);
_token.transfer(swap.swapAddress, swap.amount);
swap.currentTimestamp = block.timestamp;
swap.isComplete = true;
emit SendTokensToDestination(_id, swap.swapAddress, swap.amount);
return _id;
}
function _confirmSwapExistsGasFundedAndSenderValid(Swap memory swap)
private
view
onlyOwner
{
require(
swap.origTimestamp > 0 && swap.amount > 0,
'swap does not exist yet.'
);
require(
!swap.isComplete && !swap.isRefunded && swap.isSendGasFunded,
'swap has already been completed, refunded, or gas has not been funded'
);
}
}
文件 7 的 9:MTGYSpend.sol
pragma solidity ^0.8.4;
import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/token/ERC20/ERC20.sol';
contract MTGYSpend is Ownable {
ERC20 private _mtgy;
struct SpentInfo {
uint256 timestamp;
uint256 tokens;
}
address public constant burnWallet =
0x000000000000000000000000000000000000dEaD;
address public devWallet = 0x3A3ffF4dcFCB7a36dADc40521e575380485FA5B8;
address public rewardsWallet = 0x87644cB97C1e2Cc676f278C88D0c4d56aC17e838;
address public mtgyTokenAddy;
SpentInfo[] public spentTimestamps;
uint256 public totalSpent = 0;
event Spend(address indexed owner, uint256 value);
constructor(address _mtgyTokenAddy) {
mtgyTokenAddy = _mtgyTokenAddy;
_mtgy = ERC20(_mtgyTokenAddy);
}
function changeMtgyTokenAddy(address _mtgyAddy) external onlyOwner {
mtgyTokenAddy = _mtgyAddy;
_mtgy = ERC20(_mtgyAddy);
}
function changeDevWallet(address _newDevWallet) external onlyOwner {
devWallet = _newDevWallet;
}
function changeRewardsWallet(address _newRewardsWallet) external onlyOwner {
rewardsWallet = _newRewardsWallet;
}
function getSpentByTimestamp() external view returns (SpentInfo[] memory) {
return spentTimestamps;
}
function spendOnProduct(uint256 _productCostTokens) external returns (bool) {
totalSpent += _productCostTokens;
spentTimestamps.push(
SpentInfo({ timestamp: block.timestamp, tokens: _productCostTokens })
);
uint256 _half = _productCostTokens / uint256(2);
uint256 _quarter = _half / uint256(2);
_mtgy.transferFrom(msg.sender, burnWallet, _half);
_mtgy.transferFrom(msg.sender, rewardsWallet, _quarter);
_mtgy.transferFrom(
msg.sender,
devWallet,
_productCostTokens - _half - _quarter
);
emit Spend(msg.sender, _productCostTokens);
return true;
}
}
文件 8 的 9:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 9 的 9:SafeMath.sol
pragma solidity ^0.8.0;
library SafeMath {
function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
uint256 c = a + b;
if (c < a) return (false, 0);
return (true, c);
}
}
function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b > a) return (false, 0);
return (true, a - b);
}
}
function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (a == 0) return (true, 0);
uint256 c = a * b;
if (c / a != b) return (false, 0);
return (true, c);
}
}
function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a / b);
}
}
function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
unchecked {
if (b == 0) return (false, 0);
return (true, a % b);
}
}
function add(uint256 a, uint256 b) internal pure returns (uint256) {
return a + b;
}
function sub(uint256 a, uint256 b) internal pure returns (uint256) {
return a - b;
}
function mul(uint256 a, uint256 b) internal pure returns (uint256) {
return a * b;
}
function div(uint256 a, uint256 b) internal pure returns (uint256) {
return a / b;
}
function mod(uint256 a, uint256 b) internal pure returns (uint256) {
return a % b;
}
function sub(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b <= a, errorMessage);
return a - b;
}
}
function div(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a / b;
}
}
function mod(
uint256 a,
uint256 b,
string memory errorMessage
) internal pure returns (uint256) {
unchecked {
require(b > 0, errorMessage);
return a % b;
}
}
}
{
"compilationTarget": {
"contracts/MTGYAtomicSwapInstance.sol": "MTGYAtomicSwapInstance"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[{"internalType":"address","name":"_mtgyAddress","type":"address"},{"internalType":"address","name":"_mtgySpendAddress","type":"address"},{"internalType":"address","name":"_oracleAddress","type":"address"},{"internalType":"address","name":"_tokenOwner","type":"address"},{"internalType":"address","name":"_tokenAddy","type":"address"},{"internalType":"uint256","name":"_maxSwapAmount","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"origTimestamp","type":"uint256"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ReceiveTokensFromSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RefundTokensToSource","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"id","type":"bytes32"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SendTokensToDestination","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":false,"internalType":"address","name":"newOwner","type":"address"}],"name":"TokenOwnerUpdated","type":"event"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"changeActiveState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"changeMtgyServiceCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_oracleAddress","type":"address"}],"name":"changeOracleAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"uint256","name":"_origTimestamp","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fundSendToDestinationGas","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getSwapTokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastUserSwap","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"origTimestamp","type":"uint256"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"bool","name":"isOutbound","type":"bool"},{"internalType":"bool","name":"isComplete","type":"bool"},{"internalType":"bool","name":"isRefunded","type":"bool"},{"internalType":"bool","name":"isSendGasFunded","type":"bool"},{"internalType":"address","name":"swapAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSwapAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minimumGasForOperation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mtgyServiceCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oracleAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"originalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"receiveTokensFromSource","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"refundTokensFromSource","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"}],"name":"sendTokensToDestination","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"swaps","outputs":[{"internalType":"bytes32","name":"id","type":"bytes32"},{"internalType":"uint256","name":"origTimestamp","type":"uint256"},{"internalType":"uint256","name":"currentTimestamp","type":"uint256"},{"internalType":"bool","name":"isOutbound","type":"bool"},{"internalType":"bool","name":"isComplete","type":"bool"},{"internalType":"bool","name":"isRefunded","type":"bool"},{"internalType":"bool","name":"isSendGasFunded","type":"bool"},{"internalType":"address","name":"swapAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addy","type":"address"}],"name":"unsetLastUserSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountGas","type":"uint256"}],"name":"updateMinimumGasForOperation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updateSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_id","type":"bytes32"},{"internalType":"bool","name":"_isComplete","type":"bool"}],"name":"updateSwapCompletionStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateTokenOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]