Source Code
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Cross-Chain Transactions
Loading...
Loading
Contract Name:
Tooter
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 10 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: TOOT
pragma solidity ^0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/AccessControl.sol";
import "./interfaces/IUniswapV2Router02.sol";
import "./interfaces/IUniswapV2Factory.sol";
contract Tooter is AccessControl {
bytes32 constant public ADMIN = keccak256("ADMIN");
IERC20 public toot;
uint256 public rollId;
mapping(Risk => Payout) public payouts;
mapping(address => uint256[]) public addressRequestIds;
mapping(uint256 => Result) public requestResults;
struct Payout {
uint128 min;
uint128 max;
uint128 cutoff;
uint128 ethFee;
uint128 tootFee;
}
struct Result {
ResultStatus status;
address account;
uint256 amountReceived;
bool tootPayment;
}
enum ResultStatus {
DEFAULT,
DUD,
SUCCESS
}
enum Risk {
LOW,
MED,
HIGH,
DEGEN
}
event RollSubmitted(uint256 rollId, address account, Risk risk, uint256 amount);
event PayoutSet(Risk risk, Payout payout);
event FeeSet(uint256 fee);
event ETHWithdrawn(address to, uint256 amount);
event TootWithdrawn(address to, uint256 amount);
IUniswapV2Router02 public immutable uniswapV2Router;
address public immutable uniswapV2Pair;
constructor(IERC20 _toot, IUniswapV2Router02 _uniswapV2Router) {
require(address(_toot) != address(0), "Zero toot");
_grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
_grantRole(ADMIN, msg.sender);
uniswapV2Pair = IUniswapV2Factory(_uniswapV2Router.factory())
.createPair(address(_toot), _uniswapV2Router.WETH());
uniswapV2Router = _uniswapV2Router;
toot = _toot;
}
function getLatestResult(address account) external view returns (Result memory) {
uint256 _length = addressRequestIds[account].length;
require(_length > 0, 'No toots');
uint256 _rollId = addressRequestIds[account][_length - 1];
return requestResults[_rollId];
}
function withdrawToot(address to, uint256 amount) external onlyRole(ADMIN) {
require(amount <= toot.balanceOf(address(this)), "Insufficient toot");
toot.transfer(to, amount);
emit TootWithdrawn(to, amount);
}
function withdrawEth(address to, uint256 amount) external onlyRole(ADMIN) {
require(to != address(0), "Zero toot");
require(address(this).balance >= amount, "Insufficient toot");
(bool success, ) = to.call{value: amount}("");
require(success, "TootFailed");
emit ETHWithdrawn(to, amount);
}
function setPayout(Risk _risk, Payout memory _payout) external onlyRole(ADMIN) {
require(_payout.min <= _payout.max, "Invalid toot");
require(_payout.cutoff < 100, "Invalid toot");
payouts[_risk] = _payout;
emit PayoutSet(_risk, _payout);
}
function rollWithToot(Risk _risk) external {
require(tx.origin == msg.sender, "Toot Toot");
Payout memory _payout = payouts[_risk];
toot.transferFrom(msg.sender, address(this), _payout.tootFee);
_roll(_payout, _risk, true);
}
function rollWithEth(Risk _risk) external payable {
require(tx.origin == msg.sender, "Toot Toot");
Payout memory _payout = payouts[_risk];
require(msg.value >= _payout.ethFee, "Invalid toot");
_roll(_payout, _risk, false);
addLiquidity(_payout.max, msg.value);
}
function _roll(Payout memory _payout, Risk _risk, bool _tootPayment) private {
require(_payout.max > 0, "Payout untooted");
require(_payout.max <= toot.balanceOf(address(this)), "Insufficient toot");
uint256 _rollId = rollId++;
addressRequestIds[msg.sender].push(_rollId);
Result storage _result = requestResults[_rollId];
uint256 randomness = uint(keccak256(abi.encodePacked(_rollId, blockhash(block.number))));
uint256 _diff = _payout.max - _payout.min;
uint256 _amount = randomness % _diff + _payout.min;
uint256 _entropy = randomness % 100;
if (_entropy < _payout.cutoff) {
_amount = 0;
_result.status = ResultStatus.DUD;
}
if (_amount > 0) {
toot.transfer(msg.sender, _amount);
_result.status = ResultStatus.SUCCESS;
}
_result.account = msg.sender;
_result.amountReceived = _amount;
_result.tootPayment = _tootPayment;
emit RollSubmitted(_rollId, msg.sender, _risk, _amount);
}
function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private {
toot.approve(address(uniswapV2Router), tokenAmount);
uniswapV2Router.addLiquidityETH{value: ethAmount}(
address(toot),
tokenAmount,
0,
0,
address(this),
block.timestamp
);
}
function withdrawTokens(
address _token,
address _to,
uint256 _amount
) public onlyRole(ADMIN) {
IERC20 token = IERC20(_token);
token.transfer(_to, _amount);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)
pragma solidity ^0.8.20;
import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";
/**
* @dev Contract module that allows children to implement role-based access
* control mechanisms. This is a lightweight version that doesn't allow enumerating role
* members except through off-chain means by accessing the contract event logs. Some
* applications may benefit from on-chain enumerability, for those cases see
* {AccessControlEnumerable}.
*
* Roles are referred to by their `bytes32` identifier. These should be exposed
* in the external API and be unique. The best way to achieve this is by
* using `public constant` hash digests:
*
* ```solidity
* bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
* ```
*
* Roles can be used to represent a set of permissions. To restrict access to a
* function call, use {hasRole}:
*
* ```solidity
* function foo() public {
* require(hasRole(MY_ROLE, msg.sender));
* ...
* }
* ```
*
* Roles can be granted and revoked dynamically via the {grantRole} and
* {revokeRole} functions. Each role has an associated admin role, and only
* accounts that have a role's admin role can call {grantRole} and {revokeRole}.
*
* By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
* that only accounts with this role will be able to grant or revoke other
* roles. More complex role relationships can be created by using
* {_setRoleAdmin}.
*
* WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
* grant and revoke this role. Extra precautions should be taken to secure
* accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
* to enforce additional security measures for this role.
*/
abstract contract AccessControl is Context, IAccessControl, ERC165 {
struct RoleData {
mapping(address account => bool) hasRole;
bytes32 adminRole;
}
mapping(bytes32 role => RoleData) private _roles;
bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;
/**
* @dev Modifier that checks that an account has a specific role. Reverts
* with an {AccessControlUnauthorizedAccount} error including the required role.
*/
modifier onlyRole(bytes32 role) {
_checkRole(role);
_;
}
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
}
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) public view virtual returns (bool) {
return _roles[role].hasRole[account];
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
* is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
*/
function _checkRole(bytes32 role) internal view virtual {
_checkRole(role, _msgSender());
}
/**
* @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
* is missing `role`.
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert AccessControlUnauthorizedAccount(account, role);
}
}
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
return _roles[role].adminRole;
}
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleGranted} event.
*/
function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_grantRole(role, account);
}
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*
* May emit a {RoleRevoked} event.
*/
function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
_revokeRole(role, account);
}
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been revoked `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*
* May emit a {RoleRevoked} event.
*/
function renounceRole(bytes32 role, address callerConfirmation) public virtual {
if (callerConfirmation != _msgSender()) {
revert AccessControlBadConfirmation();
}
_revokeRole(role, callerConfirmation);
}
/**
* @dev Sets `adminRole` as ``role``'s admin role.
*
* Emits a {RoleAdminChanged} event.
*/
function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
bytes32 previousAdminRole = getRoleAdmin(role);
_roles[role].adminRole = adminRole;
emit RoleAdminChanged(role, previousAdminRole, adminRole);
}
/**
* @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
*
* Internal function without access restriction.
*
* May emit a {RoleGranted} event.
*/
function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
if (!hasRole(role, account)) {
_roles[role].hasRole[account] = true;
emit RoleGranted(role, account, _msgSender());
return true;
} else {
return false;
}
}
/**
* @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
*
* Internal function without access restriction.
*
* May emit a {RoleRevoked} event.
*/
function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
if (hasRole(role, account)) {
_roles[role].hasRole[account] = false;
emit RoleRevoked(role, account, _msgSender());
return true;
} else {
return false;
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)
pragma solidity ^0.8.20;
/**
* @dev External interface of AccessControl declared to support ERC165 detection.
*/
interface IAccessControl {
/**
* @dev The `account` is missing a role.
*/
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);
/**
* @dev The caller of a function is not the expected one.
*
* NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
*/
error AccessControlBadConfirmation();
/**
* @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
*
* `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
* {RoleAdminChanged} not being emitted signaling this.
*/
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);
/**
* @dev Emitted when `account` is granted `role`.
*
* `sender` is the account that originated the contract call, an admin role
* bearer except when using {AccessControl-_setupRole}.
*/
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Emitted when `account` is revoked `role`.
*
* `sender` is the account that originated the contract call:
* - if using `revokeRole`, it is the admin role bearer
* - if using `renounceRole`, it is the role bearer (i.e. `account`)
*/
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);
/**
* @dev Returns `true` if `account` has been granted `role`.
*/
function hasRole(bytes32 role, address account) external view returns (bool);
/**
* @dev Returns the admin role that controls `role`. See {grantRole} and
* {revokeRole}.
*
* To change a role's admin, use {AccessControl-_setRoleAdmin}.
*/
function getRoleAdmin(bytes32 role) external view returns (bytes32);
/**
* @dev Grants `role` to `account`.
*
* If `account` had not been already granted `role`, emits a {RoleGranted}
* event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function grantRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from `account`.
*
* If `account` had been granted `role`, emits a {RoleRevoked} event.
*
* Requirements:
*
* - the caller must have ``role``'s admin role.
*/
function revokeRole(bytes32 role, address account) external;
/**
* @dev Revokes `role` from the calling account.
*
* Roles are often managed via {grantRole} and {revokeRole}: this function's
* purpose is to provide a mechanism for accounts to lose their privileges
* if they are compromised (such as when a trusted device is misplaced).
*
* If the calling account had been granted `role`, emits a {RoleRevoked}
* event.
*
* Requirements:
*
* - the caller must be `callerConfirmation`.
*/
function renounceRole(bytes32 role, address callerConfirmation) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC20 standard as defined in the EIP.
*/
interface IERC20 {
/**
* @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);
/**
* @dev Returns the value of tokens in existence.
*/
function totalSupply() external view returns (uint256);
/**
* @dev Returns the value of tokens owned by `account`.
*/
function balanceOf(address account) external view returns (uint256);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the
* allowance mechanism. `value` is then deducted from the caller's
* allowance.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transferFrom(address from, address to, uint256 value) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)
pragma solidity ^0.8.20;
/**
* @dev Provides information about the current execution context, including the
* sender of the transaction and its data. While these are generally available
* via msg.sender and msg.data, they should not be accessed in such a direct
* manner, since when dealing with meta-transactions the account sending and
* paying for execution may not be the actual sender (as far as an application
* is concerned).
*
* This contract is only required for intermediate, library-like contracts.
*/
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
function _contextSuffixLength() internal view virtual returns (uint256) {
return 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: TOOT
pragma solidity ^0.8.20;
interface IUniswapV2Factory {
event PairCreated(address indexed token0, address indexed token1, address pair, uint);
function feeTo() external view returns (address);
function feeToSetter() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint) external view returns (address pair);
function allPairsLength() external view returns (uint);
function createPair(address tokenA, address tokenB) external returns (address pair);
function setFeeTo(address) external;
function setFeeToSetter(address) external;
}// SPDX-License-Identifier: TOOT
pragma solidity ^0.8.20;
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external payable returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountToken, uint amountETH);
function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline)
external
returns (uint[] memory amounts);
function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline)
external
payable
returns (uint[] memory amounts);
function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB);
function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut);
function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn);
function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts);
function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts);
}// SPDX-License-Identifier: TOOT
pragma solidity ^0.8.20;
import "./IUniswapV2Router01.sol";
interface IUniswapV2Router02 is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax, uint8 v, bytes32 r, bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}{
"optimizer": {
"enabled": true,
"runs": 10
},
"evmVersion": "paris",
"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":"contract IERC20","name":"_toot","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"_uniswapV2Router","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ETHWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"FeeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum Tooter.Risk","name":"risk","type":"uint8"},{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"max","type":"uint128"},{"internalType":"uint128","name":"cutoff","type":"uint128"},{"internalType":"uint128","name":"ethFee","type":"uint128"},{"internalType":"uint128","name":"tootFee","type":"uint128"}],"indexed":false,"internalType":"struct Tooter.Payout","name":"payout","type":"tuple"}],"name":"PayoutSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rollId","type":"uint256"},{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"enum Tooter.Risk","name":"risk","type":"uint8"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RollSubmitted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TootWithdrawn","type":"event"},{"inputs":[],"name":"ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"addressRequestIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getLatestResult","outputs":[{"components":[{"internalType":"enum Tooter.ResultStatus","name":"status","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amountReceived","type":"uint256"},{"internalType":"bool","name":"tootPayment","type":"bool"}],"internalType":"struct Tooter.Result","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Tooter.Risk","name":"","type":"uint8"}],"name":"payouts","outputs":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"max","type":"uint128"},{"internalType":"uint128","name":"cutoff","type":"uint128"},{"internalType":"uint128","name":"ethFee","type":"uint128"},{"internalType":"uint128","name":"tootFee","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"requestResults","outputs":[{"internalType":"enum Tooter.ResultStatus","name":"status","type":"uint8"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amountReceived","type":"uint256"},{"internalType":"bool","name":"tootPayment","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rollId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Tooter.Risk","name":"_risk","type":"uint8"}],"name":"rollWithEth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum Tooter.Risk","name":"_risk","type":"uint8"}],"name":"rollWithToot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Tooter.Risk","name":"_risk","type":"uint8"},{"components":[{"internalType":"uint128","name":"min","type":"uint128"},{"internalType":"uint128","name":"max","type":"uint128"},{"internalType":"uint128","name":"cutoff","type":"uint128"},{"internalType":"uint128","name":"ethFee","type":"uint128"},{"internalType":"uint128","name":"tootFee","type":"uint128"}],"internalType":"struct Tooter.Payout","name":"_payout","type":"tuple"}],"name":"setPayout","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toot","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Pair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawToot","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162001c0838038062001c088339810160408190526200003491620002fd565b6001600160a01b0382166200007b5760405162461bcd60e51b815260206004820152600960248201526816995c9bc81d1bdbdd60ba1b604482015260640160405180910390fd5b6200008860003362000235565b50620000b57fdf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec423362000235565b50806001600160a01b031663c45a01556040518163ffffffff1660e01b8152600401602060405180830381865afa158015620000f5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200011b91906200033c565b6001600160a01b031663c9c6539683836001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa15801562000169573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018f91906200033c565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015620001dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200020391906200033c565b6001600160a01b0390811660a052908116608052600180546001600160a01b0319169290911691909117905562000363565b6000828152602081815260408083206001600160a01b038516845290915281205460ff16620002da576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055620002913390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001620002de565b5060005b92915050565b6001600160a01b0381168114620002fa57600080fd5b50565b600080604083850312156200031157600080fd5b82516200031e81620002e4565b60208401519092506200033181620002e4565b809150509250929050565b6000602082840312156200034f57600080fd5b81516200035c81620002e4565b9392505050565b60805160a0516118716200039760003960006102f201526000818161017f015281816111bc015261126d01526118716000f3fe6080604052600436106101055760003560e01c806301ffc9a71461010a57806304e9e8bc1461013f5780631694505e1461016d5780631b9a91a4146101ae578063248a9ca3146101d057806324f65672146101f05780632a0acc6a146102515780632f2ff15d1461027357806336568abe1461029357806338946d2d146102b357806349bd5a5e146102e05780635e35359e146103145780636677b2cd1461033457806366966e8f146103c95780638cc926c4146103df5780638ff7ce6b146103ff57806391d148541461041f578063a217fddf1461043f578063a3bbe9f714610454578063d547741f14610467578063dd16e4db14610487578063dfe24f24146104a7575b600080fd5b34801561011657600080fd5b5061012a610125366004611310565b6104c7565b60405190151581526020015b60405180910390f35b34801561014b57600080fd5b5061015f61015a36600461135d565b6104fe565b604051908152602001610136565b34801561017957600080fd5b506101a17f000000000000000000000000000000000000000000000000000000000000000081565b6040516101369190611387565b3480156101ba57600080fd5b506101ce6101c936600461135d565b61052f565b005b3480156101dc57600080fd5b5061015f6101eb36600461139b565b61067d565b3480156101fc57600080fd5b5061024161020b36600461139b565b60056020526000908152604090208054600182015460029092015460ff808316936101009093046001600160a01b031692911684565b60405161013694939291906113de565b34801561025d57600080fd5b5061015f60008051602061181c83398151915281565b34801561027f57600080fd5b506101ce61028e366004611412565b610692565b34801561029f57600080fd5b506101ce6102ae366004611412565b6106b4565b3480156102bf57600080fd5b506102d36102ce36600461143e565b6106ec565b6040516101369190611459565b3480156102ec57600080fd5b506101a17f000000000000000000000000000000000000000000000000000000000000000081565b34801561032057600080fd5b506101ce61032f36600461149a565b61081c565b34801561034057600080fd5b5061038f61034f3660046114e5565b6003602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b938490048216938183169391048216911685565b604080516001600160801b03968716815294861660208601529285169284019290925283166060830152909116608082015260a001610136565b3480156103d557600080fd5b5061015f60025481565b3480156103eb57600080fd5b506101ce6103fa36600461135d565b6108af565b34801561040b57600080fd5b506101ce61041a3660046114e5565b610a0b565b34801561042b57600080fd5b5061012a61043a366004611412565b610b43565b34801561044b57600080fd5b5061015f600081565b6101ce6104623660046114e5565b610b6c565b34801561047357600080fd5b506101ce610482366004611412565b610c5d565b34801561049357600080fd5b506101ce6104a2366004611517565b610c79565b3480156104b357600080fd5b506001546101a1906001600160a01b031681565b60006001600160e01b03198216637965db0b60e01b14806104f857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004602052816000526040600020818154811061051a57600080fd5b90600052602060002001600091509150505481565b60008051602061181c83398151915261054781610dba565b6001600160a01b03831661058e5760405162461bcd60e51b815260206004820152600960248201526816995c9bc81d1bdbdd60ba1b60448201526064015b60405180910390fd5b814710156105ae5760405162461bcd60e51b8152600401610585906115d9565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146105fb576040519150601f19603f3d011682016040523d82523d6000602084013e610600565b606091505b505090508061063e5760405162461bcd60e51b815260206004820152600a602482015269151bdbdd11985a5b195960b21b6044820152606401610585565b7f94b2de810873337ed265c5f8cf98c9cffefa06b8607f9a2f1fbaebdfbcfbef1c848460405161066f929190611604565b60405180910390a150505050565b60009081526020819052604090206001015490565b61069b8261067d565b6106a481610dba565b6106ae8383610dc7565b50505050565b6001600160a01b03811633146106dd5760405163334bd91960e11b815260040160405180910390fd5b6106e78282610e59565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b03851682526004905291909120548061075d5760405162461bcd60e51b81526020600482015260086024820152674e6f20746f6f747360c01b6044820152606401610585565b6001600160a01b0383166000908152600460205260408120610780600184611633565b8154811061079057610790611646565b60009182526020808320909101548083526005909152604091829020825160808101909352805491935090829060ff1660028111156107d1576107d16113b4565b60028111156107e2576107e26113b4565b8152815461010090046001600160a01b031660208201526001820154604082015260029091015460ff161515606090910152949350505050565b60008051602061181c83398151915261083481610dba565b60405163a9059cbb60e01b815284906001600160a01b0382169063a9059cbb906108649087908790600401611604565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a7919061165c565b505050505050565b60008051602061181c8339815191526108c781610dba565b6001546040516370a0823160e01b81526001600160a01b03909116906370a08231906108f7903090600401611387565b602060405180830381865afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610938919061167e565b8211156109575760405162461bcd60e51b8152600401610585906115d9565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906109899086908690600401611604565b6020604051808303816000875af11580156109a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cc919061165c565b507f71aa07b02a5b8e87e6db7d6f49a7e9ffc31f4fb8b7acc473bee09b0f9e7e42cc83836040516109fe929190611604565b60405180910390a1505050565b323314610a2a5760405162461bcd60e51b815260040161058590611697565b600060036000836003811115610a4257610a426113b4565b6003811115610a5357610a536113b4565b81526020808201929092526040908101600020815160a08101835281546001600160801b038082168352600160801b9182900481169583019590955260018084015480871684870152919091048516606083015260029092015490931660808401819052905491516323b872dd60e01b815233600482015230602482015260448101919091529192506001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061165c565b50610b3f81836001610ec4565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b323314610b8b5760405162461bcd60e51b815260040161058590611697565b600060036000836003811115610ba357610ba36113b4565b6003811115610bb457610bb46113b4565b81526020808201929092526040908101600020815160a08101835281546001600160801b038082168352600160801b9182900481169583019590955260018301548086169483019490945290920483166060830181905260029091015490921660808201529150341015610c3a5760405162461bcd60e51b8152600401610585906116ba565b610c4681836000610ec4565b610b3f81602001516001600160801b031634611194565b610c668261067d565b610c6f81610dba565b6106ae8383610e59565b60008051602061181c833981519152610c9181610dba565b81602001516001600160801b031682600001516001600160801b03161115610ccb5760405162461bcd60e51b8152600401610585906116ba565b606482604001516001600160801b031610610cf85760405162461bcd60e51b8152600401610585906116ba565b8160036000856003811115610d0f57610d0f6113b4565b6003811115610d2057610d206113b4565b815260208082019290925260409081016000208351928401516001600160801b03938416600160801b9185168202178255848301516060860151908516908516909102176001820155608090930151600290930180546001600160801b03191693909216929092179055517f1a8bac9ab2c482a6950b1f36193a989eba23daea23d573f05cce67f6a7b84631906109fe90859085906116f0565b610dc481336112e5565b50565b6000610dd38383610b43565b610e51576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610e093390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104f8565b5060006104f8565b6000610e658383610b43565b15610e51576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104f8565b600083602001516001600160801b031611610f135760405162461bcd60e51b815260206004820152600f60248201526e14185e5bdd5d081d5b9d1bdbdd1959608a1b6044820152606401610585565b6001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610f43903090600401611387565b602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f84919061167e565b83602001516001600160801b03161115610fb05760405162461bcd60e51b8152600401610585906115d9565b6002805460009182610fc183611746565b9091555033600090815260046020908152604080832080546001810182559084528284200184905583835260058252808320815192830185905243409183019190915292935060600160408051601f1981840301815291905280516020918201208751918801519092506000916110379161175f565b87516001600160801b039182169250600091166110548385611786565b61105e91906117a8565b9050600061106d606485611786565b905088604001516001600160801b031681101561109457845460ff19166001178555600091505b811561111c5760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906110cc9033908690600401611604565b6020604051808303816000875af11580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f919061165c565b50845460ff191660021785555b8454610100600160a81b0319163361010081029190911786556001860183905560028601805460ff19168915151790556040517f3c07e2dcd2aeb85369bfc1619e9dcff8fd2c878eafdfcdeddb90cb8c10fdd91891611181918991908c9087906117bb565b60405180910390a1505050505050505050565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906111e6907f0000000000000000000000000000000000000000000000000000000000000000908690600401611604565b6020604051808303816000875af1158015611205573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611229919061165c565b5060015460405163f305d71960e01b81526001600160a01b0391821660048201526024810184905260006044820181905260648201523060848201524260a48201527f00000000000000000000000000000000000000000000000000000000000000009091169063f305d71990839060c40160606040518083038185885af11580156112b9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112de91906117ed565b5050505050565b6112ef8282610b43565b610b3f57808260405163e2517d3f60e01b8152600401610585929190611604565b60006020828403121561132257600080fd5b81356001600160e01b03198116811461133a57600080fd5b9392505050565b80356001600160a01b038116811461135857600080fd5b919050565b6000806040838503121561137057600080fd5b61137983611341565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000602082840312156113ad57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600381106113da576113da6113b4565b9052565b608081016113ec82876113ca565b6001600160a01b0394909416602082015260408101929092521515606090910152919050565b6000806040838503121561142557600080fd5b8235915061143560208401611341565b90509250929050565b60006020828403121561145057600080fd5b61133a82611341565b600060808201905061146c8284516113ca565b60018060a01b0360208401511660208301526040830151604083015260608301511515606083015292915050565b6000806000606084860312156114af57600080fd5b6114b884611341565b92506114c660208501611341565b9150604084013590509250925092565b80356004811061135857600080fd5b6000602082840312156114f757600080fd5b61133a826114d6565b80356001600160801b038116811461135857600080fd5b60008082840360c081121561152b57600080fd5b611534846114d6565b925060a0601f198201121561154857600080fd5b5060405160a081016001600160401b038111828210171561157957634e487b7160e01b600052604160045260246000fd5b60405261158860208501611500565b815261159660408501611500565b60208201526115a760608501611500565b60408201526115b860808501611500565b60608201526115c960a08501611500565b6080820152809150509250929050565b602080825260119082015270125b9cdd59999a58da595b9d081d1bdbdd607a1b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b818103818111156104f8576104f861161d565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561166e57600080fd5b8151801515811461133a57600080fd5b60006020828403121561169057600080fd5b5051919050565b602080825260099082015268151bdbdd08151bdbdd60ba1b604082015260600190565b6020808252600c908201526b125b9d985b1a59081d1bdbdd60a21b604082015260600190565b600481106113da576113da6113b4565b60c081016116fe82856116e0565b60018060801b038084511660208401528060208501511660408401528060408501511660608401528060608501511660808401528060808501511660a0840152509392505050565b6000600182016117585761175861161d565b5060010190565b6001600160801b0382811682821603908082111561177f5761177f61161d565b5092915050565b6000826117a357634e487b7160e01b600052601260045260246000fd5b500690565b808201808211156104f8576104f861161d565b8481526001600160a01b0384166020820152608081016117de60408301856116e0565b82606083015295945050505050565b60008060006060848603121561180257600080fd5b835192506020840151915060408401519050925092509256fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220047b0d1c7ea864901466ddd99bb1df2450ee959a93bec4d0b132aa05cc303ac064736f6c63430008140033000000000000000000000000e27a5e51e64ef12dac6d60062b67bcbd52be706800000000000000000000000098994a9a7a2570367554589189dc9772241650f6
Deployed Bytecode
0x6080604052600436106101055760003560e01c806301ffc9a71461010a57806304e9e8bc1461013f5780631694505e1461016d5780631b9a91a4146101ae578063248a9ca3146101d057806324f65672146101f05780632a0acc6a146102515780632f2ff15d1461027357806336568abe1461029357806338946d2d146102b357806349bd5a5e146102e05780635e35359e146103145780636677b2cd1461033457806366966e8f146103c95780638cc926c4146103df5780638ff7ce6b146103ff57806391d148541461041f578063a217fddf1461043f578063a3bbe9f714610454578063d547741f14610467578063dd16e4db14610487578063dfe24f24146104a7575b600080fd5b34801561011657600080fd5b5061012a610125366004611310565b6104c7565b60405190151581526020015b60405180910390f35b34801561014b57600080fd5b5061015f61015a36600461135d565b6104fe565b604051908152602001610136565b34801561017957600080fd5b506101a17f00000000000000000000000098994a9a7a2570367554589189dc9772241650f681565b6040516101369190611387565b3480156101ba57600080fd5b506101ce6101c936600461135d565b61052f565b005b3480156101dc57600080fd5b5061015f6101eb36600461139b565b61067d565b3480156101fc57600080fd5b5061024161020b36600461139b565b60056020526000908152604090208054600182015460029092015460ff808316936101009093046001600160a01b031692911684565b60405161013694939291906113de565b34801561025d57600080fd5b5061015f60008051602061181c83398151915281565b34801561027f57600080fd5b506101ce61028e366004611412565b610692565b34801561029f57600080fd5b506101ce6102ae366004611412565b6106b4565b3480156102bf57600080fd5b506102d36102ce36600461143e565b6106ec565b6040516101369190611459565b3480156102ec57600080fd5b506101a17f0000000000000000000000004c0be5748e434bc1ac872f9d94a7f8a72a658ab481565b34801561032057600080fd5b506101ce61032f36600461149a565b61081c565b34801561034057600080fd5b5061038f61034f3660046114e5565b6003602052600090815260409020805460018201546002909201546001600160801b0380831693600160801b938490048216938183169391048216911685565b604080516001600160801b03968716815294861660208601529285169284019290925283166060830152909116608082015260a001610136565b3480156103d557600080fd5b5061015f60025481565b3480156103eb57600080fd5b506101ce6103fa36600461135d565b6108af565b34801561040b57600080fd5b506101ce61041a3660046114e5565b610a0b565b34801561042b57600080fd5b5061012a61043a366004611412565b610b43565b34801561044b57600080fd5b5061015f600081565b6101ce6104623660046114e5565b610b6c565b34801561047357600080fd5b506101ce610482366004611412565b610c5d565b34801561049357600080fd5b506101ce6104a2366004611517565b610c79565b3480156104b357600080fd5b506001546101a1906001600160a01b031681565b60006001600160e01b03198216637965db0b60e01b14806104f857506301ffc9a760e01b6001600160e01b03198316145b92915050565b6004602052816000526040600020818154811061051a57600080fd5b90600052602060002001600091509150505481565b60008051602061181c83398151915261054781610dba565b6001600160a01b03831661058e5760405162461bcd60e51b815260206004820152600960248201526816995c9bc81d1bdbdd60ba1b60448201526064015b60405180910390fd5b814710156105ae5760405162461bcd60e51b8152600401610585906115d9565b6000836001600160a01b03168360405160006040518083038185875af1925050503d80600081146105fb576040519150601f19603f3d011682016040523d82523d6000602084013e610600565b606091505b505090508061063e5760405162461bcd60e51b815260206004820152600a602482015269151bdbdd11985a5b195960b21b6044820152606401610585565b7f94b2de810873337ed265c5f8cf98c9cffefa06b8607f9a2f1fbaebdfbcfbef1c848460405161066f929190611604565b60405180910390a150505050565b60009081526020819052604090206001015490565b61069b8261067d565b6106a481610dba565b6106ae8383610dc7565b50505050565b6001600160a01b03811633146106dd5760405163334bd91960e11b815260040160405180910390fd5b6106e78282610e59565b505050565b6040805160808101825260008082526020808301829052828401829052606083018290526001600160a01b03851682526004905291909120548061075d5760405162461bcd60e51b81526020600482015260086024820152674e6f20746f6f747360c01b6044820152606401610585565b6001600160a01b0383166000908152600460205260408120610780600184611633565b8154811061079057610790611646565b60009182526020808320909101548083526005909152604091829020825160808101909352805491935090829060ff1660028111156107d1576107d16113b4565b60028111156107e2576107e26113b4565b8152815461010090046001600160a01b031660208201526001820154604082015260029091015460ff161515606090910152949350505050565b60008051602061181c83398151915261083481610dba565b60405163a9059cbb60e01b815284906001600160a01b0382169063a9059cbb906108649087908790600401611604565b6020604051808303816000875af1158015610883573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108a7919061165c565b505050505050565b60008051602061181c8339815191526108c781610dba565b6001546040516370a0823160e01b81526001600160a01b03909116906370a08231906108f7903090600401611387565b602060405180830381865afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610938919061167e565b8211156109575760405162461bcd60e51b8152600401610585906115d9565b60015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906109899086908690600401611604565b6020604051808303816000875af11580156109a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109cc919061165c565b507f71aa07b02a5b8e87e6db7d6f49a7e9ffc31f4fb8b7acc473bee09b0f9e7e42cc83836040516109fe929190611604565b60405180910390a1505050565b323314610a2a5760405162461bcd60e51b815260040161058590611697565b600060036000836003811115610a4257610a426113b4565b6003811115610a5357610a536113b4565b81526020808201929092526040908101600020815160a08101835281546001600160801b038082168352600160801b9182900481169583019590955260018084015480871684870152919091048516606083015260029092015490931660808401819052905491516323b872dd60e01b815233600482015230602482015260448101919091529192506001600160a01b0316906323b872dd906064016020604051808303816000875af1158015610b0e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b32919061165c565b50610b3f81836001610ec4565b5050565b6000918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b323314610b8b5760405162461bcd60e51b815260040161058590611697565b600060036000836003811115610ba357610ba36113b4565b6003811115610bb457610bb46113b4565b81526020808201929092526040908101600020815160a08101835281546001600160801b038082168352600160801b9182900481169583019590955260018301548086169483019490945290920483166060830181905260029091015490921660808201529150341015610c3a5760405162461bcd60e51b8152600401610585906116ba565b610c4681836000610ec4565b610b3f81602001516001600160801b031634611194565b610c668261067d565b610c6f81610dba565b6106ae8383610e59565b60008051602061181c833981519152610c9181610dba565b81602001516001600160801b031682600001516001600160801b03161115610ccb5760405162461bcd60e51b8152600401610585906116ba565b606482604001516001600160801b031610610cf85760405162461bcd60e51b8152600401610585906116ba565b8160036000856003811115610d0f57610d0f6113b4565b6003811115610d2057610d206113b4565b815260208082019290925260409081016000208351928401516001600160801b03938416600160801b9185168202178255848301516060860151908516908516909102176001820155608090930151600290930180546001600160801b03191693909216929092179055517f1a8bac9ab2c482a6950b1f36193a989eba23daea23d573f05cce67f6a7b84631906109fe90859085906116f0565b610dc481336112e5565b50565b6000610dd38383610b43565b610e51576000838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610e093390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104f8565b5060006104f8565b6000610e658383610b43565b15610e51576000838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104f8565b600083602001516001600160801b031611610f135760405162461bcd60e51b815260206004820152600f60248201526e14185e5bdd5d081d5b9d1bdbdd1959608a1b6044820152606401610585565b6001546040516370a0823160e01b81526001600160a01b03909116906370a0823190610f43903090600401611387565b602060405180830381865afa158015610f60573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f84919061167e565b83602001516001600160801b03161115610fb05760405162461bcd60e51b8152600401610585906115d9565b6002805460009182610fc183611746565b9091555033600090815260046020908152604080832080546001810182559084528284200184905583835260058252808320815192830185905243409183019190915292935060600160408051601f1981840301815291905280516020918201208751918801519092506000916110379161175f565b87516001600160801b039182169250600091166110548385611786565b61105e91906117a8565b9050600061106d606485611786565b905088604001516001600160801b031681101561109457845460ff19166001178555600091505b811561111c5760015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906110cc9033908690600401611604565b6020604051808303816000875af11580156110eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061110f919061165c565b50845460ff191660021785555b8454610100600160a81b0319163361010081029190911786556001860183905560028601805460ff19168915151790556040517f3c07e2dcd2aeb85369bfc1619e9dcff8fd2c878eafdfcdeddb90cb8c10fdd91891611181918991908c9087906117bb565b60405180910390a1505050505050505050565b60015460405163095ea7b360e01b81526001600160a01b039091169063095ea7b3906111e6907f00000000000000000000000098994a9a7a2570367554589189dc9772241650f6908690600401611604565b6020604051808303816000875af1158015611205573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611229919061165c565b5060015460405163f305d71960e01b81526001600160a01b0391821660048201526024810184905260006044820181905260648201523060848201524260a48201527f00000000000000000000000098994a9a7a2570367554589189dc9772241650f69091169063f305d71990839060c40160606040518083038185885af11580156112b9573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906112de91906117ed565b5050505050565b6112ef8282610b43565b610b3f57808260405163e2517d3f60e01b8152600401610585929190611604565b60006020828403121561132257600080fd5b81356001600160e01b03198116811461133a57600080fd5b9392505050565b80356001600160a01b038116811461135857600080fd5b919050565b6000806040838503121561137057600080fd5b61137983611341565b946020939093013593505050565b6001600160a01b0391909116815260200190565b6000602082840312156113ad57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b600381106113da576113da6113b4565b9052565b608081016113ec82876113ca565b6001600160a01b0394909416602082015260408101929092521515606090910152919050565b6000806040838503121561142557600080fd5b8235915061143560208401611341565b90509250929050565b60006020828403121561145057600080fd5b61133a82611341565b600060808201905061146c8284516113ca565b60018060a01b0360208401511660208301526040830151604083015260608301511515606083015292915050565b6000806000606084860312156114af57600080fd5b6114b884611341565b92506114c660208501611341565b9150604084013590509250925092565b80356004811061135857600080fd5b6000602082840312156114f757600080fd5b61133a826114d6565b80356001600160801b038116811461135857600080fd5b60008082840360c081121561152b57600080fd5b611534846114d6565b925060a0601f198201121561154857600080fd5b5060405160a081016001600160401b038111828210171561157957634e487b7160e01b600052604160045260246000fd5b60405261158860208501611500565b815261159660408501611500565b60208201526115a760608501611500565b60408201526115b860808501611500565b60608201526115c960a08501611500565b6080820152809150509250929050565b602080825260119082015270125b9cdd59999a58da595b9d081d1bdbdd607a1b604082015260600190565b6001600160a01b03929092168252602082015260400190565b634e487b7160e01b600052601160045260246000fd5b818103818111156104f8576104f861161d565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561166e57600080fd5b8151801515811461133a57600080fd5b60006020828403121561169057600080fd5b5051919050565b602080825260099082015268151bdbdd08151bdbdd60ba1b604082015260600190565b6020808252600c908201526b125b9d985b1a59081d1bdbdd60a21b604082015260600190565b600481106113da576113da6113b4565b60c081016116fe82856116e0565b60018060801b038084511660208401528060208501511660408401528060408501511660608401528060608501511660808401528060808501511660a0840152509392505050565b6000600182016117585761175861161d565b5060010190565b6001600160801b0382811682821603908082111561177f5761177f61161d565b5092915050565b6000826117a357634e487b7160e01b600052601260045260246000fd5b500690565b808201808211156104f8576104f861161d565b8481526001600160a01b0384166020820152608081016117de60408301856116e0565b82606083015295945050505050565b60008060006060848603121561180257600080fd5b835192506020840151915060408401519050925092509256fedf8b4c520ffe197c5343c6f5aec59570151ef9a492f2c624fd45ddde6135ec42a2646970667358221220047b0d1c7ea864901466ddd99bb1df2450ee959a93bec4d0b132aa05cc303ac064736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000e27a5e51e64ef12dac6d60062b67bcbd52be706800000000000000000000000098994a9a7a2570367554589189dc9772241650f6
-----Decoded View---------------
Arg [0] : _toot (address): 0xe27A5E51e64Ef12dac6D60062B67bcBD52be7068
Arg [1] : _uniswapV2Router (address): 0x98994a9A7a2570367554589189dC9772241650f6
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000e27a5e51e64ef12dac6d60062b67bcbd52be7068
Arg [1] : 00000000000000000000000098994a9a7a2570367554589189dc9772241650f6
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.