ETH Price: $2,710.16 (-3.45%)

Contract

0xA005a49Ade82c130ccB00aC03E6464D1Cec46d96
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Renew Transistor167807422023-03-08 3:01:59702 days ago1678244519IN
Amplifi: Transistor
0.004 ETH0.0012786425.43506742
Renew Transistor167648472023-03-05 21:24:35704 days ago1678051475IN
Amplifi: Transistor
0.004 ETH0.0018099236.01046853
Renew Transistor167549612023-03-04 12:05:11705 days ago1677931511IN
Amplifi: Transistor
0.004 ETH0.001246525.00420031
Renew Transistor167549572023-03-04 12:04:11705 days ago1677931451IN
Amplifi: Transistor
0.004 ETH0.0012980526.03807837
Renew Transistor167500012023-03-03 19:17:47706 days ago1677871067IN
Amplifi: Transistor
0.004 ETH0.0015772433.36173426
Claim AMPLIFI167500002023-03-03 19:17:35706 days ago1677871055IN
Amplifi: Transistor
0 ETH0.0009938631.94071457
Renew Transistor167445582023-03-03 0:55:35707 days ago1677804935IN
Amplifi: Transistor
0.004 ETH0.0012663825.19125162
Renew Transistor167196532023-02-27 12:53:35710 days ago1677502415IN
Amplifi: Transistor
0.004 ETH0.0008226316.36725282
Renew Transistor167104482023-02-26 5:52:11711 days ago1677390731IN
Amplifi: Transistor
0.004 ETH0.0008638817.18464088
Renew Transistor167011982023-02-24 22:38:59713 days ago1677278339IN
Amplifi: Transistor
0.004 ETH0.0014260928.3737106
Renew Transistor167011962023-02-24 22:38:35713 days ago1677278315IN
Amplifi: Transistor
0.004 ETH0.0014033927.92223146
Renew Transistor167011942023-02-24 22:37:59713 days ago1677278279IN
Amplifi: Transistor
0.004 ETH0.0013340826.54308175
Renew Transistor166956722023-02-24 3:54:23713 days ago1677210863IN
Amplifi: Transistor
0.004 ETH0.0013639627.13766694
Renew Transistor166956472023-02-24 3:49:23713 days ago1677210563IN
Amplifi: Transistor
0.004 ETH0.0015616931.07180076
Renew Transistor166956452023-02-24 3:48:59713 days ago1677210539IN
Amplifi: Transistor
0.004 ETH0.0015575130.98851089
Renew Transistor166956432023-02-24 3:48:35713 days ago1677210515IN
Amplifi: Transistor
0.004 ETH0.001432628.50321896
Renew Transistor166956412023-02-24 3:48:11713 days ago1677210491IN
Amplifi: Transistor
0.004 ETH0.0016683833.19434926
Renew Transistor166956402023-02-24 3:47:59713 days ago1677210479IN
Amplifi: Transistor
0.004 ETH0.0014859329.56433881
Renew Transistor166956392023-02-24 3:47:35713 days ago1677210455IN
Amplifi: Transistor
0.004 ETH0.001575231.34047655
Renew Transistor166956372023-02-24 3:47:11713 days ago1677210431IN
Amplifi: Transistor
0.004 ETH0.0016343632.5175653
Renew Transistor166956332023-02-24 3:46:23713 days ago1677210383IN
Amplifi: Transistor
0.004 ETH0.001639432.61779153
Renew Transistor166956312023-02-24 3:45:59713 days ago1677210359IN
Amplifi: Transistor
0.004 ETH0.0015144530.12578425
Renew Transistor166837822023-02-22 11:47:35715 days ago1677066455IN
Amplifi: Transistor
0.004 ETH0.0011545922.97199577
Renew Transistor166651492023-02-19 20:56:35718 days ago1676840195IN
Amplifi: Transistor
0.004 ETH0.0009878919.65130218
Renew Transistor166579152023-02-18 20:33:59719 days ago1676752439IN
Amplifi: Transistor
0.004 ETH0.0009944319.78547576
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
167807422023-03-08 3:01:59702 days ago1678244519
Amplifi: Transistor
0.004 ETH
167648472023-03-05 21:24:35704 days ago1678051475
Amplifi: Transistor
0.004 ETH
167549612023-03-04 12:05:11705 days ago1677931511
Amplifi: Transistor
0.004 ETH
167549572023-03-04 12:04:11705 days ago1677931451
Amplifi: Transistor
0.004 ETH
167500012023-03-03 19:17:47706 days ago1677871067
Amplifi: Transistor
0.004 ETH
167445582023-03-03 0:55:35707 days ago1677804935
Amplifi: Transistor
0.004 ETH
167196532023-02-27 12:53:35710 days ago1677502415
Amplifi: Transistor
0.004 ETH
167104482023-02-26 5:52:11711 days ago1677390731
Amplifi: Transistor
0.004 ETH
167011982023-02-24 22:38:59713 days ago1677278339
Amplifi: Transistor
0.004 ETH
167011962023-02-24 22:38:35713 days ago1677278315
Amplifi: Transistor
0.004 ETH
167011942023-02-24 22:37:59713 days ago1677278279
Amplifi: Transistor
0.004 ETH
166956722023-02-24 3:54:23713 days ago1677210863
Amplifi: Transistor
0.004 ETH
166956472023-02-24 3:49:23713 days ago1677210563
Amplifi: Transistor
0.004 ETH
166956452023-02-24 3:48:59713 days ago1677210539
Amplifi: Transistor
0.004 ETH
166956432023-02-24 3:48:35713 days ago1677210515
Amplifi: Transistor
0.004 ETH
166956412023-02-24 3:48:11713 days ago1677210491
Amplifi: Transistor
0.004 ETH
166956402023-02-24 3:47:59713 days ago1677210479
Amplifi: Transistor
0.004 ETH
166956392023-02-24 3:47:35713 days ago1677210455
Amplifi: Transistor
0.004 ETH
166956372023-02-24 3:47:11713 days ago1677210431
Amplifi: Transistor
0.004 ETH
166956332023-02-24 3:46:23713 days ago1677210383
Amplifi: Transistor
0.004 ETH
166956312023-02-24 3:45:59713 days ago1677210359
Amplifi: Transistor
0.004 ETH
166837822023-02-22 11:47:35715 days ago1677066455
Amplifi: Transistor
0.004 ETH
166651492023-02-19 20:56:35718 days ago1676840195
Amplifi: Transistor
0.004 ETH
166579152023-02-18 20:33:59719 days ago1676752439
Amplifi: Transistor
0.004 ETH
166371672023-02-15 22:38:11722 days ago1676500691
Amplifi: Transistor
0.004 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AmplifiTransistor

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 8 : AmplifiTransistor.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "openzeppelin-contracts/access/Ownable.sol";
import "openzeppelin-contracts/security/ReentrancyGuard.sol";
import "openzeppelin-contracts/token/ERC20/IERC20.sol";
import "./interfaces/IAmplifi.sol";
import "./interfaces/IUniswap.sol";
import "./Types.sol";

/**
 * Amplifi
 * Website: https://perpetualyield.io/
 * Telegram: https://t.me/Amplifi_ERC
 * Twitter: https://twitter.com/amplifidefi
 */
contract AmplifiTransistor is Ownable, ReentrancyGuard {
    uint16 public maxMonths = 1;
    uint16 public maxTransistorsPerMinter = 48;
    uint256 public gracePeriod = 30 days;

    uint256 public totalTransistors = 0;
    mapping(uint256 => Types.Transistor) public transistors;
    mapping(address => uint256) public balanceOf;
    mapping(address => mapping(uint256 => uint256)) public ownedTransistors;
    mapping(uint256 => uint256) public ownedTransistorsIndex;

    uint256 public creationFee = 0.004 ether;
    uint256 public renewalFee = 0.004 ether;
    uint256 public refundFee = 0.12 ether;
    uint256 public mintPrice = 6e18;
    uint256 public refundAmount = 6e18;
    address public burnAddress;

    uint256[20] public rates = [
        169056603773,
        151305660376,
        135418566037,
        121199616603,
        108473656860,
        97083922889,
        86890110986,
        77766649332,
        69601151153,
        62293030282,
        55752262102,
        49898274581,
        44658955750,
        39969765396,
        35772940030,
        32016781327,
        28655019287,
        25646242262,
        20543281208,
        17236591470
    ];

    IAmplifi public immutable amplifi;
    IUniswapV2Router02 public immutable router;
    IERC20 public immutable USDC;

    Types.TransistorFeeRecipients public feeRecipients;

    uint16 public claimFee = 600;
    uint16 public mintBurn = 9_000;
    uint16 public mintLP = 1_000;
    // Basis for above fee values
    uint16 public constant bps = 10_000;

    constructor(
        IAmplifi _amplifi,
        IUniswapV2Router02 _router,
        IERC20 _usdc,
        address _burnAddress,
        address _standardFeeRecipient,
        address _taxRecipient,
        address _operations,
        address _developers
    ) {
        amplifi = _amplifi;
        router = _router;
        USDC = _usdc;
        burnAddress = _burnAddress;

        feeRecipients = Types.TransistorFeeRecipients(
            _standardFeeRecipient,
            _taxRecipient,
            _standardFeeRecipient,
            _standardFeeRecipient,
            _operations,
            _developers
        );

        amplifi.approve(address(_router), type(uint256).max);
    }

    function createTransistor(uint256 _months, uint256 _amountOutMin) external payable nonReentrant returns (uint256) {
        require(msg.value == getRenewalFeeForMonths(_months) + creationFee, "Invalid Ether value provided");
        chargeFee(feeRecipients.creationFee, msg.value);

        return _createTransistor(_months, _amountOutMin);
    }

    function createTransistorBatch(
        uint256 _amount,
        uint256 _months,
        uint256 _amountOutMin
    ) external payable nonReentrant returns (uint256[] memory ids) {
        require(msg.value == (getRenewalFeeForMonths(_months) + creationFee) * _amount, "Invalid Ether value provided");
        chargeFee(feeRecipients.creationFee, msg.value);

        ids = new uint256[](_amount);
        for (uint256 i = 0; i < _amount; ) {
            ids[i] = _createTransistor(_months, _amountOutMin);
            unchecked {
                ++i;
            }
        }
        return ids;
    }

    function _createTransistor(uint256 _months, uint256 _amountOutMin) internal returns (uint256) {
        require(balanceOf[msg.sender] < maxTransistorsPerMinter, "Too many transistors");
        require(_months > 0 && _months <= maxMonths, "Must be greater than 0 and less than maxMonths");

        require(amplifi.transferFrom(msg.sender, address(this), mintPrice), "Unable to transfer Amplifi");

        // we can't burn from the contract so we have to send to a special address from which the deployer will then burn
        amplifi.transfer(burnAddress, (mintPrice * mintBurn) / bps);

        sell((mintPrice * (mintLP / 2)) / bps, _amountOutMin);
        uint256 usdcBalance = USDC.balanceOf(address(this));
        USDC.transfer(feeRecipients.creationTax, usdcBalance);

        amplifi.transfer(feeRecipients.creationTax, (mintPrice * (mintLP / 2)) / bps);

        uint256 id;
        uint256 length;
        unchecked {
            id = totalTransistors++;
            length = balanceOf[msg.sender]++;
        }

        transistors[id] = Types.Transistor(msg.sender, block.timestamp, block.timestamp + 30 days * _months, 0, 0);
        ownedTransistors[msg.sender][length] = id;
        ownedTransistorsIndex[id] = length;

        return id;
    }

    function renewTransistor(uint256 _id, uint256 _months) external payable nonReentrant {
        require(msg.value == getRenewalFeeForMonths(_months), "Invalid Ether value provided");
        chargeFee(feeRecipients.renewalFee, msg.value);

        _renewTransistor(_id, _months);
    }

    function renewTransistorBatch(uint256[] calldata _ids, uint256 _months) external payable nonReentrant {
        uint256 length = _ids.length;
        require(msg.value == (getRenewalFeeForMonths(_months)) * length, "Invalid Ether value provided");
        chargeFee(feeRecipients.renewalFee, msg.value);

        for (uint256 i = 0; i < length; ) {
            _renewTransistor(_ids[i], _months);
            unchecked {
                ++i;
            }
        }
    }

    function _renewTransistor(uint256 _id, uint256 _months) internal {
        Types.Transistor storage transistor = transistors[_id];

        require(transistor.minter == msg.sender, "Invalid ownership");
        require(transistor.expires + gracePeriod >= block.timestamp, "Grace period expired or transistor reversed");

        uint256 monthsLeft = 0;
        if (block.timestamp > transistor.expires) {
            monthsLeft = (block.timestamp - transistor.expires) / 30 days;
        } else {
            monthsLeft = (transistor.expires - block.timestamp) / 30 days;
        }

        require(_months + monthsLeft <= maxMonths, "Too many months");

        transistor.expires += 30 days * _months;
    }

    function reverseTransistor(uint256 _id) external payable nonReentrant {
        Types.Transistor storage transistor = transistors[_id];

        require(transistor.minter == msg.sender, "Invalid ownership");
        require(transistor.expires > block.timestamp, "Transistor expired");
        require(transistor.numClaims == 0, "Already claimed");
        require(msg.value == refundFee, "Invalid Ether value provided");

        chargeFee(feeRecipients.reverseFee, msg.value);

        transistor.expires = 0;
        amplifi.transfer(msg.sender, refundAmount);
    }

    function claimAMPLIFI(uint256 _id, uint256 _amountOutMin) external nonReentrant {
        _claimAMPLIFI(_id, _amountOutMin);
    }

    function claimAMPLIFIBatch(uint256[] calldata _ids, uint256 _amountOutMin) external nonReentrant {
        uint256 length = _ids.length;
        for (uint256 i = 0; i < length; ) {
            _claimAMPLIFI(_ids[i], _amountOutMin);
            unchecked {
                ++i;
            }
        }
    }

    function _claimAMPLIFI(uint256 _id, uint256 _amountOutMin) internal {
        Types.Transistor storage transistor = transistors[_id];
        require(transistor.minter == msg.sender, "Invalid ownership");
        require(transistor.expires > block.timestamp, "Transistor expired or reversed");

        uint256 amount = getPendingAMPLIFI(_id);
        amount = takeClaimFee(amount, _amountOutMin);
        amplifi.transfer(msg.sender, amount);

        transistor.numClaims++;
        transistor.lastClaimed = block.timestamp;
    }

    function getPendingAMPLIFI(uint256 _id) public view returns (uint256) {
        Types.Transistor memory transistor = transistors[_id];

        uint256 rate = transistor.numClaims >= rates.length ? rates[rates.length - 1] : rates[transistor.numClaims];
        uint256 amount = (block.timestamp - (transistor.numClaims > 0 ? transistor.lastClaimed : transistor.created)) *
            (rate);

        return amount;
    }

    function takeClaimFee(uint256 _amount, uint256 _amountOutMin) internal returns (uint256) {
        uint256 fee = (_amount * claimFee) / bps;

        sell(fee, _amountOutMin);

        uint256 usdcBalance = USDC.balanceOf(address(this));

        USDC.transfer(feeRecipients.claimFeeDevelopers, (usdcBalance * 34) / 100);
        USDC.transfer(feeRecipients.claimFeeOperations, (usdcBalance * 66) / 100);

        return _amount - fee;
    }

    function sell(uint256 _amount, uint256 _amountOutMin) internal {
        address[] memory path = new address[](2);
        path[0] = address(amplifi);
        path[1] = address(USDC);
        router.swapExactTokensForTokensSupportingFeeOnTransferTokens(
            _amount,
            _amountOutMin,
            path,
            address(this),
            block.timestamp
        );
    }

    function getRenewalFeeForMonths(uint256 _months) public view returns (uint256) {
        return renewalFee * _months;
    }

    function airdropTransistors(address[] calldata _users, uint256[] calldata _months)
        external
        onlyOwner
        returns (uint256[] memory ids)
    {
        require(_users.length == _months.length, "Lengths not aligned");

        uint256 length = _users.length;
        ids = new uint256[](length);
        for (uint256 i = 0; i < length; ) {
            ids[i] = _airdropTransistor(_users[i], _months[i]);
            unchecked {
                ++i;
            }
        }

        return ids;
    }

    function _airdropTransistor(address _user, uint256 _months) internal returns (uint256) {
        require(_months <= maxMonths, "Too many months");

        uint256 id;
        uint256 length;
        unchecked {
            id = totalTransistors++;
            length = balanceOf[_user]++;
        }

        transistors[id] = Types.Transistor(_user, block.timestamp, block.timestamp + 30 days * _months, 0, 0);
        ownedTransistors[_user][length] = id;
        ownedTransistorsIndex[id] = length;

        return id;
    }

    function removeTransistor(uint256 _id) external onlyOwner {
        uint256 lastTransistorIndex = balanceOf[transistors[_id].minter];
        uint256 transistorIndex = ownedTransistorsIndex[_id];

        if (transistorIndex != lastTransistorIndex) {
            uint256 lastTransistorId = ownedTransistors[transistors[_id].minter][lastTransistorIndex];

            ownedTransistors[transistors[_id].minter][transistorIndex] = lastTransistorId; // Move the last Transistor to the slot of the to-delete token
            ownedTransistorsIndex[lastTransistorId] = transistorIndex; // Update the moved Transistor's index
        }

        // This also deletes the contents at the last position of the array
        delete ownedTransistorsIndex[_id];
        delete ownedTransistors[transistors[_id].minter][lastTransistorIndex];

        balanceOf[transistors[_id].minter]--;
        totalTransistors--;

        delete transistors[_id];
    }

    function chargeFee(address _recipient, uint256 _amount) internal {
        (bool success, ) = _recipient.call{value: _amount}("");
        require(success, "Could not send ETH");
    }

    function setRates(uint256[] calldata _rates) external onlyOwner {
        require(_rates.length == rates.length, "Invalid length");

        uint256 length = _rates.length;
        for (uint256 i = 0; i < length; ) {
            rates[i] = _rates[i];
            unchecked {
                ++i;
            }
        }
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMaxMonths(uint16 _maxMonths) external onlyOwner {
        maxMonths = _maxMonths;
    }

    function setFees(
        uint256 _creationFee,
        uint256 _renewalFee,
        uint256 _refundFee,
        uint16 _claimFee,
        uint16 _mintBurn,
        uint16 _mintLP
    ) external onlyOwner {
        creationFee = _creationFee;
        renewalFee = _renewalFee;
        refundFee = _refundFee;
        claimFee = _claimFee;
        mintBurn = _mintBurn;
        mintLP = _mintLP;
    }

    function setRefundAmounts(uint256 _refundAmount) external onlyOwner {
        refundAmount = _refundAmount;
    }

    function setBurnAddress(address _burnAddress) external onlyOwner {
        burnAddress = _burnAddress;
    }

    function setFeeRecipients(Types.TransistorFeeRecipients calldata _feeRecipients) external onlyOwner {
        feeRecipients = _feeRecipients;
    }

    function setPeriods(uint256 _gracePeriod) external onlyOwner {
        gracePeriod = _gracePeriod;
    }

    function withdrawETH(address _recipient) external onlyOwner {
        (bool success, ) = _recipient.call{value: address(this).balance}("");
        require(success, "Could not send ETH");
    }

    function withdrawToken(IERC20 _token, address _recipient) external onlyOwner {
        _token.transfer(_recipient, _token.balanceOf(address(this)));
    }

    receive() external payable {}
}

File 2 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 3 of 8 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

File 4 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 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 `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, 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 `from` to `to` 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 from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 5 of 8 : IAmplifi.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "openzeppelin-contracts/token/ERC20/IERC20.sol";

interface IAmplifi is IERC20 {
    function burnForAmplifier(address _burnee, uint256 _amount) external returns (bool);
}

File 6 of 8 : IUniswap.sol
// SPDX-License-Identifier: GPL-3.0
pragma solidity ^0.8.13;

interface IUniswapV2Pair {
    event Approval(address indexed owner, address indexed spender, uint256 value);
    event Transfer(address indexed from, address indexed to, uint256 value);

    function name() external pure returns (string memory);

    function symbol() external pure returns (string memory);

    function decimals() external pure returns (uint8);

    function totalSupply() external view returns (uint256);

    function balanceOf(address owner) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    function approve(address spender, uint256 value) external returns (bool);

    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function DOMAIN_SEPARATOR() external view returns (bytes32);

    function PERMIT_TYPEHASH() external pure returns (bytes32);

    function nonces(address owner) external view returns (uint256);

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    event Mint(address indexed sender, uint256 amount0, uint256 amount1);
    event Burn(address indexed sender, uint256 amount0, uint256 amount1, address indexed to);
    event Swap(
        address indexed sender,
        uint256 amount0In,
        uint256 amount1In,
        uint256 amount0Out,
        uint256 amount1Out,
        address indexed to
    );
    event Sync(uint112 reserve0, uint112 reserve1);

    function MINIMUM_LIQUIDITY() external pure returns (uint256);

    function factory() external view returns (address);

    function token0() external view returns (address);

    function token1() external view returns (address);

    function getReserves()
        external
        view
        returns (
            uint112 reserve0,
            uint112 reserve1,
            uint32 blockTimestampLast
        );

    function price0CumulativeLast() external view returns (uint256);

    function price1CumulativeLast() external view returns (uint256);

    function kLast() external view returns (uint256);

    function mint(address to) external returns (uint256 liquidity);

    function burn(address to) external returns (uint256 amount0, uint256 amount1);

    function swap(
        uint256 amount0Out,
        uint256 amount1Out,
        address to,
        bytes calldata data
    ) external;

    function skim(address to) external;

    function sync() external;

    function initialize(address, address) external;
}

interface IUniswapV2Factory {
    event PairCreated(address indexed token0, address indexed token1, address pair, uint256);

    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(uint256) external view returns (address pair);

    function allPairsLength() external view returns (uint256);

    function createPair(address tokenA, address tokenB) external returns (address pair);

    function setFeeTo(address) external;

    function setFeeToSetter(address) external;
}

interface IUniswapV2Router01 {
    function factory() external pure returns (address);

    function WETH() external pure returns (address);

    function addLiquidity(
        address tokenA,
        address tokenB,
        uint256 amountADesired,
        uint256 amountBDesired,
        uint256 amountAMin,
        uint256 amountBMin,
        address to,
        uint256 deadline
    )
        external
        returns (
            uint256 amountA,
            uint256 amountB,
            uint256 liquidity
        );

    function addLiquidityETH(
        address token,
        uint256 amountTokenDesired,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    )
        external
        payable
        returns (
            uint256 amountToken,
            uint256 amountETH,
            uint256 liquidity
        );

    function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts);

    function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts);
}

interface IUniswapV2Router02 is IUniswapV2Router01 {
    function removeLiquidityETHSupportingFeeOnTransferTokens(
        address token,
        uint256 liquidity,
        uint256 amountTokenMin,
        uint256 amountETHMin,
        address to,
        uint256 deadline
    ) external returns (uint256 amountETH);

    function swapExactTokensForETHSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactTokensForTokensSupportingFeeOnTransferTokens(
        uint256 amountIn,
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external;

    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;
}

File 7 of 8 : Types.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

library Types {
    struct FeeRecipients {
        address operations;
        address validatorAcquisition;
        address PCR;
        address yield;
        address xChainValidatorAcquisition;
        address indexFundPools;
        address gAMPRewardsPool;
        address OTCSwap;
        address rescueFund;
        address protocolImprovement;
        address developers;
    }

    struct Fees {
        uint16 operations;
        uint16 validatorAcquisition;
        uint16 PCR;
        uint16 yield;
        uint16 xChainValidatorAcquisition;
        uint16 indexFundPools;
        uint16 gAMPRewardsPool;
        uint16 OTCSwap;
        uint16 rescueFund;
        uint16 protocolImprovement;
        uint16 developers;
    }

    struct Share {
        uint256 amount;
        uint256 totalExcluded;
        uint256 totalRealised;
        uint256 started;
        uint256 unlocks;
    }

    enum FuseProduct {
        None,
        OneYear,
        ThreeYears,
        FiveYears
    }

    struct Amplifier {
        FuseProduct fuseProduct;
        address minter;
        uint256 created;
        uint256 expires;
        uint256 numClaims;
        uint256 lastClaimed;
        uint256 fused;
        uint256 unlocks;
        uint256 lastFuseClaimed;
    }

    struct AmplifierFeeRecipients {
        address operations;
        address validatorAcquisition;
        address developers;
    }

    struct Transistor {
        address minter;
        uint256 created;
        uint256 expires;
        uint256 numClaims;
        uint256 lastClaimed;
    }

    struct TransistorFeeRecipients {
        address creationFee;
        address creationTax;
        address renewalFee;
        address reverseFee;
        address claimFeeOperations;
        address claimFeeDevelopers;
    }
}

File 8 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "solenv/=lib/solenv/src/",
    "solmate/=lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IAmplifi","name":"_amplifi","type":"address"},{"internalType":"contract IUniswapV2Router02","name":"_router","type":"address"},{"internalType":"contract IERC20","name":"_usdc","type":"address"},{"internalType":"address","name":"_burnAddress","type":"address"},{"internalType":"address","name":"_standardFeeRecipient","type":"address"},{"internalType":"address","name":"_taxRecipient","type":"address"},{"internalType":"address","name":"_operations","type":"address"},{"internalType":"address","name":"_developers","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"},{"internalType":"uint256[]","name":"_months","type":"uint256[]"}],"name":"airdropTransistors","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"amplifi","outputs":[{"internalType":"contract IAmplifi","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bps","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"claimAMPLIFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"claimAMPLIFIBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFee","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_months","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"createTransistor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_months","type":"uint256"},{"internalType":"uint256","name":"_amountOutMin","type":"uint256"}],"name":"createTransistorBatch","outputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"creationFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeRecipients","outputs":[{"internalType":"address","name":"creationFee","type":"address"},{"internalType":"address","name":"creationTax","type":"address"},{"internalType":"address","name":"renewalFee","type":"address"},{"internalType":"address","name":"reverseFee","type":"address"},{"internalType":"address","name":"claimFeeOperations","type":"address"},{"internalType":"address","name":"claimFeeDevelopers","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getPendingAMPLIFI","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_months","type":"uint256"}],"name":"getRenewalFeeForMonths","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMonths","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxTransistorsPerMinter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintBurn","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLP","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedTransistors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedTransistorsIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"removeTransistor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_months","type":"uint256"}],"name":"renewTransistor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256","name":"_months","type":"uint256"}],"name":"renewTransistorBatch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renewalFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"reverseTransistor","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"router","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_burnAddress","type":"address"}],"name":"setBurnAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"creationFee","type":"address"},{"internalType":"address","name":"creationTax","type":"address"},{"internalType":"address","name":"renewalFee","type":"address"},{"internalType":"address","name":"reverseFee","type":"address"},{"internalType":"address","name":"claimFeeOperations","type":"address"},{"internalType":"address","name":"claimFeeDevelopers","type":"address"}],"internalType":"struct Types.TransistorFeeRecipients","name":"_feeRecipients","type":"tuple"}],"name":"setFeeRecipients","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_creationFee","type":"uint256"},{"internalType":"uint256","name":"_renewalFee","type":"uint256"},{"internalType":"uint256","name":"_refundFee","type":"uint256"},{"internalType":"uint16","name":"_claimFee","type":"uint16"},{"internalType":"uint16","name":"_mintBurn","type":"uint16"},{"internalType":"uint16","name":"_mintLP","type":"uint16"}],"name":"setFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxMonths","type":"uint16"}],"name":"setMaxMonths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_gracePeriod","type":"uint256"}],"name":"setPeriods","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_rates","type":"uint256[]"}],"name":"setRates","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_refundAmount","type":"uint256"}],"name":"setRefundAmounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalTransistors","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"transistors","outputs":[{"internalType":"address","name":"minter","type":"address"},{"internalType":"uint256","name":"created","type":"uint256"},{"internalType":"uint256","name":"expires","type":"uint256"},{"internalType":"uint256","name":"numClaims","type":"uint256"},{"internalType":"uint256","name":"lastClaimed","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_token","type":"address"},{"internalType":"address","name":"_recipient","type":"address"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

6002805463ffffffff19166230000117905562278d006003556000600455660e35fa931a00006009819055600a556701aa535d3d0c0000600b556753444835ec580000600c819055600d5561036060405264275c8f0e7d60e090815264233a8527d861010052641f8793559561012052641c380f625b6101405264194188a61c6101605264169aa719c96101805264143b0de00a6101a05264121b40e5f46101c0526410348d48b16101e052640e80f4358a61020052640cfb1801d661022052640b9e2b3f1561024052640a65e195e66102605264094e623814610280526408543bbefe6102a05264077459500f6102c0526406abf8e5176102e0526405f8a299d6610300526404c87998386103205264040361836e610340526200012990600f90601462000301565b506029805465ffffffffffff19166503e8232802581790553480156200014e57600080fd5b5060405162002f4438038062002f4483398101604081905262000171916200037d565b6200017c33620002b1565b600180556001600160a01b03888116608090815288821660a081815289841660c0908152600e80546001600160a01b03199081168c8816179091556040805192830181528a87168084528a881660208501819052848301829052606085018290528a89168589018190528a8a1695909601859052602380548516831790556024805485169091178155602580548516831790556026805485169092179091556027805484169095179094556028805490921690921790559251925163095ea7b360e01b815260048101929092526000199082015291169063095ea7b3906044016020604051808303816000875af11580156200027c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002a291906200043e565b50505050505050505062000469565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82601481019282156200033b579160200282015b828111156200033b578251829064ffffffffff1690559160200191906001019062000315565b50620003499291506200034d565b5090565b5b808211156200034957600081556001016200034e565b6001600160a01b03811681146200037a57600080fd5b50565b600080600080600080600080610100898b0312156200039b57600080fd5b8851620003a88162000364565b60208a0151909850620003bb8162000364565b60408a0151909750620003ce8162000364565b60608a0151909650620003e18162000364565b60808a0151909550620003f48162000364565b60a08a0151909450620004078162000364565b60c08a01519093506200041a8162000364565b60e08a01519092506200042d8162000364565b809150509295985092959890939650565b6000602082840312156200045157600080fd5b815180151581146200046257600080fd5b9392505050565b60805160a05160c051612a50620004f46000396000818161063701528181611c4f01528181611cee0152818161209c0152818161211f015281816121dc015261230d0152600081816108af01526123640152600081816107d201528181610ade0152818161187301528181611a6101528181611b3501528181611d6e01526122b90152612a506000f3fe60806040526004361061028c5760003560e01c806377b99d451161015a578063ba422ee3116100c1578063e2d080101161007a578063e2d080101461082a578063e9e697a91461084a578063f2fde38b1461085d578063f4a0a5281461087d578063f887ea401461089d578063ffb70969146108d157600080fd5b8063ba422ee314610745578063c66e5abf14610766578063d269bcdf14610793578063d904ecd9146107c0578063dce0b4e4146107f4578063dd418ae21461080a57600080fd5b806399d32fc41161011357806399d32fc4146106ad578063a06db7dc146106c8578063a7383b47146106de578063ab98f4ae146106f4578063ad33513f14610714578063b6ed9d6f1461072a57600080fd5b806377b99d45146105da578063816b4b091461061257806389a30271146106255780638da5cb5b1461065957806390fe6ddb146106775780639563dbcf1461068d57600080fd5b8063418c23d9116101fe5780636817c76c116101b75780636817c76c14610514578063682373291461052a578063690d83201461054057806370a082311461056057806370d5ae051461058d578063715018a6146105c557600080fd5b8063418c23d91461045e578063476e10881461047e5780634b0e72161461049e5780635863d19f146104be5780635bfc4299146104d15780635f8ee864146104f457600080fd5b8063210a080d11610250578063210a080d146103b85780633296db1a146103cb57806334ad3790146103eb5780633790a4291461040b5780633938b0ee1461042b5780633aeac4e11461043e57600080fd5b8063080b301e146102985780630adfdcb9146102c15780630cf4680e146103425780630f3ac4a3146103645780631221c0381461038457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae600a5481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b50602354602454602554602654602754602854610300956001600160a01b03908116958116948116938116928116911686565b604080516001600160a01b03978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016102b8565b34801561034e57600080fd5b5061036261035d3660046123f1565b610957565b005b34801561037057600080fd5b506102ae61037f366004612413565b610977565b34801561039057600080fd5b506029546103a59062010000900461ffff1681565b60405161ffff90911681526020016102b8565b6103626103c6366004612413565b61098d565b3480156103d757600080fd5b506103626103e636600461242c565b610b5c565b3480156103f757600080fd5b50610362610406366004612413565b610bb5565b34801561041757600080fd5b50610362610426366004612413565b610bc2565b6103626104393660046124d7565b610cec565b34801561044a57600080fd5b50610362610459366004612538565b610d9c565b34801561046a57600080fd5b50610362610479366004612571565b610e8a565b34801561048a57600080fd5b506103626104993660046124d7565b610ec3565b3480156104aa57600080fd5b506103626104b9366004612593565b610f20565b6103626104cc366004612571565b610f4a565b3480156104dd57600080fd5b506029546103a590640100000000900461ffff1681565b34801561050057600080fd5b506102ae61050f366004612413565b610fb8565b34801561052057600080fd5b506102ae600c5481565b34801561053657600080fd5b506103a561271081565b34801561054c57600080fd5b5061036261055b366004612593565b611094565b34801561056c57600080fd5b506102ae61057b366004612593565b60066020526000908152604090205481565b34801561059957600080fd5b50600e546105ad906001600160a01b031681565b6040516001600160a01b0390911681526020016102b8565b3480156105d157600080fd5b50610362611138565b3480156105e657600080fd5b506102ae6105f53660046125b0565b600760209081526000928352604080842090915290825290205481565b6102ae610620366004612571565b61114c565b34801561063157600080fd5b506105ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561066557600080fd5b506000546001600160a01b03166105ad565b34801561068357600080fd5b506102ae600b5481565b34801561069957600080fd5b506103626106a8366004612413565b6111d4565b3480156106b957600080fd5b506029546103a59061ffff1681565b3480156106d457600080fd5b506102ae60035481565b3480156106ea57600080fd5b506102ae60045481565b34801561070057600080fd5b5061036261070f3660046125dc565b6111e1565b34801561072057600080fd5b506102ae600d5481565b34801561073657600080fd5b506002546103a59061ffff1681565b34801561075157600080fd5b506002546103a59062010000900461ffff1681565b34801561077257600080fd5b5061078661078136600461261e565b611272565b6040516102b8919061268a565b34801561079f57600080fd5b506102ae6107ae366004612413565b60086020526000908152604090205481565b3480156107cc57600080fd5b506105ad7f000000000000000000000000000000000000000000000000000000000000000081565b34801561080057600080fd5b506102ae60095481565b34801561081657600080fd5b506102ae610825366004612413565b611389565b34801561083657600080fd5b506103626108453660046126ce565b6113a0565b6107866108583660046126e6565b6113b5565b34801561086957600080fd5b50610362610878366004612593565b6114bf565b34801561088957600080fd5b50610362610898366004612413565b611538565b3480156108a957600080fd5b506105ad7f000000000000000000000000000000000000000000000000000000000000000081565b3480156108dd57600080fd5b506109256108ec366004612413565b600560205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102b8565b61095f611545565b6002805461ffff191661ffff92909216919091179055565b600081600a546109879190612728565b92915050565b6002600154036109b85760405162461bcd60e51b81526004016109af90612747565b60405180910390fd5b6002600155600081815260056020526040902080546001600160a01b031633146109f45760405162461bcd60e51b81526004016109af9061277e565b42816002015411610a3c5760405162461bcd60e51b8152602060048201526012602482015271151c985b9cda5cdd1bdc88195e1c1a5c995960721b60448201526064016109af565b600381015415610a805760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016109af565b600b543414610aa15760405162461bcd60e51b81526004016109af906127a9565b602654610ab7906001600160a01b03163461159f565b60006002820155600d5460405163a9059cbb60e01b815233600482015260248101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5391906127e0565b50506001805550565b610b64611545565b600995909555600a93909355600b919091556029805461ffff9485166401000000000265ffff0000000019948616620100000263ffffffff1990921695909316949094179390931791909116179055565b610bbd611545565b600d55565b610bca611545565b6000818152600560209081526040808320546001600160a01b031683526006825280832054848452600890925290912054808214610c45576000838152600560209081526040808320546001600160a01b03168352600782528083208584528252808320548484528184208190558352600890915290208190555b60008381526008602090815260408083208390556005825280832080546001600160a01b039081168552600784528285208786528452828520859055905416835260069091528120805491610c9983612802565b909155505060048054906000610cae83612802565b90915550505060009182525060056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905560040155565b600260015403610d0e5760405162461bcd60e51b81526004016109af90612747565b60026001558180610d1e83610977565b610d289190612728565b3414610d465760405162461bcd60e51b81526004016109af906127a9565b602554610d5c906001600160a01b03163461159f565b60005b81811015610d9157610d89858583818110610d7c57610d7c612819565b9050602002013584611637565b600101610d5f565b505060018055505050565b610da4611545565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e16919061282f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8591906127e0565b505050565b600260015403610eac5760405162461bcd60e51b81526004016109af90612747565b6002600155610ebb82826117b3565b505060018055565b600260015403610ee55760405162461bcd60e51b81526004016109af90612747565b60026001558160005b81811015610d9157610f18858583818110610f0b57610f0b612819565b90506020020135846117b3565b600101610eee565b610f28611545565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600260015403610f6c5760405162461bcd60e51b81526004016109af90612747565b6002600155610f7a81610977565b3414610f985760405162461bcd60e51b81526004016109af906127a9565b602554610fae906001600160a01b03163461159f565b610ebb8282611637565b6000818152600560209081526040808320815160a08101835281546001600160a01b03168152600182015493810193909352600281015491830191909152600381015460608301819052600490910154608083015282906014111561103557600f82606001516014811061102e5761102e612819565b0154611056565b600f61104360016014612848565b6014811061105357611053612819565b01545b90506000816000846060015111611071578360200151611077565b83608001515b6110819042612848565b61108b9190612728565b95945050505050565b61109c611545565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146110e9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ee565b606091505b50509050806111345760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064016109af565b5050565b611140611545565b61114a600061190f565b565b60006002600154036111705760405162461bcd60e51b81526004016109af90612747565b600260015560095461118184610977565b61118b919061285b565b34146111a95760405162461bcd60e51b81526004016109af906127a9565b6023546111bf906001600160a01b03163461159f565b6111c9838361195f565b600180559392505050565b6111dc611545565b600355565b6111e9611545565b6014811461122a5760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016109af565b8060005b8181101561126c5783838281811061124857611248612819565b90506020020135600f826014811061126257611262612819565b015560010161122e565b50505050565b606061127c611545565b8382146112c15760405162461bcd60e51b815260206004820152601360248201527213195b99dd1a1cc81b9bdd08185b1a59db9959606a1b60448201526064016109af565b838067ffffffffffffffff8111156112db576112db61286e565b604051908082528060200260200182016040528015611304578160200160208202803683370190505b50915060005b8181101561137f5761135a87878381811061132757611327612819565b905060200201602081019061133c9190612593565b86868481811061134e5761134e612819565b90506020020135611f20565b83828151811061136c5761136c612819565b602090810291909101015260010161130a565b5050949350505050565b600f816014811061139957600080fd5b0154905081565b6113a8611545565b806023610e8582826128a4565b60606002600154036113d95760405162461bcd60e51b81526004016109af90612747565b600260015560095484906113ec85610977565b6113f6919061285b565b6114009190612728565b341461141e5760405162461bcd60e51b81526004016109af906127a9565b602354611434906001600160a01b03163461159f565b8367ffffffffffffffff81111561144d5761144d61286e565b604051908082528060200260200182016040528015611476578160200160208202803683370190505b50905060005b848110156114b35761148e848461195f565b8282815181106114a0576114a0612819565b602090810291909101015260010161147c565b50600180559392505050565b6114c7611545565b6001600160a01b03811661152c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109af565b6115358161190f565b50565b611540611545565b600c55565b6000546001600160a01b0316331461114a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109af565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146115ec576040519150601f19603f3d011682016040523d82523d6000602084013e6115f1565b606091505b5050905080610e855760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064016109af565b600082815260056020526040902080546001600160a01b0316331461166e5760405162461bcd60e51b81526004016109af9061277e565b426003548260020154611681919061285b565b10156116e35760405162461bcd60e51b815260206004820152602b60248201527f477261636520706572696f642065787069726564206f72207472616e7369737460448201526a1bdc881c995d995c9cd95960aa1b60648201526084016109af565b600081600201544211156117165762278d008260020154426117059190612848565b61170f919061295b565b9050611737565b62278d0042836002015461172a9190612848565b611734919061295b565b90505b60025461ffff16611748828561285b565b11156117885760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b60448201526064016109af565b6117958362278d00612728565b8260020160008282546117a8919061285b565b909155505050505050565b600082815260056020526040902080546001600160a01b031633146117ea5760405162461bcd60e51b81526004016109af9061277e565b4281600201541161183d5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736973746f722065787069726564206f72207265766572736564000060448201526064016109af565b600061184884610fb8565b90506118548184612054565b60405163a9059cbb60e01b8152336004820152602481018290529091507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e891906127e0565b506003820180549060006118fb8361296f565b919050555042826004018190555050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025433600090815260066020526040812054909162010000900461ffff16116119c25760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e79207472616e736973746f727360601b60448201526064016109af565b6000831180156119d8575060025461ffff168311155b611a3b5760405162461bcd60e51b815260206004820152602e60248201527f4d7573742062652067726561746572207468616e203020616e64206c6573732060448201526d7468616e206d61784d6f6e74687360901b60648201526084016109af565b600c546040516323b872dd60e01b815233600482015230602482015260448101919091527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad691906127e0565b611b225760405162461bcd60e51b815260206004820152601a60248201527f556e61626c6520746f207472616e7366657220416d706c69666900000000000060448201526064016109af565b600e54602954600c546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169363a9059cbb9391169161271091611b79916201000090910461ffff1690612728565b611b83919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf291906127e0565b50602954611c379061271090611c1690600290640100000000900461ffff16612988565b61ffff16600c54611c279190612728565b611c31919061295b565b83612296565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc2919061282f565b6024805460405163a9059cbb60e01b81526001600160a01b0391821660048201529182018390529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303816000875af1158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906127e0565b506024546029546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169263a9059cbb9291169061271090611db590600290640100000000900461ffff16612988565b61ffff16600c54611dc69190612728565b611dd0919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f91906127e0565b506004805460018082019092553360008181526006602090815260409182902080549586019055815160a08101835292835242908301529192918101611e888862278d00612728565b611e92904261285b565b815260006020808301829052604092830182905285825260058152828220845181546001600160a01b0319166001600160a01b0390911617815584820151600182015584840151600282015560608501516003820155608090940151600490940193909355338152600783528181208482528352818120859055848152600890925290205591505092915050565b60025460009061ffff16821115611f6b5760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b60448201526064016109af565b6004805460018082019092556001600160a01b03851660008181526006602090815260409182902080549586019055815160a08101835292835242908301529192918101611fbc8662278d00612728565b611fc6904261285b565b815260006020808301829052604092830182905285825260058152828220845181546001600160a01b039182166001600160a01b03199091161782558583015160018301558585015160028301556060860151600383015560809095015160049091015592881681526007835281812084825283528181208590558481526008909252902055905092915050565b60295460009081906127109061206e9061ffff1686612728565b612078919061295b565b90506120848184612296565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156120eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210f919061282f565b6028549091506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163a9059cbb91166064612155856022612728565b61215f919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ce91906127e0565b506027546001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081169163a9059cbb91166064612212856042612728565b61221c919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b91906127e0565b5061108b8286612848565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106122eb576122eb612819565b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061233f5761233f612819565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f000000000000000000000000000000000000000000000000000000000000000090911690635c11d795906123a390869086908690309042906004016129a9565b600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b50505050505050565b803561ffff811681146123ec57600080fd5b919050565b60006020828403121561240357600080fd5b61240c826123da565b9392505050565b60006020828403121561242557600080fd5b5035919050565b60008060008060008060c0878903121561244557600080fd5b863595506020870135945060408701359350612463606088016123da565b9250612471608088016123da565b915061247f60a088016123da565b90509295509295509295565b60008083601f84011261249d57600080fd5b50813567ffffffffffffffff8111156124b557600080fd5b6020830191508360208260051b85010111156124d057600080fd5b9250929050565b6000806000604084860312156124ec57600080fd5b833567ffffffffffffffff81111561250357600080fd5b61250f8682870161248b565b909790965060209590950135949350505050565b6001600160a01b038116811461153557600080fd5b6000806040838503121561254b57600080fd5b823561255681612523565b9150602083013561256681612523565b809150509250929050565b6000806040838503121561258457600080fd5b50508035926020909101359150565b6000602082840312156125a557600080fd5b813561240c81612523565b600080604083850312156125c357600080fd5b82356125ce81612523565b946020939093013593505050565b600080602083850312156125ef57600080fd5b823567ffffffffffffffff81111561260657600080fd5b6126128582860161248b565b90969095509350505050565b6000806000806040858703121561263457600080fd5b843567ffffffffffffffff8082111561264c57600080fd5b6126588883890161248b565b9096509450602087013591508082111561267157600080fd5b5061267e8782880161248b565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156126c2578351835292840192918401916001016126a6565b50909695505050505050565b600060c082840312156126e057600080fd5b50919050565b6000806000606084860312156126fb57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561274257612742612712565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601190820152700496e76616c6964206f776e65727368697607c1b604082015260600190565b6020808252601c908201527f496e76616c69642045746865722076616c75652070726f766964656400000000604082015260600190565b6000602082840312156127f257600080fd5b8151801515811461240c57600080fd5b60008161281157612811612712565b506000190190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561284157600080fd5b5051919050565b8181038181111561098757610987612712565b8082018082111561098757610987612712565b634e487b7160e01b600052604160045260246000fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356128af81612523565b6128b98183612884565b5060208201356128c881612523565b6128d58160018401612884565b5060408201356128e481612523565b6128f18160028401612884565b50606082013561290081612523565b61290d8160038401612884565b50608082013561291c81612523565b6129298160048401612884565b5060a082013561293881612523565b610e858160058401612884565b634e487b7160e01b600052601260045260246000fd5b60008261296a5761296a612945565b500490565b60006001820161298157612981612712565b5060010190565b600061ffff8084168061299d5761299d612945565b92169190910492915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129f95784516001600160a01b0316835293830193918301916001016129d4565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d5381469c85c35cd97a49d349819ca029898d0eb206ead2661b1d810df7ddae964736f6c63430008100033000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd90000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000001abe782f0a25636afe13c2687c6bcb6ebe9024f8000000000000000000000000e2eaacb0e8332c2a02cac452808c2c303a251211000000000000000000000000b9806c1a57e75aa4206ba75559109389550ac021000000000000000000000000c766b8c9741bc804fcc378fde75560229ca3ab1e000000000000000000000000454cd1e89df17cdb61d868c6d3dbc02bc2c38a17

Deployed Bytecode

0x60806040526004361061028c5760003560e01c806377b99d451161015a578063ba422ee3116100c1578063e2d080101161007a578063e2d080101461082a578063e9e697a91461084a578063f2fde38b1461085d578063f4a0a5281461087d578063f887ea401461089d578063ffb70969146108d157600080fd5b8063ba422ee314610745578063c66e5abf14610766578063d269bcdf14610793578063d904ecd9146107c0578063dce0b4e4146107f4578063dd418ae21461080a57600080fd5b806399d32fc41161011357806399d32fc4146106ad578063a06db7dc146106c8578063a7383b47146106de578063ab98f4ae146106f4578063ad33513f14610714578063b6ed9d6f1461072a57600080fd5b806377b99d45146105da578063816b4b091461061257806389a30271146106255780638da5cb5b1461065957806390fe6ddb146106775780639563dbcf1461068d57600080fd5b8063418c23d9116101fe5780636817c76c116101b75780636817c76c14610514578063682373291461052a578063690d83201461054057806370a082311461056057806370d5ae051461058d578063715018a6146105c557600080fd5b8063418c23d91461045e578063476e10881461047e5780634b0e72161461049e5780635863d19f146104be5780635bfc4299146104d15780635f8ee864146104f457600080fd5b8063210a080d11610250578063210a080d146103b85780633296db1a146103cb57806334ad3790146103eb5780633790a4291461040b5780633938b0ee1461042b5780633aeac4e11461043e57600080fd5b8063080b301e146102985780630adfdcb9146102c15780630cf4680e146103425780630f3ac4a3146103645780631221c0381461038457600080fd5b3661029357005b600080fd5b3480156102a457600080fd5b506102ae600a5481565b6040519081526020015b60405180910390f35b3480156102cd57600080fd5b50602354602454602554602654602754602854610300956001600160a01b03908116958116948116938116928116911686565b604080516001600160a01b03978816815295871660208701529386169385019390935290841660608401528316608083015290911660a082015260c0016102b8565b34801561034e57600080fd5b5061036261035d3660046123f1565b610957565b005b34801561037057600080fd5b506102ae61037f366004612413565b610977565b34801561039057600080fd5b506029546103a59062010000900461ffff1681565b60405161ffff90911681526020016102b8565b6103626103c6366004612413565b61098d565b3480156103d757600080fd5b506103626103e636600461242c565b610b5c565b3480156103f757600080fd5b50610362610406366004612413565b610bb5565b34801561041757600080fd5b50610362610426366004612413565b610bc2565b6103626104393660046124d7565b610cec565b34801561044a57600080fd5b50610362610459366004612538565b610d9c565b34801561046a57600080fd5b50610362610479366004612571565b610e8a565b34801561048a57600080fd5b506103626104993660046124d7565b610ec3565b3480156104aa57600080fd5b506103626104b9366004612593565b610f20565b6103626104cc366004612571565b610f4a565b3480156104dd57600080fd5b506029546103a590640100000000900461ffff1681565b34801561050057600080fd5b506102ae61050f366004612413565b610fb8565b34801561052057600080fd5b506102ae600c5481565b34801561053657600080fd5b506103a561271081565b34801561054c57600080fd5b5061036261055b366004612593565b611094565b34801561056c57600080fd5b506102ae61057b366004612593565b60066020526000908152604090205481565b34801561059957600080fd5b50600e546105ad906001600160a01b031681565b6040516001600160a01b0390911681526020016102b8565b3480156105d157600080fd5b50610362611138565b3480156105e657600080fd5b506102ae6105f53660046125b0565b600760209081526000928352604080842090915290825290205481565b6102ae610620366004612571565b61114c565b34801561063157600080fd5b506105ad7f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881565b34801561066557600080fd5b506000546001600160a01b03166105ad565b34801561068357600080fd5b506102ae600b5481565b34801561069957600080fd5b506103626106a8366004612413565b6111d4565b3480156106b957600080fd5b506029546103a59061ffff1681565b3480156106d457600080fd5b506102ae60035481565b3480156106ea57600080fd5b506102ae60045481565b34801561070057600080fd5b5061036261070f3660046125dc565b6111e1565b34801561072057600080fd5b506102ae600d5481565b34801561073657600080fd5b506002546103a59061ffff1681565b34801561075157600080fd5b506002546103a59062010000900461ffff1681565b34801561077257600080fd5b5061078661078136600461261e565b611272565b6040516102b8919061268a565b34801561079f57600080fd5b506102ae6107ae366004612413565b60086020526000908152604090205481565b3480156107cc57600080fd5b506105ad7f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd981565b34801561080057600080fd5b506102ae60095481565b34801561081657600080fd5b506102ae610825366004612413565b611389565b34801561083657600080fd5b506103626108453660046126ce565b6113a0565b6107866108583660046126e6565b6113b5565b34801561086957600080fd5b50610362610878366004612593565b6114bf565b34801561088957600080fd5b50610362610898366004612413565b611538565b3480156108a957600080fd5b506105ad7f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156108dd57600080fd5b506109256108ec366004612413565b600560205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b604080516001600160a01b0390961686526020860194909452928401919091526060830152608082015260a0016102b8565b61095f611545565b6002805461ffff191661ffff92909216919091179055565b600081600a546109879190612728565b92915050565b6002600154036109b85760405162461bcd60e51b81526004016109af90612747565b60405180910390fd5b6002600155600081815260056020526040902080546001600160a01b031633146109f45760405162461bcd60e51b81526004016109af9061277e565b42816002015411610a3c5760405162461bcd60e51b8152602060048201526012602482015271151c985b9cda5cdd1bdc88195e1c1a5c995960721b60448201526064016109af565b600381015415610a805760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4818db185a5b5959608a1b60448201526064016109af565b600b543414610aa15760405162461bcd60e51b81526004016109af906127a9565b602654610ab7906001600160a01b03163461159f565b60006002820155600d5460405163a9059cbb60e01b815233600482015260248101919091527f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd96001600160a01b03169063a9059cbb906044016020604051808303816000875af1158015610b2f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5391906127e0565b50506001805550565b610b64611545565b600995909555600a93909355600b919091556029805461ffff9485166401000000000265ffff0000000019948616620100000263ffffffff1990921695909316949094179390931791909116179055565b610bbd611545565b600d55565b610bca611545565b6000818152600560209081526040808320546001600160a01b031683526006825280832054848452600890925290912054808214610c45576000838152600560209081526040808320546001600160a01b03168352600782528083208584528252808320548484528184208190558352600890915290208190555b60008381526008602090815260408083208390556005825280832080546001600160a01b039081168552600784528285208786528452828520859055905416835260069091528120805491610c9983612802565b909155505060048054906000610cae83612802565b90915550505060009182525060056020526040812080546001600160a01b031916815560018101829055600281018290556003810182905560040155565b600260015403610d0e5760405162461bcd60e51b81526004016109af90612747565b60026001558180610d1e83610977565b610d289190612728565b3414610d465760405162461bcd60e51b81526004016109af906127a9565b602554610d5c906001600160a01b03163461159f565b60005b81811015610d9157610d89858583818110610d7c57610d7c612819565b9050602002013584611637565b600101610d5f565b505060018055505050565b610da4611545565b6040516370a0823160e01b81523060048201526001600160a01b0383169063a9059cbb90839083906370a0823190602401602060405180830381865afa158015610df2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e16919061282f565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8591906127e0565b505050565b600260015403610eac5760405162461bcd60e51b81526004016109af90612747565b6002600155610ebb82826117b3565b505060018055565b600260015403610ee55760405162461bcd60e51b81526004016109af90612747565b60026001558160005b81811015610d9157610f18858583818110610f0b57610f0b612819565b90506020020135846117b3565b600101610eee565b610f28611545565b600e80546001600160a01b0319166001600160a01b0392909216919091179055565b600260015403610f6c5760405162461bcd60e51b81526004016109af90612747565b6002600155610f7a81610977565b3414610f985760405162461bcd60e51b81526004016109af906127a9565b602554610fae906001600160a01b03163461159f565b610ebb8282611637565b6000818152600560209081526040808320815160a08101835281546001600160a01b03168152600182015493810193909352600281015491830191909152600381015460608301819052600490910154608083015282906014111561103557600f82606001516014811061102e5761102e612819565b0154611056565b600f61104360016014612848565b6014811061105357611053612819565b01545b90506000816000846060015111611071578360200151611077565b83608001515b6110819042612848565b61108b9190612728565b95945050505050565b61109c611545565b6000816001600160a01b03164760405160006040518083038185875af1925050503d80600081146110e9576040519150601f19603f3d011682016040523d82523d6000602084013e6110ee565b606091505b50509050806111345760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064016109af565b5050565b611140611545565b61114a600061190f565b565b60006002600154036111705760405162461bcd60e51b81526004016109af90612747565b600260015560095461118184610977565b61118b919061285b565b34146111a95760405162461bcd60e51b81526004016109af906127a9565b6023546111bf906001600160a01b03163461159f565b6111c9838361195f565b600180559392505050565b6111dc611545565b600355565b6111e9611545565b6014811461122a5760405162461bcd60e51b815260206004820152600e60248201526d092dcecc2d8d2c840d8cadccee8d60931b60448201526064016109af565b8060005b8181101561126c5783838281811061124857611248612819565b90506020020135600f826014811061126257611262612819565b015560010161122e565b50505050565b606061127c611545565b8382146112c15760405162461bcd60e51b815260206004820152601360248201527213195b99dd1a1cc81b9bdd08185b1a59db9959606a1b60448201526064016109af565b838067ffffffffffffffff8111156112db576112db61286e565b604051908082528060200260200182016040528015611304578160200160208202803683370190505b50915060005b8181101561137f5761135a87878381811061132757611327612819565b905060200201602081019061133c9190612593565b86868481811061134e5761134e612819565b90506020020135611f20565b83828151811061136c5761136c612819565b602090810291909101015260010161130a565b5050949350505050565b600f816014811061139957600080fd5b0154905081565b6113a8611545565b806023610e8582826128a4565b60606002600154036113d95760405162461bcd60e51b81526004016109af90612747565b600260015560095484906113ec85610977565b6113f6919061285b565b6114009190612728565b341461141e5760405162461bcd60e51b81526004016109af906127a9565b602354611434906001600160a01b03163461159f565b8367ffffffffffffffff81111561144d5761144d61286e565b604051908082528060200260200182016040528015611476578160200160208202803683370190505b50905060005b848110156114b35761148e848461195f565b8282815181106114a0576114a0612819565b602090810291909101015260010161147c565b50600180559392505050565b6114c7611545565b6001600160a01b03811661152c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109af565b6115358161190f565b50565b611540611545565b600c55565b6000546001600160a01b0316331461114a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109af565b6000826001600160a01b03168260405160006040518083038185875af1925050503d80600081146115ec576040519150601f19603f3d011682016040523d82523d6000602084013e6115f1565b606091505b5050905080610e855760405162461bcd60e51b8152602060048201526012602482015271086deead8c840dcdee840e6cadcc8408aa8960731b60448201526064016109af565b600082815260056020526040902080546001600160a01b0316331461166e5760405162461bcd60e51b81526004016109af9061277e565b426003548260020154611681919061285b565b10156116e35760405162461bcd60e51b815260206004820152602b60248201527f477261636520706572696f642065787069726564206f72207472616e7369737460448201526a1bdc881c995d995c9cd95960aa1b60648201526084016109af565b600081600201544211156117165762278d008260020154426117059190612848565b61170f919061295b565b9050611737565b62278d0042836002015461172a9190612848565b611734919061295b565b90505b60025461ffff16611748828561285b565b11156117885760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b60448201526064016109af565b6117958362278d00612728565b8260020160008282546117a8919061285b565b909155505050505050565b600082815260056020526040902080546001600160a01b031633146117ea5760405162461bcd60e51b81526004016109af9061277e565b4281600201541161183d5760405162461bcd60e51b815260206004820152601e60248201527f5472616e736973746f722065787069726564206f72207265766572736564000060448201526064016109af565b600061184884610fb8565b90506118548184612054565b60405163a9059cbb60e01b8152336004820152602481018290529091507f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd96001600160a01b03169063a9059cbb906044016020604051808303816000875af11580156118c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118e891906127e0565b506003820180549060006118fb8361296f565b919050555042826004018190555050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60025433600090815260066020526040812054909162010000900461ffff16116119c25760405162461bcd60e51b8152602060048201526014602482015273546f6f206d616e79207472616e736973746f727360601b60448201526064016109af565b6000831180156119d8575060025461ffff168311155b611a3b5760405162461bcd60e51b815260206004820152602e60248201527f4d7573742062652067726561746572207468616e203020616e64206c6573732060448201526d7468616e206d61784d6f6e74687360901b60648201526084016109af565b600c546040516323b872dd60e01b815233600482015230602482015260448101919091527f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd96001600160a01b0316906323b872dd906064016020604051808303816000875af1158015611ab2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ad691906127e0565b611b225760405162461bcd60e51b815260206004820152601a60248201527f556e61626c6520746f207472616e7366657220416d706c69666900000000000060448201526064016109af565b600e54602954600c546001600160a01b037f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd981169363a9059cbb9391169161271091611b79916201000090910461ffff1690612728565b611b83919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf291906127e0565b50602954611c379061271090611c1690600290640100000000900461ffff16612988565b61ffff16600c54611c279190612728565b611c31919061295b565b83612296565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a0823190602401602060405180830381865afa158015611c9e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cc2919061282f565b6024805460405163a9059cbb60e01b81526001600160a01b0391821660048201529182018390529192507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb489091169063a9059cbb906044016020604051808303816000875af1158015611d39573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d5d91906127e0565b506024546029546001600160a01b037f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd981169263a9059cbb9291169061271090611db590600290640100000000900461ffff16612988565b61ffff16600c54611dc69190612728565b611dd0919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611e1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e3f91906127e0565b506004805460018082019092553360008181526006602090815260409182902080549586019055815160a08101835292835242908301529192918101611e888862278d00612728565b611e92904261285b565b815260006020808301829052604092830182905285825260058152828220845181546001600160a01b0319166001600160a01b0390911617815584820151600182015584840151600282015560608501516003820155608090940151600490940193909355338152600783528181208482528352818120859055848152600890925290205591505092915050565b60025460009061ffff16821115611f6b5760405162461bcd60e51b815260206004820152600f60248201526e546f6f206d616e79206d6f6e74687360881b60448201526064016109af565b6004805460018082019092556001600160a01b03851660008181526006602090815260409182902080549586019055815160a08101835292835242908301529192918101611fbc8662278d00612728565b611fc6904261285b565b815260006020808301829052604092830182905285825260058152828220845181546001600160a01b039182166001600160a01b03199091161782558583015160018301558585015160028301556060860151600383015560809095015160049091015592881681526007835281812084825283528181208590558481526008909252902055905092915050565b60295460009081906127109061206e9061ffff1686612728565b612078919061295b565b90506120848184612296565b6040516370a0823160e01b81523060048201526000907f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb486001600160a01b0316906370a0823190602401602060405180830381865afa1580156120eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061210f919061282f565b6028549091506001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881169163a9059cbb91166064612155856022612728565b61215f919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156121aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121ce91906127e0565b506027546001600160a01b037f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb4881169163a9059cbb91166064612212856042612728565b61221c919061295b565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015612267573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061228b91906127e0565b5061108b8286612848565b6040805160028082526060820183526000926020830190803683370190505090507f000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd9816000815181106122eb576122eb612819565b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb488160018151811061233f5761233f612819565b6001600160a01b039283166020918202929092010152604051635c11d79560e01b81527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d90911690635c11d795906123a390869086908690309042906004016129a9565b600060405180830381600087803b1580156123bd57600080fd5b505af11580156123d1573d6000803e3d6000fd5b50505050505050565b803561ffff811681146123ec57600080fd5b919050565b60006020828403121561240357600080fd5b61240c826123da565b9392505050565b60006020828403121561242557600080fd5b5035919050565b60008060008060008060c0878903121561244557600080fd5b863595506020870135945060408701359350612463606088016123da565b9250612471608088016123da565b915061247f60a088016123da565b90509295509295509295565b60008083601f84011261249d57600080fd5b50813567ffffffffffffffff8111156124b557600080fd5b6020830191508360208260051b85010111156124d057600080fd5b9250929050565b6000806000604084860312156124ec57600080fd5b833567ffffffffffffffff81111561250357600080fd5b61250f8682870161248b565b909790965060209590950135949350505050565b6001600160a01b038116811461153557600080fd5b6000806040838503121561254b57600080fd5b823561255681612523565b9150602083013561256681612523565b809150509250929050565b6000806040838503121561258457600080fd5b50508035926020909101359150565b6000602082840312156125a557600080fd5b813561240c81612523565b600080604083850312156125c357600080fd5b82356125ce81612523565b946020939093013593505050565b600080602083850312156125ef57600080fd5b823567ffffffffffffffff81111561260657600080fd5b6126128582860161248b565b90969095509350505050565b6000806000806040858703121561263457600080fd5b843567ffffffffffffffff8082111561264c57600080fd5b6126588883890161248b565b9096509450602087013591508082111561267157600080fd5b5061267e8782880161248b565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b818110156126c2578351835292840192918401916001016126a6565b50909695505050505050565b600060c082840312156126e057600080fd5b50919050565b6000806000606084860312156126fb57600080fd5b505081359360208301359350604090920135919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561274257612742612712565b500290565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252601190820152700496e76616c6964206f776e65727368697607c1b604082015260600190565b6020808252601c908201527f496e76616c69642045746865722076616c75652070726f766964656400000000604082015260600190565b6000602082840312156127f257600080fd5b8151801515811461240c57600080fd5b60008161281157612811612712565b506000190190565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561284157600080fd5b5051919050565b8181038181111561098757610987612712565b8082018082111561098757610987612712565b634e487b7160e01b600052604160045260246000fd5b80546001600160a01b0319166001600160a01b0392909216919091179055565b81356128af81612523565b6128b98183612884565b5060208201356128c881612523565b6128d58160018401612884565b5060408201356128e481612523565b6128f18160028401612884565b50606082013561290081612523565b61290d8160038401612884565b50608082013561291c81612523565b6129298160048401612884565b5060a082013561293881612523565b610e858160058401612884565b634e487b7160e01b600052601260045260246000fd5b60008261296a5761296a612945565b500490565b60006001820161298157612981612712565b5060010190565b600061ffff8084168061299d5761299d612945565b92169190910492915050565b600060a082018783526020878185015260a0604085015281875180845260c086019150828901935060005b818110156129f95784516001600160a01b0316835293830193918301916001016129d4565b50506001600160a01b0396909616606085015250505060800152939250505056fea2646970667358221220d5381469c85c35cd97a49d349819ca029898d0eb206ead2661b1d810df7ddae964736f6c63430008100033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd90000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb480000000000000000000000001abe782f0a25636afe13c2687c6bcb6ebe9024f8000000000000000000000000e2eaacb0e8332c2a02cac452808c2c303a251211000000000000000000000000b9806c1a57e75aa4206ba75559109389550ac021000000000000000000000000c766b8c9741bc804fcc378fde75560229ca3ab1e000000000000000000000000454cd1e89df17cdb61d868c6d3dbc02bc2c38a17

-----Decoded View---------------
Arg [0] : _amplifi (address): 0xD23367155B55d67492DFDC0FC7f8bB1dF7114fD9
Arg [1] : _router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _usdc (address): 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48
Arg [3] : _burnAddress (address): 0x1abE782f0a25636afE13C2687C6BCB6Ebe9024f8
Arg [4] : _standardFeeRecipient (address): 0xE2eAAcB0e8332c2A02cAC452808C2C303A251211
Arg [5] : _taxRecipient (address): 0xb9806C1a57e75Aa4206Ba75559109389550aC021
Arg [6] : _operations (address): 0xc766B8c9741BC804FCc378FdE75560229CA3AB1E
Arg [7] : _developers (address): 0x454cD1e89df17cDB61D868C6D3dBC02bC2c38a17

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000d23367155b55d67492dfdc0fc7f8bb1df7114fd9
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000a0b86991c6218b36c1d19d4a2e9eb0ce3606eb48
Arg [3] : 0000000000000000000000001abe782f0a25636afe13c2687c6bcb6ebe9024f8
Arg [4] : 000000000000000000000000e2eaacb0e8332c2a02cac452808c2c303a251211
Arg [5] : 000000000000000000000000b9806c1a57e75aa4206ba75559109389550ac021
Arg [6] : 000000000000000000000000c766b8c9741bc804fcc378fde75560229ca3ab1e
Arg [7] : 000000000000000000000000454cd1e89df17cdb61d868c6d3dbc02bc2c38a17


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.