Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 6 from a total of 6 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Set Primary Pool | 14509144 | 1453 days ago | IN | 0 ETH | 0.00185871 | ||||
| Add Exchange Poo... | 14509140 | 1453 days ago | IN | 0 ETH | 0.0034553 | ||||
| Set Sell Tax Che... | 14509119 | 1453 days ago | IN | 0 ETH | 0.01103322 | ||||
| Set Base Sell Ta... | 14509114 | 1453 days ago | IN | 0 ETH | 0.00256189 | ||||
| Set Buy Tax Chec... | 14509016 | 1453 days ago | IN | 0 ETH | 0.00150463 | ||||
| Set Base Buy Tax... | 14509012 | 1453 days ago | IN | 0 ETH | 0.0023228 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
DynamicTaxHandler
Compiler Version
v0.8.11+commit.d7f03943
Optimization Enabled:
Yes with 888 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
import "./ITaxHandler.sol";
import "../utils/ExchangePoolProcessor.sol";
/**
* @title Dynamic tax handler
* @notice Processes tax for a given token transfer. Checks for the following:
* - Is the address on the static blacklist? If so, it can only transfer to the
* `receiver` address. In all other cases, the transfer will fail.
* - Is the address exempt from taxes, if so, the number of taxed tokens is
* always zero.
* - Is it a transfer between "regular" users? This means they are not on the
* list of either blacklisted or exempt addresses, nor are they an address
* designated as an exchange pool.
* - Is it a transfer towards or from an exchange pool? If so, the transaction
* is taxed according to its relative size to the exchange pool.
*/
contract DynamicTaxHandler is ITaxHandler, ExchangePoolProcessor {
using EnumerableSet for EnumerableSet.AddressSet;
struct TaxCheckpoint {
uint256 threshold;
uint256 basisPoints;
}
/// @notice The default buy tax in basis points.
uint256 public baseBuyTaxBasisPoints;
/// @notice The default sell tax in basis points.
uint256 public baseSellTaxBasisPoints;
/// @dev The registry of buy tax checkpoints. Used to keep track of the
/// correct number of tokens to deduct as tax when buying.
mapping(uint256 => TaxCheckpoint) private _buyTaxBasisPoints;
/// @dev The number of buy tax checkpoints in the registry.
uint256 private _buyTaxPoints;
/// @dev The registry of sell tax checkpoints. Used to keep track of the
/// correct number of tokens to deduct as tax when selling.
mapping(uint256 => TaxCheckpoint) private _sellTaxBasisPoints;
/// @dev The number of sell tax checkpoints in the registry.
uint256 private _sellTaxPoints;
/// @dev Immutable list of blacklisted addresses.
address[] private blacklisted;
/// @notice The only address the blacklisted addresses can still transfer tokens to.
address public immutable receiver;
/// @dev The set of addresses exempt from tax.
EnumerableSet.AddressSet private _exempted;
/// @notice The token to account for.
IERC20 public token;
/// @notice Emitted whenever the base buy tax basis points value is changed.
event BaseBuyTaxBasisPointsChanged(uint256 previousValue, uint256 newValue);
/// @notice Emitted whenever the base sell tax basis points value is changed.
event BaseSellTaxBasisPointsChanged(uint256 previousValue, uint256 newValue);
/// @notice Emitted whenever a buy tax checkpoint is added.
event BuyTaxCheckpointAdded(uint256 threshold, uint256 basisPoints);
/// @notice Emitted whenever a buy tax checkpoint is removed.
event BuyTaxCheckpointRemoved(uint256 threshold, uint256 basisPoints);
/// @notice Emitted whenever a sell tax checkpoint is added.
event SellTaxCheckpointAdded(uint256 threshold, uint256 basisPoints);
/// @notice Emitted whenever a sell tax checkpoint is removed.
event SellTaxCheckpointRemoved(uint256 threshold, uint256 basisPoints);
/// @notice Emitted when an address is added to or removed from the exempted addresses set.
event TaxExemptionUpdated(address indexed wallet, bool exempted);
/**
* @param tokenAddress Address of the token to account for when interacting
* with exchange pools.
* @param receiverAddress The only address the blacklisted addresses can
* send tokens to.
* @param blacklistedAddresses The list of addresses that are banned from
* performing transfers. They can still receive tokens however.
*/
constructor(
address tokenAddress,
address receiverAddress,
address[] memory blacklistedAddresses
) {
token = IERC20(tokenAddress);
receiver = receiverAddress;
blacklisted = blacklistedAddresses;
}
/**
* @notice Get number of tokens to pay as tax.
* @dev There is no easy way to differentiate between a user swapping
* tokens and a user adding or removing liquidity to the pool. In both
* cases tokens are transferred to or from the pool. This is an unfortunate
* case where users have to accept being taxed on liquidity additions and
* removal. To get around this issue a separate liquidity addition contract
* can be deployed. This contract could be exempt from taxes if its
* functionality is verified to only add and remove liquidity.
* @param benefactor Address of the benefactor.
* @param beneficiary Address of the beneficiary.
* @param amount Number of tokens in the transfer.
* @return Number of tokens to pay as tax.
*/
function getTax(
address benefactor,
address beneficiary,
uint256 amount
) external view returns (uint256) {
// Blacklisted addresses are only allowed to transfer to the receiver.
if (isBlacklisted(benefactor)) {
if (beneficiary == receiver) {
return 0;
} else {
revert("DynamicTaxHandler:getTax:BLACKLISTED: Benefactor has been blacklisted");
}
}
// Exempted addresses don't pay tax.
if (_exempted.contains(benefactor) || _exempted.contains(beneficiary)) {
return 0;
}
// Transactions between regular users (this includes contracts) aren't taxed.
if (!_exchangePools.contains(benefactor) && !_exchangePools.contains(beneficiary)) {
return 0;
}
// Transactions between pools aren't taxed.
if (_exchangePools.contains(benefactor) && _exchangePools.contains(beneficiary)) {
return 0;
}
uint256 poolBalance = token.balanceOf(primaryPool);
uint256 basisPoints;
// If the benefactor is found in the set of exchange pools, then it's a buy transactions, otherwise a sell
// transactions, because the other use cases have already been checked above.
if (_exchangePools.contains(benefactor)) {
basisPoints = _getBuyTaxBasisPoints(amount, poolBalance);
} else {
basisPoints = _getSellTaxBasisPoints(amount, poolBalance);
}
return (amount * basisPoints) / 10000;
}
/**
* @notice Set buy tax basis points value.
* @param basisPoints The new buy tax basis points base value.
*/
function setBaseBuyTaxBasisPoints(uint256 basisPoints) external onlyOwner {
uint256 previousBuyTaxBasisPoints = baseBuyTaxBasisPoints;
baseBuyTaxBasisPoints = basisPoints;
emit BaseBuyTaxBasisPointsChanged(previousBuyTaxBasisPoints, basisPoints);
}
/**
* @notice Set base sell tax basis points value.
* @param basisPoints The new sell tax basis points base value.
*/
function setBaseSellTaxBasisPoints(uint256 basisPoints) external onlyOwner {
uint256 previousSellTaxBasisPoints = baseSellTaxBasisPoints;
baseSellTaxBasisPoints = basisPoints;
emit BaseSellTaxBasisPointsChanged(previousSellTaxBasisPoints, basisPoints);
}
/**
* @notice Set buy tax checkpoints
* @param thresholds Array containing the threshold values of the buy tax checkpoints.
* @param basisPoints Array containing the basis points values of the buy tax checkpoints.
*/
function setBuyTaxCheckpoints(uint256[] memory thresholds, uint256[] memory basisPoints) external onlyOwner {
require(
thresholds.length == basisPoints.length,
"DynamicTaxHandler:setBuyTaxBasisPoints:UNEQUAL_LENGTHS: Array lengths should be equal."
);
// Reset previous points
for (uint256 i = 0; i < _buyTaxPoints; i++) {
emit BuyTaxCheckpointRemoved(_buyTaxBasisPoints[i].threshold, _buyTaxBasisPoints[i].basisPoints);
_buyTaxBasisPoints[i].basisPoints = 0;
_buyTaxBasisPoints[i].threshold = 0;
}
_buyTaxPoints = thresholds.length;
for (uint256 i = 0; i < thresholds.length; i++) {
_buyTaxBasisPoints[i] = TaxCheckpoint({ basisPoints: basisPoints[i], threshold: thresholds[i] });
emit BuyTaxCheckpointAdded(_buyTaxBasisPoints[i].threshold, _buyTaxBasisPoints[i].basisPoints);
}
}
/**
* @notice Set sell tax checkpoints
* @param thresholds Array containing the threshold values of the sell tax checkpoints.
* @param basisPoints Array containing the basis points values of the sell tax checkpoints.
*/
function setSellTaxCheckpoints(uint256[] memory thresholds, uint256[] memory basisPoints) external onlyOwner {
require(
thresholds.length == basisPoints.length,
"DynamicTaxHandler:setSellTaxBasisPoints:UNEQUAL_LENGTHS: Array lengths should be equal."
);
// Reset previous points
for (uint256 i = 0; i < _sellTaxPoints; i++) {
emit SellTaxCheckpointRemoved(_sellTaxBasisPoints[i].threshold, _sellTaxBasisPoints[i].basisPoints);
_sellTaxBasisPoints[i].basisPoints = 0;
_sellTaxBasisPoints[i].threshold = 0;
}
_sellTaxPoints = thresholds.length;
for (uint256 i = 0; i < thresholds.length; i++) {
_sellTaxBasisPoints[i] = TaxCheckpoint({ basisPoints: basisPoints[i], threshold: thresholds[i] });
emit SellTaxCheckpointAdded(_sellTaxBasisPoints[i].threshold, _sellTaxBasisPoints[i].basisPoints);
}
}
/**
* @notice Add address to set of tax-exempted addresses.
* @param exemption Address to add to set of tax-exempted addresses.
*/
function addExemption(address exemption) external onlyOwner {
if (_exempted.add(exemption)) {
emit TaxExemptionUpdated(exemption, true);
}
}
/**
* @notice Remove address from set of tax-exempted addresses.
* @param exemption Address to remove from set of tax-exempted addresses.
*/
function removeExemption(address exemption) external onlyOwner {
if (_exempted.remove(exemption)) {
emit TaxExemptionUpdated(exemption, false);
}
}
/**
* @notice Get blacklist status of a given wallet.
* @param wallet Address to check blacklist status of.
* @return True if address is blacklisted, else False.
*/
function isBlacklisted(address wallet) public view returns (bool) {
for (uint256 i = 0; i < blacklisted.length; i++) {
if (wallet == blacklisted[i]) {
return true;
}
}
return false;
}
function _getBuyTaxBasisPoints(uint256 amount, uint256 poolBalance) private view returns (uint256 taxBasisPoints) {
taxBasisPoints = baseBuyTaxBasisPoints;
uint256 basisPoints = (amount * 10000) / poolBalance;
for (uint256 i = 0; i < _buyTaxPoints; i++) {
if (_buyTaxBasisPoints[i].threshold <= basisPoints) {
taxBasisPoints = _buyTaxBasisPoints[i].basisPoints;
}
}
}
function _getSellTaxBasisPoints(uint256 amount, uint256 poolBalance) private view returns (uint256 taxBasisPoints) {
taxBasisPoints = baseSellTaxBasisPoints;
uint256 basisPoints = (amount * 10000) / poolBalance;
for (uint256 i = 0; i < _sellTaxPoints; i++) {
if (_sellTaxBasisPoints[i].threshold <= basisPoints) {
taxBasisPoints = _sellTaxBasisPoints[i].basisPoints;
}
}
}
}// SPDX-License-Identifier: MIT
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: MIT
pragma solidity ^0.8.0;
/**
* @dev Library for managing
* https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
* types.
*
* Sets have the following properties:
*
* - Elements are added, removed, and checked for existence in constant time
* (O(1)).
* - Elements are enumerated in O(n). No guarantees are made on the ordering.
*
* ```
* contract Example {
* // Add the library methods
* using EnumerableSet for EnumerableSet.AddressSet;
*
* // Declare a set state variable
* EnumerableSet.AddressSet private mySet;
* }
* ```
*
* As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
* and `uint256` (`UintSet`) are supported.
*/
library EnumerableSet {
// To implement this library for multiple types with as little code
// repetition as possible, we write it in terms of a generic Set type with
// bytes32 values.
// The Set implementation uses private functions, and user-facing
// implementations (such as AddressSet) are just wrappers around the
// underlying Set.
// This means that we can only create new EnumerableSets for types that fit
// in bytes32.
struct Set {
// Storage of set values
bytes32[] _values;
// Position of the value in the `values` array, plus 1 because index 0
// means a value is not in the set.
mapping(bytes32 => uint256) _indexes;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function _add(Set storage set, bytes32 value) private returns (bool) {
if (!_contains(set, value)) {
set._values.push(value);
// The value is stored at length-1, but we add 1 to all indexes
// and use 0 as a sentinel value
set._indexes[value] = set._values.length;
return true;
} else {
return false;
}
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function _remove(Set storage set, bytes32 value) private returns (bool) {
// We read and store the value's index to prevent multiple reads from the same storage slot
uint256 valueIndex = set._indexes[value];
if (valueIndex != 0) {
// Equivalent to contains(set, value)
// To delete an element from the _values array in O(1), we swap the element to delete with the last one in
// the array, and then remove the last element (sometimes called as 'swap and pop').
// This modifies the order of the array, as noted in {at}.
uint256 toDeleteIndex = valueIndex - 1;
uint256 lastIndex = set._values.length - 1;
if (lastIndex != toDeleteIndex) {
bytes32 lastvalue = set._values[lastIndex];
// Move the last value to the index where the value to delete is
set._values[toDeleteIndex] = lastvalue;
// Update the index for the moved value
set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex
}
// Delete the slot where the moved value was stored
set._values.pop();
// Delete the index for the deleted slot
delete set._indexes[value];
return true;
} else {
return false;
}
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function _contains(Set storage set, bytes32 value) private view returns (bool) {
return set._indexes[value] != 0;
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function _length(Set storage set) private view returns (uint256) {
return set._values.length;
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function _at(Set storage set, uint256 index) private view returns (bytes32) {
return set._values[index];
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function _values(Set storage set) private view returns (bytes32[] memory) {
return set._values;
}
// Bytes32Set
struct Bytes32Set {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _add(set._inner, value);
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
return _remove(set._inner, value);
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
return _contains(set._inner, value);
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(Bytes32Set storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
return _at(set._inner, index);
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
return _values(set._inner);
}
// AddressSet
struct AddressSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(AddressSet storage set, address value) internal returns (bool) {
return _add(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(AddressSet storage set, address value) internal returns (bool) {
return _remove(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(AddressSet storage set, address value) internal view returns (bool) {
return _contains(set._inner, bytes32(uint256(uint160(value))));
}
/**
* @dev Returns the number of values in the set. O(1).
*/
function length(AddressSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(AddressSet storage set, uint256 index) internal view returns (address) {
return address(uint160(uint256(_at(set._inner, index))));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(AddressSet storage set) internal view returns (address[] memory) {
bytes32[] memory store = _values(set._inner);
address[] memory result;
assembly {
result := store
}
return result;
}
// UintSet
struct UintSet {
Set _inner;
}
/**
* @dev Add a value to a set. O(1).
*
* Returns true if the value was added to the set, that is if it was not
* already present.
*/
function add(UintSet storage set, uint256 value) internal returns (bool) {
return _add(set._inner, bytes32(value));
}
/**
* @dev Removes a value from a set. O(1).
*
* Returns true if the value was removed from the set, that is if it was
* present.
*/
function remove(UintSet storage set, uint256 value) internal returns (bool) {
return _remove(set._inner, bytes32(value));
}
/**
* @dev Returns true if the value is in the set. O(1).
*/
function contains(UintSet storage set, uint256 value) internal view returns (bool) {
return _contains(set._inner, bytes32(value));
}
/**
* @dev Returns the number of values on the set. O(1).
*/
function length(UintSet storage set) internal view returns (uint256) {
return _length(set._inner);
}
/**
* @dev Returns the value stored at position `index` in the set. O(1).
*
* Note that there are no guarantees on the ordering of values inside the
* array, and it may change when more values are added or removed.
*
* Requirements:
*
* - `index` must be strictly less than {length}.
*/
function at(UintSet storage set, uint256 index) internal view returns (uint256) {
return uint256(_at(set._inner, index));
}
/**
* @dev Return the entire set in an array
*
* WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
* to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
* this function has an unbounded cost, and using it as part of a state-changing function may render the function
* uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
*/
function values(UintSet storage set) internal view returns (uint256[] memory) {
bytes32[] memory store = _values(set._inner);
uint256[] memory result;
assembly {
result := store
}
return result;
}
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
/**
* @title Tax handler interface
* @dev Any class that implements this interface can be used for protocol-specific tax calculations.
*/
interface ITaxHandler {
/**
* @notice Get number of tokens to pay as tax.
* @param benefactor Address of the benefactor.
* @param beneficiary Address of the beneficiary.
* @param amount Number of tokens in the transfer.
* @return Number of tokens to pay as tax.
*/
function getTax(
address benefactor,
address beneficiary,
uint256 amount
) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/structs/EnumerableSet.sol";
/**
* @title Exchange pool processor abstract contract.
* @dev Keeps an enumerable set of designated exchange addresses as well as a single primary pool address.
*/
abstract contract ExchangePoolProcessor is Ownable {
using EnumerableSet for EnumerableSet.AddressSet;
/// @dev Set of exchange pool addresses.
EnumerableSet.AddressSet internal _exchangePools;
/// @notice Primary exchange pool address.
address public primaryPool;
/// @notice Emitted when an exchange pool address is added to the set of tracked pool addresses.
event ExchangePoolAdded(address exchangePool);
/// @notice Emitted when an exchange pool address is removed from the set of tracked pool addresses.
event ExchangePoolRemoved(address exchangePool);
/// @notice Emitted when the primary pool address is updated.
event PrimaryPoolUpdated(address oldPrimaryPool, address newPrimaryPool);
/**
* @notice Get list of addresses designated as exchange pools.
* @return An array of exchange pool addresses.
*/
function getExchangePoolAddresses() external view returns (address[] memory) {
return _exchangePools.values();
}
/**
* @notice Add an address to the set of exchange pool addresses.
* @dev Nothing happens if the pool already exists in the set.
* @param exchangePool Address of exchange pool to add.
*/
function addExchangePool(address exchangePool) external onlyOwner {
if (_exchangePools.add(exchangePool)) {
emit ExchangePoolAdded(exchangePool);
}
}
/**
* @notice Remove an address from the set of exchange pool addresses.
* @dev Nothing happens if the pool doesn't exist in the set..
* @param exchangePool Address of exchange pool to remove.
*/
function removeExchangePool(address exchangePool) external onlyOwner {
if (_exchangePools.remove(exchangePool)) {
emit ExchangePoolRemoved(exchangePool);
}
}
/**
* @notice Set exchange pool address as primary pool.
* @dev To prevent issues, only addresses inside the set of exchange pool addresses can be selected as primary pool.
* @param exchangePool Address of exchange pool to set as primary pool.
*/
function setPrimaryPool(address exchangePool) external onlyOwner {
require(
_exchangePools.contains(exchangePool),
"ExchangePoolProcessor:setPrimaryPool:INVALID_POOL: Given address is not registered as exchange pool."
);
require(
primaryPool != exchangePool,
"ExchangePoolProcessor:setPrimaryPool:ALREADY_SET: This address is already the primary pool address."
);
address oldPrimaryPool = primaryPool;
primaryPool = exchangePool;
emit PrimaryPoolUpdated(oldPrimaryPool, exchangePool);
}
}// SPDX-License-Identifier: MIT
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() {
_setOwner(_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 {
_setOwner(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");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}// SPDX-License-Identifier: MIT
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;
}
}{
"metadata": {
"bytecodeHash": "none"
},
"optimizer": {
"enabled": true,
"runs": 888
},
"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":"tokenAddress","type":"address"},{"internalType":"address","name":"receiverAddress","type":"address"},{"internalType":"address[]","name":"blacklistedAddresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BaseBuyTaxBasisPointsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousValue","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"BaseSellTaxBasisPointsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"BuyTaxCheckpointAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"BuyTaxCheckpointRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchangePool","type":"address"}],"name":"ExchangePoolAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"exchangePool","type":"address"}],"name":"ExchangePoolRemoved","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":false,"internalType":"address","name":"oldPrimaryPool","type":"address"},{"indexed":false,"internalType":"address","name":"newPrimaryPool","type":"address"}],"name":"PrimaryPoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"SellTaxCheckpointAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"threshold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"SellTaxCheckpointRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"bool","name":"exempted","type":"bool"}],"name":"TaxExemptionUpdated","type":"event"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"addExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exemption","type":"address"}],"name":"addExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"baseBuyTaxBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseSellTaxBasisPoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getExchangePoolAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"benefactor","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"getTax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"isBlacklisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"primaryPool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"receiver","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"removeExchangePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exemption","type":"address"}],"name":"removeExemption","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"setBaseBuyTaxBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"basisPoints","type":"uint256"}],"name":"setBaseSellTaxBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"thresholds","type":"uint256[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setBuyTaxCheckpoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"exchangePool","type":"address"}],"name":"setPrimaryPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"thresholds","type":"uint256[]"},{"internalType":"uint256[]","name":"basisPoints","type":"uint256[]"}],"name":"setSellTaxCheckpoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]Contract Creation Code
60a06040523480156200001157600080fd5b50604051620019f6380380620019f6833981016040819052620000349162000187565b6200003f3362000083565b600d80546001600160a01b0319166001600160a01b0385811691909117909155821660805280516200007990600a906020840190620000d3565b5050505062000281565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280548282559060005260206000209081019282156200012b579160200282015b828111156200012b57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620000f4565b50620001399291506200013d565b5090565b5b808211156200013957600081556001016200013e565b80516001600160a01b03811681146200016c57600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b6000806000606084860312156200019d57600080fd5b620001a88462000154565b92506020620001b981860162000154565b60408601519093506001600160401b0380821115620001d757600080fd5b818701915087601f830112620001ec57600080fd5b81518181111562000201576200020162000171565b8060051b604051601f19603f8301168101818110858211171562000229576200022962000171565b60405291825284820192508381018501918a8311156200024857600080fd5b938501935b828510156200027157620002618562000154565b845293850193928501926200024d565b8096505050505050509250925092565b608051611752620002a4600039600081816102c70152610dce01526117526000f3fe608060405234801561001057600080fd5b506004361061016c5760003560e01c80639be3d69c116100cd578063d7ad21ac11610081578063f7260d3e11610066578063f7260d3e146102c2578063fc0c546a146102e9578063fe575a87146102fc57600080fd5b8063d7ad21ac1461029c578063f2fde38b146102af57600080fd5b8063b134aea0116100b2578063b134aea01461026d578063b6044b6814610276578063c25103461461028957600080fd5b80639be3d69c14610247578063af813d511461025a57600080fd5b806353c1d70d11610124578063715018a611610109578063715018a61461020757806382291db01461020f5780638da5cb5b1461022257600080fd5b806353c1d70d146101e1578063705931fa146101f457600080fd5b80632ab4a939116101555780632ab4a939146101a45780633c1a2ab0146101b75780633f91d69d146101ce57600080fd5b80630c6df5e4146101715780630ed9cc4c1461018f575b600080fd5b61017961031f565b6040516101869190611469565b60405180910390f35b6101a261019d3660046114d2565b610330565b005b6101a26101b23660046114ed565b6103d1565b6101c060045481565b604051908152602001610186565b6101a26101dc3660046114d2565b61045f565b6101a26101ef3660046114ed565b6106a8565b6101a26102023660046114d2565b61072e565b6101a26107c2565b6101a261021d3660046115b7565b610816565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610186565b60035461022f906001600160a01b031681565b6101a26102683660046115b7565b610a57565b6101c060055481565b6101a26102843660046114d2565b610c93565b6101a26102973660046114d2565b610d2b565b6101c06102aa36600461161b565b610dbc565b6101a26102bd3660046114d2565b611005565b61022f7f000000000000000000000000000000000000000000000000000000000000000081565b600d5461022f906001600160a01b031681565b61030f61030a3660046114d2565b6110d2565b6040519015158152602001610186565b606061032b6001611136565b905090565b6000546001600160a01b0316331461037d5760405162461bcd60e51b8152602060048201819052602482015260008051602061172683398151915260448201526064015b60405180910390fd5b610388600b82611143565b156103ce57604051600081526001600160a01b038216907f36ee46fa09c2419f7bcf8135c2bdd56bc882be141cb075961717003bed74367d906020015b60405180910390a25b50565b6000546001600160a01b031633146104195760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b600580549082905560408051828152602081018490527ff0c7f5f7df2a88ff88d534f361f528148842d92baa9078eea240e76583ca63e591015b60405180910390a15050565b6000546001600160a01b031633146104a75760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6104b2600182611161565b6105715760405162461bcd60e51b8152602060048201526064602482018190527f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960448301527f506f6f6c3a494e56414c49445f504f4f4c3a20476976656e2061646472657373908201527f206973206e6f7420726567697374657265642061732065786368616e6765207060848201527f6f6f6c2e0000000000000000000000000000000000000000000000000000000060a482015260c401610374565b6003546001600160a01b03828116911614156106415760405162461bcd60e51b815260206004820152606360248201527f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960448201527f506f6f6c3a414c52454144595f5345543a20546869732061646472657373206960648201527f7320616c726561647920746865207072696d61727920706f6f6c20616464726560848201527f73732e000000000000000000000000000000000000000000000000000000000060a482015260c401610374565b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff1983168117909355604080519190921680825260208201939093527ff9df320023cbf5726cbd5bdd99ae23c9382d03b65180d0611d0d72edab96cf899101610453565b6000546001600160a01b031633146106f05760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b600480549082905560408051828152602081018490527f93d928b0a0b9a197009d049b6d8389eba7d7cf863810dac6bcec7eb6699eeeca9101610453565b6000546001600160a01b031633146107765760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610781600b82611183565b156103ce57604051600181526001600160a01b038216907f36ee46fa09c2419f7bcf8135c2bdd56bc882be141cb075961717003bed74367d906020016103c5565b6000546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6108146000611198565b565b6000546001600160a01b0316331461085e5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b80518251146108fb5760405162461bcd60e51b815260206004820152605660248201527f44796e616d696354617848616e646c65723a736574427579546178426173697360448201527f506f696e74733a554e455155414c5f4c454e475448533a204172726179206c6560648201527f6e677468732073686f756c6420626520657175616c2e00000000000000000000608482015260a401610374565b60005b6007548110156109855760008181526006602052604090819020805460019091015491517f5b8e8ff6bdcc44d03770bb85247f876325598ac0f55c5de3b5b2095ae3674b2392610955928252602082015260400190565b60405180910390a1600081815260066020526040812060018101829055558061097d8161166d565b9150506108fe565b50815160075560005b8251811015610a525760405180604001604052808483815181106109b4576109b4611688565b602002602001015181526020018383815181106109d3576109d3611688565b602090810291909101810151909152600083815260068252604090819020835180825593909201516001909201829055517f29217ff14624eced9fe4927f48cd5103da47938d18e8128fadec4b058bc9a34c92610a3892908252602082015260400190565b60405180910390a180610a4a8161166d565b91505061098e565b505050565b6000546001600160a01b03163314610a9f5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b8051825114610b3c5760405162461bcd60e51b815260206004820152605760248201527f44796e616d696354617848616e646c65723a73657453656c6c5461784261736960448201527f73506f696e74733a554e455155414c5f4c454e475448533a204172726179206c60648201527f656e677468732073686f756c6420626520657175616c2e000000000000000000608482015260a401610374565b60005b600954811015610bc65760008181526008602052604090819020805460019091015491517fb29140361f40850e79b9b963b76210fc10cd8a03bc5c6208c1526e58734db46692610b96928252602082015260400190565b60405180910390a16000818152600860205260408120600181018290555580610bbe8161166d565b915050610b3f565b50815160095560005b8251811015610a52576040518060400160405280848381518110610bf557610bf5611688565b60200260200101518152602001838381518110610c1457610c14611688565b602090810291909101810151909152600083815260088252604090819020835180825593909201516001909201829055517f890ab6bf3718293403e9d20df064083554fe938b862707a5a95e4beeb540547c92610c7992908252602082015260400190565b60405180910390a180610c8b8161166d565b915050610bcf565b6000546001600160a01b03163314610cdb5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610ce6600182611183565b156103ce576040516001600160a01b03821681527f1caec4f1ef0e654f520edf2d95d3d035ea6382500dbdd179d37017442e535284906020015b60405180910390a150565b6000546001600160a01b03163314610d735760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610d7e600182611143565b156103ce576040516001600160a01b03821681527f3186e21fde26faa448666270e7a0d53c887d8f040950e4330a2b622e34ed6f4490602001610d20565b6000610dc7846110d2565b15610ea2577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161415610e0e57506000610ffe565b60405162461bcd60e51b815260206004820152604560248201527f44796e616d696354617848616e646c65723a6765745461783a424c41434b4c4960448201527f535445443a2042656e65666163746f7220686173206265656e20626c61636b6c60648201527f6973746564000000000000000000000000000000000000000000000000000000608482015260a401610374565b610ead600b85611161565b80610ebe5750610ebe600b84611161565b15610ecb57506000610ffe565b610ed6600185611161565b158015610eeb5750610ee9600184611161565b155b15610ef857506000610ffe565b610f03600185611161565b8015610f155750610f15600184611161565b15610f2257506000610ffe565b600d546003546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061169e565b90506000610fbf600187611161565b15610fd557610fce84836111f5565b9050610fe2565b610fdf8483611264565b90505b612710610fef82866116b7565b610ff991906116d6565b925050505b9392505050565b6000546001600160a01b0316331461104d5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6001600160a01b0381166110c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610374565b6103ce81611198565b6000805b600a5481101561112d57600a81815481106110f3576110f3611688565b6000918252602090912001546001600160a01b038481169116141561111b5750600192915050565b806111258161166d565b9150506110d6565b50600092915050565b60606000610ffe836112cb565b6000611158836001600160a01b038416611327565b90505b92915050565b6001600160a01b03811660009081526001830160205260408120541515611158565b6000611158836001600160a01b03841661141a565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600454600082611207856127106116b7565b61121191906116d6565b905060005b60075481101561125c57600081815260066020526040902054821061124a5760008181526006602052604090206001015492505b806112548161166d565b915050611216565b505092915050565b600554600082611276856127106116b7565b61128091906116d6565b905060005b60095481101561125c5760008181526008602052604090205482106112b95760008181526008602052604090206001015492505b806112c38161166d565b915050611285565b60608160000180548060200260200160405190810160405280929190818152602001828054801561131b57602002820191906000526020600020905b815481526020019060010190808311611307575b50505050509050919050565b6000818152600183016020526040812054801561141057600061134b6001836116f8565b855490915060009061135f906001906116f8565b90508181146113c457600086600001828154811061137f5761137f611688565b90600052602060002001549050808760000184815481106113a2576113a2611688565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806113d5576113d561170f565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061115b565b600091505061115b565b60008181526001830160205260408120546114615750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561115b565b50600061115b565b6020808252825182820181905260009190848201906040850190845b818110156114aa5783516001600160a01b031683529284019291840191600101611485565b50909695505050505050565b80356001600160a01b03811681146114cd57600080fd5b919050565b6000602082840312156114e457600080fd5b611158826114b6565b6000602082840312156114ff57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261152d57600080fd5b8135602067ffffffffffffffff8083111561154a5761154a611506565b8260051b604051601f19603f8301168101818110848211171561156f5761156f611506565b60405293845285810183019383810192508785111561158d57600080fd5b83870191505b848210156115ac57813583529183019190830190611593565b979650505050505050565b600080604083850312156115ca57600080fd5b823567ffffffffffffffff808211156115e257600080fd5b6115ee8683870161151c565b9350602085013591508082111561160457600080fd5b506116118582860161151c565b9150509250929050565b60008060006060848603121561163057600080fd5b611639846114b6565b9250611647602085016114b6565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b600060001982141561168157611681611657565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156116b057600080fd5b5051919050565b60008160001904831182151516156116d1576116d1611657565b500290565b6000826116f357634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561170a5761170a611657565b500390565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080b000a000000000000000000000000cf0c122c6b73ff809c693db761e7baebe62b6a2e0000000000000000000000002b9d5c7f2ead1a221d771fb6bb5e35df04d60ab00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000c566449675c2c2886c45261f68da919de078f6bc000000000000000000000000de5ad475057482fec82136e5e698ecd8b57615e9000000000000000000000000f681069fc9792a95a77b5ecba443a77d5d49df1f000000000000000000000000a6e2839e73e623ef3853a6bd28d6f02a127a43070000000000000000000000006eaa9db4ac9def1297365e1b79b965058f641f69000000000000000000000000b28a293278a51a1c42aeb0b1e5de080fd99c998b00000000000000000000000041a14a3905a6827964a1ed9359e686ef768e2996000000000000000000000000f81d4e193661af0cc52091d4d90271d800ca326d000000000000000000000000e139962e5d7b07a9378f159a4a1b7cabe9df1d6e000000000000000000000000b20bf6d7f60059dd5de46f3f0f32665a259ea6c0000000000000000000000000ca1f85ca6e502287c489d373938eb55c9b832c0f000000000000000000000000376a369146e71337943fd52e5d9d30ee8cd9e482000000000000000000000000cb30818397d781e05a8e04102fccdcb431d709c20000000000000000000000003c6288d1c8d1cdb9a08216347b394a2d9727b9c4000000000000000000000000256568c0f9079f5ae96add3d49517e6f13b7ea6c000000000000000000000000189bd808ba7284a4e875886330587021ea1886630000000000000000000000001d9b521c3c504dd7c3fb6ce906cd22830e3819e2000000000000000000000000c697be0b5b82284391a878b226e2f9afc6b947100000000000000000000000006ecd5e7a81dcbb37c86744110402b01d8e1f60440000000000000000000000003b31c4ae1dbd80dba70f45f29d289216810c07c7000000000000000000000000904441ebc002dba9a927b35baf55dc98e6b5c8c6000000000000000000000000aaefa74e6d545f3487beec39a3f78c49dd3ffb5d000000000000000000000000000759119ceaba5dc3d41c8a003c743f99f998470000000000000000000000001f30f1a1cde7b88b211ec3711f71a36c282b2b6c000000000000000000000000c17519a680ba2bbef1018c16cbc0fc34da5969ba000000000000000000000000dd4b68c06f62a7cebe791917c85b83a9573272b8000000000000000000000000a28602f18eb877b0b929caaae94faed4ff40292900000000000000000000000049d65ff0f419be0746a9ecf58d85c0e9dc170958000000000000000000000000b184af95391b0ed1d92652d39c0291e9e7cc90600000000000000000000000000d952e9b83c91e5bccdeefa15329d21071da5678000000000000000000000000defd15b2d7030909fd210a525f8158fd9e5b8bbb0000000000000000000000003301d3494478feb56bb6038edc7e55aa9ace25c40000000000000000000000006392b539f3dabfdd6dacf81e5786b981888927b6000000000000000000000000be23cbb62064b8b1550ae5ada59c39d45b1e2081000000000000000000000000124d9bf2fecbc16b54ec4accdb14d44c2144f012000000000000000000000000b85a8e652e10f9d9caf564f5c96ca4270091bc820000000000000000000000008271267cec8c994418776862d7ef30fb05d20ff10000000000000000000000009f144812058a1d9bff7baaeb4bf2e4286efa46ad0000000000000000000000008fad3e862c203ec9fc36832e9d0d13fe057a6ff100000000000000000000000040bb488401f104714478ed262f4ed177c24cbb82000000000000000000000000bdc8542fe776f8712afc70b2bd147fdd0115ad54000000000000000000000000c933ee4a90dc542b820ca674160922fb440b2ec4000000000000000000000000be496d6e541344d7bdb91055cdb5fc260c73d5a80000000000000000000000007acab48d2ecedd6bfd8e187f0ea520da76a04662000000000000000000000000698725516b6759a1511482846a0d27bc872e3906000000000000000000000000c1563bdf57bdb990c89070aa72cda57fe8d6913d000000000000000000000000495897ab1e68591be38f7882346bebb13fcfc6f8000000000000000000000000cd38dcd8d69cc69bd057a38960f5ed7f0d003cf800000000000000000000000055d79fa93e01bb5d24315cd4f17aa15c3f588dc7000000000000000000000000690c7f5b32bb7e38be41b0b0160799a2f8e7b0730000000000000000000000002efc41a2f72f85da7a9aa773d8b9d3a21c015c380000000000000000000000001a9472443a990bed5d03c1370de48f54d6a538cd00000000000000000000000055e09387cf083f558ec8e41ad29079f1f34a7346000000000000000000000000e3e4f084db6434d3030a6e8392c6e819ae7578e2000000000000000000000000a594c6ec7447eb4dc1aa9e7fc5cd692f2edf87ae0000000000000000000000005fc771d35b0615d79c76c04c2cbe8496472411800000000000000000000000003feb264a1d50c55a2aa30bbbb49d25fcc6016b2c00000000000000000000000086ca33d8b15ac2a7764e38ac57e7066202191d1e000000000000000000000000fafa5c581ce8dc4188179b9787f58d4e82285005000000000000000000000000bca844c6cf9e65897805a0630fc7895d5d9c244f000000000000000000000000abafa5438f3b39f5248fabf9103b082649f8288e000000000000000000000000edc0d61e5fcdc8949294df3f5c13497643be2b3e00000000000000000000000088baf72dd5539b3da71bfce86c486a6cf89836f50000000000000000000000001cb09ae8a2f720b723c8c67a3268a3c053f03e690000000000000000000000004d7724803b068b289a223ba3506661f0d44ea9570000000000000000000000005778bc9f6b80a05bddb43cf7ed3356d83a84043d000000000000000000000000e63a714a5fd70320f17c54f5ac5287579fb12b6f000000000000000000000000984a88e2695f30ecfab9ba5dff9df9915b435f3b0000000000000000000000005fc132b0a7027773da9d825728d1a2dc59137165000000000000000000000000d713fa41f57b42433b77c0de9a226639b66b3a59000000000000000000000000b8f9e33fe0a4a21e6e0f70d88d6904fe8137a7fe000000000000000000000000593f37f7fae9292fd615bcbe363b87c631ad80d20000000000000000000000005590577c62498f2e60ff82ae447a55b72d01a6d40000000000000000000000005fa8b510d3116547d9eb299859fc0c927c000a03000000000000000000000000ee011ab70b1f269b711c88f9d18ab306149ebcbb0000000000000000000000005c634603c58468a189c999c5ee7df5696fb319e10000000000000000000000008c3170b00b17015fde3123b5e84dd2d28acc3c05000000000000000000000000a9627c74264f081fe18b98786b46df06d8191a870000000000000000000000002f0c47a2217582b0744cdc51e32596b81c1e1531
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061016c5760003560e01c80639be3d69c116100cd578063d7ad21ac11610081578063f7260d3e11610066578063f7260d3e146102c2578063fc0c546a146102e9578063fe575a87146102fc57600080fd5b8063d7ad21ac1461029c578063f2fde38b146102af57600080fd5b8063b134aea0116100b2578063b134aea01461026d578063b6044b6814610276578063c25103461461028957600080fd5b80639be3d69c14610247578063af813d511461025a57600080fd5b806353c1d70d11610124578063715018a611610109578063715018a61461020757806382291db01461020f5780638da5cb5b1461022257600080fd5b806353c1d70d146101e1578063705931fa146101f457600080fd5b80632ab4a939116101555780632ab4a939146101a45780633c1a2ab0146101b75780633f91d69d146101ce57600080fd5b80630c6df5e4146101715780630ed9cc4c1461018f575b600080fd5b61017961031f565b6040516101869190611469565b60405180910390f35b6101a261019d3660046114d2565b610330565b005b6101a26101b23660046114ed565b6103d1565b6101c060045481565b604051908152602001610186565b6101a26101dc3660046114d2565b61045f565b6101a26101ef3660046114ed565b6106a8565b6101a26102023660046114d2565b61072e565b6101a26107c2565b6101a261021d3660046115b7565b610816565b6000546001600160a01b03165b6040516001600160a01b039091168152602001610186565b60035461022f906001600160a01b031681565b6101a26102683660046115b7565b610a57565b6101c060055481565b6101a26102843660046114d2565b610c93565b6101a26102973660046114d2565b610d2b565b6101c06102aa36600461161b565b610dbc565b6101a26102bd3660046114d2565b611005565b61022f7f0000000000000000000000002b9d5c7f2ead1a221d771fb6bb5e35df04d60ab081565b600d5461022f906001600160a01b031681565b61030f61030a3660046114d2565b6110d2565b6040519015158152602001610186565b606061032b6001611136565b905090565b6000546001600160a01b0316331461037d5760405162461bcd60e51b8152602060048201819052602482015260008051602061172683398151915260448201526064015b60405180910390fd5b610388600b82611143565b156103ce57604051600081526001600160a01b038216907f36ee46fa09c2419f7bcf8135c2bdd56bc882be141cb075961717003bed74367d906020015b60405180910390a25b50565b6000546001600160a01b031633146104195760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b600580549082905560408051828152602081018490527ff0c7f5f7df2a88ff88d534f361f528148842d92baa9078eea240e76583ca63e591015b60405180910390a15050565b6000546001600160a01b031633146104a75760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6104b2600182611161565b6105715760405162461bcd60e51b8152602060048201526064602482018190527f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960448301527f506f6f6c3a494e56414c49445f504f4f4c3a20476976656e2061646472657373908201527f206973206e6f7420726567697374657265642061732065786368616e6765207060848201527f6f6f6c2e0000000000000000000000000000000000000000000000000000000060a482015260c401610374565b6003546001600160a01b03828116911614156106415760405162461bcd60e51b815260206004820152606360248201527f45786368616e6765506f6f6c50726f636573736f723a7365745072696d61727960448201527f506f6f6c3a414c52454144595f5345543a20546869732061646472657373206960648201527f7320616c726561647920746865207072696d61727920706f6f6c20616464726560848201527f73732e000000000000000000000000000000000000000000000000000000000060a482015260c401610374565b600380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff1983168117909355604080519190921680825260208201939093527ff9df320023cbf5726cbd5bdd99ae23c9382d03b65180d0611d0d72edab96cf899101610453565b6000546001600160a01b031633146106f05760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b600480549082905560408051828152602081018490527f93d928b0a0b9a197009d049b6d8389eba7d7cf863810dac6bcec7eb6699eeeca9101610453565b6000546001600160a01b031633146107765760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610781600b82611183565b156103ce57604051600181526001600160a01b038216907f36ee46fa09c2419f7bcf8135c2bdd56bc882be141cb075961717003bed74367d906020016103c5565b6000546001600160a01b0316331461080a5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6108146000611198565b565b6000546001600160a01b0316331461085e5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b80518251146108fb5760405162461bcd60e51b815260206004820152605660248201527f44796e616d696354617848616e646c65723a736574427579546178426173697360448201527f506f696e74733a554e455155414c5f4c454e475448533a204172726179206c6560648201527f6e677468732073686f756c6420626520657175616c2e00000000000000000000608482015260a401610374565b60005b6007548110156109855760008181526006602052604090819020805460019091015491517f5b8e8ff6bdcc44d03770bb85247f876325598ac0f55c5de3b5b2095ae3674b2392610955928252602082015260400190565b60405180910390a1600081815260066020526040812060018101829055558061097d8161166d565b9150506108fe565b50815160075560005b8251811015610a525760405180604001604052808483815181106109b4576109b4611688565b602002602001015181526020018383815181106109d3576109d3611688565b602090810291909101810151909152600083815260068252604090819020835180825593909201516001909201829055517f29217ff14624eced9fe4927f48cd5103da47938d18e8128fadec4b058bc9a34c92610a3892908252602082015260400190565b60405180910390a180610a4a8161166d565b91505061098e565b505050565b6000546001600160a01b03163314610a9f5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b8051825114610b3c5760405162461bcd60e51b815260206004820152605760248201527f44796e616d696354617848616e646c65723a73657453656c6c5461784261736960448201527f73506f696e74733a554e455155414c5f4c454e475448533a204172726179206c60648201527f656e677468732073686f756c6420626520657175616c2e000000000000000000608482015260a401610374565b60005b600954811015610bc65760008181526008602052604090819020805460019091015491517fb29140361f40850e79b9b963b76210fc10cd8a03bc5c6208c1526e58734db46692610b96928252602082015260400190565b60405180910390a16000818152600860205260408120600181018290555580610bbe8161166d565b915050610b3f565b50815160095560005b8251811015610a52576040518060400160405280848381518110610bf557610bf5611688565b60200260200101518152602001838381518110610c1457610c14611688565b602090810291909101810151909152600083815260088252604090819020835180825593909201516001909201829055517f890ab6bf3718293403e9d20df064083554fe938b862707a5a95e4beeb540547c92610c7992908252602082015260400190565b60405180910390a180610c8b8161166d565b915050610bcf565b6000546001600160a01b03163314610cdb5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610ce6600182611183565b156103ce576040516001600160a01b03821681527f1caec4f1ef0e654f520edf2d95d3d035ea6382500dbdd179d37017442e535284906020015b60405180910390a150565b6000546001600160a01b03163314610d735760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b610d7e600182611143565b156103ce576040516001600160a01b03821681527f3186e21fde26faa448666270e7a0d53c887d8f040950e4330a2b622e34ed6f4490602001610d20565b6000610dc7846110d2565b15610ea2577f0000000000000000000000002b9d5c7f2ead1a221d771fb6bb5e35df04d60ab06001600160a01b0316836001600160a01b03161415610e0e57506000610ffe565b60405162461bcd60e51b815260206004820152604560248201527f44796e616d696354617848616e646c65723a6765745461783a424c41434b4c4960448201527f535445443a2042656e65666163746f7220686173206265656e20626c61636b6c60648201527f6973746564000000000000000000000000000000000000000000000000000000608482015260a401610374565b610ead600b85611161565b80610ebe5750610ebe600b84611161565b15610ecb57506000610ffe565b610ed6600185611161565b158015610eeb5750610ee9600184611161565b155b15610ef857506000610ffe565b610f03600185611161565b8015610f155750610f15600184611161565b15610f2257506000610ffe565b600d546003546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b03918216600482015260009291909116906370a0823190602401602060405180830381865afa158015610f8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb0919061169e565b90506000610fbf600187611161565b15610fd557610fce84836111f5565b9050610fe2565b610fdf8483611264565b90505b612710610fef82866116b7565b610ff991906116d6565b925050505b9392505050565b6000546001600160a01b0316331461104d5760405162461bcd60e51b815260206004820181905260248201526000805160206117268339815191526044820152606401610374565b6001600160a01b0381166110c95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610374565b6103ce81611198565b6000805b600a5481101561112d57600a81815481106110f3576110f3611688565b6000918252602090912001546001600160a01b038481169116141561111b5750600192915050565b806111258161166d565b9150506110d6565b50600092915050565b60606000610ffe836112cb565b6000611158836001600160a01b038416611327565b90505b92915050565b6001600160a01b03811660009081526001830160205260408120541515611158565b6000611158836001600160a01b03841661141a565b600080546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600454600082611207856127106116b7565b61121191906116d6565b905060005b60075481101561125c57600081815260066020526040902054821061124a5760008181526006602052604090206001015492505b806112548161166d565b915050611216565b505092915050565b600554600082611276856127106116b7565b61128091906116d6565b905060005b60095481101561125c5760008181526008602052604090205482106112b95760008181526008602052604090206001015492505b806112c38161166d565b915050611285565b60608160000180548060200260200160405190810160405280929190818152602001828054801561131b57602002820191906000526020600020905b815481526020019060010190808311611307575b50505050509050919050565b6000818152600183016020526040812054801561141057600061134b6001836116f8565b855490915060009061135f906001906116f8565b90508181146113c457600086600001828154811061137f5761137f611688565b90600052602060002001549050808760000184815481106113a2576113a2611688565b6000918252602080832090910192909255918252600188019052604090208390555b85548690806113d5576113d561170f565b60019003818190600052602060002001600090559055856001016000868152602001908152602001600020600090556001935050505061115b565b600091505061115b565b60008181526001830160205260408120546114615750815460018181018455600084815260208082209093018490558454848252828601909352604090209190915561115b565b50600061115b565b6020808252825182820181905260009190848201906040850190845b818110156114aa5783516001600160a01b031683529284019291840191600101611485565b50909695505050505050565b80356001600160a01b03811681146114cd57600080fd5b919050565b6000602082840312156114e457600080fd5b611158826114b6565b6000602082840312156114ff57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b600082601f83011261152d57600080fd5b8135602067ffffffffffffffff8083111561154a5761154a611506565b8260051b604051601f19603f8301168101818110848211171561156f5761156f611506565b60405293845285810183019383810192508785111561158d57600080fd5b83870191505b848210156115ac57813583529183019190830190611593565b979650505050505050565b600080604083850312156115ca57600080fd5b823567ffffffffffffffff808211156115e257600080fd5b6115ee8683870161151c565b9350602085013591508082111561160457600080fd5b506116118582860161151c565b9150509250929050565b60008060006060848603121561163057600080fd5b611639846114b6565b9250611647602085016114b6565b9150604084013590509250925092565b634e487b7160e01b600052601160045260246000fd5b600060001982141561168157611681611657565b5060010190565b634e487b7160e01b600052603260045260246000fd5b6000602082840312156116b057600080fd5b5051919050565b60008160001904831182151516156116d1576116d1611657565b500290565b6000826116f357634e487b7160e01b600052601260045260246000fd5b500490565b60008282101561170a5761170a611657565b500390565b634e487b7160e01b600052603160045260246000fdfe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a164736f6c634300080b000a
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000cf0c122c6b73ff809c693db761e7baebe62b6a2e0000000000000000000000002b9d5c7f2ead1a221d771fb6bb5e35df04d60ab00000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004f000000000000000000000000c566449675c2c2886c45261f68da919de078f6bc000000000000000000000000de5ad475057482fec82136e5e698ecd8b57615e9000000000000000000000000f681069fc9792a95a77b5ecba443a77d5d49df1f000000000000000000000000a6e2839e73e623ef3853a6bd28d6f02a127a43070000000000000000000000006eaa9db4ac9def1297365e1b79b965058f641f69000000000000000000000000b28a293278a51a1c42aeb0b1e5de080fd99c998b00000000000000000000000041a14a3905a6827964a1ed9359e686ef768e2996000000000000000000000000f81d4e193661af0cc52091d4d90271d800ca326d000000000000000000000000e139962e5d7b07a9378f159a4a1b7cabe9df1d6e000000000000000000000000b20bf6d7f60059dd5de46f3f0f32665a259ea6c0000000000000000000000000ca1f85ca6e502287c489d373938eb55c9b832c0f000000000000000000000000376a369146e71337943fd52e5d9d30ee8cd9e482000000000000000000000000cb30818397d781e05a8e04102fccdcb431d709c20000000000000000000000003c6288d1c8d1cdb9a08216347b394a2d9727b9c4000000000000000000000000256568c0f9079f5ae96add3d49517e6f13b7ea6c000000000000000000000000189bd808ba7284a4e875886330587021ea1886630000000000000000000000001d9b521c3c504dd7c3fb6ce906cd22830e3819e2000000000000000000000000c697be0b5b82284391a878b226e2f9afc6b947100000000000000000000000006ecd5e7a81dcbb37c86744110402b01d8e1f60440000000000000000000000003b31c4ae1dbd80dba70f45f29d289216810c07c7000000000000000000000000904441ebc002dba9a927b35baf55dc98e6b5c8c6000000000000000000000000aaefa74e6d545f3487beec39a3f78c49dd3ffb5d000000000000000000000000000759119ceaba5dc3d41c8a003c743f99f998470000000000000000000000001f30f1a1cde7b88b211ec3711f71a36c282b2b6c000000000000000000000000c17519a680ba2bbef1018c16cbc0fc34da5969ba000000000000000000000000dd4b68c06f62a7cebe791917c85b83a9573272b8000000000000000000000000a28602f18eb877b0b929caaae94faed4ff40292900000000000000000000000049d65ff0f419be0746a9ecf58d85c0e9dc170958000000000000000000000000b184af95391b0ed1d92652d39c0291e9e7cc90600000000000000000000000000d952e9b83c91e5bccdeefa15329d21071da5678000000000000000000000000defd15b2d7030909fd210a525f8158fd9e5b8bbb0000000000000000000000003301d3494478feb56bb6038edc7e55aa9ace25c40000000000000000000000006392b539f3dabfdd6dacf81e5786b981888927b6000000000000000000000000be23cbb62064b8b1550ae5ada59c39d45b1e2081000000000000000000000000124d9bf2fecbc16b54ec4accdb14d44c2144f012000000000000000000000000b85a8e652e10f9d9caf564f5c96ca4270091bc820000000000000000000000008271267cec8c994418776862d7ef30fb05d20ff10000000000000000000000009f144812058a1d9bff7baaeb4bf2e4286efa46ad0000000000000000000000008fad3e862c203ec9fc36832e9d0d13fe057a6ff100000000000000000000000040bb488401f104714478ed262f4ed177c24cbb82000000000000000000000000bdc8542fe776f8712afc70b2bd147fdd0115ad54000000000000000000000000c933ee4a90dc542b820ca674160922fb440b2ec4000000000000000000000000be496d6e541344d7bdb91055cdb5fc260c73d5a80000000000000000000000007acab48d2ecedd6bfd8e187f0ea520da76a04662000000000000000000000000698725516b6759a1511482846a0d27bc872e3906000000000000000000000000c1563bdf57bdb990c89070aa72cda57fe8d6913d000000000000000000000000495897ab1e68591be38f7882346bebb13fcfc6f8000000000000000000000000cd38dcd8d69cc69bd057a38960f5ed7f0d003cf800000000000000000000000055d79fa93e01bb5d24315cd4f17aa15c3f588dc7000000000000000000000000690c7f5b32bb7e38be41b0b0160799a2f8e7b0730000000000000000000000002efc41a2f72f85da7a9aa773d8b9d3a21c015c380000000000000000000000001a9472443a990bed5d03c1370de48f54d6a538cd00000000000000000000000055e09387cf083f558ec8e41ad29079f1f34a7346000000000000000000000000e3e4f084db6434d3030a6e8392c6e819ae7578e2000000000000000000000000a594c6ec7447eb4dc1aa9e7fc5cd692f2edf87ae0000000000000000000000005fc771d35b0615d79c76c04c2cbe8496472411800000000000000000000000003feb264a1d50c55a2aa30bbbb49d25fcc6016b2c00000000000000000000000086ca33d8b15ac2a7764e38ac57e7066202191d1e000000000000000000000000fafa5c581ce8dc4188179b9787f58d4e82285005000000000000000000000000bca844c6cf9e65897805a0630fc7895d5d9c244f000000000000000000000000abafa5438f3b39f5248fabf9103b082649f8288e000000000000000000000000edc0d61e5fcdc8949294df3f5c13497643be2b3e00000000000000000000000088baf72dd5539b3da71bfce86c486a6cf89836f50000000000000000000000001cb09ae8a2f720b723c8c67a3268a3c053f03e690000000000000000000000004d7724803b068b289a223ba3506661f0d44ea9570000000000000000000000005778bc9f6b80a05bddb43cf7ed3356d83a84043d000000000000000000000000e63a714a5fd70320f17c54f5ac5287579fb12b6f000000000000000000000000984a88e2695f30ecfab9ba5dff9df9915b435f3b0000000000000000000000005fc132b0a7027773da9d825728d1a2dc59137165000000000000000000000000d713fa41f57b42433b77c0de9a226639b66b3a59000000000000000000000000b8f9e33fe0a4a21e6e0f70d88d6904fe8137a7fe000000000000000000000000593f37f7fae9292fd615bcbe363b87c631ad80d20000000000000000000000005590577c62498f2e60ff82ae447a55b72d01a6d40000000000000000000000005fa8b510d3116547d9eb299859fc0c927c000a03000000000000000000000000ee011ab70b1f269b711c88f9d18ab306149ebcbb0000000000000000000000005c634603c58468a189c999c5ee7df5696fb319e10000000000000000000000008c3170b00b17015fde3123b5e84dd2d28acc3c05000000000000000000000000a9627c74264f081fe18b98786b46df06d8191a870000000000000000000000002f0c47a2217582b0744cdc51e32596b81c1e1531
-----Decoded View---------------
Arg [0] : tokenAddress (address): 0xcf0C122c6b73ff809C693DB761e7BaeBe62b6a2E
Arg [1] : receiverAddress (address): 0x2b9d5c7f2EAD1A221d771Fb6bb5E35Df04D60AB0
Arg [2] : blacklistedAddresses (address[]): 0xc566449675c2c2886C45261F68dA919de078f6bC,0xdE5aD475057482fEc82136E5e698EcD8b57615e9,0xF681069FC9792A95a77B5EcbA443a77D5d49DF1F,0xa6e2839e73e623ef3853a6bd28d6F02A127a4307,0x6EaA9db4AC9DeF1297365e1b79b965058F641f69,0xb28A293278a51a1C42AEB0b1E5dE080fd99c998B,0x41A14a3905A6827964a1eD9359E686eF768e2996,0xF81d4e193661Af0Cc52091D4d90271D800ca326D,0xE139962e5d7B07A9378F159A4A1b7CABe9Df1d6E,0xB20bF6D7f60059dd5dE46F3F0F32665a259ea6C0,0xCA1F85cA6e502287c489d373938eB55C9B832c0F,0x376a369146e71337943fd52e5D9d30Ee8cd9e482,0xcb30818397d781E05a8e04102Fccdcb431D709C2,0x3C6288d1c8d1CDb9A08216347B394a2D9727b9c4,0x256568c0F9079F5AE96AdD3d49517E6f13b7EA6C,0x189BD808Ba7284A4e875886330587021Ea188663,0x1D9b521c3c504dD7C3fb6CE906cD22830e3819E2,0xC697BE0b5b82284391A878B226e2f9AfC6B94710,0x6ECd5e7A81dCBB37C86744110402B01d8E1F6044,0x3b31C4ae1dBd80dba70F45f29d289216810C07C7,0x904441eBC002dBA9A927B35BAf55dc98e6B5C8C6,0xAAEFa74E6d545F3487Beec39A3f78c49Dd3FFb5D,0x000759119CEaBA5Dc3d41C8a003c743f99F99847,0x1F30f1a1cDE7B88B211ec3711f71A36C282B2B6C,0xc17519a680bA2bbeF1018C16cBC0fC34dA5969Ba,0xdd4b68C06F62a7CeBe791917C85b83a9573272b8,0xa28602F18eB877B0b929caaae94fAeD4FF402929,0x49d65Ff0F419BE0746A9eCf58d85c0e9DC170958,0xB184aF95391B0ed1d92652D39C0291e9e7Cc9060,0x0D952e9B83C91e5bcCdEefA15329D21071da5678,0xdEfd15b2d7030909FD210a525F8158FD9e5B8bbb,0x3301D3494478Feb56Bb6038EdC7e55Aa9ACe25C4,0x6392B539f3dAbFDd6DaCf81e5786B981888927b6,0xBe23CbB62064b8B1550Ae5ADA59c39d45b1E2081,0x124D9BF2fecBc16b54eC4AcCdB14D44C2144f012,0xB85A8E652e10f9D9caF564f5C96CA4270091bc82,0x8271267ceC8C994418776862d7EF30Fb05d20FF1,0x9F144812058A1D9BFf7BaaEb4bF2e4286EFa46AD,0x8fad3e862C203eC9fc36832E9d0D13FE057a6fF1,0x40BB488401F104714478ed262f4ED177c24cBB82,0xBDC8542FE776F8712AfC70b2bD147fDD0115AD54,0xC933eE4a90DC542b820cA674160922fb440B2eC4,0xBe496d6e541344d7bDb91055cdb5FC260C73d5A8,0x7aCaB48D2eCEdd6bFD8e187f0ea520dA76A04662,0x698725516b6759A1511482846a0d27bC872E3906,0xc1563BdF57BdB990C89070aA72CDA57fe8d6913D,0x495897ab1E68591Be38f7882346bEBB13fCFc6F8,0xCD38DCd8D69Cc69Bd057a38960f5ed7F0d003Cf8,0x55d79Fa93E01bb5d24315cd4F17Aa15c3F588Dc7,0x690c7f5b32Bb7E38BE41B0B0160799A2f8E7B073,0x2EFC41a2f72F85da7A9AA773D8B9d3A21C015c38,0x1A9472443a990bEd5d03c1370DE48F54d6a538cd,0x55E09387cF083f558eC8e41AD29079F1f34A7346,0xe3E4F084dB6434d3030a6E8392C6e819ae7578E2,0xA594c6eC7447eB4Dc1aA9e7Fc5Cd692F2eDf87AE,0x5fc771d35b0615d79C76C04c2cbE849647241180,0x3feb264a1d50C55A2Aa30bBBB49D25fCC6016B2C,0x86cA33D8b15ac2A7764e38Ac57E7066202191d1E,0xfAFA5C581CE8DC4188179B9787F58d4e82285005,0xbca844C6cf9E65897805A0630fC7895D5D9c244f,0xAbAFa5438f3b39F5248FaBF9103b082649f8288E,0xEdc0D61e5FcDc8949294Df3F5c13497643bE2B3E,0x88baF72dd5539B3da71BFce86c486a6cF89836f5,0x1CB09aE8A2F720B723c8c67a3268a3c053f03E69,0x4D7724803B068B289a223Ba3506661f0d44EA957,0x5778Bc9F6b80A05BdDb43CF7ed3356D83a84043d,0xe63A714a5FD70320f17c54f5Ac5287579FB12B6F,0x984A88E2695f30ecFAB9bA5DFF9Df9915B435f3b,0x5FC132B0A7027773da9D825728d1A2DC59137165,0xd713fA41f57B42433B77c0dE9A226639b66b3a59,0xb8f9e33fE0a4a21E6e0F70d88d6904Fe8137A7FE,0x593F37F7Fae9292fD615BcBE363b87C631Ad80d2,0x5590577c62498F2e60FF82aE447a55b72d01a6D4,0x5FA8b510d3116547D9EB299859FC0c927C000A03,0xee011ab70b1F269B711C88f9d18Ab306149eBCBb,0x5C634603C58468A189C999C5eE7dF5696FB319E1,0x8C3170B00b17015Fde3123b5e84dd2d28acC3C05,0xA9627c74264f081fe18b98786b46Df06d8191a87,0x2f0C47A2217582b0744CDC51e32596b81C1E1531
-----Encoded View---------------
83 Constructor Arguments found :
Arg [0] : 000000000000000000000000cf0c122c6b73ff809c693db761e7baebe62b6a2e
Arg [1] : 0000000000000000000000002b9d5c7f2ead1a221d771fb6bb5e35df04d60ab0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 000000000000000000000000000000000000000000000000000000000000004f
Arg [4] : 000000000000000000000000c566449675c2c2886c45261f68da919de078f6bc
Arg [5] : 000000000000000000000000de5ad475057482fec82136e5e698ecd8b57615e9
Arg [6] : 000000000000000000000000f681069fc9792a95a77b5ecba443a77d5d49df1f
Arg [7] : 000000000000000000000000a6e2839e73e623ef3853a6bd28d6f02a127a4307
Arg [8] : 0000000000000000000000006eaa9db4ac9def1297365e1b79b965058f641f69
Arg [9] : 000000000000000000000000b28a293278a51a1c42aeb0b1e5de080fd99c998b
Arg [10] : 00000000000000000000000041a14a3905a6827964a1ed9359e686ef768e2996
Arg [11] : 000000000000000000000000f81d4e193661af0cc52091d4d90271d800ca326d
Arg [12] : 000000000000000000000000e139962e5d7b07a9378f159a4a1b7cabe9df1d6e
Arg [13] : 000000000000000000000000b20bf6d7f60059dd5de46f3f0f32665a259ea6c0
Arg [14] : 000000000000000000000000ca1f85ca6e502287c489d373938eb55c9b832c0f
Arg [15] : 000000000000000000000000376a369146e71337943fd52e5d9d30ee8cd9e482
Arg [16] : 000000000000000000000000cb30818397d781e05a8e04102fccdcb431d709c2
Arg [17] : 0000000000000000000000003c6288d1c8d1cdb9a08216347b394a2d9727b9c4
Arg [18] : 000000000000000000000000256568c0f9079f5ae96add3d49517e6f13b7ea6c
Arg [19] : 000000000000000000000000189bd808ba7284a4e875886330587021ea188663
Arg [20] : 0000000000000000000000001d9b521c3c504dd7c3fb6ce906cd22830e3819e2
Arg [21] : 000000000000000000000000c697be0b5b82284391a878b226e2f9afc6b94710
Arg [22] : 0000000000000000000000006ecd5e7a81dcbb37c86744110402b01d8e1f6044
Arg [23] : 0000000000000000000000003b31c4ae1dbd80dba70f45f29d289216810c07c7
Arg [24] : 000000000000000000000000904441ebc002dba9a927b35baf55dc98e6b5c8c6
Arg [25] : 000000000000000000000000aaefa74e6d545f3487beec39a3f78c49dd3ffb5d
Arg [26] : 000000000000000000000000000759119ceaba5dc3d41c8a003c743f99f99847
Arg [27] : 0000000000000000000000001f30f1a1cde7b88b211ec3711f71a36c282b2b6c
Arg [28] : 000000000000000000000000c17519a680ba2bbef1018c16cbc0fc34da5969ba
Arg [29] : 000000000000000000000000dd4b68c06f62a7cebe791917c85b83a9573272b8
Arg [30] : 000000000000000000000000a28602f18eb877b0b929caaae94faed4ff402929
Arg [31] : 00000000000000000000000049d65ff0f419be0746a9ecf58d85c0e9dc170958
Arg [32] : 000000000000000000000000b184af95391b0ed1d92652d39c0291e9e7cc9060
Arg [33] : 0000000000000000000000000d952e9b83c91e5bccdeefa15329d21071da5678
Arg [34] : 000000000000000000000000defd15b2d7030909fd210a525f8158fd9e5b8bbb
Arg [35] : 0000000000000000000000003301d3494478feb56bb6038edc7e55aa9ace25c4
Arg [36] : 0000000000000000000000006392b539f3dabfdd6dacf81e5786b981888927b6
Arg [37] : 000000000000000000000000be23cbb62064b8b1550ae5ada59c39d45b1e2081
Arg [38] : 000000000000000000000000124d9bf2fecbc16b54ec4accdb14d44c2144f012
Arg [39] : 000000000000000000000000b85a8e652e10f9d9caf564f5c96ca4270091bc82
Arg [40] : 0000000000000000000000008271267cec8c994418776862d7ef30fb05d20ff1
Arg [41] : 0000000000000000000000009f144812058a1d9bff7baaeb4bf2e4286efa46ad
Arg [42] : 0000000000000000000000008fad3e862c203ec9fc36832e9d0d13fe057a6ff1
Arg [43] : 00000000000000000000000040bb488401f104714478ed262f4ed177c24cbb82
Arg [44] : 000000000000000000000000bdc8542fe776f8712afc70b2bd147fdd0115ad54
Arg [45] : 000000000000000000000000c933ee4a90dc542b820ca674160922fb440b2ec4
Arg [46] : 000000000000000000000000be496d6e541344d7bdb91055cdb5fc260c73d5a8
Arg [47] : 0000000000000000000000007acab48d2ecedd6bfd8e187f0ea520da76a04662
Arg [48] : 000000000000000000000000698725516b6759a1511482846a0d27bc872e3906
Arg [49] : 000000000000000000000000c1563bdf57bdb990c89070aa72cda57fe8d6913d
Arg [50] : 000000000000000000000000495897ab1e68591be38f7882346bebb13fcfc6f8
Arg [51] : 000000000000000000000000cd38dcd8d69cc69bd057a38960f5ed7f0d003cf8
Arg [52] : 00000000000000000000000055d79fa93e01bb5d24315cd4f17aa15c3f588dc7
Arg [53] : 000000000000000000000000690c7f5b32bb7e38be41b0b0160799a2f8e7b073
Arg [54] : 0000000000000000000000002efc41a2f72f85da7a9aa773d8b9d3a21c015c38
Arg [55] : 0000000000000000000000001a9472443a990bed5d03c1370de48f54d6a538cd
Arg [56] : 00000000000000000000000055e09387cf083f558ec8e41ad29079f1f34a7346
Arg [57] : 000000000000000000000000e3e4f084db6434d3030a6e8392c6e819ae7578e2
Arg [58] : 000000000000000000000000a594c6ec7447eb4dc1aa9e7fc5cd692f2edf87ae
Arg [59] : 0000000000000000000000005fc771d35b0615d79c76c04c2cbe849647241180
Arg [60] : 0000000000000000000000003feb264a1d50c55a2aa30bbbb49d25fcc6016b2c
Arg [61] : 00000000000000000000000086ca33d8b15ac2a7764e38ac57e7066202191d1e
Arg [62] : 000000000000000000000000fafa5c581ce8dc4188179b9787f58d4e82285005
Arg [63] : 000000000000000000000000bca844c6cf9e65897805a0630fc7895d5d9c244f
Arg [64] : 000000000000000000000000abafa5438f3b39f5248fabf9103b082649f8288e
Arg [65] : 000000000000000000000000edc0d61e5fcdc8949294df3f5c13497643be2b3e
Arg [66] : 00000000000000000000000088baf72dd5539b3da71bfce86c486a6cf89836f5
Arg [67] : 0000000000000000000000001cb09ae8a2f720b723c8c67a3268a3c053f03e69
Arg [68] : 0000000000000000000000004d7724803b068b289a223ba3506661f0d44ea957
Arg [69] : 0000000000000000000000005778bc9f6b80a05bddb43cf7ed3356d83a84043d
Arg [70] : 000000000000000000000000e63a714a5fd70320f17c54f5ac5287579fb12b6f
Arg [71] : 000000000000000000000000984a88e2695f30ecfab9ba5dff9df9915b435f3b
Arg [72] : 0000000000000000000000005fc132b0a7027773da9d825728d1a2dc59137165
Arg [73] : 000000000000000000000000d713fa41f57b42433b77c0de9a226639b66b3a59
Arg [74] : 000000000000000000000000b8f9e33fe0a4a21e6e0f70d88d6904fe8137a7fe
Arg [75] : 000000000000000000000000593f37f7fae9292fd615bcbe363b87c631ad80d2
Arg [76] : 0000000000000000000000005590577c62498f2e60ff82ae447a55b72d01a6d4
Arg [77] : 0000000000000000000000005fa8b510d3116547d9eb299859fc0c927c000a03
Arg [78] : 000000000000000000000000ee011ab70b1f269b711c88f9d18ab306149ebcbb
Arg [79] : 0000000000000000000000005c634603c58468a189c999c5ee7df5696fb319e1
Arg [80] : 0000000000000000000000008c3170b00b17015fde3123b5e84dd2d28acc3c05
Arg [81] : 000000000000000000000000a9627c74264f081fe18b98786b46df06d8191a87
Arg [82] : 0000000000000000000000002f0c47a2217582b0744cdc51e32596b81c1e1531
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.