Source Code
Overview
ETH Balance
0 ETH
Token Holdings
More Info
ContractCreator
Multichain Info
N/A
Latest 25 from a total of 92 transactions
| Transaction Hash |
Method
|
Block
|
From
|
To
|
Amount
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Release Escrow | 177945289 | 179 days ago | IN | 0 ETH | 0.0000068 | ||||
| Deposit Escrow | 177945285 | 179 days ago | IN | 0 ETH | 0.00001166 | ||||
| Initiate Escrow ... | 177945278 | 179 days ago | IN | 0 ETH | 0.00002407 | ||||
| Grant Role | 177945267 | 179 days ago | IN | 0 ETH | 0.00000511 | ||||
| Release Escrow | 177944685 | 179 days ago | IN | 0 ETH | 0.0000068 | ||||
| Deposit Escrow | 177944681 | 179 days ago | IN | 0 ETH | 0.00001214 | ||||
| Initiate Escrow ... | 177944673 | 179 days ago | IN | 0 ETH | 0.00002407 | ||||
| Release Escrow | 177924951 | 179 days ago | IN | 0 ETH | 0.0000068 | ||||
| Deposit Escrow | 177924947 | 179 days ago | IN | 0 ETH | 0.00001214 | ||||
| Initiate Escrow ... | 177924939 | 179 days ago | IN | 0 ETH | 0.00002407 | ||||
| Grant Role | 177924932 | 179 days ago | IN | 0 ETH | 0.00000511 | ||||
| Release Escrow | 177922627 | 179 days ago | IN | 0 ETH | 0.0000068 | ||||
| Deposit Escrow | 177922623 | 179 days ago | IN | 0 ETH | 0.00001214 | ||||
| Initiate Escrow ... | 177922614 | 179 days ago | IN | 0 ETH | 0.00002406 | ||||
| Initiate Escrow ... | 177921995 | 179 days ago | IN | 0 ETH | 0.00002407 | ||||
| Initiate Escrow ... | 177920097 | 179 days ago | IN | 0 ETH | 0.00002407 | ||||
| Release Escrow | 177384703 | 180 days ago | IN | 0 ETH | 0.00000728 | ||||
| Deposit Escrow | 177384697 | 180 days ago | IN | 0 ETH | 0.00001043 | ||||
| Initiate Escrow ... | 177384691 | 180 days ago | IN | 0 ETH | 0.00002407 | ||||
| Release Escrow | 177384413 | 180 days ago | IN | 0 ETH | 0.00000728 | ||||
| Deposit Escrow | 177384407 | 180 days ago | IN | 0 ETH | 0.00001043 | ||||
| Initiate Escrow ... | 177384399 | 180 days ago | IN | 0 ETH | 0.00002407 | ||||
| Release Escrow | 177383752 | 180 days ago | IN | 0 ETH | 0.00000728 | ||||
| Deposit Escrow | 177383706 | 180 days ago | IN | 0 ETH | 0.00001043 | ||||
| Initiate Escrow ... | 177383664 | 180 days ago | IN | 0 ETH | 0.00002407 |
Loading...
Loading
Contract Name:
XFTAssetSwaps
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
/** SPDX-License-Identifier: MIT
██ ██ ███████ ████████
██ ██ ██ ██
███ █████ ██
██ ██ ██ ██
██ ██ ██ ██
*/
pragma solidity 0.8.18;
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
interface IERC20Mintable {
function mint(address to, uint256 amount) external;
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
interface IERC20Burnable {
function burn(address from, uint256 amount) external;
function transferFrom(address from, address to, uint256 amount) external returns (bool);
function transfer(address to, uint256 amount) external returns (bool);
function balanceOf(address account) external view returns (uint256);
}
contract XFTAssetSwaps is ReentrancyGuard, AccessControl {
bytes32 public constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
struct Swap {
address initiator;
address participant;
address initiatorAsset;
address participantAsset;
uint256 initiatorAmount;
uint256 participantAmount;
bytes32 hashlock;
uint256 timelock;
bool initiatorDeposited;
bool participantDeposited;
bool completed;
bool refunded;
bool isAtomicMint;
bool isAtomicBurn;
bool isEscrowMint;
}
mapping(bytes32 => Swap) public swaps;
bytes32[] public swapIds;
event SwapInitiated(
bytes32 indexed swapId,
address indexed initiator,
address indexed participant,
address initiatorAsset,
uint256 initiatorAmount,
bytes32 hashlock,
uint256 timelock,
bool isAtomicMint,
bool isAtomicBurn,
bool isEscrowMint
);
event SwapParticipated(
bytes32 indexed swapId,
address indexed participant,
address participantAsset,
uint256 participantAmount
);
event SwapCompleted(
bytes32 indexed swapId,
bytes32 preimage
);
event SwapRefunded(
bytes32 indexed swapId,
address indexed refunder
);
event AtomicMintExecuted(
bytes32 indexed swapId,
address indexed user,
address burnToken,
address mintToken,
uint256 amount
);
event AtomicBurnExecuted(
bytes32 indexed swapId,
address indexed user,
address burnToken,
address mintToken,
uint256 amount
);
event EscrowDeposited(
bytes32 indexed swapId,
address indexed user,
uint256 amount
);
event EscrowReleased(
bytes32 indexed swapId
);
event EscrowRefunded(
bytes32 indexed swapId
);
modifier swapExists(bytes32 _swapId) {
require(swaps[_swapId].initiator != address(0), "Swap does not exist");
_;
}
modifier onlyInitiator(bytes32 _swapId) {
require(msg.sender == swaps[_swapId].initiator, "Only initiator allowed");
_;
}
modifier onlyParticipant(bytes32 _swapId) {
require(msg.sender == swaps[_swapId].participant, "Only participant allowed");
_;
}
constructor() {
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(ADMIN_ROLE, 0x2f572059DbC598C8acfeA4AF06FE4f7669D1b3b1);
}
function initiateSwap(
bytes32 _swapId,
address _participant,
address _initiatorAsset,
address _participantAsset,
uint256 _initiatorAmount,
uint256 _participantAmount,
bytes32 _hashlock,
uint256 _timelock
) external nonReentrant {
require(swaps[_swapId].initiator == address(0), "Swap exists");
require(_participant != address(0), "Invalid participant");
require(_participant != msg.sender, "Self swap not allowed");
require(_initiatorAmount > 0 && _participantAmount > 0, "Invalid amounts");
require(_timelock > block.timestamp, "Timelock must be future");
require(_hashlock != bytes32(0), "Invalid hashlock");
swaps[_swapId] = Swap({
initiator: msg.sender,
participant: _participant,
initiatorAsset: _initiatorAsset,
participantAsset: _participantAsset,
initiatorAmount: _initiatorAmount,
participantAmount: _participantAmount,
hashlock: _hashlock,
timelock: _timelock,
initiatorDeposited: false,
participantDeposited: false,
completed: false,
refunded: false,
isAtomicMint: false,
isAtomicBurn: false,
isEscrowMint: false
});
require(
IERC20Mintable(_initiatorAsset).transferFrom(msg.sender, address(this), _initiatorAmount),
"Initiator transfer failed"
);
swaps[_swapId].initiatorDeposited = true;
swapIds.push(_swapId);
emit SwapInitiated(
_swapId,
msg.sender,
_participant,
_initiatorAsset,
_initiatorAmount,
_hashlock,
_timelock,
false,
false,
false
);
}
function participateSwap(bytes32 _swapId)
external
nonReentrant
swapExists(_swapId)
onlyParticipant(_swapId)
{
Swap storage swap = swaps[_swapId];
require(!swap.participantDeposited, "Already participated");
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp < swap.timelock, "Swap expired");
require(
IERC20Mintable(swap.participantAsset).transferFrom(msg.sender, address(this), swap.participantAmount),
"Participant transfer failed"
);
swap.participantDeposited = true;
emit SwapParticipated(
_swapId,
msg.sender,
swap.participantAsset,
swap.participantAmount
);
}
function claimSwap(bytes32 _swapId, bytes32 _preimage)
external
nonReentrant
swapExists(_swapId)
{
Swap storage swap = swaps[_swapId];
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(swap.initiatorDeposited && swap.participantDeposited, "Deposit missing");
require(block.timestamp < swap.timelock, "Swap expired");
require(sha256(abi.encodePacked(_preimage)) == swap.hashlock, "Bad preimage");
swap.completed = true;
require(
IERC20Mintable(swap.participantAsset).transfer(swap.initiator, swap.participantAmount),
"To initiator failed"
);
require(
IERC20Mintable(swap.initiatorAsset).transfer(swap.participant, swap.initiatorAmount),
"To participant failed"
);
emit SwapCompleted(_swapId, _preimage);
}
function refundSwap(bytes32 _swapId)
external
nonReentrant
swapExists(_swapId)
{
Swap storage swap = swaps[_swapId];
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp >= swap.timelock, "Too early");
require(
msg.sender == swap.initiator || msg.sender == swap.participant,
"Not swap party"
);
swap.refunded = true;
if (swap.initiatorDeposited) {
require(
IERC20Mintable(swap.initiatorAsset).transfer(swap.initiator, swap.initiatorAmount),
"Refund initiator failed"
);
}
if (swap.participantDeposited) {
require(
IERC20Mintable(swap.participantAsset).transfer(swap.participant, swap.participantAmount),
"Refund participant failed"
);
}
emit SwapRefunded(_swapId, msg.sender);
}
function initiateAtomicMint(
bytes32 _swapId,
address _user,
address _burnToken,
address _mintToken,
uint256 _amount,
bytes32 _hashlock,
uint256 _timelock
) external nonReentrant onlyRole(ADMIN_ROLE) {
require(swaps[_swapId].initiator == address(0), "Swap exists");
require(_user != address(0), "Invalid user");
require(_amount > 0, "Invalid amount");
require(_timelock > block.timestamp, "Timelock must be future");
require(_hashlock != bytes32(0), "Invalid hashlock");
swaps[_swapId] = Swap({
initiator: _user,
participant: address(this),
initiatorAsset: _burnToken,
participantAsset: _mintToken,
initiatorAmount: _amount,
participantAmount: _amount,
hashlock: _hashlock,
timelock: _timelock,
initiatorDeposited: false,
participantDeposited: true,
completed: false,
refunded: false,
isAtomicMint: true,
isAtomicBurn: false,
isEscrowMint: false
});
swapIds.push(_swapId);
emit SwapInitiated(
_swapId,
_user,
address(this),
_burnToken,
_amount,
_hashlock,
_timelock,
true,
false,
false
);
}
function initiateAtomicBurn(
bytes32 _swapId,
address _user,
address _burnToken,
address _mintToken,
uint256 _amount,
bytes32 _hashlock,
uint256 _timelock
) external nonReentrant onlyRole(ADMIN_ROLE) {
require(swaps[_swapId].initiator == address(0), "Swap exists");
require(_user != address(0), "Invalid user");
require(_amount > 0, "Invalid amount");
require(_timelock > block.timestamp, "Timelock must be future");
require(_hashlock != bytes32(0), "Invalid hashlock");
swaps[_swapId] = Swap({
initiator: _user,
participant: address(this),
initiatorAsset: _burnToken,
participantAsset: _mintToken,
initiatorAmount: _amount,
participantAmount: _amount,
hashlock: _hashlock,
timelock: _timelock,
initiatorDeposited: false,
participantDeposited: true,
completed: false,
refunded: false,
isAtomicMint: false,
isAtomicBurn: true,
isEscrowMint: false
});
swapIds.push(_swapId);
emit SwapInitiated(
_swapId,
_user,
address(this),
_burnToken,
_amount,
_hashlock,
_timelock,
false,
true,
false
);
}
function initiateEscrowMint(
bytes32 _swapId,
address _user,
address _escrowToken,
address _mintToken,
uint256 _amount,
uint256 _timelock
) external nonReentrant onlyRole(ADMIN_ROLE) {
require(swaps[_swapId].initiator == address(0), "Swap exists");
require(_user != address(0), "Invalid user");
require(_amount > 0, "Invalid amount");
require(_timelock > block.timestamp, "Timelock must be future");
swaps[_swapId] = Swap({
initiator: _user,
participant: address(this),
initiatorAsset: _escrowToken,
participantAsset: _mintToken,
initiatorAmount: _amount,
participantAmount: _amount,
hashlock: bytes32(0),
timelock: _timelock,
initiatorDeposited: false,
participantDeposited: true,
completed: false,
refunded: false,
isAtomicMint: false,
isAtomicBurn: false,
isEscrowMint: true
});
swapIds.push(_swapId);
emit SwapInitiated(
_swapId,
_user,
address(this),
_escrowToken,
_amount,
bytes32(0),
_timelock,
false,
false,
true
);
}
function depositEscrow(bytes32 _swapId)
external
nonReentrant
swapExists(_swapId)
{
Swap storage swap = swaps[_swapId];
require(msg.sender == swap.initiator, "Only initiator allowed");
require(swap.isEscrowMint, "Not escrow mint swap");
require(!swap.initiatorDeposited, "Already deposited");
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp < swap.timelock, "Swap expired");
require(
IERC20Mintable(swap.initiatorAsset).transferFrom(msg.sender, address(this), swap.initiatorAmount),
"Escrow transfer failed"
);
IERC20Mintable(swap.participantAsset).mint(msg.sender, swap.participantAmount);
swap.initiatorDeposited = true;
emit EscrowDeposited(_swapId, msg.sender, swap.initiatorAmount);
}
function releaseEscrow(bytes32 _swapId)
external
nonReentrant
onlyRole(ADMIN_ROLE)
swapExists(_swapId)
{
Swap storage swap = swaps[_swapId];
require(swap.isEscrowMint, "Not escrow mint swap");
require(swap.initiatorDeposited, "No deposit");
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp < swap.timelock, "Swap expired");
IERC20Burnable(swap.initiatorAsset).burn(address(this), swap.initiatorAmount);
swap.completed = true;
emit EscrowReleased(_swapId);
emit SwapCompleted(_swapId, bytes32(0));
}
function refundEscrow(bytes32 _swapId)
external
nonReentrant
onlyRole(ADMIN_ROLE)
swapExists(_swapId)
{
Swap storage swap = swaps[_swapId];
require(swap.isEscrowMint, "Not escrow mint swap");
require(swap.initiatorDeposited, "No deposit");
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
IERC20Burnable(swap.participantAsset).burn(swap.initiator, swap.participantAmount);
require(
IERC20Mintable(swap.initiatorAsset).transfer(swap.initiator, swap.initiatorAmount),
"Refund escrow failed"
);
swap.refunded = true;
emit EscrowRefunded(_swapId);
emit SwapRefunded(_swapId, msg.sender);
}
function executeAtomicMint(
bytes32 _swapId,
bytes32 _preimage
) external nonReentrant onlyRole(ADMIN_ROLE) swapExists(_swapId) {
Swap storage swap = swaps[_swapId];
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp < swap.timelock, "Swap expired");
require(sha256(abi.encodePacked(_preimage)) == swap.hashlock, "Bad preimage");
require(swap.isAtomicMint, "Not atomic mint swap");
swap.completed = true;
IERC20Burnable(swap.initiatorAsset).burn(swap.initiator, swap.initiatorAmount);
IERC20Mintable(swap.participantAsset).mint(swap.initiator, swap.participantAmount);
emit AtomicMintExecuted(
_swapId,
swap.initiator,
swap.initiatorAsset,
swap.participantAsset,
swap.initiatorAmount
);
emit SwapCompleted(_swapId, _preimage);
}
function executeAtomicBurn(
bytes32 _swapId,
bytes32 _preimage
) external nonReentrant onlyRole(ADMIN_ROLE) swapExists(_swapId) {
Swap storage swap = swaps[_swapId];
require(!swap.completed, "Swap completed");
require(!swap.refunded, "Swap refunded");
require(block.timestamp < swap.timelock, "Swap expired");
require(sha256(abi.encodePacked(_preimage)) == swap.hashlock, "Bad preimage");
require(swap.isAtomicBurn, "Not atomic burn swap");
swap.completed = true;
IERC20Burnable(swap.initiatorAsset).burn(swap.initiator, swap.initiatorAmount);
IERC20Mintable(swap.participantAsset).mint(swap.initiator, swap.participantAmount);
emit AtomicBurnExecuted(
_swapId,
swap.initiator,
swap.initiatorAsset,
swap.participantAsset,
swap.initiatorAmount
);
emit SwapCompleted(_swapId, _preimage);
}
function getSwap(bytes32 _swapId)
external
view
returns (
address initiator,
address participant,
address initiatorAsset,
address participantAsset,
uint256 initiatorAmount,
uint256 participantAmount,
bytes32 hashlock,
uint256 timelock,
bool initiatorDeposited,
bool participantDeposited,
bool completed,
bool refunded,
bool isAtomicMint,
bool isAtomicBurn,
bool isEscrowMint
)
{
Swap storage swap = swaps[_swapId];
return (
swap.initiator,
swap.participant,
swap.initiatorAsset,
swap.participantAsset,
swap.initiatorAmount,
swap.participantAmount,
swap.hashlock,
swap.timelock,
swap.initiatorDeposited,
swap.participantDeposited,
swap.completed,
swap.refunded,
swap.isAtomicMint,
swap.isAtomicBurn,
swap.isEscrowMint
);
}
function getAllSwaps() external view returns (bytes32[] memory) {
return swapIds;
}
function getSwapCount() external view returns (uint256) {
return swapIds.length;
}
function getSwapByIndex(uint256 _index) external view returns (
bytes32 swapId,
address initiator,
address participant,
address initiatorAsset,
address participantAsset,
uint256 initiatorAmount,
uint256 participantAmount,
bool completed,
bool refunded,
bool isAtomicMint,
bool isAtomicBurn,
bool isEscrowMint
) {
require(_index < swapIds.length, "Index out of bounds");
bytes32 id = swapIds[_index];
Swap storage swap = swaps[id];
return (
id,
swap.initiator,
swap.participant,
swap.initiatorAsset,
swap.participantAsset,
swap.initiatorAmount,
swap.participantAmount,
swap.completed,
swap.refunded,
swap.isAtomicMint,
swap.isAtomicBurn,
swap.isEscrowMint
);
}
function getActiveSwaps() external view returns (bytes32[] memory) {
bytes32[] memory activeSwaps = new bytes32[](swapIds.length);
uint256 activeCount = 0;
for (uint256 i = 0; i < swapIds.length; i++) {
bytes32 id = swapIds[i];
Swap storage swap = swaps[id];
if (!swap.completed && !swap.refunded && block.timestamp < swap.timelock) {
activeSwaps[activeCount] = id;
activeCount++;
}
}
bytes32[] memory result = new bytes32[](activeCount);
for (uint256 i = 0; i < activeCount; i++) {
result[i] = activeSwaps[i];
}
return result;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol)
pragma solidity ^0.8.0;
import "./IAccessControl.sol";
import "../utils/Context.sol";
import "../utils/Strings.sol";
import "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address => bool) members;
bytes32 adminRole;
}
mapping(bytes32 => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with a standardized message including the required role.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*
* _Available since v4.1._
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
return _roles[role].members[account];
}
/**
* @dev Revert with a standard message if `_msgSender()` is missing `role`.
* Overriding this function changes the behavior of the {onlyRole} modifier.
*
* Format of the revert message is described in {_checkRole}.
*
* _Available since v4.6._
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address account) public virtual override {
require(account == _msgSender(), "AccessControl: can only renounce roles for self");
_revokeRole(role, account);
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event. Note that unlike {grantRole}, this function doesn't perform any
* checks on the calling account.
*
* May emit a {RoleGranted} event.
*
* [WARNING]
* ====
* This function should only be called from the constructor when setting
* up the initial roles for the system.
*
* Using this function in any other way is effectively circumventing the admin
* system imposed by {AccessControl}.
* ====
*
* NOTE: This function is deprecated in favor of {_grantRole}.
*/
function _setupRole(bytes32 role, address account) internal virtual {
_grantRole(role, account);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Grants `role` to `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual {
if (!hasRole(role, account)) {
_roles[role].members[account] = true;
emit RoleGranted(role, account, _msgSender());
}
}
/**
* @dev Revokes `role` from `account`.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual {
if (hasRole(role, account)) {
_roles[role].members[account] = false;
emit RoleRevoked(role, account, _msgSender());
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
pragma solidity ^0.8.0;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*
* _Available since v3.1._
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `account`.
*/
function renounceRole(bytes32 role, address account) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (security/ReentrancyGuard.sol)
pragma solidity ^0.8.0;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.4) (utils/Context.sol)
pragma solidity ^0.8.0;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
pragma solidity ^0.8.0;
import "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*
* Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard math utilities missing in the Solidity language.
*/
library Math {
enum Rounding {
Down, // Toward negative infinity
Up, // Toward infinity
Zero // Toward zero
}
/**
* @dev Returns the largest of two numbers.
*/
function max(uint256 a, uint256 b) internal pure returns (uint256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two numbers.
*/
function min(uint256 a, uint256 b) internal pure returns (uint256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two numbers. The result is rounded towards
* zero.
*/
function average(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b) / 2 can overflow.
return (a & b) + (a ^ b) / 2;
}
/**
* @dev Returns the ceiling of the division of two numbers.
*
* This differs from standard division with `/` in that it rounds up instead
* of rounding down.
*/
function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
// (a + b - 1) / b can overflow on addition, so we distribute.
return a == 0 ? 0 : (a - 1) / b + 1;
}
/**
* @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
* @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
* with further edits by Uniswap Labs also under MIT license.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) {
unchecked {
// 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
// use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
// variables such that product = prod1 * 2^256 + prod0.
uint256 prod0; // Least significant 256 bits of the product
uint256 prod1; // Most significant 256 bits of the product
assembly {
let mm := mulmod(x, y, not(0))
prod0 := mul(x, y)
prod1 := sub(sub(mm, prod0), lt(mm, prod0))
}
// Handle non-overflow cases, 256 by 256 division.
if (prod1 == 0) {
// Solidity will revert if denominator == 0, unlike the div opcode on its own.
// The surrounding unchecked block does not change this fact.
// See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic.
return prod0 / denominator;
}
// Make sure the result is less than 2^256. Also prevents denominator == 0.
require(denominator > prod1, "Math: mulDiv overflow");
///////////////////////////////////////////////
// 512 by 256 division.
///////////////////////////////////////////////
// Make division exact by subtracting the remainder from [prod1 prod0].
uint256 remainder;
assembly {
// Compute remainder using mulmod.
remainder := mulmod(x, y, denominator)
// Subtract 256 bit number from 512 bit number.
prod1 := sub(prod1, gt(remainder, prod0))
prod0 := sub(prod0, remainder)
}
// Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
// See https://cs.stackexchange.com/q/138556/92363.
// Does not overflow because the denominator cannot be zero at this stage in the function.
uint256 twos = denominator & (~denominator + 1);
assembly {
// Divide denominator by twos.
denominator := div(denominator, twos)
// Divide [prod1 prod0] by twos.
prod0 := div(prod0, twos)
// Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
twos := add(div(sub(0, twos), twos), 1)
}
// Shift in bits from prod1 into prod0.
prod0 |= prod1 * twos;
// Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
// that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
// four bits. That is, denominator * inv = 1 mod 2^4.
uint256 inverse = (3 * denominator) ^ 2;
// Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
// in modular arithmetic, doubling the correct bits in each step.
inverse *= 2 - denominator * inverse; // inverse mod 2^8
inverse *= 2 - denominator * inverse; // inverse mod 2^16
inverse *= 2 - denominator * inverse; // inverse mod 2^32
inverse *= 2 - denominator * inverse; // inverse mod 2^64
inverse *= 2 - denominator * inverse; // inverse mod 2^128
inverse *= 2 - denominator * inverse; // inverse mod 2^256
// Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
// This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
// less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
// is no longer required.
result = prod0 * inverse;
return result;
}
}
/**
* @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
*/
function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) {
uint256 result = mulDiv(x, y, denominator);
if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
result += 1;
}
return result;
}
/**
* @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
*
* Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
*/
function sqrt(uint256 a) internal pure returns (uint256) {
if (a == 0) {
return 0;
}
// For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
//
// We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
// `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
//
// This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
// → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
// → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
//
// Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
uint256 result = 1 << (log2(a) >> 1);
// At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
// since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
// every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
// into the expected uint128 result.
unchecked {
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
result = (result + a / result) >> 1;
return min(result, a / result);
}
}
/**
* @notice Calculates sqrt(a), following the selected rounding direction.
*/
function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = sqrt(a);
return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
}
}
/**
* @dev Return the log in base 2, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 128;
}
if (value >> 64 > 0) {
value >>= 64;
result += 64;
}
if (value >> 32 > 0) {
value >>= 32;
result += 32;
}
if (value >> 16 > 0) {
value >>= 16;
result += 16;
}
if (value >> 8 > 0) {
value >>= 8;
result += 8;
}
if (value >> 4 > 0) {
value >>= 4;
result += 4;
}
if (value >> 2 > 0) {
value >>= 2;
result += 2;
}
if (value >> 1 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 2, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log2(value);
return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 10, rounded down, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >= 10 ** 64) {
value /= 10 ** 64;
result += 64;
}
if (value >= 10 ** 32) {
value /= 10 ** 32;
result += 32;
}
if (value >= 10 ** 16) {
value /= 10 ** 16;
result += 16;
}
if (value >= 10 ** 8) {
value /= 10 ** 8;
result += 8;
}
if (value >= 10 ** 4) {
value /= 10 ** 4;
result += 4;
}
if (value >= 10 ** 2) {
value /= 10 ** 2;
result += 2;
}
if (value >= 10 ** 1) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 10, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log10(value);
return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0);
}
}
/**
* @dev Return the log in base 256, rounded down, of a positive value.
* Returns 0 if given 0.
*
* Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
*/
function log256(uint256 value) internal pure returns (uint256) {
uint256 result = 0;
unchecked {
if (value >> 128 > 0) {
value >>= 128;
result += 16;
}
if (value >> 64 > 0) {
value >>= 64;
result += 8;
}
if (value >> 32 > 0) {
value >>= 32;
result += 4;
}
if (value >> 16 > 0) {
value >>= 16;
result += 2;
}
if (value >> 8 > 0) {
result += 1;
}
}
return result;
}
/**
* @dev Return the log in base 256, following the selected rounding direction, of a positive value.
* Returns 0 if given 0.
*/
function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
unchecked {
uint256 result = log256(value);
return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol)
pragma solidity ^0.8.0;
/**
* @dev Standard signed math utilities missing in the Solidity language.
*/
library SignedMath {
/**
* @dev Returns the largest of two signed numbers.
*/
function max(int256 a, int256 b) internal pure returns (int256) {
return a > b ? a : b;
}
/**
* @dev Returns the smallest of two signed numbers.
*/
function min(int256 a, int256 b) internal pure returns (int256) {
return a < b ? a : b;
}
/**
* @dev Returns the average of two signed numbers without overflow.
* The result is rounded towards zero.
*/
function average(int256 a, int256 b) internal pure returns (int256) {
// Formula from the book "Hacker's Delight"
int256 x = (a & b) + ((a ^ b) >> 1);
return x + (int256(uint256(x) >> 255) & (a ^ b));
}
/**
* @dev Returns the absolute unsigned value of a signed value.
*/
function abs(int256 n) internal pure returns (uint256) {
unchecked {
// must be unchecked in order to support `n = type(int256).min`
return uint256(n >= 0 ? n : -n);
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol)
pragma solidity ^0.8.0;
import "./math/Math.sol";
import "./math/SignedMath.sol";
/**
* @dev String operations.
*/
library Strings {
bytes16 private constant _SYMBOLS = "0123456789abcdef";
uint8 private constant _ADDRESS_LENGTH = 20;
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
*/
function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
bytes memory buffer = new bytes(2 * length + 2);
buffer[0] = "0";
buffer[1] = "x";
for (uint256 i = 2 * length + 1; i > 1; --i) {
buffer[i] = _SYMBOLS[value & 0xf];
value >>= 4;
}
require(value == 0, "Strings: hex length insufficient");
return string(buffer);
}
/**
* @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
*/
function toHexString(address addr) internal pure returns (string memory) {
return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
}
/**
* @dev Returns true if the two strings are equal.
*/
function equal(string memory a, string memory b) internal pure returns (bool) {
return keccak256(bytes(a)) == keccak256(bytes(b));
}
}{
"viaIR": true,
"optimizer": {
"enabled": true,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract ABI
API[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"burnToken","type":"address"},{"indexed":false,"internalType":"address","name":"mintToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AtomicBurnExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"burnToken","type":"address"},{"indexed":false,"internalType":"address","name":"mintToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AtomicMintExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EscrowDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"}],"name":"EscrowRefunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"}],"name":"EscrowReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"preimage","type":"bytes32"}],"name":"SwapCompleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"address","name":"initiatorAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"initiatorAmount","type":"uint256"},{"indexed":false,"internalType":"bytes32","name":"hashlock","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"timelock","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isAtomicMint","type":"bool"},{"indexed":false,"internalType":"bool","name":"isAtomicBurn","type":"bool"},{"indexed":false,"internalType":"bool","name":"isEscrowMint","type":"bool"}],"name":"SwapInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"participant","type":"address"},{"indexed":false,"internalType":"address","name":"participantAsset","type":"address"},{"indexed":false,"internalType":"uint256","name":"participantAmount","type":"uint256"}],"name":"SwapParticipated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"swapId","type":"bytes32"},{"indexed":true,"internalType":"address","name":"refunder","type":"address"}],"name":"SwapRefunded","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"}],"name":"claimSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"depositEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"}],"name":"executeAtomicBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"bytes32","name":"_preimage","type":"bytes32"}],"name":"executeAtomicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getActiveSwaps","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllSwaps","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"getSwap","outputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"participant","type":"address"},{"internalType":"address","name":"initiatorAsset","type":"address"},{"internalType":"address","name":"participantAsset","type":"address"},{"internalType":"uint256","name":"initiatorAmount","type":"uint256"},{"internalType":"uint256","name":"participantAmount","type":"uint256"},{"internalType":"bytes32","name":"hashlock","type":"bytes32"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"bool","name":"initiatorDeposited","type":"bool"},{"internalType":"bool","name":"participantDeposited","type":"bool"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"isAtomicMint","type":"bool"},{"internalType":"bool","name":"isAtomicBurn","type":"bool"},{"internalType":"bool","name":"isEscrowMint","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getSwapByIndex","outputs":[{"internalType":"bytes32","name":"swapId","type":"bytes32"},{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"participant","type":"address"},{"internalType":"address","name":"initiatorAsset","type":"address"},{"internalType":"address","name":"participantAsset","type":"address"},{"internalType":"uint256","name":"initiatorAmount","type":"uint256"},{"internalType":"uint256","name":"participantAmount","type":"uint256"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"isAtomicMint","type":"bool"},{"internalType":"bool","name":"isAtomicBurn","type":"bool"},{"internalType":"bool","name":"isEscrowMint","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSwapCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_burnToken","type":"address"},{"internalType":"address","name":"_mintToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_hashlock","type":"bytes32"},{"internalType":"uint256","name":"_timelock","type":"uint256"}],"name":"initiateAtomicBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_burnToken","type":"address"},{"internalType":"address","name":"_mintToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"_hashlock","type":"bytes32"},{"internalType":"uint256","name":"_timelock","type":"uint256"}],"name":"initiateAtomicMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"_escrowToken","type":"address"},{"internalType":"address","name":"_mintToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_timelock","type":"uint256"}],"name":"initiateEscrowMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"},{"internalType":"address","name":"_participant","type":"address"},{"internalType":"address","name":"_initiatorAsset","type":"address"},{"internalType":"address","name":"_participantAsset","type":"address"},{"internalType":"uint256","name":"_initiatorAmount","type":"uint256"},{"internalType":"uint256","name":"_participantAmount","type":"uint256"},{"internalType":"bytes32","name":"_hashlock","type":"bytes32"},{"internalType":"uint256","name":"_timelock","type":"uint256"}],"name":"initiateSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"participateSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"refundEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"refundSwap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_swapId","type":"bytes32"}],"name":"releaseEscrow","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"swapIds","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"swaps","outputs":[{"internalType":"address","name":"initiator","type":"address"},{"internalType":"address","name":"participant","type":"address"},{"internalType":"address","name":"initiatorAsset","type":"address"},{"internalType":"address","name":"participantAsset","type":"address"},{"internalType":"uint256","name":"initiatorAmount","type":"uint256"},{"internalType":"uint256","name":"participantAmount","type":"uint256"},{"internalType":"bytes32","name":"hashlock","type":"bytes32"},{"internalType":"uint256","name":"timelock","type":"uint256"},{"internalType":"bool","name":"initiatorDeposited","type":"bool"},{"internalType":"bool","name":"participantDeposited","type":"bool"},{"internalType":"bool","name":"completed","type":"bool"},{"internalType":"bool","name":"refunded","type":"bool"},{"internalType":"bool","name":"isAtomicMint","type":"bool"},{"internalType":"bool","name":"isAtomicBurn","type":"bool"},{"internalType":"bool","name":"isEscrowMint","type":"bool"}],"stateMutability":"view","type":"function"}]Contract Creation Code
608060408181523462000106576001600091818355828052602091808352818420338552835260ff828520541615620000cf575b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217759182855281845280852093732f572059dbc598c8acfea4af06fe4f7669d1b3b194858752815260ff82872054161562000095575b6132af87816200010c8239f35b838652828152818620908587525284209060ff19825416179055600080516020620033bb833981519152339380a438808080808062000088565b83805280835281842033855283528184208160ff19825416179055333385600080516020620033bb8339815191528180a462000033565b600080fdfe60c080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612703575080631818a9fa1461246f57806323a6229f146121a6578063248a9ca31461217a5780632f2ff15d146120cb5780632f807a4214611e5b57806336568abe14611dc85780633da0e66e14610b6357806347aed50814611bc45780635e9d85761461190e5780635fdb8324146116585780637319cade1461143157806375b238fc146113f65780638e2eae48146113bc57806391d1485414611370578063a217fddf14611354578063bf89fc611461120d578063cfd53d0614611118578063d4723ee314610ea6578063d547741f14610e65578063d6cfeae014610de3578063d81671bc14610dc5578063e49d5d0014610cab578063eb84e7f214610b63578063ebe54078146108b7578063f05a4a55146104535763fe2510ee1461014a57600080fd5b346104505760208060031936011261044c5760043590610168612f3b565b8183526002815260408320546001600160a01b039061018a9082161515612f91565b8284526002825260408420906008820180546101ac60ff8260101c1615612fd3565b6101bc60ff8260181c1615613010565b6007840154421061041b578284541690813314801561040c575b156103d65763ff000000198116630100000017835585919060ff1661030e575b50505460081c60ff16610234575b50505033907fc672feaa452bd52b0000f3d29c943cd9331556ab05529d49e984311220c16c198380a36001815580f35b6003820154600183015460059093015460405163a9059cbb60e01b81529383166001600160a01b03166004850152602484015283918391168187816044810103925af19081156103035784916102d6575b5015610292578080610204565b6064906040519062461bcd60e51b82526004820152601960248201527f526566756e64207061727469636970616e74206661696c6564000000000000006044820152fd5b6102f69150823d84116102fc575b6102ee8183612c6a565b810190612ee7565b38610285565b503d6102e4565b6040513d86823e3d90fd5b600285015460048087015460405163a9059cbb60e01b81526001600160a01b0394909416918401919091526024830152909190829060449082908b9088165af19081156103cb5787916103ae575b50156103695783386101f6565b60405162461bcd60e51b815260048101859052601760248201527f526566756e6420696e69746961746f72206661696c65640000000000000000006044820152606490fd5b6103c59150853d87116102fc576102ee8183612c6a565b3861035c565b6040513d89823e3d90fd5b60405162461bcd60e51b815260048101879052600e60248201526d4e6f74207377617020706172747960901b6044820152606490fd5b508360018601541633146101d6565b60405162461bcd60e51b8152600481018690526009602482015268546f6f206561726c7960b81b6044820152606490fd5b5080fd5b80fd5b5034610450576101003660031901126104505761046e612773565b610476612789565b9061047f61279f565b610487612f3b565b6004358452600260205260408420546104a9906001600160a01b031615612e22565b6001600160a01b0382161561087c576001600160a01b038216331461083f57608435151580610834575b156107fd576104e54260e43511612e5c565b6104f260c4351515612ea8565b604051906104ff82612beb565b33825260018060a01b038316602083015260018060a01b038416604083015260018060a01b03166060820152608435608082015260a43560a082015260c43560c082015260e43560e08201528361010082015283610120820152836101408201528361016082015283610180820152836101a0820152836101c08201526004358452600260205260086040852060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906106396101008201511515839060ff801983541691151516179055565b61012081015182546101408301516101608401516101808501516101a08601516101c09096015191151560181b63ff0000001692151560101b62ff00001694151560081b61ff001666ffffffffffff0019909416939093179390931717901515602090811b64ff00000000169190911792151560281b60ff60281b169290921790151560301b60ff60301b16179091556040516323b872dd60e01b815233600482015230602482015260843560448201529081606481876001600160a01b0388165af19081156103035784916107de575b501561079957600435808452600260205260408420600801805460ff1916600117905561073690612eff565b6040519160018060a01b03168252608435602083015260c435604083015260e435606083015260006080830152600060a0830152600060c083015260018060a01b031690339060008051602061323a83398151915260e060043592a46001815580f35b60405162461bcd60e51b815260206004820152601960248201527f496e69746961746f72207472616e73666572206661696c6564000000000000006044820152606490fd5b6107f7915060203d6020116102fc576102ee8183612c6a565b3861070a565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420616d6f756e747360881b6044820152606490fd5b5060a43515156104d3565b60405162461bcd60e51b815260206004820152601560248201527414d95b19881cddd85c081b9bdd08185b1b1bddd959605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081c185c9d1a58da5c185b9d606a1b6044820152606490fd5b5034610450576108c636612758565b6108ce612f3b565b6108d661288a565b8183526002602090815260408420546001600160a01b0392906108fc9084161515612f91565b838552600282526040852060088101805461091d60ff8260101c1615612fd3565b61092d60ff8260181c1615613010565b61093c6007840154421061304c565b84886109686040518381019088825284815261095781612c32565b604051928392839251928391612bc8565b8101039060025afa156103cb576109858851600685015414613087565b60ff81861c1615610b2757620100009062ff0000191617905560028101908482541687868354169160048401928354823b15610b2357604051632770a7eb60e21b81526001600160a01b0392909216600483015260248201529082908290604490829084905af18015610b1857610b00575b50506003820195808754169289828254166005830154863b15610afc576040516340c10f1960e01b81526001600160a01b0392909216600483015260248201529481908690604490829084905af1948515610aef578a95610ace575b505054935496549154604080519883166001600160a01b039081168a5293831690931660208901529187019190915260008051602061325a833981519152959216917f1690c010d2d14444cd2960e2541084b21c99319e973f0ffaf18d2790d79087899080606081015b0390a3604051908152a26001815580f35b610add91929550939293612c1e565b610aeb579087928938610a53565b8880fd5b50604051903d90823e3d90fd5b8280fd5b610b0990612c1e565b610b145787386109f7565b8780fd5b6040513d84823e3d90fd5b8380fd5b60405162461bcd60e51b815260048101869052601460248201527304e6f742061746f6d6963206d696e7420737761760641b6044820152606490fd5b503461045057602036600319011261045057604090600435815260026020522060018060a01b03610ca781835416918060018501541690806002860154169060038601541691600486015494600587015495600688015496600860078a015499015490604051998a998a9260ff95868660301c169a878760281c169a888860201c169a898960181c169a8a8a60101c169a808b60081c169a1698929f9e9d9c9b9a99989796959493919f8360a0526080526101e083019f60018060a01b039384809316905216602060a05101528160805116604060a051015216606060a0510152608060a051015260a08051015260c060a051015260e060a0510152151561010060a0510152151561012060a0510152151561014060a0510152151561016060a0510152151561018060a051015215156101a060a051015215156101c060a0510152565b0390f35b50346104505760203660031901126104505760043590600354821015610d8a5760ff6040610cdb61018094612802565b90549060031b1c9283815260026020522060018060a01b0390818154169180600183015416908060028401541690600384015416906004840154926008600586015495015495604051988952602089015260408801526060870152608086015260a085015260c0840152818160101c16151560e0840152818160181c161515610100840152818160201c161515610120840152818160281c16151561014084015260301c161515610160820152f35b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606490fd5b50346104505780600319360112610450576020600354604051908152f35b5034610450578060031936011261045057604051600380548083529083526020808301937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b92915b828210610e4e57610ca785610e4281890382612c6a565b6040519182918261284f565b835486529485019460019384019390910190610e2b565b503461045057604036600319011261045057610ea3600435610e85612773565b908084526001602052610e9e6001604086200154612abc565b612c8c565b80f35b50346104505760208060031936011261044c57600435610ec4612f3b565b8083526002825260408320546001600160a01b0390610ee69082161515612f91565b8184526002835260408420908082541633036110da5760088201918254610f1260ff8260301c1661313a565b60ff81166110a15760ff81610f2f82610f399460101c1615612fd3565b60181c1615613010565b610f486007820154421061304c565b6002810154600480830180546040516323b872dd60e01b81523393810193909352306024840152604483015293918790829060649082908c9087165af1908115611096578891611079575b501561103b57906005879260038301541691015490803b15610afc576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af18015610b1857611023575b5050815460ff19166001179091555460405190815233927f7741da8d5fef6535db9c9101106e311884c9b79b32f04cc118998393920c324891a36001815580f35b61102c90612c1e565b611037578438610fe2565b8480fd5b60405162461bcd60e51b8152600481018790526016602482015275115cd8dc9bddc81d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b6110909150873d89116102fc576102ee8183612c6a565b38610f93565b6040513d8a823e3d90fd5b60405162461bcd60e51b8152600481018790526011602482015270105b1c9958591e4819195c1bdcda5d1959607a1b6044820152606490fd5b60405162461bcd60e51b815260048101859052601660248201527513db9b1e481a5b9a5d1a585d1bdc88185b1b1bddd95960521b6044820152606490fd5b503461045057806003193601126104505760038054611136816131ce565b908392845b8281106111895750505061114e826131ce565b925b8281106111655760405180610ca7868261284f565b806111736111849284613225565b5161117e8287613225565b52613200565b611150565b61119281612802565b905490831b1c80875260026020526040872060088101549060ff808360101c161592836111ff575b5050816111f1575b506111d7575b506111d290613200565b61113b565b856111ea9161117e6111d2949888613225565b94906111c8565b6007915001544210386111c2565b60181c1615915038806111ba565b50346104505760203660031901126104505760043561122a612f3b565b61123261288a565b808252600260205260408220546001600160a01b03906112559082161515612f91565b818352600260205282604081206004600882019361129860ff865461127e828260301c1661313a565b61128982821661317d565b610f2f828260101c1615612fd3565b6112a76007840154421061304c565b60028301541691015490803b15610afc57604051632770a7eb60e21b8152306004820152602481019290925282908290604490829084905af18015610b1857611340575b50506201000062ff00001982541617905560008051602061325a8339815191526020604051837fb6e94cf3f8e202cc261173363d27daa8f5e2e79cff984b252f786794afb499468680a2848152a26001815580f35b61134990612c1e565b610afc5782386112eb565b5034610450578060031936011261045057602090604051908152f35b503461045057604036600319011261045057604061138c612773565b9160043581526001602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b503461045057602036600319011261045057600435906003548210156104505760206113e783612802565b90549060031b1c604051908152f35b503461045057806003193601126104505760206040517fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758152f35b50346104505760208060031936011261044c5760043561144f612f3b565b8083526002825260408320546001600160a01b03906114719082161515612f91565b818452600283528060016040862001541633036116135781845260028352604084209260088401805460ff8160081c166115d75760ff81610f2f826114ba9460101c1615612fd3565b6114c96007860154421061304c565b600385018054600590960180546040516323b872dd60e01b8152336004820152306024820152604481019190915290969193918290829060649082908c908a165af19081156110965788916115ba575b50156115765750805461010061ff001990911617905554925460408051929094166001600160a01b03168252602082015233927f36a01c935797536d077135d008f5d95df22b54744528d9cd0f795ab881c52a9191a36001815580f35b6064906040519062461bcd60e51b82526004820152601b60248201527f5061727469636970616e74207472616e73666572206661696c656400000000006044820152fd5b6115d19150823d84116102fc576102ee8183612c6a565b38611519565b60405162461bcd60e51b8152600481018490526014602482015273105b1c9958591e481c185c9d1a58da5c185d195960621b6044820152606490fd5b60405162461bcd60e51b815260048101849052601860248201527f4f6e6c79207061727469636970616e7420616c6c6f77656400000000000000006044820152606490fd5b503461045057611667366127b5565b9261167796949596929192612f3b565b61167f61288a565b8488526002602052604088205461169f906001600160a01b031615612e22565b6116b36001600160a01b03881615156130c2565b6116be8215156130fd565b6116c9428511612e5c565b6116d4831515612ea8565b604051906116e182612beb565b60018060a01b038816825230602083015260018060a01b038716604083015260018060a01b031660608201528160808201528160a08201528260c08201528360e082015287610100820152600161012082015287610140820152876101608201526001610180820152876101a0820152876101c0820152848852600260205260086040892060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906118136101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff00000000191617171790556118b884612eff565b6040519460018060a01b0316855260208501526040840152606083015260016080830152600060a0830152600060c083015260008051602061323a83398151915260e0309460018060a01b031693a46001815580f35b50346104505761191d366127b5565b9261192d96949596929192612f3b565b61193561288a565b84885260026020526040882054611955906001600160a01b031615612e22565b6119696001600160a01b03881615156130c2565b6119748215156130fd565b61197f428511612e5c565b61198a831515612ea8565b6040519061199782612beb565b60018060a01b038816825230602083015260018060a01b038716604083015260018060a01b031660608201528160808201528160a08201528260c08201528360e082015287610100820152600161012082015287610140820152876101608201528761018082015260016101a0820152876101c0820152848852600260205260086040892060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e083015160078201550190611ac96101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff0000000019161717179055611b6e84612eff565b6040519460018060a01b0316855260208501526040840152606083015260006080830152600160a0830152600060c083015260008051602061323a83398151915260e0309460018060a01b031693a46001815580f35b50346104505760208060031936011261044c5760043590611be3612f3b565b611beb61288a565b8183526002815260408320546001600160a01b039190611c0e9083161515612f91565b82845260028152604084206008810192611c3360ff855461127e828260301c1661313a565b806003830154169086818454166005850154843b15610afc57604051632770a7eb60e21b81526001600160a01b0392909216600483015260248201529281908490604490829084905af1928315610aef578593611dab575b50506002830154835460049485015460405163a9059cbb60e01b81529184166001600160a01b03169582019590955260248101949094528391168188816044810103925af1908115611da0578591611d83575b5015611d485750805463ff00000019166301000000179055807f7b08f2d2a35d68f512d4ee819cc6c616e61aa7cd7f7b0855d95ba090d84dc4368380a233907fc672feaa452bd52b0000f3d29c943cd9331556ab05529d49e984311220c16c198380a36001815580f35b6064906040519062461bcd60e51b8252600482015260146024820152731499599d5b9908195cd8dc9bddc819985a5b195960621b6044820152fd5b611d9a9150823d84116102fc576102ee8183612c6a565b38611cde565b6040513d87823e3d90fd5b611db791929350612c1e565b611dc45782908638611c8b565b8580fd5b503461045057604036600319011261045057611de2612773565b336001600160a01b03821603611dfe57610ea390600435612c8c565b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b503461045057611e6a36612758565b611e72612f3b565b611e7a61288a565b8183526002602090815260408420546001600160a01b039290611ea09084161515612f91565b8385526002825260408520600881018054611ec160ff8260101c1615612fd3565b611ed160ff8260181c1615613010565b611ee06007840154421061304c565b8488611efb6040518381019088825284815261095781612c32565b8101039060025afa156103cb57611f188851600685015414613087565b60ff8160281c161561208f57620100009062ff0000191617905560028101908482541685825416886004840192835490803b15610afc57604051632770a7eb60e21b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1801561208457612071575b506003820195808754169289828254166005830154863b15610afc576040516340c10f1960e01b81526001600160a01b0392909216600483015260248201529481908690604490829084905af1948515610aef578a95612054575b505054935496549154604080519883166001600160a01b039081168a5293831690931660208901529187019190915260008051602061325a833981519152959216917f0ff034d6c2970c51b554272d214a1e55fb741dd26bfa3551fff4a9be9e42c96f908060608101610abd565b61206391929550939293612c1e565b610aeb579087928938611fe6565b61207d90989198612c1e565b9638611f8b565b6040513d8b823e3d90fd5b60405162461bcd60e51b815260048101869052601460248201527304e6f742061746f6d6963206275726e20737761760641b6044820152606490fd5b5034610450576040366003190112610450576004356120e8612773565b81835260016020526121006001604085200154612abc565b8183526001602052604083209060018060a01b03169081845260205260ff6040842054161561212d578280f35b81835260016020526040832081845260205260408320600160ff1982541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461045057602036600319011261045057600160406020926004358152828452200154604051908152f35b50346104505760c0366003190112610450576121c0612773565b6121c8612789565b906121d161279f565b906121da612f3b565b6121e261288a565b600435845260026020526040842054612204906001600160a01b031615612e22565b6001600160a01b0316906122198215156130c2565b61222660843515156130fd565b6122334260a43511612e5c565b6040519061224082612beb565b82825230602083015260018060a01b038416604083015260018060a01b03166060820152608435608082015260843560a08201528360c082015260a43560e0820152836101008201526001610120820152836101408201528361016082015283610180820152836101a082015260016101c08201526004358452600260205260086040852060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906123726101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff0000000019161717179055612419600435612eff565b6040519160018060a01b03168252608435602083015282604083015260a43560608301528260808301528260a0830152600160c0830152309160008051602061323a83398151915260e060043592a46001815580f35b50346104505761247e36612758565b612486612f3b565b8183526020906002825260018060a01b036124a8816040872054161515612f91565b8385526002835260408520906008820180546124ca60ff8260101c1615612fd3565b6124da60ff8260181c1615613010565b60ff8116806126f6575b156126bf576124f86007850154421061304c565b85886125136040518381019089825284815261095781612c32565b8101039060025afa156103cb5762010000906125358951600687015414613087565b62ff0000191617905560038201548254600584015460405163a9059cbb60e01b8082529285166001600160a01b031660048201526024810191909152909391869082908516818b816044810103925af19081156110965788916126a2575b501561266757600281015460018201546004928301546040519586529084166001600160a01b031692850192909252602484019190915284918391168188816044810103925af1908115611da057859161264a575b501561260d579060008051602061325a83398151915291604051908152a26001815580f35b60405162461bcd60e51b8152600481018390526015602482015274151bc81c185c9d1a58da5c185b9d0819985a5b1959605a1b6044820152606490fd5b6126619150833d85116102fc576102ee8183612c6a565b386125e8565b60405162461bcd60e51b8152600481018690526013602482015272151bc81a5b9a5d1a585d1bdc8819985a5b1959606a1b6044820152606490fd5b6126b99150863d88116102fc576102ee8183612c6a565b38612593565b60405162461bcd60e51b815260048101879052600f60248201526e4465706f736974206d697373696e6760881b6044820152606490fd5b5060ff8160081c166124e4565b90503461044c57602036600319011261044c5760043563ffffffff60e01b8116809103610afc5760209250637965db0b60e01b8114908115612747575b5015158152f35b6301ffc9a760e01b14905038612740565b604090600319011261276e576004359060243590565b600080fd5b602435906001600160a01b038216820361276e57565b604435906001600160a01b038216820361276e57565b606435906001600160a01b038216820361276e57565b60e090600319011261276e57600435906001600160a01b03602435818116810361276e5791604435828116810361276e5791606435908116810361276e57906084359060a4359060c43590565b6003548110156128395760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b634e487b7160e01b600052603260045260246000fd5b6020908160408183019282815285518094520193019160005b828110612876575050505090565b835185529381019392810192600101612868565b3360009081527f50efbde2d46c37e9785f1791697f77e94bb7b701e19f1930a668820722d376946020908152604080832054909291907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217759060019060ff16156128f4575050505050565b6128fd33612d13565b9185519161290a83612c4e565b60428352848301956060368837835115612aa857603087538351821015612aa85790607860218501536041915b818311612a3a575050506129f857846129c660486129ea9360449798519889916129b78984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a5261298e815180928d603789019101612bc8565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190612bc8565b01036028810189520187612c6a565b5194859362461bcd60e51b8552600485015251809281602486015285850190612bc8565b601f01601f19168101030190fd5b60648386519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015612a94576f181899199a1a9b1b9c1cb0b131b232b360811b901a612a6a8587612d02565b5360041c928015612a8057600019019190612937565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b6000818152600191602090838252604093848420338552835260ff858520541615612ae8575050505050565b612af133612d13565b91855191612afe83612c4e565b60428352848301956060368837835115612aa857603087538351821015612aa85790607860218501536041915b818311612b82575050506129f857846129c660486129ea9360449798519889916129b78984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a5261298e815180928d603789019101612bc8565b909192600f81166010811015612a94576f181899199a1a9b1b9c1cb0b131b232b360811b901a612bb28587612d02565b5360041c928015612a8057600019019190612b2b565b60005b838110612bdb5750506000910152565b8181015183820152602001612bcb565b6101e0810190811067ffffffffffffffff821117612c0857604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111612c0857604052565b6040810190811067ffffffffffffffff821117612c0857604052565b6080810190811067ffffffffffffffff821117612c0857604052565b90601f8019910116810190811067ffffffffffffffff821117612c0857604052565b906000918083526001602052604083209160018060a01b03169182845260205260ff604084205416612cbd57505050565b8083526001602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b908151811015612839570160200190565b604051906060820182811067ffffffffffffffff821117612c0857604052602a82526020820160403682378251156128395760309053815160019081101561283957607860218401536029905b808211612db4575050612d705790565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015612e0d576f181899199a1a9b1b9c1cb0b131b232b360811b901a612de38486612d02565b5360041c918015612df8576000190190612d60565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b15612e2957565b60405162461bcd60e51b815260206004820152600b60248201526a537761702065786973747360a81b6044820152606490fd5b15612e6357565b60405162461bcd60e51b815260206004820152601760248201527f54696d656c6f636b206d757374206265206675747572650000000000000000006044820152606490fd5b15612eaf57565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c696420686173686c6f636b60801b6044820152606490fd5b9081602091031261276e5751801515810361276e5790565b60035468010000000000000000811015612c0857806001612f239201600355612802565b819291549060031b91821b91600019901b1916179055565b600260005414612f4c576002600055565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b15612f9857565b60405162461bcd60e51b815260206004820152601360248201527214ddd85c08191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b15612fda57565b60405162461bcd60e51b815260206004820152600e60248201526d14ddd85c0818dbdb5c1b195d195960921b6044820152606490fd5b1561301757565b60405162461bcd60e51b815260206004820152600d60248201526c14ddd85c081c99599d5b991959609a1b6044820152606490fd5b1561305357565b60405162461bcd60e51b815260206004820152600c60248201526b14ddd85c08195e1c1a5c995960a21b6044820152606490fd5b1561308e57565b60405162461bcd60e51b815260206004820152600c60248201526b42616420707265696d61676560a01b6044820152606490fd5b156130c957565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b6044820152606490fd5b1561310457565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b1561314157565b60405162461bcd60e51b815260206004820152601460248201527304e6f7420657363726f77206d696e7420737761760641b6044820152606490fd5b1561318457565b60405162461bcd60e51b815260206004820152600a602482015269139bc819195c1bdcda5d60b21b6044820152606490fd5b67ffffffffffffffff8111612c085760051b60200190565b906131d8826131b6565b6131e56040519182612c6a565b82815280926131f6601f19916131b6565b0190602036910137565b600019811461320f5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156128395760209160051b01019056fe56ab952d25400af7e525de6c26b18a94a6a03cb5f4c2b0d80fbd2cb9e3eb6f2f7430d80e0e3cfb925010ff8993f6a56392199211e297fc7825278f29980ccf51a2646970667358221220270951287569a6e4c18011154b3a35c77a737dab65d6cdba2df82caf6f282e5b64736f6c634300081200332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d
Deployed Bytecode
0x60c080604052600436101561001357600080fd5b600090813560e01c90816301ffc9a714612703575080631818a9fa1461246f57806323a6229f146121a6578063248a9ca31461217a5780632f2ff15d146120cb5780632f807a4214611e5b57806336568abe14611dc85780633da0e66e14610b6357806347aed50814611bc45780635e9d85761461190e5780635fdb8324146116585780637319cade1461143157806375b238fc146113f65780638e2eae48146113bc57806391d1485414611370578063a217fddf14611354578063bf89fc611461120d578063cfd53d0614611118578063d4723ee314610ea6578063d547741f14610e65578063d6cfeae014610de3578063d81671bc14610dc5578063e49d5d0014610cab578063eb84e7f214610b63578063ebe54078146108b7578063f05a4a55146104535763fe2510ee1461014a57600080fd5b346104505760208060031936011261044c5760043590610168612f3b565b8183526002815260408320546001600160a01b039061018a9082161515612f91565b8284526002825260408420906008820180546101ac60ff8260101c1615612fd3565b6101bc60ff8260181c1615613010565b6007840154421061041b578284541690813314801561040c575b156103d65763ff000000198116630100000017835585919060ff1661030e575b50505460081c60ff16610234575b50505033907fc672feaa452bd52b0000f3d29c943cd9331556ab05529d49e984311220c16c198380a36001815580f35b6003820154600183015460059093015460405163a9059cbb60e01b81529383166001600160a01b03166004850152602484015283918391168187816044810103925af19081156103035784916102d6575b5015610292578080610204565b6064906040519062461bcd60e51b82526004820152601960248201527f526566756e64207061727469636970616e74206661696c6564000000000000006044820152fd5b6102f69150823d84116102fc575b6102ee8183612c6a565b810190612ee7565b38610285565b503d6102e4565b6040513d86823e3d90fd5b600285015460048087015460405163a9059cbb60e01b81526001600160a01b0394909416918401919091526024830152909190829060449082908b9088165af19081156103cb5787916103ae575b50156103695783386101f6565b60405162461bcd60e51b815260048101859052601760248201527f526566756e6420696e69746961746f72206661696c65640000000000000000006044820152606490fd5b6103c59150853d87116102fc576102ee8183612c6a565b3861035c565b6040513d89823e3d90fd5b60405162461bcd60e51b815260048101879052600e60248201526d4e6f74207377617020706172747960901b6044820152606490fd5b508360018601541633146101d6565b60405162461bcd60e51b8152600481018690526009602482015268546f6f206561726c7960b81b6044820152606490fd5b5080fd5b80fd5b5034610450576101003660031901126104505761046e612773565b610476612789565b9061047f61279f565b610487612f3b565b6004358452600260205260408420546104a9906001600160a01b031615612e22565b6001600160a01b0382161561087c576001600160a01b038216331461083f57608435151580610834575b156107fd576104e54260e43511612e5c565b6104f260c4351515612ea8565b604051906104ff82612beb565b33825260018060a01b038316602083015260018060a01b038416604083015260018060a01b03166060820152608435608082015260a43560a082015260c43560c082015260e43560e08201528361010082015283610120820152836101408201528361016082015283610180820152836101a0820152836101c08201526004358452600260205260086040852060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906106396101008201511515839060ff801983541691151516179055565b61012081015182546101408301516101608401516101808501516101a08601516101c09096015191151560181b63ff0000001692151560101b62ff00001694151560081b61ff001666ffffffffffff0019909416939093179390931717901515602090811b64ff00000000169190911792151560281b60ff60281b169290921790151560301b60ff60301b16179091556040516323b872dd60e01b815233600482015230602482015260843560448201529081606481876001600160a01b0388165af19081156103035784916107de575b501561079957600435808452600260205260408420600801805460ff1916600117905561073690612eff565b6040519160018060a01b03168252608435602083015260c435604083015260e435606083015260006080830152600060a0830152600060c083015260018060a01b031690339060008051602061323a83398151915260e060043592a46001815580f35b60405162461bcd60e51b815260206004820152601960248201527f496e69746961746f72207472616e73666572206661696c6564000000000000006044820152606490fd5b6107f7915060203d6020116102fc576102ee8183612c6a565b3861070a565b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c696420616d6f756e747360881b6044820152606490fd5b5060a43515156104d3565b60405162461bcd60e51b815260206004820152601560248201527414d95b19881cddd85c081b9bdd08185b1b1bddd959605a1b6044820152606490fd5b60405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081c185c9d1a58da5c185b9d606a1b6044820152606490fd5b5034610450576108c636612758565b6108ce612f3b565b6108d661288a565b8183526002602090815260408420546001600160a01b0392906108fc9084161515612f91565b838552600282526040852060088101805461091d60ff8260101c1615612fd3565b61092d60ff8260181c1615613010565b61093c6007840154421061304c565b84886109686040518381019088825284815261095781612c32565b604051928392839251928391612bc8565b8101039060025afa156103cb576109858851600685015414613087565b60ff81861c1615610b2757620100009062ff0000191617905560028101908482541687868354169160048401928354823b15610b2357604051632770a7eb60e21b81526001600160a01b0392909216600483015260248201529082908290604490829084905af18015610b1857610b00575b50506003820195808754169289828254166005830154863b15610afc576040516340c10f1960e01b81526001600160a01b0392909216600483015260248201529481908690604490829084905af1948515610aef578a95610ace575b505054935496549154604080519883166001600160a01b039081168a5293831690931660208901529187019190915260008051602061325a833981519152959216917f1690c010d2d14444cd2960e2541084b21c99319e973f0ffaf18d2790d79087899080606081015b0390a3604051908152a26001815580f35b610add91929550939293612c1e565b610aeb579087928938610a53565b8880fd5b50604051903d90823e3d90fd5b8280fd5b610b0990612c1e565b610b145787386109f7565b8780fd5b6040513d84823e3d90fd5b8380fd5b60405162461bcd60e51b815260048101869052601460248201527304e6f742061746f6d6963206d696e7420737761760641b6044820152606490fd5b503461045057602036600319011261045057604090600435815260026020522060018060a01b03610ca781835416918060018501541690806002860154169060038601541691600486015494600587015495600688015496600860078a015499015490604051998a998a9260ff95868660301c169a878760281c169a888860201c169a898960181c169a8a8a60101c169a808b60081c169a1698929f9e9d9c9b9a99989796959493919f8360a0526080526101e083019f60018060a01b039384809316905216602060a05101528160805116604060a051015216606060a0510152608060a051015260a08051015260c060a051015260e060a0510152151561010060a0510152151561012060a0510152151561014060a0510152151561016060a0510152151561018060a051015215156101a060a051015215156101c060a0510152565b0390f35b50346104505760203660031901126104505760043590600354821015610d8a5760ff6040610cdb61018094612802565b90549060031b1c9283815260026020522060018060a01b0390818154169180600183015416908060028401541690600384015416906004840154926008600586015495015495604051988952602089015260408801526060870152608086015260a085015260c0840152818160101c16151560e0840152818160181c161515610100840152818160201c161515610120840152818160281c16151561014084015260301c161515610160820152f35b60405162461bcd60e51b8152602060048201526013602482015272496e646578206f7574206f6620626f756e647360681b6044820152606490fd5b50346104505780600319360112610450576020600354604051908152f35b5034610450578060031936011261045057604051600380548083529083526020808301937fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b92915b828210610e4e57610ca785610e4281890382612c6a565b6040519182918261284f565b835486529485019460019384019390910190610e2b565b503461045057604036600319011261045057610ea3600435610e85612773565b908084526001602052610e9e6001604086200154612abc565b612c8c565b80f35b50346104505760208060031936011261044c57600435610ec4612f3b565b8083526002825260408320546001600160a01b0390610ee69082161515612f91565b8184526002835260408420908082541633036110da5760088201918254610f1260ff8260301c1661313a565b60ff81166110a15760ff81610f2f82610f399460101c1615612fd3565b60181c1615613010565b610f486007820154421061304c565b6002810154600480830180546040516323b872dd60e01b81523393810193909352306024840152604483015293918790829060649082908c9087165af1908115611096578891611079575b501561103b57906005879260038301541691015490803b15610afc576040516340c10f1960e01b8152336004820152602481019290925282908290604490829084905af18015610b1857611023575b5050815460ff19166001179091555460405190815233927f7741da8d5fef6535db9c9101106e311884c9b79b32f04cc118998393920c324891a36001815580f35b61102c90612c1e565b611037578438610fe2565b8480fd5b60405162461bcd60e51b8152600481018790526016602482015275115cd8dc9bddc81d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b6110909150873d89116102fc576102ee8183612c6a565b38610f93565b6040513d8a823e3d90fd5b60405162461bcd60e51b8152600481018790526011602482015270105b1c9958591e4819195c1bdcda5d1959607a1b6044820152606490fd5b60405162461bcd60e51b815260048101859052601660248201527513db9b1e481a5b9a5d1a585d1bdc88185b1b1bddd95960521b6044820152606490fd5b503461045057806003193601126104505760038054611136816131ce565b908392845b8281106111895750505061114e826131ce565b925b8281106111655760405180610ca7868261284f565b806111736111849284613225565b5161117e8287613225565b52613200565b611150565b61119281612802565b905490831b1c80875260026020526040872060088101549060ff808360101c161592836111ff575b5050816111f1575b506111d7575b506111d290613200565b61113b565b856111ea9161117e6111d2949888613225565b94906111c8565b6007915001544210386111c2565b60181c1615915038806111ba565b50346104505760203660031901126104505760043561122a612f3b565b61123261288a565b808252600260205260408220546001600160a01b03906112559082161515612f91565b818352600260205282604081206004600882019361129860ff865461127e828260301c1661313a565b61128982821661317d565b610f2f828260101c1615612fd3565b6112a76007840154421061304c565b60028301541691015490803b15610afc57604051632770a7eb60e21b8152306004820152602481019290925282908290604490829084905af18015610b1857611340575b50506201000062ff00001982541617905560008051602061325a8339815191526020604051837fb6e94cf3f8e202cc261173363d27daa8f5e2e79cff984b252f786794afb499468680a2848152a26001815580f35b61134990612c1e565b610afc5782386112eb565b5034610450578060031936011261045057602090604051908152f35b503461045057604036600319011261045057604061138c612773565b9160043581526001602052209060018060a01b0316600052602052602060ff604060002054166040519015158152f35b503461045057602036600319011261045057600435906003548210156104505760206113e783612802565b90549060031b1c604051908152f35b503461045057806003193601126104505760206040517fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217758152f35b50346104505760208060031936011261044c5760043561144f612f3b565b8083526002825260408320546001600160a01b03906114719082161515612f91565b818452600283528060016040862001541633036116135781845260028352604084209260088401805460ff8160081c166115d75760ff81610f2f826114ba9460101c1615612fd3565b6114c96007860154421061304c565b600385018054600590960180546040516323b872dd60e01b8152336004820152306024820152604481019190915290969193918290829060649082908c908a165af19081156110965788916115ba575b50156115765750805461010061ff001990911617905554925460408051929094166001600160a01b03168252602082015233927f36a01c935797536d077135d008f5d95df22b54744528d9cd0f795ab881c52a9191a36001815580f35b6064906040519062461bcd60e51b82526004820152601b60248201527f5061727469636970616e74207472616e73666572206661696c656400000000006044820152fd5b6115d19150823d84116102fc576102ee8183612c6a565b38611519565b60405162461bcd60e51b8152600481018490526014602482015273105b1c9958591e481c185c9d1a58da5c185d195960621b6044820152606490fd5b60405162461bcd60e51b815260048101849052601860248201527f4f6e6c79207061727469636970616e7420616c6c6f77656400000000000000006044820152606490fd5b503461045057611667366127b5565b9261167796949596929192612f3b565b61167f61288a565b8488526002602052604088205461169f906001600160a01b031615612e22565b6116b36001600160a01b03881615156130c2565b6116be8215156130fd565b6116c9428511612e5c565b6116d4831515612ea8565b604051906116e182612beb565b60018060a01b038816825230602083015260018060a01b038716604083015260018060a01b031660608201528160808201528160a08201528260c08201528360e082015287610100820152600161012082015287610140820152876101608201526001610180820152876101a0820152876101c0820152848852600260205260086040892060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906118136101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff00000000191617171790556118b884612eff565b6040519460018060a01b0316855260208501526040840152606083015260016080830152600060a0830152600060c083015260008051602061323a83398151915260e0309460018060a01b031693a46001815580f35b50346104505761191d366127b5565b9261192d96949596929192612f3b565b61193561288a565b84885260026020526040882054611955906001600160a01b031615612e22565b6119696001600160a01b03881615156130c2565b6119748215156130fd565b61197f428511612e5c565b61198a831515612ea8565b6040519061199782612beb565b60018060a01b038816825230602083015260018060a01b038716604083015260018060a01b031660608201528160808201528160a08201528260c08201528360e082015287610100820152600161012082015287610140820152876101608201528761018082015260016101a0820152876101c0820152848852600260205260086040892060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e083015160078201550190611ac96101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff0000000019161717179055611b6e84612eff565b6040519460018060a01b0316855260208501526040840152606083015260006080830152600160a0830152600060c083015260008051602061323a83398151915260e0309460018060a01b031693a46001815580f35b50346104505760208060031936011261044c5760043590611be3612f3b565b611beb61288a565b8183526002815260408320546001600160a01b039190611c0e9083161515612f91565b82845260028152604084206008810192611c3360ff855461127e828260301c1661313a565b806003830154169086818454166005850154843b15610afc57604051632770a7eb60e21b81526001600160a01b0392909216600483015260248201529281908490604490829084905af1928315610aef578593611dab575b50506002830154835460049485015460405163a9059cbb60e01b81529184166001600160a01b03169582019590955260248101949094528391168188816044810103925af1908115611da0578591611d83575b5015611d485750805463ff00000019166301000000179055807f7b08f2d2a35d68f512d4ee819cc6c616e61aa7cd7f7b0855d95ba090d84dc4368380a233907fc672feaa452bd52b0000f3d29c943cd9331556ab05529d49e984311220c16c198380a36001815580f35b6064906040519062461bcd60e51b8252600482015260146024820152731499599d5b9908195cd8dc9bddc819985a5b195960621b6044820152fd5b611d9a9150823d84116102fc576102ee8183612c6a565b38611cde565b6040513d87823e3d90fd5b611db791929350612c1e565b611dc45782908638611c8b565b8580fd5b503461045057604036600319011261045057611de2612773565b336001600160a01b03821603611dfe57610ea390600435612c8c565b60405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b6064820152608490fd5b503461045057611e6a36612758565b611e72612f3b565b611e7a61288a565b8183526002602090815260408420546001600160a01b039290611ea09084161515612f91565b8385526002825260408520600881018054611ec160ff8260101c1615612fd3565b611ed160ff8260181c1615613010565b611ee06007840154421061304c565b8488611efb6040518381019088825284815261095781612c32565b8101039060025afa156103cb57611f188851600685015414613087565b60ff8160281c161561208f57620100009062ff0000191617905560028101908482541685825416886004840192835490803b15610afc57604051632770a7eb60e21b81526001600160a01b0394909416600485015260248401919091528290604490829084905af1801561208457612071575b506003820195808754169289828254166005830154863b15610afc576040516340c10f1960e01b81526001600160a01b0392909216600483015260248201529481908690604490829084905af1948515610aef578a95612054575b505054935496549154604080519883166001600160a01b039081168a5293831690931660208901529187019190915260008051602061325a833981519152959216917f0ff034d6c2970c51b554272d214a1e55fb741dd26bfa3551fff4a9be9e42c96f908060608101610abd565b61206391929550939293612c1e565b610aeb579087928938611fe6565b61207d90989198612c1e565b9638611f8b565b6040513d8b823e3d90fd5b60405162461bcd60e51b815260048101869052601460248201527304e6f742061746f6d6963206275726e20737761760641b6044820152606490fd5b5034610450576040366003190112610450576004356120e8612773565b81835260016020526121006001604085200154612abc565b8183526001602052604083209060018060a01b03169081845260205260ff6040842054161561212d578280f35b81835260016020526040832081845260205260408320600160ff1982541617905533917f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d8480a438808280f35b503461045057602036600319011261045057600160406020926004358152828452200154604051908152f35b50346104505760c0366003190112610450576121c0612773565b6121c8612789565b906121d161279f565b906121da612f3b565b6121e261288a565b600435845260026020526040842054612204906001600160a01b031615612e22565b6001600160a01b0316906122198215156130c2565b61222660843515156130fd565b6122334260a43511612e5c565b6040519061224082612beb565b82825230602083015260018060a01b038416604083015260018060a01b03166060820152608435608082015260843560a08201528360c082015260a43560e0820152836101008201526001610120820152836101408201528361016082015283610180820152836101a082015260016101c08201526004358452600260205260086040852060018060a01b038351166001600160601b0360a01b90818354161782556001820160018060a01b03602086015116828254161790556002820160018060a01b0360408601511682825416179055600382019060018060a01b03606086015116908254161790556080830151600482015560a0830151600582015560c0830151600682015560e0830151600782015501906123726101008201511515839060ff801983541691151516179055565b610120810151825461ff00191690151560081b61ff0016178255610140810151825462ff0000191690151560101b62ff000016178255610160810151825463ff000000191690151560181b63ff00000016178255610180810151151590825464ff0000000060ff60301b6101c060ff60281b6101a0860151151560281b16940151151560301b169360201b169066ffffff0000000019161717179055612419600435612eff565b6040519160018060a01b03168252608435602083015282604083015260a43560608301528260808301528260a0830152600160c0830152309160008051602061323a83398151915260e060043592a46001815580f35b50346104505761247e36612758565b612486612f3b565b8183526020906002825260018060a01b036124a8816040872054161515612f91565b8385526002835260408520906008820180546124ca60ff8260101c1615612fd3565b6124da60ff8260181c1615613010565b60ff8116806126f6575b156126bf576124f86007850154421061304c565b85886125136040518381019089825284815261095781612c32565b8101039060025afa156103cb5762010000906125358951600687015414613087565b62ff0000191617905560038201548254600584015460405163a9059cbb60e01b8082529285166001600160a01b031660048201526024810191909152909391869082908516818b816044810103925af19081156110965788916126a2575b501561266757600281015460018201546004928301546040519586529084166001600160a01b031692850192909252602484019190915284918391168188816044810103925af1908115611da057859161264a575b501561260d579060008051602061325a83398151915291604051908152a26001815580f35b60405162461bcd60e51b8152600481018390526015602482015274151bc81c185c9d1a58da5c185b9d0819985a5b1959605a1b6044820152606490fd5b6126619150833d85116102fc576102ee8183612c6a565b386125e8565b60405162461bcd60e51b8152600481018690526013602482015272151bc81a5b9a5d1a585d1bdc8819985a5b1959606a1b6044820152606490fd5b6126b99150863d88116102fc576102ee8183612c6a565b38612593565b60405162461bcd60e51b815260048101879052600f60248201526e4465706f736974206d697373696e6760881b6044820152606490fd5b5060ff8160081c166124e4565b90503461044c57602036600319011261044c5760043563ffffffff60e01b8116809103610afc5760209250637965db0b60e01b8114908115612747575b5015158152f35b6301ffc9a760e01b14905038612740565b604090600319011261276e576004359060243590565b600080fd5b602435906001600160a01b038216820361276e57565b604435906001600160a01b038216820361276e57565b606435906001600160a01b038216820361276e57565b60e090600319011261276e57600435906001600160a01b03602435818116810361276e5791604435828116810361276e5791606435908116810361276e57906084359060a4359060c43590565b6003548110156128395760036000527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0190600090565b634e487b7160e01b600052603260045260246000fd5b6020908160408183019282815285518094520193019160005b828110612876575050505090565b835185529381019392810192600101612868565b3360009081527f50efbde2d46c37e9785f1791697f77e94bb7b701e19f1930a668820722d376946020908152604080832054909291907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217759060019060ff16156128f4575050505050565b6128fd33612d13565b9185519161290a83612c4e565b60428352848301956060368837835115612aa857603087538351821015612aa85790607860218501536041915b818311612a3a575050506129f857846129c660486129ea9360449798519889916129b78984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a5261298e815180928d603789019101612bc8565b8401917001034b99036b4b9b9b4b733903937b6329607d1b603784015251809386840190612bc8565b01036028810189520187612c6a565b5194859362461bcd60e51b8552600485015251809281602486015285850190612bc8565b601f01601f19168101030190fd5b60648386519062461bcd60e51b825280600483015260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b909192600f81166010811015612a94576f181899199a1a9b1b9c1cb0b131b232b360811b901a612a6a8587612d02565b5360041c928015612a8057600019019190612937565b634e487b7160e01b82526011600452602482fd5b634e487b7160e01b83526032600452602483fd5b634e487b7160e01b81526032600452602490fd5b6000818152600191602090838252604093848420338552835260ff858520541615612ae8575050505050565b612af133612d13565b91855191612afe83612c4e565b60428352848301956060368837835115612aa857603087538351821015612aa85790607860218501536041915b818311612b82575050506129f857846129c660486129ea9360449798519889916129b78984019876020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b8a5261298e815180928d603789019101612bc8565b909192600f81166010811015612a94576f181899199a1a9b1b9c1cb0b131b232b360811b901a612bb28587612d02565b5360041c928015612a8057600019019190612b2b565b60005b838110612bdb5750506000910152565b8181015183820152602001612bcb565b6101e0810190811067ffffffffffffffff821117612c0857604052565b634e487b7160e01b600052604160045260246000fd5b67ffffffffffffffff8111612c0857604052565b6040810190811067ffffffffffffffff821117612c0857604052565b6080810190811067ffffffffffffffff821117612c0857604052565b90601f8019910116810190811067ffffffffffffffff821117612c0857604052565b906000918083526001602052604083209160018060a01b03169182845260205260ff604084205416612cbd57505050565b8083526001602052604083208284526020526040832060ff1981541690557ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b339380a4565b908151811015612839570160200190565b604051906060820182811067ffffffffffffffff821117612c0857604052602a82526020820160403682378251156128395760309053815160019081101561283957607860218401536029905b808211612db4575050612d705790565b606460405162461bcd60e51b815260206004820152602060248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152fd5b9091600f81166010811015612e0d576f181899199a1a9b1b9c1cb0b131b232b360811b901a612de38486612d02565b5360041c918015612df8576000190190612d60565b60246000634e487b7160e01b81526011600452fd5b60246000634e487b7160e01b81526032600452fd5b15612e2957565b60405162461bcd60e51b815260206004820152600b60248201526a537761702065786973747360a81b6044820152606490fd5b15612e6357565b60405162461bcd60e51b815260206004820152601760248201527f54696d656c6f636b206d757374206265206675747572650000000000000000006044820152606490fd5b15612eaf57565b60405162461bcd60e51b815260206004820152601060248201526f496e76616c696420686173686c6f636b60801b6044820152606490fd5b9081602091031261276e5751801515810361276e5790565b60035468010000000000000000811015612c0857806001612f239201600355612802565b819291549060031b91821b91600019901b1916179055565b600260005414612f4c576002600055565b60405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606490fd5b15612f9857565b60405162461bcd60e51b815260206004820152601360248201527214ddd85c08191bd95cc81b9bdd08195e1a5cdd606a1b6044820152606490fd5b15612fda57565b60405162461bcd60e51b815260206004820152600e60248201526d14ddd85c0818dbdb5c1b195d195960921b6044820152606490fd5b1561301757565b60405162461bcd60e51b815260206004820152600d60248201526c14ddd85c081c99599d5b991959609a1b6044820152606490fd5b1561305357565b60405162461bcd60e51b815260206004820152600c60248201526b14ddd85c08195e1c1a5c995960a21b6044820152606490fd5b1561308e57565b60405162461bcd60e51b815260206004820152600c60248201526b42616420707265696d61676560a01b6044820152606490fd5b156130c957565b60405162461bcd60e51b815260206004820152600c60248201526b24b73b30b634b2103ab9b2b960a11b6044820152606490fd5b1561310457565b60405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b6044820152606490fd5b1561314157565b60405162461bcd60e51b815260206004820152601460248201527304e6f7420657363726f77206d696e7420737761760641b6044820152606490fd5b1561318457565b60405162461bcd60e51b815260206004820152600a602482015269139bc819195c1bdcda5d60b21b6044820152606490fd5b67ffffffffffffffff8111612c085760051b60200190565b906131d8826131b6565b6131e56040519182612c6a565b82815280926131f6601f19916131b6565b0190602036910137565b600019811461320f5760010190565b634e487b7160e01b600052601160045260246000fd5b80518210156128395760209160051b01019056fe56ab952d25400af7e525de6c26b18a94a6a03cb5f4c2b0d80fbd2cb9e3eb6f2f7430d80e0e3cfb925010ff8993f6a56392199211e297fc7825278f29980ccf51a2646970667358221220270951287569a6e4c18011154b3a35c77a737dab65d6cdba2df82caf6f282e5b64736f6c63430008120033
Loading...
Loading
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.