Source Code
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Gateway
Compiler Version
v0.8.4+commit.c7e474f2
Optimization Enabled:
Yes with 1000 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "./Escrow.sol";
import "./Dispute.sol";
import "./Agent.sol";
import "./interfaces/IGateway.sol";
import "./libraries/TransferHelper.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Gateway is Ownable, Escrow, Dispute, Agent, IGateway {
// External token address, should be able to reset this by an owner
address public token;
mapping(uint256 => address[]) public reviewers;
mapping(uint256 => address[]) public pickedAgents;
constructor(address _token) {
require(
_token != address(0),
"Invalid Token Address"
);
token = _token;
}
function resetTokenAddress(address _newTokenAddress) external onlyOwner {
require(
_newTokenAddress != address(0) && _newTokenAddress != address(this),
"Invalid Token Address"
);
token = _newTokenAddress;
}
/*
* @param _escrowDisputableTime (Epoch time in seconds) - After this time, a customer can make a dispute case
* @param _escrowWithdrawableTime (Epoch time in seconds) - After this time, a merchant can withdraw funds from an escrow contract
*/
function purchase(
uint256 _productId,
address _merchantAddress,
uint256 _amount,
uint256 _escrowDisputableTime,
uint256 _escrowWithdrawableTime
) public payable {
_purchase(
token,
_msgSender(),
_productId,
_merchantAddress,
_amount,
_escrowDisputableTime,
_escrowWithdrawableTime
);
}
function withdraw(uint256 _escrowId) public {
_withdraw(token, _msgSender(), _escrowId);
}
function startDispute(uint256 _escrowId) public {
require(
escrows[_escrowId].status == DEFAULT,
"Escrow status must be on the DEFAULT status"
);
require(
_msgSender() == escrows[_escrowId].buyerAddress,
"Caller is not buyer"
);
require(
escrows[_escrowId].escrowDisputableTime <= block.timestamp,
"Please wait until the disputable time"
);
require(
escrows[_escrowId].escrowWithdrawableTime >= block.timestamp,
"Disputable time was passed already"
);
escrows[_escrowId].status = DISPUTE;
_dispute(_msgSender(), _escrowId);
}
// Call this function to get credits as an Agent, should call approve function of Token contract before calling this function
function participate() external {
Agent memory agent = agents[_msgSender()];
require(
agent.status == 0 || // not exists
agent.status == _LOST || // Agent submitted and lost
agent.status == _INIT, // Agent submitted and won
"Wrong status"
);
require(
TransferHelper.balanceOf(token, _msgSender()) >=
agentPaticipateAmount,
"Not correct amount"
);
if (agent.participationCount != 0 && agent.score < criteriaScore) {
revert(
"Your agent score is too low, so can't participate any more"
);
}
if (agent.participationCount == 0) {
agents[_msgSender()] = Agent(
initialAgentScore,
0,
agentPaticipateAmount,
0,
_WAITING
);
} else {
agents[_msgSender()] = Agent(
agent.score,
agent.participationCount,
agent.accumulatedAmount + agentPaticipateAmount,
0,
_WAITING
);
}
TransferHelper.safeTransferFrom(
token,
_msgSender(),
address(this),
agentPaticipateAmount
);
emit AgentParticipated(_msgSender());
}
function pickDispute(uint256 _disputeId)
external
{
require(
agents[_msgSender()].status == _WAITING,
"Agent is not in waiting state"
);
require(
agents[_msgSender()].score >= criteriaScore,
"Low agent score"
);
require(disputes[_disputeId].escrowId != 0, "Invalid dispute id");
require(disputes[_disputeId].applied_agents_count < disputeReviewGroupCount ||
(disputes[_disputeId].createdAt + maxReviewDelay) < block.timestamp, "max applied agents exceed");
require(
disputes[_disputeId].status == INIT ||
disputes[_disputeId].status == WAITING ||
disputes[_disputeId].status == REVIEW,
"Dispute is not in init nor in waiting status"
);
pickedAgents[_disputeId].push(_msgSender());
disputes[_disputeId].status = REVIEW;
agents[_msgSender()].status = REVIEW;
agents[_msgSender()].assignedDisputeId = _disputeId;
disputes[_disputeId].applied_agents_count +=1;
emit AssignAgent(_msgSender(), _disputeId);
}
function _setAgent(
Agent storage agent,
uint256 status,
uint256 score,
uint256 assignedDisputeId
) internal {
agent.status = status;
if (status == _LOST)
agent.score -= score;
else
agent.score += score;
agent.assignedDisputeId = assignedDisputeId;
}
function _setDispute(
Dispute storage dispute,
uint256 status
) internal {
dispute.status = status;
if(status == FAIL){
dispute.disapprovedCount += 1;
}else if(status == WIN){
dispute.approvedCount += 1;
}else if( status == INIT){
dispute.approvedCount = 0;
dispute.disapprovedCount = 0;
}
dispute.updatedAt = block.timestamp;
}
// Need to have MTO transfered beforehand
function submit(uint256 _disputeId, uint256 _decision) external {
Dispute storage dispute = disputes[_disputeId];
Agent storage agent;
require(
agents[_msgSender()].score >= criteriaScore,
"Too low score as an Agent"
);
require(
agents[_msgSender()].status == _REVIEW,
"Agent status should be review"
);
require(
agents[_msgSender()].assignedDisputeId == _disputeId,
"disputeID is not assigned"
);
require(
disputes[agents[_msgSender()].assignedDisputeId].escrowId != 0,
"DisputeID is not valid"
);
require(
_decision == _APPROVED || _decision == _DISAPPROVED,
"Invalid decision value"
);
agents[_msgSender()].participationCount += 1;
if (
_decision == _APPROVED &&
dispute.approvedCount + 1 >= disputeReviewConsensusCount
) {
_setAgent(agents[_msgSender()], _EARNED, scoreUp, 0);
_setDispute(dispute, WIN);
emit DisputeApproved(_disputeId);
escrows[dispute.escrowId].status = REFUNDED; // REFUNDABLE; In case not returing the funds back to a customer in this function
// Transfer the funds to a customer for chargeback as a dipsute case got approved
TransferHelper.safeTransfer(
token,
escrows[dispute.escrowId].buyerAddress,
escrows[dispute.escrowId].amount
);
emit Refunded(
escrows[dispute.escrowId].buyerAddress,
dispute.escrowId,
escrows[dispute.escrowId].amount
);
for (uint256 i = 0; i < reviewers[_disputeId].length; i++) {
agent = agents[reviewers[_disputeId][i]];
if (agent.status == _APPROVED) {
_setAgent(agent, _EARNED, scoreUp, 0);
} else if (agent.status == _DISAPPROVED) {
_setAgent(agent, _LOST, scoreDown, 0);
}
}
for (uint256 i = 0; i < pickedAgents[_disputeId].length; i++) {
agent = agents[pickedAgents[_disputeId][i]];
_setAgent(agent, _WAITING, 0, 0);
}
} else if (
_decision == _DISAPPROVED &&
dispute.disapprovedCount + 1 >= disputeReviewConsensusCount
) {
_setAgent(agents[_msgSender()], _EARNED, scoreUp, 0);
_setDispute(dispute, FAIL);
emit DisputeDisapproved(_disputeId);
escrows[dispute.escrowId].status = COMPLETED; // DEFAULT; In case not returing the funds to a merchant in this function
for (uint256 i = 0; i < reviewers[_disputeId].length; i++) {
agent = agents[reviewers[_disputeId][i]];
if (agent.status == _DISAPPROVED) {
_setAgent(agent, _EARNED, scoreUp, 0);
} else if (agent.status == _APPROVED) {
_setAgent(agent, _LOST, scoreDown, 0);
}
}
for (uint256 i = 0; i < pickedAgents[_disputeId].length; i++) {
agent = agents[pickedAgents[_disputeId][i]];
_setAgent(agent, _WAITING, 0, 0);
}
// Transfer the funds to a merchant for selling the product as a dipsute case(by a customer) got disapproved
TransferHelper.safeTransfer(
token,
escrows[dispute.escrowId].merchantAddress,
escrows[dispute.escrowId].amount
);
emit Withdraw(
escrows[dispute.escrowId].merchantAddress,
dispute.escrowId,
escrows[dispute.escrowId].amount
);
} else if (
_decision == _APPROVED &&
dispute.approvedCount + 1 < disputeReviewConsensusCount &&
(dispute.approvedCount + dispute.disapprovedCount + 1) >=
disputeReviewGroupCount
) {
_setAgent(agents[_msgSender()], _LOST, scoreDown, 0);
_setDispute(dispute, INIT);
for (uint256 i = 0; i < reviewers[_disputeId].length; i++) {
_setAgent(
agents[reviewers[_disputeId][i]],
_LOST,
scoreDown,
0
);
}
for (uint256 i = 0; i < pickedAgents[_disputeId].length; i++) {
_setAgent(agents[pickedAgents[_disputeId][i]], _WAITING, 0, 0);
}
} else if (
_decision == _DISAPPROVED &&
dispute.disapprovedCount + 1 < disputeReviewConsensusCount &&
(dispute.approvedCount + dispute.disapprovedCount + 1) >=
disputeReviewGroupCount
) {
_setAgent(agents[_msgSender()], _LOST, scoreDown, 0);
_setDispute(dispute, INIT);
for (uint256 i = 0; i < reviewers[_disputeId].length; i++) {
_setAgent(
agents[reviewers[_disputeId][i]],
_LOST,
scoreDown,
0
);
}
for (uint256 i = 0; i < pickedAgents[_disputeId].length; i++) {
_setAgent(agents[pickedAgents[_disputeId][i]], _WAITING, 0, 0);
}
} else {
_setAgent(agents[_msgSender()], _decision, 0, 0);
_removeFromPickedAgents(_disputeId, _msgSender());
reviewers[_disputeId].push(_msgSender());
dispute.status = WAITING;
dispute.updatedAt = block.timestamp;
if (_decision == _APPROVED) dispute.approvedCount += 1;
else if (_decision == _DISAPPROVED) dispute.disapprovedCount += 1;
}
if (
agents[_msgSender()].score < criteriaScore &&
agents[_msgSender()].status != _BAN
) {
agents[_msgSender()].status = _BAN;
}
emit SubmittedDispute(_msgSender(), _disputeId, _decision);
}
function agentWithdraw() external {
require(
agents[_msgSender()].status == _EARNED,
"Cannot withdraw unearned tokens"
);
agents[_msgSender()].status = _INIT;
TransferHelper.safeTransfer(token, _msgSender(), disputeBonusAmount);
emit AgentWithdraw(_msgSender(), disputeBonusAmount);
}
function adminWithdrawToken(uint256 _amount) external onlyOwner {
require(
TransferHelper.balanceOf(token, address(this)) > _amount,
"Not enough balance"
);
TransferHelper.safeTransfer(token, _msgSender(), _amount);
}
function getMerchantReputation(address _merchantAddress)
public
view
returns (uint256)
{
require(_merchantAddress != address(0), "Invalid Merchant Address");
if (currentEscrowId == 0) {
return 0;
}
uint256 Es = 0; //total number of escrow for merchant address
uint256 Ds = 0; //total win dispute againts merchant address
uint256 Er = 0; //(escrow success ratio) = (Es - Ds)/Es
uint256 Esa = 0; //total escrowed amount
uint256 Dsa = 0; //total disputed amount
uint256 Ar = 0; // (Amount ratio) = (Esa - Dsa) / Esa
for (uint256 i = 1; i <= currentEscrowId; i++) {
if (
escrows[i].merchantAddress == _merchantAddress &&
escrows[i].status != DISPUTE
) {
if (
escrows[i].status != DEFAULT ||
escrows[i].escrowWithdrawableTime < block.timestamp
) {
Es = Es + 1;
Esa = Esa + escrows[i].amount;
if (
escrows[i].status == REFUNDABLE ||
escrows[i].status == REFUNDED
) {
Ds = Ds + 1;
Dsa = Dsa + escrows[i].amount;
}
}
}
}
if (Es == 0) {
return 0;
}
Er = ((60 * (Es - Ds)) / Es); //60 percent reputation for successful escrows
Ar = ((40 * (Esa - Dsa)) / Esa); ////60 percent reputation for successful escrows Amount
uint256 total = Er + Ar;
return total;
}
function applyADM(uint256 _disputeId, uint256 _decision)
external
onlyOwner
{
Dispute storage dispute = disputes[_disputeId];
Escrow storage escrow = escrows[dispute.escrowId];
require(dispute.status == INIT, "Dispute is not in init state");
require(
_decision == _APPROVED || _decision == _DISAPPROVED,
"Invalid decision value"
);
//APPROVE
if (_decision == _APPROVED) {
dispute.status = WIN;
dispute.updatedAt = block.timestamp;
emit DisputeApproved(_disputeId);
escrow.status = REFUNDED;
TransferHelper.safeTransfer(
token,
escrow.buyerAddress,
escrow.amount
);
emit Refunded(escrow.buyerAddress, dispute.escrowId, escrow.amount);
} else {
//FAIL
dispute.status = FAIL;
dispute.updatedAt = block.timestamp;
emit DisputeDisapproved(_disputeId);
escrow.status = COMPLETED;
TransferHelper.safeTransfer(
token,
escrow.merchantAddress,
escrow.amount
);
emit Withdraw(
escrow.merchantAddress,
dispute.escrowId,
escrow.amount
);
}
}
// TODO 1: fee, 2: reset global variables 3: auto assign system
function _removeFromPickedAgents(uint256 disputeId, address agent) internal {
address[] storage agents = pickedAgents[disputeId];
uint i = _findIndex(agents, agent);
_removeByIndex(agents, i);
}
function _removeByIndex(address[] storage agents, uint index) internal {
if (index >= agents.length) return;
agents[index] = agents[agents.length - 1];
agents.pop();
}
function _findIndex(address[] storage agents, address submitter) internal view returns(uint) {
uint i = 0;
while (agents[i] != submitter) {
i++;
}
return i;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.4;
import "./interfaces/IEscrow.sol";
import "./libraries/TransferHelper.sol";
import "./UniswapV3ForMto.sol";
abstract contract Escrow is IEscrow, UniswapV3ForMto {
// Escrow Status
uint256 public currentEscrowId;
uint8 constant DEFAULT = 1;
uint8 constant DISPUTE = 2;
uint8 constant REFUNDABLE = 3;
uint8 constant COMPLETED = 4;
uint8 constant REFUNDED = 5;
mapping(uint256 => Escrow) public escrows;
// _escrowDisputableTime(Epoch time in seconds) - After this time, a customer can make a dispute case
// _escrowWithdrawableTime(Epoch time in seconds) - After this time, a merchant can withdraw funds from an escrow contract
function _purchase(
address _token,
address _currentCaller,
uint256 _productId,
address _merchantAddress,
uint256 _amount,
uint256 _escrowDisputableTime,
uint256 _escrowWithdrawableTime
) internal {
require(_merchantAddress != address(0), "Invalid Merchant Address");
require(_amount > 0, "Amount should be bigger than zero");
if(TransferHelper.balanceOf(_token, _currentCaller) < _amount )
super.convertEthToExactToken(_amount - TransferHelper.balanceOf(_token, _currentCaller), _token, block.timestamp+15);// should check and send required ETH in front by making an estimation from uniswap v3 router.
require(
TransferHelper.allowance(_token, _currentCaller, address(this)) >=
_amount,
"You should approve token transfer to this contract first"
);
require(
_escrowDisputableTime > block.timestamp,
"Disputable time should be later than current time"
);
require(
_escrowWithdrawableTime > _escrowDisputableTime,
"Withdraw Time should be later than Disputable time"
);
escrows[currentEscrowId + 1] = Escrow(
_productId,
_currentCaller,
_merchantAddress,
_amount,
_escrowWithdrawableTime,
_escrowDisputableTime,
DEFAULT,
block.timestamp
);
currentEscrowId = currentEscrowId + 1;
TransferHelper.safeTransferFrom(
_token,
_currentCaller,
address(this),
_amount
);
emit Escrowed(_currentCaller, _productId, _amount, currentEscrowId);
}
function _withdraw(
address _token,
address _currentCaller,
uint256 _escrowId
) public {
require(
escrows[_escrowId].status == DEFAULT ||
escrows[_escrowId].status == REFUNDABLE,
"Invalid Status"
);
require(
block.timestamp > escrows[_escrowId].escrowWithdrawableTime,
"Escrowd time has not passed yet"
);
require(
_currentCaller == escrows[_escrowId].buyerAddress ||
_currentCaller == escrows[_escrowId].merchantAddress,
"Caller is neither Buyer nor Merchant"
);
/*
require(
TransferHelper.balanceOf(_token, address(this)) >=
escrows[_escrowId].amount,
"Contract doesn't have enough funds"
);
*/
if (
escrows[_escrowId].status == DEFAULT &&
escrows[_escrowId].buyerAddress == _currentCaller
) {
revert("Buyer cannot withdraw in default status");
}
if (
escrows[_escrowId].status == REFUNDABLE &&
escrows[_escrowId].merchantAddress == _currentCaller
) {
revert("Merchant cannot withdraw in refund status");
}
if (
escrows[_escrowId].status == REFUNDABLE &&
escrows[_escrowId].buyerAddress == _currentCaller
) {
// Transfers tokens to buyer
TransferHelper.safeTransfer(
_token,
escrows[_escrowId].buyerAddress,
escrows[_escrowId].amount
);
// Update the escrow status as REFUNDED
escrows[_escrowId].status = REFUNDED;
// emit Withdraw(_currentCaller, _escrowId, escrows[_escrowId].amount);
emit Refunded(_currentCaller, _escrowId, escrows[_escrowId].amount);
} else if (
escrows[_escrowId].status == DEFAULT &&
escrows[_escrowId].merchantAddress == _currentCaller
) {
// Update the escrow status as COMPLETED
escrows[_escrowId].status = COMPLETED;
// Transfers tokens to merchant
TransferHelper.safeTransfer(
_token,
escrows[_escrowId].merchantAddress,
escrows[_escrowId].amount
);
emit Withdraw(_currentCaller, _escrowId, escrows[_escrowId].amount);
}
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "./interfaces/IDispute.sol";
import "./interfaces/IEscrow.sol";
abstract contract Dispute is IDispute {
// Dispute Status
uint256 public currentDisputeId;
uint8 constant INIT = 1;
uint8 constant WAITING = 2;
uint8 constant REVIEW = 3;
uint8 constant WIN = 4;
uint8 constant FAIL = 5;
mapping(uint256 => Dispute) public disputes;
function _dispute(address msgSender, uint256 _escrowId) internal {
disputes[currentDisputeId + 1] = Dispute(
_escrowId,
0, // approvedCount
0, // disapprovedCount
INIT,// status
0, // applied_agents_count
block.timestamp,
block.timestamp
);
currentDisputeId = currentDisputeId + 1;
emit Disputed(msgSender, currentDisputeId, _escrowId);
}
function _setDispute(
Dispute storage dispute,
uint8 status,
uint256 approvedCount,
uint256 updatedAt
) internal {
dispute.status = status;
dispute.approvedCount += approvedCount;
dispute.updatedAt = updatedAt;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import "./interfaces/IAgent.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract Agent is IAgent, Ownable {
// Agent related params, should be able to reset this by an owner
uint256 public initialAgentScore = 100;
uint256 public criteriaScore = 70;
uint256 public disputeBonusAmount = 10 * (10**18);
uint256 public scoreUp = 10;
uint256 public scoreDown = 10;
uint256 public disputeReviewGroupCount = 5;// maximum required agent to resolve a dispute
uint256 public disputeReviewConsensusCount = 3;
uint256 public agentPaticipateAmount = 5 * (10**18);
uint public maxReviewDelay = 20 seconds; // maximum period to resolve a dispute
// Agent Status
uint256 constant _INIT = 1;
uint256 constant _WAITING = 2;
uint256 constant _REVIEW = 3;
uint256 constant _APPROVED = 4;
uint256 constant _DISAPPROVED = 5;
uint256 constant _EARNED = 6;
uint256 constant _LOST = 7;
uint256 constant _BAN = 8;
mapping(address => Agent) public agents;
function resetInitialAgentScore(uint256 _newInitialAgentScore)
external
onlyOwner
{
require(_newInitialAgentScore > 0, "Invalid value");
initialAgentScore = _newInitialAgentScore;
}
function resetMaxReviewDelay(uint256 newMaxReviewDelay) external onlyOwner{
require(newMaxReviewDelay > 0, "Invalid value");
maxReviewDelay = newMaxReviewDelay;
}
function resetCriteriaScore(uint256 _newCriteriaScore) external onlyOwner {
require(_newCriteriaScore >= 0, "Invalid value");
criteriaScore = _newCriteriaScore;
}
function resetDisputeBonusAmount(uint256 _newDisputeBonusAmount)
external
onlyOwner
{
require(_newDisputeBonusAmount >= 0, "Invalid value");
disputeBonusAmount = _newDisputeBonusAmount * (10**18);
}
function resetScoreUp(uint256 _newScoreUp) external onlyOwner {
require(_newScoreUp >= 0, "Invalid value");
scoreUp = _newScoreUp;
}
function resetScoreDown(uint256 _newScoreDown) external onlyOwner {
require(_newScoreDown >= 0, "Invalid value");
scoreDown = _newScoreDown;
}
function resetDisputeReviewGroupCount(uint256 _newDisputeReviewGroupCount)
external
onlyOwner
{
require(_newDisputeReviewGroupCount > 0, "Invalid value");
require(
_newDisputeReviewGroupCount >= disputeReviewConsensusCount,
"Should be larger number than the Consensus count"
);
disputeReviewGroupCount = _newDisputeReviewGroupCount;
}
function resetDisputeReviewConsensusCount(
uint256 _newDisputeReviewConsensusCount
) external onlyOwner {
require(_newDisputeReviewConsensusCount > 0, "Invalid value");
require(
_newDisputeReviewConsensusCount <= disputeReviewGroupCount,
"Should be smaller number than the Group count"
);
disputeReviewConsensusCount = _newDisputeReviewConsensusCount;
}
function resetAgentPaticipateAmount(uint256 _newAgentPaticipateAmount)
external
onlyOwner
{
require(_newAgentPaticipateAmount > 0, "Invalid value");
agentPaticipateAmount = _newAgentPaticipateAmount * (10**18);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IGateway {}// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.6.0;
import "../IERC20.sol";
// helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false
library TransferHelper {
function safeApprove(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x095ea7b3, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeApprove: approve failed"
);
}
function safeTransfer(
address token,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0xa9059cbb, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::safeTransfer: transfer failed"
);
}
function safeTransferFrom(
address token,
address from,
address to,
uint256 value
) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(
abi.encodeWithSelector(0x23b872dd, from, to, value)
);
require(
success && (data.length == 0 || abi.decode(data, (bool))),
"TransferHelper::transferFrom: transferFrom failed"
);
}
function safeTransferETH(address to, uint256 value) internal {
(bool success, ) = to.call{value: value}(new bytes(0));
require(
success,
"TransferHelper::safeTransferETH: ETH transfer failed"
);
}
function allowance(
address token,
address owner,
address spender
) internal view returns (uint256) {
return IERC20(token).allowance(owner, spender);
}
function balanceOf(address token, address account)
internal
view
returns (uint256)
{
return IERC20(token).balanceOf(account);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)
pragma solidity ^0.8.0;
import "../utils/Context.sol";
/**
* @dev Contract module which provides a basic access control mechanism, where
* there is an account (an owner) that can be granted exclusive access to
* specific functions.
*
* By default, the owner account will be the one that deploys the contract. This
* can later be changed with {transferOwnership}.
*
* This module is used through inheritance. It will make available the modifier
* `onlyOwner`, which can be applied to your functions to restrict their use to
* the owner.
*/
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
_transferOwnership(_msgSender());
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Internal function without access restriction.
*/
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IEscrow {
struct Escrow {
uint256 productId;
address buyerAddress;
address merchantAddress;
uint256 amount;
uint256 escrowWithdrawableTime;
uint256 escrowDisputableTime;
uint256 status;
uint256 createdAt;
}
event Escrowed(
address indexed _from,
uint256 indexed _productID,
uint256 _amount,
uint256 indexed _escrowId
);
event Withdraw(
address indexed _withdrawer,
uint256 indexed _escrowId,
uint256 _amount
);
event Refunded(
address indexed _withdrawer,
uint256 indexed _escrowId,
uint256 _amount
);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
import '@uniswap/v3-periphery/contracts/interfaces/ISwapRouter.sol';
import "@uniswap/v3-periphery/contracts/interfaces/IQuoter.sol";
interface IUniswapRouter is ISwapRouter {
function refundETH() external payable;
}
contract UniswapV3ForMto {
IUniswapRouter public constant uniswapRouter = IUniswapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564); // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address
IQuoter public constant quoter = IQuoter(0xb27308f9F90D607463bb33eA1BeBb41C27CE5AB6); // Mainnet, Goerli, Arbitrum, Optimism, Polygon Address
// address private constant WETH9 = 0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6; //Goerli
address private constant WETH9 = 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2;
// mainnet
uint24 private constant FEE = 3000;
function convertEthToExactToken(uint256 mtoAmount, address mtoToken, uint256 deadline) public payable {
require(mtoAmount > 0, "Must pass non 0 MTO amount");
require(msg.value > 0, "Must pass non 0 ETH amount");
address tokenIn = WETH9;
address tokenOut = mtoToken;
address recipient = msg.sender;
uint256 amountOut = mtoAmount;
uint256 amountInMaximum = msg.value;
uint160 sqrtPriceLimitX96 = 0;
ISwapRouter.ExactOutputSingleParams memory params = ISwapRouter.ExactOutputSingleParams(
tokenIn,
tokenOut,
FEE,
recipient,
deadline,
amountOut,
amountInMaximum,
sqrtPriceLimitX96
);
uniswapRouter.exactOutputSingle{ value: msg.value }(params);
uniswapRouter.refundETH();
// refund leftover ETH to user
(bool success,) = msg.sender.call{ value: address(this).balance }("");
require(success, "refund failed");
}
function getEstimatedETHforToken(address mtoToken, uint mtoAmount) external payable returns (uint256) {
address tokenIn = WETH9;
address tokenOut = mtoToken;
uint24 fee = 3000;
uint160 sqrtPriceLimitX96 = 0;
return quoter.quoteExactOutputSingle(
tokenIn,
tokenOut,
fee,
mtoAmount,
sqrtPriceLimitX96
);
}
// important to receive ETH
receive() payable external {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.3.2 (token/ERC20/IERC20.sol)
pragma solidity ^0.8.0;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @dev Returns the amount of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the amount of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves `amount` tokens from the caller's account to `recipient`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address recipient, uint256 amount)
external
returns (bool);
/**
* @dev Returns the remaining number of tokens that `spender` will be
* allowed to spend on behalf of `owner` through {transferFrom}. This is
* zero by default.
*
* This value changes when {approve} or {transferFrom} are called.
*/
function allowance(address owner, address spender)
external
view
returns (uint256);
/**
* @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* IMPORTANT: Beware that changing an allowance with this method brings the risk
* that someone may use both the old and the new allowance by unfortunate
* transaction ordering. One possible solution to mitigate this race
* condition is to first reduce the spender's allowance to 0 and set the
* desired value afterwards:
* https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
*
* Emits an {Approval} event.
*/
function approve(address spender, uint256 amount) external returns (bool);
/**
* @dev Moves `amount` tokens from `sender` to `recipient` using the
* allowance mechanism. `amount` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
/**
* @dev Emitted when `value` tokens are moved from one account (`from`) to
* another (`to`).
*
* Note that `value` may be zero.
*/
event Transfer(address indexed from, address indexed to, uint256 value);
/**
* @dev Emitted when the allowance of a `spender` for an `owner` is set by
* a call to {approve}. `value` is the new allowance.
*/
event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
import '@uniswap/v3-core/contracts/interfaces/callback/IUniswapV3SwapCallback.sol';
/// @title Router token swapping functionality
/// @notice Functions for swapping tokens via Uniswap V3
interface ISwapRouter is IUniswapV3SwapCallback {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another token
/// @param params The parameters necessary for the swap, encoded as `ExactInputSingleParams` in calldata
/// @return amountOut The amount of the received token
function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountIn;
uint256 amountOutMinimum;
}
/// @notice Swaps `amountIn` of one token for as much as possible of another along the specified path
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactInputParams` in calldata
/// @return amountOut The amount of the received token
function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut);
struct ExactOutputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
uint160 sqrtPriceLimitX96;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another token
/// @param params The parameters necessary for the swap, encoded as `ExactOutputSingleParams` in calldata
/// @return amountIn The amount of the input token
function exactOutputSingle(ExactOutputSingleParams calldata params) external payable returns (uint256 amountIn);
struct ExactOutputParams {
bytes path;
address recipient;
uint256 deadline;
uint256 amountOut;
uint256 amountInMaximum;
}
/// @notice Swaps as little as possible of one token for `amountOut` of another along the specified path (reversed)
/// @param params The parameters necessary for the multi-hop swap, encoded as `ExactOutputParams` in calldata
/// @return amountIn The amount of the input token
function exactOutput(ExactOutputParams calldata params) external payable returns (uint256 amountIn);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.7.5;
pragma abicoder v2;
/// @title Quoter Interface
/// @notice Supports quoting the calculated amounts from exact input or exact output swaps
/// @dev These functions are not marked view because they rely on calling non-view functions and reverting
/// to compute the result. They are also not gas efficient and should not be called on-chain.
interface IQuoter {
/// @notice Returns the amount out received for a given exact input swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee
/// @param amountIn The amount of the first token to swap
/// @return amountOut The amount of the last token that would be received
function quoteExactInput(bytes memory path, uint256 amountIn) external returns (uint256 amountOut);
/// @notice Returns the amount out received for a given exact input but for a swap of a single pool
/// @param tokenIn The token being swapped in
/// @param tokenOut The token being swapped out
/// @param fee The fee of the token pool to consider for the pair
/// @param amountIn The desired input amount
/// @param sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountOut The amount of `tokenOut` that would be received
function quoteExactInputSingle(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountIn,
uint160 sqrtPriceLimitX96
) external returns (uint256 amountOut);
/// @notice Returns the amount in required for a given exact output swap without executing the swap
/// @param path The path of the swap, i.e. each token pair and the pool fee. Path must be provided in reverse order
/// @param amountOut The amount of the last token to receive
/// @return amountIn The amount of first token required to be paid
function quoteExactOutput(bytes memory path, uint256 amountOut) external returns (uint256 amountIn);
/// @notice Returns the amount in required to receive the given exact output amount but for a swap of a single pool
/// @param tokenIn The token being swapped in
/// @param tokenOut The token being swapped out
/// @param fee The fee of the token pool to consider for the pair
/// @param amountOut The desired output amount
/// @param sqrtPriceLimitX96 The price limit of the pool that cannot be exceeded by the swap
/// @return amountIn The amount required as the input for the swap in order to receive `amountOut`
function quoteExactOutputSingle(
address tokenIn,
address tokenOut,
uint24 fee,
uint256 amountOut,
uint160 sqrtPriceLimitX96
) external returns (uint256 amountIn);
}// SPDX-License-Identifier: GPL-2.0-or-later
pragma solidity >=0.5.0;
/// @title Callback for IUniswapV3PoolActions#swap
/// @notice Any contract that calls IUniswapV3PoolActions#swap must implement this interface
interface IUniswapV3SwapCallback {
/// @notice Called to `msg.sender` after executing a swap via IUniswapV3Pool#swap.
/// @dev In the implementation you must pay the pool tokens owed for the swap.
/// The caller of this method must be checked to be a UniswapV3Pool deployed by the canonical UniswapV3Factory.
/// amount0Delta and amount1Delta can both be 0 if no tokens were swapped.
/// @param amount0Delta The amount of token0 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token0 to the pool.
/// @param amount1Delta The amount of token1 that was sent (negative) or must be received (positive) by the pool by
/// the end of the swap. If positive, the callback must send that amount of token1 to the pool.
/// @param data Any data passed through by the caller via the IUniswapV3PoolActions#swap call
function uniswapV3SwapCallback(
int256 amount0Delta,
int256 amount1Delta,
bytes calldata data
) external;
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IDispute {
struct Dispute {
uint256 escrowId;
uint256 approvedCount; // (default: 0)
uint256 disapprovedCount; // (default: 0)
uint256 status; // (default: 0) 1: init, 2: waiting, 3: review, 4: win, 4: fail
uint256 applied_agents_count;
uint256 createdAt;
uint256 updatedAt;
}
event Disputed(
address indexed _from,
uint256 indexed _disputeId,
uint256 indexed _escrowId
);
event SubmittedDispute(
address indexed _agentAddress,
uint256 indexed _disputeId,
uint256 indexed _decision
);
event DisputeApproved(uint256 indexed _disputeId);
event DisputeDisapproved(uint256 indexed _disputeId);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
interface IAgent {
struct Agent {
uint256 score; // (default: initial_agent_score)
uint256 participationCount;
uint256 accumulatedAmount;
uint256 assignedDisputeId;
uint256 status;
}
event AgentParticipated(address indexed _agentAddress);
event AssignAgent(
address indexed _agentAddress,
uint256 indexed _disputeId
);
event AgentWithdraw(address indexed _withdrawer, uint256 _amount);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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;
}
}{
"optimizer": {
"enabled": true,
"runs": 1000
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_token","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_agentAddress","type":"address"}],"name":"AgentParticipated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"AgentWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_agentAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"AssignAgent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"DisputeApproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"DisputeDisapproved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_escrowId","type":"uint256"}],"name":"Disputed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"uint256","name":"_productID","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_escrowId","type":"uint256"}],"name":"Escrowed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":true,"internalType":"uint256","name":"_escrowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Refunded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_agentAddress","type":"address"},{"indexed":true,"internalType":"uint256","name":"_disputeId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_decision","type":"uint256"}],"name":"SubmittedDispute","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_withdrawer","type":"address"},{"indexed":true,"internalType":"uint256","name":"_escrowId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_currentCaller","type":"address"},{"internalType":"uint256","name":"_escrowId","type":"uint256"}],"name":"_withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"adminWithdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"agentPaticipateAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"agentWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"agents","outputs":[{"internalType":"uint256","name":"score","type":"uint256"},{"internalType":"uint256","name":"participationCount","type":"uint256"},{"internalType":"uint256","name":"accumulatedAmount","type":"uint256"},{"internalType":"uint256","name":"assignedDisputeId","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"uint256","name":"_decision","type":"uint256"}],"name":"applyADM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mtoAmount","type":"uint256"},{"internalType":"address","name":"mtoToken","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"convertEthToExactToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"criteriaScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentDisputeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentEscrowId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disputeBonusAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disputeReviewConsensusCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disputeReviewGroupCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"disputes","outputs":[{"internalType":"uint256","name":"escrowId","type":"uint256"},{"internalType":"uint256","name":"approvedCount","type":"uint256"},{"internalType":"uint256","name":"disapprovedCount","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"applied_agents_count","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"},{"internalType":"uint256","name":"updatedAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"escrows","outputs":[{"internalType":"uint256","name":"productId","type":"uint256"},{"internalType":"address","name":"buyerAddress","type":"address"},{"internalType":"address","name":"merchantAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"escrowWithdrawableTime","type":"uint256"},{"internalType":"uint256","name":"escrowDisputableTime","type":"uint256"},{"internalType":"uint256","name":"status","type":"uint256"},{"internalType":"uint256","name":"createdAt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"mtoToken","type":"address"},{"internalType":"uint256","name":"mtoAmount","type":"uint256"}],"name":"getEstimatedETHforToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_merchantAddress","type":"address"}],"name":"getMerchantReputation","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initialAgentScore","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxReviewDelay","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"participate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"}],"name":"pickDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pickedAgents","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_productId","type":"uint256"},{"internalType":"address","name":"_merchantAddress","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_escrowDisputableTime","type":"uint256"},{"internalType":"uint256","name":"_escrowWithdrawableTime","type":"uint256"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"contract IQuoter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newAgentPaticipateAmount","type":"uint256"}],"name":"resetAgentPaticipateAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCriteriaScore","type":"uint256"}],"name":"resetCriteriaScore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDisputeBonusAmount","type":"uint256"}],"name":"resetDisputeBonusAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDisputeReviewConsensusCount","type":"uint256"}],"name":"resetDisputeReviewConsensusCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDisputeReviewGroupCount","type":"uint256"}],"name":"resetDisputeReviewGroupCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newInitialAgentScore","type":"uint256"}],"name":"resetInitialAgentScore","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxReviewDelay","type":"uint256"}],"name":"resetMaxReviewDelay","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newScoreDown","type":"uint256"}],"name":"resetScoreDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newScoreUp","type":"uint256"}],"name":"resetScoreUp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTokenAddress","type":"address"}],"name":"resetTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"reviewers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scoreDown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scoreUp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_escrowId","type":"uint256"}],"name":"startDispute","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_disputeId","type":"uint256"},{"internalType":"uint256","name":"_decision","type":"uint256"}],"name":"submit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract IUniswapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_escrowId","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405260646005556046600655678ac7230489e80000600755600a600855600a6009556005600a556003600b55674563918244f40000600c556014600d553480156200004c57600080fd5b50604051620042be380380620042be8339810160408190526200006f916200014b565b6200007a33620000fb565b6001600160a01b038116620000d55760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420546f6b656e20416464726573730000000000000000000000604482015260640160405180910390fd5b600f80546001600160a01b0319166001600160a01b03929092169190911790556200017b565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156200015d578081fd5b81516001600160a01b038116811462000174578182fd5b9392505050565b614133806200018b6000396000f3fe6080604052600436106102f65760003560e01c806386f36b541161018f578063af7f012c116100e1578063d11711a21161008a578063f4d84baa11610064578063f4d84baa146108c7578063fc0c546a146108e7578063fd66091e1461090757600080fd5b8063d11711a214610872578063ed516cc014610887578063f2fde38b146108a757600080fd5b8063c0cfa7e5116100bb578063c0cfa7e514610814578063c6bbd5a714610834578063cb31c57b1461085c57600080fd5b8063af7f012c146107bf578063b2713847146107df578063bedb33f4146107f457600080fd5b80639efa2ddd11610143578063aca61e331161011d578063aca61e3314610780578063ad61d79614610796578063af7e0cbd146107a957600080fd5b80639efa2ddd14610720578063a2d535e814610740578063a711f23e1461076057600080fd5b80638ecd5dc5116101745780638ecd5dc5146106ca5780638fd0f3b4146106e057806394a80e5e1461070057600080fd5b806386f36b541461068c5780638da5cb5b146106ac57600080fd5b8063564a565d116102485780636916a435116101fc57806377c2f870116101d657806377c2f870146106365780637b7f5cee1461064c5780637f0afd531461066c57600080fd5b80636916a435146105c1578063715018a6146105e1578063735de9f7146105f657600080fd5b806361fa10081161022d57806361fa100814610575578063682846011461058b57806368673b37146105ab57600080fd5b8063564a565d146104d257806361f58ac01461055f57600080fd5b8063231d99fd116102aa5780632dfabbaf116102845780632dfabbaf1461047f5780632e1a7d4d1461049f5780632ff6a392146104bf57600080fd5b8063231d99fd1461042957806327d6d5e81461043f5780632a23b1c51461045f57600080fd5b80631208333a116102db5780631208333a146103de5780631ffcbd7c1461040057806321f4fb211461041657600080fd5b8063012f52ee146103025780630d252c2f146103ba57600080fd5b366102fd57005b600080fd5b34801561030e57600080fd5b5061036e61031d366004613f4b565b60026020819052600091825260409091208054600182015492820154600383015460048401546005850154600686015460079096015494966001600160a01b03908116969416949293919290919088565b604080519889526001600160a01b0397881660208a015295909616948701949094526060860192909252608085015260a084015260c083015260e0820152610100015b60405180910390f35b3480156103c657600080fd5b506103d0600b5481565b6040519081526020016103b1565b3480156103ea57600080fd5b506103fe6103f9366004613ec7565b610979565b005b34801561040c57600080fd5b506103d0600d5481565b6103fe610424366004613f9f565b610e1a565b34801561043557600080fd5b506103d060015481565b34801561044b57600080fd5b506103d061045a366004613ead565b610e3c565b34801561046b57600080fd5b506103fe61047a366004613f4b565b611044565b34801561048b57600080fd5b506103fe61049a366004613f4b565b611149565b3480156104ab57600080fd5b506103fe6104ba366004613f4b565b61145d565b6103d06104cd366004613f02565b611477565b3480156104de57600080fd5b5061052a6104ed366004613f4b565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460069095015493959294919390919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016103b1565b34801561056b57600080fd5b506103d060035481565b34801561058157600080fd5b506103d060095481565b34801561059757600080fd5b506103fe6105a6366004613fe4565b611564565b3480156105b757600080fd5b506103d0600c5481565b3480156105cd57600080fd5b506103fe6105dc366004613f4b565b61209e565b3480156105ed57600080fd5b506103fe61212b565b34801561060257600080fd5b5061061e73e592427a0aece92de3edee1f18e0157c0586156481565b6040516001600160a01b0390911681526020016103b1565b34801561064257600080fd5b506103d060075481565b34801561065857600080fd5b506103fe610667366004613f4b565b61217f565b34801561067857600080fd5b506103fe610687366004613f4b565b6121cc565b34801561069857600080fd5b506103fe6106a7366004613f4b565b612290565b3480156106b857600080fd5b506000546001600160a01b031661061e565b3480156106d657600080fd5b506103d060065481565b3480156106ec57600080fd5b5061061e6106fb366004613fe4565b6122f0565b34801561070c57600080fd5b5061061e61071b366004613fe4565b612328565b34801561072c57600080fd5b506103fe61073b366004613f4b565b612344565b34801561074c57600080fd5b506103fe61075b366004613f4b565b612391565b34801561076c57600080fd5b506103fe61077b366004613fe4565b612431565b34801561078c57600080fd5b506103d060085481565b6103fe6107a4366004613f7b565b6126b6565b3480156107b557600080fd5b506103d0600a5481565b3480156107cb57600080fd5b506103fe6107da366004613f4b565b6129b3565b3480156107eb57600080fd5b506103fe612ab8565b34801561080057600080fd5b506103fe61080f366004613f4b565b612b87565b34801561082057600080fd5b506103fe61082f366004613f4b565b612c14565b34801561084057600080fd5b5061061e73b27308f9f90d607463bb33ea1bebb41c27ce5ab681565b34801561086857600080fd5b506103d060055481565b34801561087e57600080fd5b506103fe612e3a565b34801561089357600080fd5b506103fe6108a2366004613ead565b61314d565b3480156108b357600080fd5b506103fe6108c2366004613ead565b613224565b3480156108d357600080fd5b506103fe6108e2366004613f4b565b6132f1565b3480156108f357600080fd5b50600f5461061e906001600160a01b031681565b34801561091357600080fd5b50610951610922366004613ead565b600e60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016103b1565b600081815260026020526040902060060154600114806109aa57506000818152600260205260409020600601546003145b6109fb5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642053746174757300000000000000000000000000000000000060448201526064015b60405180910390fd5b6000818152600260205260409020600401544211610a5b5760405162461bcd60e51b815260206004820152601f60248201527f457363726f77642074696d6520686173206e6f7420706173736564207965740060448201526064016109f2565b6000818152600260205260409020600101546001600160a01b0383811691161480610aa35750600081815260026020819052604090912001546001600160a01b038381169116145b610b145760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e656974686572204275796572206e6f72204d65726360448201527f68616e740000000000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546001148015610b5157506000818152600260205260409020600101546001600160a01b038381169116145b15610bc45760405162461bcd60e51b815260206004820152602760248201527f42757965722063616e6e6f7420776974686472617720696e2064656661756c7460448201527f207374617475730000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546003148015610c025750600081815260026020819052604090912001546001600160a01b038381169116145b15610c755760405162461bcd60e51b815260206004820152602960248201527f4d65726368616e742063616e6e6f7420776974686472617720696e207265667560448201527f6e6420737461747573000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546003148015610cb257506000818152600260205260409020600101546001600160a01b038381169116145b15610d475760008181526002602052604090206001810154600390910154610ce79185916001600160a01b039091169061333e565b6000818152600260209081526040918290206005600682015560030154915191825282916001600160a01b038516917f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee6691015b60405180910390a3505050565b6000818152600260205260409020600601546001148015610d855750600081815260026020819052604090912001546001600160a01b038381169116145b15610e155760008181526002602081905260409091206004600682015590810154600390910154610dc39185916001600160a01b039091169061333e565b80826001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686002600085815260200190815260200160002060030154604051610d3a91815260200190565b505050565b600f54610e35906001600160a01b03163387878787876134a6565b5050505050565b60006001600160a01b038216610e945760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964204d65726368616e742041646472657373000000000000000060448201526064016109f2565b600154610ea357506000919050565b6000808080808060015b6001548111610fd357600081815260026020819052604090912001546001600160a01b038a81169116148015610ef6575060008181526002602081905260409091206006015414155b15610fc1576000818152600260205260409020600601546001141580610f2c575060008181526002602052604090206004015442115b15610fc157610f3c87600161403e565b600082815260026020526040902060030154909750610f5b908561403e565b60008281526002602052604090206006015490945060031480610f8f57506000818152600260205260409020600601546005145b15610fc157610f9f86600161403e565b600082815260026020526040902060030154909650610fbe908461403e565b92505b80610fcb816140ac565b915050610ead565b5085610fe757506000979650505050505050565b85610ff28682614095565b610ffd90603c614076565b6110079190614056565b9350826110148382614095565b61101f906028614076565b6110299190614056565b90506000611037828661403e565b9998505050505050505050565b6000546001600160a01b0316331461108c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116110cc5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600a548111156111445760405162461bcd60e51b815260206004820152602d60248201527f53686f756c6420626520736d616c6c6572206e756d626572207468616e20746860448201527f652047726f757020636f756e740000000000000000000000000000000000000060648201526084016109f2565b600b55565b336000908152600e60205260409020600401546002146111ab5760405162461bcd60e51b815260206004820152601d60248201527f4167656e74206973206e6f7420696e2077616974696e6720737461746500000060448201526064016109f2565b600654336000908152600e6020526040902054101561120c5760405162461bcd60e51b815260206004820152600f60248201527f4c6f77206167656e742073636f7265000000000000000000000000000000000060448201526064016109f2565b6000818152600460205260409020546112675760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642064697370757465206964000000000000000000000000000060448201526064016109f2565b600a546000828152600460208190526040909120015410806112a65750600d5460008281526004602052604090206005015442916112a49161403e565b105b6112f25760405162461bcd60e51b815260206004820152601960248201527f6d6178206170706c696564206167656e7473206578636565640000000000000060448201526064016109f2565b6000818152600460205260409020600301546001148061132357506000818152600460205260409020600301546002145b8061133f57506000818152600460205260409020600390810154145b6113b15760405162461bcd60e51b815260206004820152602c60248201527f44697370757465206973206e6f7420696e20696e6974206e6f7220696e20776160448201527f6974696e6720737461747573000000000000000000000000000000000000000060648201526084016109f2565b60008181526011602090815260408083208054600180820183559185528385200180546001600160a01b0319163390811790915585855260048085528386206003808201819055928752600e865293862080820183905590910186905585855292839052910180549192909161142890849061403e565b9091555050604051819033907f7d636a9b6779a530818ef971666da96b33261b79a4403dbe8fbf63f478cbf4dc90600090a350565b600f54611474906001600160a01b03163383610979565b50565b6040517f30d07f2100000000000000000000000000000000000000000000000000000000815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482018190526001600160a01b0384166024830152610bb8604483018190526064830184905260006084840181905292859190849073b27308f9f90d607463bb33ea1bebb41c27ce5ab6906330d07f219060a401602060405180830381600087803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115599190613f63565b979650505050505050565b6000828152600460209081526040808320600654338552600e9093529083205490929111156115d55760405162461bcd60e51b815260206004820152601960248201527f546f6f206c6f772073636f726520617320616e204167656e740000000000000060448201526064016109f2565b336000908152600e60205260409020600401546003146116375760405162461bcd60e51b815260206004820152601d60248201527f4167656e74207374617475732073686f756c642062652072657669657700000060448201526064016109f2565b336000908152600e602052604090206003015484146116985760405162461bcd60e51b815260206004820152601960248201527f646973707574654944206973206e6f742061737369676e65640000000000000060448201526064016109f2565b336000908152600e6020908152604080832060030154835260049091529020546117045760405162461bcd60e51b815260206004820152601660248201527f446973707574654944206973206e6f742076616c69640000000000000000000060448201526064016109f2565b60048314806117135750600583145b61175f5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206465636973696f6e2076616c75650000000000000000000060448201526064016109f2565b336000908152600e60205260408120600190810180549192909161178490849061403e565b90915550506004831480156117a95750600b546001808401546117a69161403e565b10155b15611a13576117e3600e6000335b6001600160a01b03166001600160a01b0316815260200190815260200160002060066008546000613864565b6117ee8260046138ba565b60405184907fc71c10ff40c48d2ecbc30bda2dfe2391dda3d50acda44b9a3dac2bff08f94ff190600090a281546000908152600260205260408082206005600690910155600f54845483529120600181015460039091015461185d926001600160a01b0390811692169061333e565b8154600081815260026020908152604091829020600181015460039091015492519283526001600160a01b0316917f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee66910160405180910390a360005b6000858152601060205260409020548110156119795760008581526010602052604081208054600e9291908490811061190257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020600480820154919350141561194a576119458260066008546000613864565b611967565b600582600401541415611967576119678260076009546000613864565b80611971816140ac565b9150506118b9565b5060005b600085815260116020526040902054811015611a0d5760008581526011602052604081208054600e929190849081106119c657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001812092506119fb90839060029080613864565b80611a05816140ac565b91505061197d565b50612019565b600583148015611a345750600b546002830154611a3190600161403e565b10155b15611c8157611a46600e6000336117b7565b611a518260056138ba565b60405184907f3dd32c251705396f0b03974a84a706fb0e418b8d3bf651ef2cc3619d2c706ec590600090a28154600090815260026020526040812060046006909101555b600085815260106020526040902054811015611b565760008581526010602052604081208054600e92919084908110611ade57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020600481015490925060051415611b2757611b228260066008546000613864565b611b44565b600482600401541415611b4457611b448260076009546000613864565b80611b4e816140ac565b915050611a95565b5060005b600085815260116020526040902054811015611bea5760008581526011602052604081208054600e92919084908110611ba357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181209250611bd890839060029080613864565b80611be2816140ac565b915050611b5a565b50600f548254600090815260026020819052604090912090810154600390910154611c22926001600160a01b0390811692169061333e565b81546000818152600260208181526040928390209182015460039092015492519283526001600160a01b03909116917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a3612019565b600483148015611ca05750600b54600180840154611c9e9161403e565b105b8015611ccc5750600a5482600201548360010154611cbe919061403e565b611cc990600161403e565b10155b15611e3a57611d06600e6000335b6001600160a01b03166001600160a01b0316815260200190815260200160002060076009546000613864565b611d118260016138ba565b60005b600085815260106020526040902054811015611da757611d95600e6000601060008981526020019081526020016000208481548110611d6357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120600954909160079190613864565b80611d9f816140ac565b915050611d14565b5060005b600085815260116020526040902054811015611a0d57611e28600e6000601160008981526020019081526020016000208481548110611dfa57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181209060029080613864565b80611e32816140ac565b915050611dab565b600583148015611e5a5750600b546002830154611e5890600161403e565b105b8015611e865750600a5482600201548360010154611e78919061403e565b611e8390600161403e565b10155b15611f6c57611e98600e600033611cda565b611ea38260016138ba565b60005b600085815260106020526040902054811015611f0757611ef5600e6000601060008981526020019081526020016000208481548110611d6357634e487b7160e01b600052603260045260246000fd5b80611eff816140ac565b915050611ea6565b5060005b600085815260116020526040902054811015611a0d57611f5a600e6000601160008981526020019081526020016000208481548110611dfa57634e487b7160e01b600052603260045260246000fd5b80611f64816140ac565b915050611f0b565b336000908152600e60205260408120611f8791859080613864565b611f91843361392a565b60008481526010602090815260408220805460018101825590835291200180546001600160a01b03191633179055600260038301554260068301556004831415611ff5576001826001016000828254611fea919061403e565b909155506120199050565b6005831415612019576001826002016000828254612013919061403e565b90915550505b600654336000908152600e602052604090205410801561204c5750336000908152600e6020526040902060040154600814155b1561206957336000908152600e6020526040902060086004909101555b6040518390859033907ffca0db59db313c62ac4536c6cc781daa2839f7c32a19036951cab42ad9bb7d9790600090a450505050565b6000546001600160a01b031633146120e65760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116121265760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600d55565b6000546001600160a01b031633146121735760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b61217d600061394f565b565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600855565b6000546001600160a01b031633146122145760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600f54819061222c906001600160a01b03163061399f565b116122795760405162461bcd60e51b815260206004820152601260248201527f4e6f7420656e6f7567682062616c616e6365000000000000000000000000000060448201526064016109f2565b600f54611474906001600160a01b0316338361333e565b6000546001600160a01b031633146122d85760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6122ea81670de0b6b3a7640000614076565b60075550565b6010602052816000526040600020818154811061230c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6011602052816000526040600020818154811061230c57600080fd5b6000546001600160a01b0316331461238c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600955565b6000546001600160a01b031633146123d95760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116124195760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b61242b81670de0b6b3a7640000614076565b600c5550565b6000546001600160a01b031633146124795760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600082815260046020908152604080832080548452600290925290912060038201546001146124ea5760405162461bcd60e51b815260206004820152601c60248201527f44697370757465206973206e6f7420696e20696e69742073746174650000000060448201526064016109f2565b60048314806124f95750600583145b6125455760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206465636973696f6e2076616c75650000000000000000000060448201526064016109f2565b6004831415612601576004600383015542600683015560405184907fc71c10ff40c48d2ecbc30bda2dfe2391dda3d50acda44b9a3dac2bff08f94ff190600090a260056006820155600f54600182015460038301546125b1926001600160a01b0390811692169061333e565b8154600182015460038301546040519081526001600160a01b03909116907f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee669060200160405180910390a36126b0565b6005600383015542600683015560405184907f3dd32c251705396f0b03974a84a706fb0e418b8d3bf651ef2cc3619d2c706ec590600090a260046006820155600f5460028201546003830154612664926001600160a01b0390811692169061333e565b8154600282015460038301546040519081526001600160a01b03909116907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35b50505050565b600083116127065760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e2030204d544f20616d6f756e7400000000000060448201526064016109f2565b600034116127565760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e20302045544820616d6f756e7400000000000060448201526064016109f2565b604080516101008101825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28082526001600160a01b0385811660208401908152610bb884860190815233606086018181526080870189815260a088018c81523460c08a01818152600060e08c018181529c517fdb3e21980000000000000000000000000000000000000000000000000000000081528c518b16600482015298518a1660248a0152965162ffffff166044890152935188166064880152915160848701525160a4860152905160c4850152965190931660e48301529294879492938993919290919073e592427a0aece92de3edee1f18e0157c058615649063db3e2198908590610104016020604051808303818588803b15801561286d57600080fd5b505af1158015612881573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128a69190613f63565b5073e592427a0aece92de3edee1f18e0157c058615646001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50506040516000925033915047908381818185875af1925050503d8060008114612950576040519150601f19603f3d011682016040523d82523d6000602084013e612955565b606091505b50509050806129a65760405162461bcd60e51b815260206004820152600d60248201527f726566756e64206661696c65640000000000000000000000000000000000000060448201526064016109f2565b5050505050505050505050565b6000546001600160a01b031633146129fb5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b60008111612a3b5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600b54811015612ab35760405162461bcd60e51b815260206004820152603060248201527f53686f756c64206265206c6172676572206e756d626572207468616e2074686560448201527f20436f6e73656e73757320636f756e740000000000000000000000000000000060648201526084016109f2565b600a55565b336000908152600e6020526040902060040154600614612b1a5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420776974686472617720756e6561726e656420746f6b656e730060448201526064016109f2565b336000818152600e602052604090206001600490910155600f54600754612b4d926001600160a01b03909216919061333e565b60075460405190815233907fb03c88f07f9396007f23848aba1e1c6ab0de3388ae077c0d8c9a5f6fe7f2585e9060200160405180910390a2565b6000546001600160a01b03163314612bcf5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b60008111612c0f5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600555565b600081815260026020526040902060060154600114612c9b5760405162461bcd60e51b815260206004820152602b60248201527f457363726f7720737461747573206d757374206265206f6e207468652044454660448201527f41554c542073746174757300000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600101546001600160a01b0316336001600160a01b031614612d0d5760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f742062757965720000000000000000000000000060448201526064016109f2565b600081815260026020526040902060050154421015612d945760405162461bcd60e51b815260206004820152602560248201527f506c65617365207761697420756e74696c207468652064697370757461626c6560448201527f2074696d6500000000000000000000000000000000000000000000000000000060648201526084016109f2565b600081815260026020526040902060040154421115612e1b5760405162461bcd60e51b815260206004820152602260248201527f44697370757461626c652074696d65207761732070617373656420616c72656160448201527f647900000000000000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260208190526040909120600601556114743382613a3c565b336000908152600e6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546060820152600490910154608082018190521580612e98575060078160800151145b80612ea7575060018160800151145b612ef35760405162461bcd60e51b815260206004820152600c60248201527f57726f6e6720737461747573000000000000000000000000000000000000000060448201526064016109f2565b600c54600f54612f0c906001600160a01b03163361399f565b1015612f5a5760405162461bcd60e51b815260206004820152601260248201527f4e6f7420636f727265637420616d6f756e74000000000000000000000000000060448201526064016109f2565b602081015115801590612f6f57506006548151105b15612fe25760405162461bcd60e51b815260206004820152603a60248201527f596f7572206167656e742073636f726520697320746f6f206c6f772c20736f2060448201527f63616e277420706172746963697061746520616e79206d6f726500000000000060648201526084016109f2565b6020810151613070576040518060a00160405280600554815260200160008152602001600c548152602001600081526020016002815250600e60006130243390565b6001600160a01b03168152602080820192909252604090810160002083518155918301516001830155820151600282015560608201516003820155608090910151600490910155613105565b6040518060a001604052808260000151815260200182602001518152602001600c5483604001516130a1919061403e565b8152602001600081526020016002815250600e60006130bd3390565b6001600160a01b031681526020808201929092526040908101600020835181559183015160018301558201516002820155606082015160038201556080909101516004909101555b600f5461311f906001600160a01b03163330600c54613b2f565b60405133907f018d4d8340bc3bf11d6ca79138bcbd4cda4bfa47979fe011180c44f42045b05690600090a250565b6000546001600160a01b031633146131955760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6001600160a01b038116158015906131b657506001600160a01b0381163014155b6132025760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420546f6b656e2041646472657373000000000000000000000060448201526064016109f2565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461326c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6001600160a01b0381166132e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f2565b6114748161394f565b6000546001600160a01b031633146133395760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600655565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133c89190614005565b6000604051808303816000865af19150503d8060008114613405576040519150601f19603f3d011682016040523d82523d6000602084013e61340a565b606091505b50915091508180156134345750805115806134345750808060200190518101906134349190613f2b565b610e355760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016109f2565b6001600160a01b0384166134fc5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964204d65726368616e742041646472657373000000000000000060448201526064016109f2565b600083116135725760405162461bcd60e51b815260206004820152602160248201527f416d6f756e742073686f756c6420626520626967676572207468616e207a657260448201527f6f0000000000000000000000000000000000000000000000000000000000000060648201526084016109f2565b8261357d888861399f565b10156135a6576135a6613590888861399f565b61359a9085614095565b886107a442600f61403e565b826135b2888830613ca7565b10156136265760405162461bcd60e51b815260206004820152603860248201527f596f752073686f756c6420617070726f766520746f6b656e207472616e73666560448201527f7220746f207468697320636f6e7472616374206669727374000000000000000060648201526084016109f2565b42821161369b5760405162461bcd60e51b815260206004820152603160248201527f44697370757461626c652074696d652073686f756c64206265206c617465722060448201527f7468616e2063757272656e742074696d6500000000000000000000000000000060648201526084016109f2565b8181116137105760405162461bcd60e51b815260206004820152603260248201527f57697468647261772054696d652073686f756c64206265206c6174657220746860448201527f616e2044697370757461626c652074696d65000000000000000000000000000060648201526084016109f2565b604051806101000160405280868152602001876001600160a01b03168152602001856001600160a01b03168152602001848152602001828152602001838152602001600160ff16815260200142815250600260006001546001613773919061403e565b815260208082019290925260409081016000208351815591830151600180840180546001600160a01b039384166001600160a01b03199182161790915592850151600285018054919093169316929092179055606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e09092015160079091015580546138059161403e565b60015561381487873086613b2f565b60015485876001600160a01b03167fa9109df3859bf693666519bfe05558b3eba6f23595166574501a780b048fa1a08660405161385391815260200190565b60405180910390a450505050505050565b60048401839055600783141561389357818460000160008282546138889190614095565b909155506138ad9050565b818460000160008282546138a7919061403e565b90915550505b6003909301929092555050565b6003820181905560058114156138ea5760018260020160008282546138df919061403e565b909155506139209050565b60048114156139085760018260010160008282546138df919061403e565b60018114156139205760006001830181905560028301555b5042600690910155565b6000828152601160205260408120906139438284613d4d565b90506126b08282613da7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600091908416906370a082319060240160206040518083038186803b1580156139fd57600080fd5b505afa158015613a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a359190613f63565b9392505050565b6040518060e001604052808281526020016000815260200160008152602001600160ff1681526020016000815260200142815260200142815250600460006003546001613a89919061403e565b8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506003546001613aef919061403e565b60038190556040518291906001600160a01b038516907f1c6f08c96efb335230689aefcc13e09333521cedf5e7f7a34b3b48bd1cdf570190600090a45050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613bc19190614005565b6000604051808303816000865af19150503d8060008114613bfe576040519150601f19603f3d011682016040523d82523d6000602084013e613c03565b606091505b5091509150818015613c2d575080511580613c2d575080806020019051810190613c2d9190613f2b565b613c9f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016109f2565b505050505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301526000919085169063dd62ed3e9060440160206040518083038186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d459190613f63565b949350505050565b6000805b826001600160a01b0316848281548110613d7b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614613a355780613d9f816140ac565b915050613d51565b81548110613db3575050565b81548290613dc390600190614095565b81548110613de157634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316828281548110613e1f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081805480613e6b57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80356001600160a01b0381168114613ea857600080fd5b919050565b600060208284031215613ebe578081fd5b613a3582613e91565b600080600060608486031215613edb578182fd5b613ee484613e91565b9250613ef260208501613e91565b9150604084013590509250925092565b60008060408385031215613f14578182fd5b613f1d83613e91565b946020939093013593505050565b600060208284031215613f3c578081fd5b81518015158114613a35578182fd5b600060208284031215613f5c578081fd5b5035919050565b600060208284031215613f74578081fd5b5051919050565b600080600060608486031215613f8f578283fd5b83359250613ef260208501613e91565b600080600080600060a08688031215613fb6578081fd5b85359450613fc660208701613e91565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215613ff6578182fd5b50508035926020909101359150565b60008251815b81811015614025576020818601810151858301520161400b565b818111156140335782828501525b509190910192915050565b60008219821115614051576140516140c7565b500190565b60008261407157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614090576140906140c7565b500290565b6000828210156140a7576140a76140c7565b500390565b60006000198214156140c0576140c06140c7565b5060010190565b634e487b7160e01b600052601160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209c61a8a2cf616a3b5822318fc0bf72cc276044a0b6faab2d5b902f57b5717d4e64736f6c63430008040033000000000000000000000000e66b3aa360bb78468c00bebe163630269db3324f
Deployed Bytecode
0x6080604052600436106102f65760003560e01c806386f36b541161018f578063af7f012c116100e1578063d11711a21161008a578063f4d84baa11610064578063f4d84baa146108c7578063fc0c546a146108e7578063fd66091e1461090757600080fd5b8063d11711a214610872578063ed516cc014610887578063f2fde38b146108a757600080fd5b8063c0cfa7e5116100bb578063c0cfa7e514610814578063c6bbd5a714610834578063cb31c57b1461085c57600080fd5b8063af7f012c146107bf578063b2713847146107df578063bedb33f4146107f457600080fd5b80639efa2ddd11610143578063aca61e331161011d578063aca61e3314610780578063ad61d79614610796578063af7e0cbd146107a957600080fd5b80639efa2ddd14610720578063a2d535e814610740578063a711f23e1461076057600080fd5b80638ecd5dc5116101745780638ecd5dc5146106ca5780638fd0f3b4146106e057806394a80e5e1461070057600080fd5b806386f36b541461068c5780638da5cb5b146106ac57600080fd5b8063564a565d116102485780636916a435116101fc57806377c2f870116101d657806377c2f870146106365780637b7f5cee1461064c5780637f0afd531461066c57600080fd5b80636916a435146105c1578063715018a6146105e1578063735de9f7146105f657600080fd5b806361fa10081161022d57806361fa100814610575578063682846011461058b57806368673b37146105ab57600080fd5b8063564a565d146104d257806361f58ac01461055f57600080fd5b8063231d99fd116102aa5780632dfabbaf116102845780632dfabbaf1461047f5780632e1a7d4d1461049f5780632ff6a392146104bf57600080fd5b8063231d99fd1461042957806327d6d5e81461043f5780632a23b1c51461045f57600080fd5b80631208333a116102db5780631208333a146103de5780631ffcbd7c1461040057806321f4fb211461041657600080fd5b8063012f52ee146103025780630d252c2f146103ba57600080fd5b366102fd57005b600080fd5b34801561030e57600080fd5b5061036e61031d366004613f4b565b60026020819052600091825260409091208054600182015492820154600383015460048401546005850154600686015460079096015494966001600160a01b03908116969416949293919290919088565b604080519889526001600160a01b0397881660208a015295909616948701949094526060860192909252608085015260a084015260c083015260e0820152610100015b60405180910390f35b3480156103c657600080fd5b506103d0600b5481565b6040519081526020016103b1565b3480156103ea57600080fd5b506103fe6103f9366004613ec7565b610979565b005b34801561040c57600080fd5b506103d0600d5481565b6103fe610424366004613f9f565b610e1a565b34801561043557600080fd5b506103d060015481565b34801561044b57600080fd5b506103d061045a366004613ead565b610e3c565b34801561046b57600080fd5b506103fe61047a366004613f4b565b611044565b34801561048b57600080fd5b506103fe61049a366004613f4b565b611149565b3480156104ab57600080fd5b506103fe6104ba366004613f4b565b61145d565b6103d06104cd366004613f02565b611477565b3480156104de57600080fd5b5061052a6104ed366004613f4b565b6004602081905260009182526040909120805460018201546002830154600384015494840154600585015460069095015493959294919390919087565b604080519788526020880196909652948601939093526060850191909152608084015260a083015260c082015260e0016103b1565b34801561056b57600080fd5b506103d060035481565b34801561058157600080fd5b506103d060095481565b34801561059757600080fd5b506103fe6105a6366004613fe4565b611564565b3480156105b757600080fd5b506103d0600c5481565b3480156105cd57600080fd5b506103fe6105dc366004613f4b565b61209e565b3480156105ed57600080fd5b506103fe61212b565b34801561060257600080fd5b5061061e73e592427a0aece92de3edee1f18e0157c0586156481565b6040516001600160a01b0390911681526020016103b1565b34801561064257600080fd5b506103d060075481565b34801561065857600080fd5b506103fe610667366004613f4b565b61217f565b34801561067857600080fd5b506103fe610687366004613f4b565b6121cc565b34801561069857600080fd5b506103fe6106a7366004613f4b565b612290565b3480156106b857600080fd5b506000546001600160a01b031661061e565b3480156106d657600080fd5b506103d060065481565b3480156106ec57600080fd5b5061061e6106fb366004613fe4565b6122f0565b34801561070c57600080fd5b5061061e61071b366004613fe4565b612328565b34801561072c57600080fd5b506103fe61073b366004613f4b565b612344565b34801561074c57600080fd5b506103fe61075b366004613f4b565b612391565b34801561076c57600080fd5b506103fe61077b366004613fe4565b612431565b34801561078c57600080fd5b506103d060085481565b6103fe6107a4366004613f7b565b6126b6565b3480156107b557600080fd5b506103d0600a5481565b3480156107cb57600080fd5b506103fe6107da366004613f4b565b6129b3565b3480156107eb57600080fd5b506103fe612ab8565b34801561080057600080fd5b506103fe61080f366004613f4b565b612b87565b34801561082057600080fd5b506103fe61082f366004613f4b565b612c14565b34801561084057600080fd5b5061061e73b27308f9f90d607463bb33ea1bebb41c27ce5ab681565b34801561086857600080fd5b506103d060055481565b34801561087e57600080fd5b506103fe612e3a565b34801561089357600080fd5b506103fe6108a2366004613ead565b61314d565b3480156108b357600080fd5b506103fe6108c2366004613ead565b613224565b3480156108d357600080fd5b506103fe6108e2366004613f4b565b6132f1565b3480156108f357600080fd5b50600f5461061e906001600160a01b031681565b34801561091357600080fd5b50610951610922366004613ead565b600e60205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016103b1565b600081815260026020526040902060060154600114806109aa57506000818152600260205260409020600601546003145b6109fb5760405162461bcd60e51b815260206004820152600e60248201527f496e76616c69642053746174757300000000000000000000000000000000000060448201526064015b60405180910390fd5b6000818152600260205260409020600401544211610a5b5760405162461bcd60e51b815260206004820152601f60248201527f457363726f77642074696d6520686173206e6f7420706173736564207965740060448201526064016109f2565b6000818152600260205260409020600101546001600160a01b0383811691161480610aa35750600081815260026020819052604090912001546001600160a01b038381169116145b610b145760405162461bcd60e51b8152602060048201526024808201527f43616c6c6572206973206e656974686572204275796572206e6f72204d65726360448201527f68616e740000000000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546001148015610b5157506000818152600260205260409020600101546001600160a01b038381169116145b15610bc45760405162461bcd60e51b815260206004820152602760248201527f42757965722063616e6e6f7420776974686472617720696e2064656661756c7460448201527f207374617475730000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546003148015610c025750600081815260026020819052604090912001546001600160a01b038381169116145b15610c755760405162461bcd60e51b815260206004820152602960248201527f4d65726368616e742063616e6e6f7420776974686472617720696e207265667560448201527f6e6420737461747573000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600601546003148015610cb257506000818152600260205260409020600101546001600160a01b038381169116145b15610d475760008181526002602052604090206001810154600390910154610ce79185916001600160a01b039091169061333e565b6000818152600260209081526040918290206005600682015560030154915191825282916001600160a01b038516917f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee6691015b60405180910390a3505050565b6000818152600260205260409020600601546001148015610d855750600081815260026020819052604090912001546001600160a01b038381169116145b15610e155760008181526002602081905260409091206004600682015590810154600390910154610dc39185916001600160a01b039091169061333e565b80826001600160a01b03167ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5686002600085815260200190815260200160002060030154604051610d3a91815260200190565b505050565b600f54610e35906001600160a01b03163387878787876134a6565b5050505050565b60006001600160a01b038216610e945760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964204d65726368616e742041646472657373000000000000000060448201526064016109f2565b600154610ea357506000919050565b6000808080808060015b6001548111610fd357600081815260026020819052604090912001546001600160a01b038a81169116148015610ef6575060008181526002602081905260409091206006015414155b15610fc1576000818152600260205260409020600601546001141580610f2c575060008181526002602052604090206004015442115b15610fc157610f3c87600161403e565b600082815260026020526040902060030154909750610f5b908561403e565b60008281526002602052604090206006015490945060031480610f8f57506000818152600260205260409020600601546005145b15610fc157610f9f86600161403e565b600082815260026020526040902060030154909650610fbe908461403e565b92505b80610fcb816140ac565b915050610ead565b5085610fe757506000979650505050505050565b85610ff28682614095565b610ffd90603c614076565b6110079190614056565b9350826110148382614095565b61101f906028614076565b6110299190614056565b90506000611037828661403e565b9998505050505050505050565b6000546001600160a01b0316331461108c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116110cc5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600a548111156111445760405162461bcd60e51b815260206004820152602d60248201527f53686f756c6420626520736d616c6c6572206e756d626572207468616e20746860448201527f652047726f757020636f756e740000000000000000000000000000000000000060648201526084016109f2565b600b55565b336000908152600e60205260409020600401546002146111ab5760405162461bcd60e51b815260206004820152601d60248201527f4167656e74206973206e6f7420696e2077616974696e6720737461746500000060448201526064016109f2565b600654336000908152600e6020526040902054101561120c5760405162461bcd60e51b815260206004820152600f60248201527f4c6f77206167656e742073636f7265000000000000000000000000000000000060448201526064016109f2565b6000818152600460205260409020546112675760405162461bcd60e51b815260206004820152601260248201527f496e76616c69642064697370757465206964000000000000000000000000000060448201526064016109f2565b600a546000828152600460208190526040909120015410806112a65750600d5460008281526004602052604090206005015442916112a49161403e565b105b6112f25760405162461bcd60e51b815260206004820152601960248201527f6d6178206170706c696564206167656e7473206578636565640000000000000060448201526064016109f2565b6000818152600460205260409020600301546001148061132357506000818152600460205260409020600301546002145b8061133f57506000818152600460205260409020600390810154145b6113b15760405162461bcd60e51b815260206004820152602c60248201527f44697370757465206973206e6f7420696e20696e6974206e6f7220696e20776160448201527f6974696e6720737461747573000000000000000000000000000000000000000060648201526084016109f2565b60008181526011602090815260408083208054600180820183559185528385200180546001600160a01b0319163390811790915585855260048085528386206003808201819055928752600e865293862080820183905590910186905585855292839052910180549192909161142890849061403e565b9091555050604051819033907f7d636a9b6779a530818ef971666da96b33261b79a4403dbe8fbf63f478cbf4dc90600090a350565b600f54611474906001600160a01b03163383610979565b50565b6040517f30d07f2100000000000000000000000000000000000000000000000000000000815273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2600482018190526001600160a01b0384166024830152610bb8604483018190526064830184905260006084840181905292859190849073b27308f9f90d607463bb33ea1bebb41c27ce5ab6906330d07f219060a401602060405180830381600087803b15801561152157600080fd5b505af1158015611535573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115599190613f63565b979650505050505050565b6000828152600460209081526040808320600654338552600e9093529083205490929111156115d55760405162461bcd60e51b815260206004820152601960248201527f546f6f206c6f772073636f726520617320616e204167656e740000000000000060448201526064016109f2565b336000908152600e60205260409020600401546003146116375760405162461bcd60e51b815260206004820152601d60248201527f4167656e74207374617475732073686f756c642062652072657669657700000060448201526064016109f2565b336000908152600e602052604090206003015484146116985760405162461bcd60e51b815260206004820152601960248201527f646973707574654944206973206e6f742061737369676e65640000000000000060448201526064016109f2565b336000908152600e6020908152604080832060030154835260049091529020546117045760405162461bcd60e51b815260206004820152601660248201527f446973707574654944206973206e6f742076616c69640000000000000000000060448201526064016109f2565b60048314806117135750600583145b61175f5760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206465636973696f6e2076616c75650000000000000000000060448201526064016109f2565b336000908152600e60205260408120600190810180549192909161178490849061403e565b90915550506004831480156117a95750600b546001808401546117a69161403e565b10155b15611a13576117e3600e6000335b6001600160a01b03166001600160a01b0316815260200190815260200160002060066008546000613864565b6117ee8260046138ba565b60405184907fc71c10ff40c48d2ecbc30bda2dfe2391dda3d50acda44b9a3dac2bff08f94ff190600090a281546000908152600260205260408082206005600690910155600f54845483529120600181015460039091015461185d926001600160a01b0390811692169061333e565b8154600081815260026020908152604091829020600181015460039091015492519283526001600160a01b0316917f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee66910160405180910390a360005b6000858152601060205260409020548110156119795760008581526010602052604081208054600e9291908490811061190257634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020600480820154919350141561194a576119458260066008546000613864565b611967565b600582600401541415611967576119678260076009546000613864565b80611971816140ac565b9150506118b9565b5060005b600085815260116020526040902054811015611a0d5760008581526011602052604081208054600e929190849081106119c657634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b03168352820192909252604001812092506119fb90839060029080613864565b80611a05816140ac565b91505061197d565b50612019565b600583148015611a345750600b546002830154611a3190600161403e565b10155b15611c8157611a46600e6000336117b7565b611a518260056138ba565b60405184907f3dd32c251705396f0b03974a84a706fb0e418b8d3bf651ef2cc3619d2c706ec590600090a28154600090815260026020526040812060046006909101555b600085815260106020526040902054811015611b565760008581526010602052604081208054600e92919084908110611ade57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040019020600481015490925060051415611b2757611b228260066008546000613864565b611b44565b600482600401541415611b4457611b448260076009546000613864565b80611b4e816140ac565b915050611a95565b5060005b600085815260116020526040902054811015611bea5760008581526011602052604081208054600e92919084908110611ba357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181209250611bd890839060029080613864565b80611be2816140ac565b915050611b5a565b50600f548254600090815260026020819052604090912090810154600390910154611c22926001600160a01b0390811692169061333e565b81546000818152600260208181526040928390209182015460039092015492519283526001600160a01b03909116917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568910160405180910390a3612019565b600483148015611ca05750600b54600180840154611c9e9161403e565b105b8015611ccc5750600a5482600201548360010154611cbe919061403e565b611cc990600161403e565b10155b15611e3a57611d06600e6000335b6001600160a01b03166001600160a01b0316815260200190815260200160002060076009546000613864565b611d118260016138ba565b60005b600085815260106020526040902054811015611da757611d95600e6000601060008981526020019081526020016000208481548110611d6357634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b031683528201929092526040018120600954909160079190613864565b80611d9f816140ac565b915050611d14565b5060005b600085815260116020526040902054811015611a0d57611e28600e6000601160008981526020019081526020016000208481548110611dfa57634e487b7160e01b600052603260045260246000fd5b60009182526020808320909101546001600160a01b0316835282019290925260400181209060029080613864565b80611e32816140ac565b915050611dab565b600583148015611e5a5750600b546002830154611e5890600161403e565b105b8015611e865750600a5482600201548360010154611e78919061403e565b611e8390600161403e565b10155b15611f6c57611e98600e600033611cda565b611ea38260016138ba565b60005b600085815260106020526040902054811015611f0757611ef5600e6000601060008981526020019081526020016000208481548110611d6357634e487b7160e01b600052603260045260246000fd5b80611eff816140ac565b915050611ea6565b5060005b600085815260116020526040902054811015611a0d57611f5a600e6000601160008981526020019081526020016000208481548110611dfa57634e487b7160e01b600052603260045260246000fd5b80611f64816140ac565b915050611f0b565b336000908152600e60205260408120611f8791859080613864565b611f91843361392a565b60008481526010602090815260408220805460018101825590835291200180546001600160a01b03191633179055600260038301554260068301556004831415611ff5576001826001016000828254611fea919061403e565b909155506120199050565b6005831415612019576001826002016000828254612013919061403e565b90915550505b600654336000908152600e602052604090205410801561204c5750336000908152600e6020526040902060040154600814155b1561206957336000908152600e6020526040902060086004909101555b6040518390859033907ffca0db59db313c62ac4536c6cc781daa2839f7c32a19036951cab42ad9bb7d9790600090a450505050565b6000546001600160a01b031633146120e65760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116121265760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600d55565b6000546001600160a01b031633146121735760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b61217d600061394f565b565b6000546001600160a01b031633146121c75760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600855565b6000546001600160a01b031633146122145760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600f54819061222c906001600160a01b03163061399f565b116122795760405162461bcd60e51b815260206004820152601260248201527f4e6f7420656e6f7567682062616c616e6365000000000000000000000000000060448201526064016109f2565b600f54611474906001600160a01b0316338361333e565b6000546001600160a01b031633146122d85760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6122ea81670de0b6b3a7640000614076565b60075550565b6010602052816000526040600020818154811061230c57600080fd5b6000918252602090912001546001600160a01b03169150829050565b6011602052816000526040600020818154811061230c57600080fd5b6000546001600160a01b0316331461238c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600955565b6000546001600160a01b031633146123d95760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600081116124195760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b61242b81670de0b6b3a7640000614076565b600c5550565b6000546001600160a01b031633146124795760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600082815260046020908152604080832080548452600290925290912060038201546001146124ea5760405162461bcd60e51b815260206004820152601c60248201527f44697370757465206973206e6f7420696e20696e69742073746174650000000060448201526064016109f2565b60048314806124f95750600583145b6125455760405162461bcd60e51b815260206004820152601660248201527f496e76616c6964206465636973696f6e2076616c75650000000000000000000060448201526064016109f2565b6004831415612601576004600383015542600683015560405184907fc71c10ff40c48d2ecbc30bda2dfe2391dda3d50acda44b9a3dac2bff08f94ff190600090a260056006820155600f54600182015460038301546125b1926001600160a01b0390811692169061333e565b8154600182015460038301546040519081526001600160a01b03909116907f2dc8e290002f06fc0085bbca9dfb8b415cf4d1178950c72ff9ee8f4d8878ee669060200160405180910390a36126b0565b6005600383015542600683015560405184907f3dd32c251705396f0b03974a84a706fb0e418b8d3bf651ef2cc3619d2c706ec590600090a260046006820155600f5460028201546003830154612664926001600160a01b0390811692169061333e565b8154600282015460038301546040519081526001600160a01b03909116907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689060200160405180910390a35b50505050565b600083116127065760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e2030204d544f20616d6f756e7400000000000060448201526064016109f2565b600034116127565760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e20302045544820616d6f756e7400000000000060448201526064016109f2565b604080516101008101825273c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28082526001600160a01b0385811660208401908152610bb884860190815233606086018181526080870189815260a088018c81523460c08a01818152600060e08c018181529c517fdb3e21980000000000000000000000000000000000000000000000000000000081528c518b16600482015298518a1660248a0152965162ffffff166044890152935188166064880152915160848701525160a4860152905160c4850152965190931660e48301529294879492938993919290919073e592427a0aece92de3edee1f18e0157c058615649063db3e2198908590610104016020604051808303818588803b15801561286d57600080fd5b505af1158015612881573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906128a69190613f63565b5073e592427a0aece92de3edee1f18e0157c058615646001600160a01b03166312210e8a6040518163ffffffff1660e01b8152600401600060405180830381600087803b1580156128f657600080fd5b505af115801561290a573d6000803e3d6000fd5b50506040516000925033915047908381818185875af1925050503d8060008114612950576040519150601f19603f3d011682016040523d82523d6000602084013e612955565b606091505b50509050806129a65760405162461bcd60e51b815260206004820152600d60248201527f726566756e64206661696c65640000000000000000000000000000000000000060448201526064016109f2565b5050505050505050505050565b6000546001600160a01b031633146129fb5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b60008111612a3b5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600b54811015612ab35760405162461bcd60e51b815260206004820152603060248201527f53686f756c64206265206c6172676572206e756d626572207468616e2074686560448201527f20436f6e73656e73757320636f756e740000000000000000000000000000000060648201526084016109f2565b600a55565b336000908152600e6020526040902060040154600614612b1a5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f7420776974686472617720756e6561726e656420746f6b656e730060448201526064016109f2565b336000818152600e602052604090206001600490910155600f54600754612b4d926001600160a01b03909216919061333e565b60075460405190815233907fb03c88f07f9396007f23848aba1e1c6ab0de3388ae077c0d8c9a5f6fe7f2585e9060200160405180910390a2565b6000546001600160a01b03163314612bcf5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b60008111612c0f5760405162461bcd60e51b815260206004820152600d60248201526c496e76616c69642076616c756560981b60448201526064016109f2565b600555565b600081815260026020526040902060060154600114612c9b5760405162461bcd60e51b815260206004820152602b60248201527f457363726f7720737461747573206d757374206265206f6e207468652044454660448201527f41554c542073746174757300000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260205260409020600101546001600160a01b0316336001600160a01b031614612d0d5760405162461bcd60e51b815260206004820152601360248201527f43616c6c6572206973206e6f742062757965720000000000000000000000000060448201526064016109f2565b600081815260026020526040902060050154421015612d945760405162461bcd60e51b815260206004820152602560248201527f506c65617365207761697420756e74696c207468652064697370757461626c6560448201527f2074696d6500000000000000000000000000000000000000000000000000000060648201526084016109f2565b600081815260026020526040902060040154421115612e1b5760405162461bcd60e51b815260206004820152602260248201527f44697370757461626c652074696d65207761732070617373656420616c72656160448201527f647900000000000000000000000000000000000000000000000000000000000060648201526084016109f2565b6000818152600260208190526040909120600601556114743382613a3c565b336000908152600e6020908152604091829020825160a0810184528154815260018201549281019290925260028101549282019290925260038201546060820152600490910154608082018190521580612e98575060078160800151145b80612ea7575060018160800151145b612ef35760405162461bcd60e51b815260206004820152600c60248201527f57726f6e6720737461747573000000000000000000000000000000000000000060448201526064016109f2565b600c54600f54612f0c906001600160a01b03163361399f565b1015612f5a5760405162461bcd60e51b815260206004820152601260248201527f4e6f7420636f727265637420616d6f756e74000000000000000000000000000060448201526064016109f2565b602081015115801590612f6f57506006548151105b15612fe25760405162461bcd60e51b815260206004820152603a60248201527f596f7572206167656e742073636f726520697320746f6f206c6f772c20736f2060448201527f63616e277420706172746963697061746520616e79206d6f726500000000000060648201526084016109f2565b6020810151613070576040518060a00160405280600554815260200160008152602001600c548152602001600081526020016002815250600e60006130243390565b6001600160a01b03168152602080820192909252604090810160002083518155918301516001830155820151600282015560608201516003820155608090910151600490910155613105565b6040518060a001604052808260000151815260200182602001518152602001600c5483604001516130a1919061403e565b8152602001600081526020016002815250600e60006130bd3390565b6001600160a01b031681526020808201929092526040908101600020835181559183015160018301558201516002820155606082015160038201556080909101516004909101555b600f5461311f906001600160a01b03163330600c54613b2f565b60405133907f018d4d8340bc3bf11d6ca79138bcbd4cda4bfa47979fe011180c44f42045b05690600090a250565b6000546001600160a01b031633146131955760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6001600160a01b038116158015906131b657506001600160a01b0381163014155b6132025760405162461bcd60e51b815260206004820152601560248201527f496e76616c696420546f6b656e2041646472657373000000000000000000000060448201526064016109f2565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461326c5760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b6001600160a01b0381166132e85760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109f2565b6114748161394f565b6000546001600160a01b031633146133395760405162461bcd60e51b815260206004820181905260248201526000805160206140de83398151915260448201526064016109f2565b600655565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb0000000000000000000000000000000000000000000000000000000017905291516000928392908716916133c89190614005565b6000604051808303816000865af19150503d8060008114613405576040519150601f19603f3d011682016040523d82523d6000602084013e61340a565b606091505b50915091508180156134345750805115806134345750808060200190518101906134349190613f2b565b610e355760405162461bcd60e51b815260206004820152602d60248201527f5472616e7366657248656c7065723a3a736166655472616e736665723a20747260448201527f616e73666572206661696c65640000000000000000000000000000000000000060648201526084016109f2565b6001600160a01b0384166134fc5760405162461bcd60e51b815260206004820152601860248201527f496e76616c6964204d65726368616e742041646472657373000000000000000060448201526064016109f2565b600083116135725760405162461bcd60e51b815260206004820152602160248201527f416d6f756e742073686f756c6420626520626967676572207468616e207a657260448201527f6f0000000000000000000000000000000000000000000000000000000000000060648201526084016109f2565b8261357d888861399f565b10156135a6576135a6613590888861399f565b61359a9085614095565b886107a442600f61403e565b826135b2888830613ca7565b10156136265760405162461bcd60e51b815260206004820152603860248201527f596f752073686f756c6420617070726f766520746f6b656e207472616e73666560448201527f7220746f207468697320636f6e7472616374206669727374000000000000000060648201526084016109f2565b42821161369b5760405162461bcd60e51b815260206004820152603160248201527f44697370757461626c652074696d652073686f756c64206265206c617465722060448201527f7468616e2063757272656e742074696d6500000000000000000000000000000060648201526084016109f2565b8181116137105760405162461bcd60e51b815260206004820152603260248201527f57697468647261772054696d652073686f756c64206265206c6174657220746860448201527f616e2044697370757461626c652074696d65000000000000000000000000000060648201526084016109f2565b604051806101000160405280868152602001876001600160a01b03168152602001856001600160a01b03168152602001848152602001828152602001838152602001600160ff16815260200142815250600260006001546001613773919061403e565b815260208082019290925260409081016000208351815591830151600180840180546001600160a01b039384166001600160a01b03199182161790915592850151600285018054919093169316929092179055606083015160038301556080830151600483015560a0830151600583015560c0830151600683015560e09092015160079091015580546138059161403e565b60015561381487873086613b2f565b60015485876001600160a01b03167fa9109df3859bf693666519bfe05558b3eba6f23595166574501a780b048fa1a08660405161385391815260200190565b60405180910390a450505050505050565b60048401839055600783141561389357818460000160008282546138889190614095565b909155506138ad9050565b818460000160008282546138a7919061403e565b90915550505b6003909301929092555050565b6003820181905560058114156138ea5760018260020160008282546138df919061403e565b909155506139209050565b60048114156139085760018260010160008282546138df919061403e565b60018114156139205760006001830181905560028301555b5042600690910155565b6000828152601160205260408120906139438284613d4d565b90506126b08282613da7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038281166004830152600091908416906370a082319060240160206040518083038186803b1580156139fd57600080fd5b505afa158015613a11573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613a359190613f63565b9392505050565b6040518060e001604052808281526020016000815260200160008152602001600160ff1681526020016000815260200142815260200142815250600460006003546001613a89919061403e565b8152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301556080820151816004015560a0820151816005015560c082015181600601559050506003546001613aef919061403e565b60038190556040518291906001600160a01b038516907f1c6f08c96efb335230689aefcc13e09333521cedf5e7f7a34b3b48bd1cdf570190600090a45050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd000000000000000000000000000000000000000000000000000000001790529151600092839290881691613bc19190614005565b6000604051808303816000865af19150503d8060008114613bfe576040519150601f19603f3d011682016040523d82523d6000602084013e613c03565b606091505b5091509150818015613c2d575080511580613c2d575080806020019051810190613c2d9190613f2b565b613c9f5760405162461bcd60e51b815260206004820152603160248201527f5472616e7366657248656c7065723a3a7472616e7366657246726f6d3a20747260448201527f616e7366657246726f6d206661696c656400000000000000000000000000000060648201526084016109f2565b505050505050565b6040517fdd62ed3e0000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301526000919085169063dd62ed3e9060440160206040518083038186803b158015613d0d57600080fd5b505afa158015613d21573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613d459190613f63565b949350505050565b6000805b826001600160a01b0316848281548110613d7b57634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031614613a355780613d9f816140ac565b915050613d51565b81548110613db3575050565b81548290613dc390600190614095565b81548110613de157634e487b7160e01b600052603260045260246000fd5b9060005260206000200160009054906101000a90046001600160a01b0316828281548110613e1f57634e487b7160e01b600052603260045260246000fd5b9060005260206000200160006101000a8154816001600160a01b0302191690836001600160a01b0316021790555081805480613e6b57634e487b7160e01b600052603160045260246000fd5b600082815260209020810160001990810180546001600160a01b03191690550190555050565b80356001600160a01b0381168114613ea857600080fd5b919050565b600060208284031215613ebe578081fd5b613a3582613e91565b600080600060608486031215613edb578182fd5b613ee484613e91565b9250613ef260208501613e91565b9150604084013590509250925092565b60008060408385031215613f14578182fd5b613f1d83613e91565b946020939093013593505050565b600060208284031215613f3c578081fd5b81518015158114613a35578182fd5b600060208284031215613f5c578081fd5b5035919050565b600060208284031215613f74578081fd5b5051919050565b600080600060608486031215613f8f578283fd5b83359250613ef260208501613e91565b600080600080600060a08688031215613fb6578081fd5b85359450613fc660208701613e91565b94979496505050506040830135926060810135926080909101359150565b60008060408385031215613ff6578182fd5b50508035926020909101359150565b60008251815b81811015614025576020818601810151858301520161400b565b818111156140335782828501525b509190910192915050565b60008219821115614051576140516140c7565b500190565b60008261407157634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615614090576140906140c7565b500290565b6000828210156140a7576140a76140c7565b500390565b60006000198214156140c0576140c06140c7565b5060010190565b634e487b7160e01b600052601160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a26469706673582212209c61a8a2cf616a3b5822318fc0bf72cc276044a0b6faab2d5b902f57b5717d4e64736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e66b3aa360bb78468c00bebe163630269db3324f
-----Decoded View---------------
Arg [0] : _token (address): 0xE66b3AA360bB78468c00Bebe163630269DB3324F
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000e66b3aa360bb78468c00bebe163630269db3324f
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.15
Net Worth in ETH
0.00007
Token Allocations
MTO
100.00%
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|---|---|---|---|---|
| ETH | 100.00% | $0.036481 | 4 | $0.1459 |
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ 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.